assistant-stream 0.3.15 → 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 (232) hide show
  1. package/README.md +6 -4
  2. package/dist/core/AssistantStream.d.ts +35 -31
  3. package/dist/core/AssistantStream.d.ts.map +1 -1
  4. package/dist/core/AssistantStream.js +39 -37
  5. package/dist/core/AssistantStream.js.map +1 -1
  6. package/dist/core/AssistantStreamChunk.d.ts +71 -78
  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 +62 -66
  26. package/dist/core/modules/assistant-stream.d.ts.map +1 -1
  27. package/dist/core/modules/assistant-stream.js +174 -182
  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 +41 -41
  88. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  89. package/dist/core/tool/ToolResponse.js +50 -56
  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 +103 -122
  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 +11 -9
  99. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  100. package/dist/core/tool/toolResultStream.js +127 -157
  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 +3 -3
  218. package/dist/core/AssistantStreamChunk.js.map +0 -1
  219. package/dist/core/object/types.js.map +0 -1
  220. package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
  221. package/dist/core/tool/tool-types.js.map +0 -1
  222. package/dist/core/tool/type-path-utils.js.map +0 -1
  223. package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
  224. package/dist/core/utils/types.js.map +0 -1
  225. package/dist/index.d.ts.map +0 -1
  226. package/dist/index.js.map +0 -1
  227. package/dist/resumable/index.d.ts.map +0 -1
  228. package/dist/resumable/index.js.map +0 -1
  229. package/dist/resumable/types.js.map +0 -1
  230. package/dist/utils/json/json-value.js.map +0 -1
  231. package/dist/utils.d.ts.map +0 -1
  232. package/dist/utils.js.map +0 -1
@@ -1,5 +1,6 @@
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/redis-impl.ts
3
4
  const DEFAULT_POLL_INTERVAL_MS = 100;
4
5
  const DEFAULT_KEY_PREFIX = "aui:resumable";
5
6
  const FIELD_CHUNK = "c";
@@ -8,191 +9,190 @@ const FIELD_ERROR = "error";
8
9
  const FIN_DONE = "done";
9
10
  const FIN_ERROR = "error";
10
11
  const STREAM_START_ID = "0-0";
