assistant-stream 0.3.15 → 0.3.17
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.
- package/README.md +6 -4
- package/dist/core/AssistantStream.d.ts +35 -31
- package/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStream.js +39 -37
- package/dist/core/AssistantStream.js.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +71 -78
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.js +0 -2
- package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +52 -48
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/TimingTracker.d.ts +15 -11
- package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
- package/dist/core/accumulators/TimingTracker.js +36 -43
- package/dist/core/accumulators/TimingTracker.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/converters/toGenericMessages.d.ts +49 -47
- package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
- package/dist/core/converters/toGenericMessages.js +122 -136
- package/dist/core/converters/toGenericMessages.js.map +1 -1
- package/dist/core/modules/assistant-stream.d.ts +62 -66
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +176 -182
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.d.ts +11 -7
- package/dist/core/modules/text.d.ts.map +1 -1
- package/dist/core/modules/text.js +45 -45
- package/dist/core/modules/text.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts +15 -11
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +81 -96
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.js +44 -52
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamResponse.js +52 -71
- package/dist/core/object/ObjectStreamResponse.js.map +1 -1
- package/dist/core/object/createObjectStream.d.ts +14 -8
- package/dist/core/object/createObjectStream.d.ts.map +1 -1
- package/dist/core/object/createObjectStream.js +50 -47
- package/dist/core/object/createObjectStream.js.map +1 -1
- package/dist/core/object/types.d.ts +14 -11
- package/dist/core/object/types.d.ts.map +1 -1
- package/dist/core/object/types.js +0 -2
- package/dist/core/serialization/PlainText.d.ts +11 -7
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/PlainText.js +40 -48
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +320 -371
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +27 -23
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +23 -24
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
- package/dist/core/tool/ToolCallReader.d.ts +34 -30
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +264 -317
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +123 -146
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +41 -41
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js +50 -56
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/schema-utils.d.ts +19 -15
- package/dist/core/tool/schema-utils.d.ts.map +1 -1
- package/dist/core/tool/schema-utils.js +50 -84
- package/dist/core/tool/schema-utils.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +103 -122
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/tool-types.js +0 -2
- package/dist/core/tool/toolResultStream.d.ts +11 -9
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +127 -157
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.d.ts +8 -19
- package/dist/core/tool/type-path-utils.d.ts.map +1 -1
- package/dist/core/tool/type-path-utils.js +0 -2
- package/dist/core/utils/Counter.d.ts +6 -3
- package/dist/core/utils/Counter.d.ts.map +1 -1
- package/dist/core/utils/Counter.js +10 -6
- package/dist/core/utils/Counter.js.map +1 -1
- package/dist/core/utils/generateId.d.ts +4 -1
- package/dist/core/utils/generateId.d.ts.map +1 -1
- package/dist/core/utils/generateId.js +5 -1
- package/dist/core/utils/generateId.js.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
- package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
- package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
- package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +23 -26
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
- package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
- package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +10 -6
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +79 -91
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
- package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
- package/dist/core/utils/stream/merge.d.ts +11 -7
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +68 -170
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts +11 -7
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/core/utils/stream/path-utils.js +46 -52
- package/dist/core/utils/stream/path-utils.js.map +1 -1
- package/dist/core/utils/types.d.ts +109 -113
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/core/utils/types.js +0 -2
- package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
- package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
- package/dist/core/utils/withPromiseOrValue.js +12 -15
- package/dist/core/utils/withPromiseOrValue.js.map +1 -1
- package/dist/index.d.ts +23 -24
- package/dist/index.js +16 -16
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
- package/dist/resumable/ResumableStreamContext.d.ts +28 -24
- package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.js +99 -114
- package/dist/resumable/ResumableStreamContext.js.map +1 -1
- package/dist/resumable/constants.d.ts +4 -1
- package/dist/resumable/constants.d.ts.map +1 -1
- package/dist/resumable/constants.js +5 -1
- package/dist/resumable/constants.js.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
- package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
- package/dist/resumable/errors.d.ts +8 -5
- package/dist/resumable/errors.d.ts.map +1 -1
- package/dist/resumable/errors.js +14 -12
- package/dist/resumable/errors.js.map +1 -1
- package/dist/resumable/index.d.ts +7 -7
- package/dist/resumable/index.js +5 -5
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
- package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
- package/dist/resumable/stores/ioredis.d.ts +9 -5
- package/dist/resumable/stores/ioredis.d.ts.map +1 -1
- package/dist/resumable/stores/ioredis.js +70 -82
- package/dist/resumable/stores/ioredis.js.map +1 -1
- package/dist/resumable/stores/redis-impl.d.ts +51 -48
- package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
- package/dist/resumable/stores/redis-impl.js +176 -176
- package/dist/resumable/stores/redis-impl.js.map +1 -1
- package/dist/resumable/stores/redis.d.ts +31 -28
- package/dist/resumable/stores/redis.d.ts.map +1 -1
- package/dist/resumable/stores/redis.js +87 -95
- package/dist/resumable/stores/redis.js.map +1 -1
- package/dist/resumable/types.d.ts +29 -26
- package/dist/resumable/types.d.ts.map +1 -1
- package/dist/resumable/types.js +0 -2
- package/dist/utils/AsyncIterableStream.d.ts +5 -2
- package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.js +17 -16
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/json/fix-json.d.ts +4 -1
- package/dist/utils/json/fix-json.d.ts.map +1 -1
- package/dist/utils/json/fix-json.js +286 -380
- package/dist/utils/json/fix-json.js.map +1 -1
- package/dist/utils/json/is-json.d.ts +8 -4
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/is-json.js +13 -21
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/json-value.d.ts +7 -4
- package/dist/utils/json/json-value.d.ts.map +1 -1
- package/dist/utils/json/json-value.js +0 -2
- package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
- package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
- package/dist/utils/json/parse-partial-json-object.js +50 -62
- package/dist/utils/json/parse-partial-json-object.js.map +1 -1
- package/dist/utils/promiseWithResolvers.d.ts +7 -4
- package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
- package/dist/utils/promiseWithResolvers.js +17 -10
- package/dist/utils/promiseWithResolvers.js.map +1 -1
- package/dist/utils.d.ts +6 -6
- package/dist/utils.js +5 -5
- package/package.json +3 -3
- package/src/core/modules/assistant-stream.test.ts +104 -0
- package/src/core/modules/assistant-stream.ts +13 -4
- package/dist/core/AssistantStreamChunk.js.map +0 -1
- package/dist/core/object/types.js.map +0 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
- package/dist/core/tool/tool-types.js.map +0 -1
- package/dist/core/tool/type-path-utils.js.map +0 -1
- package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
- package/dist/core/utils/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resumable/index.d.ts.map +0 -1
- package/dist/resumable/index.js.map +0 -1
- package/dist/resumable/types.js.map +0 -1
- package/dist/utils/json/json-value.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
|
@@ -1,95 +1,83 @@
|
|
|
1
|
-
import { RedisResumableStreamStore
|
|
1
|
+
import { RedisResumableStreamStore } from "./redis-impl.js";
|
|
2
|
+
//#region src/resumable/stores/ioredis.ts
|
|
2
3
|
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
* Resumable stream store backed by [`ioredis`](https://www.npmjs.com/package/ioredis)
|
|
5
|
+
* v5. Accepts a `Redis` or `Cluster` instance.
|
|
6
|
+
*/
|
|
7
|
+
function createIoredisResumableStreamStore(client, options) {
|
|
8
|
+
return new RedisResumableStreamStore(adapt(client), options);
|
|
8
9
|
}
|
|
9
10
|
function adapt(client) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const pipe = client.pipeline();
|
|
48
|
-
for (const cmd of commands) {
|
|
49
|
-
applyPipelineCommand(pipe, cmd);
|
|
50
|
-
}
|
|
51
|
-
const results = (await pipe.exec()) ?? [];
|
|
52
|
-
for (const [err] of results) {
|
|
53
|
-
if (err)
|
|
54
|
-
throw err;
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
};
|
|
11
|
+
return {
|
|
12
|
+
async setNX(key, value, ttlSec) {
|
|
13
|
+
return await client.set(key, value, "EX", ttlSec, "NX") === "OK";
|
|
14
|
+
},
|
|
15
|
+
async set(key, value, ttlSec) {
|
|
16
|
+
await client.set(key, value, "EX", ttlSec);
|
|
17
|
+
},
|
|
18
|
+
async get(key) {
|
|
19
|
+
return client.get(key);
|
|
20
|
+
},
|
|
21
|
+
async expire(key, ttlSec) {
|
|
22
|
+
await client.expire(key, ttlSec);
|
|
23
|
+
},
|
|
24
|
+
async exists(key) {
|
|
25
|
+
return await client.exists(key) > 0;
|
|
26
|
+
},
|
|
27
|
+
async del(keys) {
|
|
28
|
+
if (keys.length === 0) return;
|
|
29
|
+
await client.del(...keys);
|
|
30
|
+
},
|
|
31
|
+
async xAdd(key, fields) {
|
|
32
|
+
return await client.xadd(key, "*", ...toFieldArgs(fields)) ?? "";
|
|
33
|
+
},
|
|
34
|
+
async xRange(key, start, end) {
|
|
35
|
+
return (await client.xrangeBuffer(key, start, end)).map(([idBuf, fieldArray]) => ({
|
|
36
|
+
id: idBuf.toString("utf8"),
|
|
37
|
+
fields: bufferFieldsToRecord(fieldArray)
|
|
38
|
+
}));
|
|
39
|
+
},
|
|
40
|
+
async pipeline(commands) {
|
|
41
|
+
if (commands.length === 0) return;
|
|
42
|
+
const pipe = client.pipeline();
|
|
43
|
+
for (const cmd of commands) applyPipelineCommand(pipe, cmd);
|
|
44
|
+
const results = await pipe.exec() ?? [];
|
|
45
|
+
for (const [err] of results) if (err) throw err;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
58
48
|
}
|
|
59
49
|
function applyPipelineCommand(pipe, cmd) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
50
|
+
switch (cmd.type) {
|
|
51
|
+
case "xAdd":
|
|
52
|
+
pipe.xadd(cmd.key, "*", ...toFieldArgs(cmd.fields));
|
|
53
|
+
return;
|
|
54
|
+
case "expire":
|
|
55
|
+
pipe.expire(cmd.key, cmd.ttlSec);
|
|
56
|
+
return;
|
|
57
|
+
case "set":
|
|
58
|
+
pipe.set(cmd.key, cmd.value, "EX", cmd.ttlSec);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
71
61
|
}
|
|
72
62
|
function toFieldArgs(fields) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
return args;
|
|
63
|
+
const args = [];
|
|
64
|
+
for (const [k, v] of Object.entries(fields)) args.push(k, typeof v === "string" ? v : toBuffer(v));
|
|
65
|
+
return args;
|
|
78
66
|
}
|
|
79
67
|
function toBuffer(bytes) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
68
|
+
if (Buffer.isBuffer(bytes)) return bytes;
|
|
69
|
+
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
83
70
|
}
|
|
84
71
|
function bufferFieldsToRecord(fields) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
return out;
|
|
72
|
+
const out = {};
|
|
73
|
+
for (let i = 0; i + 1 < fields.length; i += 2) {
|
|
74
|
+
const key = fields[i]?.toString("utf8");
|
|
75
|
+
const value = fields[i + 1];
|
|
76
|
+
if (key !== void 0 && value !== void 0) out[key] = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
94
79
|
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { createIoredisResumableStreamStore };
|
|
82
|
+
|
|
95
83
|
//# sourceMappingURL=ioredis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ioredis.js","
|
|
1
|
+
{"version":3,"file":"ioredis.js","names":[],"sources":["../../../src/resumable/stores/ioredis.ts"],"sourcesContent":["import type {\n ChainableCommander,\n Cluster as IoRedisCluster,\n Redis as IoRedis,\n} from \"ioredis\";\nimport {\n RedisResumableStreamStore,\n type PipelineCommand,\n type RedisLikeClient,\n type RedisResumableStreamStoreOptions,\n} from \"./redis-impl\";\nimport type { ResumableStreamStore } from \"../types\";\n\nexport type IoRedisLike = IoRedis | IoRedisCluster;\n\n/**\n * Resumable stream store backed by [`ioredis`](https://www.npmjs.com/package/ioredis)\n * v5. Accepts a `Redis` or `Cluster` instance.\n */\nexport function createIoredisResumableStreamStore(\n client: IoRedisLike,\n options?: RedisResumableStreamStoreOptions,\n): ResumableStreamStore {\n return new RedisResumableStreamStore(adapt(client), options);\n}\n\nfunction adapt(client: IoRedisLike): RedisLikeClient {\n return {\n async setNX(key, value, ttlSec) {\n const result = await client.set(key, value, \"EX\", ttlSec, \"NX\");\n return result === \"OK\";\n },\n async set(key, value, ttlSec) {\n await client.set(key, value, \"EX\", ttlSec);\n },\n async get(key) {\n return client.get(key);\n },\n async expire(key, ttlSec) {\n await client.expire(key, ttlSec);\n },\n async exists(key) {\n const result = await client.exists(key);\n return result > 0;\n },\n async del(keys) {\n if (keys.length === 0) return;\n await client.del(...keys);\n },\n async xAdd(key, fields) {\n const id = await client.xadd(key, \"*\", ...toFieldArgs(fields));\n return id ?? \"\";\n },\n async xRange(key, start, end) {\n const entries = await client.xrangeBuffer(key, start, end);\n return entries.map(([idBuf, fieldArray]) => ({\n id: idBuf.toString(\"utf8\"),\n fields: bufferFieldsToRecord(fieldArray),\n }));\n },\n async pipeline(commands) {\n if (commands.length === 0) return;\n const pipe = client.pipeline();\n for (const cmd of commands) {\n applyPipelineCommand(pipe, cmd);\n }\n const results = (await pipe.exec()) ?? [];\n for (const [err] of results) {\n if (err) throw err;\n }\n },\n };\n}\n\nfunction applyPipelineCommand(\n pipe: ChainableCommander,\n cmd: PipelineCommand,\n): void {\n switch (cmd.type) {\n case \"xAdd\":\n pipe.xadd(cmd.key, \"*\", ...toFieldArgs(cmd.fields));\n return;\n case \"expire\":\n pipe.expire(cmd.key, cmd.ttlSec);\n return;\n case \"set\":\n pipe.set(cmd.key, cmd.value, \"EX\", cmd.ttlSec);\n return;\n }\n}\n\nfunction toFieldArgs(\n fields: Record<string, string | Uint8Array>,\n): Array<string | Buffer> {\n const args: Array<string | Buffer> = [];\n for (const [k, v] of Object.entries(fields)) {\n args.push(k, typeof v === \"string\" ? v : toBuffer(v));\n }\n return args;\n}\n\nfunction toBuffer(bytes: Uint8Array): Buffer {\n if (Buffer.isBuffer(bytes)) return bytes;\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction bufferFieldsToRecord(\n fields: Buffer[],\n): Record<string, string | Uint8Array> {\n const out: Record<string, string | Uint8Array> = {};\n for (let i = 0; i + 1 < fields.length; i += 2) {\n const key = fields[i]?.toString(\"utf8\");\n const value = fields[i + 1];\n if (key !== undefined && value !== undefined) {\n out[key] = new Uint8Array(\n value.buffer,\n value.byteOffset,\n value.byteLength,\n );\n }\n }\n return out;\n}\n"],"mappings":";;;;;;AAmBA,SAAgB,kCACd,QACA,SACsB;CACtB,OAAO,IAAI,0BAA0B,MAAM,MAAM,GAAG,OAAO;AAC7D;AAEA,SAAS,MAAM,QAAsC;CACnD,OAAO;EACL,MAAM,MAAM,KAAK,OAAO,QAAQ;GAE9B,OAAO,MADc,OAAO,IAAI,KAAK,OAAO,MAAM,QAAQ,IAAI,MAC5C;EACpB;EACA,MAAM,IAAI,KAAK,OAAO,QAAQ;GAC5B,MAAM,OAAO,IAAI,KAAK,OAAO,MAAM,MAAM;EAC3C;EACA,MAAM,IAAI,KAAK;GACb,OAAO,OAAO,IAAI,GAAG;EACvB;EACA,MAAM,OAAO,KAAK,QAAQ;GACxB,MAAM,OAAO,OAAO,KAAK,MAAM;EACjC;EACA,MAAM,OAAO,KAAK;GAEhB,OAAO,MADc,OAAO,OAAO,GAAG,IACtB;EAClB;EACA,MAAM,IAAI,MAAM;GACd,IAAI,KAAK,WAAW,GAAG;GACvB,MAAM,OAAO,IAAI,GAAG,IAAI;EAC1B;EACA,MAAM,KAAK,KAAK,QAAQ;GAEtB,OAAO,MADU,OAAO,KAAK,KAAK,KAAK,GAAG,YAAY,MAAM,CAAC,KAChD;EACf;EACA,MAAM,OAAO,KAAK,OAAO,KAAK;GAE5B,QAAO,MADe,OAAO,aAAa,KAAK,OAAO,GAAG,GAC1C,KAAK,CAAC,OAAO,iBAAiB;IAC3C,IAAI,MAAM,SAAS,MAAM;IACzB,QAAQ,qBAAqB,UAAU;GACzC,EAAE;EACJ;EACA,MAAM,SAAS,UAAU;GACvB,IAAI,SAAS,WAAW,GAAG;GAC3B,MAAM,OAAO,OAAO,SAAS;GAC7B,KAAK,MAAM,OAAO,UAChB,qBAAqB,MAAM,GAAG;GAEhC,MAAM,UAAW,MAAM,KAAK,KAAK,KAAM,CAAC;GACxC,KAAK,MAAM,CAAC,QAAQ,SAClB,IAAI,KAAK,MAAM;EAEnB;CACF;AACF;AAEA,SAAS,qBACP,MACA,KACM;CACN,QAAQ,IAAI,MAAZ;EACE,KAAK;GACH,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG,YAAY,IAAI,MAAM,CAAC;GAClD;EACF,KAAK;GACH,KAAK,OAAO,IAAI,KAAK,IAAI,MAAM;GAC/B;EACF,KAAK;GACH,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM,IAAI,MAAM;GAC7C;CACJ;AACF;AAEA,SAAS,YACP,QACwB;CACxB,MAAM,OAA+B,CAAC;CACtC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,GACxC,KAAK,KAAK,GAAG,OAAO,MAAM,WAAW,IAAI,SAAS,CAAC,CAAC;CAEtD,OAAO;AACT;AAEA,SAAS,SAAS,OAA2B;CAC3C,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;CACnC,OAAO,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AACrE;AAEA,SAAS,qBACP,QACqC;CACrC,MAAM,MAA2C,CAAC;CAClD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK,GAAG;EAC7C,MAAM,MAAM,OAAO,IAAI,SAAS,MAAM;EACtC,MAAM,QAAQ,OAAO,IAAI;EACzB,IAAI,QAAQ,KAAA,KAAa,UAAU,KAAA,GACjC,IAAI,OAAO,IAAI,WACb,MAAM,QACN,MAAM,YACN,MAAM,UACR;CAEJ;CACA,OAAO;AACT"}
|
|
@@ -1,60 +1,63 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { ResumableStreamAcquireOptions, ResumableStreamEntry, ResumableStreamRole, ResumableStreamStatus, ResumableStreamStore } from "../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/resumable/stores/redis-impl.d.ts
|
|
4
|
+
type PipelineCommand = {
|
|
5
|
+
readonly type: "xAdd";
|
|
6
|
+
readonly key: string;
|
|
7
|
+
readonly fields: Record<string, string | Uint8Array>;
|
|
6
8
|
} | {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
readonly type: "expire";
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly ttlSec: number;
|
|
10
12
|
} | {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
readonly type: "set";
|
|
14
|
+
readonly key: string;
|
|
15
|
+
readonly value: string;
|
|
16
|
+
readonly ttlSec: number;
|
|
15
17
|
};
|
|
16
18
|
/**
|
|
17
19
|
* Structural Redis-client interface. The bundled `redis` and `ioredis`
|
|
18
20
|
* adapters wrap their respective clients to satisfy it; custom or proxied
|
|
19
21
|
* clients can implement it directly.
|
|
20
22
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
23
|
+
interface RedisLikeClient {
|
|
24
|
+
setNX(key: string, value: string, ttlSec: number): Promise<boolean>;
|
|
25
|
+
set(key: string, value: string, ttlSec: number): Promise<void>;
|
|
26
|
+
get(key: string): Promise<string | null>;
|
|
27
|
+
expire(key: string, ttlSec: number): Promise<void>;
|
|
28
|
+
exists(key: string): Promise<boolean>;
|
|
29
|
+
del(keys: string[]): Promise<void>;
|
|
30
|
+
xAdd(key: string, fields: Record<string, string | Uint8Array>): Promise<string>;
|
|
31
|
+
xRange(key: string, start: string, end: string): Promise<Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
fields: Record<string, string | Uint8Array>;
|
|
34
|
+
}>>;
|
|
35
|
+
/** Executes the commands as a single pipeline batch (one round trip). */
|
|
36
|
+
pipeline(commands: readonly PipelineCommand[]): Promise<void>;
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
readonly maxChunkBytes?: number;
|
|
38
|
+
type RedisResumableStreamStoreOptions = {
|
|
39
|
+
readonly keyPrefix?: string;
|
|
40
|
+
readonly defaultTtlMs?: number; /** Defaults to 100ms. Lower values reduce read latency, raise traffic. */
|
|
41
|
+
readonly pollIntervalMs?: number;
|
|
42
|
+
readonly maxChunkBytes?: number;
|
|
42
43
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
44
|
+
declare class RedisResumableStreamStore implements ResumableStreamStore {
|
|
45
|
+
private readonly client;
|
|
46
|
+
private readonly keyPrefix;
|
|
47
|
+
private readonly defaultTtlMs;
|
|
48
|
+
private readonly pollIntervalMs;
|
|
49
|
+
private readonly maxChunkBytes;
|
|
50
|
+
constructor(client: RedisLikeClient, options?: RedisResumableStreamStoreOptions);
|
|
51
|
+
acquire(streamId: string, options?: ResumableStreamAcquireOptions): Promise<ResumableStreamRole>;
|
|
52
|
+
append(streamId: string, chunk: Uint8Array): Promise<void>;
|
|
53
|
+
finalize(streamId: string, status: "done" | "error", error?: string): Promise<void>;
|
|
54
|
+
read(streamId: string, cursor: string, signal: AbortSignal): AsyncIterable<ResumableStreamEntry>;
|
|
55
|
+
status(streamId: string): Promise<ResumableStreamStatus>;
|
|
56
|
+
delete(streamId: string): Promise<void>;
|
|
57
|
+
private readMeta;
|
|
58
|
+
private metaKey;
|
|
59
|
+
private dataKey;
|
|
59
60
|
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { PipelineCommand, RedisLikeClient, RedisResumableStreamStore, RedisResumableStreamStoreOptions };
|
|
60
63
|
//# sourceMappingURL=redis-impl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-impl.d.ts","
|
|
1
|
+
{"version":3,"file":"redis-impl.d.ts","names":[],"sources":["../../../src/resumable/stores/redis-impl.ts"],"mappings":";;;KAsBY,eAAA;EAAA,SAEG,IAAA;EAAA,SACA,GAAA;EAAA,SACA,MAAA,EAAQ,MAAM,kBAAkB,UAAA;AAAA;EAAA,SAEhC,IAAA;EAAA,SAAyB,GAAA;EAAA,SAAsB,MAAA;AAAA;EAAA,SAE/C,IAAA;EAAA,SACA,GAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA;AAAA;;;;;;UAQE,eAAA;EACf,KAAA,CAAM,GAAA,UAAa,KAAA,UAAe,MAAA,WAAiB,OAAA;EACnD,GAAA,CAAI,GAAA,UAAa,KAAA,UAAe,MAAA,WAAiB,OAAA;EACjD,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,MAAA,CAAO,GAAA,UAAa,MAAA,WAAiB,OAAA;EACrC,MAAA,CAAO,GAAA,WAAc,OAAA;EACrB,GAAA,CAAI,IAAA,aAAiB,OAAA;EACrB,IAAA,CACE,GAAA,UACA,MAAA,EAAQ,MAAA,kBAAwB,UAAA,IAC/B,OAAA;EACH,MAAA,CACE,GAAA,UACA,KAAA,UACA,GAAA,WACC,OAAA,CACD,KAAA;IAAQ,EAAA;IAAY,MAAA,EAAQ,MAAA,kBAAwB,UAAA;EAAA;EANnD;EASH,QAAA,CAAS,QAAA,WAAmB,eAAA,KAAoB,OAAA;AAAA;AAAA,KAGtC,gCAAA;EAAA,SACD,SAAA;EAAA,SACA,YAAA,WALuC;EAAA,SAOvC,cAAA;EAAA,SACA,aAAA;AAAA;AAAA,cAGE,yBAAA,YAAqC,oBAAA;EAAA,iBAC/B,MAAA;EAAA,iBACA,SAAA;EAAA,iBACA,YAAA;EAAA,iBACA,cAAA;EAAA,iBACA,aAAA;cAGf,MAAA,EAAQ,eAAA,EACR,OAAA,GAAS,gCAAA;EASL,OAAA,CACJ,QAAA,UACA,OAAA,GAAU,6BAAA,GACT,OAAA,CAAQ,mBAAA;EAiBL,MAAA,CAAO,QAAA,UAAkB,KAAA,EAAO,UAAA,GAAa,OAAA;EA8B7C,QAAA,CACJ,QAAA,UACA,MAAA,oBACA,KAAA,YACC,OAAA;EA6BI,IAAA,CACL,QAAA,UACA,MAAA,UACA,MAAA,EAAQ,WAAA,GACP,aAAA,CAAc,oBAAA;EA2CX,MAAA,CAAO,QAAA,WAAmB,OAAA,CAAQ,qBAAA;EAWlC,MAAA,CAAO,QAAA,WAAmB,OAAA;EAAA,QAKlB,QAAA;EAAA,QAQN,OAAA;EAAA,QAIA,OAAA;AAAA"}
|