awaitly 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/di-Biw_plBn.d.cts +15 -0
  2. package/dist/di-DxyH2N3i.d.ts +15 -0
  3. package/dist/durable.cjs +4670 -0
  4. package/dist/durable.cjs.map +1 -0
  5. package/dist/durable.d.cts +9 -0
  6. package/dist/durable.d.ts +9 -0
  7. package/dist/durable.js +4610 -0
  8. package/dist/durable.js.map +1 -0
  9. package/dist/{di-BbFFfO8y.d.ts → duration-BjVn3QpB.d.cts} +1 -15
  10. package/dist/{di-BDlT7InM.d.cts → duration-BjVn3QpB.d.ts} +1 -15
  11. package/dist/engine.cjs +4501 -0
  12. package/dist/engine.cjs.map +1 -0
  13. package/dist/engine.d.cts +113 -0
  14. package/dist/engine.d.ts +113 -0
  15. package/dist/engine.js +4474 -0
  16. package/dist/engine.js.map +1 -0
  17. package/dist/{errors-DtXvrCiO.d.cts → errors-sDSeaZBO.d.cts} +1 -1
  18. package/dist/{errors-DtXvrCiO.d.ts → errors-sDSeaZBO.d.ts} +1 -1
  19. package/dist/guards-CwQZro1F.d.ts +72 -0
  20. package/dist/guards-DhhOJZda.d.cts +72 -0
  21. package/dist/hitl-BnnnLzh2.d.cts +468 -0
  22. package/dist/hitl-pYfkQMv_.d.ts +468 -0
  23. package/dist/hitl.cjs +646 -0
  24. package/dist/hitl.cjs.map +1 -0
  25. package/dist/hitl.d.cts +440 -0
  26. package/dist/hitl.d.ts +440 -0
  27. package/dist/hitl.js +605 -0
  28. package/dist/hitl.js.map +1 -0
  29. package/dist/index-Bew12SZ8.d.ts +417 -0
  30. package/dist/index-Bwt-iz50.d.cts +417 -0
  31. package/dist/{types-B8NfNRGX.d.ts → index-Cv4K_3sZ.d.ts} +2 -1162
  32. package/dist/{types-BZ2f4MRR.d.cts → index-ICmfQi08.d.cts} +2 -1162
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +11 -1527
  35. package/dist/index.d.ts +11 -1527
  36. package/dist/persistence.cjs +552 -0
  37. package/dist/persistence.cjs.map +1 -0
  38. package/dist/persistence.d.cts +254 -0
  39. package/dist/persistence.d.ts +254 -0
  40. package/dist/persistence.js +499 -0
  41. package/dist/persistence.js.map +1 -0
  42. package/dist/reliability.cjs +1651 -0
  43. package/dist/reliability.cjs.map +1 -0
  44. package/dist/reliability.d.cts +1442 -0
  45. package/dist/reliability.d.ts +1442 -0
  46. package/dist/reliability.js +1589 -0
  47. package/dist/reliability.js.map +1 -0
  48. package/dist/result.d.cts +1 -1
  49. package/dist/result.d.ts +1 -1
  50. package/dist/run.cjs +2283 -0
  51. package/dist/run.cjs.map +1 -0
  52. package/dist/run.d.cts +90 -0
  53. package/dist/run.d.ts +90 -0
  54. package/dist/run.js +2247 -0
  55. package/dist/run.js.map +1 -0
  56. package/dist/saga.cjs +3699 -0
  57. package/dist/saga.cjs.map +1 -0
  58. package/dist/saga.d.cts +162 -0
  59. package/dist/saga.d.ts +162 -0
  60. package/dist/saga.js +3670 -0
  61. package/dist/saga.js.map +1 -0
  62. package/dist/store-contract-BI98VYmX.d.ts +66 -0
  63. package/dist/store-contract-C2HyR_o6.d.cts +66 -0
  64. package/dist/streaming.cjs +895 -0
  65. package/dist/streaming.cjs.map +1 -0
  66. package/dist/streaming.d.cts +594 -0
  67. package/dist/streaming.d.ts +594 -0
  68. package/dist/streaming.js +832 -0
  69. package/dist/streaming.js.map +1 -0
  70. package/dist/testing.d.cts +4 -2
  71. package/dist/testing.d.ts +4 -2
  72. package/dist/types-BDTxgKKc.d.ts +845 -0
  73. package/dist/types-C9Y71dua.d.cts +845 -0
  74. package/dist/types-d8q8iQlk.d.cts +323 -0
  75. package/dist/types-sObbY4mX.d.ts +323 -0
  76. package/dist/webhook.cjs +461 -0
  77. package/dist/webhook.cjs.map +1 -0
  78. package/dist/webhook.d.cts +497 -0
  79. package/dist/webhook.d.ts +497 -0
  80. package/dist/webhook.js +422 -0
  81. package/dist/webhook.js.map +1 -0
  82. package/dist/workflow.cjs +2 -2614
  83. package/dist/workflow.cjs.map +1 -1
  84. package/dist/workflow.d.cts +12 -3023
  85. package/dist/workflow.d.ts +12 -3023
  86. package/dist/workflow.js +2 -2535
  87. package/dist/workflow.js.map +1 -1
  88. package/package.json +46 -1
