assistant-stream 0.3.14 → 0.3.16

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 (238) hide show
  1. package/README.md +6 -4
  2. package/dist/core/AssistantStream.d.ts +50 -9
  3. package/dist/core/AssistantStream.d.ts.map +1 -1
  4. package/dist/core/AssistantStream.js +39 -15
  5. package/dist/core/AssistantStream.js.map +1 -1
  6. package/dist/core/AssistantStreamChunk.d.ts +84 -61
  7. package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
  8. package/dist/core/AssistantStreamChunk.js +0 -2
  9. package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
  10. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
  11. package/dist/core/accumulators/AssistantMessageStream.js +52 -48
  12. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
  13. package/dist/core/accumulators/TimingTracker.d.ts +15 -11
  14. package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
  15. package/dist/core/accumulators/TimingTracker.js +36 -43
  16. package/dist/core/accumulators/TimingTracker.js.map +1 -1
  17. package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
  18. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
  19. package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
  20. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  21. package/dist/core/converters/toGenericMessages.d.ts +49 -47
  22. package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
  23. package/dist/core/converters/toGenericMessages.js +122 -136
  24. package/dist/core/converters/toGenericMessages.js.map +1 -1
  25. package/dist/core/modules/assistant-stream.d.ts +92 -28
  26. package/dist/core/modules/assistant-stream.d.ts.map +1 -1
  27. package/dist/core/modules/assistant-stream.js +177 -162
  28. package/dist/core/modules/assistant-stream.js.map +1 -1
  29. package/dist/core/modules/text.d.ts +11 -7
  30. package/dist/core/modules/text.d.ts.map +1 -1
  31. package/dist/core/modules/text.js +45 -45
  32. package/dist/core/modules/text.js.map +1 -1
  33. package/dist/core/modules/tool-call.d.ts +15 -11
  34. package/dist/core/modules/tool-call.d.ts.map +1 -1
  35. package/dist/core/modules/tool-call.js +81 -96
  36. package/dist/core/modules/tool-call.js.map +1 -1
  37. package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
  38. package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
  39. package/dist/core/object/ObjectStreamAccumulator.js +44 -52
  40. package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
  41. package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
  42. package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
  43. package/dist/core/object/ObjectStreamResponse.js +52 -71
  44. package/dist/core/object/ObjectStreamResponse.js.map +1 -1
  45. package/dist/core/object/createObjectStream.d.ts +14 -8
  46. package/dist/core/object/createObjectStream.d.ts.map +1 -1
  47. package/dist/core/object/createObjectStream.js +50 -47
  48. package/dist/core/object/createObjectStream.js.map +1 -1
  49. package/dist/core/object/types.d.ts +14 -11
  50. package/dist/core/object/types.d.ts.map +1 -1
  51. package/dist/core/object/types.js +0 -2
  52. package/dist/core/serialization/PlainText.d.ts +11 -7
  53. package/dist/core/serialization/PlainText.d.ts.map +1 -1
  54. package/dist/core/serialization/PlainText.js +40 -48
  55. package/dist/core/serialization/PlainText.js.map +1 -1
  56. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
  57. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
  58. package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
  59. package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
  60. package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
  61. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
  62. package/dist/core/serialization/data-stream/DataStream.js +320 -371
  63. package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
  64. package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
  65. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
  66. package/dist/core/serialization/data-stream/chunk-types.js +27 -23
  67. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  68. package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
  69. package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
  70. package/dist/core/serialization/data-stream/serialization.js +23 -24
  71. package/dist/core/serialization/data-stream/serialization.js.map +1 -1
  72. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
  73. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
  74. package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
  75. package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
  76. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
  77. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
  78. package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
  79. package/dist/core/tool/ToolCallReader.d.ts +34 -30
  80. package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
  81. package/dist/core/tool/ToolCallReader.js +264 -317
  82. package/dist/core/tool/ToolCallReader.js.map +1 -1
  83. package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
  84. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
  85. package/dist/core/tool/ToolExecutionStream.js +123 -146
  86. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  87. package/dist/core/tool/ToolResponse.d.ts +60 -19
  88. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  89. package/dist/core/tool/ToolResponse.js +51 -34
  90. package/dist/core/tool/ToolResponse.js.map +1 -1
  91. package/dist/core/tool/schema-utils.d.ts +19 -15
  92. package/dist/core/tool/schema-utils.d.ts.map +1 -1
  93. package/dist/core/tool/schema-utils.js +50 -84
  94. package/dist/core/tool/schema-utils.js.map +1 -1
  95. package/dist/core/tool/tool-types.d.ts +173 -92
  96. package/dist/core/tool/tool-types.d.ts.map +1 -1
  97. package/dist/core/tool/tool-types.js +0 -2
  98. package/dist/core/tool/toolResultStream.d.ts +24 -7
  99. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  100. package/dist/core/tool/toolResultStream.js +128 -145
  101. package/dist/core/tool/toolResultStream.js.map +1 -1
  102. package/dist/core/tool/type-path-utils.d.ts +8 -19
  103. package/dist/core/tool/type-path-utils.d.ts.map +1 -1
  104. package/dist/core/tool/type-path-utils.js +0 -2
  105. package/dist/core/utils/Counter.d.ts +6 -3
  106. package/dist/core/utils/Counter.d.ts.map +1 -1
  107. package/dist/core/utils/Counter.js +10 -6
  108. package/dist/core/utils/Counter.js.map +1 -1
  109. package/dist/core/utils/generateId.d.ts +4 -1
  110. package/dist/core/utils/generateId.d.ts.map +1 -1
  111. package/dist/core/utils/generateId.js +5 -1
  112. package/dist/core/utils/generateId.js.map +1 -1
  113. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
  114. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
  115. package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
  116. package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
  117. package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
  118. package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
  119. package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
  120. package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
  121. package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
  122. package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
  123. package/dist/core/utils/stream/LineDecoderStream.js +23 -26
  124. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
  125. package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
  126. package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
  127. package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
  128. package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
  129. package/dist/core/utils/stream/SSE.d.ts +10 -6
  130. package/dist/core/utils/stream/SSE.d.ts.map +1 -1
  131. package/dist/core/utils/stream/SSE.js +79 -91
  132. package/dist/core/utils/stream/SSE.js.map +1 -1
  133. package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
  134. package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
  135. package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
  136. package/dist/core/utils/stream/merge.d.ts +11 -7
  137. package/dist/core/utils/stream/merge.d.ts.map +1 -1
  138. package/dist/core/utils/stream/merge.js +68 -170
  139. package/dist/core/utils/stream/merge.js.map +1 -1
  140. package/dist/core/utils/stream/path-utils.d.ts +11 -7
  141. package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
  142. package/dist/core/utils/stream/path-utils.js +46 -52
  143. package/dist/core/utils/stream/path-utils.js.map +1 -1
  144. package/dist/core/utils/types.d.ts +109 -113
  145. package/dist/core/utils/types.d.ts.map +1 -1
  146. package/dist/core/utils/types.js +0 -2
  147. package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
  148. package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
  149. package/dist/core/utils/withPromiseOrValue.js +12 -15
  150. package/dist/core/utils/withPromiseOrValue.js.map +1 -1
  151. package/dist/index.d.ts +23 -24
  152. package/dist/index.js +16 -16
  153. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  154. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  155. package/dist/resumable/ResumableStreamContext.d.ts +28 -24
  156. package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
  157. package/dist/resumable/ResumableStreamContext.js +99 -114
  158. package/dist/resumable/ResumableStreamContext.js.map +1 -1
  159. package/dist/resumable/constants.d.ts +4 -1
  160. package/dist/resumable/constants.d.ts.map +1 -1
  161. package/dist/resumable/constants.js +5 -1
  162. package/dist/resumable/constants.js.map +1 -1
  163. package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
  164. package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
  165. package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
  166. package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
  167. package/dist/resumable/errors.d.ts +8 -5
  168. package/dist/resumable/errors.d.ts.map +1 -1
  169. package/dist/resumable/errors.js +14 -12
  170. package/dist/resumable/errors.js.map +1 -1
  171. package/dist/resumable/index.d.ts +7 -7
  172. package/dist/resumable/index.js +5 -5
  173. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
  174. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
  175. package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
  176. package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
  177. package/dist/resumable/stores/ioredis.d.ts +9 -5
  178. package/dist/resumable/stores/ioredis.d.ts.map +1 -1
  179. package/dist/resumable/stores/ioredis.js +70 -82
  180. package/dist/resumable/stores/ioredis.js.map +1 -1
  181. package/dist/resumable/stores/redis-impl.d.ts +51 -48
  182. package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
  183. package/dist/resumable/stores/redis-impl.js +176 -176
  184. package/dist/resumable/stores/redis-impl.js.map +1 -1
  185. package/dist/resumable/stores/redis.d.ts +31 -28
  186. package/dist/resumable/stores/redis.d.ts.map +1 -1
  187. package/dist/resumable/stores/redis.js +87 -95
  188. package/dist/resumable/stores/redis.js.map +1 -1
  189. package/dist/resumable/types.d.ts +29 -26
  190. package/dist/resumable/types.d.ts.map +1 -1
  191. package/dist/resumable/types.js +0 -2
  192. package/dist/utils/AsyncIterableStream.d.ts +5 -2
  193. package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
  194. package/dist/utils/AsyncIterableStream.js +17 -16
  195. package/dist/utils/AsyncIterableStream.js.map +1 -1
  196. package/dist/utils/json/fix-json.d.ts +4 -1
  197. package/dist/utils/json/fix-json.d.ts.map +1 -1
  198. package/dist/utils/json/fix-json.js +286 -380
  199. package/dist/utils/json/fix-json.js.map +1 -1
  200. package/dist/utils/json/is-json.d.ts +8 -4
  201. package/dist/utils/json/is-json.d.ts.map +1 -1
  202. package/dist/utils/json/is-json.js +13 -21
  203. package/dist/utils/json/is-json.js.map +1 -1
  204. package/dist/utils/json/json-value.d.ts +7 -4
  205. package/dist/utils/json/json-value.d.ts.map +1 -1
  206. package/dist/utils/json/json-value.js +0 -2
  207. package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
  208. package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
  209. package/dist/utils/json/parse-partial-json-object.js +50 -62
  210. package/dist/utils/json/parse-partial-json-object.js.map +1 -1
  211. package/dist/utils/promiseWithResolvers.d.ts +7 -4
  212. package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
  213. package/dist/utils/promiseWithResolvers.js +17 -10
  214. package/dist/utils/promiseWithResolvers.js.map +1 -1
  215. package/dist/utils.d.ts +6 -6
  216. package/dist/utils.js +5 -5
  217. package/package.json +5 -4
  218. package/src/core/AssistantStream.ts +37 -0
  219. package/src/core/AssistantStreamChunk.ts +30 -0
  220. package/src/core/modules/assistant-stream.ts +68 -0
  221. package/src/core/tool/ToolResponse.ts +45 -1
  222. package/src/core/tool/tool-types.ts +102 -2
  223. package/src/core/tool/toolResultStream.ts +15 -0
  224. package/dist/core/AssistantStreamChunk.js.map +0 -1
  225. package/dist/core/object/types.js.map +0 -1
  226. package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
  227. package/dist/core/tool/tool-types.js.map +0 -1
  228. package/dist/core/tool/type-path-utils.js.map +0 -1
  229. package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
  230. package/dist/core/utils/types.js.map +0 -1
  231. package/dist/index.d.ts.map +0 -1
  232. package/dist/index.js.map +0 -1
  233. package/dist/resumable/index.d.ts.map +0 -1
  234. package/dist/resumable/index.js.map +0 -1
  235. package/dist/resumable/types.js.map +0 -1
  236. package/dist/utils/json/json-value.js.map +0 -1
  237. package/dist/utils.d.ts.map +0 -1
  238. package/dist/utils.js.map +0 -1
