feat: add signal repository + tests

This commit is contained in:
Adhiraj Singh
2023-03-18 12:25:47 +05:30
parent 2eea17fe9f
commit fe1d0649b5
21 changed files with 500 additions and 206 deletions

View File

@@ -29,6 +29,7 @@ export const makeSocket = ({
transactionOpts,
qrTimeout,
options,
makeSignalRepository
}: SocketConfig) => {
const ws = new WebSocket(waWebSocketUrl, undefined, {
origin: DEFAULT_ORIGIN,
@@ -48,6 +49,7 @@ export const makeSocket = ({
const { creds } = authState
// add transaction capability
const keys = addTransactionCapability(authState.keys, logger, transactionOpts)
const signalRepository = makeSignalRepository({ creds, keys })
let lastDateRecv: Date
let epoch = 1
@@ -90,24 +92,26 @@ export const makeSocket = ({
}
/** log & process any unexpected errors */
const onUnexpectedError = (error: Error, msg: string) => {
const onUnexpectedError = (err: Error | Boom, msg: string) => {
logger.error(
{ trace: error.stack, output: (error as any).output },
{ err },
`unexpected error in '${msg}'`
)
}
/** await the next incoming message */
const awaitNextMessage = async(sendMsg?: Uint8Array) => {
const awaitNextMessage = async<T>(sendMsg?: Uint8Array) => {
if(ws.readyState !== ws.OPEN) {
throw new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })
throw new Boom('Connection Closed', {
statusCode: DisconnectReason.connectionClosed
})
}
let onOpen: (data: any) => void
let onOpen: (data: T) => void
let onClose: (err: Error) => void
const result = promiseTimeout<any>(connectTimeoutMs, (resolve, reject) => {
onOpen = (data: any) => resolve(data)
const result = promiseTimeout<T>(connectTimeoutMs, (resolve, reject) => {
onOpen = resolve
onClose = mapWebSocketError(reject)
ws.on('frame', onOpen)
ws.on('close', onClose)
@@ -132,11 +136,11 @@ export const makeSocket = ({
* @param json query that was sent
* @param timeoutMs timeout after which the promise will reject
*/
const waitForMessage = async(msgId: string, timeoutMs = defaultQueryTimeoutMs) => {
const waitForMessage = async<T>(msgId: string, timeoutMs = defaultQueryTimeoutMs) => {
let onRecv: (json) => void
let onErr: (err) => void
try {
const result = await promiseTimeout(timeoutMs,
const result = await promiseTimeout<T>(timeoutMs,
(resolve, reject) => {
onRecv = resolve
onErr = err => {
@@ -148,7 +152,7 @@ export const makeSocket = ({
ws.off('error', onErr)
},
)
return result as any
return result
} finally {
ws.off(`TAG:${msgId}`, onRecv!)
ws.off('close', onErr!) // if the socket closes, you'll never receive the message
@@ -186,7 +190,7 @@ export const makeSocket = ({
const init = proto.HandshakeMessage.encode(helloMsg).finish()
const result = await awaitNextMessage(init)
const result = await awaitNextMessage<Uint8Array>(init)
const handshake = proto.HandshakeMessage.decode(result)
logger.trace({ handshake }, 'handshake recv from WA Web')
@@ -591,6 +595,7 @@ export const makeSocket = ({
ws,
ev,
authState: { creds, keys },
signalRepository,
get user() {
return authState.creds.me
},