UNPKG

2.6 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const events_1 = require("events");
4const Event_1 = require("./Event");
5const debug_1 = require("../../debug");
6const debug = debug_1.createDebugLogger('eventManager');
7class 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}
78exports.EventManager = EventManager;
79//# sourceMappingURL=EventManager.js.map
\No newline at end of file