abxbus 2.4.32 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +74 -51
  2. package/dist/cjs/BaseEvent.d.ts +45 -55
  3. package/dist/cjs/BaseEvent.js +350 -169
  4. package/dist/cjs/BaseEvent.js.map +3 -3
  5. package/dist/cjs/EventBus.d.ts +8 -1
  6. package/dist/cjs/EventBus.js +153 -85
  7. package/dist/cjs/EventBus.js.map +2 -2
  8. package/dist/cjs/EventHandler.d.ts +3 -3
  9. package/dist/cjs/EventHandler.js.map +1 -1
  10. package/dist/cjs/EventResult.js +16 -22
  11. package/dist/cjs/EventResult.js.map +2 -2
  12. package/dist/cjs/LockManager.d.ts +1 -0
  13. package/dist/cjs/LockManager.js +4 -1
  14. package/dist/cjs/LockManager.js.map +2 -2
  15. package/dist/cjs/base_event.d.ts +2 -2
  16. package/dist/cjs/bridge_ipc.d.ts +45 -0
  17. package/dist/cjs/event_handler.d.ts +1 -0
  18. package/dist/cjs/events_suck.js +1 -1
  19. package/dist/cjs/events_suck.js.map +2 -2
  20. package/dist/cjs/index.d.ts +1 -0
  21. package/dist/cjs/index.js.map +2 -2
  22. package/dist/cjs/middleware_otel_tracing.d.ts +49 -0
  23. package/dist/cjs/timing.js +1 -1
  24. package/dist/cjs/timing.js.map +2 -2
  25. package/dist/esm/BaseEvent.js +351 -170
  26. package/dist/esm/BaseEvent.js.map +3 -3
  27. package/dist/esm/EventBus.js +153 -85
  28. package/dist/esm/EventBus.js.map +2 -2
  29. package/dist/esm/EventHandler.js.map +1 -1
  30. package/dist/esm/EventResult.js +16 -22
  31. package/dist/esm/EventResult.js.map +2 -2
  32. package/dist/esm/LockManager.js +4 -1
  33. package/dist/esm/LockManager.js.map +2 -2
  34. package/dist/esm/events_suck.js +1 -1
  35. package/dist/esm/events_suck.js.map +2 -2
  36. package/dist/esm/index.js.map +2 -2
  37. package/dist/esm/timing.js +1 -1
  38. package/dist/esm/timing.js.map +2 -2
  39. package/dist/types/BaseEvent.d.ts +45 -55
  40. package/dist/types/EventBus.d.ts +8 -1
  41. package/dist/types/EventHandler.d.ts +3 -3
  42. package/dist/types/LockManager.d.ts +1 -0
  43. package/dist/types/base_event.d.ts +2 -2
  44. package/dist/types/bridge_ipc.d.ts +45 -0
  45. package/dist/types/event_handler.d.ts +1 -0
  46. package/dist/types/index.d.ts +1 -0
  47. package/dist/types/middleware_otel_tracing.d.ts +49 -0
  48. package/package.json +4 -3
  49. package/src/BaseEvent.ts +452 -219
  50. package/src/EventBus.ts +186 -99
  51. package/src/EventHandler.ts +3 -3
  52. package/src/EventResult.ts +18 -22
  53. package/src/LockManager.ts +5 -1
  54. package/src/events_suck.ts +1 -1
  55. package/src/index.ts +1 -0
  56. package/src/timing.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/EventResult.ts"],