@@ -0,0 +1,895 @@
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
+
20
+ // src/streaming-entry.ts
21
+ var streaming_entry_exports = {};
22
+ __export(streaming_entry_exports, {
23
+ STREAM_BACKPRESSURE_ERROR: () => STREAM_BACKPRESSURE_ERROR,
24
+ STREAM_CLOSE_ERROR: () => STREAM_CLOSE_ERROR,
25
+ STREAM_ENDED: () => STREAM_ENDED,
26
+ STREAM_READ_ERROR: () => STREAM_READ_ERROR,
27
+ STREAM_STORE_ERROR: () => STREAM_STORE_ERROR,
28
+ STREAM_WRITE_ERROR: () => STREAM_WRITE_ERROR,
29
+ chunk: () => chunk,
30
+ collect: () => collect,
31
+ createBackpressureController: () => createBackpressureController,
32
+ createFileStreamStore: () => createFileStreamStore,
33
+ createMemoryStreamStore: () => createMemoryStreamStore,
34
+ createTestableMemoryStreamStore: () => createTestableMemoryStreamStore,
35
+ filter: () => filter,
36
+ flatMap: () => flatMap,
37
+ flatMapAsync: () => flatMapAsync,
38
+ getStreamReader: () => getStreamReader,
39
+ isStreamBackpressureError: () => isStreamBackpressureError,
40
+ isStreamEnded: () => isStreamEnded,
41
+ isStreamReadError: () => isStreamReadError,
42
+ isStreamStoreError: () => isStreamStoreError,
43
+ isStreamWriteError: () => isStreamWriteError,
44
+ map: () => map,
45
+ mapAsync: () => mapAsync,
46
+ pipe: () => pipe,
47
+ reduce: () => reduce,
48
+ shouldApplyBackpressure: () => shouldApplyBackpressure,
49
+ skip: () => skip,
50
+ skipWhile: () => skipWhile,
51
+ streamBackpressureError: () => streamBackpressureError,
52
+ streamCloseError: () => streamCloseError,
53
+ streamEnded: () => streamEnded,
54
+ streamReadError: () => streamReadError,
55
+ streamStoreError: () => streamStoreError,
56
+ streamWriteError: () => streamWriteError,
57
+ take: () => take,
58
+ takeWhile: () => takeWhile,
59
+ toAsyncIterable: () => toAsyncIterable
60
+ });
61
+ module.exports = __toCommonJS(streaming_entry_exports);
62
+
63
+ // src/streaming/types.ts
64
+ var STREAM_WRITE_ERROR = "STREAM_WRITE_ERROR";
65
+ var STREAM_READ_ERROR = "STREAM_READ_ERROR";
66
+ var STREAM_CLOSE_ERROR = "STREAM_CLOSE_ERROR";
67
+ var STREAM_STORE_ERROR = "STREAM_STORE_ERROR";
68
+ var STREAM_ENDED = "STREAM_ENDED";
69
+ var STREAM_BACKPRESSURE_ERROR = "STREAM_BACKPRESSURE_ERROR";
70
+ function isStreamEnded(error) {
71
+ return typeof error === "object" && error !== null && error.type === STREAM_ENDED;
72
+ }
73
+ function isStreamWriteError(error) {
74
+ return typeof error === "object" && error !== null && error.type === STREAM_WRITE_ERROR;
75
+ }
76
+ function isStreamReadError(error) {
77
+ return typeof error === "object" && error !== null && error.type === STREAM_READ_ERROR;
78
+ }
79
+ function isStreamStoreError(error) {
80
+ return typeof error === "object" && error !== null && error.type === STREAM_STORE_ERROR;
81
+ }
82
+ function isStreamBackpressureError(error) {
83
+ return typeof error === "object" && error !== null && error.type === STREAM_BACKPRESSURE_ERROR;
84
+ }
85
+ function streamWriteError(reason, message, cause) {
86
+ return {
87
+ type: STREAM_WRITE_ERROR,
88
+ reason,
89
+ message,
90
+ ...cause !== void 0 ? { cause } : {}
91
+ };
92
+ }
93
+ function streamReadError(reason, message, cause) {
94
+ return {
95
+ type: STREAM_READ_ERROR,
96
+ reason,
97
+ message,
98
+ ...cause !== void 0 ? { cause } : {}
99
+ };
100
+ }
101
+ function streamCloseError(reason, message, cause) {
102
+ return {
103
+ type: STREAM_CLOSE_ERROR,
104
+ reason,
105
+ message,
106
+ ...cause !== void 0 ? { cause } : {}
107
+ };
108
+ }
109
+ function streamStoreError(reason, message, cause) {
110
+ return {
111
+ type: STREAM_STORE_ERROR,
112
+ reason,
113
+ message,
114
+ ...cause !== void 0 ? { cause } : {}
115
+ };
116
+ }
117
+ function streamEnded(finalPosition) {
118
+ return {
119
+ type: STREAM_ENDED,
120
+ finalPosition
121
+ };
122
+ }
123
+ function streamBackpressureError(bufferedCount, highWaterMark) {
124
+ return {
125
+ type: STREAM_BACKPRESSURE_ERROR,
126
+ bufferedCount,
127
+ highWaterMark
128
+ };
129
+ }
130
+
131
+ // src/streaming/backpressure.ts
132
+ function createBackpressureController(options = {}) {
133
+ const highWaterMark = options.highWaterMark ?? 16;
134
+ const lowWaterMark = options.lowWaterMark ?? Math.floor(highWaterMark / 2);
135
+ const onStateChange = options.onStateChange;
136
+ let state = "flowing";
137
+ let bufferedCount = 0;
138
+ let drainResolvers = [];
139
+ function updateState(newState) {
140
+ if (state !== newState) {
141
+ state = newState;
142
+ onStateChange?.(newState);
143
+ if (newState === "flowing" && drainResolvers.length > 0) {
144
+ const resolvers = drainResolvers;
145
+ drainResolvers = [];
146
+ for (const resolve of resolvers) {
147
+ resolve();
148
+ }
149
+ }
150
+ }
151
+ }
152
+ function checkState() {
153
+ if (state === "flowing" && bufferedCount >= highWaterMark) {
154
+ updateState("paused");
155
+ } else if (state === "paused" && bufferedCount <= lowWaterMark) {
156
+ updateState("flowing");
157
+ }
158
+ }
159
+ return {
160
+ get state() {
161
+ return state;
162
+ },
163
+ get bufferedCount() {
164
+ return bufferedCount;
165
+ },
166
+ get highWaterMark() {
167
+ return highWaterMark;
168
+ },
169
+ get lowWaterMark() {
170
+ return lowWaterMark;
171
+ },
172
+ increment() {
173
+ bufferedCount++;
174
+ checkState();
175
+ },
176
+ decrement() {
177
+ if (bufferedCount > 0) {
178
+ bufferedCount--;
179
+ checkState();
180
+ }
181
+ },
182
+ setCount(count) {
183
+ bufferedCount = Math.max(0, count);
184
+ checkState();
185
+ },
186
+ waitForDrain() {
187
+ if (state === "flowing") {
188
+ return Promise.resolve();
189
+ }
190
+ return new Promise((resolve) => {
191
+ drainResolvers.push(resolve);
192
+ });
193
+ },
194
+ reset() {
195
+ bufferedCount = 0;
196
+ drainResolvers = [];
197
+ updateState("flowing");
198
+ }
199
+ };
200
+ }
201
+ function shouldApplyBackpressure(controller) {
202
+ return controller.state === "paused";
203
+ }
204
+
205
+ // src/core/index.ts
206
+ function ok(value) {
207
+ return { ok: true, value };
208
+ }
209
+ function err(error, options) {
210
+ const cause = options?.cause;
211
+ return { ok: false, error, ...cause !== void 0 ? { cause } : {} };
212
+ }
213
+
214
+ // src/streaming/stores/memory.ts
215
+ function createMemoryStreamStore(options = {}) {
216
+ const maxItemsPerStream = options.maxItemsPerStream ?? Infinity;
217
+ const streams = /* @__PURE__ */ new Map();
218
+ function getStreamKey(workflowId, namespace) {
219
+ return `${workflowId}:${namespace}`;
220
+ }
221
+ function getOrCreateStream(workflowId, namespace) {
222
+ const key = getStreamKey(workflowId, namespace);
223
+ let data = streams.get(key);
224
+ if (!data) {
225
+ data = {
226
+ metadata: {
227
+ id: key,
228
+ namespace,
229
+ workflowId,
230
+ length: 0,
231
+ closed: false,
232
+ createdAt: Date.now()
233
+ },
234
+ items: [],
235
+ subscribers: /* @__PURE__ */ new Set()
236
+ };
237
+ streams.set(key, data);
238
+ }
239
+ return data;
240
+ }
241
+ return {
242
+ async append(workflowId, namespace, item) {
243
+ try {
244
+ const data = getOrCreateStream(workflowId, namespace);
245
+ if (data.metadata.closed) {
246
+ return err(
247
+ streamStoreError("write_error", "Cannot write to closed stream")
248
+ );
249
+ }
250
+ if (data.items.length >= maxItemsPerStream) {
251
+ return err(
252
+ streamStoreError(
253
+ "write_error",
254
+ `Stream exceeded max items limit (${maxItemsPerStream})`
255
+ )
256
+ );
257
+ }
258
+ data.items.push(item);
259
+ data.metadata.length = data.items.length;
260
+ data.metadata.lastWriteAt = Date.now();
261
+ for (const callback of data.subscribers) {
262
+ try {
263
+ callback(item);
264
+ } catch {
265
+ }
266
+ }
267
+ return ok(void 0);
268
+ } catch (cause) {
269
+ return err(
270
+ streamStoreError("write_error", "Failed to append item", cause)
271
+ );
272
+ }
273
+ },
274
+ async read(workflowId, namespace, startIndex, limit) {
275
+ try {
276
+ const key = getStreamKey(workflowId, namespace);
277
+ const data = streams.get(key);
278
+ if (!data) {
279
+ return ok([]);
280
+ }
281
+ const endIndex = limit !== void 0 ? Math.min(startIndex + limit, data.items.length) : data.items.length;
282
+ const items = data.items.slice(startIndex, endIndex);
283
+ return ok(items);
284
+ } catch (cause) {
285
+ return err(streamStoreError("read_error", "Failed to read items", cause));
286
+ }
287
+ },
288
+ async getMetadata(workflowId, namespace) {
289
+ try {
290
+ const key = getStreamKey(workflowId, namespace);
291
+ const data = streams.get(key);
292
+ return ok(data?.metadata);
293
+ } catch (cause) {
294
+ return err(
295
+ streamStoreError("metadata_error", "Failed to get metadata", cause)
296
+ );
297
+ }
298
+ },
299
+ async closeStream(workflowId, namespace) {
300
+ try {
301
+ const key = getStreamKey(workflowId, namespace);
302
+ const data = streams.get(key);
303
+ if (data) {
304
+ data.metadata.closed = true;
305
+ data.metadata.closedAt = Date.now();
306
+ }
307
+ return ok(void 0);
308
+ } catch (cause) {
309
+ return err(
310
+ streamStoreError("close_error", "Failed to close stream", cause)
311
+ );
312
+ }
313
+ },
314
+ subscribe(workflowId, namespace, callback) {
315
+ const data = getOrCreateStream(workflowId, namespace);
316
+ const typedCallback = callback;
317
+ data.subscribers.add(typedCallback);
318
+ return () => {
319
+ data.subscribers.delete(typedCallback);
320
+ };
321
+ }
322
+ };
323
+ }
324
+ function createTestableMemoryStreamStore(options = {}) {
325
+ const streams = /* @__PURE__ */ new Map();
326
+ const maxItemsPerStream = options.maxItemsPerStream ?? Infinity;
327
+ function getStreamKey(workflowId, namespace) {
328
+ return `${workflowId}:${namespace}`;
329
+ }
330
+ function getOrCreateStream(workflowId, namespace) {
331
+ const key = getStreamKey(workflowId, namespace);
332
+ let data = streams.get(key);
333
+ if (!data) {
334
+ data = {
335
+ metadata: {
336
+ id: key,
337
+ namespace,
338
+ workflowId,
339
+ length: 0,
340
+ closed: false,
341
+ createdAt: Date.now()
342
+ },
343
+ items: [],
344
+ subscribers: /* @__PURE__ */ new Set()
345
+ };
346
+ streams.set(key, data);
347
+ }
348
+ return data;
349
+ }
350
+ const store = createMemoryStreamStore(options);
351
+ return {
352
+ ...store,
353
+ // Override to use our local streams map
354
+ async append(workflowId, namespace, item) {
355
+ try {
356
+ const data = getOrCreateStream(workflowId, namespace);
357
+ if (data.metadata.closed) {
358
+ return err(
359
+ streamStoreError("write_error", "Cannot write to closed stream")
360
+ );
361
+ }
362
+ if (data.items.length >= maxItemsPerStream) {
363
+ return err(
364
+ streamStoreError(
365
+ "write_error",
366
+ `Stream exceeded max items limit (${maxItemsPerStream})`
367
+ )
368
+ );
369
+ }
370
+ data.items.push(item);
371
+ data.metadata.length = data.items.length;
372
+ data.metadata.lastWriteAt = Date.now();
373
+ for (const callback of data.subscribers) {
374
+ try {
375
+ callback(item);
376
+ } catch {
377
+ }
378
+ }
379
+ return ok(void 0);
380
+ } catch (cause) {
381
+ return err(
382
+ streamStoreError("write_error", "Failed to append item", cause)
383
+ );
384
+ }
385
+ },
386
+ async read(workflowId, namespace, startIndex, limit) {
387
+ try {
388
+ const key = getStreamKey(workflowId, namespace);
389
+ const data = streams.get(key);
390
+ if (!data) {
391
+ return ok([]);
392
+ }
393
+ const endIndex = limit !== void 0 ? Math.min(startIndex + limit, data.items.length) : data.items.length;
394
+ const items = data.items.slice(startIndex, endIndex);
395
+ return ok(items);
396
+ } catch (cause) {
397
+ return err(streamStoreError("read_error", "Failed to read items", cause));
398
+ }
399
+ },
400
+ async getMetadata(workflowId, namespace) {
401
+ try {
402
+ const key = getStreamKey(workflowId, namespace);
403
+ const data = streams.get(key);
404
+ return ok(data?.metadata);
405
+ } catch (cause) {
406
+ return err(
407
+ streamStoreError("metadata_error", "Failed to get metadata", cause)
408
+ );
409
+ }
410
+ },
411
+ async closeStream(workflowId, namespace) {
412
+ try {
413
+ const key = getStreamKey(workflowId, namespace);
414
+ const data = streams.get(key);
415
+ if (data) {
416
+ data.metadata.closed = true;
417
+ data.metadata.closedAt = Date.now();
418
+ }
419
+ return ok(void 0);
420
+ } catch (cause) {
421
+ return err(
422
+ streamStoreError("close_error", "Failed to close stream", cause)
423
+ );
424
+ }
425
+ },
426
+ subscribe(workflowId, namespace, callback) {
427
+ const data = getOrCreateStream(workflowId, namespace);
428
+ const typedCallback = callback;
429
+ data.subscribers.add(typedCallback);
430
+ return () => {
431
+ data.subscribers.delete(typedCallback);
432
+ };
433
+ },
434
+ clear() {
435
+ streams.clear();
436
+ },
437
+ keys() {
438
+ return Array.from(streams.keys());
439
+ },
440
+ has(workflowId, namespace) {
441
+ return streams.has(getStreamKey(workflowId, namespace));
442
+ },
443
+ delete(workflowId, namespace) {
444
+ return streams.delete(getStreamKey(workflowId, namespace));
445
+ }
446
+ };
447
+ }
448
+
449
+ // src/streaming/stores/file.ts
450
+ function createFileStreamStore(options) {
451
+ const { directory, fs } = options;
452
+ const subscribers = /* @__PURE__ */ new Map();
453
+ function getStreamDir(workflowId, namespace) {
454
+ return `${directory}/${workflowId}/${namespace}`;
455
+ }
456
+ function getMetadataPath(workflowId, namespace) {
457
+ return `${getStreamDir(workflowId, namespace)}/metadata.json`;
458
+ }
459
+ function getItemsPath(workflowId, namespace) {
460
+ return `${getStreamDir(workflowId, namespace)}/items.jsonl`;
461
+ }
462
+ function getSubscriberKey(workflowId, namespace) {
463
+ return `${workflowId}:${namespace}`;
464
+ }
465
+ async function ensureDir(workflowId, namespace) {
466
+ const dir = getStreamDir(workflowId, namespace);
467
+ await fs.mkdir(dir, { recursive: true });
468
+ }
469
+ async function readMetadata(workflowId, namespace) {
470
+ const metaPath = getMetadataPath(workflowId, namespace);
471
+ if (!await fs.exists(metaPath)) {
472
+ return void 0;
473
+ }
474
+ const content = await fs.readFile(metaPath);
475
+ return JSON.parse(content);
476
+ }
477
+ async function writeMetadata(workflowId, namespace, metadata) {
478
+ await ensureDir(workflowId, namespace);
479
+ const metaPath = getMetadataPath(workflowId, namespace);
480
+ await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2));
481
+ }
482
+ async function appendItem(workflowId, namespace, item) {
483
+ await ensureDir(workflowId, namespace);
484
+ const itemsPath = getItemsPath(workflowId, namespace);
485
+ const line = JSON.stringify(item) + "\n";
486
+ let content = "";
487
+ if (await fs.exists(itemsPath)) {
488
+ content = await fs.readFile(itemsPath);
489
+ }
490
+ await fs.writeFile(itemsPath, content + line);
491
+ }
492
+ async function readItems(workflowId, namespace, startIndex, limit) {
493
+ const itemsPath = getItemsPath(workflowId, namespace);
494
+ if (!await fs.exists(itemsPath)) {
495
+ return [];
496
+ }
497
+ const content = await fs.readFile(itemsPath);
498
+ const lines = content.trim().split("\n").filter(Boolean);
499
+ const items = [];
500
+ for (const line of lines) {
501
+ const item = JSON.parse(line);
502
+ if (item.position >= startIndex) {
503
+ items.push(item);
504
+ if (limit !== void 0 && items.length >= limit) {
505
+ break;
506
+ }
507
+ }
508
+ }
509
+ return items;
510
+ }
511
+ return {
512
+ async append(workflowId, namespace, item) {
513
+ try {
514
+ let metadata = await readMetadata(workflowId, namespace);
515
+ if (!metadata) {
516
+ metadata = {
517
+ id: `${workflowId}:${namespace}`,
518
+ namespace,
519
+ workflowId,
520
+ length: 0,
521
+ closed: false,
522
+ createdAt: Date.now()
523
+ };
524
+ }
525
+ if (metadata.closed) {
526
+ return err(
527
+ streamStoreError("write_error", "Cannot write to closed stream")
528
+ );
529
+ }
530
+ const serializedItem = {
531
+ value: item.value,
532
+ position: item.position,
533
+ ts: item.ts
534
+ };
535
+ await appendItem(workflowId, namespace, serializedItem);
536
+ metadata.length++;
537
+ metadata.lastWriteAt = Date.now();
538
+ await writeMetadata(workflowId, namespace, metadata);
539
+ const key = getSubscriberKey(workflowId, namespace);
540
+ const subs = subscribers.get(key);
541
+ if (subs) {
542
+ for (const callback of subs) {
543
+ try {
544
+ callback(item);
545
+ } catch {
546
+ }
547
+ }
548
+ }
549
+ return ok(void 0);
550
+ } catch (cause) {
551
+ return err(
552
+ streamStoreError("write_error", "Failed to append item", cause)
553
+ );
554
+ }
555
+ },
556
+ async read(workflowId, namespace, startIndex, limit) {
557
+ try {
558
+ const serializedItems = await readItems(
559
+ workflowId,
560
+ namespace,
561
+ startIndex,
562
+ limit
563
+ );
564
+ const items = serializedItems.map((si) => ({
565
+ value: si.value,
566
+ position: si.position,
567
+ ts: si.ts
568
+ }));
569
+ return ok(items);
570
+ } catch (cause) {
571
+ return err(streamStoreError("read_error", "Failed to read items", cause));
572
+ }
573
+ },
574
+ async getMetadata(workflowId, namespace) {
575
+ try {
576
+ const meta = await readMetadata(workflowId, namespace);
577
+ if (!meta) {
578
+ return ok(void 0);
579
+ }
580
+ return ok({
581
+ id: meta.id,
582
+ namespace: meta.namespace,
583
+ workflowId: meta.workflowId,
584
+ length: meta.length,
585
+ closed: meta.closed,
586
+ createdAt: meta.createdAt,
587
+ lastWriteAt: meta.lastWriteAt,
588
+ closedAt: meta.closedAt
589
+ });
590
+ } catch (cause) {
591
+ return err(
592
+ streamStoreError("metadata_error", "Failed to get metadata", cause)
593
+ );
594
+ }
595
+ },
596
+ async closeStream(workflowId, namespace) {
597
+ try {
598
+ const metadata = await readMetadata(workflowId, namespace);
599
+ if (metadata) {
600
+ metadata.closed = true;
601
+ metadata.closedAt = Date.now();
602
+ await writeMetadata(workflowId, namespace, metadata);
603
+ }
604
+ return ok(void 0);
605
+ } catch (cause) {
606
+ return err(
607
+ streamStoreError("close_error", "Failed to close stream", cause)
608
+ );
609
+ }
610
+ },
611
+ subscribe(workflowId, namespace, callback) {
612
+ const key = getSubscriberKey(workflowId, namespace);
613
+ let subs = subscribers.get(key);
614
+ if (!subs) {
615
+ subs = /* @__PURE__ */ new Set();
616
+ subscribers.set(key, subs);
617
+ }
618
+ const typedCallback = callback;
619
+ subs.add(typedCallback);
620
+ return () => {
621
+ subs?.delete(typedCallback);
622
+ if (subs?.size === 0) {
623
+ subscribers.delete(key);
624
+ }
625
+ };
626
+ }
627
+ };
628
+ }
629
+
630
+ // src/streaming/transformers.ts
631
+ async function* toAsyncIterable(reader) {
632
+ while (reader.readable) {
633
+ const result = await reader.read();
634
+ if (!result.ok) {
635
+ if (isStreamEnded(result.error)) {
636
+ break;
637
+ }
638
+ throw result.error;
639
+ }
640
+ yield result.value;
641
+ }
642
+ }
643
+ async function* map(source, fn) {
644
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
645
+ let index = 0;
646
+ for await (const item of iterable) {
647
+ yield await fn(item, index++);
648
+ }
649
+ }
650
+ async function* filter(source, predicate) {
651
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
652
+ let index = 0;
653
+ for await (const item of iterable) {
654
+ if (await predicate(item, index++)) {
655
+ yield item;
656
+ }
657
+ }
658
+ }
659
+ async function* chunk(source, size) {
660
+ if (size < 1) {
661
+ throw new Error("Chunk size must be at least 1");
662
+ }
663
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
664
+ let currentChunk = [];
665
+ for await (const item of iterable) {
666
+ currentChunk.push(item);
667
+ if (currentChunk.length >= size) {
668
+ yield currentChunk;
669
+ currentChunk = [];
670
+ }
671
+ }
672
+ if (currentChunk.length > 0) {
673
+ yield currentChunk;
674
+ }
675
+ }
676
+ async function* flatMap(source, fn) {
677
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
678
+ let index = 0;
679
+ for await (const item of iterable) {
680
+ const mapped = fn(item, index++);
681
+ if (Symbol.asyncIterator in mapped) {
682
+ for await (const subItem of mapped) {
683
+ yield subItem;
684
+ }
685
+ } else {
686
+ for (const subItem of mapped) {
687
+ yield subItem;
688
+ }
689
+ }
690
+ }
691
+ }
692
+ async function* flatMapAsync(source, fn) {
693
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
694
+ let index = 0;
695
+ for await (const item of iterable) {
696
+ const result = await fn(item, index++);
697
+ if (!result.ok) {
698
+ yield err(result.error);
699
+ return;
700
+ }
701
+ const mapped = result.value;
702
+ if (Symbol.asyncIterator in mapped) {
703
+ for await (const subItem of mapped) {
704
+ yield ok(subItem);
705
+ }
706
+ } else {
707
+ for (const subItem of mapped) {
708
+ yield ok(subItem);
709
+ }
710
+ }
711
+ }
712
+ }
713
+ async function* mapAsync(source, fn) {
714
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
715
+ let index = 0;
716
+ for await (const item of iterable) {
717
+ yield await fn(item, index++);
718
+ }
719
+ }
720
+ async function* take(source, count) {
721
+ if (count <= 0) return;
722
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
723
+ let taken = 0;
724
+ for await (const item of iterable) {
725
+ yield item;
726
+ taken++;
727
+ if (taken >= count) break;
728
+ }
729
+ }
730
+ async function* skip(source, count) {
731
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
732
+ let skipped = 0;
733
+ for await (const item of iterable) {
734
+ if (skipped < count) {
735
+ skipped++;
736
+ continue;
737
+ }
738
+ yield item;
739
+ }
740
+ }
741
+ async function* takeWhile(source, predicate) {
742
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
743
+ let index = 0;
744
+ for await (const item of iterable) {
745
+ if (!await predicate(item, index++)) break;
746
+ yield item;
747
+ }
748
+ }
749
+ async function* skipWhile(source, predicate) {
750
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
751
+ let skipping = true;
752
+ let index = 0;
753
+ for await (const item of iterable) {
754
+ if (skipping && await predicate(item, index++)) {
755
+ continue;
756
+ }
757
+ skipping = false;
758
+ yield item;
759
+ }
760
+ }
761
+ async function collect(source) {
762
+ const items = [];
763
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
764
+ for await (const item of iterable) {
765
+ items.push(item);
766
+ }
767
+ return items;
768
+ }
769
+ async function reduce(source, reducer, initial) {
770
+ let accumulator = initial;
771
+ const iterable = isStreamReader(source) ? toAsyncIterable(source) : source;
772
+ let index = 0;
773
+ for await (const item of iterable) {
774
+ accumulator = await reducer(accumulator, item, index++);
775
+ }
776
+ return accumulator;
777
+ }
778
+ function isStreamReader(value) {
779
+ return typeof value === "object" && value !== null && "read" in value && typeof value.read === "function" && "readable" in value;
780
+ }
781
+ function pipe(source, ...transformers) {
782
+ let result = isStreamReader(source) ? toAsyncIterable(source) : source;
783
+ for (const transformer of transformers) {
784
+ result = transformer(result);
785
+ }
786
+ return result;
787
+ }
788
+
789
+ // src/streaming/index.ts
790
+ function getStreamReader(options) {
791
+ const {
792
+ store,
793
+ workflowId,
794
+ namespace = "default",
795
+ startIndex = 0,
796
+ pollInterval = 100,
797
+ pollTimeout = 3e4
798
+ } = options;
799
+ let position = startIndex;
800
+ let readable = true;
801
+ let closed = false;
802
+ let bufferedItems = [];
803
+ let bufferIndex = 0;
804
+ const reader = {
805
+ async read() {
806
+ if (closed) {
807
+ return err(streamReadError("closed", "Reader is closed"));
808
+ }
809
+ if (bufferIndex < bufferedItems.length) {
810
+ const item = bufferedItems[bufferIndex++];
811
+ position = item.position + 1;
812
+ return ok(item.value);
813
+ }
814
+ const pollStart = Date.now();
815
+ while (Date.now() - pollStart < pollTimeout) {
816
+ const result = await store.read(workflowId, namespace, position, 100);
817
+ if (!result.ok) {
818
+ return err(streamReadError("store_error", result.error.message, result.error));
819
+ }
820
+ const items = result.value;
821
+ if (items.length > 0) {
822
+ bufferedItems = items;
823
+ bufferIndex = 1;
824
+ const item = items[0];
825
+ position = item.position + 1;
826
+ return ok(item.value);
827
+ }
828
+ const metaResult = await store.getMetadata(workflowId, namespace);
829
+ if (metaResult.ok && metaResult.value?.closed) {
830
+ readable = false;
831
+ return err(streamEnded(position));
832
+ }
833
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
834
+ }
835
+ readable = false;
836
+ return err(streamEnded(position));
837
+ },
838
+ close() {
839
+ closed = true;
840
+ readable = false;
841
+ bufferedItems = [];
842
+ },
843
+ get readable() {
844
+ return readable;
845
+ },
846
+ get position() {
847
+ return position;
848
+ },
849
+ get namespace() {
850
+ return namespace;
851
+ }
852
+ };
853
+ return reader;
854
+ }
855
+ // Annotate the CommonJS export names for ESM import in node:
856
+ 0 && (module.exports = {
857
+ STREAM_BACKPRESSURE_ERROR,
858
+ STREAM_CLOSE_ERROR,
859
+ STREAM_ENDED,
860
+ STREAM_READ_ERROR,
861
+ STREAM_STORE_ERROR,
862
+ STREAM_WRITE_ERROR,
863
+ chunk,
864
+ collect,
865
+ createBackpressureController,
866
+ createFileStreamStore,
867
+ createMemoryStreamStore,
868
+ createTestableMemoryStreamStore,
869
+ filter,
870
+ flatMap,
871
+ flatMapAsync,
872
+ getStreamReader,
873
+ isStreamBackpressureError,
874
+ isStreamEnded,
875
+ isStreamReadError,
876
+ isStreamStoreError,
877
+ isStreamWriteError,
878
+ map,
879
+ mapAsync,
880
+ pipe,
881
+ reduce,
882
+ shouldApplyBackpressure,
883
+ skip,
884
+ skipWhile,
885
+ streamBackpressureError,
886
+ streamCloseError,
887
+ streamEnded,
888
+ streamReadError,
889
+ streamStoreError,
890
+ streamWriteError,
891
+ take,
892
+ takeWhile,
893
+ toAsyncIterable
894
+ });
895
+ //# sourceMappingURL=streaming.cjs.map