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.
Files changed (47) hide show
  1. package/README.md +228 -27
  2. package/dist/{eventful.d.ts → event-emission.d.ts} +22 -19
  3. package/dist/event-emission.d.ts.map +1 -0
  4. package/dist/factory.d.ts +1 -1
  5. package/dist/factory.d.ts.map +1 -1
  6. package/dist/index.cjs +811 -354
  7. package/dist/index.cjs.map +8 -8
  8. package/dist/index.d.ts +2 -6
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +787 -348
  11. package/dist/index.js.map +8 -8
  12. package/dist/interoperability.cjs +1605 -0
  13. package/dist/interoperability.cjs.map +15 -0
  14. package/dist/{interop.d.ts → interoperability.d.ts} +12 -11
  15. package/dist/interoperability.d.ts.map +1 -0
  16. package/dist/interoperability.js +1555 -0
  17. package/dist/interoperability.js.map +15 -0
  18. package/dist/observable.cjs +286 -0
  19. package/dist/observable.cjs.map +11 -0
  20. package/dist/observable.d.ts +36 -0
  21. package/dist/observable.d.ts.map +1 -0
  22. package/dist/observable.js +253 -0
  23. package/dist/observable.js.map +11 -0
  24. package/dist/observe.cjs +344 -0
  25. package/dist/observe.cjs.map +10 -0
  26. package/dist/observe.d.ts +9 -4
  27. package/dist/observe.d.ts.map +1 -1
  28. package/dist/observe.js +313 -0
  29. package/dist/observe.js.map +10 -0
  30. package/dist/symbols.d.ts +1 -1
  31. package/dist/types.cjs +35 -0
  32. package/dist/types.cjs.map +9 -0
  33. package/dist/types.d.ts +105 -24
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js +3 -0
  36. package/dist/types.js.map +9 -0
  37. package/package.json +27 -1
  38. package/src/{eventful.ts → event-emission.ts} +45 -28
  39. package/src/factory.ts +639 -269
  40. package/src/index.ts +7 -29
  41. package/src/{interop.ts → interoperability.ts} +55 -35
  42. package/src/observable.ts +310 -0
  43. package/src/observe.ts +70 -33
  44. package/src/symbols.ts +1 -1
  45. package/src/types.ts +130 -29
  46. package/dist/eventful.d.ts.map +0 -1
  47. 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/index.ts
