abxbus 2.4.1

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 (137) hide show
  1. package/README.md +647 -0
  2. package/dist/cjs/async_context.d.ts +12 -0
  3. package/dist/cjs/async_context.js +70 -0
  4. package/dist/cjs/async_context.js.map +7 -0
  5. package/dist/cjs/base_event.d.ts +207 -0
  6. package/dist/cjs/base_event.js +871 -0
  7. package/dist/cjs/base_event.js.map +7 -0
  8. package/dist/cjs/bridge_jsonl.d.ts +26 -0
  9. package/dist/cjs/bridge_jsonl.js +170 -0
  10. package/dist/cjs/bridge_jsonl.js.map +7 -0
  11. package/dist/cjs/bridge_nats.d.ts +20 -0
  12. package/dist/cjs/bridge_nats.js +108 -0
  13. package/dist/cjs/bridge_nats.js.map +7 -0
  14. package/dist/cjs/bridge_postgres.d.ts +31 -0
  15. package/dist/cjs/bridge_postgres.js +251 -0
  16. package/dist/cjs/bridge_postgres.js.map +7 -0
  17. package/dist/cjs/bridge_redis.d.ts +34 -0
  18. package/dist/cjs/bridge_redis.js +175 -0
  19. package/dist/cjs/bridge_redis.js.map +7 -0
  20. package/dist/cjs/bridge_sqlite.d.ts +30 -0
  21. package/dist/cjs/bridge_sqlite.js +255 -0
  22. package/dist/cjs/bridge_sqlite.js.map +7 -0
  23. package/dist/cjs/bridges.d.ts +49 -0
  24. package/dist/cjs/bridges.js +326 -0
  25. package/dist/cjs/bridges.js.map +7 -0
  26. package/dist/cjs/event_bus.d.ts +127 -0
  27. package/dist/cjs/event_bus.js +1058 -0
  28. package/dist/cjs/event_bus.js.map +7 -0
  29. package/dist/cjs/event_handler.d.ts +139 -0
  30. package/dist/cjs/event_handler.js +299 -0
  31. package/dist/cjs/event_handler.js.map +7 -0
  32. package/dist/cjs/event_history.d.ts +45 -0
  33. package/dist/cjs/event_history.js +192 -0
  34. package/dist/cjs/event_history.js.map +7 -0
  35. package/dist/cjs/event_result.d.ts +86 -0
  36. package/dist/cjs/event_result.js +446 -0
  37. package/dist/cjs/event_result.js.map +7 -0
  38. package/dist/cjs/events_suck.d.ts +40 -0
  39. package/dist/cjs/events_suck.js +59 -0
  40. package/dist/cjs/events_suck.js.map +7 -0
  41. package/dist/cjs/helpers.d.ts +1 -0
  42. package/dist/cjs/helpers.js +84 -0
  43. package/dist/cjs/helpers.js.map +7 -0
  44. package/dist/cjs/index.d.ts +17 -0
  45. package/dist/cjs/index.js +54 -0
  46. package/dist/cjs/index.js.map +7 -0
  47. package/dist/cjs/lock_manager.d.ts +70 -0
  48. package/dist/cjs/lock_manager.js +343 -0
  49. package/dist/cjs/lock_manager.js.map +7 -0
  50. package/dist/cjs/logging.d.ts +16 -0
  51. package/dist/cjs/logging.js +216 -0
  52. package/dist/cjs/logging.js.map +7 -0
  53. package/dist/cjs/middlewares.d.ts +13 -0
  54. package/dist/cjs/middlewares.js +17 -0
  55. package/dist/cjs/middlewares.js.map +7 -0
  56. package/dist/cjs/optional_deps.d.ts +3 -0
  57. package/dist/cjs/optional_deps.js +64 -0
  58. package/dist/cjs/optional_deps.js.map +7 -0
  59. package/dist/cjs/package.json +5 -0
  60. package/dist/cjs/retry.d.ts +52 -0
  61. package/dist/cjs/retry.js +257 -0
  62. package/dist/cjs/retry.js.map +7 -0
  63. package/dist/cjs/timing.d.ts +3 -0
  64. package/dist/cjs/timing.js +76 -0
  65. package/dist/cjs/timing.js.map +7 -0
  66. package/dist/cjs/type_inference.test.d.ts +1 -0
  67. package/dist/cjs/types.d.ts +36 -0
  68. package/dist/cjs/types.js +104 -0
  69. package/dist/cjs/types.js.map +7 -0
  70. package/dist/esm/async_context.js +50 -0
  71. package/dist/esm/async_context.js.map +7 -0
  72. package/dist/esm/base_event.js +857 -0
  73. package/dist/esm/base_event.js.map +7 -0
  74. package/dist/esm/bridge_jsonl.js +150 -0
  75. package/dist/esm/bridge_jsonl.js.map +7 -0
  76. package/dist/esm/bridge_nats.js +88 -0
  77. package/dist/esm/bridge_nats.js.map +7 -0
  78. package/dist/esm/bridge_postgres.js +231 -0
  79. package/dist/esm/bridge_postgres.js.map +7 -0
  80. package/dist/esm/bridge_redis.js +155 -0
  81. package/dist/esm/bridge_redis.js.map +7 -0
  82. package/dist/esm/bridge_sqlite.js +235 -0
  83. package/dist/esm/bridge_sqlite.js.map +7 -0
  84. package/dist/esm/bridges.js +306 -0
  85. package/dist/esm/bridges.js.map +7 -0
  86. package/dist/esm/event_bus.js +1046 -0
  87. package/dist/esm/event_bus.js.map +7 -0
  88. package/dist/esm/event_handler.js +279 -0
  89. package/dist/esm/event_handler.js.map +7 -0
  90. package/dist/esm/event_history.js +172 -0
  91. package/dist/esm/event_history.js.map +7 -0
  92. package/dist/esm/event_result.js +426 -0
  93. package/dist/esm/event_result.js.map +7 -0
  94. package/dist/esm/events_suck.js +39 -0
  95. package/dist/esm/events_suck.js.map +7 -0
  96. package/dist/esm/helpers.js +64 -0
  97. package/dist/esm/helpers.js.map +7 -0
  98. package/dist/esm/index.js +47 -0
  99. package/dist/esm/index.js.map +7 -0
  100. package/dist/esm/lock_manager.js +323 -0
  101. package/dist/esm/lock_manager.js.map +7 -0
  102. package/dist/esm/logging.js +196 -0
  103. package/dist/esm/logging.js.map +7 -0
  104. package/dist/esm/middlewares.js +1 -0
  105. package/dist/esm/middlewares.js.map +7 -0
  106. package/dist/esm/optional_deps.js +44 -0
  107. package/dist/esm/optional_deps.js.map +7 -0
  108. package/dist/esm/retry.js +237 -0
  109. package/dist/esm/retry.js.map +7 -0
  110. package/dist/esm/timing.js +56 -0
  111. package/dist/esm/timing.js.map +7 -0
  112. package/dist/esm/types.js +84 -0
  113. package/dist/esm/types.js.map +7 -0
  114. package/dist/types/async_context.d.ts +12 -0
  115. package/dist/types/base_event.d.ts +207 -0
  116. package/dist/types/bridge_jsonl.d.ts +26 -0
  117. package/dist/types/bridge_nats.d.ts +20 -0
  118. package/dist/types/bridge_postgres.d.ts +31 -0
  119. package/dist/types/bridge_redis.d.ts +34 -0
  120. package/dist/types/bridge_sqlite.d.ts +30 -0
  121. package/dist/types/bridges.d.ts +49 -0
  122. package/dist/types/event_bus.d.ts +127 -0
  123. package/dist/types/event_handler.d.ts +139 -0
  124. package/dist/types/event_history.d.ts +45 -0
  125. package/dist/types/event_result.d.ts +86 -0
  126. package/dist/types/events_suck.d.ts +40 -0
  127. package/dist/types/helpers.d.ts +1 -0
  128. package/dist/types/index.d.ts +17 -0
  129. package/dist/types/lock_manager.d.ts +70 -0
  130. package/dist/types/logging.d.ts +16 -0
  131. package/dist/types/middlewares.d.ts +13 -0
  132. package/dist/types/optional_deps.d.ts +3 -0
  133. package/dist/types/retry.d.ts +52 -0
  134. package/dist/types/timing.d.ts +3 -0
  135. package/dist/types/type_inference.test.d.ts +1 -0
  136. package/dist/types/types.d.ts +36 -0
  137. package/package.json +87 -0
