1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | import { Endpoint } from "./protocol";
|
8 |
|
9 | export interface NodeEndpoint {
|
10 | postMessage(message: any, transfer?: any[]): void;
|
11 | on(
|
12 | type: string,
|
13 | listener: EventListenerOrEventListenerObject,
|
14 | options?: {}
|
15 | ): void;
|
16 | off(
|
17 | type: string,
|
18 | listener: EventListenerOrEventListenerObject,
|
19 | options?: {}
|
20 | ): void;
|
21 | start?: () => void;
|
22 | }
|
23 |
|
24 | export default function nodeEndpoint(nep: NodeEndpoint): Endpoint {
|
25 | const listeners = new WeakMap();
|
26 | return {
|
27 | postMessage: nep.postMessage.bind(nep),
|
28 | addEventListener: (_, eh) => {
|
29 | const l = (data: any) => {
|
30 | if ("handleEvent" in eh) {
|
31 | eh.handleEvent({ data } as MessageEvent);
|
32 | } else {
|
33 | eh({ data } as MessageEvent);
|
34 | }
|
35 | };
|
36 | nep.on("message", l);
|
37 | listeners.set(eh, l);
|
38 | },
|
39 | removeEventListener: (_, eh) => {
|
40 | const l = listeners.get(eh);
|
41 | if (!l) {
|
42 | return;
|
43 | }
|
44 | nep.off("message", l);
|
45 | listeners.delete(eh);
|
46 | },
|
47 | start: nep.start && nep.start.bind(nep),
|
48 | };
|
49 | }
|