abxbus 2.4.26 → 2.4.28
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} +38 -30
- 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/{middleware_otel_tracing.d.ts → OtelTracingMiddleware.d.ts} +4 -4
- 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/base_event.d.ts +2 -2
- 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/event_handler.d.ts +0 -1
- 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} +20 -12
- 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/{middleware_otel_tracing.d.ts → OtelTracingMiddleware.d.ts} +4 -4
- 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/base_event.d.ts +2 -2
- package/dist/types/bridges.d.ts +9 -49
- package/dist/types/event_handler.d.ts +0 -1
- 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} +21 -13
- 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/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": "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",
|
|
6
|
-
"names": ["uuidv7"]
|
|
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;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAC1B,uBAAyB;AACzB,2BAA2F;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,gEAAkC,mBAAmB,MAAM;AAE3D,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,OAAO,QAAQ,mBAAmB,aAAa,CAAC;AACrD,SAAK,cAAc,IAAI,0BAAS,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,KAAC,oCAAc,GAAG;AACpB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,MAAM,UAAM,+CAAyB,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,4BAAU,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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bridge_redis.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Redis pub/sub bridge for forwarding events between runtimes.\n *\n * Usage:\n * // channel from URL path\n * const bridge = new RedisEventBridge('redis://user:pass@localhost:6379/1/my_channel')\n *\n * // explicit channel override\n * const bridge2 = new RedisEventBridge('redis://user:pass@localhost:6379/1', 'my_channel')\n *\n * URL format:\n * redis://user:pass@host:6379/<db>/<optional_channel>\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 DEFAULT_REDIS_CHANNEL = 'abxbus_events'\nconst DB_INIT_KEY = '__abxbus:bridge_init__'\n\nconst parseRedisUrl = (redis_url: string, channel?: string): { url: string; channel: string } => {\n let parsed: URL\n try {\n parsed = new URL(redis_url)\n } catch {\n throw new Error(`RedisEventBridge URL must be a valid redis:// or rediss:// URL, got: ${redis_url}`)\n }\n\n const protocol = parsed.protocol.replace(/:$/, '').toLowerCase()\n if (protocol !== 'redis' && protocol !== 'rediss') {\n throw new Error(`RedisEventBridge URL must use redis:// or rediss://, got: ${redis_url}`)\n }\n\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length > 2) {\n throw new Error(`RedisEventBridge URL path must be /<db> or /<db>/<channel>, got: ${parsed.pathname || '/'}`)\n }\n\n let db_index = '0'\n let channel_from_url: string | undefined\n\n if (segments.length > 0) {\n db_index = segments[0]\n if (!/^\\d+$/.test(db_index)) {\n throw new Error(`RedisEventBridge URL db path segment must be numeric, got: ${JSON.stringify(db_index)} in ${redis_url}`)\n }\n if (segments.length === 2) {\n channel_from_url = segments[1]\n }\n }\n\n const resolved_channel = channel ?? channel_from_url ?? DEFAULT_REDIS_CHANNEL\n if (!resolved_channel) {\n throw new Error('RedisEventBridge channel must not be empty')\n }\n\n const normalized = new URL(parsed.toString())\n normalized.pathname = `/${db_index}`\n return { url: normalized.toString(), channel: resolved_channel }\n}\n\nexport class RedisEventBridge {\n readonly url: string\n readonly channel: string\n readonly name: string\n\n private readonly inbound_bus: EventBus\n private running: boolean\n private start_promise: Promise<void> | null\n private redis_pub: any | null\n private redis_sub: any | null\n\n constructor(redis_url: string, channel?: string, name?: string) {\n assertOptionalDependencyAvailable('RedisEventBridge', 'ioredis')\n\n const parsed = parseRedisUrl(redis_url, channel)\n this.url = parsed.url\n this.channel = parsed.channel\n this.name = name ?? `RedisEventBridge_${randomSuffix()}`\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.running = false\n this.start_promise = null\n this.redis_pub = null\n this.redis_sub = 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.redis_pub) await this.start()\n const payload = JSON.stringify(event.toJSON())\n await this.redis_pub.publish(this.channel, 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 (this.start_promise) {\n await this.start_promise\n return\n }\n\n // `on(...)` auto-start and explicit `await start()` can happen back-to-back; use one in-flight\n // startup promise so we do not leak extra Redis clients.\n this.start_promise = (async () => {\n if (!isNodeRuntime()) {\n throw new Error('RedisEventBridge is only supported in Node.js runtimes')\n }\n\n const mod = await importOptionalDependency('RedisEventBridge', 'ioredis')\n const Redis = mod.default ?? mod.Redis ?? mod\n const redis_pub = new Redis(this.url)\n const redis_sub = new Redis(this.url)\n\n redis_pub.on('error', () => {})\n redis_sub.on('error', () => {})\n\n // Redis logical DBs are created lazily; writing a short-lived key initializes/validates the selected DB.\n await redis_pub.set(DB_INIT_KEY, '1', 'EX', 60, 'NX')\n redis_sub.on('message', (channel_name: string, message: string) => {\n if (channel_name !== this.channel) return\n try {\n const payload = JSON.parse(message)\n void this.dispatchInboundPayload(payload)\n } catch {\n // Ignore malformed payloads.\n }\n })\n await redis_sub.subscribe(this.channel)\n this.redis_pub = redis_pub\n this.redis_sub = redis_sub\n this.running = true\n })()\n\n try {\n await this.start_promise\n } finally {\n this.start_promise = null\n }\n }\n\n async close(): Promise<void> {\n if (this.start_promise) {\n await this.start_promise.catch(() => {})\n }\n this.running = false\n if (this.redis_sub) {\n try {\n await this.redis_sub.unsubscribe(this.channel)\n } catch {\n // ignore\n }\n await this.redis_sub.quit()\n this.redis_sub = null\n }\n if (this.redis_pub) {\n await this.redis_pub.quit()\n this.redis_pub = null\n }\n this.inbound_bus.destroy()\n }\n\n private ensureStarted(): void {\n if (this.running) return\n if (this.start_promise) return\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] RedisEventBridge 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": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/bridge_sqlite.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport { EventBus } from './event_bus.js'\nimport { 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 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 loadNodeSqlite = async (): Promise<any> => {\n const dynamic_import = Function('module_name', 'return import(module_name)') as (module_name: string) => Promise<unknown>\n try {\n return (await dynamic_import('node:sqlite')) as any\n } catch {\n throw new Error('SQLiteEventBridge requires Node.js with built-in \"node:sqlite\" support (Node 22+).')\n }\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 SQLiteEventBridge {\n readonly path: string\n readonly table: string\n readonly poll_interval: number\n readonly name: string\n\n private readonly inbound_bus: EventBus\n private running: boolean\n private last_seen_event_created_at: string\n private last_seen_event_id: string\n private listener_task: Promise<void> | null\n private start_task: Promise<void> | null\n private db: any | null\n private table_columns: Set<string>\n\n constructor(path: string, table: string = 'abxbus_events', poll_interval: number = 0.25, name?: string) {\n this.path = path\n this.table = validateIdentifier(table, 'table name')\n this.poll_interval = poll_interval\n this.name = name ?? `SQLiteEventBridge_${randomSuffix()}`\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.running = false\n this.last_seen_event_created_at = ''\n this.last_seen_event_id = ''\n this.listener_task = null\n this.start_task = null\n this.db = null\n this.table_columns = new Set(['event_id', 'event_created_at', 'event_type', EVENT_PAYLOAD_COLUMN])\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.running) {\n await this.start()\n }\n if (!this.db) {\n throw new Error('SQLiteEventBridge database not initialized')\n }\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 payload_keys = Object.keys(write_payload).sort()\n this.ensureColumns(payload_keys)\n\n const columns_sql = payload_keys.map((key) => `\"${key}\"`).join(', ')\n const placeholders_sql = payload_keys.map((key) => (key === EVENT_PAYLOAD_COLUMN ? 'json(?)' : '?')).join(', ')\n const values = payload_keys.map((key) =>\n write_payload[key] === null || write_payload[key] === undefined ? null : JSON.stringify(write_payload[key])\n )\n\n const update_fields = payload_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 this.db.prepare(upsert_sql).run(...values)\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 (this.start_task) {\n await this.start_task\n return\n }\n\n this.start_task = (async (): Promise<void> => {\n if (!isNodeRuntime()) {\n throw new Error('SQLiteEventBridge is only supported in Node.js runtimes')\n }\n\n const mod = await loadNodeSqlite()\n const Database = mod.DatabaseSync ?? mod.default?.DatabaseSync\n if (typeof Database !== 'function') {\n throw new Error('SQLiteEventBridge could not load DatabaseSync from node:sqlite. Please use Node.js 22+.')\n }\n this.db = new Database(this.path)\n this.db.exec('PRAGMA journal_mode = WAL')\n this.db\n .prepare(\n `CREATE TABLE IF NOT EXISTS \"${this.table}\" (\"event_id\" TEXT PRIMARY KEY, \"event_created_at\" TEXT, \"event_type\" TEXT, \"event_payload\" JSON)`\n )\n .run()\n\n this.refreshColumnCache()\n this.ensureColumns(['event_id', 'event_created_at', 'event_type', EVENT_PAYLOAD_COLUMN])\n this.ensureBaseIndexes()\n this.setCursorToLatestRow()\n\n this.running = true\n this.listener_task = this.listenLoop()\n })()\n\n try {\n await this.start_task\n } finally {\n this.start_task = null\n }\n }\n\n async close(): Promise<void> {\n await Promise.allSettled(this.start_task ? [this.start_task] : [])\n this.running = false\n await Promise.allSettled(this.listener_task ? [this.listener_task] : [])\n this.listener_task = null\n\n if (this.db) {\n this.db.close()\n this.db = null\n }\n\n this.inbound_bus.destroy()\n }\n\n private ensureStarted(): void {\n if (this.running || this.listener_task || this.start_task) return\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] SQLiteEventBridge failed to start', error)\n })\n }\n\n private async listenLoop(): Promise<void> {\n while (this.running) {\n try {\n if (this.db) {\n const rows = this.db\n .prepare(\n `SELECT * FROM \"${this.table}\" WHERE COALESCE(\"event_created_at\", '') > ? OR (COALESCE(\"event_created_at\", '') = ? AND COALESCE(\"event_id\", '') > ?) ORDER BY COALESCE(\"event_created_at\", '') ASC, COALESCE(\"event_id\", '') ASC`\n )\n .all(this.last_seen_event_created_at, this.last_seen_event_created_at, this.last_seen_event_id) as Array<\n Record<string, unknown>\n >\n\n for (const row of rows) {\n this.last_seen_event_created_at = String(row.event_created_at ?? '')\n this.last_seen_event_id = String(row.event_id ?? '')\n\n const raw_payload_blob = row[EVENT_PAYLOAD_COLUMN]\n const payload: Record<string, unknown> = {}\n if (typeof raw_payload_blob === 'string') {\n try {\n const decoded_event_payload = JSON.parse(raw_payload_blob)\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\n if (typeof raw_value !== 'string') {\n payload[key] = raw_value\n continue\n }\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 } 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 dispatchInboundPayload(payload: unknown): Promise<void> {\n const event = BaseEvent.fromJSON(payload).eventReset()\n this.inbound_bus.emit(event)\n }\n\n private refreshColumnCache(): void {\n if (!this.db) return\n const rows = this.db.prepare(`PRAGMA table_info(\"${this.table}\")`).all() as Array<{ name: string }>\n this.table_columns = new Set(rows.map((row) => String(row.name)))\n }\n\n private ensureColumns(keys: string[]): void {\n if (!this.db) return\n\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_columns = keys.filter((key) => !this.table_columns.has(key))\n for (const key of missing_columns) {\n const column_type = key === EVENT_PAYLOAD_COLUMN ? 'JSON' : 'TEXT'\n this.db.prepare(`ALTER TABLE \"${this.table}\" ADD COLUMN \"${key}\" ${column_type}`).run()\n this.table_columns.add(key)\n }\n }\n\n private ensureBaseIndexes(): void {\n if (!this.db) return\n\n const event_created_at_index = `${this.table}_event_created_at_idx`\n const event_type_index = `${this.table}_event_type_idx`\n\n this.db.prepare(`CREATE INDEX IF NOT EXISTS \"${event_created_at_index}\" ON \"${this.table}\" (\"event_created_at\")`).run()\n this.db.prepare(`CREATE INDEX IF NOT EXISTS \"${event_type_index}\" ON \"${this.table}\" (\"event_type\")`).run()\n }\n\n private setCursorToLatestRow(): void {\n if (!this.db) return\n\n const row = this.db\n .prepare(\n `SELECT COALESCE(\"event_created_at\", '') AS event_created_at, COALESCE(\"event_id\", '') AS event_id FROM \"${this.table}\" ORDER BY COALESCE(\"event_created_at\", '') DESC, COALESCE(\"event_id\", '') DESC LIMIT 1`\n )\n .get() as { event_created_at?: string; event_id?: string } | undefined\n\n this.last_seen_event_created_at = String(row?.event_created_at ?? '')\n this.last_seen_event_id = String(row?.event_id ?? '')\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/event_bus.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEvent, type BaseEventJSON } from './base_event.js'\nimport { EventHistory } from './event_history.js'\nimport { EventResult } from './event_result.js'\nimport { captureAsyncContext } from './async_context.js'\nimport { _runWithSlowMonitor, _runWithTimeout } from './timing.js'\nimport {\n AsyncLock,\n type EventConcurrencyMode,\n type EventHandlerConcurrencyMode,\n type EventHandlerCompletionMode,\n LockManager,\n} from './lock_manager.js'\nimport {\n EventHandler,\n EventHandlerAbortedError,\n EventHandlerCancelledError,\n EventHandlerTimeoutError,\n type EphemeralFindEventHandler,\n type EventHandlerJSON,\n} from './event_handler.js'\nimport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './middlewares.js'\nimport { logTree } from './logging.js'\nimport { v7 as uuidv7 } from 'uuid'\nimport { monotonicDatetime } from './helpers.js'\n\nimport { normalizeEventPattern } from './types.js'\nimport type { EventClass, EventHandlerCallable, EventPattern, FindOptions, UntypedEventHandlerFunction } from './types.js'\n\nexport type EventBusOptions = {\n id?: string\n max_history_size?: number | null\n max_history_drop?: boolean\n\n // per-event options\n event_concurrency?: EventConcurrencyMode | null\n event_timeout?: number | null // default handler timeout in seconds, applied when event.event_timeout is undefined\n event_slow_timeout?: number | null // threshold before a warning is logged about slow event processing\n\n // per-event-handler options\n event_handler_concurrency?: EventHandlerConcurrencyMode | null\n event_handler_completion?: EventHandlerCompletionMode\n event_handler_slow_timeout?: number | null // threshold before a warning is logged about slow handler execution\n event_handler_detect_file_paths?: boolean // autodetect source code file and lineno where handlers are defined for better logs (slightly slower because Error().stack introspection to fine files is expensive)\n middlewares?: EventBusMiddlewareInput[]\n}\n\nexport type EventBusJSON = {\n id: string\n name: string\n max_history_size: number | null\n max_history_drop: boolean\n event_concurrency: EventConcurrencyMode\n event_timeout: number | null\n event_slow_timeout: number | null\n event_handler_concurrency: EventHandlerConcurrencyMode\n event_handler_completion: EventHandlerCompletionMode\n event_handler_slow_timeout: number | null\n event_handler_detect_file_paths: boolean\n handlers: Record<string, EventHandlerJSON>\n handlers_by_key: Record<string, string[]>\n event_history: Record<string, BaseEventJSON>\n pending_event_queue: string[]\n}\n\n// Global registry of all EventBus instances to allow for cross-bus coordination\n// when global-serial concurrency mode is used.\nexport class GlobalEventBusRegistry {\n private _bus_refs = new Set<WeakRef<EventBus>>()\n\n add(bus: EventBus): void {\n this._bus_refs.add(new WeakRef(bus))\n }\n\n discard(bus: EventBus): void {\n for (const ref of this._bus_refs) {\n const current = ref.deref()\n if (!current || current === bus) {\n this._bus_refs.delete(ref)\n }\n }\n }\n\n has(bus: EventBus): boolean {\n for (const ref of this._bus_refs) {\n const current = ref.deref()\n if (!current) {\n this._bus_refs.delete(ref)\n continue\n }\n if (current === bus) {\n return true\n }\n }\n return false\n }\n\n get size(): number {\n let count = 0\n for (const ref of this._bus_refs) {\n if (ref.deref()) {\n count += 1\n } else {\n this._bus_refs.delete(ref)\n }\n }\n return count\n }\n\n *[Symbol.iterator](): IterableIterator<EventBus> {\n for (const ref of this._bus_refs) {\n const bus = ref.deref()\n if (bus) {\n yield bus\n } else {\n this._bus_refs.delete(ref)\n }\n }\n }\n\n findBusById(bus_id: string): EventBus | undefined {\n for (const bus of this) {\n if (bus.id === bus_id) {\n return bus\n }\n }\n return undefined\n }\n\n findEventById(event_id: string): BaseEvent | null {\n for (const bus of this) {\n const event = bus.event_history.getEvent(event_id)\n if (event) {\n return event\n }\n }\n return null\n }\n}\n\nexport class EventBus {\n private static _registry_by_constructor = new WeakMap<Function, GlobalEventBusRegistry>()\n private static _global_event_lock_by_constructor = new WeakMap<Function, AsyncLock>()\n\n private static getRegistryForConstructor(constructor_fn: Function): GlobalEventBusRegistry {\n const existing_registry = EventBus._registry_by_constructor.get(constructor_fn)\n if (existing_registry) {\n return existing_registry\n }\n const created_registry = new GlobalEventBusRegistry()\n EventBus._registry_by_constructor.set(constructor_fn, created_registry)\n return created_registry\n }\n\n private static getGlobalEventLockForConstructor(constructor_fn: Function): AsyncLock {\n const existing_lock = EventBus._global_event_lock_by_constructor.get(constructor_fn)\n if (existing_lock) {\n return existing_lock\n }\n const created_lock = new AsyncLock(1)\n EventBus._global_event_lock_by_constructor.set(constructor_fn, created_lock)\n return created_lock\n }\n\n static get all_instances(): GlobalEventBusRegistry {\n return EventBus.getRegistryForConstructor(this)\n }\n\n get all_instances(): GlobalEventBusRegistry {\n return EventBus.getRegistryForConstructor(this.constructor as Function)\n }\n\n get _lock_for_event_global_serial(): AsyncLock {\n return EventBus.getGlobalEventLockForConstructor(this.constructor as Function)\n }\n\n id: string // unique uuidv7 identifier for the event bus\n name: string // name of the event bus, recommended to include the word \"Bus\" in the name for clarity in logs\n\n // configuration options\n event_timeout: number | null\n event_concurrency: EventConcurrencyMode\n event_handler_concurrency: EventHandlerConcurrencyMode\n event_handler_completion: EventHandlerCompletionMode\n event_handler_detect_file_paths: boolean\n\n // slow processing warning timeout settings\n event_handler_slow_timeout: number | null\n event_slow_timeout: number | null\n\n // public runtime state\n handlers: Map<string, EventHandler> // map of handler uuidv5 ids to EventHandler objects\n handlers_by_key: Map<string, string[]> // map of normalized event_pattern to ordered handler ids\n event_history: EventHistory<BaseEvent> // map of event uuidv7 ids to processed BaseEvent objects\n\n // internal runtime state\n pending_event_queue: BaseEvent[] // queue of events that have been emitted to the bus but not yet processed\n in_flight_event_ids: Set<string> // set of event ids that are currently being processed by the bus\n runloop_running: boolean\n locks: LockManager\n find_waiters: Set<EphemeralFindEventHandler> // set of EphemeralFindEventHandler objects that are waiting for a matching future event\n middlewares: EventBusMiddleware[]\n\n private static normalizeMiddlewares(middlewares?: EventBusMiddlewareInput[]): EventBusMiddleware[] {\n const normalized: EventBusMiddleware[] = []\n for (const middleware of middlewares ?? []) {\n if (!middleware) {\n continue\n }\n if (typeof middleware === 'function') {\n normalized.push(new (middleware as EventBusMiddlewareCtor)())\n } else {\n normalized.push(middleware as EventBusMiddleware)\n }\n }\n return normalized\n }\n\n constructor(name: string = 'EventBus', options: EventBusOptions = {}) {\n this.id = options.id ?? uuidv7()\n this.name = name\n\n // set configuration options\n this.event_concurrency = options.event_concurrency ?? 'bus-serial'\n this.event_handler_concurrency = options.event_handler_concurrency ?? 'serial'\n this.event_handler_completion = options.event_handler_completion ?? 'all'\n this.event_handler_detect_file_paths = options.event_handler_detect_file_paths ?? true\n this.event_timeout = options.event_timeout === undefined ? 60 : options.event_timeout\n this.event_handler_slow_timeout = options.event_handler_slow_timeout === undefined ? 30 : options.event_handler_slow_timeout\n this.event_slow_timeout = options.event_slow_timeout === undefined ? 300 : options.event_slow_timeout\n\n // initialize runtime state\n this.runloop_running = false\n this.handlers = new Map()\n this.handlers_by_key = new Map()\n this.find_waiters = new Set()\n this.event_history = new EventHistory({\n max_history_size: options.max_history_size === undefined ? 100 : options.max_history_size,\n max_history_drop: options.max_history_drop ?? false,\n })\n this.pending_event_queue = []\n this.in_flight_event_ids = new Set()\n this.locks = new LockManager(this)\n this.middlewares = EventBus.normalizeMiddlewares(options.middlewares)\n\n this.all_instances.add(this)\n\n this.dispatch = this.dispatch.bind(this)\n this.emit = this.emit.bind(this)\n }\n\n toString(): string {\n return `${this.name}#${this.id.slice(-4)}`\n }\n\n scheduleMicrotask(fn: () => void): void {\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(fn)\n return\n }\n void Promise.resolve().then(fn)\n }\n\n private async _runMiddlewareHook(hook: keyof EventBusMiddleware, args: unknown[]): Promise<void> {\n if (this.middlewares.length === 0) {\n return\n }\n for (const middleware of this.middlewares) {\n const callback = middleware[hook]\n if (!callback) {\n continue\n }\n await (callback as (...hook_args: unknown[]) => void | Promise<void>).apply(middleware, args)\n }\n }\n\n async onEventChange(event: BaseEvent, status: 'pending' | 'started' | 'completed'): Promise<void> {\n await this._onEventChange(event, status)\n }\n\n async onEventResultChange(event: BaseEvent, result: EventResult, status: 'pending' | 'started' | 'completed'): Promise<void> {\n await this._onEventResultChange(event, result, status)\n }\n\n private async _onEventChange(event: BaseEvent, status: 'pending' | 'started' | 'completed'): Promise<void> {\n await this._runMiddlewareHook('onEventChange', [this, event, status])\n }\n\n private async _onEventResultChange(event: BaseEvent, result: EventResult, status: 'pending' | 'started' | 'completed'): Promise<void> {\n await this._runMiddlewareHook('onEventResultChange', [this, event, result, status])\n }\n\n private async _onBusHandlersChange(handler: EventHandler, registered: boolean): Promise<void> {\n await this._runMiddlewareHook('onBusHandlersChange', [this, handler, registered])\n }\n\n private _finalizeEventTimeout(\n event: BaseEvent,\n pending_entries: Array<{\n handler: EventHandler\n result: EventResult\n }>,\n timeout_error: EventHandlerTimeoutError\n ): void {\n const timeout_seconds = timeout_error.timeout_seconds ?? event.event_timeout ?? null\n event._cancelPendingChildProcessing(timeout_error)\n\n for (const entry of pending_entries) {\n const result = entry.result\n if (result.status === 'completed') {\n continue\n }\n if (result.status === 'error') {\n continue\n }\n if (result.status === 'started') {\n result._lock?.exitHandlerRun()\n result._releaseQueueJumpPauses()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to event timeout`, {\n event_result: result,\n timeout_seconds,\n cause: timeout_error,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n continue\n }\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to event timeout`, {\n event_result: result,\n timeout_seconds,\n cause: timeout_error,\n })\n result._markError(cancelled_error)\n }\n\n event.event_pending_bus_count = Math.max(0, event.event_pending_bus_count - 1)\n event._markCompleted()\n }\n\n private _createEventTimeoutError(\n event: BaseEvent,\n pending_entries: Array<{\n handler: EventHandler\n result: EventResult\n }>,\n timeout_seconds: number\n ): EventHandlerTimeoutError {\n const timeout_anchor =\n pending_entries.find((entry) => entry.result.status === 'started') ??\n pending_entries.find((entry) => entry.result.status === 'pending') ??\n pending_entries[0]!\n return new EventHandlerTimeoutError(\n `${this.toString()}.on(${event.toString()}, ${timeout_anchor.result.handler.toString()}) timed out after ${timeout_seconds}s`,\n {\n event_result: timeout_anchor.result,\n timeout_seconds,\n }\n )\n }\n\n private async _runHandlersWithTimeout(\n event: BaseEvent,\n pending_entries: Array<{\n handler: EventHandler\n result: EventResult\n }>,\n event_timeout: number | null,\n fn: () => Promise<void>\n ): Promise<void> {\n try {\n if (event_timeout === null || pending_entries.length === 0) {\n await fn()\n } else {\n await _runWithTimeout(event_timeout, () => this._createEventTimeoutError(event, pending_entries, event_timeout), fn)\n }\n } catch (error) {\n if (error instanceof EventHandlerTimeoutError) {\n this._finalizeEventTimeout(event, pending_entries, error)\n return\n }\n throw error\n }\n }\n\n private _markEventCompletedIfNeeded(event: BaseEvent): void {\n if (event.event_status !== 'completed') {\n event.event_pending_bus_count = Math.max(0, event.event_pending_bus_count - 1)\n event._markCompleted(false)\n }\n if (\n this.event_history.max_history_size !== null &&\n this.event_history.max_history_size > 0 &&\n this.event_history.size > this.event_history.max_history_size\n ) {\n this.event_history.trimEventHistory({\n is_event_complete: (candidate_event) => candidate_event.event_status === 'completed',\n on_remove: (candidate_event) => candidate_event._gc(),\n owner_label: this.toString(),\n max_history_size: this.event_history.max_history_size,\n max_history_drop: this.event_history.max_history_drop,\n })\n }\n }\n\n toJSON(): EventBusJSON {\n const handlers: Record<string, EventHandlerJSON> = {}\n for (const [handler_id, handler] of this.handlers.entries()) {\n handlers[handler_id] = handler.toJSON()\n }\n\n const handlers_by_key: Record<string, string[]> = {}\n for (const [key, ids] of this.handlers_by_key.entries()) {\n handlers_by_key[key] = [...ids]\n }\n\n const event_history: Record<string, BaseEventJSON> = {}\n for (const [event_id, event] of this.event_history.entries()) {\n event_history[event_id] = event.toJSON()\n }\n\n const pending_event_queue: string[] = []\n for (const event of this.pending_event_queue) {\n const event_id = event.event_id\n if (!event_history[event_id]) {\n event_history[event_id] = event.toJSON()\n }\n pending_event_queue.push(event_id)\n }\n\n return {\n id: this.id,\n name: this.name,\n max_history_size: this.event_history.max_history_size,\n max_history_drop: this.event_history.max_history_drop,\n event_concurrency: this.event_concurrency,\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\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_detect_file_paths: this.event_handler_detect_file_paths,\n handlers,\n handlers_by_key,\n event_history,\n pending_event_queue,\n }\n }\n\n private static _stubHandlerFn(): EventHandlerCallable {\n return (() => undefined) as EventHandlerCallable\n }\n\n private static _upsertHandlerIndex(bus: EventBus, event_pattern: string, handler_id: string): void {\n const ids = bus.handlers_by_key.get(event_pattern)\n if (ids) {\n if (!ids.includes(handler_id)) {\n ids.push(handler_id)\n }\n return\n }\n bus.handlers_by_key.set(event_pattern, [handler_id])\n }\n\n private static _linkEventResultHandlers(event: BaseEvent, bus: EventBus): void {\n for (const [map_key, result] of Array.from(event.event_results.entries())) {\n const handler_id = result.handler_id\n const existing_handler = bus.handlers.get(handler_id)\n if (existing_handler) {\n result.handler = existing_handler\n } else {\n const source = result.handler\n const handler_entry = EventHandler.fromJSON(\n {\n ...source.toJSON(),\n id: handler_id,\n event_pattern: source.event_pattern || event.event_type,\n eventbus_name: source.eventbus_name || bus.name,\n eventbus_id: source.eventbus_id || bus.id,\n },\n EventBus._stubHandlerFn()\n )\n bus.handlers.set(handler_entry.id, handler_entry)\n EventBus._upsertHandlerIndex(bus, handler_entry.event_pattern, handler_entry.id)\n result.handler = handler_entry\n }\n\n if (map_key !== handler_id) {\n event.event_results.delete(map_key)\n event.event_results.set(handler_id, result)\n }\n }\n }\n\n static fromJSON(data: unknown): EventBus {\n if (!data || typeof data !== 'object') {\n throw new Error('EventBus.fromJSON(data) requires an object')\n }\n const record = data as Record<string, unknown>\n const name = typeof record.name === 'string' ? record.name : 'EventBus'\n const options: EventBusOptions = {}\n\n if (typeof record.id === 'string') options.id = record.id\n if (typeof record.max_history_size === 'number' || record.max_history_size === null) options.max_history_size = record.max_history_size\n if (typeof record.max_history_drop === 'boolean') options.max_history_drop = record.max_history_drop\n if (\n record.event_concurrency === 'global-serial' ||\n record.event_concurrency === 'bus-serial' ||\n record.event_concurrency === 'parallel'\n ) {\n options.event_concurrency = record.event_concurrency\n }\n if (typeof record.event_timeout === 'number' || record.event_timeout === null) options.event_timeout = record.event_timeout\n if (typeof record.event_slow_timeout === 'number' || record.event_slow_timeout === null)\n options.event_slow_timeout = record.event_slow_timeout\n if (record.event_handler_concurrency === 'serial' || record.event_handler_concurrency === 'parallel') {\n options.event_handler_concurrency = record.event_handler_concurrency\n }\n if (record.event_handler_completion === 'all' || record.event_handler_completion === 'first') {\n options.event_handler_completion = record.event_handler_completion\n }\n if (typeof record.event_handler_slow_timeout === 'number' || record.event_handler_slow_timeout === null) {\n options.event_handler_slow_timeout = record.event_handler_slow_timeout\n }\n if (typeof record.event_handler_detect_file_paths === 'boolean') {\n options.event_handler_detect_file_paths = record.event_handler_detect_file_paths\n }\n const bus = new EventBus(name, options)\n\n if (!record.handlers || typeof record.handlers !== 'object' || Array.isArray(record.handlers)) {\n throw new Error('EventBus.fromJSON(data) requires handlers as an id-keyed object')\n }\n for (const [handler_id, payload] of Object.entries(record.handlers as Record<string, unknown>)) {\n if (!payload || typeof payload !== 'object') {\n continue\n }\n const parsed = EventHandler.fromJSON(\n {\n ...(payload as Record<string, unknown>),\n id: typeof (payload as { id?: unknown }).id === 'string' ? (payload as { id: string }).id : handler_id,\n },\n EventBus._stubHandlerFn()\n )\n bus.handlers.set(parsed.id, parsed)\n }\n\n if (!record.handlers_by_key || typeof record.handlers_by_key !== 'object' || Array.isArray(record.handlers_by_key)) {\n throw new Error('EventBus.fromJSON(data) requires handlers_by_key as an object')\n }\n bus.handlers_by_key.clear()\n for (const [raw_key, raw_ids] of Object.entries(record.handlers_by_key as Record<string, unknown>)) {\n if (!Array.isArray(raw_ids)) {\n continue\n }\n const ids = raw_ids.filter((id): id is string => typeof id === 'string')\n bus.handlers_by_key.set(raw_key, ids)\n }\n\n if (!record.event_history || typeof record.event_history !== 'object' || Array.isArray(record.event_history)) {\n throw new Error('EventBus.fromJSON(data) requires event_history as an id-keyed object')\n }\n for (const [event_id, payload] of Object.entries(record.event_history as Record<string, unknown>)) {\n if (!payload || typeof payload !== 'object') {\n continue\n }\n const event = BaseEvent.fromJSON({\n ...(payload as Record<string, unknown>),\n event_id: typeof (payload as { event_id?: unknown }).event_id === 'string' ? (payload as { event_id: string }).event_id : event_id,\n })\n event.event_bus = bus\n bus.event_history.set(event.event_id, event)\n }\n\n if (!Array.isArray(record.pending_event_queue)) {\n throw new Error('EventBus.fromJSON(data) requires pending_event_queue as an array of event ids')\n }\n const raw_pending_event_queue = record.pending_event_queue\n const pending_event_ids: string[] = []\n for (const item of raw_pending_event_queue) {\n if (typeof item === 'string') {\n pending_event_ids.push(item)\n }\n }\n bus.pending_event_queue = pending_event_ids\n .map((event_id) => bus.event_history.get(event_id))\n .filter((event): event is BaseEvent => Boolean(event))\n\n for (const event of bus.event_history.values()) {\n EventBus._linkEventResultHandlers(event, bus)\n }\n\n // Reset runtime execution state after restore. Queue/history/handlers are restored,\n // but lock internals should always restart from a clean default state.\n bus.in_flight_event_ids.clear()\n bus.runloop_running = false\n bus.locks.clear()\n bus.find_waiters.clear()\n\n return bus\n }\n\n get label(): string {\n return `${this.name}#${this.id.slice(-4)}`\n }\n\n removeEventFromPendingQueue(event: BaseEvent): number {\n const original_event = event._event_original ?? event\n let removed_count = 0\n for (let index = this.pending_event_queue.length - 1; index >= 0; index -= 1) {\n const queued_event = this.pending_event_queue[index]\n const queued_original = queued_event._event_original ?? queued_event\n if (queued_original.event_id !== original_event.event_id) {\n continue\n }\n this.pending_event_queue.splice(index, 1)\n removed_count += 1\n }\n return removed_count\n }\n\n isEventInFlightOrQueued(event_id: string): boolean {\n if (this.in_flight_event_ids.has(event_id)) {\n return true\n }\n for (const queued_event of this.pending_event_queue) {\n const queued_original = queued_event._event_original ?? queued_event\n if (queued_original.event_id === event_id) {\n return true\n }\n }\n return false\n }\n\n removeEventFromHistory(event_id: string): boolean {\n return this.event_history.delete(event_id)\n }\n\n // destroy the event bus and all its state to allow for garbage collection\n destroy(): void {\n this.all_instances.discard(this)\n this.handlers.clear()\n this.handlers_by_key.clear()\n for (const event of this.event_history.values()) {\n event._gc()\n }\n this.event_history.clear()\n this.pending_event_queue.length = 0\n this.in_flight_event_ids.clear()\n this.find_waiters.clear()\n this.locks.clear()\n }\n\n on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>, options?: Partial<EventHandler>): EventHandler\n on<T extends BaseEvent>(\n event_pattern: string | '*',\n handler: UntypedEventHandlerFunction<T>,\n options?: Partial<EventHandler>\n ): EventHandler\n on(\n event_pattern: EventPattern | '*',\n handler: EventHandlerCallable | UntypedEventHandlerFunction,\n options: Partial<EventHandler> = {}\n ): EventHandler {\n const normalized_key = normalizeEventPattern(event_pattern) // get string event_type or '*'\n const handler_name = EventHandler.handlerNameFromCallable(handler as EventHandlerCallable)\n const handler_entry = new EventHandler({\n handler: handler as EventHandlerCallable,\n handler_name,\n handler_registered_at: monotonicDatetime(),\n event_pattern: normalized_key,\n eventbus_name: this.name,\n eventbus_id: this.id,\n ...options,\n })\n if (this.event_handler_detect_file_paths) {\n // optionally perform (expensive) file path detection for the handler using Error().stack introspection\n // makes logs much more useful for debugging, but is expensive to do if not needed\n handler_entry._detectHandlerFilePath()\n }\n\n this.handlers.set(handler_entry.id, handler_entry)\n const ids = this.handlers_by_key.get(handler_entry.event_pattern)\n if (ids) ids.push(handler_entry.id)\n else this.handlers_by_key.set(handler_entry.event_pattern, [handler_entry.id])\n this.scheduleMicrotask(() => {\n void this._onBusHandlersChange(handler_entry, true)\n })\n return handler_entry\n }\n\n off<T extends BaseEvent>(event_pattern: EventPattern<T> | '*', handler?: EventHandlerCallable<T> | string | EventHandler): void {\n const normalized_key = normalizeEventPattern(event_pattern)\n if (typeof handler === 'object' && handler instanceof EventHandler && handler.id !== undefined) {\n handler = handler.id\n }\n const match_by_id = typeof handler === 'string'\n for (const entry of this.handlers.values()) {\n if (entry.event_pattern !== normalized_key) {\n continue\n }\n const handler_id = entry.id\n if (handler === undefined || (match_by_id ? handler_id === handler : entry.handler === (handler as EventHandlerCallable))) {\n this.handlers.delete(handler_id)\n this._removeIndexedHandler(entry.event_pattern, handler_id)\n this.scheduleMicrotask(() => {\n void this._onBusHandlersChange(entry, false)\n })\n }\n }\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_event = event._event_original ?? event // if event is a bus-scoped proxy already, get the original underlying event object\n if (!original_event.event_bus) {\n // if we are the first bus to emit this event, set the event_bus property on the original event object\n original_event.event_bus = this\n }\n if (!Array.isArray(original_event.event_path)) {\n original_event.event_path = []\n }\n if (original_event._getDispatchContext() === undefined) {\n // when used in fastify/nextjs/other contexts with tracing based on AsyncLocalStorage in node\n // we want to capture the context at the emit site and use it when running handlers\n // because events may be handled async in a separate context than the emit site\n original_event._setDispatchContext(captureAsyncContext())\n }\n if (original_event.event_path.includes(this.label) || this._hasProcessedEvent(original_event)) {\n return this._getEventProxyScopedToThisBus(original_event) as T\n }\n\n if (!original_event.event_path.includes(this.label)) {\n original_event.event_path.push(this.label)\n }\n\n if (original_event.event_parent_id && original_event.event_emitted_by_handler_id) {\n const parent_result = original_event.event_parent?.event_results.get(original_event.event_emitted_by_handler_id)\n if (parent_result) {\n parent_result._linkEmittedChildEvent(original_event)\n }\n }\n\n if (\n this.event_history.max_history_size !== null &&\n this.event_history.max_history_size > 0 &&\n !this.event_history.max_history_drop &&\n this.event_history.size >= this.event_history.max_history_size\n ) {\n throw new Error(\n `${this.toString()}.emit(${original_event.event_type}) rejected: history limit reached (${this.event_history.size}/${this.event_history.max_history_size}); set event_history.max_history_drop=true to drop old history instead.`\n )\n }\n\n this.event_history.addEvent(original_event)\n this.event_history.trimEventHistory({\n is_event_complete: (candidate_event) => candidate_event.event_status === 'completed',\n on_remove: (candidate_event) => candidate_event._gc(),\n owner_label: this.toString(),\n max_history_size: this.event_history.max_history_size,\n max_history_drop: this.event_history.max_history_drop,\n })\n this._resolveFindWaiters(original_event)\n\n original_event.event_pending_bus_count += 1\n this.pending_event_queue.push(original_event)\n this._startRunloop()\n\n return this._getEventProxyScopedToThisBus(original_event) as T\n }\n\n // alias for emit\n dispatch<T extends BaseEvent>(event: T): T {\n return this.emit(event)\n }\n\n // find a recent event or wait for a future event that matches some criteria\n find(event_pattern: '*', options?: FindOptions<BaseEvent>): Promise<BaseEvent | null>\n find(event_pattern: '*', where: (event: BaseEvent) => boolean, options?: FindOptions<BaseEvent>): Promise<BaseEvent | null>\n find<T extends BaseEvent>(event_pattern: EventPattern<T>, options?: FindOptions<T>): Promise<T | null>\n find<T extends BaseEvent>(event_pattern: EventPattern<T>, where: (event: T) => boolean, options?: FindOptions<T>): Promise<T | null>\n async find<T extends BaseEvent>(\n event_pattern: EventPattern<T> | '*',\n where_or_options: ((event: T) => boolean) | FindOptions<T> = {},\n maybe_options: FindOptions<T> = {}\n ): Promise<T | null> {\n const where = typeof where_or_options === 'function' ? where_or_options : () => true\n const options = typeof where_or_options === 'function' ? maybe_options : where_or_options\n const match = await this.event_history.find(event_pattern as EventPattern<T> | '*', where, {\n ...options,\n event_is_child_of: (event, ancestor) => this.eventIsChildOf(event, ancestor),\n wait_for_future_match: (normalized_event_pattern, matches, future) =>\n this._waitForFutureMatch(normalized_event_pattern, matches, future),\n })\n if (!match) {\n return null\n }\n return this._getEventProxyScopedToThisBus(match) as T\n }\n\n private async _waitForFutureMatch(\n event_pattern: string | '*',\n matches: (event: BaseEvent) => boolean,\n future: boolean | number\n ): Promise<BaseEvent | null> {\n if (future === false) {\n return null\n }\n return await new Promise<BaseEvent | null>((resolve) => {\n const waiter: EphemeralFindEventHandler = {\n event_pattern,\n matches,\n resolve: (event) => resolve(event),\n }\n if (future !== true) {\n const timeout_ms = Math.max(0, Number(future)) * 1000\n waiter.timeout_id = setTimeout(() => {\n this.find_waiters.delete(waiter)\n resolve(null)\n }, timeout_ms)\n }\n this.find_waiters.add(waiter)\n })\n }\n\n async waitUntilIdle(timeout: number | null = null): Promise<boolean> {\n return await this.locks.waitForIdle(timeout)\n }\n\n // Weak idle check: only checks if handlers are idle, doesnt check that the queue is empty\n isIdle(): boolean {\n for (const event of this.event_history.values()) {\n for (const result of event.event_results.values()) {\n if (result.eventbus_id !== this.id) {\n continue\n }\n if (result.status === 'pending' || result.status === 'started') {\n return false\n }\n }\n }\n return true // no handlers are pending or started\n }\n\n // Stronger idle check: no queued work, no in-flight processing, _runloop not\n // active, and no handlers pending/running for this bus.\n isIdleAndQueueEmpty(): boolean {\n return this.pending_event_queue.length === 0 && this.in_flight_event_ids.size === 0 && this.isIdle() && !this.runloop_running\n }\n\n eventIsChildOf(child_event: BaseEvent, parent_event: BaseEvent): boolean {\n if (child_event.event_id === parent_event.event_id) {\n return false\n }\n\n let current_parent_id = child_event.event_parent_id\n while (current_parent_id) {\n if (current_parent_id === parent_event.event_id) {\n return true\n }\n const parent = this.event_history.get(current_parent_id)\n if (!parent) {\n return false\n }\n current_parent_id = parent.event_parent_id\n }\n return false\n }\n\n eventIsParentOf(parent_event: BaseEvent, child_event: BaseEvent): boolean {\n return this.eventIsChildOf(child_event, parent_event)\n }\n\n // return a full detailed tree diagram of all events and results on this bus\n logTree(): string {\n return logTree(this)\n }\n\n // Resolve an event id from this bus first, then across all known buses.\n findEventById(event_id: string): BaseEvent | null {\n return this.event_history.get(event_id) ?? this.all_instances.findEventById(event_id)\n }\n\n private _startRunloop(): void {\n if (this.runloop_running) {\n return\n }\n this.runloop_running = true\n this.scheduleMicrotask(() => {\n void this._runloop()\n })\n }\n\n // schedule the processing of an event on the event bus by its normal _runloop\n // optionally using a pre-acquired lock if we're inside handling of a parent event\n private async _processEvent(\n event: BaseEvent,\n options: {\n bypass_event_locks?: boolean\n pre_acquired_lock?: AsyncLock | null\n } = {}\n ): Promise<void> {\n let pending_entries: Array<{\n handler: EventHandler\n result: EventResult\n }> = []\n try {\n if (this._hasProcessedEvent(event)) {\n return\n }\n const scoped_event = this._getEventProxyScopedToThisBus(event)\n await this._onEventChange(scoped_event, 'pending')\n event._markStarted()\n pending_entries = event._createPendingHandlerResults(this)\n const resolved_event_timeout = event.event_timeout ?? this.event_timeout\n if (this.middlewares.length > 0) {\n for (const entry of pending_entries) {\n await this._onEventResultChange(scoped_event, entry.result, 'pending')\n }\n }\n await this.locks._runWithEventLock(\n event,\n () =>\n this._runHandlersWithTimeout(event, pending_entries, resolved_event_timeout, () =>\n _runWithSlowMonitor(event._createSlowEventWarningTimer(), () => scoped_event._runHandlers(pending_entries))\n ),\n options\n )\n this._markEventCompletedIfNeeded(event)\n } finally {\n if (options.pre_acquired_lock) {\n options.pre_acquired_lock.release()\n }\n this.in_flight_event_ids.delete(event.event_id)\n this.locks._notifyIdleListeners()\n }\n }\n\n // Called when a handler does `await child.done()` \u2014 processes the child event\n // immediately (\"queue-jump\") instead of waiting for the _runloop to pick it up.\n //\n // Yield-and-reacquire: if the calling handler holds a handler concurrency lock,\n // we temporarily release it so child handlers on the same bus can acquire it\n // (preventing deadlock for serial handler mode). We re-acquire after\n // the child completes so the parent handler can continue with the lock held.\n async _processEventImmediately<T extends BaseEvent>(event: T, handler_result?: EventResult): Promise<T> {\n const original_event = event._event_original ?? event\n // Find the handler result for the current await call site. Proxy-provided\n // context covers event.emit(...); async-local context lets awaited bus.emit(...)\n // events queue-jump without implicitly changing their parentage.\n const proxy_result = handler_result?.status === 'started' ? handler_result : undefined\n const currently_active_event_result = proxy_result ?? this.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!currently_active_event_result) {\n // Not inside any handler scope \u2014 avoid queue-jump, but if this event is\n // next in line we can process it immediately without waiting on the _runloop.\n // We must acquire/revalidate the event lock first to avoid racing the runloop\n // and accidentally reordering/removing the wrong queue head.\n const queue_index = this.pending_event_queue.indexOf(original_event)\n const can_process_now =\n queue_index === 0 &&\n !this.locks._isPaused() &&\n !this.in_flight_event_ids.has(original_event.event_id) &&\n !this._hasProcessedEvent(original_event)\n if (can_process_now) {\n const event_lock = this.locks.getLockForEvent(original_event)\n let pre_acquired_lock: AsyncLock | null = null\n if (event_lock) {\n await event_lock.acquire()\n pre_acquired_lock = event_lock\n }\n const queue_head = this.pending_event_queue[0]\n const queue_head_original = queue_head?._event_original ?? queue_head\n const still_can_process_now =\n queue_head_original === original_event &&\n !this.locks._isPaused() &&\n !this.in_flight_event_ids.has(original_event.event_id) &&\n !this._hasProcessedEvent(original_event)\n if (still_can_process_now) {\n this.pending_event_queue.shift()\n this.in_flight_event_ids.add(original_event.event_id)\n await this._processEvent(original_event, {\n bypass_event_locks: true,\n pre_acquired_lock,\n })\n if (original_event.event_status !== 'completed') {\n await original_event.eventCompleted()\n }\n return event\n }\n if (pre_acquired_lock) {\n pre_acquired_lock.release()\n }\n }\n await original_event.eventCompleted()\n return event\n }\n\n const active_parent = currently_active_event_result.event._event_original ?? currently_active_event_result.event\n const is_child_of_active_handler =\n original_event.event_parent_id === active_parent.event_id &&\n original_event.event_emitted_by_handler_id === currently_active_event_result.handler_id &&\n currently_active_event_result.event_children.some((child) => (child._event_original ?? child).event_id === original_event.event_id)\n if (is_child_of_active_handler) {\n original_event.event_blocks_parent_completion = true\n }\n\n // ensure a pause request is set so the bus _runloop pauses and (will resume when the handler exits)\n currently_active_event_result._ensureQueueJumpPause(this)\n if (original_event.event_status === 'completed') {\n return event\n }\n\n // re-endter event-level handler lock if needed\n if (currently_active_event_result._lock) {\n await currently_active_event_result._lock.runQueueJump(this._processEventImmediatelyAcrossBuses.bind(this, original_event))\n return event\n }\n\n await this._processEventImmediatelyAcrossBuses(original_event)\n return event\n }\n\n // Processes a queue-jumped event across all buses that have it emitted.\n // Called from _processEventImmediately after the parent handler's lock has been yielded.\n private async _processEventImmediatelyAcrossBuses(event: BaseEvent): Promise<void> {\n // Use event_path ordering to pick candidate buses and filter out buses that\n // haven't seen the event or already processed it.\n const ordered: EventBus[] = []\n const seen = new Set<EventBus>()\n const event_path = Array.isArray(event.event_path) ? event.event_path : []\n for (const label of event_path) {\n for (const bus of this.all_instances) {\n if (bus.label !== label) {\n continue\n }\n if (!bus.event_history.has(event.event_id)) {\n continue\n }\n if (bus._hasProcessedEvent(event)) {\n continue\n }\n if (!seen.has(bus)) {\n ordered.push(bus)\n seen.add(bus)\n }\n }\n }\n if (!seen.has(this) && this.event_history.has(event.event_id)) {\n ordered.push(this)\n }\n if (ordered.length === 0) {\n await event.eventCompleted()\n return\n }\n\n // Determine which event lock the initiating bus resolves to, so we can\n // detect when other buses share the same instance (global-serial).\n const initiating_event_lock = this.locks.getLockForEvent(event)\n const pause_releases: Array<() => void> = []\n\n try {\n for (const bus of ordered) {\n if (bus !== this) {\n pause_releases.push(bus.locks._requestRunloopPause())\n }\n }\n\n for (const bus of ordered) {\n const index = bus.pending_event_queue.indexOf(event)\n if (index >= 0) {\n bus.pending_event_queue.splice(index, 1)\n }\n if (bus._hasProcessedEvent(event)) {\n continue\n }\n if (bus.in_flight_event_ids.has(event.event_id)) {\n continue\n }\n bus.in_flight_event_ids.add(event.event_id)\n\n // Bypass event lock on the initiating bus (we're already inside a handler\n // that acquired it). For other buses, only bypass if they resolve to the same\n // lock instance (global-serial shares one lock across all buses).\n const bus_event_lock = bus.locks.getLockForEvent(event)\n const should_bypass_event_lock = bus === this || (initiating_event_lock !== null && bus_event_lock === initiating_event_lock)\n\n await bus._processEvent(event, {\n bypass_event_locks: should_bypass_event_lock,\n })\n }\n\n if (event.event_status !== 'completed') {\n await event.eventCompleted()\n }\n } finally {\n for (const release of pause_releases) {\n release()\n }\n }\n }\n\n private async _runloop(): Promise<void> {\n for (;;) {\n while (this.pending_event_queue.length > 0) {\n await Promise.resolve()\n if (this.locks._isPaused()) {\n await this.locks._waitUntilRunloopResumed()\n continue\n }\n const next_event = this.pending_event_queue[0]\n if (!next_event) {\n continue\n }\n const original_event = next_event._event_original ?? next_event\n if (this._hasProcessedEvent(original_event)) {\n this.pending_event_queue.shift()\n continue\n }\n let pre_acquired_lock: AsyncLock | null = null\n const event_lock = this.locks.getLockForEvent(original_event)\n if (event_lock) {\n await event_lock.acquire()\n pre_acquired_lock = event_lock\n }\n // Queue head may have changed while waiting for the lock\n // (e.g. done() processing the head immediately). Revalidate\n // before mutating the queue to avoid removing the wrong event.\n const current_head = this.pending_event_queue[0]\n const current_head_original = current_head?._event_original ?? current_head\n if (current_head_original !== original_event) {\n if (pre_acquired_lock) {\n pre_acquired_lock.release()\n }\n continue\n }\n this.pending_event_queue.shift()\n if (this.in_flight_event_ids.has(original_event.event_id)) {\n if (pre_acquired_lock) {\n pre_acquired_lock.release()\n }\n continue\n }\n this.in_flight_event_ids.add(original_event.event_id)\n void this._processEvent(original_event, {\n bypass_event_locks: true,\n pre_acquired_lock,\n })\n await Promise.resolve()\n }\n this.runloop_running = false\n if (this.pending_event_queue.length > 0) {\n this._startRunloop()\n return\n }\n this.locks._notifyIdleListeners()\n return\n }\n }\n\n // check if an event has been processed (and completed) by this bus\n _hasProcessedEvent(event: BaseEvent): boolean {\n const results = Array.from(event.event_results.values()).filter((result) => result.eventbus_id === this.id)\n if (results.length === 0) {\n return false\n }\n return results.every((result) => result.status === 'completed' || result.status === 'error')\n }\n\n // get a proxy wrapper around an Event that will automatically link emitted child events to this bus and handler\n // proxy is what gets passed into the handler, if handler does event.emit(...) to dispatch child events,\n // the proxy auto-sets event.parent_event_id and event.event_emitted_by_handler_id\n _getEventProxyScopedToThisBus<T extends BaseEvent>(event: T, handler_result?: EventResult): T {\n const original_event = event._event_original ?? event\n const bus = this\n const parent_event_id = original_event.event_id\n const bus_proxy = new Proxy(bus, {\n get(target, prop, receiver) {\n if (prop === '_processEventImmediately') {\n const runner = Reflect.get(target, prop, receiver) as EventBus['_processEventImmediately']\n const process_event_immediately = <TChild extends BaseEvent>(child_event: TChild): Promise<TChild> => {\n return runner.call(target, child_event, handler_result) as Promise<TChild>\n }\n return process_event_immediately\n }\n if (prop === 'dispatch' || prop === 'emit') {\n const emit_child_event = <TChild extends BaseEvent>(child_event: TChild): TChild => {\n const original_child = child_event._event_original ?? child_event\n if (handler_result) {\n handler_result._linkEmittedChildEvent(original_child)\n } else if (!original_child.event_parent_id && original_child.event_id !== parent_event_id) {\n // fallback for non-handler scoped emit/dispatch\n original_child.event_parent_id = parent_event_id\n }\n const dispatcher = Reflect.get(target, prop, receiver) as EventBus['dispatch']\n const dispatched = dispatcher.call(target, original_child)\n return target._getEventProxyScopedToThisBus(dispatched as TChild, handler_result)\n }\n return emit_child_event\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n const scoped = new Proxy(original_event, {\n get(target, prop, receiver) {\n if (prop === 'event_bus') {\n return bus_proxy\n }\n if (prop === '_event_original') {\n return target\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value) {\n if (prop === 'event_bus') {\n return true\n }\n return Reflect.set(target, prop, value, target)\n },\n has(target, prop) {\n if (prop === 'event_bus') {\n return true\n }\n if (prop === '_event_original') {\n return true\n }\n return Reflect.has(target, prop)\n },\n })\n\n return scoped as T\n }\n\n private _resolveFindWaiters(event: BaseEvent): void {\n for (const waiter of Array.from(this.find_waiters)) {\n if ((waiter.event_pattern !== '*' && event.event_type !== waiter.event_pattern) || !waiter.matches(event)) {\n continue\n }\n if (waiter.timeout_id) {\n clearTimeout(waiter.timeout_id)\n }\n this.find_waiters.delete(waiter)\n waiter.resolve(event)\n }\n }\n\n _getHandlersForEvent(event: BaseEvent): EventHandler[] {\n const handlers: EventHandler[] = []\n for (const key of [event.event_type, '*']) {\n const ids = this.handlers_by_key.get(key)\n if (!ids) continue\n for (const id of ids) {\n const entry = this.handlers.get(id)\n if (entry) handlers.push(entry)\n }\n }\n return handlers\n }\n\n private _removeIndexedHandler(event_pattern: string | '*', handler_id: string): void {\n const ids = this.handlers_by_key.get(event_pattern)\n if (!ids) return\n const idx = ids.indexOf(handler_id)\n if (idx < 0) return\n ids.splice(idx, 1)\n if (ids.length === 0) this.handlers_by_key.delete(event_pattern)\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["uuidv7"]
|
|
7
|
-
}
|