UNPKG

3.77 kBJavaScriptView Raw
1/**
2 * A registered event receiver.
3 */
4var EventReceiver = (function () {
5 function EventReceiver(
6 /**
7 * An registered identifier for this event receiver.
8 */
9 key,
10 /**
11 * The registered name of the event.
12 */
13 event,
14 /**
15 * The actual callback.
16 */
17 handler) {
18 this.key = key;
19 this.event = event;
20 this.handler = handler;
21 }
22 return EventReceiver;
23}());
24export { EventReceiver };
25/**
26 * Stores callbacks for registered events.
27 */
28var EventEmitter = (function () {
29 function EventEmitter() {
30 /**
31 * @private
32 */
33 this.n = 0;
34 /**
35 * @private
36 */
37 this.eventReceivers = {};
38 /**
39 * @private
40 */
41 this.eventsEmitted = {};
42 }
43 /**
44 * Register an event callback which gets triggered every time the event is
45 * fired.
46 *
47 * @param event
48 * The event name.
49 * @param callback
50 * A callback to attach to this event.
51 */
52 EventEmitter.prototype.on = function (event, callback) {
53 if (typeof this.eventReceivers[event] === 'undefined') {
54 this.eventReceivers[event] = {};
55 }
56 var receiver = new EventReceiver(this.n, event, callback);
57 this.n++;
58 this.eventReceivers[event][receiver.key] = receiver;
59 return receiver;
60 };
61 /**
62 * Unregister an event receiver returned from
63 * [`on()`](/api/client/eventemitter#on).
64 *
65 * @param receiver
66 * The event receiver.
67 */
68 EventEmitter.prototype.off = function (receiver) {
69 if (typeof this.eventReceivers[receiver.event] === 'undefined' ||
70 typeof this.eventReceivers[receiver.event][receiver.key] === 'undefined') {
71 throw new Error('unknown event receiver');
72 }
73 delete this.eventReceivers[receiver.event][receiver.key];
74 };
75 /**
76 * Register an event callback that gets triggered only once. If the event was
77 * triggered before your callback is registered, it calls your callback
78 * immediately.
79 *
80 * @note TODO: Fix the docs for () => void syntax.
81 *
82 * @param event
83 * The event name.
84 * @param callback
85 * A callback to attach to this event. It takes no arguments.
86 */
87 EventEmitter.prototype.once = function (event, callback) {
88 var _this = this;
89 if (this.emitted(event)) {
90 callback();
91 }
92 else {
93 this.on(event, function () {
94 if (!_this.emitted(event)) {
95 callback();
96 }
97 });
98 }
99 };
100 /**
101 * Trigger an event. Call all callbacks in the order they were registered.
102 *
103 * @param event
104 * The event name.
105 * @param data
106 * An object to pass to every callback.
107 */
108 EventEmitter.prototype.emit = function (event, data) {
109 if (typeof this.eventReceivers[event] === 'undefined') {
110 this.eventReceivers[event] = {};
111 }
112 if (typeof this.eventsEmitted[event] === 'undefined') {
113 this.eventsEmitted[event] = 0;
114 }
115 for (var k in this.eventReceivers[event]) {
116 this.eventReceivers[event][k].handler(data);
117 }
118 this.eventsEmitted[event] += 1;
119 };
120 /**
121 * Return a count of the number of times an event has been triggered.
122 *
123 * @param event
124 * The event name.
125 */
126 EventEmitter.prototype.emitted = function (event) {
127 if (typeof this.eventsEmitted[event] === 'undefined') {
128 return 0;
129 }
130 return this.eventsEmitted[event];
131 };
132 return EventEmitter;
133}());
134export { EventEmitter };