4
- "sourcesContent": ["import { v7 as uuidv7 } from 'uuid'\n\nimport { z } from 'zod'\n\nimport { BaseEvent } from './BaseEvent.js'\nimport type { EventBus } from './EventBus.js'\nimport { EventHandler, EventHandlerCancelledError, EventHandlerResultSchemaError, EventHandlerTimeoutError } from './EventHandler.js'\nimport { withResolvers, type HandlerLock } from './LockManager.js'\nimport type { Deferred } from './LockManager.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { isZodSchema } from './types.js'\nimport { _runWithAsyncContext } from './async_context.js'\nimport { RetryTimeoutError } from './retry.js'\nimport { _runWithAbortMonitor, _runWithSlowMonitor, _runWithTimeout } from './timing.js'\nimport { monotonicDatetime } from './helpers.js'\n\n// More precise than event.event_status, includes separate 'error' state for handlers that throw errors during execution\nexport type EventResultStatus = 'pending' | 'started' | 'completed' | 'error'\n\nexport const EventResultJSONSchema = z\n .object({\n id: z.string(),\n status: z.enum(['pending', 'started', 'completed', 'error']),\n event_id: z.string(),\n handler_id: z.string(),\n handler_name: z.string(),\n handler_file_path: z.string().nullable().optional(),\n handler_timeout: z.number().nullable().optional(),\n handler_slow_timeout: z.number().nullable().optional(),\n handler_registered_at: z.string().datetime().optional(),\n handler_event_pattern: z.union([z.string(), z.literal('*')]).optional(),\n eventbus_name: z.string(),\n eventbus_id: z.string().uuid(),\n started_at: z.string().datetime().nullable().optional(),\n completed_at: z.string().datetime().nullable().optional(),\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n event_children: z.array(z.string()),\n })\n .strict()\n\nexport type EventResultJSON = z.infer<typeof EventResultJSONSchema>\n\n// Object that tracks the pending or completed execution of a single event handler\nexport class EventResult<TEvent extends BaseEvent = BaseEvent> {\n id: string // unique uuidv7 identifier for the event result\n status: EventResultStatus // 'pending', 'started', 'completed', or 'error'\n event: TEvent // the Event that the handler is processing\n handler: EventHandler // the EventHandler object that going to process the event\n started_at: string | null\n completed_at: string | null\n result?: EventResultType<TEvent> // parsed return value from the event handler\n error?: unknown // error object thrown by the event handler, or null if the handler completed successfully\n event_children: BaseEvent[] // list of emitted child events\n\n // Abort signal: created when handler starts, rejected by _signalAbort() to\n // interrupt runHandler's await via Promise.race.\n _abort: Deferred<never> | null\n // Handler lock: tracks ownership of the handler concurrency lock\n // during handler execution. Set by runHandler(), used by\n // _processEventImmediately for yield-and-reacquire during queue-jumps.\n _lock: HandlerLock | null\n // Runloop pause releases keyed by bus for queue-jump; released when handler exits.\n _queue_jump_pause_releases: Map<EventBus, () => void> | null\n\n constructor(params: { event: TEvent; handler: EventHandler }) {\n this.id = uuidv7()\n this.status = 'pending'\n this.event = params.event\n this.handler = params.handler\n this.started_at = null\n this.completed_at = null\n this.result = undefined\n this.error = undefined\n this.event_children = []\n this._abort = null\n this._lock = null\n this._queue_jump_pause_releases = null\n }\n\n toString(): string {\n return `${this.result ?? 'null'} (${this.status})`\n }\n\n get event_id(): string {\n return this.event.event_id\n }\n\n get bus(): EventBus {\n const original_event = this.event._event_original ?? this.event\n const dispatch_bus = original_event.event_bus ?? this.event.event_bus!\n return dispatch_bus.all_instances.findBusById(this.handler.eventbus_id) ?? dispatch_bus\n }\n\n get handler_id(): string {\n return this.handler.id\n }\n\n get handler_name(): string {\n return this.handler.handler_name\n }\n\n get handler_file_path(): string | null {\n return this.handler.handler_file_path\n }\n\n get eventbus_name(): string {\n return this.handler.eventbus_name\n }\n\n get eventbus_id(): string {\n return this.handler.eventbus_id\n }\n\n get eventbus_label(): string {\n return `${this.handler.eventbus_name}#${this.handler.eventbus_id.slice(-4)}`\n }\n\n private getHookBus(): EventBus | undefined {\n const root_bus = this.event.event_bus\n if (!root_bus) {\n return undefined\n }\n return root_bus.all_instances.findBusById(this.eventbus_id) ?? root_bus\n }\n\n private async _notifyStatusHook(status: 'started' | 'completed'): Promise<void> {\n const hook_bus = this.getHookBus()\n if (!hook_bus) {\n return\n }\n const event_for_hook = hook_bus._getEventProxyScopedToThisBus(this.event._event_original ?? this.event, this)\n await hook_bus.onEventResultChange(event_for_hook, this, status)\n }\n\n // shortcut for the result value so users can do event_result.value instead of event_result.result\n get value(): EventResultType<TEvent> | undefined {\n return this.result\n }\n\n // Per-result schema reference derives from the parent event schema.\n // It is intentionally not serialized with each EventResult to avoid duplication.\n get result_type(): TEvent['event_result_type'] {\n const original_event = this.event._event_original ?? this.event\n return original_event.event_result_type as TEvent['event_result_type']\n }\n\n // Link a child event emitted by this handler run to the parent event/result.\n _linkEmittedChildEvent(child_event: BaseEvent): void {\n const original_child = child_event._event_original ?? child_event\n const parent_event = this.event._event_original ?? this.event\n if (original_child.event_id === parent_event.event_id) {\n return\n }\n if (!original_child.event_parent_id) {\n original_child.event_parent_id = parent_event.event_id\n }\n if (!original_child.event_emitted_by_handler_id) {\n original_child.event_emitted_by_handler_id = this.handler_id\n }\n if (!this.event_children.some((child) => child.event_id === original_child.event_id)) {\n this.event_children.push(original_child)\n }\n }\n\n // Get the raw return value from the handler, even if it threw an error / failed validation\n get raw_value(): EventResultType<TEvent> | undefined {\n if (this.error && (this.error as any).raw_value !== undefined) {\n return (this.error as any).raw_value\n }\n return this.result\n }\n\n // Resolve handler timeout in seconds using precedence: handler -> event -> bus defaults.\n get handler_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n const resolved_event_timeout = original.event_timeout ?? this.bus.event_timeout\n\n let resolved_handler_timeout: number | null\n if (this.handler.handler_timeout !== undefined) {\n resolved_handler_timeout = this.handler.handler_timeout\n } else if (original.event_handler_timeout !== undefined) {\n resolved_handler_timeout = original.event_handler_timeout\n } else {\n resolved_handler_timeout = this.bus.event_timeout\n }\n\n if (resolved_handler_timeout === null && resolved_event_timeout === null) {\n return null\n }\n if (resolved_handler_timeout === null) {\n return resolved_event_timeout\n }\n if (resolved_event_timeout === null) {\n return resolved_handler_timeout\n }\n return Math.min(resolved_handler_timeout, resolved_event_timeout)\n }\n\n // Resolve slow handler warning threshold in seconds using precedence: handler -> event -> bus defaults.\n get handler_slow_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n\n if (this.handler.handler_slow_timeout !== undefined) {\n return this.handler.handler_slow_timeout\n }\n if (original.event_handler_slow_timeout !== undefined) {\n return original.event_handler_slow_timeout\n }\n const event_slow_timeout = (original as { event_slow_timeout?: number | null }).event_slow_timeout\n if (event_slow_timeout !== undefined) {\n return event_slow_timeout\n }\n if (this.bus?.event_handler_slow_timeout !== undefined) {\n return this.bus.event_handler_slow_timeout\n }\n return this.bus?.event_slow_timeout ?? null\n }\n\n // Create a slow-handler warning timer that logs if the handler runs too long.\n _createSlowHandlerWarningTimer(effective_timeout: number | null): ReturnType<typeof setTimeout> | null {\n const handler_warn_timeout = this.handler_slow_timeout\n const warn_ms = handler_warn_timeout === null ? null : handler_warn_timeout * 1000\n const should_warn = warn_ms !== null && (effective_timeout === null || effective_timeout * 1000 > warn_ms)\n if (!should_warn || warn_ms === null) {\n return null\n }\n const event = this.event._event_original ?? this.event\n const bus_name = this.handler.eventbus_name\n const started_at_ms = performance.now()\n return setTimeout(() => {\n if (this.status !== 'started') {\n return\n }\n const elapsed_ms = performance.now() - started_at_ms\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(1)\n console.warn(\n `[abxbus] Slow event handler: ${bus_name}.on(${event.toString()}, ${this.handler.toString()}) still running after ${elapsed_seconds}s`\n )\n }, warn_ms)\n }\n\n _ensureQueueJumpPause(bus: EventBus): void {\n if (!this._queue_jump_pause_releases) {\n this._queue_jump_pause_releases = new Map()\n }\n if (this._queue_jump_pause_releases.has(bus)) {\n return\n }\n this._queue_jump_pause_releases.set(bus, bus.locks._requestRunloopPause())\n }\n\n _releaseQueueJumpPauses(): void {\n if (!this._queue_jump_pause_releases) {\n return\n }\n for (const release of this._queue_jump_pause_releases.values()) {\n release()\n }\n this._queue_jump_pause_releases.clear()\n }\n\n update(params: { status?: EventResultStatus; result?: EventResultType<TEvent> | BaseEvent | undefined; error?: unknown }): this {\n const has_status = 'status' in params\n const has_result = 'result' in params\n const has_error = 'error' in params\n\n if (has_result) {\n const raw_result = params.result\n this.status = 'completed'\n if (\n this.event.event_result_type &&\n raw_result !== undefined &&\n !(raw_result instanceof BaseEvent) &&\n isZodSchema(this.event.event_result_type)\n ) {\n const parsed = this.event.event_result_type.safeParse(raw_result)\n if (parsed.success) {\n this.result = parsed.data as EventResultType<TEvent>\n } else {\n const error = new EventHandlerResultSchemaError(\n `Event handler return value ${JSON.stringify(raw_result).slice(0, 20)}... did not match event_result_type: ${parsed.error.message}`,\n { event_result: this, cause: parsed.error, raw_value: raw_result }\n )\n this.error = error\n this.result = undefined\n this.status = 'error'\n }\n } else {\n this.result = raw_result as EventResultType<TEvent> | undefined\n }\n }\n\n if (has_error) {\n this.error = params.error\n this.status = 'error'\n }\n\n if (has_status && params.status !== undefined) {\n this.status = params.status\n }\n\n if (this.status !== 'pending' && this.started_at === null) {\n this.started_at = monotonicDatetime()\n }\n if ((this.status === 'completed' || this.status === 'error') && this.completed_at === null) {\n this.completed_at = monotonicDatetime()\n }\n\n return this\n }\n\n private _createHandlerTimeoutError(event: BaseEvent): EventHandlerTimeoutError {\n return new EventHandlerTimeoutError(\n `${this.bus.toString()}.on(${event.toString()}, ${this.handler.toString()}) timed out after ${this.handler_timeout}s`,\n {\n event_result: this,\n timeout_seconds: this.handler_timeout,\n }\n )\n }\n\n private _handleHandlerError(event: BaseEvent, error: unknown): void {\n const normalized_error =\n error instanceof RetryTimeoutError\n ? new EventHandlerTimeoutError(error.message, { event_result: this, timeout_seconds: error.timeout_seconds, cause: error })\n : error\n if (normalized_error instanceof EventHandlerTimeoutError) {\n this._markError(normalized_error, false)\n event._cancelPendingChildProcessing(normalized_error)\n } else {\n this._markError(normalized_error, false)\n }\n }\n\n private _onHandlerExit(slow_handler_warning_timer: ReturnType<typeof setTimeout> | null): void {\n this._abort = null\n this._lock = null\n this._releaseQueueJumpPauses()\n if (slow_handler_warning_timer) {\n clearTimeout(slow_handler_warning_timer)\n }\n }\n\n // Run one handler invocation with timeout/slow-monitor/error handling.\n // Handler lock acquisition is owned by BaseEvent._runHandlers(...).\n async runHandler(handler_lock: HandlerLock | null): Promise<void> {\n if (this.status === 'error' && this.error instanceof EventHandlerCancelledError) {\n return\n }\n\n const event = this.event._event_original ?? this.event\n const handler_event = this.bus._getEventProxyScopedToThisBus(event, this)\n if (this._lock) {\n this._lock.exitHandlerRun()\n }\n\n let slow_handler_warning_timer: ReturnType<typeof setTimeout> | null = null\n // if the result is already in an error or completed state, exit early\n if (this.status === 'error' || this.status === 'completed') {\n return\n }\n\n this._lock = handler_lock\n await this.bus.locks._runWithHandlerDispatchContext(this, async () => {\n await _runWithAsyncContext(event._getDispatchContext() ?? null, async () => {\n try {\n const should_notify_started = this.status === 'pending'\n const abort_signal = this._markStarted(false)\n if (should_notify_started) {\n await this._notifyStatusHook('started')\n }\n slow_handler_warning_timer = this._createSlowHandlerWarningTimer(this.handler_timeout)\n const handler_result = await _runWithTimeout(\n this.handler_timeout,\n () => this._createHandlerTimeoutError(event),\n () =>\n _runWithSlowMonitor(slow_handler_warning_timer, () =>\n _runWithAbortMonitor(() => this.handler._handler_async(handler_event), abort_signal)\n )\n )\n this._markCompleted(handler_result as EventResultType<TEvent> | BaseEvent | undefined, false)\n } catch (error) {\n this._handleHandlerError(event, error)\n } finally {\n if (this.status === 'completed' || this.status === 'error') {\n await this._notifyStatusHook('completed')\n }\n this._onHandlerExit(slow_handler_warning_timer)\n }\n })\n })\n }\n\n // Reject the abort promise, causing runHandler's Promise.race to\n // throw immediately \u2014 even if the handler has no timeout.\n _signalAbort(error: Error): void {\n if (this._abort) {\n this._abort.reject(error)\n this._abort = null\n }\n }\n\n // Mark started and return the abort promise for Promise.race.\n _markStarted(notify_hook: boolean = true): Promise<never> {\n if (!this._abort) {\n this._abort = withResolvers<never>()\n }\n if (this.status === 'pending') {\n this.update({ status: 'started' })\n if (notify_hook) {\n void this._notifyStatusHook('started')\n }\n }\n return this._abort.promise\n }\n\n _markCompleted(result: EventResultType<TEvent> | BaseEvent | undefined, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ result })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n _markError(error: unknown, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ error })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n toJSON(): EventResultJSON {\n return {\n id: this.id,\n status: this.status,\n event_id: this.event.event_id,\n handler_id: this.handler_id,\n handler_name: this.handler_name,\n handler_file_path: this.handler_file_path,\n handler_timeout: this.handler.handler_timeout,\n handler_slow_timeout: this.handler.handler_slow_timeout,\n handler_registered_at: this.handler.handler_registered_at,\n handler_event_pattern: this.handler.event_pattern,\n eventbus_name: this.eventbus_name,\n eventbus_id: this.eventbus_id,\n started_at: this.started_at,\n completed_at: this.completed_at,\n result: this.result,\n error: this.error,\n event_children: this.event_children.map((child) => child.event_id),\n }\n }\n\n static fromJSON<TEvent extends BaseEvent>(event: TEvent, data: unknown): EventResult<TEvent> {\n const record = EventResultJSONSchema.parse(data)\n const handler_record = {\n id: record.handler_id,\n eventbus_name: record.eventbus_name,\n eventbus_id: record.eventbus_id,\n event_pattern: record.handler_event_pattern ?? event.event_type,\n handler_name: record.handler_name,\n handler_file_path: record.handler_file_path ?? null,\n handler_timeout: record.handler_timeout,\n handler_slow_timeout: record.handler_slow_timeout,\n handler_registered_at: record.handler_registered_at ?? event.event_created_at,\n } as const\n const handler_stub = EventHandler.fromJSON(handler_record, (() => undefined) as EventHandlerCallable)\n\n const result = new EventResult<TEvent>({ event, handler: handler_stub })\n result.id = record.id\n result.status = record.status\n result.started_at = record.started_at === null || record.started_at === undefined ? null : monotonicDatetime(record.started_at)\n result.completed_at = record.completed_at === null || record.completed_at === undefined ? null : monotonicDatetime(record.completed_at)\n if ('result' in record) {\n result.result = record.result as EventResultType<TEvent>\n }\n if ('error' in record) {\n result.error = record.error\n }\n result.event_children = []\n return result\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { v7 as uuidv7 } from 'uuid'\n\nimport { z } from 'zod'\n\nimport { BaseEvent } from './BaseEvent.js'\nimport type { EventBus } from './EventBus.js'\nimport { EventHandler, EventHandlerCancelledError, EventHandlerResultSchemaError, EventHandlerTimeoutError } from './EventHandler.js'\nimport { withResolvers, type HandlerLock } from './LockManager.js'\nimport type { Deferred } from './LockManager.js'\nimport type { EventHandlerCallable, EventResultType } from './types.js'\nimport { isZodSchema } from './types.js'\nimport { _runWithAsyncContext } from './async_context.js'\nimport { RetryTimeoutError } from './retry.js'\nimport { _runWithAbortMonitor, _runWithSlowMonitor, _runWithTimeout } from './timing.js'\nimport { monotonicDatetime } from './helpers.js'\n\n// More precise than event.event_status, includes separate 'error' state for handlers that throw errors during execution\nexport type EventResultStatus = 'pending' | 'started' | 'completed' | 'error'\n\nexport const EventResultJSONSchema = z\n .object({\n id: z.string(),\n status: z.enum(['pending', 'started', 'completed', 'error']),\n event_id: z.string(),\n handler_id: z.string(),\n handler_name: z.string(),\n handler_file_path: z.string().nullable().optional(),\n handler_timeout: z.number().nonnegative().nullable().optional(),\n handler_slow_timeout: z.number().nonnegative().nullable().optional(),\n handler_registered_at: z.string().datetime().optional(),\n handler_event_pattern: z.union([z.string(), z.literal('*')]).optional(),\n eventbus_name: z.string(),\n eventbus_id: z.string().uuid(),\n started_at: z.string().datetime().nullable().optional(),\n completed_at: z.string().datetime().nullable().optional(),\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n event_children: z.array(z.string()),\n })\n .strict()\n\nexport type EventResultJSON = z.infer<typeof EventResultJSONSchema>\n\n// Object that tracks the pending or completed execution of a single event handler\nexport class EventResult<TEvent extends BaseEvent = BaseEvent> {\n id: string // unique uuidv7 identifier for the event result\n status: EventResultStatus // 'pending', 'started', 'completed', or 'error'\n event: TEvent // the Event that the handler is processing\n handler: EventHandler // the EventHandler object that going to process the event\n started_at: string | null\n completed_at: string | null\n result?: EventResultType<TEvent> // parsed return value from the event handler\n error?: unknown // error object thrown by the event handler, or null if the handler completed successfully\n event_children: BaseEvent[] // list of emitted child events\n\n // Abort signal: created when handler starts, rejected by _signalAbort() to\n // interrupt runHandler's await via Promise.race.\n _abort: Deferred<never> | null\n // Handler lock: tracks ownership of the handler concurrency lock\n // during handler execution. Set by runHandler(), used by\n // _processEventImmediately for yield-and-reacquire during queue-jumps.\n _lock: HandlerLock | null\n // Runloop pause releases keyed by bus for queue-jump; released when handler exits.\n _queue_jump_pause_releases: Map<EventBus, () => void> | null\n\n constructor(params: { event: TEvent; handler: EventHandler }) {\n this.id = uuidv7()\n this.status = 'pending'\n this.event = params.event\n this.handler = params.handler\n this.started_at = null\n this.completed_at = null\n this.result = undefined\n this.error = undefined\n this.event_children = []\n this._abort = null\n this._lock = null\n this._queue_jump_pause_releases = null\n }\n\n toString(): string {\n return `${this.result ?? 'null'} (${this.status})`\n }\n\n get event_id(): string {\n return this.event.event_id\n }\n\n get bus(): EventBus {\n const original_event = this.event._event_original ?? this.event\n const dispatch_bus = original_event.event_bus ?? this.event.event_bus!\n return dispatch_bus.all_instances.findBusById(this.handler.eventbus_id) ?? dispatch_bus\n }\n\n get handler_id(): string {\n return this.handler.id\n }\n\n get handler_name(): string {\n return this.handler.handler_name\n }\n\n get handler_file_path(): string | null {\n return this.handler.handler_file_path\n }\n\n get eventbus_name(): string {\n return this.handler.eventbus_name\n }\n\n get eventbus_id(): string {\n return this.handler.eventbus_id\n }\n\n get eventbus_label(): string {\n return `${this.handler.eventbus_name}#${this.handler.eventbus_id.slice(-4)}`\n }\n\n private getHookBus(): EventBus | undefined {\n const root_bus = this.event.event_bus\n if (!root_bus) {\n return undefined\n }\n return root_bus.all_instances.findBusById(this.eventbus_id) ?? root_bus\n }\n\n private async _notifyStatusHook(status: 'started' | 'completed'): Promise<void> {\n const hook_bus = this.getHookBus()\n if (!hook_bus) {\n return\n }\n const event_for_hook = hook_bus._getEventProxyScopedToThisBus(this.event._event_original ?? this.event, this)\n await hook_bus.onEventResultChange(event_for_hook, this, status)\n }\n\n // shortcut for the result value so users can do event_result.value instead of event_result.result\n get value(): EventResultType<TEvent> | undefined {\n return this.result\n }\n\n // Per-result schema reference derives from the parent event schema.\n // It is intentionally not serialized with each EventResult to avoid duplication.\n get result_type(): TEvent['event_result_type'] {\n const original_event = this.event._event_original ?? this.event\n return original_event.event_result_type as TEvent['event_result_type']\n }\n\n // Link a child event emitted by this handler run to the parent event/result.\n _linkEmittedChildEvent(child_event: BaseEvent): void {\n const original_child = child_event._event_original ?? child_event\n const parent_event = this.event._event_original ?? this.event\n if (original_child.event_id === parent_event.event_id) {\n return\n }\n if (!original_child.event_parent_id) {\n original_child.event_parent_id = parent_event.event_id\n }\n if (!original_child.event_emitted_by_handler_id) {\n original_child.event_emitted_by_handler_id = this.handler_id\n }\n if (!this.event_children.some((child) => child.event_id === original_child.event_id)) {\n this.event_children.push(original_child)\n }\n }\n\n // Get the raw return value from the handler, even if it threw an error / failed validation\n get raw_value(): EventResultType<TEvent> | undefined {\n if (this.error && (this.error as any).raw_value !== undefined) {\n return (this.error as any).raw_value\n }\n return this.result\n }\n\n // Resolve handler timeout in seconds using event-local values plus the executing bus defaults.\n get handler_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n const raw_event_timeout = original.event_timeout ?? this.bus.event_timeout\n const resolved_event_timeout =\n raw_event_timeout !== null && raw_event_timeout !== undefined && raw_event_timeout > 0 ? raw_event_timeout : null\n\n let resolved_handler_timeout: number | null\n if (this.handler.handler_timeout !== undefined && this.handler.handler_timeout !== null) {\n resolved_handler_timeout = this.handler.handler_timeout\n } else if (original.event_handler_timeout !== undefined && original.event_handler_timeout !== null) {\n resolved_handler_timeout = original.event_handler_timeout\n } else {\n resolved_handler_timeout = resolved_event_timeout\n }\n\n if (resolved_handler_timeout !== null && resolved_handler_timeout <= 0) {\n resolved_handler_timeout = null\n }\n\n if (resolved_handler_timeout === null && resolved_event_timeout === null) {\n return null\n }\n if (resolved_handler_timeout === null) {\n return resolved_event_timeout\n }\n if (resolved_event_timeout === null) {\n return resolved_handler_timeout\n }\n return Math.min(resolved_handler_timeout, resolved_event_timeout)\n }\n\n // Resolve slow handler warning threshold in seconds using event-local values plus the executing bus defaults.\n get handler_slow_timeout(): number | null {\n const original = this.event._event_original ?? this.event\n\n if (this.handler.handler_slow_timeout !== undefined && this.handler.handler_slow_timeout !== null) {\n return this.handler.handler_slow_timeout\n }\n return original.event_handler_slow_timeout ?? this.bus.event_handler_slow_timeout ?? null\n }\n\n // Create a slow-handler warning timer that logs if the handler runs too long.\n _createSlowHandlerWarningTimer(effective_timeout: number | null): ReturnType<typeof setTimeout> | null {\n const handler_warn_timeout = this.handler_slow_timeout\n const warn_ms = handler_warn_timeout === null || handler_warn_timeout <= 0 ? null : handler_warn_timeout * 1000\n const should_warn = warn_ms !== null && (effective_timeout === null || effective_timeout <= 0 || effective_timeout * 1000 > warn_ms)\n if (!should_warn || warn_ms === null) {\n return null\n }\n const event = this.event._event_original ?? this.event\n const bus_name = this.handler.eventbus_name\n const started_at_ms = performance.now()\n return setTimeout(() => {\n if (this.status !== 'started') {\n return\n }\n const elapsed_ms = performance.now() - started_at_ms\n const elapsed_seconds = (elapsed_ms / 1000).toFixed(1)\n console.warn(\n `[abxbus] Slow event handler: ${bus_name}.on(${event.toString()}, ${this.handler.toString()}) still running after ${elapsed_seconds}s`\n )\n }, warn_ms)\n }\n\n _ensureQueueJumpPause(bus: EventBus): void {\n if (!this._queue_jump_pause_releases) {\n this._queue_jump_pause_releases = new Map()\n }\n if (this._queue_jump_pause_releases.has(bus)) {\n return\n }\n this._queue_jump_pause_releases.set(bus, bus.locks._requestRunloopPause())\n }\n\n _releaseQueueJumpPauses(): void {\n if (!this._queue_jump_pause_releases) {\n return\n }\n for (const release of this._queue_jump_pause_releases.values()) {\n release()\n }\n this._queue_jump_pause_releases.clear()\n }\n\n update(params: { status?: EventResultStatus; result?: EventResultType<TEvent> | BaseEvent | undefined; error?: unknown }): this {\n const has_status = 'status' in params\n const has_result = 'result' in params\n const has_error = 'error' in params\n\n if (has_result) {\n const raw_result = params.result\n this.status = 'completed'\n if (\n this.event.event_result_type &&\n raw_result !== undefined &&\n !(raw_result instanceof BaseEvent) &&\n isZodSchema(this.event.event_result_type)\n ) {\n const parsed = this.event.event_result_type.safeParse(raw_result)\n if (parsed.success) {\n this.result = parsed.data as EventResultType<TEvent>\n } else {\n const error = new EventHandlerResultSchemaError(\n `Event handler return value ${JSON.stringify(raw_result).slice(0, 20)}... did not match event_result_type: ${parsed.error.message}`,\n { event_result: this, cause: parsed.error, raw_value: raw_result }\n )\n this.error = error\n this.result = undefined\n this.status = 'error'\n }\n } else {\n this.result = raw_result as EventResultType<TEvent> | undefined\n }\n }\n\n if (has_error) {\n this.error = params.error\n this.status = 'error'\n }\n\n if (has_status && params.status !== undefined) {\n this.status = params.status\n }\n\n if (this.status !== 'pending' && this.started_at === null) {\n this.started_at = monotonicDatetime()\n }\n if ((this.status === 'completed' || this.status === 'error') && this.completed_at === null) {\n this.completed_at = monotonicDatetime()\n }\n\n return this\n }\n\n private _createHandlerTimeoutError(event: BaseEvent): EventHandlerTimeoutError {\n return new EventHandlerTimeoutError(\n `${this.bus.toString()}.on(${event.toString()}, ${this.handler.toString()}) timed out after ${this.handler_timeout}s`,\n {\n event_result: this,\n timeout_seconds: this.handler_timeout,\n }\n )\n }\n\n private _handleHandlerError(event: BaseEvent, error: unknown): void {\n const normalized_error =\n error instanceof RetryTimeoutError\n ? new EventHandlerTimeoutError(error.message, { event_result: this, timeout_seconds: error.timeout_seconds, cause: error })\n : error\n if (normalized_error instanceof EventHandlerTimeoutError) {\n this._markError(normalized_error, false)\n event._cancelPendingChildProcessing(normalized_error)\n } else {\n this._markError(normalized_error, false)\n }\n }\n\n private _onHandlerExit(slow_handler_warning_timer: ReturnType<typeof setTimeout> | null): void {\n this._abort = null\n this._lock = null\n this._releaseQueueJumpPauses()\n if (slow_handler_warning_timer) {\n clearTimeout(slow_handler_warning_timer)\n }\n }\n\n // Run one handler invocation with timeout/slow-monitor/error handling.\n // Handler lock acquisition is owned by BaseEvent._runHandlers(...).\n async runHandler(handler_lock: HandlerLock | null): Promise<void> {\n if (this.status === 'error' && this.error instanceof EventHandlerCancelledError) {\n return\n }\n\n const event = this.event._event_original ?? this.event\n const handler_event = this.bus._getEventProxyScopedToThisBus(event, this)\n if (this._lock) {\n this._lock.exitHandlerRun()\n }\n\n let slow_handler_warning_timer: ReturnType<typeof setTimeout> | null = null\n // if the result is already in an error or completed state, exit early\n if (this.status === 'error' || this.status === 'completed') {\n return\n }\n\n this._lock = handler_lock\n await this.bus.locks._runWithHandlerDispatchContext(this, async () => {\n await _runWithAsyncContext(event._getDispatchContext() ?? null, async () => {\n try {\n const should_notify_started = this.status === 'pending'\n const abort_signal = this._markStarted(false)\n if (should_notify_started) {\n await this._notifyStatusHook('started')\n }\n slow_handler_warning_timer = this._createSlowHandlerWarningTimer(this.handler_timeout)\n const handler_result = await _runWithTimeout(\n this.handler_timeout,\n () => this._createHandlerTimeoutError(event),\n () =>\n _runWithSlowMonitor(slow_handler_warning_timer, () =>\n _runWithAbortMonitor(() => this.handler._handler_async(handler_event), abort_signal)\n )\n )\n this._markCompleted(handler_result as EventResultType<TEvent> | BaseEvent | undefined, false)\n } catch (error) {\n this._handleHandlerError(event, error)\n } finally {\n if (this.status === 'completed' || this.status === 'error') {\n await this._notifyStatusHook('completed')\n }\n this._onHandlerExit(slow_handler_warning_timer)\n }\n })\n })\n }\n\n // Reject the abort promise, causing runHandler's Promise.race to\n // throw immediately \u2014 even if the handler has no timeout.\n _signalAbort(error: Error): void {\n if (this._abort) {\n this._abort.reject(error)\n this._abort = null\n }\n }\n\n // Mark started and return the abort promise for Promise.race.\n _markStarted(notify_hook: boolean = true): Promise<never> {\n if (!this._abort) {\n this._abort = withResolvers<never>()\n }\n if (this.status === 'pending') {\n this.update({ status: 'started' })\n if (notify_hook) {\n void this._notifyStatusHook('started')\n }\n }\n return this._abort.promise\n }\n\n _markCompleted(result: EventResultType<TEvent> | BaseEvent | undefined, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ result })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n _markError(error: unknown, notify_hook: boolean = true): void {\n if (this.status === 'completed' || this.status === 'error') return\n this.update({ error })\n if (notify_hook) {\n void this._notifyStatusHook('completed')\n }\n }\n\n toJSON(): EventResultJSON {\n return {\n id: this.id,\n status: this.status,\n event_id: this.event.event_id,\n handler_id: this.handler_id,\n handler_name: this.handler_name,\n handler_file_path: this.handler_file_path,\n handler_timeout: this.handler.handler_timeout,\n handler_slow_timeout: this.handler.handler_slow_timeout,\n handler_registered_at: this.handler.handler_registered_at,\n handler_event_pattern: this.handler.event_pattern,\n eventbus_name: this.eventbus_name,\n eventbus_id: this.eventbus_id,\n started_at: this.started_at,\n completed_at: this.completed_at,\n result: this.result,\n error: this.error,\n event_children: this.event_children.map((child) => child.event_id),\n }\n }\n\n static fromJSON<TEvent extends BaseEvent>(event: TEvent, data: unknown): EventResult<TEvent> {\n const record = EventResultJSONSchema.parse(data)\n const handler_record = {\n id: record.handler_id,\n eventbus_name: record.eventbus_name,\n eventbus_id: record.eventbus_id,\n event_pattern: record.handler_event_pattern ?? event.event_type,\n handler_name: record.handler_name,\n handler_file_path: record.handler_file_path ?? null,\n handler_timeout: record.handler_timeout,\n handler_slow_timeout: record.handler_slow_timeout,\n handler_registered_at: record.handler_registered_at ?? event.event_created_at,\n } as const\n const handler_stub = EventHandler.fromJSON(handler_record, (() => undefined) as EventHandlerCallable)\n\n const result = new EventResult<TEvent>({ event, handler: handler_stub })\n result.id = record.id\n result.status = record.status\n result.started_at = record.started_at === null || record.started_at === undefined ? null : monotonicDatetime(record.started_at)\n result.completed_at = record.completed_at === null || record.completed_at === undefined ? null : monotonicDatetime(record.completed_at)\n if ('result' in record) {\n result.result = record.result as EventResultType<TEvent>\n }\n if ('error' in record) {\n result.error = record.error\n }\n result.event_children = []\n return result\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -187,9 +187,12 @@ class LockManager {
187
187
  }
