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, } }