abxbus 2.5.4 → 2.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cjs/BaseEvent.d.ts +53 -28
  2. package/dist/cjs/BaseEvent.js +148 -28
  3. package/dist/cjs/BaseEvent.js.map +2 -2
  4. package/dist/cjs/LockManager.js +1 -1
  5. package/dist/cjs/LockManager.js.map +2 -2
  6. package/dist/cjs/events_suck.d.ts +8 -15
  7. package/dist/cjs/events_suck.js +1 -1
  8. package/dist/cjs/events_suck.js.map +2 -2
  9. package/dist/cjs/jsonschema.d.ts +6 -0
  10. package/dist/cjs/jsonschema.js +155 -0
  11. package/dist/cjs/jsonschema.js.map +7 -0
  12. package/dist/cjs/retry.d.ts +2 -0
  13. package/dist/cjs/retry.js +110 -35
  14. package/dist/cjs/retry.js.map +3 -3
  15. package/dist/cjs/types.d.ts +6 -10
  16. package/dist/cjs/types.js +9 -16
  17. package/dist/cjs/types.js.map +2 -2
  18. package/dist/esm/BaseEvent.js +148 -28
  19. package/dist/esm/BaseEvent.js.map +2 -2
  20. package/dist/esm/LockManager.js +1 -1
  21. package/dist/esm/LockManager.js.map +2 -2
  22. package/dist/esm/events_suck.js +1 -1
  23. package/dist/esm/events_suck.js.map +2 -2
  24. package/dist/esm/jsonschema.js +135 -0
  25. package/dist/esm/jsonschema.js.map +7 -0
  26. package/dist/esm/retry.js +110 -35
  27. package/dist/esm/retry.js.map +3 -3
  28. package/dist/esm/types.js +8 -15
  29. package/dist/esm/types.js.map +2 -2
  30. package/dist/types/BaseEvent.d.ts +53 -28
  31. package/dist/types/events_suck.d.ts +8 -15
  32. package/dist/types/jsonschema.d.ts +6 -0
  33. package/dist/types/retry.d.ts +2 -0
  34. package/dist/types/types.d.ts +6 -10
  35. package/package.json +1 -1
  36. package/src/BaseEvent.ts +321 -80
  37. package/src/LockManager.ts +1 -1
  38. package/src/events_suck.ts +20 -22
  39. package/src/jsonschema.ts +146 -0
  40. package/src/retry.ts +132 -38
  41. package/src/types.ts +10 -19
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/BaseEvent.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport { v7 as uuidv7 } from 'uuid'\n\nimport { EventBus } from './EventBus.js'\nimport { EventResult } from './EventResult.js'\nimport { EventHandler, EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from './EventHandler.js'\nimport type { EventConcurrencyMode, EventHandlerConcurrencyMode, EventHandlerCompletionMode, Deferred } from './LockManager.js'\nimport {\n AsyncLock,\n EVENT_CONCURRENCY_MODES,\n EVENT_HANDLER_CONCURRENCY_MODES,\n EVENT_HANDLER_COMPLETION_MODES,\n withResolvers,\n} from './LockManager.js'\nimport { _runWithTimeout } from './timing.js'\nimport { isZodSchema, 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([\n 'bus',\n 'emit',\n 'wait',\n 'now',\n 'eventResult',\n 'eventResultsList',\n 'toString',\n 'toJSON',\n 'fromJSON',\n])\n\nconst EVENT_TYPE_REGISTRY = new Map<string, typeof BaseEvent>()\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 isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isZodObjectSchema(value: unknown): value is z.ZodObject<z.ZodRawShape> {\n return (\n isZodSchema(value) &&\n typeof (value as { safeExtend?: unknown }).safeExtend === 'function' &&\n isRecord((value as { shape?: unknown }).shape)\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().nonnegative().nullable(),\n event_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_slow_timeout: z.number().nonnegative().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.record(z.string(), 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))\ntype AnyEventSchema = z.ZodTypeAny\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFieldName =\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'\ntype BaseEventFields = { [K in BaseEventFieldName]: BaseEventData[K] }\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\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>\ntype EventPayloadFromSchema<TSchema extends AnyEventSchema> = z.output<TSchema> extends Record<string, unknown> ? z.output<TSchema> : {}\ntype EventInputFromSchema<TSchema extends AnyEventSchema> = z.input<TSchema> extends Record<string, unknown> ? z.input<TSchema> : never\nexport type EventInitFromSchema<TSchema extends AnyEventSchema> = Omit<EventInputFromSchema<TSchema>, keyof BaseEventFields> &\n 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 ResultSchemaFromEventSchema<TSchema> = TSchema extends z.ZodObject<infer TShape> ? ResultSchemaFromShape<TShape> : unknown\nexport type EventResultInclude<TEvent extends BaseEvent> = (\n result: EventResult<TEvent>['result'],\n event_result: EventResult<TEvent>\n) => boolean\nexport type EventResultOptions<TEvent extends BaseEvent> = {\n include?: EventResultInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\nexport type EventWaitOptions = {\n timeout?: number | null\n first_result?: boolean\n}\nexport type EventWaitPromise<TEvent extends BaseEvent> = Promise<TEvent> & {\n eventResult(options?: EventResultOptions<TEvent>): Promise<EventResultType<TEvent> | undefined>\n eventResultsList(options?: EventResultOptions<TEvent>): Promise<Array<EventResultType<TEvent> | undefined>>\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 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 event_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\nexport type SchemaEventFactory<TSchema extends AnyEventSchema, TResult = unknown> = {\n (data: EventInitFromSchema<TSchema>): EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>\n new (data: EventInitFromSchema<TSchema>): EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>\n event_schema: TSchema\n class?: new (data: EventInitFromSchema<TSchema>) => EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>\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\nfunction baseEventDefaultShape(event_type: string): z.ZodRawShape {\n return {\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string().default(event_type),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().nonnegative().nullable().default(null),\n event_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_blocks_parent_completion: z.boolean().default(false),\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.record(z.string(), 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}\n\nfunction missingBaseFields(event_type: string, user_shape: z.ZodRawShape): z.ZodRawShape {\n return Object.fromEntries(Object.entries(baseEventDefaultShape(event_type)).filter(([key]) => !(key in user_shape))) as z.ZodRawShape\n}\n\ntype ZodSchemaWithPrefault = z.ZodTypeAny & {\n prefault: (value: unknown) => z.ZodTypeAny\n}\n\nfunction shortcutDefaultSchema(base_field_schema: z.ZodTypeAny | undefined, value: unknown): z.ZodTypeAny {\n if (!base_field_schema) {\n return z.unknown().optional().default(value)\n }\n return (base_field_schema as ZodSchemaWithPrefault).prefault(base_field_schema.parse(value))\n}\n\nfunction schemaDefaultsForShortcut(event_type: string, raw_shape: Record<string, unknown>): z.ZodRawShape {\n const defaults: Record<string, z.ZodTypeAny> = {}\n const base_shape = baseEventDefaultShape(event_type)\n for (const [key, value] of Object.entries(raw_shape)) {\n if (key === 'event_result_type') continue\n if (!isZodSchema(value)) {\n defaults[key] = shortcutDefaultSchema(base_shape[key] as z.ZodTypeAny | undefined, value)\n }\n }\n return defaults\n}\n\nfunction zodFieldsForShortcut(raw_shape: Record<string, unknown>): z.ZodRawShape {\n const fields: Record<string, z.ZodTypeAny> = {}\n for (const [key, value] of Object.entries(raw_shape)) {\n if (key === 'event_result_type') continue\n if (isZodSchema(value)) {\n fields[key] = value\n }\n }\n return fields\n}\n\nfunction eventResultTypeFromObjectSchema(schema: z.ZodObject<z.ZodRawShape>): z.ZodTypeAny | undefined {\n const raw_event_result_type = schema.shape.event_result_type\n return raw_event_result_type === undefined ? undefined : normalizeEventResultType(raw_event_result_type)\n}\n\nfunction buildFullEventSchema(\n event_type: string,\n spec: unknown\n): {\n event_schema: AnyEventSchema\n event_result_type?: z.ZodTypeAny\n event_version?: string\n} {\n if (isZodObjectSchema(spec)) {\n const user_shape = spec.shape\n assertNoReservedUserEventFields(user_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(user_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(user_shape, `BaseEvent.extend(${event_type})`)\n const full_schema = spec.safeExtend({\n event_result_type: z.unknown().optional(),\n ...missingBaseFields(event_type, user_shape),\n })\n return {\n event_schema: full_schema,\n event_result_type: eventResultTypeFromObjectSchema(spec),\n }\n }\n\n const raw_shape = (isRecord(spec) ? spec : {}) 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 shortcut_shape = {\n ...schemaDefaultsForShortcut(event_type, raw_shape),\n ...zodFieldsForShortcut(raw_shape),\n }\n const full_schema = z.object(shortcut_shape).safeExtend(missingBaseFields(event_type, shortcut_shape)).loose()\n return {\n event_schema: full_schema,\n event_result_type: normalizeEventResultType(raw_shape.event_result_type),\n event_version: typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined,\n }\n}\n\nfunction decodeEventSchema(schema: AnyEventSchema, input: unknown): Record<string, unknown> {\n const decoded = (z as unknown as { decode: (schema: AnyEventSchema, input: unknown) => unknown }).decode(schema, input)\n if (!isRecord(decoded)) {\n throw new Error('BaseEvent schema must decode to an object')\n }\n return decoded\n}\n\nfunction encodeEventSchema(schema: AnyEventSchema, input: Record<string, unknown>): Record<string, unknown> {\n const encoded = (z as unknown as { encode: (schema: AnyEventSchema, input: unknown) => unknown }).encode(schema, input)\n if (!isRecord(encoded)) {\n throw new Error('BaseEvent schema must encode to an object')\n }\n return encoded\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 now()\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 event_schema?: z.ZodTypeAny\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 event_result_type?: z.ZodTypeAny\n static event_schema: AnyEventSchema = BaseEventSchema // generated Zod schema for local TS event data validation; never sent over the wire\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 _event_fields_set?: Set<string>\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 event_schema?: AnyEventSchema\n }\n const explicit_event_fields = new Set(Object.keys(data ?? {}))\n const merged_data = { ...data } 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\n const event_schema = ctor.event_schema ?? BaseEventSchema\n const base_data: Record<string, unknown> = {\n ...merged_data,\n event_id: merged_data.event_id ?? uuidv7(),\n event_created_at: merged_data.event_created_at ?? monotonicDatetime(),\n event_type,\n event_version,\n event_result_type,\n }\n if (event_schema === BaseEventSchema) {\n base_data.event_timeout ??= null\n base_data.event_blocks_parent_completion ??= false\n }\n\n const parsed = decodeEventSchema(event_schema, base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n Object.defineProperty(this, 'event_schema', {\n value: event_schema,\n writable: true,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(this, '_event_fields_set', {\n value: explicit_event_fields,\n writable: true,\n enumerable: false,\n configurable: true,\n })\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n this.event_created_at = monotonicDatetime(parsed.event_created_at)\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 = normalizeEventResultType(parsed.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<TSchema extends z.ZodObject<z.ZodRawShape>>(\n event_type: string,\n event_schema: TSchema\n ): SchemaEventFactory<TSchema, ResultSchemaFromEventSchema<TSchema>>\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\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> | SchemaEventFactory<AnyEventSchema, unknown> {\n const built = buildFullEventSchema(event_type, shape ?? {})\n const full_schema = built.event_schema\n const event_result_type = built.event_result_type\n const event_version = built.event_version\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static event_schema = full_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>> | EventInitFromSchema<AnyEventSchema>) {\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.event_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(data) as FactoryResult\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_TYPE_REGISTRY.set(event_type, ExtendedEvent)\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 event_schema = this.event_schema ?? BaseEventSchema\n const parsed = decodeEventSchema(event_schema, data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (this === BaseEvent) {\n const event_type = record.event_type\n if (typeof event_type === 'string') {\n const KnownEvent = EVENT_TYPE_REGISTRY.get(event_type)\n if (KnownEvent) {\n return KnownEvent.fromJSON(record) as InstanceType<T>\n }\n }\n }\n const ctor = this as typeof BaseEvent\n if (this !== BaseEvent && ctor.event_result_type && record.event_result_type !== undefined) {\n delete record.event_result_type\n }\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_schema' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Object.fromEntries(\n Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])\n )\n\n const event_schema = ((this.constructor as typeof BaseEvent).event_schema ?? this.event_schema ?? BaseEventSchema) as AnyEventSchema\n const encoded = encodeEventSchema(event_schema, {\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,\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 ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n })\n delete encoded.event_schema\n\n return {\n ...encoded,\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 ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(\n event_slow_timeout: number | null = this.event_slow_timeout ?? null,\n bus_name?: string\n ): ReturnType<typeof setTimeout> | null {\n const event_warn_ms = event_slow_timeout === null || event_slow_timeout <= 0 ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = bus_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 BaseEvent._defaultResultInclude(entry.result, entry)\n }\n\n private static _defaultResultInclude<TEvent extends BaseEvent>(\n result: EventResult<TEvent>['result'],\n event_result: EventResult<TEvent>\n ): boolean {\n return (\n event_result.status === 'completed' &&\n result !== undefined &&\n result !== null &&\n !(result instanceof Error) &&\n !(result instanceof BaseEvent) &&\n event_result.error === undefined\n )\n }\n\n private static _includeEventResult<TEvent extends BaseEvent>(\n include: EventResultInclude<TEvent>,\n event_result: EventResult<TEvent>\n ): boolean {\n return include(event_result.result, event_result)\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(\n original,\n original.event_handler_concurrency ?? this.event_bus.event_handler_concurrency,\n async (handler_lock) => {\n await entry.runHandler(handler_lock)\n }\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(original.event_handler_concurrency ?? this.event_bus?.event_handler_concurrency ?? 'serial') !== 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 ?? '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 active waiters 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 event_handler_completion='first'.\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(\"event_handler_completion='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: event_handler_completion='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: event_handler_completion='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 private _withEventResultMethods(promise: Promise<this>): EventWaitPromise<this> {\n const chainable = promise as EventWaitPromise<this>\n chainable.eventResult = async (options?: EventResultOptions<this>) => {\n const event = await promise\n return event.eventResult(options)\n }\n chainable.eventResultsList = async (options?: EventResultOptions<this>) => {\n const event = await promise\n return event.eventResultsList(options)\n }\n return chainable\n }\n\n private _timeoutPromise<T>(timeout: number | null, message: () => string, fn: () => Promise<T>): Promise<T> {\n return timeout === null || timeout <= 0 ? fn() : _runWithTimeout(timeout, () => new Error(message()), fn)\n }\n\n private _orderedEventResults(): EventResult<this>[] {\n const original = this._event_original ?? this\n return (Array.from(original.event_results.values()) as EventResult<this>[]).sort((a, b) =>\n compareIsoDatetime(a.completed_at, b.completed_at)\n )\n }\n\n private _orderedEventResultsByRegistration(): EventResult<this>[] {\n const original = this._event_original ?? this\n return (Array.from(original.event_results.values()) as EventResult<this>[]).sort(\n (a, b) =>\n compareIsoDatetime(a.handler.handler_registered_at, b.handler.handler_registered_at) ||\n compareIsoDatetime(a.started_at, b.started_at) ||\n a.handler_id.localeCompare(b.handler_id)\n )\n }\n\n private _collectResultValues(\n options: EventResultOptions<this> = {},\n order: 'completion' | 'registration' = 'completion'\n ): Array<EventResultType<this> | undefined> {\n const include: EventResultInclude<this> = options.include ?? BaseEvent._defaultResultInclude\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? false\n const all_results = order === 'registration' ? this._orderedEventResultsByRegistration() : this._orderedEventResults()\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n const included_results = all_results.filter((event_result) => BaseEvent._includeEventResult(include, event_result))\n\n if (error_results.length > 0 && raise_if_any) {\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 if (errors.length === 1) {\n throw errors[0]\n }\n throw new AggregateError(errors, `Event ${this.event_type}#${this.event_id.slice(-4)} had ${errors.length} handler error(s)`)\n }\n\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: ${this.event_type}#${this.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n private _hasIncludedResult(options: EventResultOptions<this> = {}): boolean {\n const include: EventResultInclude<this> = options.include ?? BaseEvent._defaultResultInclude\n return this._orderedEventResults().some((event_result) => BaseEvent._includeEventResult(include, event_result))\n }\n\n private async _waitForFirstResultOrCompletion(options: EventWaitOptions & EventResultOptions<this> = {}): Promise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n throw new Error('timeout must be >= 0 or null')\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n throw new Error('event has no bus attached')\n }\n if (original.event_status === 'completed' || this._hasIncludedResult(options)) {\n return this\n }\n\n const waitForResult = async (): Promise<this> => {\n for (;;) {\n if (original.event_status === 'completed' || this._hasIncludedResult(options)) {\n return this\n }\n await new Promise((resolve) => setTimeout(resolve, 1))\n }\n }\n\n const timeout = options.timeout ?? null\n return this._timeoutPromise(timeout, () => `Timed out waiting for ${original.event_type} result after ${timeout}s`, waitForResult)\n }\n\n // Active awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued.\n now(options: EventWaitOptions = {}): EventWaitPromise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n return this._withEventResultMethods(Promise.reject(new Error('timeout must be >= 0 or null')))\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n return this._withEventResultMethods(Promise.reject(new Error('event has no bus attached')))\n }\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const resolved_timeout_seconds = options.timeout ?? null\n const processing =\n original.event_status === 'completed'\n ? Promise.resolve(this)\n : this._timeoutPromise(\n resolved_timeout_seconds,\n () => `Timed out waiting for ${original.event_type} completion after ${resolved_timeout_seconds}s`,\n () => this.event_bus!._processEventImmediately(this)\n )\n\n if (options.first_result) {\n void processing.catch(() => undefined)\n return this._withEventResultMethods(this._waitForFirstResultOrCompletion(options))\n }\n\n return this._withEventResultMethods(processing)\n }\n\n // Passive awaitable that waits for normal queue-order processing without forcing execution.\n wait(options: EventWaitOptions = {}): EventWaitPromise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n return this._withEventResultMethods(Promise.reject(new Error('timeout must be >= 0 or null')))\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n return this._withEventResultMethods(Promise.reject(new Error('event has no bus attached')))\n }\n if (options.first_result) {\n return this._withEventResultMethods(this._waitForFirstResultOrCompletion(options))\n }\n if (original.event_status === 'completed') {\n return this._withEventResultMethods(Promise.resolve(this))\n }\n this._notifyDoneListeners()\n const timeout = options.timeout ?? null\n return this._withEventResultMethods(\n this._timeoutPromise(\n timeout,\n () => `Timed out waiting for ${original.event_type} completion after ${timeout}s`,\n () => this._event_completed_signal!.promise.then(() => this)\n )\n )\n }\n\n async eventResult(options: EventResultOptions<this> = {}): Promise<EventResultType<this> | undefined> {\n const original = this._event_original ?? this\n if (original.event_status === 'pending' && original.event_results.size === 0) {\n await this.now({ first_result: true })\n }\n return this._collectResultValues(options, 'registration').at(0)\n }\n\n async eventResultsList(options: EventResultOptions<this> = {}): Promise<Array<EventResultType<this> | undefined>> {\n const original = this._event_original ?? this\n if (original.event_status === 'pending' && original.event_results.size === 0) {\n await this.now({ first_result: false })\n }\n return this._collectResultValues(options, 'registration')\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 _firstProcessingError(): unknown | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\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 _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 (raw_event_results == null) {\n return event_results\n }\n if (typeof raw_event_results !== 'object' || Array.isArray(raw_event_results)) {\n throw new Error('BaseEvent.event_results must be an object keyed by handler id')\n }\n for (const [handler_id, item] of Object.entries(raw_event_results)) {\n if (item == null || typeof item !== 'object' || Array.isArray(item)) continue\n const result = EventResult.fromJSON(event, {\n handler_id,\n ...(item as Record<string, unknown>),\n })\n event_results.set(handler_id, result)\n }\n return event_results\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport { v7 as uuidv7 } from 'uuid'\n\nimport { EventBus } from './EventBus.js'\nimport { EventResult } from './EventResult.js'\nimport { EventHandler, EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from './EventHandler.js'\nimport type { EventConcurrencyMode, EventHandlerConcurrencyMode, EventHandlerCompletionMode, Deferred } from './LockManager.js'\nimport {\n AsyncLock,\n EVENT_CONCURRENCY_MODES,\n EVENT_HANDLER_CONCURRENCY_MODES,\n EVENT_HANDLER_COMPLETION_MODES,\n withResolvers,\n} from './LockManager.js'\nimport { _runWithTimeout } from './timing.js'\nimport { toJsonSchema, type JsonSchema } from './jsonschema.js'\nimport { isZodSchema, normalizeEventResultType } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set([\n 'bus',\n 'emit',\n 'wait',\n 'now',\n 'eventResult',\n 'eventResultsList',\n 'toString',\n 'toJSON',\n 'fromJSON',\n])\n\nconst EVENT_TYPE_REGISTRY = new Map<string, typeof BaseEvent>()\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 isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isZodObjectSchema(value: unknown): value is z.ZodObject<z.ZodRawShape> {\n return (\n isZodSchema(value) &&\n typeof (value as { safeExtend?: unknown }).safeExtend === 'function' &&\n isRecord((value as { shape?: unknown }).shape)\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().nonnegative().nullable(),\n event_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_slow_timeout: z.number().nonnegative().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.record(z.string(), 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))\nconst EVENT_FACTORY_METADATA_FIELDS = new Set([\n 'class',\n 'fromJSON',\n 'prototype',\n 'event_schema',\n 'model_fields',\n 'event_type',\n 'event_version',\n 'event_result_type',\n])\ntype AnyEventSchema = z.ZodObject<z.ZodRawShape>\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFieldName =\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'\ntype BaseEventFields = { [K in BaseEventFieldName]: BaseEventData[K] }\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayloadShape<TShape extends z.ZodRawShape> = {\n [K in keyof TShape as K extends BaseEventFieldName ? never : K]: TShape[K]\n}\ntype EventPayload<TShape extends z.ZodRawShape> =\n EventPayloadShape<TShape> extends Record<string, never> ? {} : z.infer<z.ZodObject<EventPayloadShape<TShape>>>\ntype EventClassMetadataFieldName =\n | 'fromJSON'\n | 'prototype'\n | 'event_schema'\n | 'model_fields'\n | 'event_type'\n | 'event_version'\n | 'event_result_type'\ntype StaticDefaultSchema = z.ZodDefault<z.ZodTypeAny> | z.ZodPrefault<z.ZodTypeAny> | z.ZodCatch<z.ZodTypeAny>\ntype EventModelFields<TShape extends z.ZodRawShape> = {\n readonly [K in keyof TShape]: TShape[K]\n}\ntype StaticEventDefaultValues<TShape extends z.ZodRawShape> = {\n readonly [K in keyof TShape as K extends EventClassMetadataFieldName\n ? never\n : TShape[K] extends StaticDefaultSchema\n ? K\n : never]: z.output<TShape[K]>\n}\ntype StaticEventDefaultValuesFromSchema<TSchema extends AnyEventSchema> =\n TSchema extends z.ZodObject<infer TShape> ? StaticEventDefaultValues<TShape> : {}\ntype EventModelFieldsFromSchema<TSchema extends AnyEventSchema> =\n TSchema extends z.ZodObject<infer TShape> ? TSchema['shape'] & EventModelFields<TShape> : {}\ntype OptionalFactoryArgs<TData> = {} extends TData ? [data?: TData] : [data: TData]\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>\ntype EventPayloadFromSchema<TSchema extends AnyEventSchema> =\n z.output<TSchema> extends Record<string, unknown> ? Omit<z.output<TSchema>, keyof BaseEventFields> : {}\ntype EventInputFromSchema<TSchema extends AnyEventSchema> = z.input<TSchema> extends Record<string, unknown> ? z.input<TSchema> : never\nexport type EventInitFromSchema<TSchema extends AnyEventSchema> = Omit<EventInputFromSchema<TSchema>, keyof BaseEventFields> &\n Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\ntype NormalizedEventResultSchema<TInput> = TInput extends z.ZodTypeAny\n ? TInput\n : TInput extends z.core.$ZodType\n ? z.ZodType<z.output<TInput>>\n : TInput extends StringConstructor\n ? z.ZodString\n : TInput extends NumberConstructor\n ? z.ZodNumber\n : TInput extends BooleanConstructor\n ? z.ZodBoolean\n : TInput extends ArrayConstructor\n ? z.ZodArray<z.ZodUnknown>\n : TInput extends ObjectConstructor\n ? z.ZodRecord<z.ZodString, z.ZodUnknown>\n : TInput extends JsonSchema\n ? z.ZodTypeAny\n : z.ZodTypeAny\ntype ResultTypeSchemaFromShape<TShape> = TShape extends { event_result_type: infer S }\n ? NormalizedEventResultSchema<S>\n : z.ZodTypeAny | undefined\ntype ResultTypeSchemaFromEventSchema<TSchema> =\n TSchema extends z.ZodObject<infer TShape> ? ResultTypeSchemaFromShape<TShape> : z.ZodTypeAny | undefined\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends z.core.$ZodType\n ? z.output<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 : TInput extends JsonSchema\n ? unknown\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype ResultSchemaFromEventSchema<TSchema> = TSchema extends z.ZodObject<infer TShape> ? ResultSchemaFromShape<TShape> : unknown\ntype ZodLiteralValue = string | number | bigint | boolean | null | undefined\ntype SeenShortcutLiteralPairs = WeakMap<object, WeakSet<object>>\ntype ShortcutDefaultModelField<K, TValue> = K extends keyof BaseEventSchemaShape\n ? z.ZodDefault<BaseEventSchemaShape[K]>\n : z.ZodDefault<TValue extends ZodLiteralValue ? z.ZodLiteral<TValue> : z.ZodType<TValue>>\ntype ShortcutModelFields<TShape> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : K]: TShape[K] extends z.ZodTypeAny\n ? TShape[K]\n : ShortcutDefaultModelField<K, TShape[K]>\n} & (TShape extends { event_result_type: infer TResultType } ? { event_result_type: NormalizedEventResultSchema<TResultType> } : {})\ntype ShortcutZodModelFields<TShape> = {\n [K in keyof ShortcutModelFields<TShape>]: ShortcutModelFields<TShape>[K] extends z.ZodTypeAny ? ShortcutModelFields<TShape>[K] : never\n}\ntype ShortcutStaticDefaultValues<TShape, TModelFields extends z.ZodRawShape> = StaticEventDefaultValues<TModelFields> & {\n readonly [K in keyof TShape as K extends EventClassMetadataFieldName ? never : TShape[K] extends z.ZodTypeAny ? never : K]: TShape[K]\n}\nexport type EventResultInclude<TEvent extends BaseEvent> = (\n result: EventResult<TEvent>['result'],\n event_result: EventResult<TEvent>\n) => boolean\nexport type EventResultOptions<TEvent extends BaseEvent> = {\n include?: EventResultInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\nexport type EventWaitOptions = {\n timeout?: number | null\n first_result?: boolean\n}\nexport type EventWaitPromise<TEvent extends BaseEvent> = Promise<TEvent> & {\n eventResult(options?: EventResultOptions<TEvent>): Promise<EventResultType<TEvent> | undefined>\n eventResultsList(options?: EventResultOptions<TEvent>): Promise<Array<EventResultType<TEvent> | undefined>>\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 ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventClass<\n TEvent extends BaseEvent = BaseEvent,\n TInit = never,\n TSchema extends z.ZodTypeAny = AnyEventSchema,\n TModelFields extends z.ZodRawShape = z.ZodRawShape,\n TResultSchema extends z.ZodTypeAny | undefined = z.ZodTypeAny | undefined,\n TStaticFields = {},\n> = TStaticFields & {\n (...args: OptionalFactoryArgs<TInit>): TEvent\n new (...args: OptionalFactoryArgs<TInit>): TEvent\n event_schema: TSchema\n model_fields: TModelFields\n event_type: string\n event_version: string\n event_result_type: TResultSchema\n fromJSON: (data: unknown) => TEvent\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\nfunction baseEventDefaultShape(event_type: string): z.ZodRawShape {\n return {\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string().default(event_type),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().nonnegative().nullable().default(null),\n event_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_timeout: z.number().nonnegative().nullable().optional(),\n event_handler_slow_timeout: z.number().nonnegative().nullable().optional(),\n event_blocks_parent_completion: z.boolean().default(false),\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.record(z.string(), 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}\n\nfunction missingBaseFields(event_type: string, user_shape: z.ZodRawShape): z.ZodRawShape {\n return Object.fromEntries(Object.entries(baseEventDefaultShape(event_type)).filter(([key]) => !(key in user_shape))) as z.ZodRawShape\n}\n\nfunction isZodLiteralValue(value: unknown): value is ZodLiteralValue {\n return value === null || value === undefined || ['string', 'number', 'bigint', 'boolean'].includes(typeof value)\n}\n\nfunction isPlainShortcutLiteralObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction alreadyComparedShortcutLiteralPair(left: object, right: object, seen: SeenShortcutLiteralPairs): boolean {\n let right_values = seen.get(left)\n if (right_values?.has(right)) {\n return true\n }\n if (!right_values) {\n right_values = new WeakSet<object>()\n seen.set(left, right_values)\n }\n right_values.add(right)\n return false\n}\n\nfunction shortcutLiteralValuesEqual(left: unknown, right: unknown, seen: SeenShortcutLiteralPairs = new WeakMap()): boolean {\n if (Object.is(left, right)) {\n return true\n }\n if (typeof left !== 'object' || left === null || typeof right !== 'object' || right === null) {\n return false\n }\n if (alreadyComparedShortcutLiteralPair(left, right, seen)) {\n return true\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {\n return false\n }\n return left.every((item, index) => shortcutLiteralValuesEqual(item, right[index], seen))\n }\n if (!isPlainShortcutLiteralObject(left) || !isPlainShortcutLiteralObject(right)) {\n return false\n }\n const left_keys = Object.keys(left)\n const right_keys = Object.keys(right)\n if (left_keys.length !== right_keys.length) {\n return false\n }\n return left_keys.every((key) =>\n Object.prototype.hasOwnProperty.call(right, key) ? shortcutLiteralValuesEqual(left[key], right[key], seen) : false\n )\n}\n\nfunction shortcutLiteralSchema<TValue>(value: TValue): z.ZodType<TValue> {\n if (isZodLiteralValue(value)) {\n return z.literal(value) as z.ZodType<TValue>\n }\n return z.custom<TValue>((candidate) => shortcutLiteralValuesEqual(candidate, value), 'Invalid literal value')\n}\n\nfunction shortcutDefaultSchema(base_field_schema: z.ZodTypeAny | undefined, value: unknown): z.ZodTypeAny {\n if (!base_field_schema) {\n return shortcutLiteralSchema(value).default(value)\n }\n return base_field_schema.default(base_field_schema.parse(value))\n}\n\nfunction schemaDefaultsForShortcut(event_type: string, raw_shape: Record<string, unknown>): z.ZodRawShape {\n const defaults: Record<string, z.ZodTypeAny> = {}\n const base_shape = baseEventDefaultShape(event_type)\n for (const [key, value] of Object.entries(raw_shape)) {\n if (key === 'event_result_type') continue\n if (!isZodSchema(value)) {\n defaults[key] = shortcutDefaultSchema(base_shape[key] as z.ZodTypeAny | undefined, value)\n }\n }\n return defaults\n}\n\nfunction zodFieldsForShortcut(raw_shape: Record<string, unknown>): z.ZodRawShape {\n const fields: Record<string, z.ZodTypeAny> = {}\n for (const [key, value] of Object.entries(raw_shape)) {\n if (key === 'event_result_type') continue\n if (isZodSchema(value)) {\n fields[key] = value\n }\n }\n return fields\n}\n\nfunction modelFieldsForShortcut(raw_shape: Record<string, unknown>, shortcut_shape: z.ZodRawShape): z.ZodRawShape {\n const event_result_type = normalizeEventResultType(raw_shape.event_result_type)\n return event_result_type ? { ...shortcut_shape, event_result_type } : shortcut_shape\n}\n\nfunction staticEventDefaultsFromModelFields(model_fields: z.ZodRawShape): Record<string, unknown> {\n const fields: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(model_fields)) {\n if (EVENT_FACTORY_METADATA_FIELDS.has(key)) {\n continue\n }\n const parsed = (value as z.ZodTypeAny).safeParse(undefined)\n if (parsed.success && parsed.data !== undefined) {\n fields[key] = parsed.data\n }\n }\n return fields\n}\n\nfunction defineStaticEventFields(target: object, fields: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(fields)) {\n Object.defineProperty(target, key, {\n value,\n writable: false,\n enumerable: true,\n configurable: true,\n })\n }\n}\n\nfunction eventResultTypeFromObjectSchema(schema: z.ZodObject<z.ZodRawShape>): z.ZodTypeAny | undefined {\n const raw_event_result_type = schema.shape.event_result_type\n return raw_event_result_type === undefined ? undefined : normalizeEventResultType(raw_event_result_type)\n}\n\nfunction eventParseSchemaFromEventSchema(schema: z.ZodObject<z.ZodRawShape>): z.ZodObject<z.ZodRawShape> {\n return schema.safeExtend({\n event_result_type: z.unknown().optional(),\n })\n}\n\nfunction buildFullEventSchema(\n event_type: string,\n spec: unknown\n): {\n event_schema: z.ZodObject<z.ZodRawShape>\n event_parse_schema: z.ZodObject<z.ZodRawShape>\n static_field_defaults: Record<string, unknown>\n event_result_type?: z.ZodTypeAny\n event_version?: string\n} {\n if (isZodObjectSchema(spec)) {\n const user_shape = spec.shape\n assertNoReservedUserEventFields(user_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(user_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(user_shape, `BaseEvent.extend(${event_type})`)\n const full_schema = spec.safeExtend({\n ...missingBaseFields(event_type, user_shape),\n })\n return {\n event_schema: full_schema,\n event_parse_schema: eventParseSchemaFromEventSchema(full_schema),\n static_field_defaults: staticEventDefaultsFromModelFields(full_schema.shape),\n event_result_type: eventResultTypeFromObjectSchema(spec),\n }\n }\n\n const raw_shape = (isRecord(spec) ? spec : {}) 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 shortcut_shape = {\n ...schemaDefaultsForShortcut(event_type, raw_shape),\n ...zodFieldsForShortcut(raw_shape),\n }\n const model_fields = modelFieldsForShortcut(raw_shape, shortcut_shape)\n const full_schema = z.object(model_fields).safeExtend(missingBaseFields(event_type, model_fields)).loose()\n return {\n event_schema: full_schema,\n event_parse_schema: eventParseSchemaFromEventSchema(full_schema),\n static_field_defaults: staticEventDefaultsFromModelFields(full_schema.shape),\n event_result_type: normalizeEventResultType(raw_shape.event_result_type),\n event_version: typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined,\n }\n}\n\nfunction decodeEventSchema(schema: AnyEventSchema, input: unknown): Record<string, unknown> {\n const decoded = (z as unknown as { decode: (schema: AnyEventSchema, input: unknown) => unknown }).decode(schema, input)\n if (!isRecord(decoded)) {\n throw new Error('BaseEvent schema must decode to an object')\n }\n return decoded\n}\n\nfunction encodeEventSchema(schema: AnyEventSchema, input: Record<string, unknown>): Record<string, unknown> {\n const encoded = (z as unknown as { encode: (schema: AnyEventSchema, input: unknown) => unknown }).encode(schema, input)\n if (!isRecord(encoded)) {\n throw new Error('BaseEvent schema must encode to an object')\n }\n return encoded\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 now()\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 event_schema?: z.ZodTypeAny\n _event_parse_schema?: z.ZodTypeAny\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 event_result_type?: z.ZodTypeAny\n static event_schema: AnyEventSchema = BaseEventSchema // generated Zod schema for local TS event data validation; never sent over the wire\n static model_fields: z.ZodRawShape = BaseEventSchema.shape\n static _event_parse_schema: AnyEventSchema = BaseEventSchema\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 _event_fields_set?: Set<string>\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 event_schema?: AnyEventSchema\n _event_parse_schema?: AnyEventSchema\n }\n const explicit_event_fields = new Set(Object.keys(data ?? {}))\n const merged_data = { ...data } 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\n const event_schema = ctor.event_schema ?? BaseEventSchema\n const event_parse_schema = ctor._event_parse_schema ?? event_schema\n const base_data: Record<string, unknown> = {\n ...merged_data,\n event_id: merged_data.event_id ?? uuidv7(),\n event_created_at: merged_data.event_created_at ?? monotonicDatetime(),\n event_type,\n event_version,\n event_result_type,\n }\n if (event_parse_schema === BaseEventSchema) {\n base_data.event_timeout ??= null\n base_data.event_blocks_parent_completion ??= false\n }\n\n const parsed = decodeEventSchema(event_parse_schema, base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n Object.defineProperty(this, 'event_schema', {\n value: event_schema,\n writable: true,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(this, '_event_parse_schema', {\n value: event_parse_schema,\n writable: true,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(this, '_event_fields_set', {\n value: explicit_event_fields,\n writable: true,\n enumerable: false,\n configurable: true,\n })\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n this.event_created_at = monotonicDatetime(parsed.event_created_at)\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 = normalizeEventResultType(parsed.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<TSchema extends z.ZodObject<z.ZodRawShape>>(\n event_type: string,\n event_schema: TSchema\n ): EventClass<\n EventWithResultSchema<ResultSchemaFromEventSchema<TSchema>> & EventPayloadFromSchema<TSchema>,\n EventInitFromSchema<TSchema>,\n TSchema,\n EventModelFieldsFromSchema<TSchema>,\n ResultTypeSchemaFromEventSchema<TSchema>,\n StaticEventDefaultValuesFromSchema<TSchema>\n >\n static extend<const TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventClass<\n EventWithResultSchema<ResultSchemaFromShape<ShortcutZodModelFields<TShape>>> & EventPayload<ShortcutZodModelFields<TShape>>,\n EventInit<ShortcutZodModelFields<TShape>>,\n EventSchema<ShortcutZodModelFields<TShape>>,\n EventModelFields<ShortcutZodModelFields<TShape>>,\n ResultTypeSchemaFromShape<ShortcutZodModelFields<TShape>>,\n ShortcutStaticDefaultValues<TShape, ShortcutZodModelFields<TShape>>\n >\n static extend<TShape extends z.ZodRawShape>(\n event_type: string,\n shape?: TShape\n ): EventClass<\n EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<TShape>,\n EventInit<TShape>,\n EventSchema<TShape>,\n EventModelFields<TShape>,\n ResultTypeSchemaFromShape<TShape>,\n StaticEventDefaultValues<TShape>\n >\n static extend<const TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ):\n | EventClass<\n EventWithResultSchema<ResultSchemaFromShape<ZodShapeFrom<TShape>>> & EventPayload<ZodShapeFrom<TShape>>,\n EventInit<ZodShapeFrom<TShape>>,\n EventSchema<ZodShapeFrom<TShape>>,\n EventModelFields<ZodShapeFrom<TShape>>,\n ResultTypeSchemaFromShape<ZodShapeFrom<TShape>>,\n StaticEventDefaultValues<ZodShapeFrom<TShape>>\n >\n | EventClass<\n EventWithResultSchema<ResultSchemaFromEventSchema<AnyEventSchema>> & EventPayloadFromSchema<AnyEventSchema>,\n EventInitFromSchema<AnyEventSchema>,\n AnyEventSchema,\n EventModelFieldsFromSchema<AnyEventSchema>,\n ResultTypeSchemaFromEventSchema<AnyEventSchema>,\n StaticEventDefaultValuesFromSchema<AnyEventSchema>\n > {\n const built = buildFullEventSchema(event_type, shape ?? {})\n const full_schema = built.event_schema\n const event_parse_schema = built.event_parse_schema\n const static_field_defaults = built.static_field_defaults\n const event_result_type = built.event_result_type\n const event_version = built.event_version\n\n const EventClass = class extends BaseEvent {\n static override event_schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n static override model_fields = full_schema.shape as EventModelFields<ZodShapeFrom<TShape>>\n static override _event_parse_schema = event_parse_schema\n static override event_type = event_type\n static override event_version = event_version ?? BaseEvent.event_version\n static override event_result_type = event_result_type\n\n constructor(data?: EventInit<ZodShapeFrom<TShape>>) {\n super(data)\n }\n }\n\n Object.defineProperty(EventClass, 'name', { value: event_type, configurable: true })\n defineStaticEventFields(EventClass, static_field_defaults)\n\n let CallableEventClass: typeof EventClass\n CallableEventClass = new Proxy(EventClass, {\n apply(target, _this_arg, args) {\n return Reflect.construct(target, args, target)\n },\n construct(target, args, new_target) {\n return Reflect.construct(target, args, new_target === CallableEventClass ? target : new_target)\n },\n })\n\n Object.defineProperty(EventClass.prototype, 'constructor', {\n value: CallableEventClass,\n writable: true,\n configurable: true,\n })\n EVENT_TYPE_REGISTRY.set(event_type, CallableEventClass as unknown as typeof BaseEvent)\n\n return CallableEventClass as unknown as EventClass<\n EventWithResultSchema<ResultSchemaFromShape<ZodShapeFrom<TShape>>> & EventPayload<ZodShapeFrom<TShape>>,\n EventInit<ZodShapeFrom<TShape>>,\n EventSchema<ZodShapeFrom<TShape>>,\n EventModelFields<ZodShapeFrom<TShape>>,\n ResultTypeSchemaFromShape<ZodShapeFrom<TShape>>,\n StaticEventDefaultValues<ZodShapeFrom<TShape>>\n >\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const event_parse_schema = this._event_parse_schema ?? this.event_schema ?? BaseEventSchema\n const parsed = decodeEventSchema(event_parse_schema, data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (this === BaseEvent) {\n const event_type = record.event_type\n if (typeof event_type === 'string') {\n const KnownEvent = EVENT_TYPE_REGISTRY.get(event_type)\n if (KnownEvent) {\n return KnownEvent.fromJSON(record) as InstanceType<T>\n }\n }\n }\n const ctor = this as typeof BaseEvent\n if (this !== BaseEvent && ctor.event_result_type && record.event_result_type !== undefined) {\n delete 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_schema' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Object.fromEntries(\n Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])\n )\n\n const event_parse_schema = ((this.constructor as typeof BaseEvent)._event_parse_schema ??\n this._event_parse_schema ??\n (this.constructor as typeof BaseEvent).event_schema ??\n this.event_schema ??\n BaseEventSchema) as AnyEventSchema\n const encoded = encodeEventSchema(event_parse_schema, {\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,\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 ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n })\n delete encoded.event_schema\n\n return {\n ...encoded,\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 ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(\n event_slow_timeout: number | null = this.event_slow_timeout ?? null,\n bus_name?: string\n ): ReturnType<typeof setTimeout> | null {\n const event_warn_ms = event_slow_timeout === null || event_slow_timeout <= 0 ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = bus_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 BaseEvent._defaultResultInclude(entry.result, entry)\n }\n\n private static _defaultResultInclude<TEvent extends BaseEvent>(\n result: EventResult<TEvent>['result'],\n event_result: EventResult<TEvent>\n ): boolean {\n return (\n event_result.status === 'completed' &&\n result !== undefined &&\n result !== null &&\n !(result instanceof Error) &&\n !(result instanceof BaseEvent) &&\n event_result.error === undefined\n )\n }\n\n private static _includeEventResult<TEvent extends BaseEvent>(\n include: EventResultInclude<TEvent>,\n event_result: EventResult<TEvent>\n ): boolean {\n return include(event_result.result, event_result)\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(\n original,\n original.event_handler_concurrency ?? this.event_bus.event_handler_concurrency,\n async (handler_lock) => {\n await entry.runHandler(handler_lock)\n }\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(original.event_handler_concurrency ?? this.event_bus?.event_handler_concurrency ?? 'serial') !== 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 ?? '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 active waiters 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 event_handler_completion='first'.\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(\"event_handler_completion='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: event_handler_completion='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: event_handler_completion='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 private _withEventResultMethods(promise: Promise<this>): EventWaitPromise<this> {\n const chainable = promise as EventWaitPromise<this>\n chainable.eventResult = async (options?: EventResultOptions<this>) => {\n const event = await promise\n return event.eventResult(options)\n }\n chainable.eventResultsList = async (options?: EventResultOptions<this>) => {\n const event = await promise\n return event.eventResultsList(options)\n }\n return chainable\n }\n\n private _timeoutPromise<T>(timeout: number | null, message: () => string, fn: () => Promise<T>): Promise<T> {\n return timeout === null || timeout <= 0 ? fn() : _runWithTimeout(timeout, () => new Error(message()), fn)\n }\n\n private _orderedEventResults(): EventResult<this>[] {\n const original = this._event_original ?? this\n return (Array.from(original.event_results.values()) as EventResult<this>[]).sort((a, b) =>\n compareIsoDatetime(a.completed_at, b.completed_at)\n )\n }\n\n private _orderedEventResultsByRegistration(): EventResult<this>[] {\n const original = this._event_original ?? this\n return (Array.from(original.event_results.values()) as EventResult<this>[]).sort(\n (a, b) =>\n compareIsoDatetime(a.handler.handler_registered_at, b.handler.handler_registered_at) ||\n compareIsoDatetime(a.started_at, b.started_at) ||\n a.handler_id.localeCompare(b.handler_id)\n )\n }\n\n private _collectResultValues(\n options: EventResultOptions<this> = {},\n order: 'completion' | 'registration' = 'completion'\n ): Array<EventResultType<this> | undefined> {\n const include: EventResultInclude<this> = options.include ?? BaseEvent._defaultResultInclude\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? false\n const all_results = order === 'registration' ? this._orderedEventResultsByRegistration() : this._orderedEventResults()\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n const included_results = all_results.filter((event_result) => BaseEvent._includeEventResult(include, event_result))\n\n if (error_results.length > 0 && raise_if_any) {\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 if (errors.length === 1) {\n throw errors[0]\n }\n throw new AggregateError(errors, `Event ${this.event_type}#${this.event_id.slice(-4)} had ${errors.length} handler error(s)`)\n }\n\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: ${this.event_type}#${this.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n private _hasIncludedResult(options: EventResultOptions<this> = {}): boolean {\n const include: EventResultInclude<this> = options.include ?? BaseEvent._defaultResultInclude\n return this._orderedEventResults().some((event_result) => BaseEvent._includeEventResult(include, event_result))\n }\n\n private async _waitForFirstResultOrCompletion(options: EventWaitOptions & EventResultOptions<this> = {}): Promise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n throw new Error('timeout must be >= 0 or null')\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n throw new Error('event has no bus attached')\n }\n if (original.event_status === 'completed' || this._hasIncludedResult(options)) {\n return this\n }\n\n const waitForResult = async (): Promise<this> => {\n for (;;) {\n if (original.event_status === 'completed' || this._hasIncludedResult(options)) {\n return this\n }\n await new Promise((resolve) => setTimeout(resolve, 1))\n }\n }\n\n const timeout = options.timeout ?? null\n return this._timeoutPromise(timeout, () => `Timed out waiting for ${original.event_type} result after ${timeout}s`, waitForResult)\n }\n\n // Active awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued.\n now(options: EventWaitOptions = {}): EventWaitPromise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n return this._withEventResultMethods(Promise.reject(new Error('timeout must be >= 0 or null')))\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n return this._withEventResultMethods(Promise.reject(new Error('event has no bus attached')))\n }\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const resolved_timeout_seconds = options.timeout ?? null\n const processing =\n original.event_status === 'completed'\n ? Promise.resolve(this)\n : this._timeoutPromise(\n resolved_timeout_seconds,\n () => `Timed out waiting for ${original.event_type} completion after ${resolved_timeout_seconds}s`,\n () => this.event_bus!._processEventImmediately(this)\n )\n\n if (options.first_result) {\n void processing.catch(() => undefined)\n return this._withEventResultMethods(this._waitForFirstResultOrCompletion(options))\n }\n\n return this._withEventResultMethods(processing)\n }\n\n // Passive awaitable that waits for normal queue-order processing without forcing execution.\n wait(options: EventWaitOptions = {}): EventWaitPromise<this> {\n const original = this._event_original ?? this\n if (options.timeout !== undefined && options.timeout !== null && options.timeout < 0) {\n return this._withEventResultMethods(Promise.reject(new Error('timeout must be >= 0 or null')))\n }\n if (!this.event_bus && original.event_status !== 'completed') {\n return this._withEventResultMethods(Promise.reject(new Error('event has no bus attached')))\n }\n if (options.first_result) {\n return this._withEventResultMethods(this._waitForFirstResultOrCompletion(options))\n }\n if (original.event_status === 'completed') {\n return this._withEventResultMethods(Promise.resolve(this))\n }\n this._notifyDoneListeners()\n const timeout = options.timeout ?? null\n return this._withEventResultMethods(\n this._timeoutPromise(\n timeout,\n () => `Timed out waiting for ${original.event_type} completion after ${timeout}s`,\n () => this._event_completed_signal!.promise.then(() => this)\n )\n )\n }\n\n async eventResult(options: EventResultOptions<this> = {}): Promise<EventResultType<this> | undefined> {\n const original = this._event_original ?? this\n if (original.event_status === 'pending' && original.event_results.size === 0) {\n await this.now({ first_result: true })\n }\n return this._collectResultValues(options, 'registration').at(0)\n }\n\n async eventResultsList(options: EventResultOptions<this> = {}): Promise<Array<EventResultType<this> | undefined>> {\n const original = this._event_original ?? this\n if (original.event_status === 'pending' && original.event_results.size === 0) {\n await this.now({ first_result: false })\n }\n return this._collectResultValues(options, 'registration')\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 _firstProcessingError(): unknown | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\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 _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 (raw_event_results == null) {\n return event_results\n }\n if (typeof raw_event_results !== 'object' || Array.isArray(raw_event_results)) {\n throw new Error('BaseEvent.event_results must be an object keyed by handler id')\n }\n for (const [handler_id, item] of Object.entries(raw_event_results)) {\n if (item == null || typeof item !== 'object' || Array.isArray(item)) continue\n const result = EventResult.fromJSON(event, {\n handler_id,\n ...(item as Record<string, unknown>),\n })\n event_results.set(handler_id, result)\n }\n return event_results\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["full_schema"]
7
7
  }
@@ -217,7 +217,7 @@ class LockManager {
217
217
  };
218
218
  this.idle_waiters.push(finish);
219
219
  this.scheduleIdleCheck();
220
- if (timeout_seconds === null || timeout_seconds === void 0) {
220
+ if (timeout_seconds === null || timeout_seconds === void 0 || timeout_seconds <= 0) {
221
221
  return;
222
222
  }
223
223
  const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1e3;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/LockManager.ts"],
4
- "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = this._getRawActiveHandlerResultForCurrentAsyncContext()\n return result?.status === 'started' ? result : undefined\n }\n\n _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n return handler_context_storage?.getStore() as EventResult | undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = this._getRawActiveHandlerResultForCurrentAsyncContext()\n return result?.status === 'started' ? result : undefined\n }\n\n _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n return handler_context_storage?.getStore() as EventResult | undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined || timeout_seconds <= 0) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,7 @@ const wrap = (class_name, methods) => {
22
22
  Object.defineProperty(WrappedClient.prototype, method_name, {
23
23
  value: async function(init, extra) {
24
24
  const payload = { ...init ?? {}, ...extra ?? {} };
25
- return await this.bus.emit(new EventCtor(payload)).now({ first_result: true }).eventResult();
25
+ return await this.bus.emit(EventCtor(payload)).now({ first_result: true }).eventResult();
26
26
  },
27
27
  writable: true,
28
28
  configurable: true