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