-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinflight.js
56 lines (49 loc) · 1.13 KB
/
inflight.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
var { LRUCache } = require('lru-cache');
var wrappy = require('wrappy');
var once = require('once');
var options = {
ttlAutopurge: true,
ttl: 1000 * 60 * 5,
};
var cache = new LRUCache(options);
function inflight(key, cb) {
if (cache.has(key)) {
const cached = cache.get(key);
cached.push(cb);
cache.set(key, cached);
return null;
} else {
cache.set(key, [cb]);
return makeres(key);
}
}
function makeres(key) {
return once(function RES() {
var cbs = cache.get(key);
var len = cbs.length;
var args = slice(arguments);
try {
for (var i = 0; i < len; i++) {
cbs[i].apply(null, args);
}
} finally {
if (cbs.length > len) {
// added more in the interim.
// de-zalgo, just in case, but don't call again.
cbs.splice(0, len);
process.nextTick(function () {
RES.apply(null, args);
});
} else {
cache.delete(key);
}
}
});
}
function slice(args) {
var length = args.length;
var array = [];
for (var i = 0; i < length; i++) array[i] = args[i];
return array;
}
module.exports = wrappy(inflight);