1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const events_1 = require("events");
|
4 | const Event_1 = require("./Event");
|
5 | const debug_1 = require("../../debug");
|
6 | const debug = debug_1.createDebugLogger('eventManager');
|
7 | class EventManager extends events_1.EventEmitter {
|
8 | constructor(sharedEventManager = null) {
|
9 | super();
|
10 | this.hooks = {};
|
11 | this.sharedEventManager = sharedEventManager;
|
12 | }
|
13 | async trigger(eventName, target, payload) {
|
14 | debug(`Triggering event: ${eventName}.`);
|
15 | if (!this.hooks[eventName]) {
|
16 | debug('No listeners attached.');
|
17 | return false;
|
18 | }
|
19 | const callbacks = this.hooks[eventName];
|
20 | let triggered = 0;
|
21 | let detached = 0;
|
22 | let remaining = callbacks.length;
|
23 | for (let i = 0; i < remaining; i++) {
|
24 | const callback = callbacks[i];
|
25 | await callback(new Event_1.Event(eventName, target, payload));
|
26 | if (callback._isSelfDestructingCallback) {
|
27 | callbacks.splice(i, 1);
|
28 | detached++;
|
29 | remaining--;
|
30 | i--;
|
31 | }
|
32 | triggered++;
|
33 | }
|
34 | if (!remaining) {
|
35 | delete this.hooks[eventName];
|
36 | }
|
37 | debug(`Called ${triggered} listeners for: ${eventName} (detached ${detached} one-time listeners).`);
|
38 | return true;
|
39 | }
|
40 | has(event, callback) {
|
41 | return this.hooks[event] && this.hooks[event].indexOf(callback) > -1;
|
42 | }
|
43 | attachOnce(eventName, callback, index) {
|
44 | callback._isSelfDestructingCallback = true;
|
45 | this.attach(eventName, callback, index);
|
46 | }
|
47 | attach(event, callback, index) {
|
48 | this.hooks[event] = this.hooks[event] || [];
|
49 | if (index) {
|
50 | this.hooks[event].splice(index, 0, callback);
|
51 | }
|
52 | else {
|
53 | this.hooks[event].push(callback);
|
54 | }
|
55 | return this;
|
56 | }
|
57 | attachAt(index, event, callback) {
|
58 | return this.attach(event, callback, index);
|
59 | }
|
60 | detach(event, callback) {
|
61 | if (!this.hooks[event]) {
|
62 | return this;
|
63 | }
|
64 | const hookIndex = this.hooks[event].indexOf(callback);
|
65 | if (hookIndex === -1) {
|
66 | return this;
|
67 | }
|
68 | this.hooks[event].splice(hookIndex, 1);
|
69 | if (this.hooks[event].length === 0) {
|
70 | delete this.hooks[event];
|
71 | }
|
72 | return this;
|
73 | }
|
74 | getSharedEventManager() {
|
75 | return this.sharedEventManager;
|
76 | }
|
77 | }
|
78 | exports.EventManager = EventManager;
|
79 |
|
\ | No newline at end of file |