abxbus 2.4.27 → 2.4.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,7 +27,7 @@ export declare const BaseEventSchema: z.ZodObject<{
27
27
  }>>;
28
28
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
29
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
30
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
31
31
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
32
32
  "global-serial": "global-serial";
33
33
  "bus-serial": "bus-serial";
@@ -133,7 +133,7 @@ export declare class BaseEvent {
133
133
  }>>;
134
134
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
135
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
136
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
136
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
137
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
138
138
  "global-serial": "global-serial";
139
139
  "bus-serial": "bus-serial";
@@ -78,7 +78,7 @@ const BaseEventSchema = import_zod.z.object({
78
78
  event_status: import_zod.z.enum(["pending", "started", "completed"]).optional(),
79
79
  event_started_at: import_zod.z.string().datetime().nullable().optional(),
80
80
  event_completed_at: import_zod.z.string().datetime().nullable().optional(),
81
- event_results: import_zod.z.array(import_zod.z.unknown()).optional(),
81
+ event_results: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
82
82
  event_concurrency: import_zod.z.enum(import_LockManager.EVENT_CONCURRENCY_MODES).nullable().optional(),
83
83
  event_handler_concurrency: import_zod.z.enum(import_LockManager.EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),
84
84
  event_handler_completion: import_zod.z.enum(import_LockManager.EVENT_HANDLER_COMPLETION_MODES).nullable().optional()
@@ -259,7 +259,9 @@ class BaseEvent {
259
259
  if (value === void 0 || typeof value === "function") continue;
260
260
  record[key] = value;
261
261
  }
262
- const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON());
262
+ const event_results = Object.fromEntries(
263
+ Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])
264
+ );
263
265
  return {
264
266
  ...record,
265
267
  event_id: this.event_id,
@@ -286,7 +288,7 @@ class BaseEvent {
286
288
  event_started_at: this.event_started_at ?? null,
287
289
  event_completed_at: this.event_completed_at ?? null,
288
290
  // mutable result state
289
- ...event_results.length > 0 ? { event_results } : {}
291
+ ...Object.keys(event_results).length > 0 ? { event_results } : {}
290
292
  };
291
293
  }