@@ -0,0 +1,446 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var event_result_exports = {};
20
+ __export(event_result_exports, {
21
+ EventResult: () => EventResult,
22
+ EventResultJSONSchema: () => EventResultJSONSchema
23
+ });
24
+ module.exports = __toCommonJS(event_result_exports);
25
+ var import_uuid = require("uuid");
26
+ var import_zod = require("zod");
27
+ var import_base_event = require("./base_event.js");
28
+ var import_event_handler = require("./event_handler.js");
29
+ var import_lock_manager = require("./lock_manager.js");
30
+ var import_types = require("./types.js");
31
+ var import_async_context = require("./async_context.js");
32
+ var import_retry = require("./retry.js");
33
+ var import_timing = require("./timing.js");
34
+ var import_helpers = require("./helpers.js");
35
+ const EventResultJSONSchema = import_zod.z.object({
36
+ id: import_zod.z.string(),
37
+ status: import_zod.z.enum(["pending", "started", "completed", "error"]),
38
+ event_id: import_zod.z.string(),
39
+ handler_id: import_zod.z.string(),
40
+ handler_name: import_zod.z.string(),
41
+ handler_file_path: import_zod.z.string().nullable().optional(),
42
+ handler_timeout: import_zod.z.number().nullable().optional(),
43
+ handler_slow_timeout: import_zod.z.number().nullable().optional(),
44
+ handler_registered_at: import_zod.z.string().datetime().optional(),
45
+ handler_event_pattern: import_zod.z.union([import_zod.z.string(), import_zod.z.literal("*")]).optional(),
46
+ eventbus_name: import_zod.z.string(),
47
+ eventbus_id: import_zod.z.string().uuid(),
48
+ started_at: import_zod.z.string().datetime().nullable().optional(),
49
+ completed_at: import_zod.z.string().datetime().nullable().optional(),
50
+ result: import_zod.z.unknown().optional(),
51
+ error: import_zod.z.unknown().optional(),
52
+ event_children: import_zod.z.array(import_zod.z.string())
53
+ }).strict();
54
+ class EventResult {
55
+ id;
56
+ // unique uuidv7 identifier for the event result
57
+ status;
58
+ // 'pending', 'started', 'completed', or 'error'
59
+ event;
60
+ // the Event that the handler is processing
61
+ handler;
62
+ // the EventHandler object that going to process the event
63
+ started_at;
64
+ completed_at;
65
+ result;
66
+ // parsed return value from the event handler
67
+ error;
68
+ // error object thrown by the event handler, or null if the handler completed successfully
69
+ event_children;
70
+ // list of emitted child events
71
+ // Abort signal: created when handler starts, rejected by _signalAbort() to
72
+ // interrupt runHandler's await via Promise.race.
73
+ _abort;
74
+ // Handler lock: tracks ownership of the handler concurrency lock
75
+ // during handler execution. Set by runHandler(), used by
76
+ // _processEventImmediately for yield-and-reacquire during queue-jumps.
77
+ _lock;
78
+ // Runloop pause releases keyed by bus for queue-jump; released when handler exits.
79
+ _queue_jump_pause_releases;
80
+ constructor(params) {
81
+ this.id = (0, import_uuid.v7)();
82
+ this.status = "pending";
83
+ this.event = params.event;
84
+ this.handler = params.handler;
85
+ this.started_at = null;
86
+ this.completed_at = null;
87
+ this.result = void 0;
88
+ this.error = void 0;
89
+ this.event_children = [];
90
+ this._abort = null;
91
+ this._lock = null;
92
+ this._queue_jump_pause_releases = null;
93
+ }
94
+ toString() {
95
+ return `${this.result ?? "null"} (${this.status})`;
96
+ }
97
+ get event_id() {
98
+ return this.event.event_id;
99
+ }
100
+ get bus() {
101
+ return this.event.bus;
102
+ }
103
+ get handler_id() {
104
+ return this.handler.id;
105
+ }
106
+ get handler_name() {
107
+ return this.handler.handler_name;
108
+ }
109
+ get handler_file_path() {
110
+ return this.handler.handler_file_path;
111
+ }
112
+ get eventbus_name() {
113
+ return this.handler.eventbus_name;
114
+ }
115
+ get eventbus_id() {
116
+ return this.handler.eventbus_id;
117
+ }
118
+ get eventbus_label() {
119
+ return `${this.handler.eventbus_name}#${this.handler.eventbus_id.slice(-4)}`;
120
+ }
121
+ getHookBus() {
122
+ const root_bus = this.event.bus;
123
+ if (!root_bus) {
124
+ return void 0;
125
+ }
126
+ return root_bus.all_instances.findBusById(this.eventbus_id) ?? root_bus;
127
+ }
128
+ async _notifyStatusHook(status) {
129
+ const hook_bus = this.getHookBus();
130
+ if (!hook_bus) {
131
+ return;
132
+ }
133
+ const event_for_hook = hook_bus._getEventProxyScopedToThisBus(this.event._event_original ?? this.event, this);
134
+ await hook_bus.onEventResultChange(event_for_hook, this, status);
135
+ }
136
+ // shortcut for the result value so users can do event_result.value instead of event_result.result
137
+ get value() {
138
+ return this.result;
139
+ }
140
+ // Per-result schema reference derives from the parent event schema.
141
+ // It is intentionally not serialized with each EventResult to avoid duplication.
142
+ get result_type() {
143
+ const original_event = this.event._event_original ?? this.event;
144
+ return original_event.event_result_type;
145
+ }
146
+ // Link a child event emitted by this handler run to the parent event/result.
147
+ _linkEmittedChildEvent(child_event) {
148
+ const original_child = child_event._event_original ?? child_event;
149
+ const parent_event = this.event._event_original ?? this.event;
150
+ if (original_child.event_id === parent_event.event_id) {
151
+ return;
152
+ }
153
+ if (!original_child.event_parent_id) {
154
+ original_child.event_parent_id = parent_event.event_id;
155
+ }
156
+ if (!original_child.event_emitted_by_handler_id) {
157
+ original_child.event_emitted_by_handler_id = this.handler_id;
158
+ }
159
+ if (!this.event_children.some((child) => child.event_id === original_child.event_id)) {
160
+ this.event_children.push(original_child);
161
+ }
162
+ }
163
+ // Get the raw return value from the handler, even if it threw an error / failed validation
164
+ get raw_value() {
165
+ if (this.error && this.error.raw_value !== void 0) {
166
+ return this.error.raw_value;
167
+ }
168
+ return this.result;
169
+ }
170
+ // Resolve handler timeout in seconds using precedence: handler -> event -> bus defaults.
171
+ get handler_timeout() {
172
+ const original = this.event._event_original ?? this.event;
173
+ const resolved_event_timeout = original.event_timeout ?? this.bus.event_timeout;
174
+ let resolved_handler_timeout;
175
+ if (this.handler.handler_timeout !== void 0) {
176
+ resolved_handler_timeout = this.handler.handler_timeout;
177
+ } else if (original.event_handler_timeout !== void 0) {
178
+ resolved_handler_timeout = original.event_handler_timeout;
179
+ } else {
180
+ resolved_handler_timeout = this.bus.event_timeout;
181
+ }
182
+ if (resolved_handler_timeout === null && resolved_event_timeout === null) {
183
+ return null;
184
+ }
185
+ if (resolved_handler_timeout === null) {
186
+ return resolved_event_timeout;
187
+ }
188
+ if (resolved_event_timeout === null) {
189
+ return resolved_handler_timeout;
190
+ }
191
+ return Math.min(resolved_handler_timeout, resolved_event_timeout);
192
+ }
193
+ // Resolve slow handler warning threshold in seconds using precedence: handler -> event -> bus defaults.
194
+ get handler_slow_timeout() {
195
+ const original = this.event._event_original ?? this.event;
196
+ if (this.handler.handler_slow_timeout !== void 0) {
197
+ return this.handler.handler_slow_timeout;
198
+ }
199
+ if (original.event_handler_slow_timeout !== void 0) {
200
+ return original.event_handler_slow_timeout;
201
+ }
202
+ const event_slow_timeout = original.event_slow_timeout;
203
+ if (event_slow_timeout !== void 0) {
204
+ return event_slow_timeout;
205
+ }
206
+ if (this.bus?.event_handler_slow_timeout !== void 0) {
207
+ return this.bus.event_handler_slow_timeout;
208
+ }
209
+ return this.bus?.event_slow_timeout ?? null;
210
+ }
211
+ // Create a slow-handler warning timer that logs if the handler runs too long.
212
+ _createSlowHandlerWarningTimer(effective_timeout) {
213
+ const handler_warn_timeout = this.handler_slow_timeout;
214
+ const warn_ms = handler_warn_timeout === null ? null : handler_warn_timeout * 1e3;
215
+ const should_warn = warn_ms !== null && (effective_timeout === null || effective_timeout * 1e3 > warn_ms);
216
+ if (!should_warn || warn_ms === null) {
217
+ return null;
218
+ }
219
+ const event = this.event._event_original ?? this.event;
220
+ const bus_name = this.handler.eventbus_name;
221
+ const started_at_ms = performance.now();
222
+ return setTimeout(() => {
223
+ if (this.status !== "started") {
224
+ return;
225
+ }
226
+ const elapsed_ms = performance.now() - started_at_ms;
227
+ const elapsed_seconds = (elapsed_ms / 1e3).toFixed(1);
228
+ console.warn(
229
+ `[abxbus] Slow event handler: ${bus_name}.on(${event.toString()}, ${this.handler.toString()}) still running after ${elapsed_seconds}s`
230
+ );
231
+ }, warn_ms);
232
+ }
233
+ _ensureQueueJumpPause(bus) {
234
+ if (!this._queue_jump_pause_releases) {
235
+ this._queue_jump_pause_releases = /* @__PURE__ */ new Map();
236
+ }
237
+ if (this._queue_jump_pause_releases.has(bus)) {
238
+ return;
239
+ }
240
+ this._queue_jump_pause_releases.set(bus, bus.locks._requestRunloopPause());
241
+ }
242
+ _releaseQueueJumpPauses() {
243
+ if (!this._queue_jump_pause_releases) {
244
+ return;
245
+ }
246
+ for (const release of this._queue_jump_pause_releases.values()) {
247
+ release();
248
+ }
249
+ this._queue_jump_pause_releases.clear();
250
+ }
251
+ update(params) {
252
+ const has_status = "status" in params;
253
+ const has_result = "result" in params;
254
+ const has_error = "error" in params;
255
+ if (has_result) {
256
+ const raw_result = params.result;
257
+ this.status = "completed";
258
+ if (this.event.event_result_type && raw_result !== void 0 && !(raw_result instanceof import_base_event.BaseEvent) && (0, import_types.isZodSchema)(this.event.event_result_type)) {
259
+ const parsed = this.event.event_result_type.safeParse(raw_result);
260
+ if (parsed.success) {
261
+ this.result = parsed.data;
262
+ } else {
263
+ const error = new import_event_handler.EventHandlerResultSchemaError(
264
+ `Event handler return value ${JSON.stringify(raw_result).slice(0, 20)}... did not match event_result_type: ${parsed.error.message}`,
265
+ { event_result: this, cause: parsed.error, raw_value: raw_result }
266
+ );
267
+ this.error = error;
268
+ this.result = void 0;
269
+ this.status = "error";
270
+ }
271
+ } else {
272
+ this.result = raw_result;
273
+ }
274
+ }
275
+ if (has_error) {
276
+ this.error = params.error;
277
+ this.status = "error";
278
+ }
279
+ if (has_status && params.status !== void 0) {
280
+ this.status = params.status;
281
+ }
282
+ if (this.status !== "pending" && this.started_at === null) {
283
+ this.started_at = (0, import_helpers.monotonicDatetime)();
284
+ }
285
+ if ((this.status === "completed" || this.status === "error") && this.completed_at === null) {
286
+ this.completed_at = (0, import_helpers.monotonicDatetime)();
287
+ }
288
+ return this;
289
+ }
290
+ _createHandlerTimeoutError(event) {
291
+ return new import_event_handler.EventHandlerTimeoutError(
292
+ `${this.bus.toString()}.on(${event.toString()}, ${this.handler.toString()}) timed out after ${this.handler_timeout}s`,
293
+ {
294
+ event_result: this,
295
+ timeout_seconds: this.handler_timeout
296
+ }
297
+ );
298
+ }
299
+ _handleHandlerError(event, error) {
300
+ const normalized_error = error instanceof import_retry.RetryTimeoutError ? new import_event_handler.EventHandlerTimeoutError(error.message, { event_result: this, timeout_seconds: error.timeout_seconds, cause: error }) : error;
301
+ if (normalized_error instanceof import_event_handler.EventHandlerTimeoutError) {
302
+ this._markError(normalized_error, false);
303
+ event._cancelPendingChildProcessing(normalized_error);
304
+ } else {
305
+ this._markError(normalized_error, false);
306
+ }
307
+ }
308
+ _onHandlerExit(slow_handler_warning_timer) {
309
+ this._abort = null;
310
+ this._lock = null;
311
+ this._releaseQueueJumpPauses();
312
+ if (slow_handler_warning_timer) {
313
+ clearTimeout(slow_handler_warning_timer);
314
+ }
315
+ }
316
+ // Run one handler invocation with timeout/slow-monitor/error handling.
317
+ // Handler lock acquisition is owned by BaseEvent._runHandlers(...).
318
+ async runHandler(handler_lock) {
319
+ if (this.status === "error" && this.error instanceof import_event_handler.EventHandlerCancelledError) {
320
+ return;
321
+ }
322
+ const event = this.event._event_original ?? this.event;
323
+ const handler_event = this.bus._getEventProxyScopedToThisBus(event, this);
324
+ if (this._lock) {
325
+ this._lock.exitHandlerRun();
326
+ }
327
+ let slow_handler_warning_timer = null;
328
+ if (this.status === "error" || this.status === "completed") {
329
+ return;
330
+ }
331
+ this._lock = handler_lock;
332
+ await this.bus.locks._runWithHandlerDispatchContext(this, async () => {
333
+ await (0, import_async_context._runWithAsyncContext)(event._getDispatchContext() ?? null, async () => {
334
+ try {
335
+ const should_notify_started = this.status === "pending";
336
+ const abort_signal = this._markStarted(false);
337
+ if (should_notify_started) {
338
+ await this._notifyStatusHook("started");
339
+ }
340
+ slow_handler_warning_timer = this._createSlowHandlerWarningTimer(this.handler_timeout);
341
+ const handler_result = await (0, import_timing._runWithTimeout)(
342
+ this.handler_timeout,
343
+ () => this._createHandlerTimeoutError(event),
344
+ () => (0, import_timing._runWithSlowMonitor)(
345
+ slow_handler_warning_timer,
346
+ () => (0, import_timing._runWithAbortMonitor)(() => this.handler._handler_async(handler_event), abort_signal)
347
+ )
348
+ );
349
+ this._markCompleted(handler_result, false);
350
+ } catch (error) {
351
+ this._handleHandlerError(event, error);
352
+ } finally {
353
+ if (this.status === "completed" || this.status === "error") {
354
+ await this._notifyStatusHook("completed");
355
+ }
356
+ this._onHandlerExit(slow_handler_warning_timer);
357
+ }
358
+ });
359
+ });
360
+ }
361
+ // Reject the abort promise, causing runHandler's Promise.race to
362
+ // throw immediately — even if the handler has no timeout.
363
+ _signalAbort(error) {
364
+ if (this._abort) {
365
+ this._abort.reject(error);
366
+ this._abort = null;
367
+ }
368
+ }
369
+ // Mark started and return the abort promise for Promise.race.
370
+ _markStarted(notify_hook = true) {
371
+ if (!this._abort) {
372
+ this._abort = (0, import_lock_manager.withResolvers)();
373
+ }
374
+ if (this.status === "pending") {
375
+ this.update({ status: "started" });
376
+ if (notify_hook) {
377
+ void this._notifyStatusHook("started");
378
+ }
379
+ }
380
+ return this._abort.promise;
381
+ }
382
+ _markCompleted(result, notify_hook = true) {
383
+ if (this.status === "completed" || this.status === "error") return;
384
+ this.update({ result });
385
+ if (notify_hook) {
386
+ void this._notifyStatusHook("completed");
387
+ }
388
+ }
389
+ _markError(error, notify_hook = true) {
390
+ if (this.status === "completed" || this.status === "error") return;
391
+ this.update({ error });
392
+ if (notify_hook) {
393
+ void this._notifyStatusHook("completed");
394
+ }
395
+ }
396
+ toJSON() {
397
+ return {
398
+ id: this.id,
399
+ status: this.status,
400
+ event_id: this.event.event_id,
401
+ handler_id: this.handler_id,
402
+ handler_name: this.handler_name,
403
+ handler_file_path: this.handler_file_path,
404
+ handler_timeout: this.handler.handler_timeout,
405
+ handler_slow_timeout: this.handler.handler_slow_timeout,
406
+ handler_registered_at: this.handler.handler_registered_at,
407
+ handler_event_pattern: this.handler.event_pattern,
408
+ eventbus_name: this.eventbus_name,
409
+ eventbus_id: this.eventbus_id,
410
+ started_at: this.started_at,
411
+ completed_at: this.completed_at,
412
+ result: this.result,
413
+ error: this.error,
414
+ event_children: this.event_children.map((child) => child.event_id)
415
+ };
416
+ }
417
+ static fromJSON(event, data) {
418
+ const record = EventResultJSONSchema.parse(data);
419
+ const handler_record = {
420
+ id: record.handler_id,
421
+ eventbus_name: record.eventbus_name,
422
+ eventbus_id: record.eventbus_id,
423
+ event_pattern: record.handler_event_pattern ?? event.event_type,
424
+ handler_name: record.handler_name,
425
+ handler_file_path: record.handler_file_path ?? null,
426
+ handler_timeout: record.handler_timeout,
427
+ handler_slow_timeout: record.handler_slow_timeout,
428
+ handler_registered_at: record.handler_registered_at ?? event.event_created_at
429
+ };
430
+ const handler_stub = import_event_handler.EventHandler.fromJSON(handler_record, (() => void 0));
431
+ const result = new EventResult({ event, handler: handler_stub });
432
+ result.id = record.id;
433
+ result.status = record.status;
434
+ result.started_at = record.started_at === null || record.started_at === void 0 ? null : (0, import_helpers.monotonicDatetime)(record.started_at);
435
+ result.completed_at = record.completed_at === null || record.completed_at === void 0 ? null : (0, import_helpers.monotonicDatetime)(record.completed_at);
436
+ if ("result" in record) {
437
+ result.result = record.result;
438
+ }
439
+ if ("error" in record) {
440
+ result.error = record.error;
441
+ }
442
+ result.event_children = [];
443
+ return result;
444
+ }
445
+ }
446
+ //# sourceMappingURL=event_result.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/event_result.ts"],
4
+ "sourcesContent": ["import { v7 as uuidv7 } from 'uuid'\n\nimport { z } from 'zod'\n\nimport { BaseEvent } from './base_event.js'\nimport type { EventBus } from './event_bus.js'\nimport { EventHandler, EventHandlerCancelledError, EventHandlerResultSchemaError, EventHandlerTimeoutError } from './event_handler.js'\nimport { withResolvers, type HandlerLock } from './lock_manager.js'\nimport type { Deferred } from './lock_manager.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 return this.event.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.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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",
6
+ "names": ["uuidv7"]
7
+ }
@@ -0,0 +1,40 @@
1
+ import { EventBus } from './event_bus.js';
2
+ import { BaseEvent } from './base_event.js';
3
+ import type { EventClass, EventResultType } from './types.js';
4
+ type EventMap = Record<string, EventClass<BaseEvent>>;
5
+ type AnyFn = (...args: any[]) => any;
6
+ type FunctionMap = Record<string, AnyFn>;
7
+ type ExtraDict = Record<string, unknown>;
8
+ type EventFieldsFromFn<TFunc extends AnyFn> = Parameters<TFunc> extends [infer TArg] ? (TArg extends Record<string, unknown> ? TArg : ExtraDict) : ExtraDict;
9
+ type GeneratedEvent<TFunc extends AnyFn> = {
10
+ (data: EventFieldsFromFn<TFunc> & ExtraDict): BaseEvent & EventFieldsFromFn<TFunc> & {
11
+ __event_result_type__?: Awaited<ReturnType<TFunc>>;
12
+ };
13
+ new (data: EventFieldsFromFn<TFunc> & ExtraDict): BaseEvent & EventFieldsFromFn<TFunc> & {
14
+ __event_result_type__?: Awaited<ReturnType<TFunc>>;
15
+ };
16
+ event_type?: string;
17
+ };
18
+ export type GeneratedEvents<TEvents extends FunctionMap> = {
19
+ by_name: {
20
+ [K in keyof TEvents]: GeneratedEvent<TEvents[K]>;
21
+ };
22
+ } & {
23
+ [K in keyof TEvents]: GeneratedEvent<TEvents[K]>;
24
+ };
25
+ type EventInit<TEventClass extends EventClass<BaseEvent>> = ConstructorParameters<TEventClass> extends [infer TInit, ...unknown[]] ? TInit : never;
26
+ type EventMethodArgs<TEventClass extends EventClass<BaseEvent>> = {} extends EventInit<TEventClass> ? [init?: EventInit<TEventClass>, extra?: Record<string, unknown>] : [init: EventInit<TEventClass>, extra?: Record<string, unknown>];
27
+ type EventMethodResult<TEventClass extends EventClass<BaseEvent>> = EventResultType<InstanceType<TEventClass>> | undefined;
28
+ export type EventsSuckClient<TEvents extends EventMap> = {
29
+ bus: EventBus;
30
+ } & {
31
+ [K in keyof TEvents]: (...args: EventMethodArgs<TEvents[K]>) => Promise<EventMethodResult<TEvents[K]>>;
32
+ };
33
+ export type EventsSuckClientClass<TEvents extends EventMap> = new (bus?: EventBus) => EventsSuckClient<TEvents>;
34
+ export declare const make_events: <TEvents extends FunctionMap>(events: TEvents) => GeneratedEvents<TEvents>;
35
+ export declare const wrap: <TEvents extends EventMap>(class_name: string, methods: TEvents) => EventsSuckClientClass<TEvents>;
36
+ export declare const events_suck: {
37
+ readonly make_events: <TEvents extends FunctionMap>(events: TEvents) => GeneratedEvents<TEvents>;
38
+ readonly wrap: <TEvents extends EventMap>(class_name: string, methods: TEvents) => EventsSuckClientClass<TEvents>;
39
+ };
40
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var events_suck_exports = {};
20
+ __export(events_suck_exports, {
21
+ events_suck: () => events_suck,
22
+ make_events: () => make_events,
23
+ wrap: () => wrap
24
+ });
25
+ module.exports = __toCommonJS(events_suck_exports);
26
+ var import_event_bus = require("./event_bus.js");
27
+ var import_base_event = require("./base_event.js");
28
+ const make_events = (events) => {
29
+ const by_name = {};
30
+ for (const [event_name] of Object.entries(events)) {
31
+ if (!/^[A-Za-z_$][\w$]*$/.test(String(event_name))) {
32
+ throw new Error(`Invalid event name: ${String(event_name)}`);
33
+ }
34
+ by_name[event_name] = import_base_event.BaseEvent.extend(String(event_name), {});
35
+ }
36
+ return Object.assign({ by_name }, by_name);
37
+ };
38
+ const wrap = (class_name, methods) => {
39
+ class WrappedClient {
40
+ bus;
41
+ constructor(bus) {
42
+ this.bus = bus ?? new import_event_bus.EventBus(`${class_name}Bus`);
43
+ }
44
+ }
45
+ Object.defineProperty(WrappedClient, "name", { value: class_name });
46
+ for (const [method_name, EventCtor] of Object.entries(methods)) {
47
+ Object.defineProperty(WrappedClient.prototype, method_name, {
48
+ value: async function(init, extra) {
49
+ const payload = { ...init ?? {}, ...extra ?? {} };
50
+ return await this.bus.emit(new EventCtor(payload)).first();
51
+ },
52
+ writable: true,
53
+ configurable: true
54
+ });
55
+ }
56
+ return WrappedClient;
57
+ };
58
+ const events_suck = { make_events, wrap };
59
+ //# sourceMappingURL=events_suck.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/events_suck.ts"],
4
+ "sourcesContent": ["import { EventBus } from './event_bus.js'\nimport { BaseEvent } from './base_event.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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AACzB,wBAA0B;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,4BAAU,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,0BAAS,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;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ export declare function monotonicDatetime(isostring?: string): string;