event-emission 0.1.0 → 0.2.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 +228 -27
- package/dist/{eventful.d.ts → event-emission.d.ts} +22 -19
- package/dist/event-emission.d.ts.map +1 -0
- package/dist/factory.d.ts +1 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/index.cjs +811 -354
- package/dist/index.cjs.map +8 -8
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +787 -348
- package/dist/index.js.map +8 -8
- package/dist/interoperability.cjs +1605 -0
- package/dist/interoperability.cjs.map +15 -0
- package/dist/{interop.d.ts → interoperability.d.ts} +12 -11
- package/dist/interoperability.d.ts.map +1 -0
- package/dist/interoperability.js +1555 -0
- package/dist/interoperability.js.map +15 -0
- package/dist/observable.cjs +286 -0
- package/dist/observable.cjs.map +11 -0
- package/dist/observable.d.ts +36 -0
- package/dist/observable.d.ts.map +1 -0
- package/dist/observable.js +253 -0
- package/dist/observable.js.map +11 -0
- package/dist/observe.cjs +344 -0
- package/dist/observe.cjs.map +10 -0
- package/dist/observe.d.ts +9 -4
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +313 -0
- package/dist/observe.js.map +10 -0
- package/dist/symbols.d.ts +1 -1
- package/dist/types.cjs +35 -0
- package/dist/types.cjs.map +9 -0
- package/dist/types.d.ts +105 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +9 -0
- package/package.json +27 -1
- package/src/{eventful.ts → event-emission.ts} +45 -28
- package/src/factory.ts +639 -269
- package/src/index.ts +7 -29
- package/src/{interop.ts → interoperability.ts} +55 -35
- package/src/observable.ts +310 -0
- package/src/observe.ts +70 -33
- package/src/symbols.ts +1 -1
- package/src/types.ts +130 -29
- package/dist/eventful.d.ts.map +0 -1
- package/dist/interop.d.ts.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -27,39 +27,274 @@ var __export = (target, all) => {
|
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
// src/
|
|
31
|
-
var
|
|
32
|
-
__export(
|
|
33
|
-
|
|
34
|
-
pipe: () => pipe,
|
|
35
|
-
isObserved: () => isObserved,
|
|
36
|
-
getOriginal: () => getOriginal,
|
|
37
|
-
fromEventTarget: () => fromEventTarget,
|
|
38
|
-
forwardToEventTarget: () => forwardToEventTarget,
|
|
39
|
-
createEventTarget: () => createEventTarget,
|
|
40
|
-
SymbolObservable: () => SymbolObservable,
|
|
41
|
-
PROXY_MARKER: () => PROXY_MARKER,
|
|
42
|
-
ORIGINAL_TARGET: () => ORIGINAL_TARGET,
|
|
43
|
-
Eventful: () => Eventful,
|
|
44
|
-
BufferOverflowError: () => BufferOverflowError
|
|
30
|
+
// src/observable.ts
|
|
31
|
+
var exports_observable = {};
|
|
32
|
+
__export(exports_observable, {
|
|
33
|
+
Observable: () => Observable
|
|
45
34
|
});
|
|
46
|
-
module.exports = __toCommonJS(
|
|
35
|
+
module.exports = __toCommonJS(exports_observable);
|
|
47
36
|
|
|
48
37
|
// src/symbols.ts
|
|
49
38
|
var SymbolObservable = typeof Symbol === "function" && Symbol.observable || Symbol.for("@@observable");
|
|
50
39
|
if (typeof Symbol === "function") {
|
|
51
40
|
Symbol.observable = SymbolObservable;
|
|
52
41
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
|
|
43
|
+
// src/observable.ts
|
|
44
|
+
function getMethod(obj, key) {
|
|
45
|
+
if (obj === null || obj === undefined)
|
|
46
|
+
return;
|
|
47
|
+
const value = obj[key];
|
|
48
|
+
if (value == null)
|
|
49
|
+
return;
|
|
50
|
+
if (typeof value !== "function") {
|
|
51
|
+
throw new TypeError(value + " is not a function");
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function hostReportError(e) {
|
|
56
|
+
if (typeof queueMicrotask === "function") {
|
|
57
|
+
queueMicrotask(() => {
|
|
58
|
+
throw e;
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
throw e;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function SubscriptionObserverImpl(subscription) {
|
|
67
|
+
this._subscription = subscription;
|
|
68
|
+
}
|
|
69
|
+
SubscriptionObserverImpl.prototype = Object.create(Object.prototype);
|
|
70
|
+
Object.defineProperties(SubscriptionObserverImpl.prototype, {
|
|
71
|
+
constructor: { value: Object, configurable: true, writable: true },
|
|
72
|
+
closed: {
|
|
73
|
+
get() {
|
|
74
|
+
return this._subscription._closed;
|
|
75
|
+
},
|
|
76
|
+
configurable: true
|
|
77
|
+
},
|
|
78
|
+
next: {
|
|
79
|
+
value: function next(value) {
|
|
80
|
+
const subscription = this._subscription;
|
|
81
|
+
if (subscription._closed)
|
|
82
|
+
return;
|
|
83
|
+
const observer = subscription._observer;
|
|
84
|
+
try {
|
|
85
|
+
const m = getMethod(observer, "next");
|
|
86
|
+
if (!m)
|
|
87
|
+
return;
|
|
88
|
+
return m.call(observer, value);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
try {
|
|
91
|
+
this.error(e);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
hostReportError(err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
configurable: true,
|
|
98
|
+
writable: true
|
|
99
|
+
},
|
|
100
|
+
error: {
|
|
101
|
+
value: function error(errorValue) {
|
|
102
|
+
const subscription = this._subscription;
|
|
103
|
+
if (subscription._closed)
|
|
104
|
+
throw errorValue;
|
|
105
|
+
subscription._closed = true;
|
|
106
|
+
const observer = subscription._observer;
|
|
107
|
+
try {
|
|
108
|
+
const m = getMethod(observer, "error");
|
|
109
|
+
if (m) {
|
|
110
|
+
return m.call(observer, errorValue);
|
|
111
|
+
}
|
|
112
|
+
throw errorValue;
|
|
113
|
+
} finally {
|
|
114
|
+
subscription._cleanup();
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
configurable: true,
|
|
118
|
+
writable: true
|
|
119
|
+
},
|
|
120
|
+
complete: {
|
|
121
|
+
value: function complete(value) {
|
|
122
|
+
const subscription = this._subscription;
|
|
123
|
+
if (subscription._closed)
|
|
124
|
+
return;
|
|
125
|
+
subscription._closed = true;
|
|
126
|
+
const observer = subscription._observer;
|
|
127
|
+
try {
|
|
128
|
+
const m = getMethod(observer, "complete");
|
|
129
|
+
if (m) {
|
|
130
|
+
return m.call(observer, value);
|
|
131
|
+
}
|
|
132
|
+
return;
|
|
133
|
+
} finally {
|
|
134
|
+
subscription._cleanup();
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
configurable: true,
|
|
138
|
+
writable: true
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.next, "length", { value: 1 });
|
|
142
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.error, "length", { value: 1 });
|
|
143
|
+
Object.defineProperty(SubscriptionObserverImpl.prototype.complete, "length", {
|
|
144
|
+
value: 1
|
|
145
|
+
});
|
|
146
|
+
function Subscription(observer, subscriber) {
|
|
147
|
+
this._observer = observer;
|
|
148
|
+
this._cleanupFn = undefined;
|
|
149
|
+
this._closed = false;
|
|
150
|
+
const subscriptionObserver = new SubscriptionObserverImpl(this);
|
|
151
|
+
try {
|
|
152
|
+
const start = getMethod(observer, "start");
|
|
153
|
+
if (start) {
|
|
154
|
+
start.call(observer, this);
|
|
155
|
+
}
|
|
156
|
+
} catch (e) {
|
|
157
|
+
hostReportError(e);
|
|
158
|
+
}
|
|
159
|
+
if (this._closed)
|
|
160
|
+
return;
|
|
161
|
+
try {
|
|
162
|
+
const cleanup = subscriber(subscriptionObserver);
|
|
163
|
+
if (cleanup != null) {
|
|
164
|
+
if (typeof cleanup !== "function" && typeof cleanup.unsubscribe !== "function") {
|
|
165
|
+
throw new TypeError(cleanup + " is not a function or a subscription");
|
|
166
|
+
}
|
|
167
|
+
this._cleanupFn = cleanup;
|
|
168
|
+
if (this._closed) {
|
|
169
|
+
this._cleanup();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
} catch (e) {
|
|
173
|
+
subscriptionObserver.error(e);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
Subscription.prototype = Object.create(Object.prototype);
|
|
177
|
+
Object.defineProperties(Subscription.prototype, {
|
|
178
|
+
constructor: { value: Object, configurable: true, writable: true },
|
|
179
|
+
closed: {
|
|
180
|
+
get() {
|
|
181
|
+
return this._closed;
|
|
182
|
+
},
|
|
183
|
+
configurable: true
|
|
184
|
+
},
|
|
185
|
+
unsubscribe: {
|
|
186
|
+
value: function unsubscribe() {
|
|
187
|
+
if (this._closed)
|
|
188
|
+
return;
|
|
189
|
+
this._closed = true;
|
|
190
|
+
this._cleanup();
|
|
191
|
+
},
|
|
192
|
+
configurable: true,
|
|
193
|
+
writable: true
|
|
194
|
+
},
|
|
195
|
+
_cleanup: {
|
|
196
|
+
value: function _cleanup() {
|
|
197
|
+
const cleanup = this._cleanupFn;
|
|
198
|
+
if (!cleanup)
|
|
199
|
+
return;
|
|
200
|
+
this._cleanupFn = undefined;
|
|
201
|
+
try {
|
|
202
|
+
if (typeof cleanup === "function") {
|
|
203
|
+
cleanup();
|
|
204
|
+
} else if (cleanup && typeof cleanup.unsubscribe === "function") {
|
|
205
|
+
cleanup.unsubscribe();
|
|
206
|
+
}
|
|
207
|
+
} catch (e) {
|
|
208
|
+
hostReportError(e);
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
configurable: true,
|
|
212
|
+
writable: true
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
class Observable {
|
|
217
|
+
_subscriber;
|
|
218
|
+
constructor(subscriber) {
|
|
219
|
+
if (typeof subscriber !== "function") {
|
|
220
|
+
throw new TypeError("Observable initializer must be a function");
|
|
221
|
+
}
|
|
222
|
+
this._subscriber = subscriber;
|
|
223
|
+
}
|
|
224
|
+
subscribe(observerOrNext, error2, complete2) {
|
|
225
|
+
let observer;
|
|
226
|
+
if (typeof observerOrNext === "function") {
|
|
227
|
+
observer = {
|
|
228
|
+
next: observerOrNext,
|
|
229
|
+
error: error2,
|
|
230
|
+
complete: complete2
|
|
231
|
+
};
|
|
232
|
+
} else if (typeof observerOrNext !== "object" || observerOrNext === null) {
|
|
233
|
+
throw new TypeError(observerOrNext + " is not an object");
|
|
234
|
+
} else {
|
|
235
|
+
observer = observerOrNext;
|
|
236
|
+
}
|
|
237
|
+
return new Subscription(observer, this._subscriber);
|
|
238
|
+
}
|
|
239
|
+
[SymbolObservable]() {
|
|
240
|
+
return this;
|
|
241
|
+
}
|
|
242
|
+
static of(...items) {
|
|
243
|
+
const C = typeof this === "function" ? this : Observable;
|
|
244
|
+
return new C((observer) => {
|
|
245
|
+
for (let i = 0;i < items.length; ++i) {
|
|
246
|
+
observer.next(items[i]);
|
|
247
|
+
if (observer.closed)
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
observer.complete();
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
static from(x) {
|
|
254
|
+
const C = typeof this === "function" ? this : Observable;
|
|
255
|
+
if (x == null)
|
|
256
|
+
throw new TypeError(x + " is not an object");
|
|
257
|
+
const method = x[SymbolObservable];
|
|
258
|
+
if (method != null) {
|
|
259
|
+
if (typeof method !== "function") {
|
|
260
|
+
throw new TypeError(method + " is not a function");
|
|
261
|
+
}
|
|
262
|
+
const observable = method.call(x);
|
|
263
|
+
if (Object(observable) !== observable) {
|
|
264
|
+
throw new TypeError(observable + " is not an object");
|
|
265
|
+
}
|
|
266
|
+
if (observable.constructor === C) {
|
|
267
|
+
return observable;
|
|
268
|
+
}
|
|
269
|
+
return new C((observer) => observable.subscribe(observer));
|
|
270
|
+
}
|
|
271
|
+
if (Symbol.iterator in x) {
|
|
272
|
+
return new C((observer) => {
|
|
273
|
+
for (const item of x) {
|
|
274
|
+
observer.next(item);
|
|
275
|
+
if (observer.closed)
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
observer.complete();
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
throw new TypeError(x + " is not observable");
|
|
58
282
|
}
|
|
59
283
|
}
|
|
284
|
+
|
|
60
285
|
// src/observe.ts
|
|
61
|
-
var
|
|
62
|
-
|
|
286
|
+
var exports_observe = {};
|
|
287
|
+
__export(exports_observe, {
|
|
288
|
+
setupEventForwarding: () => setupEventForwarding,
|
|
289
|
+
isObserved: () => isObserved,
|
|
290
|
+
getOriginal: () => getOriginal,
|
|
291
|
+
createObservableProxy: () => createObservableProxy,
|
|
292
|
+
PROXY_MARKER: () => PROXY_MARKER,
|
|
293
|
+
ORIGINAL_TARGET: () => ORIGINAL_TARGET
|
|
294
|
+
});
|
|
295
|
+
module.exports = __toCommonJS(exports_observe);
|
|
296
|
+
var PROXY_MARKER = Symbol.for("@lasercat/event-emission/proxy");
|
|
297
|
+
var ORIGINAL_TARGET = Symbol.for("@lasercat/event-emission/original");
|
|
63
298
|
var ARRAY_MUTATORS = new Set([
|
|
64
299
|
"push",
|
|
65
300
|
"pop",
|
|
@@ -81,17 +316,13 @@ function isArrayMutator(prop) {
|
|
|
81
316
|
return typeof prop === "string" && ARRAY_MUTATORS.has(prop);
|
|
82
317
|
}
|
|
83
318
|
function cloneAlongPath(obj, path) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return Array.isArray(obj) ? [...obj] : { ...obj };
|
|
319
|
+
const isArray = Array.isArray(obj);
|
|
320
|
+
const rootClone = isArray ? [...obj] : { ...obj };
|
|
321
|
+
if (!path || isArray) {
|
|
322
|
+
return rootClone;
|
|
89
323
|
}
|
|
90
324
|
const parts = path.split(".");
|
|
91
|
-
|
|
92
|
-
return [...obj];
|
|
93
|
-
}
|
|
94
|
-
const result = { ...obj };
|
|
325
|
+
const result = rootClone;
|
|
95
326
|
let current = result;
|
|
96
327
|
for (let i = 0;i < parts.length; i++) {
|
|
97
328
|
const key = parts[i];
|
|
@@ -107,13 +338,19 @@ function cloneAlongPath(obj, path) {
|
|
|
107
338
|
}
|
|
108
339
|
return result;
|
|
109
340
|
}
|
|
110
|
-
function cloneForComparison(obj, strategy, changedPath) {
|
|
341
|
+
function cloneForComparison(obj, strategy, changedPath, deepClone) {
|
|
111
342
|
if (obj === null || typeof obj !== "object")
|
|
112
343
|
return obj;
|
|
113
344
|
switch (strategy) {
|
|
114
345
|
case "shallow":
|
|
115
346
|
return Array.isArray(obj) ? [...obj] : { ...obj };
|
|
116
347
|
case "deep":
|
|
348
|
+
if (deepClone) {
|
|
349
|
+
return deepClone(obj);
|
|
350
|
+
}
|
|
351
|
+
if (typeof structuredClone !== "function") {
|
|
352
|
+
throw new Error("structuredClone is not available in this runtime; provide observe.deepClone, or use cloneStrategy 'path' or 'shallow'.");
|
|
353
|
+
}
|
|
117
354
|
return structuredClone(obj);
|
|
118
355
|
case "path":
|
|
119
356
|
return cloneAlongPath(obj, changedPath);
|
|
@@ -161,7 +398,7 @@ function getContextRegistry(target) {
|
|
|
161
398
|
function createArrayMethodInterceptor(array, method, path, context) {
|
|
162
399
|
const original = array[method];
|
|
163
400
|
return function(...args) {
|
|
164
|
-
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, path);
|
|
401
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, path, context.options.deepClone);
|
|
165
402
|
const previousItems = [...array];
|
|
166
403
|
const result = original.apply(this, args);
|
|
167
404
|
const { added, removed } = computeArrayDiff(method, previousItems, array, args);
|
|
@@ -233,7 +470,7 @@ function createObservableProxyInternal(target, path, context) {
|
|
|
233
470
|
return true;
|
|
234
471
|
}
|
|
235
472
|
const propPath = path ? `${path}.${prop}` : prop;
|
|
236
|
-
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath);
|
|
473
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
|
|
237
474
|
const success = Reflect.set(obj, prop, value, receiver);
|
|
238
475
|
if (success) {
|
|
239
476
|
context.eventTarget.dispatchEvent({
|
|
@@ -259,7 +496,7 @@ function createObservableProxyInternal(target, path, context) {
|
|
|
259
496
|
return Reflect.deleteProperty(obj, prop);
|
|
260
497
|
}
|
|
261
498
|
const propPath = path ? `${path}.${String(prop)}` : String(prop);
|
|
262
|
-
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath);
|
|
499
|
+
const previousState = cloneForComparison(context.originalRoot, context.options.cloneStrategy, propPath, context.options.deepClone);
|
|
263
500
|
const success = Reflect.deleteProperty(obj, prop);
|
|
264
501
|
if (success) {
|
|
265
502
|
context.eventTarget.dispatchEvent({
|
|
@@ -292,6 +529,8 @@ function isEventTarget(obj) {
|
|
|
292
529
|
}
|
|
293
530
|
function setupEventForwarding(source, target) {
|
|
294
531
|
const handlers = new Map;
|
|
532
|
+
const sourceAddEventListener = source.addEventListener.bind(source);
|
|
533
|
+
const sourceRemoveEventListener = source.removeEventListener.bind(source);
|
|
295
534
|
const forwardHandler = (type) => (event) => {
|
|
296
535
|
const detail = event.detail ?? event;
|
|
297
536
|
target.dispatchEvent({
|
|
@@ -304,7 +543,7 @@ function setupEventForwarding(source, target) {
|
|
|
304
543
|
if (!handlers.has(type) && type !== "update" && !type.startsWith("update:")) {
|
|
305
544
|
const handler = forwardHandler(type);
|
|
306
545
|
handlers.set(type, handler);
|
|
307
|
-
|
|
546
|
+
sourceAddEventListener(type, handler);
|
|
308
547
|
}
|
|
309
548
|
return originalAddEventListener(type, listener, options);
|
|
310
549
|
};
|
|
@@ -312,7 +551,7 @@ function setupEventForwarding(source, target) {
|
|
|
312
551
|
return () => {
|
|
313
552
|
target.addEventListener = originalAddEventListener;
|
|
314
553
|
for (const [type, handler] of handlers) {
|
|
315
|
-
|
|
554
|
+
sourceRemoveEventListener(type, handler);
|
|
316
555
|
}
|
|
317
556
|
handlers.clear();
|
|
318
557
|
};
|
|
@@ -329,7 +568,8 @@ function getOriginal(proxy) {
|
|
|
329
568
|
function createObservableProxy(target, eventTarget, options) {
|
|
330
569
|
const resolvedOptions = {
|
|
331
570
|
deep: options?.deep ?? true,
|
|
332
|
-
cloneStrategy: options?.cloneStrategy ?? "path"
|
|
571
|
+
cloneStrategy: options?.cloneStrategy ?? "path",
|
|
572
|
+
deepClone: options?.deepClone
|
|
333
573
|
};
|
|
334
574
|
const context = {
|
|
335
575
|
eventTarget,
|
|
@@ -338,21 +578,47 @@ function createObservableProxy(target, eventTarget, options) {
|
|
|
338
578
|
};
|
|
339
579
|
const proxy = createObservableProxyInternal(target, "", context);
|
|
340
580
|
if (isEventTarget(target)) {
|
|
341
|
-
setupEventForwarding(target, eventTarget);
|
|
581
|
+
const cleanupForwarding = setupEventForwarding(target, eventTarget);
|
|
582
|
+
const maybeComplete = eventTarget.complete;
|
|
583
|
+
if (typeof maybeComplete === "function") {
|
|
584
|
+
const originalComplete = maybeComplete.bind(eventTarget);
|
|
585
|
+
let cleaned = false;
|
|
586
|
+
eventTarget.complete = () => {
|
|
587
|
+
if (!cleaned) {
|
|
588
|
+
cleaned = true;
|
|
589
|
+
cleanupForwarding();
|
|
590
|
+
}
|
|
591
|
+
return originalComplete();
|
|
592
|
+
};
|
|
593
|
+
}
|
|
342
594
|
}
|
|
343
595
|
return proxy;
|
|
344
596
|
}
|
|
345
597
|
|
|
598
|
+
// src/index.ts
|
|
599
|
+
var exports_src = {};
|
|
600
|
+
__export(exports_src, {
|
|
601
|
+
createEventTarget: () => createEventTarget,
|
|
602
|
+
SymbolObservable: () => SymbolObservable,
|
|
603
|
+
EventEmission: () => EventEmission,
|
|
604
|
+
BufferOverflowError: () => BufferOverflowError
|
|
605
|
+
});
|
|
606
|
+
module.exports = __toCommonJS(exports_src);
|
|
607
|
+
|
|
608
|
+
// src/errors.ts
|
|
609
|
+
class BufferOverflowError extends Error {
|
|
610
|
+
constructor(eventType, bufferSize) {
|
|
611
|
+
super(`Buffer overflow for event type "${eventType}" (max: ${bufferSize})`);
|
|
612
|
+
this.name = "BufferOverflowError";
|
|
613
|
+
}
|
|
614
|
+
}
|
|
346
615
|
// src/factory.ts
|
|
347
616
|
function matchesWildcard(eventType, pattern) {
|
|
348
617
|
if (pattern === "*")
|
|
349
618
|
return true;
|
|
350
|
-
|
|
351
|
-
const namespace = pattern.slice(0, -2);
|
|
352
|
-
return eventType.startsWith(namespace + ":");
|
|
353
|
-
}
|
|
354
|
-
return false;
|
|
619
|
+
return pattern.endsWith(":*") && eventType.startsWith(pattern.slice(0, -2) + ":");
|
|
355
620
|
}
|
|
621
|
+
var EVENT_STATE = Symbol("event-emission:event-state");
|
|
356
622
|
function createEventTarget(targetOrOpts, opts) {
|
|
357
623
|
if (opts?.observe === true && targetOrOpts && typeof targetOrOpts === "object") {
|
|
358
624
|
const target = targetOrOpts;
|
|
@@ -361,13 +627,15 @@ function createEventTarget(targetOrOpts, opts) {
|
|
|
361
627
|
});
|
|
362
628
|
const proxy = createObservableProxy(target, eventTarget, {
|
|
363
629
|
deep: opts.deep,
|
|
364
|
-
cloneStrategy: opts.cloneStrategy
|
|
630
|
+
cloneStrategy: opts.cloneStrategy,
|
|
631
|
+
deepClone: opts.deepClone
|
|
365
632
|
});
|
|
366
633
|
const methodNames = [
|
|
367
634
|
"addEventListener",
|
|
368
635
|
"removeEventListener",
|
|
369
636
|
"dispatchEvent",
|
|
370
637
|
"clear",
|
|
638
|
+
"on",
|
|
371
639
|
"once",
|
|
372
640
|
"removeAllListeners",
|
|
373
641
|
"pipe",
|
|
@@ -400,43 +668,241 @@ function createEventTargetInternal(opts) {
|
|
|
400
668
|
const wildcardListeners = new Set;
|
|
401
669
|
let isCompleted = false;
|
|
402
670
|
const completionCallbacks = new Set;
|
|
403
|
-
const
|
|
671
|
+
const now = () => typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now();
|
|
672
|
+
const initializeEventState = (state, type, bubbles, cancelable) => {
|
|
673
|
+
state.initializedFlag = true;
|
|
674
|
+
state.stopPropagationFlag = false;
|
|
675
|
+
state.stopImmediatePropagationFlag = false;
|
|
676
|
+
state.canceledFlag = false;
|
|
677
|
+
state.isTrusted = false;
|
|
678
|
+
state.target = null;
|
|
679
|
+
state.currentTarget = null;
|
|
680
|
+
state.eventPhase = 0;
|
|
681
|
+
state.type = type;
|
|
682
|
+
state.bubbles = bubbles;
|
|
683
|
+
state.cancelable = cancelable;
|
|
684
|
+
};
|
|
685
|
+
const setCanceledFlag = (state) => {
|
|
686
|
+
if (state.cancelable && !state.inPassiveListenerFlag) {
|
|
687
|
+
state.canceledFlag = true;
|
|
688
|
+
}
|
|
689
|
+
};
|
|
690
|
+
const createEvent = (type, detail, init) => {
|
|
691
|
+
const state = {
|
|
692
|
+
dispatchFlag: false,
|
|
693
|
+
initializedFlag: true,
|
|
694
|
+
stopPropagationFlag: false,
|
|
695
|
+
stopImmediatePropagationFlag: false,
|
|
696
|
+
canceledFlag: false,
|
|
697
|
+
inPassiveListenerFlag: false,
|
|
698
|
+
composedFlag: Boolean(init?.composed),
|
|
699
|
+
eventPhase: init?.eventPhase ?? 0,
|
|
700
|
+
currentTarget: init?.currentTarget ?? init?.target ?? null,
|
|
701
|
+
target: init?.target ?? null,
|
|
702
|
+
timeStamp: init?.timeStamp ?? now(),
|
|
703
|
+
path: [],
|
|
704
|
+
type,
|
|
705
|
+
bubbles: Boolean(init?.bubbles),
|
|
706
|
+
cancelable: Boolean(init?.cancelable),
|
|
707
|
+
isTrusted: false
|
|
708
|
+
};
|
|
709
|
+
const event = { detail };
|
|
710
|
+
Object.defineProperties(event, {
|
|
711
|
+
type: {
|
|
712
|
+
get: () => state.type,
|
|
713
|
+
enumerable: true,
|
|
714
|
+
configurable: true
|
|
715
|
+
},
|
|
716
|
+
bubbles: {
|
|
717
|
+
get: () => state.bubbles,
|
|
718
|
+
enumerable: true,
|
|
719
|
+
configurable: true
|
|
720
|
+
},
|
|
721
|
+
cancelable: {
|
|
722
|
+
get: () => state.cancelable,
|
|
723
|
+
enumerable: true,
|
|
724
|
+
configurable: true
|
|
725
|
+
},
|
|
726
|
+
cancelBubble: {
|
|
727
|
+
get: () => state.stopPropagationFlag,
|
|
728
|
+
set: (value) => {
|
|
729
|
+
if (value)
|
|
730
|
+
state.stopPropagationFlag = true;
|
|
731
|
+
},
|
|
732
|
+
enumerable: true,
|
|
733
|
+
configurable: true
|
|
734
|
+
},
|
|
735
|
+
composed: {
|
|
736
|
+
get: () => state.composedFlag,
|
|
737
|
+
enumerable: true,
|
|
738
|
+
configurable: true
|
|
739
|
+
},
|
|
740
|
+
currentTarget: {
|
|
741
|
+
get: () => state.currentTarget,
|
|
742
|
+
enumerable: true,
|
|
743
|
+
configurable: true
|
|
744
|
+
},
|
|
745
|
+
defaultPrevented: {
|
|
746
|
+
get: () => state.canceledFlag,
|
|
747
|
+
enumerable: true,
|
|
748
|
+
configurable: true
|
|
749
|
+
},
|
|
750
|
+
eventPhase: {
|
|
751
|
+
get: () => state.eventPhase,
|
|
752
|
+
enumerable: true,
|
|
753
|
+
configurable: true
|
|
754
|
+
},
|
|
755
|
+
isTrusted: {
|
|
756
|
+
get: () => state.isTrusted,
|
|
757
|
+
enumerable: true,
|
|
758
|
+
configurable: true
|
|
759
|
+
},
|
|
760
|
+
returnValue: {
|
|
761
|
+
get: () => !state.canceledFlag,
|
|
762
|
+
set: (value) => {
|
|
763
|
+
if (value === false)
|
|
764
|
+
setCanceledFlag(state);
|
|
765
|
+
},
|
|
766
|
+
enumerable: true,
|
|
767
|
+
configurable: true
|
|
768
|
+
},
|
|
769
|
+
srcElement: {
|
|
770
|
+
get: () => state.target,
|
|
771
|
+
enumerable: true,
|
|
772
|
+
configurable: true
|
|
773
|
+
},
|
|
774
|
+
target: {
|
|
775
|
+
get: () => state.target,
|
|
776
|
+
enumerable: true,
|
|
777
|
+
configurable: true
|
|
778
|
+
},
|
|
779
|
+
timeStamp: {
|
|
780
|
+
get: () => state.timeStamp,
|
|
781
|
+
enumerable: true,
|
|
782
|
+
configurable: true
|
|
783
|
+
},
|
|
784
|
+
composedPath: {
|
|
785
|
+
value: () => state.path.map((entry) => entry.invocationTarget),
|
|
786
|
+
enumerable: true,
|
|
787
|
+
configurable: true
|
|
788
|
+
},
|
|
789
|
+
initEvent: {
|
|
790
|
+
value: (newType, bubbles = false, cancelable = false) => {
|
|
791
|
+
if (state.dispatchFlag)
|
|
792
|
+
return;
|
|
793
|
+
initializeEventState(state, newType, Boolean(bubbles), Boolean(cancelable));
|
|
794
|
+
},
|
|
795
|
+
enumerable: true,
|
|
796
|
+
configurable: true
|
|
797
|
+
},
|
|
798
|
+
preventDefault: {
|
|
799
|
+
value: () => setCanceledFlag(state),
|
|
800
|
+
enumerable: true,
|
|
801
|
+
configurable: true
|
|
802
|
+
},
|
|
803
|
+
stopImmediatePropagation: {
|
|
804
|
+
value: () => {
|
|
805
|
+
state.stopPropagationFlag = true;
|
|
806
|
+
state.stopImmediatePropagationFlag = true;
|
|
807
|
+
},
|
|
808
|
+
enumerable: true,
|
|
809
|
+
configurable: true
|
|
810
|
+
},
|
|
811
|
+
stopPropagation: {
|
|
812
|
+
value: () => {
|
|
813
|
+
state.stopPropagationFlag = true;
|
|
814
|
+
},
|
|
815
|
+
enumerable: true,
|
|
816
|
+
configurable: true
|
|
817
|
+
},
|
|
818
|
+
NONE: { value: 0, enumerable: true, configurable: true },
|
|
819
|
+
CAPTURING_PHASE: { value: 1, enumerable: true, configurable: true },
|
|
820
|
+
AT_TARGET: { value: 2, enumerable: true, configurable: true },
|
|
821
|
+
BUBBLING_PHASE: { value: 3, enumerable: true, configurable: true },
|
|
822
|
+
[EVENT_STATE]: {
|
|
823
|
+
value: state,
|
|
824
|
+
enumerable: false,
|
|
825
|
+
configurable: false
|
|
826
|
+
}
|
|
827
|
+
});
|
|
828
|
+
return event;
|
|
829
|
+
};
|
|
830
|
+
const getEventState = (event) => event[EVENT_STATE];
|
|
831
|
+
const normalizeAddListenerOptions = (options) => {
|
|
832
|
+
if (typeof options === "boolean") {
|
|
833
|
+
return {
|
|
834
|
+
capture: options,
|
|
835
|
+
passive: false,
|
|
836
|
+
once: false,
|
|
837
|
+
signal: null
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
return {
|
|
841
|
+
capture: Boolean(options?.capture),
|
|
842
|
+
passive: Boolean(options?.passive),
|
|
843
|
+
once: Boolean(options?.once),
|
|
844
|
+
signal: options?.signal ?? null
|
|
845
|
+
};
|
|
846
|
+
};
|
|
847
|
+
const normalizeCaptureOption = (options) => {
|
|
848
|
+
if (typeof options === "boolean")
|
|
849
|
+
return options;
|
|
850
|
+
return Boolean(options?.capture);
|
|
851
|
+
};
|
|
852
|
+
const removeListenerRecord = (type, record) => {
|
|
853
|
+
if (record.removed)
|
|
854
|
+
return;
|
|
855
|
+
record.removed = true;
|
|
856
|
+
const list = listeners.get(type);
|
|
857
|
+
if (list) {
|
|
858
|
+
const idx = list.indexOf(record);
|
|
859
|
+
if (idx >= 0)
|
|
860
|
+
list.splice(idx, 1);
|
|
861
|
+
if (list.length === 0)
|
|
862
|
+
listeners.delete(type);
|
|
863
|
+
}
|
|
864
|
+
if (record.signal && record.abortHandler) {
|
|
865
|
+
record.signal.removeEventListener("abort", record.abortHandler);
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
const handleListenerError = (eventType, error2) => {
|
|
404
869
|
if (eventType === "error")
|
|
405
870
|
return;
|
|
406
871
|
if (opts?.onListenerError) {
|
|
407
|
-
opts.onListenerError(eventType,
|
|
872
|
+
opts.onListenerError(eventType, error2);
|
|
408
873
|
return;
|
|
409
874
|
}
|
|
410
875
|
const errorListeners = listeners.get("error");
|
|
411
|
-
if (errorListeners && errorListeners.
|
|
412
|
-
|
|
413
|
-
try {
|
|
414
|
-
rec.fn({ type: "error", detail: error });
|
|
415
|
-
} catch {}
|
|
416
|
-
if (rec.once)
|
|
417
|
-
errorListeners.delete(rec);
|
|
418
|
-
}
|
|
876
|
+
if (errorListeners && errorListeners.length > 0) {
|
|
877
|
+
dispatchEvent({ type: "error", detail: error2 });
|
|
419
878
|
} else {
|
|
420
|
-
throw
|
|
879
|
+
throw error2;
|
|
421
880
|
}
|
|
422
881
|
};
|
|
423
|
-
const notifyWildcardListeners = (eventType,
|
|
882
|
+
const notifyWildcardListeners = (eventType, event) => {
|
|
424
883
|
if (wildcardListeners.size === 0)
|
|
425
884
|
return;
|
|
426
885
|
for (const rec of Array.from(wildcardListeners)) {
|
|
427
886
|
if (!matchesWildcard(eventType, rec.pattern))
|
|
428
887
|
continue;
|
|
429
|
-
const
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
888
|
+
const baseEvent = createEvent(rec.pattern, event.detail, {
|
|
889
|
+
target,
|
|
890
|
+
currentTarget: target,
|
|
891
|
+
eventPhase: 2,
|
|
892
|
+
bubbles: event.bubbles,
|
|
893
|
+
cancelable: event.cancelable,
|
|
894
|
+
composed: event.composed
|
|
895
|
+
});
|
|
896
|
+
const wildcardEvent = Object.defineProperties(baseEvent, {
|
|
897
|
+
originalType: { value: eventType, enumerable: true, configurable: true }
|
|
898
|
+
});
|
|
434
899
|
try {
|
|
435
|
-
const
|
|
900
|
+
const fn = rec.fn;
|
|
901
|
+
const res = fn(wildcardEvent);
|
|
436
902
|
if (res && typeof res.then === "function") {
|
|
437
|
-
res.catch((
|
|
903
|
+
res.catch((error2) => {
|
|
438
904
|
try {
|
|
439
|
-
handleListenerError(eventType,
|
|
905
|
+
handleListenerError(eventType, error2);
|
|
440
906
|
} catch (rethrown) {
|
|
441
907
|
queueMicrotask(() => {
|
|
442
908
|
throw rethrown;
|
|
@@ -444,50 +910,65 @@ function createEventTargetInternal(opts) {
|
|
|
444
910
|
}
|
|
445
911
|
});
|
|
446
912
|
}
|
|
447
|
-
} catch (
|
|
448
|
-
handleListenerError(eventType,
|
|
913
|
+
} catch (error2) {
|
|
914
|
+
handleListenerError(eventType, error2);
|
|
449
915
|
} finally {
|
|
450
916
|
if (rec.once)
|
|
451
917
|
wildcardListeners.delete(rec);
|
|
452
918
|
}
|
|
919
|
+
const state = getEventState(wildcardEvent);
|
|
920
|
+
if (state?.stopImmediatePropagationFlag || state?.stopPropagationFlag) {
|
|
921
|
+
break;
|
|
922
|
+
}
|
|
453
923
|
}
|
|
454
924
|
};
|
|
455
925
|
const addEventListener = (type, listener, options) => {
|
|
456
|
-
if (isCompleted) {
|
|
926
|
+
if (isCompleted || !listener) {
|
|
457
927
|
return () => {};
|
|
458
928
|
}
|
|
459
|
-
const
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
};
|
|
465
|
-
let set = listeners.get(type);
|
|
466
|
-
if (!set) {
|
|
467
|
-
set = new Set;
|
|
468
|
-
listeners.set(type, set);
|
|
929
|
+
const { capture, passive, once, signal } = normalizeAddListenerOptions(options);
|
|
930
|
+
let list = listeners.get(type);
|
|
931
|
+
if (!list) {
|
|
932
|
+
list = [];
|
|
933
|
+
listeners.set(type, list);
|
|
469
934
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
setNow?.delete(record);
|
|
474
|
-
if (record.signal && record.abortHandler) {
|
|
475
|
-
record.signal.removeEventListener("abort", record.abortHandler);
|
|
935
|
+
for (const existing of list) {
|
|
936
|
+
if (existing.original === listener && existing.capture === capture) {
|
|
937
|
+
return () => removeEventListener(type, listener, options);
|
|
476
938
|
}
|
|
939
|
+
}
|
|
940
|
+
const original = listener;
|
|
941
|
+
const callback = typeof listener === "function" ? listener : (event) => listener.handleEvent(event);
|
|
942
|
+
const record = {
|
|
943
|
+
type,
|
|
944
|
+
original,
|
|
945
|
+
callback,
|
|
946
|
+
capture,
|
|
947
|
+
passive,
|
|
948
|
+
once,
|
|
949
|
+
signal,
|
|
950
|
+
removed: false
|
|
477
951
|
};
|
|
478
|
-
|
|
479
|
-
|
|
952
|
+
list.push(record);
|
|
953
|
+
const unsubscribe2 = () => removeListenerRecord(type, record);
|
|
954
|
+
if (signal) {
|
|
955
|
+
const onAbort = () => removeListenerRecord(type, record);
|
|
480
956
|
record.abortHandler = onAbort;
|
|
481
|
-
|
|
482
|
-
if (
|
|
957
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
958
|
+
if (signal.aborted)
|
|
483
959
|
onAbort();
|
|
484
960
|
}
|
|
485
|
-
return
|
|
961
|
+
return unsubscribe2;
|
|
486
962
|
};
|
|
487
963
|
const addWildcardListener = (pattern, listener, options) => {
|
|
488
964
|
if (isCompleted)
|
|
489
965
|
return () => {};
|
|
490
966
|
const opts2 = options ?? {};
|
|
967
|
+
for (const existing of wildcardListeners) {
|
|
968
|
+
if (existing.pattern === pattern && existing.fn === listener) {
|
|
969
|
+
return () => removeWildcardListener(pattern, listener);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
491
972
|
const record = {
|
|
492
973
|
fn: listener,
|
|
493
974
|
pattern,
|
|
@@ -495,46 +976,55 @@ function createEventTargetInternal(opts) {
|
|
|
495
976
|
signal: opts2.signal
|
|
496
977
|
};
|
|
497
978
|
wildcardListeners.add(record);
|
|
498
|
-
const
|
|
979
|
+
const unsubscribe2 = () => {
|
|
499
980
|
wildcardListeners.delete(record);
|
|
500
981
|
if (record.signal && record.abortHandler) {
|
|
501
982
|
record.signal.removeEventListener("abort", record.abortHandler);
|
|
502
983
|
}
|
|
503
984
|
};
|
|
504
985
|
if (opts2.signal) {
|
|
505
|
-
const onAbort = () =>
|
|
986
|
+
const onAbort = () => unsubscribe2();
|
|
506
987
|
record.abortHandler = onAbort;
|
|
507
988
|
opts2.signal.addEventListener("abort", onAbort, { once: true });
|
|
508
989
|
if (opts2.signal.aborted)
|
|
509
990
|
onAbort();
|
|
510
991
|
}
|
|
511
|
-
return
|
|
992
|
+
return unsubscribe2;
|
|
512
993
|
};
|
|
513
994
|
const removeWildcardListener = (pattern, listener) => {
|
|
514
|
-
for (const record of wildcardListeners) {
|
|
995
|
+
for (const record of Array.from(wildcardListeners)) {
|
|
515
996
|
if (record.pattern === pattern && record.fn === listener) {
|
|
516
997
|
wildcardListeners.delete(record);
|
|
517
998
|
if (record.signal && record.abortHandler) {
|
|
518
999
|
record.signal.removeEventListener("abort", record.abortHandler);
|
|
519
1000
|
}
|
|
520
|
-
break;
|
|
521
1001
|
}
|
|
522
1002
|
}
|
|
523
1003
|
};
|
|
524
|
-
const
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
for (const rec of
|
|
1004
|
+
const invokeListeners = (eventType, event, phase, listenersSnapshot) => {
|
|
1005
|
+
const state = getEventState(event);
|
|
1006
|
+
if (!state || state.stopPropagationFlag)
|
|
1007
|
+
return;
|
|
1008
|
+
state.currentTarget = target;
|
|
1009
|
+
state.target = target;
|
|
1010
|
+
state.eventPhase = event.AT_TARGET;
|
|
1011
|
+
for (const rec of listenersSnapshot) {
|
|
1012
|
+
if (rec.removed)
|
|
1013
|
+
continue;
|
|
1014
|
+
if (phase === "capturing" && !rec.capture)
|
|
1015
|
+
continue;
|
|
1016
|
+
if (phase === "bubbling" && rec.capture)
|
|
1017
|
+
continue;
|
|
1018
|
+
if (rec.once)
|
|
1019
|
+
removeListenerRecord(rec.type, rec);
|
|
1020
|
+
if (rec.passive)
|
|
1021
|
+
state.inPassiveListenerFlag = true;
|
|
532
1022
|
try {
|
|
533
|
-
const res = rec.
|
|
1023
|
+
const res = rec.callback.call(state.currentTarget, event);
|
|
534
1024
|
if (res && typeof res.then === "function") {
|
|
535
|
-
res.catch((
|
|
1025
|
+
res.catch((error2) => {
|
|
536
1026
|
try {
|
|
537
|
-
handleListenerError(
|
|
1027
|
+
handleListenerError(eventType, error2);
|
|
538
1028
|
} catch (rethrown) {
|
|
539
1029
|
queueMicrotask(() => {
|
|
540
1030
|
throw rethrown;
|
|
@@ -542,37 +1032,95 @@ function createEventTargetInternal(opts) {
|
|
|
542
1032
|
}
|
|
543
1033
|
});
|
|
544
1034
|
}
|
|
545
|
-
} catch (
|
|
546
|
-
handleListenerError(
|
|
1035
|
+
} catch (error2) {
|
|
1036
|
+
handleListenerError(eventType, error2);
|
|
547
1037
|
} finally {
|
|
548
|
-
if (rec.
|
|
549
|
-
|
|
1038
|
+
if (rec.passive)
|
|
1039
|
+
state.inPassiveListenerFlag = false;
|
|
550
1040
|
}
|
|
1041
|
+
if (state.stopImmediatePropagationFlag)
|
|
1042
|
+
break;
|
|
551
1043
|
}
|
|
552
|
-
return true;
|
|
553
1044
|
};
|
|
554
|
-
const
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
1045
|
+
const dispatchEvent = (eventInput) => {
|
|
1046
|
+
if (isCompleted)
|
|
1047
|
+
return false;
|
|
1048
|
+
let event;
|
|
1049
|
+
let state;
|
|
1050
|
+
if (eventInput && typeof eventInput === "object") {
|
|
1051
|
+
state = getEventState(eventInput);
|
|
1052
|
+
if (state) {
|
|
1053
|
+
event = eventInput;
|
|
1054
|
+
} else {
|
|
1055
|
+
const input = eventInput;
|
|
1056
|
+
if (typeof input.type !== "string") {
|
|
1057
|
+
throw new TypeError("Event type must be a string");
|
|
563
1058
|
}
|
|
564
|
-
|
|
1059
|
+
event = createEvent(input.type, input.detail, {
|
|
1060
|
+
bubbles: input.bubbles,
|
|
1061
|
+
cancelable: input.cancelable,
|
|
1062
|
+
composed: input.composed,
|
|
1063
|
+
timeStamp: input.timeStamp
|
|
1064
|
+
});
|
|
1065
|
+
state = getEventState(event);
|
|
1066
|
+
}
|
|
1067
|
+
} else {
|
|
1068
|
+
throw new TypeError("dispatchEvent expects an event object");
|
|
1069
|
+
}
|
|
1070
|
+
const dispatchState = state ?? getEventState(event);
|
|
1071
|
+
if (dispatchState.dispatchFlag || !dispatchState.initializedFlag) {
|
|
1072
|
+
const message = "Failed to execute dispatchEvent: event is already being dispatched";
|
|
1073
|
+
if (typeof globalThis.DOMException === "function") {
|
|
1074
|
+
throw new globalThis.DOMException(message, "InvalidStateError");
|
|
1075
|
+
}
|
|
1076
|
+
const err = new Error(message);
|
|
1077
|
+
err.name = "InvalidStateError";
|
|
1078
|
+
throw err;
|
|
1079
|
+
}
|
|
1080
|
+
dispatchState.isTrusted = false;
|
|
1081
|
+
dispatchState.dispatchFlag = true;
|
|
1082
|
+
dispatchState.path = [
|
|
1083
|
+
{
|
|
1084
|
+
invocationTarget: target,
|
|
1085
|
+
invocationTargetInShadowTree: false,
|
|
1086
|
+
shadowAdjustedTarget: target,
|
|
1087
|
+
relatedTarget: null,
|
|
1088
|
+
touchTargets: [],
|
|
1089
|
+
rootOfClosedTree: false,
|
|
1090
|
+
slotInClosedTree: false
|
|
1091
|
+
}
|
|
1092
|
+
];
|
|
1093
|
+
notifyWildcardListeners(dispatchState.type, event);
|
|
1094
|
+
const list = listeners.get(dispatchState.type);
|
|
1095
|
+
const snapshot = list ? list.slice() : [];
|
|
1096
|
+
invokeListeners(dispatchState.type, event, "capturing", snapshot);
|
|
1097
|
+
invokeListeners(dispatchState.type, event, "bubbling", snapshot);
|
|
1098
|
+
dispatchState.eventPhase = event.NONE;
|
|
1099
|
+
dispatchState.currentTarget = null;
|
|
1100
|
+
dispatchState.path = [];
|
|
1101
|
+
dispatchState.dispatchFlag = false;
|
|
1102
|
+
dispatchState.stopPropagationFlag = false;
|
|
1103
|
+
dispatchState.stopImmediatePropagationFlag = false;
|
|
1104
|
+
return !dispatchState.canceledFlag;
|
|
1105
|
+
};
|
|
1106
|
+
const removeEventListener = (type, listener, options) => {
|
|
1107
|
+
if (!listener)
|
|
1108
|
+
return;
|
|
1109
|
+
const capture = normalizeCaptureOption(options);
|
|
1110
|
+
const list = listeners.get(type);
|
|
1111
|
+
if (!list)
|
|
1112
|
+
return;
|
|
1113
|
+
for (const record of [...list]) {
|
|
1114
|
+
if (record.original === listener && record.capture === capture) {
|
|
1115
|
+
removeListenerRecord(type, record);
|
|
565
1116
|
}
|
|
566
1117
|
}
|
|
567
1118
|
};
|
|
568
1119
|
const clear = () => {
|
|
569
|
-
for (const
|
|
570
|
-
for (const record of
|
|
571
|
-
|
|
572
|
-
record.signal.removeEventListener("abort", record.abortHandler);
|
|
573
|
-
}
|
|
1120
|
+
for (const [type, list] of Array.from(listeners.entries())) {
|
|
1121
|
+
for (const record of [...list]) {
|
|
1122
|
+
removeListenerRecord(type, record);
|
|
574
1123
|
}
|
|
575
|
-
set.clear();
|
|
576
1124
|
}
|
|
577
1125
|
listeners.clear();
|
|
578
1126
|
for (const record of wildcardListeners) {
|
|
@@ -582,29 +1130,66 @@ function createEventTargetInternal(opts) {
|
|
|
582
1130
|
}
|
|
583
1131
|
wildcardListeners.clear();
|
|
584
1132
|
};
|
|
585
|
-
const
|
|
586
|
-
return
|
|
1133
|
+
const on = (type, options) => {
|
|
1134
|
+
return new Observable((observer) => {
|
|
1135
|
+
let opts2;
|
|
1136
|
+
if (typeof options === "boolean") {
|
|
1137
|
+
opts2 = { capture: options };
|
|
1138
|
+
} else {
|
|
1139
|
+
opts2 = options ?? {};
|
|
1140
|
+
}
|
|
1141
|
+
const handler = opts2.handler;
|
|
1142
|
+
const once = opts2.once;
|
|
1143
|
+
const eventHandler = (e) => {
|
|
1144
|
+
let success = false;
|
|
1145
|
+
try {
|
|
1146
|
+
if (handler) {
|
|
1147
|
+
handler(e);
|
|
1148
|
+
}
|
|
1149
|
+
observer.next(e);
|
|
1150
|
+
success = true;
|
|
1151
|
+
} finally {
|
|
1152
|
+
if (once && success) {
|
|
1153
|
+
observer.complete();
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
};
|
|
1157
|
+
const errorHandler = (e) => {
|
|
1158
|
+
observer.error(e.detail);
|
|
1159
|
+
};
|
|
1160
|
+
const unsubscribeEvent = addEventListener(type, eventHandler, opts2);
|
|
1161
|
+
let unsubscribeError;
|
|
1162
|
+
if (opts2.receiveError) {
|
|
1163
|
+
unsubscribeError = addEventListener("error", errorHandler, opts2);
|
|
1164
|
+
}
|
|
1165
|
+
return () => {
|
|
1166
|
+
unsubscribeEvent();
|
|
1167
|
+
if (unsubscribeError) {
|
|
1168
|
+
unsubscribeError();
|
|
1169
|
+
}
|
|
1170
|
+
};
|
|
1171
|
+
});
|
|
1172
|
+
};
|
|
1173
|
+
const onceMethod = (type, listener, options) => {
|
|
1174
|
+
if (typeof options === "boolean") {
|
|
1175
|
+
return addEventListener(type, listener, { capture: options, once: true });
|
|
1176
|
+
}
|
|
1177
|
+
return addEventListener(type, listener, { ...options ?? {}, once: true });
|
|
587
1178
|
};
|
|
588
1179
|
const removeAllListeners = (type) => {
|
|
589
1180
|
if (type !== undefined) {
|
|
590
|
-
const
|
|
591
|
-
if (
|
|
592
|
-
for (const record of
|
|
593
|
-
|
|
594
|
-
record.signal.removeEventListener("abort", record.abortHandler);
|
|
595
|
-
}
|
|
1181
|
+
const list = listeners.get(type);
|
|
1182
|
+
if (list) {
|
|
1183
|
+
for (const record of [...list]) {
|
|
1184
|
+
removeListenerRecord(type, record);
|
|
596
1185
|
}
|
|
597
|
-
set.clear();
|
|
598
1186
|
listeners.delete(type);
|
|
599
1187
|
}
|
|
600
1188
|
} else {
|
|
601
|
-
for (const
|
|
602
|
-
for (const record of
|
|
603
|
-
|
|
604
|
-
record.signal.removeEventListener("abort", record.abortHandler);
|
|
605
|
-
}
|
|
1189
|
+
for (const [eventType, list] of Array.from(listeners.entries())) {
|
|
1190
|
+
for (const record of [...list]) {
|
|
1191
|
+
removeListenerRecord(eventType, record);
|
|
606
1192
|
}
|
|
607
|
-
set.clear();
|
|
608
1193
|
}
|
|
609
1194
|
listeners.clear();
|
|
610
1195
|
for (const record of wildcardListeners) {
|
|
@@ -619,41 +1204,36 @@ function createEventTargetInternal(opts) {
|
|
|
619
1204
|
if (isCompleted) {
|
|
620
1205
|
return () => {};
|
|
621
1206
|
}
|
|
622
|
-
const
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
} else {
|
|
635
|
-
target2.dispatchEvent(event);
|
|
1207
|
+
const unsubscribe2 = addWildcardListener("*", (event) => {
|
|
1208
|
+
if (mapFn) {
|
|
1209
|
+
const mapped = mapFn(createEvent(event.originalType, event.detail, {
|
|
1210
|
+
target: target2,
|
|
1211
|
+
currentTarget: target2,
|
|
1212
|
+
eventPhase: 2,
|
|
1213
|
+
bubbles: event.bubbles,
|
|
1214
|
+
cancelable: event.cancelable,
|
|
1215
|
+
composed: event.composed
|
|
1216
|
+
}));
|
|
1217
|
+
if (mapped !== null) {
|
|
1218
|
+
target2.dispatchEvent(mapped);
|
|
636
1219
|
}
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
643
|
-
const completionUnsub = () => {
|
|
644
|
-
for (const unsub of unsubscribes) {
|
|
645
|
-
unsub();
|
|
1220
|
+
} else {
|
|
1221
|
+
target2.dispatchEvent({
|
|
1222
|
+
type: event.originalType,
|
|
1223
|
+
detail: event.detail
|
|
1224
|
+
});
|
|
646
1225
|
}
|
|
1226
|
+
});
|
|
1227
|
+
const completionUnsub = () => {
|
|
1228
|
+
unsubscribe2();
|
|
647
1229
|
};
|
|
648
1230
|
completionCallbacks.add(completionUnsub);
|
|
649
1231
|
return () => {
|
|
650
1232
|
completionCallbacks.delete(completionUnsub);
|
|
651
|
-
|
|
652
|
-
unsub();
|
|
653
|
-
}
|
|
1233
|
+
unsubscribe2();
|
|
654
1234
|
};
|
|
655
1235
|
};
|
|
656
|
-
const
|
|
1236
|
+
const complete2 = () => {
|
|
657
1237
|
if (isCompleted)
|
|
658
1238
|
return;
|
|
659
1239
|
isCompleted = true;
|
|
@@ -667,13 +1247,10 @@ function createEventTargetInternal(opts) {
|
|
|
667
1247
|
}
|
|
668
1248
|
}
|
|
669
1249
|
completionCallbacks.clear();
|
|
670
|
-
for (const
|
|
671
|
-
for (const record of
|
|
672
|
-
|
|
673
|
-
record.signal.removeEventListener("abort", record.abortHandler);
|
|
674
|
-
}
|
|
1250
|
+
for (const [eventType, list] of Array.from(listeners.entries())) {
|
|
1251
|
+
for (const record of [...list]) {
|
|
1252
|
+
removeListenerRecord(eventType, record);
|
|
675
1253
|
}
|
|
676
|
-
set.clear();
|
|
677
1254
|
}
|
|
678
1255
|
listeners.clear();
|
|
679
1256
|
for (const record of wildcardListeners) {
|
|
@@ -683,12 +1260,12 @@ function createEventTargetInternal(opts) {
|
|
|
683
1260
|
}
|
|
684
1261
|
wildcardListeners.clear();
|
|
685
1262
|
};
|
|
686
|
-
const subscribe = (type, observerOrNext,
|
|
1263
|
+
const subscribe = (type, observerOrNext, error2, completeHandler) => {
|
|
687
1264
|
let observer;
|
|
688
1265
|
if (typeof observerOrNext === "function") {
|
|
689
1266
|
observer = {
|
|
690
1267
|
next: observerOrNext,
|
|
691
|
-
error,
|
|
1268
|
+
error: error2,
|
|
692
1269
|
complete: completeHandler
|
|
693
1270
|
};
|
|
694
1271
|
} else {
|
|
@@ -750,81 +1327,31 @@ function createEventTargetInternal(opts) {
|
|
|
750
1327
|
};
|
|
751
1328
|
};
|
|
752
1329
|
const toObservable = () => {
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
let completeCallback;
|
|
758
|
-
if (typeof observerOrNext === "function") {
|
|
759
|
-
next = observerOrNext;
|
|
760
|
-
error = errorFn;
|
|
761
|
-
completeCallback = completeFn;
|
|
762
|
-
} else if (observerOrNext) {
|
|
763
|
-
next = observerOrNext.next?.bind(observerOrNext);
|
|
764
|
-
error = observerOrNext.error?.bind(observerOrNext);
|
|
765
|
-
completeCallback = observerOrNext.complete?.bind(observerOrNext);
|
|
766
|
-
}
|
|
767
|
-
let closed = false;
|
|
768
|
-
if (isCompleted) {
|
|
769
|
-
if (completeCallback) {
|
|
770
|
-
try {
|
|
771
|
-
completeCallback();
|
|
772
|
-
} catch {}
|
|
773
|
-
}
|
|
774
|
-
return {
|
|
775
|
-
unsubscribe: () => {
|
|
776
|
-
closed = true;
|
|
777
|
-
},
|
|
778
|
-
get closed() {
|
|
779
|
-
return true;
|
|
780
|
-
}
|
|
781
|
-
};
|
|
782
|
-
}
|
|
783
|
-
const wildcardListener = (event) => {
|
|
784
|
-
if (closed)
|
|
785
|
-
return;
|
|
786
|
-
if (next) {
|
|
787
|
-
try {
|
|
788
|
-
next({ type: event.originalType, detail: event.detail });
|
|
789
|
-
} catch (err) {
|
|
790
|
-
if (error) {
|
|
791
|
-
try {
|
|
792
|
-
error(err);
|
|
793
|
-
} catch {}
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
};
|
|
798
|
-
const unsubscribe = addWildcardListener("*", wildcardListener);
|
|
799
|
-
const onComplete = () => {
|
|
800
|
-
if (closed)
|
|
801
|
-
return;
|
|
802
|
-
closed = true;
|
|
803
|
-
if (completeCallback) {
|
|
804
|
-
try {
|
|
805
|
-
completeCallback();
|
|
806
|
-
} catch {}
|
|
807
|
-
}
|
|
808
|
-
};
|
|
809
|
-
completionCallbacks.add(onComplete);
|
|
810
|
-
return {
|
|
811
|
-
unsubscribe: () => {
|
|
812
|
-
if (closed)
|
|
813
|
-
return;
|
|
814
|
-
closed = true;
|
|
815
|
-
unsubscribe();
|
|
816
|
-
completionCallbacks.delete(onComplete);
|
|
817
|
-
},
|
|
818
|
-
get closed() {
|
|
819
|
-
return closed || isCompleted;
|
|
820
|
-
}
|
|
821
|
-
};
|
|
822
|
-
},
|
|
823
|
-
[SymbolObservable]() {
|
|
824
|
-
return observable;
|
|
1330
|
+
return new Observable((observer) => {
|
|
1331
|
+
if (isCompleted) {
|
|
1332
|
+
observer.complete();
|
|
1333
|
+
return;
|
|
825
1334
|
}
|
|
826
|
-
|
|
827
|
-
|
|
1335
|
+
const wildcardListener = (event) => {
|
|
1336
|
+
observer.next(createEvent(event.originalType, event.detail, {
|
|
1337
|
+
target,
|
|
1338
|
+
currentTarget: target,
|
|
1339
|
+
eventPhase: 2,
|
|
1340
|
+
bubbles: event.bubbles,
|
|
1341
|
+
cancelable: event.cancelable,
|
|
1342
|
+
composed: event.composed
|
|
1343
|
+
}));
|
|
1344
|
+
};
|
|
1345
|
+
const unsubscribe2 = addWildcardListener("*", wildcardListener);
|
|
1346
|
+
const onComplete = () => {
|
|
1347
|
+
observer.complete();
|
|
1348
|
+
};
|
|
1349
|
+
completionCallbacks.add(onComplete);
|
|
1350
|
+
return () => {
|
|
1351
|
+
unsubscribe2();
|
|
1352
|
+
completionCallbacks.delete(onComplete);
|
|
1353
|
+
};
|
|
1354
|
+
});
|
|
828
1355
|
};
|
|
829
1356
|
function events(type, options) {
|
|
830
1357
|
if (isCompleted) {
|
|
@@ -853,19 +1380,26 @@ function createEventTargetInternal(opts) {
|
|
|
853
1380
|
let resolve = null;
|
|
854
1381
|
let done = false;
|
|
855
1382
|
let hasOverflow = false;
|
|
1383
|
+
let onAbort = null;
|
|
1384
|
+
const cleanupAbortListener = () => {
|
|
1385
|
+
if (signal && onAbort) {
|
|
1386
|
+
signal.removeEventListener("abort", onAbort);
|
|
1387
|
+
}
|
|
1388
|
+
};
|
|
856
1389
|
const unsub = addEventListener(type, (event) => {
|
|
857
1390
|
if (done)
|
|
858
1391
|
return;
|
|
1392
|
+
const typedEvent = event;
|
|
859
1393
|
if (resolve) {
|
|
860
1394
|
const r = resolve;
|
|
861
1395
|
resolve = null;
|
|
862
|
-
r({ value:
|
|
1396
|
+
r({ value: typedEvent, done: false });
|
|
863
1397
|
} else {
|
|
864
1398
|
if (buffer.length >= bufferSize && bufferSize !== Infinity) {
|
|
865
1399
|
switch (overflowStrategy) {
|
|
866
1400
|
case "drop-oldest":
|
|
867
1401
|
buffer.shift();
|
|
868
|
-
buffer.push(
|
|
1402
|
+
buffer.push(typedEvent);
|
|
869
1403
|
break;
|
|
870
1404
|
case "drop-latest":
|
|
871
1405
|
break;
|
|
@@ -874,15 +1408,17 @@ function createEventTargetInternal(opts) {
|
|
|
874
1408
|
completionCallbacks.delete(onComplete);
|
|
875
1409
|
done = true;
|
|
876
1410
|
hasOverflow = true;
|
|
1411
|
+
cleanupAbortListener();
|
|
877
1412
|
return;
|
|
878
1413
|
}
|
|
879
1414
|
} else {
|
|
880
|
-
buffer.push(
|
|
1415
|
+
buffer.push(typedEvent);
|
|
881
1416
|
}
|
|
882
1417
|
}
|
|
883
1418
|
});
|
|
884
1419
|
const onComplete = () => {
|
|
885
1420
|
done = true;
|
|
1421
|
+
cleanupAbortListener();
|
|
886
1422
|
if (resolve) {
|
|
887
1423
|
const r = resolve;
|
|
888
1424
|
resolve = null;
|
|
@@ -890,7 +1426,6 @@ function createEventTargetInternal(opts) {
|
|
|
890
1426
|
}
|
|
891
1427
|
};
|
|
892
1428
|
completionCallbacks.add(onComplete);
|
|
893
|
-
let onAbort = null;
|
|
894
1429
|
if (signal) {
|
|
895
1430
|
onAbort = () => {
|
|
896
1431
|
done = true;
|
|
@@ -914,26 +1449,22 @@ function createEventTargetInternal(opts) {
|
|
|
914
1449
|
if (buffer.length > 0) {
|
|
915
1450
|
return { value: buffer.shift(), done: false };
|
|
916
1451
|
}
|
|
917
|
-
if (hasOverflow) {
|
|
918
|
-
hasOverflow = false;
|
|
919
|
-
throw new BufferOverflowError(type, bufferSize);
|
|
920
|
-
}
|
|
921
|
-
if (done) {
|
|
922
|
-
return { value: undefined, done: true };
|
|
923
|
-
}
|
|
924
1452
|
if (resolve !== null) {
|
|
925
1453
|
return Promise.reject(new Error("Concurrent calls to next() are not supported on this async iterator"));
|
|
926
1454
|
}
|
|
927
1455
|
return new Promise((_resolve, _reject) => {
|
|
928
|
-
if (done) {
|
|
929
|
-
_resolve({ value: undefined, done: true });
|
|
930
|
-
return;
|
|
931
|
-
}
|
|
932
1456
|
if (hasOverflow) {
|
|
933
1457
|
hasOverflow = false;
|
|
934
1458
|
_reject(new BufferOverflowError(type, bufferSize));
|
|
935
1459
|
return;
|
|
936
1460
|
}
|
|
1461
|
+
if (done) {
|
|
1462
|
+
_resolve({
|
|
1463
|
+
value: undefined,
|
|
1464
|
+
done: true
|
|
1465
|
+
});
|
|
1466
|
+
return;
|
|
1467
|
+
}
|
|
937
1468
|
resolve = _resolve;
|
|
938
1469
|
});
|
|
939
1470
|
},
|
|
@@ -946,9 +1477,7 @@ function createEventTargetInternal(opts) {
|
|
|
946
1477
|
done = true;
|
|
947
1478
|
completionCallbacks.delete(onComplete);
|
|
948
1479
|
unsub();
|
|
949
|
-
|
|
950
|
-
signal.removeEventListener("abort", onAbort);
|
|
951
|
-
}
|
|
1480
|
+
cleanupAbortListener();
|
|
952
1481
|
return Promise.resolve({
|
|
953
1482
|
value: undefined,
|
|
954
1483
|
done: true
|
|
@@ -962,12 +1491,13 @@ function createEventTargetInternal(opts) {
|
|
|
962
1491
|
removeEventListener,
|
|
963
1492
|
dispatchEvent,
|
|
964
1493
|
clear,
|
|
965
|
-
|
|
1494
|
+
on,
|
|
1495
|
+
once: onceMethod,
|
|
966
1496
|
removeAllListeners,
|
|
967
1497
|
pipe,
|
|
968
1498
|
addWildcardListener,
|
|
969
1499
|
removeWildcardListener,
|
|
970
|
-
complete,
|
|
1500
|
+
complete: complete2,
|
|
971
1501
|
get completed() {
|
|
972
1502
|
return isCompleted;
|
|
973
1503
|
},
|
|
@@ -980,84 +1510,8 @@ function createEventTargetInternal(opts) {
|
|
|
980
1510
|
};
|
|
981
1511
|
return target;
|
|
982
1512
|
}
|
|
983
|
-
// src/
|
|
984
|
-
|
|
985
|
-
const unsubscribe = source.addWildcardListener("*", (event) => {
|
|
986
|
-
const domEvent = {
|
|
987
|
-
type: event.originalType,
|
|
988
|
-
detail: event.detail
|
|
989
|
-
};
|
|
990
|
-
target.dispatchEvent(domEvent);
|
|
991
|
-
}, options);
|
|
992
|
-
return unsubscribe;
|
|
993
|
-
}
|
|
994
|
-
function fromEventTarget(domTarget, eventTypes, options) {
|
|
995
|
-
const eventful = createEventTarget({
|
|
996
|
-
onListenerError: options?.onListenerError
|
|
997
|
-
});
|
|
998
|
-
const handlers = new Map;
|
|
999
|
-
for (const type of eventTypes) {
|
|
1000
|
-
const handler = (event) => {
|
|
1001
|
-
eventful.dispatchEvent({
|
|
1002
|
-
type,
|
|
1003
|
-
detail: event.detail ?? event
|
|
1004
|
-
});
|
|
1005
|
-
};
|
|
1006
|
-
handlers.set(type, handler);
|
|
1007
|
-
domTarget.addEventListener(type, handler);
|
|
1008
|
-
}
|
|
1009
|
-
let onAbort = null;
|
|
1010
|
-
if (options?.signal) {
|
|
1011
|
-
onAbort = () => {
|
|
1012
|
-
for (const [type, handler] of handlers) {
|
|
1013
|
-
domTarget.removeEventListener(type, handler);
|
|
1014
|
-
}
|
|
1015
|
-
handlers.clear();
|
|
1016
|
-
eventful.complete();
|
|
1017
|
-
};
|
|
1018
|
-
options.signal.addEventListener("abort", onAbort, { once: true });
|
|
1019
|
-
if (options.signal.aborted)
|
|
1020
|
-
onAbort();
|
|
1021
|
-
}
|
|
1022
|
-
return {
|
|
1023
|
-
addEventListener: eventful.addEventListener,
|
|
1024
|
-
removeEventListener: eventful.removeEventListener,
|
|
1025
|
-
dispatchEvent: eventful.dispatchEvent,
|
|
1026
|
-
clear: eventful.clear,
|
|
1027
|
-
once: eventful.once,
|
|
1028
|
-
removeAllListeners: eventful.removeAllListeners,
|
|
1029
|
-
pipe: eventful.pipe,
|
|
1030
|
-
addWildcardListener: eventful.addWildcardListener,
|
|
1031
|
-
removeWildcardListener: eventful.removeWildcardListener,
|
|
1032
|
-
subscribe: eventful.subscribe,
|
|
1033
|
-
toObservable: eventful.toObservable,
|
|
1034
|
-
complete: eventful.complete,
|
|
1035
|
-
get completed() {
|
|
1036
|
-
return eventful.completed;
|
|
1037
|
-
},
|
|
1038
|
-
events: eventful.events,
|
|
1039
|
-
destroy: () => {
|
|
1040
|
-
if (options?.signal && onAbort) {
|
|
1041
|
-
options.signal.removeEventListener("abort", onAbort);
|
|
1042
|
-
}
|
|
1043
|
-
for (const [type, handler] of handlers) {
|
|
1044
|
-
domTarget.removeEventListener(type, handler);
|
|
1045
|
-
}
|
|
1046
|
-
handlers.clear();
|
|
1047
|
-
eventful.complete();
|
|
1048
|
-
}
|
|
1049
|
-
};
|
|
1050
|
-
}
|
|
1051
|
-
function pipe(source, target, options) {
|
|
1052
|
-
return source.addWildcardListener("*", (event) => {
|
|
1053
|
-
target.dispatchEvent({
|
|
1054
|
-
type: event.originalType,
|
|
1055
|
-
detail: event.detail
|
|
1056
|
-
});
|
|
1057
|
-
}, options);
|
|
1058
|
-
}
|
|
1059
|
-
// src/eventful.ts
|
|
1060
|
-
class Eventful {
|
|
1513
|
+
// src/event-emission.ts
|
|
1514
|
+
class EventEmission {
|
|
1061
1515
|
#target;
|
|
1062
1516
|
constructor() {
|
|
1063
1517
|
this.#target = createEventTarget();
|
|
@@ -1065,12 +1519,15 @@ class Eventful {
|
|
|
1065
1519
|
addEventListener(type, listener, options) {
|
|
1066
1520
|
return this.#target.addEventListener(type, listener, options);
|
|
1067
1521
|
}
|
|
1068
|
-
removeEventListener(type, listener) {
|
|
1069
|
-
this.#target.removeEventListener(type, listener);
|
|
1522
|
+
removeEventListener(type, listener, options) {
|
|
1523
|
+
this.#target.removeEventListener(type, listener, options);
|
|
1070
1524
|
}
|
|
1071
1525
|
dispatchEvent(event) {
|
|
1072
1526
|
return this.#target.dispatchEvent(event);
|
|
1073
1527
|
}
|
|
1528
|
+
on(type, options) {
|
|
1529
|
+
return this.#target.on(type, options);
|
|
1530
|
+
}
|
|
1074
1531
|
once(type, listener, options) {
|
|
1075
1532
|
return this.#target.once(type, listener, options);
|
|
1076
1533
|
}
|
|
@@ -1089,9 +1546,9 @@ class Eventful {
|
|
|
1089
1546
|
removeWildcardListener(pattern, listener) {
|
|
1090
1547
|
this.#target.removeWildcardListener(pattern, listener);
|
|
1091
1548
|
}
|
|
1092
|
-
subscribe(typeOrObserver, observerOrNext,
|
|
1549
|
+
subscribe(typeOrObserver, observerOrNext, error2, completeHandler) {
|
|
1093
1550
|
if (typeof typeOrObserver === "string") {
|
|
1094
|
-
return this.#target.subscribe(typeOrObserver, observerOrNext,
|
|
1551
|
+
return this.#target.subscribe(typeOrObserver, observerOrNext, error2, completeHandler);
|
|
1095
1552
|
}
|
|
1096
1553
|
if (typeof typeOrObserver === "function") {
|
|
1097
1554
|
return this.#target.toObservable().subscribe(typeOrObserver);
|
|
@@ -1123,4 +1580,4 @@ class Eventful {
|
|
|
1123
1580
|
}
|
|
1124
1581
|
})
|
|
1125
1582
|
|
|
1126
|
-
//# debugId=
|
|
1583
|
+
//# debugId=3C805781BACAE6AD64756E2164756E21
|