abxbus 2.5.6 → 2.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/cjs/BaseEvent.d.ts +12 -32
  2. package/dist/cjs/BaseEvent.js +20 -17
  3. package/dist/cjs/BaseEvent.js.map +2 -2
  4. package/dist/cjs/CoreClient.d.ts +167 -0
  5. package/dist/cjs/CoreEventBus.d.ts +334 -0
  6. package/dist/cjs/LockManager.js +1 -1
  7. package/dist/cjs/LockManager.js.map +2 -2
  8. package/dist/cjs/base_event.d.ts +2 -2
  9. package/dist/cjs/event_handler.d.ts +0 -1
  10. package/dist/cjs/events_suck.d.ts +7 -14
  11. package/dist/cjs/events_suck.js +1 -1
  12. package/dist/cjs/events_suck.js.map +2 -2
  13. package/dist/cjs/retry.d.ts +2 -0
  14. package/dist/cjs/retry.js +110 -35
  15. package/dist/cjs/retry.js.map +3 -3
  16. package/dist/cjs/types.d.ts +3 -6
  17. package/dist/cjs/types.js +1 -1
  18. package/dist/cjs/types.js.map +2 -2
  19. package/dist/esm/BaseEvent.js +20 -17
  20. package/dist/esm/BaseEvent.js.map +2 -2
  21. package/dist/esm/LockManager.js +1 -1
  22. package/dist/esm/LockManager.js.map +2 -2
  23. package/dist/esm/events_suck.js +1 -1
  24. package/dist/esm/events_suck.js.map +2 -2
  25. package/dist/esm/retry.js +110 -35
  26. package/dist/esm/retry.js.map +3 -3
  27. package/dist/esm/types.js +1 -1
  28. package/dist/esm/types.js.map +2 -2
  29. package/dist/types/BaseEvent.d.ts +12 -32
  30. package/dist/types/CoreClient.d.ts +167 -0
  31. package/dist/types/CoreEventBus.d.ts +334 -0
  32. package/dist/types/base_event.d.ts +2 -2
  33. package/dist/types/event_handler.d.ts +0 -1
  34. package/dist/types/events_suck.d.ts +7 -14
  35. package/dist/types/retry.d.ts +2 -0
  36. package/dist/types/types.d.ts +3 -6
  37. package/package.json +1 -1
  38. package/src/BaseEvent.ts +93 -75
  39. package/src/LockManager.ts +1 -1
  40. package/src/events_suck.ts +17 -20
  41. package/src/retry.ts +132 -38
  42. package/src/types.ts +4 -5
  43. package/dist/cjs/bridge_ipc.d.ts +0 -45
  44. package/dist/cjs/middleware_otel_tracing.d.ts +0 -49
  45. package/dist/types/bridge_ipc.d.ts +0 -45
  46. package/dist/types/middleware_otel_tracing.d.ts +0 -49
