this repo has no description
1export type MoonlightEventCallback = (data: string) => void;
2
3export interface MoonlightEventEmitter {
4 dispatchEvent: (id: string, data: string) => void;
5 addEventListener: (id: string, cb: MoonlightEventCallback) => void;
6 removeEventListener: (id: string, cb: MoonlightEventCallback) => void;
7}
8
9function nodeMethod(): MoonlightEventEmitter {
10 const EventEmitter = require("events");
11 const eventEmitter = new EventEmitter();
12 const listeners = new Map<MoonlightEventCallback, (...args: any[]) => void>();
13
14 return {
15 dispatchEvent: (id: string, data: string) => {
16 eventEmitter.emit(id, data);
17 },
18
19 addEventListener: (id: string, cb: (data: string) => void) => {
20 if (listeners.has(cb)) return;
21
22 function listener(data: string) {
23 cb(data);
24 }
25
26 listeners.set(cb, listener);
27 eventEmitter.on(id, listener);
28 },
29
30 removeEventListener: (id: string, cb: (data: string) => void) => {
31 const listener = listeners.get(cb);
32 if (listener == null) return;
33 listeners.delete(cb);
34 eventEmitter.off(id, listener);
35 }
36 };
37}
38
39export function createEventEmitter(): MoonlightEventEmitter {
40 webPreload: {
41 const eventEmitter = new EventTarget();
42 const listeners = new Map<MoonlightEventCallback, (e: Event) => void>();
43
44 return {
45 dispatchEvent: (id: string, data: string) => {
46 eventEmitter.dispatchEvent(new CustomEvent(id, { detail: data }));
47 },
48
49 addEventListener: (id: string, cb: (data: string) => void) => {
50 if (listeners.has(cb)) return;
51
52 function listener(e: Event) {
53 const event = e as CustomEvent<string>;
54 cb(event.detail);
55 }
56
57 listeners.set(cb, listener);
58 eventEmitter.addEventListener(id, listener);
59 },
60
61 removeEventListener: (id: string, cb: (data: string) => void) => {
62 const listener = listeners.get(cb);
63 if (listener == null) return;
64 listeners.delete(cb);
65 eventEmitter.removeEventListener(id, listener);
66 }
67 };
68 }
69
70 nodePreload: {
71 return nodeMethod();
72 }
73
74 injector: {
75 return nodeMethod();
76 }
77
78 throw new Error("Called createEventEmitter() in an impossible environment");
79}