188
188
  }
189
189
  _getActiveHandlerResultForCurrentAsyncContext() {
190
- const result = handler_context_storage?.getStore();
190
+ const result = this._getRawActiveHandlerResultForCurrentAsyncContext();
191
191
  return result?.status === "started" ? result : void 0;
192
192
  }
193
+ _getRawActiveHandlerResultForCurrentAsyncContext() {
194
+ return handler_context_storage?.getStore();
195
+ }
193
196
  _getActiveHandlerResults() {
194
197
  return [...this.active_handler_results];
195
198
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/LockManager.ts"],
4
- "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = handler_context_storage?.getStore() as EventResult | undefined\n return result?.status === 'started' ? result : undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = this._getRawActiveHandlerResultForCurrentAsyncContext()\n return result?.status === 'started' ? result : undefined\n }\n\n _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n return handler_context_storage?.getStore() as EventResult | undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
+ "mappings": "AAEA,SAAS,+BAA2D;AAU7D,MAAM,gBAAgB,MAAsB;AACjD,MAAI,OAAO,QAAQ,kBAAkB,YAAY;AAC/C,WAAO,QAAQ,cAAiB;AAAA,EAClC;AACA,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,YAAY,cAAc;AACxD,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAIO,MAAM,0BAA0B,CAAC,iBAAiB,cAAc,UAAU;AAG1E,MAAM,kCAAkC,CAAC,UAAU,UAAU;AAG7D,MAAM,iCAAiC,CAAC,OAAO,OAAO;AAKtD,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAc;AACxB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU,CAAC;AAAA,EAClB;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,SAAS,UAAU;AAC1B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,KAAK,MAAM;AAC3B,WAAK,UAAU;AACf;AAAA,IACF;AACA,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAK,QAAQ,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,SAAS,UAAU;AAC1B;AAAA,IACF;AACA,UAAM,OAAO,KAAK,QAAQ,MAAM;AAChC,QAAI,MAAM;AAER,WAAK;AACL;AAAA,IACF;AACA,SAAK,SAAS,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC;AAAA,EAC3C;AACF;AAEO,MAAM,cAAc,OAAU,MAAwB,OAAqC;AAChG,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,GAAG;AAAA,EAClB;AACA,QAAM,KAAK,QAAQ;AACnB,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,SAAK,QAAQ;AAAA,EACf;AACF;AAEA,MAAM,0BAAwD,wBAAwB;AAS/E,MAAM,YAAY;AAAA,EACf;AAAA,EACA;AAAA,EAER,YAAY,MAAwB;AAClC,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAGA,8BAAuC;AACrC,QAAI,CAAC,KAAK,QAAQ,KAAK,UAAU,QAAQ;AACvC,aAAO;AAAA,IACT;AACA,SAAK,QAAQ;AACb,SAAK,KAAK,QAAQ;AAClB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,8BAAgD;AACpD,QAAI,CAAC,KAAK,QAAQ,KAAK,UAAU,WAAW;AAC1C,aAAO;AAAA,IACT;AACA,UAAM,KAAK,KAAK,QAAQ;AACxB,QAAI,KAAK,UAAU,WAAW;AAE5B,WAAK,KAAK,QAAQ;AAClB,aAAO;AAAA,IACT;AACA,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iBAAuB;AACrB,QAAI,KAAK,UAAU,UAAU;AAC3B;AAAA,IACF;AACA,UAAM,iBAAiB,CAAC,CAAC,KAAK,QAAQ,KAAK,UAAU;AACrD,SAAK,QAAQ;AACb,QAAI,gBAAgB;AAClB,WAAK,KAAM,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAgB,IAAkC;AACtD,UAAM,UAAU,KAAK,4BAA4B;AACjD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,UAAI,SAAS;AACX,cAAM,KAAK,4BAA4B;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;AAgBO,MAAM,YAAY;AAAA,EACf;AAAA;AAAA,EACA;AAAA,EAEC;AAAA;AAAA,EACD;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EAER,YAAY,KAAsC,UAA8B,CAAC,GAAG;AAClF,SAAK,MAAM;AACX,SAAK,4BAA4B,QAAQ,6BAA6B;AACtE,SAAK,iBAAiB,IAAI,UAAU,CAAC;AAErC,SAAK,cAAc;AACnB,SAAK,gBAAgB,CAAC;AACtB,SAAK,yBAAyB,CAAC;AAE/B,SAAK,eAAe,CAAC;AACrB,SAAK,qBAAqB;AAC1B,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA,EAIA,uBAAmC;AACjC,SAAK,eAAe;AACpB,QAAI,WAAW;AACf,WAAO,MAAM;AACX,UAAI,UAAU;AACZ;AAAA,MACF;AACA,iBAAW;AACX,WAAK,cAAc,KAAK,IAAI,GAAG,KAAK,cAAc,CAAC;AACnD,UAAI,KAAK,gBAAgB,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,UAAU,KAAK;AACrB,WAAK,gBAAgB,CAAC;AACtB,iBAAW,WAAW,SAAS;AAC7B,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,2BAA0C;AACxC,QAAI,KAAK,gBAAgB,GAAG;AAC1B,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,cAAc,KAAK,OAAO;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,MAAM,+BAAkC,QAAqB,IAAkC;AAC7F,SAAK,uBAAuB,KAAK,MAAM;AACvC,QAAI;AACF,UAAI,CAAC,yBAAyB;AAC5B,eAAO,MAAM,GAAG;AAAA,MAClB;AACA,aAAO,MAAM,wBAAwB,IAAI,QAAQ,EAAE;AAAA,IACrD,UAAE;AACA,YAAM,MAAM,KAAK,uBAAuB,QAAQ,MAAM;AACtD,UAAI,OAAO,GAAG;AACZ,aAAK,uBAAuB,OAAO,KAAK,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gDAAyE;AACvE,UAAM,SAAS,KAAK,iDAAiD;AACrE,WAAO,QAAQ,WAAW,YAAY,SAAS;AAAA,EACjD;AAAA,EAEA,mDAA4E;AAC1E,WAAO,yBAAyB,SAAS;AAAA,EAC3C;AAAA,EAEA,2BAA0C;AACxC,WAAO,CAAC,GAAG,KAAK,sBAAsB;AAAA,EACxC;AAAA;AAAA,EAGA,sBAA+B;AAC7B,WAAO,KAAK,uBAAuB,SAAS;AAAA,EAC9C;AAAA,EAEA,YAAY,kBAAiC,MAAwB;AACnE,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI,OAAO;AACX,UAAI,aAAmD;AAEvD,YAAM,SAAS,CAAC,gBAA+B;AAC7C,YAAI,MAAM;AACR;AAAA,QACF;AACA,eAAO;AACP,YAAI,eAAe,MAAM;AACvB,uBAAa,UAAU;AACvB,uBAAa;AAAA,QACf;AACA,gBAAQ,WAAW;AAAA,MACrB;AAEA,WAAK,aAAa,KAAK,MAAM;AAC7B,WAAK,kBAAkB;AAEvB,UAAI,oBAAoB,QAAQ,oBAAoB,QAAW;AAC7D;AAAA,MACF;AAEA,YAAM,aAAa,KAAK,IAAI,GAAG,OAAO,eAAe,CAAC,IAAI;AAC1D,UAAI,CAAC,OAAO,SAAS,UAAU,GAAG;AAChC;AAAA,MACF;AAEA,mBAAa,WAAW,MAAM;AAC5B,cAAM,QAAQ,KAAK,aAAa,QAAQ,MAAM;AAC9C,YAAI,SAAS,GAAG;AACd,eAAK,aAAa,OAAO,OAAO,CAAC;AAAA,QACnC;AACA,eAAO,KAAK;AAAA,MACd,GAAG,UAAU;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAIA,uBAA6B;AAG3B,QAAI,KAAK,aAAa,WAAW,GAAG;AAClC,WAAK,oBAAoB;AACzB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,IAAI,oBAAoB,GAAG;AACnC,WAAK,oBAAoB;AACzB,UAAI,KAAK,aAAa,SAAS,GAAG;AAChC,aAAK,kBAAkB;AAAA,MACzB;AACA;AAAA,IACF;AAEA,SAAK,qBAAqB;AAC1B,QAAI,KAAK,oBAAoB,GAAG;AAC9B,UAAI,KAAK,aAAa,SAAS,GAAG;AAChC,aAAK,kBAAkB;AAAA,MACzB;AACA;AAAA,IACF;AAEA,SAAK,oBAAoB;AACzB,UAAM,UAAU,KAAK;AACrB,SAAK,eAAe,CAAC;AACrB,eAAW,WAAW,SAAS;AAC7B,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAAA;AAAA,EAGA,gBAAgB,OAAoC;AAClD,UAAM,WAAW,MAAM,qBAAqB,KAAK,IAAI;AACrD,QAAI,aAAa,YAAY;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,aAAa,iBAAiB;AAChC,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,kBACJ,OACA,IACA,UAAkF,CAAC,GACvE;AACZ,UAAM,eAAe,QAAQ,qBAAqB;AAClD,QAAI,QAAQ,sBAAsB,cAAc;AAC9C,aAAO,MAAM,GAAG;AAAA,IAClB;AACA,WAAO,MAAM,YAAY,KAAK,gBAAgB,KAAK,GAAG,EAAE;AAAA,EAC1D;AAAA,EAEA,MAAM,oBACJ,OACA,6BACA,IACY;AACZ,UAAM,OAAO,MAAM,gBAAgB,2BAA2B;AAC9D,QAAI,MAAM;AACR,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,UAAM,eAAe,OAAO,IAAI,YAAY,IAAI,IAAI;AACpD,QAAI;AACF,aAAO,MAAM,GAAG,YAAY;AAAA,IAC9B,UAAE;AACA,oBAAc,eAAe;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,2BAA2B;AACnC;AAAA,IACF;AACA,QAAI,KAAK,oBAAoB;AAC3B;AAAA,IACF;AACA,SAAK,qBAAqB;AAC1B,eAAW,MAAM;AACf,WAAK,qBAAqB;AAC1B,WAAK,qBAAqB;AAAA,IAC5B,GAAG,CAAC;AAAA,EACN;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,cAAc;AACnB,SAAK,gBAAgB,CAAC;AACtB,SAAK,yBAAyB,CAAC;AAC/B,SAAK,eAAe,CAAC;AACrB,SAAK,qBAAqB;AAC1B,SAAK,oBAAoB;AAAA,EAC3B;AACF;",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,7 @@ const wrap = (class_name, methods) => {
22
22
  Object.defineProperty(WrappedClient.prototype, method_name, {
23
23
  value: async function(init, extra) {
24
24
  const payload = { ...init ?? {}, ...extra ?? {} };
25
- return await this.bus.emit(new EventCtor(payload)).first();
25
+ return await this.bus.emit(new EventCtor(payload)).now({ first_result: true }).eventResult();
26
26
  },
27
27
  writable: true,
28
28
  configurable: true
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/events_suck.ts"],
4
- "sourcesContent": ["import { EventBus } from './EventBus.js'\nimport { BaseEvent } from './BaseEvent.js'\n\nimport type { EventClass, EventResultType } from './types.js'\n\ntype EventMap = Record<string, EventClass<BaseEvent>>\ntype AnyFn = (...args: any[]) => any\ntype FunctionMap = Record<string, AnyFn>\ntype ExtraDict = Record<string, unknown>\n\ntype EventFieldsFromFn<TFunc extends AnyFn> =\n Parameters<TFunc> extends [infer TArg] ? (TArg extends Record<string, unknown> ? TArg : ExtraDict) : ExtraDict\n\ntype GeneratedEvent<TFunc extends AnyFn> = {\n (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n new (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n event_type?: string\n}\n\nexport type GeneratedEvents<TEvents extends FunctionMap> = {\n by_name: { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n} & {\n [K in keyof TEvents]: GeneratedEvent<TEvents[K]>\n}\n\ntype EventInit<TEventClass extends EventClass<BaseEvent>> =\n ConstructorParameters<TEventClass> extends [infer TInit, ...unknown[]] ? TInit : never\n\ntype EventMethodArgs<TEventClass extends EventClass<BaseEvent>> =\n {} extends EventInit<TEventClass>\n ? [init?: EventInit<TEventClass>, extra?: Record<string, unknown>]\n : [init: EventInit<TEventClass>, extra?: Record<string, unknown>]\n\ntype EventMethodResult<TEventClass extends EventClass<BaseEvent>> = EventResultType<InstanceType<TEventClass>> | undefined\n\nexport type EventsSuckClient<TEvents extends EventMap> = {\n bus: EventBus\n} & {\n [K in keyof TEvents]: (...args: EventMethodArgs<TEvents[K]>) => Promise<EventMethodResult<TEvents[K]>>\n}\n\nexport type EventsSuckClientClass<TEvents extends EventMap> = new (bus?: EventBus) => EventsSuckClient<TEvents>\n\ntype DynamicWrappedClient = {\n bus: EventBus\n} & Record<string, (...args: unknown[]) => Promise<unknown>>\n\nexport const make_events = <TEvents extends FunctionMap>(events: TEvents): GeneratedEvents<TEvents> => {\n const by_name = {} as { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n for (const [event_name] of Object.entries(events) as Array<[keyof TEvents, TEvents[keyof TEvents]]>) {\n if (!/^[A-Za-z_$][\\w$]*$/.test(String(event_name))) {\n throw new Error(`Invalid event name: ${String(event_name)}`)\n }\n by_name[event_name] = BaseEvent.extend(String(event_name), {}) as unknown as GeneratedEvent<TEvents[keyof TEvents]>\n }\n return Object.assign({ by_name }, by_name) as GeneratedEvents<TEvents>\n}\n\nexport const wrap = <TEvents extends EventMap>(class_name: string, methods: TEvents): EventsSuckClientClass<TEvents> => {\n class WrappedClient {\n bus: EventBus\n\n constructor(bus?: EventBus) {\n this.bus = bus ?? new EventBus(`${class_name}Bus`)\n }\n }\n\n Object.defineProperty(WrappedClient, 'name', { value: class_name })\n\n for (const [method_name, EventCtor] of Object.entries(methods)) {\n Object.defineProperty(WrappedClient.prototype, method_name, {\n value: async function (this: DynamicWrappedClient, init?: Record<string, unknown>, extra?: Record<string, unknown>) {\n const payload = { ...(init ?? {}), ...(extra ?? {}) }\n return await this.bus.emit(new EventCtor(payload)).first()\n },\n writable: true,\n configurable: true,\n })\n }\n\n return WrappedClient as unknown as EventsSuckClientClass<TEvents>\n}\n\n// Intentionally no make_event()/make_handler() helpers in TypeScript.\n// Prefer the explicit inline pattern:\n// const FooCreateEvent = BaseEvent.extend('FooCreateEvent', {\n// id: z.string().nullable().optional(),\n// name: z.string(),\n// age: z.number(),\n// })\n// bus.on(FooCreateEvent, ({ id, name, age, ...extra }) => impl.create(id, { name, age }))\nexport const events_suck = { make_events, wrap } as const\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAkDnB,MAAM,cAAc,CAA8B,WAA8C;AACrG,QAAM,UAAU,CAAC;AACjB,aAAW,CAAC,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAqD;AACnG,QAAI,CAAC,qBAAqB,KAAK,OAAO,UAAU,CAAC,GAAG;AAClD,YAAM,IAAI,MAAM,uBAAuB,OAAO,UAAU,CAAC,EAAE;AAAA,IAC7D;AACA,YAAQ,UAAU,IAAI,UAAU,OAAO,OAAO,UAAU,GAAG,CAAC,CAAC;AAAA,EAC/D;AACA,SAAO,OAAO,OAAO,EAAE,QAAQ,GAAG,OAAO;AAC3C;AAEO,MAAM,OAAO,CAA2B,YAAoB,YAAqD;AAAA,EACtH,MAAM,cAAc;AAAA,IAClB;AAAA,IAEA,YAAY,KAAgB;AAC1B,WAAK,MAAM,OAAO,IAAI,SAAS,GAAG,UAAU,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,eAAe,eAAe,QAAQ,EAAE,OAAO,WAAW,CAAC;AAElE,aAAW,CAAC,aAAa,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC9D,WAAO,eAAe,cAAc,WAAW,aAAa;AAAA,MAC1D,OAAO,eAA4C,MAAgC,OAAiC;AAClH,cAAM,UAAU,EAAE,GAAI,QAAQ,CAAC,GAAI,GAAI,SAAS,CAAC,EAAG;AACpD,eAAO,MAAM,KAAK,IAAI,KAAK,IAAI,UAAU,OAAO,CAAC,EAAE,MAAM;AAAA,MAC3D;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAUO,MAAM,cAAc,EAAE,aAAa,KAAK;",
4
+ "sourcesContent": ["import { EventBus } from './EventBus.js'\nimport { BaseEvent } from './BaseEvent.js'\n\nimport type { EventClass, EventResultType } from './types.js'\n\ntype EventMap = Record<string, EventClass<BaseEvent>>\ntype AnyFn = (...args: any[]) => any\ntype FunctionMap = Record<string, AnyFn>\ntype ExtraDict = Record<string, unknown>\n\ntype EventFieldsFromFn<TFunc extends AnyFn> =\n Parameters<TFunc> extends [infer TArg] ? (TArg extends Record<string, unknown> ? TArg : ExtraDict) : ExtraDict\n\ntype GeneratedEvent<TFunc extends AnyFn> = {\n (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n new (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n event_type?: string\n}\n\nexport type GeneratedEvents<TEvents extends FunctionMap> = {\n by_name: { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n} & {\n [K in keyof TEvents]: GeneratedEvent<TEvents[K]>\n}\n\ntype EventInit<TEventClass extends EventClass<BaseEvent>> =\n ConstructorParameters<TEventClass> extends [infer TInit, ...unknown[]] ? TInit : never\n\ntype EventMethodArgs<TEventClass extends EventClass<BaseEvent>> =\n {} extends EventInit<TEventClass>\n ? [init?: EventInit<TEventClass>, extra?: Record<string, unknown>]\n : [init: EventInit<TEventClass>, extra?: Record<string, unknown>]\n\ntype EventMethodResult<TEventClass extends EventClass<BaseEvent>> = EventResultType<InstanceType<TEventClass>> | undefined\n\nexport type EventsSuckClient<TEvents extends EventMap> = {\n bus: EventBus\n} & {\n [K in keyof TEvents]: (...args: EventMethodArgs<TEvents[K]>) => Promise<EventMethodResult<TEvents[K]>>\n}\n\nexport type EventsSuckClientClass<TEvents extends EventMap> = new (bus?: EventBus) => EventsSuckClient<TEvents>\n\ntype DynamicWrappedClient = {\n bus: EventBus\n} & Record<string, (...args: unknown[]) => Promise<unknown>>\n\nexport const make_events = <TEvents extends FunctionMap>(events: TEvents): GeneratedEvents<TEvents> => {\n const by_name = {} as { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n for (const [event_name] of Object.entries(events) as Array<[keyof TEvents, TEvents[keyof TEvents]]>) {\n if (!/^[A-Za-z_$][\\w$]*$/.test(String(event_name))) {\n throw new Error(`Invalid event name: ${String(event_name)}`)\n }\n by_name[event_name] = BaseEvent.extend(String(event_name), {}) as unknown as GeneratedEvent<TEvents[keyof TEvents]>\n }\n return Object.assign({ by_name }, by_name) as GeneratedEvents<TEvents>\n}\n\nexport const wrap = <TEvents extends EventMap>(class_name: string, methods: TEvents): EventsSuckClientClass<TEvents> => {\n class WrappedClient {\n bus: EventBus\n\n constructor(bus?: EventBus) {\n this.bus = bus ?? new EventBus(`${class_name}Bus`)\n }\n }\n\n Object.defineProperty(WrappedClient, 'name', { value: class_name })\n\n for (const [method_name, EventCtor] of Object.entries(methods)) {\n Object.defineProperty(WrappedClient.prototype, method_name, {\n value: async function (this: DynamicWrappedClient, init?: Record<string, unknown>, extra?: Record<string, unknown>) {\n const payload = { ...(init ?? {}), ...(extra ?? {}) }\n return await this.bus.emit(new EventCtor(payload)).now({ first_result: true }).eventResult()\n },\n writable: true,\n configurable: true,\n })\n }\n\n return WrappedClient as unknown as EventsSuckClientClass<TEvents>\n}\n\n// Intentionally no make_event()/make_handler() helpers in TypeScript.\n// Prefer the explicit inline pattern:\n// const FooCreateEvent = BaseEvent.extend('FooCreateEvent', {\n// id: z.string().nullable().optional(),\n// name: z.string(),\n// age: z.number(),\n// })\n// bus.on(FooCreateEvent, ({ id, name, age, ...extra }) => impl.create(id, { name, age }))\nexport const events_suck = { make_events, wrap } as const\n"],
5
+ "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAkDnB,MAAM,cAAc,CAA8B,WAA8C;AACrG,QAAM,UAAU,CAAC;AACjB,aAAW,CAAC,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAqD;AACnG,QAAI,CAAC,qBAAqB,KAAK,OAAO,UAAU,CAAC,GAAG;AAClD,YAAM,IAAI,MAAM,uBAAuB,OAAO,UAAU,CAAC,EAAE;AAAA,IAC7D;AACA,YAAQ,UAAU,IAAI,UAAU,OAAO,OAAO,UAAU,GAAG,CAAC,CAAC;AAAA,EAC/D;AACA,SAAO,OAAO,OAAO,EAAE,QAAQ,GAAG,OAAO;AAC3C;AAEO,MAAM,OAAO,CAA2B,YAAoB,YAAqD;AAAA,EACtH,MAAM,cAAc;AAAA,IAClB;AAAA,IAEA,YAAY,KAAgB;AAC1B,WAAK,MAAM,OAAO,IAAI,SAAS,GAAG,UAAU,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,eAAe,eAAe,QAAQ,EAAE,OAAO,WAAW,CAAC;AAElE,aAAW,CAAC,aAAa,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC9D,WAAO,eAAe,cAAc,WAAW,aAAa;AAAA,MAC1D,OAAO,eAA4C,MAAgC,OAAiC;AAClH,cAAM,UAAU,EAAE,GAAI,QAAQ,CAAC,GAAI,GAAI,SAAS,CAAC,EAAG;AACpD,eAAO,MAAM,KAAK,IAAI,KAAK,IAAI,UAAU,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,KAAK,CAAC,EAAE,YAAY;AAAA,MAC7F;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAUO,MAAM,cAAc,EAAE,aAAa,KAAK;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export { BaseEvent, BaseEventSchema } from './BaseEvent.js'\nexport { EventHistory } from './EventHistory.js'\nexport type { EventHistoryFilterOptions, EventHistoryFindOptions, EventHistoryTrimOptions } from './EventHistory.js'\nexport { EventResult } from './EventResult.js'\nexport { EventBus } from './EventBus.js'\nexport type { EventBusJSON, EventBusOptions } from './EventBus.js'\nexport { EventBridge } from './EventBridge.js'\nexport { HTTPEventBridge } from './HTTPEventBridge.js'\nexport type { HTTPEventBridgeOptions } from './HTTPEventBridge.js'\nexport { SocketEventBridge } from './SocketEventBridge.js'\nexport { JSONLEventBridge } from './JSONLEventBridge.js'\nexport { SQLiteEventBridge } from './SQLiteEventBridge.js'\nexport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './EventBusMiddleware.js'\nexport { monotonicDatetime } from './helpers.js'\nexport {\n EventHandlerTimeoutError,\n EventHandlerCancelledError,\n EventHandlerAbortedError,\n EventHandlerResultSchemaError,\n} from './EventHandler.js'\nexport type {\n EventConcurrencyMode,\n EventHandlerConcurrencyMode,\n EventHandlerCompletionMode,\n EventBusInterfaceForLockManager,\n} from './LockManager.js'\nexport type {\n EventClass,\n EventHandlerCallable as EventHandler,\n EventPattern,\n EventStatus,\n FilterOptions,\n FindOptions,\n FindWindow,\n} from './types.js'\nexport { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js'\nexport type { RetryOptions } from './retry.js'\nexport { events_suck } from './events_suck.js'\nexport type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js'\n"],
5
- "mappings": "AAAA,SAAS,WAAW,uBAAuB;AAC3C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAElC,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgBP,SAAS,OAAO,wBAAwB,mBAAmB,6BAA6B;AAExF,SAAS,mBAAmB;",
4
+ "sourcesContent": ["export { BaseEvent, BaseEventSchema } from './BaseEvent.js'\nexport type { EventResultInclude, EventResultOptions, EventWaitOptions, EventWaitPromise } from './BaseEvent.js'\nexport { EventHistory } from './EventHistory.js'\nexport type { EventHistoryFilterOptions, EventHistoryFindOptions, EventHistoryTrimOptions } from './EventHistory.js'\nexport { EventResult } from './EventResult.js'\nexport { EventBus } from './EventBus.js'\nexport type { EventBusJSON, EventBusOptions } from './EventBus.js'\nexport { EventBridge } from './EventBridge.js'\nexport { HTTPEventBridge } from './HTTPEventBridge.js'\nexport type { HTTPEventBridgeOptions } from './HTTPEventBridge.js'\nexport { SocketEventBridge } from './SocketEventBridge.js'\nexport { JSONLEventBridge } from './JSONLEventBridge.js'\nexport { SQLiteEventBridge } from './SQLiteEventBridge.js'\nexport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './EventBusMiddleware.js'\nexport { monotonicDatetime } from './helpers.js'\nexport {\n EventHandlerTimeoutError,\n EventHandlerCancelledError,\n EventHandlerAbortedError,\n EventHandlerResultSchemaError,\n} from './EventHandler.js'\nexport type {\n EventConcurrencyMode,\n EventHandlerConcurrencyMode,\n EventHandlerCompletionMode,\n EventBusInterfaceForLockManager,\n} from './LockManager.js'\nexport type {\n EventClass,\n EventHandlerCallable as EventHandler,\n EventPattern,\n EventStatus,\n FilterOptions,\n FindOptions,\n FindWindow,\n} from './types.js'\nexport { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js'\nexport type { RetryOptions } from './retry.js'\nexport { events_suck } from './events_suck.js'\nexport type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js'\n"],
5
+ "mappings": "AAAA,SAAS,WAAW,uBAAuB;AAE3C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAElC,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgBP,SAAS,OAAO,wBAAwB,mBAAmB,6BAA6B;AAExF,SAAS,mBAAmB;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  async function _runWithTimeout(timeout_seconds, on_timeout, fn) {
2
2
  const task = Promise.resolve().then(fn);
3
- if (timeout_seconds === null) {
3
+ if (timeout_seconds === null || timeout_seconds <= 0) {
4
4
  return await task;
5
5
  }
6
6
  const timeout_ms = timeout_seconds * 1e3;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/timing.ts"],
4
- "sourcesContent": ["export async function _runWithTimeout<T>(timeout_seconds: number | null, on_timeout: () => Error, fn: () => Promise<T>): Promise<T> {\n const task = Promise.resolve().then(fn)\n if (timeout_seconds === null) {\n return await task\n }\n const timeout_ms = timeout_seconds * 1000\n return await new Promise<T>((resolve, reject) => {\n let settled = false\n const finishResolve = (value: T) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n resolve(value)\n }\n const finishReject = (error: unknown) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n reject(error)\n }\n const timer = setTimeout(() => {\n if (settled) {\n return\n }\n settled = true\n reject(on_timeout())\n void task.catch(() => undefined)\n }, timeout_ms)\n task.then(finishResolve).catch(finishReject)\n })\n}\n\nexport async function _runWithSlowMonitor<T>(slow_timer: ReturnType<typeof setTimeout> | null, fn: () => Promise<T>): Promise<T> {\n try {\n return await fn()\n } finally {\n if (slow_timer) {\n clearTimeout(slow_timer)\n }\n }\n}\n\nexport async function _runWithAbortMonitor<T>(fn: () => T | Promise<T>, abort_signal: Promise<never>): Promise<T> {\n const task = Promise.resolve().then(fn)\n const raced = Promise.race([task, abort_signal])\n void task.catch(() => undefined)\n return await raced\n}\n"],
5
- "mappings": "AAAA,eAAsB,gBAAmB,iBAAgC,YAAyB,IAAkC;AAClI,QAAM,OAAO,QAAQ,QAAQ,EAAE,KAAK,EAAE;AACtC,MAAI,oBAAoB,MAAM;AAC5B,WAAO,MAAM;AAAA,EACf;AACA,QAAM,aAAa,kBAAkB;AACrC,SAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAC/C,QAAI,UAAU;AACd,UAAM,gBAAgB,CAAC,UAAa;AAClC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,eAAe,CAAC,UAAmB;AACvC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,mBAAa,KAAK;AAClB,aAAO,KAAK;AAAA,IACd;AACA,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,aAAO,WAAW,CAAC;AACnB,WAAK,KAAK,MAAM,MAAM,MAAS;AAAA,IACjC,GAAG,UAAU;AACb,SAAK,KAAK,aAAa,EAAE,MAAM,YAAY;AAAA,EAC7C,CAAC;AACH;AAEA,eAAsB,oBAAuB,YAAkD,IAAkC;AAC/H,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,QAAI,YAAY;AACd,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAsB,qBAAwB,IAA0B,cAA0C;AAChH,QAAM,OAAO,QAAQ,QAAQ,EAAE,KAAK,EAAE;AACtC,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,YAAY,CAAC;AAC/C,OAAK,KAAK,MAAM,MAAM,MAAS;AAC/B,SAAO,MAAM;AACf;",
4
+ "sourcesContent": ["export async function _runWithTimeout<T>(timeout_seconds: number | null, on_timeout: () => Error, fn: () => Promise<T>): Promise<T> {\n const task = Promise.resolve().then(fn)\n if (timeout_seconds === null || timeout_seconds <= 0) {\n return await task\n }\n const timeout_ms = timeout_seconds * 1000\n return await new Promise<T>((resolve, reject) => {\n let settled = false\n const finishResolve = (value: T) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n resolve(value)\n }\n const finishReject = (error: unknown) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n reject(error)\n }\n const timer = setTimeout(() => {\n if (settled) {\n return\n }\n settled = true\n reject(on_timeout())\n void task.catch(() => undefined)\n }, timeout_ms)\n task.then(finishResolve).catch(finishReject)\n })\n}\n\nexport async function _runWithSlowMonitor<T>(slow_timer: ReturnType<typeof setTimeout> | null, fn: () => Promise<T>): Promise<T> {\n try {\n return await fn()\n } finally {\n if (slow_timer) {\n clearTimeout(slow_timer)\n }\n }\n}\n\nexport async function _runWithAbortMonitor<T>(fn: () => T | Promise<T>, abort_signal: Promise<never>): Promise<T> {\n const task = Promise.resolve().then(fn)\n const raced = Promise.race([task, abort_signal])\n void task.catch(() => undefined)\n return await raced\n}\n"],
5
+ "mappings": "AAAA,eAAsB,gBAAmB,iBAAgC,YAAyB,IAAkC;AAClI,QAAM,OAAO,QAAQ,QAAQ,EAAE,KAAK,EAAE;AACtC,MAAI,oBAAoB,QAAQ,mBAAmB,GAAG;AACpD,WAAO,MAAM;AAAA,EACf;AACA,QAAM,aAAa,kBAAkB;AACrC,SAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAC/C,QAAI,UAAU;AACd,UAAM,gBAAgB,CAAC,UAAa;AAClC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,eAAe,CAAC,UAAmB;AACvC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,mBAAa,KAAK;AAClB,aAAO,KAAK;AAAA,IACd;AACA,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,aAAO,WAAW,CAAC;AACnB,WAAK,KAAK,MAAM,MAAM,MAAS;AAAA,IACjC,GAAG,UAAU;AACb,SAAK,KAAK,aAAa,EAAE,MAAM,YAAY;AAAA,EAC7C,CAAC;AACH;AAEA,eAAsB,oBAAuB,YAAkD,IAAkC;AAC/H,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,QAAI,YAAY;AACd,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAsB,qBAAwB,IAA0B,cAA0C;AAChH,QAAM,OAAO,QAAQ,QAAQ,EAAE,KAAK,EAAE;AACtC,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,YAAY,CAAC;AAC/C,OAAK,KAAK,MAAM,MAAM,MAAS;AAC/B,SAAO,MAAM;AACf;",
6
6
  "names": []
7
7
  }
@@ -42,6 +42,7 @@ export declare const BaseEventSchema: z.ZodObject<{
42
42
  first: "first";
43
43
  }>>>;
44
44
  }, z.core.$loose>;
45
+ type AnyEventSchema = z.ZodTypeAny;
45
46
  export type BaseEventData = z.infer<typeof BaseEventSchema>;
46
47
  export type BaseEventJSON = BaseEventData & Record<string, unknown>;
47
48
  type BaseEventFieldName = 'event_id' | 'event_created_at' | 'event_type' | 'event_version' | 'event_timeout' | 'event_slow_timeout' | 'event_handler_timeout' | 'event_handler_slow_timeout' | 'event_blocks_parent_completion' | 'event_parent_id' | 'event_path' | 'event_result_type' | 'event_emitted_by_handler_id' | 'event_pending_bus_count' | 'event_status' | 'event_started_at' | 'event_completed_at' | 'event_results' | 'event_concurrency' | 'event_handler_concurrency' | 'event_handler_completion';
@@ -54,6 +55,9 @@ export type EventSchema<TShape extends z.ZodRawShape> = z.ZodObject<BaseEventSch
54
55
  type EventPayload<TShape extends z.ZodRawShape> = TShape extends Record<string, never> ? {} : z.infer<z.ZodObject<TShape>>;
55
56
  type EventInput<TShape extends z.ZodRawShape> = z.input<EventSchema<TShape>>;
56
57
  export type EventInit<TShape extends z.ZodRawShape> = Omit<EventInput<TShape>, keyof BaseEventFields> & Partial<BaseEventFields>;
58
+ type EventPayloadFromSchema<TSchema extends AnyEventSchema> = z.output<TSchema> extends Record<string, unknown> ? z.output<TSchema> : {};
59
+ type EventInputFromSchema<TSchema extends AnyEventSchema> = z.input<TSchema> extends Record<string, unknown> ? z.input<TSchema> : never;
60
+ export type EventInitFromSchema<TSchema extends AnyEventSchema> = Omit<EventInputFromSchema<TSchema>, keyof BaseEventFields> & Partial<BaseEventFields>;
57
61
  type EventWithResultSchema<TResult> = BaseEvent & {
58
62
  __event_result_type__?: TResult;
59
63
  };
@@ -61,15 +65,19 @@ type ResultTypeFromEventResultTypeInput<TInput> = TInput extends z.ZodTypeAny ?
61
65
  type ResultSchemaFromShape<TShape> = TShape extends {
62
66
  event_result_type: infer S;
63
67
  } ? ResultTypeFromEventResultTypeInput<S> : unknown;
64
- type EventResultsListInclude<TEvent extends BaseEvent> = (result: EventResultType<TEvent> | undefined, event_result: EventResult<TEvent>) => boolean;
65
- type EventResultsListOptions<TEvent extends BaseEvent> = {
66
- timeout?: number | null;
67
- include?: EventResultsListInclude<TEvent>;
68
+ export type EventResultInclude<TEvent extends BaseEvent> = (result: EventResult<TEvent>['result'], event_result: EventResult<TEvent>) => boolean;
69
+ export type EventResultOptions<TEvent extends BaseEvent> = {
70
+ include?: EventResultInclude<TEvent>;
68
71
  raise_if_any?: boolean;
69
72
  raise_if_none?: boolean;
70
73
  };
71
- type EventDoneOptions = {
72
- raise_if_any?: boolean;
74
+ export type EventWaitOptions = {
75
+ timeout?: number | null;
76
+ first_result?: boolean;
77
+ };
78
+ export type EventWaitPromise<TEvent extends BaseEvent> = Promise<TEvent> & {
79
+ eventResult(options?: EventResultOptions<TEvent>): Promise<EventResultType<TEvent> | undefined>;
80
+ eventResultsList(options?: EventResultOptions<TEvent>): Promise<Array<EventResultType<TEvent> | undefined>>;
73
81
  };
74
82
  type EventResultUpdateOptions<TEvent extends BaseEvent> = {
75
83
  eventbus?: EventBus;
@@ -80,13 +88,23 @@ type EventResultUpdateOptions<TEvent extends BaseEvent> = {
80
88
  export type EventFactory<TShape extends z.ZodRawShape, TResult = unknown> = {
81
89
  (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>;
82
90
  new (data: EventInit<TShape>): EventWithResultSchema<TResult> & EventPayload<TShape>;
83
- schema: EventSchema<TShape>;
91
+ event_schema: EventSchema<TShape>;
84
92
  class?: new (data: EventInit<TShape>) => EventWithResultSchema<TResult> & EventPayload<TShape>;
85
93
  event_type?: string;
86
94
  event_version?: string;
87
95
  event_result_type?: z.ZodTypeAny;
88
96
  fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayload<TShape>;
89
97
  };
98
+ export type SchemaEventFactory<TSchema extends AnyEventSchema, TResult = unknown> = {
99
+ (data: EventInitFromSchema<TSchema>): EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>;
100
+ new (data: EventInitFromSchema<TSchema>): EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>;
101
+ event_schema: TSchema;
102
+ class?: new (data: EventInitFromSchema<TSchema>) => EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>;
103
+ event_type?: string;
104
+ event_version?: string;
105
+ event_result_type?: z.ZodTypeAny;
106
+ fromJSON?: (data: unknown) => EventWithResultSchema<TResult> & EventPayloadFromSchema<TSchema>;
107
+ };
90
108
  type ZodShapeFrom<TShape extends Record<string, unknown>> = {
91
109
  [K in keyof TShape as K extends 'event_result_type' ? never : TShape[K] extends z.ZodTypeAny ? K : never]: Extract<TShape[K], z.ZodTypeAny>;
92
110
  };
@@ -112,59 +130,27 @@ export declare class BaseEvent {
112
130
  event_concurrency?: EventConcurrencyMode | null;
113
131
  event_handler_concurrency?: EventHandlerConcurrencyMode | null;
114
132
  event_handler_completion?: EventHandlerCompletionMode | null;
133
+ event_schema?: z.ZodTypeAny;
115
134
  static event_type?: string;
116
135
  static event_version: string;
117
- static schema: z.ZodObject<{
118
- event_id: z.ZodString;
119
- event_created_at: z.ZodString;
120
- event_type: z.ZodString;
121
- event_version: z.ZodDefault<z.ZodString>;
122
- event_timeout: z.ZodNullable<z.ZodNumber>;
123
- event_slow_timeout: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
124
- event_handler_timeout: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
125
- event_handler_slow_timeout: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
126
- event_blocks_parent_completion: z.ZodOptional<z.ZodBoolean>;
127
- event_parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
128
- event_path: z.ZodOptional<z.ZodArray<z.ZodString>>;
129
- event_result_type: z.ZodOptional<z.ZodUnknown>;
130
- event_emitted_by_handler_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
131
- event_pending_bus_count: z.ZodOptional<z.ZodNumber>;
132
- event_status: z.ZodOptional<z.ZodEnum<{
133
- pending: "pending";
134
- started: "started";
135
- completed: "completed";
136
- }>>;
137
- event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
138
- event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
139
- event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
140
- event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
141
- "global-serial": "global-serial";
142
- "bus-serial": "bus-serial";
143
- parallel: "parallel";
144
- }>>>;
145
- event_handler_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
146
- parallel: "parallel";
147
- serial: "serial";
148
- }>>>;
149
- event_handler_completion: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
150
- all: "all";
151
- first: "first";
152
- }>>>;
153
- }, z.core.$loose>;
136
+ static event_result_type?: z.ZodTypeAny;
137
+ static event_schema: AnyEventSchema;
154
138
  event_bus?: EventBus;
155
139
  _event_original?: BaseEvent;
156
140
  _event_dispatch_context?: unknown | null;
141
+ _event_fields_set?: Set<string>;
157
142
  _event_completed_signal: Deferred<this> | null;
158
143
  _lock_for_event_handler: AsyncLock | null;
159
144
  constructor(data?: BaseEventInit<Record<string, unknown>>);
160
145
  toString(): string;
146
+ static extend<TSchema extends z.ZodObject<z.ZodRawShape>>(event_type: string, event_schema: TSchema): SchemaEventFactory<TSchema, unknown>;
161
147
  static extend<TShape extends z.ZodRawShape>(event_type: string, shape?: TShape): EventFactory<TShape, ResultSchemaFromShape<TShape>>;
162
148
  static extend<TShape extends Record<string, unknown>>(event_type: string, shape?: TShape): EventFactory<ZodShapeFrom<TShape>, ResultSchemaFromShape<TShape>>;
163
149
  static fromJSON<T extends typeof BaseEvent>(this: T, data: unknown): InstanceType<T>;
164
150
  static toJSONArray(events: Iterable<BaseEvent>): BaseEventJSON[];
165
151
  static fromJSONArray(data: unknown): BaseEvent[];
166
152
  toJSON(): BaseEventJSON;
167
- _createSlowEventWarningTimer(): ReturnType<typeof setTimeout> | null;
153
+ _createSlowEventWarningTimer(event_slow_timeout?: number | null, bus_name?: string): ReturnType<typeof setTimeout> | null;
168
154
  eventResultUpdate(handler: EventHandler | EventHandlerCallable<this>, options?: EventResultUpdateOptions<this>): EventResult<this>;
169
155
  _createPendingHandlerResults(bus: EventBus): Array<{
170
156
  handler: EventHandler;
@@ -172,6 +158,8 @@ export declare class BaseEvent {
172
158
  }>;
173
159
  private _collectPendingResults;
174
160
  private _isFirstModeWinningResult;
161
+ private static _defaultResultInclude;
162
+ private static _includeEventResult;
175
163
  private _markFirstModeWinnerIfNeeded;
176
164
  private _runHandlerWithLock;
177
165
  _runHandlers(pending_entries?: Array<{
@@ -190,11 +178,17 @@ export declare class BaseEvent {
190
178
  _markRemainingFirstModeResultCancelled(winner: EventResult): void;
191
179
  _markCancelled(cause: Error): void;
192
180
  _notifyEventParentsOfCompletion(): void;
193
- done(options?: EventDoneOptions): Promise<this>;
194
- first(): Promise<EventResultType<this> | undefined>;
195
- eventResultsList(include: EventResultsListInclude<this>, options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>;
196
- eventResultsList(options?: EventResultsListOptions<this>): Promise<Array<EventResultType<this> | undefined>>;
197
- eventCompleted(): Promise<this>;
181
+ private _withEventResultMethods;
182
+ private _timeoutPromise;
183
+ private _orderedEventResults;
184
+ private _orderedEventResultsByRegistration;
185
+ private _collectResultValues;
186
+ private _hasIncludedResult;
187
+ private _waitForFirstResultOrCompletion;
188
+ now(options?: EventWaitOptions): EventWaitPromise<this>;
189
+ wait(options?: EventWaitOptions): EventWaitPromise<this>;
190
+ eventResult(options?: EventResultOptions<this>): Promise<EventResultType<this> | undefined>;
191
+ eventResultsList(options?: EventResultOptions<this>): Promise<Array<EventResultType<this> | undefined>>;
198
192
  _markBlocksParentCompletionIfAwaitedFromEmittingHandler(): void;
199
193
  _markPending(): this;
200
194
  eventReset(): this;
@@ -202,11 +196,7 @@ export declare class BaseEvent {
202
196
  _markCompleted(force?: boolean, notify_parents?: boolean): void;
203
197
  private dropFromZeroHistoryBuses;
204
198
  get event_errors(): unknown[];
205
- private _isFirstModeControlError;
206
- _firstProcessingError(options?: {
207
- ignore_first_mode_control_errors?: boolean;
208
- }): unknown | undefined;
209
- get event_result(): EventResultType<this> | undefined;
199
+ _firstProcessingError(): unknown | undefined;
210
200
  _areAllChildrenComplete(visited?: Set<string>): boolean;
211
201
  private _notifyDoneListeners;
212
202
  _gc(): void;
@@ -18,6 +18,9 @@ export type EventBusOptions = {
18
18
  event_handler_detect_file_paths?: boolean;
19
19
  middlewares?: EventBusMiddlewareInput[];
20
20
  };
21
+ export type EventBusDestroyOptions = {
22
+ clear?: boolean;
23
+ };
21
24
  export type EventBusJSON = {
22
25
  id: string;
23
26
  name: string;
@@ -71,6 +74,7 @@ export declare class EventBus {
71
74
  locks: LockManager;
72
75
  find_waiters: Set<EphemeralFindEventHandler>;
73
76
  middlewares: EventBusMiddleware[];
77
+ private destroyed;
74
78
  private static normalizeMiddlewares;
75
79
  constructor(name?: string, options?: EventBusOptions);
76
80
  toString(): string;
@@ -94,7 +98,9 @@ export declare class EventBus {
94
98
  removeEventFromPendingQueue(event: BaseEvent): number;
95
99
  isEventInFlightOrQueued(event_id: string): boolean;
96
100
  removeEventFromHistory(event_id: string): boolean;
97
- destroy(): void;
101
+ private _raiseIfDestroyed;
102
+ destroy(clear?: boolean): Promise<void>;
103
+ destroy(options?: EventBusDestroyOptions): Promise<void>;
98
104
  on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>, options?: Partial<EventHandler>): EventHandler;
99
105
  on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>, options?: Partial<EventHandler>): EventHandler;
100
106
  off<T extends BaseEvent>(event_pattern: EventPattern<T> | '*', handler?: EventHandlerCallable<T> | string | EventHandler): void;
@@ -117,6 +123,7 @@ export declare class EventBus {
117
123
  logTree(): string;
118
124
  findEventById(event_id: string): BaseEvent | null;
119
125
  private _startRunloop;
126
+ private _startParallelEventTaskFromQueue;
120
127
  private _processEvent;
121
128
  _processEventImmediately<T extends BaseEvent>(event: T, handler_result?: EventResult): Promise<T>;
122
129
  private _processEventImmediatelyAcrossBuses;
@@ -5,7 +5,7 @@ import type { EventResult } from './EventResult.js';
5
5
  export type EphemeralFindEventHandler = {
6
6
  event_pattern: string | '*';
7
7
  matches: (event: BaseEvent) => boolean;
8
- resolve: (event: BaseEvent) => void;
8
+ resolve: (event: BaseEvent | null) => void;
9
9
  timeout_id?: ReturnType<typeof setTimeout>;
10
10
  };
11
11
  export declare const FindWaiterJSONSchema: z.ZodObject<{
@@ -17,12 +17,12 @@ export declare class FindWaiter {
17
17
  static toJSON(waiter: EphemeralFindEventHandler): FindWaiterJSON;
18
18
  static fromJSON(data: unknown, overrides?: {
19
19
  matches?: (event: BaseEvent) => boolean;
20
- resolve?: (event: BaseEvent) => void;
20
+ resolve?: (event: BaseEvent | null) => void;
21
21
  }): EphemeralFindEventHandler;
22
22
  static toJSONArray(waiters: Iterable<EphemeralFindEventHandler>): FindWaiterJSON[];
23
23
  static fromJSONArray(data: unknown, overrides?: {
24
24
  matches?: (event: BaseEvent) => boolean;
25
- resolve?: (event: BaseEvent) => void;
25
+ resolve?: (event: BaseEvent | null) => void;
26
26
  }): EphemeralFindEventHandler[];
27
27
  }
28
28
  export declare const EventHandlerJSONSchema: z.ZodObject<{
@@ -55,6 +55,7 @@ export declare class LockManager {
55
55
  _isPaused(): boolean;
56
56
  _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T>;
57
57
  _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined;
58
+ _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined;
58
59
  _getActiveHandlerResults(): EventResult[];
59
60
  _isAnyHandlerActive(): boolean;
60
61
  waitForIdle(timeout_seconds?: number | null): Promise<boolean>;