11
- export class RedisResumableStreamStore {
12
- client;
13
- keyPrefix;
14
- defaultTtlMs;
15
- pollIntervalMs;
16
- maxChunkBytes;
17
- constructor(client, options = {}) {
18
- this.client = client;
19
- this.keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;
20
- this.defaultTtlMs = options.defaultTtlMs ?? DEFAULT_TTL_MS;
21
- this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
22
- this.maxChunkBytes = options.maxChunkBytes;
23
- }
24
- async acquire(streamId, options) {
25
- validateStreamId(streamId);
26
- const ttlSec = msToSec(options?.ttlMs ?? this.defaultTtlMs);
27
- const meta = JSON.stringify({ status: "streaming", ttlSec });
28
- const acquired = await this.client.setNX(this.metaKey(streamId), meta, ttlSec);
29
- if (acquired) {
30
- // a prior producer's data key may outlive its expired meta key.
31
- await this.client.del([this.dataKey(streamId)]);
32
- return "producer";
33
- }
34
- return "consumer";
35
- }
36
- async append(streamId, chunk) {
37
- validateStreamId(streamId);
38
- if (this.maxChunkBytes !== undefined &&
39
- chunk.byteLength > this.maxChunkBytes) {
40
- throw new Error(`Chunk exceeds maxChunkBytes (${chunk.byteLength} > ${this.maxChunkBytes})`);
41
- }
42
- const dataKey = this.dataKey(streamId);
43
- const metaKey = this.metaKey(streamId);
44
- const meta = await this.readMeta(streamId);
45
- if (!meta) {
46
- throw new Error(`Stream not found: ${streamId}`);
47
- }
48
- if (meta.status !== "streaming") {
49
- throw new ResumableStreamError("finalized", `Stream already finalized: ${streamId}`);
50
- }
51
- const ttlSec = meta.ttlSec ?? msToSec(this.defaultTtlMs);
52
- await this.client.pipeline([
53
- { type: "xAdd", key: dataKey, fields: { [FIELD_CHUNK]: chunk } },
54
- { type: "expire", key: dataKey, ttlSec },
55
- { type: "expire", key: metaKey, ttlSec },
56
- ]);
57
- }
58
- async finalize(streamId, status, error) {
59
- validateStreamId(streamId);
60
- const dataKey = this.dataKey(streamId);
61
- const metaKey = this.metaKey(streamId);
62
- const existing = await this.readMeta(streamId);
63
- if (!existing) {
64
- throw new Error(`Stream not found: ${streamId}`);
65
- }
66
- // a second finalize must not append a duplicate FIN entry.
67
- if (existing.status !== "streaming")
68
- return;
69
- const ttlSec = existing.ttlSec ?? msToSec(this.defaultTtlMs);
70
- const meta = JSON.stringify(status === "error"
71
- ? { status: "error", error: error ?? "Stream errored", ttlSec }
72
- : { status: "done", ttlSec });
73
- const fields = {
74
- [FIELD_FIN]: status === "error" ? FIN_ERROR : FIN_DONE,
75
- };
76
- if (status === "error") {
77
- fields[FIELD_ERROR] = error ?? "Stream errored";
78
- }
79
- await this.client.pipeline([
80
- { type: "set", key: metaKey, value: meta, ttlSec },
81
- { type: "xAdd", key: dataKey, fields },
82
- { type: "expire", key: dataKey, ttlSec },
83
- ]);
84
- }
85
- async *read(streamId, cursor, signal) {
86
- validateStreamId(streamId);
87
- const dataKey = this.dataKey(streamId);
88
- const metaKey = this.metaKey(streamId);
89
- const initialMeta = await this.client.get(metaKey);
90
- if (initialMeta === null) {
91
- throw new Error(`Stream not found: ${streamId}`);
92
- }
93
- let lastId = cursor === "" ? STREAM_START_ID : cursor;
94
- while (true) {
95
- if (signal.aborted)
96
- return;
97
- const start = lastId === STREAM_START_ID ? "-" : `(${lastId}`;
98
- const entries = await this.client.xRange(dataKey, start, "+");
99
- for (const entry of entries) {
100
- if (signal.aborted)
101
- return;
102
- lastId = entry.id;
103
- const fin = readString(entry.fields[FIELD_FIN]);
104
- if (fin === FIN_DONE)
105
- return;
106
- if (fin === FIN_ERROR) {
107
- throw new Error(readString(entry.fields[FIELD_ERROR]) ?? "Stream errored");
108
- }
109
- const raw = entry.fields[FIELD_CHUNK];
110
- if (raw === undefined)
111
- continue;
112
- yield { cursor: entry.id, chunk: toBytes(raw) };
113
- }
114
- if (entries.length > 0)
115
- continue;
116
- const stillExists = await this.client.exists(metaKey);
117
- if (!stillExists)
118
- return;
119
- await sleep(this.pollIntervalMs, signal);
120
- }
121
- }
122
- async status(streamId) {
123
- validateStreamId(streamId);
124
- const meta = await this.client.get(this.metaKey(streamId));
125
- if (meta === null)
126
- return "missing";
127
- const parsed = parseMeta(meta);
128
- if (parsed?.status === "streaming")
129
- return "streaming";
130
- if (parsed?.status === "done")
131
- return "done";
132
- if (parsed?.status === "error")
133
- return "error";
134
- return "missing";
135
- }
136
- async delete(streamId) {
137
- validateStreamId(streamId);
138
- await this.client.del([this.metaKey(streamId), this.dataKey(streamId)]);
139
- }
140
- async readMeta(streamId) {
141
- const raw = await this.client.get(this.metaKey(streamId));
142
- if (raw === null)
143
- return undefined;
144
- return parseMeta(raw);
145
- }
146
- // {streamId} is a Redis Cluster hash tag so both keys live on the same
147
- // shard; multi-key DEL and same-stream pipelines stay single-slot.
148
- metaKey(streamId) {
149
- return `${this.keyPrefix}:{${streamId}}:meta`;
150
- }
151
- dataKey(streamId) {
152
- return `${this.keyPrefix}:{${streamId}}:data`;
153
- }
154
- }
12
+ var RedisResumableStreamStore = class {
13
+ client;
14
+ keyPrefix;
15
+ defaultTtlMs;
16
+ pollIntervalMs;
17
+ maxChunkBytes;
18
+ constructor(client, options = {}) {
19
+ this.client = client;
20
+ this.keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;
21
+ this.defaultTtlMs = options.defaultTtlMs ?? 864e5;
22
+ this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
23
+ this.maxChunkBytes = options.maxChunkBytes;
24
+ }
25
+ async acquire(streamId, options) {
26
+ validateStreamId(streamId);
27
+ const ttlSec = msToSec(options?.ttlMs ?? this.defaultTtlMs);
28
+ const meta = JSON.stringify({
29
+ status: "streaming",
30
+ ttlSec
31
+ });
32
+ if (await this.client.setNX(this.metaKey(streamId), meta, ttlSec)) {
33
+ await this.client.del([this.dataKey(streamId)]);
34
+ return "producer";
35
+ }
36
+ return "consumer";
37
+ }
38
+ async append(streamId, chunk) {
39
+ validateStreamId(streamId);
40
+ if (this.maxChunkBytes !== void 0 && chunk.byteLength > this.maxChunkBytes) throw new Error(`Chunk exceeds maxChunkBytes (${chunk.byteLength} > ${this.maxChunkBytes})`);
41
+ const dataKey = this.dataKey(streamId);
42
+ const metaKey = this.metaKey(streamId);
43
+ const meta = await this.readMeta(streamId);
44
+ if (!meta) throw new Error(`Stream not found: ${streamId}`);
45
+ if (meta.status !== "streaming") throw new ResumableStreamError("finalized", `Stream already finalized: ${streamId}`);
46
+ const ttlSec = meta.ttlSec ?? msToSec(this.defaultTtlMs);
47
+ await this.client.pipeline([
48
+ {
49
+ type: "xAdd",
50
+ key: dataKey,
51
+ fields: { [FIELD_CHUNK]: chunk }
52
+ },
53
+ {
54
+ type: "expire",
55
+ key: dataKey,
56
+ ttlSec
57
+ },
58
+ {
59
+ type: "expire",
60
+ key: metaKey,
61
+ ttlSec
62
+ }
63
+ ]);
64
+ }
65
+ async finalize(streamId, status, error) {
66
+ validateStreamId(streamId);
67
+ const dataKey = this.dataKey(streamId);
68
+ const metaKey = this.metaKey(streamId);
69
+ const existing = await this.readMeta(streamId);
70
+ if (!existing) throw new Error(`Stream not found: ${streamId}`);
71
+ if (existing.status !== "streaming") return;
72
+ const ttlSec = existing.ttlSec ?? msToSec(this.defaultTtlMs);
73
+ const meta = JSON.stringify(status === "error" ? {
74
+ status: "error",
75
+ error: error ?? "Stream errored",
76
+ ttlSec
77
+ } : {
78
+ status: "done",
79
+ ttlSec
80
+ });
81
+ const fields = { [FIELD_FIN]: status === "error" ? FIN_ERROR : FIN_DONE };
82
+ if (status === "error") fields[FIELD_ERROR] = error ?? "Stream errored";
83
+ await this.client.pipeline([
84
+ {
85
+ type: "set",
86
+ key: metaKey,
87
+ value: meta,
88
+ ttlSec
89
+ },
90
+ {
91
+ type: "xAdd",
92
+ key: dataKey,
93
+ fields
94
+ },
95
+ {
96
+ type: "expire",
97
+ key: dataKey,
98
+ ttlSec
99
+ }
100
+ ]);
101
+ }
102
+ async *read(streamId, cursor, signal) {
103
+ validateStreamId(streamId);
104
+ const dataKey = this.dataKey(streamId);
105
+ const metaKey = this.metaKey(streamId);
106
+ if (await this.client.get(metaKey) === null) throw new Error(`Stream not found: ${streamId}`);
107
+ let lastId = cursor === "" ? STREAM_START_ID : cursor;
108
+ while (true) {
109
+ if (signal.aborted) return;
110
+ const start = lastId === STREAM_START_ID ? "-" : `(${lastId}`;
111
+ const entries = await this.client.xRange(dataKey, start, "+");
112
+ for (const entry of entries) {
113
+ if (signal.aborted) return;
114
+ lastId = entry.id;
115
+ const fin = readString(entry.fields[FIELD_FIN]);
116
+ if (fin === FIN_DONE) return;
117
+ if (fin === FIN_ERROR) throw new Error(readString(entry.fields[FIELD_ERROR]) ?? "Stream errored");
118
+ const raw = entry.fields[FIELD_CHUNK];
119
+ if (raw === void 0) continue;
120
+ yield {
121
+ cursor: entry.id,
122
+ chunk: toBytes(raw)
123
+ };
124
+ }
125
+ if (entries.length > 0) continue;
126
+ if (!await this.client.exists(metaKey)) return;
127
+ await sleep(this.pollIntervalMs, signal);
128
+ }
129
+ }
130
+ async status(streamId) {
131
+ validateStreamId(streamId);
132
+ const meta = await this.client.get(this.metaKey(streamId));
133
+ if (meta === null) return "missing";
134
+ const parsed = parseMeta(meta);
135
+ if (parsed?.status === "streaming") return "streaming";
136
+ if (parsed?.status === "done") return "done";
137
+ if (parsed?.status === "error") return "error";
138
+ return "missing";
139
+ }
140
+ async delete(streamId) {
141
+ validateStreamId(streamId);
142
+ await this.client.del([this.metaKey(streamId), this.dataKey(streamId)]);
143
+ }
144
+ async readMeta(streamId) {
145
+ const raw = await this.client.get(this.metaKey(streamId));
146
+ if (raw === null) return void 0;
147
+ return parseMeta(raw);
148
+ }
149
+ metaKey(streamId) {
150
+ return `${this.keyPrefix}:{${streamId}}:meta`;
151
+ }
152
+ dataKey(streamId) {
153
+ return `${this.keyPrefix}:{${streamId}}:data`;
154
+ }
155
+ };
155
156
  function parseMeta(value) {
156
- try {
157
- const parsed = JSON.parse(value);
158
- return parsed && typeof parsed === "object" ? parsed : undefined;
159
- }
160
- catch {
161
- return undefined;
162
- }
157
+ try {
158
+ const parsed = JSON.parse(value);
159
+ return parsed && typeof parsed === "object" ? parsed : void 0;
160
+ } catch {
161
+ return;
162
+ }
163
163
  }
