this repo has no description
at v1.2.1 2.8 kB view raw
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}