-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathindex.ts
More file actions
42 lines (36 loc) · 1.54 KB
/
index.ts
File metadata and controls
42 lines (36 loc) · 1.54 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
import { onRuntimeMessage } from "@api/chrome/runtime"
import { allMatch } from "@util/array"
import { type MaskModal, type ModalContext, type Processor } from "./common"
import ModalInstance from "./modal"
import MessageAdaptor from "./processor/message-adaptor"
import PeriodProcessor from "./processor/period-processor"
import VisitProcessor from "./processor/visit-processor"
import Reminder from "./reminder"
export default async function processLimit(url: string) {
const modal: MaskModal = new ModalInstance(url)
const context: ModalContext = { modal, url }
const processors: Processor[] = [
new MessageAdaptor(context),
new PeriodProcessor(context),
new VisitProcessor(context),
new Reminder(),
]
await Promise.all(processors.map(p => p.init()))
onRuntimeMessage<unknown, any>(async msg => {
const results = await Promise.all(processors.map(async p => {
const { code, data } = msg || {}
return await p.handleMsg(code, data)
}))
const allIgnore = allMatch(results, r => r.code === "ignore")
if (allIgnore) return { code: "ignore" }
const anyFail = allMatch(results, r => r.code === "fail")
if (anyFail) return { code: "fail" }
// Merge data of all the handlers
const items = results
.filter(r => r.code === "success")
.map(r => r.data)
.filter(r => r !== undefined && r !== null)
const data = items.length <= 1 ? items[0] : items
return { code: "success", data }
})
}