164
164
  function msToSec(ms) {
165
- return Math.max(1, Math.ceil(ms / 1000));
165
+ return Math.max(1, Math.ceil(ms / 1e3));
166
166
  }
167
167
  function sleep(ms, signal) {
168
- return new Promise((resolve) => {
169
- if (signal.aborted) {
170
- resolve();
171
- return;
172
- }
173
- const timer = setTimeout(() => {
174
- signal.removeEventListener("abort", onAbort);
175
- resolve();
176
- }, ms);
177
- const onAbort = () => {
178
- clearTimeout(timer);
179
- resolve();
180
- };
181
- signal.addEventListener("abort", onAbort, { once: true });
182
- });
168
+ return new Promise((resolve) => {
169
+ if (signal.aborted) {
170
+ resolve();
171
+ return;
172
+ }
173
+ const timer = setTimeout(() => {
174
+ signal.removeEventListener("abort", onAbort);
175
+ resolve();
176
+ }, ms);
177
+ const onAbort = () => {
178
+ clearTimeout(timer);
179
+ resolve();
180
+ };
181
+ signal.addEventListener("abort", onAbort, { once: true });
182
+ });
183
183
  }
184
184
  const SHARED_DECODER = new TextDecoder();
185
185
  const SHARED_ENCODER = new TextEncoder();
