Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | 2x 13300x 13300x 13300x 32497x 22465x 22465x 32497x 32497x 13300x 6545x 6514x 6514x 6514x 6545x 6545x 13300x 1x 1x 1x 13300x 13300x 6673x 6672x 6672x 6672x 6673x 13300x 13142x 13142x 13300x 15034x 7830x 7830x 15034x 15034x 13300x 14203x 14203x 13300x 3x 3x 13300x 3x 1x 2x 2x 2x 2x 3x 13300x 6x 6x 13300x 1x 1x 13300x 3x 3x 13300x 13300x | type EventSource = 'local' | 'remote';
type Listener = (source: EventSource, ...args: any[]) => void;
type EventListeners = {
[event: string]: Listener[];
};
export class NetworkEventListener {
private _listeners: EventListeners = {};
private _anyListeners: Listener[] = [];
/**
* Register an event listener for a specific event.
*/
public on(event: string, listener: Listener): void {
if (!this._listeners[event]) {
this._listeners[event] = [];
}
this._listeners[event].push(listener);
}
/**
* Register an event listener for a specific event that will only be called once.
*/
public once(event: string, listener: Listener): void {
const onceListener = (source: EventSource, ...args: any[]) => {
this.off(event, onceListener);
listener(source, ...args);
};
this.on(event, onceListener);
}
/**
* Register an event listener at the beginning of the listeners array.
*/
public prependListener(event: string, listener: Listener): void {
if (!this._listeners[event]) {
this._listeners[event] = [];
}
this._listeners[event].unshift(listener);
}
/**
* Register an event listener at the beginning that will only be called once.
*/
public prependOnceListener(event: string, listener: Listener): void {
const onceListener = (source: EventSource, ...args: any[]) => {
this.off(event, onceListener);
listener(source, ...args);
};
this.prependListener(event, onceListener);
}
/**
* Unregister an event listener for a specific event.
* @param event - The name of the event to stop listening to.
* @param listener - The callback function to remove.
*/
public off(event: string, listener: Listener): void {
if (!this._listeners[event]) return;
this._listeners[event] = this._listeners[event].filter(
(registeredListener) => registeredListener !== listener
);
}
/**
* Register a listener for any event.
* @param listener - The callback function to invoke for any event.
*/
public onAny(listener: Listener): void {
this._anyListeners.push(listener);
}
/**
* @internal
*/
_emitWithSource(event: string, source: EventSource, ...args: any[]): void {
// Call listeners for the specific event
if (this._listeners[event]) {
this._listeners[event].forEach((listener) => listener(source, ...args));
}
// Call any listeners
this._anyListeners.forEach((listener) => listener(source, event, ...args));
}
/**
* Emit an event, invoking all registered listeners for the event and any general listeners.
*/
emit(event: string, ...args: any[]): void {
this._emitWithSource(event, 'local', ...args);
}
/**
* Unregister a listener for any event.
*/
public offAny(listener: Listener): void {
this._anyListeners = this._anyListeners.filter(l => l !== listener);
}
/**
* Remove all listeners for a specific event or all events.
*/
public removeAllListeners(event?: string): void {
if (event) {
delete this._listeners[event];
} else {
this._listeners = {};
this._anyListeners = [];
}
}
/**
* Get the number of listeners for a specific event.
*/
public listenerCount(event: string): number {
return this._listeners[event]?.length || 0;
}
/**
* Get all event names that have listeners.
*/
public eventNames(): string[] {
return Object.keys(this._listeners).filter(event => this._listeners[event].length > 0);
}
/**
* Get all listeners for a specific event.
*/
public listeners(event: string): Listener[] {
return this._listeners[event] || [];
}
/**
* Get all raw listeners for a specific event (including once wrappers).
*/
public rawListeners(event: string): Listener[] {
return this.listeners(event);
}
}
|