event-emission 0.2.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 (43) hide show
  1. package/README.md +80 -24
  2. package/dist/event-emission.d.ts +13 -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 +474 -285
  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 +449 -278
  11. package/dist/index.js.map +8 -9
  12. package/dist/interoperability.cjs +1605 -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 +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.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 +60 -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 +26 -20
  37. package/src/factory.ts +538 -218
  38. package/src/index.ts +4 -33
  39. package/src/{interop.ts → interoperability.ts} +24 -6
  40. package/src/observe.ts +54 -17
  41. package/src/symbols.ts +1 -1
  42. package/src/types.ts +75 -30
  43. package/dist/interop.d.ts.map +0 -1
@@ -0,0 +1,1555 @@
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
+ ];
595
+ for (const name of methodNames) {
596
+ Object.defineProperty(proxy, name, {
597
+ value: eventTarget[name],
598
+ writable: false,
599
+ enumerable: false,
600
+ configurable: true
601
+ });
602
+ }
603
+ Object.defineProperty(proxy, "completed", {
604
+ get: () => eventTarget.completed,
605
+ enumerable: false,
606
+ configurable: true
607
+ });
608
+ return proxy;
609
+ }
610
+ return createEventTargetInternal(targetOrOpts);
611
+ }
612
+ function createEventTargetInternal(opts) {
613
+ const listeners = new Map;
614
+ const wildcardListeners = new Set;
615
+ let isCompleted = false;
616
+ const completionCallbacks = new Set;
617
+ const now = () => typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now();
618
+ const initializeEventState = (state, type, bubbles, cancelable) => {
619
+ state.initializedFlag = true;
620
+ state.stopPropagationFlag = false;
621
+ state.stopImmediatePropagationFlag = false;
622
+ state.canceledFlag = false;
623
+ state.isTrusted = false;
624
+ state.target = null;
625
+ state.currentTarget = null;
626
+ state.eventPhase = 0;
627
+ state.type = type;
628
+ state.bubbles = bubbles;
629
+ state.cancelable = cancelable;
630
+ };
631
+ const setCanceledFlag = (state) => {
632
+ if (state.cancelable && !state.inPassiveListenerFlag) {
633
+ state.canceledFlag = true;
634
+ }
635
+ };
636
+ const createEvent = (type, detail, init) => {
637
+ const state = {
638
+ dispatchFlag: false,
639
+ initializedFlag: true,
640
+ stopPropagationFlag: false,
641
+ stopImmediatePropagationFlag: false,
642
+ canceledFlag: false,
643
+ inPassiveListenerFlag: false,
644
+ composedFlag: Boolean(init?.composed),
645
+ eventPhase: init?.eventPhase ?? 0,
646
+ currentTarget: init?.currentTarget ?? init?.target ?? null,
647
+ target: init?.target ?? null,
648
+ timeStamp: init?.timeStamp ?? now(),
649
+ path: [],
650
+ type,
651
+ bubbles: Boolean(init?.bubbles),
652
+ cancelable: Boolean(init?.cancelable),
653
+ isTrusted: false
654
+ };
655
+ const event = { detail };
656
+ Object.defineProperties(event, {
657
+ type: {
658
+ get: () => state.type,
659
+ enumerable: true,
660
+ configurable: true
661
+ },
662
+ bubbles: {
663
+ get: () => state.bubbles,
664
+ enumerable: true,
665
+ configurable: true
666
+ },
667
+ cancelable: {
668
+ get: () => state.cancelable,
669
+ enumerable: true,
670
+ configurable: true
671
+ },
672
+ cancelBubble: {
673
+ get: () => state.stopPropagationFlag,
674
+ set: (value) => {
675
+ if (value)
676
+ state.stopPropagationFlag = true;
677
+ },
678
+ enumerable: true,
679
+ configurable: true
680
+ },
681
+ composed: {
682
+ get: () => state.composedFlag,
683
+ enumerable: true,
684
+ configurable: true
685
+ },
686
+ currentTarget: {
687
+ get: () => state.currentTarget,
688
+ enumerable: true,
689
+ configurable: true
690
+ },
691
+ defaultPrevented: {
692
+ get: () => state.canceledFlag,
693
+ enumerable: true,
694
+ configurable: true
695
+ },
696
+ eventPhase: {
697
+ get: () => state.eventPhase,
698
+ enumerable: true,
699
+ configurable: true
700
+ },
701
+ isTrusted: {
702
+ get: () => state.isTrusted,
703
+ enumerable: true,
704
+ configurable: true
705
+ },
706
+ returnValue: {
707
+ get: () => !state.canceledFlag,
708
+ set: (value) => {
709
+ if (value === false)
710
+ setCanceledFlag(state);
711
+ },
712
+ enumerable: true,
713
+ configurable: true
714
+ },
715
+ srcElement: {
716
+ get: () => state.target,
717
+ enumerable: true,
718
+ configurable: true
719
+ },
720
+ target: {
721
+ get: () => state.target,
722
+ enumerable: true,
723
+ configurable: true
724
+ },
725
+ timeStamp: {
726
+ get: () => state.timeStamp,
727
+ enumerable: true,
728
+ configurable: true
729
+ },
730
+ composedPath: {
731
+ value: () => state.path.map((entry) => entry.invocationTarget),
732
+ enumerable: true,
733
+ configurable: true
734
+ },
735
+ initEvent: {
736
+ value: (newType, bubbles = false, cancelable = false) => {
737
+ if (state.dispatchFlag)
738
+ return;
739
+ initializeEventState(state, newType, Boolean(bubbles), Boolean(cancelable));
740
+ },
741
+ enumerable: true,
742
+ configurable: true
743
+ },
744
+ preventDefault: {
745
+ value: () => setCanceledFlag(state),
746
+ enumerable: true,
747
+ configurable: true
748
+ },
749
+ stopImmediatePropagation: {
750
+ value: () => {
751
+ state.stopPropagationFlag = true;
752
+ state.stopImmediatePropagationFlag = true;
753
+ },
754
+ enumerable: true,
755
+ configurable: true
756
+ },
757
+ stopPropagation: {
758
+ value: () => {
759
+ state.stopPropagationFlag = true;
760
+ },
761
+ enumerable: true,
762
+ configurable: true
763
+ },
764
+ NONE: { value: 0, enumerable: true, configurable: true },
765
+ CAPTURING_PHASE: { value: 1, enumerable: true, configurable: true },
766
+ AT_TARGET: { value: 2, enumerable: true, configurable: true },
767
+ BUBBLING_PHASE: { value: 3, enumerable: true, configurable: true },
768
+ [EVENT_STATE]: {
769
+ value: state,
770
+ enumerable: false,
771
+ configurable: false
772
+ }
773
+ });
774
+ return event;
775
+ };
776
+ const getEventState = (event) => event[EVENT_STATE];
777
+ const normalizeAddListenerOptions = (options) => {
778
+ if (typeof options === "boolean") {
779
+ return {
780
+ capture: options,
781
+ passive: false,
782
+ once: false,
783
+ signal: null
784
+ };
785
+ }
786
+ return {
787
+ capture: Boolean(options?.capture),
788
+ passive: Boolean(options?.passive),
789
+ once: Boolean(options?.once),
790
+ signal: options?.signal ?? null
791
+ };
792
+ };
793
+ const normalizeCaptureOption = (options) => {
794
+ if (typeof options === "boolean")
795
+ return options;
796
+ return Boolean(options?.capture);
797
+ };
798
+ const removeListenerRecord = (type, record) => {
799
+ if (record.removed)
800
+ return;
801
+ record.removed = true;
802
+ const list = listeners.get(type);
803
+ if (list) {
804
+ const idx = list.indexOf(record);
805
+ if (idx >= 0)
806
+ list.splice(idx, 1);
807
+ if (list.length === 0)
808
+ listeners.delete(type);
809
+ }
810
+ if (record.signal && record.abortHandler) {
811
+ record.signal.removeEventListener("abort", record.abortHandler);
812
+ }
813
+ };
814
+ const handleListenerError = (eventType, error2) => {
815
+ if (eventType === "error")
816
+ return;
817
+ if (opts?.onListenerError) {
818
+ opts.onListenerError(eventType, error2);
819
+ return;
820
+ }
821
+ const errorListeners = listeners.get("error");
822
+ if (errorListeners && errorListeners.length > 0) {
823
+ dispatchEvent({ type: "error", detail: error2 });
824
+ } else {
825
+ throw error2;
826
+ }
827
+ };
828
+ const notifyWildcardListeners = (eventType, event) => {
829
+ if (wildcardListeners.size === 0)
830
+ return;
831
+ for (const rec of Array.from(wildcardListeners)) {
832
+ if (!matchesWildcard(eventType, rec.pattern))
833
+ continue;
834
+ const baseEvent = createEvent(rec.pattern, event.detail, {
835
+ target,
836
+ currentTarget: target,
837
+ eventPhase: 2,
838
+ bubbles: event.bubbles,
839
+ cancelable: event.cancelable,
840
+ composed: event.composed
841
+ });
842
+ const wildcardEvent = Object.defineProperties(baseEvent, {
843
+ originalType: { value: eventType, enumerable: true, configurable: true }
844
+ });
845
+ try {
846
+ const fn = rec.fn;
847
+ const res = fn(wildcardEvent);
848
+ if (res && typeof res.then === "function") {
849
+ res.catch((error2) => {
850
+ try {
851
+ handleListenerError(eventType, error2);
852
+ } catch (rethrown) {
853
+ queueMicrotask(() => {
854
+ throw rethrown;
855
+ });
856
+ }
857
+ });
858
+ }
859
+ } catch (error2) {
860
+ handleListenerError(eventType, error2);
861
+ } finally {
862
+ if (rec.once)
863
+ wildcardListeners.delete(rec);
864
+ }
865
+ const state = getEventState(wildcardEvent);
866
+ if (state?.stopImmediatePropagationFlag || state?.stopPropagationFlag) {
867
+ break;
868
+ }
869
+ }
870
+ };
871
+ const addEventListener = (type, listener, options) => {
872
+ if (isCompleted || !listener) {
873
+ return () => {};
874
+ }
875
+ const { capture, passive, once, signal } = normalizeAddListenerOptions(options);
876
+ let list = listeners.get(type);
877
+ if (!list) {
878
+ list = [];
879
+ listeners.set(type, list);
880
+ }
881
+ for (const existing of list) {
882
+ if (existing.original === listener && existing.capture === capture) {
883
+ return () => removeEventListener(type, listener, options);
884
+ }
885
+ }
886
+ const original = listener;
887
+ const callback = typeof listener === "function" ? listener : (event) => listener.handleEvent(event);
888
+ const record = {
889
+ type,
890
+ original,
891
+ callback,
892
+ capture,
893
+ passive,
894
+ once,
895
+ signal,
896
+ removed: false
897
+ };
898
+ list.push(record);
899
+ const unsubscribe2 = () => removeListenerRecord(type, record);
900
+ if (signal) {
901
+ const onAbort = () => removeListenerRecord(type, record);
902
+ record.abortHandler = onAbort;
903
+ signal.addEventListener("abort", onAbort, { once: true });
904
+ if (signal.aborted)
905
+ onAbort();
906
+ }
907
+ return unsubscribe2;
908
+ };
909
+ const addWildcardListener = (pattern, listener, options) => {
910
+ if (isCompleted)
911
+ return () => {};
912
+ const opts2 = options ?? {};
913
+ for (const existing of wildcardListeners) {
914
+ if (existing.pattern === pattern && existing.fn === listener) {
915
+ return () => removeWildcardListener(pattern, listener);
916
+ }
917
+ }
918
+ const record = {
919
+ fn: listener,
920
+ pattern,
921
+ once: opts2.once,
922
+ signal: opts2.signal
923
+ };
924
+ wildcardListeners.add(record);
925
+ const unsubscribe2 = () => {
926
+ wildcardListeners.delete(record);
927
+ if (record.signal && record.abortHandler) {
928
+ record.signal.removeEventListener("abort", record.abortHandler);
929
+ }
930
+ };
931
+ if (opts2.signal) {
932
+ const onAbort = () => unsubscribe2();
933
+ record.abortHandler = onAbort;
934
+ opts2.signal.addEventListener("abort", onAbort, { once: true });
935
+ if (opts2.signal.aborted)
936
+ onAbort();
937
+ }
938
+ return unsubscribe2;
939
+ };
940
+ const removeWildcardListener = (pattern, listener) => {
941
+ for (const record of Array.from(wildcardListeners)) {
942
+ if (record.pattern === pattern && record.fn === listener) {
943
+ wildcardListeners.delete(record);
944
+ if (record.signal && record.abortHandler) {
945
+ record.signal.removeEventListener("abort", record.abortHandler);
946
+ }
947
+ }
948
+ }
949
+ };
950
+ const invokeListeners = (eventType, event, phase, listenersSnapshot) => {
951
+ const state = getEventState(event);
952
+ if (!state || state.stopPropagationFlag)
953
+ return;
954
+ state.currentTarget = target;
955
+ state.target = target;
956
+ state.eventPhase = event.AT_TARGET;
957
+ for (const rec of listenersSnapshot) {
958
+ if (rec.removed)
959
+ continue;
960
+ if (phase === "capturing" && !rec.capture)
961
+ continue;
962
+ if (phase === "bubbling" && rec.capture)
963
+ continue;
964
+ if (rec.once)
965
+ removeListenerRecord(rec.type, rec);
966
+ if (rec.passive)
967
+ state.inPassiveListenerFlag = true;
968
+ try {
969
+ const res = rec.callback.call(state.currentTarget, event);
970
+ if (res && typeof res.then === "function") {
971
+ res.catch((error2) => {
972
+ try {
973
+ handleListenerError(eventType, error2);
974
+ } catch (rethrown) {
975
+ queueMicrotask(() => {
976
+ throw rethrown;
977
+ });
978
+ }
979
+ });
980
+ }
981
+ } catch (error2) {
982
+ handleListenerError(eventType, error2);
983
+ } finally {
984
+ if (rec.passive)
985
+ state.inPassiveListenerFlag = false;
986
+ }
987
+ if (state.stopImmediatePropagationFlag)
988
+ break;
989
+ }
990
+ };
991
+ const dispatchEvent = (eventInput) => {
992
+ if (isCompleted)
993
+ return false;
994
+ let event;
995
+ let state;
996
+ if (eventInput && typeof eventInput === "object") {
997
+ state = getEventState(eventInput);
998
+ if (state) {
999
+ event = eventInput;
1000
+ } else {
1001
+ const input = eventInput;
1002
+ if (typeof input.type !== "string") {
1003
+ throw new TypeError("Event type must be a string");
1004
+ }
1005
+ event = createEvent(input.type, input.detail, {
1006
+ bubbles: input.bubbles,
1007
+ cancelable: input.cancelable,
1008
+ composed: input.composed,
1009
+ timeStamp: input.timeStamp
1010
+ });
1011
+ state = getEventState(event);
1012
+ }
1013
+ } else {
1014
+ throw new TypeError("dispatchEvent expects an event object");
1015
+ }
1016
+ const dispatchState = state ?? getEventState(event);
1017
+ if (dispatchState.dispatchFlag || !dispatchState.initializedFlag) {
1018
+ const message = "Failed to execute dispatchEvent: event is already being dispatched";
1019
+ if (typeof globalThis.DOMException === "function") {
1020
+ throw new globalThis.DOMException(message, "InvalidStateError");
1021
+ }
1022
+ const err = new Error(message);
1023
+ err.name = "InvalidStateError";
1024
+ throw err;
1025
+ }
1026
+ dispatchState.isTrusted = false;
1027
+ dispatchState.dispatchFlag = true;
1028
+ dispatchState.path = [
1029
+ {
1030
+ invocationTarget: target,
1031
+ invocationTargetInShadowTree: false,
1032
+ shadowAdjustedTarget: target,
1033
+ relatedTarget: null,
1034
+ touchTargets: [],
1035
+ rootOfClosedTree: false,
1036
+ slotInClosedTree: false
1037
+ }
1038
+ ];
1039
+ notifyWildcardListeners(dispatchState.type, event);
1040
+ const list = listeners.get(dispatchState.type);
1041
+ const snapshot = list ? list.slice() : [];
1042
+ invokeListeners(dispatchState.type, event, "capturing", snapshot);
1043
+ invokeListeners(dispatchState.type, event, "bubbling", snapshot);
1044
+ dispatchState.eventPhase = event.NONE;
1045
+ dispatchState.currentTarget = null;
1046
+ dispatchState.path = [];
1047
+ dispatchState.dispatchFlag = false;
1048
+ dispatchState.stopPropagationFlag = false;
1049
+ dispatchState.stopImmediatePropagationFlag = false;
1050
+ return !dispatchState.canceledFlag;
1051
+ };
1052
+ const removeEventListener = (type, listener, options) => {
1053
+ if (!listener)
1054
+ return;
1055
+ const capture = normalizeCaptureOption(options);
1056
+ const list = listeners.get(type);
1057
+ if (!list)
1058
+ return;
1059
+ for (const record of [...list]) {
1060
+ if (record.original === listener && record.capture === capture) {
1061
+ removeListenerRecord(type, record);
1062
+ }
1063
+ }
1064
+ };
1065
+ const clear = () => {
1066
+ for (const [type, list] of Array.from(listeners.entries())) {
1067
+ for (const record of [...list]) {
1068
+ removeListenerRecord(type, record);
1069
+ }
1070
+ }
1071
+ listeners.clear();
1072
+ for (const record of wildcardListeners) {
1073
+ if (record.signal && record.abortHandler) {
1074
+ record.signal.removeEventListener("abort", record.abortHandler);
1075
+ }
1076
+ }
1077
+ wildcardListeners.clear();
1078
+ };
1079
+ const on = (type, options) => {
1080
+ return new Observable((observer) => {
1081
+ let opts2;
1082
+ if (typeof options === "boolean") {
1083
+ opts2 = { capture: options };
1084
+ } else {
1085
+ opts2 = options ?? {};
1086
+ }
1087
+ const handler = opts2.handler;
1088
+ const once = opts2.once;
1089
+ const eventHandler = (e) => {
1090
+ let success = false;
1091
+ try {
1092
+ if (handler) {
1093
+ handler(e);
1094
+ }
1095
+ observer.next(e);
1096
+ success = true;
1097
+ } finally {
1098
+ if (once && success) {
1099
+ observer.complete();
1100
+ }
1101
+ }
1102
+ };
1103
+ const errorHandler = (e) => {
1104
+ observer.error(e.detail);
1105
+ };
1106
+ const unsubscribeEvent = addEventListener(type, eventHandler, opts2);
1107
+ let unsubscribeError;
1108
+ if (opts2.receiveError) {
1109
+ unsubscribeError = addEventListener("error", errorHandler, opts2);
1110
+ }
1111
+ return () => {
1112
+ unsubscribeEvent();
1113
+ if (unsubscribeError) {
1114
+ unsubscribeError();
1115
+ }
1116
+ };
1117
+ });
1118
+ };
1119
+ const onceMethod = (type, listener, options) => {
1120
+ if (typeof options === "boolean") {
1121
+ return addEventListener(type, listener, { capture: options, once: true });
1122
+ }
1123
+ return addEventListener(type, listener, { ...options ?? {}, once: true });
1124
+ };
1125
+ const removeAllListeners = (type) => {
1126
+ if (type !== undefined) {
1127
+ const list = listeners.get(type);
1128
+ if (list) {
1129
+ for (const record of [...list]) {
1130
+ removeListenerRecord(type, record);
1131
+ }
1132
+ listeners.delete(type);
1133
+ }
1134
+ } else {
1135
+ for (const [eventType, list] of Array.from(listeners.entries())) {
1136
+ for (const record of [...list]) {
1137
+ removeListenerRecord(eventType, record);
1138
+ }
1139
+ }
1140
+ listeners.clear();
1141
+ for (const record of wildcardListeners) {
1142
+ if (record.signal && record.abortHandler) {
1143
+ record.signal.removeEventListener("abort", record.abortHandler);
1144
+ }
1145
+ }
1146
+ wildcardListeners.clear();
1147
+ }
1148
+ };
1149
+ const pipe = (target2, mapFn) => {
1150
+ if (isCompleted) {
1151
+ return () => {};
1152
+ }
1153
+ const unsubscribe2 = addWildcardListener("*", (event) => {
1154
+ if (mapFn) {
1155
+ const mapped = mapFn(createEvent(event.originalType, event.detail, {
1156
+ target: target2,
1157
+ currentTarget: target2,
1158
+ eventPhase: 2,
1159
+ bubbles: event.bubbles,
1160
+ cancelable: event.cancelable,
1161
+ composed: event.composed
1162
+ }));
1163
+ if (mapped !== null) {
1164
+ target2.dispatchEvent(mapped);
1165
+ }
1166
+ } else {
1167
+ target2.dispatchEvent({
1168
+ type: event.originalType,
1169
+ detail: event.detail
1170
+ });
1171
+ }
1172
+ });
1173
+ const completionUnsub = () => {
1174
+ unsubscribe2();
1175
+ };
1176
+ completionCallbacks.add(completionUnsub);
1177
+ return () => {
1178
+ completionCallbacks.delete(completionUnsub);
1179
+ unsubscribe2();
1180
+ };
1181
+ };
1182
+ const complete2 = () => {
1183
+ if (isCompleted)
1184
+ return;
1185
+ isCompleted = true;
1186
+ for (const cb of completionCallbacks) {
1187
+ try {
1188
+ cb();
1189
+ } catch (err) {
1190
+ try {
1191
+ handleListenerError("complete", err);
1192
+ } catch {}
1193
+ }
1194
+ }
1195
+ completionCallbacks.clear();
1196
+ for (const [eventType, list] of Array.from(listeners.entries())) {
1197
+ for (const record of [...list]) {
1198
+ removeListenerRecord(eventType, record);
1199
+ }
1200
+ }
1201
+ listeners.clear();
1202
+ for (const record of wildcardListeners) {
1203
+ if (record.signal && record.abortHandler) {
1204
+ record.signal.removeEventListener("abort", record.abortHandler);
1205
+ }
1206
+ }
1207
+ wildcardListeners.clear();
1208
+ };
1209
+ const subscribe = (type, observerOrNext, error2, completeHandler) => {
1210
+ let observer;
1211
+ if (typeof observerOrNext === "function") {
1212
+ observer = {
1213
+ next: observerOrNext,
1214
+ error: error2,
1215
+ complete: completeHandler
1216
+ };
1217
+ } else {
1218
+ observer = observerOrNext ?? {};
1219
+ }
1220
+ let closed = false;
1221
+ if (isCompleted) {
1222
+ if (observer.complete) {
1223
+ try {
1224
+ observer.complete();
1225
+ } catch {}
1226
+ }
1227
+ return {
1228
+ unsubscribe: () => {
1229
+ closed = true;
1230
+ },
1231
+ get closed() {
1232
+ return closed || isCompleted;
1233
+ }
1234
+ };
1235
+ }
1236
+ const unsub = addEventListener(type, (event) => {
1237
+ if (closed)
1238
+ return;
1239
+ if (observer.next) {
1240
+ try {
1241
+ observer.next(event);
1242
+ } catch (err) {
1243
+ if (observer.error) {
1244
+ try {
1245
+ observer.error(err);
1246
+ } catch {}
1247
+ }
1248
+ }
1249
+ }
1250
+ });
1251
+ const onComplete = () => {
1252
+ if (closed)
1253
+ return;
1254
+ closed = true;
1255
+ if (observer.complete) {
1256
+ try {
1257
+ observer.complete();
1258
+ } catch {}
1259
+ }
1260
+ };
1261
+ completionCallbacks.add(onComplete);
1262
+ return {
1263
+ unsubscribe: () => {
1264
+ if (closed)
1265
+ return;
1266
+ closed = true;
1267
+ completionCallbacks.delete(onComplete);
1268
+ unsub();
1269
+ },
1270
+ get closed() {
1271
+ return closed || isCompleted;
1272
+ }
1273
+ };
1274
+ };
1275
+ const toObservable = () => {
1276
+ return new Observable((observer) => {
1277
+ if (isCompleted) {
1278
+ observer.complete();
1279
+ return;
1280
+ }
1281
+ const wildcardListener = (event) => {
1282
+ observer.next(createEvent(event.originalType, event.detail, {
1283
+ target,
1284
+ currentTarget: target,
1285
+ eventPhase: 2,
1286
+ bubbles: event.bubbles,
1287
+ cancelable: event.cancelable,
1288
+ composed: event.composed
1289
+ }));
1290
+ };
1291
+ const unsubscribe2 = addWildcardListener("*", wildcardListener);
1292
+ const onComplete = () => {
1293
+ observer.complete();
1294
+ };
1295
+ completionCallbacks.add(onComplete);
1296
+ return () => {
1297
+ unsubscribe2();
1298
+ completionCallbacks.delete(onComplete);
1299
+ };
1300
+ });
1301
+ };
1302
+ function events(type, options) {
1303
+ if (isCompleted) {
1304
+ return {
1305
+ [Symbol.asyncIterator]() {
1306
+ return this;
1307
+ },
1308
+ next() {
1309
+ return Promise.resolve({
1310
+ value: undefined,
1311
+ done: true
1312
+ });
1313
+ },
1314
+ return() {
1315
+ return Promise.resolve({
1316
+ value: undefined,
1317
+ done: true
1318
+ });
1319
+ }
1320
+ };
1321
+ }
1322
+ const signal = options?.signal;
1323
+ const bufferSize = options?.bufferSize ?? Infinity;
1324
+ const overflowStrategy = options?.overflowStrategy ?? "drop-oldest";
1325
+ const buffer = [];
1326
+ let resolve = null;
1327
+ let done = false;
1328
+ let hasOverflow = false;
1329
+ let onAbort = null;
1330
+ const cleanupAbortListener = () => {
1331
+ if (signal && onAbort) {
1332
+ signal.removeEventListener("abort", onAbort);
1333
+ }
1334
+ };
1335
+ const unsub = addEventListener(type, (event) => {
1336
+ if (done)
1337
+ return;
1338
+ const typedEvent = event;
1339
+ if (resolve) {
1340
+ const r = resolve;
1341
+ resolve = null;
1342
+ r({ value: typedEvent, done: false });
1343
+ } else {
1344
+ if (buffer.length >= bufferSize && bufferSize !== Infinity) {
1345
+ switch (overflowStrategy) {
1346
+ case "drop-oldest":
1347
+ buffer.shift();
1348
+ buffer.push(typedEvent);
1349
+ break;
1350
+ case "drop-latest":
1351
+ break;
1352
+ case "throw":
1353
+ unsub();
1354
+ completionCallbacks.delete(onComplete);
1355
+ done = true;
1356
+ hasOverflow = true;
1357
+ cleanupAbortListener();
1358
+ return;
1359
+ }
1360
+ } else {
1361
+ buffer.push(typedEvent);
1362
+ }
1363
+ }
1364
+ });
1365
+ const onComplete = () => {
1366
+ done = true;
1367
+ cleanupAbortListener();
1368
+ if (resolve) {
1369
+ const r = resolve;
1370
+ resolve = null;
1371
+ r({ value: undefined, done: true });
1372
+ }
1373
+ };
1374
+ completionCallbacks.add(onComplete);
1375
+ if (signal) {
1376
+ onAbort = () => {
1377
+ done = true;
1378
+ completionCallbacks.delete(onComplete);
1379
+ unsub();
1380
+ if (resolve) {
1381
+ const r = resolve;
1382
+ resolve = null;
1383
+ r({ value: undefined, done: true });
1384
+ }
1385
+ };
1386
+ signal.addEventListener("abort", onAbort, { once: true });
1387
+ if (signal.aborted)
1388
+ onAbort();
1389
+ }
1390
+ const iterator = {
1391
+ [Symbol.asyncIterator]() {
1392
+ return this;
1393
+ },
1394
+ async next() {
1395
+ if (buffer.length > 0) {
1396
+ return { value: buffer.shift(), done: false };
1397
+ }
1398
+ if (resolve !== null) {
1399
+ return Promise.reject(new Error("Concurrent calls to next() are not supported on this async iterator"));
1400
+ }
1401
+ return new Promise((_resolve, _reject) => {
1402
+ if (hasOverflow) {
1403
+ hasOverflow = false;
1404
+ _reject(new BufferOverflowError(type, bufferSize));
1405
+ return;
1406
+ }
1407
+ if (done) {
1408
+ _resolve({
1409
+ value: undefined,
1410
+ done: true
1411
+ });
1412
+ return;
1413
+ }
1414
+ resolve = _resolve;
1415
+ });
1416
+ },
1417
+ return() {
1418
+ if (resolve) {
1419
+ const r = resolve;
1420
+ resolve = null;
1421
+ r({ value: undefined, done: true });
1422
+ }
1423
+ done = true;
1424
+ completionCallbacks.delete(onComplete);
1425
+ unsub();
1426
+ cleanupAbortListener();
1427
+ return Promise.resolve({
1428
+ value: undefined,
1429
+ done: true
1430
+ });
1431
+ }
1432
+ };
1433
+ return iterator;
1434
+ }
1435
+ const target = {
1436
+ addEventListener,
1437
+ removeEventListener,
1438
+ dispatchEvent,
1439
+ clear,
1440
+ on,
1441
+ once: onceMethod,
1442
+ removeAllListeners,
1443
+ pipe,
1444
+ addWildcardListener,
1445
+ removeWildcardListener,
1446
+ complete: complete2,
1447
+ get completed() {
1448
+ return isCompleted;
1449
+ },
1450
+ subscribe,
1451
+ toObservable,
1452
+ events
1453
+ };
1454
+ target[SymbolObservable] = () => {
1455
+ return toObservable();
1456
+ };
1457
+ return target;
1458
+ }
1459
+
1460
+ // src/interoperability.ts
1461
+ function forwardToEventTarget(source, target, options) {
1462
+ const unsubscribe2 = source.addWildcardListener("*", (event) => {
1463
+ const CustomEventCtor = globalThis.CustomEvent;
1464
+ const domEvent = typeof CustomEventCtor === "function" ? new CustomEventCtor(event.originalType, {
1465
+ detail: event.detail,
1466
+ bubbles: event.bubbles,
1467
+ cancelable: event.cancelable,
1468
+ composed: event.composed
1469
+ }) : {
1470
+ type: event.originalType,
1471
+ detail: event.detail,
1472
+ bubbles: event.bubbles,
1473
+ cancelable: event.cancelable,
1474
+ composed: event.composed
1475
+ };
1476
+ target.dispatchEvent(domEvent);
1477
+ }, options);
1478
+ return unsubscribe2;
1479
+ }
1480
+ function fromEventTarget(domTarget, eventTypes, options) {
1481
+ const emitter = createEventTarget({
1482
+ onListenerError: options?.onListenerError
1483
+ });
1484
+ const handlers = new Map;
1485
+ for (const type of eventTypes) {
1486
+ const handler = (event) => {
1487
+ emitter.dispatchEvent({
1488
+ type,
1489
+ detail: event.detail ?? event,
1490
+ bubbles: event.bubbles,
1491
+ cancelable: event.cancelable,
1492
+ composed: event.composed
1493
+ });
1494
+ };
1495
+ handlers.set(type, handler);
1496
+ domTarget.addEventListener(type, handler);
1497
+ }
1498
+ let onAbort = null;
1499
+ if (options?.signal) {
1500
+ onAbort = () => {
1501
+ for (const [type, handler] of handlers) {
1502
+ domTarget.removeEventListener(type, handler);
1503
+ }
1504
+ handlers.clear();
1505
+ emitter.complete();
1506
+ };
1507
+ options.signal.addEventListener("abort", onAbort, { once: true });
1508
+ if (options.signal.aborted)
1509
+ onAbort();
1510
+ }
1511
+ return {
1512
+ addEventListener: emitter.addEventListener,
1513
+ removeEventListener: emitter.removeEventListener,
1514
+ dispatchEvent: emitter.dispatchEvent,
1515
+ clear: emitter.clear,
1516
+ once: emitter.once,
1517
+ removeAllListeners: emitter.removeAllListeners,
1518
+ pipe: emitter.pipe,
1519
+ addWildcardListener: emitter.addWildcardListener,
1520
+ removeWildcardListener: emitter.removeWildcardListener,
1521
+ on: emitter.on,
1522
+ subscribe: emitter.subscribe,
1523
+ toObservable: emitter.toObservable,
1524
+ complete: emitter.complete,
1525
+ get completed() {
1526
+ return emitter.completed;
1527
+ },
1528
+ events: emitter.events,
1529
+ destroy: () => {
1530
+ if (options?.signal && onAbort) {
1531
+ options.signal.removeEventListener("abort", onAbort);
1532
+ }
1533
+ for (const [type, handler] of handlers) {
1534
+ domTarget.removeEventListener(type, handler);
1535
+ }
1536
+ handlers.clear();
1537
+ emitter.complete();
1538
+ }
1539
+ };
1540
+ }
1541
+ function pipe(source, target, options) {
1542
+ return source.addWildcardListener("*", (event) => {
1543
+ target.dispatchEvent({
1544
+ type: event.originalType,
1545
+ detail: event.detail
1546
+ });
1547
+ }, options);
1548
+ }
1549
+ export {
1550
+ pipe,
1551
+ fromEventTarget,
1552
+ forwardToEventTarget
1553
+ };
1554
+
1555
+ //# debugId=DD2CABDF8085D79E64756E2164756E21