event-emission 0.2.0 → 0.3.0

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