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