31
- var exports_src = {};
32
- __export(exports_src, {
33
- setupEventForwarding: () => setupEventForwarding,
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(exports_src);
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
- // src/errors.ts
54
- class BufferOverflowError extends Error {
55
- constructor(eventType, bufferSize) {
56
- super(`Buffer overflow for event type "${eventType}" (max: ${bufferSize})`);
57
- this.name = "BufferOverflowError";
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 PROXY_MARKER = Symbol.for("@lasercat/eventful/proxy");
62
- var ORIGINAL_TARGET = Symbol.for("@lasercat/eventful/original");
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
- if (obj === null || typeof obj !== "object") {
85
- return obj;
86
- }
87
- if (!path) {
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
- if (Array.isArray(obj)) {
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
- source.addEventListener(type, handler);
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
- source.removeEventListener(type, handler);
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
- if (pattern.endsWith(":*")) {
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 handleListenerError = (eventType, error) => {
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, error);
872
+ opts.onListenerError(eventType, error2);
408
873
  return;
409
874
  }
410
875
  const errorListeners = listeners.get("error");
411
- if (errorListeners && errorListeners.size > 0) {
412
- for (const rec of Array.from(errorListeners)) {
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 error;
879
+ throw error2;
421
880
  }
422
881
  };
423
- const notifyWildcardListeners = (eventType, detail) => {
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 wildcardEvent = {
430
- type: rec.pattern,
431
- originalType: eventType,
432
- detail
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 res = rec.fn(wildcardEvent);
900
+ const fn = rec.fn;
901
+ const res = fn(wildcardEvent);
436
902
  if (res && typeof res.then === "function") {
437
- res.catch((error) => {
903
+ res.catch((error2) => {
438
904
  try {
439
- handleListenerError(eventType, error);
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 (error) {
448
- handleListenerError(eventType, error);
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 opts2 = options ?? {};
460
- const record = {
461
- fn: listener,
462
- once: opts2.once,
463
- signal: opts2.signal
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
- set.add(record);
471
- const unsubscribe = () => {
472
- const setNow = listeners.get(type);
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
- if (opts2.signal) {
479
- const onAbort = () => unsubscribe();
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
- opts2.signal.addEventListener("abort", onAbort, { once: true });
482
- if (opts2.signal.aborted)
957
+ signal.addEventListener("abort", onAbort, { once: true });
958
+ if (signal.aborted)
483
959
  onAbort();
484
960
  }
485
- return unsubscribe;
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 unsubscribe = () => {
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 = () => unsubscribe();
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 unsubscribe;
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 dispatchEvent = (event) => {
525
- if (isCompleted)
526
- return false;
527
- notifyWildcardListeners(event.type, event.detail);
528
- const set = listeners.get(event.type);
529
- if (!set || set.size === 0)
530
- return true;
531
- for (const rec of Array.from(set)) {
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.fn(event);
1023
+ const res = rec.callback.call(state.currentTarget, event);
534
1024
  if (res && typeof res.then === "function") {
535
- res.catch((error) => {
1025
+ res.catch((error2) => {
536
1026
  try {
537
- handleListenerError(event.type, error);
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 (error) {
546
- handleListenerError(event.type, error);
1035
+ } catch (error2) {
1036
+ handleListenerError(eventType, error2);
547
1037
  } finally {
548
- if (rec.once)
549
- set.delete(rec);
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 removeEventListener = (type, listener) => {
555
- const set = listeners.get(type);
556
- if (!set)
557
- return;
558
- for (const record of set) {
559
- if (record.fn === listener) {
560
- set.delete(record);
561
- if (record.signal && record.abortHandler) {
562
- record.signal.removeEventListener("abort", record.abortHandler);
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
- break;
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 set of listeners.values()) {
570
- for (const record of set) {
571
- if (record.signal && record.abortHandler) {
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 once = (type, listener, options) => {
586
- return addEventListener(type, listener, { ...options, once: true });
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 set = listeners.get(type);
591
- if (set) {
592
- for (const record of set) {
593
- if (record.signal && record.abortHandler) {
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 set of listeners.values()) {
602
- for (const record of set) {
603
- if (record.signal && record.abortHandler) {
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 unsubscribes = [];
623
- const subscribedTypes = new Set;
624
- const subscribeToType = (type) => {
625
- if (subscribedTypes.has(type))
626
- return;
627
- subscribedTypes.add(type);
628
- const unsub = addEventListener(type, (event) => {
629
- if (mapFn) {
630
- const mapped = mapFn(event);
631
- if (mapped !== null) {
632
- target2.dispatchEvent(mapped);
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
- unsubscribes.push(unsub);
639
- };
640
- for (const type of listeners.keys()) {
641
- subscribeToType(type);
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
- for (const unsub of unsubscribes) {
652
- unsub();
653
- }
1233
+ unsubscribe2();
654
1234
  };
655
1235
  };
656
- const complete = () => {
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 set of listeners.values()) {
671
- for (const record of set) {
672
- if (record.signal && record.abortHandler) {
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, error, completeHandler) => {
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
- const observable = {
754
- subscribe: (observerOrNext, errorFn, completeFn) => {
755
- let next;
756
- let error;
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
- return observable;
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: event, done: false });
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(event);
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(event);
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
- if (signal && onAbort) {
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
- once,
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/interop.ts
984
- function forwardToEventTarget(source, target, options) {
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, error, completeHandler) {
1549
+ subscribe(typeOrObserver, observerOrNext, error2, completeHandler) {
1093
1550
  if (typeof typeOrObserver === "string") {
1094
- return this.#target.subscribe(typeOrObserver, observerOrNext, error, completeHandler);
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=C000AD057E5BF10964756E2164756E21
1583
+ //# debugId=3C805781BACAE6AD64756E2164756E21