186
186
  function readString(value) {
187
- if (value === undefined)
188
- return undefined;
189
- if (typeof value === "string")
190
- return value;
191
- return SHARED_DECODER.decode(value);
187
+ if (value === void 0) return void 0;
188
+ if (typeof value === "string") return value;
189
+ return SHARED_DECODER.decode(value);
192
190
  }
193
191
  function toBytes(value) {
194
- if (value instanceof Uint8Array)
195
- return value;
196
- return SHARED_ENCODER.encode(value);
192
+ if (value instanceof Uint8Array) return value;
193
+ return SHARED_ENCODER.encode(value);
197
194
  }
195
+ //#endregion
196
+ export { RedisResumableStreamStore };
197
+
198
198
  //# sourceMappingURL=redis-impl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis-impl.js","sourceRoot":"","sources":["../../../src/resumable/stores/redis-impl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-impl.js","names":[],"sources":["../../../src/resumable/stores/redis-impl.ts"],"sourcesContent":["import { DEFAULT_TTL_MS } from \"../constants\";\nimport { ResumableStreamError, validateStreamId } from \"../errors\";\nimport type {\n ResumableStreamAcquireOptions,\n ResumableStreamEntry,\n ResumableStreamRole,\n ResumableStreamStatus,\n ResumableStreamStore,\n} from \"../types\";\n\nconst DEFAULT_POLL_INTERVAL_MS = 100;\nconst DEFAULT_KEY_PREFIX = \"aui:resumable\";\n\nconst FIELD_CHUNK = \"c\";\nconst FIELD_FIN = \"fin\";\nconst FIELD_ERROR = \"error\";\n\nconst FIN_DONE = \"done\";\nconst FIN_ERROR = \"error\";\n\nconst STREAM_START_ID = \"0-0\";\n\nexport type PipelineCommand =\n | {\n readonly type: \"xAdd\";\n readonly key: string;\n readonly fields: Record<string, string | Uint8Array>;\n }\n | { readonly type: \"expire\"; readonly key: string; readonly ttlSec: number }\n | {\n readonly type: \"set\";\n readonly key: string;\n readonly value: string;\n readonly ttlSec: number;\n };\n\n/**\n * Structural Redis-client interface. The bundled `redis` and `ioredis`\n * adapters wrap their respective clients to satisfy it; custom or proxied\n * clients can implement it directly.\n */\nexport interface RedisLikeClient {\n setNX(key: string, value: string, ttlSec: number): Promise<boolean>;\n set(key: string, value: string, ttlSec: number): Promise<void>;\n get(key: string): Promise<string | null>;\n expire(key: string, ttlSec: number): Promise<void>;\n exists(key: string): Promise<boolean>;\n del(keys: string[]): Promise<void>;\n xAdd(\n key: string,\n fields: Record<string, string | Uint8Array>,\n ): Promise<string>;\n xRange(\n key: string,\n start: string,\n end: string,\n ): Promise<\n Array<{ id: string; fields: Record<string, string | Uint8Array> }>\n >;\n /** Executes the commands as a single pipeline batch (one round trip). */\n pipeline(commands: readonly PipelineCommand[]): Promise<void>;\n}\n\nexport type RedisResumableStreamStoreOptions = {\n readonly keyPrefix?: string;\n readonly defaultTtlMs?: number;\n /** Defaults to 100ms. Lower values reduce read latency, raise traffic. */\n readonly pollIntervalMs?: number;\n readonly maxChunkBytes?: number;\n};\n\nexport class RedisResumableStreamStore implements ResumableStreamStore {\n private readonly client: RedisLikeClient;\n private readonly keyPrefix: string;\n private readonly defaultTtlMs: number;\n private readonly pollIntervalMs: number;\n private readonly maxChunkBytes: number | undefined;\n\n constructor(\n client: RedisLikeClient,\n options: RedisResumableStreamStoreOptions = {},\n ) {\n this.client = client;\n this.keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;\n this.defaultTtlMs = options.defaultTtlMs ?? DEFAULT_TTL_MS;\n this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n this.maxChunkBytes = options.maxChunkBytes;\n }\n\n async acquire(\n streamId: string,\n options?: ResumableStreamAcquireOptions,\n ): Promise<ResumableStreamRole> {\n validateStreamId(streamId);\n const ttlSec = msToSec(options?.ttlMs ?? this.defaultTtlMs);\n const meta = JSON.stringify({ status: \"streaming\", ttlSec });\n const acquired = await this.client.setNX(\n this.metaKey(streamId),\n meta,\n ttlSec,\n );\n if (acquired) {\n // a prior producer's data key may outlive its expired meta key.\n await this.client.del([this.dataKey(streamId)]);\n return \"producer\";\n }\n return \"consumer\";\n }\n\n async append(streamId: string, chunk: Uint8Array): Promise<void> {\n validateStreamId(streamId);\n if (\n this.maxChunkBytes !== undefined &&\n chunk.byteLength > this.maxChunkBytes\n ) {\n throw new Error(\n `Chunk exceeds maxChunkBytes (${chunk.byteLength} > ${this.maxChunkBytes})`,\n );\n }\n const dataKey = this.dataKey(streamId);\n const metaKey = this.metaKey(streamId);\n const meta = await this.readMeta(streamId);\n if (!meta) {\n throw new Error(`Stream not found: ${streamId}`);\n }\n if (meta.status !== \"streaming\") {\n throw new ResumableStreamError(\n \"finalized\",\n `Stream already finalized: ${streamId}`,\n );\n }\n const ttlSec = meta.ttlSec ?? msToSec(this.defaultTtlMs);\n await this.client.pipeline([\n { type: \"xAdd\", key: dataKey, fields: { [FIELD_CHUNK]: chunk } },\n { type: \"expire\", key: dataKey, ttlSec },\n { type: \"expire\", key: metaKey, ttlSec },\n ]);\n }\n\n async finalize(\n streamId: string,\n status: \"done\" | \"error\",\n error?: string,\n ): Promise<void> {\n validateStreamId(streamId);\n const dataKey = this.dataKey(streamId);\n const metaKey = this.metaKey(streamId);\n const existing = await this.readMeta(streamId);\n if (!existing) {\n throw new Error(`Stream not found: ${streamId}`);\n }\n // a second finalize must not append a duplicate FIN entry.\n if (existing.status !== \"streaming\") return;\n const ttlSec = existing.ttlSec ?? msToSec(this.defaultTtlMs);\n const meta = JSON.stringify(\n status === \"error\"\n ? { status: \"error\", error: error ?? \"Stream errored\", ttlSec }\n : { status: \"done\", ttlSec },\n );\n const fields: Record<string, string> = {\n [FIELD_FIN]: status === \"error\" ? FIN_ERROR : FIN_DONE,\n };\n if (status === \"error\") {\n fields[FIELD_ERROR] = error ?? \"Stream errored\";\n }\n await this.client.pipeline([\n { type: \"set\", key: metaKey, value: meta, ttlSec },\n { type: \"xAdd\", key: dataKey, fields },\n { type: \"expire\", key: dataKey, ttlSec },\n ]);\n }\n\n async *read(\n streamId: string,\n cursor: string,\n signal: AbortSignal,\n ): AsyncIterable<ResumableStreamEntry> {\n validateStreamId(streamId);\n const dataKey = this.dataKey(streamId);\n const metaKey = this.metaKey(streamId);\n const initialMeta = await this.client.get(metaKey);\n if (initialMeta === null) {\n throw new Error(`Stream not found: ${streamId}`);\n }\n\n let lastId = cursor === \"\" ? STREAM_START_ID : cursor;\n\n while (true) {\n if (signal.aborted) return;\n\n const start = lastId === STREAM_START_ID ? \"-\" : `(${lastId}`;\n const entries = await this.client.xRange(dataKey, start, \"+\");\n\n for (const entry of entries) {\n if (signal.aborted) return;\n lastId = entry.id;\n\n const fin = readString(entry.fields[FIELD_FIN]);\n if (fin === FIN_DONE) return;\n if (fin === FIN_ERROR) {\n throw new Error(\n readString(entry.fields[FIELD_ERROR]) ?? \"Stream errored\",\n );\n }\n\n const raw = entry.fields[FIELD_CHUNK];\n if (raw === undefined) continue;\n yield { cursor: entry.id, chunk: toBytes(raw) };\n }\n\n if (entries.length > 0) continue;\n\n const stillExists = await this.client.exists(metaKey);\n if (!stillExists) return;\n\n await sleep(this.pollIntervalMs, signal);\n }\n }\n\n async status(streamId: string): Promise<ResumableStreamStatus> {\n validateStreamId(streamId);\n const meta = await this.client.get(this.metaKey(streamId));\n if (meta === null) return \"missing\";\n const parsed = parseMeta(meta);\n if (parsed?.status === \"streaming\") return \"streaming\";\n if (parsed?.status === \"done\") return \"done\";\n if (parsed?.status === \"error\") return \"error\";\n return \"missing\";\n }\n\n async delete(streamId: string): Promise<void> {\n validateStreamId(streamId);\n await this.client.del([this.metaKey(streamId), this.dataKey(streamId)]);\n }\n\n private async readMeta(streamId: string): Promise<ParsedMeta | undefined> {\n const raw = await this.client.get(this.metaKey(streamId));\n if (raw === null) return undefined;\n return parseMeta(raw);\n }\n\n // {streamId} is a Redis Cluster hash tag so both keys live on the same\n // shard; multi-key DEL and same-stream pipelines stay single-slot.\n private metaKey(streamId: string): string {\n return `${this.keyPrefix}:{${streamId}}:meta`;\n }\n\n private dataKey(streamId: string): string {\n return `${this.keyPrefix}:{${streamId}}:data`;\n }\n}\n\ntype ParsedMeta = {\n status?: string;\n error?: string;\n ttlSec?: number;\n};\n\nfunction parseMeta(value: string): ParsedMeta | undefined {\n try {\n const parsed = JSON.parse(value) as ParsedMeta;\n return parsed && typeof parsed === \"object\" ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction msToSec(ms: number): number {\n return Math.max(1, Math.ceil(ms / 1000));\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise<void>((resolve) => {\n if (signal.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nconst SHARED_DECODER = new TextDecoder();\nconst SHARED_ENCODER = new TextEncoder();\n\nfunction readString(\n value: string | Uint8Array | undefined,\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value === \"string\") return value;\n return SHARED_DECODER.decode(value);\n}\n\nfunction toBytes(value: string | Uint8Array): Uint8Array {\n if (value instanceof Uint8Array) return value;\n return SHARED_ENCODER.encode(value);\n}\n"],"mappings":"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"}