@@ -1,5 +1,5 @@
1
- export { ResumableStreamError, } from "./errors.js";
2
- export { createResumableStreamContext, } from "./ResumableStreamContext.js";
3
- export { createResumableAssistantStreamResponse, createResumeAssistantStreamResponse, RESUMABLE_STREAM_ID_HEADER, } from "./createResumableAssistantStreamResponse.js";
4
- export { createInMemoryResumableStreamStore, } from "./stores/InMemoryResumableStreamStore.js";
5
- //# sourceMappingURL=index.js.map
1
+ import { ResumableStreamError } from "./errors.js";
2
+ import { createResumableStreamContext } from "./ResumableStreamContext.js";
3
+ import { RESUMABLE_STREAM_ID_HEADER, createResumableAssistantStreamResponse, createResumeAssistantStreamResponse } from "./createResumableAssistantStreamResponse.js";
4
+ import { createInMemoryResumableStreamStore } from "./stores/InMemoryResumableStreamStore.js";
5
+ export { RESUMABLE_STREAM_ID_HEADER, ResumableStreamError, createInMemoryResumableStreamStore, createResumableAssistantStreamResponse, createResumableStreamContext, createResumeAssistantStreamResponse };
@@ -1,13 +1,17 @@
1
- import type { ResumableStreamStore } from "../types.js";
2
- export type InMemoryResumableStreamStoreOptions = {
3
- readonly defaultTtlMs?: number;
4
- readonly now?: () => number;
5
- readonly maxChunkBytes?: number;
6
- readonly maxEntriesPerStream?: number;
7
- readonly maxStreams?: number;
8
- readonly gcIntervalMs?: number;
1
+ import { ResumableStreamStore } from "../types.js";
2
+
3
+ //#region src/resumable/stores/InMemoryResumableStreamStore.d.ts
4
+ type InMemoryResumableStreamStoreOptions = {
5
+ readonly defaultTtlMs?: number;
6
+ readonly now?: () => number;
7
+ readonly maxChunkBytes?: number;
8
+ readonly maxEntriesPerStream?: number;
9
+ readonly maxStreams?: number;
10
+ readonly gcIntervalMs?: number;
9
11
  };
10
- export declare function createInMemoryResumableStreamStore(options?: InMemoryResumableStreamStoreOptions): ResumableStreamStore & {
11
- dispose: () => void;
12
+ declare function createInMemoryResumableStreamStore(options?: InMemoryResumableStreamStoreOptions): ResumableStreamStore & {
13
+ dispose: () => void;
12
14
  };
15
+ //#endregion
16
+ export { InMemoryResumableStreamStoreOptions, createInMemoryResumableStreamStore };
13
17
  //# sourceMappingURL=InMemoryResumableStreamStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryResumableStreamStore.d.ts","sourceRoot":"","sources":["../../../src/resumable/stores/InMemoryResumableStreamStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,oBAAoB,EACrB,oBAAiB;AAoBlB,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,wBAAgB,kCAAkC,CAChD,OAAO,GAAE,mCAAwC,GAChD,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAuMhD"}
1
+ {"version":3,"file":"InMemoryResumableStreamStore.d.ts","names":[],"sources":["../../../src/resumable/stores/InMemoryResumableStreamStore.ts"],"mappings":";;;KA0BY,mCAAA;EAAA,SACD,YAAA;EAAA,SACA,GAAA;EAAA,SACA,aAAA;EAAA,SACA,mBAAA;EAAA,SACA,UAAA;EAAA,SACA,YAAA;AAAA;AAAA,iBAGK,kCAAA,CACd,OAAA,GAAS,mCAAA,GACR,oBAAoB;EAAK,OAAA;AAAA"}
@@ -1,199 +1,165 @@
1
- import { DEFAULT_TTL_MS } from "../constants.js";
2
1
  import { ResumableStreamError, validateStreamId } from "../errors.js";
2
+ import "../constants.js";
3
+ //#region src/resumable/stores/InMemoryResumableStreamStore.ts
3
4
  const cursorOf = (seq) => seq.toString(36);
4
5
  const seqFromCursor = (cursor) => {
5
- if (cursor === "")
6
- return 0;
7
- const parsed = Number.parseInt(cursor, 36);
8
- return Number.isNaN(parsed) ? 0 : parsed;
6
+ if (cursor === "") return 0;
7
+ const parsed = Number.parseInt(cursor, 36);
8
+ return Number.isNaN(parsed) ? 0 : parsed;
9
9
  };
10
- export function createInMemoryResumableStreamStore(options = {}) {
11
- const streams = new Map();
12
- const defaultTtlMs = options.defaultTtlMs ?? DEFAULT_TTL_MS;
13
- const now = options.now ?? Date.now;
14
- const maxChunkBytes = options.maxChunkBytes;
15
- const maxEntriesPerStream = options.maxEntriesPerStream;
16
- const maxStreams = options.maxStreams;
17
- const evictExpired = () => {
18
- const t = now();
19
- for (const [id, state] of streams) {
20
- if (state.expiresAt > t)
21
- continue;
22
- streams.delete(id);
23
- state.final ??= { kind: "error", error: "Stream expired" };
24
- notify(state);
25
- }
26
- };
27
- const notify = (state) => {
28
- const waiters = state.waiters;
29
- state.waiters = [];
30
- for (const wake of waiters)
31
- wake();
32
- };
33
- const findStartIndex = (state, cursor) => {
34
- if (cursor === "")
35
- return 0;
36
- const after = seqFromCursor(cursor);
37
- let lo = 0;
38
- let hi = state.entries.length;
39
- while (lo < hi) {
40
- const mid = (lo + hi) >>> 1;
41
- const seq = seqFromCursor(state.entries[mid].cursor);
42
- if (seq <= after)
43
- lo = mid + 1;
44
- else
45
- hi = mid;
46
- }
47
- return lo;
48
- };
49
- const waitForUpdate = (state, signal, wakeBy) => new Promise((resolve) => {
50
- let settled = false;
51
- let timer;
52
- const wake = () => {
53
- if (settled)
54
- return;
55
- settled = true;
56
- if (timer !== undefined)
57
- clearTimeout(timer);
58
- signal.removeEventListener("abort", wake);
59
- const idx = state.waiters.indexOf(wake);
60
- if (idx !== -1)
61
- state.waiters.splice(idx, 1);
62
- resolve();
63
- };
64
- if (signal.aborted) {
65
- wake();
66
- return;
67
- }
68
- state.waiters.push(wake);
69
- signal.addEventListener("abort", wake, { once: true });
70
- if (wakeBy !== undefined) {
71
- if (wakeBy > 0) {
72
- timer = setTimeout(wake, wakeBy);
73
- }
74
- else {
75
- // already past the deadline; resolve so the caller can re-check
76
- // expiration without waiting for an external notify.
77
- wake();
78
- }
79
- }
80
- });
81
- const requireActive = (streamId) => {
82
- evictExpired();
83
- const state = streams.get(streamId);
84
- if (!state)
85
- throw new Error(`Stream not found: ${streamId}`);
86
- if (state.final) {
87
- throw new ResumableStreamError("finalized", `Stream already finalized: ${streamId}`);
88
- }
89
- return state;
90
- };
91
- const gcTimer = options.gcIntervalMs !== undefined
92
- ? setInterval(evictExpired, options.gcIntervalMs)
93
- : undefined;
94
- gcTimer?.unref?.();
95
- return {
96
- async acquire(streamId, acquireOptions) {
97
- validateStreamId(streamId);
98
- evictExpired();
99
- const existing = streams.get(streamId);
100
- if (existing)
101
- return "consumer";
102
- if (maxStreams !== undefined && streams.size >= maxStreams) {
103
- throw new Error("maxStreams exceeded");
104
- }
105
- const ttlMs = acquireOptions?.ttlMs ?? defaultTtlMs;
106
- streams.set(streamId, {
107
- entries: [],
108
- nextSeq: 1,
109
- expiresAt: now() + ttlMs,
110
- ttlMs,
111
- final: undefined,
112
- waiters: [],
113
- });
114
- return "producer";
115
- },
116
- async append(streamId, chunk) {
117
- validateStreamId(streamId);
118
- if (maxChunkBytes !== undefined && chunk.byteLength > maxChunkBytes) {
119
- throw new Error(`Chunk exceeds maxChunkBytes: ${chunk.byteLength}`);
120
- }
121
- const state = requireActive(streamId);
122
- if (maxEntriesPerStream !== undefined &&
123
- state.entries.length >= maxEntriesPerStream) {
124
- throw new Error(`Stream exceeded maxEntriesPerStream: ${streamId}`);
125
- }
126
- const seq = state.nextSeq;
127
- state.nextSeq += 1;
128
- state.entries.push({ cursor: cursorOf(seq), chunk });
129
- state.expiresAt = now() + state.ttlMs;
130
- notify(state);
131
- },
132
- async finalize(streamId, status, error) {
133
- validateStreamId(streamId);
134
- evictExpired();
135
- const state = streams.get(streamId);
136
- if (!state)
137
- throw new Error(`Stream not found: ${streamId}`);
138
- if (state.final)
139
- return;
140
- state.final =
141
- status === "done"
142
- ? { kind: "done" }
143
- : { kind: "error", error: error ?? "Stream errored" };
144
- state.expiresAt = now() + state.ttlMs;
145
- notify(state);
146
- },
147
- async *read(streamId, cursor, signal) {
148
- validateStreamId(streamId);
149
- evictExpired();
150
- const state = streams.get(streamId);
151
- if (!state)
152
- throw new Error(`Stream not found: ${streamId}`);
153
- let idx = findStartIndex(state, cursor);
154
- while (true) {
155
- if (signal.aborted)
156
- return;
157
- while (idx < state.entries.length) {
158
- if (signal.aborted)
159
- return;
160
- yield state.entries[idx];
161
- idx += 1;
162
- }
163
- if (state.final) {
164
- if (state.final.kind === "error") {
165
- throw new Error(state.final.error);
166
- }
167
- return;
168
- }
169
- const wakeBy = state.expiresAt - now();
170
- await waitForUpdate(state, signal, wakeBy);
171
- evictExpired();
172
- }
173
- },
174
- async status(streamId) {
175
- validateStreamId(streamId);
176
- evictExpired();
177
- const state = streams.get(streamId);
178
- if (!state)
179
- return "missing";
180
- if (!state.final)
181
- return "streaming";
182
- return state.final.kind === "error" ? "error" : "done";
183
- },
184
- async delete(streamId) {
185
- validateStreamId(streamId);
186
- const state = streams.get(streamId);
187
- if (!state)
188
- return;
189
- streams.delete(streamId);
190
- state.final ??= { kind: "done" };
191
- notify(state);
192
- },
193
- dispose() {
194
- if (gcTimer !== undefined)
195
- clearInterval(gcTimer);
196
- },
197
- };
10
+ function createInMemoryResumableStreamStore(options = {}) {
11
+ const streams = /* @__PURE__ */ new Map();
12
+ const defaultTtlMs = options.defaultTtlMs ?? 864e5;
13
+ const now = options.now ?? Date.now;
14
+ const maxChunkBytes = options.maxChunkBytes;
15
+ const maxEntriesPerStream = options.maxEntriesPerStream;
16
+ const maxStreams = options.maxStreams;
17
+ const evictExpired = () => {
18
+ const t = now();
19
+ for (const [id, state] of streams) {
20
+ if (state.expiresAt > t) continue;
21
+ streams.delete(id);
22
+ state.final ??= {
23
+ kind: "error",
24
+ error: "Stream expired"
25
+ };
26
+ notify(state);
27
+ }
28
+ };
29
+ const notify = (state) => {
30
+ const waiters = state.waiters;
31
+ state.waiters = [];
32
+ for (const wake of waiters) wake();
33
+ };
34
+ const findStartIndex = (state, cursor) => {
35
+ if (cursor === "") return 0;
36
+ const after = seqFromCursor(cursor);
37
+ let lo = 0;
38
+ let hi = state.entries.length;
39
+ while (lo < hi) {
40
+ const mid = lo + hi >>> 1;
41
+ if (seqFromCursor(state.entries[mid].cursor) <= after) lo = mid + 1;
42
+ else hi = mid;
43
+ }
44
+ return lo;
45
+ };
46
+ const waitForUpdate = (state, signal, wakeBy) => new Promise((resolve) => {
47
+ let settled = false;
48
+ let timer;
49
+ const wake = () => {
50
+ if (settled) return;
51
+ settled = true;
52
+ if (timer !== void 0) clearTimeout(timer);
53
+ signal.removeEventListener("abort", wake);
54
+ const idx = state.waiters.indexOf(wake);
55
+ if (idx !== -1) state.waiters.splice(idx, 1);
56
+ resolve();
57
+ };
58
+ if (signal.aborted) {
59
+ wake();
60
+ return;
61
+ }
62
+ state.waiters.push(wake);
63
+ signal.addEventListener("abort", wake, { once: true });
64
+ if (wakeBy !== void 0) if (wakeBy > 0) timer = setTimeout(wake, wakeBy);
65
+ else wake();
66
+ });
67
+ const requireActive = (streamId) => {
68
+ evictExpired();
69
+ const state = streams.get(streamId);
70
+ if (!state) throw new Error(`Stream not found: ${streamId}`);
71
+ if (state.final) throw new ResumableStreamError("finalized", `Stream already finalized: ${streamId}`);
72
+ return state;
73
+ };
74
+ const gcTimer = options.gcIntervalMs !== void 0 ? setInterval(evictExpired, options.gcIntervalMs) : void 0;
75
+ gcTimer?.unref?.();
76
+ return {
77
+ async acquire(streamId, acquireOptions) {
78
+ validateStreamId(streamId);
79
+ evictExpired();
80
+ if (streams.get(streamId)) return "consumer";
81
+ if (maxStreams !== void 0 && streams.size >= maxStreams) throw new Error("maxStreams exceeded");
82
+ const ttlMs = acquireOptions?.ttlMs ?? defaultTtlMs;
83
+ streams.set(streamId, {
84
+ entries: [],
85
+ nextSeq: 1,
86
+ expiresAt: now() + ttlMs,
87
+ ttlMs,
88
+ final: void 0,
89
+ waiters: []
90
+ });
91
+ return "producer";
92
+ },
93
+ async append(streamId, chunk) {
94
+ validateStreamId(streamId);
95
+ if (maxChunkBytes !== void 0 && chunk.byteLength > maxChunkBytes) throw new Error(`Chunk exceeds maxChunkBytes: ${chunk.byteLength}`);
96
+ const state = requireActive(streamId);
97
+ if (maxEntriesPerStream !== void 0 && state.entries.length >= maxEntriesPerStream) throw new Error(`Stream exceeded maxEntriesPerStream: ${streamId}`);
98
+ const seq = state.nextSeq;
99
+ state.nextSeq += 1;
100
+ state.entries.push({
101
+ cursor: cursorOf(seq),
102
+ chunk
103
+ });
104
+ state.expiresAt = now() + state.ttlMs;
105
+ notify(state);
106
+ },
107
+ async finalize(streamId, status, error) {
108
+ validateStreamId(streamId);
109
+ evictExpired();
110
+ const state = streams.get(streamId);
111
+ if (!state) throw new Error(`Stream not found: ${streamId}`);
112
+ if (state.final) return;
113
+ state.final = status === "done" ? { kind: "done" } : {
114
+ kind: "error",
115
+ error: error ?? "Stream errored"
116
+ };
117
+ state.expiresAt = now() + state.ttlMs;
118
+ notify(state);
119
+ },
120
+ async *read(streamId, cursor, signal) {
121
+ validateStreamId(streamId);
122
+ evictExpired();
123
+ const state = streams.get(streamId);
124
+ if (!state) throw new Error(`Stream not found: ${streamId}`);
125
+ let idx = findStartIndex(state, cursor);
126
+ while (true) {
127
+ if (signal.aborted) return;
128
+ while (idx < state.entries.length) {
129
+ if (signal.aborted) return;
130
+ yield state.entries[idx];
131
+ idx += 1;
132
+ }
133
+ if (state.final) {
134
+ if (state.final.kind === "error") throw new Error(state.final.error);
135
+ return;
136
+ }
137
+ await waitForUpdate(state, signal, state.expiresAt - now());
138
+ evictExpired();
139
+ }
140
+ },
141
+ async status(streamId) {
142
+ validateStreamId(streamId);
143
+ evictExpired();
144
+ const state = streams.get(streamId);
145
+ if (!state) return "missing";
146
+ if (!state.final) return "streaming";
147
+ return state.final.kind === "error" ? "error" : "done";
148
+ },
149
+ async delete(streamId) {
150
+ validateStreamId(streamId);
151
+ const state = streams.get(streamId);
152
+ if (!state) return;
153
+ streams.delete(streamId);
154
+ state.final ??= { kind: "done" };
155
+ notify(state);
156
+ },
157
+ dispose() {
158
+ if (gcTimer !== void 0) clearInterval(gcTimer);
159
+ }
160
+ };
198
161
  }
162
+ //#endregion
163
+ export { createInMemoryResumableStreamStore };
164
+
199
165
  //# sourceMappingURL=InMemoryResumableStreamStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryResumableStreamStore.js","sourceRoot":"","sources":["../../../src/resumable/stores/InMemoryResumableStreamStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InMemoryResumableStreamStore.js","names":[],"sources":["../../../src/resumable/stores/InMemoryResumableStreamStore.ts"],"sourcesContent":["import { DEFAULT_TTL_MS } from \"../constants\";\nimport { ResumableStreamError, validateStreamId } from \"../errors\";\nimport type {\n ResumableStreamEntry,\n ResumableStreamStatus,\n ResumableStreamStore,\n} from \"../types\";\n\ntype FinalizeMarker = { kind: \"done\" } | { kind: \"error\"; error: string };\n\ntype StreamState = {\n entries: ResumableStreamEntry[];\n nextSeq: number;\n expiresAt: number;\n ttlMs: number;\n final: FinalizeMarker | undefined;\n waiters: Array<() => void>;\n};\n\nconst cursorOf = (seq: number): string => seq.toString(36);\nconst seqFromCursor = (cursor: string): number => {\n if (cursor === \"\") return 0;\n const parsed = Number.parseInt(cursor, 36);\n return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nexport type InMemoryResumableStreamStoreOptions = {\n readonly defaultTtlMs?: number;\n readonly now?: () => number;\n readonly maxChunkBytes?: number;\n readonly maxEntriesPerStream?: number;\n readonly maxStreams?: number;\n readonly gcIntervalMs?: number;\n};\n\nexport function createInMemoryResumableStreamStore(\n options: InMemoryResumableStreamStoreOptions = {},\n): ResumableStreamStore & { dispose: () => void } {\n const streams = new Map<string, StreamState>();\n const defaultTtlMs = options.defaultTtlMs ?? DEFAULT_TTL_MS;\n const now = options.now ?? Date.now;\n const maxChunkBytes = options.maxChunkBytes;\n const maxEntriesPerStream = options.maxEntriesPerStream;\n const maxStreams = options.maxStreams;\n\n const evictExpired = (): void => {\n const t = now();\n for (const [id, state] of streams) {\n if (state.expiresAt > t) continue;\n streams.delete(id);\n state.final ??= { kind: \"error\", error: \"Stream expired\" };\n notify(state);\n }\n };\n\n const notify = (state: StreamState): void => {\n const waiters = state.waiters;\n state.waiters = [];\n for (const wake of waiters) wake();\n };\n\n const findStartIndex = (state: StreamState, cursor: string): number => {\n if (cursor === \"\") return 0;\n const after = seqFromCursor(cursor);\n let lo = 0;\n let hi = state.entries.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const seq = seqFromCursor(state.entries[mid]!.cursor);\n if (seq <= after) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n\n const waitForUpdate = (\n state: StreamState,\n signal: AbortSignal,\n wakeBy?: number,\n ): Promise<void> =>\n new Promise<void>((resolve) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const wake = () => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n signal.removeEventListener(\"abort\", wake);\n const idx = state.waiters.indexOf(wake);\n if (idx !== -1) state.waiters.splice(idx, 1);\n resolve();\n };\n if (signal.aborted) {\n wake();\n return;\n }\n state.waiters.push(wake);\n signal.addEventListener(\"abort\", wake, { once: true });\n if (wakeBy !== undefined) {\n if (wakeBy > 0) {\n timer = setTimeout(wake, wakeBy);\n } else {\n // already past the deadline; resolve so the caller can re-check\n // expiration without waiting for an external notify.\n wake();\n }\n }\n });\n\n const requireActive = (streamId: string): StreamState => {\n evictExpired();\n const state = streams.get(streamId);\n if (!state) throw new Error(`Stream not found: ${streamId}`);\n if (state.final) {\n throw new ResumableStreamError(\n \"finalized\",\n `Stream already finalized: ${streamId}`,\n );\n }\n return state;\n };\n\n const gcTimer =\n options.gcIntervalMs !== undefined\n ? setInterval(evictExpired, options.gcIntervalMs)\n : undefined;\n gcTimer?.unref?.();\n\n return {\n async acquire(streamId, acquireOptions) {\n validateStreamId(streamId);\n evictExpired();\n const existing = streams.get(streamId);\n if (existing) return \"consumer\";\n\n if (maxStreams !== undefined && streams.size >= maxStreams) {\n throw new Error(\"maxStreams exceeded\");\n }\n\n const ttlMs = acquireOptions?.ttlMs ?? defaultTtlMs;\n streams.set(streamId, {\n entries: [],\n nextSeq: 1,\n expiresAt: now() + ttlMs,\n ttlMs,\n final: undefined,\n waiters: [],\n });\n return \"producer\";\n },\n\n async append(streamId, chunk) {\n validateStreamId(streamId);\n if (maxChunkBytes !== undefined && chunk.byteLength > maxChunkBytes) {\n throw new Error(`Chunk exceeds maxChunkBytes: ${chunk.byteLength}`);\n }\n const state = requireActive(streamId);\n if (\n maxEntriesPerStream !== undefined &&\n state.entries.length >= maxEntriesPerStream\n ) {\n throw new Error(`Stream exceeded maxEntriesPerStream: ${streamId}`);\n }\n const seq = state.nextSeq;\n state.nextSeq += 1;\n state.entries.push({ cursor: cursorOf(seq), chunk });\n state.expiresAt = now() + state.ttlMs;\n notify(state);\n },\n\n async finalize(streamId, status, error) {\n validateStreamId(streamId);\n evictExpired();\n const state = streams.get(streamId);\n if (!state) throw new Error(`Stream not found: ${streamId}`);\n if (state.final) return;\n state.final =\n status === \"done\"\n ? { kind: \"done\" }\n : { kind: \"error\", error: error ?? \"Stream errored\" };\n state.expiresAt = now() + state.ttlMs;\n notify(state);\n },\n\n async *read(streamId, cursor, signal) {\n validateStreamId(streamId);\n evictExpired();\n const state = streams.get(streamId);\n if (!state) throw new Error(`Stream not found: ${streamId}`);\n\n let idx = findStartIndex(state, cursor);\n\n while (true) {\n if (signal.aborted) return;\n\n while (idx < state.entries.length) {\n if (signal.aborted) return;\n yield state.entries[idx]!;\n idx += 1;\n }\n\n if (state.final) {\n if (state.final.kind === \"error\") {\n throw new Error(state.final.error);\n }\n return;\n }\n\n const wakeBy = state.expiresAt - now();\n await waitForUpdate(state, signal, wakeBy);\n evictExpired();\n }\n },\n\n async status(streamId): Promise<ResumableStreamStatus> {\n validateStreamId(streamId);\n evictExpired();\n const state = streams.get(streamId);\n if (!state) return \"missing\";\n if (!state.final) return \"streaming\";\n return state.final.kind === \"error\" ? \"error\" : \"done\";\n },\n\n async delete(streamId) {\n validateStreamId(streamId);\n const state = streams.get(streamId);\n if (!state) return;\n streams.delete(streamId);\n state.final ??= { kind: \"done\" };\n notify(state);\n },\n\n dispose() {\n if (gcTimer !== undefined) clearInterval(gcTimer);\n },\n };\n}\n"],"mappings":"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"}
@@ -1,10 +1,14 @@
1
- import type { Cluster as IoRedisCluster, Redis as IoRedis } from "ioredis";
2
- import { type RedisResumableStreamStoreOptions } from "./redis-impl.js";
3
- import type { ResumableStreamStore } from "../types.js";
4
- export type IoRedisLike = IoRedis | IoRedisCluster;
1
+ import { ResumableStreamStore } from "../types.js";
2
+ import { RedisResumableStreamStoreOptions } from "./redis-impl.js";
3
+ import { Cluster, Redis } from "ioredis";
4
+
5
+ //#region src/resumable/stores/ioredis.d.ts
6
+ type IoRedisLike = Redis | Cluster;
5
7
  /**
6
8
  * Resumable stream store backed by [`ioredis`](https://www.npmjs.com/package/ioredis)
7
9
  * v5. Accepts a `Redis` or `Cluster` instance.
8
10
  */
9
- export declare function createIoredisResumableStreamStore(client: IoRedisLike, options?: RedisResumableStreamStoreOptions): ResumableStreamStore;
11
+ declare function createIoredisResumableStreamStore(client: IoRedisLike, options?: RedisResumableStreamStoreOptions): ResumableStreamStore;
12
+ //#endregion
13
+ export { IoRedisLike, createIoredisResumableStreamStore };
10
14
  //# sourceMappingURL=ioredis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ioredis.d.ts","sourceRoot":"","sources":["../../../src/resumable/stores/ioredis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,OAAO,IAAI,cAAc,EACzB,KAAK,IAAI,OAAO,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAIL,KAAK,gCAAgC,EACtC,wBAAqB;AACtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAiB;AAErD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,cAAc,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,gCAAgC,GACzC,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"ioredis.d.ts","names":[],"sources":["../../../src/resumable/stores/ioredis.ts"],"mappings":";;;;;KAaY,WAAA,GAAc,KAAA,GAAU,OAAc;;AAAlD;;;iBAMgB,iCAAA,CACd,MAAA,EAAQ,WAAA,EACR,OAAA,GAAU,gCAAA,GACT,oBAAA"}