@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 +2 -1
- package/.prettierignore +2 -1
- package/.prettierrc.yml +18 -1
- package/dist/cjs/src/Emitter.d.ts +23 -16
- package/dist/cjs/src/Emitter.js +51 -74
- package/dist/cjs/tests/Emitter.test.js +102 -52
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/{mjs → esm}/src/Emitter.d.ts +23 -16
- package/dist/{mjs → esm}/src/Emitter.js +51 -63
- package/dist/{mjs → esm}/tests/Emitter.test.js +100 -50
- package/dist/esm/tsconfig-esm.tsbuildinfo +1 -0
- package/fixup.sh +1 -1
- package/package.json +68 -67
- package/readme.md +84 -20
- package/src/Emitter.ts +178 -106
- package/tests/Emitter.test.ts +210 -76
- package/tsconfig-cjs.json +1 -1
- package/tsconfig-esm.json +8 -0
- package/tsconfig.json +33 -5
- package/tsconfig-base.json +0 -36
- /package/dist/{mjs → esm}/package.json +0 -0
- /package/dist/{mjs → esm}/tests/Emitter.test.d.ts +0 -0
- /package/dist/{mjs → esm}/tsconfig.tsbuildinfo +0 -0
package/.eslintignore
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
node_modules
|
|
1
|
+
node_modules
|
|
2
|
+
readme.md
|
package/.prettierignore
CHANGED
package/.prettierrc.yml
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
trailingComma: "none"
|
|
2
2
|
tabWidth: 4
|
|
3
|
-
printWidth:
|
|
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
|
|
2
|
-
export
|
|
3
|
-
export declare enum
|
|
4
|
-
none =
|
|
5
|
-
cancel =
|
|
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
|
|
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
|
|
12
|
+
export interface EmitterAnyEventsInterface {
|
|
13
13
|
[key: string]: AnyFunction;
|
|
14
14
|
}
|
|
15
|
-
export
|
|
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 =
|
|
21
|
+
export declare class Emitter<EventsInterface extends EmitterEventsInterface<EventsInterface> = EmitterAnyEventsInterface> {
|
|
22
22
|
_eventsEmitting: boolean;
|
|
23
23
|
_eventRemovalQueue: any[];
|
|
24
24
|
_eventListeners?: {
|
|
25
|
-
[EventName in
|
|
25
|
+
[EventName in keyof EventsInterface]?: Record<string, EventListenerCallback<EventsInterface[EventName]>[]>;
|
|
26
26
|
};
|
|
27
27
|
_eventStaticEmitters: {
|
|
28
|
-
[EventName in
|
|
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]>):
|
|
134
|
-
emitId<EventName extends keyof EventsInterface>(eventName: EventName, id: string, ...data: Parameters<EventsInterface[EventName]>):
|
|
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
|
|
194
|
-
* the emitter is running through them. This method is called after
|
|
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;
|
package/dist/cjs/src/Emitter.js
CHANGED
|
@@ -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.
|
|
13
|
-
var
|
|
14
|
-
(function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})(
|
|
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 ||
|
|
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
|
|
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
|
|
206
|
+
if (!this._eventListeners || !this._eventListeners[eventName]) {
|
|
207
|
+
return [];
|
|
220
208
|
}
|
|
221
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
286
|
-
|
|
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
|
-
|
|
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
|
|
444
|
-
* the emitter is running through them. This method is called after
|
|
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) ||
|
|
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) ||
|
|
97
|
-
|
|
98
|
-
|
|
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) ||
|
|
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
|
|
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", () =>
|
|
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", () =>
|
|
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
|
-
|
|
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) ||
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) ||
|
|
352
|
-
|
|
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) ||
|
|
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
|
});
|