chore: lint
This commit is contained in:
@@ -30,8 +30,6 @@ export default defineConfig([globalIgnores([
|
|||||||
...base,
|
...base,
|
||||||
{
|
{
|
||||||
extends: [
|
extends: [
|
||||||
...compat.extends("plugin:@typescript-eslint/recommended"),
|
|
||||||
...compat.extends("plugin:@typescript-eslint/recommended-requiring-type-checking"),
|
|
||||||
...compat.extends("plugin:prettier/recommended"),
|
...compat.extends("plugin:prettier/recommended"),
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ export class LIDMappingStore {
|
|||||||
if (Object.keys(usyncFetch).length > 0) {
|
if (Object.keys(usyncFetch).length > 0) {
|
||||||
const result = await this.pnToLIDFunc?.(Object.keys(usyncFetch)) // this function already adds LIDs to mapping
|
const result = await this.pnToLIDFunc?.(Object.keys(usyncFetch)) // this function already adds LIDs to mapping
|
||||||
if (result && result.length > 0) {
|
if (result && result.length > 0) {
|
||||||
this.storeLIDPNMappings(result)
|
await this.storeLIDPNMappings(result)
|
||||||
for (const pair of result) {
|
for (const pair of result) {
|
||||||
const pnDecoded = jidDecode(pair.pn)
|
const pnDecoded = jidDecode(pair.pn)
|
||||||
const pnUser = pnDecoded?.user
|
const pnUser = pnDecoded?.user
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export abstract class AbstractSocketClient extends EventEmitter {
|
|||||||
this.setMaxListeners(0)
|
this.setMaxListeners(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract connect(): Promise<void>
|
abstract connect(): void
|
||||||
abstract close(): Promise<void>
|
abstract close(): void
|
||||||
abstract send(str: Uint8Array | string, cb?: (err?: Error) => void): boolean
|
abstract send(str: Uint8Array | string, cb?: (err?: Error) => void): boolean
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export class WebSocketClient extends AbstractSocketClient {
|
|||||||
return this.socket?.readyState === WebSocket.CONNECTING
|
return this.socket?.readyState === WebSocket.CONNECTING
|
||||||
}
|
}
|
||||||
|
|
||||||
async connect(): Promise<void> {
|
connect() {
|
||||||
if (this.socket) {
|
if (this.socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -40,7 +40,7 @@ export class WebSocketClient extends AbstractSocketClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async close(): Promise<void> {
|
close() {
|
||||||
if (!this.socket) {
|
if (!this.socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-18
@@ -145,7 +145,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
logger.debug({ messageKey }, 'already requested resend')
|
logger.debug({ messageKey }, 'already requested resend')
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
placeholderResendCache.set(messageKey?.id!, true)
|
await placeholderResendCache.set(messageKey?.id!, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
await delay(5000)
|
await delay(5000)
|
||||||
@@ -164,10 +164,10 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND
|
peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(async () => {
|
||||||
if (placeholderResendCache.get(messageKey?.id!)) {
|
if (placeholderResendCache.get(messageKey?.id!)) {
|
||||||
logger.debug({ messageKey }, 'PDO message without response after 15 seconds. Phone possibly offline')
|
logger.debug({ messageKey }, 'PDO message without response after 15 seconds. Phone possibly offline')
|
||||||
placeholderResendCache.del(messageKey?.id!)
|
await placeholderResendCache.del(messageKey?.id!)
|
||||||
}
|
}
|
||||||
}, 15_000)
|
}, 15_000)
|
||||||
|
|
||||||
@@ -403,14 +403,14 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
|
|
||||||
// Use the new retry count for the rest of the logic
|
// Use the new retry count for the rest of the logic
|
||||||
const key = `${msgId}:${msgKey?.participant}`
|
const key = `${msgId}:${msgKey?.participant}`
|
||||||
msgRetryCache.set(key, retryCount)
|
await msgRetryCache.set(key, retryCount)
|
||||||
} else {
|
} else {
|
||||||
// Fallback to old system
|
// Fallback to old system
|
||||||
const key = `${msgId}:${msgKey?.participant}`
|
const key = `${msgId}:${msgKey?.participant}`
|
||||||
let retryCount = (await msgRetryCache.get<number>(key)) || 0
|
let retryCount = (await msgRetryCache.get<number>(key)) || 0
|
||||||
if (retryCount >= maxMsgRetryCount) {
|
if (retryCount >= maxMsgRetryCount) {
|
||||||
logger.debug({ retryCount, msgId }, 'reached retry limit, clearing')
|
logger.debug({ retryCount, msgId }, 'reached retry limit, clearing')
|
||||||
msgRetryCache.del(key)
|
await msgRetryCache.del(key)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1031,7 +1031,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
if (!ids[i]) continue
|
if (!ids[i]) continue
|
||||||
|
|
||||||
if (msg && (await willSendMessageAgain(ids[i], participant))) {
|
if (msg && (await willSendMessageAgain(ids[i], participant))) {
|
||||||
updateSendMessageAgainCount(ids[i], participant)
|
await updateSendMessageAgainCount(ids[i], participant)
|
||||||
const msgRelayOpts: MessageRelayOptions = { messageId: ids[i] }
|
const msgRelayOpts: MessageRelayOptions = { messageId: ids[i] }
|
||||||
|
|
||||||
if (sendToAll) {
|
if (sendToAll) {
|
||||||
@@ -1122,7 +1122,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
if (ids[0] && key.participant && (await willSendMessageAgain(ids[0], key.participant))) {
|
if (ids[0] && key.participant && (await willSendMessageAgain(ids[0], key.participant))) {
|
||||||
if (key.fromMe) {
|
if (key.fromMe) {
|
||||||
try {
|
try {
|
||||||
updateSendMessageAgainCount(ids[0], key.participant)
|
await updateSendMessageAgainCount(ids[0], key.participant)
|
||||||
logger.debug({ attrs, key }, 'recv retry request')
|
logger.debug({ attrs, key }, 'recv retry request')
|
||||||
await sendMessagesAgain(key, ids, retryNode!)
|
await sendMessagesAgain(key, ids, retryNode!)
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
@@ -1257,7 +1257,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
logger.debug(`[handleMessage] Attempting retry request for failed decryption`)
|
logger.debug(`[handleMessage] Attempting retry request for failed decryption`)
|
||||||
|
|
||||||
// Handle both pre-key and normal retries in single mutex
|
// Handle both pre-key and normal retries in single mutex
|
||||||
retryMutex.mutex(async () => {
|
await retryMutex.mutex(async () => {
|
||||||
try {
|
try {
|
||||||
if (!ws.isOpen) {
|
if (!ws.isOpen) {
|
||||||
logger.debug({ node }, 'Connection closed, skipping retry')
|
logger.debug({ node }, 'Connection closed, skipping retry')
|
||||||
@@ -1499,7 +1499,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
|
|
||||||
const offlineNodeProcessor = makeOfflineNodeProcessor()
|
const offlineNodeProcessor = makeOfflineNodeProcessor()
|
||||||
|
|
||||||
const processNode = (
|
const processNode = async (
|
||||||
type: MessageType,
|
type: MessageType,
|
||||||
node: BinaryNode,
|
node: BinaryNode,
|
||||||
identifier: string,
|
identifier: string,
|
||||||
@@ -1510,31 +1510,31 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
if (isOffline) {
|
if (isOffline) {
|
||||||
offlineNodeProcessor.enqueue(type, node)
|
offlineNodeProcessor.enqueue(type, node)
|
||||||
} else {
|
} else {
|
||||||
processNodeWithBuffer(node, identifier, exec)
|
await processNodeWithBuffer(node, identifier, exec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// recv a message
|
// recv a message
|
||||||
ws.on('CB:message', (node: BinaryNode) => {
|
ws.on('CB:message', async (node: BinaryNode) => {
|
||||||
processNode('message', node, 'processing message', handleMessage)
|
await processNode('message', node, 'processing message', handleMessage)
|
||||||
})
|
})
|
||||||
|
|
||||||
ws.on('CB:call', async (node: BinaryNode) => {
|
ws.on('CB:call', async (node: BinaryNode) => {
|
||||||
processNode('call', node, 'handling call', handleCall)
|
await processNode('call', node, 'handling call', handleCall)
|
||||||
})
|
})
|
||||||
|
|
||||||
ws.on('CB:receipt', node => {
|
ws.on('CB:receipt', async node => {
|
||||||
processNode('receipt', node, 'handling receipt', handleReceipt)
|
await processNode('receipt', node, 'handling receipt', handleReceipt)
|
||||||
})
|
})
|
||||||
|
|
||||||
ws.on('CB:notification', async (node: BinaryNode) => {
|
ws.on('CB:notification', async (node: BinaryNode) => {
|
||||||
processNode('notification', node, 'handling notification', handleNotification)
|
await processNode('notification', node, 'handling notification', handleNotification)
|
||||||
})
|
})
|
||||||
ws.on('CB:ack,class:message', (node: BinaryNode) => {
|
ws.on('CB:ack,class:message', (node: BinaryNode) => {
|
||||||
handleBadAck(node).catch(error => onUnexpectedError(error, 'handling bad ack'))
|
handleBadAck(node).catch(error => onUnexpectedError(error, 'handling bad ack'))
|
||||||
})
|
})
|
||||||
|
|
||||||
ev.on('call', ([call]) => {
|
ev.on('call', async ([call]) => {
|
||||||
if (!call) {
|
if (!call) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1562,7 +1562,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const protoMsg = proto.WebMessageInfo.fromObject(msg) as WAMessage
|
const protoMsg = proto.WebMessageInfo.fromObject(msg) as WAMessage
|
||||||
upsertMessage(protoMsg, call.offline ? 'append' : 'notify')
|
await upsertMessage(protoMsg, call.offline ? 'append' : 'notify')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -946,7 +946,7 @@ export const makeMessagesSocket = (config: SocketConfig) => {
|
|||||||
const tcTokenBuffer = contactTcTokenData[destinationJid]?.token
|
const tcTokenBuffer = contactTcTokenData[destinationJid]?.token
|
||||||
|
|
||||||
if (tcTokenBuffer) {
|
if (tcTokenBuffer) {
|
||||||
(stanza.content as BinaryNode[]).push({
|
;(stanza.content as BinaryNode[]).push({
|
||||||
tag: 'tctoken',
|
tag: 'tctoken',
|
||||||
attrs: {},
|
attrs: {},
|
||||||
content: tcTokenBuffer
|
content: tcTokenBuffer
|
||||||
@@ -1198,8 +1198,8 @@ export const makeMessagesSocket = (config: SocketConfig) => {
|
|||||||
additionalNodes
|
additionalNodes
|
||||||
})
|
})
|
||||||
if (config.emitOwnEvents) {
|
if (config.emitOwnEvents) {
|
||||||
process.nextTick(() => {
|
process.nextTick(async () => {
|
||||||
processingMutex.mutex(() => upsertMessage(fullMsg, 'append'))
|
await processingMutex.mutex(() => upsertMessage(fullMsg, 'append'))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -435,7 +435,7 @@ export const makeSocket = (config: SocketConfig) => {
|
|||||||
}
|
}
|
||||||
}).finish()
|
}).finish()
|
||||||
)
|
)
|
||||||
noise.finishInit()
|
await noise.finishInit()
|
||||||
startKeepAliveRequest()
|
startKeepAliveRequest()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,8 +566,8 @@ export const makeSocket = (config: SocketConfig) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onMessageReceived = (data: Buffer) => {
|
const onMessageReceived = async (data: Buffer) => {
|
||||||
noise.decodeFrame(data, frame => {
|
await noise.decodeFrame(data, frame => {
|
||||||
// reset ping timeout
|
// reset ping timeout
|
||||||
lastDateRecv = new Date()
|
lastDateRecv = new Date()
|
||||||
|
|
||||||
@@ -968,9 +968,9 @@ export const makeSocket = (config: SocketConfig) => {
|
|||||||
end(new Boom('Multi-device beta not joined', { statusCode: DisconnectReason.multideviceMismatch }))
|
end(new Boom('Multi-device beta not joined', { statusCode: DisconnectReason.multideviceMismatch }))
|
||||||
})
|
})
|
||||||
|
|
||||||
ws.on('CB:ib,,offline_preview', (node: BinaryNode) => {
|
ws.on('CB:ib,,offline_preview', async (node: BinaryNode) => {
|
||||||
logger.info('offline preview received', JSON.stringify(node))
|
logger.info('offline preview received', JSON.stringify(node))
|
||||||
sendNode({
|
await sendNode({
|
||||||
tag: 'ib',
|
tag: 'ib',
|
||||||
attrs: {},
|
attrs: {},
|
||||||
content: [{ tag: 'offline_batch', attrs: { count: '100' } }]
|
content: [{ tag: 'offline_batch', attrs: { count: '100' } }]
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export function makeCacheableSignalKeyStore(
|
|||||||
const item = fetched[id]
|
const item = fetched[id]
|
||||||
if (item) {
|
if (item) {
|
||||||
data[id] = item
|
data[id] = item
|
||||||
cache.set(getUniqueId(type, id), item as SignalDataTypeMap[keyof SignalDataTypeMap])
|
await cache.set(getUniqueId(type, id), item as SignalDataTypeMap[keyof SignalDataTypeMap])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
import EventEmitter from 'events'
|
|
||||||
import { createReadStream } from 'fs'
|
|
||||||
import { writeFile } from 'fs/promises'
|
|
||||||
import { createInterface } from 'readline'
|
|
||||||
import type { BaileysEventEmitter } from '../Types'
|
|
||||||
import { delay } from './generics'
|
|
||||||
import { makeMutex } from './make-mutex'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Captures events from a baileys event emitter & stores them in a file
|
|
||||||
* @param ev The event emitter to read events from
|
|
||||||
* @param filename File to save to
|
|
||||||
*/
|
|
||||||
export const captureEventStream = (ev: BaileysEventEmitter, filename: string) => {
|
|
||||||
const oldEmit = ev.emit
|
|
||||||
// write mutex so data is appended in order
|
|
||||||
const writeMutex = makeMutex()
|
|
||||||
// monkey patch eventemitter to capture all events
|
|
||||||
ev.emit = function (...args: any[]) {
|
|
||||||
const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n'
|
|
||||||
const result = oldEmit.apply(ev, args as any)
|
|
||||||
|
|
||||||
writeMutex.mutex(async () => {
|
|
||||||
await writeFile(filename, content, { flag: 'a' })
|
|
||||||
})
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read event file and emit events from there
|
|
||||||
* @param filename filename containing event data
|
|
||||||
* @param delayIntervalMs delay between each event emit
|
|
||||||
*/
|
|
||||||
export const readAndEmitEventStream = (filename: string, delayIntervalMs = 0) => {
|
|
||||||
const ev = new EventEmitter() as BaileysEventEmitter
|
|
||||||
|
|
||||||
const fireEvents = async () => {
|
|
||||||
// from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
|
|
||||||
const fileStream = createReadStream(filename)
|
|
||||||
|
|
||||||
const rl = createInterface({
|
|
||||||
input: fileStream,
|
|
||||||
crlfDelay: Infinity
|
|
||||||
})
|
|
||||||
// Note: we use the crlfDelay option to recognize all instances of CR LF
|
|
||||||
// ('\r\n') in input.txt as a single line break.
|
|
||||||
for await (const line of rl) {
|
|
||||||
if (line) {
|
|
||||||
const { event, data } = JSON.parse(line)
|
|
||||||
ev.emit(event, data)
|
|
||||||
delayIntervalMs && (await delay(delayIntervalMs))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fileStream.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
ev,
|
|
||||||
task: fireEvents()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -153,8 +153,8 @@ export const makeEventBuffer = (logger: ILogger): BaileysBufferableEventEmitter
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
process(handler) {
|
process(handler) {
|
||||||
const listener = (map: BaileysEventData) => {
|
const listener = async (map: BaileysEventData) => {
|
||||||
handler(map)
|
await handler(map)
|
||||||
}
|
}
|
||||||
|
|
||||||
ev.on('event', listener)
|
ev.on('event', listener)
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export * from './history'
|
|||||||
export * from './chat-utils'
|
export * from './chat-utils'
|
||||||
export * from './lt-hash'
|
export * from './lt-hash'
|
||||||
export * from './auth-utils'
|
export * from './auth-utils'
|
||||||
export * from './baileys-event-stream'
|
|
||||||
export * from './use-multi-file-auth-state'
|
export * from './use-multi-file-auth-state'
|
||||||
export * from './link-preview'
|
export * from './link-preview'
|
||||||
export * from './event-buffer'
|
export * from './event-buffer'
|
||||||
|
|||||||
Reference in New Issue
Block a user