refactor: create generic "bindWaitForEvent" for baileys event emitter

This commit is contained in:
Adhiraj Singh
2022-06-01 13:01:26 +05:30
parent 00cbe0f95d
commit f2ef5ff1d4

View File

@@ -5,7 +5,7 @@ import { platform, release } from 'os'
import { Logger } from 'pino' import { Logger } from 'pino'
import { proto } from '../../WAProto' import { proto } from '../../WAProto'
import { version as baileysVersion } from '../Defaults/baileys-version.json' import { version as baileysVersion } from '../Defaults/baileys-version.json'
import { CommonBaileysEventEmitter, ConnectionState, DisconnectReason, WACallUpdateType, WAVersion } from '../Types' import { BaileysEventMap, CommonBaileysEventEmitter, DisconnectReason, WACallUpdateType, WAVersion } from '../Types'
import { BinaryNode, getAllBinaryNodeChildren } from '../WABinary' import { BinaryNode, getAllBinaryNodeChildren } from '../WABinary'
const PLATFORM_MAP = { const PLATFORM_MAP = {
@@ -184,30 +184,42 @@ export async function promiseTimeout<T>(ms: number, promise: (resolve: (v?: T)=>
// generate a random ID to attach to a message // generate a random ID to attach to a message
export const generateMessageID = () => 'BAE5' + randomBytes(6).toString('hex').toUpperCase() export const generateMessageID = () => 'BAE5' + randomBytes(6).toString('hex').toUpperCase()
export const bindWaitForConnectionUpdate = (ev: CommonBaileysEventEmitter<any>) => ( export function bindWaitForEvent<T extends keyof BaileysEventMap<any>>(ev: CommonBaileysEventEmitter<any>, event: T) {
async(check: (u: Partial<ConnectionState>) => boolean, timeoutMs?: number) => { return async(check: (u: BaileysEventMap<any>[T]) => boolean, timeoutMs?: number) => {
let listener: (item: Partial<ConnectionState>) => void let listener: (item: BaileysEventMap<any>[T]) => void
let closeListener: any
await ( await (
promiseTimeout( promiseTimeout(
timeoutMs, timeoutMs,
(resolve, reject) => { (resolve, reject) => {
listener = (update) => { closeListener = ({ connection, lastDisconnect }) => {
if(check(update)) { if(connection === 'close') {
resolve() reject(
} else if(update.connection === 'close') { lastDisconnect?.error
reject(update.lastDisconnect?.error || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })) || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })
)
} }
} }
ev.on('connection.update', listener) ev.on('connection.update', closeListener)
listener = (update) => {
if(check(update)) {
resolve()
}
}
ev.on(event, listener)
} }
) )
.finally(() => ( .finally(() => {
ev.off('connection.update', listener) ev.off(event, listener)
)) ev.off('connection.update', closeListener)
})
) )
} }
) }
export const bindWaitForConnectionUpdate = (ev: CommonBaileysEventEmitter<any>) => bindWaitForEvent(ev, 'connection.update')
export const printQRIfNecessaryListener = (ev: CommonBaileysEventEmitter<any>, logger: Logger) => { export const printQRIfNecessaryListener = (ev: CommonBaileysEventEmitter<any>, logger: Logger) => {
ev.on('connection.update', async({ qr }) => { ev.on('connection.update', async({ qr }) => {