abxbus 2.4.26 → 2.4.27
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/dist/cjs/BaseEvent.d.ts +211 -0
- package/dist/cjs/{base_event.js → BaseEvent.js} +23 -23
- package/dist/cjs/BaseEvent.js.map +7 -0
- package/dist/cjs/EventBridge.d.ts +34 -0
- package/dist/cjs/EventBridge.js +295 -0
- package/dist/cjs/EventBridge.js.map +7 -0
- package/dist/cjs/EventBus.d.ts +125 -0
- package/dist/cjs/{event_bus.js → EventBus.js} +21 -21
- package/dist/cjs/EventBus.js.map +7 -0
- package/dist/cjs/EventBusMiddleware.d.ts +13 -0
- package/dist/cjs/EventBusMiddleware.js +17 -0
- package/dist/cjs/EventBusMiddleware.js.map +7 -0
- package/dist/cjs/EventHandler.d.ts +140 -0
- package/dist/cjs/{event_handler.js → EventHandler.js} +4 -4
- package/dist/cjs/EventHandler.js.map +7 -0
- package/dist/cjs/EventHistory.d.ts +45 -0
- package/dist/cjs/{event_history.js → EventHistory.js} +4 -4
- package/dist/cjs/EventHistory.js.map +7 -0
- package/dist/cjs/EventResult.d.ts +86 -0
- package/dist/cjs/{event_result.js → EventResult.js} +18 -16
- package/dist/cjs/EventResult.js.map +7 -0
- package/dist/cjs/HTTPEventBridge.d.ts +10 -0
- package/dist/cjs/HTTPEventBridge.js +37 -0
- package/dist/cjs/HTTPEventBridge.js.map +7 -0
- package/dist/cjs/JSONLEventBridge.d.ts +26 -0
- package/dist/cjs/{bridge_jsonl.js → JSONLEventBridge.js} +8 -8
- package/dist/cjs/JSONLEventBridge.js.map +7 -0
- package/dist/cjs/LockManager.d.ts +70 -0
- package/dist/cjs/{lock_manager.js → LockManager.js} +4 -4
- package/dist/cjs/LockManager.js.map +7 -0
- package/dist/cjs/NATSEventBridge.d.ts +20 -0
- package/dist/cjs/{bridge_nats.js → NATSEventBridge.js} +8 -8
- package/dist/cjs/NATSEventBridge.js.map +7 -0
- package/dist/cjs/OtelTracingMiddleware.d.ts +49 -0
- package/dist/cjs/{middleware_otel_tracing.js → OtelTracingMiddleware.js} +4 -4
- package/dist/cjs/OtelTracingMiddleware.js.map +7 -0
- package/dist/cjs/PostgresEventBridge.d.ts +31 -0
- package/dist/cjs/{bridge_postgres.js → PostgresEventBridge.js} +8 -8
- package/dist/cjs/PostgresEventBridge.js.map +7 -0
- package/dist/cjs/RedisEventBridge.d.ts +34 -0
- package/dist/cjs/{bridge_redis.js → RedisEventBridge.js} +8 -8
- package/dist/cjs/RedisEventBridge.js.map +7 -0
- package/dist/cjs/SQLiteEventBridge.d.ts +30 -0
- package/dist/cjs/{bridge_sqlite.js → SQLiteEventBridge.js} +8 -8
- package/dist/cjs/SQLiteEventBridge.js.map +7 -0
- package/dist/cjs/SocketEventBridge.d.ts +4 -0
- package/dist/cjs/SocketEventBridge.js +35 -0
- package/dist/cjs/SocketEventBridge.js.map +7 -0
- package/dist/cjs/bridge_ipc.d.ts +45 -0
- package/dist/cjs/bridges.d.ts +9 -49
- package/dist/cjs/bridges.js +16 -303
- package/dist/cjs/bridges.js.map +2 -2
- package/dist/cjs/events_suck.d.ts +2 -2
- package/dist/cjs/events_suck.js +4 -4
- package/dist/cjs/events_suck.js.map +2 -2
- package/dist/cjs/index.d.ts +15 -14
- package/dist/cjs/index.js +24 -24
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/logging.d.ts +2 -2
- package/dist/cjs/logging.js +7 -7
- package/dist/cjs/logging.js.map +2 -2
- package/dist/cjs/middlewares.d.ts +1 -13
- package/dist/cjs/middlewares.js.map +1 -1
- package/dist/cjs/types.d.ts +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/{base_event.js → BaseEvent.js} +4 -4
- package/dist/esm/BaseEvent.js.map +7 -0
- package/dist/esm/EventBridge.js +275 -0
- package/dist/esm/EventBridge.js.map +7 -0
- package/dist/esm/{event_bus.js → EventBus.js} +5 -5
- package/dist/esm/EventBus.js.map +7 -0
- package/dist/esm/EventBusMiddleware.js +1 -0
- package/dist/esm/EventBusMiddleware.js.map +7 -0
- package/dist/esm/{event_handler.js → EventHandler.js} +1 -1
- package/dist/esm/EventHandler.js.map +7 -0
- package/dist/esm/{event_history.js → EventHistory.js} +1 -1
- package/dist/esm/EventHistory.js.map +7 -0
- package/dist/esm/{event_result.js → EventResult.js} +7 -5
- package/dist/esm/EventResult.js.map +7 -0
- package/dist/esm/HTTPEventBridge.js +17 -0
- package/dist/esm/HTTPEventBridge.js.map +7 -0
- package/dist/esm/{bridge_jsonl.js → JSONLEventBridge.js} +3 -3
- package/dist/esm/JSONLEventBridge.js.map +7 -0
- package/dist/esm/{lock_manager.js → LockManager.js} +1 -1
- package/dist/esm/LockManager.js.map +7 -0
- package/dist/esm/{bridge_nats.js → NATSEventBridge.js} +3 -3
- package/dist/esm/NATSEventBridge.js.map +7 -0
- package/dist/esm/{middleware_otel_tracing.js → OtelTracingMiddleware.js} +1 -1
- package/dist/esm/OtelTracingMiddleware.js.map +7 -0
- package/dist/esm/{bridge_postgres.js → PostgresEventBridge.js} +3 -3
- package/dist/esm/PostgresEventBridge.js.map +7 -0
- package/dist/esm/{bridge_redis.js → RedisEventBridge.js} +3 -3
- package/dist/esm/RedisEventBridge.js.map +7 -0
- package/dist/esm/{bridge_sqlite.js → SQLiteEventBridge.js} +3 -3
- package/dist/esm/SQLiteEventBridge.js.map +7 -0
- package/dist/esm/SocketEventBridge.js +15 -0
- package/dist/esm/SocketEventBridge.js.map +7 -0
- package/dist/esm/bridges.js +9 -296
- package/dist/esm/bridges.js.map +2 -2
- package/dist/esm/events_suck.js +2 -2
- package/dist/esm/events_suck.js.map +1 -1
- package/dist/esm/index.js +11 -19
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/logging.js +2 -2
- package/dist/esm/logging.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/types/BaseEvent.d.ts +211 -0
- package/dist/types/EventBridge.d.ts +34 -0
- package/dist/types/EventBus.d.ts +125 -0
- package/dist/types/EventBusMiddleware.d.ts +13 -0
- package/dist/types/EventHandler.d.ts +140 -0
- package/dist/types/EventHistory.d.ts +45 -0
- package/dist/types/EventResult.d.ts +86 -0
- package/dist/types/HTTPEventBridge.d.ts +10 -0
- package/dist/types/JSONLEventBridge.d.ts +26 -0
- package/dist/types/LockManager.d.ts +70 -0
- package/dist/types/NATSEventBridge.d.ts +20 -0
- package/dist/types/OtelTracingMiddleware.d.ts +49 -0
- package/dist/types/PostgresEventBridge.d.ts +31 -0
- package/dist/types/RedisEventBridge.d.ts +34 -0
- package/dist/types/SQLiteEventBridge.d.ts +30 -0
- package/dist/types/SocketEventBridge.d.ts +4 -0
- package/dist/types/bridge_ipc.d.ts +45 -0
- package/dist/types/bridges.d.ts +9 -49
- package/dist/types/events_suck.d.ts +2 -2
- package/dist/types/index.d.ts +15 -14
- package/dist/types/logging.d.ts +2 -2
- package/dist/types/middlewares.d.ts +1 -13
- package/dist/types/types.d.ts +1 -1
- package/package.json +52 -10
- package/src/{base_event.ts → BaseEvent.ts} +5 -5
- package/src/EventBridge.ts +332 -0
- package/src/{event_bus.ts → EventBus.ts} +6 -6
- package/src/EventBusMiddleware.ts +16 -0
- package/src/{event_handler.ts → EventHandler.ts} +2 -2
- package/src/{event_history.ts → EventHistory.ts} +1 -1
- package/src/{event_result.ts → EventResult.ts} +8 -6
- package/src/HTTPEventBridge.ts +27 -0
- package/src/{bridge_jsonl.ts → JSONLEventBridge.ts} +2 -2
- package/src/{lock_manager.ts → LockManager.ts} +2 -2
- package/src/{bridge_nats.ts → NATSEventBridge.ts} +2 -2
- package/src/{middleware_otel_tracing.ts → OtelTracingMiddleware.ts} +4 -4
- package/src/{bridge_postgres.ts → PostgresEventBridge.ts} +2 -2
- package/src/{bridge_redis.ts → RedisEventBridge.ts} +2 -2
- package/src/{bridge_sqlite.ts → SQLiteEventBridge.ts} +2 -2
- package/src/SocketEventBridge.ts +13 -0
- package/src/bridges.ts +9 -376
- package/src/events_suck.ts +2 -2
- package/src/index.ts +15 -22
- package/src/logging.ts +3 -3
- package/src/middlewares.ts +1 -16
- package/src/types.ts +1 -1
- package/dist/cjs/base_event.js.map +0 -7
- package/dist/cjs/bridge_jsonl.js.map +0 -7
- package/dist/cjs/bridge_nats.js.map +0 -7
- package/dist/cjs/bridge_postgres.js.map +0 -7
- package/dist/cjs/bridge_redis.js.map +0 -7
- package/dist/cjs/bridge_sqlite.js.map +0 -7
- package/dist/cjs/event_bus.js.map +0 -7
- package/dist/cjs/event_handler.js.map +0 -7
- package/dist/cjs/event_history.js.map +0 -7
- package/dist/cjs/event_result.js.map +0 -7
- package/dist/cjs/lock_manager.js.map +0 -7
- package/dist/cjs/middleware_otel_tracing.js.map +0 -7
- package/dist/esm/base_event.js.map +0 -7
- package/dist/esm/bridge_jsonl.js.map +0 -7
- package/dist/esm/bridge_nats.js.map +0 -7
- package/dist/esm/bridge_postgres.js.map +0 -7
- package/dist/esm/bridge_redis.js.map +0 -7
- package/dist/esm/bridge_sqlite.js.map +0 -7
- package/dist/esm/event_bus.js.map +0 -7
- package/dist/esm/event_handler.js.map +0 -7
- package/dist/esm/event_history.js.map +0 -7
- package/dist/esm/event_result.js.map +0 -7
- package/dist/esm/lock_manager.js.map +0 -7
- package/dist/esm/middleware_otel_tracing.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/event_handler.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { v5 as uuidv5 } from 'uuid'\n\nimport { normalizeEventPattern, type EventHandlerCallable, type EventPattern } from './types.js'\nimport { BaseEvent } from './base_event.js'\nimport type { EventResult } from './event_result.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst HANDLER_ID_NAMESPACE = uuidv5('abxbus-handler', uuidv5.DNS)\nconst BOUND_FUNCTION_PREFIX = 'bound '\n\nconst normalizeCallableName = (name: string | undefined): string => {\n if (!name) {\n return 'anonymous'\n }\n if (name.startsWith(BOUND_FUNCTION_PREFIX) && name.length > BOUND_FUNCTION_PREFIX.length) {\n return name.slice(BOUND_FUNCTION_PREFIX.length)\n }\n return name\n}\n\nexport type EphemeralFindEventHandler = {\n // Similar to a handler, except it's for .find() calls.\n // Resolved on dispatch, ephemeral, and never shows up in the processing tree.\n event_pattern: string | '*'\n matches: (event: BaseEvent) => boolean\n resolve: (event: BaseEvent) => void\n timeout_id?: ReturnType<typeof setTimeout>\n}\n\nexport const FindWaiterJSONSchema = z\n .object({\n event_pattern: z.union([z.string(), z.literal('*')]),\n has_timeout: z.boolean(),\n })\n .strict()\n\nexport type FindWaiterJSON = z.infer<typeof FindWaiterJSONSchema>\n\nexport class FindWaiter {\n static toJSON(waiter: EphemeralFindEventHandler): FindWaiterJSON {\n return {\n event_pattern: waiter.event_pattern,\n has_timeout: waiter.timeout_id !== undefined,\n }\n }\n\n static fromJSON(\n data: unknown,\n overrides: {\n matches?: (event: BaseEvent) => boolean\n resolve?: (event: BaseEvent) => void\n } = {}\n ): EphemeralFindEventHandler {\n const record = FindWaiterJSONSchema.parse(data)\n const event_pattern = record.event_pattern\n const defaultMatches = (event: BaseEvent): boolean => event_pattern === '*' || event.event_type === event_pattern\n return {\n event_pattern,\n matches: overrides.matches ?? defaultMatches,\n resolve: overrides.resolve ?? (() => {}),\n }\n }\n\n static toJSONArray(waiters: Iterable<EphemeralFindEventHandler>): FindWaiterJSON[] {\n return Array.from(waiters, (waiter) => FindWaiter.toJSON(waiter))\n }\n\n static fromJSONArray(\n data: unknown,\n overrides: {\n matches?: (event: BaseEvent) => boolean\n resolve?: (event: BaseEvent) => void\n } = {}\n ): EphemeralFindEventHandler[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => FindWaiter.fromJSON(item, overrides))\n }\n}\n\nexport const EventHandlerJSONSchema = z\n .object({\n id: z.string(),\n eventbus_name: z.string(),\n eventbus_id: z.string().uuid(),\n event_pattern: z.union([z.string(), z.literal('*')]),\n handler_name: z.string(),\n handler_file_path: z.string().nullable().optional(),\n handler_timeout: z.number().nullable().optional(),\n handler_slow_timeout: z.number().nullable().optional(),\n handler_registered_at: z.string().datetime(),\n })\n .strict()\n\nexport type EventHandlerJSON = z.infer<typeof EventHandlerJSONSchema>\n\n// an entry in the list of event handlers that are registered on a bus\nexport class EventHandler {\n id: string // unique uuidv5 based on hash of bus name, handler name, handler file path:lineno, registered at timestamp, and event key\n handler: EventHandlerCallable // original callable passed to on()\n handler_name: string // name of the handler function, or 'anonymous' if the handler is an anonymous/arrow function\n handler_file_path: string | null // ~/path/to/source/file.ts:123, or null when unknown\n handler_timeout?: number | null // maximum time in seconds that the handler is allowed to run before it is aborted, resolved at runtime if not set\n handler_slow_timeout?: number | null // warning threshold in seconds for slow handler execution\n handler_registered_at: string // ISO datetime used in the deterministic handler-id seed\n event_pattern: string | '*' // event_type string to match against, or '*' to match all events\n eventbus_name: string // name of the event bus that the handler is registered on\n eventbus_id: string // uuidv7 identifier of the event bus that the handler is registered on\n\n constructor(params: {\n id?: string\n handler: EventHandlerCallable\n handler_name: string\n handler_file_path?: string | null\n handler_timeout?: number | null\n handler_slow_timeout?: number | null\n handler_registered_at: string\n event_pattern: string | '*'\n eventbus_name: string\n eventbus_id: string\n }) {\n const handler_registered_at = monotonicDatetime(params.handler_registered_at)\n this.id =\n params.id ??\n EventHandler.computeHandlerId({\n eventbus_id: params.eventbus_id,\n handler_name: params.handler_name,\n handler_file_path: params.handler_file_path,\n handler_registered_at,\n event_pattern: params.event_pattern,\n })\n this.handler = params.handler\n this.handler_name = params.handler_name\n this.handler_file_path = params.handler_file_path ?? null\n this.handler_timeout = params.handler_timeout\n this.handler_slow_timeout = params.handler_slow_timeout\n this.handler_registered_at = handler_registered_at\n this.event_pattern = params.event_pattern\n this.eventbus_name = params.eventbus_name\n this.eventbus_id = params.eventbus_id\n }\n\n get _handler_async(): EventHandlerCallable {\n const handler = this.handler\n if (Object.prototype.toString.call(handler) === '[object AsyncFunction]') {\n return handler\n }\n return async (event: BaseEvent) => await handler(event)\n }\n\n static handlerNameFromCallable(handler: EventHandlerCallable): string {\n return normalizeCallableName(handler.name)\n }\n\n // compute globally unique handler uuid as a hash of the bus name, handler name, handler file path, registered at timestamp, and event key\n static computeHandlerId(params: {\n eventbus_id: string\n handler_name: string\n handler_file_path?: string | null\n handler_registered_at: string\n event_pattern: string | '*'\n }): string {\n const file_path = params.handler_file_path ?? 'unknown'\n const seed = `${params.eventbus_id}|${params.handler_name}|${file_path}|${params.handler_registered_at}|${params.event_pattern}`\n return uuidv5(seed, HANDLER_ID_NAMESPACE)\n }\n\n static fromCallable<TEvent extends BaseEvent = BaseEvent>(params: {\n handler: EventHandlerCallable<TEvent>\n event_pattern: EventPattern | '*'\n eventbus_name: string\n eventbus_id: string\n detect_handler_file_path?: boolean\n id?: string\n handler_file_path?: string | null\n handler_timeout?: number | null\n handler_slow_timeout?: number | null\n handler_registered_at?: string\n }): EventHandler {\n const entry = new EventHandler({\n id: params.id,\n handler: params.handler as EventHandlerCallable,\n handler_name: EventHandler.handlerNameFromCallable(params.handler as EventHandlerCallable),\n handler_file_path: params.handler_file_path ?? null,\n handler_timeout: params.handler_timeout,\n handler_slow_timeout: params.handler_slow_timeout,\n handler_registered_at: monotonicDatetime(params.handler_registered_at),\n event_pattern: normalizeEventPattern(params.event_pattern),\n eventbus_name: params.eventbus_name,\n eventbus_id: params.eventbus_id,\n })\n const should_detect_handler_file_path = params.detect_handler_file_path ?? true\n if (should_detect_handler_file_path && entry.handler_file_path === null) {\n entry._detectHandlerFilePath()\n if (params.id === undefined) {\n entry.id = EventHandler.computeHandlerId({\n eventbus_id: entry.eventbus_id,\n handler_name: entry.handler_name,\n handler_file_path: entry.handler_file_path,\n handler_registered_at: entry.handler_registered_at,\n event_pattern: entry.event_pattern,\n })\n }\n }\n return entry\n }\n\n // \"someHandlerName() @ ~/path/to/source/file.ts:123\" <- best case when file path is available and its a named function\n // \"function#1234()\" <- worst case when no file path is available and its an anonymous/arrow function defined inline\n toString(): string {\n const label = this.handler_name && this.handler_name !== 'anonymous' ? `${this.handler_name}()` : `function#${this.id.slice(-4)}()`\n return this.handler_file_path ? `${label} @ ${this.handler_file_path}` : label\n }\n\n // autodetect the path/to/source/file.ts:lineno where the handler is defined for better logs\n // optional (controlled by EventBus.event_handler_detect_file_paths) because it can slow down performance to introspect stack traces and find file paths\n _detectHandlerFilePath(): void {\n const line = new Error().stack\n ?.split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)[4]\n if (!line) return\n const resolved_path =\n line.trim().match(/\\(([^)]+)\\)$/)?.[1] ??\n line.trim().match(/^\\s*at\\s+(.+)$/)?.[1] ??\n line.trim().match(/^[^@]+@(.+)$/)?.[1] ??\n line.trim()\n const match = resolved_path.match(/^(.*?):(\\d+)(?::\\d+)?$/)\n let normalized = match ? match[1] : resolved_path\n const line_number = match?.[2]\n if (normalized.startsWith('file://')) {\n let path = normalized.slice('file://'.length)\n if (path.startsWith('localhost/')) path = path.slice('localhost'.length)\n if (!path.startsWith('/')) path = `/${path}`\n try {\n normalized = decodeURIComponent(path)\n } catch {\n normalized = path\n }\n }\n normalized = normalized.replace(/\\/users\\/[^/]+\\//i, '~/').replace(/\\/home\\/[^/]+\\//i, '~/')\n this.handler_file_path = line_number ? `${normalized}:${line_number}` : normalized\n }\n\n toJSON(): EventHandlerJSON {\n return {\n id: this.id,\n eventbus_name: this.eventbus_name,\n eventbus_id: this.eventbus_id,\n event_pattern: this.event_pattern,\n handler_name: this.handler_name,\n handler_file_path: this.handler_file_path,\n handler_timeout: this.handler_timeout,\n handler_slow_timeout: this.handler_slow_timeout,\n handler_registered_at: this.handler_registered_at,\n }\n }\n\n static fromJSON(data: unknown, handler?: EventHandlerCallable): EventHandler {\n const record = EventHandlerJSONSchema.parse(data)\n const handler_fn = handler ?? ((() => undefined) as EventHandlerCallable)\n const handler_name = record.handler_name || handler_fn.name || 'anonymous' // 'anonymous' is the default name for anonymous/arrow functions\n return new EventHandler({\n id: record.id,\n handler: handler_fn,\n handler_name,\n handler_file_path: record.handler_file_path ?? null,\n handler_timeout: record.handler_timeout,\n handler_slow_timeout: record.handler_slow_timeout,\n handler_registered_at: record.handler_registered_at,\n event_pattern: record.event_pattern,\n eventbus_name: record.eventbus_name,\n eventbus_id: record.eventbus_id,\n })\n }\n\n static toJSONArray(handlers: Iterable<EventHandler>): EventHandlerJSON[] {\n return Array.from(handlers, (handler) => handler.toJSON())\n }\n\n static fromJSONArray(data: unknown, handler?: EventHandlerCallable): EventHandler[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => EventHandler.fromJSON(item, handler))\n }\n\n get eventbus_label(): string {\n return `${this.eventbus_name}#${this.eventbus_id.slice(-4)}`\n }\n}\n\n// Generic base TimeoutError used for EventHandlerTimeoutError.cause default value if\nexport class TimeoutError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TimeoutError'\n }\n}\n\n// Base class for all errors that can occur while running an event handler\nexport class EventHandlerError extends Error {\n event_result: EventResult\n timeout_seconds: number | null\n cause: Error\n\n constructor(message: string, params: { event_result: EventResult; timeout_seconds?: number | null; cause: Error }) {\n super(message)\n this.name = 'EventHandlerError'\n this.event_result = params.event_result\n this.cause = params.cause\n this.timeout_seconds = params.timeout_seconds ?? this.event_result.event.event_timeout ?? null\n }\n\n get event(): BaseEvent {\n return this.event_result.event\n }\n\n get event_type(): string {\n return this.event.event_type\n }\n\n get handler_name(): string {\n return this.event_result.handler_name\n }\n\n get handler_id(): string {\n return this.event_result.handler_id\n }\n\n get event_timeout(): number | null {\n return this.event.event_timeout\n }\n}\n\n// When the handler itself timed out while executing (due to handler.handler_timeout being exceeded)\nexport class EventHandlerTimeoutError extends EventHandlerError {\n constructor(message: string, params: { event_result: EventResult; timeout_seconds?: number | null; cause?: Error }) {\n super(message, {\n event_result: params.event_result,\n timeout_seconds: params.timeout_seconds,\n cause: params.cause ?? new TimeoutError(message),\n })\n this.name = 'EventHandlerTimeoutError'\n }\n}\n\n// When a pending handler was cancelled and never run due to an error (e.g. timeout) in a parent scope\nexport class EventHandlerCancelledError extends EventHandlerError {\n constructor(message: string, params: { event_result: EventResult; timeout_seconds?: number | null; cause: Error }) {\n super(message, params)\n this.name = 'EventHandlerCancelledError'\n }\n}\n\n// When a handler that was already running was aborted due to an error in the parent scope, not due to an error in its own logic / exceeding its own timeout\nexport class EventHandlerAbortedError extends EventHandlerError {\n constructor(message: string, params: { event_result: EventResult; timeout_seconds?: number | null; cause: Error }) {\n super(message, params)\n this.name = 'EventHandlerAbortedError'\n }\n}\n\n// When a handler run successfully but returned a value that failed event_result_type validation\nexport class EventHandlerResultSchemaError extends EventHandlerError {\n raw_value: unknown\n\n constructor(message: string, params: { event_result: EventResult; timeout_seconds?: number | null; cause: Error; raw_value: unknown }) {\n super(message, params)\n this.name = 'EventHandlerResultSchemaError'\n this.raw_value = params.raw_value\n }\n\n get expected_schema(): any {\n return this.event_result.event.event_result_type\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["uuidv5"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/event_history.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport type { EventPattern, FindWindow } from './types.js'\nimport { normalizeEventPattern } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nexport type EventHistoryFindOptions = {\n past?: FindWindow\n future?: FindWindow\n child_of?: BaseEvent | null\n event_is_child_of?: (event: BaseEvent, ancestor: BaseEvent) => boolean\n wait_for_future_match?: (\n event_pattern: string | '*',\n matches: (event: BaseEvent) => boolean,\n future: FindWindow\n ) => Promise<BaseEvent | null>\n} & Record<string, unknown>\n\nexport type EventHistoryTrimOptions<TEvent extends BaseEvent = BaseEvent> = {\n is_event_complete?: (event: TEvent) => boolean\n on_remove?: (event: TEvent) => void\n owner_label?: string\n max_history_size?: number | null\n max_history_drop?: boolean\n}\n\nexport class EventHistory<TEvent extends BaseEvent = BaseEvent> implements Iterable<[string, TEvent]> {\n max_history_size: number | null\n max_history_drop: boolean\n\n private _events: Map<string, TEvent>\n private _warned_about_dropping_uncompleted_events: boolean\n\n constructor(options: { max_history_size?: number | null; max_history_drop?: boolean } = {}) {\n this.max_history_size = options.max_history_size === undefined ? 100 : options.max_history_size\n this.max_history_drop = options.max_history_drop ?? false\n this._events = new Map()\n this._warned_about_dropping_uncompleted_events = false\n }\n\n get size(): number {\n return this._events.size\n }\n\n [Symbol.iterator](): Iterator<[string, TEvent]> {\n return this._events[Symbol.iterator]()\n }\n\n entries(): IterableIterator<[string, TEvent]> {\n return this._events.entries()\n }\n\n keys(): IterableIterator<string> {\n return this._events.keys()\n }\n\n values(): IterableIterator<TEvent> {\n return this._events.values()\n }\n\n clear(): void {\n this._events.clear()\n }\n\n get(event_id: string): TEvent | undefined {\n return this._events.get(event_id)\n }\n\n set(event_id: string, event: TEvent): this {\n this._events.set(event_id, event)\n return this\n }\n\n has(event_id: string): boolean {\n return this._events.has(event_id)\n }\n\n delete(event_id: string): boolean {\n return this._events.delete(event_id)\n }\n\n addEvent(event: TEvent): void {\n this._events.set(event.event_id, event)\n }\n\n getEvent(event_id: string): TEvent | undefined {\n return this._events.get(event_id)\n }\n\n removeEvent(event_id: string): boolean {\n return this._events.delete(event_id)\n }\n\n hasEvent(event_id: string): boolean {\n return this._events.has(event_id)\n }\n\n static normalizeEventPattern(event_pattern: EventPattern | '*'): string | '*' {\n return normalizeEventPattern(event_pattern)\n }\n\n find(event_pattern: '*', where?: (event: TEvent) => boolean, options?: EventHistoryFindOptions): Promise<TEvent | null>\n find<TMatch extends TEvent>(\n event_pattern: EventPattern<TMatch>,\n where?: (event: TMatch) => boolean,\n options?: EventHistoryFindOptions\n ): Promise<TMatch | null>\n async find(\n event_pattern: EventPattern<TEvent> | '*',\n where: (event: TEvent) => boolean = () => true,\n options: EventHistoryFindOptions = {}\n ): Promise<TEvent | null> {\n const past = options.past ?? true\n const future = options.future ?? false\n const child_of = options.child_of ?? null\n const eventIsChildOf = options.event_is_child_of ?? ((event: BaseEvent, ancestor: BaseEvent) => this.eventIsChildOf(event, ancestor))\n const waitForFutureMatch = options.wait_for_future_match\n if (past === false && future === false) {\n return null\n }\n\n const event_key = EventHistory.normalizeEventPattern(event_pattern)\n const cutoff_at = past === true ? null : monotonicDatetime(new Date(Date.now() - Math.max(0, Number(past)) * 1000).toISOString())\n\n const event_field_filters = Object.entries(options).filter(\n ([key, value]) =>\n key !== 'past' &&\n key !== 'future' &&\n key !== 'child_of' &&\n key !== 'event_is_child_of' &&\n key !== 'wait_for_future_match' &&\n value !== undefined\n )\n\n const matches = (event: BaseEvent): boolean =>\n (event_key === '*' || event.event_type === event_key) &&\n (!child_of || eventIsChildOf(event, child_of)) &&\n event_field_filters.every(([field_name, expected]) => (event as unknown as Record<string, unknown>)[field_name] === expected) &&\n where(event as TEvent)\n\n if (past !== false) {\n const history_values = Array.from(this._events.values())\n for (let i = history_values.length - 1; i >= 0; i -= 1) {\n const event = history_values[i]\n if (cutoff_at !== null && event.event_created_at < cutoff_at) {\n continue\n }\n if (matches(event)) {\n return event\n }\n }\n }\n\n if (future === false || !waitForFutureMatch) {\n return null\n }\n\n return (await waitForFutureMatch(event_key, matches, future)) as TEvent | null\n }\n\n trimEventHistory(options: EventHistoryTrimOptions<TEvent> = {}): number {\n const max_history_size = options.max_history_size ?? this.max_history_size\n const max_history_drop = options.max_history_drop ?? this.max_history_drop\n if (max_history_size === null) {\n return 0\n }\n\n const is_event_complete = options.is_event_complete ?? ((event: TEvent) => event.event_status === 'completed')\n const on_remove = options.on_remove\n\n if (max_history_size === 0) {\n let removed_count = 0\n for (const [event_id, event] of Array.from(this._events.entries())) {\n if (!is_event_complete(event)) {\n continue\n }\n this._events.delete(event_id)\n on_remove?.(event)\n removed_count += 1\n }\n return removed_count\n }\n\n if (!max_history_drop || this.size <= max_history_size) {\n return 0\n }\n\n let remaining_overage = this.size - max_history_size\n let removed_count = 0\n const remove_event = (event_id: string, event: TEvent): void => {\n this._events.delete(event_id)\n on_remove?.(event)\n removed_count += 1\n }\n\n for (const [event_id, event] of Array.from(this._events.entries())) {\n if (remaining_overage <= 0) {\n break\n }\n if (!is_event_complete(event)) {\n continue\n }\n remove_event(event_id, event)\n remaining_overage -= 1\n }\n\n let dropped_uncompleted = 0\n for (const [event_id, event] of Array.from(this._events.entries())) {\n if (remaining_overage <= 0) {\n break\n }\n if (!is_event_complete(event)) {\n dropped_uncompleted += 1\n }\n remove_event(event_id, event)\n remaining_overage -= 1\n }\n\n if (dropped_uncompleted > 0 && !this._warned_about_dropping_uncompleted_events) {\n this._warned_about_dropping_uncompleted_events = true\n const owner_label = options.owner_label ?? 'EventBus'\n console.error(\n `[abxbus] \u26A0\uFE0F Bus ${owner_label} has exceeded max_history_size=${max_history_size} and is dropping oldest history entries (even uncompleted events). Increase max_history_size or set max_history_drop=false to reject.`\n )\n }\n\n return removed_count\n }\n\n private eventIsChildOf(event: BaseEvent, ancestor: BaseEvent): boolean {\n let current_parent_id = event.event_parent_id\n const visited = new Set<string>()\n\n while (current_parent_id && !visited.has(current_parent_id)) {\n if (current_parent_id === ancestor.event_id) {\n return true\n }\n visited.add(current_parent_id)\n const parent = this._events.get(current_parent_id)\n if (!parent) {\n return false\n }\n current_parent_id = parent.event_parent_id\n }\n\n return false\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["removed_count"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/event_result.ts"],
|
|
4
|
-
"sourcesContent": ["import { v7 as uuidv7 } from 'uuid'\n\nimport { z } from 'zod'\n\nimport { BaseEvent } from './base_event.js'\nimport type { EventBus } from './event_bus.js'\nimport { EventHandler, EventHandlerCancelledError, EventHandlerResultSchemaError, EventHandlerTimeoutError } from './event_handler.js'\nimport { withResolvers, type HandlerLock } from './lock_manager.js'\nimport type { Deferred } from './lock_manager.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { isZodSchema } from './types.js'\nimport { _runWithAsyncContext } from './async_context.js'\nimport { RetryTimeoutError } from './retry.js'\nimport { _runWithAbortMonitor, _runWithSlowMonitor, _runWithTimeout } from './timing.js'\nimport { monotonicDatetime } from './helpers.js'\n\n// More precise than event.event_status, includes separate 'error' state for handlers that throw errors during execution\nexport type EventResultStatus = 'pending' | 'started' | 'completed' | 'error'\n\nexport const EventResultJSONSchema = z\n .object({\n id: z.string(),\n status: z.enum(['pending', 'started', 'completed', 'error']),\n event_id: z.string(),\n handler_id: z.string(),\n handler_name: z.string(),\n handler_file_path: z.string().nullable().optional(),\n handler_timeout: z.number().nullable().optional(),\n handler_slow_timeout: z.number().nullable().optional(),\n handler_registered_at: z.string().datetime().optional(),\n handler_event_pattern: z.union([z.string(), z.literal('*')]).optional(),\n eventbus_name: z.string(),\n eventbus_id: z.string().uuid(),\n started_at: z.string().datetime().nullable().optional(),\n completed_at: z.string().datetime().nullable().optional(),\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n event_children: z.array(z.string()),\n })\n .strict()\n\nexport type EventResultJSON = z.infer<typeof EventResultJSONSchema>\n\n// Object that tracks the pending or completed execution of a single event handler\nexport class EventResult<TEvent extends BaseEvent = BaseEvent> {\n id: string // unique uuidv7 identifier for the event result\n status: EventResultStatus // 'pending', 'started', 'completed', or 'error'\n event: TEvent // the Event that the handler is processing\n handler: EventHandler // the EventHandler object that going to process the event\n started_at: string | null\n completed_at: string | null\n result?: EventResultType<TEvent> // parsed return value from the event handler\n error?: unknown // error object thrown by the event handler, or null if the handler completed successfully\n event_children: BaseEvent[] // list of emitted child events\n\n // Abort signal: created when handler starts, rejected by _signalAbort() to\n // interrupt runHandler's await via Promise.race.\n _abort: Deferred<never> | null\n // Handler lock: tracks ownership of the handler concurrency lock\n // during handler execution. Set by runHandler(), used by\n // _processEventImmediately for yield-and-reacquire during queue-jumps.\n _lock: HandlerLock | null\n // Runloop pause releases keyed by bus for queue-jump; released when handler exits.\n _queue_jump_pause_releases: Map<EventBus, () => void> | null\n\n constructor(params: { event: TEvent; handler: EventHandler }) {\n this.id = uuidv7()\n this.status = 'pending'\n this.event = params.event\n this.handler = params.handler\n this.started_at = null\n this.completed_at = null\n this.result = undefined\n this.error = undefined\n this.event_children = []\n this._abort = null\n this._lock = null\n this._queue_jump_pause_releases = null\n }\n\n toString(): string {\n return `${this.result ?? 'null'} (${this.status})`\n }\n\n get event_id(): string {\n return this.event.event_id\n }\n\n get bus(): EventBus {\n return this.event.event_bus!\n }\n\n get handler_id(): string {\n return this.handler.id\n }\n\n get handler_name(): string {\n return this.handler.handler_name\n }\n\n get handler_file_path(): string | null {\n return this.handler.handler_file_path\n }\n\n get eventbus_name(): string {\n return this.handler.eventbus_name\n }\n\n get eventbus_id(): string {\n return this.handler.eventbus_id\n }\n\n get eventbus_label(): string {\n return `${this.handler.eventbus_name}#${this.handler.eventbus_id.slice(-4)}`\n }\n\n private getHookBus(): EventBus | undefined {\n const root_bus = this.event.event_bus\n if (!root_bus) {\n return undefined\n }\n return root_bus.all_instances.findBusById(this.eventbus_id) ?? root_bus\n }\n\n private async _notifyStatusHook(status: 'started' | 'completed'): Promise<void> {\n const hook_bus = this.getHookBus()\n if (!hook_bus) {\n return\n }\n const event_for_hook = hook_bus._getEventProxyScopedToThisBus(this.event._event_original ?? this.event, this)\n await hook_bus.onEventResultChange(event_for_hook, this, status)\n }\n\n // shortcut for the result value so users can do event_result.value instead of event_result.result\n get value(): EventResultType<TEvent> | undefined {\n return this.result\n }\n\n // Per-result schema reference derives from the parent event schema.\n // It is intentionally not serialized with each EventResult to avoid duplication.\n get result_type(): TEvent['event_result_type'] {\n const original_event = this.event._event_original ?? this.event\n return original_event.event_result_type as TEvent['event_result_type']\n }\n\n // Link a child event emitted by this handler run to the parent event/result.\n _linkEmittedChildEvent(child_event: BaseEvent): void {\n const original_child = child_event._event_original ?? child_event\n const parent_event = this.event._event_original ?? this.event\n if (original_child.event_id === parent_event.event_id) {\n return\n }\n if (!original_child.event_parent_id) {\n original_child.event_parent_id = parent_event.event_id\n }\n if (!original_child.event_emitted_by_handler_id) {\n original_child.event_emitted_by_handler_id = this.handler_id\n }\n if (!this.event_children.some((child) => child.event_id === original_child.event_id)) {\n this.event_children.push(original_child)\n }\n }\n\n // Get the raw return value from the handler, even if it threw an error / failed validation\n get raw_value(): EventResultType<TEvent> | undefined {\n if (this.error && (this.error as any).raw_value !== undefined) {\n return (this.error as any).raw_value\n }\n return this.result\n }\n\n // Resolve handler timeout in seconds using precedence: handler -> event -> bus defaults.\n get handler_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n const resolved_event_timeout = original.event_timeout ?? this.bus.event_timeout\n\n let resolved_handler_timeout: number | null\n if (this.handler.handler_timeout !== undefined) {\n resolved_handler_timeout = this.handler.handler_timeout\n } else if (original.event_handler_timeout !== undefined) {\n resolved_handler_timeout = original.event_handler_timeout\n } else {\n resolved_handler_timeout = this.bus.event_timeout\n }\n\n if (resolved_handler_timeout === null && resolved_event_timeout === null) {\n return null\n }\n if (resolved_handler_timeout === null) {\n return resolved_event_timeout\n }\n if (resolved_event_timeout === null) {\n return resolved_handler_timeout\n }\n return Math.min(resolved_handler_timeout, resolved_event_timeout)\n }\n\n // Resolve slow handler warning threshold in seconds using precedence: handler -> event -> bus defaults.\n get handler_slow_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n\n if (this.handler.handler_slow_timeout !== undefined) {\n return this.handler.handler_slow_timeout\n }\n if (original.event_handler_slow_timeout !== undefined) {\n return original.event_handler_slow_timeout\n }\n const event_slow_timeout = (original as { event_slow_timeout?: number | null }).event_slow_timeout\n if (event_slow_timeout !== undefined) {\n return event_slow_timeout\n }\n if (this.bus?.event_handler_slow_timeout !== undefined) {\n return this.bus.event_handler_slow_timeout\n }\n return this.bus?.event_slow_timeout ?? null\n }\n\n // Create a slow-handler warning timer that logs if the handler runs too long.\n _createSlowHandlerWarningTimer(effective_timeout: number | null): ReturnType<typeof setTimeout> | null {\n const handler_warn_timeout = this.handler_slow_timeout\n const warn_ms = handler_warn_timeout === null ? null : handler_warn_timeout * 1000\n const should_warn = warn_ms !== null && (effective_timeout === null || effective_timeout * 1000 > warn_ms)\n if (!should_warn || warn_ms === null) {\n return null\n }\n const event = this.event._event_original ?? this.event\n const bus_name = this.handler.eventbus_name\n const started_at_ms = performance.now()\n return setTimeout(() => {\n if (this.status !== 'started') {\n return\n }\n const elapsed_ms = performance.now() - started_at_ms\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(1)\n console.warn(\n `[abxbus] Slow event handler: ${bus_name}.on(${event.toString()}, ${this.handler.toString()}) still running after ${elapsed_seconds}s`\n )\n }, warn_ms)\n }\n\n _ensureQueueJumpPause(bus: EventBus): void {\n if (!this._queue_jump_pause_releases) {\n this._queue_jump_pause_releases = new Map()\n }\n if (this._queue_jump_pause_releases.has(bus)) {\n return\n }\n this._queue_jump_pause_releases.set(bus, bus.locks._requestRunloopPause())\n }\n\n _releaseQueueJumpPauses(): void {\n if (!this._queue_jump_pause_releases) {\n return\n }\n for (const release of this._queue_jump_pause_releases.values()) {\n release()\n }\n this._queue_jump_pause_releases.clear()\n }\n\n update(params: { status?: EventResultStatus; result?: EventResultType<TEvent> | BaseEvent | undefined; error?: unknown }): this {\n const has_status = 'status' in params\n const has_result = 'result' in params\n const has_error = 'error' in params\n\n if (has_result) {\n const raw_result = params.result\n this.status = 'completed'\n if (\n this.event.event_result_type &&\n raw_result !== undefined &&\n !(raw_result instanceof BaseEvent) &&\n isZodSchema(this.event.event_result_type)\n ) {\n const parsed = this.event.event_result_type.safeParse(raw_result)\n if (parsed.success) {\n this.result = parsed.data as EventResultType<TEvent>\n } else {\n const error = new EventHandlerResultSchemaError(\n `Event handler return value ${JSON.stringify(raw_result).slice(0, 20)}... did not match event_result_type: ${parsed.error.message}`,\n { event_result: this, cause: parsed.error, raw_value: raw_result }\n )\n this.error = error\n this.result = undefined\n this.status = 'error'\n }\n } else {\n this.result = raw_result as EventResultType<TEvent> | undefined\n }\n }\n\n if (has_error) {\n this.error = params.error\n this.status = 'error'\n }\n\n if (has_status && params.status !== undefined) {\n this.status = params.status\n }\n\n if (this.status !== 'pending' && this.started_at === null) {\n this.started_at = monotonicDatetime()\n }\n if ((this.status === 'completed' || this.status === 'error') && this.completed_at === null) {\n this.completed_at = monotonicDatetime()\n }\n\n return this\n }\n\n private _createHandlerTimeoutError(event: BaseEvent): EventHandlerTimeoutError {\n return new EventHandlerTimeoutError(\n `${this.bus.toString()}.on(${event.toString()}, ${this.handler.toString()}) timed out after ${this.handler_timeout}s`,\n {\n event_result: this,\n timeout_seconds: this.handler_timeout,\n }\n )\n }\n\n private _handleHandlerError(event: BaseEvent, error: unknown): void {\n const normalized_error =\n error instanceof RetryTimeoutError\n ? new EventHandlerTimeoutError(error.message, { event_result: this, timeout_seconds: error.timeout_seconds, cause: error })\n : error\n if (normalized_error instanceof EventHandlerTimeoutError) {\n this._markError(normalized_error, false)\n event._cancelPendingChildProcessing(normalized_error)\n } else {\n this._markError(normalized_error, false)\n }\n }\n\n private _onHandlerExit(slow_handler_warning_timer: ReturnType<typeof setTimeout> | null): void {\n this._abort = null\n this._lock = null\n this._releaseQueueJumpPauses()\n if (slow_handler_warning_timer) {\n clearTimeout(slow_handler_warning_timer)\n }\n }\n\n // Run one handler invocation with timeout/slow-monitor/error handling.\n // Handler lock acquisition is owned by BaseEvent._runHandlers(...).\n async runHandler(handler_lock: HandlerLock | null): Promise<void> {\n if (this.status === 'error' && this.error instanceof EventHandlerCancelledError) {\n return\n }\n\n const event = this.event._event_original ?? this.event\n const handler_event = this.bus._getEventProxyScopedToThisBus(event, this)\n if (this._lock) {\n this._lock.exitHandlerRun()\n }\n\n let slow_handler_warning_timer: ReturnType<typeof setTimeout> | null = null\n // if the result is already in an error or completed state, exit early\n if (this.status === 'error' || this.status === 'completed') {\n return\n }\n\n this._lock = handler_lock\n await this.bus.locks._runWithHandlerDispatchContext(this, async () => {\n await _runWithAsyncContext(event._getDispatchContext() ?? null, async () => {\n try {\n const should_notify_started = this.status === 'pending'\n const abort_signal = this._markStarted(false)\n if (should_notify_started) {\n await this._notifyStatusHook('started')\n }\n slow_handler_warning_timer = this._createSlowHandlerWarningTimer(this.handler_timeout)\n const handler_result = await _runWithTimeout(\n this.handler_timeout,\n () => this._createHandlerTimeoutError(event),\n () =>\n _runWithSlowMonitor(slow_handler_warning_timer, () =>\n _runWithAbortMonitor(() => this.handler._handler_async(handler_event), abort_signal)\n )\n )\n this._markCompleted(handler_result as EventResultType<TEvent> | BaseEvent | undefined, false)\n } catch (error) {\n this._handleHandlerError(event, error)\n } finally {\n if (this.status === 'completed' || this.status === 'error') {\n await this._notifyStatusHook('completed')\n }\n this._onHandlerExit(slow_handler_warning_timer)\n }\n })\n })\n }\n\n // Reject the abort promise, causing runHandler's Promise.race to\n // throw immediately \u2014 even if the handler has no timeout.\n _signalAbort(error: Error): void {\n if (this._abort) {\n this._abort.reject(error)\n this._abort = null\n }\n }\n\n // Mark started and return the abort promise for Promise.race.\n _markStarted(notify_hook: boolean = true): Promise<never> {\n if (!this._abort) {\n this._abort = withResolvers<never>()\n }\n if (this.status === 'pending') {\n this.update({ status: 'started' })\n if (notify_hook) {\n void this._notifyStatusHook('started')\n }\n }\n return this._abort.promise\n }\n\n _markCompleted(result: EventResultType<TEvent> | BaseEvent | undefined, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ result })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n _markError(error: unknown, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ error })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n toJSON(): EventResultJSON {\n return {\n id: this.id,\n status: this.status,\n event_id: this.event.event_id,\n handler_id: this.handler_id,\n handler_name: this.handler_name,\n handler_file_path: this.handler_file_path,\n handler_timeout: this.handler.handler_timeout,\n handler_slow_timeout: this.handler.handler_slow_timeout,\n handler_registered_at: this.handler.handler_registered_at,\n handler_event_pattern: this.handler.event_pattern,\n eventbus_name: this.eventbus_name,\n eventbus_id: this.eventbus_id,\n started_at: this.started_at,\n completed_at: this.completed_at,\n result: this.result,\n error: this.error,\n event_children: this.event_children.map((child) => child.event_id),\n }\n }\n\n static fromJSON<TEvent extends BaseEvent>(event: TEvent, data: unknown): EventResult<TEvent> {\n const record = EventResultJSONSchema.parse(data)\n const handler_record = {\n id: record.handler_id,\n eventbus_name: record.eventbus_name,\n eventbus_id: record.eventbus_id,\n event_pattern: record.handler_event_pattern ?? event.event_type,\n handler_name: record.handler_name,\n handler_file_path: record.handler_file_path ?? null,\n handler_timeout: record.handler_timeout,\n handler_slow_timeout: record.handler_slow_timeout,\n handler_registered_at: record.handler_registered_at ?? event.event_created_at,\n } as const\n const handler_stub = EventHandler.fromJSON(handler_record, (() => undefined) as EventHandlerCallable)\n\n const result = new EventResult<TEvent>({ event, handler: handler_stub })\n result.id = record.id\n result.status = record.status\n result.started_at = record.started_at === null || record.started_at === undefined ? null : monotonicDatetime(record.started_at)\n result.completed_at = record.completed_at === null || record.completed_at === undefined ? null : monotonicDatetime(record.completed_at)\n if ('result' in record) {\n result.result = record.result as EventResultType<TEvent>\n }\n if ('error' in record) {\n result.error = record.error\n }\n result.event_children = []\n return result\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["uuidv7"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/lock_manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseEvent } from './base_event.js'\nimport type { EventResult } from './event_result.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = handler_context_storage?.getStore() as EventResult | undefined\n return result?.status === 'started' ? result : undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/middleware_otel_tracing.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ROOT_CONTEXT,\n SpanKind,\n SpanStatusCode,\n trace,\n type Context,\n type Span,\n type SpanAttributeValue,\n type SpanAttributes,\n type SpanContext,\n type TimeInput,\n type Tracer,\n} from '@opentelemetry/api'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { resourceFromAttributes } from '@opentelemetry/resources'\nimport { BasicTracerProvider, BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport type { SpanLimits, SpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport { SpanImpl } from '@opentelemetry/sdk-trace-base/build/src/Span.js'\n\nimport type { BaseEvent } from './base_event.js'\nimport type { EventBus } from './event_bus.js'\nimport type { EventResult } from './event_result.js'\nimport type { EventBusMiddleware } from './middlewares.js'\nimport type { EventStatus } from './types.js'\n\ntype OpenTelemetryTraceApi = Pick<typeof trace, 'getTracer' | 'setSpan'> & Partial<Pick<typeof trace, 'setSpanContext'>>\n\nexport type OtelTracingSpanFactoryInput = {\n name: string\n span_context: SpanContext\n parent_span_context?: SpanContext\n attributes: SpanAttributes\n start_time?: TimeInput\n}\n\nexport type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span\n\ntype OtelTracingSpanProviderInternals = {\n _activeSpanProcessor?: SpanProcessor\n _config?: {\n resource?: unknown\n spanLimits?: SpanLimits\n }\n _resource?: unknown\n}\n\nexport type OtelTracingSpanProvider = object\n\nexport type OtelTracingMiddlewareOptions = {\n tracer?: Tracer\n trace_api?: OpenTelemetryTraceApi\n span_provider?: OtelTracingSpanProvider\n span_factory?: OtelTracingSpanFactory\n otlp_endpoint?: string\n service_name?: string\n instrumentation_name?: string\n root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes)\n}\n\nexport class OtelTracingMiddleware implements EventBusMiddleware {\n private readonly tracer: Tracer\n private readonly trace_api: OpenTelemetryTraceApi\n private readonly span_factory?: OtelTracingSpanFactory\n private readonly span_provider?: OtelTracingSpanProvider\n private readonly root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes']\n private readonly event_spans = new Map<string, Span>()\n private readonly event_contexts = new Map<string, Context>()\n private readonly handler_spans = new Map<string, Span>()\n private readonly handler_contexts = new Map<string, Context>()\n\n constructor(options: OtelTracingMiddlewareOptions = {}) {\n this.trace_api = options.trace_api ?? trace\n this.tracer = options.tracer ?? this.trace_api.getTracer('abxbus')\n this.span_provider = options.span_provider ?? (options.otlp_endpoint ? createOtlpSpanProvider(options) : undefined)\n this.span_factory =\n options.span_factory ??\n (this.span_provider\n ? createProviderSpanFactory(this.trace_api, this.span_provider, options.instrumentation_name ?? 'abxbus')\n : undefined)\n this.root_span_attributes = options.root_span_attributes\n }\n\n onEventChange(eventbus: EventBus, event: BaseEvent, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startEventSpan(eventbus, event)\n return\n }\n\n if (status === 'completed') {\n this.completeEventSpan(eventbus, event)\n }\n }\n\n onEventResultChange(eventbus: EventBus, event: BaseEvent, event_result: EventResult, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startHandlerSpan(eventbus, event, event_result)\n return\n }\n\n if (status === 'completed') {\n this.completeHandlerSpan(eventbus, event, event_result)\n }\n }\n\n private startEventSpan(eventbus: EventBus, event: BaseEvent): Span {\n const existing = this.event_spans.get(event.event_id)\n if (existing) {\n return existing\n }\n\n const parent_context = this.parentContextForEvent(event) ?? ROOT_CONTEXT\n const start_time = timeInputFromIso(event.event_started_at)\n const span = this.tracer.startSpan(\n eventSpanName(eventbus, event),\n {\n attributes: event.event_parent_id\n ? eventStartedSpanAttributes(eventbus, event)\n : topLevelEventStartedSpanAttributes(this.root_span_attributes, eventbus, event),\n startTime: start_time,\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.event_spans.set(event.event_id, span)\n this.event_contexts.set(event.event_id, span_context)\n return span\n }\n\n private completeEventSpan(eventbus: EventBus, event: BaseEvent): void {\n if (this.span_factory) {\n this.completeEventSpanWithFactory(eventbus, event)\n return\n }\n\n const span = this.event_spans.get(event.event_id) ?? this.startEventSpan(eventbus, event)\n if (event.event_errors.length > 0) {\n recordSpanError(span, event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(\n event.event_parent_id ? eventSpanAttributes(eventbus, event) : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, event)\n )\n const start_time = epochNsFromIso(event.event_started_at)\n const end_time = endTimeAfterStart(start_time, epochNsFromIso(event.event_completed_at))\n span.end(end_time)\n this.event_spans.delete(event.event_id)\n this.event_contexts.delete(event.event_id)\n }\n\n private startHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): Span {\n const existing = this.handler_spans.get(event_result.id)\n if (existing) {\n return existing\n }\n\n const parent_context =\n this.event_contexts.get(event.event_id) ?? this.trace_api.setSpan(ROOT_CONTEXT, this.startEventSpan(eventbus, event))\n const span = this.tracer.startSpan(\n handlerSpanName(event, event_result),\n {\n attributes: handlerSpanAttributes(eventbus, event, event_result),\n startTime: timeInputFromIso(event_result.started_at),\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.handler_spans.set(event_result.id, span)\n this.handler_contexts.set(handlerSpanKey(event_result.event_id, event_result.handler_id), span_context)\n return span\n }\n\n private completeHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): void {\n if (this.span_factory) {\n return\n }\n\n const span = this.handler_spans.get(event_result.id)\n if (!span) {\n return\n }\n\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(handlerSpanAttributes(eventbus, event, event_result))\n span.end(endTimeAfterStart(epochNsFromIso(event_result.started_at), epochNsFromIso(event_result.completed_at)))\n this.handler_spans.delete(event_result.id)\n this.handler_contexts.delete(handlerSpanKey(event_result.event_id, event_result.handler_id))\n }\n\n private parentContextForEvent(event: BaseEvent): Context | undefined {\n if (event.event_parent_id && event.event_emitted_by_handler_id) {\n const handler_context = this.handler_contexts.get(handlerSpanKey(event.event_parent_id, event.event_emitted_by_handler_id))\n if (handler_context) {\n return handler_context\n }\n }\n\n return event.event_parent_id ? this.event_contexts.get(event.event_parent_id) : undefined\n }\n\n private completeEventSpanWithFactory(eventbus: EventBus, event: BaseEvent): void {\n if (event.event_parent_id) {\n return\n }\n\n const top_level_event = event._event_original ?? event\n const trace_id = traceIdForRootEvent(top_level_event.event_id)\n this.exportEventTreeWithFactory(eventbus, top_level_event, trace_id, undefined, new Set<string>())\n }\n\n private exportEventTreeWithFactory(\n eventbus: EventBus,\n event: BaseEvent,\n trace_id: string,\n parent_span_context: SpanContext | undefined,\n visited_event_ids: Set<string>\n ): void {\n const original_event = event._event_original ?? event\n if (visited_event_ids.has(original_event.event_id)) {\n return\n }\n visited_event_ids.add(original_event.event_id)\n\n const start_time = epochNsFromIso(original_event.event_started_at)\n const span_context = eventSpanContext(trace_id, original_event.event_id)\n const span = this.span_factory!({\n name: eventSpanName(eventbus, original_event),\n span_context,\n parent_span_context,\n attributes: original_event.event_parent_id\n ? eventSpanAttributes(eventbus, original_event)\n : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, original_event),\n start_time: timeInputFromEpochNs(start_time),\n })\n if (original_event.event_errors.length > 0) {\n recordSpanError(span, original_event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(endTimeAfterStart(start_time, epochNsFromIso(original_event.event_completed_at)))\n\n for (const event_result of original_event.event_results.values()) {\n const handler_context = this.exportHandlerSpanWithFactory(eventbus, original_event, event_result, trace_id, span_context)\n for (const child of event_result.event_children) {\n this.exportEventTreeWithFactory(eventbus, child, trace_id, handler_context, visited_event_ids)\n }\n }\n }\n\n private exportHandlerSpanWithFactory(\n eventbus: EventBus,\n event: BaseEvent,\n event_result: EventResult,\n trace_id: string,\n parent_span_context: SpanContext\n ): SpanContext {\n const start_time = epochNsFromIso(event_result.started_at)\n const span_context = handlerSpanContext(trace_id, event_result.event_id, event_result.handler_id)\n const span = this.span_factory!({\n name: handlerSpanName(event, event_result),\n span_context,\n parent_span_context,\n attributes: handlerSpanAttributes(eventbus, event, event_result),\n start_time: timeInputFromEpochNs(start_time),\n })\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(endTimeAfterStart(start_time, epochNsFromIso(event_result.completed_at)))\n return span_context\n }\n}\n\nfunction handlerSpanKey(event_id: string, handler_id: string): string {\n return `${event_id}:${handler_id}`\n}\n\nfunction eventSpanName(eventbus: EventBus, event: BaseEvent): string {\n return `${eventbus.name}.emit(${event.event_type})`\n}\n\nfunction handlerSpanName(event: BaseEvent, event_result: EventResult): string {\n return `${event_result.handler_name}(${event.event_type})`\n}\n\nfunction createOtlpSpanProvider(options: OtelTracingMiddlewareOptions): OtelTracingSpanProvider {\n return new BasicTracerProvider({\n resource: resourceFromAttributes({\n 'service.name': options.service_name ?? 'abxbus',\n }),\n spanProcessors: [\n new BatchSpanProcessor(\n new OTLPTraceExporter({\n url: normalizeOtlpTracesEndpoint(options.otlp_endpoint!),\n }),\n {\n scheduledDelayMillis: 100,\n }\n ),\n ],\n })\n}\n\nfunction createProviderSpanFactory(\n trace_api: OpenTelemetryTraceApi,\n provider: OtelTracingSpanProvider,\n instrumentation_name: string\n): OtelTracingSpanFactory {\n const provider_internals = provider as OtelTracingSpanProviderInternals\n return (input: OtelTracingSpanFactoryInput): Span => {\n const span_processor = provider_internals._activeSpanProcessor\n const span_limits = provider_internals._config?.spanLimits\n const resource = provider_internals._resource ?? provider_internals._config?.resource\n if (!span_processor || !span_limits || !resource) {\n throw new Error('OtelTracingMiddleware span_provider must be an OpenTelemetry SDK trace provider with active span internals')\n }\n\n const parent_context = input.parent_span_context\n ? (trace_api.setSpanContext ?? trace.setSpanContext)(ROOT_CONTEXT, input.parent_span_context)\n : ROOT_CONTEXT\n return new SpanImpl({\n resource,\n scope: { name: instrumentation_name },\n context: parent_context,\n spanContext: input.span_context,\n parentSpanContext: input.parent_span_context,\n name: input.name,\n kind: SpanKind.INTERNAL,\n attributes: input.attributes,\n startTime: input.start_time,\n spanProcessor: span_processor,\n spanLimits: span_limits,\n } as ConstructorParameters<typeof SpanImpl>[0])\n }\n}\n\nfunction normalizeOtlpTracesEndpoint(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, '')\n return trimmed.endsWith('/v1/traces') ? trimmed : `${trimmed}/v1/traces`\n}\n\nfunction eventStartedSpanAttributes(eventbus: EventBus, event: BaseEvent): SpanAttributes {\n return compactAttributes({\n 'abxbus.event_bus.id': eventbus.id,\n 'abxbus.event_bus.name': eventbus.name,\n 'abxbus.event_id': event.event_id,\n 'abxbus.event_type': event.event_type,\n 'abxbus.event_version': event.event_version,\n 'abxbus.session_id': stringValue((event as { session_id?: unknown }).session_id),\n 'abxbus.event_parent_id': event.event_parent_id,\n 'abxbus.event_emitted_by_handler_id': event.event_emitted_by_handler_id,\n 'abxbus.event_path': event.event_path.join(' '),\n })\n}\n\nfunction eventSpanAttributes(eventbus: EventBus, event: BaseEvent): SpanAttributes {\n return compactAttributes({\n ...eventStartedSpanAttributes(eventbus, event),\n 'abxbus.event_status': event.event_status,\n })\n}\n\nfunction handlerSpanAttributes(eventbus: EventBus, event: BaseEvent, event_result: EventResult): SpanAttributes {\n return compactAttributes({\n 'abxbus.event_bus.id': eventbus.id,\n 'abxbus.event_bus.name': eventbus.name,\n 'abxbus.event_id': event.event_id,\n 'abxbus.event_type': event.event_type,\n 'abxbus.handler_id': event_result.handler_id,\n 'abxbus.handler_name': event_result.handler_name,\n 'abxbus.handler_file_path': event_result.handler_file_path,\n 'abxbus.handler_event_pattern': event_result.handler.event_pattern,\n 'abxbus.event_result_id': event_result.id,\n 'abxbus.event_result_status': event_result.status,\n })\n}\n\nfunction topLevelEventStartedSpanAttributes(\n root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return compactAttributes({\n ...eventStartedSpanAttributes(eventbus, event),\n ...resolveAttributes(root_span_attributes, eventbus, event),\n 'abxbus.trace.root': true,\n })\n}\n\nfunction topLevelEventSpanAttributes(\n root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return compactAttributes({\n ...eventSpanAttributes(eventbus, event),\n ...resolveAttributes(root_span_attributes, eventbus, event),\n 'abxbus.trace.root': true,\n })\n}\n\nfunction eventSpanContext(trace_id: string, event_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.event:${event_id}`),\n traceFlags: 1,\n }\n}\n\nfunction handlerSpanContext(trace_id: string, event_id: string, handler_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.handler:${event_id}:${handler_id}`),\n traceFlags: 1,\n }\n}\n\nfunction traceIdForRootEvent(event_id: string): string {\n return `${fnv1a64Hex(`abxbus.trace.a:${event_id}`)}${fnv1a64Hex(`abxbus.trace.b:${event_id}`)}`\n}\n\nfunction deterministicSpanId(input: string): string {\n return fnv1a64Hex(input)\n}\n\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n\n const prime = 0x100000001b3n\n const mask = 0xffffffffffffffffn\n for (let index = 0; index < input.length; index += 1) {\n hash ^= BigInt(input.charCodeAt(index))\n hash = (hash * prime) & mask\n }\n if (hash === 0n) {\n hash = 1n\n }\n return hash.toString(16).padStart(16, '0')\n}\n\nconst ISO_EPOCH_NS_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})$/\nconst NS_PER_SECOND = 1_000_000_000n\nconst NS_PER_MS = 1_000_000n\n\nfunction epochNsFromIso(value: string | null | undefined): bigint | undefined {\n if (value == null) {\n return undefined\n }\n const match = ISO_EPOCH_NS_REGEX.exec(value)\n if (!match) {\n return undefined\n }\n const [, base, fraction = '', timezone] = match\n const base_ms = Date.parse(`${base}.000${timezone}`)\n if (Number.isNaN(base_ms)) {\n return undefined\n }\n return BigInt(base_ms) * NS_PER_MS + BigInt(fraction.padEnd(9, '0'))\n}\n\nfunction timeInputFromIso(value: string | null | undefined): TimeInput | undefined {\n return timeInputFromEpochNs(epochNsFromIso(value))\n}\n\nfunction timeInputFromEpochNs(epoch_ns: bigint | undefined): TimeInput | undefined {\n if (epoch_ns === undefined) {\n return undefined\n }\n const seconds = epoch_ns / NS_PER_SECOND\n const nanos = epoch_ns % NS_PER_SECOND\n return [Number(seconds), Number(nanos)]\n}\n\nfunction endTimeAfterStart(start_time: bigint | undefined, end_time: bigint | undefined): TimeInput | undefined {\n if (start_time === undefined || end_time === undefined) {\n return timeInputFromEpochNs(end_time)\n }\n\n return timeInputFromEpochNs(end_time > start_time ? end_time : start_time + 1n)\n}\n\nfunction resolveAttributes(\n attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return typeof attributes === 'function' ? attributes(eventbus, event) : (attributes ?? {})\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction compactAttributes(attributes: Record<string, SpanAttributeValue | null | undefined>): SpanAttributes {\n const compacted: SpanAttributes = {}\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== null && value !== undefined) {\n compacted[key] = value\n }\n }\n return compacted\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n return\n }\n\n const message = typeof error === 'string' ? error : 'Unknown abxbus handler error'\n span.recordException(message)\n span.setStatus({ code: SpanStatusCode.ERROR, message })\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/base_event.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { v7 as uuidv7 } from 'uuid'\n\nimport { EventBus } from './event_bus.js'\nimport { EventResult } from './event_result.js'\nimport { EventHandler, EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from './event_handler.js'\nimport type { EventConcurrencyMode, EventHandlerConcurrencyMode, EventHandlerCompletionMode, Deferred } from './lock_manager.js'\nimport {\n AsyncLock,\n EVENT_CONCURRENCY_MODES,\n EVENT_HANDLER_CONCURRENCY_MODES,\n EVENT_HANDLER_COMPLETION_MODES,\n withResolvers,\n} from './lock_manager.js'\nimport { _runWithTimeout } from './timing.js'\nimport { extractZodShape, normalizeEventResultType, toJsonSchema } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set(['bus', 'emit', 'first', 'toString', 'toJSON', 'fromJSON'])\n\nfunction assertNoReservedUserEventFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of RESERVED_USER_EVENT_FIELDS) {\n if (Object.prototype.hasOwnProperty.call(data, field_name)) {\n throw new Error(`${context} field \"${field_name}\" is reserved for EventBus runtime context and cannot be set in event payload`)\n }\n }\n}\n\nfunction assertNoUnknownEventPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('event_') && !KNOWN_BASE_EVENT_FIELDS.has(field_name)) {\n throw new Error(`${context} field \"${field_name}\" starts with \"event_\" but is not a recognized BaseEvent field`)\n }\n }\n}\n\nfunction assertNoModelPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('model_')) {\n throw new Error(`${context} field \"${field_name}\" starts with \"model_\" and is reserved for model internals`)\n }\n }\n}\n\nfunction compareIsoDatetime(left: string | null | undefined, right: string | null | undefined): number {\n const left_value = left ?? ''\n const right_value = right ?? ''\n if (left_value === right_value) {\n return 0\n }\n return left_value < right_value ? -1 : 1\n}\n\nexport const BaseEventSchema = z\n .object({\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string(),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().positive().nullable(),\n event_slow_timeout: z.number().positive().nullable().optional(),\n event_handler_timeout: z.number().positive().nullable().optional(),\n event_handler_slow_timeout: z.number().positive().nullable().optional(),\n event_blocks_parent_completion: z.boolean().optional(),\n event_parent_id: z.string().uuid().nullable().optional(),\n event_path: z.array(z.string()).optional(),\n event_result_type: z.unknown().optional(),\n event_emitted_by_handler_id: z.string().uuid().nullable().optional(),\n event_pending_bus_count: z.number().nonnegative().optional(),\n event_status: z.enum(['pending', 'started', 'completed']).optional(),\n event_started_at: z.string().datetime().nullable().optional(),\n event_completed_at: z.string().datetime().nullable().optional(),\n event_results: z.array(z.unknown()).optional(),\n event_concurrency: z.enum(EVENT_CONCURRENCY_MODES).nullable().optional(),\n event_handler_concurrency: z.enum(EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),\n event_handler_completion: z.enum(EVENT_HANDLER_COMPLETION_MODES).nullable().optional(),\n })\n .loose()\n\nconst KNOWN_BASE_EVENT_FIELDS = new Set(Object.keys(BaseEventSchema.shape))\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFields = Pick<\n BaseEventData,\n | 'event_id'\n | 'event_created_at'\n | 'event_type'\n | 'event_version'\n | 'event_timeout'\n | 'event_slow_timeout'\n | 'event_handler_timeout'\n | 'event_handler_slow_timeout'\n | 'event_blocks_parent_completion'\n | 'event_parent_id'\n | 'event_path'\n | 'event_result_type'\n | 'event_emitted_by_handler_id'\n | 'event_pending_bus_count'\n | 'event_status'\n | 'event_started_at'\n | 'event_completed_at'\n | 'event_results'\n | 'event_concurrency'\n | 'event_handler_concurrency'\n | 'event_handler_completion'\n>\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\n\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>\n\ntype EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>\nexport type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends StringConstructor\n ? string\n : TInput extends NumberConstructor\n ? number\n : TInput extends BooleanConstructor\n ? boolean\n : TInput extends ArrayConstructor\n ? unknown[]\n : TInput extends ObjectConstructor\n ? Record<string, unknown>\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype EventResultsListInclude<TEvent extends BaseEvent> = (\n result: EventResultType<TEvent> | undefined,\n event_result: EventResult<TEvent>\n) => boolean\ntype EventResultsListOptions<TEvent extends BaseEvent> = {\n timeout?: number | null\n include?: EventResultsListInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\ntype EventDoneOptions = {\n raise_if_any?: boolean\n}\ntype EventResultUpdateOptions<TEvent extends BaseEvent> = {\n eventbus?: EventBus\n status?: 'pending' | 'started' | 'completed' | 'error'\n result?: EventResultType<TEvent> | BaseEvent | undefined\n error?: unknown\n}\n\nconst EVENT_CLASS_DEFAULTS = new WeakMap<Function, Record<string, unknown>>()\nconst ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {\n (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n schema: EventSchema<TShape>\n class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>\n}\n\ntype ZodShapeFrom<TShape extends Record<string, unknown>> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<\n TShape[K],\n z.ZodTypeAny\n >\n}\n\nexport class BaseEvent {\n // event metadata fields\n event_id!: string // unique uuidv7 identifier for the event\n event_created_at!: string\n event_type!: string // should match the class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n event_version!: string // event schema/version tag managed by callers for migration-friendly payload handling\n event_timeout!: number | null // maximum time in seconds that the event is allowed to run before it is aborted\n event_slow_timeout?: number | null // optional per-event slow warning threshold in seconds\n event_handler_timeout?: number | null // optional per-event handler timeout override in seconds\n event_handler_slow_timeout?: number | null // optional per-event slow handler warning threshold in seconds\n event_blocks_parent_completion!: boolean // true only for children explicitly awaited via done()/eventCompleted()\n event_parent_id!: string | null // id of the parent event that triggered this event, if this event was emitted during handling of another event, else null\n event_path!: string[] // list of bus labels (name#id) that the event has been dispatched to, including the current bus\n event_result_type?: z.ZodTypeAny // optional zod schema to enforce the shape of return values from handlers\n event_results!: Map<string, EventResult<this>> // map of handler ids to EventResult objects for the event\n event_emitted_by_handler_id!: string | null // if event was emitted inside a handler while it was running, this is set to the enclosing handler's handler id, else null\n event_pending_bus_count!: number // number of buses that have accepted this event and not yet finished processing or removed it from their queues (for queue-jump processing)\n event_status!: 'pending' | 'started' | 'completed' // processing status of the event as a whole, no separate 'error' state because events can not error, only individual handlers can\n event_started_at!: string | null\n event_completed_at!: string | null\n event_concurrency?: EventConcurrencyMode | null // concurrency mode for the event as a whole in relation to other events\n event_handler_concurrency?: EventHandlerConcurrencyMode | null // concurrency mode for the handlers within the event\n event_handler_completion?: EventHandlerCompletionMode | null // completion strategy: 'all' (default) waits for every handler, 'first' returns earliest non-undefined result and cancels the rest\n\n static event_type?: string // class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n static event_version = '0.0.1'\n static schema = BaseEventSchema // zod schema for the event data fields, used to parse and validate event data when creating a new event\n\n // internal runtime state\n event_bus?: EventBus // bus that dispatched this event, also used by event.emit(child)\n _event_original?: BaseEvent // underlying event object that was dispatched, if this is a bus-scoped proxy wrapping it\n _event_dispatch_context?: unknown | null // captured AsyncLocalStorage context at dispatch site, used to restore that context when running handlers\n\n _event_completed_signal: Deferred<this> | null\n _lock_for_event_handler: AsyncLock | null\n constructor(data: BaseEventInit<Record<string, unknown>> = {}) {\n assertNoReservedUserEventFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoUnknownEventPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoModelPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n const ctor = this.constructor as typeof BaseEvent & {\n event_version?: string\n event_result_type?: z.ZodTypeAny\n }\n const ctor_defaults = EVENT_CLASS_DEFAULTS.get(ctor) ?? {}\n const merged_data = {\n ...ctor_defaults,\n ...data,\n } as BaseEventInit<Record<string, unknown>>\n const event_type = merged_data.event_type ?? ctor.event_type ?? ctor.name\n const event_version = merged_data.event_version ?? ctor.event_version ?? '0.0.1'\n const raw_event_result_type = merged_data.event_result_type ?? ctor.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_id = merged_data.event_id ?? uuidv7()\n const event_created_at = monotonicDatetime(merged_data.event_created_at)\n const event_timeout = merged_data.event_timeout ?? null\n const event_blocks_parent_completion = merged_data.event_blocks_parent_completion ?? false\n\n const base_data = {\n ...merged_data,\n event_id,\n event_created_at,\n event_type,\n event_version,\n event_timeout,\n event_blocks_parent_completion,\n event_result_type,\n }\n\n const schema = ctor.schema ?? BaseEventSchema\n const parsed = schema.parse(base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n\n // load event results from potentially raw objects from JSON to proper EventResult objects\n this.event_results = hydrateEventResults(this, (parsed as { event_results?: unknown }).event_results)\n this.event_pending_bus_count =\n typeof (parsed as { event_pending_bus_count?: unknown }).event_pending_bus_count === 'number'\n ? Math.max(0, Number((parsed as { event_pending_bus_count?: number }).event_pending_bus_count))\n : 0\n const parsed_status = (parsed as { event_status?: unknown }).event_status\n this.event_status =\n parsed_status === 'pending' || parsed_status === 'started' || parsed_status === 'completed' ? parsed_status : 'pending'\n\n this.event_started_at =\n parsed.event_started_at === null || parsed.event_started_at === undefined ? null : monotonicDatetime(parsed.event_started_at)\n this.event_completed_at =\n parsed.event_completed_at === null || parsed.event_completed_at === undefined ? null : monotonicDatetime(parsed.event_completed_at)\n this.event_parent_id =\n typeof (parsed as { event_parent_id?: unknown }).event_parent_id === 'string'\n ? (parsed as { event_parent_id: string }).event_parent_id\n : null\n this.event_emitted_by_handler_id =\n typeof (parsed as { event_emitted_by_handler_id?: unknown }).event_emitted_by_handler_id === 'string'\n ? (parsed as { event_emitted_by_handler_id: string }).event_emitted_by_handler_id\n : null\n\n this.event_result_type = event_result_type\n\n this._event_completed_signal = null\n this._lock_for_event_handler = null\n this._event_dispatch_context = undefined\n }\n\n // \"MyEvent#a48f\"\n toString(): string {\n return `${this.event_type}#${this.event_id.slice(-4)}`\n }\n\n // main entry point for users to define their own event types\n // BaseEvent.extend(\"MyEvent\", { some_custom_field: z.string(), event_result_type: z.string(), event_timeout: 25, ... }) -> MyEvent\n static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape: TShape = {} as TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> {\n const raw_shape = shape as Record<string, unknown>\n assertNoReservedUserEventFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n const raw_event_result_type = raw_shape.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_version = typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined\n const event_defaults = Object.fromEntries(\n Object.entries(raw_shape).filter(\n ([key, value]) => key !== 'event_result_type' && key !== 'event_version' && !(value instanceof z.ZodType)\n )\n )\n\n const zod_shape = extractZodShape(raw_shape)\n const full_schema = BaseEventSchema.extend(zod_shape)\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static schema = full_schema as unknown as typeof BaseEvent.schema\n static event_type = event_type\n static event_version = event_version ?? BaseEvent.event_version\n static event_result_type = event_result_type\n\n constructor(data: EventInit<ZodShapeFrom<TShape>>) {\n super(data as BaseEventInit<Record<string, unknown>>)\n }\n }\n\n type FactoryResult = EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n\n function EventFactory(data: EventInit<ZodShapeFrom<TShape>>): FactoryResult {\n return new ExtendedEvent(data) as FactoryResult\n }\n\n EventFactory.schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n EventFactory.event_type = event_type\n EventFactory.event_version = event_version ?? BaseEvent.event_version\n EventFactory.event_result_type = event_result_type\n EventFactory.class = ExtendedEvent as unknown as new (\n data: EventInit<ZodShapeFrom<TShape>>\n ) => EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n EventFactory.fromJSON = (data: unknown) => (ExtendedEvent.fromJSON as (data: unknown) => FactoryResult)(data)\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_CLASS_DEFAULTS.set(ExtendedEvent, event_defaults)\n\n return EventFactory as unknown as EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const schema = this.schema ?? BaseEventSchema\n const parsed = schema.parse(data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (record.event_result_type !== undefined && record.event_result_type !== null) {\n record.event_result_type = normalizeEventResultType(record.event_result_type)\n }\n return new this(record as BaseEventInit<Record<string, unknown>>) as InstanceType<T>\n }\n\n static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[] {\n return Array.from(events, (event) => {\n const original = event._event_original ?? event\n return original.toJSON()\n })\n }\n\n static fromJSONArray(data: unknown): BaseEvent[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => BaseEvent.fromJSON(item))\n }\n\n toJSON(): BaseEventJSON {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this as unknown as Record<string, unknown>)) {\n if (key.startsWith('_') || key === 'bus' || key === 'event_bus' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON())\n\n return {\n ...record,\n event_id: this.event_id,\n event_type: this.event_type,\n event_version: this.event_version,\n event_result_type: this.event_result_type ? toJsonSchema(this.event_result_type) : this.event_result_type,\n\n // static configuration options\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\n event_concurrency: this.event_concurrency,\n event_handler_concurrency: this.event_handler_concurrency,\n event_handler_completion: this.event_handler_completion,\n event_handler_slow_timeout: this.event_handler_slow_timeout,\n event_handler_timeout: this.event_handler_timeout,\n event_blocks_parent_completion: this.event_blocks_parent_completion,\n\n // mutable parent/child/bus tracking runtime state\n event_parent_id: this.event_parent_id,\n event_path: this.event_path,\n event_emitted_by_handler_id: this.event_emitted_by_handler_id,\n event_pending_bus_count: this.event_pending_bus_count,\n\n // mutable runtime status and timestamps\n event_status: this.event_status,\n event_created_at: this.event_created_at,\n event_started_at: this.event_started_at ?? null,\n event_completed_at: this.event_completed_at ?? null,\n\n // mutable result state\n ...(event_results.length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null {\n const event_slow_timeout = this.event_slow_timeout ?? this.event_bus?.event_slow_timeout ?? null\n const event_warn_ms = event_slow_timeout === null ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = this.event_bus?.name ?? 'EventBus'\n return setTimeout(() => {\n if (this.event_status === 'completed') {\n return\n }\n const running_handler_count = [...this.event_results.values()].filter((result) => result.status === 'started').length\n const started_at = this.event_started_at ?? this.event_created_at\n const elapsed_ms = Math.max(0, Date.now() - Date.parse(started_at))\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(2)\n console.warn(\n `[abxbus] Slow event processing: ${name}.on(${this.event_type}#${this.event_id.slice(-4)}, ${running_handler_count} handlers) still running after ${elapsed_seconds}s`\n )\n }, event_warn_ms)\n }\n\n eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options: EventResultUpdateOptions<this> = {}): EventResult<this> {\n const original_event = (this._event_original ?? this) as this\n let resolved_eventbus = options.eventbus\n let handler_entry: EventHandler\n\n if (handler instanceof EventHandler) {\n handler_entry = handler\n if (!resolved_eventbus && handler_entry.eventbus_id !== ROOT_EVENTBUS_ID && original_event.event_bus) {\n resolved_eventbus =\n original_event.event_bus.all_instances.findBusById(handler_entry.eventbus_id) ??\n (original_event.event_bus.id === handler_entry.eventbus_id ? original_event.event_bus : undefined)\n }\n } else {\n handler_entry = EventHandler.fromCallable({\n handler,\n event_pattern: original_event.event_type,\n eventbus_name: resolved_eventbus?.name ?? 'EventBus',\n eventbus_id: resolved_eventbus?.id ?? ROOT_EVENTBUS_ID,\n })\n }\n\n const scoped_event = resolved_eventbus ? resolved_eventbus._getEventProxyScopedToThisBus(original_event) : original_event\n const handler_id = handler_entry.id\n const existing = original_event.event_results.get(handler_id)\n const event_result: EventResult<this> =\n existing ?? (new EventResult({ event: scoped_event as this, handler: handler_entry }) as EventResult<this>)\n if (!existing) {\n original_event.event_results.set(handler_id, event_result)\n } else {\n if (existing.event !== scoped_event) {\n existing.event = scoped_event as this\n }\n if (existing.handler.id !== handler_entry.id) {\n existing.handler = handler_entry\n }\n }\n\n if (options.status !== undefined || options.result !== undefined || options.error !== undefined) {\n const update_params: Parameters<EventResult<this>['update']>[0] = {}\n if (options.status !== undefined) update_params.status = options.status\n if (options.result !== undefined) update_params.result = options.result\n if (options.error !== undefined) update_params.error = options.error\n event_result.update(update_params)\n if (event_result.status === 'started' && event_result.started_at !== null) {\n original_event._markStarted(event_result.started_at, false)\n }\n if (options.status === 'pending' || options.status === 'started') {\n original_event.event_completed_at = null\n }\n }\n\n return event_result\n }\n\n _createPendingHandlerResults(bus: EventBus): Array<{\n handler: EventHandler\n result: EventResult\n }> {\n const original_event = this._event_original ?? this\n const scoped_event = bus._getEventProxyScopedToThisBus(original_event)\n const handlers = bus._getHandlersForEvent(original_event)\n return handlers.map((entry) => {\n const handler_id = entry.id\n const existing = original_event.event_results.get(handler_id)\n const result = existing ?? new EventResult({ event: scoped_event, handler: entry })\n if (!existing) {\n original_event.event_results.set(handler_id, result)\n } else if (existing.event !== scoped_event) {\n existing.event = scoped_event\n }\n return { handler: entry, result }\n })\n }\n\n private _collectPendingResults(\n original: BaseEvent,\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): EventResult[] {\n if (pending_entries) {\n return pending_entries.map((entry) => entry.result)\n }\n if (!this.event_bus?.id) {\n return Array.from(original.event_results.values())\n }\n return Array.from(original.event_results.values()).filter((result) => result.eventbus_id === this.event_bus!.id)\n }\n\n private _isFirstModeWinningResult(entry: EventResult): boolean {\n return entry.status === 'completed' && entry.result !== undefined && entry.result !== null && !(entry.result instanceof BaseEvent)\n }\n\n private _markFirstModeWinnerIfNeeded(original: BaseEvent, entry: EventResult, first_state: { found: boolean }): void {\n if (first_state.found || !this._isFirstModeWinningResult(entry)) {\n return\n }\n first_state.found = true\n original._markRemainingFirstModeResultCancelled(entry)\n }\n\n private async _runHandlerWithLock(original: BaseEvent, entry: EventResult): Promise<void> {\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n await this.event_bus.locks._runWithHandlerLock(original, this.event_bus.event_handler_concurrency, async (handler_lock) => {\n await entry.runHandler(handler_lock)\n })\n }\n\n // Run all pending handler results for the current bus context.\n async _runHandlers(\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): Promise<void> {\n const original = this._event_original ?? this\n const pending_results = this._collectPendingResults(original, pending_entries)\n if (pending_results.length === 0) {\n return\n }\n const resolved_completion = original.event_handler_completion ?? this.event_bus?.event_handler_completion ?? 'all'\n if (resolved_completion === 'first') {\n if (original._getHandlerLock(this.event_bus?.event_handler_concurrency) !== null) {\n for (const entry of pending_results) {\n await this._runHandlerWithLock(original, entry)\n if (!this._isFirstModeWinningResult(entry)) {\n continue\n }\n original._markRemainingFirstModeResultCancelled(entry)\n break\n }\n return\n }\n const first_state = { found: false }\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n const monitored = pending_results.map((entry, index) =>\n handler_promises[index].then(() => {\n this._markFirstModeWinnerIfNeeded(original, entry, first_state)\n })\n )\n await Promise.all(monitored)\n return\n } else {\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n await Promise.all(handler_promises)\n }\n }\n\n _getHandlerLock(default_concurrency?: EventHandlerConcurrencyMode): AsyncLock | null {\n const original = this._event_original ?? this\n const resolved = original.event_handler_concurrency ?? default_concurrency ?? original.event_bus?.event_handler_concurrency ?? 'serial'\n if (resolved === 'parallel') {\n return null\n }\n if (!original._lock_for_event_handler) {\n original._lock_for_event_handler = new AsyncLock(1)\n }\n return original._lock_for_event_handler\n }\n\n _setHandlerLock(lock: AsyncLock | null): void {\n const original = this._event_original ?? this\n original._lock_for_event_handler = lock\n }\n\n _getDispatchContext(): unknown | null | undefined {\n const original = this._event_original ?? this\n return original._event_dispatch_context\n }\n\n _setDispatchContext(dispatch_context: unknown | null | undefined): void {\n const original = this._event_original ?? this\n original._event_dispatch_context = dispatch_context\n }\n\n // Get parent event object from event_parent_id (checks across all buses)\n get event_parent(): BaseEvent | undefined {\n const original = this._event_original ?? this\n const parent_id = original.event_parent_id\n if (!parent_id) {\n return undefined\n }\n return original.event_bus?.findEventById(parent_id) ?? undefined\n }\n\n // get all direct children of this event\n get event_children(): BaseEvent[] {\n const children: BaseEvent[] = []\n const seen = new Set<string>()\n for (const result of this.event_results.values()) {\n for (const child of result.event_children) {\n if (!seen.has(child.event_id)) {\n seen.add(child.event_id)\n children.push(child)\n }\n }\n }\n return children\n }\n\n // get all children grandchildren etc. recursively\n get event_descendants(): BaseEvent[] {\n const descendants: BaseEvent[] = []\n const visited = new Set<string>()\n const root_id = this.event_id\n const stack = [...this.event_children]\n\n while (stack.length > 0) {\n const child = stack.pop()\n if (!child) {\n continue\n }\n const child_id = child.event_id\n if (child_id === root_id) {\n continue\n }\n if (visited.has(child_id)) {\n continue\n }\n visited.add(child_id)\n descendants.push(child)\n if (child.event_children.length > 0) {\n stack.push(...child.event_children)\n }\n }\n\n return descendants\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_parent = this._event_original ?? this\n const original_child = event._event_original ?? event\n if (!original_child.event_parent_id && original_child.event_id !== original_parent.event_id) {\n original_child.event_parent_id = original_parent.event_id\n }\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n return this.event_bus.emit(original_child as T)\n }\n\n // force-abort processing of all pending descendants of an event regardless of whether they have already started\n _cancelPendingChildProcessing(reason: unknown): void {\n const original = this._event_original ?? this\n const cancellation_cause =\n reason instanceof EventHandlerTimeoutError\n ? reason\n : reason instanceof EventHandlerCancelledError || reason instanceof EventHandlerAbortedError\n ? reason.cause instanceof Error\n ? reason.cause\n : reason\n : reason instanceof Error\n ? reason\n : new Error(String(reason))\n const visited = new Set<string>()\n const cancelChildEvent = (child: BaseEvent): void => {\n const original_child = child._event_original ?? child\n if (visited.has(original_child.event_id)) {\n return\n }\n visited.add(original_child.event_id)\n\n // Depth-first: cancel grandchildren before parent so\n // _areAllChildrenComplete() returns true when we get back up.\n for (const grandchild of original_child.event_children) {\n const original_grandchild = grandchild._event_original ?? grandchild\n if (!original_grandchild.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(grandchild)\n }\n\n original_child._markCancelled(cancellation_cause)\n\n // Force-complete the child event. In JS we can't stop running async\n // handlers, but _markCompleted() resolves the done() promise so callers\n // aren't blocked waiting for background work to finish. The background\n // handler's eventual _markCompleted/_markError is a no-op (terminal guard).\n if (original_child.event_status !== 'completed') {\n original_child._markCompleted()\n }\n }\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(child)\n }\n }\n\n // Cancel all handler results for an event except the winner, used by first() mode.\n // Cancels pending handlers immediately, aborts started handlers via _signalAbort(),\n // and cancels any child events emitted by the losing handlers.\n _markRemainingFirstModeResultCancelled(winner: EventResult): void {\n const cause = new Error('first() resolved: another handler returned a result first')\n const bus_id = winner.eventbus_id\n\n for (const result of this.event_results.values()) {\n if (result === winner) continue\n if (result.eventbus_id !== bus_id) continue\n\n if (result.status === 'pending') {\n result._markError(\n new EventHandlerCancelledError(`Cancelled: first() resolved`, {\n event_result: result,\n cause,\n })\n )\n } else if (result.status === 'started') {\n // Cancel child events emitted by this handler before aborting it\n for (const child of result.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n original_child._cancelPendingChildProcessing(cause)\n original_child._markCancelled(cause)\n }\n\n // Abort the handler itself\n result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted: first() resolved`, {\n event_result: result,\n cause,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n }\n }\n }\n\n // force-abort processing of this event regardless of whether it is pending or has already started\n _markCancelled(cause: Error): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n return\n }\n const path = Array.isArray(original.event_path) ? original.event_path : []\n const buses_to_cancel = new Set<string>(path)\n for (const bus of this.event_bus.all_instances) {\n if (!buses_to_cancel.has(bus.label)) {\n continue\n }\n\n const handler_entries = original._createPendingHandlerResults(bus)\n let updated = false\n for (const entry of handler_entries) {\n if (entry.result.status === 'pending') {\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(cancelled_error)\n updated = true\n } else if (entry.result.status === 'started') {\n entry.result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(aborted_error)\n entry.result._signalAbort(aborted_error)\n updated = true\n }\n }\n\n const removed = bus.removeEventFromPendingQueue(original)\n\n if (removed > 0 && !bus.isEventInFlightOrQueued(original.event_id)) {\n original.event_pending_bus_count = Math.max(0, original.event_pending_bus_count - 1)\n }\n\n if (updated || removed > 0) {\n original._markCompleted(false)\n }\n }\n\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n }\n\n _notifyEventParentsOfCompletion(): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n return\n }\n const visited = new Set<string>()\n let parent_id = original.event_parent_id\n while (parent_id && !visited.has(parent_id)) {\n visited.add(parent_id)\n const parent = this.event_bus.findEventById(parent_id)\n if (!parent) {\n break\n }\n parent._markCompleted(false, false)\n if (parent.event_status !== 'completed') {\n break\n }\n parent_id = parent.event_parent_id\n }\n }\n\n // awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued\n // use eventCompleted() to wait for normal queue-order completion without queue-jumping.\n done(options: EventDoneOptions = {}): Promise<this> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const raise_if_any = options.raise_if_any ?? true\n const completion_promise =\n this.event_status === 'completed' ? Promise.resolve(original as this) : this.event_bus._processEventImmediately(this)\n\n if (!raise_if_any) {\n return completion_promise\n }\n\n // Always delegate to _processEventImmediately \u2014 it walks up the parent event tree\n // to determine whether we're inside a handler (works cross-bus). If no\n // ancestor handler is in-flight, it falls back to eventCompleted().\n return completion_promise.then((completed_event) => {\n const first_error = completed_event._firstProcessingError()\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n return completed_event\n })\n }\n\n // returns the first non-undefined handler result value, cancelling remaining handlers\n // when any handler completes. Works with all event_handler_concurrency modes:\n // parallel: races all handlers, returns first non-undefined, aborts the rest\n // serial: runs handlers sequentially, returns first non-undefined, skips remaining\n first(): Promise<EventResultType<this> | undefined> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original.event_handler_completion = 'first'\n return this.done({ raise_if_any: false }).then((completed_event) => {\n const first_error = completed_event._firstProcessingError({ ignore_first_mode_control_errors: true })\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n const orig = completed_event._event_original ?? completed_event\n return Array.from(orig.event_results.values())\n .filter(\n (result) =>\n result.status === 'completed' && result.result !== undefined && result.result !== null && !(result.result instanceof BaseEvent)\n )\n .sort((a, b) => compareIsoDatetime(a.completed_at, b.completed_at))\n .map((result) => result.result as EventResultType<this>)\n .at(0)\n })\n }\n\n // returns handler result values in event_results insertion order.\n // equivalent to await event.done(); Array.from(event.event_results.values()).map((entry) => entry.result)\n eventResultsList(\n include: EventResultsListInclude<this>,\n options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>>\n eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>\n async eventResultsList(\n include_or_options?: EventResultsListInclude<this> | EventResultsListOptions<this>,\n maybe_options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>> {\n const default_include: EventResultsListInclude<this> = (_result, event_result) =>\n event_result.status === 'completed' &&\n event_result.result !== undefined &&\n event_result.result !== null &&\n !(event_result.result instanceof Error) &&\n !(event_result.result instanceof BaseEvent) &&\n event_result.error === undefined\n\n let options: EventResultsListOptions<this>\n let include: EventResultsListInclude<this>\n if (typeof include_or_options === 'function') {\n options = maybe_options ?? {}\n include = include_or_options\n } else {\n options = include_or_options ?? {}\n include = options.include ?? default_include\n }\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? true\n\n const original = this._event_original ?? this\n const resolved_timeout_seconds = options.timeout ?? original.event_timeout ?? this.event_bus?.event_timeout ?? null\n let completed_event: this\n\n if (resolved_timeout_seconds === null) {\n completed_event = await this.done({ raise_if_any: false })\n } else {\n completed_event = await _runWithTimeout(\n resolved_timeout_seconds,\n () => new Error(`Timed out waiting for ${original.event_type} results after ${resolved_timeout_seconds}s`),\n () => this.done({ raise_if_any: false })\n )\n }\n\n const all_results: EventResult<this>[] = Array.from(completed_event.event_results.values())\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n\n if (raise_if_any && error_results.length > 0) {\n if (error_results.length === 1) {\n const first_error = error_results[0]\n if (first_error.error instanceof Error) {\n throw first_error.error\n }\n if (first_error.result instanceof Error) {\n throw first_error.result\n }\n throw new Error(String(first_error.error ?? first_error.result))\n }\n\n const errors = error_results.map((event_result) => {\n if (event_result.error instanceof Error) {\n return event_result.error\n }\n if (event_result.result instanceof Error) {\n return event_result.result\n }\n return new Error(String(event_result.error ?? event_result.result))\n })\n throw new AggregateError(\n errors,\n `Event ${completed_event.event_type}#${completed_event.event_id.slice(-4)} had ${errors.length} handler error(s)`\n )\n }\n\n const included_results = all_results.filter((event_result) => include(event_result.result, event_result))\n if (raise_if_none && included_results.length === 0) {\n throw new Error(\n `Expected at least one handler to return a non-null result, but none did: ${completed_event.event_type}#${completed_event.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n // awaitable that waits for the event to be processed in normal queue order by the _runloop\n eventCompleted(): Promise<this> {\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n if (this.event_status === 'completed') {\n return Promise.resolve(this)\n }\n this._notifyDoneListeners()\n return this._event_completed_signal!.promise\n }\n\n _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void {\n const original = this._event_original ?? this\n if (original.event_blocks_parent_completion || !original.event_bus) {\n return\n }\n const active_result = original.event_bus.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!active_result || active_result.status !== 'started') {\n return\n }\n const active_parent = active_result.event._event_original ?? active_result.event\n const is_child_of_active_handler =\n original.event_parent_id === active_parent.event_id &&\n original.event_emitted_by_handler_id === active_result.handler_id &&\n active_result.event_children.some((child) => (child._event_original ?? child).event_id === original.event_id)\n if (is_child_of_active_handler) {\n original.event_blocks_parent_completion = true\n }\n }\n\n _markPending(): this {\n const original = this._event_original ?? this\n original.event_status = 'pending'\n original.event_started_at = null\n original.event_completed_at = null\n original.event_results.clear()\n original.event_pending_bus_count = 0\n original._setDispatchContext(undefined)\n original._event_completed_signal = null\n original._lock_for_event_handler = null\n original.event_bus = undefined\n return this\n }\n\n eventReset(): this {\n const original = this._event_original ?? this\n const ctor = original.constructor as typeof BaseEvent\n const fresh_event = ctor.fromJSON(original.toJSON()) as this\n fresh_event.event_id = uuidv7()\n return fresh_event._markPending()\n }\n\n _markStarted(started_at: string | null = null, notify_hook: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status !== 'pending') {\n return\n }\n original.event_status = 'started'\n original.event_started_at = started_at === null ? monotonicDatetime() : monotonicDatetime(started_at)\n if (notify_hook && original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'started')\n }\n }\n\n _markCompleted(force: boolean = true, notify_parents: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status === 'completed') {\n return\n }\n if (!force) {\n if (original.event_pending_bus_count > 0) {\n return\n }\n if (!original._areAllChildrenComplete()) {\n return\n }\n }\n original.event_status = 'completed'\n original.event_completed_at = monotonicDatetime()\n if (original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'completed')\n }\n original._setDispatchContext(null)\n original._notifyDoneListeners()\n original._event_completed_signal!.resolve(original)\n original._event_completed_signal = null\n original.dropFromZeroHistoryBuses()\n if (notify_parents && original.event_bus) {\n original._notifyEventParentsOfCompletion()\n }\n }\n\n private dropFromZeroHistoryBuses(): void {\n if (!this.event_bus) {\n return\n }\n const original = this._event_original ?? this\n for (const bus of this.event_bus.all_instances) {\n if (bus.event_history.max_history_size !== 0) {\n continue\n }\n bus.removeEventFromHistory(original.event_id)\n }\n }\n\n get event_errors(): unknown[] {\n return (\n Array.from(this.event_results.values())\n // filter for events that have completed + have non-undefined error values\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n // sort by completion time\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n // assemble array of flat error values\n .map((event_result) => event_result.error)\n )\n }\n\n private _isFirstModeControlError(error: unknown): boolean {\n if (!(error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError)) {\n return false\n }\n if (error.message.includes('first() resolved')) {\n return true\n }\n return error.cause instanceof Error && error.cause.message.includes('first() resolved')\n }\n\n _firstProcessingError(options: { ignore_first_mode_control_errors?: boolean } = {}): unknown | undefined {\n const ignore_first_mode_control_errors = options.ignore_first_mode_control_errors ?? false\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n .filter((event_result) => (ignore_first_mode_control_errors ? !this._isFirstModeControlError(event_result.error) : true))\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.error)\n .at(0)\n }\n\n // Returns the first non-undefined completed handler result, sorted by completion time.\n // Useful after first() or done() to get the winning result value.\n get event_result(): EventResultType<this> | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.completed_at !== null && event_result.result !== undefined)\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.result as EventResultType<this>)\n .at(0)\n }\n\n _areAllChildrenComplete(visited: Set<string> = new Set()): boolean {\n const original = this._event_original ?? this\n if (visited.has(original.event_id)) {\n return true\n }\n visited.add(original.event_id)\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n if (original_child.event_status !== 'completed') {\n return false\n }\n if (!original_child._areAllChildrenComplete(visited)) {\n return false\n }\n }\n return true\n }\n\n private _notifyDoneListeners(): void {\n if (this._event_completed_signal) {\n return\n }\n this._event_completed_signal = withResolvers<this>()\n }\n\n // Break internal reference chains so a completed event can be GC'd when\n // Evicted from event_history. Called by EventHistory.trimEventHistory().\n _gc(): void {\n this._event_completed_signal = null\n this._setDispatchContext(null)\n this.event_bus = undefined\n this._lock_for_event_handler = null\n for (const result of this.event_results.values()) {\n result.event_children = []\n }\n this.event_results.clear()\n }\n}\n\nconst hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {\n const event_results = new Map<string, EventResult<TEvent>>()\n if (!Array.isArray(raw_event_results)) {\n return event_results\n }\n for (const item of raw_event_results) {\n const result = EventResult.fromJSON(event, item)\n const map_key = typeof result.handler_id === 'string' && result.handler_id.length > 0 ? result.handler_id : result.id\n event_results.set(map_key, result)\n }\n return event_results\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,MAAM,cAAc;AAG7B,SAAS,mBAAmB;AAC5B,SAAS,cAAc,0BAA0B,4BAA4B,gCAAgC;AAE7G;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,iBAAiB,0BAA0B,oBAAoB;AAExE,SAAS,yBAAyB;AAElC,MAAM,6BAA6B,oBAAI,IAAI,CAAC,OAAO,QAAQ,SAAS,YAAY,UAAU,UAAU,CAAC;AAErG,SAAS,gCAAgC,MAA+B,SAAuB;AAC7F,aAAW,cAAc,4BAA4B;AACnD,QAAI,OAAO,UAAU,eAAe,KAAK,MAAM,UAAU,GAAG;AAC1D,YAAM,IAAI,MAAM,GAAG,OAAO,WAAW,UAAU,+EAA+E;AAAA,IAChI;AAAA,EACF;AACF;AAEA,SAAS,mCAAmC,MAA+B,SAAuB;AAChG,aAAW,cAAc,OAAO,KAAK,IAAI,GAAG;AAC1C,QAAI,WAAW,WAAW,QAAQ,KAAK,CAAC,wBAAwB,IAAI,UAAU,GAAG;AAC/E,YAAM,IAAI,MAAM,GAAG,OAAO,WAAW,UAAU,gEAAgE;AAAA,IACjH;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,MAA+B,SAAuB;AACzF,aAAW,cAAc,OAAO,KAAK,IAAI,GAAG;AAC1C,QAAI,WAAW,WAAW,QAAQ,GAAG;AACnC,YAAM,IAAI,MAAM,GAAG,OAAO,WAAW,UAAU,4DAA4D;AAAA,IAC7G;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAiC,OAA0C;AACrG,QAAM,aAAa,QAAQ;AAC3B,QAAM,cAAc,SAAS;AAC7B,MAAI,eAAe,aAAa;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,aAAa,cAAc,KAAK;AACzC;AAEO,MAAM,kBAAkB,EAC5B,OAAO;AAAA,EACN,UAAU,EAAE,OAAO,EAAE,KAAK;AAAA,EAC1B,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,OAAO;AAAA,EACrB,eAAe,EAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EACzC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EACjE,4BAA4B,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EACtE,gCAAgC,EAAE,QAAQ,EAAE,SAAS;AAAA,EACrD,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,6BAA6B,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;AAAA,EACnE,yBAAyB,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS;AAAA,EAC3D,cAAc,EAAE,KAAK,CAAC,WAAW,WAAW,WAAW,CAAC,EAAE,SAAS;AAAA,EACnE,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5D,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC7C,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,SAAS,EAAE,SAAS;AAAA,EACvE,2BAA2B,EAAE,KAAK,+BAA+B,EAAE,SAAS,EAAE,SAAS;AAAA,EACvF,0BAA0B,EAAE,KAAK,8BAA8B,EAAE,SAAS,EAAE,SAAS;AACvF,CAAC,EACA,MAAM;AAET,MAAM,0BAA0B,IAAI,IAAI,OAAO,KAAK,gBAAgB,KAAK,CAAC;AA4E1E,MAAM,uBAAuB,oBAAI,QAA2C;AAC5E,MAAM,mBAAmB;AAoBlB,MAAM,UAAU;AAAA;AAAA,EAErB;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EAEA,OAAO;AAAA;AAAA,EACP,OAAO,gBAAgB;AAAA,EACvB,OAAO,SAAS;AAAA;AAAA;AAAA,EAGhB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA,YAAY,OAA+C,CAAC,GAAG;AAC7D,oCAAgC,MAAiC,WAAW;AAC5E,uCAAmC,MAAiC,WAAW;AAC/E,gCAA4B,MAAiC,WAAW;AACxE,UAAM,OAAO,KAAK;AAIlB,UAAM,gBAAgB,qBAAqB,IAAI,IAAI,KAAK,CAAC;AACzD,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,UAAM,aAAa,YAAY,cAAc,KAAK,cAAc,KAAK;AACrE,UAAM,gBAAgB,YAAY,iBAAiB,KAAK,iBAAiB;AACzE,UAAM,wBAAwB,YAAY,qBAAqB,KAAK;AACpE,UAAM,oBAAoB,yBAAyB,qBAAqB;AACxE,UAAM,WAAW,YAAY,YAAY,OAAO;AAChD,UAAM,mBAAmB,kBAAkB,YAAY,gBAAgB;AACvE,UAAM,gBAAgB,YAAY,iBAAiB;AACnD,UAAM,iCAAiC,YAAY,kCAAkC;AAErF,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,SAAS,OAAO,MAAM,SAAS;AAErC,WAAO,OAAO,MAAM,MAAM;AAE1B,UAAM,cAAe,OAAqC;AAC1D,SAAK,aAAa,MAAM,QAAQ,WAAW,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC;AAGnE,SAAK,gBAAgB,oBAAoB,MAAO,OAAuC,aAAa;AACpG,SAAK,0BACH,OAAQ,OAAiD,4BAA4B,WACjF,KAAK,IAAI,GAAG,OAAQ,OAAgD,uBAAuB,CAAC,IAC5F;AACN,UAAM,gBAAiB,OAAsC;AAC7D,SAAK,eACH,kBAAkB,aAAa,kBAAkB,aAAa,kBAAkB,cAAc,gBAAgB;AAEhH,SAAK,mBACH,OAAO,qBAAqB,QAAQ,OAAO,qBAAqB,SAAY,OAAO,kBAAkB,OAAO,gBAAgB;AAC9H,SAAK,qBACH,OAAO,uBAAuB,QAAQ,OAAO,uBAAuB,SAAY,OAAO,kBAAkB,OAAO,kBAAkB;AACpI,SAAK,kBACH,OAAQ,OAAyC,oBAAoB,WAChE,OAAuC,kBACxC;AACN,SAAK,8BACH,OAAQ,OAAqD,gCAAgC,WACxF,OAAmD,8BACpD;AAEN,SAAK,oBAAoB;AAEzB,SAAK,0BAA0B;AAC/B,SAAK,0BAA0B;AAC/B,SAAK,0BAA0B;AAAA,EACjC;AAAA;AAAA,EAGA,WAAmB;AACjB,WAAO,GAAG,KAAK,UAAU,IAAI,KAAK,SAAS,MAAM,EAAE,CAAC;AAAA,EACtD;AAAA,EASA,OAAO,OACL,YACA,QAAgB,CAAC,GACkD;AACnE,UAAM,YAAY;AAClB,oCAAgC,WAAW,oBAAoB,UAAU,GAAG;AAC5E,uCAAmC,WAAW,oBAAoB,UAAU,GAAG;AAC/E,gCAA4B,WAAW,oBAAoB,UAAU,GAAG;AACxE,UAAM,wBAAwB,UAAU;AACxC,UAAM,oBAAoB,yBAAyB,qBAAqB;AACxE,UAAM,gBAAgB,OAAO,UAAU,kBAAkB,WAAW,UAAU,gBAAgB;AAC9F,UAAM,iBAAiB,OAAO;AAAA,MAC5B,OAAO,QAAQ,SAAS,EAAE;AAAA,QACxB,CAAC,CAAC,KAAK,KAAK,MAAM,QAAQ,uBAAuB,QAAQ,mBAAmB,EAAE,iBAAiB,EAAE;AAAA,MACnG;AAAA,IACF;AAEA,UAAM,YAAY,gBAAgB,SAAS;AAC3C,UAAM,cAAc,gBAAgB,OAAO,SAAS;AAAA,IAGpD,MAAM,sBAAsB,UAAU;AAAA,MACpC,OAAO,SAAS;AAAA,MAChB,OAAO,aAAa;AAAA,MACpB,OAAO,gBAAgB,iBAAiB,UAAU;AAAA,MAClD,OAAO,oBAAoB;AAAA,MAE3B,YAAY,MAAuC;AACjD,cAAM,IAA8C;AAAA,MACtD;AAAA,IACF;AAIA,aAAS,aAAa,MAAsD;AAC1E,aAAO,IAAI,cAAc,IAAI;AAAA,IAC/B;AAEA,iBAAa,SAAS;AACtB,iBAAa,aAAa;AAC1B,iBAAa,gBAAgB,iBAAiB,UAAU;AACxD,iBAAa,oBAAoB;AACjC,iBAAa,QAAQ;AAGrB,iBAAa,WAAW,CAAC,SAAmB,cAAc,SAA8C,IAAI;AAC5G,iBAAa,YAAY,cAAc;AACvC,yBAAqB,IAAI,eAAe,cAAc;AAEtD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAA8C,MAAgC;AACnF,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,SAAS,OAAO,MAAM,IAAI;AAChC,aAAO,IAAI,KAAK,MAAM;AAAA,IACxB;AACA,UAAM,SAAS,EAAE,GAAI,KAAiC;AACtD,QAAI,OAAO,sBAAsB,UAAa,OAAO,sBAAsB,MAAM;AAC/E,aAAO,oBAAoB,yBAAyB,OAAO,iBAAiB;AAAA,IAC9E;AACA,WAAO,IAAI,KAAK,MAAgD;AAAA,EAClE;AAAA,EAEA,OAAO,YAAY,QAA8C;AAC/D,WAAO,MAAM,KAAK,QAAQ,CAAC,UAAU;AACnC,YAAM,WAAW,MAAM,mBAAmB;AAC1C,aAAO,SAAS,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAAc,MAA4B;AAC/C,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,aAAO,CAAC;AAAA,IACV;AACA,WAAO,KAAK,IAAI,CAAC,SAAS,UAAU,SAAS,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,SAAwB;AACtB,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA0C,GAAG;AACrF,UAAI,IAAI,WAAW,GAAG,KAAK,QAAQ,SAAS,QAAQ,eAAe,QAAQ,gBAAiB;AAC5F,UAAI,UAAU,UAAa,OAAO,UAAU,WAAY;AACxD,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,UAAM,gBAAgB,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC;AAE7F,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK;AAAA,MACpB,mBAAmB,KAAK,oBAAoB,aAAa,KAAK,iBAAiB,IAAI,KAAK;AAAA;AAAA,MAGxF,eAAe,KAAK;AAAA,MACpB,oBAAoB,KAAK;AAAA,MACzB,mBAAmB,KAAK;AAAA,MACxB,2BAA2B,KAAK;AAAA,MAChC,0BAA0B,KAAK;AAAA,MAC/B,4BAA4B,KAAK;AAAA,MACjC,uBAAuB,KAAK;AAAA,MAC5B,gCAAgC,KAAK;AAAA;AAAA,MAGrC,iBAAiB,KAAK;AAAA,MACtB,YAAY,KAAK;AAAA,MACjB,6BAA6B,KAAK;AAAA,MAClC,yBAAyB,KAAK;AAAA;AAAA,MAG9B,cAAc,KAAK;AAAA,MACnB,kBAAkB,KAAK;AAAA,MACvB,kBAAkB,KAAK,oBAAoB;AAAA,MAC3C,oBAAoB,KAAK,sBAAsB;AAAA;AAAA,MAG/C,GAAI,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,+BAAqE;AACnE,UAAM,qBAAqB,KAAK,sBAAsB,KAAK,WAAW,sBAAsB;AAC5F,UAAM,gBAAgB,uBAAuB,OAAO,OAAO,qBAAqB;AAChF,QAAI,kBAAkB,MAAM;AAC1B,aAAO;AAAA,IACT;AACA,UAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,WAAO,WAAW,MAAM;AACtB,UAAI,KAAK,iBAAiB,aAAa;AACrC;AAAA,MACF;AACA,YAAM,wBAAwB,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,OAAO,WAAW,SAAS,EAAE;AAC/G,YAAM,aAAa,KAAK,oBAAoB,KAAK;AACjD,YAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,UAAU,CAAC;AAClE,YAAM,mBAAmB,aAAa,KAAM,QAAQ,CAAC;AACrD,cAAQ;AAAA,QACN,mCAAmC,IAAI,OAAO,KAAK,UAAU,IAAI,KAAK,SAAS,MAAM,EAAE,CAAC,KAAK,qBAAqB,kCAAkC,eAAe;AAAA,MACrK;AAAA,IACF,GAAG,aAAa;AAAA,EAClB;AAAA,EAEA,kBAAkB,SAAoD,UAA0C,CAAC,GAAsB;AACrI,UAAM,iBAAkB,KAAK,mBAAmB;AAChD,QAAI,oBAAoB,QAAQ;AAChC,QAAI;AAEJ,QAAI,mBAAmB,cAAc;AACnC,sBAAgB;AAChB,UAAI,CAAC,qBAAqB,cAAc,gBAAgB,oBAAoB,eAAe,WAAW;AACpG,4BACE,eAAe,UAAU,cAAc,YAAY,cAAc,WAAW,MAC3E,eAAe,UAAU,OAAO,cAAc,cAAc,eAAe,YAAY;AAAA,MAC5F;AAAA,IACF,OAAO;AACL,sBAAgB,aAAa,aAAa;AAAA,QACxC;AAAA,QACA,eAAe,eAAe;AAAA,QAC9B,eAAe,mBAAmB,QAAQ;AAAA,QAC1C,aAAa,mBAAmB,MAAM;AAAA,MACxC,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,oBAAoB,kBAAkB,8BAA8B,cAAc,IAAI;AAC3G,UAAM,aAAa,cAAc;AACjC,UAAM,WAAW,eAAe,cAAc,IAAI,UAAU;AAC5D,UAAM,eACJ,YAAa,IAAI,YAAY,EAAE,OAAO,cAAsB,SAAS,cAAc,CAAC;AACtF,QAAI,CAAC,UAAU;AACb,qBAAe,cAAc,IAAI,YAAY,YAAY;AAAA,IAC3D,OAAO;AACL,UAAI,SAAS,UAAU,cAAc;AACnC,iBAAS,QAAQ;AAAA,MACnB;AACA,UAAI,SAAS,QAAQ,OAAO,cAAc,IAAI;AAC5C,iBAAS,UAAU;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,UAAa,QAAQ,WAAW,UAAa,QAAQ,UAAU,QAAW;AAC/F,YAAM,gBAA4D,CAAC;AACnE,UAAI,QAAQ,WAAW,OAAW,eAAc,SAAS,QAAQ;AACjE,UAAI,QAAQ,WAAW,OAAW,eAAc,SAAS,QAAQ;AACjE,UAAI,QAAQ,UAAU,OAAW,eAAc,QAAQ,QAAQ;AAC/D,mBAAa,OAAO,aAAa;AACjC,UAAI,aAAa,WAAW,aAAa,aAAa,eAAe,MAAM;AACzE,uBAAe,aAAa,aAAa,YAAY,KAAK;AAAA,MAC5D;AACA,UAAI,QAAQ,WAAW,aAAa,QAAQ,WAAW,WAAW;AAChE,uBAAe,qBAAqB;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,6BAA6B,KAG1B;AACD,UAAM,iBAAiB,KAAK,mBAAmB;AAC/C,UAAM,eAAe,IAAI,8BAA8B,cAAc;AACrE,UAAM,WAAW,IAAI,qBAAqB,cAAc;AACxD,WAAO,SAAS,IAAI,CAAC,UAAU;AAC7B,YAAM,aAAa,MAAM;AACzB,YAAM,WAAW,eAAe,cAAc,IAAI,UAAU;AAC5D,YAAM,SAAS,YAAY,IAAI,YAAY,EAAE,OAAO,cAAc,SAAS,MAAM,CAAC;AAClF,UAAI,CAAC,UAAU;AACb,uBAAe,cAAc,IAAI,YAAY,MAAM;AAAA,MACrD,WAAW,SAAS,UAAU,cAAc;AAC1C,iBAAS,QAAQ;AAAA,MACnB;AACA,aAAO,EAAE,SAAS,OAAO,OAAO;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEQ,uBACN,UACA,iBAIe;AACf,QAAI,iBAAiB;AACnB,aAAO,gBAAgB,IAAI,CAAC,UAAU,MAAM,MAAM;AAAA,IACpD;AACA,QAAI,CAAC,KAAK,WAAW,IAAI;AACvB,aAAO,MAAM,KAAK,SAAS,cAAc,OAAO,CAAC;AAAA,IACnD;AACA,WAAO,MAAM,KAAK,SAAS,cAAc,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,OAAO,gBAAgB,KAAK,UAAW,EAAE;AAAA,EACjH;AAAA,EAEQ,0BAA0B,OAA6B;AAC7D,WAAO,MAAM,WAAW,eAAe,MAAM,WAAW,UAAa,MAAM,WAAW,QAAQ,EAAE,MAAM,kBAAkB;AAAA,EAC1H;AAAA,EAEQ,6BAA6B,UAAqB,OAAoB,aAAuC;AACnH,QAAI,YAAY,SAAS,CAAC,KAAK,0BAA0B,KAAK,GAAG;AAC/D;AAAA,IACF;AACA,gBAAY,QAAQ;AACpB,aAAS,uCAAuC,KAAK;AAAA,EACvD;AAAA,EAEA,MAAc,oBAAoB,UAAqB,OAAmC;AACxF,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,UAAM,KAAK,UAAU,MAAM,oBAAoB,UAAU,KAAK,UAAU,2BAA2B,OAAO,iBAAiB;AACzH,YAAM,MAAM,WAAW,YAAY;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aACJ,iBAIe;AACf,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,kBAAkB,KAAK,uBAAuB,UAAU,eAAe;AAC7E,QAAI,gBAAgB,WAAW,GAAG;AAChC;AAAA,IACF;AACA,UAAM,sBAAsB,SAAS,4BAA4B,KAAK,WAAW,4BAA4B;AAC7G,QAAI,wBAAwB,SAAS;AACnC,UAAI,SAAS,gBAAgB,KAAK,WAAW,yBAAyB,MAAM,MAAM;AAChF,mBAAW,SAAS,iBAAiB;AACnC,gBAAM,KAAK,oBAAoB,UAAU,KAAK;AAC9C,cAAI,CAAC,KAAK,0BAA0B,KAAK,GAAG;AAC1C;AAAA,UACF;AACA,mBAAS,uCAAuC,KAAK;AACrD;AAAA,QACF;AACA;AAAA,MACF;AACA,YAAM,cAAc,EAAE,OAAO,MAAM;AACnC,YAAM,mBAAmB,gBAAgB,IAAI,CAAC,UAAU,KAAK,oBAAoB,UAAU,KAAK,CAAC;AACjG,YAAM,YAAY,gBAAgB;AAAA,QAAI,CAAC,OAAO,UAC5C,iBAAiB,KAAK,EAAE,KAAK,MAAM;AACjC,eAAK,6BAA6B,UAAU,OAAO,WAAW;AAAA,QAChE,CAAC;AAAA,MACH;AACA,YAAM,QAAQ,IAAI,SAAS;AAC3B;AAAA,IACF,OAAO;AACL,YAAM,mBAAmB,gBAAgB,IAAI,CAAC,UAAU,KAAK,oBAAoB,UAAU,KAAK,CAAC;AACjG,YAAM,QAAQ,IAAI,gBAAgB;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,gBAAgB,qBAAqE;AACnF,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,WAAW,SAAS,6BAA6B,uBAAuB,SAAS,WAAW,6BAA6B;AAC/H,QAAI,aAAa,YAAY;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,CAAC,SAAS,yBAAyB;AACrC,eAAS,0BAA0B,IAAI,UAAU,CAAC;AAAA,IACpD;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,gBAAgB,MAA8B;AAC5C,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,0BAA0B;AAAA,EACrC;AAAA,EAEA,sBAAkD;AAChD,UAAM,WAAW,KAAK,mBAAmB;AACzC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,oBAAoB,kBAAoD;AACtE,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,0BAA0B;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,eAAsC;AACxC,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,YAAY,SAAS;AAC3B,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AACA,WAAO,SAAS,WAAW,cAAc,SAAS,KAAK;AAAA,EACzD;AAAA;AAAA,EAGA,IAAI,iBAA8B;AAChC,UAAM,WAAwB,CAAC;AAC/B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,UAAU,KAAK,cAAc,OAAO,GAAG;AAChD,iBAAW,SAAS,OAAO,gBAAgB;AACzC,YAAI,CAAC,KAAK,IAAI,MAAM,QAAQ,GAAG;AAC7B,eAAK,IAAI,MAAM,QAAQ;AACvB,mBAAS,KAAK,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,oBAAiC;AACnC,UAAM,cAA2B,CAAC;AAClC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,CAAC,GAAG,KAAK,cAAc;AAErC,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,QAAQ,MAAM,IAAI;AACxB,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,YAAM,WAAW,MAAM;AACvB,UAAI,aAAa,SAAS;AACxB;AAAA,MACF;AACA,UAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB;AAAA,MACF;AACA,cAAQ,IAAI,QAAQ;AACpB,kBAAY,KAAK,KAAK;AACtB,UAAI,MAAM,eAAe,SAAS,GAAG;AACnC,cAAM,KAAK,GAAG,MAAM,cAAc;AAAA,MACpC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,KAA0B,OAAa;AACrC,UAAM,kBAAkB,KAAK,mBAAmB;AAChD,UAAM,iBAAiB,MAAM,mBAAmB;AAChD,QAAI,CAAC,eAAe,mBAAmB,eAAe,aAAa,gBAAgB,UAAU;AAC3F,qBAAe,kBAAkB,gBAAgB;AAAA,IACnD;AACA,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,WAAO,KAAK,UAAU,KAAK,cAAmB;AAAA,EAChD;AAAA;AAAA,EAGA,8BAA8B,QAAuB;AACnD,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,qBACJ,kBAAkB,2BACd,SACA,kBAAkB,8BAA8B,kBAAkB,2BAChE,OAAO,iBAAiB,QACtB,OAAO,QACP,SACF,kBAAkB,QAChB,SACA,IAAI,MAAM,OAAO,MAAM,CAAC;AAClC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,mBAAmB,CAAC,UAA2B;AACnD,YAAM,iBAAiB,MAAM,mBAAmB;AAChD,UAAI,QAAQ,IAAI,eAAe,QAAQ,GAAG;AACxC;AAAA,MACF;AACA,cAAQ,IAAI,eAAe,QAAQ;AAInC,iBAAW,cAAc,eAAe,gBAAgB;AACtD,cAAM,sBAAsB,WAAW,mBAAmB;AAC1D,YAAI,CAAC,oBAAoB,gCAAgC;AACvD;AAAA,QACF;AACA,yBAAiB,UAAU;AAAA,MAC7B;AAEA,qBAAe,eAAe,kBAAkB;AAMhD,UAAI,eAAe,iBAAiB,aAAa;AAC/C,uBAAe,eAAe;AAAA,MAChC;AAAA,IACF;AAEA,eAAW,SAAS,SAAS,gBAAgB;AAC3C,YAAM,iBAAiB,MAAM,mBAAmB;AAChD,UAAI,CAAC,eAAe,gCAAgC;AAClD;AAAA,MACF;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uCAAuC,QAA2B;AAChE,UAAM,QAAQ,IAAI,MAAM,2DAA2D;AACnF,UAAM,SAAS,OAAO;AAEtB,eAAW,UAAU,KAAK,cAAc,OAAO,GAAG;AAChD,UAAI,WAAW,OAAQ;AACvB,UAAI,OAAO,gBAAgB,OAAQ;AAEnC,UAAI,OAAO,WAAW,WAAW;AAC/B,eAAO;AAAA,UACL,IAAI,2BAA2B,+BAA+B;AAAA,YAC5D,cAAc;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WAAW,OAAO,WAAW,WAAW;AAEtC,mBAAW,SAAS,OAAO,gBAAgB;AACzC,gBAAM,iBAAiB,MAAM,mBAAmB;AAChD,cAAI,CAAC,eAAe,gCAAgC;AAClD;AAAA,UACF;AACA,yBAAe,8BAA8B,KAAK;AAClD,yBAAe,eAAe,KAAK;AAAA,QACrC;AAGA,eAAO,OAAO,eAAe;AAC7B,cAAM,gBAAgB,IAAI,yBAAyB,6BAA6B;AAAA,UAC9E,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AACD,eAAO,WAAW,aAAa;AAC/B,eAAO,aAAa,aAAa;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAe,OAAoB;AACjC,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,CAAC,KAAK,WAAW;AACnB,UAAI,SAAS,iBAAiB,aAAa;AACzC,iBAAS,eAAe;AAAA,MAC1B;AACA;AAAA,IACF;AACA,UAAM,OAAO,MAAM,QAAQ,SAAS,UAAU,IAAI,SAAS,aAAa,CAAC;AACzE,UAAM,kBAAkB,IAAI,IAAY,IAAI;AAC5C,eAAW,OAAO,KAAK,UAAU,eAAe;AAC9C,UAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,GAAG;AACnC;AAAA,MACF;AAEA,YAAM,kBAAkB,SAAS,6BAA6B,GAAG;AACjE,UAAI,UAAU;AACd,iBAAW,SAAS,iBAAiB;AACnC,YAAI,MAAM,OAAO,WAAW,WAAW;AACrC,gBAAM,kBAAkB,IAAI,2BAA2B,kDAAkD,MAAM,OAAO,IAAI;AAAA,YACxH,cAAc,MAAM;AAAA,YACpB;AAAA,UACF,CAAC;AACD,gBAAM,OAAO,WAAW,eAAe;AACvC,oBAAU;AAAA,QACZ,WAAW,MAAM,OAAO,WAAW,WAAW;AAC5C,gBAAM,OAAO,OAAO,eAAe;AACnC,gBAAM,gBAAgB,IAAI,yBAAyB,gDAAgD,MAAM,OAAO,IAAI;AAAA,YAClH,cAAc,MAAM;AAAA,YACpB;AAAA,UACF,CAAC;AACD,gBAAM,OAAO,WAAW,aAAa;AACrC,gBAAM,OAAO,aAAa,aAAa;AACvC,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,UAAU,IAAI,4BAA4B,QAAQ;AAExD,UAAI,UAAU,KAAK,CAAC,IAAI,wBAAwB,SAAS,QAAQ,GAAG;AAClE,iBAAS,0BAA0B,KAAK,IAAI,GAAG,SAAS,0BAA0B,CAAC;AAAA,MACrF;AAEA,UAAI,WAAW,UAAU,GAAG;AAC1B,iBAAS,eAAe,KAAK;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,SAAS,iBAAiB,aAAa;AACzC,eAAS,eAAe;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,kCAAwC;AACtC,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AACA,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,YAAY,SAAS;AACzB,WAAO,aAAa,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3C,cAAQ,IAAI,SAAS;AACrB,YAAM,SAAS,KAAK,UAAU,cAAc,SAAS;AACrD,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,aAAO,eAAe,OAAO,KAAK;AAClC,UAAI,OAAO,iBAAiB,aAAa;AACvC;AAAA,MACF;AACA,kBAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,KAAK,UAA4B,CAAC,GAAkB;AAClD,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,QAAQ,OAAO,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC9D;AACA,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,wDAAwD;AACjE,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,qBACJ,KAAK,iBAAiB,cAAc,QAAQ,QAAQ,QAAgB,IAAI,KAAK,UAAU,yBAAyB,IAAI;AAEtH,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAKA,WAAO,mBAAmB,KAAK,CAAC,oBAAoB;AAClD,YAAM,cAAc,gBAAgB,sBAAsB;AAC1D,UAAI,gBAAgB,QAAW;AAC7B,YAAI,uBAAuB,OAAO;AAChC,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,MAAM,OAAO,WAAW,CAAC;AAAA,MACrC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAoD;AAClD,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,QAAQ,OAAO,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC9D;AACA,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,2BAA2B;AACpC,WAAO,KAAK,KAAK,EAAE,cAAc,MAAM,CAAC,EAAE,KAAK,CAAC,oBAAoB;AAClE,YAAM,cAAc,gBAAgB,sBAAsB,EAAE,kCAAkC,KAAK,CAAC;AACpG,UAAI,gBAAgB,QAAW;AAC7B,YAAI,uBAAuB,OAAO;AAChC,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,MAAM,OAAO,WAAW,CAAC;AAAA,MACrC;AACA,YAAM,OAAO,gBAAgB,mBAAmB;AAChD,aAAO,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAC1C;AAAA,QACC,CAAC,WACC,OAAO,WAAW,eAAe,OAAO,WAAW,UAAa,OAAO,WAAW,QAAQ,EAAE,OAAO,kBAAkB;AAAA,MACzH,EACC,KAAK,CAAC,GAAG,MAAM,mBAAmB,EAAE,cAAc,EAAE,YAAY,CAAC,EACjE,IAAI,CAAC,WAAW,OAAO,MAA+B,EACtD,GAAG,CAAC;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EASA,MAAM,iBACJ,oBACA,eACmD;AACnD,UAAM,kBAAiD,CAAC,SAAS,iBAC/D,aAAa,WAAW,eACxB,aAAa,WAAW,UACxB,aAAa,WAAW,QACxB,EAAE,aAAa,kBAAkB,UACjC,EAAE,aAAa,kBAAkB,cACjC,aAAa,UAAU;AAEzB,QAAI;AACJ,QAAI;AACJ,QAAI,OAAO,uBAAuB,YAAY;AAC5C,gBAAU,iBAAiB,CAAC;AAC5B,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,sBAAsB,CAAC;AACjC,gBAAU,QAAQ,WAAW;AAAA,IAC/B;AACA,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,2BAA2B,QAAQ,WAAW,SAAS,iBAAiB,KAAK,WAAW,iBAAiB;AAC/G,QAAI;AAEJ,QAAI,6BAA6B,MAAM;AACrC,wBAAkB,MAAM,KAAK,KAAK,EAAE,cAAc,MAAM,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,MAAM;AAAA,QACtB;AAAA,QACA,MAAM,IAAI,MAAM,yBAAyB,SAAS,UAAU,kBAAkB,wBAAwB,GAAG;AAAA,QACzG,MAAM,KAAK,KAAK,EAAE,cAAc,MAAM,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,cAAmC,MAAM,KAAK,gBAAgB,cAAc,OAAO,CAAC;AAC1F,UAAM,gBAAgB,YAAY,OAAO,CAAC,iBAAiB,aAAa,UAAU,UAAa,aAAa,kBAAkB,KAAK;AAEnI,QAAI,gBAAgB,cAAc,SAAS,GAAG;AAC5C,UAAI,cAAc,WAAW,GAAG;AAC9B,cAAM,cAAc,cAAc,CAAC;AACnC,YAAI,YAAY,iBAAiB,OAAO;AACtC,gBAAM,YAAY;AAAA,QACpB;AACA,YAAI,YAAY,kBAAkB,OAAO;AACvC,gBAAM,YAAY;AAAA,QACpB;AACA,cAAM,IAAI,MAAM,OAAO,YAAY,SAAS,YAAY,MAAM,CAAC;AAAA,MACjE;AAEA,YAAM,SAAS,cAAc,IAAI,CAAC,iBAAiB;AACjD,YAAI,aAAa,iBAAiB,OAAO;AACvC,iBAAO,aAAa;AAAA,QACtB;AACA,YAAI,aAAa,kBAAkB,OAAO;AACxC,iBAAO,aAAa;AAAA,QACtB;AACA,eAAO,IAAI,MAAM,OAAO,aAAa,SAAS,aAAa,MAAM,CAAC;AAAA,MACpE,CAAC;AACD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,SAAS,gBAAgB,UAAU,IAAI,gBAAgB,SAAS,MAAM,EAAE,CAAC,QAAQ,OAAO,MAAM;AAAA,MAChG;AAAA,IACF;AAEA,UAAM,mBAAmB,YAAY,OAAO,CAAC,iBAAiB,QAAQ,aAAa,QAAQ,YAAY,CAAC;AACxG,QAAI,iBAAiB,iBAAiB,WAAW,GAAG;AAClD,YAAM,IAAI;AAAA,QACR,4EAA4E,gBAAgB,UAAU,IAAI,gBAAgB,SAAS,MAAM,EAAE,CAAC;AAAA,MAC9I;AAAA,IACF;AAEA,WAAO,iBAAiB,IAAI,CAAC,iBAAiB,aAAa,MAAM;AAAA,EACnE;AAAA;AAAA,EAGA,iBAAgC;AAC9B,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,wDAAwD;AACjE,QAAI,KAAK,iBAAiB,aAAa;AACrC,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC7B;AACA,SAAK,qBAAqB;AAC1B,WAAO,KAAK,wBAAyB;AAAA,EACvC;AAAA,EAEA,0DAAgE;AAC9D,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,SAAS,kCAAkC,CAAC,SAAS,WAAW;AAClE;AAAA,IACF;AACA,UAAM,gBAAgB,SAAS,UAAU,MAAM,8CAA8C;AAC7F,QAAI,CAAC,iBAAiB,cAAc,WAAW,WAAW;AACxD;AAAA,IACF;AACA,UAAM,gBAAgB,cAAc,MAAM,mBAAmB,cAAc;AAC3E,UAAM,6BACJ,SAAS,oBAAoB,cAAc,YAC3C,SAAS,gCAAgC,cAAc,cACvD,cAAc,eAAe,KAAK,CAAC,WAAW,MAAM,mBAAmB,OAAO,aAAa,SAAS,QAAQ;AAC9G,QAAI,4BAA4B;AAC9B,eAAS,iCAAiC;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,UAAM,WAAW,KAAK,mBAAmB;AACzC,aAAS,eAAe;AACxB,aAAS,mBAAmB;AAC5B,aAAS,qBAAqB;AAC9B,aAAS,cAAc,MAAM;AAC7B,aAAS,0BAA0B;AACnC,aAAS,oBAAoB,MAAS;AACtC,aAAS,0BAA0B;AACnC,aAAS,0BAA0B;AACnC,aAAS,YAAY;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,aAAmB;AACjB,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,OAAO,SAAS;AACtB,UAAM,cAAc,KAAK,SAAS,SAAS,OAAO,CAAC;AACnD,gBAAY,WAAW,OAAO;AAC9B,WAAO,YAAY,aAAa;AAAA,EAClC;AAAA,EAEA,aAAa,aAA4B,MAAM,cAAuB,MAAY;AAChF,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,SAAS,iBAAiB,WAAW;AACvC;AAAA,IACF;AACA,aAAS,eAAe;AACxB,aAAS,mBAAmB,eAAe,OAAO,kBAAkB,IAAI,kBAAkB,UAAU;AACpG,QAAI,eAAe,SAAS,WAAW;AACrC,YAAM,eAAe,SAAS;AAC9B,YAAM,gBAAgB,aAAa,8BAA8B,QAAQ;AACzE,WAAK,aAAa,cAAc,eAAe,SAAS;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,eAAe,QAAiB,MAAM,iBAA0B,MAAY;AAC1E,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,SAAS,iBAAiB,aAAa;AACzC;AAAA,IACF;AACA,QAAI,CAAC,OAAO;AACV,UAAI,SAAS,0BAA0B,GAAG;AACxC;AAAA,MACF;AACA,UAAI,CAAC,SAAS,wBAAwB,GAAG;AACvC;AAAA,MACF;AAAA,IACF;AACA,aAAS,eAAe;AACxB,aAAS,qBAAqB,kBAAkB;AAChD,QAAI,SAAS,WAAW;AACtB,YAAM,eAAe,SAAS;AAC9B,YAAM,gBAAgB,aAAa,8BAA8B,QAAQ;AACzE,WAAK,aAAa,cAAc,eAAe,WAAW;AAAA,IAC5D;AACA,aAAS,oBAAoB,IAAI;AACjC,aAAS,qBAAqB;AAC9B,aAAS,wBAAyB,QAAQ,QAAQ;AAClD,aAAS,0BAA0B;AACnC,aAAS,yBAAyB;AAClC,QAAI,kBAAkB,SAAS,WAAW;AACxC,eAAS,gCAAgC;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,2BAAiC;AACvC,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AACA,UAAM,WAAW,KAAK,mBAAmB;AACzC,eAAW,OAAO,KAAK,UAAU,eAAe;AAC9C,UAAI,IAAI,cAAc,qBAAqB,GAAG;AAC5C;AAAA,MACF;AACA,UAAI,uBAAuB,SAAS,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,IAAI,eAA0B;AAC5B,WACE,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAEnC,OAAO,CAAC,iBAAiB,aAAa,UAAU,UAAa,aAAa,iBAAiB,IAAI,EAE/F,KAAK,CAAC,gBAAgB,mBAAmB,mBAAmB,eAAe,cAAc,eAAe,YAAY,CAAC,EAErH,IAAI,CAAC,iBAAiB,aAAa,KAAK;AAAA,EAE/C;AAAA,EAEQ,yBAAyB,OAAyB;AACxD,QAAI,EAAE,iBAAiB,8BAA8B,iBAAiB,2BAA2B;AAC/F,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,SAAS,kBAAkB,GAAG;AAC9C,aAAO;AAAA,IACT;AACA,WAAO,MAAM,iBAAiB,SAAS,MAAM,MAAM,QAAQ,SAAS,kBAAkB;AAAA,EACxF;AAAA,EAEA,sBAAsB,UAA0D,CAAC,GAAwB;AACvG,UAAM,mCAAmC,QAAQ,oCAAoC;AACrF,WAAO,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAC1C,OAAO,CAAC,iBAAiB,aAAa,UAAU,UAAa,aAAa,iBAAiB,IAAI,EAC/F,OAAO,CAAC,iBAAkB,mCAAmC,CAAC,KAAK,yBAAyB,aAAa,KAAK,IAAI,IAAK,EACvH,KAAK,CAAC,gBAAgB,mBAAmB,mBAAmB,eAAe,cAAc,eAAe,YAAY,CAAC,EACrH,IAAI,CAAC,iBAAiB,aAAa,KAAK,EACxC,GAAG,CAAC;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,IAAI,eAAkD;AACpD,WAAO,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAC1C,OAAO,CAAC,iBAAiB,aAAa,iBAAiB,QAAQ,aAAa,WAAW,MAAS,EAChG,KAAK,CAAC,gBAAgB,mBAAmB,mBAAmB,eAAe,cAAc,eAAe,YAAY,CAAC,EACrH,IAAI,CAAC,iBAAiB,aAAa,MAA+B,EAClE,GAAG,CAAC;AAAA,EACT;AAAA,EAEA,wBAAwB,UAAuB,oBAAI,IAAI,GAAY;AACjE,UAAM,WAAW,KAAK,mBAAmB;AACzC,QAAI,QAAQ,IAAI,SAAS,QAAQ,GAAG;AAClC,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,SAAS,QAAQ;AAE7B,eAAW,SAAS,SAAS,gBAAgB;AAC3C,YAAM,iBAAiB,MAAM,mBAAmB;AAChD,UAAI,CAAC,eAAe,gCAAgC;AAClD;AAAA,MACF;AACA,UAAI,eAAe,iBAAiB,aAAa;AAC/C,eAAO;AAAA,MACT;AACA,UAAI,CAAC,eAAe,wBAAwB,OAAO,GAAG;AACpD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAA6B;AACnC,QAAI,KAAK,yBAAyB;AAChC;AAAA,IACF;AACA,SAAK,0BAA0B,cAAoB;AAAA,EACrD;AAAA;AAAA;AAAA,EAIA,MAAY;AACV,SAAK,0BAA0B;AAC/B,SAAK,oBAAoB,IAAI;AAC7B,SAAK,YAAY;AACjB,SAAK,0BAA0B;AAC/B,eAAW,UAAU,KAAK,cAAc,OAAO,GAAG;AAChD,aAAO,iBAAiB,CAAC;AAAA,IAC3B;AACA,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;AAEA,MAAM,sBAAsB,CAA2B,OAAe,sBAAiE;AACrI,QAAM,gBAAgB,oBAAI,IAAiC;AAC3D,MAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AACrC,WAAO;AAAA,EACT;AACA,aAAW,QAAQ,mBAAmB;AACpC,UAAM,SAAS,YAAY,SAAS,OAAO,IAAI;AAC/C,UAAM,UAAU,OAAO,OAAO,eAAe,YAAY,OAAO,WAAW,SAAS,IAAI,OAAO,aAAa,OAAO;AACnH,kBAAc,IAAI,SAAS,MAAM;AAAA,EACnC;AACA,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bridge_jsonl.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport { EventBus } from './event_bus.js'\nimport type { EventClass, EventHandlerCallable, EventPattern, UntypedEventHandlerFunction } from './types.js'\n\nconst isNodeRuntime = (): boolean => {\n const maybe_process = (globalThis as { process?: { versions?: { node?: string } } }).process\n return typeof maybe_process?.versions?.node === 'string'\n}\n\nconst importNodeModule = async (specifier: string): Promise<any> => {\n const dynamic_import = Function('module_name', 'return import(module_name)') as (module_name: string) => Promise<unknown>\n return dynamic_import(specifier) as Promise<any>\n}\n\nconst randomSuffix = (): string => Math.random().toString(36).slice(2, 10)\n\nexport class JSONLEventBridge {\n readonly path: string\n readonly poll_interval: number\n readonly name: string\n\n private readonly inbound_bus: EventBus\n private running: boolean\n private byte_offset: number\n private pending_line: string\n private listener_task: Promise<void> | null\n\n constructor(path: string, poll_interval: number = 0.25, name?: string) {\n this.path = path\n this.poll_interval = poll_interval\n this.name = name ?? `JSONLEventBridge_${randomSuffix()}`\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.running = false\n this.byte_offset = 0\n this.pending_line = ''\n this.listener_task = null\n\n this.dispatch = this.dispatch.bind(this)\n this.emit = this.emit.bind(this)\n this.on = this.on.bind(this)\n }\n\n on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void\n on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void\n on(event_pattern: EventPattern | '*', handler: EventHandlerCallable | UntypedEventHandlerFunction): void {\n this.ensureStarted()\n if (typeof event_pattern === 'string') {\n this.inbound_bus.on(event_pattern, handler as UntypedEventHandlerFunction<BaseEvent>)\n return\n }\n this.inbound_bus.on(event_pattern as EventClass<BaseEvent>, handler as EventHandlerCallable<BaseEvent>)\n }\n\n async emit<T extends BaseEvent>(event: T): Promise<void> {\n this.ensureStarted()\n const fs = await this.loadFs()\n await fs.promises.mkdir(this.dirname(this.path), { recursive: true })\n const payload = JSON.stringify(event.toJSON()) + '\\n'\n await fs.promises.appendFile(this.path, payload, 'utf8')\n }\n\n async dispatch<T extends BaseEvent>(event: T): Promise<void> {\n return this.emit(event)\n }\n\n async start(): Promise<void> {\n if (this.running) return\n const fs = await this.loadFs()\n await fs.promises.mkdir(this.dirname(this.path), { recursive: true })\n await fs.promises.appendFile(this.path, '', 'utf8')\n const stats = await fs.promises.stat(this.path)\n this.byte_offset = Number(stats.size ?? 0)\n this.pending_line = ''\n this.running = true\n this.listener_task = this.listenLoop()\n }\n\n async close(): Promise<void> {\n this.running = false\n await Promise.allSettled(this.listener_task ? [this.listener_task] : [])\n this.listener_task = null\n this.inbound_bus.destroy()\n }\n\n private ensureStarted(): void {\n if (this.running || this.listener_task) return\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] JSONLEventBridge failed to start', error)\n })\n }\n\n private async listenLoop(): Promise<void> {\n while (this.running) {\n try {\n await this.pollNewLines()\n } catch {\n // Keep polling on transient errors.\n }\n await new Promise((resolve) => setTimeout(resolve, Math.max(1, this.poll_interval * 1000)))\n }\n }\n\n private async pollNewLines(): Promise<void> {\n const previous_offset = this.byte_offset\n const { chunk, next_offset } = await this.readAppended(previous_offset)\n this.byte_offset = next_offset\n if (next_offset < previous_offset) {\n this.pending_line = ''\n }\n if (!chunk) return\n\n const new_lines = (this.pending_line + chunk).split('\\n')\n this.pending_line = new_lines.pop() ?? ''\n\n for (const line of new_lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const payload = JSON.parse(trimmed)\n await this.dispatchInboundPayload(payload)\n } catch {\n // Ignore malformed line.\n }\n }\n }\n\n private async dispatchInboundPayload(payload: unknown): Promise<void> {\n const event = BaseEvent.fromJSON(payload).eventReset()\n this.inbound_bus.emit(event)\n }\n\n private async readAppended(offset: number): Promise<{ chunk: string; next_offset: number }> {\n const fs = await this.loadFs()\n let size = 0\n try {\n const stats = await fs.promises.stat(this.path)\n size = Number(stats.size ?? 0)\n } catch (error: unknown) {\n const code = (error as { code?: string }).code\n if (code === 'ENOENT') {\n return { chunk: '', next_offset: 0 }\n }\n throw error\n }\n\n const start_offset = size < offset ? 0 : offset\n if (size === start_offset) {\n return { chunk: '', next_offset: size }\n }\n\n const handle = await fs.promises.open(this.path, 'r')\n try {\n const byte_count = size - start_offset\n const bytes = new Uint8Array(byte_count)\n const { bytesRead } = await handle.read(bytes, 0, byte_count, start_offset)\n const chunk = new TextDecoder().decode(bytes.subarray(0, Number(bytesRead ?? 0)))\n return { chunk, next_offset: start_offset + Number(bytesRead ?? 0) }\n } finally {\n await handle.close()\n }\n }\n\n private dirname(path: string): string {\n const idx = path.lastIndexOf('/')\n return idx >= 0 ? path.slice(0, idx) || '.' : '.'\n }\n\n private async loadFs(): Promise<any> {\n if (!isNodeRuntime()) {\n throw new Error('JSONLEventBridge is only supported in Node.js runtimes')\n }\n return importNodeModule('node:fs')\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bridge_nats.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport { EventBus } from './event_bus.js'\nimport { assertOptionalDependencyAvailable, importOptionalDependency, isNodeRuntime } from './optional_deps.js'\nimport type { EventClass, EventHandlerCallable, EventPattern, UntypedEventHandlerFunction } from './types.js'\n\nconst randomSuffix = (): string => Math.random().toString(36).slice(2, 10)\n\nexport class NATSEventBridge {\n readonly server: string\n readonly subject: string\n readonly name: string\n\n private readonly inbound_bus: EventBus\n private running: boolean\n private nc: any | null\n private sub_task: Promise<void> | null\n\n constructor(server: string, subject: string, name?: string) {\n assertOptionalDependencyAvailable('NATSEventBridge', 'nats')\n\n this.server = server\n this.subject = subject\n this.name = name ?? `NATSEventBridge_${randomSuffix()}`\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.running = false\n this.nc = null\n this.sub_task = null\n\n this.dispatch = this.dispatch.bind(this)\n this.emit = this.emit.bind(this)\n this.on = this.on.bind(this)\n }\n\n on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void\n on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void\n on(event_pattern: EventPattern | '*', handler: EventHandlerCallable | UntypedEventHandlerFunction): void {\n this.ensureStarted()\n if (typeof event_pattern === 'string') {\n this.inbound_bus.on(event_pattern, handler as UntypedEventHandlerFunction<BaseEvent>)\n return\n }\n this.inbound_bus.on(event_pattern as EventClass<BaseEvent>, handler as EventHandlerCallable<BaseEvent>)\n }\n\n async emit<T extends BaseEvent>(event: T): Promise<void> {\n this.ensureStarted()\n if (!this.nc) await this.start()\n\n const payload = JSON.stringify(event.toJSON())\n this.nc.publish(this.subject, new TextEncoder().encode(payload))\n }\n\n async dispatch<T extends BaseEvent>(event: T): Promise<void> {\n return this.emit(event)\n }\n\n async start(): Promise<void> {\n if (this.running) return\n if (!isNodeRuntime()) {\n throw new Error('NATSEventBridge is only supported in Node.js runtimes')\n }\n\n const mod = await importOptionalDependency('NATSEventBridge', 'nats')\n const connect = mod.connect\n this.nc = await connect({ servers: this.server })\n const sub = this.nc.subscribe(this.subject)\n\n this.running = true\n this.sub_task = (async () => {\n for await (const msg of sub) {\n try {\n const payload = JSON.parse(new TextDecoder().decode(msg.data))\n await this.dispatchInboundPayload(payload)\n } catch {\n // Ignore malformed payloads.\n }\n }\n })()\n }\n\n async close(): Promise<void> {\n this.running = false\n if (this.nc) {\n await this.nc.drain()\n await this.nc.close()\n this.nc = null\n }\n await Promise.allSettled(this.sub_task ? [this.sub_task] : [])\n this.sub_task = null\n this.inbound_bus.destroy()\n }\n\n private ensureStarted(): void {\n if (this.running) return\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] NATSEventBridge failed to start', error)\n })\n }\n\n private async dispatchInboundPayload(payload: unknown): Promise<void> {\n const event = BaseEvent.fromJSON(payload).eventReset()\n this.inbound_bus.emit(event)\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,mCAAmC,0BAA0B,qBAAqB;AAG3F,MAAM,eAAe,MAAc,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAElE,MAAM,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAEQ;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,SAAiB,MAAe;AAC1D,sCAAkC,mBAAmB,MAAM;AAE3D,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,OAAO,QAAQ,mBAAmB,aAAa,CAAC;AACrD,SAAK,cAAc,IAAI,SAAS,KAAK,MAAM,EAAE,kBAAkB,EAAE,CAAC;AAClE,SAAK,UAAU;AACf,SAAK,KAAK;AACV,SAAK,WAAW;AAEhB,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,KAAK,KAAK,GAAG,KAAK,IAAI;AAAA,EAC7B;AAAA,EAIA,GAAG,eAAmC,SAAmE;AACvG,SAAK,cAAc;AACnB,QAAI,OAAO,kBAAkB,UAAU;AACrC,WAAK,YAAY,GAAG,eAAe,OAAiD;AACpF;AAAA,IACF;AACA,SAAK,YAAY,GAAG,eAAwC,OAA0C;AAAA,EACxG;AAAA,EAEA,MAAM,KAA0B,OAAyB;AACvD,SAAK,cAAc;AACnB,QAAI,CAAC,KAAK,GAAI,OAAM,KAAK,MAAM;AAE/B,UAAM,UAAU,KAAK,UAAU,MAAM,OAAO,CAAC;AAC7C,SAAK,GAAG,QAAQ,KAAK,SAAS,IAAI,YAAY,EAAE,OAAO,OAAO,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,SAA8B,OAAyB;AAC3D,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAClB,QAAI,CAAC,cAAc,GAAG;AACpB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,MAAM,MAAM,yBAAyB,mBAAmB,MAAM;AACpE,UAAM,UAAU,IAAI;AACpB,SAAK,KAAK,MAAM,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC;AAChD,UAAM,MAAM,KAAK,GAAG,UAAU,KAAK,OAAO;AAE1C,SAAK,UAAU;AACf,SAAK,YAAY,YAAY;AAC3B,uBAAiB,OAAO,KAAK;AAC3B,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC;AAC7D,gBAAM,KAAK,uBAAuB,OAAO;AAAA,QAC3C,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,UAAU;AACf,QAAI,KAAK,IAAI;AACX,YAAM,KAAK,GAAG,MAAM;AACpB,YAAM,KAAK,GAAG,MAAM;AACpB,WAAK,KAAK;AAAA,IACZ;AACA,UAAM,QAAQ,WAAW,KAAK,WAAW,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;AAC7D,SAAK,WAAW;AAChB,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,QAAS;AAClB,SAAK,KAAK,MAAM,EAAE,MAAM,CAAC,UAAmB;AAC1C,cAAQ,MAAM,4CAA4C,KAAK;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,uBAAuB,SAAiC;AACpE,UAAM,QAAQ,UAAU,SAAS,OAAO,EAAE,WAAW;AACrD,SAAK,YAAY,KAAK,KAAK;AAAA,EAC7B;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bridge_postgres.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * PostgreSQL LISTEN/NOTIFY + flat-table bridge for forwarding events.\n */\nimport { BaseEvent } from './base_event.js'\nimport { EventBus } from './event_bus.js'\nimport { assertOptionalDependencyAvailable, importOptionalDependency, isNodeRuntime } from './optional_deps.js'\nimport type { EventClass, EventHandlerCallable, EventPattern, UntypedEventHandlerFunction } from './types.js'\n\nconst randomSuffix = (): string => Math.random().toString(36).slice(2, 10)\nconst IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/\nconst DEFAULT_POSTGRES_TABLE = 'abxbus_events'\nconst DEFAULT_POSTGRES_CHANNEL = 'abxbus_events'\nconst EVENT_PAYLOAD_COLUMN = 'event_payload'\n\nconst validateIdentifier = (value: string, label: string): string => {\n if (!IDENTIFIER_RE.test(value)) {\n throw new Error(`Invalid ${label}: ${JSON.stringify(value)}. Use only [A-Za-z0-9_] and start with a letter/_`)\n }\n return value\n}\n\nconst indexName = (table: string, suffix: string): string => validateIdentifier(`${table}_${suffix}`.slice(0, 63), 'index name')\n\nconst parseTableUrl = (table_url: string): { dsn: string; table: string } => {\n let parsed: URL\n try {\n parsed = new URL(table_url)\n } catch {\n throw new Error(\n 'PostgresEventBridge URL must include at least database in path, e.g. postgresql://user:pass@host:5432/dbname[/tablename]'\n )\n }\n\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 1) {\n throw new Error(\n 'PostgresEventBridge URL must include at least database in path, e.g. postgresql://user:pass@host:5432/dbname[/tablename]'\n )\n }\n\n const db_name = segments[0]\n const table = segments.length >= 2 ? validateIdentifier(segments[1], 'table name') : DEFAULT_POSTGRES_TABLE\n const dsn_url = new URL(parsed.toString())\n dsn_url.pathname = `/${db_name}`\n return { dsn: dsn_url.toString(), table }\n}\n\nconst splitBridgePayload = (\n payload: Record<string, unknown>\n): { event_fields: Record<string, unknown>; event_payload: Record<string, unknown> } => {\n const event_fields: Record<string, unknown> = {}\n const event_payload: Record<string, unknown> = { ...payload }\n for (const [key, value] of Object.entries(payload)) {\n if (key.startsWith('event_')) {\n event_fields[key] = value\n }\n }\n return { event_fields, event_payload }\n}\n\nexport class PostgresEventBridge {\n readonly table_url: string\n readonly dsn: string\n readonly table: string\n readonly channel: string\n readonly name: string\n\n private readonly inbound_bus: EventBus\n private running: boolean\n private client: any | null\n private table_columns: Set<string>\n private notification_handler: ((msg: { channel: string; payload?: string }) => void) | null\n\n constructor(table_url: string, channel?: string, name?: string) {\n assertOptionalDependencyAvailable('PostgresEventBridge', 'pg')\n\n const parsed = parseTableUrl(table_url)\n this.table_url = table_url\n this.dsn = parsed.dsn\n this.table = parsed.table\n\n const derived_channel = channel ?? DEFAULT_POSTGRES_CHANNEL\n this.channel = validateIdentifier(derived_channel.slice(0, 63), 'channel name')\n this.name = name ?? `PostgresEventBridge_${randomSuffix()}`\n\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.running = false\n this.client = null\n this.table_columns = new Set(['event_id', 'event_created_at', 'event_type', EVENT_PAYLOAD_COLUMN])\n this.notification_handler = null\n\n this.dispatch = this.dispatch.bind(this)\n this.emit = this.emit.bind(this)\n this.on = this.on.bind(this)\n }\n\n on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void\n on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void\n on(event_pattern: EventPattern | '*', handler: EventHandlerCallable | UntypedEventHandlerFunction): void {\n this.ensureStarted()\n if (typeof event_pattern === 'string') {\n this.inbound_bus.on(event_pattern, handler as UntypedEventHandlerFunction<BaseEvent>)\n return\n }\n this.inbound_bus.on(event_pattern as EventClass<BaseEvent>, handler as EventHandlerCallable<BaseEvent>)\n }\n\n async emit<T extends BaseEvent>(event: T): Promise<void> {\n this.ensureStarted()\n if (!this.client) await this.start()\n\n const payload = event.toJSON() as Record<string, unknown>\n const { event_fields, event_payload } = splitBridgePayload(payload)\n const write_payload: Record<string, unknown> = { ...event_fields, [EVENT_PAYLOAD_COLUMN]: event_payload }\n const keys = Object.keys(write_payload).sort()\n await this.ensureColumns(keys)\n\n const columns_sql = keys.map((key) => `\"${key}\"`).join(', ')\n const placeholders_sql = keys.map((_, index) => `$${index + 1}`).join(', ')\n const values = keys.map((key) =>\n write_payload[key] === null || write_payload[key] === undefined ? null : JSON.stringify(write_payload[key])\n )\n\n const update_fields = keys.filter((key) => key !== 'event_id')\n let upsert_sql = `INSERT INTO \"${this.table}\" (${columns_sql}) VALUES (${placeholders_sql})`\n if (update_fields.length > 0) {\n const updates_sql = update_fields.map((key) => `\"${key}\" = EXCLUDED.\"${key}\"`).join(', ')\n upsert_sql += ` ON CONFLICT (\"event_id\") DO UPDATE SET ${updates_sql}`\n } else {\n upsert_sql += ' ON CONFLICT (\"event_id\") DO NOTHING'\n }\n\n await this.client.query(upsert_sql, values)\n await this.client.query('SELECT pg_notify($1, $2)', [this.channel, JSON.stringify(String(event.event_id))])\n }\n\n async dispatch<T extends BaseEvent>(event: T): Promise<void> {\n return this.emit(event)\n }\n\n async start(): Promise<void> {\n if (this.running) return\n if (!isNodeRuntime()) {\n throw new Error('PostgresEventBridge is only supported in Node.js runtimes')\n }\n\n const mod = await importOptionalDependency('PostgresEventBridge', 'pg')\n const Client = mod.Client ?? mod.default?.Client\n this.client = new Client({ connectionString: this.dsn })\n this.client.on('error', () => {})\n await this.client.connect()\n\n await this.ensureTableExists()\n await this.refreshColumnCache()\n await this.ensureColumns(['event_id', 'event_created_at', 'event_type', EVENT_PAYLOAD_COLUMN])\n await this.ensureBaseIndexes()\n\n this.notification_handler = (msg: { channel: string; payload?: string }) => {\n if (msg.channel !== this.channel || !msg.payload) return\n void this.dispatchByEventId(msg.payload).catch(() => {\n // Ignore transient shutdown races while closing connections.\n })\n }\n\n this.client.on('notification', this.notification_handler)\n await this.client.query(`LISTEN ${this.channel}`)\n this.running = true\n }\n\n async close(): Promise<void> {\n this.running = false\n if (this.client) {\n try {\n await this.client.query(`UNLISTEN ${this.channel}`)\n } catch {\n // ignore\n }\n if (this.notification_handler) {\n this.client.off('notification', this.notification_handler)\n this.notification_handler = null\n }\n await this.client.end()\n this.client = null\n }\n this.inbound_bus.destroy()\n }\n\n private ensureStarted(): void {\n if (this.running) return\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] PostgresEventBridge failed to start', error)\n })\n }\n\n private async dispatchByEventId(event_id: string): Promise<void> {\n if (!this.running || !this.client) return\n const result = await this.client.query(`SELECT * FROM \"${this.table}\" WHERE \"event_id\" = $1`, [event_id])\n const row = result.rows?.[0] as Record<string, unknown> | undefined\n if (!row) return\n\n const payload: Record<string, unknown> = {}\n const raw_event_payload = row[EVENT_PAYLOAD_COLUMN]\n if (typeof raw_event_payload === 'string') {\n try {\n const decoded_event_payload = JSON.parse(raw_event_payload)\n if (decoded_event_payload && typeof decoded_event_payload === 'object' && !Array.isArray(decoded_event_payload)) {\n Object.assign(payload, decoded_event_payload as Record<string, unknown>)\n }\n } catch {\n // ignore malformed payload column\n }\n }\n\n for (const [key, raw_value] of Object.entries(row)) {\n if (key === EVENT_PAYLOAD_COLUMN || !key.startsWith('event_')) continue\n if (raw_value === null || raw_value === undefined) continue\n if (typeof raw_value !== 'string') {\n payload[key] = raw_value\n continue\n }\n try {\n payload[key] = JSON.parse(raw_value)\n } catch {\n payload[key] = raw_value\n }\n }\n\n await this.dispatchInboundPayload(payload)\n }\n\n private async dispatchInboundPayload(payload: unknown): Promise<void> {\n const event = BaseEvent.fromJSON(payload).eventReset()\n this.inbound_bus.emit(event)\n }\n\n private async ensureTableExists(): Promise<void> {\n if (!this.client) return\n await this.client.query(\n `CREATE TABLE IF NOT EXISTS \"${this.table}\" (\"event_id\" TEXT PRIMARY KEY, \"event_created_at\" TEXT, \"event_type\" TEXT, \"event_payload\" TEXT)`\n )\n }\n\n private async ensureBaseIndexes(): Promise<void> {\n if (!this.client) return\n\n const event_created_at_idx = indexName(this.table, 'event_created_at_idx')\n const event_type_idx = indexName(this.table, 'event_type_idx')\n\n await this.client.query(`CREATE INDEX IF NOT EXISTS \"${event_created_at_idx}\" ON \"${this.table}\" (\"event_created_at\")`)\n await this.client.query(`CREATE INDEX IF NOT EXISTS \"${event_type_idx}\" ON \"${this.table}\" (\"event_type\")`)\n }\n\n private async refreshColumnCache(): Promise<void> {\n if (!this.client) return\n const result = await this.client.query(\n `SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = $1`,\n [this.table]\n )\n this.table_columns = new Set((result.rows as Array<{ column_name: string }>).map((row) => row.column_name))\n }\n\n private async ensureColumns(keys: string[]): Promise<void> {\n if (!this.client) return\n for (const key of keys) {\n validateIdentifier(key, 'event field name')\n if (key !== EVENT_PAYLOAD_COLUMN && !key.startsWith('event_')) {\n throw new Error(`Invalid event field name for bridge column: ${JSON.stringify(key)}. Only event_* fields become columns`)\n }\n }\n\n const missing = keys.filter((key) => !this.table_columns.has(key))\n for (const key of missing) {\n await this.client.query(`ALTER TABLE \"${this.table}\" ADD COLUMN IF NOT EXISTS \"${key}\" TEXT`)\n this.table_columns.add(key)\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|