f1f49ad2c8
* feature(feature/usync-mex): initial commit * chore: fix merge commit * chore:lint
81 lines
1.6 KiB
TypeScript
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,
|
|
}
|
|
} |