this repo has no description
1import { MoonlightEventEmitter } from "@moonlight-mod/types/core/event";
2
3export function createEventEmitter<
4 EventId extends string = string,
5 EventData = Record<EventId, any>
6>(): MoonlightEventEmitter<EventId, EventData> {
7 webTarget: {
8 const eventEmitter = new EventTarget();
9 const listeners = new Map<(data: EventData) => void, (e: Event) => void>();
10
11 return {
12 dispatchEvent: <Id extends keyof EventData>(
13 id: Id,
14 data: EventData[Id]
15 ) => {
16 eventEmitter.dispatchEvent(
17 new CustomEvent(id as string, { detail: data })
18 );
19 },
20
21 addEventListener: <Id extends keyof EventData>(
22 id: Id,
23 cb: (data: EventData[Id]) => void
24 ) => {
25 const untyped = cb as (data: EventData) => void;
26 if (listeners.has(untyped)) return;
27
28 function listener(e: Event) {
29 const event = e as CustomEvent<string>;
30 cb(event.detail as EventData[Id]);
31 }
32
33 listeners.set(untyped, listener);
34 eventEmitter.addEventListener(id as string, listener);
35 },
36
37 removeEventListener: <Id extends keyof EventData>(
38 id: Id,
39 cb: (data: EventData[Id]) => void
40 ) => {
41 const untyped = cb as (data: EventData) => void;
42 const listener = listeners.get(untyped);
43 if (listener == null) return;
44 listeners.delete(untyped);
45 eventEmitter.removeEventListener(id as string, listener);
46 }
47 };
48 }
49
50 nodeTarget: {
51 const EventEmitter = require("events");
52 const eventEmitter = new EventEmitter();
53 const listeners = new Map<(data: EventData) => void, (e: Event) => void>();
54
55 return {
56 dispatchEvent: <Id extends keyof EventData>(
57 id: Id,
58 data: EventData[Id]
59 ) => {
60 eventEmitter.emit(id as string, data);
61 },
62
63 addEventListener: <Id extends keyof EventData>(
64 id: Id,
65 cb: (data: EventData[Id]) => void
66 ) => {
67 const untyped = cb as (data: EventData) => void;
68 if (listeners.has(untyped)) return;
69
70 function listener(e: Event) {
71 const event = e as CustomEvent<string>;
72 cb(event as EventData[Id]);
73 }
74
75 listeners.set(untyped, listener);
76 eventEmitter.on(id as string, listener);
77 },
78
79 removeEventListener: <Id extends keyof EventData>(
80 id: Id,
81 cb: (data: EventData[Id]) => void
82 ) => {
83 const untyped = cb as (data: EventData) => void;
84 const listener = listeners.get(untyped);
85 if (listener == null) return;
86 listeners.delete(untyped);
87 eventEmitter.off(id as string, listener);
88 }
89 };
90 }
91
92 throw new Error("Called createEventEmitter() in an impossible environment");
93}