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 13485x 13485x 13485x 32771x 22739x 22739x 32771x 32771x 13485x 6636x 6605x 6605x 6605x 6636x 6636x 13485x 1x 1x 1x 13485x 13485x 6764x 6763x 6763x 6763x 6764x 13485x 13327x 13327x 13485x 15210x 7917x 7917x 15210x 15210x 13485x 14384x 14384x 13485x 3x 3x 13485x 3x 1x 2x 2x 2x 2x 3x 13485x 6x 6x 13485x 1x 1x 13485x 3x 3x 13485x 13485x | 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);
}
}
|