@@ -0,0 +1,167 @@
1
+ export declare const CORE_PROTOCOL_VERSION = 1;
2
+ export type ProtocolEnvelope<TMessage = Record<string, unknown>> = {
3
+ protocol_version: number;
4
+ session_id: string;
5
+ request_id?: string;
6
+ last_patch_seq?: number;
7
+ message: TMessage;
8
+ };
9
+ export type CoreMessage = Record<string, unknown> & {
10
+ type?: string;
11
+ };
12
+ type FastCompletedHandlerOptions = {
13
+ result_is_event_reference?: boolean;
14
+ process_route_after?: boolean;
15
+ process_available_after?: boolean;
16
+ compact_response?: boolean;
17
+ include_patches?: boolean;
18
+ };
19
+ type ForwardEventOptions = {
20
+ parent_invocation_id?: string | null;
21
+ block_parent_completion?: boolean;
22
+ pause_parent_route?: boolean;
23
+ event_timeout?: number | null;
24
+ event_slow_timeout?: number | null;
25
+ event_concurrency?: string | null;
26
+ event_handler_timeout?: number | null;
27
+ event_handler_slow_timeout?: number | null;
28
+ event_handler_concurrency?: string | null;
29
+ event_handler_completion?: string | null;
30
+ event_blocks_parent_completion?: boolean | null;
31
+ };
32
+ export declare class RustCoreClient {
33
+ private static shared_named_clients;
34
+ private static cleanup_registered;
35
+ static acquireNamed(bus_name: string): RustCoreClient;
36
+ static releaseNamed(client: RustCoreClient, options?: {
37
+ stopCore?: boolean;
38
+ }): void;
39
+ private static registerProcessCleanup;
40
+ static stopIdleNamedClients(): void;
41
+ readonly session_id: string;
42
+ readonly command: string;
43
+ readonly args: string[];
44
+ readonly socket_path: string;
45
+ private process;
46
+ private rpc;
47
+ private last_patch_seq;
48
+ private request_seq;
49
+ private release_transport_timer;
50
+ private readonly kill_process_on_close;
51
+ private readonly owns_socket_path;
52
+ private readonly bus_name;
53
+ private readonly session_id_bytes;
54
+ constructor(options?: {
55
+ command?: string;
56
+ args?: string[];
57
+ session_id?: string;
58
+ socket_path?: string;
59
+ bus_name?: string;
60
+ });
61
+ request(message: CoreMessage, options?: {
62
+ includePatches?: boolean;
63
+ advancePatchSeq?: boolean;
64
+ advancePatchSeqWhenNoPatches?: boolean;
65
+ }): ProtocolEnvelope<CoreMessage>[];
66
+ private requestOnce;
67
+ requestMessages(message: CoreMessage, options?: {
68
+ includePatches?: boolean;
69
+ advancePatchSeq?: boolean;
70
+ advancePatchSeqWhenNoPatches?: boolean;
71
+ }): CoreMessage[];
72
+ getPatchSeq(): number;
73
+ setPatchSeq(last_patch_seq: number): void;
74
+ filterUnseenPatchMessages(messages: CoreMessage[]): CoreMessage[];
75
+ ackPatchMessages(messages: CoreMessage | CoreMessage[]): void;
76
+ registerBus(bus: Record<string, unknown>): CoreMessage[];
77
+ unregisterBus(bus_id: string): CoreMessage[];
78
+ registerHandler(handler: Record<string, unknown>): CoreMessage[];
79
+ importBusSnapshot(snapshot: {
80
+ bus: Record<string, unknown>;
81
+ handlers: Record<string, unknown>[];
82
+ events: Record<string, unknown>[];
83
+ pending_event_ids: string[];
84
+ }): CoreMessage[];
85
+ unregisterHandler(handler_id: string): CoreMessage[];
86
+ disconnectHost(host_id?: string | null): CoreMessage[];
87
+ closeSession(): void;
88
+ stopCore(): CoreMessage[];
89
+ emitEvent(event: Record<string, unknown>, bus_id: string, defer_start?: boolean, compact_response?: boolean, options?: {
90
+ parent_invocation_id?: string | null;
91
+ block_parent_completion?: boolean;
92
+ pause_parent_route?: boolean;
93
+ }): CoreMessage[];
94
+ forwardEvent(event_id: string, bus_id: string, defer_start?: boolean, compact_response?: boolean, options?: ForwardEventOptions): CoreMessage[];
95
+ updateEventOptions(event_id: string, options: {
96
+ event_handler_completion?: string | null;
97
+ event_blocks_parent_completion?: boolean | null;
98
+ }): CoreMessage[];
99
+ processNextRoute(bus_id: string, limit?: number | null, compact_response?: boolean): CoreMessage[];
100
+ waitInvocations(bus_id?: string | null, limit?: number | null): CoreMessage[];
101
+ waitEventCompleted(event_id: string): CoreMessage[];
102
+ waitEventEmitted(bus_id: string, event_pattern?: string, seen_event_ids?: string[], after_event_id?: string | null, after_created_at?: string | null): CoreMessage[];
103
+ waitBusIdle(bus_id: string, timeout?: number | null): boolean;
104
+ processRoute(route_id: string, limit?: number | null, compact_response?: boolean): CoreMessage[];
105
+ awaitEvent(event_id: string, parent_invocation_id?: string | null): CoreMessage[];
106
+ queueJumpEvent(event_id: string, parent_invocation_id: string, block_parent_completion?: boolean, pause_parent_route?: boolean): CoreMessage[];
107
+ getEvent(event_id: string): Record<string, unknown> | null;
108
+ listEvents(event_pattern?: string, limit?: number | null, bus_id?: string | null): Record<string, unknown>[];
109
+ listEventIds(event_pattern?: string, limit?: number | null, bus_id?: string | null, statuses?: string[] | null): string[];
110
+ listPendingEventIds(bus_id: string): string[];
111
+ completeHandler(invocation: Record<string, unknown>, value: unknown, options?: FastCompletedHandlerOptions): CoreMessage[];
112
+ completeHandlerNoPatches(invocation: Record<string, unknown>, value: unknown, options?: FastCompletedHandlerOptions): CoreMessage[];
113
+ private requestFastCompletedHandler;
114
+ private requestFastRegisterHandler;
115
+ private requestFastUnregisterHandler;
116
+ private requestFastQueueJumpEvent;
117
+ private waitFastCoreAck;
118
+ private waitFastCoreMessages;
119
+ private readFastPatchSeq;
120
+ private requiredString;
121
+ private requiredUint64;
122
+ completeHandlerOutcomes(outcomes: Record<string, unknown>[], options?: {
123
+ compact_response?: boolean;
124
+ }): CoreMessage[];
125
+ completedHandlerOutcome(value: unknown, result_is_event_reference?: boolean): CoreMessage;
126
+ handlerOutcomeRecord(invocation: Record<string, unknown>, outcome: CoreMessage, options?: {
127
+ process_available_after?: boolean;
128
+ }): CoreMessage;
129
+ errorHandler(invocation: Record<string, unknown>, error: unknown, options?: {
130
+ process_route_after?: boolean;
131
+ process_available_after?: boolean;
132
+ compact_response?: boolean;
133
+ }): CoreMessage[];
134
+ erroredHandlerOutcome(error: unknown): CoreMessage;
135
+ close(): void;
136
+ closeTransportOnly(options?: {
137
+ closeSession?: boolean;
138
+ }): void;
139
+ disconnect(): void;
140
+ stop(): void;
141
+ private cleanupFailedSpawn;
142
+ private connect;
143
+ private tryConnect;
144
+ private connectNamedBus;
145
+ private requestNamedSession;
146
+ private requestNamedStop;
147
+ private waitForNamedDaemonStopped;
148
+ private ensureNamedDaemon;
149
+ private coreProcessEnv;
150
+ private ensureRpc;
151
+ private configureRpc;
152
+ private closeTransport;
153
+ private cleanupOwnedSocketPath;
154
+ releaseTransportSoon(): void;
155
+ private sendCloseSession;
156
+ }
157
+ export declare const defaultCoreCommand: (socket_path: string, options?: {
158
+ daemon?: boolean;
159
+ }) => {
160
+ command: string;
161
+ args: string[];
162
+ };
163
+ export declare const stableCoreSocketPath: (_bus_name: string) => string;
164
+ export declare const coreNamespace: () => string;
165
+ export declare const stableCoreSessionSocketPath: (bus_name: string) => string;
166
+ export declare const namedCoreLockPath: (socket_path: string) => string;
167
+ export {};
@@ -0,0 +1,334 @@
1
+ import { RustCoreClient, type CoreMessage } from './CoreClient.js';
2
+ import { BaseEvent } from './BaseEvent.js';
3
+ import type { BaseEventJSON } from './BaseEvent.js';
4
+ import { EventHandler } from './EventHandler.js';
5
+ import type { EventHandlerJSON } from './EventHandler.js';
6
+ import { EventResult } from './EventResult.js';
7
+ import { AsyncLock, HandlerLock, type EventConcurrencyMode, type EventHandlerCompletionMode, type EventHandlerConcurrencyMode } from './LockManager.js';
8
+ import type { EventBusMiddlewareInput } from './EventBusMiddleware.js';
9
+ import { type EventHandlerCallable, type EventPattern, type FilterOptions, type FindOptions } from './types.js';
10
+ export type CoreHandler<T extends BaseEvent = BaseEvent> = EventHandlerCallable<T>;
11
+ export type RustCoreEventBusOptions = {
12
+ id?: string;
13
+ core?: RustCoreClient;
14
+ event_concurrency?: EventConcurrencyMode;
15
+ event_handler_concurrency?: EventHandlerConcurrencyMode;
16
+ event_handler_completion?: EventHandlerCompletionMode;
17
+ event_handler_detect_file_paths?: boolean;
18
+ event_timeout?: number | null;
19
+ event_slow_timeout?: number | null;
20
+ event_handler_timeout?: number | null;
21
+ event_handler_slow_timeout?: number | null;
22
+ max_history_size?: number | null;
23
+ max_history_drop?: boolean;
24
+ middlewares?: EventBusMiddlewareInput[];
25
+ background_worker?: boolean;
26
+ };
27
+ export type RustCoreHandlerOptions = {
28
+ id?: string;
29
+ handler_name?: string;
30
+ handler_registered_at?: string;
31
+ handler_file_path?: string | null;
32
+ handler_timeout?: number | null;
33
+ handler_slow_timeout?: number | null;
34
+ handler_concurrency?: EventHandlerConcurrencyMode | null;
35
+ handler_completion?: EventHandlerCompletionMode | null;
36
+ [key: string]: unknown;
37
+ };
38
+ export type RustCoreFilterOptions = {
39
+ limit?: number | null;
40
+ [field: string]: unknown;
41
+ };
42
+ export type RustCoreEventBusJSON = {
43
+ id: string;
44
+ name: string;
45
+ max_history_size: number | null;
46
+ max_history_drop: boolean;
47
+ event_concurrency: EventConcurrencyMode;
48
+ event_timeout: number | null;
49
+ event_slow_timeout: number | null;
50
+ event_handler_concurrency: EventHandlerConcurrencyMode;
51
+ event_handler_completion: EventHandlerCompletionMode;
52
+ event_handler_timeout: number | null;
53
+ event_handler_slow_timeout: number | null;
54
+ event_handler_detect_file_paths: boolean;
55
+ handlers: Record<string, EventHandlerJSON>;
56
+ handlers_by_key: Record<string, string[]>;
57
+ event_history: Record<string, BaseEventJSON>;
58
+ pending_event_queue: string[];
59
+ };
60
+ export declare class CoreEventBusRegistry {
61
+ private _bus_refs;
62
+ private _bus_refs_by_id;
63
+ add(bus: RustCoreEventBus): void;
64
+ discard(bus: RustCoreEventBus): void;
65
+ has(bus: RustCoreEventBus): boolean;
66
+ get size(): number;
67
+ [Symbol.iterator](): IterableIterator<RustCoreEventBus>;
68
+ findBusById(bus_id: string): RustCoreEventBus | undefined;
69
+ findEventById(event_id: string): BaseEvent | null;
70
+ }
71
+ export declare const rustCoreEventBusRegistry: CoreEventBusRegistry;
72
+ export declare class CoreEventHistory implements Iterable<[string, BaseEvent]> {
73
+ max_history_size: number | null;
74
+ max_history_drop: boolean;
75
+ private readonly bus;
76
+ constructor(bus: RustCoreEventBus, options?: {
77
+ max_history_size?: number | null;
78
+ max_history_drop?: boolean;
79
+ });
80
+ get size(): number;
81
+ [Symbol.iterator](): Iterator<[string, BaseEvent]>;
82
+ entries(): IterableIterator<[string, BaseEvent]>;
83
+ keys(): IterableIterator<string>;
84
+ values(): IterableIterator<BaseEvent>;
85
+ clear(): void;
86
+ get(event_id: string): BaseEvent | undefined;
87
+ set(event_id: string, event: BaseEvent): this;
88
+ has(event_id: string): boolean;
89
+ delete(event_id: string): boolean;
90
+ addEvent(event: BaseEvent): void;
91
+ getEvent(event_id: string): BaseEvent | undefined;
92
+ removeEvent(event_id: string): boolean;
93
+ hasEvent(event_id: string): boolean;
94
+ find(event_pattern: '*', options?: FindOptions<BaseEvent>): Promise<BaseEvent | null>;
95
+ find(event_pattern: '*', where: (event: BaseEvent) => boolean, options?: FindOptions<BaseEvent>): Promise<BaseEvent | null>;
96
+ find<T extends BaseEvent>(event_pattern: EventPattern<T>, options?: FindOptions<T>): Promise<T | null>;
97
+ find<T extends BaseEvent>(event_pattern: EventPattern<T>, where: (event: T) => boolean, options?: FindOptions<T>): Promise<T | null>;
98
+ filter(event_pattern: '*', options?: FilterOptions<BaseEvent>): Promise<BaseEvent[]>;
99
+ filter(event_pattern: '*', where: (event: BaseEvent) => boolean, options?: FilterOptions<BaseEvent>): Promise<BaseEvent[]>;
100
+ filter<T extends BaseEvent>(event_pattern: EventPattern<T>, options?: FilterOptions<T>): Promise<T[]>;
101
+ filter<T extends BaseEvent>(event_pattern: EventPattern<T>, where: (event: T) => boolean, options?: FilterOptions<T>): Promise<T[]>;
102
+ }
103
+ export declare class CoreLockFacade {
104
+ private readonly bus;
105
+ private paused_count;
106
+ private pause_waiters;
107
+ private active_handler_results;
108
+ readonly bus_event_lock: AsyncLock;
109
+ constructor(bus: RustCoreEventBus);
110
+ _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined;
111
+ _getActiveHandlerResults(): EventResult[];
112
+ _requestRunloopPause(): () => void;
113
+ _waitUntilRunloopResumed(): Promise<void>;
114
+ _isPaused(): boolean;
115
+ _notifyIdleListeners(): void;
116
+ _isAnyHandlerActive(): boolean;
117
+ getLockForEvent(event: BaseEvent): AsyncLock | null;
118
+ waitForIdle(timeout?: number | null): Promise<boolean>;
119
+ _runWithHandlerLock<T>(event: BaseEvent, default_concurrency: EventHandlerConcurrencyMode, fn: (handler_lock: HandlerLock | null) => Promise<T> | T): Promise<T>;
120
+ _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T> | T): Promise<T>;
121
+ _runWithEventLock<T>(event: BaseEvent, fn: () => Promise<T> | T, options?: {
122
+ bypass_event_locks?: boolean;
123
+ pre_acquired_lock?: AsyncLock | null;
124
+ }): Promise<T>;
125
+ clear(): void;
126
+ }
127
+ export declare class RustCoreEventBus {
128
+ readonly core: RustCoreClient;
129
+ readonly name: string;
130
+ readonly id: string;
131
+ readonly bus_id: string;
132
+ readonly label: string;
133
+ readonly event_concurrency: EventConcurrencyMode;
134
+ readonly event_handler_concurrency: EventHandlerConcurrencyMode;
135
+ readonly event_handler_completion: EventHandlerCompletionMode;
136
+ readonly event_handler_detect_file_paths: boolean;
137
+ readonly event_timeout: number | null;
138
+ readonly event_slow_timeout: number | null;
139
+ readonly event_handler_timeout: number | null;
140
+ readonly event_handler_slow_timeout: number | null;
141
+ readonly handlers: Map<string, EventHandler>;
142
+ readonly handlers_by_key: Map<string, string[]>;
143
+ readonly event_history: CoreEventHistory;
144
+ readonly locks: CoreLockFacade;
145
+ all_instances: CoreEventBusRegistry;
146
+ _lock_for_event_global_serial: AsyncLock;
147
+ in_flight_event_ids: Set<string>;
148
+ runloop_running: boolean;
149
+ private registered;
150
+ private events;
151
+ private processing;
152
+ private processing_tasks;
153
+ private middlewares;
154
+ private invocation_by_result_id;
155
+ private abort_by_invocation_id;
156
+ private event_types_by_pattern;
157
+ private event_timeout_causes;
158
+ private event_completion_waiters;
159
+ private event_emission_waiters;
160
+ private invocation_worker;
161
+ private background_worker_enabled;
162
+ private foreground_drain_task;
163
+ private foreground_drain_requested;
164
+ private serial_route_pause_releases;
165
+ private completed_event_refs;
166
+ private closed;
167
+ private readonly owns_shared_core;
168
+ private registered_max_history_size;
169
+ private registered_max_history_drop;
170
+ constructor(name?: string, options?: RustCoreEventBusOptions);
171
+ get pending_event_queue(): BaseEvent[];
172
+ get find_waiters(): Set<(event: BaseEvent) => void>;
173
+ set pending_event_queue(events: BaseEvent[]);
174
+ toString(): string;
175
+ defaultsRecord(): Record<string, unknown>;
176
+ private busRecord;
177
+ start(): void;
178
+ private syncBusHistoryPolicy;
179
+ on<T extends BaseEvent>(event_type: EventPattern<T>, handler: CoreHandler<T>, options?: RustCoreHandlerOptions): EventHandler;
180
+ on(event_type: '*', handler: CoreHandler, options?: RustCoreHandlerOptions): EventHandler;
181
+ off<T extends BaseEvent>(event_type: EventPattern<T> | '*', handler?: CoreHandler<T> | string | EventHandler): void;
182
+ emit<T extends BaseEvent>(event: T): T;
183
+ emit(event: Record<string, unknown>): Promise<CoreMessage>;
184
+ private scheduleForegroundDrain;
185
+ _onRunloopResumed(): void;
186
+ private drainForegroundCore;
187
+ private processAvailableCoreMessages;
188
+ private coreEventRecordForEmit;
189
+ private coreForwardControlOptions;
190
+ dispatch<T extends BaseEvent>(event: T): T;
191
+ onEventChange(_event: BaseEvent, _status: 'pending' | 'started' | 'completed'): Promise<void>;
192
+ onEventResultChange(_event: BaseEvent, _result: EventResult, _status: 'pending' | 'started' | 'completed'): Promise<void>;
193
+ hasMiddlewareHooks(): boolean;
194
+ hasEventChangeHooks(): boolean;
195
+ hasEventResultHooks(): boolean;
196
+ _notifyEventChange(event: BaseEvent, status: 'pending' | 'started' | 'completed'): void;
197
+ _notifyEventResultChange(event: BaseEvent, result: EventResult, status: 'pending' | 'started' | 'completed'): void;
198
+ findEventById(event_id: string): BaseEvent | null;
199
+ findLocalEventById(event_id: string): BaseEvent | undefined;
200
+ rememberEvent(event_id: string, event: BaseEvent): void;
201
+ rememberLiveEvent(event_id: string, event: BaseEvent): void;
202
+ forgetEvent(event_id: string): void;
203
+ localEvents(): IterableIterator<BaseEvent>;
204
+ importEventsToCore(events: BaseEvent[], pending_events?: BaseEvent[]): void;
205
+ historyRecords(event_pattern?: string, limit?: number | null): Record<string, unknown>[];
206
+ historyEventIds(event_pattern?: string, limit?: number | null, statuses?: string[] | null): string[];
207
+ coreRecordBelongsToThisBus(record: Record<string, unknown>): boolean;
208
+ activeHandlerResult(): EventResult | null;
209
+ _getEventProxyScopedToThisBus<T extends BaseEvent>(event: T, _handler_result?: EventResult): T;
210
+ _hasProcessedEvent(event: BaseEvent): boolean;
211
+ _getHandlersForEvent(event: BaseEvent): EventHandler[];
212
+ private ensurePendingLocalResults;
213
+ _processEventImmediately<T extends BaseEvent>(event: T, _handler_result?: EventResult): Promise<T>;
214
+ private findActiveInvocationForQueueJump;
215
+ private waitForLocalCompletionPush;
216
+ private waitForLocalCompletionOrProcessingDrain;
217
+ _waitForEventCompletedInQueueOrder<T extends BaseEvent>(event: T): Promise<T>;
218
+ private eventIsOwnedByActiveHandler;
219
+ private findParentInvocationForEvent;
220
+ private findBusForInvocation;
221
+ processUntilEventCompleted(event_id: string, initial_messages?: CoreMessage[] | null): Promise<BaseEvent>;
222
+ private waitForCoreCompletedEvent;
223
+ runUntilEventCompleted(event_id: string): Promise<BaseEvent>;
224
+ _syncEventRuntimeOptions(event: BaseEvent): void;
225
+ waitUntilIdle(timeout?: number | null): Promise<boolean>;
226
+ isIdle(): boolean;
227
+ isIdleAndQueueEmpty(): boolean;
228
+ removeEventFromPendingQueue(_event: BaseEvent): number;
229
+ isEventInFlightOrQueued(event_id: string): boolean;
230
+ removeEventFromHistory(event_id: string): boolean;
231
+ destroy(options?: number | {
232
+ timeout?: number | null;
233
+ clear?: boolean;
234
+ }): Promise<void>;
235
+ eventIsChildOf(child_event: BaseEvent, parent_event: BaseEvent): boolean;
236
+ eventIsParentOf(parent_event: BaseEvent, child_event: BaseEvent): boolean;
237
+ logTree(): string;
238
+ private applyAndRunMessagesUntilEventCompleted;
239
+ private runInvocationMessagesInCoreRouteOrder;
240
+ private completedSnapshotOrEvent;
241
+ private releaseCompletedLocalEvent;
242
+ private trackLocalEventUntilCoreEvictsIt;
243
+ collectEvictedCompletedEventRefs(visible_event_ids?: Set<string> | null): void;
244
+ private pendingQueueEventsFromCore;
245
+ private refreshPendingQueueFromCore;
246
+ private refreshKnownEventsFromCore;
247
+ private applyCoreSnapshotToEvent;
248
+ find<T extends BaseEvent>(event_type: EventPattern<T> | '*', where_or_options?: ((event: T) => boolean) | FindOptions<T>, maybe_options?: FindOptions<T>): Promise<T | null>;
249
+ filter<T extends BaseEvent>(event_type: EventPattern<T> | '*', where_or_options?: ((event: T) => boolean) | FilterOptions<T>, maybe_options?: FilterOptions<T>): Promise<T[]>;
250
+ disconnect(): void;
251
+ close(): void;
252
+ stop(): void;
253
+ scheduleMicrotask(fn: () => void): void;
254
+ toJSON(): RustCoreEventBusJSON;
255
+ eventFromCoreRecord<T extends BaseEvent>(event_type: EventPattern<T> | '*', record: Record<string, unknown>): BaseEvent;
256
+ private isStaleInvocationOutcomeError;
257
+ private eventSnapshotMessageForInvocation;
258
+ private completeHandlerOrSnapshot;
259
+ private completeHandlerNoPatchesOrSnapshot;
260
+ private canUsePatchlessCompletedOutcome;
261
+ private errorHandlerOrSnapshot;
262
+ private activeCoreOutcomeBatch;
263
+ private runWithCoreOutcomeBatch;
264
+ private runWithoutCoreOutcomeBatch;
265
+ private localOutcomePatchMessages;
266
+ private commitInvocationOutcomeMessages;
267
+ private invocationCanUseBatchedOutcome;
268
+ private invocationUsesFirstCompletion;
269
+ private eventForInvocation;
270
+ private runInvocationOutcome;
271
+ private runInvocation;
272
+ private startForegroundCoreSignalTimer;
273
+ private applyExpiredEventTimeout;
274
+ private startForegroundEventTimeoutTimer;
275
+ private startedAtForInvocation;
276
+ private eventTimeoutForInvocation;
277
+ private startForegroundEventSlowWarningTimer;
278
+ private eventSlowTimeoutForInvocation;
279
+ private abortResultForEventTimeout;
280
+ private invocationAbortError;
281
+ private eventTimeoutIpcGraceSeconds;
282
+ private processAvailableAfterHandlerOutcome;
283
+ private releaseSerialRoutePausesForInvocation;
284
+ private applyResultSnapshot;
285
+ private retargetErrorResult;
286
+ private orderedResultRecords;
287
+ private childIdsFromResultRecord;
288
+ private attachResultChildren;
289
+ private normalizeResultError;
290
+ private restoreCoreError;
291
+ private restoreGenericError;
292
+ private publicCoreErrorMessage;
293
+ private causeForCancellation;
294
+ private parentTimeoutEventIdFromMessage;
295
+ private eventTimeoutCause;
296
+ private timeoutSecondsForCoreError;
297
+ private eventTimeoutSecondsForResult;
298
+ private resolveTimeoutOverride;
299
+ private positiveTimeoutFromUnknown;
300
+ private numberFromUnknown;
301
+ private timestampMs;
302
+ private timestampBefore;
303
+ private warnSlowEvent;
304
+ private warnSlowResult;
305
+ runWithActiveHandlerResult<T>(result: EventResult, fn: () => T): T;
306
+ private startWorker;
307
+ private stopWorker;
308
+ private handleWorkerMessages;
309
+ private runAndApplyInvocationMessages;
310
+ private runInvocationMessages;
311
+ private resolveEventCompletionWaiters;
312
+ private notifyEventEmissionWaiters;
313
+ private waitForLocalEventEmission;
314
+ private waitForEventCompleted;
315
+ private localBusesForCoreSession;
316
+ private busForInvocation;
317
+ private applyCoreMessageToLocalBuses;
318
+ private targetBusesForCoreMessage;
319
+ private applyCoreMessage;
320
+ private applyCoreMessageFromSharedCursor;
321
+ private patchBelongsToThisBus;
322
+ private localResultIdExists;
323
+ private applyCoreMessageUnchecked;
324
+ private applyResultRecord;
325
+ private cancelFirstModeLosersForCompletedEvent;
326
+ private _runMiddlewareHook;
327
+ private _onBusHandlersChange;
328
+ private waitForFutureMatch;
329
+ private findCoreRecordCreatedAfter;
330
+ private waitForEventEmittedCancellable;
331
+ }
332
+ export declare const stableCoreBusId: (bus_name: string) => string;
333
+ export declare const uniqueCoreBusId: () => string;
334
+ export declare const defaultCoreBusId: (bus_name: string, registry: CoreEventBusRegistry) => string;
@@ -247,7 +247,7 @@ class LockManager {
247
247
  };
