-
Notifications
You must be signed in to change notification settings - Fork 38
/
searchIndex.js
68 lines (57 loc) · 1.45 KB
/
searchIndex.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
58
59
60
61
62
63
64
65
66
67
68
import { nanoid } from 'nanoid'
// eslint-disable-next-line import/no-webpack-loader-syntax
import Worker from 'worker-loader!./searchIndex.worker.js'
class SearchIndex {
constructor() {
this._callbacks = new Map()
this._worker = new Worker()
this._worker.onerror = (event) => {
const { callbackId, error } = event.data
this._updateCallbacks({ callbackId, error, exportedDocs: {} })
}
this._worker.onmessage = (event) => {
const { callbackId, exportedDocs } = event.data
this._updateCallbacks({ callbackId, exportedDocs, error: null })
}
}
index({ indexConfig, exportConfig, values, cacheKey, indexName }) {
return new Promise((resolve, reject) => {
const callbackId = nanoid()
const data = {
callbackId,
resolve,
reject,
exportedDocs: {},
error: null,
complete: false,
}
this._callbacks.set(callbackId, data)
this._worker.postMessage({
values,
indexConfig,
exportConfig,
callbackId,
cacheKey,
indexName,
})
})
}
_updateCallbacks({ callbackId, exportedDocs, error }) {
const target = this._callbacks.get(callbackId)
target.complete = true
target.exportedDocs = exportedDocs
target.error = error
this._callbacks.forEach((data, key) => {
if (!data.complete) {
return
}
this._callbacks.delete(key)
if (data.error) {
data.reject(data.error)
} else {
data.resolve(data.exportedDocs)
}
})
}
}
export const indexWorker = new SearchIndex()