Files
InfiniteAPI/src/Socket/usync.ts
T
Rajeh Taher f1f49ad2c8 Usync: Barebones Usync Protocol support (#960)
* feature(feature/usync-mex): initial commit

* chore: fix merge commit

* chore:lint
2024-12-22 23:38:41 +02:00

81 lines
1.6 KiB
TypeScript

import { Boom } from '@hapi/boom'
import { SocketConfig } from '../Types'
import { BinaryNode, S_WHATSAPP_NET } from '../WABinary'
import { USyncQuery } from '../WAUSync'
import { makeSocket } from './socket'
export const makeUSyncSocket = (config: SocketConfig) => {
const sock = makeSocket(config)
const {
generateMessageTag,
query,
} = sock
const executeUSyncQuery = async(usyncQuery: USyncQuery) => {
if(usyncQuery.protocols.length === 0) {
throw new Boom('USyncQuery must have at least one protocol')
}
// todo: validate users, throw WARNING on no valid users
// variable below has only validated users
const validUsers = usyncQuery.users
const userNodes = validUsers.map((user) => {
return {
tag: 'user',
attrs: {
jid: !user.phone ? user.id : undefined,
},
content: usyncQuery.protocols
.map((a) => a.getUserElement(user))
.filter(a => a !== null)
} as BinaryNode
})
const listNode: BinaryNode = {
tag: 'list',
attrs: {},
content: userNodes
}
const queryNode: BinaryNode = {
tag: 'query',
attrs: {},
content: usyncQuery.protocols.map((a) => a.getQueryElement())
}
const iq = {
tag: 'iq',
attrs: {
to: S_WHATSAPP_NET,
type: 'get',
xmlns: 'usync',
},
content: [
{
tag: 'usync',
attrs: {
context: usyncQuery.context,
mode: usyncQuery.mode,
sid: generateMessageTag(),
last: 'true',
index: '0',
},
content: [
queryNode,
listNode
]
}
],
}
const result = await query(iq)
return usyncQuery.parseUSyncQueryResult(result)
}
return {
...sock,
executeUSyncQuery,
}
}