248
248
  this.idle_waiters.push(finish);
249
249
  this.scheduleIdleCheck();
250
- if (timeout_seconds === null || timeout_seconds === void 0) {
250
+ if (timeout_seconds === null || timeout_seconds === void 0 || timeout_seconds <= 0) {
251
251
  return;
252
252
  }
253
253
  const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1e3;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/LockManager.ts"],
4
- "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = this._getRawActiveHandlerResultForCurrentAsyncContext()\n return result?.status === 'started' ? result : undefined\n }\n\n _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n return handler_context_storage?.getStore() as EventResult | undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { BaseEvent } from './BaseEvent.js'\nimport type { EventResult } from './EventResult.js'\nimport { createAsyncLocalStorage, type AsyncLocalStorageLike } from './async_context.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\nconst handler_context_storage: AsyncLocalStorageLike | null = createAsyncLocalStorage()\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n if (!handler_context_storage) {\n return await fn()\n }\n return await handler_context_storage.run(result, fn)\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n const result = this._getRawActiveHandlerResultForCurrentAsyncContext()\n return result?.status === 'started' ? result : undefined\n }\n\n _getRawActiveHandlerResultForCurrentAsyncContext(): EventResult | undefined {\n return handler_context_storage?.getStore() as EventResult | undefined\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined || timeout_seconds <= 0) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -27,7 +27,7 @@ export declare const BaseEventSchema: z.ZodObject<{
27
27
  }>>;
28
28
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
29
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
30
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
31
31
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
32
32
  "global-serial": "global-serial";
33
33
  "bus-serial": "bus-serial";
@@ -133,7 +133,7 @@ export declare class BaseEvent {
133
133
  }>>;
134
134
  event_started_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
135
  event_completed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
136
- event_results: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
136
+ event_results: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
137
  event_concurrency: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
138
138
  "global-serial": "global-serial";
139
139
  "bus-serial": "bus-serial";
@@ -61,7 +61,6 @@ export declare class EventHandler {
61
61
  eventbus_id: string;
62
62
  });
63
63
  get _handler_async(): EventHandlerCallable;
64
- static handlerNameFromCallable(handler: EventHandlerCallable): string;
65
64
  static computeHandlerId(params: {
66
65
  eventbus_id: string;
67
66
  handler_name: string;