-
Notifications
You must be signed in to change notification settings - Fork 0
/
ensure-callback.js
57 lines (52 loc) · 1.33 KB
/
ensure-callback.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
module.exports = () => {
let ensureCallbacks = {}
/**
Track callbacks as they start and finish. Any that do not complete are
available via ensureCallbackClose.
*/
function ensureCallback(fn) {
return (...args) => {
if(args.length > 0 && typeof args[args.length - 1] === 'function') {
// track callbacks, make sure they are called
const cb = args[args.length - 1]
ensureCallbacks[cb] = cb
args[args.length - 1] = (...cb2) => {
delete ensureCallbacks[cb]
return cb(...cb2)
}
}
return fn(...args)
}
}
/**
@example <code>
process.on('SIGINT', function () {
ensureCallbackClose(cb => cb('exit'))
})
</code>
@arg {function} handler - receives all uncompleted callbacks
*/
function ensureCallbackClose(handler, errorHandler, returnHandler) {
if(typeof handler !== 'function')
throw new TypeError('handler function is required')
for(const cb in ensureCallbacks) {
try {
const ret = handler(ensureCallbacks[cb])
if(returnHandler) {
returnHandler(ret)
}
} catch(e) {
if(errorHandler) {
errorHandler(e)
} else {
console.error(e)
}
}
}
ensureCallbacks = {}
}
return {
ensureCallback,
ensureCallbackClose
}
}