chore: more unification of legacy APIs

1. unify waitForConnectionUpdate
2. unify printing QR in terminal
This commit is contained in:
Adhiraj Singh
2021-12-18 22:18:51 +05:30
parent 02dd8c93a6
commit f61f553e01
5 changed files with 54 additions and 80 deletions

View File

@@ -4,8 +4,8 @@ import { promisify } from "util"
import WebSocket from "ws"
import { randomBytes } from 'crypto'
import { proto } from '../../WAProto'
import { DisconnectReason, SocketConfig, BaileysEventEmitter, ConnectionState, AuthenticationCreds } from "../Types"
import { Curve, generateRegistrationNode, configureSuccessfulPairing, generateLoginNode, encodeBigEndian, promiseTimeout, generateOrGetPreKeys, xmppSignedPreKey, xmppPreKey, getPreKeys, makeNoiseHandler, useSingleFileAuthState, addTransactionCapability } from "../Utils"
import { DisconnectReason, SocketConfig, BaileysEventEmitter, AuthenticationCreds } from "../Types"
import { Curve, generateRegistrationNode, configureSuccessfulPairing, generateLoginNode, encodeBigEndian, promiseTimeout, generateOrGetPreKeys, xmppSignedPreKey, xmppPreKey, getPreKeys, makeNoiseHandler, useSingleFileAuthState, addTransactionCapability, bindWaitForConnectionUpdate, printQRIfNecessaryListener } from "../Utils"
import { DEFAULT_ORIGIN, DEF_TAG_PREFIX, DEF_CALLBACK_PREFIX, KEY_BUNDLE_TYPE } from "../Defaults"
import { assertNodeErrorFree, BinaryNode, encodeBinaryNode, S_WHATSAPP_NET, getBinaryNodeChild } from '../WABinary'
@@ -389,28 +389,6 @@ export const makeSocket = ({
end(new Boom('Intentional Logout', { statusCode: DisconnectReason.loggedOut }))
}
/** Waits for the connection to WA to reach a state */
const waitForConnectionUpdate = async(check: (u: Partial<ConnectionState>) => boolean, timeoutMs?: number) => {
let listener: (item: Partial<ConnectionState>) => void
await (
promiseTimeout(
timeoutMs,
(resolve, reject) => {
listener = (update) => {
if(check(update)) {
resolve()
} else if(update.connection == 'close') {
reject(update.lastDisconnect?.error || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }))
}
}
ev.on('connection.update', listener)
}
)
.finally(() => (
ev.off('connection.update', listener)
))
)
}
ws.on('message', onMessageRecieved)
ws.on('open', validateConnection)
@@ -422,15 +400,6 @@ export const makeSocket = ({
})
// QR gen
ws.on('CB:iq,type:set,pair-device', async (stanza: BinaryNode) => {
const postQR = async(qr: string) => {
if(printQRInTerminal) {
const QR = await import('qrcode-terminal').catch(err => {
logger.error('add `qrcode-terminal` as a dependency to auto-print QR')
})
QR?.generate(qr, { small: true })
}
}
const iq: BinaryNode = {
tag: 'iq',
attrs: {
@@ -457,7 +426,6 @@ export const makeSocket = ({
const qr = [ref, noiseKeyB64, identityKeyB64, advB64].join(',')
ev.emit('connection.update', { qr })
postQR(qr)
qrTimer = setTimeout(genPairQR, qrMs)
qrMs = 20_000 // shorter subsequent qrs
@@ -539,6 +507,10 @@ export const makeSocket = ({
// update credentials when required
ev.on('creds.update', update => Object.assign(creds, update))
if(printQRInTerminal) {
printQRIfNecessaryListener(ev, logger)
}
return {
type: 'md' as 'md',
ws,
@@ -560,7 +532,8 @@ export const makeSocket = ({
sendNode,
logout,
end,
waitForConnectionUpdate
/** Waits for the connection to WA to reach a state */
waitForConnectionUpdate: bindWaitForConnectionUpdate(ev)
}
}
export type Socket = ReturnType<typeof makeSocket>