@serenityjs/emitter 1.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/README.md +2 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +133 -0
- package/package.json +30 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type Listener<T extends Array<unknown>, R = unknown> = (...arguments_: T) => R;
|
|
2
|
+
type ForceArray<T> = T extends Array<unknown> ? T : never;
|
|
3
|
+
declare class Emitter<T> {
|
|
4
|
+
private _maxListeners;
|
|
5
|
+
private readonly _beforeHooks;
|
|
6
|
+
private readonly _afterHooks;
|
|
7
|
+
private readonly _listeners;
|
|
8
|
+
constructor(_maxListeners?: number);
|
|
9
|
+
get maxListeners(): number;
|
|
10
|
+
set maxListeners(value: number);
|
|
11
|
+
emit<K extends keyof T>(event: K, ...arguments_: ForceArray<T[K]>): boolean;
|
|
12
|
+
private _addListener;
|
|
13
|
+
private _addOnceListener;
|
|
14
|
+
private _removeListener;
|
|
15
|
+
private _removeAllListeners;
|
|
16
|
+
on<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
17
|
+
before<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>, boolean>): this;
|
|
18
|
+
after<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
19
|
+
once<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
20
|
+
onceBefore<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>, boolean>): this;
|
|
21
|
+
onceAfter<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
22
|
+
remove<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
23
|
+
removeBefore<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>, boolean>): this;
|
|
24
|
+
removeAfter<K extends keyof T>(event: K, listener: Listener<ForceArray<T[K]>>): this;
|
|
25
|
+
removeAll<K extends keyof T>(event?: K): this;
|
|
26
|
+
removeAllBefore<K extends keyof T>(event?: K): this;
|
|
27
|
+
removeAllAfter<K extends keyof T>(event?: K): this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Emitter, type ForceArray, type Listener, Emitter as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
Emitter: () => Emitter,
|
|
24
|
+
default: () => src_default
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(src_exports);
|
|
27
|
+
var Emitter = class {
|
|
28
|
+
constructor(_maxListeners = 10) {
|
|
29
|
+
this._maxListeners = _maxListeners;
|
|
30
|
+
}
|
|
31
|
+
_beforeHooks = /* @__PURE__ */ new Map();
|
|
32
|
+
_afterHooks = /* @__PURE__ */ new Map();
|
|
33
|
+
_listeners = /* @__PURE__ */ new Map();
|
|
34
|
+
get maxListeners() {
|
|
35
|
+
return this._maxListeners;
|
|
36
|
+
}
|
|
37
|
+
set maxListeners(value) {
|
|
38
|
+
this._maxListeners = value;
|
|
39
|
+
}
|
|
40
|
+
// Returns true if all listeners were called. Returns false if a before hook returned false.
|
|
41
|
+
emit(event, ...arguments_) {
|
|
42
|
+
const beforeHooks = this._beforeHooks.get(event) ?? [];
|
|
43
|
+
const listeners = this._listeners.get(event) ?? [];
|
|
44
|
+
const afterHooks = this._afterHooks.get(event) ?? [];
|
|
45
|
+
for (const hook of beforeHooks) {
|
|
46
|
+
const result = hook(...arguments_);
|
|
47
|
+
if (result === false)
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
for (const listener of listeners) {
|
|
51
|
+
listener(...arguments_);
|
|
52
|
+
}
|
|
53
|
+
for (const hook of afterHooks) {
|
|
54
|
+
hook(...arguments_);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
// Register utility to reduce duplication in code.
|
|
59
|
+
_addListener(map, event, listener) {
|
|
60
|
+
const listeners = map.get(event) ?? [];
|
|
61
|
+
if (listeners.length >= this._maxListeners) {
|
|
62
|
+
console.trace(
|
|
63
|
+
`warning: possible EventEmitter memory leak detected. ${listeners.length} listeners added. Use #setMaxListeners() to increase limit`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
map.set(event, [...listeners, listener]);
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
_addOnceListener(map, event, listener) {
|
|
70
|
+
const wrapper = (...arguments_) => {
|
|
71
|
+
this._removeListener(map, event, wrapper);
|
|
72
|
+
return listener(...arguments_);
|
|
73
|
+
};
|
|
74
|
+
return this._addListener(map, event, wrapper);
|
|
75
|
+
}
|
|
76
|
+
_removeListener(map, event, listener) {
|
|
77
|
+
const listeners = map.get(event);
|
|
78
|
+
const index = listeners?.indexOf(listener);
|
|
79
|
+
if (index !== void 0 && index !== -1) {
|
|
80
|
+
listeners?.splice(index, 1);
|
|
81
|
+
}
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
_removeAllListeners(map, event) {
|
|
85
|
+
if (event) {
|
|
86
|
+
map.delete(event);
|
|
87
|
+
} else {
|
|
88
|
+
map.clear();
|
|
89
|
+
}
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
on(event, listener) {
|
|
93
|
+
return this._addListener(this._listeners, event, listener);
|
|
94
|
+
}
|
|
95
|
+
before(event, listener) {
|
|
96
|
+
return this._addListener(this._beforeHooks, event, listener);
|
|
97
|
+
}
|
|
98
|
+
after(event, listener) {
|
|
99
|
+
return this._addListener(this._afterHooks, event, listener);
|
|
100
|
+
}
|
|
101
|
+
once(event, listener) {
|
|
102
|
+
return this._addOnceListener(this._listeners, event, listener);
|
|
103
|
+
}
|
|
104
|
+
onceBefore(event, listener) {
|
|
105
|
+
return this._addOnceListener(this._beforeHooks, event, listener);
|
|
106
|
+
}
|
|
107
|
+
onceAfter(event, listener) {
|
|
108
|
+
return this._addOnceListener(this._afterHooks, event, listener);
|
|
109
|
+
}
|
|
110
|
+
remove(event, listener) {
|
|
111
|
+
return this._removeListener(this._listeners, event, listener);
|
|
112
|
+
}
|
|
113
|
+
removeBefore(event, listener) {
|
|
114
|
+
return this._removeListener(this._beforeHooks, event, listener);
|
|
115
|
+
}
|
|
116
|
+
removeAfter(event, listener) {
|
|
117
|
+
return this._removeListener(this._afterHooks, event, listener);
|
|
118
|
+
}
|
|
119
|
+
removeAll(event) {
|
|
120
|
+
return this._removeAllListeners(this._listeners, event);
|
|
121
|
+
}
|
|
122
|
+
removeAllBefore(event) {
|
|
123
|
+
return this._removeAllListeners(this._beforeHooks, event);
|
|
124
|
+
}
|
|
125
|
+
removeAllAfter(event) {
|
|
126
|
+
return this._removeAllListeners(this._afterHooks, event);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
var src_default = Emitter;
|
|
130
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
131
|
+
0 && (module.exports = {
|
|
132
|
+
Emitter
|
|
133
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@serenityjs/emitter",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
|
+
"repository": "https://github.com/SerenityJS/serenity",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/**"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsup",
|
|
12
|
+
"watch": "tsup --watch",
|
|
13
|
+
"lint": "eslint src/",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "jest"
|
|
16
|
+
},
|
|
17
|
+
"jest": {
|
|
18
|
+
"preset": "@serenityjs/jest-presets/jest/node"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@serenityjs/eslint-config": "*",
|
|
22
|
+
"@serenityjs/jest-presets": "*",
|
|
23
|
+
"@serenityjs/typescript-config": "*",
|
|
24
|
+
"@types/jest": "^29.5.12",
|
|
25
|
+
"@types/node": "^20.11.24",
|
|
26
|
+
"jest": "^29.7.0",
|
|
27
|
+
"tsup": "^8.0.2",
|
|
28
|
+
"typescript": "^5.4.2"
|
|
29
|
+
}
|
|
30
|
+
}
|