abxbus 2.4.26 → 2.4.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/cjs/BaseEvent.d.ts +211 -0
  2. package/dist/cjs/{base_event.js → BaseEvent.js} +38 -30
  3. package/dist/cjs/BaseEvent.js.map +7 -0
  4. package/dist/cjs/EventBridge.d.ts +34 -0
  5. package/dist/cjs/EventBridge.js +295 -0
  6. package/dist/cjs/EventBridge.js.map +7 -0
  7. package/dist/cjs/EventBus.d.ts +125 -0
  8. package/dist/cjs/{event_bus.js → EventBus.js} +21 -21
  9. package/dist/cjs/EventBus.js.map +7 -0
  10. package/dist/cjs/EventBusMiddleware.d.ts +13 -0
  11. package/dist/cjs/EventBusMiddleware.js +17 -0
  12. package/dist/cjs/EventBusMiddleware.js.map +7 -0
  13. package/dist/cjs/EventHandler.d.ts +140 -0
  14. package/dist/cjs/{event_handler.js → EventHandler.js} +4 -4
  15. package/dist/cjs/EventHandler.js.map +7 -0
  16. package/dist/cjs/EventHistory.d.ts +45 -0
  17. package/dist/cjs/{event_history.js → EventHistory.js} +4 -4
  18. package/dist/cjs/EventHistory.js.map +7 -0
  19. package/dist/cjs/EventResult.d.ts +86 -0
  20. package/dist/cjs/{event_result.js → EventResult.js} +18 -16
  21. package/dist/cjs/EventResult.js.map +7 -0
  22. package/dist/cjs/HTTPEventBridge.d.ts +10 -0
  23. package/dist/cjs/HTTPEventBridge.js +37 -0
  24. package/dist/cjs/HTTPEventBridge.js.map +7 -0
  25. package/dist/cjs/JSONLEventBridge.d.ts +26 -0
  26. package/dist/cjs/{bridge_jsonl.js → JSONLEventBridge.js} +8 -8
  27. package/dist/cjs/JSONLEventBridge.js.map +7 -0
  28. package/dist/cjs/LockManager.d.ts +70 -0
  29. package/dist/cjs/{lock_manager.js → LockManager.js} +4 -4
  30. package/dist/cjs/LockManager.js.map +7 -0
  31. package/dist/cjs/NATSEventBridge.d.ts +20 -0
  32. package/dist/cjs/{bridge_nats.js → NATSEventBridge.js} +8 -8
  33. package/dist/cjs/NATSEventBridge.js.map +7 -0
  34. package/dist/cjs/{middleware_otel_tracing.d.ts → OtelTracingMiddleware.d.ts} +4 -4
  35. package/dist/cjs/{middleware_otel_tracing.js → OtelTracingMiddleware.js} +4 -4
  36. package/dist/cjs/OtelTracingMiddleware.js.map +7 -0
  37. package/dist/cjs/PostgresEventBridge.d.ts +31 -0
  38. package/dist/cjs/{bridge_postgres.js → PostgresEventBridge.js} +8 -8
  39. package/dist/cjs/PostgresEventBridge.js.map +7 -0
  40. package/dist/cjs/RedisEventBridge.d.ts +34 -0
  41. package/dist/cjs/{bridge_redis.js → RedisEventBridge.js} +8 -8
  42. package/dist/cjs/RedisEventBridge.js.map +7 -0
  43. package/dist/cjs/SQLiteEventBridge.d.ts +30 -0
  44. package/dist/cjs/{bridge_sqlite.js → SQLiteEventBridge.js} +8 -8
  45. package/dist/cjs/SQLiteEventBridge.js.map +7 -0
  46. package/dist/cjs/SocketEventBridge.d.ts +4 -0
  47. package/dist/cjs/SocketEventBridge.js +35 -0
  48. package/dist/cjs/SocketEventBridge.js.map +7 -0
  49. package/dist/cjs/base_event.d.ts +2 -2
  50. package/dist/cjs/bridges.d.ts +9 -49
  51. package/dist/cjs/bridges.js +16 -303
  52. package/dist/cjs/bridges.js.map +2 -2
  53. package/dist/cjs/event_handler.d.ts +0 -1
  54. package/dist/cjs/events_suck.d.ts +2 -2
  55. package/dist/cjs/events_suck.js +4 -4
  56. package/dist/cjs/events_suck.js.map +2 -2
  57. package/dist/cjs/index.d.ts +15 -14
  58. package/dist/cjs/index.js +24 -24
  59. package/dist/cjs/index.js.map +2 -2
  60. package/dist/cjs/logging.d.ts +2 -2
  61. package/dist/cjs/logging.js +7 -7
  62. package/dist/cjs/logging.js.map +2 -2
  63. package/dist/cjs/middlewares.d.ts +1 -13
  64. package/dist/cjs/middlewares.js.map +1 -1
  65. package/dist/cjs/types.d.ts +1 -1
  66. package/dist/cjs/types.js.map +1 -1
  67. package/dist/esm/{base_event.js → BaseEvent.js} +20 -12
  68. package/dist/esm/BaseEvent.js.map +7 -0
  69. package/dist/esm/EventBridge.js +275 -0
  70. package/dist/esm/EventBridge.js.map +7 -0
  71. package/dist/esm/{event_bus.js → EventBus.js} +5 -5
  72. package/dist/esm/EventBus.js.map +7 -0
  73. package/dist/esm/EventBusMiddleware.js +1 -0
  74. package/dist/esm/EventBusMiddleware.js.map +7 -0
  75. package/dist/esm/{event_handler.js → EventHandler.js} +1 -1
  76. package/dist/esm/EventHandler.js.map +7 -0
  77. package/dist/esm/{event_history.js → EventHistory.js} +1 -1
  78. package/dist/esm/EventHistory.js.map +7 -0
  79. package/dist/esm/{event_result.js → EventResult.js} +7 -5
  80. package/dist/esm/EventResult.js.map +7 -0
  81. package/dist/esm/HTTPEventBridge.js +17 -0
  82. package/dist/esm/HTTPEventBridge.js.map +7 -0
  83. package/dist/esm/{bridge_jsonl.js → JSONLEventBridge.js} +3 -3
  84. package/dist/esm/JSONLEventBridge.js.map +7 -0
  85. package/dist/esm/{lock_manager.js → LockManager.js} +1 -1
  86. package/dist/esm/LockManager.js.map +7 -0
  87. package/dist/esm/{bridge_nats.js → NATSEventBridge.js} +3 -3
  88. package/dist/esm/NATSEventBridge.js.map +7 -0
  89. package/dist/esm/{middleware_otel_tracing.js → OtelTracingMiddleware.js} +1 -1
  90. package/dist/esm/OtelTracingMiddleware.js.map +7 -0
  91. package/dist/esm/{bridge_postgres.js → PostgresEventBridge.js} +3 -3
  92. package/dist/esm/PostgresEventBridge.js.map +7 -0
  93. package/dist/esm/{bridge_redis.js → RedisEventBridge.js} +3 -3
  94. package/dist/esm/RedisEventBridge.js.map +7 -0
  95. package/dist/esm/{bridge_sqlite.js → SQLiteEventBridge.js} +3 -3
  96. package/dist/esm/SQLiteEventBridge.js.map +7 -0
  97. package/dist/esm/SocketEventBridge.js +15 -0
  98. package/dist/esm/SocketEventBridge.js.map +7 -0
  99. package/dist/esm/bridges.js +9 -296
  100. package/dist/esm/bridges.js.map +2 -2
  101. package/dist/esm/events_suck.js +2 -2
  102. package/dist/esm/events_suck.js.map +1 -1
  103. package/dist/esm/index.js +11 -19
  104. package/dist/esm/index.js.map +2 -2
  105. package/dist/esm/logging.js +2 -2
  106. package/dist/esm/logging.js.map +1 -1
  107. package/dist/esm/types.js.map +1 -1
  108. package/dist/types/BaseEvent.d.ts +211 -0
  109. package/dist/types/EventBridge.d.ts +34 -0
  110. package/dist/types/EventBus.d.ts +125 -0
  111. package/dist/types/EventBusMiddleware.d.ts +13 -0
  112. package/dist/types/EventHandler.d.ts +140 -0
  113. package/dist/types/EventHistory.d.ts +45 -0
  114. package/dist/types/EventResult.d.ts +86 -0
  115. package/dist/types/HTTPEventBridge.d.ts +10 -0
  116. package/dist/types/JSONLEventBridge.d.ts +26 -0
  117. package/dist/types/LockManager.d.ts +70 -0
  118. package/dist/types/NATSEventBridge.d.ts +20 -0
  119. package/dist/types/{middleware_otel_tracing.d.ts → OtelTracingMiddleware.d.ts} +4 -4
  120. package/dist/types/PostgresEventBridge.d.ts +31 -0
  121. package/dist/types/RedisEventBridge.d.ts +34 -0
  122. package/dist/types/SQLiteEventBridge.d.ts +30 -0
  123. package/dist/types/SocketEventBridge.d.ts +4 -0
  124. package/dist/types/base_event.d.ts +2 -2
  125. package/dist/types/bridges.d.ts +9 -49
  126. package/dist/types/event_handler.d.ts +0 -1
  127. package/dist/types/events_suck.d.ts +2 -2
  128. package/dist/types/index.d.ts +15 -14
  129. package/dist/types/logging.d.ts +2 -2
  130. package/dist/types/middlewares.d.ts +1 -13
  131. package/dist/types/types.d.ts +1 -1
  132. package/package.json +52 -10
  133. package/src/{base_event.ts → BaseEvent.ts} +21 -13
  134. package/src/EventBridge.ts +332 -0
  135. package/src/{event_bus.ts → EventBus.ts} +6 -6
  136. package/src/EventBusMiddleware.ts +16 -0
  137. package/src/{event_handler.ts → EventHandler.ts} +2 -2
  138. package/src/{event_history.ts → EventHistory.ts} +1 -1
  139. package/src/{event_result.ts → EventResult.ts} +8 -6
  140. package/src/HTTPEventBridge.ts +27 -0
  141. package/src/{bridge_jsonl.ts → JSONLEventBridge.ts} +2 -2
  142. package/src/{lock_manager.ts → LockManager.ts} +2 -2
  143. package/src/{bridge_nats.ts → NATSEventBridge.ts} +2 -2
  144. package/src/{middleware_otel_tracing.ts → OtelTracingMiddleware.ts} +4 -4
  145. package/src/{bridge_postgres.ts → PostgresEventBridge.ts} +2 -2
  146. package/src/{bridge_redis.ts → RedisEventBridge.ts} +2 -2
  147. package/src/{bridge_sqlite.ts → SQLiteEventBridge.ts} +2 -2
  148. package/src/SocketEventBridge.ts +13 -0
  149. package/src/bridges.ts +9 -376
  150. package/src/events_suck.ts +2 -2
  151. package/src/index.ts +15 -22
  152. package/src/logging.ts +3 -3
  153. package/src/middlewares.ts +1 -16
  154. package/src/types.ts +1 -1
  155. package/dist/cjs/base_event.js.map +0 -7
  156. package/dist/cjs/bridge_jsonl.js.map +0 -7
  157. package/dist/cjs/bridge_nats.js.map +0 -7
  158. package/dist/cjs/bridge_postgres.js.map +0 -7
  159. package/dist/cjs/bridge_redis.js.map +0 -7
  160. package/dist/cjs/bridge_sqlite.js.map +0 -7
  161. package/dist/cjs/event_bus.js.map +0 -7
  162. package/dist/cjs/event_handler.js.map +0 -7
  163. package/dist/cjs/event_history.js.map +0 -7
  164. package/dist/cjs/event_result.js.map +0 -7
  165. package/dist/cjs/lock_manager.js.map +0 -7
  166. package/dist/cjs/middleware_otel_tracing.js.map +0 -7
  167. package/dist/esm/base_event.js.map +0 -7
  168. package/dist/esm/bridge_jsonl.js.map +0 -7
  169. package/dist/esm/bridge_nats.js.map +0 -7
  170. package/dist/esm/bridge_postgres.js.map +0 -7
  171. package/dist/esm/bridge_redis.js.map +0 -7
  172. package/dist/esm/bridge_sqlite.js.map +0 -7
  173. package/dist/esm/event_bus.js.map +0 -7
  174. package/dist/esm/event_handler.js.map +0 -7
  175. package/dist/esm/event_history.js.map +0 -7
  176. package/dist/esm/event_result.js.map +0 -7
  177. package/dist/esm/lock_manager.js.map +0 -7
  178. package/dist/esm/middleware_otel_tracing.js.map +0 -7
