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.
- 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 +174 -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/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,113 +1,105 @@
|
|
|
1
|
-
import { RedisResumableStreamStore
|
|
1
|
+
import { RedisResumableStreamStore } from "./redis-impl.js";
|
|
2
|
+
//#region src/resumable/stores/redis.ts
|
|
2
3
|
const RESP_BLOB_STRING = 36;
|
|
3
4
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
* Resumable stream store backed by [`redis`](https://www.npmjs.com/package/redis)
|
|
6
|
+
* v5. Expects a connected client; cluster routing relies on the shared
|
|
7
|
+
* `{streamId}` hash tag baked into the key scheme.
|
|
8
|
+
*/
|
|
9
|
+
function createRedisResumableStreamStore(client, options) {
|
|
10
|
+
return new RedisResumableStreamStore(adapt(client), options);
|
|
10
11
|
}
|
|
11
12
|
function adapt(client) {
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
13
|
+
return {
|
|
14
|
+
async setNX(key, value, ttlSec) {
|
|
15
|
+
return await client.set(key, value, {
|
|
16
|
+
NX: true,
|
|
17
|
+
EX: ttlSec
|
|
18
|
+
}) === "OK";
|
|
19
|
+
},
|
|
20
|
+
async set(key, value, ttlSec) {
|
|
21
|
+
await client.set(key, value, { EX: ttlSec });
|
|
22
|
+
},
|
|
23
|
+
async get(key) {
|
|
24
|
+
return client.get(key);
|
|
25
|
+
},
|
|
26
|
+
async expire(key, ttlSec) {
|
|
27
|
+
await client.expire(key, ttlSec);
|
|
28
|
+
},
|
|
29
|
+
async exists(key) {
|
|
30
|
+
return await client.exists(key) > 0;
|
|
31
|
+
},
|
|
32
|
+
async del(keys) {
|
|
33
|
+
if (keys.length === 0) return;
|
|
34
|
+
await client.del(keys.length === 1 ? keys[0] : keys);
|
|
35
|
+
},
|
|
36
|
+
async xAdd(key, fields) {
|
|
37
|
+
return client.xAdd(key, "*", toNodeFields(fields));
|
|
38
|
+
},
|
|
39
|
+
async xRange(key, start, end) {
|
|
40
|
+
return parseXRangeReply(await client.sendCommand([
|
|
41
|
+
"XRANGE",
|
|
42
|
+
key,
|
|
43
|
+
start,
|
|
44
|
+
end
|
|
45
|
+
], { typeMapping: { [RESP_BLOB_STRING]: Buffer } }));
|
|
46
|
+
},
|
|
47
|
+
async pipeline(commands) {
|
|
48
|
+
if (commands.length === 0) return;
|
|
49
|
+
let chain = client.multi();
|
|
50
|
+
for (const cmd of commands) chain = applyPipelineCommand(chain, cmd);
|
|
51
|
+
await chain.execAsPipeline();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
52
54
|
}
|
|
53
55
|
function applyPipelineCommand(chain, cmd) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
case "set":
|
|
60
|
-
return chain.set(cmd.key, cmd.value, { EX: cmd.ttlSec });
|
|
61
|
-
}
|
|
56
|
+
switch (cmd.type) {
|
|
57
|
+
case "xAdd": return chain.xAdd(cmd.key, "*", toNodeFields(cmd.fields));
|
|
58
|
+
case "expire": return chain.expire(cmd.key, cmd.ttlSec);
|
|
59
|
+
case "set": return chain.set(cmd.key, cmd.value, { EX: cmd.ttlSec });
|
|
60
|
+
}
|
|
62
61
|
}
|
|
63
62
|
function toNodeFields(fields) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
return out;
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const [k, v] of Object.entries(fields)) out[k] = typeof v === "string" ? v : toBuffer(v);
|
|
65
|
+
return out;
|
|
69
66
|
}
|
|
70
67
|
function toBuffer(bytes) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
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);
|
|
74
70
|
}
|
|
75
71
|
function parseXRangeReply(reply) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return out;
|
|
72
|
+
if (!Array.isArray(reply)) return [];
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const entry of reply) {
|
|
75
|
+
if (!Array.isArray(entry) || entry.length < 2) continue;
|
|
76
|
+
const [rawId, rawFields] = entry;
|
|
77
|
+
const id = bufferOrStringToString(rawId);
|
|
78
|
+
if (id === void 0 || !Array.isArray(rawFields)) continue;
|
|
79
|
+
const fields = {};
|
|
80
|
+
for (let i = 0; i + 1 < rawFields.length; i += 2) {
|
|
81
|
+
const fieldKey = bufferOrStringToString(rawFields[i]);
|
|
82
|
+
const fieldValue = rawFields[i + 1];
|
|
83
|
+
if (fieldKey === void 0 || fieldValue === void 0) continue;
|
|
84
|
+
fields[fieldKey] = bufferOrStringToBytes(fieldValue);
|
|
85
|
+
}
|
|
86
|
+
out.push({
|
|
87
|
+
id,
|
|
88
|
+
fields
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
97
92
|
}
|
|
98
93
|
function bufferOrStringToString(value) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (Buffer.isBuffer(value))
|
|
102
|
-
return value.toString("utf8");
|
|
103
|
-
return undefined;
|
|
94
|
+
if (typeof value === "string") return value;
|
|
95
|
+
if (Buffer.isBuffer(value)) return value.toString("utf8");
|
|
104
96
|
}
|
|
105
97
|
function bufferOrStringToBytes(value) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
110
|
-
}
|
|
111
|
-
return "";
|
|
98
|
+
if (typeof value === "string") return value;
|
|
99
|
+
if (Buffer.isBuffer(value)) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
100
|
+
return "";
|
|
112
101
|
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { createRedisResumableStreamStore };
|
|
104
|
+
|
|
113
105
|
//# sourceMappingURL=redis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","
|
|
1
|
+
{"version":3,"file":"redis.js","names":[],"sources":["../../../src/resumable/stores/redis.ts"],"sourcesContent":["import {\n RedisResumableStreamStore,\n type PipelineCommand,\n type RedisLikeClient,\n type RedisResumableStreamStoreOptions,\n} from \"./redis-impl\";\nimport type { ResumableStreamStore } from \"../types\";\n\nconst RESP_BLOB_STRING = 36;\n\ntype NodeRedisFields = Record<string, string | Buffer>;\n\ninterface NodeRedisMultiCommand {\n xAdd(key: string, id: string, fields: NodeRedisFields): NodeRedisMultiCommand;\n expire(key: string, seconds: number): NodeRedisMultiCommand;\n set(\n key: string,\n value: string,\n options: { EX: number },\n ): NodeRedisMultiCommand;\n execAsPipeline(): Promise<unknown>;\n exec(): Promise<unknown>;\n}\n\n/** Structural subset of node-redis v5 used by the adapter. */\nexport interface NodeRedisLike {\n set(\n key: string,\n value: string,\n options: { NX: true; EX: number },\n ): Promise<string | null>;\n set(\n key: string,\n value: string,\n options: { EX: number },\n ): Promise<string | null>;\n get(key: string): Promise<string | null>;\n expire(key: string, seconds: number): Promise<unknown>;\n exists(key: string): Promise<number>;\n del(keys: string | string[]): Promise<unknown>;\n xAdd(key: string, id: string, fields: NodeRedisFields): Promise<string>;\n sendCommand<T = unknown>(\n args: ReadonlyArray<string | Buffer>,\n options?: { typeMapping?: Record<number, unknown> },\n ): Promise<T>;\n multi(): NodeRedisMultiCommand;\n}\n\n/**\n * Resumable stream store backed by [`redis`](https://www.npmjs.com/package/redis)\n * v5. Expects a connected client; cluster routing relies on the shared\n * `{streamId}` hash tag baked into the key scheme.\n */\nexport function createRedisResumableStreamStore(\n client: NodeRedisLike,\n options?: RedisResumableStreamStoreOptions,\n): ResumableStreamStore {\n return new RedisResumableStreamStore(adapt(client), options);\n}\n\nfunction adapt(client: NodeRedisLike): RedisLikeClient {\n return {\n async setNX(key, value, ttlSec) {\n const result = await client.set(key, value, { NX: true, EX: ttlSec });\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.length === 1 ? keys[0]! : keys);\n },\n async xAdd(key, fields) {\n return client.xAdd(key, \"*\", toNodeFields(fields));\n },\n async xRange(key, start, end) {\n const reply = await client.sendCommand<unknown>(\n [\"XRANGE\", key, start, end],\n { typeMapping: { [RESP_BLOB_STRING]: Buffer } },\n );\n return parseXRangeReply(reply);\n },\n async pipeline(commands) {\n if (commands.length === 0) return;\n let chain = client.multi();\n for (const cmd of commands) {\n chain = applyPipelineCommand(chain, cmd);\n }\n await chain.execAsPipeline();\n },\n };\n}\n\nfunction applyPipelineCommand(\n chain: NodeRedisMultiCommand,\n cmd: PipelineCommand,\n): NodeRedisMultiCommand {\n switch (cmd.type) {\n case \"xAdd\":\n return chain.xAdd(cmd.key, \"*\", toNodeFields(cmd.fields));\n case \"expire\":\n return chain.expire(cmd.key, cmd.ttlSec);\n case \"set\":\n return chain.set(cmd.key, cmd.value, { EX: cmd.ttlSec });\n }\n}\n\nfunction toNodeFields(\n fields: Record<string, string | Uint8Array>,\n): NodeRedisFields {\n const out: NodeRedisFields = {};\n for (const [k, v] of Object.entries(fields)) {\n out[k] = typeof v === \"string\" ? v : toBuffer(v);\n }\n return out;\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 parseXRangeReply(\n reply: unknown,\n): Array<{ id: string; fields: Record<string, string | Uint8Array> }> {\n if (!Array.isArray(reply)) return [];\n const out: Array<{\n id: string;\n fields: Record<string, string | Uint8Array>;\n }> = [];\n for (const entry of reply) {\n if (!Array.isArray(entry) || entry.length < 2) continue;\n const [rawId, rawFields] = entry as [unknown, unknown];\n const id = bufferOrStringToString(rawId);\n if (id === undefined || !Array.isArray(rawFields)) continue;\n const fields: Record<string, string | Uint8Array> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const fieldKey = bufferOrStringToString(rawFields[i]);\n const fieldValue = rawFields[i + 1];\n if (fieldKey === undefined || fieldValue === undefined) continue;\n fields[fieldKey] = bufferOrStringToBytes(fieldValue);\n }\n out.push({ id, fields });\n }\n return out;\n}\n\nfunction bufferOrStringToString(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (Buffer.isBuffer(value)) return value.toString(\"utf8\");\n return undefined;\n}\n\nfunction bufferOrStringToBytes(value: unknown): string | Uint8Array {\n if (typeof value === \"string\") return value;\n if (Buffer.isBuffer(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n return \"\";\n}\n"],"mappings":"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"}
|
|
@@ -1,30 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
//#region src/resumable/types.d.ts
|
|
2
|
+
type ResumableStreamRole = "producer" | "consumer";
|
|
3
|
+
type ResumableStreamStatus = "streaming" | "done" | "error" | "missing";
|
|
4
|
+
type ResumableStreamEntry = {
|
|
5
|
+
readonly cursor: string;
|
|
6
|
+
readonly chunk: Uint8Array;
|
|
6
7
|
};
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
type ResumableStreamAcquireOptions = {
|
|
9
|
+
readonly ttlMs?: number;
|
|
9
10
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
11
|
+
interface ResumableStreamStore {
|
|
12
|
+
/**
|
|
13
|
+
* Atomic election. The first caller for a given `streamId` observes
|
|
14
|
+
* `"producer"`; every later caller observes `"consumer"`, including those
|
|
15
|
+
* arriving after `finalize`.
|
|
16
|
+
*/
|
|
17
|
+
acquire(streamId: string, options?: ResumableStreamAcquireOptions): Promise<ResumableStreamRole>;
|
|
18
|
+
/** Implementations should refresh the TTL on each call. */
|
|
19
|
+
append(streamId: string, chunk: Uint8Array): Promise<void>;
|
|
20
|
+
finalize(streamId: string, status: "done" | "error", error?: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Yields persisted entries strictly after `cursor` (`""` starts from the
|
|
23
|
+
* beginning), then waits for new ones until the stream is finalized.
|
|
24
|
+
* Aborting `signal` resolves the iterable without throwing.
|
|
25
|
+
*/
|
|
26
|
+
read(streamId: string, cursor: string, signal: AbortSignal): AsyncIterable<ResumableStreamEntry>;
|
|
27
|
+
status(streamId: string): Promise<ResumableStreamStatus>;
|
|
28
|
+
/** Active readers terminate. No-op when the stream does not exist. */
|
|
29
|
+
delete(streamId: string): Promise<void>;
|
|
29
30
|
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ResumableStreamAcquireOptions, ResumableStreamEntry, ResumableStreamRole, ResumableStreamStatus, ResumableStreamStore };
|
|
30
33
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/resumable/types.ts"],"mappings":";KAAY,mBAAA;AAAA,KAEA,qBAAA;AAAA,KAEA,oBAAA;EAAA,SACD,MAAA;EAAA,SACA,KAAA,EAAO,UAAU;AAAA;AAAA,KAGhB,6BAAA;EAAA,SACD,KAAK;AAAA;AAAA,UAGC,oBAAA;EAXgB;AAEjC;;;;EAeE,OAAA,CACE,QAAA,UACA,OAAA,GAAU,6BAAA,GACT,OAAA,CAAQ,mBAAA;EAhBF;EAmBT,MAAA,CAAO,QAAA,UAAkB,KAAA,EAAO,UAAA,GAAa,OAAA;EAE7C,QAAA,CACE,QAAA,UACA,MAAA,oBACA,KAAA,YACC,OAAA;EAzBuB;AAG5B;;;;EA6BE,IAAA,CACE,QAAA,UACA,MAAA,UACA,MAAA,EAAQ,WAAA,GACP,aAAA,CAAc,oBAAA;EAEjB,MAAA,CAAO,QAAA,WAAmB,OAAA,CAAQ,qBAAA;EA/BC;EAkCnC,MAAA,CAAO,QAAA,WAAmB,OAAA;AAAA"}
|
package/dist/resumable/types.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/utils/AsyncIterableStream.d.ts
|
|
2
|
+
type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;
|
|
3
|
+
declare function asAsyncIterableStream<T>(source: ReadableStream<T>): AsyncIterableStream<T>;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { AsyncIterableStream, asAsyncIterableStream };
|
|
3
6
|
//# sourceMappingURL=AsyncIterableStream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncIterableStream.d.ts","
|
|
1
|
+
{"version":3,"file":"AsyncIterableStream.d.ts","names":[],"sources":["../../src/utils/AsyncIterableStream.ts"],"mappings":";KAAY,mBAAA,MAAyB,aAAA,CAAc,CAAA,IAAK,cAAA,CAAe,CAAA;AAAA,iBAiBvD,qBAAA,GAAA,CACd,MAAA,EAAQ,cAAA,CAAe,CAAA,IACtB,mBAAA,CAAoB,CAAA"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
//#region src/utils/AsyncIterableStream.ts
|
|
1
2
|
async function* streamGeneratorPolyfill() {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
reader.releaseLock();
|
|
13
|
-
}
|
|
3
|
+
const reader = this.getReader();
|
|
4
|
+
try {
|
|
5
|
+
while (true) {
|
|
6
|
+
const { done, value } = await reader.read();
|
|
7
|
+
if (done) break;
|
|
8
|
+
yield value;
|
|
9
|
+
}
|
|
10
|
+
} finally {
|
|
11
|
+
reader.releaseLock();
|
|
12
|
+
}
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return source;
|
|
14
|
+
function asAsyncIterableStream(source) {
|
|
15
|
+
source[Symbol.asyncIterator] ??= streamGeneratorPolyfill;
|
|
16
|
+
return source;
|
|
19
17
|
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { asAsyncIterableStream };
|
|
20
|
+
|
|
20
21
|
//# sourceMappingURL=AsyncIterableStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncIterableStream.js","
|
|
1
|
+
{"version":3,"file":"AsyncIterableStream.js","names":[],"sources":["../../src/utils/AsyncIterableStream.ts"],"sourcesContent":["export type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;\n\nasync function* streamGeneratorPolyfill<T>(\n this: ReadableStream<T>,\n): AsyncGenerator<T, undefined, unknown> {\n const reader = this.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function asAsyncIterableStream<T>(\n source: ReadableStream<T>,\n): AsyncIterableStream<T> {\n (source as AsyncIterableStream<T>)[Symbol.asyncIterator] ??=\n streamGeneratorPolyfill;\n return source as AsyncIterableStream<T>;\n}\n"],"mappings":";AAEA,gBAAgB,0BAEyB;CACvC,MAAM,SAAS,KAAK,UAAU;CAC9B,IAAI;EACF,OAAO,MAAM;GACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,MAAM;EACR;CACF,UAAU;EACR,OAAO,YAAY;CACrB;AACF;AAEA,SAAgB,sBACd,QACwB;CACxB,OAAmC,OAAO,mBACxC;CACF,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-json.d.ts","
|
|
1
|
+
{"version":3,"file":"fix-json.d.ts","names":[],"sources":["../../../src/utils/json/fix-json.ts"],"mappings":";iBA+DgB,OAAA,CAAQ,KAAa"}
|