@@ -1,39 +1,42 @@
1
- import { type RedisResumableStreamStoreOptions } from "./redis-impl.js";
2
- import type { ResumableStreamStore } from "../types.js";
1
+ import { ResumableStreamStore } from "../types.js";
2
+ import { RedisResumableStreamStoreOptions } from "./redis-impl.js";
3
+
4
+ //#region src/resumable/stores/redis.d.ts
3
5
  type NodeRedisFields = Record<string, string | Buffer>;
4
6
  interface NodeRedisMultiCommand {
5
- xAdd(key: string, id: string, fields: NodeRedisFields): NodeRedisMultiCommand;
6
- expire(key: string, seconds: number): NodeRedisMultiCommand;
7
- set(key: string, value: string, options: {
8
- EX: number;
9
- }): NodeRedisMultiCommand;
10
- execAsPipeline(): Promise<unknown>;
11
- exec(): Promise<unknown>;
7
+ xAdd(key: string, id: string, fields: NodeRedisFields): NodeRedisMultiCommand;
8
+ expire(key: string, seconds: number): NodeRedisMultiCommand;
9
+ set(key: string, value: string, options: {
10
+ EX: number;
11
+ }): NodeRedisMultiCommand;
12
+ execAsPipeline(): Promise<unknown>;
13
+ exec(): Promise<unknown>;
12
14
  }