292
294
  _createSlowEventWarningTimer() {
@@ -918,13 +920,19 @@ class BaseEvent {
918
920
  }
919
921
  const hydrateEventResults = (event, raw_event_results) => {
920
922
  const event_results = /* @__PURE__ */ new Map();
921
- if (!Array.isArray(raw_event_results)) {
923
+ if (raw_event_results == null) {
922
924
  return event_results;
923
925
  }
924
- for (const item of raw_event_results) {
925
- const result = import_EventResult.EventResult.fromJSON(event, item);
926
- const map_key = typeof result.handler_id === "string" && result.handler_id.length > 0 ? result.handler_id : result.id;
927
- event_results.set(map_key, result);
926
+ if (typeof raw_event_results !== "object" || Array.isArray(raw_event_results)) {
927
+ throw new Error("BaseEvent.event_results must be an object keyed by handler id");
928
+ }
929
+ for (const [handler_id, item] of Object.entries(raw_event_results)) {
930
+ if (item == null || typeof item !== "object" || Array.isArray(item)) continue;
931
+ const result = import_EventResult.EventResult.fromJSON(event, {
932
+ handler_id,
933
+ ...item
934
+ });
935
+ event_results.set(handler_id, result);
928
936
  }
929
937
  return event_results;
930
938
  };
@@ -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 { extractZodShape, normalizeEventResultType, toJsonSchema } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set(['bus', 'emit', 'first', 'toString', 'toJSON', 'fromJSON'])\n\nfunction assertNoReservedUserEventFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of RESERVED_USER_EVENT_FIELDS) {\n if (Object.prototype.hasOwnProperty.call(data, field_name)) {\n throw new Error(`${context} field \"${field_name}\" is reserved for EventBus runtime context and cannot be set in event payload`)\n }\n }\n}\n\nfunction assertNoUnknownEventPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('event_') && !KNOWN_BASE_EVENT_FIELDS.has(field_name)) {\n throw new Error(`${context} field \"${field_name}\" starts with \"event_\" but is not a recognized BaseEvent field`)\n }\n }\n}\n\nfunction assertNoModelPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('model_')) {\n throw new Error(`${context} field \"${field_name}\" starts with \"model_\" and is reserved for model internals`)\n }\n }\n}\n\nfunction compareIsoDatetime(left: string | null | undefined, right: string | null | undefined): number {\n const left_value = left ?? ''\n const right_value = right ?? ''\n if (left_value === right_value) {\n return 0\n }\n return left_value < right_value ? -1 : 1\n}\n\nexport const BaseEventSchema = z\n .object({\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string(),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().positive().nullable(),\n event_slow_timeout: z.number().positive().nullable().optional(),\n event_handler_timeout: z.number().positive().nullable().optional(),\n event_handler_slow_timeout: z.number().positive().nullable().optional(),\n event_blocks_parent_completion: z.boolean().optional(),\n event_parent_id: z.string().uuid().nullable().optional(),\n event_path: z.array(z.string()).optional(),\n event_result_type: z.unknown().optional(),\n event_emitted_by_handler_id: z.string().uuid().nullable().optional(),\n event_pending_bus_count: z.number().nonnegative().optional(),\n event_status: z.enum(['pending', 'started', 'completed']).optional(),\n event_started_at: z.string().datetime().nullable().optional(),\n event_completed_at: z.string().datetime().nullable().optional(),\n event_results: z.array(z.unknown()).optional(),\n event_concurrency: z.enum(EVENT_CONCURRENCY_MODES).nullable().optional(),\n event_handler_concurrency: z.enum(EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),\n event_handler_completion: z.enum(EVENT_HANDLER_COMPLETION_MODES).nullable().optional(),\n })\n .loose()\n\nconst KNOWN_BASE_EVENT_FIELDS = new Set(Object.keys(BaseEventSchema.shape))\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFields = Pick<\n BaseEventData,\n | 'event_id'\n | 'event_created_at'\n | 'event_type'\n | 'event_version'\n | 'event_timeout'\n | 'event_slow_timeout'\n | 'event_handler_timeout'\n | 'event_handler_slow_timeout'\n | 'event_blocks_parent_completion'\n | 'event_parent_id'\n | 'event_path'\n | 'event_result_type'\n | 'event_emitted_by_handler_id'\n | 'event_pending_bus_count'\n | 'event_status'\n | 'event_started_at'\n | 'event_completed_at'\n | 'event_results'\n | 'event_concurrency'\n | 'event_handler_concurrency'\n | 'event_handler_completion'\n>\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\n\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>\n\ntype EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>\nexport type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends StringConstructor\n ? string\n : TInput extends NumberConstructor\n ? number\n : TInput extends BooleanConstructor\n ? boolean\n : TInput extends ArrayConstructor\n ? unknown[]\n : TInput extends ObjectConstructor\n ? Record<string, unknown>\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype EventResultsListInclude<TEvent extends BaseEvent> = (\n result: EventResultType<TEvent> | undefined,\n event_result: EventResult<TEvent>\n) => boolean\ntype EventResultsListOptions<TEvent extends BaseEvent> = {\n timeout?: number | null\n include?: EventResultsListInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\ntype EventDoneOptions = {\n raise_if_any?: boolean\n}\ntype EventResultUpdateOptions<TEvent extends BaseEvent> = {\n eventbus?: EventBus\n status?: 'pending' | 'started' | 'completed' | 'error'\n result?: EventResultType<TEvent> | BaseEvent | undefined\n error?: unknown\n}\n\nconst EVENT_CLASS_DEFAULTS = new WeakMap<Function, Record<string, unknown>>()\nconst ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {\n (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n schema: EventSchema<TShape>\n class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>\n}\n\ntype ZodShapeFrom<TShape extends Record<string, unknown>> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<\n TShape[K],\n z.ZodTypeAny\n >\n}\n\nexport class BaseEvent {\n // event metadata fields\n event_id!: string // unique uuidv7 identifier for the event\n event_created_at!: string\n event_type!: string // should match the class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n event_version!: string // event schema/version tag managed by callers for migration-friendly payload handling\n event_timeout!: number | null // maximum time in seconds that the event is allowed to run before it is aborted\n event_slow_timeout?: number | null // optional per-event slow warning threshold in seconds\n event_handler_timeout?: number | null // optional per-event handler timeout override in seconds\n event_handler_slow_timeout?: number | null // optional per-event slow handler warning threshold in seconds\n event_blocks_parent_completion!: boolean // true only for children explicitly awaited via done()/eventCompleted()\n event_parent_id!: string | null // id of the parent event that triggered this event, if this event was emitted during handling of another event, else null\n event_path!: string[] // list of bus labels (name#id) that the event has been dispatched to, including the current bus\n event_result_type?: z.ZodTypeAny // optional zod schema to enforce the shape of return values from handlers\n event_results!: Map<string, EventResult<this>> // map of handler ids to EventResult objects for the event\n event_emitted_by_handler_id!: string | null // if event was emitted inside a handler while it was running, this is set to the enclosing handler's handler id, else null\n event_pending_bus_count!: number // number of buses that have accepted this event and not yet finished processing or removed it from their queues (for queue-jump processing)\n event_status!: 'pending' | 'started' | 'completed' // processing status of the event as a whole, no separate 'error' state because events can not error, only individual handlers can\n event_started_at!: string | null\n event_completed_at!: string | null\n event_concurrency?: EventConcurrencyMode | null // concurrency mode for the event as a whole in relation to other events\n event_handler_concurrency?: EventHandlerConcurrencyMode | null // concurrency mode for the handlers within the event\n event_handler_completion?: EventHandlerCompletionMode | null // completion strategy: 'all' (default) waits for every handler, 'first' returns earliest non-undefined result and cancels the rest\n\n static event_type?: string // class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n static event_version = '0.0.1'\n static schema = BaseEventSchema // zod schema for the event data fields, used to parse and validate event data when creating a new event\n\n // internal runtime state\n event_bus?: EventBus // bus that dispatched this event, also used by event.emit(child)\n _event_original?: BaseEvent // underlying event object that was dispatched, if this is a bus-scoped proxy wrapping it\n _event_dispatch_context?: unknown | null // captured AsyncLocalStorage context at dispatch site, used to restore that context when running handlers\n\n _event_completed_signal: Deferred<this> | null\n _lock_for_event_handler: AsyncLock | null\n constructor(data: BaseEventInit<Record<string, unknown>> = {}) {\n assertNoReservedUserEventFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoUnknownEventPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoModelPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n const ctor = this.constructor as typeof BaseEvent & {\n event_version?: string\n event_result_type?: z.ZodTypeAny\n }\n const ctor_defaults = EVENT_CLASS_DEFAULTS.get(ctor) ?? {}\n const merged_data = {\n ...ctor_defaults,\n ...data,\n } as BaseEventInit<Record<string, unknown>>\n const event_type = merged_data.event_type ?? ctor.event_type ?? ctor.name\n const event_version = merged_data.event_version ?? ctor.event_version ?? '0.0.1'\n const raw_event_result_type = merged_data.event_result_type ?? ctor.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_id = merged_data.event_id ?? uuidv7()\n const event_created_at = monotonicDatetime(merged_data.event_created_at)\n const event_timeout = merged_data.event_timeout ?? null\n const event_blocks_parent_completion = merged_data.event_blocks_parent_completion ?? false\n\n const base_data = {\n ...merged_data,\n event_id,\n event_created_at,\n event_type,\n event_version,\n event_timeout,\n event_blocks_parent_completion,\n event_result_type,\n }\n\n const schema = ctor.schema ?? BaseEventSchema\n const parsed = schema.parse(base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n\n // load event results from potentially raw objects from JSON to proper EventResult objects\n this.event_results = hydrateEventResults(this, (parsed as { event_results?: unknown }).event_results)\n this.event_pending_bus_count =\n typeof (parsed as { event_pending_bus_count?: unknown }).event_pending_bus_count === 'number'\n ? Math.max(0, Number((parsed as { event_pending_bus_count?: number }).event_pending_bus_count))\n : 0\n const parsed_status = (parsed as { event_status?: unknown }).event_status\n this.event_status =\n parsed_status === 'pending' || parsed_status === 'started' || parsed_status === 'completed' ? parsed_status : 'pending'\n\n this.event_started_at =\n parsed.event_started_at === null || parsed.event_started_at === undefined ? null : monotonicDatetime(parsed.event_started_at)\n this.event_completed_at =\n parsed.event_completed_at === null || parsed.event_completed_at === undefined ? null : monotonicDatetime(parsed.event_completed_at)\n this.event_parent_id =\n typeof (parsed as { event_parent_id?: unknown }).event_parent_id === 'string'\n ? (parsed as { event_parent_id: string }).event_parent_id\n : null\n this.event_emitted_by_handler_id =\n typeof (parsed as { event_emitted_by_handler_id?: unknown }).event_emitted_by_handler_id === 'string'\n ? (parsed as { event_emitted_by_handler_id: string }).event_emitted_by_handler_id\n : null\n\n this.event_result_type = event_result_type\n\n this._event_completed_signal = null\n this._lock_for_event_handler = null\n this._event_dispatch_context = undefined\n }\n\n // \"MyEvent#a48f\"\n toString(): string {\n return `${this.event_type}#${this.event_id.slice(-4)}`\n }\n\n // main entry point for users to define their own event types\n // BaseEvent.extend(\"MyEvent\", { some_custom_field: z.string(), event_result_type: z.string(), event_timeout: 25, ... }) -> MyEvent\n static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape: TShape = {} as TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> {\n const raw_shape = shape as Record<string, unknown>\n assertNoReservedUserEventFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n const raw_event_result_type = raw_shape.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_version = typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined\n const event_defaults = Object.fromEntries(\n Object.entries(raw_shape).filter(\n ([key, value]) => key !== 'event_result_type' && key !== 'event_version' && !(value instanceof z.ZodType)\n )\n )\n\n const zod_shape = extractZodShape(raw_shape)\n const full_schema = BaseEventSchema.extend(zod_shape)\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static schema = full_schema as unknown as typeof BaseEvent.schema\n static event_type = event_type\n static event_version = event_version ?? BaseEvent.event_version\n static event_result_type = event_result_type\n\n constructor(data: EventInit<ZodShapeFrom<TShape>>) {\n super(data as BaseEventInit<Record<string, unknown>>)\n }\n }\n\n type FactoryResult = EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n\n function EventFactory(data: EventInit<ZodShapeFrom<TShape>>): FactoryResult {\n return new ExtendedEvent(data) as FactoryResult\n }\n\n EventFactory.schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n EventFactory.event_type = event_type\n EventFactory.event_version = event_version ?? BaseEvent.event_version\n EventFactory.event_result_type = event_result_type\n EventFactory.class = ExtendedEvent as unknown as new (\n data: EventInit<ZodShapeFrom<TShape>>\n ) => EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n EventFactory.fromJSON = (data: unknown) => (ExtendedEvent.fromJSON as (data: unknown) => FactoryResult)(data)\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_CLASS_DEFAULTS.set(ExtendedEvent, event_defaults)\n\n return EventFactory as unknown as EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const schema = this.schema ?? BaseEventSchema\n const parsed = schema.parse(data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (record.event_result_type !== undefined && record.event_result_type !== null) {\n record.event_result_type = normalizeEventResultType(record.event_result_type)\n }\n return new this(record as BaseEventInit<Record<string, unknown>>) as InstanceType<T>\n }\n\n static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[] {\n return Array.from(events, (event) => {\n const original = event._event_original ?? event\n return original.toJSON()\n })\n }\n\n static fromJSONArray(data: unknown): BaseEvent[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => BaseEvent.fromJSON(item))\n }\n\n toJSON(): BaseEventJSON {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this as unknown as Record<string, unknown>)) {\n if (key.startsWith('_') || key === 'bus' || key === 'event_bus' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON())\n\n return {\n ...record,\n event_id: this.event_id,\n event_type: this.event_type,\n event_version: this.event_version,\n event_result_type: this.event_result_type ? toJsonSchema(this.event_result_type) : this.event_result_type,\n\n // static configuration options\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\n event_concurrency: this.event_concurrency,\n event_handler_concurrency: this.event_handler_concurrency,\n event_handler_completion: this.event_handler_completion,\n event_handler_slow_timeout: this.event_handler_slow_timeout,\n event_handler_timeout: this.event_handler_timeout,\n event_blocks_parent_completion: this.event_blocks_parent_completion,\n\n // mutable parent/child/bus tracking runtime state\n event_parent_id: this.event_parent_id,\n event_path: this.event_path,\n event_emitted_by_handler_id: this.event_emitted_by_handler_id,\n event_pending_bus_count: this.event_pending_bus_count,\n\n // mutable runtime status and timestamps\n event_status: this.event_status,\n event_created_at: this.event_created_at,\n event_started_at: this.event_started_at ?? null,\n event_completed_at: this.event_completed_at ?? null,\n\n // mutable result state\n ...(event_results.length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null {\n const event_slow_timeout = this.event_slow_timeout ?? this.event_bus?.event_slow_timeout ?? null\n const event_warn_ms = event_slow_timeout === null ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = this.event_bus?.name ?? 'EventBus'\n return setTimeout(() => {\n if (this.event_status === 'completed') {\n return\n }\n const running_handler_count = [...this.event_results.values()].filter((result) => result.status === 'started').length\n const started_at = this.event_started_at ?? this.event_created_at\n const elapsed_ms = Math.max(0, Date.now() - Date.parse(started_at))\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(2)\n console.warn(\n `[abxbus] Slow event processing: ${name}.on(${this.event_type}#${this.event_id.slice(-4)}, ${running_handler_count} handlers) still running after ${elapsed_seconds}s`\n )\n }, event_warn_ms)\n }\n\n eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options: EventResultUpdateOptions<this> = {}): EventResult<this> {\n const original_event = (this._event_original ?? this) as this\n let resolved_eventbus = options.eventbus\n let handler_entry: EventHandler\n\n if (handler instanceof EventHandler) {\n handler_entry = handler\n if (!resolved_eventbus && handler_entry.eventbus_id !== ROOT_EVENTBUS_ID && original_event.event_bus) {\n resolved_eventbus =\n original_event.event_bus.all_instances.findBusById(handler_entry.eventbus_id) ??\n (original_event.event_bus.id === handler_entry.eventbus_id ? original_event.event_bus : undefined)\n }\n } else {\n handler_entry = EventHandler.fromCallable({\n handler,\n event_pattern: original_event.event_type,\n eventbus_name: resolved_eventbus?.name ?? 'EventBus',\n eventbus_id: resolved_eventbus?.id ?? ROOT_EVENTBUS_ID,\n })\n }\n\n const scoped_event = resolved_eventbus ? resolved_eventbus._getEventProxyScopedToThisBus(original_event) : original_event\n const handler_id = handler_entry.id\n const existing = original_event.event_results.get(handler_id)\n const event_result: EventResult<this> =\n existing ?? (new EventResult({ event: scoped_event as this, handler: handler_entry }) as EventResult<this>)\n if (!existing) {\n original_event.event_results.set(handler_id, event_result)\n } else {\n if (existing.event !== scoped_event) {\n existing.event = scoped_event as this\n }\n if (existing.handler.id !== handler_entry.id) {\n existing.handler = handler_entry\n }\n }\n\n if (options.status !== undefined || options.result !== undefined || options.error !== undefined) {\n const update_params: Parameters<EventResult<this>['update']>[0] = {}\n if (options.status !== undefined) update_params.status = options.status\n if (options.result !== undefined) update_params.result = options.result\n if (options.error !== undefined) update_params.error = options.error\n event_result.update(update_params)\n if (event_result.status === 'started' && event_result.started_at !== null) {\n original_event._markStarted(event_result.started_at, false)\n }\n if (options.status === 'pending' || options.status === 'started') {\n original_event.event_completed_at = null\n }\n }\n\n return event_result\n }\n\n _createPendingHandlerResults(bus: EventBus): Array<{\n handler: EventHandler\n result: EventResult\n }> {\n const original_event = this._event_original ?? this\n const scoped_event = bus._getEventProxyScopedToThisBus(original_event)\n const handlers = bus._getHandlersForEvent(original_event)\n return handlers.map((entry) => {\n const handler_id = entry.id\n const existing = original_event.event_results.get(handler_id)\n const result = existing ?? new EventResult({ event: scoped_event, handler: entry })\n if (!existing) {\n original_event.event_results.set(handler_id, result)\n } else if (existing.event !== scoped_event) {\n existing.event = scoped_event\n }\n return { handler: entry, result }\n })\n }\n\n private _collectPendingResults(\n original: BaseEvent,\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): EventResult[] {\n if (pending_entries) {\n return pending_entries.map((entry) => entry.result)\n }\n if (!this.event_bus?.id) {\n return Array.from(original.event_results.values())\n }\n return Array.from(original.event_results.values()).filter((result) => result.eventbus_id === this.event_bus!.id)\n }\n\n private _isFirstModeWinningResult(entry: EventResult): boolean {\n return entry.status === 'completed' && entry.result !== undefined && entry.result !== null && !(entry.result instanceof BaseEvent)\n }\n\n private _markFirstModeWinnerIfNeeded(original: BaseEvent, entry: EventResult, first_state: { found: boolean }): void {\n if (first_state.found || !this._isFirstModeWinningResult(entry)) {\n return\n }\n first_state.found = true\n original._markRemainingFirstModeResultCancelled(entry)\n }\n\n private async _runHandlerWithLock(original: BaseEvent, entry: EventResult): Promise<void> {\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n await this.event_bus.locks._runWithHandlerLock(original, this.event_bus.event_handler_concurrency, async (handler_lock) => {\n await entry.runHandler(handler_lock)\n })\n }\n\n // Run all pending handler results for the current bus context.\n async _runHandlers(\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): Promise<void> {\n const original = this._event_original ?? this\n const pending_results = this._collectPendingResults(original, pending_entries)\n if (pending_results.length === 0) {\n return\n }\n const resolved_completion = original.event_handler_completion ?? this.event_bus?.event_handler_completion ?? 'all'\n if (resolved_completion === 'first') {\n if (original._getHandlerLock(this.event_bus?.event_handler_concurrency) !== null) {\n for (const entry of pending_results) {\n await this._runHandlerWithLock(original, entry)\n if (!this._isFirstModeWinningResult(entry)) {\n continue\n }\n original._markRemainingFirstModeResultCancelled(entry)\n break\n }\n return\n }\n const first_state = { found: false }\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n const monitored = pending_results.map((entry, index) =>\n handler_promises[index].then(() => {\n this._markFirstModeWinnerIfNeeded(original, entry, first_state)\n })\n )\n await Promise.all(monitored)\n return\n } else {\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n await Promise.all(handler_promises)\n }\n }\n\n _getHandlerLock(default_concurrency?: EventHandlerConcurrencyMode): AsyncLock | null {\n const original = this._event_original ?? this\n const resolved = original.event_handler_concurrency ?? default_concurrency ?? original.event_bus?.event_handler_concurrency ?? 'serial'\n if (resolved === 'parallel') {\n return null\n }\n if (!original._lock_for_event_handler) {\n original._lock_for_event_handler = new AsyncLock(1)\n }\n return original._lock_for_event_handler\n }\n\n _setHandlerLock(lock: AsyncLock | null): void {\n const original = this._event_original ?? this\n original._lock_for_event_handler = lock\n }\n\n _getDispatchContext(): unknown | null | undefined {\n const original = this._event_original ?? this\n return original._event_dispatch_context\n }\n\n _setDispatchContext(dispatch_context: unknown | null | undefined): void {\n const original = this._event_original ?? this\n original._event_dispatch_context = dispatch_context\n }\n\n // Get parent event object from event_parent_id (checks across all buses)\n get event_parent(): BaseEvent | undefined {\n const original = this._event_original ?? this\n const parent_id = original.event_parent_id\n if (!parent_id) {\n return undefined\n }\n return original.event_bus?.findEventById(parent_id) ?? undefined\n }\n\n // get all direct children of this event\n get event_children(): BaseEvent[] {\n const children: BaseEvent[] = []\n const seen = new Set<string>()\n for (const result of this.event_results.values()) {\n for (const child of result.event_children) {\n if (!seen.has(child.event_id)) {\n seen.add(child.event_id)\n children.push(child)\n }\n }\n }\n return children\n }\n\n // get all children grandchildren etc. recursively\n get event_descendants(): BaseEvent[] {\n const descendants: BaseEvent[] = []\n const visited = new Set<string>()\n const root_id = this.event_id\n const stack = [...this.event_children]\n\n while (stack.length > 0) {\n const child = stack.pop()\n if (!child) {\n continue\n }\n const child_id = child.event_id\n if (child_id === root_id) {\n continue\n }\n if (visited.has(child_id)) {\n continue\n }\n visited.add(child_id)\n descendants.push(child)\n if (child.event_children.length > 0) {\n stack.push(...child.event_children)\n }\n }\n\n return descendants\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_parent = this._event_original ?? this\n const original_child = event._event_original ?? event\n if (!original_child.event_parent_id && original_child.event_id !== original_parent.event_id) {\n original_child.event_parent_id = original_parent.event_id\n }\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n return this.event_bus.emit(original_child as T)\n }\n\n // force-abort processing of all pending descendants of an event regardless of whether they have already started\n _cancelPendingChildProcessing(reason: unknown): void {\n const original = this._event_original ?? this\n const cancellation_cause =\n reason instanceof EventHandlerTimeoutError\n ? reason\n : reason instanceof EventHandlerCancelledError || reason instanceof EventHandlerAbortedError\n ? reason.cause instanceof Error\n ? reason.cause\n : reason\n : reason instanceof Error\n ? reason\n : new Error(String(reason))\n const visited = new Set<string>()\n const cancelChildEvent = (child: BaseEvent): void => {\n const original_child = child._event_original ?? child\n if (visited.has(original_child.event_id)) {\n return\n }\n visited.add(original_child.event_id)\n\n // Depth-first: cancel grandchildren before parent so\n // _areAllChildrenComplete() returns true when we get back up.\n for (const grandchild of original_child.event_children) {\n const original_grandchild = grandchild._event_original ?? grandchild\n if (!original_grandchild.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(grandchild)\n }\n\n original_child._markCancelled(cancellation_cause)\n\n // Force-complete the child event. In JS we can't stop running async\n // handlers, but _markCompleted() resolves the done() promise so callers\n // aren't blocked waiting for background work to finish. The background\n // handler's eventual _markCompleted/_markError is a no-op (terminal guard).\n if (original_child.event_status !== 'completed') {\n original_child._markCompleted()\n }\n }\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(child)\n }\n }\n\n // Cancel all handler results for an event except the winner, used by first() mode.\n // Cancels pending handlers immediately, aborts started handlers via _signalAbort(),\n // and cancels any child events emitted by the losing handlers.\n _markRemainingFirstModeResultCancelled(winner: EventResult): void {\n const cause = new Error('first() resolved: another handler returned a result first')\n const bus_id = winner.eventbus_id\n\n for (const result of this.event_results.values()) {\n if (result === winner) continue\n if (result.eventbus_id !== bus_id) continue\n\n if (result.status === 'pending') {\n result._markError(\n new EventHandlerCancelledError(`Cancelled: first() resolved`, {\n event_result: result,\n cause,\n })\n )\n } else if (result.status === 'started') {\n // Cancel child events emitted by this handler before aborting it\n for (const child of result.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n original_child._cancelPendingChildProcessing(cause)\n original_child._markCancelled(cause)\n }\n\n // Abort the handler itself\n result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted: first() resolved`, {\n event_result: result,\n cause,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n }\n }\n }\n\n // force-abort processing of this event regardless of whether it is pending or has already started\n _markCancelled(cause: Error): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n return\n }\n const path = Array.isArray(original.event_path) ? original.event_path : []\n const buses_to_cancel = new Set<string>(path)\n for (const bus of this.event_bus.all_instances) {\n if (!buses_to_cancel.has(bus.label)) {\n continue\n }\n\n const handler_entries = original._createPendingHandlerResults(bus)\n let updated = false\n for (const entry of handler_entries) {\n if (entry.result.status === 'pending') {\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(cancelled_error)\n updated = true\n } else if (entry.result.status === 'started') {\n entry.result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(aborted_error)\n entry.result._signalAbort(aborted_error)\n updated = true\n }\n }\n\n const removed = bus.removeEventFromPendingQueue(original)\n\n if (removed > 0 && !bus.isEventInFlightOrQueued(original.event_id)) {\n original.event_pending_bus_count = Math.max(0, original.event_pending_bus_count - 1)\n }\n\n if (updated || removed > 0) {\n original._markCompleted(false)\n }\n }\n\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n }\n\n _notifyEventParentsOfCompletion(): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n return\n }\n const visited = new Set<string>()\n let parent_id = original.event_parent_id\n while (parent_id && !visited.has(parent_id)) {\n visited.add(parent_id)\n const parent = this.event_bus.findEventById(parent_id)\n if (!parent) {\n break\n }\n parent._markCompleted(false, false)\n if (parent.event_status !== 'completed') {\n break\n }\n parent_id = parent.event_parent_id\n }\n }\n\n // awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued\n // use eventCompleted() to wait for normal queue-order completion without queue-jumping.\n done(options: EventDoneOptions = {}): Promise<this> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const raise_if_any = options.raise_if_any ?? true\n const completion_promise =\n this.event_status === 'completed' ? Promise.resolve(original as this) : this.event_bus._processEventImmediately(this)\n\n if (!raise_if_any) {\n return completion_promise\n }\n\n // Always delegate to _processEventImmediately \u2014 it walks up the parent event tree\n // to determine whether we're inside a handler (works cross-bus). If no\n // ancestor handler is in-flight, it falls back to eventCompleted().\n return completion_promise.then((completed_event) => {\n const first_error = completed_event._firstProcessingError()\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n return completed_event\n })\n }\n\n // returns the first non-undefined handler result value, cancelling remaining handlers\n // when any handler completes. Works with all event_handler_concurrency modes:\n // parallel: races all handlers, returns first non-undefined, aborts the rest\n // serial: runs handlers sequentially, returns first non-undefined, skips remaining\n first(): Promise<EventResultType<this> | undefined> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original.event_handler_completion = 'first'\n return this.done({ raise_if_any: false }).then((completed_event) => {\n const first_error = completed_event._firstProcessingError({ ignore_first_mode_control_errors: true })\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n const orig = completed_event._event_original ?? completed_event\n return Array.from(orig.event_results.values())\n .filter(\n (result) =>\n result.status === 'completed' && result.result !== undefined && result.result !== null && !(result.result instanceof BaseEvent)\n )\n .sort((a, b) => compareIsoDatetime(a.completed_at, b.completed_at))\n .map((result) => result.result as EventResultType<this>)\n .at(0)\n })\n }\n\n // returns handler result values in event_results insertion order.\n // equivalent to await event.done(); Array.from(event.event_results.values()).map((entry) => entry.result)\n eventResultsList(\n include: EventResultsListInclude<this>,\n options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>>\n eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>\n async eventResultsList(\n include_or_options?: EventResultsListInclude<this> | EventResultsListOptions<this>,\n maybe_options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>> {\n const default_include: EventResultsListInclude<this> = (_result, event_result) =>\n event_result.status === 'completed' &&\n event_result.result !== undefined &&\n event_result.result !== null &&\n !(event_result.result instanceof Error) &&\n !(event_result.result instanceof BaseEvent) &&\n event_result.error === undefined\n\n let options: EventResultsListOptions<this>\n let include: EventResultsListInclude<this>\n if (typeof include_or_options === 'function') {\n options = maybe_options ?? {}\n include = include_or_options\n } else {\n options = include_or_options ?? {}\n include = options.include ?? default_include\n }\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? true\n\n const original = this._event_original ?? this\n const resolved_timeout_seconds = options.timeout ?? original.event_timeout ?? this.event_bus?.event_timeout ?? null\n let completed_event: this\n\n if (resolved_timeout_seconds === null) {\n completed_event = await this.done({ raise_if_any: false })\n } else {\n completed_event = await _runWithTimeout(\n resolved_timeout_seconds,\n () => new Error(`Timed out waiting for ${original.event_type} results after ${resolved_timeout_seconds}s`),\n () => this.done({ raise_if_any: false })\n )\n }\n\n const all_results: EventResult<this>[] = Array.from(completed_event.event_results.values())\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n\n if (raise_if_any && error_results.length > 0) {\n if (error_results.length === 1) {\n const first_error = error_results[0]\n if (first_error.error instanceof Error) {\n throw first_error.error\n }\n if (first_error.result instanceof Error) {\n throw first_error.result\n }\n throw new Error(String(first_error.error ?? first_error.result))\n }\n\n const errors = error_results.map((event_result) => {\n if (event_result.error instanceof Error) {\n return event_result.error\n }\n if (event_result.result instanceof Error) {\n return event_result.result\n }\n return new Error(String(event_result.error ?? event_result.result))\n })\n throw new AggregateError(\n errors,\n `Event ${completed_event.event_type}#${completed_event.event_id.slice(-4)} had ${errors.length} handler error(s)`\n )\n }\n\n const included_results = all_results.filter((event_result) => include(event_result.result, event_result))\n if (raise_if_none && included_results.length === 0) {\n throw new Error(\n `Expected at least one handler to return a non-null result, but none did: ${completed_event.event_type}#${completed_event.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n // awaitable that waits for the event to be processed in normal queue order by the _runloop\n eventCompleted(): Promise<this> {\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n if (this.event_status === 'completed') {\n return Promise.resolve(this)\n }\n this._notifyDoneListeners()\n return this._event_completed_signal!.promise\n }\n\n _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void {\n const original = this._event_original ?? this\n if (original.event_blocks_parent_completion || !original.event_bus) {\n return\n }\n const active_result = original.event_bus.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!active_result || active_result.status !== 'started') {\n return\n }\n const active_parent = active_result.event._event_original ?? active_result.event\n const is_child_of_active_handler =\n original.event_parent_id === active_parent.event_id &&\n original.event_emitted_by_handler_id === active_result.handler_id &&\n active_result.event_children.some((child) => (child._event_original ?? child).event_id === original.event_id)\n if (is_child_of_active_handler) {\n original.event_blocks_parent_completion = true\n }\n }\n\n _markPending(): this {\n const original = this._event_original ?? this\n original.event_status = 'pending'\n original.event_started_at = null\n original.event_completed_at = null\n original.event_results.clear()\n original.event_pending_bus_count = 0\n original._setDispatchContext(undefined)\n original._event_completed_signal = null\n original._lock_for_event_handler = null\n original.event_bus = undefined\n return this\n }\n\n eventReset(): this {\n const original = this._event_original ?? this\n const ctor = original.constructor as typeof BaseEvent\n const fresh_event = ctor.fromJSON(original.toJSON()) as this\n fresh_event.event_id = uuidv7()\n return fresh_event._markPending()\n }\n\n _markStarted(started_at: string | null = null, notify_hook: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status !== 'pending') {\n return\n }\n original.event_status = 'started'\n original.event_started_at = started_at === null ? monotonicDatetime() : monotonicDatetime(started_at)\n if (notify_hook && original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'started')\n }\n }\n\n _markCompleted(force: boolean = true, notify_parents: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status === 'completed') {\n return\n }\n if (!force) {\n if (original.event_pending_bus_count > 0) {\n return\n }\n if (!original._areAllChildrenComplete()) {\n return\n }\n }\n original.event_status = 'completed'\n original.event_completed_at = monotonicDatetime()\n if (original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'completed')\n }\n original._setDispatchContext(null)\n original._notifyDoneListeners()\n original._event_completed_signal!.resolve(original)\n original._event_completed_signal = null\n original.dropFromZeroHistoryBuses()\n if (notify_parents && original.event_bus) {\n original._notifyEventParentsOfCompletion()\n }\n }\n\n private dropFromZeroHistoryBuses(): void {\n if (!this.event_bus) {\n return\n }\n const original = this._event_original ?? this\n for (const bus of this.event_bus.all_instances) {\n if (bus.event_history.max_history_size !== 0) {\n continue\n }\n bus.removeEventFromHistory(original.event_id)\n }\n }\n\n get event_errors(): unknown[] {\n return (\n Array.from(this.event_results.values())\n // filter for events that have completed + have non-undefined error values\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n // sort by completion time\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n // assemble array of flat error values\n .map((event_result) => event_result.error)\n )\n }\n\n private _isFirstModeControlError(error: unknown): boolean {\n if (!(error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError)) {\n return false\n }\n if (error.message.includes('first() resolved')) {\n return true\n }\n return error.cause instanceof Error && error.cause.message.includes('first() resolved')\n }\n\n _firstProcessingError(options: { ignore_first_mode_control_errors?: boolean } = {}): unknown | undefined {\n const ignore_first_mode_control_errors = options.ignore_first_mode_control_errors ?? false\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n .filter((event_result) => (ignore_first_mode_control_errors ? !this._isFirstModeControlError(event_result.error) : true))\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.error)\n .at(0)\n }\n\n // Returns the first non-undefined completed handler result, sorted by completion time.\n // Useful after first() or done() to get the winning result value.\n get event_result(): EventResultType<this> | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.completed_at !== null && event_result.result !== undefined)\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.result as EventResultType<this>)\n .at(0)\n }\n\n _areAllChildrenComplete(visited: Set<string> = new Set()): boolean {\n const original = this._event_original ?? this\n if (visited.has(original.event_id)) {\n return true\n }\n visited.add(original.event_id)\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n if (original_child.event_status !== 'completed') {\n return false\n }\n if (!original_child._areAllChildrenComplete(visited)) {\n return false\n }\n }\n return true\n }\n\n private _notifyDoneListeners(): void {\n if (this._event_completed_signal) {\n return\n }\n this._event_completed_signal = withResolvers<this>()\n }\n\n // Break internal reference chains so a completed event can be GC'd when\n // Evicted from event_history. Called by EventHistory.trimEventHistory().\n _gc(): void {\n this._event_completed_signal = null\n this._setDispatchContext(null)\n this.event_bus = undefined\n this._lock_for_event_handler = null\n for (const result of this.event_results.values()) {\n result.event_children = []\n }\n this.event_results.clear()\n }\n}\n\nconst hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {\n const event_results = new Map<string, EventResult<TEvent>>()\n if (!Array.isArray(raw_event_results)) {\n return event_results\n }\n for (const item of raw_event_results) {\n const result = EventResult.fromJSON(event, item)\n const map_key = typeof result.handler_id === 'string' && result.handler_id.length > 0 ? result.handler_id : result.id\n event_results.set(map_key, result)\n }\n return event_results\n}\n"],
5
- "mappings": "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",
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 { extractZodShape, normalizeEventResultType, toJsonSchema } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set(['bus', 'emit', 'first', 'toString', 'toJSON', 'fromJSON'])\n\nfunction assertNoReservedUserEventFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of RESERVED_USER_EVENT_FIELDS) {\n if (Object.prototype.hasOwnProperty.call(data, field_name)) {\n throw new Error(`${context} field \"${field_name}\" is reserved for EventBus runtime context and cannot be set in event payload`)\n }\n }\n}\n\nfunction assertNoUnknownEventPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('event_') && !KNOWN_BASE_EVENT_FIELDS.has(field_name)) {\n throw new Error(`${context} field \"${field_name}\" starts with \"event_\" but is not a recognized BaseEvent field`)\n }\n }\n}\n\nfunction assertNoModelPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('model_')) {\n throw new Error(`${context} field \"${field_name}\" starts with \"model_\" and is reserved for model internals`)\n }\n }\n}\n\nfunction compareIsoDatetime(left: string | null | undefined, right: string | null | undefined): number {\n const left_value = left ?? ''\n const right_value = right ?? ''\n if (left_value === right_value) {\n return 0\n }\n return left_value < right_value ? -1 : 1\n}\n\nexport const BaseEventSchema = z\n .object({\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string(),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().positive().nullable(),\n event_slow_timeout: z.number().positive().nullable().optional(),\n event_handler_timeout: z.number().positive().nullable().optional(),\n event_handler_slow_timeout: z.number().positive().nullable().optional(),\n event_blocks_parent_completion: z.boolean().optional(),\n event_parent_id: z.string().uuid().nullable().optional(),\n event_path: z.array(z.string()).optional(),\n event_result_type: z.unknown().optional(),\n event_emitted_by_handler_id: z.string().uuid().nullable().optional(),\n event_pending_bus_count: z.number().nonnegative().optional(),\n event_status: z.enum(['pending', 'started', 'completed']).optional(),\n event_started_at: z.string().datetime().nullable().optional(),\n event_completed_at: z.string().datetime().nullable().optional(),\n event_results: z.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))\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFields = Pick<\n BaseEventData,\n | 'event_id'\n | 'event_created_at'\n | 'event_type'\n | 'event_version'\n | 'event_timeout'\n | 'event_slow_timeout'\n | 'event_handler_timeout'\n | 'event_handler_slow_timeout'\n | 'event_blocks_parent_completion'\n | 'event_parent_id'\n | 'event_path'\n | 'event_result_type'\n | 'event_emitted_by_handler_id'\n | 'event_pending_bus_count'\n | 'event_status'\n | 'event_started_at'\n | 'event_completed_at'\n | 'event_results'\n | 'event_concurrency'\n | 'event_handler_concurrency'\n | 'event_handler_completion'\n>\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\n\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>\n\ntype EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>\nexport type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends StringConstructor\n ? string\n : TInput extends NumberConstructor\n ? number\n : TInput extends BooleanConstructor\n ? boolean\n : TInput extends ArrayConstructor\n ? unknown[]\n : TInput extends ObjectConstructor\n ? Record<string, unknown>\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype EventResultsListInclude<TEvent extends BaseEvent> = (\n result: EventResultType<TEvent> | undefined,\n event_result: EventResult<TEvent>\n) => boolean\ntype EventResultsListOptions<TEvent extends BaseEvent> = {\n timeout?: number | null\n include?: EventResultsListInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\ntype EventDoneOptions = {\n raise_if_any?: boolean\n}\ntype EventResultUpdateOptions<TEvent extends BaseEvent> = {\n eventbus?: EventBus\n status?: 'pending' | 'started' | 'completed' | 'error'\n result?: EventResultType<TEvent> | BaseEvent | undefined\n error?: unknown\n}\n\nconst EVENT_CLASS_DEFAULTS = new WeakMap<Function, Record<string, unknown>>()\nconst ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {\n (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n schema: EventSchema<TShape>\n class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>\n}\n\ntype ZodShapeFrom<TShape extends Record<string, unknown>> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<\n TShape[K],\n z.ZodTypeAny\n >\n}\n\nexport class BaseEvent {\n // event metadata fields\n event_id!: string // unique uuidv7 identifier for the event\n event_created_at!: string\n event_type!: string // should match the class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n event_version!: string // event schema/version tag managed by callers for migration-friendly payload handling\n event_timeout!: number | null // maximum time in seconds that the event is allowed to run before it is aborted\n event_slow_timeout?: number | null // optional per-event slow warning threshold in seconds\n event_handler_timeout?: number | null // optional per-event handler timeout override in seconds\n event_handler_slow_timeout?: number | null // optional per-event slow handler warning threshold in seconds\n event_blocks_parent_completion!: boolean // true only for children explicitly awaited via done()/eventCompleted()\n event_parent_id!: string | null // id of the parent event that triggered this event, if this event was emitted during handling of another event, else null\n event_path!: string[] // list of bus labels (name#id) that the event has been dispatched to, including the current bus\n event_result_type?: z.ZodTypeAny // optional zod schema to enforce the shape of return values from handlers\n event_results!: Map<string, EventResult<this>> // map of handler ids to EventResult objects for the event\n event_emitted_by_handler_id!: string | null // if event was emitted inside a handler while it was running, this is set to the enclosing handler's handler id, else null\n event_pending_bus_count!: number // number of buses that have accepted this event and not yet finished processing or removed it from their queues (for queue-jump processing)\n event_status!: 'pending' | 'started' | 'completed' // processing status of the event as a whole, no separate 'error' state because events can not error, only individual handlers can\n event_started_at!: string | null\n event_completed_at!: string | null\n event_concurrency?: EventConcurrencyMode | null // concurrency mode for the event as a whole in relation to other events\n event_handler_concurrency?: EventHandlerConcurrencyMode | null // concurrency mode for the handlers within the event\n event_handler_completion?: EventHandlerCompletionMode | null // completion strategy: 'all' (default) waits for every handler, 'first' returns earliest non-undefined result and cancels the rest\n\n static event_type?: string // class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n static event_version = '0.0.1'\n static schema = BaseEventSchema // zod schema for the event data fields, used to parse and validate event data when creating a new event\n\n // internal runtime state\n event_bus?: EventBus // bus that dispatched this event, also used by event.emit(child)\n _event_original?: BaseEvent // underlying event object that was dispatched, if this is a bus-scoped proxy wrapping it\n _event_dispatch_context?: unknown | null // captured AsyncLocalStorage context at dispatch site, used to restore that context when running handlers\n\n _event_completed_signal: Deferred<this> | null\n _lock_for_event_handler: AsyncLock | null\n constructor(data: BaseEventInit<Record<string, unknown>> = {}) {\n assertNoReservedUserEventFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoUnknownEventPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoModelPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n const ctor = this.constructor as typeof BaseEvent & {\n event_version?: string\n event_result_type?: z.ZodTypeAny\n }\n const ctor_defaults = EVENT_CLASS_DEFAULTS.get(ctor) ?? {}\n const merged_data = {\n ...ctor_defaults,\n ...data,\n } as BaseEventInit<Record<string, unknown>>\n const event_type = merged_data.event_type ?? ctor.event_type ?? ctor.name\n const event_version = merged_data.event_version ?? ctor.event_version ?? '0.0.1'\n const raw_event_result_type = merged_data.event_result_type ?? ctor.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_id = merged_data.event_id ?? uuidv7()\n const event_created_at = monotonicDatetime(merged_data.event_created_at)\n const event_timeout = merged_data.event_timeout ?? null\n const event_blocks_parent_completion = merged_data.event_blocks_parent_completion ?? false\n\n const base_data = {\n ...merged_data,\n event_id,\n event_created_at,\n event_type,\n event_version,\n event_timeout,\n event_blocks_parent_completion,\n event_result_type,\n }\n\n const schema = ctor.schema ?? BaseEventSchema\n const parsed = schema.parse(base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n\n // load event results from potentially raw objects from JSON to proper EventResult objects\n this.event_results = hydrateEventResults(this, (parsed as { event_results?: unknown }).event_results)\n this.event_pending_bus_count =\n typeof (parsed as { event_pending_bus_count?: unknown }).event_pending_bus_count === 'number'\n ? Math.max(0, Number((parsed as { event_pending_bus_count?: number }).event_pending_bus_count))\n : 0\n const parsed_status = (parsed as { event_status?: unknown }).event_status\n this.event_status =\n parsed_status === 'pending' || parsed_status === 'started' || parsed_status === 'completed' ? parsed_status : 'pending'\n\n this.event_started_at =\n parsed.event_started_at === null || parsed.event_started_at === undefined ? null : monotonicDatetime(parsed.event_started_at)\n this.event_completed_at =\n parsed.event_completed_at === null || parsed.event_completed_at === undefined ? null : monotonicDatetime(parsed.event_completed_at)\n this.event_parent_id =\n typeof (parsed as { event_parent_id?: unknown }).event_parent_id === 'string'\n ? (parsed as { event_parent_id: string }).event_parent_id\n : null\n this.event_emitted_by_handler_id =\n typeof (parsed as { event_emitted_by_handler_id?: unknown }).event_emitted_by_handler_id === 'string'\n ? (parsed as { event_emitted_by_handler_id: string }).event_emitted_by_handler_id\n : null\n\n this.event_result_type = event_result_type\n\n this._event_completed_signal = null\n this._lock_for_event_handler = null\n this._event_dispatch_context = undefined\n }\n\n // \"MyEvent#a48f\"\n toString(): string {\n return `${this.event_type}#${this.event_id.slice(-4)}`\n }\n\n // main entry point for users to define their own event types\n // BaseEvent.extend(\"MyEvent\", { some_custom_field: z.string(), event_result_type: z.string(), event_timeout: 25, ... }) -> MyEvent\n static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape: TShape = {} as TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> {\n const raw_shape = shape as Record<string, unknown>\n assertNoReservedUserEventFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n const raw_event_result_type = raw_shape.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_version = typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined\n const event_defaults = Object.fromEntries(\n Object.entries(raw_shape).filter(\n ([key, value]) => key !== 'event_result_type' && key !== 'event_version' && !(value instanceof z.ZodType)\n )\n )\n\n const zod_shape = extractZodShape(raw_shape)\n const full_schema = BaseEventSchema.extend(zod_shape)\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static schema = full_schema as unknown as typeof BaseEvent.schema\n static event_type = event_type\n static event_version = event_version ?? BaseEvent.event_version\n static event_result_type = event_result_type\n\n constructor(data: EventInit<ZodShapeFrom<TShape>>) {\n super(data as BaseEventInit<Record<string, unknown>>)\n }\n }\n\n type FactoryResult = EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n\n function EventFactory(data: EventInit<ZodShapeFrom<TShape>>): FactoryResult {\n return new ExtendedEvent(data) as FactoryResult\n }\n\n EventFactory.schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n EventFactory.event_type = event_type\n EventFactory.event_version = event_version ?? BaseEvent.event_version\n EventFactory.event_result_type = event_result_type\n EventFactory.class = ExtendedEvent as unknown as new (\n data: EventInit<ZodShapeFrom<TShape>>\n ) => EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n EventFactory.fromJSON = (data: unknown) => (ExtendedEvent.fromJSON as (data: unknown) => FactoryResult)(data)\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_CLASS_DEFAULTS.set(ExtendedEvent, event_defaults)\n\n return EventFactory as unknown as EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const schema = this.schema ?? BaseEventSchema\n const parsed = schema.parse(data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (record.event_result_type !== undefined && record.event_result_type !== null) {\n record.event_result_type = normalizeEventResultType(record.event_result_type)\n }\n return new this(record as BaseEventInit<Record<string, unknown>>) as InstanceType<T>\n }\n\n static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[] {\n return Array.from(events, (event) => {\n const original = event._event_original ?? event\n return original.toJSON()\n })\n }\n\n static fromJSONArray(data: unknown): BaseEvent[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => BaseEvent.fromJSON(item))\n }\n\n toJSON(): BaseEventJSON {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this as unknown as Record<string, unknown>)) {\n if (key.startsWith('_') || key === 'bus' || key === 'event_bus' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Object.fromEntries(\n Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])\n )\n\n return {\n ...record,\n event_id: this.event_id,\n event_type: this.event_type,\n event_version: this.event_version,\n event_result_type: this.event_result_type ? toJsonSchema(this.event_result_type) : this.event_result_type,\n\n // static configuration options\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\n event_concurrency: this.event_concurrency,\n event_handler_concurrency: this.event_handler_concurrency,\n event_handler_completion: this.event_handler_completion,\n event_handler_slow_timeout: this.event_handler_slow_timeout,\n event_handler_timeout: this.event_handler_timeout,\n event_blocks_parent_completion: this.event_blocks_parent_completion,\n\n // mutable parent/child/bus tracking runtime state\n event_parent_id: this.event_parent_id,\n event_path: this.event_path,\n event_emitted_by_handler_id: this.event_emitted_by_handler_id,\n event_pending_bus_count: this.event_pending_bus_count,\n\n // mutable runtime status and timestamps\n event_status: this.event_status,\n event_created_at: this.event_created_at,\n event_started_at: this.event_started_at ?? null,\n event_completed_at: this.event_completed_at ?? null,\n\n // mutable result state\n ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null {\n const event_slow_timeout = this.event_slow_timeout ?? this.event_bus?.event_slow_timeout ?? null\n const event_warn_ms = event_slow_timeout === null ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = this.event_bus?.name ?? 'EventBus'\n return setTimeout(() => {\n if (this.event_status === 'completed') {\n return\n }\n const running_handler_count = [...this.event_results.values()].filter((result) => result.status === 'started').length\n const started_at = this.event_started_at ?? this.event_created_at\n const elapsed_ms = Math.max(0, Date.now() - Date.parse(started_at))\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(2)\n console.warn(\n `[abxbus] Slow event processing: ${name}.on(${this.event_type}#${this.event_id.slice(-4)}, ${running_handler_count} handlers) still running after ${elapsed_seconds}s`\n )\n }, event_warn_ms)\n }\n\n eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options: EventResultUpdateOptions<this> = {}): EventResult<this> {\n const original_event = (this._event_original ?? this) as this\n let resolved_eventbus = options.eventbus\n let handler_entry: EventHandler\n\n if (handler instanceof EventHandler) {\n handler_entry = handler\n if (!resolved_eventbus && handler_entry.eventbus_id !== ROOT_EVENTBUS_ID && original_event.event_bus) {\n resolved_eventbus =\n original_event.event_bus.all_instances.findBusById(handler_entry.eventbus_id) ??\n (original_event.event_bus.id === handler_entry.eventbus_id ? original_event.event_bus : undefined)\n }\n } else {\n handler_entry = EventHandler.fromCallable({\n handler,\n event_pattern: original_event.event_type,\n eventbus_name: resolved_eventbus?.name ?? 'EventBus',\n eventbus_id: resolved_eventbus?.id ?? ROOT_EVENTBUS_ID,\n })\n }\n\n const scoped_event = resolved_eventbus ? resolved_eventbus._getEventProxyScopedToThisBus(original_event) : original_event\n const handler_id = handler_entry.id\n const existing = original_event.event_results.get(handler_id)\n const event_result: EventResult<this> =\n existing ?? (new EventResult({ event: scoped_event as this, handler: handler_entry }) as EventResult<this>)\n if (!existing) {\n original_event.event_results.set(handler_id, event_result)\n } else {\n if (existing.event !== scoped_event) {\n existing.event = scoped_event as this\n }\n if (existing.handler.id !== handler_entry.id) {\n existing.handler = handler_entry\n }\n }\n\n if (options.status !== undefined || options.result !== undefined || options.error !== undefined) {\n const update_params: Parameters<EventResult<this>['update']>[0] = {}\n if (options.status !== undefined) update_params.status = options.status\n if (options.result !== undefined) update_params.result = options.result\n if (options.error !== undefined) update_params.error = options.error\n event_result.update(update_params)\n if (event_result.status === 'started' && event_result.started_at !== null) {\n original_event._markStarted(event_result.started_at, false)\n }\n if (options.status === 'pending' || options.status === 'started') {\n original_event.event_completed_at = null\n }\n }\n\n return event_result\n }\n\n _createPendingHandlerResults(bus: EventBus): Array<{\n handler: EventHandler\n result: EventResult\n }> {\n const original_event = this._event_original ?? this\n const scoped_event = bus._getEventProxyScopedToThisBus(original_event)\n const handlers = bus._getHandlersForEvent(original_event)\n return handlers.map((entry) => {\n const handler_id = entry.id\n const existing = original_event.event_results.get(handler_id)\n const result = existing ?? new EventResult({ event: scoped_event, handler: entry })\n if (!existing) {\n original_event.event_results.set(handler_id, result)\n } else if (existing.event !== scoped_event) {\n existing.event = scoped_event\n }\n return { handler: entry, result }\n })\n }\n\n private _collectPendingResults(\n original: BaseEvent,\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): EventResult[] {\n if (pending_entries) {\n return pending_entries.map((entry) => entry.result)\n }\n if (!this.event_bus?.id) {\n return Array.from(original.event_results.values())\n }\n return Array.from(original.event_results.values()).filter((result) => result.eventbus_id === this.event_bus!.id)\n }\n\n private _isFirstModeWinningResult(entry: EventResult): boolean {\n return entry.status === 'completed' && entry.result !== undefined && entry.result !== null && !(entry.result instanceof BaseEvent)\n }\n\n private _markFirstModeWinnerIfNeeded(original: BaseEvent, entry: EventResult, first_state: { found: boolean }): void {\n if (first_state.found || !this._isFirstModeWinningResult(entry)) {\n return\n }\n first_state.found = true\n original._markRemainingFirstModeResultCancelled(entry)\n }\n\n private async _runHandlerWithLock(original: BaseEvent, entry: EventResult): Promise<void> {\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n await this.event_bus.locks._runWithHandlerLock(original, this.event_bus.event_handler_concurrency, async (handler_lock) => {\n await entry.runHandler(handler_lock)\n })\n }\n\n // Run all pending handler results for the current bus context.\n async _runHandlers(\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): Promise<void> {\n const original = this._event_original ?? this\n const pending_results = this._collectPendingResults(original, pending_entries)\n if (pending_results.length === 0) {\n return\n }\n const resolved_completion = original.event_handler_completion ?? this.event_bus?.event_handler_completion ?? 'all'\n if (resolved_completion === 'first') {\n if (original._getHandlerLock(this.event_bus?.event_handler_concurrency) !== null) {\n for (const entry of pending_results) {\n await this._runHandlerWithLock(original, entry)\n if (!this._isFirstModeWinningResult(entry)) {\n continue\n }\n original._markRemainingFirstModeResultCancelled(entry)\n break\n }\n return\n }\n const first_state = { found: false }\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n const monitored = pending_results.map((entry, index) =>\n handler_promises[index].then(() => {\n this._markFirstModeWinnerIfNeeded(original, entry, first_state)\n })\n )\n await Promise.all(monitored)\n return\n } else {\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n await Promise.all(handler_promises)\n }\n }\n\n _getHandlerLock(default_concurrency?: EventHandlerConcurrencyMode): AsyncLock | null {\n const original = this._event_original ?? this\n const resolved = original.event_handler_concurrency ?? default_concurrency ?? original.event_bus?.event_handler_concurrency ?? 'serial'\n if (resolved === 'parallel') {\n return null\n }\n if (!original._lock_for_event_handler) {\n original._lock_for_event_handler = new AsyncLock(1)\n }\n return original._lock_for_event_handler\n }\n\n _setHandlerLock(lock: AsyncLock | null): void {\n const original = this._event_original ?? this\n original._lock_for_event_handler = lock\n }\n\n _getDispatchContext(): unknown | null | undefined {\n const original = this._event_original ?? this\n return original._event_dispatch_context\n }\n\n _setDispatchContext(dispatch_context: unknown | null | undefined): void {\n const original = this._event_original ?? this\n original._event_dispatch_context = dispatch_context\n }\n\n // Get parent event object from event_parent_id (checks across all buses)\n get event_parent(): BaseEvent | undefined {\n const original = this._event_original ?? this\n const parent_id = original.event_parent_id\n if (!parent_id) {\n return undefined\n }\n return original.event_bus?.findEventById(parent_id) ?? undefined\n }\n\n // get all direct children of this event\n get event_children(): BaseEvent[] {\n const children: BaseEvent[] = []\n const seen = new Set<string>()\n for (const result of this.event_results.values()) {\n for (const child of result.event_children) {\n if (!seen.has(child.event_id)) {\n seen.add(child.event_id)\n children.push(child)\n }\n }\n }\n return children\n }\n\n // get all children grandchildren etc. recursively\n get event_descendants(): BaseEvent[] {\n const descendants: BaseEvent[] = []\n const visited = new Set<string>()\n const root_id = this.event_id\n const stack = [...this.event_children]\n\n while (stack.length > 0) {\n const child = stack.pop()\n if (!child) {\n continue\n }\n const child_id = child.event_id\n if (child_id === root_id) {\n continue\n }\n if (visited.has(child_id)) {\n continue\n }\n visited.add(child_id)\n descendants.push(child)\n if (child.event_children.length > 0) {\n stack.push(...child.event_children)\n }\n }\n\n return descendants\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_parent = this._event_original ?? this\n const original_child = event._event_original ?? event\n if (!original_child.event_parent_id && original_child.event_id !== original_parent.event_id) {\n original_child.event_parent_id = original_parent.event_id\n }\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n return this.event_bus.emit(original_child as T)\n }\n\n // force-abort processing of all pending descendants of an event regardless of whether they have already started\n _cancelPendingChildProcessing(reason: unknown): void {\n const original = this._event_original ?? this\n const cancellation_cause =\n reason instanceof EventHandlerTimeoutError\n ? reason\n : reason instanceof EventHandlerCancelledError || reason instanceof EventHandlerAbortedError\n ? reason.cause instanceof Error\n ? reason.cause\n : reason\n : reason instanceof Error\n ? reason\n : new Error(String(reason))\n const visited = new Set<string>()\n const cancelChildEvent = (child: BaseEvent): void => {\n const original_child = child._event_original ?? child\n if (visited.has(original_child.event_id)) {\n return\n }\n visited.add(original_child.event_id)\n\n // Depth-first: cancel grandchildren before parent so\n // _areAllChildrenComplete() returns true when we get back up.\n for (const grandchild of original_child.event_children) {\n const original_grandchild = grandchild._event_original ?? grandchild\n if (!original_grandchild.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(grandchild)\n }\n\n original_child._markCancelled(cancellation_cause)\n\n // Force-complete the child event. In JS we can't stop running async\n // handlers, but _markCompleted() resolves the done() promise so callers\n // aren't blocked waiting for background work to finish. The background\n // handler's eventual _markCompleted/_markError is a no-op (terminal guard).\n if (original_child.event_status !== 'completed') {\n original_child._markCompleted()\n }\n }\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(child)\n }\n }\n\n // Cancel all handler results for an event except the winner, used by first() mode.\n // Cancels pending handlers immediately, aborts started handlers via _signalAbort(),\n // and cancels any child events emitted by the losing handlers.\n _markRemainingFirstModeResultCancelled(winner: EventResult): void {\n const cause = new Error('first() resolved: another handler returned a result first')\n const bus_id = winner.eventbus_id\n\n for (const result of this.event_results.values()) {\n if (result === winner) continue\n if (result.eventbus_id !== bus_id) continue\n\n if (result.status === 'pending') {\n result._markError(\n new EventHandlerCancelledError(`Cancelled: first() resolved`, {\n event_result: result,\n cause,\n })\n )\n } else if (result.status === 'started') {\n // Cancel child events emitted by this handler before aborting it\n for (const child of result.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n original_child._cancelPendingChildProcessing(cause)\n original_child._markCancelled(cause)\n }\n\n // Abort the handler itself\n result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted: first() resolved`, {\n event_result: result,\n cause,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n }\n }\n }\n\n // force-abort processing of this event regardless of whether it is pending or has already started\n _markCancelled(cause: Error): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n return\n }\n const path = Array.isArray(original.event_path) ? original.event_path : []\n const buses_to_cancel = new Set<string>(path)\n for (const bus of this.event_bus.all_instances) {\n if (!buses_to_cancel.has(bus.label)) {\n continue\n }\n\n const handler_entries = original._createPendingHandlerResults(bus)\n let updated = false\n for (const entry of handler_entries) {\n if (entry.result.status === 'pending') {\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(cancelled_error)\n updated = true\n } else if (entry.result.status === 'started') {\n entry.result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(aborted_error)\n entry.result._signalAbort(aborted_error)\n updated = true\n }\n }\n\n const removed = bus.removeEventFromPendingQueue(original)\n\n if (removed > 0 && !bus.isEventInFlightOrQueued(original.event_id)) {\n original.event_pending_bus_count = Math.max(0, original.event_pending_bus_count - 1)\n }\n\n if (updated || removed > 0) {\n original._markCompleted(false)\n }\n }\n\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n }\n\n _notifyEventParentsOfCompletion(): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n return\n }\n const visited = new Set<string>()\n let parent_id = original.event_parent_id\n while (parent_id && !visited.has(parent_id)) {\n visited.add(parent_id)\n const parent = this.event_bus.findEventById(parent_id)\n if (!parent) {\n break\n }\n parent._markCompleted(false, false)\n if (parent.event_status !== 'completed') {\n break\n }\n parent_id = parent.event_parent_id\n }\n }\n\n // awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued\n // use eventCompleted() to wait for normal queue-order completion without queue-jumping.\n done(options: EventDoneOptions = {}): Promise<this> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const raise_if_any = options.raise_if_any ?? true\n const completion_promise =\n this.event_status === 'completed' ? Promise.resolve(original as this) : this.event_bus._processEventImmediately(this)\n\n if (!raise_if_any) {\n return completion_promise\n }\n\n // Always delegate to _processEventImmediately \u2014 it walks up the parent event tree\n // to determine whether we're inside a handler (works cross-bus). If no\n // ancestor handler is in-flight, it falls back to eventCompleted().\n return completion_promise.then((completed_event) => {\n const first_error = completed_event._firstProcessingError()\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n return completed_event\n })\n }\n\n // returns the first non-undefined handler result value, cancelling remaining handlers\n // when any handler completes. Works with all event_handler_concurrency modes:\n // parallel: races all handlers, returns first non-undefined, aborts the rest\n // serial: runs handlers sequentially, returns first non-undefined, skips remaining\n first(): Promise<EventResultType<this> | undefined> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original.event_handler_completion = 'first'\n return this.done({ raise_if_any: false }).then((completed_event) => {\n const first_error = completed_event._firstProcessingError({ ignore_first_mode_control_errors: true })\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n const orig = completed_event._event_original ?? completed_event\n return Array.from(orig.event_results.values())\n .filter(\n (result) =>\n result.status === 'completed' && result.result !== undefined && result.result !== null && !(result.result instanceof BaseEvent)\n )\n .sort((a, b) => compareIsoDatetime(a.completed_at, b.completed_at))\n .map((result) => result.result as EventResultType<this>)\n .at(0)\n })\n }\n\n // returns handler result values in event_results insertion order.\n // equivalent to await event.done(); Array.from(event.event_results.values()).map((entry) => entry.result)\n eventResultsList(\n include: EventResultsListInclude<this>,\n options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>>\n eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>\n async eventResultsList(\n include_or_options?: EventResultsListInclude<this> | EventResultsListOptions<this>,\n maybe_options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>> {\n const default_include: EventResultsListInclude<this> = (_result, event_result) =>\n event_result.status === 'completed' &&\n event_result.result !== undefined &&\n event_result.result !== null &&\n !(event_result.result instanceof Error) &&\n !(event_result.result instanceof BaseEvent) &&\n event_result.error === undefined\n\n let options: EventResultsListOptions<this>\n let include: EventResultsListInclude<this>\n if (typeof include_or_options === 'function') {\n options = maybe_options ?? {}\n include = include_or_options\n } else {\n options = include_or_options ?? {}\n include = options.include ?? default_include\n }\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? true\n\n const original = this._event_original ?? this\n const resolved_timeout_seconds = options.timeout ?? original.event_timeout ?? this.event_bus?.event_timeout ?? null\n let completed_event: this\n\n if (resolved_timeout_seconds === null) {\n completed_event = await this.done({ raise_if_any: false })\n } else {\n completed_event = await _runWithTimeout(\n resolved_timeout_seconds,\n () => new Error(`Timed out waiting for ${original.event_type} results after ${resolved_timeout_seconds}s`),\n () => this.done({ raise_if_any: false })\n )\n }\n\n const all_results: EventResult<this>[] = Array.from(completed_event.event_results.values())\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n\n if (raise_if_any && error_results.length > 0) {\n if (error_results.length === 1) {\n const first_error = error_results[0]\n if (first_error.error instanceof Error) {\n throw first_error.error\n }\n if (first_error.result instanceof Error) {\n throw first_error.result\n }\n throw new Error(String(first_error.error ?? first_error.result))\n }\n\n const errors = error_results.map((event_result) => {\n if (event_result.error instanceof Error) {\n return event_result.error\n }\n if (event_result.result instanceof Error) {\n return event_result.result\n }\n return new Error(String(event_result.error ?? event_result.result))\n })\n throw new AggregateError(\n errors,\n `Event ${completed_event.event_type}#${completed_event.event_id.slice(-4)} had ${errors.length} handler error(s)`\n )\n }\n\n const included_results = all_results.filter((event_result) => include(event_result.result, event_result))\n if (raise_if_none && included_results.length === 0) {\n throw new Error(\n `Expected at least one handler to return a non-null result, but none did: ${completed_event.event_type}#${completed_event.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n // awaitable that waits for the event to be processed in normal queue order by the _runloop\n eventCompleted(): Promise<this> {\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n if (this.event_status === 'completed') {\n return Promise.resolve(this)\n }\n this._notifyDoneListeners()\n return this._event_completed_signal!.promise\n }\n\n _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void {\n const original = this._event_original ?? this\n if (original.event_blocks_parent_completion || !original.event_bus) {\n return\n }\n const active_result = original.event_bus.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!active_result || active_result.status !== 'started') {\n return\n }\n const active_parent = active_result.event._event_original ?? active_result.event\n const is_child_of_active_handler =\n original.event_parent_id === active_parent.event_id &&\n original.event_emitted_by_handler_id === active_result.handler_id &&\n active_result.event_children.some((child) => (child._event_original ?? child).event_id === original.event_id)\n if (is_child_of_active_handler) {\n original.event_blocks_parent_completion = true\n }\n }\n\n _markPending(): this {\n const original = this._event_original ?? this\n original.event_status = 'pending'\n original.event_started_at = null\n original.event_completed_at = null\n original.event_results.clear()\n original.event_pending_bus_count = 0\n original._setDispatchContext(undefined)\n original._event_completed_signal = null\n original._lock_for_event_handler = null\n original.event_bus = undefined\n return this\n }\n\n eventReset(): this {\n const original = this._event_original ?? this\n const ctor = original.constructor as typeof BaseEvent\n const fresh_event = ctor.fromJSON(original.toJSON()) as this\n fresh_event.event_id = uuidv7()\n return fresh_event._markPending()\n }\n\n _markStarted(started_at: string | null = null, notify_hook: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status !== 'pending') {\n return\n }\n original.event_status = 'started'\n original.event_started_at = started_at === null ? monotonicDatetime() : monotonicDatetime(started_at)\n if (notify_hook && original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'started')\n }\n }\n\n _markCompleted(force: boolean = true, notify_parents: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status === 'completed') {\n return\n }\n if (!force) {\n if (original.event_pending_bus_count > 0) {\n return\n }\n if (!original._areAllChildrenComplete()) {\n return\n }\n }\n original.event_status = 'completed'\n original.event_completed_at = monotonicDatetime()\n if (original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'completed')\n }\n original._setDispatchContext(null)\n original._notifyDoneListeners()\n original._event_completed_signal!.resolve(original)\n original._event_completed_signal = null\n original.dropFromZeroHistoryBuses()\n if (notify_parents && original.event_bus) {\n original._notifyEventParentsOfCompletion()\n }\n }\n\n private dropFromZeroHistoryBuses(): void {\n if (!this.event_bus) {\n return\n }\n const original = this._event_original ?? this\n for (const bus of this.event_bus.all_instances) {\n if (bus.event_history.max_history_size !== 0) {\n continue\n }\n bus.removeEventFromHistory(original.event_id)\n }\n }\n\n get event_errors(): unknown[] {\n return (\n Array.from(this.event_results.values())\n // filter for events that have completed + have non-undefined error values\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n // sort by completion time\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n // assemble array of flat error values\n .map((event_result) => event_result.error)\n )\n }\n\n private _isFirstModeControlError(error: unknown): boolean {\n if (!(error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError)) {\n return false\n }\n if (error.message.includes('first() resolved')) {\n return true\n }\n return error.cause instanceof Error && error.cause.message.includes('first() resolved')\n }\n\n _firstProcessingError(options: { ignore_first_mode_control_errors?: boolean } = {}): unknown | undefined {\n const ignore_first_mode_control_errors = options.ignore_first_mode_control_errors ?? false\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n .filter((event_result) => (ignore_first_mode_control_errors ? !this._isFirstModeControlError(event_result.error) : true))\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.error)\n .at(0)\n }\n\n // Returns the first non-undefined completed handler result, sorted by completion time.\n // Useful after first() or done() to get the winning result value.\n get event_result(): EventResultType<this> | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.completed_at !== null && event_result.result !== undefined)\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.result as EventResultType<this>)\n .at(0)\n }\n\n _areAllChildrenComplete(visited: Set<string> = new Set()): boolean {\n const original = this._event_original ?? this\n if (visited.has(original.event_id)) {\n return true\n }\n visited.add(original.event_id)\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n if (original_child.event_status !== 'completed') {\n return false\n }\n if (!original_child._areAllChildrenComplete(visited)) {\n return false\n }\n }\n return true\n }\n\n private _notifyDoneListeners(): void {\n if (this._event_completed_signal) {\n return\n }\n this._event_completed_signal = withResolvers<this>()\n }\n\n // Break internal reference chains so a completed event can be GC'd when\n // Evicted from event_history. Called by EventHistory.trimEventHistory().\n _gc(): void {\n this._event_completed_signal = null\n this._setDispatchContext(null)\n this.event_bus = undefined\n this._lock_for_event_handler = null\n for (const result of this.event_results.values()) {\n result.event_children = []\n }\n this.event_results.clear()\n }\n}\n\nconst hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {\n const event_results = new Map<string, EventResult<TEvent>>()\n if (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": ["uuidv7"]
7
7
  }
@@ -27,7 +27,7 @@ export declare const BaseEventSchema: z.ZodObject<{
27
27
  }>>;
28
28
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
29
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
30
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
31
31
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
32
32
  "global-serial": "global-serial";
33
33
  "bus-serial": "bus-serial";
@@ -133,7 +133,7 @@ export declare class BaseEvent {
133
133
  }>>;
134
134
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
135
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
136
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
136
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
137
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
138
138
  "global-serial": "global-serial";
139
139
  "bus-serial": "bus-serial";
@@ -61,7 +61,6 @@ export declare class EventHandler {
61
61
  eventbus_id: string;
62
62
  });
