forked from sheepzh/time-tracker-4-browser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage-dispatcher.ts
More file actions
46 lines (40 loc) · 1.34 KB
/
message-dispatcher.ts
File metadata and controls
46 lines (40 loc) · 1.34 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
/**
* Copyright (c) 2022-present Hengyang Zhang
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
import { onRuntimeMessage } from "@api/chrome/runtime"
class MessageDispatcher {
private handlers: Partial<{
[code in timer.mq.ReqCode]: timer.mq.Handler<any, any>
}> = {}
register<Req = any, Res = any>(code: timer.mq.ReqCode, handler: timer.mq.Handler<Req, Res>): MessageDispatcher {
if (this.handlers[code]) {
throw new Error("Duplicate handler")
}
this.handlers[code] = handler
return this
}
private async handle(message: timer.mq.Request<unknown>, sender: ChromeMessageSender): Promise<timer.mq.Response<unknown>> {
const code = message?.code
if (!code) {
return { code: 'ignore' }
}
const handler = this.handlers[code]
if (!handler) {
return { code: 'ignore' }
}
try {
const result = await handler(message.data, sender)
return { code: 'success', data: result }
} catch (error) {
const msg = (error as Error)?.message ?? error?.toString?.()
return { code: 'fail', msg }
}
}
start() {
onRuntimeMessage((msg, sender) => this.handle(msg, sender))
}
}
export default MessageDispatcher