@irrelon/emitter 5.0.6 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintignore CHANGED
@@ -1 +1,2 @@
1
- node_modules
1
+ node_modules
2
+ readme.md
package/.prettierignore CHANGED
@@ -2,8 +2,9 @@ artifacts
2
2
  cache
3
3
  node_modules
4
4
  .next
5
- yarn.lock
6
5
  package-lock.json
7
6
  public
8
7
  .yarn
9
8
  .yarnrc
9
+ .md
10
+ readme.md
package/.prettierrc.yml CHANGED
@@ -1,9 +1,26 @@
1
1
  trailingComma: "none"
2
2
  tabWidth: 4
3
- printWidth: 140
3
+ printWidth: 120
4
4
  semi: true
5
5
  singleQuote: false
6
6
  arrowParens: always
7
7
  bracketSpacing: true
8
8
  bracketSameLine: false
9
9
  jsxSingleQuote: false
10
+ plugins: ['@trivago/prettier-plugin-sort-imports']
11
+ importOrder: [
12
+ "^react$",
13
+ "chakra-ui",
14
+ "<THIRD_PARTY_MODULES>",
15
+ "interface",
16
+ "context/",
17
+ "config",
18
+ "components/",
19
+ "utils/",
20
+ "services/",
21
+ "enums/",
22
+ "types/",
23
+ ".svg",
24
+ "^../(.*)$",
25
+ "(?=./styles.module.scss)",
26
+ ]
@@ -1,31 +1,31 @@
1
- export declare type AnyFunction<ReturnType = any> = (...args: any[]) => ReturnType;
2
- export declare type AnyConstructor = new (...args: any[]) => any;
3
- export declare enum EventReturnFlag {
4
- none = 0,
5
- cancel = 1
1
+ export type AnyFunction<ReturnType = any> = (...args: any[]) => ReturnType;
2
+ export type AnyConstructor = new (...args: any[]) => any;
3
+ export declare enum ListenerReturnFlag {
4
+ none = "!+_NONE",
5
+ cancel = "!+_CANCEL"
6
6
  }
7
- export declare type EventListenerCallback<EventCallbackFunctionSignature extends AnyFunction = AnyFunction> = (...args: Parameters<EventCallbackFunctionSignature>) => ReturnType<EventCallbackFunctionSignature>;
7
+ export type EventListenerCallback<EventCallbackFunctionSignature extends AnyFunction = AnyFunction> = (...args: Parameters<EventCallbackFunctionSignature>) => ReturnType<EventCallbackFunctionSignature>;
8
8
  export interface EventStaticEmitterObject<EventCallbackFunctionSignature extends AnyFunction = AnyFunction> {
9
9
  id: string;
10
10
  args: Parameters<EventCallbackFunctionSignature>;
11
11
  }
12
- export interface EmitterEventsInterface {
12
+ export interface EmitterAnyEventsInterface {
13
13
  [key: string]: AnyFunction;
14
14
  }
15
- export declare type ConvertInterfaceToDict<T> = {
15
+ export type EmitterEventsInterface<T> = {
16
16
  [K in keyof T]: T[K];
17
17
  };
18
18
  /**
19
19
  * Creates a new class with the capability to emit events.
20
20
  */
21
- export declare class Emitter<EventsInterface extends EmitterEventsInterface = EmitterEventsInterface> {
21
+ export declare class Emitter<EventsInterface extends EmitterEventsInterface<EventsInterface> = EmitterAnyEventsInterface> {
22
22
  _eventsEmitting: boolean;
23
23
  _eventRemovalQueue: any[];
24
24
  _eventListeners?: {
25
- [EventName in (keyof EventsInterface)]?: Record<string, EventListenerCallback<EventsInterface[EventName]>[]>;
25
+ [EventName in keyof EventsInterface]?: Record<string, EventListenerCallback<EventsInterface[EventName]>[]>;
26
26
  };
27
27
  _eventStaticEmitters: {
28
- [EventName in (keyof EventsInterface)]?: EventStaticEmitterObject<EventsInterface[EventName]>[];
28
+ [EventName in keyof EventsInterface]?: EventStaticEmitterObject<EventsInterface[EventName]>[];
29
29
  };
30
30
  _eventsAllowDefer: boolean;
31
31
  _eventsDeferTimeouts: Record<any, number>;
@@ -101,6 +101,7 @@ export declare class Emitter<EventsInterface extends EmitterEventsInterface = Em
101
101
  off<EventName extends keyof EventsInterface>(eventName: EventName, id: string, listener?: EventListenerCallback<EventsInterface[EventName]>): this;
102
102
  off<EventName extends keyof EventsInterface>(eventName: EventName, listener?: EventListenerCallback<EventsInterface[EventName]>): this;
103
103
  off<EventName extends keyof EventsInterface>(eventName: EventName): this;
104
+ _emitToArrayOfListeners<EventName extends keyof EventsInterface>(arr: EventListenerCallback<EventsInterface[EventName]>[], data: Parameters<EventsInterface[EventName]>): (ReturnType<EventsInterface[EventName]> | ListenerReturnFlag)[];
104
105
  /**
105
106
  * Emit an event by name.
106
107
  * @param eventName The name of the event to emit.
@@ -130,8 +131,8 @@ export declare class Emitter<EventsInterface extends EmitterEventsInterface = Em
130
131
  * // The console output is:
131
132
  * // data1, data2
132
133
  */
133
- emit<EventName extends keyof EventsInterface>(eventName: EventName, ...data: Parameters<EventsInterface[EventName]>): Promise<EventReturnFlag>;
134
- emitId<EventName extends keyof EventsInterface>(eventName: EventName, id: string, ...data: Parameters<EventsInterface[EventName]>): EventReturnFlag;
134
+ emit<EventName extends keyof EventsInterface>(eventName: EventName, ...data: Parameters<EventsInterface[EventName]>): (ReturnType<EventsInterface[EventName]> | ListenerReturnFlag)[];
135
+ emitId<EventName extends keyof EventsInterface>(eventName: EventName, id: string, ...data: Parameters<EventsInterface[EventName]>): (ReturnType<EventsInterface[EventName]> | ListenerReturnFlag)[];
135
136
  /**
136
137
  * Creates a persistent emitter record that will fire a listener if
137
138
  * one is added for this event after the emitStatic() call has been
@@ -186,13 +187,19 @@ export declare class Emitter<EventsInterface extends EmitterEventsInterface = Em
186
187
  * @returns The emitter instance.
187
188
  */
188
189
  deferEmit<EventName extends keyof EventsInterface>(eventName: EventName, ...data: Parameters<EventsInterface[EventName]>): this;
190
+ /**
191
+ * Returns true if the result from an emit() call passed as the first
192
+ * argument contains a cancellation flag.
193
+ * @param resultArr
194
+ */
195
+ didCancel(resultArr: (unknown | ListenerReturnFlag)[]): boolean;
189
196
  /**
190
197
  * If events are cleared with the off() method while the event emitter is
191
198
  * actively processing any events then the off() calls get added to a
192
199
  * queue to be executed after the event emitter is finished. This stops
193
- * errors that might occur by potentially modifying the event queue while
194
- * the emitter is running through them. This method is called after the
195
- * event emitter is finished processing.
200
+ * errors that might occur by potentially mutating the event listener array
201
+ * while the emitter is running through them. This method is called after
202
+ * the event emitter is finished processing.
196
203
  * @private
197
204
  */
198
205
  _processRemovalQueue(): void;
@@ -1,20 +1,11 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.makeEmitter = exports.Emitter = exports.EventReturnFlag = void 0;
13
- var EventReturnFlag;
14
- (function (EventReturnFlag) {
15
- EventReturnFlag[EventReturnFlag["none"] = 0] = "none";
16
- EventReturnFlag[EventReturnFlag["cancel"] = 1] = "cancel";
17
- })(EventReturnFlag = exports.EventReturnFlag || (exports.EventReturnFlag = {}));
3
+ exports.makeEmitter = exports.Emitter = exports.ListenerReturnFlag = void 0;
4
+ var ListenerReturnFlag;
5
+ (function (ListenerReturnFlag) {
6
+ ListenerReturnFlag["none"] = "!+_NONE";
7
+ ListenerReturnFlag["cancel"] = "!+_CANCEL";
8
+ })(ListenerReturnFlag || (exports.ListenerReturnFlag = ListenerReturnFlag = {}));
18
9
  /**
19
10
  * Creates a new class with the capability to emit events.
20
11
  */
@@ -42,11 +33,13 @@ class Emitter {
42
33
  }, 1);
43
34
  };
44
35
  this._eventListeners = this._eventListeners || {};
45
- const nonNullableEventListeners = this._eventListeners[eventName] = this._eventListeners[eventName] || {};
36
+ const nonNullableEventListeners = (this._eventListeners[eventName] = this._eventListeners[eventName] || {});
46
37
  nonNullableEventListeners[id] = nonNullableEventListeners[id] || [];
47
38
  nonNullableEventListeners[id].push(listener);
48
39
  // Check for any static emitters, and fire the event if any exist
49
- if (!this._eventStaticEmitters || !this._eventStaticEmitters[eventName] || !this._eventStaticEmitters[eventName].length)
40
+ if (!this._eventStaticEmitters ||
41
+ !this._eventStaticEmitters[eventName] ||
42
+ !this._eventStaticEmitters[eventName].length)
50
43
  return this;
51
44
  // Emit events for each emitter
52
45
  for (let i = 0; i < this._eventStaticEmitters[eventName].length; i++) {
@@ -159,6 +152,24 @@ class Emitter {
159
152
  // Both id and listener were provided, remove for the specific id
160
153
  return this._off(eventName, rest[0], rest[1]);
161
154
  }
155
+ _emitToArrayOfListeners(arr, data) {
156
+ const arrCount = arr.length;
157
+ const resultArr = [];
158
+ for (let arrIndex = 0; arrIndex < arrCount; arrIndex++) {
159
+ // Check we have a function to execute
160
+ const tmpFunc = arr[arrIndex];
161
+ if (typeof tmpFunc !== "function") {
162
+ continue;
163
+ }
164
+ const eventListenerResponse = tmpFunc(...data);
165
+ resultArr.push(eventListenerResponse);
166
+ if (eventListenerResponse === ListenerReturnFlag.cancel) {
167
+ // Cancel further event processing
168
+ break;
169
+ }
170
+ }
171
+ return resultArr;
172
+ }
162
173
  /**
163
174
  * Emit an event by name.
164
175
  * @param eventName The name of the event to emit.
@@ -189,69 +200,27 @@ class Emitter {
189
200
  * // data1, data2
190
201
  */
191
202
  emit(eventName, ...data) {
192
- return __awaiter(this, void 0, void 0, function* () {
193
- if (!this._eventListeners) {
194
- return EventReturnFlag.none;
195
- }
196
- const id = "*";
197
- let returnFlag = EventReturnFlag.none;
198
- this._eventsEmitting = true;
199
- if (this._eventListeners[eventName] && this._eventListeners[eventName][id]) {
200
- // Handle global emit
201
- const arr = this._eventListeners[eventName][id];
202
- const promiseArr = arr.map((tmpFunc) => {
203
- if (typeof tmpFunc !== "function")
204
- return;
205
- return tmpFunc(...data);
206
- });
207
- const result = (yield Promise.all(promiseArr)).find((tmpResult) => tmpResult !== EventReturnFlag.none);
208
- if (result) {
209
- returnFlag = EventReturnFlag.cancel;
210
- }
211
- }
212
- this._eventsEmitting = false;
213
- this._processRemovalQueue();
214
- return returnFlag;
215
- });
203
+ return this.emitId(eventName, "*", ...data);
216
204
  }
217
205
  emitId(eventName, id, ...data) {
218
- if (!this._eventListeners) {
219
- return EventReturnFlag.none;
206
+ if (!this._eventListeners || !this._eventListeners[eventName]) {
207
+ return [];
220
208
  }
221
- this._eventListeners = this._eventListeners || {};
209
+ let emitterResult = [];
222
210
  this._eventsEmitting = true;
223
- if (!this._eventListeners[eventName]) {
224
- this._eventsEmitting = false;
225
- this._processRemovalQueue();
226
- return EventReturnFlag.none;
227
- }
228
211
  // Handle id emit
229
212
  if (this._eventListeners[eventName][id]) {
230
213
  const arr = this._eventListeners[eventName][id];
231
- const arrCount = arr.length;
232
- for (let arrIndex = 0; arrIndex < arrCount; arrIndex++) {
233
- // Check we have a function to execute
234
- const tmpFunc = arr[arrIndex];
235
- if (typeof tmpFunc === "function") {
236
- tmpFunc.call(this, ...data);
237
- }
238
- }
214
+ emitterResult = emitterResult.concat(this._emitToArrayOfListeners(arr, data));
239
215
  }
240
- // Handle global emit
241
- if (this._eventListeners[eventName]["*"]) {
216
+ // Handle global emit if the id passed wasn't already a global (*) id
217
+ if (id !== "*" && this._eventListeners[eventName]["*"]) {
242
218
  const arr = this._eventListeners[eventName]["*"];
243
- const arrCount = arr.length;
244
- for (let arrIndex = 0; arrIndex < arrCount; arrIndex++) {
245
- // Check we have a function to execute
246
- const tmpFunc = arr[arrIndex];
247
- if (typeof tmpFunc === "function") {
248
- tmpFunc.call(this, ...data);
249
- }
250
- }
219
+ emitterResult = emitterResult.concat(this._emitToArrayOfListeners(arr, data));
251
220
  }
252
221
  this._eventsEmitting = false;
253
222
  this._processRemovalQueue();
254
- return EventReturnFlag.none;
223
+ return emitterResult;
255
224
  }
256
225
  /**
257
226
  * Creates a persistent emitter record that will fire a listener if
@@ -282,8 +251,8 @@ class Emitter {
282
251
  this._eventStaticEmitters = this._eventStaticEmitters || {};
283
252
  this._eventStaticEmitters[eventName] = this._eventStaticEmitters[eventName] || [];
284
253
  this._eventStaticEmitters[eventName].push({
285
- "id": "*",
286
- "args": data
254
+ id: "*",
255
+ args: data
287
256
  });
288
257
  this._processRemovalQueue();
289
258
  return this;
@@ -334,7 +303,7 @@ class Emitter {
334
303
  this._eventStaticEmitters[eventName] = this._eventStaticEmitters[eventName] || [];
335
304
  this._eventStaticEmitters[eventName].push({
336
305
  id,
337
- "args": data
306
+ args: data
338
307
  });
339
308
  this._processRemovalQueue();
340
309
  return this;
@@ -436,13 +405,21 @@ class Emitter {
436
405
  }
437
406
  return this;
438
407
  }
408
+ /**
409
+ * Returns true if the result from an emit() call passed as the first
410
+ * argument contains a cancellation flag.
411
+ * @param resultArr
412
+ */
413
+ didCancel(resultArr) {
414
+ return resultArr.findIndex((result) => result === ListenerReturnFlag.cancel) > -1;
415
+ }
439
416
  /**
440
417
  * If events are cleared with the off() method while the event emitter is
441
418
  * actively processing any events then the off() calls get added to a
442
419
  * queue to be executed after the event emitter is finished. This stops
443
- * errors that might occur by potentially modifying the event queue while
444
- * the emitter is running through them. This method is called after the
445
- * event emitter is finished processing.
420
+ * errors that might occur by potentially mutating the event listener array
421
+ * while the emitter is running through them. This method is called after
422
+ * the event emitter is finished processing.
446
423
  * @private
447
424
  */
448
425
  _processRemovalQueue() {
@@ -39,11 +39,12 @@ describe("Emitter", () => {
39
39
  it("Creates emitter instance by instantiation", () => {
40
40
  var _a, _b;
41
41
  const myClass = new Emitter_1.Emitter();
42
- myClass.on("moo", () => {
43
- });
42
+ myClass.on("moo", () => { });
44
43
  assert_1.default.strictEqual((_a = myClass._eventListeners) === null || _a === void 0 ? void 0 : _a.moo["*"].length, 1, "Listener registered on event");
45
44
  myClass.off("moo");
46
- assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) || !myClass._eventListeners.moo["*"] || myClass._eventListeners.moo["*"].length, true, "Listeners all removed from event");
45
+ assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) ||
46
+ !myClass._eventListeners.moo["*"] ||
47
+ myClass._eventListeners.moo["*"].length, true, "Listeners all removed from event");
47
48
  });
48
49
  it("Supports extending Emitter as a base class", () => {
49
50
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
@@ -93,45 +94,54 @@ describe("Emitter", () => {
93
94
  myClass.emitId("moo", "testId", "foo");
94
95
  assert_1.default.strictEqual(emitCount, 1, "Event fired correctly");
95
96
  myClass.off("moo", "testId");
96
- assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) || !((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["testId"]) || ((_d = myClass._eventListeners) === null || _d === void 0 ? void 0 : _d.moo["testId"].length) === 0, true, "Listeners all removed from event");
97
- assert_1.default.strictEqual(((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) && ((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["^^noId"]) && ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["^^noId"].length) === 1, true, "Global listener still there");
98
- assert_1.default.strictEqual(!((_h = myClass._eventListeners) === null || _h === void 0 ? void 0 : _h.moo) || !((_j = myClass._eventListeners) === null || _j === void 0 ? void 0 : _j.moo["*"]) || ((_k = myClass._eventListeners) === null || _k === void 0 ? void 0 : _k.moo["*"].length) === 0, true, "Global listener still there");
97
+ assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) ||
98
+ !((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["testId"]) ||
99
+ ((_d = myClass._eventListeners) === null || _d === void 0 ? void 0 : _d.moo["testId"].length) === 0, true, "Listeners all removed from event");
100
+ assert_1.default.strictEqual(((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) &&
101
+ ((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["^^noId"]) &&
102
+ ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["^^noId"].length) === 1, true, "Global listener still there");
103
+ assert_1.default.strictEqual(!((_h = myClass._eventListeners) === null || _h === void 0 ? void 0 : _h.moo) ||
104
+ !((_j = myClass._eventListeners) === null || _j === void 0 ? void 0 : _j.moo["*"]) ||
105
+ ((_k = myClass._eventListeners) === null || _k === void 0 ? void 0 : _k.moo["*"].length) === 0, true, "Global listener still there");
99
106
  myClass.off("moo");
100
- assert_1.default.strictEqual(!((_l = myClass._eventListeners) === null || _l === void 0 ? void 0 : _l.moo) || !((_m = myClass._eventListeners) === null || _m === void 0 ? void 0 : _m.moo["*"]) || ((_o = myClass._eventListeners) === null || _o === void 0 ? void 0 : _o.moo["*"].length) === 0, true, "Listeners all removed from event");
107
+ assert_1.default.strictEqual(!((_l = myClass._eventListeners) === null || _l === void 0 ? void 0 : _l.moo) ||
108
+ !((_m = myClass._eventListeners) === null || _m === void 0 ? void 0 : _m.moo["*"]) ||
109
+ ((_o = myClass._eventListeners) === null || _o === void 0 ? void 0 : _o.moo["*"].length) === 0, true, "Listeners all removed from event");
101
110
  });
102
111
  });
103
112
  describe("emit()", () => {
104
113
  it("Supports type safe usage", () => __awaiter(void 0, void 0, void 0, function* () {
105
114
  const emitter = new Emitter_1.Emitter();
106
115
  let listenerFiredCount = 0;
107
- emitter.on("person", (name, age, enabled) => __awaiter(void 0, void 0, void 0, function* () {
116
+ emitter.on("person", (name) => {
108
117
  return new Promise((resolve) => {
109
118
  setTimeout(() => {
110
119
  listenerFiredCount++;
111
- resolve();
120
+ resolve(name);
112
121
  }, 1000);
113
122
  });
114
- }));
115
- emitter.on("post", () => __awaiter(void 0, void 0, void 0, function* () {
123
+ });
124
+ emitter.on("post", () => {
116
125
  return new Promise((resolve) => {
117
126
  setTimeout(() => {
118
127
  listenerFiredCount++;
119
128
  resolve();
120
129
  }, 1000);
121
130
  });
122
- }));
123
- emitter.on("post", () => __awaiter(void 0, void 0, void 0, function* () {
131
+ });
132
+ emitter.on("post", () => {
124
133
  return new Promise((resolve) => {
125
134
  setTimeout(() => {
126
135
  listenerFiredCount++;
127
136
  resolve();
128
137
  }, 1000);
129
138
  });
130
- }));
139
+ });
131
140
  const time = new Date().getTime();
132
- yield emitter.emit("post");
141
+ yield Promise.all(emitter.emit("post"));
133
142
  const delta = new Date().getTime() - time;
134
143
  assert_1.default.ok(delta > 900, `Delta was not correct, await may not have paused? Delta was: ${delta}`);
144
+ assert_1.default.ok(listenerFiredCount === 2, `listenerFiredCount was not correct, await may not have paused? listenerFiredCount was: ${listenerFiredCount}`);
135
145
  }));
136
146
  it("Supports awaiting async listeners", () => __awaiter(void 0, void 0, void 0, function* () {
137
147
  const emitter = new Emitter_1.Emitter();
@@ -153,44 +163,86 @@ describe("Emitter", () => {
153
163
  });
154
164
  }));
155
165
  const time = new Date().getTime();
156
- yield emitter.emit("foo");
166
+ yield Promise.all(emitter.emit("foo"));
157
167
  const delta = new Date().getTime() - time;
158
168
  assert_1.default.ok(delta > 900, "Delta was not correct, await may not have paused?");
159
169
  }));
170
+ it("Supports awaiting async and non-async listener return data", () => __awaiter(void 0, void 0, void 0, function* () {
171
+ const emitter = new Emitter_1.Emitter();
172
+ let listenerFiredCount = 0;
173
+ emitter.on("foo", () => {
174
+ return new Promise((resolve) => {
175
+ setTimeout(() => {
176
+ listenerFiredCount++;
177
+ resolve("Foo1 Return Value");
178
+ }, 1000);
179
+ });
180
+ });
181
+ emitter.on("foo", () => {
182
+ return "Foo2 Return Value";
183
+ });
184
+ const time = new Date().getTime();
185
+ const results = yield Promise.all(emitter.emit("foo"));
186
+ const delta = new Date().getTime() - time;
187
+ assert_1.default.ok(delta > 900, "Delta was not correct, await may not have paused?");
188
+ assert_1.default.ok(listenerFiredCount === 1, "listenerFiredCount was not correct, await may not have been used?");
189
+ assert_1.default.strictEqual(results[0], "Foo1 Return Value", "Return data for foo1 was not correct");
190
+ assert_1.default.strictEqual(results[1], "Foo2 Return Value", "Return data for foo2 was not correct");
191
+ }));
192
+ it("Supports responding with a cancellation signal", () => __awaiter(void 0, void 0, void 0, function* () {
193
+ const emitter = new Emitter_1.Emitter();
194
+ let listenerFiredCount = 0;
195
+ emitter.on("foo", () => {
196
+ listenerFiredCount++;
197
+ return "Foo1 Return Value";
198
+ });
199
+ emitter.on("foo", () => {
200
+ listenerFiredCount++;
201
+ // This listener will respond with a cancellation, this should terminate further listener calls
202
+ return Emitter_1.ListenerReturnFlag.cancel;
203
+ });
204
+ emitter.on("foo", () => {
205
+ listenerFiredCount++;
206
+ return "Foo3 Return Value";
207
+ });
208
+ emitter.on("foo", () => {
209
+ listenerFiredCount++;
210
+ return "Foo4 Return Value";
211
+ });
212
+ const results = emitter.emit("foo");
213
+ assert_1.default.ok(listenerFiredCount === 2, "listenerFiredCount was not correct, await may not have been used?");
214
+ assert_1.default.strictEqual(results[0], "Foo1 Return Value", "Return data should be a cancel flag");
215
+ assert_1.default.strictEqual(results[1], Emitter_1.ListenerReturnFlag.cancel, "Return data should be a cancel flag");
216
+ assert_1.default.ok(emitter.didCancel(results), "didCancel should detect a cancel flag");
217
+ }));
160
218
  });
161
219
  describe("off()", () => {
162
220
  it("Cancels all listeners (event)", () => {
163
221
  var _a, _b, _c, _d, _e, _f, _g;
164
222
  const myClass = new Emitter_1.Emitter();
165
- const listener1 = () => {
166
- };
167
- const listener2 = () => {
168
- };
169
- myClass.on("moo", () => {
170
- });
223
+ const listener1 = () => { };
224
+ const listener2 = () => { };
225
+ myClass.on("moo", () => { });
171
226
  assert_1.default.strictEqual((_a = myClass._eventListeners) === null || _a === void 0 ? void 0 : _a.moo["*"].length, 1, "Listeners registered on event");
172
- myClass.on("moo", "testId", () => {
173
- });
227
+ myClass.on("moo", "testId", () => { });
174
228
  assert_1.default.strictEqual((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo["testId"].length, 1, "Listeners registered on event");
175
229
  myClass.on("moo", listener1);
176
230
  assert_1.default.strictEqual((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["*"].length, 2, "Listeners registered on event");
177
231
  myClass.on("moo", "testId", listener2);
178
232
  assert_1.default.strictEqual((_d = myClass._eventListeners) === null || _d === void 0 ? void 0 : _d.moo["testId"].length, 2, "Listeners registered on event");
179
233
  myClass.off("moo");
180
- assert_1.default.strictEqual(!((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) || (((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["*"].length) === 0 && ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["testId"].length) === 0), true, "Listeners all removed from event");
234
+ assert_1.default.strictEqual(!((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) ||
235
+ (((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["*"].length) === 0 &&
236
+ ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["testId"].length) === 0), true, "Listeners all removed from event");
181
237
  });
182
238
  it("Cancels id-based listeners (event, id)", () => {
183
239
  var _a, _b, _c, _d, _e, _f, _g;
184
240
  const myClass = new Emitter_1.Emitter();
185
- const listener1 = () => {
186
- };
187
- const listener2 = () => {
188
- };
189
- myClass.on("moo", () => {
190
- });
241
+ const listener1 = () => { };
242
+ const listener2 = () => { };
243
+ myClass.on("moo", () => { });
191
244
  assert_1.default.strictEqual((_a = myClass._eventListeners) === null || _a === void 0 ? void 0 : _a.moo["*"].length, 1, "Listeners registered on event");
192
- myClass.on("moo", "testId", () => {
193
- });
245
+ myClass.on("moo", "testId", () => { });
194
246
  assert_1.default.strictEqual((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo["testId"].length, 1, "Listeners registered on event");
195
247
  myClass.on("moo", listener1);
196
248
  assert_1.default.strictEqual((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["*"].length, 2, "Listeners registered on event");
@@ -203,15 +255,11 @@ describe("Emitter", () => {
203
255
  it("Cancels listener-based listeners (event, listener)", () => {
204
256
  var _a, _b, _c, _d, _e, _f;
205
257
  const myClass = new Emitter_1.Emitter();
206
- const listener1 = () => {
207
- };
208
- const listener2 = () => {
209
- };
210
- myClass.on("moo", () => {
211
- });
258
+ const listener1 = () => { };
259
+ const listener2 = () => { };
260
+ myClass.on("moo", () => { });
212
261
  assert_1.default.strictEqual((_a = myClass._eventListeners) === null || _a === void 0 ? void 0 : _a.moo["*"].length, 1, "Listeners registered on event");
213
- myClass.on("moo", "testId", () => {
214
- });
262
+ myClass.on("moo", "testId", () => { });
215
263
  assert_1.default.strictEqual((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo["testId"].length, 1, "Listeners registered on event");
216
264
  myClass.on("moo", listener1);
217
265
  assert_1.default.strictEqual((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["*"].length, 2, "Listeners registered on event");
@@ -224,15 +272,11 @@ describe("Emitter", () => {
224
272
  it("Cancels id-based + listener-based listeners (event, id, listener)", () => {
225
273
  var _a, _b, _c, _d, _e, _f;
226
274
  const myClass = new Emitter_1.Emitter();
227
- const listener1 = () => {
228
- };
229
- const listener2 = () => {
230
- };
231
- myClass.on("moo", () => {
232
- });
275
+ const listener1 = () => { };
276
+ const listener2 = () => { };
277
+ myClass.on("moo", () => { });
233
278
  assert_1.default.strictEqual((_a = myClass._eventListeners) === null || _a === void 0 ? void 0 : _a.moo["*"].length, 1, "Listeners registered on event");
234
- myClass.on("moo", "testId", () => {
235
- });
279
+ myClass.on("moo", "testId", () => { });
236
280
  assert_1.default.strictEqual((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo["testId"].length, 1, "Listeners registered on event");
237
281
  myClass.on("moo", listener1);
238
282
  assert_1.default.strictEqual((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["*"].length, 2, "Listeners registered on event");
@@ -348,10 +392,16 @@ describe("Emitter", () => {
348
392
  myClass.emitId("moo", "testId", "foo");
349
393
  assert_1.default.strictEqual(emitCount, 2, "Event fired correctly");
350
394
  myClass.off("moo", "testId");
351
- assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) || !((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["testId"]) || ((_d = myClass._eventListeners) === null || _d === void 0 ? void 0 : _d.moo["testId"].length), true, "Listeners all removed from event");
352
- assert_1.default.strictEqual(((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) && ((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["*"]) && ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["*"].length) === 1, true, "Global listener still there");
395
+ assert_1.default.strictEqual(!((_b = myClass._eventListeners) === null || _b === void 0 ? void 0 : _b.moo) ||
396
+ !((_c = myClass._eventListeners) === null || _c === void 0 ? void 0 : _c.moo["testId"]) ||
397
+ ((_d = myClass._eventListeners) === null || _d === void 0 ? void 0 : _d.moo["testId"].length), true, "Listeners all removed from event");
398
+ assert_1.default.strictEqual(((_e = myClass._eventListeners) === null || _e === void 0 ? void 0 : _e.moo) &&
399
+ ((_f = myClass._eventListeners) === null || _f === void 0 ? void 0 : _f.moo["*"]) &&
400
+ ((_g = myClass._eventListeners) === null || _g === void 0 ? void 0 : _g.moo["*"].length) === 1, true, "Global listener still there");
353
401
  myClass.off("moo");
354
- assert_1.default.strictEqual(!((_h = myClass._eventListeners) === null || _h === void 0 ? void 0 : _h.moo) || !((_j = myClass._eventListeners) === null || _j === void 0 ? void 0 : _j.moo["*"]) || ((_k = myClass._eventListeners) === null || _k === void 0 ? void 0 : _k.moo["*"].length) === 0, true, "Listeners all removed from event");
402
+ assert_1.default.strictEqual(!((_h = myClass._eventListeners) === null || _h === void 0 ? void 0 : _h.moo) ||
403
+ !((_j = myClass._eventListeners) === null || _j === void 0 ? void 0 : _j.moo["*"]) ||
404
+ ((_k = myClass._eventListeners) === null || _k === void 0 ? void 0 : _k.moo["*"].length) === 0, true, "Listeners all removed from event");
355
405
  });
356
406
  });
357
407
  });