-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
90 lines (72 loc) · 2.06 KB
/
index.js
File metadata and controls
90 lines (72 loc) · 2.06 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import DeferablePromise from 'promise-deferred'
import debug from 'debug'
import Fuse from 'fuse.js'
const logger = debug('app:screamer')
let screams = {}
let hearings = {}
const options = {
includeScore: true
}
let fuse
function findSimilar(id){
return fuse.search(id).map((item) => item.item)[0]
}
function wait(ms, id) {
return new Promise((_, reject) => {
setTimeout(() => reject(new Error(`${id} failed with timeout. Maybe you meant ${findSimilar(id)}? This were called: ${Object.keys(screams)}`)), ms);
});
}
function resolver(defered, value, id) {
const logger = debug(`app:screamer:${id}`)
logger('resolving', id, 'with value type', typeof value)
defered.resolve(value)
}
export function clear() {
screams = {}
hearings = {}
}
export function clearOnly(key) {
delete screams[key]
delete hearings[key]
}
export function scream(id, value) {
const logger = debug(`app:screamer:${id}`)
const currentHear = hearings[id]
screams[id] = value
const updatedScreams = Object.keys(screams)
fuse = new Fuse(updatedScreams, options)
logger('screams', updatedScreams)
logger('is there any hearings?', Object.keys(hearings))
if (currentHear?.length) {
currentHear.map((hearing) => {
logger('resolving hearing', id)
resolver(hearing, value, id)
})
} else {
logger('no hearing found')
}
}
export async function hear(id) {
const logger = debug(`app:screamer:${id}`)
logger('add hear', id)
const newPromise = new DeferablePromise()
let currentHear = hearings[id]
const currentScream = screams[id]
if (currentHear?.length) {
hearings[id].push(newPromise)
} else {
hearings[id] = [newPromise]
}
//reset currentHear since it might lose its reference
currentHear = hearings[id]
logger('is there any screams', !!currentScream)
if (currentScream || currentScream === 0) {
currentHear.map((hearing) => {
logger('resolving hearing', id)
resolver(hearing, currentScream, id)
})
} else {
logger('no scream found yet')
}
return Promise.race([wait(60000, id), newPromise.promise])
}