13
15
  /** Structural subset of node-redis v5 used by the adapter. */
14
- export interface NodeRedisLike {
15
- set(key: string, value: string, options: {
16
- NX: true;
17
- EX: number;
18
- }): Promise<string | null>;
19
- set(key: string, value: string, options: {
20
- EX: number;
21
- }): Promise<string | null>;
22
- get(key: string): Promise<string | null>;
23
- expire(key: string, seconds: number): Promise<unknown>;
24
- exists(key: string): Promise<number>;
25
- del(keys: string | string[]): Promise<unknown>;
26
- xAdd(key: string, id: string, fields: NodeRedisFields): Promise<string>;
27
- sendCommand<T = unknown>(args: ReadonlyArray<string | Buffer>, options?: {
28
- typeMapping?: Record<number, unknown>;
29
- }): Promise<T>;
30
- multi(): NodeRedisMultiCommand;
16
+ interface NodeRedisLike {
17
+ set(key: string, value: string, options: {
18
+ NX: true;
19
+ EX: number;
20
+ }): Promise<string | null>;
21
+ set(key: string, value: string, options: {
22
+ EX: number;
23
+ }): Promise<string | null>;
24
+ get(key: string): Promise<string | null>;
25
+ expire(key: string, seconds: number): Promise<unknown>;
26
+ exists(key: string): Promise<number>;
27
+ del(keys: string | string[]): Promise<unknown>;
28
+ xAdd(key: string, id: string, fields: NodeRedisFields): Promise<string>;
29
+ sendCommand<T = unknown>(args: ReadonlyArray<string | Buffer>, options?: {
30
+ typeMapping?: Record<number, unknown>;
31
+ }): Promise<T>;
32
+ multi(): NodeRedisMultiCommand;
31
33
  }
32
34
  /**
33
35
  * Resumable stream store backed by [`redis`](https://www.npmjs.com/package/redis)
34
36
  * v5. Expects a connected client; cluster routing relies on the shared
35
37
  * `{streamId}` hash tag baked into the key scheme.
36
38
  */
37
- export declare function createRedisResumableStreamStore(client: NodeRedisLike, options?: RedisResumableStreamStoreOptions): ResumableStreamStore;
38
- export {};
39
+ declare function createRedisResumableStreamStore(client: NodeRedisLike, options?: RedisResumableStreamStoreOptions): ResumableStreamStore;
40
+ //#endregion
41
+ export { NodeRedisLike, createRedisResumableStreamStore };
39
42
  //# sourceMappingURL=redis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/resumable/stores/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gCAAgC,EACtC,wBAAqB;AACtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAiB;AAIrD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAEvD,UAAU,qBAAqB;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,qBAAqB,CAAC;IAC9E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC5D,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACtB,qBAAqB,CAAC;IACzB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,WAAW,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAClD,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,KAAK,IAAI,qBAAqB,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,gCAAgC,GACzC,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"redis.d.ts","names":[],"sources":["../../../src/resumable/stores/redis.ts"],"mappings":";;;;KAUK,eAAA,GAAkB,MAAM,kBAAkB,MAAA;AAAA,UAErC,qBAAA;EACR,IAAA,CAAK,GAAA,UAAa,EAAA,UAAY,MAAA,EAAQ,eAAA,GAAkB,qBAAA;EACxD,MAAA,CAAO,GAAA,UAAa,OAAA,WAAkB,qBAAA;EACtC,GAAA,CACE,GAAA,UACA,KAAA,UACA,OAAA;IAAW,EAAA;EAAA,IACV,qBAAA;EACH,cAAA,IAAkB,OAAA;EAClB,IAAA,IAAQ,OAAA;AAAA;;UAIO,aAAA;EACf,GAAA,CACE,GAAA,UACA,KAAA,UACA,OAAA;IAAW,EAAA;IAAU,EAAA;EAAA,IACpB,OAAA;EACH,GAAA,CACE,GAAA,UACA,KAAA,UACA,OAAA;IAAW,EAAA;EAAA,IACV,OAAA;EACH,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,MAAA,CAAO,GAAA,UAAa,OAAA,WAAkB,OAAA;EACtC,MAAA,CAAO,GAAA,WAAc,OAAA;EACrB,GAAA,CAAI,IAAA,sBAA0B,OAAA;EAC9B,IAAA,CAAK,GAAA,UAAa,EAAA,UAAY,MAAA,EAAQ,eAAA,GAAkB,OAAA;EACxD,WAAA,cACE,IAAA,EAAM,aAAA,UAAuB,MAAA,GAC7B,OAAA;IAAY,WAAA,GAAc,MAAA;EAAA,IACzB,OAAA,CAAQ,CAAA;EACX,KAAA,IAAS,qBAAA;AAAA;;;;;;iBAQK,+BAAA,CACd,MAAA,EAAQ,aAAA,EACR,OAAA,GAAU,gCAAA,GACT,oBAAA"}