@@ -1,300 +1,13 @@
1
- import { BaseEvent } from "./base_event.js";
2
- import { EventBus } from "./event_bus.js";
3
- const isNodeRuntime = () => {
4
- const maybe_process = globalThis.process;
5
- return typeof maybe_process?.versions?.node === "string";
6
- };
7
- const isBrowserRuntime = () => !isNodeRuntime() && typeof globalThis.window !== "undefined";
8
- const randomSuffix = () => Math.random().toString(36).slice(2, 10);
9
- const UNIX_SOCKET_MAX_PATH_CHARS = 90;
10
- const parseEndpoint = (raw_endpoint) => {
11
- let parsed;
12
- try {
13
- parsed = new URL(raw_endpoint);
14
- } catch {
15
- throw new Error(`Invalid endpoint URL: ${raw_endpoint}`);
16
- }
17
- const protocol = parsed.protocol.replace(/:$/, "").toLowerCase();
18
- if (protocol !== "unix" && protocol !== "http" && protocol !== "https") {
19
- throw new Error(`Unsupported endpoint scheme: ${raw_endpoint}`);
20
- }
21
- if (protocol === "unix") {
22
- const socket_path = decodeURIComponent(parsed.pathname || "");
23
- if (!socket_path) {
24
- throw new Error(`Invalid unix endpoint (missing socket path): ${raw_endpoint}`);
25
- }
26
- const socket_path_len = new TextEncoder().encode(socket_path).length;
27
- if (socket_path_len > UNIX_SOCKET_MAX_PATH_CHARS) {
28
- throw new Error(`Unix socket path is too long (${socket_path_len} chars), max is ${UNIX_SOCKET_MAX_PATH_CHARS}: ${socket_path}`);
29
- }
30
- return { raw: raw_endpoint, scheme: "unix", path: socket_path };
31
- }
32
- if (!parsed.hostname) {
33
- throw new Error(`Invalid HTTP endpoint (missing hostname): ${raw_endpoint}`);
34
- }
35
- const default_port = protocol === "https" ? 443 : 80;
36
- return {
37
- raw: raw_endpoint,
38
- scheme: protocol,
39
- host: parsed.hostname,
40
- port: parsed.port ? Number(parsed.port) : default_port,
41
- path: `${parsed.pathname || "/"}${parsed.search || ""}`
42
- };
43
- };
44
- const importNodeModule = async (specifier) => {
45
- const dynamic_import = Function("module_name", "return import(module_name)");
46
- return dynamic_import(specifier);
47
- };
48
- class _EventBridge {
49
- send_to;
50
- listen_on;
51
- name;
52
- inbound_bus;
53
- start_promise;
54
- node_server;
55
- constructor(send_to, listen_on, name) {
56
- this.send_to = send_to ? parseEndpoint(send_to) : null;
57
- this.listen_on = listen_on ? parseEndpoint(listen_on) : null;
58
- this.name = name ?? `EventBridge_${randomSuffix()}`;
59
- this.inbound_bus = new EventBus(this.name, { max_history_size: 0 });
60
- this.start_promise = null;
61
- this.node_server = null;
62
- if (this.listen_on && isBrowserRuntime()) {
63
- throw new Error(`${this.constructor.name} listen_on is not supported in browser runtimes`);
64
- }
65
- this.dispatch = this.dispatch.bind(this);
66
- this.emit = this.emit.bind(this);
67
- this.on = this.on.bind(this);
68
- }
69
- on(event_pattern, handler) {
70
- this.ensureListenerStarted();
71
- if (typeof event_pattern === "string") {
72
- this.inbound_bus.on(event_pattern, handler);
73
- return;
74
- }
75
- this.inbound_bus.on(event_pattern, handler);
76
- }
77
- async emit(event) {
78
- if (!this.send_to) {
79
- throw new Error(`${this.constructor.name}.emit() requires send_to`);
80
- }
81
- const payload = event.toJSON();
82
- if (this.send_to.scheme === "unix") {
83
- await this.sendUnix(this.send_to, payload);
84
- return;
85
- }
86
- await this.sendHttp(this.send_to, payload);
87
- }
88
- async dispatch(event) {
89
- return this.emit(event);
90
- }
91
- async start() {
92
- if (!this.listen_on) return;
93
- if (this.node_server) return;
94
- if (this.start_promise) {
95
- await this.start_promise;
96
- return;
97
- }
98
- if (!isNodeRuntime()) {
99
- throw new Error(`${this.constructor.name} listen_on is only supported in Node.js runtimes`);
100
- }
101
- const launch = (async () => {
102
- const endpoint = this.listen_on;
103
- if (!endpoint) return;
104
- if (endpoint.scheme === "unix") {
105
- await this.startUnixListener(endpoint);
106
- return;
107
- }
108
- if (endpoint.scheme !== "http") {
109
- throw new Error(`listen_on only supports unix:// or http:// endpoints, got: ${endpoint.raw}`);
110
- }
111
- await this.startHttpListener(endpoint);
112
- })();
113
- this.start_promise = launch;
114
- try {
115
- await launch;
116
- } finally {
117
- if (this.start_promise === launch) {
118
- this.start_promise = null;
119
- }
120
- }
121
- }
122
- async close() {
123
- if (this.start_promise) {
124
- await Promise.allSettled([this.start_promise]);
125
- this.start_promise = null;
126
- }
127
- if (this.node_server) {
128
- const server = this.node_server;
129
- await new Promise((resolve) => {
130
- server.close(() => resolve());
131
- });
132
- this.node_server = null;
133
- }
134
- this.inbound_bus.destroy();
135
- }
136
- ensureListenerStarted() {
137
- if (!this.listen_on || this.node_server || this.start_promise) {
138
- return;
139
- }
140
- void this.start().catch((error) => {
141
- console.error("[abxbus] EventBridge failed to start listener", error);
142
- });
143
- }
144
- async handleIncomingPayload(payload) {
145
- const event = BaseEvent.fromJSON(payload).eventReset();
146
- this.inbound_bus.emit(event);
147
- }
148
- async sendHttp(endpoint, payload) {
149
- const response = await fetch(endpoint.raw, {
150
- method: "POST",
151
- headers: { "content-type": "application/json" },
152
- body: JSON.stringify(payload)
153
- });
154
- if (!response.ok) {
155
- throw new Error(`IPC HTTP send failed with status ${response.status}: ${endpoint.raw}`);
156
- }
157
- }
158
- async sendUnix(endpoint, payload) {
159
- if (!isNodeRuntime()) {
160
- throw new Error("unix:// send_to is only supported in Node.js runtimes");
161
- }
162
- const socket_path = endpoint.path;
163
- if (!socket_path) {
164
- throw new Error(`Invalid unix endpoint: ${endpoint.raw}`);
165
- }
166
- const node_net = await importNodeModule("node:net");
167
- await new Promise((resolve, reject) => {
168
- const socket = node_net.createConnection(socket_path, () => {
169
- socket.end(`${JSON.stringify(payload)}
170
- `);
171
- });
172
- socket.on("error", (error) => reject(error));
173
- socket.on("close", () => resolve());
174
- });
175
- }
176
- async startHttpListener(endpoint) {
177
- const node_http = await importNodeModule("node:http");
178
- const expected_path = endpoint.path || "/";
179
- this.node_server = node_http.createServer((req, res) => {
180
- const method = (req.method || "").toUpperCase();
181
- const request_url = String(req.url || "/");
182
- if (method !== "POST") {
183
- res.statusCode = 405;
184
- res.end("method not allowed");
185
- return;
186
- }
187
- if (request_url !== expected_path) {
188
- res.statusCode = 404;
189
- res.end("not found");
190
- return;
191
- }
192
- let body = "";
193
- req.setEncoding("utf8");
194
- req.on("data", (chunk) => {
195
- body += chunk;
196
- });
197
- req.on("end", () => {
198
- let parsed_payload;
199
- try {
200
- parsed_payload = JSON.parse(body);
201
- } catch {
202
- res.statusCode = 400;
203
- res.end("invalid json");
204
- return;
205
- }
206
- void this.handleIncomingPayload(parsed_payload).then(() => {
207
- res.statusCode = 202;
208
- res.end("accepted");
209
- }).catch((error) => {
210
- res.statusCode = 500;
211
- res.end("failed to process event");
212
- console.error("[abxbus] EventBridge HTTP listener error", error);
213
- });
214
- });
215
- });
216
- await new Promise((resolve, reject) => {
217
- this.node_server.once("error", (error) => reject(error));
218
- this.node_server.listen(endpoint.port, endpoint.host, () => resolve());
219
- });
220
- }
221
- async startUnixListener(endpoint) {
222
- const socket_path = endpoint.path;
223
- if (!socket_path) {
224
- throw new Error(`Invalid unix endpoint: ${endpoint.raw}`);
225
- }
226
- const node_net = await importNodeModule("node:net");
227
- const node_fs = await importNodeModule("node:fs");
228
- try {
229
- await node_fs.promises.unlink(socket_path);
230
- } catch (error) {
231
- const code = error.code;
232
- if (code !== "ENOENT") {
233
- throw error;
234
- }
235
- }
236
- this.node_server = node_net.createServer((socket) => {
237
- let buffer = "";
238
- socket.setEncoding("utf8");
239
- socket.on("data", (chunk) => {
240
- buffer += chunk;
241
- while (true) {
242
- const newline_index = buffer.indexOf("\n");
243
- if (newline_index < 0) break;
244
- const line = buffer.slice(0, newline_index).trim();
245
- buffer = buffer.slice(newline_index + 1);
246
- if (!line) continue;
247
- try {
248
- const parsed_payload = JSON.parse(line);
249
- void this.handleIncomingPayload(parsed_payload);
250
- } catch {
251
- }
252
- }
253
- });
254
- socket.on("end", () => {
255
- const remainder = buffer.trim();
256
- if (!remainder) return;
257
- try {
258
- const parsed_payload = JSON.parse(remainder);
259
- void this.handleIncomingPayload(parsed_payload);
260
- } catch {
261
- }
262
- });
263
- });
264
- await new Promise((resolve, reject) => {
265
- this.node_server.once("error", (error) => reject(error));
266
- this.node_server.listen(socket_path, () => resolve());
267
- });
268
- }
269
- }
270
- class HTTPEventBridge extends _EventBridge {
271
- constructor(send_to_or_options, listen_on, name) {
272
- const options = typeof send_to_or_options === "object" ? send_to_or_options ?? {} : { send_to: send_to_or_options ?? void 0, listen_on: listen_on ?? void 0, name };
273
- if (options.send_to && parseEndpoint(options.send_to).scheme === "unix") {
274
- throw new Error("HTTPEventBridge send_to must be http:// or https://");
275
- }
276
- if (options.listen_on && parseEndpoint(options.listen_on).scheme !== "http") {
277
- throw new Error("HTTPEventBridge listen_on must be http://");
278
- }
279
- super(options.send_to, options.listen_on, options.name ?? `HTTPEventBridge_${randomSuffix()}`);
280
- }
281
- }
282
- class SocketEventBridge extends _EventBridge {
283
- constructor(path, name) {
284
- const normalized = path ? path.startsWith("unix://") ? path.slice(7) : path : null;
285
- if (normalized === "") {
286
- throw new Error("SocketEventBridge path must not be empty");
287
- }
288
- const endpoint = normalized ? `unix://${normalized}` : null;
289
- super(endpoint, endpoint, name ?? `SocketEventBridge_${randomSuffix()}`);
290
- }
291
- }
292
- import { NATSEventBridge } from "./bridge_nats.js";
293
- import { RedisEventBridge } from "./bridge_redis.js";
294
- import { PostgresEventBridge } from "./bridge_postgres.js";
295
- import { JSONLEventBridge } from "./bridge_jsonl.js";
296
- import { SQLiteEventBridge } from "./bridge_sqlite.js";
1
+ import { EventBridge } from "./EventBridge.js";
2
+ import { HTTPEventBridge } from "./HTTPEventBridge.js";
3
+ import { SocketEventBridge } from "./SocketEventBridge.js";
4
+ import { JSONLEventBridge } from "./JSONLEventBridge.js";
5
+ import { SQLiteEventBridge } from "./SQLiteEventBridge.js";
6
+ import { NATSEventBridge } from "./NATSEventBridge.js";
7
+ import { RedisEventBridge } from "./RedisEventBridge.js";
8
+ import { PostgresEventBridge } from "./PostgresEventBridge.js";
297
9
  export {
10
+ EventBridge,
298
11
  HTTPEventBridge,
299
12
  JSONLEventBridge,
300
13
  NATSEventBridge,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bridges.ts"],
4
- "sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport { EventBus } from './event_bus.js'\nimport type { EventClass, EventHandlerCallable, EventPattern, UntypedEventHandlerFunction } from './types.js'\n\ntype EndpointScheme = 'unix' | 'http' | 'https'\n\ntype ParsedEndpoint = {\n raw: string\n scheme: EndpointScheme\n host?: string\n port?: number\n path?: string\n}\n\nexport type HTTPEventBridgeOptions = {\n send_to?: string | null\n listen_on?: string | null\n name?: string\n}\n\nconst isNodeRuntime = (): boolean => {\n const maybe_process = (globalThis as { process?: { versions?: { node?: string } } }).process\n return typeof maybe_process?.versions?.node === 'string'\n}\n\nconst isBrowserRuntime = (): boolean => !isNodeRuntime() && typeof globalThis.window !== 'undefined'\n\nconst randomSuffix = (): string => Math.random().toString(36).slice(2, 10)\nconst UNIX_SOCKET_MAX_PATH_CHARS = 90\n\nconst parseEndpoint = (raw_endpoint: string): ParsedEndpoint => {\n let parsed: URL\n try {\n parsed = new URL(raw_endpoint)\n } catch {\n throw new Error(`Invalid endpoint URL: ${raw_endpoint}`)\n }\n\n const protocol = parsed.protocol.replace(/:$/, '').toLowerCase()\n if (protocol !== 'unix' && protocol !== 'http' && protocol !== 'https') {\n throw new Error(`Unsupported endpoint scheme: ${raw_endpoint}`)\n }\n\n if (protocol === 'unix') {\n const socket_path = decodeURIComponent(parsed.pathname || '')\n if (!socket_path) {\n throw new Error(`Invalid unix endpoint (missing socket path): ${raw_endpoint}`)\n }\n const socket_path_len = new TextEncoder().encode(socket_path).length\n if (socket_path_len > UNIX_SOCKET_MAX_PATH_CHARS) {\n throw new Error(`Unix socket path is too long (${socket_path_len} chars), max is ${UNIX_SOCKET_MAX_PATH_CHARS}: ${socket_path}`)\n }\n return { raw: raw_endpoint, scheme: 'unix', path: socket_path }\n }\n\n if (!parsed.hostname) {\n throw new Error(`Invalid HTTP endpoint (missing hostname): ${raw_endpoint}`)\n }\n\n const default_port = protocol === 'https' ? 443 : 80\n return {\n raw: raw_endpoint,\n scheme: protocol,\n host: parsed.hostname,\n port: parsed.port ? Number(parsed.port) : default_port,\n path: `${parsed.pathname || '/'}${parsed.search || ''}`,\n }\n}\n\nconst importNodeModule = async (specifier: string): Promise<any> => {\n const dynamic_import = Function('module_name', 'return import(module_name)') as (module_name: string) => Promise<unknown>\n return dynamic_import(specifier) as Promise<any>\n}\n\nclass _EventBridge {\n readonly send_to: ParsedEndpoint | null\n readonly listen_on: ParsedEndpoint | null\n readonly name: string\n\n protected readonly inbound_bus: EventBus\n private start_promise: Promise<void> | null\n private node_server: any | null\n\n constructor(send_to?: string | null, listen_on?: string | null, name?: string) {\n this.send_to = send_to ? parseEndpoint(send_to) : null\n this.listen_on = listen_on ? parseEndpoint(listen_on) : null\n this.name = name ?? `EventBridge_${randomSuffix()}`\n this.inbound_bus = new EventBus(this.name, { max_history_size: 0 })\n this.start_promise = null\n this.node_server = null\n\n if (this.listen_on && isBrowserRuntime()) {\n throw new Error(`${this.constructor.name} listen_on is not supported in browser runtimes`)\n }\n\n this.dispatch = this.dispatch.bind(this)\n this.emit = this.emit.bind(this)\n this.on = this.on.bind(this)\n }\n\n on<T extends BaseEvent>(event_pattern: EventClass<T>, handler: EventHandlerCallable<T>): void\n on<T extends BaseEvent>(event_pattern: string | '*', handler: UntypedEventHandlerFunction<T>): void\n on(event_pattern: EventPattern | '*', handler: EventHandlerCallable | UntypedEventHandlerFunction): void {\n this.ensureListenerStarted()\n if (typeof event_pattern === 'string') {\n this.inbound_bus.on(event_pattern, handler as UntypedEventHandlerFunction<BaseEvent>)\n return\n }\n this.inbound_bus.on(event_pattern as EventClass<BaseEvent>, handler as EventHandlerCallable<BaseEvent>)\n }\n\n async emit<T extends BaseEvent>(event: T): Promise<void> {\n if (!this.send_to) {\n throw new Error(`${this.constructor.name}.emit() requires send_to`)\n }\n\n const payload = event.toJSON()\n\n if (this.send_to.scheme === 'unix') {\n await this.sendUnix(this.send_to, payload)\n return\n }\n\n await this.sendHttp(this.send_to, payload)\n }\n\n async dispatch<T extends BaseEvent>(event: T): Promise<void> {\n return this.emit(event)\n }\n\n async start(): Promise<void> {\n if (!this.listen_on) return\n if (this.node_server) return\n if (this.start_promise) {\n await this.start_promise\n return\n }\n\n if (!isNodeRuntime()) {\n throw new Error(`${this.constructor.name} listen_on is only supported in Node.js runtimes`)\n }\n\n const launch = (async () => {\n const endpoint = this.listen_on\n if (!endpoint) return\n\n if (endpoint.scheme === 'unix') {\n await this.startUnixListener(endpoint)\n return\n }\n\n if (endpoint.scheme !== 'http') {\n throw new Error(`listen_on only supports unix:// or http:// endpoints, got: ${endpoint.raw}`)\n }\n\n await this.startHttpListener(endpoint)\n })()\n this.start_promise = launch\n\n try {\n await launch\n } finally {\n if (this.start_promise === launch) {\n this.start_promise = null\n }\n }\n }\n\n async close(): Promise<void> {\n if (this.start_promise) {\n await Promise.allSettled([this.start_promise])\n this.start_promise = null\n }\n\n if (this.node_server) {\n const server = this.node_server\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n this.node_server = null\n }\n\n this.inbound_bus.destroy()\n }\n\n private ensureListenerStarted(): void {\n if (!this.listen_on || this.node_server || this.start_promise) {\n return\n }\n void this.start().catch((error: unknown) => {\n console.error('[abxbus] EventBridge failed to start listener', error)\n })\n }\n\n private async handleIncomingPayload(payload: unknown): Promise<void> {\n const event = BaseEvent.fromJSON(payload).eventReset()\n this.inbound_bus.emit(event)\n }\n\n private async sendHttp(endpoint: ParsedEndpoint, payload: unknown): Promise<void> {\n const response = await fetch(endpoint.raw, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n throw new Error(`IPC HTTP send failed with status ${response.status}: ${endpoint.raw}`)\n }\n }\n\n private async sendUnix(endpoint: ParsedEndpoint, payload: unknown): Promise<void> {\n if (!isNodeRuntime()) {\n throw new Error('unix:// send_to is only supported in Node.js runtimes')\n }\n\n const socket_path = endpoint.path\n if (!socket_path) {\n throw new Error(`Invalid unix endpoint: ${endpoint.raw}`)\n }\n\n const node_net = await importNodeModule('node:net')\n await new Promise<void>((resolve, reject) => {\n const socket = node_net.createConnection(socket_path, () => {\n socket.end(`${JSON.stringify(payload)}\\n`)\n })\n socket.on('error', (error: unknown) => reject(error))\n socket.on('close', () => resolve())\n })\n }\n\n private async startHttpListener(endpoint: ParsedEndpoint): Promise<void> {\n const node_http = await importNodeModule('node:http')\n const expected_path = endpoint.path || '/'\n\n this.node_server = node_http.createServer((req: any, res: any) => {\n const method = (req.method || '').toUpperCase()\n const request_url = String(req.url || '/')\n\n if (method !== 'POST') {\n res.statusCode = 405\n res.end('method not allowed')\n return\n }\n if (request_url !== expected_path) {\n res.statusCode = 404\n res.end('not found')\n return\n }\n\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => {\n body += chunk\n })\n req.on('end', () => {\n let parsed_payload: unknown\n try {\n parsed_payload = JSON.parse(body)\n } catch {\n res.statusCode = 400\n res.end('invalid json')\n return\n }\n\n void this.handleIncomingPayload(parsed_payload)\n .then(() => {\n res.statusCode = 202\n res.end('accepted')\n })\n .catch((error: unknown) => {\n res.statusCode = 500\n res.end('failed to process event')\n console.error('[abxbus] EventBridge HTTP listener error', error)\n })\n })\n })\n\n await new Promise<void>((resolve, reject) => {\n this.node_server.once('error', (error: unknown) => reject(error))\n this.node_server.listen(endpoint.port, endpoint.host, () => resolve())\n })\n }\n\n private async startUnixListener(endpoint: ParsedEndpoint): Promise<void> {\n const socket_path = endpoint.path\n if (!socket_path) {\n throw new Error(`Invalid unix endpoint: ${endpoint.raw}`)\n }\n\n const node_net = await importNodeModule('node:net')\n const node_fs = await importNodeModule('node:fs')\n\n try {\n await node_fs.promises.unlink(socket_path)\n } catch (error: unknown) {\n const code = (error as { code?: string }).code\n if (code !== 'ENOENT') {\n throw error\n }\n }\n\n this.node_server = node_net.createServer((socket: any) => {\n let buffer = ''\n socket.setEncoding('utf8')\n socket.on('data', (chunk: string) => {\n buffer += chunk\n while (true) {\n const newline_index = buffer.indexOf('\\n')\n if (newline_index < 0) break\n const line = buffer.slice(0, newline_index).trim()\n buffer = buffer.slice(newline_index + 1)\n if (!line) continue\n try {\n const parsed_payload = JSON.parse(line)\n void this.handleIncomingPayload(parsed_payload)\n } catch {\n // Ignore malformed lines and continue reading next frames.\n }\n }\n })\n socket.on('end', () => {\n const remainder = buffer.trim()\n if (!remainder) return\n try {\n const parsed_payload = JSON.parse(remainder)\n void this.handleIncomingPayload(parsed_payload)\n } catch {\n // Ignore malformed trailing frame.\n }\n })\n })\n\n await new Promise<void>((resolve, reject) => {\n this.node_server.once('error', (error: unknown) => reject(error))\n this.node_server.listen(socket_path, () => resolve())\n })\n }\n}\n\nexport class HTTPEventBridge extends _EventBridge {\n constructor(send_to?: string | null, listen_on?: string | null, name?: string)\n constructor(options?: HTTPEventBridgeOptions)\n constructor(send_to_or_options?: string | null | HTTPEventBridgeOptions, listen_on?: string | null, name?: string) {\n const options: HTTPEventBridgeOptions =\n typeof send_to_or_options === 'object'\n ? (send_to_or_options ?? {})\n : { send_to: send_to_or_options ?? undefined, listen_on: listen_on ?? undefined, name }\n\n if (options.send_to && parseEndpoint(options.send_to).scheme === 'unix') {\n throw new Error('HTTPEventBridge send_to must be http:// or https://')\n }\n if (options.listen_on && parseEndpoint(options.listen_on).scheme !== 'http') {\n throw new Error('HTTPEventBridge listen_on must be http://')\n }\n\n super(options.send_to, options.listen_on, options.name ?? `HTTPEventBridge_${randomSuffix()}`)\n }\n}\n\nexport class SocketEventBridge extends _EventBridge {\n constructor(path?: string | null, name?: string) {\n const normalized = path ? (path.startsWith('unix://') ? path.slice(7) : path) : null\n if (normalized === '') {\n throw new Error('SocketEventBridge path must not be empty')\n }\n\n const endpoint = normalized ? `unix://${normalized}` : null\n super(endpoint, endpoint, name ?? `SocketEventBridge_${randomSuffix()}`)\n }\n}\n\nexport { NATSEventBridge } from './bridge_nats.js'\nexport { RedisEventBridge } from './bridge_redis.js'\nexport { PostgresEventBridge } from './bridge_postgres.js'\nexport { JSONLEventBridge } from './bridge_jsonl.js'\nexport { SQLiteEventBridge } from './bridge_sqlite.js'\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export { EventBridge } from './EventBridge.js'\nexport { HTTPEventBridge } from './HTTPEventBridge.js'\nexport type { HTTPEventBridgeOptions } from './HTTPEventBridge.js'\nexport { SocketEventBridge } from './SocketEventBridge.js'\nexport { JSONLEventBridge } from './JSONLEventBridge.js'\nexport { SQLiteEventBridge } from './SQLiteEventBridge.js'\nexport { NATSEventBridge } from './NATSEventBridge.js'\nexport { RedisEventBridge } from './RedisEventBridge.js'\nexport { PostgresEventBridge } from './PostgresEventBridge.js'\n"],
5
+ "mappings": "AAAA,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
- import { EventBus } from "./event_bus.js";
2
- import { BaseEvent } from "./base_event.js";
1
+ import { EventBus } from "./EventBus.js";
2
+ import { BaseEvent } from "./BaseEvent.js";
3
3
  const make_events = (events) => {
4
4
  const by_name = {};
5
5
  for (const [event_name] of Object.entries(events)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { EventBus } from './EventBus.js'\nimport { BaseEvent } from './BaseEvent.js'\n\nimport type { EventClass, EventResultType } from './types.js'\n\ntype EventMap = Record<string, EventClass<BaseEvent>>\ntype AnyFn = (...args: any[]) => any\ntype FunctionMap = Record<string, AnyFn>\ntype ExtraDict = Record<string, unknown>\n\ntype EventFieldsFromFn<TFunc extends AnyFn> =\n Parameters<TFunc> extends [infer TArg] ? (TArg extends Record<string, unknown> ? TArg : ExtraDict) : ExtraDict\n\ntype GeneratedEvent<TFunc extends AnyFn> = {\n (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n new (\n data: EventFieldsFromFn<TFunc> & ExtraDict\n ): BaseEvent & EventFieldsFromFn<TFunc> & { __event_result_type__?: Awaited<ReturnType<TFunc>> }\n event_type?: string\n}\n\nexport type GeneratedEvents<TEvents extends FunctionMap> = {\n by_name: { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n} & {\n [K in keyof TEvents]: GeneratedEvent<TEvents[K]>\n}\n\ntype EventInit<TEventClass extends EventClass<BaseEvent>> =\n ConstructorParameters<TEventClass> extends [infer TInit, ...unknown[]] ? TInit : never\n\ntype EventMethodArgs<TEventClass extends EventClass<BaseEvent>> =\n {} extends EventInit<TEventClass>\n ? [init?: EventInit<TEventClass>, extra?: Record<string, unknown>]\n : [init: EventInit<TEventClass>, extra?: Record<string, unknown>]\n\ntype EventMethodResult<TEventClass extends EventClass<BaseEvent>> = EventResultType<InstanceType<TEventClass>> | undefined\n\nexport type EventsSuckClient<TEvents extends EventMap> = {\n bus: EventBus\n} & {\n [K in keyof TEvents]: (...args: EventMethodArgs<TEvents[K]>) => Promise<EventMethodResult<TEvents[K]>>\n}\n\nexport type EventsSuckClientClass<TEvents extends EventMap> = new (bus?: EventBus) => EventsSuckClient<TEvents>\n\ntype DynamicWrappedClient = {\n bus: EventBus\n} & Record<string, (...args: unknown[]) => Promise<unknown>>\n\nexport const make_events = <TEvents extends FunctionMap>(events: TEvents): GeneratedEvents<TEvents> => {\n const by_name = {} as { [K in keyof TEvents]: GeneratedEvent<TEvents[K]> }\n for (const [event_name] of Object.entries(events) as Array<[keyof TEvents, TEvents[keyof TEvents]]>) {\n if (!/^[A-Za-z_$][\\w$]*$/.test(String(event_name))) {\n throw new Error(`Invalid event name: ${String(event_name)}`)\n }\n by_name[event_name] = BaseEvent.extend(String(event_name), {}) as unknown as GeneratedEvent<TEvents[keyof TEvents]>\n }\n return Object.assign({ by_name }, by_name) as GeneratedEvents<TEvents>\n}\n\nexport const wrap = <TEvents extends EventMap>(class_name: string, methods: TEvents): EventsSuckClientClass<TEvents> => {\n class WrappedClient {\n bus: EventBus\n\n constructor(bus?: EventBus) {\n this.bus = bus ?? new EventBus(`${class_name}Bus`)\n }\n }\n\n Object.defineProperty(WrappedClient, 'name', { value: class_name })\n\n for (const [method_name, EventCtor] of Object.entries(methods)) {\n Object.defineProperty(WrappedClient.prototype, method_name, {\n value: async function (this: DynamicWrappedClient, init?: Record<string, unknown>, extra?: Record<string, unknown>) {\n const payload = { ...(init ?? {}), ...(extra ?? {}) }\n return await this.bus.emit(new EventCtor(payload)).first()\n },\n writable: true,\n configurable: true,\n })\n }\n\n return WrappedClient as unknown as EventsSuckClientClass<TEvents>\n}\n\n// Intentionally no make_event()/make_handler() helpers in TypeScript.\n// Prefer the explicit inline pattern:\n// const FooCreateEvent = BaseEvent.extend('FooCreateEvent', {\n// id: z.string().nullable().optional(),\n// name: z.string(),\n// age: z.number(),\n// })\n// bus.on(FooCreateEvent, ({ id, name, age, ...extra }) => impl.create(id, { name, age }))\nexport const events_suck = { make_events, wrap } as const\n"],
5
5
  "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAkDnB,MAAM,cAAc,CAA8B,WAA8C;AACrG,QAAM,UAAU,CAAC;AACjB,aAAW,CAAC,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAqD;AACnG,QAAI,CAAC,qBAAqB,KAAK,OAAO,UAAU,CAAC,GAAG;AAClD,YAAM,IAAI,MAAM,uBAAuB,OAAO,UAAU,CAAC,EAAE;AAAA,IAC7D;AACA,YAAQ,UAAU,IAAI,UAAU,OAAO,OAAO,UAAU,GAAG,CAAC,CAAC;AAAA,EAC/D;AACA,SAAO,OAAO,OAAO,EAAE,QAAQ,GAAG,OAAO;AAC3C;AAEO,MAAM,OAAO,CAA2B,YAAoB,YAAqD;AAAA,EACtH,MAAM,cAAc;AAAA,IAClB;AAAA,IAEA,YAAY,KAAgB;AAC1B,WAAK,MAAM,OAAO,IAAI,SAAS,GAAG,UAAU,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,eAAe,eAAe,QAAQ,EAAE,OAAO,WAAW,CAAC;AAElE,aAAW,CAAC,aAAa,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC9D,WAAO,eAAe,cAAc,WAAW,aAAa;AAAA,MAC1D,OAAO,eAA4C,MAAgC,OAAiC;AAClH,cAAM,UAAU,EAAE,GAAI,QAAQ,CAAC,GAAI,GAAI,SAAS,CAAC,EAAG;AACpD,eAAO,MAAM,KAAK,IAAI,KAAK,IAAI,UAAU,OAAO,CAAC,EAAE,MAAM;AAAA,MAC3D;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAUO,MAAM,cAAc,EAAE,aAAa,KAAK;",
6
6
  "names": []
7
7
  }
package/dist/esm/index.js CHANGED
@@ -1,29 +1,25 @@
1
- import { BaseEvent, BaseEventSchema } from "./base_event.js";
2
- import { EventHistory } from "./event_history.js";
3
- import { EventResult } from "./event_result.js";
4
- import { EventBus } from "./event_bus.js";
1
+ import { BaseEvent, BaseEventSchema } from "./BaseEvent.js";
2
+ import { EventHistory } from "./EventHistory.js";
3
+ import { EventResult } from "./EventResult.js";
4
+ import { EventBus } from "./EventBus.js";
5
+ import { EventBridge } from "./EventBridge.js";
6
+ import { HTTPEventBridge } from "./HTTPEventBridge.js";
7
+ import { SocketEventBridge } from "./SocketEventBridge.js";
8
+ import { JSONLEventBridge } from "./JSONLEventBridge.js";
9
+ import { SQLiteEventBridge } from "./SQLiteEventBridge.js";
5
10
  import { monotonicDatetime } from "./helpers.js";
6
- import { OtelTracingMiddleware } from "./middleware_otel_tracing.js";
7
11
  import {
8
12
  EventHandlerTimeoutError,
9
13
  EventHandlerCancelledError,
10
14
  EventHandlerAbortedError,
11
15
  EventHandlerResultSchemaError
12
- } from "./event_handler.js";
16
+ } from "./EventHandler.js";
13
17
  import { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from "./retry.js";
14
- import {
15
- HTTPEventBridge,
16
- SocketEventBridge,
17
- NATSEventBridge,
18
- RedisEventBridge,
19
- PostgresEventBridge,
20
- JSONLEventBridge,
21
- SQLiteEventBridge
22
- } from "./bridges.js";
23
18
  import { events_suck } from "./events_suck.js";
24
19
  export {
25
20
  BaseEvent,
26
21
  BaseEventSchema,
22
+ EventBridge,
27
23
  EventBus,
28
24
  EventHandlerAbortedError,
29
25
  EventHandlerCancelledError,
@@ -33,10 +29,6 @@ export {
33
29
  EventResult,
34
30
  HTTPEventBridge,
35
31
  JSONLEventBridge,
36
- NATSEventBridge,
37
- OtelTracingMiddleware,
38
- PostgresEventBridge,
39
- RedisEventBridge,
40
32
  RetryTimeoutError,
41
33
  SQLiteEventBridge,
42
34
  SemaphoreTimeoutError,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export { BaseEvent, BaseEventSchema } from './base_event.js'\nexport { EventHistory } from './event_history.js'\nexport type { EventHistoryFindOptions, EventHistoryTrimOptions } from './event_history.js'\nexport { EventResult } from './event_result.js'\nexport { EventBus } from './event_bus.js'\nexport type { EventBusJSON, EventBusOptions } from './event_bus.js'\nexport { monotonicDatetime } from './helpers.js'\nexport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './middlewares.js'\nexport { OtelTracingMiddleware } from './middleware_otel_tracing.js'\nexport type { OtelTracingMiddlewareOptions } from './middleware_otel_tracing.js'\nexport type { OtelTracingSpanFactory, OtelTracingSpanFactoryInput, OtelTracingSpanProvider } from './middleware_otel_tracing.js'\nexport {\n EventHandlerTimeoutError,\n EventHandlerCancelledError,\n EventHandlerAbortedError,\n EventHandlerResultSchemaError,\n} from './event_handler.js'\nexport type {\n EventConcurrencyMode,\n EventHandlerConcurrencyMode,\n EventHandlerCompletionMode,\n EventBusInterfaceForLockManager,\n} from './lock_manager.js'\nexport type { EventClass, EventHandlerCallable as EventHandler, EventPattern, EventStatus, FindOptions, FindWindow } from './types.js'\nexport { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js'\nexport type { RetryOptions } from './retry.js'\nexport {\n HTTPEventBridge,\n SocketEventBridge,\n NATSEventBridge,\n RedisEventBridge,\n PostgresEventBridge,\n JSONLEventBridge,\n SQLiteEventBridge,\n} from './bridges.js'\nexport type { HTTPEventBridgeOptions } from './bridges.js'\nexport { events_suck } from './events_suck.js'\nexport type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js'\n"],
5
- "mappings": "AAAA,SAAS,WAAW,uBAAuB;AAC3C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAEzB,SAAS,yBAAyB;AAElC,SAAS,6BAA6B;AAGtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,OAAO,wBAAwB,mBAAmB,6BAA6B;AAExF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,mBAAmB;",
4
+ "sourcesContent": ["export { BaseEvent, BaseEventSchema } from './BaseEvent.js'\nexport { EventHistory } from './EventHistory.js'\nexport type { EventHistoryFindOptions, EventHistoryTrimOptions } from './EventHistory.js'\nexport { EventResult } from './EventResult.js'\nexport { EventBus } from './EventBus.js'\nexport type { EventBusJSON, EventBusOptions } from './EventBus.js'\nexport { EventBridge } from './EventBridge.js'\nexport { HTTPEventBridge } from './HTTPEventBridge.js'\nexport type { HTTPEventBridgeOptions } from './HTTPEventBridge.js'\nexport { SocketEventBridge } from './SocketEventBridge.js'\nexport { JSONLEventBridge } from './JSONLEventBridge.js'\nexport { SQLiteEventBridge } from './SQLiteEventBridge.js'\nexport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './EventBusMiddleware.js'\nexport { monotonicDatetime } from './helpers.js'\nexport {\n EventHandlerTimeoutError,\n EventHandlerCancelledError,\n EventHandlerAbortedError,\n EventHandlerResultSchemaError,\n} from './EventHandler.js'\nexport type {\n EventConcurrencyMode,\n EventHandlerConcurrencyMode,\n EventHandlerCompletionMode,\n EventBusInterfaceForLockManager,\n} from './LockManager.js'\nexport type { EventClass, EventHandlerCallable as EventHandler, EventPattern, EventStatus, FindOptions, FindWindow } from './types.js'\nexport { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js'\nexport type { RetryOptions } from './retry.js'\nexport { events_suck } from './events_suck.js'\nexport type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js'\n"],
5
+ "mappings": "AAAA,SAAS,WAAW,uBAAuB;AAC3C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAElC,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,OAAO,wBAAwB,mBAAmB,6BAA6B;AAExF,SAAS,mBAAmB;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
- import { BaseEvent } from "./base_event.js";
2
- import { EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from "./event_handler.js";
1
+ import { BaseEvent } from "./BaseEvent.js";
2
+ import { EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from "./EventHandler.js";
3
3
  const logTree = (bus) => {
4
4
  const parent_to_children = /* @__PURE__ */ new Map();
5
5
  const addChild = (parent_id, child) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/logging.ts"],
4
- "sourcesContent": ["import { BaseEvent } from './base_event.js'\nimport { EventResult } from './event_result.js'\nimport { EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from './event_handler.js'\n\ntype LogTreeBus = {\n name: string\n event_history: {\n values(): IterableIterator<BaseEvent>\n has(event_id: string): boolean\n }\n toString?: () => string\n}\n\nexport const logTree = (bus: LogTreeBus): string => {\n const parent_to_children = new Map<string, BaseEvent[]>()\n\n const addChild = (parent_id: string, child: BaseEvent): void => {\n const existing = parent_to_children.get(parent_id) ?? []\n existing.push(child)\n parent_to_children.set(parent_id, existing)\n }\n\n const root_events: BaseEvent[] = []\n const seen = new Set<string>()\n\n for (const event of bus.event_history.values()) {\n const parent_id = event.event_parent_id\n if (!parent_id || parent_id === event.event_id || !bus.event_history.has(parent_id)) {\n if (!seen.has(event.event_id)) {\n root_events.push(event)\n seen.add(event.event_id)\n }\n }\n }\n\n if (root_events.length === 0) {\n return '(No events in history)'\n }\n\n const nodes_by_id = new Map<string, BaseEvent>()\n for (const root of root_events) {\n nodes_by_id.set(root.event_id, root)\n for (const descendant of root.event_descendants) {\n nodes_by_id.set(descendant.event_id, descendant)\n }\n }\n\n for (const node of nodes_by_id.values()) {\n const parent_id = node.event_parent_id\n if (!parent_id || parent_id === node.event_id) {\n continue\n }\n if (!nodes_by_id.has(parent_id)) {\n continue\n }\n addChild(parent_id, node)\n }\n\n for (const children of parent_to_children.values()) {\n children.sort((a, b) => (a.event_created_at < b.event_created_at ? -1 : a.event_created_at > b.event_created_at ? 1 : 0))\n }\n\n const lines: string[] = []\n const bus_label = typeof bus.toString === 'function' ? bus.toString() : bus.name\n lines.push(`\uD83D\uDCCA Event History Tree for ${bus_label}`)\n lines.push('='.repeat(80))\n\n root_events.sort((a, b) => (a.event_created_at < b.event_created_at ? -1 : a.event_created_at > b.event_created_at ? 1 : 0))\n const visited = new Set<string>()\n root_events.forEach((event, index) => {\n lines.push(buildTreeLine(event, '', index === root_events.length - 1, parent_to_children, visited))\n })\n\n lines.push('='.repeat(80))\n\n return lines.join('\\n')\n}\n\nexport const buildTreeLine = (\n event: BaseEvent,\n indent: string,\n is_last: boolean,\n parent_to_children: Map<string, BaseEvent[]>,\n visited: Set<string>\n): string => {\n const connector = is_last ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n const status_icon = event.event_status === 'completed' ? '\u2705' : event.event_status === 'started' ? '\uD83C\uDFC3' : '\u23F3'\n\n const created_at = formatTimestamp(event.event_created_at)\n let timing = `[${created_at}`\n if (event.event_completed_at) {\n const created_ms = Date.parse(event.event_created_at)\n const completed_ms = Date.parse(event.event_completed_at)\n if (!Number.isNaN(created_ms) && !Number.isNaN(completed_ms)) {\n const duration = (completed_ms - created_ms) / 1000\n timing += ` (${duration.toFixed(3)}s)`\n }\n }\n timing += ']'\n\n const line = `${indent}${connector}${status_icon} ${event.event_type}#${event.event_id.slice(-4)} ${timing}`\n\n if (visited.has(event.event_id)) {\n return line\n }\n visited.add(event.event_id)\n\n const extension = is_last ? ' ' : '\u2502 '\n const new_indent = indent + extension\n\n const result_items: Array<{ type: 'result'; result: EventResult } | { type: 'child'; child: BaseEvent }> = []\n for (const result of event.event_results.values()) {\n result_items.push({ type: 'result', result })\n }\n const children = parent_to_children.get(event.event_id) ?? []\n const printed_child_ids = new Set<string>(event.event_results.size > 0 ? event.event_results.keys() : [])\n for (const child of children) {\n if (!printed_child_ids.has(child.event_id) && !child.event_emitted_by_handler_id) {\n result_items.push({ type: 'child', child })\n printed_child_ids.add(child.event_id)\n }\n }\n\n if (result_items.length === 0) {\n return line\n }\n\n const child_lines: string[] = []\n result_items.forEach((item, index) => {\n const is_last_item = index === result_items.length - 1\n if (item.type === 'result') {\n child_lines.push(buildResultLine(item.result, new_indent, is_last_item, parent_to_children, visited))\n } else {\n child_lines.push(buildTreeLine(item.child, new_indent, is_last_item, parent_to_children, visited))\n }\n })\n\n return [line, ...child_lines].join('\\n')\n}\n\nexport const buildResultLine = (\n result: EventResult,\n indent: string,\n is_last: boolean,\n parent_to_children: Map<string, BaseEvent[]>,\n visited: Set<string>\n): string => {\n const connector = is_last ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n const status_icon =\n result.status === 'completed'\n ? '\u2705'\n : result.status === 'error' && isCancellationControlError(result.error)\n ? '\uD83D\uDEAB'\n : result.status === 'error'\n ? '\u274C'\n : result.status === 'started'\n ? '\uD83C\uDFC3'\n : '\u23F3'\n\n const handler_label =\n result.handler_name && result.handler_name !== 'anonymous'\n ? result.handler_name\n : result.handler_file_path\n ? result.handler_file_path\n : 'anonymous'\n const handler_display = `${result.eventbus_label}.${handler_label}#${result.handler_id.slice(-4)}`\n let line = `${indent}${connector}${status_icon} ${handler_display}`\n\n if (result.started_at) {\n line += ` [${formatTimestamp(result.started_at)}`\n if (result.completed_at) {\n const started_ms = Date.parse(result.started_at)\n const completed_ms = Date.parse(result.completed_at)\n if (!Number.isNaN(started_ms) && !Number.isNaN(completed_ms)) {\n const duration = (completed_ms - started_ms) / 1000\n line += ` (${duration.toFixed(3)}s)`\n }\n }\n line += ']'\n }\n\n if (result.status === 'error' && result.error) {\n if (result.error instanceof EventHandlerTimeoutError) {\n line += ` \u23F1\uFE0F Timeout: ${result.error.message}`\n } else if (result.error instanceof EventHandlerCancelledError) {\n line += ` Cancelled: ${result.error.message}`\n } else if (result.error instanceof EventHandlerAbortedError) {\n line += ` Aborted: ${result.error.message}`\n } else {\n const error_name = result.error instanceof Error ? result.error.name : 'Error'\n const error_message = result.error instanceof Error ? result.error.message : String(result.error)\n line += ` \u2620\uFE0F ${error_name}: ${error_message}`\n }\n } else if (result.status === 'completed') {\n line += ` \u2192 ${formatResultValue(result.result)}`\n }\n\n const extension = is_last ? ' ' : '\u2502 '\n const new_indent = indent + extension\n\n const direct_children = result.event_children\n if (direct_children.length === 0) {\n return line\n }\n\n const child_lines: string[] = []\n const parent_children = parent_to_children.get(result.event_id) ?? []\n const emitted_children = parent_children.filter((child) => child.event_emitted_by_handler_id === result.handler_id)\n const children_by_id = new Map<string, BaseEvent>()\n direct_children.forEach((child) => {\n children_by_id.set(child.event_id, child)\n })\n emitted_children.forEach((child) => {\n if (!children_by_id.has(child.event_id)) {\n children_by_id.set(child.event_id, child)\n }\n })\n const children_to_print = Array.from(children_by_id.values()).filter((child) => !visited.has(child.event_id))\n\n children_to_print.forEach((child, index) => {\n child_lines.push(buildTreeLine(child, new_indent, index === children_to_print.length - 1, parent_to_children, visited))\n })\n\n return [line, ...child_lines].join('\\n')\n}\n\nconst isCancellationControlError = (error: unknown): boolean =>\n error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError\n\nexport const formatTimestamp = (value?: string): string => {\n if (!value) {\n return 'N/A'\n }\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) {\n return 'N/A'\n }\n return date.toISOString().slice(11, 23)\n}\n\nexport const formatResultValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return 'None'\n }\n if (value instanceof BaseEvent) {\n return `Event(${value.event_type}#${value.event_id.slice(-4)})`\n }\n if (typeof value === 'string') {\n return JSON.stringify(value)\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n if (Array.isArray(value)) {\n return `list(${value.length} items)`\n }\n if (typeof value === 'object') {\n return `dict(${Object.keys(value as Record<string, unknown>).length} items)`\n }\n return `${typeof value}(...)`\n}\n"],
4
+ "sourcesContent": ["import { BaseEvent } from './BaseEvent.js'\nimport { EventResult } from './EventResult.js'\nimport { EventHandlerAbortedError, EventHandlerCancelledError, EventHandlerTimeoutError } from './EventHandler.js'\n\ntype LogTreeBus = {\n name: string\n event_history: {\n values(): IterableIterator<BaseEvent>\n has(event_id: string): boolean\n }\n toString?: () => string\n}\n\nexport const logTree = (bus: LogTreeBus): string => {\n const parent_to_children = new Map<string, BaseEvent[]>()\n\n const addChild = (parent_id: string, child: BaseEvent): void => {\n const existing = parent_to_children.get(parent_id) ?? []\n existing.push(child)\n parent_to_children.set(parent_id, existing)\n }\n\n const root_events: BaseEvent[] = []\n const seen = new Set<string>()\n\n for (const event of bus.event_history.values()) {\n const parent_id = event.event_parent_id\n if (!parent_id || parent_id === event.event_id || !bus.event_history.has(parent_id)) {\n if (!seen.has(event.event_id)) {\n root_events.push(event)\n seen.add(event.event_id)\n }\n }\n }\n\n if (root_events.length === 0) {\n return '(No events in history)'\n }\n\n const nodes_by_id = new Map<string, BaseEvent>()\n for (const root of root_events) {\n nodes_by_id.set(root.event_id, root)\n for (const descendant of root.event_descendants) {\n nodes_by_id.set(descendant.event_id, descendant)\n }\n }\n\n for (const node of nodes_by_id.values()) {\n const parent_id = node.event_parent_id\n if (!parent_id || parent_id === node.event_id) {\n continue\n }\n if (!nodes_by_id.has(parent_id)) {\n continue\n }\n addChild(parent_id, node)\n }\n\n for (const children of parent_to_children.values()) {\n children.sort((a, b) => (a.event_created_at < b.event_created_at ? -1 : a.event_created_at > b.event_created_at ? 1 : 0))\n }\n\n const lines: string[] = []\n const bus_label = typeof bus.toString === 'function' ? bus.toString() : bus.name\n lines.push(`\uD83D\uDCCA Event History Tree for ${bus_label}`)\n lines.push('='.repeat(80))\n\n root_events.sort((a, b) => (a.event_created_at < b.event_created_at ? -1 : a.event_created_at > b.event_created_at ? 1 : 0))\n const visited = new Set<string>()\n root_events.forEach((event, index) => {\n lines.push(buildTreeLine(event, '', index === root_events.length - 1, parent_to_children, visited))\n })\n\n lines.push('='.repeat(80))\n\n return lines.join('\\n')\n}\n\nexport const buildTreeLine = (\n event: BaseEvent,\n indent: string,\n is_last: boolean,\n parent_to_children: Map<string, BaseEvent[]>,\n visited: Set<string>\n): string => {\n const connector = is_last ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n const status_icon = event.event_status === 'completed' ? '\u2705' : event.event_status === 'started' ? '\uD83C\uDFC3' : '\u23F3'\n\n const created_at = formatTimestamp(event.event_created_at)\n let timing = `[${created_at}`\n if (event.event_completed_at) {\n const created_ms = Date.parse(event.event_created_at)\n const completed_ms = Date.parse(event.event_completed_at)\n if (!Number.isNaN(created_ms) && !Number.isNaN(completed_ms)) {\n const duration = (completed_ms - created_ms) / 1000\n timing += ` (${duration.toFixed(3)}s)`\n }\n }\n timing += ']'\n\n const line = `${indent}${connector}${status_icon} ${event.event_type}#${event.event_id.slice(-4)} ${timing}`\n\n if (visited.has(event.event_id)) {\n return line\n }\n visited.add(event.event_id)\n\n const extension = is_last ? ' ' : '\u2502 '\n const new_indent = indent + extension\n\n const result_items: Array<{ type: 'result'; result: EventResult } | { type: 'child'; child: BaseEvent }> = []\n for (const result of event.event_results.values()) {\n result_items.push({ type: 'result', result })\n }\n const children = parent_to_children.get(event.event_id) ?? []\n const printed_child_ids = new Set<string>(event.event_results.size > 0 ? event.event_results.keys() : [])\n for (const child of children) {\n if (!printed_child_ids.has(child.event_id) && !child.event_emitted_by_handler_id) {\n result_items.push({ type: 'child', child })\n printed_child_ids.add(child.event_id)\n }\n }\n\n if (result_items.length === 0) {\n return line\n }\n\n const child_lines: string[] = []\n result_items.forEach((item, index) => {\n const is_last_item = index === result_items.length - 1\n if (item.type === 'result') {\n child_lines.push(buildResultLine(item.result, new_indent, is_last_item, parent_to_children, visited))\n } else {\n child_lines.push(buildTreeLine(item.child, new_indent, is_last_item, parent_to_children, visited))\n }\n })\n\n return [line, ...child_lines].join('\\n')\n}\n\nexport const buildResultLine = (\n result: EventResult,\n indent: string,\n is_last: boolean,\n parent_to_children: Map<string, BaseEvent[]>,\n visited: Set<string>\n): string => {\n const connector = is_last ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n const status_icon =\n result.status === 'completed'\n ? '\u2705'\n : result.status === 'error' && isCancellationControlError(result.error)\n ? '\uD83D\uDEAB'\n : result.status === 'error'\n ? '\u274C'\n : result.status === 'started'\n ? '\uD83C\uDFC3'\n : '\u23F3'\n\n const handler_label =\n result.handler_name && result.handler_name !== 'anonymous'\n ? result.handler_name\n : result.handler_file_path\n ? result.handler_file_path\n : 'anonymous'\n const handler_display = `${result.eventbus_label}.${handler_label}#${result.handler_id.slice(-4)}`\n let line = `${indent}${connector}${status_icon} ${handler_display}`\n\n if (result.started_at) {\n line += ` [${formatTimestamp(result.started_at)}`\n if (result.completed_at) {\n const started_ms = Date.parse(result.started_at)\n const completed_ms = Date.parse(result.completed_at)\n if (!Number.isNaN(started_ms) && !Number.isNaN(completed_ms)) {\n const duration = (completed_ms - started_ms) / 1000\n line += ` (${duration.toFixed(3)}s)`\n }\n }\n line += ']'\n }\n\n if (result.status === 'error' && result.error) {\n if (result.error instanceof EventHandlerTimeoutError) {\n line += ` \u23F1\uFE0F Timeout: ${result.error.message}`\n } else if (result.error instanceof EventHandlerCancelledError) {\n line += ` Cancelled: ${result.error.message}`\n } else if (result.error instanceof EventHandlerAbortedError) {\n line += ` Aborted: ${result.error.message}`\n } else {\n const error_name = result.error instanceof Error ? result.error.name : 'Error'\n const error_message = result.error instanceof Error ? result.error.message : String(result.error)\n line += ` \u2620\uFE0F ${error_name}: ${error_message}`\n }\n } else if (result.status === 'completed') {\n line += ` \u2192 ${formatResultValue(result.result)}`\n }\n\n const extension = is_last ? ' ' : '\u2502 '\n const new_indent = indent + extension\n\n const direct_children = result.event_children\n if (direct_children.length === 0) {\n return line\n }\n\n const child_lines: string[] = []\n const parent_children = parent_to_children.get(result.event_id) ?? []\n const emitted_children = parent_children.filter((child) => child.event_emitted_by_handler_id === result.handler_id)\n const children_by_id = new Map<string, BaseEvent>()\n direct_children.forEach((child) => {\n children_by_id.set(child.event_id, child)\n })\n emitted_children.forEach((child) => {\n if (!children_by_id.has(child.event_id)) {\n children_by_id.set(child.event_id, child)\n }\n })\n const children_to_print = Array.from(children_by_id.values()).filter((child) => !visited.has(child.event_id))\n\n children_to_print.forEach((child, index) => {\n child_lines.push(buildTreeLine(child, new_indent, index === children_to_print.length - 1, parent_to_children, visited))\n })\n\n return [line, ...child_lines].join('\\n')\n}\n\nconst isCancellationControlError = (error: unknown): boolean =>\n error instanceof EventHandlerCancelledError || error instanceof EventHandlerAbortedError\n\nexport const formatTimestamp = (value?: string): string => {\n if (!value) {\n return 'N/A'\n }\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) {\n return 'N/A'\n }\n return date.toISOString().slice(11, 23)\n}\n\nexport const formatResultValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return 'None'\n }\n if (value instanceof BaseEvent) {\n return `Event(${value.event_type}#${value.event_id.slice(-4)})`\n }\n if (typeof value === 'string') {\n return JSON.stringify(value)\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n if (Array.isArray(value)) {\n return `list(${value.length} items)`\n }\n if (typeof value === 'object') {\n return `dict(${Object.keys(value as Record<string, unknown>).length} items)`\n }\n return `${typeof value}(...)`\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport type { BaseEvent } from './base_event.js'\n\nexport type EventStatus = 'pending' | 'started' | 'completed'\n\nexport type EventClass<T extends BaseEvent = BaseEvent> = { event_type?: string } & (new (...args: any[]) => T)\n\nexport type EventPattern<T extends BaseEvent = BaseEvent> = string | EventClass<T>\n\nexport type EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\nexport type EventResultType<TEvent extends BaseEvent> = TEvent extends { __event_result_type__?: infer TResult } ? TResult : unknown\n\nexport type EventResultTypeConstructor = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor\n\nexport type EventResultTypeInput = z.ZodTypeAny | EventResultTypeConstructor | unknown\n\nexport type EventHandlerReturn<T extends BaseEvent = BaseEvent> = EventResultType<T> | BaseEvent | null | void\n\nexport type EventHandlerCallable<T extends BaseEvent = BaseEvent> = (event: T) => EventHandlerReturn<T> | Promise<EventHandlerReturn<T>>\n\n// For string and wildcard subscriptions we cannot reliably infer which event\n// type will arrive, so return type checking intentionally degrades to unknown.\nexport type UntypedEventHandlerFunction<T extends BaseEvent = BaseEvent> = (\n event: T\n) => EventHandlerReturn<T> | unknown | Promise<EventHandlerReturn<T> | unknown>\n\nexport type FindWindow = boolean | number\n\ntype FindReservedOptionKeys = 'past' | 'future' | 'child_of'\n\ntype EventFilterFields<T extends BaseEvent> = {\n [K in keyof T as string extends K\n ? never\n : number extends K\n ? never\n : symbol extends K\n ? never\n : K extends FindReservedOptionKeys\n ? never\n : T[K] extends (...args: any[]) => any\n ? never\n : K]?: T[K]\n}\n\nexport type FindOptions<T extends BaseEvent = BaseEvent> = {\n past?: FindWindow\n future?: FindWindow\n child_of?: BaseEvent | null\n} & EventFilterFields<T> &\n Record<string, unknown>\n\nexport const normalizeEventPattern = (event_pattern: EventPattern | '*'): string | '*' => {\n if (event_pattern === '*') {\n return '*'\n }\n if (typeof event_pattern === 'string') {\n return event_pattern\n }\n const event_type = (event_pattern as { event_type?: unknown }).event_type\n if (typeof event_type === 'string' && event_type.length > 0 && event_type !== 'BaseEvent') {\n return event_type\n }\n const class_name = (event_pattern as { name?: unknown }).name\n if (typeof class_name === 'string' && class_name.length > 0 && class_name !== 'BaseEvent') {\n return class_name\n }\n let preview: string\n try {\n const encoded = JSON.stringify(event_pattern)\n preview = typeof encoded === 'string' ? encoded.slice(0, 30) : String(event_pattern).slice(0, 30)\n } catch {\n preview = String(event_pattern).slice(0, 30)\n }\n throw new Error('bus.on(match_pattern, ...) must be a string event type, \"*\", or a BaseEvent class, got: ' + preview)\n}\n\nexport const isZodSchema = (value: unknown): value is z.ZodTypeAny => !!value && typeof (value as z.ZodTypeAny).safeParse === 'function'\n\nexport const eventResultTypeFromConstructor = (value: unknown): z.ZodTypeAny | undefined => {\n if (value === String) {\n return z.string()\n }\n if (value === Number) {\n return z.number()\n }\n if (value === Boolean) {\n return z.boolean()\n }\n if (value === Array) {\n return z.array(z.unknown())\n }\n if (value === Object) {\n return z.record(z.string(), z.unknown())\n }\n return undefined\n}\n\nexport const extractZodShape = (raw: Record<string, unknown>): z.ZodRawShape => {\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'event_result_type') continue\n if (isZodSchema(value)) shape[key] = value\n }\n return shape as z.ZodRawShape\n}\n\nexport const toJsonSchema = (schema: unknown): unknown => {\n if (!schema || !isZodSchema(schema)) return schema\n const zod_any = z as unknown as { toJSONSchema: (input: z.ZodTypeAny) => unknown }\n // Cross-language roundtrips preserve core structural types; constraint keywords may not roundtrip exactly.\n return zod_any.toJSONSchema(schema)\n}\n\nexport const fromJsonSchema = (schema: unknown): z.ZodTypeAny => {\n const zod_any = z as unknown as { fromJSONSchema: (input: unknown) => z.ZodTypeAny }\n return zod_any.fromJSONSchema(schema)\n}\n\nexport const normalizeEventResultType = (value: EventResultTypeInput): z.ZodTypeAny | undefined => {\n if (value === undefined || value === null) {\n return undefined\n }\n if (isZodSchema(value)) {\n return value\n }\n const constructor_schema = eventResultTypeFromConstructor(value)\n if (constructor_schema) {\n return constructor_schema\n }\n return fromJsonSchema(value)\n}\n"],
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type { BaseEvent } from './BaseEvent.js'\n\nexport type EventStatus = 'pending' | 'started' | 'completed'\n\nexport type EventClass<T extends BaseEvent = BaseEvent> = { event_type?: string } & (new (...args: any[]) => T)\n\nexport type EventPattern<T extends BaseEvent = BaseEvent> = string | EventClass<T>\n\nexport type EventWithResultSchema<TResult> = BaseEvent & { __event_result_type__?: TResult }\n\nexport type EventResultType<TEvent extends BaseEvent> = TEvent extends { __event_result_type__?: infer TResult } ? TResult : unknown\n\nexport type EventResultTypeConstructor = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor\n\nexport type EventResultTypeInput = z.ZodTypeAny | EventResultTypeConstructor | unknown\n\nexport type EventHandlerReturn<T extends BaseEvent = BaseEvent> = EventResultType<T> | BaseEvent | null | void\n\nexport type EventHandlerCallable<T extends BaseEvent = BaseEvent> = (event: T) => EventHandlerReturn<T> | Promise<EventHandlerReturn<T>>\n\n// For string and wildcard subscriptions we cannot reliably infer which event\n// type will arrive, so return type checking intentionally degrades to unknown.\nexport type UntypedEventHandlerFunction<T extends BaseEvent = BaseEvent> = (\n event: T\n) => EventHandlerReturn<T> | unknown | Promise<EventHandlerReturn<T> | unknown>\n\nexport type FindWindow = boolean | number\n\ntype FindReservedOptionKeys = 'past' | 'future' | 'child_of'\n\ntype EventFilterFields<T extends BaseEvent> = {\n [K in keyof T as string extends K\n ? never\n : number extends K\n ? never\n : symbol extends K\n ? never\n : K extends FindReservedOptionKeys\n ? never\n : T[K] extends (...args: any[]) => any\n ? never\n : K]?: T[K]\n}\n\nexport type FindOptions<T extends BaseEvent = BaseEvent> = {\n past?: FindWindow\n future?: FindWindow\n child_of?: BaseEvent | null\n} & EventFilterFields<T> &\n Record<string, unknown>\n\nexport const normalizeEventPattern = (event_pattern: EventPattern | '*'): string | '*' => {\n if (event_pattern === '*') {\n return '*'\n }\n if (typeof event_pattern === 'string') {\n return event_pattern\n }\n const event_type = (event_pattern as { event_type?: unknown }).event_type\n if (typeof event_type === 'string' && event_type.length > 0 && event_type !== 'BaseEvent') {\n return event_type\n }\n const class_name = (event_pattern as { name?: unknown }).name\n if (typeof class_name === 'string' && class_name.length > 0 && class_name !== 'BaseEvent') {\n return class_name\n }\n let preview: string\n try {\n const encoded = JSON.stringify(event_pattern)\n preview = typeof encoded === 'string' ? encoded.slice(0, 30) : String(event_pattern).slice(0, 30)\n } catch {\n preview = String(event_pattern).slice(0, 30)\n }\n throw new Error('bus.on(match_pattern, ...) must be a string event type, \"*\", or a BaseEvent class, got: ' + preview)\n}\n\nexport const isZodSchema = (value: unknown): value is z.ZodTypeAny => !!value && typeof (value as z.ZodTypeAny).safeParse === 'function'\n\nexport const eventResultTypeFromConstructor = (value: unknown): z.ZodTypeAny | undefined => {\n if (value === String) {\n return z.string()\n }\n if (value === Number) {\n return z.number()\n }\n if (value === Boolean) {\n return z.boolean()\n }\n if (value === Array) {\n return z.array(z.unknown())\n }\n if (value === Object) {\n return z.record(z.string(), z.unknown())\n }\n return undefined\n}\n\nexport const extractZodShape = (raw: Record<string, unknown>): z.ZodRawShape => {\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'event_result_type') continue\n if (isZodSchema(value)) shape[key] = value\n }\n return shape as z.ZodRawShape\n}\n\nexport const toJsonSchema = (schema: unknown): unknown => {\n if (!schema || !isZodSchema(schema)) return schema\n const zod_any = z as unknown as { toJSONSchema: (input: z.ZodTypeAny) => unknown }\n // Cross-language roundtrips preserve core structural types; constraint keywords may not roundtrip exactly.\n return zod_any.toJSONSchema(schema)\n}\n\nexport const fromJsonSchema = (schema: unknown): z.ZodTypeAny => {\n const zod_any = z as unknown as { fromJSONSchema: (input: unknown) => z.ZodTypeAny }\n return zod_any.fromJSONSchema(schema)\n}\n\nexport const normalizeEventResultType = (value: EventResultTypeInput): z.ZodTypeAny | undefined => {\n if (value === undefined || value === null) {\n return undefined\n }\n if (isZodSchema(value)) {\n return value\n }\n const constructor_schema = eventResultTypeFromConstructor(value)\n if (constructor_schema) {\n return constructor_schema\n }\n return fromJsonSchema(value)\n}\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAoDX,MAAM,wBAAwB,CAAC,kBAAoD;AACxF,MAAI,kBAAkB,KAAK;AACzB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,kBAAkB,UAAU;AACrC,WAAO;AAAA,EACT;AACA,QAAM,aAAc,cAA2C;AAC/D,MAAI,OAAO,eAAe,YAAY,WAAW,SAAS,KAAK,eAAe,aAAa;AACzF,WAAO;AAAA,EACT;AACA,QAAM,aAAc,cAAqC;AACzD,MAAI,OAAO,eAAe,YAAY,WAAW,SAAS,KAAK,eAAe,aAAa;AACzF,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,UAAM,UAAU,KAAK,UAAU,aAAa;AAC5C,cAAU,OAAO,YAAY,WAAW,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAO,aAAa,EAAE,MAAM,GAAG,EAAE;AAAA,EAClG,QAAQ;AACN,cAAU,OAAO,aAAa,EAAE,MAAM,GAAG,EAAE;AAAA,EAC7C;AACA,QAAM,IAAI,MAAM,6FAA6F,OAAO;AACtH;AAEO,MAAM,cAAc,CAAC,UAA0C,CAAC,CAAC,SAAS,OAAQ,MAAuB,cAAc;AAEvH,MAAM,iCAAiC,CAAC,UAA6C;AAC1F,MAAI,UAAU,QAAQ;AACpB,WAAO,EAAE,OAAO;AAAA,EAClB;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO,EAAE,OAAO;AAAA,EAClB;AACA,MAAI,UAAU,SAAS;AACrB,WAAO,EAAE,QAAQ;AAAA,EACnB;AACA,MAAI,UAAU,OAAO;AACnB,WAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;AAAA,EAC5B;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEO,MAAM,kBAAkB,CAAC,QAAgD;AAC9E,QAAM,QAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,QAAQ,oBAAqB;AACjC,QAAI,YAAY,KAAK,EAAG,OAAM,GAAG,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEO,MAAM,eAAe,CAAC,WAA6B;AACxD,MAAI,CAAC,UAAU,CAAC,YAAY,MAAM,EAAG,QAAO;AAC5C,QAAM,UAAU;AAEhB,SAAO,QAAQ,aAAa,MAAM;AACpC;AAEO,MAAM,iBAAiB,CAAC,WAAkC;AAC/D,QAAM,UAAU;AAChB,SAAO,QAAQ,eAAe,MAAM;AACtC;AAEO,MAAM,2BAA2B,CAAC,UAA0D;AACjG,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,qBAAqB,+BAA+B,KAAK;AAC/D,MAAI,oBAAoB;AACtB,WAAO;AAAA,EACT;AACA,SAAO,eAAe,KAAK;AAC7B;",
6
6
  "names": []
7
7
  }