event-emission 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +331 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/eventful.d.ts +153 -0
- package/dist/eventful.d.ts.map +1 -0
- package/dist/factory.d.ts +89 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.cjs +1126 -0
- package/dist/index.cjs.map +15 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1093 -0
- package/dist/index.js.map +15 -0
- package/dist/interop.d.ts +163 -0
- package/dist/interop.d.ts.map +1 -0
- package/dist/observe.d.ts +182 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/symbols.d.ts +6 -0
- package/dist/symbols.d.ts.map +1 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +107 -0
- package/src/errors.ts +10 -0
- package/src/eventful.ts +323 -0
- package/src/factory.ts +948 -0
- package/src/index.ts +71 -0
- package/src/interop.ts +271 -0
- package/src/observe.ts +734 -0
- package/src/symbols.ts +12 -0
- package/src/types.ts +206 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/symbols.ts", "../src/errors.ts", "../src/observe.ts", "../src/factory.ts", "../src/interop.ts", "../src/eventful.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Symbol.observable polyfill for TC39 Observable interop.\n * This ensures the symbol exists even in environments that don't support it natively.\n */\nexport const SymbolObservable: symbol =\n (typeof Symbol === 'function' && (Symbol as { observable?: symbol }).observable) ||\n Symbol.for('@@observable');\n\n// Assign to make Symbol.observable available\nif (typeof Symbol === 'function') {\n (Symbol as { observable?: symbol }).observable = SymbolObservable;\n}\n",
|
|
6
|
+
"/**\n * Error thrown when an async iterator's event buffer overflows\n * and the overflow strategy is 'throw'.\n */\nexport class BufferOverflowError extends Error {\n constructor(eventType: string, bufferSize: number) {\n super(`Buffer overflow for event type \"${eventType}\" (max: ${bufferSize})`);\n this.name = 'BufferOverflowError';\n }\n}\n",
|
|
7
|
+
"/* eslint-disable @typescript-eslint/no-unsafe-assignment -- Proxy handlers require any spreads */\n/* eslint-disable @typescript-eslint/no-redundant-type-constituents -- Type unions are intentional for flexibility */\n\nimport type { EventfulEvent, EventTargetLike } from './types';\n\n// =============================================================================\n// DOM Type Stubs (for DOM-free environments)\n// =============================================================================\n\n/** Minimal EventTarget interface for duck-typing */\ninterface MinimalEventTarget {\n addEventListener(type: string, listener: (event: unknown) => void): void;\n removeEventListener(type: string, listener: (event: unknown) => void): void;\n dispatchEvent(event: unknown): boolean;\n}\n\n/** Minimal Event interface for forwarding */\ninterface MinimalEvent {\n type: string;\n}\n\n/** Minimal CustomEvent interface for forwarding */\ninterface MinimalCustomEvent extends MinimalEvent {\n detail?: unknown;\n}\n\n/** Type declaration for structuredClone (available in modern runtimes) */\ndeclare function structuredClone<T>(value: T): T;\n\n// =============================================================================\n// Symbols\n// =============================================================================\n\n/** Symbol marking an object as proxied */\nexport const PROXY_MARKER = Symbol.for('@lasercat/eventful/proxy');\n\n/** Symbol to access the original unproxied target */\nexport const ORIGINAL_TARGET = Symbol.for('@lasercat/eventful/original');\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Options for observable proxy creation */\nexport interface ObserveOptions {\n /** Enable deep observation of nested objects (default: true) */\n deep?: boolean;\n /** Clone strategy for previous state (default: 'path') */\n cloneStrategy?: 'shallow' | 'deep' | 'path';\n}\n\n/** Event detail for property changes */\nexport interface PropertyChangeDetail<T = unknown> {\n /** The new value */\n value: T;\n /** Current state of the root object (after change) */\n current: unknown;\n /** Previous state of the root object (before change) */\n previous: unknown;\n}\n\n/** Array methods that mutate the array */\nexport type ArrayMutationMethod =\n | 'push'\n | 'pop'\n | 'shift'\n | 'unshift'\n | 'splice'\n | 'sort'\n | 'reverse'\n | 'fill'\n | 'copyWithin';\n\n/** Event detail for array mutations */\nexport interface ArrayMutationDetail<T = unknown> {\n /** The array method that was called */\n method: ArrayMutationMethod;\n /** Arguments passed to the method */\n args: unknown[];\n /** Return value of the method */\n result: unknown;\n /** Items that were added (if applicable) */\n added?: T[];\n /** Items that were removed (if applicable) */\n removed?: T[];\n /** Current state of the root object (after change) */\n current: unknown;\n /** Previous state of the root object (before change) */\n previous: unknown;\n}\n\n/** Event map for observable objects */\nexport type ObservableEventMap<_T extends object> = {\n update: PropertyChangeDetail;\n [key: `update:${string}`]: PropertyChangeDetail | ArrayMutationDetail;\n};\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst ARRAY_MUTATORS = new Set<ArrayMutationMethod>([\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n 'fill',\n 'copyWithin',\n]);\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\ninterface ProxyContext<T extends object> {\n eventTarget: EventTargetLike<ObservableEventMap<T>>;\n /** Reference to the original (unproxied) root object for cloning */\n originalRoot: T;\n options: Required<ObserveOptions>;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/** Check if a value can be proxied */\nfunction isProxyable(value: unknown): value is object {\n return (\n value !== null &&\n typeof value === 'object' &&\n !isProxied(value) &&\n !(value instanceof Date) &&\n !(value instanceof RegExp) &&\n !(value instanceof Map) &&\n !(value instanceof Set) &&\n !(value instanceof WeakMap) &&\n !(value instanceof WeakSet) &&\n !(value instanceof Promise) &&\n !(value instanceof Error) &&\n !(value instanceof ArrayBuffer) &&\n !ArrayBuffer.isView(value)\n );\n}\n\n/** Check if already proxied */\nfunction isProxied(value: unknown): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<symbol, unknown>)[PROXY_MARKER] === true\n );\n}\n\n/** Check if property is an array mutator */\nfunction isArrayMutator(prop: string | symbol): prop is ArrayMutationMethod {\n return typeof prop === 'string' && ARRAY_MUTATORS.has(prop as ArrayMutationMethod);\n}\n\n/** Clone along changed path for efficiency */\nfunction cloneAlongPath(obj: unknown, path?: string): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (!path) {\n return Array.isArray(obj) ? [...obj] : { ...obj };\n }\n\n const parts = path.split('.');\n\n if (Array.isArray(obj)) {\n // For arrays, shallow copy\n return [...obj];\n }\n\n const result: Record<string, unknown> = { ...obj };\n\n let current: Record<string, unknown> = result;\n // Clone all objects along the path, INCLUDING the leaf\n for (let i = 0; i < parts.length; i++) {\n const key = parts[i];\n const value = current[key];\n if (value !== null && typeof value === 'object') {\n current[key] = Array.isArray(value) ? [...value] : { ...value };\n // Only traverse deeper if not the last element\n if (i < parts.length - 1) {\n current = current[key] as Record<string, unknown>;\n }\n } else {\n break;\n }\n }\n\n return result;\n}\n\n/** Clone for comparison based on strategy */\nfunction cloneForComparison(\n obj: unknown,\n strategy: 'shallow' | 'deep' | 'path',\n changedPath?: string,\n): unknown {\n if (obj === null || typeof obj !== 'object') return obj;\n\n switch (strategy) {\n case 'shallow':\n return Array.isArray(obj) ? [...obj] : { ...obj };\n\n case 'deep':\n return structuredClone(obj);\n\n case 'path':\n return cloneAlongPath(obj, changedPath);\n\n default:\n return obj;\n }\n}\n\n/** Compute array diff for mutation events */\nfunction computeArrayDiff(\n method: ArrayMutationMethod,\n before: unknown[],\n _after: unknown[],\n args: unknown[],\n): { added?: unknown[]; removed?: unknown[] } {\n switch (method) {\n case 'push':\n return { added: args };\n case 'pop':\n return { removed: before.length > 0 ? [before[before.length - 1]] : [] };\n case 'shift':\n return { removed: before.length > 0 ? [before[0]] : [] };\n case 'unshift':\n return { added: args };\n case 'splice': {\n const [start, deleteCount, ...items] = args as [number, number?, ...unknown[]];\n const actualStart =\n start < 0 ? Math.max(before.length + start, 0) : Math.min(start, before.length);\n const actualDeleteCount = Math.min(\n deleteCount ?? before.length - actualStart,\n before.length - actualStart,\n );\n return {\n removed: before.slice(actualStart, actualStart + actualDeleteCount),\n added: items,\n };\n }\n case 'sort':\n case 'reverse':\n case 'fill':\n case 'copyWithin':\n return {};\n default:\n return {};\n }\n}\n\n// =============================================================================\n// Proxy Registry (prevents duplicate proxying)\n// =============================================================================\n\n// Registry key combines target object with context to allow same object\n// to be observed in different contexts\nconst proxyRegistry = new WeakMap<\n object,\n WeakMap<ProxyContext<object>, { proxy: object; path: string }>\n>();\n\n/** Get or create proxy registry entry for a context */\nfunction getContextRegistry(\n target: object,\n): WeakMap<ProxyContext<object>, { proxy: object; path: string }> {\n let contextMap = proxyRegistry.get(target);\n if (!contextMap) {\n contextMap = new WeakMap();\n proxyRegistry.set(target, contextMap);\n }\n return contextMap;\n}\n\n// =============================================================================\n// Array Method Interceptor\n// =============================================================================\n\nfunction createArrayMethodInterceptor<T extends object>(\n array: unknown[],\n method: ArrayMutationMethod,\n path: string,\n context: ProxyContext<T>,\n): (...args: unknown[]) => unknown {\n const original = array[method as keyof typeof array] as (...args: unknown[]) => unknown;\n\n return function (this: unknown[], ...args: unknown[]): unknown {\n // Clone from original (unproxied) root BEFORE mutation\n const previousState = cloneForComparison(\n context.originalRoot,\n context.options.cloneStrategy,\n path,\n );\n const previousItems = [...array];\n\n const result = original.apply(this, args);\n\n const { added, removed } = computeArrayDiff(method, previousItems, array, args);\n\n // Determine event path - for root arrays, avoid leading dot\n const methodEventPath = path ? `update:${path}.${method}` : `update:${method}`;\n const arrayEventPath = path ? `update:${path}` : 'update:';\n\n // Dispatch method-specific event\n context.eventTarget.dispatchEvent({\n type: methodEventPath as keyof ObservableEventMap<T> & string,\n detail: {\n method,\n args,\n result,\n added,\n removed,\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n\n // Dispatch path event for the array itself (only if path is non-empty)\n if (path) {\n context.eventTarget.dispatchEvent({\n type: arrayEventPath as keyof ObservableEventMap<T> & string,\n detail: {\n value: array,\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n }\n\n // Dispatch top-level update\n context.eventTarget.dispatchEvent({\n type: 'update' as keyof ObservableEventMap<T> & string,\n detail: {\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n\n return result;\n };\n}\n\n// =============================================================================\n// Core Proxy Creation\n// =============================================================================\n\nfunction createObservableProxyInternal<T extends object>(\n target: T,\n path: string,\n context: ProxyContext<T>,\n): T {\n // Check if this exact object is already proxied for this context\n const contextRegistry = getContextRegistry(target);\n const existing = contextRegistry.get(context as unknown as ProxyContext<object>);\n if (existing) {\n // Return existing proxy - note: shared objects will use the first path they were accessed from\n // This is intentional to avoid duplicate event dispatching\n return existing.proxy as T;\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n // Handle internal markers\n if (prop === PROXY_MARKER) return true;\n if (prop === ORIGINAL_TARGET) return obj;\n\n // Pass through symbols\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop, receiver);\n }\n\n const value = Reflect.get(obj, prop, receiver);\n\n // Intercept array mutating methods\n if (Array.isArray(obj) && isArrayMutator(prop)) {\n return createArrayMethodInterceptor(obj, prop, path, context);\n }\n\n // Lazy proxy nested objects/arrays\n if (context.options.deep && isProxyable(value)) {\n const nestedPath = path ? `${path}.${prop}` : prop;\n return createObservableProxyInternal(\n value as object,\n nestedPath,\n context as ProxyContext<object>,\n );\n }\n\n return value;\n },\n\n set(obj, prop, value, receiver) {\n // Pass through symbols\n if (typeof prop === 'symbol') {\n return Reflect.set(obj, prop, value, receiver);\n }\n\n const oldValue = Reflect.get(obj, prop, receiver);\n\n // Skip if value unchanged (shallow equality)\n if (Object.is(oldValue, value)) {\n return true;\n }\n\n // Capture previous state before mutation (from original, not proxy)\n const propPath = path ? `${path}.${prop}` : prop;\n const previousState = cloneForComparison(\n context.originalRoot,\n context.options.cloneStrategy,\n propPath,\n );\n\n const success = Reflect.set(obj, prop, value, receiver);\n\n if (success) {\n // Dispatch path-specific event\n context.eventTarget.dispatchEvent({\n type: `update:${propPath}` as keyof ObservableEventMap<T> & string,\n detail: {\n value,\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n\n // Dispatch top-level update event\n context.eventTarget.dispatchEvent({\n type: 'update' as keyof ObservableEventMap<T> & string,\n detail: {\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n }\n\n return success;\n },\n\n deleteProperty(obj, prop) {\n // Pass through symbols\n if (typeof prop === 'symbol') {\n return Reflect.deleteProperty(obj, prop);\n }\n\n const propPath = path ? `${path}.${String(prop)}` : String(prop);\n const previousState = cloneForComparison(\n context.originalRoot,\n context.options.cloneStrategy,\n propPath,\n );\n\n const success = Reflect.deleteProperty(obj, prop);\n\n if (success) {\n // Dispatch path-specific event\n context.eventTarget.dispatchEvent({\n type: `update:${propPath}` as keyof ObservableEventMap<T> & string,\n detail: {\n value: undefined,\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n\n // Dispatch top-level update event\n context.eventTarget.dispatchEvent({\n type: 'update' as keyof ObservableEventMap<T> & string,\n detail: {\n current: context.originalRoot,\n previous: previousState,\n },\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n }\n\n return success;\n },\n });\n\n // Register the proxy\n contextRegistry.set(context as unknown as ProxyContext<object>, {\n proxy,\n path,\n });\n\n return proxy;\n}\n\n// =============================================================================\n// EventTarget Forwarding\n// =============================================================================\n\n/** Duck-type check for EventTarget */\nfunction isEventTarget(obj: unknown): obj is MinimalEventTarget {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as MinimalEventTarget).addEventListener === 'function' &&\n typeof (obj as MinimalEventTarget).removeEventListener === 'function' &&\n typeof (obj as MinimalEventTarget).dispatchEvent === 'function'\n );\n}\n\n/**\n * Sets up event forwarding from a source EventTarget to an Eventful target.\n *\n * This function enables integration between DOM EventTargets and Eventful targets.\n * When listeners are added to the target, corresponding forwarding handlers are\n * automatically registered on the source. Update events are not forwarded to\n * prevent circular event loops.\n *\n * @template T - The object type whose events are being forwarded.\n * @param source - The DOM EventTarget to forward events from.\n * @param target - The Eventful target to forward events to.\n * @returns A cleanup function that removes all forwarding handlers when called.\n *\n * @example\n * ```typescript\n * const domElement = document.getElementById('my-element');\n * const events = createEventTarget<{ click: MouseEvent; focus: FocusEvent }>();\n *\n * const cleanup = setupEventForwarding(domElement, events);\n *\n * // When you add listeners to events, they will receive events from domElement\n * events.addEventListener('click', (event) => {\n * console.log('Click received via forwarding');\n * });\n *\n * // Stop forwarding when done\n * cleanup();\n * ```\n */\nexport function setupEventForwarding<T extends object>(\n source: MinimalEventTarget,\n target: EventTargetLike<ObservableEventMap<T>>,\n): () => void {\n const handlers = new Map<string, (event: unknown) => void>();\n\n const forwardHandler = (type: string) => (event: unknown) => {\n const detail = (event as MinimalCustomEvent).detail ?? event;\n target.dispatchEvent({\n type: type as keyof ObservableEventMap<T> & string,\n detail,\n } as EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>);\n };\n\n // Save original method reference without mutating target\n const originalAddEventListener = target.addEventListener.bind(target);\n\n // Create a wrapped addEventListener that also sets up forwarding\n const wrappedAddEventListener = ((\n type: string,\n listener: (event: EventfulEvent<unknown>) => void | Promise<void>,\n options?: unknown,\n ) => {\n // Forward non-update events from source (lazily, once per type)\n if (!handlers.has(type) && type !== 'update' && !type.startsWith('update:')) {\n const handler = forwardHandler(type);\n handlers.set(type, handler);\n source.addEventListener(type, handler);\n }\n return originalAddEventListener(\n type as keyof ObservableEventMap<T> & string,\n listener as (\n event: EventfulEvent<ObservableEventMap<T>[keyof ObservableEventMap<T>]>,\n ) => void,\n options as Parameters<typeof originalAddEventListener>[2],\n );\n }) as typeof target.addEventListener;\n\n // Replace the addEventListener method\n (target as { addEventListener: typeof wrappedAddEventListener }).addEventListener =\n wrappedAddEventListener;\n\n return () => {\n // Restore original addEventListener\n (target as { addEventListener: typeof originalAddEventListener }).addEventListener =\n originalAddEventListener;\n // Clean up all forwarding handlers\n for (const [type, handler] of handlers) {\n source.removeEventListener(type, handler);\n }\n handlers.clear();\n };\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Checks if an object is an observed proxy created by createObservableProxy.\n *\n * Use this to determine whether an object is being tracked for changes.\n * Useful for conditional logic or debugging.\n *\n * @param obj - The object to check.\n * @returns True if the object is an observed proxy, false otherwise.\n *\n * @example\n * ```typescript\n * const original = { count: 0 };\n * const state = createEventTarget(original, { observe: true });\n *\n * console.log(isObserved(original)); // false\n * console.log(isObserved(state)); // true\n * ```\n */\nexport function isObserved(obj: unknown): boolean {\n return isProxied(obj);\n}\n\n/**\n * Retrieves the original unproxied object from an observed proxy.\n *\n * When you pass an object to createEventTarget with observe: true, a Proxy\n * wrapper is created. This function returns the underlying original object,\n * which is useful when you need direct access without triggering events.\n *\n * @template T - The object type.\n * @param proxy - The observed proxy (or any object).\n * @returns The original unproxied object. If the input is not a proxy, returns it unchanged.\n *\n * @example\n * ```typescript\n * const original = { count: 0 };\n * const state = createEventTarget(original, { observe: true });\n *\n * // state is a Proxy wrapping original\n * const unwrapped = getOriginal(state);\n *\n * console.log(unwrapped === original); // true\n * console.log(unwrapped === state); // false\n * ```\n *\n * @example Passing to external APIs that don't work with Proxies\n * ```typescript\n * const data = createEventTarget({ items: [] }, { observe: true });\n *\n * // Some serialization libraries have issues with Proxies\n * const json = JSON.stringify(getOriginal(data));\n * ```\n */\nexport function getOriginal<T extends object>(proxy: T): T {\n if (!isProxied(proxy)) {\n return proxy;\n }\n return (proxy as Record<symbol, T>)[ORIGINAL_TARGET] ?? proxy;\n}\n\n/**\n * Creates an observable proxy that dispatches events when properties change.\n *\n * This function wraps an object in a Proxy that tracks all property modifications,\n * including nested objects and array mutations. Events are dispatched to the\n * provided event target for each change.\n *\n * Note: This is typically called internally by createEventTarget with observe: true.\n * You usually don't need to call this directly.\n *\n * @template T - The object type being observed.\n * @param target - The object to observe.\n * @param eventTarget - The event target to dispatch change events to.\n * @param options - Optional configuration for observation behavior.\n * @returns A proxied version of the target that dispatches events on changes.\n *\n * @example Direct usage (advanced)\n * ```typescript\n * import { createEventTarget, createObservableProxy } from 'event-emission';\n *\n * type State = { count: number };\n * const eventTarget = createEventTarget<ObservableEventMap<State>>();\n * const original = { count: 0 };\n *\n * const state = createObservableProxy(original, eventTarget, {\n * deep: true,\n * cloneStrategy: 'path',\n * });\n *\n * eventTarget.addEventListener('update', (event) => {\n * console.log('State changed:', event.detail);\n * });\n *\n * state.count = 1; // Triggers 'update' and 'update:count' events\n * ```\n *\n * @example Typical usage via createEventTarget\n * ```typescript\n * const state = createEventTarget({ count: 0 }, { observe: true });\n *\n * state.addEventListener('update:count', (event) => {\n * console.log('Count changed to:', event.detail.value);\n * });\n *\n * state.count = 1; // Triggers the event\n * ```\n */\nexport function createObservableProxy<T extends object>(\n target: T,\n eventTarget: EventTargetLike<ObservableEventMap<T>>,\n options?: ObserveOptions,\n): T {\n const resolvedOptions: Required<ObserveOptions> = {\n deep: options?.deep ?? true,\n cloneStrategy: options?.cloneStrategy ?? 'path',\n };\n\n const context: ProxyContext<T> = {\n eventTarget,\n originalRoot: target, // Keep reference to original, never the proxy\n options: resolvedOptions,\n };\n\n const proxy = createObservableProxyInternal(target, '', context);\n\n // Set up event forwarding if target is already an EventTarget\n if (isEventTarget(target)) {\n setupEventForwarding(target as unknown as MinimalEventTarget, eventTarget);\n }\n\n return proxy;\n}\n\n/* eslint-enable @typescript-eslint/no-unsafe-assignment */\n/* eslint-enable @typescript-eslint/no-redundant-type-constituents */\n",
|
|
8
|
+
"import { BufferOverflowError } from './errors';\nimport {\n createObservableProxy,\n type ObservableEventMap,\n type ObserveOptions,\n} from './observe';\nimport { SymbolObservable } from './symbols';\nimport type {\n AsyncIteratorOptions,\n EventfulEvent,\n EventTargetLike,\n Listener,\n Observer,\n WildcardEvent,\n WildcardListener,\n} from './types';\n\n/**\n * Check if a pattern matches a wildcard pattern.\n */\nfunction matchesWildcard(eventType: string, pattern: string): boolean {\n if (pattern === '*') return true;\n if (pattern.endsWith(':*')) {\n const namespace = pattern.slice(0, -2);\n return eventType.startsWith(namespace + ':');\n }\n return false;\n}\n\n/**\n * Options for createEventTarget.\n *\n * @property onListenerError - Custom error handler called when a listener throws.\n * If not provided, errors are emitted as 'error' events or re-thrown.\n */\nexport interface CreateEventTargetOptions {\n /** Custom error handler for listener errors. Receives event type and error. */\n onListenerError?: (type: string, error: unknown) => void;\n}\n\n/**\n * Options for createEventTarget with observe mode.\n * Extends CreateEventTargetOptions with proxy observation settings.\n *\n * @property observe - Must be true to enable observation mode.\n * @property deep - If true, nested objects are also observed (default: false).\n * @property cloneStrategy - Strategy for cloning previous state: 'shallow', 'deep', or 'path'.\n */\nexport interface CreateEventTargetObserveOptions\n extends CreateEventTargetOptions, ObserveOptions {\n /** Must be true to enable observation mode. */\n observe: true;\n}\n\n/**\n * Creates a type-safe event target with DOM EventTarget and TC39 Observable compatibility.\n *\n * @template E - Event map type where keys are event names and values are event detail types.\n * @param opts - Optional configuration options.\n * @returns A type-safe event target implementing EventTargetLike.\n *\n * @example\n * ```typescript\n * // Define event types\n * type Events = {\n * 'user:login': { userId: string };\n * 'user:logout': { reason: string };\n * };\n *\n * // Create event target\n * const events = createEventTarget<Events>();\n *\n * // Add typed listener\n * events.addEventListener('user:login', (event) => {\n * console.log(`User logged in: ${event.detail.userId}`);\n * });\n *\n * // Dispatch typed event\n * events.dispatchEvent({ type: 'user:login', detail: { userId: '123' } });\n * ```\n *\n * @overload Creates a basic event target\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic constraint requires any\nexport function createEventTarget<E extends Record<string, any>>(\n opts?: CreateEventTargetOptions,\n): EventTargetLike<E>;\n\n/**\n * Creates an observable proxy that dispatches events when properties change.\n *\n * @template T - The type of object to observe.\n * @param target - The object to wrap with an observable proxy.\n * @param opts - Configuration options with observe: true.\n * @returns The proxied object with EventTargetLike methods mixed in.\n *\n * @example\n * ```typescript\n * // Create observable state\n * const state = createEventTarget({ count: 0, user: { name: 'Alice' } }, {\n * observe: true,\n * deep: true,\n * });\n *\n * // Listen for any update\n * state.addEventListener('update', (event) => {\n * console.log('State changed:', event.detail.current);\n * });\n *\n * // Listen for specific property changes\n * state.addEventListener('update:count', (event) => {\n * console.log('Count changed to:', event.detail.value);\n * });\n *\n * // Mutations trigger events automatically\n * state.count = 1; // Triggers 'update' and 'update:count'\n * state.user.name = 'Bob'; // Triggers 'update' and 'update:user.name'\n * ```\n *\n * @overload Wraps an object with a Proxy that dispatches events on mutations\n */\nexport function createEventTarget<T extends object>(\n target: T,\n opts: CreateEventTargetObserveOptions,\n): T & EventTargetLike<ObservableEventMap<T>>;\n\n/**\n * Creates a type-safe event target with DOM EventTarget and TC39 Observable compatibility.\n *\n * This is the main factory function for creating event emitters. It supports two modes:\n *\n * 1. **Basic Mode**: Creates a standalone event target for pub/sub messaging.\n * 2. **Observe Mode**: Wraps an object with a Proxy that automatically dispatches\n * events when properties are modified.\n *\n * Listener errors are handled via 'error' event: if a listener throws,\n * an 'error' event is emitted. If no 'error' listener is registered,\n * the error is re-thrown (Node.js behavior).\n *\n * @param targetOrOpts - Either the object to observe, or configuration options.\n * @param opts - Configuration options when first argument is an object to observe.\n * @returns Either an EventTargetLike or a proxied object with EventTargetLike methods.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic constraint requires any\nexport function createEventTarget<T extends object, E extends Record<string, any>>(\n targetOrOpts?: T | CreateEventTargetOptions,\n opts?: CreateEventTargetObserveOptions,\n): EventTargetLike<E> | (T & EventTargetLike<ObservableEventMap<T>>) {\n // Handle observe mode - opts.observe must be explicitly true\n if (opts?.observe === true && targetOrOpts && typeof targetOrOpts === 'object') {\n const target = targetOrOpts as T;\n const eventTarget = createEventTargetInternal<ObservableEventMap<T>>({\n onListenerError: opts.onListenerError,\n });\n\n const proxy = createObservableProxy(target, eventTarget, {\n deep: opts.deep,\n cloneStrategy: opts.cloneStrategy,\n });\n\n // Copy eventTarget methods onto the proxy\n // Use defineProperty to avoid triggering proxy traps\n const methodNames = [\n 'addEventListener',\n 'removeEventListener',\n 'dispatchEvent',\n 'clear',\n 'once',\n 'removeAllListeners',\n 'pipe',\n 'addWildcardListener',\n 'removeWildcardListener',\n 'complete',\n 'subscribe',\n 'toObservable',\n 'events',\n ] as const;\n\n for (const name of methodNames) {\n Object.defineProperty(proxy, name, {\n value: eventTarget[name],\n writable: false,\n enumerable: false,\n configurable: true,\n });\n }\n\n // Add completed getter\n Object.defineProperty(proxy, 'completed', {\n get: () => eventTarget.completed,\n enumerable: false,\n configurable: true,\n });\n\n return proxy as T & EventTargetLike<ObservableEventMap<T>>;\n }\n\n // Original behavior\n return createEventTargetInternal<E>(\n targetOrOpts as CreateEventTargetOptions | undefined,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic constraint requires any\nfunction createEventTargetInternal<E extends Record<string, any>>(\n opts?: CreateEventTargetOptions,\n): EventTargetLike<E> {\n const listeners = new Map<string, Set<Listener<E[keyof E]>>>();\n const wildcardListeners = new Set<WildcardListener<E>>();\n let isCompleted = false;\n const completionCallbacks = new Set<() => void>();\n\n // Helper to handle listener errors: emit 'error' event or re-throw if no listener\n const handleListenerError = (eventType: string, error: unknown) => {\n // Prevent infinite recursion if 'error' listener itself throws\n if (eventType === 'error') return;\n\n // If custom error handler provided, use it\n if (opts?.onListenerError) {\n opts.onListenerError(eventType, error);\n return;\n }\n\n const errorListeners = listeners.get('error');\n if (errorListeners && errorListeners.size > 0) {\n // Emit 'error' event with the error as detail\n for (const rec of Array.from(errorListeners)) {\n try {\n void rec.fn({ type: 'error', detail: error } as EventfulEvent<E[keyof E]>);\n } catch {\n // Swallow errors from error handlers to prevent infinite loops\n }\n if (rec.once) errorListeners.delete(rec);\n }\n } else {\n // No 'error' listener - re-throw (Node.js behavior)\n throw error;\n }\n };\n\n const notifyWildcardListeners = (eventType: string, detail: E[keyof E]) => {\n if (wildcardListeners.size === 0) return;\n\n for (const rec of Array.from(wildcardListeners)) {\n if (!matchesWildcard(eventType, rec.pattern)) continue;\n\n const wildcardEvent: WildcardEvent<E> = {\n type: rec.pattern,\n originalType: eventType as keyof E & string,\n detail,\n };\n\n try {\n const res = rec.fn(wildcardEvent);\n if (res && typeof res.then === 'function') {\n res.catch((error) => {\n try {\n handleListenerError(eventType, error);\n } catch (rethrown) {\n // Re-throw async errors via queueMicrotask to preserve stack trace\n queueMicrotask(() => {\n throw rethrown;\n });\n }\n });\n }\n } catch (error) {\n handleListenerError(eventType, error);\n } finally {\n if (rec.once) wildcardListeners.delete(rec);\n }\n }\n };\n\n const addEventListener: EventTargetLike<E>['addEventListener'] = (\n type,\n listener,\n options,\n ) => {\n if (isCompleted) {\n // Return no-op unsubscribe if already completed\n return () => {};\n }\n\n const opts2 = options ?? {};\n const record: Listener<E[keyof E]> = {\n fn: listener as Listener<E[keyof E]>['fn'],\n once: opts2.once,\n signal: opts2.signal,\n };\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(record);\n const unsubscribe = () => {\n const setNow = listeners.get(type);\n setNow?.delete(record);\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n };\n if (opts2.signal) {\n const onAbort = () => unsubscribe();\n record.abortHandler = onAbort;\n opts2.signal.addEventListener('abort', onAbort, { once: true });\n if (opts2.signal.aborted) onAbort();\n }\n return unsubscribe;\n };\n\n const addWildcardListener: EventTargetLike<E>['addWildcardListener'] = (\n pattern,\n listener,\n options,\n ) => {\n if (isCompleted) return () => {};\n\n const opts2 = options ?? {};\n const record: WildcardListener<E> = {\n fn: listener,\n pattern,\n once: opts2.once,\n signal: opts2.signal,\n };\n wildcardListeners.add(record);\n\n const unsubscribe = () => {\n wildcardListeners.delete(record);\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n };\n\n if (opts2.signal) {\n const onAbort = () => unsubscribe();\n record.abortHandler = onAbort;\n opts2.signal.addEventListener('abort', onAbort, { once: true });\n if (opts2.signal.aborted) onAbort();\n }\n\n return unsubscribe;\n };\n\n const removeWildcardListener: EventTargetLike<E>['removeWildcardListener'] = (\n pattern,\n listener,\n ) => {\n for (const record of wildcardListeners) {\n if (record.pattern === pattern && record.fn === listener) {\n wildcardListeners.delete(record);\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n break;\n }\n }\n };\n\n const dispatchEvent: EventTargetLike<E>['dispatchEvent'] = (event) => {\n if (isCompleted) return false;\n\n // Notify wildcard listeners first (no overhead if none registered)\n notifyWildcardListeners(event.type, event.detail as E[keyof E]);\n\n const set = listeners.get(event.type);\n if (!set || set.size === 0) return true;\n for (const rec of Array.from(set)) {\n try {\n const res = rec.fn(event as EventfulEvent<E[keyof E]>);\n if (res && typeof res.then === 'function') {\n res.catch((error) => {\n try {\n handleListenerError(event.type, error);\n } catch (rethrown) {\n // Re-throw async errors via queueMicrotask to preserve stack trace\n queueMicrotask(() => {\n throw rethrown;\n });\n }\n });\n }\n } catch (error) {\n handleListenerError(event.type, error);\n } finally {\n if (rec.once) set.delete(rec);\n }\n }\n return true;\n };\n\n const removeEventListener: EventTargetLike<E>['removeEventListener'] = (\n type,\n listener,\n ) => {\n const set = listeners.get(type);\n if (!set) return;\n\n for (const record of set) {\n if (record.fn === listener) {\n set.delete(record);\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n break;\n }\n }\n };\n\n const clear = () => {\n // Clean up abort handlers before clearing\n for (const set of listeners.values()) {\n for (const record of set) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n set.clear();\n }\n listeners.clear();\n\n // Clear wildcard listeners too\n for (const record of wildcardListeners) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n wildcardListeners.clear();\n // Note: clear() does NOT trigger completion callbacks or set isCompleted\n // Use complete() for that\n };\n\n // New ergonomics\n\n const once: EventTargetLike<E>['once'] = (type, listener, options) => {\n return addEventListener(type, listener, { ...options, once: true });\n };\n\n const removeAllListeners: EventTargetLike<E>['removeAllListeners'] = (type) => {\n if (type !== undefined) {\n const set = listeners.get(type);\n if (set) {\n // Clean up abort handlers before clearing\n for (const record of set) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n set.clear();\n listeners.delete(type);\n }\n } else {\n // Clear all listeners for all types\n for (const set of listeners.values()) {\n for (const record of set) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n set.clear();\n }\n listeners.clear();\n\n // Clear wildcard listeners too\n for (const record of wildcardListeners) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n wildcardListeners.clear();\n }\n };\n\n /**\n * Pipe events from this emitter to another target.\n *\n * **Limitation**: Only forwards events for types that already have listeners\n * when pipe() is called. Events for types registered afterward won't be piped.\n *\n * To ensure all events are piped, add at least one listener for each event type\n * before calling pipe().\n */\n const pipe: EventTargetLike<E>['pipe'] = (target, mapFn) => {\n if (isCompleted) {\n return () => {};\n }\n\n const unsubscribes: Array<() => void> = [];\n\n // Subscribe to all current and future events by listening to each event type\n // We need to track event types we've subscribed to\n const subscribedTypes = new Set<string>();\n\n const subscribeToType = (type: string) => {\n if (subscribedTypes.has(type)) return;\n subscribedTypes.add(type);\n\n const unsub = addEventListener(type as keyof E & string, (event) => {\n if (mapFn) {\n const mapped = mapFn(event);\n if (mapped !== null) {\n // Type assertion via unknown is needed because mapFn output type matches target's event map\n target.dispatchEvent(\n mapped as unknown as Parameters<typeof target.dispatchEvent>[0],\n );\n }\n } else {\n // Type assertion via unknown is needed because caller ensures E and T are compatible\n target.dispatchEvent(\n event as unknown as Parameters<typeof target.dispatchEvent>[0],\n );\n }\n });\n unsubscribes.push(unsub);\n };\n\n // Subscribe to all existing event types\n for (const type of listeners.keys()) {\n subscribeToType(type);\n }\n\n // Clean up on completion\n const completionUnsub = () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n completionCallbacks.add(completionUnsub);\n\n return () => {\n completionCallbacks.delete(completionUnsub);\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n };\n\n const complete = () => {\n if (isCompleted) return;\n isCompleted = true;\n\n // Trigger completion callbacks (pipes, subscriptions)\n for (const cb of completionCallbacks) {\n try {\n cb();\n } catch (err) {\n // Completion callback errors use handleListenerError\n // Use 'complete' as the event type for these errors\n try {\n handleListenerError('complete', err);\n } catch {\n // Swallow if no error listener\n }\n }\n }\n completionCallbacks.clear();\n\n // Clear all listeners\n for (const set of listeners.values()) {\n for (const record of set) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n set.clear();\n }\n listeners.clear();\n\n // Clear wildcard listeners\n for (const record of wildcardListeners) {\n if (record.signal && record.abortHandler) {\n record.signal.removeEventListener('abort', record.abortHandler);\n }\n }\n wildcardListeners.clear();\n };\n\n // Observable interop\n const subscribe: EventTargetLike<E>['subscribe'] = (\n type,\n observerOrNext,\n error,\n completeHandler,\n ) => {\n let observer: Observer<EventfulEvent<E[keyof E & string]>>;\n\n if (typeof observerOrNext === 'function') {\n observer = {\n next: observerOrNext as (value: EventfulEvent<E[keyof E & string]>) => void,\n error,\n complete: completeHandler,\n };\n } else {\n observer = (observerOrNext ?? {}) as Observer<EventfulEvent<E[keyof E & string]>>;\n }\n\n let closed = false;\n\n if (isCompleted) {\n // Already completed, call complete immediately\n if (observer.complete) {\n try {\n observer.complete();\n } catch {\n // Swallow\n }\n }\n return {\n unsubscribe: () => {\n closed = true;\n },\n get closed() {\n return closed || isCompleted;\n },\n };\n }\n\n const unsub = addEventListener(type, (event) => {\n if (closed) return;\n if (observer.next) {\n try {\n observer.next(event as EventfulEvent<E[keyof E & string]>);\n } catch (err) {\n if (observer.error) {\n try {\n observer.error(err);\n } catch {\n // Swallow\n }\n }\n }\n }\n });\n\n // Track completion callback\n const onComplete = () => {\n if (closed) return;\n closed = true;\n if (observer.complete) {\n try {\n observer.complete();\n } catch {\n // Swallow\n }\n }\n };\n completionCallbacks.add(onComplete);\n\n return {\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n completionCallbacks.delete(onComplete);\n unsub();\n },\n get closed() {\n return closed || isCompleted;\n },\n };\n };\n\n const toObservable: EventTargetLike<E>['toObservable'] = () => {\n const observable = {\n subscribe: (\n observerOrNext?:\n | Observer<EventfulEvent<E[keyof E]>>\n | ((value: EventfulEvent<E[keyof E]>) => void),\n errorFn?: (error: unknown) => void,\n completeFn?: () => void,\n ) => {\n // For the full observable, we listen to all events via wildcard\n let next: ((value: EventfulEvent<E[keyof E]>) => void) | undefined;\n let error: ((error: unknown) => void) | undefined;\n let completeCallback: (() => void) | undefined;\n\n if (typeof observerOrNext === 'function') {\n next = observerOrNext;\n error = errorFn;\n completeCallback = completeFn;\n } else if (observerOrNext) {\n next = observerOrNext.next?.bind(observerOrNext);\n error = observerOrNext.error?.bind(observerOrNext);\n completeCallback = observerOrNext.complete?.bind(observerOrNext);\n }\n\n let closed = false;\n\n if (isCompleted) {\n if (completeCallback) {\n try {\n completeCallback();\n } catch {\n // Swallow\n }\n }\n return {\n unsubscribe: () => {\n closed = true;\n },\n get closed() {\n return true;\n },\n };\n }\n\n const wildcardListener = (event: WildcardEvent<E>) => {\n if (closed) return;\n if (next) {\n try {\n next({ type: event.originalType, detail: event.detail });\n } catch (err) {\n if (error) {\n try {\n error(err);\n } catch {\n // Swallow\n }\n }\n }\n }\n };\n\n const unsubscribe = addWildcardListener('*', wildcardListener);\n\n const onComplete = () => {\n if (closed) return;\n closed = true;\n if (completeCallback) {\n try {\n completeCallback();\n } catch {\n // Swallow\n }\n }\n };\n completionCallbacks.add(onComplete);\n\n return {\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n unsubscribe();\n completionCallbacks.delete(onComplete);\n },\n get closed() {\n return closed || isCompleted;\n },\n };\n },\n [SymbolObservable]() {\n return observable;\n },\n };\n return observable;\n };\n\n // Async iterator\n function events<K extends keyof E & string>(\n type: K,\n options?: AsyncIteratorOptions,\n ): AsyncIterableIterator<EventfulEvent<E[K]>> {\n // If already completed, return an iterator that immediately yields done\n if (isCompleted) {\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n next(): Promise<IteratorResult<EventfulEvent<E[K]>>> {\n return Promise.resolve({\n value: undefined as unknown as EventfulEvent<E[K]>,\n done: true,\n });\n },\n return(): Promise<IteratorResult<EventfulEvent<E[K]>>> {\n return Promise.resolve({\n value: undefined as unknown as EventfulEvent<E[K]>,\n done: true,\n });\n },\n };\n }\n\n const signal = options?.signal;\n const bufferSize = options?.bufferSize ?? Infinity;\n const overflowStrategy = options?.overflowStrategy ?? 'drop-oldest';\n\n const buffer: Array<EventfulEvent<E[K]>> = [];\n let resolve: ((result: IteratorResult<EventfulEvent<E[K]>>) => void) | null = null;\n let done = false;\n let hasOverflow = false;\n\n const unsub = addEventListener(type, (event) => {\n if (done) return;\n\n if (resolve) {\n // Someone is waiting, resolve immediately\n const r = resolve;\n resolve = null;\n r({ value: event, done: false });\n } else {\n // Buffer the event\n if (buffer.length >= bufferSize && bufferSize !== Infinity) {\n switch (overflowStrategy) {\n case 'drop-oldest':\n buffer.shift();\n buffer.push(event);\n break;\n case 'drop-latest':\n // Don't add the new event\n break;\n case 'throw':\n unsub();\n completionCallbacks.delete(onComplete);\n done = true;\n hasOverflow = true;\n return;\n }\n } else {\n buffer.push(event);\n }\n }\n });\n\n // Handle completion\n const onComplete = () => {\n done = true;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as unknown as EventfulEvent<E[K]>, done: true });\n }\n };\n completionCallbacks.add(onComplete);\n\n // Handle abort signal\n let onAbort: (() => void) | null = null;\n if (signal) {\n onAbort = () => {\n done = true;\n completionCallbacks.delete(onComplete);\n unsub();\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as unknown as EventfulEvent<E[K]>, done: true });\n }\n };\n signal.addEventListener('abort', onAbort, { once: true });\n if (signal.aborted) onAbort();\n }\n\n const iterator: AsyncIterableIterator<EventfulEvent<E[K]>> = {\n [Symbol.asyncIterator]() {\n return this;\n },\n async next(): Promise<IteratorResult<EventfulEvent<E[K]>>> {\n // Drain buffered events first, even if done\n if (buffer.length > 0) {\n return { value: buffer.shift()!, done: false };\n }\n\n // After buffer is drained, check for overflow error\n if (hasOverflow) {\n hasOverflow = false;\n throw new BufferOverflowError(type, bufferSize);\n }\n\n if (done) {\n return { value: undefined as unknown as EventfulEvent<E[K]>, done: true };\n }\n\n // Prevent concurrent next() calls - if there's already a pending promise, reject\n if (resolve !== null) {\n return Promise.reject(\n new Error(\n 'Concurrent calls to next() are not supported on this async iterator',\n ),\n );\n }\n\n // Wait for next event\n return new Promise<IteratorResult<EventfulEvent<E[K]>>>((_resolve, _reject) => {\n if (done) {\n _resolve({ value: undefined as unknown as EventfulEvent<E[K]>, done: true });\n return;\n }\n if (hasOverflow) {\n hasOverflow = false;\n _reject(new BufferOverflowError(type, bufferSize));\n return;\n }\n resolve = _resolve;\n });\n },\n return(): Promise<IteratorResult<EventfulEvent<E[K]>>> {\n // Resolve any pending promise before cleanup\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as unknown as EventfulEvent<E[K]>, done: true });\n }\n\n done = true;\n completionCallbacks.delete(onComplete);\n unsub();\n\n // Clean up abort signal listener\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n\n return Promise.resolve({\n value: undefined as unknown as EventfulEvent<E[K]>,\n done: true,\n });\n },\n };\n\n return iterator;\n }\n\n const target: EventTargetLike<E> = {\n addEventListener,\n removeEventListener,\n dispatchEvent,\n clear,\n once,\n removeAllListeners,\n pipe,\n addWildcardListener,\n removeWildcardListener,\n complete,\n get completed() {\n return isCompleted;\n },\n subscribe,\n toObservable,\n events,\n };\n\n // Add Symbol.observable - return an observable that emits all events from all types\n (target as EventTargetLike<E> & { [key: symbol]: unknown })[SymbolObservable] = () => {\n return toObservable();\n };\n\n return target;\n}\n",
|
|
9
|
+
"import { createEventTarget } from './factory';\nimport type {\n DOMEventLike,\n DOMEventTargetLike,\n EventTargetLike,\n InteropOptions,\n} from './types';\n\n/**\n * Forward events from an Eventful target to a DOM EventTarget.\n *\n * This function sets up a wildcard listener on the source that forwards\n * all events to the DOM target using dispatchEvent.\n *\n * @template E - Event map type of the source.\n * @param source - The Eventful source to forward events from.\n * @param target - The DOM EventTarget to forward events to.\n * @param options - Optional configuration including abort signal.\n * @returns An unsubscribe function that stops forwarding when called.\n *\n * @example\n * ```typescript\n * const events = createEventTarget<{ click: { x: number; y: number } }>();\n * const button = document.getElementById('my-button');\n *\n * // Forward all events to the DOM button\n * const unsubscribe = forwardToEventTarget(events, button);\n *\n * // Now when you dispatch events on the Eventful target,\n * // they will also be dispatched on the DOM element\n * events.dispatchEvent({ type: 'click', detail: { x: 100, y: 200 } });\n *\n * // Stop forwarding\n * unsubscribe();\n * ```\n */\nexport function forwardToEventTarget<E extends Record<string, unknown>>(\n source: EventTargetLike<E>,\n target: DOMEventTargetLike,\n options?: InteropOptions,\n): () => void {\n const unsubscribe = source.addWildcardListener(\n '*',\n (event) => {\n // Create a DOM-like event object\n const domEvent: DOMEventLike = {\n type: event.originalType,\n detail: event.detail,\n };\n target.dispatchEvent(domEvent);\n },\n options,\n );\n\n return unsubscribe;\n}\n\n/**\n * Options for creating an Eventful target from a DOM EventTarget.\n */\nexport interface FromEventTargetOptions extends InteropOptions {\n /**\n * Callback invoked when a listener throws an error.\n * If not provided, errors will be re-thrown.\n */\n onListenerError?: (type: string, error: unknown) => void;\n}\n\n/**\n * Create an Eventful target that listens to events from a DOM EventTarget.\n *\n * This function wraps a DOM EventTarget and forwards specified events to a new\n * Eventful target, enabling type-safe event handling and TC39 Observable compatibility.\n *\n * @template E - Event map type where keys are event names and values are event detail types.\n * @param domTarget - The DOM EventTarget to listen to events from.\n * @param eventTypes - Array of event type names to forward from the DOM target.\n * @param options - Optional configuration including abort signal and error handler.\n * @returns An Eventful target with a destroy() method for cleanup.\n *\n * @example Basic usage with DOM element\n * ```typescript\n * const button = document.getElementById('my-button');\n *\n * type ButtonEvents = {\n * click: MouseEvent;\n * focus: FocusEvent;\n * };\n *\n * const events = fromEventTarget<ButtonEvents>(button, ['click', 'focus']);\n *\n * // Type-safe event handling\n * events.addEventListener('click', (event) => {\n * console.log('Button clicked!', event.detail);\n * });\n *\n * // Clean up when done\n * events.destroy();\n * ```\n *\n * @example With AbortSignal for automatic cleanup\n * ```typescript\n * const controller = new AbortController();\n * const events = fromEventTarget<{ input: InputEvent }>(\n * textField,\n * ['input'],\n * { signal: controller.signal }\n * );\n *\n * // Later, abort to clean up all listeners\n * controller.abort();\n * ```\n *\n * @example Using TC39 Observable features\n * ```typescript\n * const events = fromEventTarget<{ scroll: Event }>(window, ['scroll']);\n *\n * // Subscribe with observer pattern\n * const subscription = events.subscribe({\n * next: (event) => console.log('Scrolled!'),\n * complete: () => console.log('Done'),\n * });\n *\n * // Or use async iteration\n * for await (const event of events.events('scroll')) {\n * console.log('Scroll event:', event);\n * }\n * ```\n */\nexport function fromEventTarget<E extends Record<string, unknown>>(\n domTarget: DOMEventTargetLike,\n eventTypes: Array<keyof E & string>,\n options?: FromEventTargetOptions,\n): EventTargetLike<E> & { destroy: () => void } {\n const eventful = createEventTarget<E>({\n onListenerError: options?.onListenerError,\n });\n\n const handlers = new Map<string, (event: DOMEventLike) => void>();\n\n for (const type of eventTypes) {\n const handler = (event: DOMEventLike) => {\n eventful.dispatchEvent({\n type,\n detail: (event.detail ?? event) as E[typeof type],\n });\n };\n handlers.set(type, handler);\n domTarget.addEventListener(type, handler);\n }\n\n // Track abort handler for cleanup\n let onAbort: (() => void) | null = null;\n\n // Handle abort signal\n if (options?.signal) {\n onAbort = () => {\n for (const [type, handler] of handlers) {\n domTarget.removeEventListener(type, handler);\n }\n handlers.clear();\n eventful.complete();\n };\n options.signal.addEventListener('abort', onAbort, { once: true });\n if (options.signal.aborted) onAbort();\n }\n\n return {\n addEventListener: eventful.addEventListener,\n removeEventListener: eventful.removeEventListener,\n dispatchEvent: eventful.dispatchEvent,\n clear: eventful.clear,\n once: eventful.once,\n removeAllListeners: eventful.removeAllListeners,\n pipe: eventful.pipe,\n addWildcardListener: eventful.addWildcardListener,\n removeWildcardListener: eventful.removeWildcardListener,\n subscribe: eventful.subscribe,\n toObservable: eventful.toObservable,\n complete: eventful.complete,\n get completed() {\n return eventful.completed;\n },\n events: eventful.events,\n destroy: () => {\n // Clean up abort signal listener to prevent memory leak\n if (options?.signal && onAbort) {\n options.signal.removeEventListener('abort', onAbort);\n }\n for (const [type, handler] of handlers) {\n domTarget.removeEventListener(type, handler);\n }\n handlers.clear();\n eventful.complete();\n },\n };\n}\n\n/**\n * Pipe events from one Eventful target to another.\n *\n * This function sets up a wildcard listener on the source that forwards all\n * events to the target. Useful for composing event streams, creating event\n * buses, or building hierarchical event systems.\n *\n * @template E - Event map type shared by both source and target.\n * @param source - The Eventful target to pipe events from.\n * @param target - The Eventful target to pipe events to.\n * @param options - Optional configuration including abort signal.\n * @returns An unsubscribe function that stops piping when called.\n *\n * @example Basic event piping\n * ```typescript\n * const userEvents = createEventTarget<{ login: { userId: string } }>();\n * const globalBus = createEventTarget<{ login: { userId: string } }>();\n *\n * // Pipe all user events to global bus\n * const unsubscribe = pipe(userEvents, globalBus);\n *\n * // Events on userEvents now also dispatch on globalBus\n * globalBus.addEventListener('login', (event) => {\n * console.log('User logged in:', event.detail.userId);\n * });\n *\n * userEvents.dispatchEvent({ type: 'login', detail: { userId: '123' } });\n *\n * // Stop piping\n * unsubscribe();\n * ```\n *\n * @example With AbortSignal for automatic cleanup\n * ```typescript\n * const controller = new AbortController();\n * pipe(source, target, { signal: controller.signal });\n *\n * // Later, abort to stop piping\n * controller.abort();\n * ```\n *\n * @example Creating an event hierarchy\n * ```typescript\n * const componentA = createEventTarget<Events>();\n * const componentB = createEventTarget<Events>();\n * const appBus = createEventTarget<Events>();\n *\n * // Both components pipe to the app bus\n * pipe(componentA, appBus);\n * pipe(componentB, appBus);\n *\n * // Listen to all events at the app level\n * appBus.addWildcardListener('*', (event) => {\n * console.log('App event:', event.originalType, event.detail);\n * });\n * ```\n */\nexport function pipe<E extends Record<string, unknown>>(\n source: EventTargetLike<E>,\n target: EventTargetLike<E>,\n options?: InteropOptions,\n): () => void {\n return source.addWildcardListener(\n '*',\n (event) => {\n target.dispatchEvent({\n type: event.originalType,\n detail: event.detail as E[keyof E & string],\n });\n },\n options,\n );\n}\n",
|
|
10
|
+
"import { createEventTarget } from './factory';\nimport { SymbolObservable } from './symbols';\nimport type {\n AddEventListenerOptionsLike,\n EventfulEvent,\n EventsIteratorOptions,\n EventTargetLike,\n ObservableLike,\n Observer,\n Subscription,\n WildcardEvent,\n} from './types';\n\n/**\n * Abstract base class for typed event emitters with DOM EventTarget\n * and TC39 Observable compatibility.\n *\n * Extend this class to create custom event emitters with typed events.\n * The class provides:\n * - DOM EventTarget compatible API (addEventListener, removeEventListener, dispatchEvent)\n * - TC39 Observable interop (subscribe, Symbol.observable)\n * - Async iteration support (events() method)\n * - Wildcard listeners for namespaced events\n * - Lifecycle management (complete(), completed)\n *\n * Listener errors are handled via 'error' event: if a listener throws,\n * an 'error' event is emitted. If no 'error' listener is registered,\n * the error is re-thrown (Node.js behavior).\n *\n * @template E - Event map type where keys are event names and values are event detail types.\n *\n * @example Basic usage\n * ```typescript\n * // Define your emitter with typed events\n * class UserService extends Eventful<{\n * 'user:created': { id: string; name: string };\n * 'user:deleted': { id: string };\n * error: Error;\n * }> {\n * createUser(name: string) {\n * const id = crypto.randomUUID();\n * // ... create user logic\n * this.dispatchEvent({ type: 'user:created', detail: { id, name } });\n * }\n * }\n *\n * const service = new UserService();\n * service.addEventListener('user:created', (event) => {\n * console.log(`Created user: ${event.detail.name}`);\n * });\n * ```\n *\n * @example TC39 Observable interop\n * ```typescript\n * const service = new UserService();\n *\n * // Subscribe to all events\n * service.subscribe({\n * next: (event) => console.log(event.type, event.detail),\n * complete: () => console.log('Service completed'),\n * });\n *\n * // Use with RxJS or other Observable libraries\n * import { from } from 'rxjs';\n * const observable = from(service);\n * ```\n *\n * @example Async iteration\n * ```typescript\n * const service = new UserService();\n *\n * // Iterate over events as async iterator\n * for await (const event of service.events('user:created')) {\n * console.log(`User created: ${event.detail.name}`);\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic constraint requires any for flexibility\nexport abstract class Eventful<E extends Record<string, any>> {\n readonly #target: EventTargetLike<E>;\n\n constructor() {\n this.#target = createEventTarget<E>();\n }\n\n // ==========================================================================\n // DOM EventTarget Methods\n // ==========================================================================\n\n /**\n * Adds an event listener for the specified event type.\n * Returns an unsubscribe function for convenience.\n */\n addEventListener<K extends keyof E & string>(\n type: K,\n listener: (event: EventfulEvent<E[K]>) => void | Promise<void>,\n options?: AddEventListenerOptionsLike,\n ): () => void {\n return this.#target.addEventListener(type, listener, options);\n }\n\n /**\n * Removes an event listener for the specified event type.\n */\n removeEventListener<K extends keyof E & string>(\n type: K,\n listener: (event: EventfulEvent<E[K]>) => void | Promise<void>,\n ): void {\n this.#target.removeEventListener(type, listener);\n }\n\n /**\n * Dispatches an event to all registered listeners.\n * Returns false if the emitter has been completed, true otherwise.\n */\n dispatchEvent<K extends keyof E & string>(event: EventfulEvent<E[K]>): boolean {\n return this.#target.dispatchEvent(event);\n }\n\n // ==========================================================================\n // Convenience Methods\n // ==========================================================================\n\n /**\n * Adds a one-time listener for the specified event type.\n * Returns an unsubscribe function.\n */\n once<K extends keyof E & string>(\n type: K,\n listener: (event: EventfulEvent<E[K]>) => void | Promise<void>,\n options?: Omit<AddEventListenerOptionsLike, 'once'>,\n ): () => void {\n return this.#target.once(type, listener, options);\n }\n\n /**\n * Removes all listeners, or those of the specified event type.\n */\n removeAllListeners<K extends keyof E & string>(type?: K): void {\n this.#target.removeAllListeners(type);\n }\n\n /**\n * Removes all listeners. Does not trigger completion.\n */\n clear(): void {\n this.#target.clear();\n }\n\n /**\n * Pipe events from this emitter to another target.\n * Note: Only forwards events for types that have listeners when pipe() is called.\n * Events for types registered after piping won't be forwarded automatically.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic constraint requires any\n pipe<T extends Record<string, any>>(\n target: EventTargetLike<T>,\n mapFn?: <K extends keyof E & string>(\n event: EventfulEvent<E[K]>,\n ) => EventfulEvent<T[keyof T & string]> | null,\n ): () => void {\n return this.#target.pipe(target, mapFn);\n }\n\n // ==========================================================================\n // Wildcard Support\n // ==========================================================================\n\n /**\n * Adds a wildcard listener that receives events matching the pattern.\n * Use '*' for all events, or 'namespace:*' for namespaced events.\n */\n addWildcardListener(\n pattern: '*' | `${string}:*`,\n listener: (event: WildcardEvent<E>) => void | Promise<void>,\n options?: AddEventListenerOptionsLike,\n ): () => void {\n return this.#target.addWildcardListener(pattern, listener, options);\n }\n\n /**\n * Removes a wildcard listener.\n */\n removeWildcardListener(\n pattern: '*' | `${string}:*`,\n listener: (event: WildcardEvent<E>) => void | Promise<void>,\n ): void {\n this.#target.removeWildcardListener(pattern, listener);\n }\n\n // ==========================================================================\n // TC39 Observable Methods\n // ==========================================================================\n\n /**\n * Subscribes an observer to all events (untyped).\n */\n subscribe(\n observerOrNext:\n | Observer<EventfulEvent<E[keyof E]>>\n | ((value: EventfulEvent<E[keyof E]>) => void),\n ): Subscription;\n\n /**\n * Subscribes an observer to events of a specific type (typed).\n */\n subscribe<K extends keyof E & string>(\n type: K,\n observerOrNext?:\n | Observer<EventfulEvent<E[K]>>\n | ((value: EventfulEvent<E[K]>) => void),\n error?: (err: unknown) => void,\n completeHandler?: () => void,\n ): Subscription;\n\n /**\n * Implementation that handles both typed and untyped subscriptions.\n */\n subscribe<K extends keyof E & string>(\n typeOrObserver:\n | K\n | Observer<EventfulEvent<E[keyof E]>>\n | ((value: EventfulEvent<E[keyof E]>) => void),\n observerOrNext?:\n | Observer<EventfulEvent<E[K]>>\n | ((value: EventfulEvent<E[K]>) => void),\n error?: (err: unknown) => void,\n completeHandler?: () => void,\n ): Subscription {\n // Typed subscribe: first argument is a string event type\n if (typeof typeOrObserver === 'string') {\n return this.#target.subscribe(\n typeOrObserver,\n observerOrNext,\n error,\n completeHandler,\n );\n }\n\n // Untyped subscribe: first argument is a callback function\n if (typeof typeOrObserver === 'function') {\n return this.#target.toObservable().subscribe(typeOrObserver);\n }\n\n // Untyped subscribe: first argument is an observer object\n if (typeof typeOrObserver === 'object' && typeOrObserver !== null) {\n // Check if it looks like an Observer (has next/error/complete methods)\n const maybeObserver = typeOrObserver as Record<string, unknown>;\n if (\n typeof maybeObserver.next === 'function' ||\n typeof maybeObserver.error === 'function' ||\n typeof maybeObserver.complete === 'function'\n ) {\n return this.#target.toObservable().subscribe(typeOrObserver);\n }\n // Object without observer methods - treat as empty observer (no callbacks)\n return this.#target.toObservable().subscribe({});\n }\n\n // Fallback: should not reach here with proper TypeScript usage\n throw new Error(\n 'subscribe() requires a string event type, callback function, or observer object',\n );\n }\n\n /**\n * Returns an observable that emits all events.\n */\n toObservable(): ObservableLike<EventfulEvent<E[keyof E]>> {\n return this.#target.toObservable();\n }\n\n /**\n * Returns this observable for Symbol.observable interop.\n */\n [SymbolObservable](): ObservableLike<EventfulEvent<E[keyof E]>> {\n return this.toObservable();\n }\n\n // ==========================================================================\n // Lifecycle Methods\n // ==========================================================================\n\n /**\n * Marks the emitter as complete. Invokes complete() on all observable subscribers,\n * ends all async iterators, and suppresses further emits/dispatches.\n * Idempotent.\n */\n complete(): void {\n this.#target.complete();\n }\n\n /**\n * Returns true if the emitter has been completed.\n */\n get completed(): boolean {\n return this.#target.completed;\n }\n\n // ==========================================================================\n // Async Iterator Method\n // ==========================================================================\n\n /**\n * Returns an async iterator over events of the specified type.\n *\n * @param type - The event type to iterate over\n * @param options - Iterator options (signal, bufferSize, overflowStrategy)\n *\n * @example\n * ```typescript\n * for await (const event of emitter.events('foo')) {\n * console.log(event.detail);\n * }\n * ```\n */\n events<K extends keyof E & string>(\n type: K,\n options?: EventsIteratorOptions,\n ): AsyncIterableIterator<EventfulEvent<E[K]>> {\n return this.#target.events(type, options);\n }\n}\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "C000AD057E5BF10964756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* event-emission
|
|
3
|
+
*
|
|
4
|
+
* Lightweight typed event emitter with DOM EventTarget
|
|
5
|
+
* and TC39 Observable compatibility.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
export { SymbolObservable } from './symbols';
|
|
10
|
+
declare global {
|
|
11
|
+
interface SymbolConstructor {
|
|
12
|
+
readonly observable: symbol;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export type { AddEventListenerOptionsLike, AsyncIteratorOptions, DOMEventLike, DOMEventTargetLike, EventfulEvent, EventsIteratorOptions, EventTargetLike, InteropOptions, Listener, MinimalAbortSignal, ObservableLike, Observer, OverflowStrategy, Subscription, WildcardEvent, WildcardListener, } from './types';
|
|
16
|
+
export { BufferOverflowError } from './errors';
|
|
17
|
+
export type { CreateEventTargetObserveOptions, CreateEventTargetOptions, } from './factory';
|
|
18
|
+
export { createEventTarget } from './factory';
|
|
19
|
+
export type { ArrayMutationDetail, ArrayMutationMethod, ObservableEventMap, ObserveOptions, PropertyChangeDetail, } from './observe';
|
|
20
|
+
export { getOriginal, isObserved, ORIGINAL_TARGET, PROXY_MARKER, setupEventForwarding, } from './observe';
|
|
21
|
+
export type { FromEventTargetOptions } from './interop';
|
|
22
|
+
export { forwardToEventTarget, fromEventTarget, pipe } from './interop';
|
|
23
|
+
export { Eventful } from './eventful';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,iBAAiB;QACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B;CACF;AAGD,YAAY,EACV,2BAA2B,EAC3B,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,YAAY,EACV,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,YAAY,EACZ,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGxE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|