1 | /**
|
2 | * A registered event receiver.
|
3 | */
|
4 | var 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 | }());
|
24 | export { EventReceiver };
|
25 | /**
|
26 | * Stores callbacks for registered events.
|
27 | */
|
28 | var 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 | }());
|
134 | export { EventEmitter };
|