63
63
  get _handler_async(): EventHandlerCallable;
64
- static handlerNameFromCallable(handler: EventHandlerCallable): string;
65
64
  static computeHandlerId(params: {
66
65
  eventbus_id: string;
67
66
  handler_name: string;
@@ -60,7 +60,7 @@ const BaseEventSchema = z.object({
60
60
  event_status: z.enum(["pending", "started", "completed"]).optional(),
61
61
  event_started_at: z.string().datetime().nullable().optional(),
62
62
  event_completed_at: z.string().datetime().nullable().optional(),
63
- event_results: z.array(z.unknown()).optional(),
63
+ event_results: z.record(z.string(), z.unknown()).optional(),
64
64
  event_concurrency: z.enum(EVENT_CONCURRENCY_MODES).nullable().optional(),
65
65
  event_handler_concurrency: z.enum(EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),
66
66
  event_handler_completion: z.enum(EVENT_HANDLER_COMPLETION_MODES).nullable().optional()
@@ -241,7 +241,9 @@ class BaseEvent {
241
241
  if (value === void 0 || typeof value === "function") continue;
242
242
  record[key] = value;
243
243
  }
244
- const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON());
244
+ const event_results = Object.fromEntries(
245
+ Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])
246
+ );
245
247
  return {
246
248
  ...record,
247
249
  event_id: this.event_id,
@@ -268,7 +270,7 @@ class BaseEvent {
268
270
  event_started_at: this.event_started_at ?? null,
269
271
  event_completed_at: this.event_completed_at ?? null,
270
272
  // mutable result state
271
- ...event_results.length > 0 ? { event_results } : {}
273
+ ...Object.keys(event_results).length > 0 ? { event_results } : {}
272
274
  };
273
275
  }
274
276
  _createSlowEventWarningTimer() {
@@ -900,13 +902,19 @@ class BaseEvent {
900
902
  }
901
903
  const hydrateEventResults = (event, raw_event_results) => {
902
904
  const event_results = /* @__PURE__ */ new Map();
903
- if (!Array.isArray(raw_event_results)) {
905
+ if (raw_event_results == null) {
904
906
  return event_results;
905
907
  }
906
- for (const item of raw_event_results) {
907
- const result = EventResult.fromJSON(event, item);
908
- const map_key = typeof result.handler_id === "string" && result.handler_id.length > 0 ? result.handler_id : result.id;
909
- event_results.set(map_key, result);
908
+ if (typeof raw_event_results !== "object" || Array.isArray(raw_event_results)) {
909
+ throw new Error("BaseEvent.event_results must be an object keyed by handler id");
910
+ }
911
+ for (const [handler_id, item] of Object.entries(raw_event_results)) {
912
+ if (item == null || typeof item !== "object" || Array.isArray(item)) continue;
913
+ const result = EventResult.fromJSON(event, {
914
+ handler_id,
915
+ ...item
916
+ });
917
+ event_results.set(handler_id, result);
910
918
  }
911
919
  return event_results;
912
920
  };
@@ -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 { extractZodShape, normalizeEventResultType, toJsonSchema } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set(['bus', 'emit', 'first', 'toString', 'toJSON', 'fromJSON'])\n\nfunction assertNoReservedUserEventFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of RESERVED_USER_EVENT_FIELDS) {\n if (Object.prototype.hasOwnProperty.call(data, field_name)) {\n throw new Error(`${context} field \"${field_name}\" is reserved for EventBus runtime context and cannot be set in event payload`)\n }\n }\n}\n\nfunction assertNoUnknownEventPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('event_') && !KNOWN_BASE_EVENT_FIELDS.has(field_name)) {\n throw new Error(`${context} field \"${field_name}\" starts with \"event_\" but is not a recognized BaseEvent field`)\n }\n }\n}\n\nfunction assertNoModelPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('model_')) {\n throw new Error(`${context} field \"${field_name}\" starts with \"model_\" and is reserved for model internals`)\n }\n }\n}\n\nfunction compareIsoDatetime(left: string | null | undefined, right: string | null | undefined): number {\n const left_value = left ?? ''\n const right_value = right ?? ''\n if (left_value === right_value) {\n return 0\n }\n return left_value < right_value ? -1 : 1\n}\n\nexport const BaseEventSchema = z\n .object({\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string(),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().positive().nullable(),\n event_slow_timeout: z.number().positive().nullable().optional(),\n event_handler_timeout: z.number().positive().nullable().optional(),\n event_handler_slow_timeout: z.number().positive().nullable().optional(),\n event_blocks_parent_completion: z.boolean().optional(),\n event_parent_id: z.string().uuid().nullable().optional(),\n event_path: z.array(z.string()).optional(),\n event_result_type: z.unknown().optional(),\n event_emitted_by_handler_id: z.string().uuid().nullable().optional(),\n event_pending_bus_count: z.number().nonnegative().optional(),\n event_status: z.enum(['pending', 'started', 'completed']).optional(),\n event_started_at: z.string().datetime().nullable().optional(),\n event_completed_at: z.string().datetime().nullable().optional(),\n event_results: z.array(z.unknown()).optional(),\n event_concurrency: z.enum(EVENT_CONCURRENCY_MODES).nullable().optional(),\n event_handler_concurrency: z.enum(EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),\n event_handler_completion: z.enum(EVENT_HANDLER_COMPLETION_MODES).nullable().optional(),\n })\n .loose()\n\nconst KNOWN_BASE_EVENT_FIELDS = new Set(Object.keys(BaseEventSchema.shape))\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFields = Pick<\n BaseEventData,\n | 'event_id'\n | 'event_created_at'\n | 'event_type'\n | 'event_version'\n | 'event_timeout'\n | 'event_slow_timeout'\n | 'event_handler_timeout'\n | 'event_handler_slow_timeout'\n | 'event_blocks_parent_completion'\n | 'event_parent_id'\n | 'event_path'\n | 'event_result_type'\n | 'event_emitted_by_handler_id'\n | 'event_pending_bus_count'\n | 'event_status'\n | 'event_started_at'\n | 'event_completed_at'\n | 'event_results'\n | 'event_concurrency'\n | 'event_handler_concurrency'\n | 'event_handler_completion'\n>\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\n\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>\n\ntype EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>\nexport type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends StringConstructor\n ? string\n : TInput extends NumberConstructor\n ? number\n : TInput extends BooleanConstructor\n ? boolean\n : TInput extends ArrayConstructor\n ? unknown[]\n : TInput extends ObjectConstructor\n ? Record<string, unknown>\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype EventResultsListInclude<TEvent extends BaseEvent> = (\n result: EventResultType<TEvent> | undefined,\n event_result: EventResult<TEvent>\n) => boolean\ntype EventResultsListOptions<TEvent extends BaseEvent> = {\n timeout?: number | null\n include?: EventResultsListInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\ntype EventDoneOptions = {\n raise_if_any?: boolean\n}\ntype EventResultUpdateOptions<TEvent extends BaseEvent> = {\n eventbus?: EventBus\n status?: 'pending' | 'started' | 'completed' | 'error'\n result?: EventResultType<TEvent> | BaseEvent | undefined\n error?: unknown\n}\n\nconst EVENT_CLASS_DEFAULTS = new WeakMap<Function, Record<string, unknown>>()\nconst ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {\n (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n schema: EventSchema<TShape>\n class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>\n}\n\ntype ZodShapeFrom<TShape extends Record<string, unknown>> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<\n TShape[K],\n z.ZodTypeAny\n >\n}\n\nexport class BaseEvent {\n // event metadata fields\n event_id!: string // unique uuidv7 identifier for the event\n event_created_at!: string\n event_type!: string // should match the class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n event_version!: string // event schema/version tag managed by callers for migration-friendly payload handling\n event_timeout!: number | null // maximum time in seconds that the event is allowed to run before it is aborted\n event_slow_timeout?: number | null // optional per-event slow warning threshold in seconds\n event_handler_timeout?: number | null // optional per-event handler timeout override in seconds\n event_handler_slow_timeout?: number | null // optional per-event slow handler warning threshold in seconds\n event_blocks_parent_completion!: boolean // true only for children explicitly awaited via done()/eventCompleted()\n event_parent_id!: string | null // id of the parent event that triggered this event, if this event was emitted during handling of another event, else null\n event_path!: string[] // list of bus labels (name#id) that the event has been dispatched to, including the current bus\n event_result_type?: z.ZodTypeAny // optional zod schema to enforce the shape of return values from handlers\n event_results!: Map<string, EventResult<this>> // map of handler ids to EventResult objects for the event\n event_emitted_by_handler_id!: string | null // if event was emitted inside a handler while it was running, this is set to the enclosing handler's handler id, else null\n event_pending_bus_count!: number // number of buses that have accepted this event and not yet finished processing or removed it from their queues (for queue-jump processing)\n event_status!: 'pending' | 'started' | 'completed' // processing status of the event as a whole, no separate 'error' state because events can not error, only individual handlers can\n event_started_at!: string | null\n event_completed_at!: string | null\n event_concurrency?: EventConcurrencyMode | null // concurrency mode for the event as a whole in relation to other events\n event_handler_concurrency?: EventHandlerConcurrencyMode | null // concurrency mode for the handlers within the event\n event_handler_completion?: EventHandlerCompletionMode | null // completion strategy: 'all' (default) waits for every handler, 'first' returns earliest non-undefined result and cancels the rest\n\n static event_type?: string // class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n static event_version = '0.0.1'\n static schema = BaseEventSchema // zod schema for the event data fields, used to parse and validate event data when creating a new event\n\n // internal runtime state\n event_bus?: EventBus // bus that dispatched this event, also used by event.emit(child)\n _event_original?: BaseEvent // underlying event object that was dispatched, if this is a bus-scoped proxy wrapping it\n _event_dispatch_context?: unknown | null // captured AsyncLocalStorage context at dispatch site, used to restore that context when running handlers\n\n _event_completed_signal: Deferred<this> | null\n _lock_for_event_handler: AsyncLock | null\n constructor(data: BaseEventInit<Record<string, unknown>> = {}) {\n assertNoReservedUserEventFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoUnknownEventPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoModelPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n const ctor = this.constructor as typeof BaseEvent & {\n event_version?: string\n event_result_type?: z.ZodTypeAny\n }\n const ctor_defaults = EVENT_CLASS_DEFAULTS.get(ctor) ?? {}\n const merged_data = {\n ...ctor_defaults,\n ...data,\n } as BaseEventInit<Record<string, unknown>>\n const event_type = merged_data.event_type ?? ctor.event_type ?? ctor.name\n const event_version = merged_data.event_version ?? ctor.event_version ?? '0.0.1'\n const raw_event_result_type = merged_data.event_result_type ?? ctor.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_id = merged_data.event_id ?? uuidv7()\n const event_created_at = monotonicDatetime(merged_data.event_created_at)\n const event_timeout = merged_data.event_timeout ?? null\n const event_blocks_parent_completion = merged_data.event_blocks_parent_completion ?? false\n\n const base_data = {\n ...merged_data,\n event_id,\n event_created_at,\n event_type,\n event_version,\n event_timeout,\n event_blocks_parent_completion,\n event_result_type,\n }\n\n const schema = ctor.schema ?? BaseEventSchema\n const parsed = schema.parse(base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n\n // load event results from potentially raw objects from JSON to proper EventResult objects\n this.event_results = hydrateEventResults(this, (parsed as { event_results?: unknown }).event_results)\n this.event_pending_bus_count =\n typeof (parsed as { event_pending_bus_count?: unknown }).event_pending_bus_count === 'number'\n ? Math.max(0, Number((parsed as { event_pending_bus_count?: number }).event_pending_bus_count))\n : 0\n const parsed_status = (parsed as { event_status?: unknown }).event_status\n this.event_status =\n parsed_status === 'pending' || parsed_status === 'started' || parsed_status === 'completed' ? parsed_status : 'pending'\n\n this.event_started_at =\n parsed.event_started_at === null || parsed.event_started_at === undefined ? null : monotonicDatetime(parsed.event_started_at)\n this.event_completed_at =\n parsed.event_completed_at === null || parsed.event_completed_at === undefined ? null : monotonicDatetime(parsed.event_completed_at)\n this.event_parent_id =\n typeof (parsed as { event_parent_id?: unknown }).event_parent_id === 'string'\n ? (parsed as { event_parent_id: string }).event_parent_id\n : null\n this.event_emitted_by_handler_id =\n typeof (parsed as { event_emitted_by_handler_id?: unknown }).event_emitted_by_handler_id === 'string'\n ? (parsed as { event_emitted_by_handler_id: string }).event_emitted_by_handler_id\n : null\n\n this.event_result_type = event_result_type\n\n this._event_completed_signal = null\n this._lock_for_event_handler = null\n this._event_dispatch_context = undefined\n }\n\n // \"MyEvent#a48f\"\n toString(): string {\n return `${this.event_type}#${this.event_id.slice(-4)}`\n }\n\n // main entry point for users to define their own event types\n // BaseEvent.extend(\"MyEvent\", { some_custom_field: z.string(), event_result_type: z.string(), event_timeout: 25, ... }) -> MyEvent\n static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape: TShape = {} as TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> {\n const raw_shape = shape as Record<string, unknown>\n assertNoReservedUserEventFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n const raw_event_result_type = raw_shape.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_version = typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined\n const event_defaults = Object.fromEntries(\n Object.entries(raw_shape).filter(\n ([key, value]) => key !== 'event_result_type' && key !== 'event_version' && !(value instanceof z.ZodType)\n )\n )\n\n const zod_shape = extractZodShape(raw_shape)\n const full_schema = BaseEventSchema.extend(zod_shape)\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static schema = full_schema as unknown as typeof BaseEvent.schema\n static event_type = event_type\n static event_version = event_version ?? BaseEvent.event_version\n static event_result_type = event_result_type\n\n constructor(data: EventInit<ZodShapeFrom<TShape>>) {\n super(data as BaseEventInit<Record<string, unknown>>)\n }\n }\n\n type FactoryResult = EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n\n function EventFactory(data: EventInit<ZodShapeFrom<TShape>>): FactoryResult {\n return new ExtendedEvent(data) as FactoryResult\n }\n\n EventFactory.schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n EventFactory.event_type = event_type\n EventFactory.event_version = event_version ?? BaseEvent.event_version\n EventFactory.event_result_type = event_result_type\n EventFactory.class = ExtendedEvent as unknown as new (\n data: EventInit<ZodShapeFrom<TShape>>\n ) => EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n EventFactory.fromJSON = (data: unknown) => (ExtendedEvent.fromJSON as (data: unknown) => FactoryResult)(data)\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_CLASS_DEFAULTS.set(ExtendedEvent, event_defaults)\n\n return EventFactory as unknown as EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const schema = this.schema ?? BaseEventSchema\n const parsed = schema.parse(data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (record.event_result_type !== undefined && record.event_result_type !== null) {\n record.event_result_type = normalizeEventResultType(record.event_result_type)\n }\n return new this(record as BaseEventInit<Record<string, unknown>>) as InstanceType<T>\n }\n\n static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[] {\n return Array.from(events, (event) => {\n const original = event._event_original ?? event\n return original.toJSON()\n })\n }\n\n static fromJSONArray(data: unknown): BaseEvent[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => BaseEvent.fromJSON(item))\n }\n\n toJSON(): BaseEventJSON {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this as unknown as Record<string, unknown>)) {\n if (key.startsWith('_') || key === 'bus' || key === 'event_bus' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON())\n\n return {\n ...record,\n event_id: this.event_id,\n event_type: this.event_type,\n event_version: this.event_version,\n event_result_type: this.event_result_type ? toJsonSchema(this.event_result_type) : this.event_result_type,\n\n // static configuration options\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\n event_concurrency: this.event_concurrency,\n event_handler_concurrency: this.event_handler_concurrency,\n event_handler_completion: this.event_handler_completion,\n event_handler_slow_timeout: this.event_handler_slow_timeout,\n event_handler_timeout: this.event_handler_timeout,\n event_blocks_parent_completion: this.event_blocks_parent_completion,\n\n // mutable parent/child/bus tracking runtime state\n event_parent_id: this.event_parent_id,\n event_path: this.event_path,\n event_emitted_by_handler_id: this.event_emitted_by_handler_id,\n event_pending_bus_count: this.event_pending_bus_count,\n\n // mutable runtime status and timestamps\n event_status: this.event_status,\n event_created_at: this.event_created_at,\n event_started_at: this.event_started_at ?? null,\n event_completed_at: this.event_completed_at ?? null,\n\n // mutable result state\n ...(event_results.length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null {\n const event_slow_timeout = this.event_slow_timeout ?? this.event_bus?.event_slow_timeout ?? null\n const event_warn_ms = event_slow_timeout === null ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = this.event_bus?.name ?? 'EventBus'\n return setTimeout(() => {\n if (this.event_status === 'completed') {\n return\n }\n const running_handler_count = [...this.event_results.values()].filter((result) => result.status === 'started').length\n const started_at = this.event_started_at ?? this.event_created_at\n const elapsed_ms = Math.max(0, Date.now() - Date.parse(started_at))\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(2)\n console.warn(\n `[abxbus] Slow event processing: ${name}.on(${this.event_type}#${this.event_id.slice(-4)}, ${running_handler_count} handlers) still running after ${elapsed_seconds}s`\n )\n }, event_warn_ms)\n }\n\n eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options: EventResultUpdateOptions<this> = {}): EventResult<this> {\n const original_event = (this._event_original ?? this) as this\n let resolved_eventbus = options.eventbus\n let handler_entry: EventHandler\n\n if (handler instanceof EventHandler) {\n handler_entry = handler\n if (!resolved_eventbus && handler_entry.eventbus_id !== ROOT_EVENTBUS_ID && original_event.event_bus) {\n resolved_eventbus =\n original_event.event_bus.all_instances.findBusById(handler_entry.eventbus_id) ??\n (original_event.event_bus.id === handler_entry.eventbus_id ? original_event.event_bus : undefined)\n }\n } else {\n handler_entry = EventHandler.fromCallable({\n handler,\n event_pattern: original_event.event_type,\n eventbus_name: resolved_eventbus?.name ?? 'EventBus',\n eventbus_id: resolved_eventbus?.id ?? ROOT_EVENTBUS_ID,\n })\n }\n\n const scoped_event = resolved_eventbus ? resolved_eventbus._getEventProxyScopedToThisBus(original_event) : original_event\n const handler_id = handler_entry.id\n const existing = original_event.event_results.get(handler_id)\n const event_result: EventResult<this> =\n existing ?? (new EventResult({ event: scoped_event as this, handler: handler_entry }) as EventResult<this>)\n if (!existing) {\n original_event.event_results.set(handler_id, event_result)\n } else {\n if (existing.event !== scoped_event) {\n existing.event = scoped_event as this\n }\n if (existing.handler.id !== handler_entry.id) {\n existing.handler = handler_entry\n }\n }\n\n if (options.status !== undefined || options.result !== undefined || options.error !== undefined) {\n const update_params: Parameters<EventResult<this>['update']>[0] = {}\n if (options.status !== undefined) update_params.status = options.status\n if (options.result !== undefined) update_params.result = options.result\n if (options.error !== undefined) update_params.error = options.error\n event_result.update(update_params)\n if (event_result.status === 'started' && event_result.started_at !== null) {\n original_event._markStarted(event_result.started_at, false)\n }\n if (options.status === 'pending' || options.status === 'started') {\n original_event.event_completed_at = null\n }\n }\n\n return event_result\n }\n\n _createPendingHandlerResults(bus: EventBus): Array<{\n handler: EventHandler\n result: EventResult\n }> {\n const original_event = this._event_original ?? this\n const scoped_event = bus._getEventProxyScopedToThisBus(original_event)\n const handlers = bus._getHandlersForEvent(original_event)\n return handlers.map((entry) => {\n const handler_id = entry.id\n const existing = original_event.event_results.get(handler_id)\n const result = existing ?? new EventResult({ event: scoped_event, handler: entry })\n if (!existing) {\n original_event.event_results.set(handler_id, result)\n } else if (existing.event !== scoped_event) {\n existing.event = scoped_event\n }\n return { handler: entry, result }\n })\n }\n\n private _collectPendingResults(\n original: BaseEvent,\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): EventResult[] {\n if (pending_entries) {\n return pending_entries.map((entry) => entry.result)\n }\n if (!this.event_bus?.id) {\n return Array.from(original.event_results.values())\n }\n return Array.from(original.event_results.values()).filter((result) => result.eventbus_id === this.event_bus!.id)\n }\n\n private _isFirstModeWinningResult(entry: EventResult): boolean {\n return entry.status === 'completed' && entry.result !== undefined && entry.result !== null && !(entry.result instanceof BaseEvent)\n }\n\n private _markFirstModeWinnerIfNeeded(original: BaseEvent, entry: EventResult, first_state: { found: boolean }): void {\n if (first_state.found || !this._isFirstModeWinningResult(entry)) {\n return\n }\n first_state.found = true\n original._markRemainingFirstModeResultCancelled(entry)\n }\n\n private async _runHandlerWithLock(original: BaseEvent, entry: EventResult): Promise<void> {\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n await this.event_bus.locks._runWithHandlerLock(original, this.event_bus.event_handler_concurrency, async (handler_lock) => {\n await entry.runHandler(handler_lock)\n })\n }\n\n // Run all pending handler results for the current bus context.\n async _runHandlers(\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): Promise<void> {\n const original = this._event_original ?? this\n const pending_results = this._collectPendingResults(original, pending_entries)\n if (pending_results.length === 0) {\n return\n }\n const resolved_completion = original.event_handler_completion ?? this.event_bus?.event_handler_completion ?? 'all'\n if (resolved_completion === 'first') {\n if (original._getHandlerLock(this.event_bus?.event_handler_concurrency) !== null) {\n for (const entry of pending_results) {\n await this._runHandlerWithLock(original, entry)\n if (!this._isFirstModeWinningResult(entry)) {\n continue\n }\n original._markRemainingFirstModeResultCancelled(entry)\n break\n }\n return\n }\n const first_state = { found: false }\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n const monitored = pending_results.map((entry, index) =>\n handler_promises[index].then(() => {\n this._markFirstModeWinnerIfNeeded(original, entry, first_state)\n })\n )\n await Promise.all(monitored)\n return\n } else {\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n await Promise.all(handler_promises)\n }\n }\n\n _getHandlerLock(default_concurrency?: EventHandlerConcurrencyMode): AsyncLock | null {\n const original = this._event_original ?? this\n const resolved = original.event_handler_concurrency ?? default_concurrency ?? original.event_bus?.event_handler_concurrency ?? 'serial'\n if (resolved === 'parallel') {\n return null\n }\n if (!original._lock_for_event_handler) {\n original._lock_for_event_handler = new AsyncLock(1)\n }\n return original._lock_for_event_handler\n }\n\n _setHandlerLock(lock: AsyncLock | null): void {\n const original = this._event_original ?? this\n original._lock_for_event_handler = lock\n }\n\n _getDispatchContext(): unknown | null | undefined {\n const original = this._event_original ?? this\n return original._event_dispatch_context\n }\n\n _setDispatchContext(dispatch_context: unknown | null | undefined): void {\n const original = this._event_original ?? this\n original._event_dispatch_context = dispatch_context\n }\n\n // Get parent event object from event_parent_id (checks across all buses)\n get event_parent(): BaseEvent | undefined {\n const original = this._event_original ?? this\n const parent_id = original.event_parent_id\n if (!parent_id) {\n return undefined\n }\n return original.event_bus?.findEventById(parent_id) ?? undefined\n }\n\n // get all direct children of this event\n get event_children(): BaseEvent[] {\n const children: BaseEvent[] = []\n const seen = new Set<string>()\n for (const result of this.event_results.values()) {\n for (const child of result.event_children) {\n if (!seen.has(child.event_id)) {\n seen.add(child.event_id)\n children.push(child)\n }\n }\n }\n return children\n }\n\n // get all children grandchildren etc. recursively\n get event_descendants(): BaseEvent[] {\n const descendants: BaseEvent[] = []\n const visited = new Set<string>()\n const root_id = this.event_id\n const stack = [...this.event_children]\n\n while (stack.length > 0) {\n const child = stack.pop()\n if (!child) {\n continue\n }\n const child_id = child.event_id\n if (child_id === root_id) {\n continue\n }\n if (visited.has(child_id)) {\n continue\n }\n visited.add(child_id)\n descendants.push(child)\n if (child.event_children.length > 0) {\n stack.push(...child.event_children)\n }\n }\n\n return descendants\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_parent = this._event_original ?? this\n const original_child = event._event_original ?? event\n if (!original_child.event_parent_id && original_child.event_id !== original_parent.event_id) {\n original_child.event_parent_id = original_parent.event_id\n }\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n return this.event_bus.emit(original_child as T)\n }\n\n // force-abort processing of all pending descendants of an event regardless of whether they have already started\n _cancelPendingChildProcessing(reason: unknown): void {\n const original = this._event_original ?? this\n const cancellation_cause =\n reason instanceof EventHandlerTimeoutError\n ? reason\n : reason instanceof EventHandlerCancelledError || reason instanceof EventHandlerAbortedError\n ? reason.cause instanceof Error\n ? reason.cause\n : reason\n : reason instanceof Error\n ? reason\n : new Error(String(reason))\n const visited = new Set<string>()\n const cancelChildEvent = (child: BaseEvent): void => {\n const original_child = child._event_original ?? child\n if (visited.has(original_child.event_id)) {\n return\n }\n visited.add(original_child.event_id)\n\n // Depth-first: cancel grandchildren before parent so\n // _areAllChildrenComplete() returns true when we get back up.\n for (const grandchild of original_child.event_children) {\n const original_grandchild = grandchild._event_original ?? grandchild\n if (!original_grandchild.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(grandchild)\n }\n\n original_child._markCancelled(cancellation_cause)\n\n // Force-complete the child event. In JS we can't stop running async\n // handlers, but _markCompleted() resolves the done() promise so callers\n // aren't blocked waiting for background work to finish. The background\n // handler's eventual _markCompleted/_markError is a no-op (terminal guard).\n if (original_child.event_status !== 'completed') {\n original_child._markCompleted()\n }\n }\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(child)\n }\n }\n\n // Cancel all handler results for an event except the winner, used by first() mode.\n // Cancels pending handlers immediately, aborts started handlers via _signalAbort(),\n // and cancels any child events emitted by the losing handlers.\n _markRemainingFirstModeResultCancelled(winner: EventResult): void {\n const cause = new Error('first() resolved: another handler returned a result first')\n const bus_id = winner.eventbus_id\n\n for (const result of this.event_results.values()) {\n if (result === winner) continue\n if (result.eventbus_id !== bus_id) continue\n\n if (result.status === 'pending') {\n result._markError(\n new EventHandlerCancelledError(`Cancelled: first() resolved`, {\n event_result: result,\n cause,\n })\n )\n } else if (result.status === 'started') {\n // Cancel child events emitted by this handler before aborting it\n for (const child of result.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n original_child._cancelPendingChildProcessing(cause)\n original_child._markCancelled(cause)\n }\n\n // Abort the handler itself\n result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted: first() resolved`, {\n event_result: result,\n cause,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n }\n }\n }\n\n // force-abort processing of this event regardless of whether it is pending or has already started\n _markCancelled(cause: Error): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n return\n }\n const path = Array.isArray(original.event_path) ? original.event_path : []\n const buses_to_cancel = new Set<string>(path)\n for (const bus of this.event_bus.all_instances) {\n if (!buses_to_cancel.has(bus.label)) {\n continue\n }\n\n const handler_entries = original._createPendingHandlerResults(bus)\n let updated = false\n for (const entry of handler_entries) {\n if (entry.result.status === 'pending') {\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(cancelled_error)\n updated = true\n } else if (entry.result.status === 'started') {\n entry.result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(aborted_error)\n entry.result._signalAbort(aborted_error)\n updated = true\n }\n }\n\n const removed = bus.removeEventFromPendingQueue(original)\n\n if (removed > 0 && !bus.isEventInFlightOrQueued(original.event_id)) {\n original.event_pending_bus_count = Math.max(0, original.event_pending_bus_count - 1)\n }\n\n if (updated || removed > 0) {\n original._markCompleted(false)\n }\n }\n\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n }\n\n _notifyEventParentsOfCompletion(): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n return\n }\n const visited = new Set<string>()\n let parent_id = original.event_parent_id\n while (parent_id && !visited.has(parent_id)) {\n visited.add(parent_id)\n const parent = this.event_bus.findEventById(parent_id)\n if (!parent) {\n break\n }\n parent._markCompleted(false, false)\n if (parent.event_status !== 'completed') {\n break\n }\n parent_id = parent.event_parent_id\n }\n }\n\n // awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued\n // use eventCompleted() to wait for normal queue-order completion without queue-jumping.\n done(options: EventDoneOptions = {}): Promise<this> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const raise_if_any = options.raise_if_any ?? true\n const completion_promise =\n this.event_status === 'completed' ? Promise.resolve(original as this) : this.event_bus._processEventImmediately(this)\n\n if (!raise_if_any) {\n return completion_promise\n }\n\n // Always delegate to _processEventImmediately \u2014 it walks up the parent event tree\n // to determine whether we're inside a handler (works cross-bus). If no\n // ancestor handler is in-flight, it falls back to eventCompleted().\n return completion_promise.then((completed_event) => {\n const first_error = completed_event._firstProcessingError()\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n return completed_event\n })\n }\n\n // returns the first non-undefined handler result value, cancelling remaining handlers\n // when any handler completes. Works with all event_handler_concurrency modes:\n // parallel: races all handlers, returns first non-undefined, aborts the rest\n // serial: runs handlers sequentially, returns first non-undefined, skips remaining\n first(): Promise<EventResultType<this> | undefined> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original.event_handler_completion = 'first'\n return this.done({ raise_if_any: false }).then((completed_event) => {\n const first_error = completed_event._firstProcessingError({ ignore_first_mode_control_errors: true })\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n const orig = completed_event._event_original ?? completed_event\n return Array.from(orig.event_results.values())\n .filter(\n (result) =>\n result.status === 'completed' && result.result !== undefined && result.result !== null && !(result.result instanceof BaseEvent)\n )\n .sort((a, b) => compareIsoDatetime(a.completed_at, b.completed_at))\n .map((result) => result.result as EventResultType<this>)\n .at(0)\n })\n }\n\n // returns handler result values in event_results insertion order.\n // equivalent to await event.done(); Array.from(event.event_results.values()).map((entry) => entry.result)\n eventResultsList(\n include: EventResultsListInclude<this>,\n options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>>\n eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>\n async eventResultsList(\n include_or_options?: EventResultsListInclude<this> | EventResultsListOptions<this>,\n maybe_options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>> {\n const default_include: EventResultsListInclude<this> = (_result, event_result) =>\n event_result.status === 'completed' &&\n event_result.result !== undefined &&\n event_result.result !== null &&\n !(event_result.result instanceof Error) &&\n !(event_result.result instanceof BaseEvent) &&\n event_result.error === undefined\n\n let options: EventResultsListOptions<this>\n let include: EventResultsListInclude<this>\n if (typeof include_or_options === 'function') {\n options = maybe_options ?? {}\n include = include_or_options\n } else {\n options = include_or_options ?? {}\n include = options.include ?? default_include\n }\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? true\n\n const original = this._event_original ?? this\n const resolved_timeout_seconds = options.timeout ?? original.event_timeout ?? this.event_bus?.event_timeout ?? null\n let completed_event: this\n\n if (resolved_timeout_seconds === null) {\n completed_event = await this.done({ raise_if_any: false })\n } else {\n completed_event = await _runWithTimeout(\n resolved_timeout_seconds,\n () => new Error(`Timed out waiting for ${original.event_type} results after ${resolved_timeout_seconds}s`),\n () => this.done({ raise_if_any: false })\n )\n }\n\n const all_results: EventResult<this>[] = Array.from(completed_event.event_results.values())\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n\n if (raise_if_any && error_results.length > 0) {\n if (error_results.length === 1) {\n const first_error = error_results[0]\n if (first_error.error instanceof Error) {\n throw first_error.error\n }\n if (first_error.result instanceof Error) {\n throw first_error.result\n }\n throw new Error(String(first_error.error ?? first_error.result))\n }\n\n const errors = error_results.map((event_result) => {\n if (event_result.error instanceof Error) {\n return event_result.error\n }\n if (event_result.result instanceof Error) {\n return event_result.result\n }\n return new Error(String(event_result.error ?? event_result.result))\n })\n throw new AggregateError(\n errors,\n `Event ${completed_event.event_type}#${completed_event.event_id.slice(-4)} had ${errors.length} handler error(s)`\n )\n }\n\n const included_results = all_results.filter((event_result) => include(event_result.result, event_result))\n if (raise_if_none && included_results.length === 0) {\n throw new Error(\n `Expected at least one handler to return a non-null result, but none did: ${completed_event.event_type}#${completed_event.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n // awaitable that waits for the event to be processed in normal queue order by the _runloop\n eventCompleted(): Promise<this> {\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n if (this.event_status === 'completed') {\n return Promise.resolve(this)\n }\n this._notifyDoneListeners()\n return this._event_completed_signal!.promise\n }\n\n _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void {\n const original = this._event_original ?? this\n if (original.event_blocks_parent_completion || !original.event_bus) {\n return\n }\n const active_result = original.event_bus.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!active_result || active_result.status !== 'started') {\n return\n }\n const active_parent = active_result.event._event_original ?? active_result.event\n const is_child_of_active_handler =\n original.event_parent_id === active_parent.event_id &&\n original.event_emitted_by_handler_id === active_result.handler_id &&\n active_result.event_children.some((child) => (child._event_original ?? child).event_id === original.event_id)\n if (is_child_of_active_handler) {\n original.event_blocks_parent_completion = true\n }\n }\n\n _markPending(): this {\n const original = this._event_original ?? this\n original.event_status = 'pending'\n original.event_started_at = null\n original.event_completed_at = null\n original.event_results.clear()\n original.event_pending_bus_count = 0\n original._setDispatchContext(undefined)\n original._event_completed_signal = null\n original._lock_for_event_handler = null\n original.event_bus = undefined\n return this\n }\n\n eventReset(): this {\n const original = this._event_original ?? this\n const ctor = original.constructor as typeof BaseEvent\n const fresh_event = ctor.fromJSON(original.toJSON()) as this\n fresh_event.event_id = uuidv7()\n return fresh_event._markPending()\n }\n\n _markStarted(started_at: string | null = null, notify_hook: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status !== 'pending') {\n return\n }\n original.event_status = 'started'\n original.event_started_at = started_at === null ? monotonicDatetime() : monotonicDatetime(started_at)\n if (notify_hook && original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'started')\n }\n }\n\n _markCompleted(force: boolean = true, notify_parents: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status === 'completed') {\n return\n }\n if (!force) {\n if (original.event_pending_bus_count > 0) {\n return\n }\n if (!original._areAllChildrenComplete()) {\n return\n }\n }\n original.event_status = 'completed'\n original.event_completed_at = monotonicDatetime()\n if (original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'completed')\n }\n original._setDispatchContext(null)\n original._notifyDoneListeners()\n original._event_completed_signal!.resolve(original)\n original._event_completed_signal = null\n original.dropFromZeroHistoryBuses()\n if (notify_parents && original.event_bus) {\n original._notifyEventParentsOfCompletion()\n }\n }\n\n private dropFromZeroHistoryBuses(): void {\n if (!this.event_bus) {\n return\n }\n const original = this._event_original ?? this\n for (const bus of this.event_bus.all_instances) {\n if (bus.event_history.max_history_size !== 0) {\n continue\n }\n bus.removeEventFromHistory(original.event_id)\n }\n }\n\n get event_errors(): unknown[] {\n return (\n Array.from(this.event_results.values())\n // filter for events that have completed + have non-undefined error values\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n // sort by completion time\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n // assemble array of flat error values\n .map((event_result) => event_result.error)\n )\n }\n\n private _isFirstModeControlError(error: unknown): boolean {\n if (!(error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError)) {\n return false\n }\n if (error.message.includes('first() resolved')) {\n return true\n }\n return error.cause instanceof Error && error.cause.message.includes('first() resolved')\n }\n\n _firstProcessingError(options: { ignore_first_mode_control_errors?: boolean } = {}): unknown | undefined {\n const ignore_first_mode_control_errors = options.ignore_first_mode_control_errors ?? false\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n .filter((event_result) => (ignore_first_mode_control_errors ? !this._isFirstModeControlError(event_result.error) : true))\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.error)\n .at(0)\n }\n\n // Returns the first non-undefined completed handler result, sorted by completion time.\n // Useful after first() or done() to get the winning result value.\n get event_result(): EventResultType<this> | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.completed_at !== null && event_result.result !== undefined)\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.result as EventResultType<this>)\n .at(0)\n }\n\n _areAllChildrenComplete(visited: Set<string> = new Set()): boolean {\n const original = this._event_original ?? this\n if (visited.has(original.event_id)) {\n return true\n }\n visited.add(original.event_id)\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n if (original_child.event_status !== 'completed') {\n return false\n }\n if (!original_child._areAllChildrenComplete(visited)) {\n return false\n }\n }\n return true\n }\n\n private _notifyDoneListeners(): void {\n if (this._event_completed_signal) {\n return\n }\n this._event_completed_signal = withResolvers<this>()\n }\n\n // Break internal reference chains so a completed event can be GC'd when\n // Evicted from event_history. Called by EventHistory.trimEventHistory().\n _gc(): void {\n this._event_completed_signal = null\n this._setDispatchContext(null)\n this.event_bus = undefined\n this._lock_for_event_handler = null\n for (const result of this.event_results.values()) {\n result.event_children = []\n }\n this.event_results.clear()\n }\n}\n\nconst hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {\n const event_results = new Map<string, EventResult<TEvent>>()\n if (!Array.isArray(raw_event_results)) {\n return event_results\n }\n for (const item of raw_event_results) {\n const result = EventResult.fromJSON(event, item)\n const map_key = typeof result.handler_id === 'string' && result.handler_id.length > 0 ? result.handler_id : result.id\n event_results.set(map_key, result)\n }\n return event_results\n}\n"],
5
- "mappings": "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",
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 { extractZodShape, normalizeEventResultType, toJsonSchema } from './types.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { monotonicDatetime } from './helpers.js'\n\nconst RESERVED_USER_EVENT_FIELDS = new Set(['bus', 'emit', 'first', 'toString', 'toJSON', 'fromJSON'])\n\nfunction assertNoReservedUserEventFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of RESERVED_USER_EVENT_FIELDS) {\n if (Object.prototype.hasOwnProperty.call(data, field_name)) {\n throw new Error(`${context} field \"${field_name}\" is reserved for EventBus runtime context and cannot be set in event payload`)\n }\n }\n}\n\nfunction assertNoUnknownEventPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('event_') && !KNOWN_BASE_EVENT_FIELDS.has(field_name)) {\n throw new Error(`${context} field \"${field_name}\" starts with \"event_\" but is not a recognized BaseEvent field`)\n }\n }\n}\n\nfunction assertNoModelPrefixedFields(data: Record<string, unknown>, context: string): void {\n for (const field_name of Object.keys(data)) {\n if (field_name.startsWith('model_')) {\n throw new Error(`${context} field \"${field_name}\" starts with \"model_\" and is reserved for model internals`)\n }\n }\n}\n\nfunction compareIsoDatetime(left: string | null | undefined, right: string | null | undefined): number {\n const left_value = left ?? ''\n const right_value = right ?? ''\n if (left_value === right_value) {\n return 0\n }\n return left_value < right_value ? -1 : 1\n}\n\nexport const BaseEventSchema = z\n .object({\n event_id: z.string().uuid(),\n event_created_at: z.string().datetime(),\n event_type: z.string(),\n event_version: z.string().default('0.0.1'),\n event_timeout: z.number().positive().nullable(),\n event_slow_timeout: z.number().positive().nullable().optional(),\n event_handler_timeout: z.number().positive().nullable().optional(),\n event_handler_slow_timeout: z.number().positive().nullable().optional(),\n event_blocks_parent_completion: z.boolean().optional(),\n event_parent_id: z.string().uuid().nullable().optional(),\n event_path: z.array(z.string()).optional(),\n event_result_type: z.unknown().optional(),\n event_emitted_by_handler_id: z.string().uuid().nullable().optional(),\n event_pending_bus_count: z.number().nonnegative().optional(),\n event_status: z.enum(['pending', 'started', 'completed']).optional(),\n event_started_at: z.string().datetime().nullable().optional(),\n event_completed_at: z.string().datetime().nullable().optional(),\n event_results: z.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))\n\nexport type BaseEventData = z.infer<typeof BaseEventSchema>\nexport type BaseEventJSON = BaseEventData & Record<string, unknown>\ntype BaseEventFields = Pick<\n BaseEventData,\n | 'event_id'\n | 'event_created_at'\n | 'event_type'\n | 'event_version'\n | 'event_timeout'\n | 'event_slow_timeout'\n | 'event_handler_timeout'\n | 'event_handler_slow_timeout'\n | 'event_blocks_parent_completion'\n | 'event_parent_id'\n | 'event_path'\n | 'event_result_type'\n | 'event_emitted_by_handler_id'\n | 'event_pending_bus_count'\n | 'event_status'\n | 'event_started_at'\n | 'event_completed_at'\n | 'event_results'\n | 'event_concurrency'\n | 'event_handler_concurrency'\n | 'event_handler_completion'\n>\n\nexport type BaseEventInit<TFields extends Record<string, unknown>> = TFields & Partial<BaseEventFields>\n\ntype BaseEventSchemaShape = typeof BaseEventSchema.shape\n\nexport type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSchemaShape & TShape>\ntype EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>\n\ntype EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>\nexport type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>\n\ntype EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\ntype ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny\n ? z.infer<TInput>\n : TInput extends StringConstructor\n ? string\n : TInput extends NumberConstructor\n ? number\n : TInput extends BooleanConstructor\n ? boolean\n : TInput extends ArrayConstructor\n ? unknown[]\n : TInput extends ObjectConstructor\n ? Record<string, unknown>\n : unknown\n\ntype ResultSchemaFromShape<TShape> = TShape extends { event_result_type: infer S } ? ResultTypeFromEventResultTypeInput<S> : unknown\ntype EventResultsListInclude<TEvent extends BaseEvent> = (\n result: EventResultType<TEvent> | undefined,\n event_result: EventResult<TEvent>\n) => boolean\ntype EventResultsListOptions<TEvent extends BaseEvent> = {\n timeout?: number | null\n include?: EventResultsListInclude<TEvent>\n raise_if_any?: boolean\n raise_if_none?: boolean\n}\ntype EventDoneOptions = {\n raise_if_any?: boolean\n}\ntype EventResultUpdateOptions<TEvent extends BaseEvent> = {\n eventbus?: EventBus\n status?: 'pending' | 'started' | 'completed' | 'error'\n result?: EventResultType<TEvent> | BaseEvent | undefined\n error?: unknown\n}\n\nconst EVENT_CLASS_DEFAULTS = new WeakMap<Function, Record<string, unknown>>()\nconst ROOT_EVENTBUS_ID = '00000000-0000-0000-0000-000000000000'\n\nexport type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {\n (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>\n schema: EventSchema<TShape>\n class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>\n event_type?: string\n event_version?: string\n event_result_type?: z.ZodTypeAny\n fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>\n}\n\ntype ZodShapeFrom<TShape extends Record<string, unknown>> = {\n [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<\n TShape[K],\n z.ZodTypeAny\n >\n}\n\nexport class BaseEvent {\n // event metadata fields\n event_id!: string // unique uuidv7 identifier for the event\n event_created_at!: string\n event_type!: string // should match the class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n event_version!: string // event schema/version tag managed by callers for migration-friendly payload handling\n event_timeout!: number | null // maximum time in seconds that the event is allowed to run before it is aborted\n event_slow_timeout?: number | null // optional per-event slow warning threshold in seconds\n event_handler_timeout?: number | null // optional per-event handler timeout override in seconds\n event_handler_slow_timeout?: number | null // optional per-event slow handler warning threshold in seconds\n event_blocks_parent_completion!: boolean // true only for children explicitly awaited via done()/eventCompleted()\n event_parent_id!: string | null // id of the parent event that triggered this event, if this event was emitted during handling of another event, else null\n event_path!: string[] // list of bus labels (name#id) that the event has been dispatched to, including the current bus\n event_result_type?: z.ZodTypeAny // optional zod schema to enforce the shape of return values from handlers\n event_results!: Map<string, EventResult<this>> // map of handler ids to EventResult objects for the event\n event_emitted_by_handler_id!: string | null // if event was emitted inside a handler while it was running, this is set to the enclosing handler's handler id, else null\n event_pending_bus_count!: number // number of buses that have accepted this event and not yet finished processing or removed it from their queues (for queue-jump processing)\n event_status!: 'pending' | 'started' | 'completed' // processing status of the event as a whole, no separate 'error' state because events can not error, only individual handlers can\n event_started_at!: string | null\n event_completed_at!: string | null\n event_concurrency?: EventConcurrencyMode | null // concurrency mode for the event as a whole in relation to other events\n event_handler_concurrency?: EventHandlerConcurrencyMode | null // concurrency mode for the handlers within the event\n event_handler_completion?: EventHandlerCompletionMode | null // completion strategy: 'all' (default) waits for every handler, 'first' returns earliest non-undefined result and cancels the rest\n\n static event_type?: string // class name of the event, e.g. BaseEvent.extend(\"MyEvent\").event_type === \"MyEvent\"\n static event_version = '0.0.1'\n static schema = BaseEventSchema // zod schema for the event data fields, used to parse and validate event data when creating a new event\n\n // internal runtime state\n event_bus?: EventBus // bus that dispatched this event, also used by event.emit(child)\n _event_original?: BaseEvent // underlying event object that was dispatched, if this is a bus-scoped proxy wrapping it\n _event_dispatch_context?: unknown | null // captured AsyncLocalStorage context at dispatch site, used to restore that context when running handlers\n\n _event_completed_signal: Deferred<this> | null\n _lock_for_event_handler: AsyncLock | null\n constructor(data: BaseEventInit<Record<string, unknown>> = {}) {\n assertNoReservedUserEventFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoUnknownEventPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n assertNoModelPrefixedFields(data as Record<string, unknown>, 'BaseEvent')\n const ctor = this.constructor as typeof BaseEvent & {\n event_version?: string\n event_result_type?: z.ZodTypeAny\n }\n const ctor_defaults = EVENT_CLASS_DEFAULTS.get(ctor) ?? {}\n const merged_data = {\n ...ctor_defaults,\n ...data,\n } as BaseEventInit<Record<string, unknown>>\n const event_type = merged_data.event_type ?? ctor.event_type ?? ctor.name\n const event_version = merged_data.event_version ?? ctor.event_version ?? '0.0.1'\n const raw_event_result_type = merged_data.event_result_type ?? ctor.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_id = merged_data.event_id ?? uuidv7()\n const event_created_at = monotonicDatetime(merged_data.event_created_at)\n const event_timeout = merged_data.event_timeout ?? null\n const event_blocks_parent_completion = merged_data.event_blocks_parent_completion ?? false\n\n const base_data = {\n ...merged_data,\n event_id,\n event_created_at,\n event_type,\n event_version,\n event_timeout,\n event_blocks_parent_completion,\n event_result_type,\n }\n\n const schema = ctor.schema ?? BaseEventSchema\n const parsed = schema.parse(base_data) as BaseEventData & Record<string, unknown>\n\n Object.assign(this, parsed)\n\n const parsed_path = (parsed as { event_path?: string[] }).event_path\n this.event_path = Array.isArray(parsed_path) ? [...parsed_path] : []\n\n // load event results from potentially raw objects from JSON to proper EventResult objects\n this.event_results = hydrateEventResults(this, (parsed as { event_results?: unknown }).event_results)\n this.event_pending_bus_count =\n typeof (parsed as { event_pending_bus_count?: unknown }).event_pending_bus_count === 'number'\n ? Math.max(0, Number((parsed as { event_pending_bus_count?: number }).event_pending_bus_count))\n : 0\n const parsed_status = (parsed as { event_status?: unknown }).event_status\n this.event_status =\n parsed_status === 'pending' || parsed_status === 'started' || parsed_status === 'completed' ? parsed_status : 'pending'\n\n this.event_started_at =\n parsed.event_started_at === null || parsed.event_started_at === undefined ? null : monotonicDatetime(parsed.event_started_at)\n this.event_completed_at =\n parsed.event_completed_at === null || parsed.event_completed_at === undefined ? null : monotonicDatetime(parsed.event_completed_at)\n this.event_parent_id =\n typeof (parsed as { event_parent_id?: unknown }).event_parent_id === 'string'\n ? (parsed as { event_parent_id: string }).event_parent_id\n : null\n this.event_emitted_by_handler_id =\n typeof (parsed as { event_emitted_by_handler_id?: unknown }).event_emitted_by_handler_id === 'string'\n ? (parsed as { event_emitted_by_handler_id: string }).event_emitted_by_handler_id\n : null\n\n this.event_result_type = event_result_type\n\n this._event_completed_signal = null\n this._lock_for_event_handler = null\n this._event_dispatch_context = undefined\n }\n\n // \"MyEvent#a48f\"\n toString(): string {\n return `${this.event_type}#${this.event_id.slice(-4)}`\n }\n\n // main entry point for users to define their own event types\n // BaseEvent.extend(\"MyEvent\", { some_custom_field: z.string(), event_result_type: z.string(), event_timeout: 25, ... }) -> MyEvent\n static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape?: TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n static extend<TShape extends Record<string, unknown>>(\n event_type: string,\n shape: TShape = {} as TShape\n ): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>> {\n const raw_shape = shape as Record<string, unknown>\n assertNoReservedUserEventFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoUnknownEventPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n assertNoModelPrefixedFields(raw_shape, `BaseEvent.extend(${event_type})`)\n const raw_event_result_type = raw_shape.event_result_type\n const event_result_type = normalizeEventResultType(raw_event_result_type)\n const event_version = typeof raw_shape.event_version === 'string' ? raw_shape.event_version : undefined\n const event_defaults = Object.fromEntries(\n Object.entries(raw_shape).filter(\n ([key, value]) => key !== 'event_result_type' && key !== 'event_version' && !(value instanceof z.ZodType)\n )\n )\n\n const zod_shape = extractZodShape(raw_shape)\n const full_schema = BaseEventSchema.extend(zod_shape)\n\n // create a new event class that extends BaseEvent and adds the custom fields\n class ExtendedEvent extends BaseEvent {\n static schema = full_schema as unknown as typeof BaseEvent.schema\n static event_type = event_type\n static event_version = event_version ?? BaseEvent.event_version\n static event_result_type = event_result_type\n\n constructor(data: EventInit<ZodShapeFrom<TShape>>) {\n super(data as BaseEventInit<Record<string, unknown>>)\n }\n }\n\n type FactoryResult = EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n\n function EventFactory(data: EventInit<ZodShapeFrom<TShape>>): FactoryResult {\n return new ExtendedEvent(data) as FactoryResult\n }\n\n EventFactory.schema = full_schema as EventSchema<ZodShapeFrom<TShape>>\n EventFactory.event_type = event_type\n EventFactory.event_version = event_version ?? BaseEvent.event_version\n EventFactory.event_result_type = event_result_type\n EventFactory.class = ExtendedEvent as unknown as new (\n data: EventInit<ZodShapeFrom<TShape>>\n ) => EventWithResultSchema<ResultSchemaFromShape<TShape>> & EventPayload<ZodShapeFrom<TShape>>\n EventFactory.fromJSON = (data: unknown) => (ExtendedEvent.fromJSON as (data: unknown) => FactoryResult)(data)\n EventFactory.prototype = ExtendedEvent.prototype\n EVENT_CLASS_DEFAULTS.set(ExtendedEvent, event_defaults)\n\n return EventFactory as unknown as EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>\n }\n\n static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T> {\n if (!data || typeof data !== 'object') {\n const schema = this.schema ?? BaseEventSchema\n const parsed = schema.parse(data)\n return new this(parsed) as InstanceType<T>\n }\n const record = { ...(data as Record<string, unknown>) }\n if (record.event_result_type !== undefined && record.event_result_type !== null) {\n record.event_result_type = normalizeEventResultType(record.event_result_type)\n }\n return new this(record as BaseEventInit<Record<string, unknown>>) as InstanceType<T>\n }\n\n static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[] {\n return Array.from(events, (event) => {\n const original = event._event_original ?? event\n return original.toJSON()\n })\n }\n\n static fromJSONArray(data: unknown): BaseEvent[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.map((item) => BaseEvent.fromJSON(item))\n }\n\n toJSON(): BaseEventJSON {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this as unknown as Record<string, unknown>)) {\n if (key.startsWith('_') || key === 'bus' || key === 'event_bus' || key === 'event_results') continue\n if (value === undefined || typeof value === 'function') continue\n record[key] = value\n }\n const event_results = Object.fromEntries(\n Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])\n )\n\n return {\n ...record,\n event_id: this.event_id,\n event_type: this.event_type,\n event_version: this.event_version,\n event_result_type: this.event_result_type ? toJsonSchema(this.event_result_type) : this.event_result_type,\n\n // static configuration options\n event_timeout: this.event_timeout,\n event_slow_timeout: this.event_slow_timeout,\n event_concurrency: this.event_concurrency,\n event_handler_concurrency: this.event_handler_concurrency,\n event_handler_completion: this.event_handler_completion,\n event_handler_slow_timeout: this.event_handler_slow_timeout,\n event_handler_timeout: this.event_handler_timeout,\n event_blocks_parent_completion: this.event_blocks_parent_completion,\n\n // mutable parent/child/bus tracking runtime state\n event_parent_id: this.event_parent_id,\n event_path: this.event_path,\n event_emitted_by_handler_id: this.event_emitted_by_handler_id,\n event_pending_bus_count: this.event_pending_bus_count,\n\n // mutable runtime status and timestamps\n event_status: this.event_status,\n event_created_at: this.event_created_at,\n event_started_at: this.event_started_at ?? null,\n event_completed_at: this.event_completed_at ?? null,\n\n // mutable result state\n ...(Object.keys(event_results).length > 0 ? { event_results } : {}),\n }\n }\n\n _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null {\n const event_slow_timeout = this.event_slow_timeout ?? this.event_bus?.event_slow_timeout ?? null\n const event_warn_ms = event_slow_timeout === null ? null : event_slow_timeout * 1000\n if (event_warn_ms === null) {\n return null\n }\n const name = this.event_bus?.name ?? 'EventBus'\n return setTimeout(() => {\n if (this.event_status === 'completed') {\n return\n }\n const running_handler_count = [...this.event_results.values()].filter((result) => result.status === 'started').length\n const started_at = this.event_started_at ?? this.event_created_at\n const elapsed_ms = Math.max(0, Date.now() - Date.parse(started_at))\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(2)\n console.warn(\n `[abxbus] Slow event processing: ${name}.on(${this.event_type}#${this.event_id.slice(-4)}, ${running_handler_count} handlers) still running after ${elapsed_seconds}s`\n )\n }, event_warn_ms)\n }\n\n eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options: EventResultUpdateOptions<this> = {}): EventResult<this> {\n const original_event = (this._event_original ?? this) as this\n let resolved_eventbus = options.eventbus\n let handler_entry: EventHandler\n\n if (handler instanceof EventHandler) {\n handler_entry = handler\n if (!resolved_eventbus && handler_entry.eventbus_id !== ROOT_EVENTBUS_ID && original_event.event_bus) {\n resolved_eventbus =\n original_event.event_bus.all_instances.findBusById(handler_entry.eventbus_id) ??\n (original_event.event_bus.id === handler_entry.eventbus_id ? original_event.event_bus : undefined)\n }\n } else {\n handler_entry = EventHandler.fromCallable({\n handler,\n event_pattern: original_event.event_type,\n eventbus_name: resolved_eventbus?.name ?? 'EventBus',\n eventbus_id: resolved_eventbus?.id ?? ROOT_EVENTBUS_ID,\n })\n }\n\n const scoped_event = resolved_eventbus ? resolved_eventbus._getEventProxyScopedToThisBus(original_event) : original_event\n const handler_id = handler_entry.id\n const existing = original_event.event_results.get(handler_id)\n const event_result: EventResult<this> =\n existing ?? (new EventResult({ event: scoped_event as this, handler: handler_entry }) as EventResult<this>)\n if (!existing) {\n original_event.event_results.set(handler_id, event_result)\n } else {\n if (existing.event !== scoped_event) {\n existing.event = scoped_event as this\n }\n if (existing.handler.id !== handler_entry.id) {\n existing.handler = handler_entry\n }\n }\n\n if (options.status !== undefined || options.result !== undefined || options.error !== undefined) {\n const update_params: Parameters<EventResult<this>['update']>[0] = {}\n if (options.status !== undefined) update_params.status = options.status\n if (options.result !== undefined) update_params.result = options.result\n if (options.error !== undefined) update_params.error = options.error\n event_result.update(update_params)\n if (event_result.status === 'started' && event_result.started_at !== null) {\n original_event._markStarted(event_result.started_at, false)\n }\n if (options.status === 'pending' || options.status === 'started') {\n original_event.event_completed_at = null\n }\n }\n\n return event_result\n }\n\n _createPendingHandlerResults(bus: EventBus): Array<{\n handler: EventHandler\n result: EventResult\n }> {\n const original_event = this._event_original ?? this\n const scoped_event = bus._getEventProxyScopedToThisBus(original_event)\n const handlers = bus._getHandlersForEvent(original_event)\n return handlers.map((entry) => {\n const handler_id = entry.id\n const existing = original_event.event_results.get(handler_id)\n const result = existing ?? new EventResult({ event: scoped_event, handler: entry })\n if (!existing) {\n original_event.event_results.set(handler_id, result)\n } else if (existing.event !== scoped_event) {\n existing.event = scoped_event\n }\n return { handler: entry, result }\n })\n }\n\n private _collectPendingResults(\n original: BaseEvent,\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): EventResult[] {\n if (pending_entries) {\n return pending_entries.map((entry) => entry.result)\n }\n if (!this.event_bus?.id) {\n return Array.from(original.event_results.values())\n }\n return Array.from(original.event_results.values()).filter((result) => result.eventbus_id === this.event_bus!.id)\n }\n\n private _isFirstModeWinningResult(entry: EventResult): boolean {\n return entry.status === 'completed' && entry.result !== undefined && entry.result !== null && !(entry.result instanceof BaseEvent)\n }\n\n private _markFirstModeWinnerIfNeeded(original: BaseEvent, entry: EventResult, first_state: { found: boolean }): void {\n if (first_state.found || !this._isFirstModeWinningResult(entry)) {\n return\n }\n first_state.found = true\n original._markRemainingFirstModeResultCancelled(entry)\n }\n\n private async _runHandlerWithLock(original: BaseEvent, entry: EventResult): Promise<void> {\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n await this.event_bus.locks._runWithHandlerLock(original, this.event_bus.event_handler_concurrency, async (handler_lock) => {\n await entry.runHandler(handler_lock)\n })\n }\n\n // Run all pending handler results for the current bus context.\n async _runHandlers(\n pending_entries?: Array<{\n handler: EventHandler\n result: EventResult\n }>\n ): Promise<void> {\n const original = this._event_original ?? this\n const pending_results = this._collectPendingResults(original, pending_entries)\n if (pending_results.length === 0) {\n return\n }\n const resolved_completion = original.event_handler_completion ?? this.event_bus?.event_handler_completion ?? 'all'\n if (resolved_completion === 'first') {\n if (original._getHandlerLock(this.event_bus?.event_handler_concurrency) !== null) {\n for (const entry of pending_results) {\n await this._runHandlerWithLock(original, entry)\n if (!this._isFirstModeWinningResult(entry)) {\n continue\n }\n original._markRemainingFirstModeResultCancelled(entry)\n break\n }\n return\n }\n const first_state = { found: false }\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n const monitored = pending_results.map((entry, index) =>\n handler_promises[index].then(() => {\n this._markFirstModeWinnerIfNeeded(original, entry, first_state)\n })\n )\n await Promise.all(monitored)\n return\n } else {\n const handler_promises = pending_results.map((entry) => this._runHandlerWithLock(original, entry))\n await Promise.all(handler_promises)\n }\n }\n\n _getHandlerLock(default_concurrency?: EventHandlerConcurrencyMode): AsyncLock | null {\n const original = this._event_original ?? this\n const resolved = original.event_handler_concurrency ?? default_concurrency ?? original.event_bus?.event_handler_concurrency ?? 'serial'\n if (resolved === 'parallel') {\n return null\n }\n if (!original._lock_for_event_handler) {\n original._lock_for_event_handler = new AsyncLock(1)\n }\n return original._lock_for_event_handler\n }\n\n _setHandlerLock(lock: AsyncLock | null): void {\n const original = this._event_original ?? this\n original._lock_for_event_handler = lock\n }\n\n _getDispatchContext(): unknown | null | undefined {\n const original = this._event_original ?? this\n return original._event_dispatch_context\n }\n\n _setDispatchContext(dispatch_context: unknown | null | undefined): void {\n const original = this._event_original ?? this\n original._event_dispatch_context = dispatch_context\n }\n\n // Get parent event object from event_parent_id (checks across all buses)\n get event_parent(): BaseEvent | undefined {\n const original = this._event_original ?? this\n const parent_id = original.event_parent_id\n if (!parent_id) {\n return undefined\n }\n return original.event_bus?.findEventById(parent_id) ?? undefined\n }\n\n // get all direct children of this event\n get event_children(): BaseEvent[] {\n const children: BaseEvent[] = []\n const seen = new Set<string>()\n for (const result of this.event_results.values()) {\n for (const child of result.event_children) {\n if (!seen.has(child.event_id)) {\n seen.add(child.event_id)\n children.push(child)\n }\n }\n }\n return children\n }\n\n // get all children grandchildren etc. recursively\n get event_descendants(): BaseEvent[] {\n const descendants: BaseEvent[] = []\n const visited = new Set<string>()\n const root_id = this.event_id\n const stack = [...this.event_children]\n\n while (stack.length > 0) {\n const child = stack.pop()\n if (!child) {\n continue\n }\n const child_id = child.event_id\n if (child_id === root_id) {\n continue\n }\n if (visited.has(child_id)) {\n continue\n }\n visited.add(child_id)\n descendants.push(child)\n if (child.event_children.length > 0) {\n stack.push(...child.event_children)\n }\n }\n\n return descendants\n }\n\n emit<T extends BaseEvent>(event: T): T {\n const original_parent = this._event_original ?? this\n const original_child = event._event_original ?? event\n if (!original_child.event_parent_id && original_child.event_id !== original_parent.event_id) {\n original_child.event_parent_id = original_parent.event_id\n }\n if (!this.event_bus) {\n throw new Error('event has no bus attached')\n }\n return this.event_bus.emit(original_child as T)\n }\n\n // force-abort processing of all pending descendants of an event regardless of whether they have already started\n _cancelPendingChildProcessing(reason: unknown): void {\n const original = this._event_original ?? this\n const cancellation_cause =\n reason instanceof EventHandlerTimeoutError\n ? reason\n : reason instanceof EventHandlerCancelledError || reason instanceof EventHandlerAbortedError\n ? reason.cause instanceof Error\n ? reason.cause\n : reason\n : reason instanceof Error\n ? reason\n : new Error(String(reason))\n const visited = new Set<string>()\n const cancelChildEvent = (child: BaseEvent): void => {\n const original_child = child._event_original ?? child\n if (visited.has(original_child.event_id)) {\n return\n }\n visited.add(original_child.event_id)\n\n // Depth-first: cancel grandchildren before parent so\n // _areAllChildrenComplete() returns true when we get back up.\n for (const grandchild of original_child.event_children) {\n const original_grandchild = grandchild._event_original ?? grandchild\n if (!original_grandchild.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(grandchild)\n }\n\n original_child._markCancelled(cancellation_cause)\n\n // Force-complete the child event. In JS we can't stop running async\n // handlers, but _markCompleted() resolves the done() promise so callers\n // aren't blocked waiting for background work to finish. The background\n // handler's eventual _markCompleted/_markError is a no-op (terminal guard).\n if (original_child.event_status !== 'completed') {\n original_child._markCompleted()\n }\n }\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n cancelChildEvent(child)\n }\n }\n\n // Cancel all handler results for an event except the winner, used by first() mode.\n // Cancels pending handlers immediately, aborts started handlers via _signalAbort(),\n // and cancels any child events emitted by the losing handlers.\n _markRemainingFirstModeResultCancelled(winner: EventResult): void {\n const cause = new Error('first() resolved: another handler returned a result first')\n const bus_id = winner.eventbus_id\n\n for (const result of this.event_results.values()) {\n if (result === winner) continue\n if (result.eventbus_id !== bus_id) continue\n\n if (result.status === 'pending') {\n result._markError(\n new EventHandlerCancelledError(`Cancelled: first() resolved`, {\n event_result: result,\n cause,\n })\n )\n } else if (result.status === 'started') {\n // Cancel child events emitted by this handler before aborting it\n for (const child of result.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n original_child._cancelPendingChildProcessing(cause)\n original_child._markCancelled(cause)\n }\n\n // Abort the handler itself\n result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted: first() resolved`, {\n event_result: result,\n cause,\n })\n result._markError(aborted_error)\n result._signalAbort(aborted_error)\n }\n }\n }\n\n // force-abort processing of this event regardless of whether it is pending or has already started\n _markCancelled(cause: Error): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n return\n }\n const path = Array.isArray(original.event_path) ? original.event_path : []\n const buses_to_cancel = new Set<string>(path)\n for (const bus of this.event_bus.all_instances) {\n if (!buses_to_cancel.has(bus.label)) {\n continue\n }\n\n const handler_entries = original._createPendingHandlerResults(bus)\n let updated = false\n for (const entry of handler_entries) {\n if (entry.result.status === 'pending') {\n const cancelled_error = new EventHandlerCancelledError(`Cancelled pending handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(cancelled_error)\n updated = true\n } else if (entry.result.status === 'started') {\n entry.result._lock?.exitHandlerRun()\n const aborted_error = new EventHandlerAbortedError(`Aborted running handler due to parent error: ${cause.message}`, {\n event_result: entry.result,\n cause,\n })\n entry.result._markError(aborted_error)\n entry.result._signalAbort(aborted_error)\n updated = true\n }\n }\n\n const removed = bus.removeEventFromPendingQueue(original)\n\n if (removed > 0 && !bus.isEventInFlightOrQueued(original.event_id)) {\n original.event_pending_bus_count = Math.max(0, original.event_pending_bus_count - 1)\n }\n\n if (updated || removed > 0) {\n original._markCompleted(false)\n }\n }\n\n if (original.event_status !== 'completed') {\n original._markCompleted()\n }\n }\n\n _notifyEventParentsOfCompletion(): void {\n const original = this._event_original ?? this\n if (!this.event_bus) {\n return\n }\n const visited = new Set<string>()\n let parent_id = original.event_parent_id\n while (parent_id && !visited.has(parent_id)) {\n visited.add(parent_id)\n const parent = this.event_bus.findEventById(parent_id)\n if (!parent) {\n break\n }\n parent._markCompleted(false, false)\n if (parent.event_status !== 'completed') {\n break\n }\n parent_id = parent.event_parent_id\n }\n }\n\n // awaitable that triggers immediate (queue-jump) processing of the event on all buses where it is queued\n // use eventCompleted() to wait for normal queue-order completion without queue-jumping.\n done(options: EventDoneOptions = {}): Promise<this> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n const raise_if_any = options.raise_if_any ?? true\n const completion_promise =\n this.event_status === 'completed' ? Promise.resolve(original as this) : this.event_bus._processEventImmediately(this)\n\n if (!raise_if_any) {\n return completion_promise\n }\n\n // Always delegate to _processEventImmediately \u2014 it walks up the parent event tree\n // to determine whether we're inside a handler (works cross-bus). If no\n // ancestor handler is in-flight, it falls back to eventCompleted().\n return completion_promise.then((completed_event) => {\n const first_error = completed_event._firstProcessingError()\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n return completed_event\n })\n }\n\n // returns the first non-undefined handler result value, cancelling remaining handlers\n // when any handler completes. Works with all event_handler_concurrency modes:\n // parallel: races all handlers, returns first non-undefined, aborts the rest\n // serial: runs handlers sequentially, returns first non-undefined, skips remaining\n first(): Promise<EventResultType<this> | undefined> {\n if (!this.event_bus) {\n return Promise.reject(new Error('event has no bus attached'))\n }\n const original = this._event_original ?? this\n original.event_handler_completion = 'first'\n return this.done({ raise_if_any: false }).then((completed_event) => {\n const first_error = completed_event._firstProcessingError({ ignore_first_mode_control_errors: true })\n if (first_error !== undefined) {\n if (first_error instanceof Error) {\n throw first_error\n }\n throw new Error(String(first_error))\n }\n const orig = completed_event._event_original ?? completed_event\n return Array.from(orig.event_results.values())\n .filter(\n (result) =>\n result.status === 'completed' && result.result !== undefined && result.result !== null && !(result.result instanceof BaseEvent)\n )\n .sort((a, b) => compareIsoDatetime(a.completed_at, b.completed_at))\n .map((result) => result.result as EventResultType<this>)\n .at(0)\n })\n }\n\n // returns handler result values in event_results insertion order.\n // equivalent to await event.done(); Array.from(event.event_results.values()).map((entry) => entry.result)\n eventResultsList(\n include: EventResultsListInclude<this>,\n options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>>\n eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>\n async eventResultsList(\n include_or_options?: EventResultsListInclude<this> | EventResultsListOptions<this>,\n maybe_options?: EventResultsListOptions<this>\n ): Promise<Array<EventResultType<this> | undefined>> {\n const default_include: EventResultsListInclude<this> = (_result, event_result) =>\n event_result.status === 'completed' &&\n event_result.result !== undefined &&\n event_result.result !== null &&\n !(event_result.result instanceof Error) &&\n !(event_result.result instanceof BaseEvent) &&\n event_result.error === undefined\n\n let options: EventResultsListOptions<this>\n let include: EventResultsListInclude<this>\n if (typeof include_or_options === 'function') {\n options = maybe_options ?? {}\n include = include_or_options\n } else {\n options = include_or_options ?? {}\n include = options.include ?? default_include\n }\n const raise_if_any = options.raise_if_any ?? true\n const raise_if_none = options.raise_if_none ?? true\n\n const original = this._event_original ?? this\n const resolved_timeout_seconds = options.timeout ?? original.event_timeout ?? this.event_bus?.event_timeout ?? null\n let completed_event: this\n\n if (resolved_timeout_seconds === null) {\n completed_event = await this.done({ raise_if_any: false })\n } else {\n completed_event = await _runWithTimeout(\n resolved_timeout_seconds,\n () => new Error(`Timed out waiting for ${original.event_type} results after ${resolved_timeout_seconds}s`),\n () => this.done({ raise_if_any: false })\n )\n }\n\n const all_results: EventResult<this>[] = Array.from(completed_event.event_results.values())\n const error_results = all_results.filter((event_result) => event_result.error !== undefined || event_result.result instanceof Error)\n\n if (raise_if_any && error_results.length > 0) {\n if (error_results.length === 1) {\n const first_error = error_results[0]\n if (first_error.error instanceof Error) {\n throw first_error.error\n }\n if (first_error.result instanceof Error) {\n throw first_error.result\n }\n throw new Error(String(first_error.error ?? first_error.result))\n }\n\n const errors = error_results.map((event_result) => {\n if (event_result.error instanceof Error) {\n return event_result.error\n }\n if (event_result.result instanceof Error) {\n return event_result.result\n }\n return new Error(String(event_result.error ?? event_result.result))\n })\n throw new AggregateError(\n errors,\n `Event ${completed_event.event_type}#${completed_event.event_id.slice(-4)} had ${errors.length} handler error(s)`\n )\n }\n\n const included_results = all_results.filter((event_result) => include(event_result.result, event_result))\n if (raise_if_none && included_results.length === 0) {\n throw new Error(\n `Expected at least one handler to return a non-null result, but none did: ${completed_event.event_type}#${completed_event.event_id.slice(-4)}`\n )\n }\n\n return included_results.map((event_result) => event_result.result)\n }\n\n // awaitable that waits for the event to be processed in normal queue order by the _runloop\n eventCompleted(): Promise<this> {\n const original = this._event_original ?? this\n original._markBlocksParentCompletionIfAwaitedFromEmittingHandler()\n if (this.event_status === 'completed') {\n return Promise.resolve(this)\n }\n this._notifyDoneListeners()\n return this._event_completed_signal!.promise\n }\n\n _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void {\n const original = this._event_original ?? this\n if (original.event_blocks_parent_completion || !original.event_bus) {\n return\n }\n const active_result = original.event_bus.locks._getActiveHandlerResultForCurrentAsyncContext()\n if (!active_result || active_result.status !== 'started') {\n return\n }\n const active_parent = active_result.event._event_original ?? active_result.event\n const is_child_of_active_handler =\n original.event_parent_id === active_parent.event_id &&\n original.event_emitted_by_handler_id === active_result.handler_id &&\n active_result.event_children.some((child) => (child._event_original ?? child).event_id === original.event_id)\n if (is_child_of_active_handler) {\n original.event_blocks_parent_completion = true\n }\n }\n\n _markPending(): this {\n const original = this._event_original ?? this\n original.event_status = 'pending'\n original.event_started_at = null\n original.event_completed_at = null\n original.event_results.clear()\n original.event_pending_bus_count = 0\n original._setDispatchContext(undefined)\n original._event_completed_signal = null\n original._lock_for_event_handler = null\n original.event_bus = undefined\n return this\n }\n\n eventReset(): this {\n const original = this._event_original ?? this\n const ctor = original.constructor as typeof BaseEvent\n const fresh_event = ctor.fromJSON(original.toJSON()) as this\n fresh_event.event_id = uuidv7()\n return fresh_event._markPending()\n }\n\n _markStarted(started_at: string | null = null, notify_hook: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status !== 'pending') {\n return\n }\n original.event_status = 'started'\n original.event_started_at = started_at === null ? monotonicDatetime() : monotonicDatetime(started_at)\n if (notify_hook && original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'started')\n }\n }\n\n _markCompleted(force: boolean = true, notify_parents: boolean = true): void {\n const original = this._event_original ?? this\n if (original.event_status === 'completed') {\n return\n }\n if (!force) {\n if (original.event_pending_bus_count > 0) {\n return\n }\n if (!original._areAllChildrenComplete()) {\n return\n }\n }\n original.event_status = 'completed'\n original.event_completed_at = monotonicDatetime()\n if (original.event_bus) {\n const bus_for_hook = original.event_bus\n const event_for_bus = bus_for_hook._getEventProxyScopedToThisBus(original)\n void bus_for_hook.onEventChange(event_for_bus, 'completed')\n }\n original._setDispatchContext(null)\n original._notifyDoneListeners()\n original._event_completed_signal!.resolve(original)\n original._event_completed_signal = null\n original.dropFromZeroHistoryBuses()\n if (notify_parents && original.event_bus) {\n original._notifyEventParentsOfCompletion()\n }\n }\n\n private dropFromZeroHistoryBuses(): void {\n if (!this.event_bus) {\n return\n }\n const original = this._event_original ?? this\n for (const bus of this.event_bus.all_instances) {\n if (bus.event_history.max_history_size !== 0) {\n continue\n }\n bus.removeEventFromHistory(original.event_id)\n }\n }\n\n get event_errors(): unknown[] {\n return (\n Array.from(this.event_results.values())\n // filter for events that have completed + have non-undefined error values\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n // sort by completion time\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n // assemble array of flat error values\n .map((event_result) => event_result.error)\n )\n }\n\n private _isFirstModeControlError(error: unknown): boolean {\n if (!(error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError)) {\n return false\n }\n if (error.message.includes('first() resolved')) {\n return true\n }\n return error.cause instanceof Error && error.cause.message.includes('first() resolved')\n }\n\n _firstProcessingError(options: { ignore_first_mode_control_errors?: boolean } = {}): unknown | undefined {\n const ignore_first_mode_control_errors = options.ignore_first_mode_control_errors ?? false\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.error !== undefined && event_result.completed_at !== null)\n .filter((event_result) => (ignore_first_mode_control_errors ? !this._isFirstModeControlError(event_result.error) : true))\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.error)\n .at(0)\n }\n\n // Returns the first non-undefined completed handler result, sorted by completion time.\n // Useful after first() or done() to get the winning result value.\n get event_result(): EventResultType<this> | undefined {\n return Array.from(this.event_results.values())\n .filter((event_result) => event_result.completed_at !== null && event_result.result !== undefined)\n .sort((event_result_a, event_result_b) => compareIsoDatetime(event_result_a.completed_at, event_result_b.completed_at))\n .map((event_result) => event_result.result as EventResultType<this>)\n .at(0)\n }\n\n _areAllChildrenComplete(visited: Set<string> = new Set()): boolean {\n const original = this._event_original ?? this\n if (visited.has(original.event_id)) {\n return true\n }\n visited.add(original.event_id)\n\n for (const child of original.event_children) {\n const original_child = child._event_original ?? child\n if (!original_child.event_blocks_parent_completion) {\n continue\n }\n if (original_child.event_status !== 'completed') {\n return false\n }\n if (!original_child._areAllChildrenComplete(visited)) {\n return false\n }\n }\n return true\n }\n\n private _notifyDoneListeners(): void {\n if (this._event_completed_signal) {\n return\n }\n this._event_completed_signal = withResolvers<this>()\n }\n\n // Break internal reference chains so a completed event can be GC'd when\n // Evicted from event_history. Called by EventHistory.trimEventHistory().\n _gc(): void {\n this._event_completed_signal = null\n this._setDispatchContext(null)\n this.event_bus = undefined\n this._lock_for_event_handler = null\n for (const result of this.event_results.values()) {\n result.event_children = []\n }\n this.event_results.clear()\n }\n}\n\nconst hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {\n const event_results = new Map<string, EventResult<TEvent>>()\n if (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": []
7
7
  }
@@ -27,7 +27,7 @@ export declare const BaseEventSchema: z.ZodObject<{
27
27
  }>>;
28
28
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
29
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
30
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
31
31
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
32
32
  "global-serial": "global-serial";
33
33
  "bus-serial": "bus-serial";
@@ -133,7 +133,7 @@ export declare class BaseEvent {
133
133
  }>>;
134
134
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
135
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
136
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
136
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
137
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
138
138
  "global-serial": "global-serial";
139
139
  "bus-serial": "bus-serial";
@@ -27,7 +27,7 @@ export declare const BaseEventSchema: z.ZodObject<{
27
27
  }>>;
28
28
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
29
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
30
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
31
31
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
32
32
  "global-serial": "global-serial";
33
33
  "bus-serial": "bus-serial";
@@ -133,7 +133,7 @@ export declare class BaseEvent {
133
133
  }>>;
134
134
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
135
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
136
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
136
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
137
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
138
138
  "global-serial": "global-serial";
139
139
  "bus-serial": "bus-serial";
@@ -61,7 +61,6 @@ export declare class EventHandler {
61
61
  eventbus_id: string;
62
62
  });
