@gjsify/events 0.0.4 → 0.1.1
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 +27 -2
- package/cjs-compat.cjs +6 -0
- package/lib/esm/event-emitter.js +591 -0
- package/lib/esm/index.js +24 -4
- package/lib/types/event-emitter.d.ts +69 -0
- package/lib/types/index.d.ts +13 -0
- package/package.json +14 -22
- package/src/event-emitter.spec.ts +1250 -24
- package/src/event-emitter.ts +726 -0
- package/src/index.ts +20 -11
- package/tsconfig.json +21 -9
- package/tsconfig.tsbuildinfo +1 -0
- package/lib/cjs/index.js +0 -6
- package/test.gjs.js +0 -34942
- package/test.gjs.mjs +0 -34799
- package/test.gjs.mjs.meta.json +0 -1
- package/test.node.js +0 -1410
- package/test.node.mjs +0 -418
- package/tsconfig.types.json +0 -8
package/README.md
CHANGED
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
# @gjsify/events
|
|
2
2
|
|
|
3
|
-
Node.js events module
|
|
3
|
+
GJS implementation of the Node.js `events` module. Provides EventEmitter, once, on, and listenerCount.
|
|
4
|
+
|
|
5
|
+
Part of the [gjsify](https://github.com/gjsify/gjsify) project — Node.js and Web APIs for GJS (GNOME JavaScript).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @gjsify/events
|
|
11
|
+
# or
|
|
12
|
+
yarn add @gjsify/events
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { EventEmitter } from '@gjsify/events';
|
|
19
|
+
|
|
20
|
+
const emitter = new EventEmitter();
|
|
21
|
+
emitter.on('data', (msg) => console.log(msg));
|
|
22
|
+
emitter.emit('data', 'hello');
|
|
23
|
+
```
|
|
4
24
|
|
|
5
25
|
## Inspirations and credits
|
|
26
|
+
|
|
6
27
|
- https://github.com/EventEmitter2/EventEmitter2
|
|
7
28
|
- https://github.com/browserify/events
|
|
8
29
|
- https://github.com/geut/brode/blob/main/packages/browser-node-core/src/events.js
|
|
9
|
-
- https://github.com/denoland/deno_std/blob/main/node/_events.mjs
|
|
30
|
+
- https://github.com/denoland/deno_std/blob/main/node/_events.mjs
|
|
31
|
+
|
|
32
|
+
## License
|
|
33
|
+
|
|
34
|
+
MIT
|
package/cjs-compat.cjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// CJS compatibility wrapper for npm packages that require('events')
|
|
2
|
+
// In Node.js CJS, require('events') returns the EventEmitter class directly.
|
|
3
|
+
// When esbuild bundles ESM @gjsify/events for CJS consumers, it returns a
|
|
4
|
+
// namespace object instead. This wrapper extracts the default export.
|
|
5
|
+
const mod = require('./lib/esm/index.js');
|
|
6
|
+
module.exports = mod.default || mod;
|
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
const kCapture = /* @__PURE__ */ Symbol("kCapture");
|
|
2
|
+
const kRejection = /* @__PURE__ */ Symbol.for("nodejs.rejection");
|
|
3
|
+
function onceWrapper() {
|
|
4
|
+
const { target, type, listener } = this;
|
|
5
|
+
if (this.wrapperFn) target.removeListener(type, this.wrapperFn);
|
|
6
|
+
const result = listener.apply(target, arguments);
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
function _onceWrap(target, type, listener) {
|
|
10
|
+
const state = { target, type, listener, wrapperFn: void 0 };
|
|
11
|
+
const wrapped = onceWrapper.bind(state);
|
|
12
|
+
state.wrapperFn = wrapped;
|
|
13
|
+
wrapped.listener = listener;
|
|
14
|
+
return wrapped;
|
|
15
|
+
}
|
|
16
|
+
function arrayClone(arr) {
|
|
17
|
+
switch (arr.length) {
|
|
18
|
+
case 0:
|
|
19
|
+
return [];
|
|
20
|
+
case 1:
|
|
21
|
+
return [arr[0]];
|
|
22
|
+
case 2:
|
|
23
|
+
return [arr[0], arr[1]];
|
|
24
|
+
case 3:
|
|
25
|
+
return [arr[0], arr[1], arr[2]];
|
|
26
|
+
default:
|
|
27
|
+
return arr.slice();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function checkListener(listener) {
|
|
31
|
+
if (typeof listener !== "function") {
|
|
32
|
+
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function validateNumber(value, name) {
|
|
36
|
+
if (typeof value !== "number" || value !== value) {
|
|
37
|
+
throw new TypeError(`The "${name}" argument must be of type number. Received type ${typeof value}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function spliceOne(list, index) {
|
|
41
|
+
for (; index + 1 < list.length; index++) {
|
|
42
|
+
list[index] = list[index + 1];
|
|
43
|
+
}
|
|
44
|
+
list.pop();
|
|
45
|
+
}
|
|
46
|
+
class EventEmitter {
|
|
47
|
+
static defaultMaxListeners = 10;
|
|
48
|
+
static errorMonitor = /* @__PURE__ */ Symbol("events.errorMonitor");
|
|
49
|
+
static captureRejectionSymbol = kRejection;
|
|
50
|
+
static _captureRejections = false;
|
|
51
|
+
static get captureRejections() {
|
|
52
|
+
return EventEmitter._captureRejections;
|
|
53
|
+
}
|
|
54
|
+
static set captureRejections(value) {
|
|
55
|
+
if (typeof value !== "boolean") {
|
|
56
|
+
throw new TypeError('The "captureRejections" argument must be of type boolean.');
|
|
57
|
+
}
|
|
58
|
+
EventEmitter._captureRejections = value;
|
|
59
|
+
}
|
|
60
|
+
_events;
|
|
61
|
+
_eventsCount;
|
|
62
|
+
_maxListeners;
|
|
63
|
+
[kCapture];
|
|
64
|
+
constructor(opts) {
|
|
65
|
+
this._events = /* @__PURE__ */ Object.create(null);
|
|
66
|
+
this._eventsCount = 0;
|
|
67
|
+
this._maxListeners = void 0;
|
|
68
|
+
this[kCapture] = opts?.captureRejections ?? EventEmitter._captureRejections;
|
|
69
|
+
}
|
|
70
|
+
setMaxListeners(n) {
|
|
71
|
+
validateNumber(n, "n");
|
|
72
|
+
if (n < 0) {
|
|
73
|
+
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n);
|
|
74
|
+
}
|
|
75
|
+
this._maxListeners = n;
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
getMaxListeners() {
|
|
79
|
+
return this._maxListeners ?? EventEmitter.defaultMaxListeners;
|
|
80
|
+
}
|
|
81
|
+
emit(type, ...args) {
|
|
82
|
+
const events = this._events;
|
|
83
|
+
let doError = type === "error";
|
|
84
|
+
if (events !== void 0) {
|
|
85
|
+
if (doError && events[EventEmitter.errorMonitor] !== void 0) {
|
|
86
|
+
this.emit(EventEmitter.errorMonitor, ...args);
|
|
87
|
+
}
|
|
88
|
+
doError = doError && events.error === void 0;
|
|
89
|
+
} else if (!doError) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (doError) {
|
|
93
|
+
let er;
|
|
94
|
+
if (args.length > 0) {
|
|
95
|
+
er = args[0];
|
|
96
|
+
} else {
|
|
97
|
+
er = new Error("Unhandled error.");
|
|
98
|
+
}
|
|
99
|
+
if (er instanceof Error) {
|
|
100
|
+
throw er;
|
|
101
|
+
}
|
|
102
|
+
const err = new Error("Unhandled error. (" + er + ")");
|
|
103
|
+
err.context = er;
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
const handler = events[type];
|
|
107
|
+
if (handler === void 0) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (typeof handler === "function") {
|
|
111
|
+
const result = handler.apply(this, args);
|
|
112
|
+
if (result !== void 0 && result !== null && this[kCapture]) {
|
|
113
|
+
this._addCatch(result, type, args);
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
const listeners = arrayClone(handler);
|
|
117
|
+
const len = listeners.length;
|
|
118
|
+
for (let i = 0; i < len; ++i) {
|
|
119
|
+
const result = listeners[i].apply(this, args);
|
|
120
|
+
if (result !== void 0 && result !== null && this[kCapture]) {
|
|
121
|
+
this._addCatch(result, type, args);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
_addCatch(result, type, args) {
|
|
128
|
+
if (typeof result?.then === "function") {
|
|
129
|
+
result.then(void 0, (err) => {
|
|
130
|
+
const handler = this[kRejection];
|
|
131
|
+
if (typeof handler === "function") {
|
|
132
|
+
handler.call(this, err, type, ...args);
|
|
133
|
+
} else {
|
|
134
|
+
const prev = this[kCapture];
|
|
135
|
+
try {
|
|
136
|
+
this[kCapture] = false;
|
|
137
|
+
this.emit("error", err);
|
|
138
|
+
} finally {
|
|
139
|
+
this[kCapture] = prev;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
addListener(type, listener) {
|
|
146
|
+
return this._addListener(type, listener, false);
|
|
147
|
+
}
|
|
148
|
+
on(type, listener) {
|
|
149
|
+
return this._addListener(type, listener, false);
|
|
150
|
+
}
|
|
151
|
+
prependListener(type, listener) {
|
|
152
|
+
return this._addListener(type, listener, true);
|
|
153
|
+
}
|
|
154
|
+
_addListener(type, listener, prepend) {
|
|
155
|
+
checkListener(listener);
|
|
156
|
+
let events = this._events;
|
|
157
|
+
if (events === void 0) {
|
|
158
|
+
events = this._events = /* @__PURE__ */ Object.create(null);
|
|
159
|
+
this._eventsCount = 0;
|
|
160
|
+
} else if (events.newListener !== void 0) {
|
|
161
|
+
this.emit("newListener", type, listener.listener ?? listener);
|
|
162
|
+
events = this._events;
|
|
163
|
+
}
|
|
164
|
+
let existing = events[type];
|
|
165
|
+
if (existing === void 0) {
|
|
166
|
+
events[type] = listener;
|
|
167
|
+
++this._eventsCount;
|
|
168
|
+
} else if (typeof existing === "function") {
|
|
169
|
+
events[type] = prepend ? [listener, existing] : [existing, listener];
|
|
170
|
+
} else {
|
|
171
|
+
if (prepend) {
|
|
172
|
+
existing.unshift(listener);
|
|
173
|
+
} else {
|
|
174
|
+
existing.push(listener);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const m = this.getMaxListeners();
|
|
178
|
+
if (m > 0) {
|
|
179
|
+
const count = typeof events[type] === "function" ? 1 : events[type].length;
|
|
180
|
+
if (count > m && !events[type].warned) {
|
|
181
|
+
if (typeof events[type] !== "function") {
|
|
182
|
+
events[type].warned = true;
|
|
183
|
+
}
|
|
184
|
+
const w = new Error(
|
|
185
|
+
`Possible EventEmitter memory leak detected. ${count} ${String(type)} listeners added to [${this.constructor.name}]. Use emitter.setMaxListeners() to increase limit`
|
|
186
|
+
);
|
|
187
|
+
w.name = "MaxListenersExceededWarning";
|
|
188
|
+
console.warn(w.message);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return this;
|
|
192
|
+
}
|
|
193
|
+
once(type, listener) {
|
|
194
|
+
checkListener(listener);
|
|
195
|
+
this.on(type, _onceWrap(this, type, listener));
|
|
196
|
+
return this;
|
|
197
|
+
}
|
|
198
|
+
prependOnceListener(type, listener) {
|
|
199
|
+
checkListener(listener);
|
|
200
|
+
this.prependListener(type, _onceWrap(this, type, listener));
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
removeListener(type, listener) {
|
|
204
|
+
checkListener(listener);
|
|
205
|
+
const events = this._events;
|
|
206
|
+
if (events === void 0) {
|
|
207
|
+
return this;
|
|
208
|
+
}
|
|
209
|
+
const list = events[type];
|
|
210
|
+
if (list === void 0) {
|
|
211
|
+
return this;
|
|
212
|
+
}
|
|
213
|
+
if (list === listener || list.listener === listener) {
|
|
214
|
+
if (--this._eventsCount === 0) {
|
|
215
|
+
this._events = /* @__PURE__ */ Object.create(null);
|
|
216
|
+
} else {
|
|
217
|
+
delete events[type];
|
|
218
|
+
if (events.removeListener) {
|
|
219
|
+
this.emit("removeListener", type, list.listener ?? listener);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
} else if (typeof list !== "function") {
|
|
223
|
+
let position = -1;
|
|
224
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
225
|
+
if (list[i] === listener || list[i].listener === listener) {
|
|
226
|
+
position = i;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (position < 0) {
|
|
231
|
+
return this;
|
|
232
|
+
}
|
|
233
|
+
if (position === 0) {
|
|
234
|
+
list.shift();
|
|
235
|
+
} else {
|
|
236
|
+
spliceOne(list, position);
|
|
237
|
+
}
|
|
238
|
+
if (list.length === 1) {
|
|
239
|
+
events[type] = list[0];
|
|
240
|
+
}
|
|
241
|
+
if (events.removeListener !== void 0) {
|
|
242
|
+
this.emit("removeListener", type, listener.listener ?? listener);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return this;
|
|
246
|
+
}
|
|
247
|
+
off(type, listener) {
|
|
248
|
+
return this.removeListener(type, listener);
|
|
249
|
+
}
|
|
250
|
+
removeAllListeners(type) {
|
|
251
|
+
const events = this._events;
|
|
252
|
+
if (events === void 0) {
|
|
253
|
+
return this;
|
|
254
|
+
}
|
|
255
|
+
if (events.removeListener === void 0) {
|
|
256
|
+
if (arguments.length === 0) {
|
|
257
|
+
this._events = /* @__PURE__ */ Object.create(null);
|
|
258
|
+
this._eventsCount = 0;
|
|
259
|
+
} else if (events[type] !== void 0) {
|
|
260
|
+
if (--this._eventsCount === 0) {
|
|
261
|
+
this._events = /* @__PURE__ */ Object.create(null);
|
|
262
|
+
} else {
|
|
263
|
+
delete events[type];
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return this;
|
|
267
|
+
}
|
|
268
|
+
if (arguments.length === 0) {
|
|
269
|
+
const keys = Object.keys(events);
|
|
270
|
+
for (let i = 0; i < keys.length; ++i) {
|
|
271
|
+
const key = keys[i];
|
|
272
|
+
if (key === "removeListener") continue;
|
|
273
|
+
this.removeAllListeners(key);
|
|
274
|
+
}
|
|
275
|
+
this.removeAllListeners("removeListener");
|
|
276
|
+
this._events = /* @__PURE__ */ Object.create(null);
|
|
277
|
+
this._eventsCount = 0;
|
|
278
|
+
return this;
|
|
279
|
+
}
|
|
280
|
+
const listeners = events[type];
|
|
281
|
+
if (typeof listeners === "function") {
|
|
282
|
+
this.removeListener(type, listeners);
|
|
283
|
+
} else if (listeners !== void 0) {
|
|
284
|
+
for (let i = listeners.length - 1; i >= 0; i--) {
|
|
285
|
+
this.removeListener(type, listeners[i]);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return this;
|
|
289
|
+
}
|
|
290
|
+
listeners(type) {
|
|
291
|
+
const events = this._events;
|
|
292
|
+
if (events === void 0) {
|
|
293
|
+
return [];
|
|
294
|
+
}
|
|
295
|
+
const evlistener = events[type];
|
|
296
|
+
if (evlistener === void 0) {
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
if (typeof evlistener === "function") {
|
|
300
|
+
return [evlistener.listener ?? evlistener];
|
|
301
|
+
}
|
|
302
|
+
return unwrapListeners(evlistener);
|
|
303
|
+
}
|
|
304
|
+
rawListeners(type) {
|
|
305
|
+
const events = this._events;
|
|
306
|
+
if (events === void 0) {
|
|
307
|
+
return [];
|
|
308
|
+
}
|
|
309
|
+
const evlistener = events[type];
|
|
310
|
+
if (evlistener === void 0) {
|
|
311
|
+
return [];
|
|
312
|
+
}
|
|
313
|
+
if (typeof evlistener === "function") {
|
|
314
|
+
return [evlistener];
|
|
315
|
+
}
|
|
316
|
+
return arrayClone(evlistener);
|
|
317
|
+
}
|
|
318
|
+
listenerCount(type) {
|
|
319
|
+
const events = this._events;
|
|
320
|
+
if (events === void 0) {
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
const evlistener = events[type];
|
|
324
|
+
if (evlistener === void 0) {
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
if (typeof evlistener === "function") {
|
|
328
|
+
return 1;
|
|
329
|
+
}
|
|
330
|
+
return evlistener.length;
|
|
331
|
+
}
|
|
332
|
+
eventNames() {
|
|
333
|
+
return (this._eventsCount ?? 0) > 0 ? Reflect.ownKeys(this._events) : [];
|
|
334
|
+
}
|
|
335
|
+
// -- Static methods --
|
|
336
|
+
/**
|
|
337
|
+
* Returns a promise that resolves when the emitter emits the given event,
|
|
338
|
+
* or rejects if the emitter emits 'error' while waiting.
|
|
339
|
+
*/
|
|
340
|
+
static once(emitter, name, options) {
|
|
341
|
+
return new Promise((resolve, reject) => {
|
|
342
|
+
const signal = options?.signal;
|
|
343
|
+
if (signal?.aborted) {
|
|
344
|
+
reject(createAbortError(signal));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (typeof emitter.addEventListener === "function") {
|
|
348
|
+
const eventTarget = emitter;
|
|
349
|
+
const handler = (...args) => {
|
|
350
|
+
if (signal) {
|
|
351
|
+
signal.removeEventListener("abort", abortHandler2);
|
|
352
|
+
}
|
|
353
|
+
resolve(args);
|
|
354
|
+
};
|
|
355
|
+
const errorHandler2 = (err) => {
|
|
356
|
+
if (signal) {
|
|
357
|
+
signal.removeEventListener("abort", abortHandler2);
|
|
358
|
+
}
|
|
359
|
+
eventTarget.removeEventListener("error", errorHandler2);
|
|
360
|
+
reject(err);
|
|
361
|
+
};
|
|
362
|
+
const abortHandler2 = () => {
|
|
363
|
+
eventTarget.removeEventListener(name, handler);
|
|
364
|
+
eventTarget.removeEventListener("error", errorHandler2);
|
|
365
|
+
reject(createAbortError(signal));
|
|
366
|
+
};
|
|
367
|
+
eventTarget.addEventListener(name, handler, { once: true });
|
|
368
|
+
if (name !== "error") {
|
|
369
|
+
eventTarget.addEventListener("error", errorHandler2, { once: true });
|
|
370
|
+
}
|
|
371
|
+
if (signal) {
|
|
372
|
+
signal.addEventListener("abort", abortHandler2, { once: true });
|
|
373
|
+
}
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const ee = emitter;
|
|
377
|
+
const eventHandler = (...args) => {
|
|
378
|
+
if (signal) {
|
|
379
|
+
signal.removeEventListener("abort", abortHandler);
|
|
380
|
+
}
|
|
381
|
+
if (errorHandler !== void 0) {
|
|
382
|
+
ee.removeListener("error", errorHandler);
|
|
383
|
+
}
|
|
384
|
+
resolve(args);
|
|
385
|
+
};
|
|
386
|
+
let errorHandler;
|
|
387
|
+
if (name !== "error") {
|
|
388
|
+
errorHandler = (err) => {
|
|
389
|
+
ee.removeListener(name, eventHandler);
|
|
390
|
+
if (signal) {
|
|
391
|
+
signal.removeEventListener("abort", abortHandler);
|
|
392
|
+
}
|
|
393
|
+
reject(err);
|
|
394
|
+
};
|
|
395
|
+
ee.once("error", errorHandler);
|
|
396
|
+
}
|
|
397
|
+
ee.once(name, eventHandler);
|
|
398
|
+
const abortHandler = () => {
|
|
399
|
+
ee.removeListener(name, eventHandler);
|
|
400
|
+
if (errorHandler) {
|
|
401
|
+
ee.removeListener("error", errorHandler);
|
|
402
|
+
}
|
|
403
|
+
reject(createAbortError(signal));
|
|
404
|
+
};
|
|
405
|
+
if (signal) {
|
|
406
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Returns an async iterator that yields event arguments each time the emitter emits.
|
|
412
|
+
*/
|
|
413
|
+
static on(emitter, event, options) {
|
|
414
|
+
const signal = options?.signal;
|
|
415
|
+
if (signal?.aborted) {
|
|
416
|
+
throw createAbortError(signal);
|
|
417
|
+
}
|
|
418
|
+
const highWaterMark = options?.highWaterMark ?? Number.MAX_SAFE_INTEGER;
|
|
419
|
+
const lowWaterMark = options?.lowWaterMark ?? 1;
|
|
420
|
+
validateNumber(highWaterMark, "highWaterMark");
|
|
421
|
+
validateNumber(lowWaterMark, "lowWaterMark");
|
|
422
|
+
const unconsumedEvents = [];
|
|
423
|
+
const unconsumedPromises = [];
|
|
424
|
+
let error = null;
|
|
425
|
+
let finished = false;
|
|
426
|
+
let paused = false;
|
|
427
|
+
const eventHandler = (...args) => {
|
|
428
|
+
if (unconsumedPromises.length > 0) {
|
|
429
|
+
const { resolve } = unconsumedPromises.shift();
|
|
430
|
+
resolve({ value: args, done: false });
|
|
431
|
+
} else {
|
|
432
|
+
unconsumedEvents.push(args);
|
|
433
|
+
if (unconsumedEvents.length >= highWaterMark && !paused) {
|
|
434
|
+
paused = true;
|
|
435
|
+
if (typeof emitter.pause === "function") {
|
|
436
|
+
emitter.pause();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
const errorHandler = (err) => {
|
|
442
|
+
error = err;
|
|
443
|
+
if (unconsumedPromises.length > 0) {
|
|
444
|
+
const { reject } = unconsumedPromises.shift();
|
|
445
|
+
reject(err);
|
|
446
|
+
}
|
|
447
|
+
iterator.return();
|
|
448
|
+
};
|
|
449
|
+
const abortHandler = () => {
|
|
450
|
+
errorHandler(createAbortError(signal));
|
|
451
|
+
};
|
|
452
|
+
emitter.on(event, eventHandler);
|
|
453
|
+
if (event !== "error") {
|
|
454
|
+
emitter.on("error", errorHandler);
|
|
455
|
+
}
|
|
456
|
+
if (signal) {
|
|
457
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
458
|
+
}
|
|
459
|
+
const cleanup = () => {
|
|
460
|
+
emitter.removeListener(event, eventHandler);
|
|
461
|
+
emitter.removeListener("error", errorHandler);
|
|
462
|
+
if (signal) {
|
|
463
|
+
signal.removeEventListener("abort", abortHandler);
|
|
464
|
+
}
|
|
465
|
+
finished = true;
|
|
466
|
+
for (const { resolve } of unconsumedPromises) {
|
|
467
|
+
resolve({ value: void 0, done: true });
|
|
468
|
+
}
|
|
469
|
+
unconsumedPromises.length = 0;
|
|
470
|
+
unconsumedEvents.length = 0;
|
|
471
|
+
};
|
|
472
|
+
const iterator = {
|
|
473
|
+
next() {
|
|
474
|
+
if (unconsumedEvents.length > 0) {
|
|
475
|
+
const value = unconsumedEvents.shift();
|
|
476
|
+
if (paused && unconsumedEvents.length < lowWaterMark) {
|
|
477
|
+
paused = false;
|
|
478
|
+
if (typeof emitter.resume === "function") {
|
|
479
|
+
emitter.resume();
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return Promise.resolve({ value, done: false });
|
|
483
|
+
}
|
|
484
|
+
if (error) {
|
|
485
|
+
const p = Promise.reject(error);
|
|
486
|
+
error = null;
|
|
487
|
+
return p;
|
|
488
|
+
}
|
|
489
|
+
if (finished) {
|
|
490
|
+
return Promise.resolve({ value: void 0, done: true });
|
|
491
|
+
}
|
|
492
|
+
return new Promise((resolve, reject) => {
|
|
493
|
+
unconsumedPromises.push({ resolve, reject });
|
|
494
|
+
});
|
|
495
|
+
},
|
|
496
|
+
return() {
|
|
497
|
+
cleanup();
|
|
498
|
+
return Promise.resolve({ value: void 0, done: true });
|
|
499
|
+
},
|
|
500
|
+
throw(err) {
|
|
501
|
+
if (!finished) {
|
|
502
|
+
error = err;
|
|
503
|
+
cleanup();
|
|
504
|
+
}
|
|
505
|
+
return Promise.reject(err);
|
|
506
|
+
},
|
|
507
|
+
[Symbol.asyncIterator]() {
|
|
508
|
+
return this;
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
return iterator;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Returns the number of listeners listening to the event name.
|
|
515
|
+
* @deprecated Use emitter.listenerCount() instead.
|
|
516
|
+
*/
|
|
517
|
+
static listenerCount(emitter, type) {
|
|
518
|
+
return emitter.listenerCount(type);
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Returns a copy of the array of listeners for the event named eventName.
|
|
522
|
+
*/
|
|
523
|
+
static getEventListeners(emitter, name) {
|
|
524
|
+
if (typeof emitter.listeners === "function") {
|
|
525
|
+
return emitter.listeners(name);
|
|
526
|
+
}
|
|
527
|
+
return [];
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Set max listeners on one or more emitters.
|
|
531
|
+
*/
|
|
532
|
+
static setMaxListeners(n, ...emitters) {
|
|
533
|
+
validateNumber(n, "n");
|
|
534
|
+
if (n < 0) {
|
|
535
|
+
throw new RangeError('The value of "n" is out of range.');
|
|
536
|
+
}
|
|
537
|
+
if (emitters.length === 0) {
|
|
538
|
+
EventEmitter.defaultMaxListeners = n;
|
|
539
|
+
} else {
|
|
540
|
+
for (const emitter of emitters) {
|
|
541
|
+
if (typeof emitter.setMaxListeners === "function") {
|
|
542
|
+
emitter.setMaxListeners(n);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Returns the currently set max listeners on the emitter.
|
|
549
|
+
*/
|
|
550
|
+
static getMaxListeners(emitter) {
|
|
551
|
+
if (typeof emitter.getMaxListeners === "function") {
|
|
552
|
+
return emitter.getMaxListeners();
|
|
553
|
+
}
|
|
554
|
+
return EventEmitter.defaultMaxListeners;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Listens once to an abort event on the provided signal and returns a disposable.
|
|
558
|
+
*/
|
|
559
|
+
static addAbortListener(signal, listener) {
|
|
560
|
+
if (signal.aborted) {
|
|
561
|
+
Promise.resolve().then(() => listener());
|
|
562
|
+
}
|
|
563
|
+
const handler = () => listener();
|
|
564
|
+
signal.addEventListener("abort", handler, { once: true });
|
|
565
|
+
return {
|
|
566
|
+
[Symbol.dispose]() {
|
|
567
|
+
signal.removeEventListener("abort", handler);
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
EventEmitter.EventEmitter = EventEmitter;
|
|
573
|
+
function unwrapListeners(arr) {
|
|
574
|
+
const ret = new Array(arr.length);
|
|
575
|
+
for (let i = 0; i < ret.length; ++i) {
|
|
576
|
+
ret[i] = arr[i].listener ?? arr[i];
|
|
577
|
+
}
|
|
578
|
+
return ret;
|
|
579
|
+
}
|
|
580
|
+
function createAbortError(signal) {
|
|
581
|
+
const err = new Error("The operation was aborted");
|
|
582
|
+
err.name = "AbortError";
|
|
583
|
+
err.code = "ABORT_ERR";
|
|
584
|
+
if (signal?.reason) {
|
|
585
|
+
err.cause = signal.reason;
|
|
586
|
+
}
|
|
587
|
+
return err;
|
|
588
|
+
}
|
|
589
|
+
export {
|
|
590
|
+
EventEmitter
|
|
591
|
+
};
|
package/lib/esm/index.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { EventEmitter } from "./event-emitter.js";
|
|
2
|
+
const captureRejectionSymbol = EventEmitter.captureRejectionSymbol;
|
|
3
|
+
const errorMonitor = EventEmitter.errorMonitor;
|
|
4
|
+
const defaultMaxListeners = EventEmitter.defaultMaxListeners;
|
|
5
|
+
const setMaxListeners = EventEmitter.setMaxListeners;
|
|
6
|
+
const getMaxListeners = EventEmitter.getMaxListeners;
|
|
7
|
+
const once = EventEmitter.once;
|
|
8
|
+
const on = EventEmitter.on;
|
|
9
|
+
const getEventListeners = EventEmitter.getEventListeners;
|
|
10
|
+
const listenerCount = EventEmitter.listenerCount;
|
|
11
|
+
const addAbortListener = EventEmitter.addAbortListener;
|
|
12
|
+
var index_default = EventEmitter;
|
|
4
13
|
export {
|
|
5
|
-
|
|
14
|
+
EventEmitter,
|
|
15
|
+
addAbortListener,
|
|
16
|
+
captureRejectionSymbol,
|
|
17
|
+
index_default as default,
|
|
18
|
+
defaultMaxListeners,
|
|
19
|
+
errorMonitor,
|
|
20
|
+
getEventListeners,
|
|
21
|
+
getMaxListeners,
|
|
22
|
+
listenerCount,
|
|
23
|
+
on,
|
|
24
|
+
once,
|
|
25
|
+
setMaxListeners
|
|
6
26
|
};
|