fix: handle when buffered tasks fail

This commit is contained in:
Adhiraj Singh
2022-08-18 10:15:27 +05:30
parent dc07d31dc7
commit 8d6e00eab6
3 changed files with 51 additions and 48 deletions

View File

@@ -40,6 +40,8 @@ type BaileysBufferableEventEmitter = BaileysEventEmitter & {
* @returns true if buffering just started, false if it was already buffering
* */
buffer(): boolean
/** buffers all events till the promise completes */
createBufferedFunction<A extends any[], T>(work: (...args: A) => Promise<T>): ((...args: A) => Promise<T>)
/** flushes all buffered events */
flush(): Promise<void>
/** waits for the task to complete, before releasing the buffer */
@@ -66,6 +68,36 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
}
})
function buffer() {
if(!isBuffering) {
logger.trace('buffering events')
isBuffering = true
return true
}
return false
}
async function flush() {
if(!isBuffering) {
return
}
logger.trace('releasing buffered events...')
await preBufferTask
isBuffering = false
const consolidatedData = consolidateEvents(data)
if(Object.keys(consolidatedData).length) {
ev.emit('event', consolidatedData)
}
data = makeBufferData()
logger.trace('released buffered events')
}
return {
process(handler) {
const listener = (map: BaileysEventData) => {
@@ -90,33 +122,20 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
preBufferTask = Promise.allSettled([ preBufferTask, task ])
}
},
buffer() {
if(!isBuffering) {
logger.trace('buffering events')
isBuffering = true
return true
buffer,
flush,
createBufferedFunction(work) {
return async(...args) => {
const started = buffer()
try {
const result = await work(...args)
return result
} finally {
if(started) {
await flush()
}
}
}
return false
},
async flush() {
if(!isBuffering) {
return
}
logger.trace('releasing buffered events...')
await preBufferTask
isBuffering = false
const consolidatedData = consolidateEvents(data)
if(Object.keys(consolidatedData).length) {
ev.emit('event', consolidatedData)
}
data = makeBufferData()
logger.trace('released buffered events')
},
on: (...args) => ev.on(...args),
off: (...args) => ev.off(...args),