63
63
  get _handler_async(): EventHandlerCallable;
64
- static handlerNameFromCallable(handler: EventHandlerCallable): string;
65
64
  static computeHandlerId(params: {
66
65
  eventbus_id: string;
67
66
  handler_name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abxbus",
3
- "version": "2.4.27",
3
+ "version": "2.4.28",
4
4
  "description": "Event bus library for browsers and ESM Node.js",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/src/BaseEvent.ts CHANGED
@@ -71,7 +71,7 @@ export const BaseEventSchema = z
71
71
  event_status: z.enum(['pending', 'started', 'completed']).optional(),
72
72
  event_started_at: z.string().datetime().nullable().optional(),
73
73
  event_completed_at: z.string().datetime().nullable().optional(),
74
- event_results: z.array(z.unknown()).optional(),
74
+ event_results: z.record(z.string(), z.unknown()).optional(),
75
75
  event_concurrency: z.enum(EVENT_CONCURRENCY_MODES).nullable().optional(),
76
76
  event_handler_concurrency: z.enum(EVENT_HANDLER_CONCURRENCY_MODES).nullable().optional(),
77
77
  event_handler_completion: z.enum(EVENT_HANDLER_COMPLETION_MODES).nullable().optional(),
@@ -379,7 +379,9 @@ export class BaseEvent {
379
379
  if (value === undefined || typeof value === 'function') continue
380
380
  record[key] = value
381
381
  }
382
- const event_results = Array.from(this.event_results.values()).map((result) => result.toJSON())
382
+ const event_results = Object.fromEntries(
383
+ Array.from(this.event_results.entries()).map(([handler_id, result]) => [handler_id, result.toJSON()])
384
+ )
383
385
 
384
386
  return {
385
387
  ...record,
@@ -411,7 +413,7 @@ export class BaseEvent {
411
413
  event_completed_at: this.event_completed_at ?? null,
412
414
 
413
415
  // mutable result state
414
- ...(event_results.length > 0 ? { event_results } : {}),
416
+ ...(Object.keys(event_results).length > 0 ? { event_results } : {}),
415
417
  }
416
418
  }
417
419
 
@@ -1189,13 +1191,19 @@ export class BaseEvent {
1189
1191
 
1190
1192
  const hydrateEventResults = <TEvent extends BaseEvent>(event: TEvent, raw_event_results: unknown): Map<string, EventResult<TEvent>> => {
1191
1193
  const event_results = new Map<string, EventResult<TEvent>>()
1192
- if (!Array.isArray(raw_event_results)) {
1194
+ if (raw_event_results == null) {
1193
1195
  return event_results
1194
1196
  }
1195
- for (const item of raw_event_results) {
1196
- const result = EventResult.fromJSON(event, item)
1197
- const map_key = typeof result.handler_id === 'string' && result.handler_id.length > 0 ? result.handler_id : result.id
1198
- event_results.set(map_key, result)
1197
+ if (typeof raw_event_results !== 'object' || Array.isArray(raw_event_results)) {
1198
+ throw new Error('BaseEvent.event_results must be an object keyed by handler id')
1199
+ }
1200
+ for (const [handler_id, item] of Object.entries(raw_event_results)) {
1201
+ if (item == null || typeof item !== 'object' || Array.isArray(item)) continue
1202
+ const result = EventResult.fromJSON(event, {
1203
+ handler_id,
1204
+ ...(item as Record<string, unknown>),
1205
+ })
1206
+ event_results.set(handler_id, result)
1199
1207
  }
1200
1208
  return event_results
1201
1209
  }
@@ -1,45 +0,0 @@
1
- import { BaseEvent } from './base_event.js';
2
- import { EventBus } from './event_bus.js';
3
- import type { EventClass, EventHandlerCallable, UntypedEventHandlerFunction } from './types.js';
4
- type EndpointScheme = 'unix' | 'http' | 'https';
5
- type ParsedEndpoint = {
6
- raw: string;
7
- scheme: EndpointScheme;
8
- host?: string;
9
- port?: number;
10
- path?: string;
11
- };
12
- export type HTTPEventBridgeOptions = {
13
- send_to?: string | null;
14
- listen_on?: string | null;
15
- name?: string;
16
- };
17
- export declare class EventBridge {
18
- readonly send_to: ParsedEndpoint | null;
19
- readonly listen_on: ParsedEndpoint | null;
20
- readonly name: string;
21
- protected readonly inbound_bus: EventBus;
22
- private start_promise;
23
- private node_server;
24
- constructor(send_to?: string | null, listen_on?: string | null, name?: string);
25
- on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void;
26
- on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void;
27
- emit<T extends BaseEvent>(event: T): Promise<void>;
28
- dispatch<T extends BaseEvent>(event: T): Promise<void>;
29
- start(): Promise<void>;
30
- close(): Promise<void>;
31
- private ensureListenerStarted;
32
- private handleIncomingPayload;
33
- private sendHttp;
34
- private sendUnix;
35
- private startHttpListener;
36
- private startUnixListener;
37
- }
38
- export declare class HTTPEventBridge extends EventBridge {
39
- constructor(send_to?: string | null, listen_on?: string | null, name?: string);
40
- constructor(options?: HTTPEventBridgeOptions);
41
- }
42
- export declare class SocketEventBridge extends EventBridge {
43
- constructor(path?: string | null, name?: string);
44
- }
45
- export {};
@@ -1,49 +0,0 @@
1
- import { trace, type Span, type SpanAttributes, type SpanContext, type TimeInput, type Tracer } from '@opentelemetry/api';
2
- import type { BaseEvent } from './base_event.js';
3
- import type { EventBus } from './event_bus.js';
4
- import type { EventResult } from './event_result.js';
5
- import type { EventBusMiddleware } from './middlewares.js';
6
- import type { EventStatus } from './types.js';
7
- type OpenTelemetryTraceApi = Pick<typeof trace, 'getTracer' | 'setSpan'> & Partial<Pick<typeof trace, 'setSpanContext'>>;
8
- export type OtelTracingSpanFactoryInput = {
9
- name: string;
10
- span_context: SpanContext;
11
- parent_span_context?: SpanContext;
12
- attributes: SpanAttributes;
13
- start_time?: TimeInput;
14
- };
15
- export type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span;
16
- export type OtelTracingSpanProvider = object;
17
- export type OtelTracingMiddlewareOptions = {
18
- tracer?: Tracer;
19
- trace_api?: OpenTelemetryTraceApi;
20
- span_provider?: OtelTracingSpanProvider;
21
- span_factory?: OtelTracingSpanFactory;
22
- otlp_endpoint?: string;
23
- service_name?: string;
24
- instrumentation_name?: string;
25
- root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes);
26
- };
27
- export declare class OtelTracingMiddleware implements EventBusMiddleware {
28
- private readonly tracer;
29
- private readonly trace_api;
30
- private readonly span_factory?;
31
- private readonly span_provider?;
32
- private readonly root_span_attributes;
33
- private readonly event_spans;
34
- private readonly event_contexts;
35
- private readonly handler_spans;
36
- private readonly handler_contexts;
37
- constructor(options?: OtelTracingMiddlewareOptions);
38
- onEventChange(eventbus: EventBus, event: BaseEvent, status: EventStatus): void;
39
- onEventResultChange(eventbus: EventBus, event: BaseEvent, event_result: EventResult, status: EventStatus): void;
40
- private startEventSpan;
41
- private completeEventSpan;
42
- private startHandlerSpan;
43
- private completeHandlerSpan;
44
- private parentContextForEvent;
45
- private completeEventSpanWithFactory;
46
- private exportEventTreeWithFactory;
47
- private exportHandlerSpanWithFactory;
48
- }
49
- export {};
@@ -1,45 +0,0 @@
1
- import { BaseEvent } from './base_event.js';
2
- import { EventBus } from './event_bus.js';
3
- import type { EventClass, EventHandlerCallable, UntypedEventHandlerFunction } from './types.js';
4
- type EndpointScheme = 'unix' | 'http' | 'https';
5
- type ParsedEndpoint = {
6
- raw: string;
7
- scheme: EndpointScheme;
8
- host?: string;
9
- port?: number;
10
- path?: string;
11
- };
12
- export type HTTPEventBridgeOptions = {
13
- send_to?: string | null;
14
- listen_on?: string | null;
15
- name?: string;
16
- };
17
- export declare class EventBridge {
18
- readonly send_to: ParsedEndpoint | null;
19
- readonly listen_on: ParsedEndpoint | null;
20
- readonly name: string;
21
- protected readonly inbound_bus: EventBus;
22
- private start_promise;
23
- private node_server;
24
- constructor(send_to?: string | null, listen_on?: string | null, name?: string);
25
- on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void;
26
- on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void;
27
- emit<T extends BaseEvent>(event: T): Promise<void>;
28
- dispatch<T extends BaseEvent>(event: T): Promise<void>;
29
- start(): Promise<void>;
30
- close(): Promise<void>;
31
- private ensureListenerStarted;
32
- private handleIncomingPayload;
33
- private sendHttp;
34
- private sendUnix;
35
- private startHttpListener;
36
- private startUnixListener;
37
- }
38
- export declare class HTTPEventBridge extends EventBridge {
39
- constructor(send_to?: string | null, listen_on?: string | null, name?: string);
40
- constructor(options?: HTTPEventBridgeOptions);
41
- }
42
- export declare class SocketEventBridge extends EventBridge {
43
- constructor(path?: string | null, name?: string);
44
- }
45
- export {};
@@ -1,49 +0,0 @@
1
- import { trace, type Span, type SpanAttributes, type SpanContext, type TimeInput, type Tracer } from '@opentelemetry/api';
2
- import type { BaseEvent } from './base_event.js';
3
- import type { EventBus } from './event_bus.js';
4
- import type { EventResult } from './event_result.js';
5
- import type { EventBusMiddleware } from './middlewares.js';
6
- import type { EventStatus } from './types.js';
7
- type OpenTelemetryTraceApi = Pick<typeof trace, 'getTracer' | 'setSpan'> & Partial<Pick<typeof trace, 'setSpanContext'>>;
8
- export type OtelTracingSpanFactoryInput = {
9
- name: string;
10
- span_context: SpanContext;
11
- parent_span_context?: SpanContext;
12
- attributes: SpanAttributes;
13
- start_time?: TimeInput;
14
- };
15
- export type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span;
16
- export type OtelTracingSpanProvider = object;
17
- export type OtelTracingMiddlewareOptions = {
18
- tracer?: Tracer;
19
- trace_api?: OpenTelemetryTraceApi;
20
- span_provider?: OtelTracingSpanProvider;
21
- span_factory?: OtelTracingSpanFactory;
22
- otlp_endpoint?: string;
23
- service_name?: string;
24
- instrumentation_name?: string;
25
- root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes);
26
- };
27
- export declare class OtelTracingMiddleware implements EventBusMiddleware {
28
- private readonly tracer;
29
- private readonly trace_api;
30
- private readonly span_factory?;
31
- private readonly span_provider?;
32
- private readonly root_span_attributes;
33
- private readonly event_spans;
34
- private readonly event_contexts;
35
- private readonly handler_spans;
36
- private readonly handler_contexts;
37
- constructor(options?: OtelTracingMiddlewareOptions);
38
- onEventChange(eventbus: EventBus, event: BaseEvent, status: EventStatus): void;
39
- onEventResultChange(eventbus: EventBus, event: BaseEvent, event_result: EventResult, status: EventStatus): void;
40
- private startEventSpan;
41
- private completeEventSpan;
42
- private startHandlerSpan;
43
- private completeHandlerSpan;
44
- private parentContextForEvent;
45
- private completeEventSpanWithFactory;
46
- private exportEventTreeWithFactory;
47
- private exportHandlerSpanWithFactory;
48
- }
49
- export {};