1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.EventEmitter = void 0;
|
4 | const assert_1 = require("./assert");
|
5 | class EventEmitter {
|
6 | constructor() {
|
7 | this.listeners = new Map();
|
8 | }
|
9 | emitSync(eventName, ...args) {
|
10 | const listeners = this.getListeners(eventName);
|
11 | const ret = new Array();
|
12 | listeners.forEach(listener => ret.push(listener(...args)));
|
13 | return ret;
|
14 | }
|
15 | async emitAsync(eventName, ...args) {
|
16 | const listeners = this.getListeners(eventName);
|
17 | const ret = new Array();
|
18 | for (let i = 0; i < listeners.length; i++) {
|
19 | ret.push(await listeners[i](...args));
|
20 | }
|
21 | return ret;
|
22 | }
|
23 | getListeners(eventName) {
|
24 | const listeners = this.listeners.get(eventName);
|
25 | if (listeners !== undefined) {
|
26 | (0, assert_1.assert)(listeners.length > 0, `No listener for event '${eventName}'`);
|
27 | return listeners;
|
28 | }
|
29 | return [];
|
30 | }
|
31 | addListener(eventName, listener) {
|
32 | if (!this.listeners.has(eventName))
|
33 | this.listeners.set(eventName, []);
|
34 | const listeners = this.listeners.get(eventName);
|
35 | (0, assert_1.assert)(!listeners.includes(listener), `Listener already added for event '${eventName}'`);
|
36 | listeners.push(listener);
|
37 | }
|
38 | removeListener(eventName, listener) {
|
39 | const listeners = this.listeners.get(eventName);
|
40 | (0, assert_1.assert)(listeners !== undefined, `Unknown event '${eventName}'`);
|
41 | const index = listeners.lastIndexOf(listener);
|
42 | (0, assert_1.assert)(index > -1, `Listener not found for event '${eventName}'`);
|
43 | listeners.splice(index, 1);
|
44 | if (listeners.length === 0)
|
45 | this.listeners.delete(eventName);
|
46 | }
|
47 | }
|
48 | exports.EventEmitter = EventEmitter;
|