assistant-stream 0.3.25 → 0.3.27
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 +4 -1
- package/dist/core/AssistantStream.d.ts +0 -1
- package/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +26 -14
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.d.ts +0 -1
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/TimingTracker.d.ts +0 -1
- package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts +3 -9
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +70 -28
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
- package/dist/core/converters/toGenericMessages.js +2 -1
- package/dist/core/converters/toGenericMessages.js.map +1 -1
- package/dist/core/gorp/GorpStreamAccumulator.d.ts +15 -0
- package/dist/core/gorp/GorpStreamAccumulator.d.ts.map +1 -0
- package/dist/core/{object/ObjectStreamAccumulator.js → gorp/GorpStreamAccumulator.js} +11 -9
- package/dist/core/gorp/GorpStreamAccumulator.js.map +1 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.d.ts +17 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.d.ts.map +1 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.js +38 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.js.map +1 -0
- package/dist/core/gorp/GorpStreamResponse.d.ts +16 -0
- package/dist/core/gorp/GorpStreamResponse.d.ts.map +1 -0
- package/dist/core/gorp/GorpStreamResponse.js +51 -0
- package/dist/core/gorp/GorpStreamResponse.js.map +1 -0
- package/dist/core/gorp/changeTree.d.ts +16 -0
- package/dist/core/gorp/changeTree.d.ts.map +1 -0
- package/dist/core/gorp/changeTree.js +77 -0
- package/dist/core/gorp/changeTree.js.map +1 -0
- package/dist/core/gorp/createGorpStream.d.ts +16 -0
- package/dist/core/gorp/createGorpStream.d.ts.map +1 -0
- package/dist/core/{object/createObjectStream.js → gorp/createGorpStream.js} +13 -8
- package/dist/core/gorp/createGorpStream.js.map +1 -0
- package/dist/core/gorp/types.d.ts +20 -0
- package/dist/core/gorp/types.d.ts.map +1 -0
- package/dist/core/modules/assistant-stream.d.ts +18 -11
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +10 -6
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.d.ts +0 -1
- package/dist/core/modules/text.d.ts.map +1 -1
- package/dist/core/modules/tool-call.d.ts +0 -1
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +2 -2
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/serialization/PlainText.d.ts +0 -1
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +0 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +93 -53
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts +0 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +3 -4
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts +0 -1
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +0 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +76 -53
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +0 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.d.ts +1 -0
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +0 -1
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +9 -1
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +6 -4
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/schema-utils.d.ts +0 -1
- package/dist/core/tool/schema-utils.d.ts.map +1 -1
- package/dist/core/tool/tool-types.d.ts +71 -33
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.d.ts +3 -2
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +7 -2
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.d.ts +2 -2
- package/dist/core/tool/type-path-utils.d.ts.map +1 -1
- package/dist/core/utils/Counter.d.ts.map +1 -1
- package/dist/core/utils/generateId.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +0 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts +0 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.d.ts +1 -0
- package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +19 -6
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +0 -1
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +2 -52
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/SSEEventDecoder.d.ts +27 -0
- package/dist/core/utils/stream/SSEEventDecoder.d.ts.map +1 -0
- package/dist/core/utils/stream/SSEEventDecoder.js +84 -0
- package/dist/core/utils/stream/SSEEventDecoder.js.map +1 -0
- package/dist/core/utils/stream/SSEEventDecoderStream.d.ts +13 -0
- package/dist/core/utils/stream/SSEEventDecoderStream.d.ts.map +1 -0
- package/dist/core/utils/stream/SSEEventDecoderStream.js +24 -0
- package/dist/core/utils/stream/SSEEventDecoderStream.js.map +1 -0
- package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.d.ts +2 -1
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +27 -8
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts +0 -1
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/core/utils/types.d.ts +16 -8
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
- package/dist/index.d.ts +25 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +3 -3
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.d.ts +0 -1
- package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.js +12 -5
- package/dist/resumable/ResumableStreamContext.js.map +1 -1
- package/dist/resumable/constants.d.ts.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -4
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
- package/dist/resumable/errors.d.ts.map +1 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +0 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.js +2 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
- package/dist/resumable/stores/ioredis.d.ts +0 -1
- package/dist/resumable/stores/ioredis.d.ts.map +1 -1
- package/dist/resumable/stores/redis-impl.d.ts +2 -2
- package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
- package/dist/resumable/stores/redis.d.ts +0 -1
- package/dist/resumable/stores/redis.d.ts.map +1 -1
- package/dist/resumable/types.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.js +18 -3
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/json/fix-json.d.ts.map +1 -1
- package/dist/utils/json/json-value.d.ts.map +1 -1
- package/dist/utils/json/parse-partial-json-object.d.ts +0 -1
- package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
- package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.js +2 -1
- package/package.json +5 -5
- package/src/core/AssistantStreamChunk.ts +5 -3
- package/src/core/accumulators/assistant-message-accumulator.test.ts +437 -1
- package/src/core/accumulators/assistant-message-accumulator.ts +89 -26
- package/src/core/{object/ObjectStream.test.ts → gorp/GorpStream.test.ts} +104 -23
- package/src/core/gorp/GorpStreamAccumulator.test.ts +28 -0
- package/src/core/{object/ObjectStreamAccumulator.ts → gorp/GorpStreamAccumulator.ts} +13 -15
- package/src/core/gorp/GorpStreamDeltaTracker.test.ts +182 -0
- package/src/core/gorp/GorpStreamDeltaTracker.ts +55 -0
- package/src/core/gorp/GorpStreamResponse.test.ts +32 -0
- package/src/core/gorp/GorpStreamResponse.ts +88 -0
- package/src/core/gorp/changeTree.test.ts +168 -0
- package/src/core/gorp/changeTree.ts +96 -0
- package/src/core/{object/createObjectStream.ts → gorp/createGorpStream.ts} +23 -17
- package/src/core/{object → gorp}/types.ts +5 -3
- package/src/core/modules/assistant-stream.test.ts +154 -2
- package/src/core/modules/assistant-stream.ts +16 -6
- package/src/core/modules/tool-call.test.ts +67 -0
- package/src/core/modules/tool-call.ts +3 -3
- package/src/core/serialization/assistant-transport/AssistantTransport.test.ts +215 -1
- package/src/core/serialization/assistant-transport/AssistantTransport.ts +83 -71
- package/src/core/serialization/data-stream/chunk-types.ts +2 -2
- package/src/core/serialization/ui-message-stream/UIMessageStream.test.ts +323 -4
- package/src/core/serialization/ui-message-stream/UIMessageStream.ts +81 -71
- package/src/core/tool/ToolExecutionStream.ts +10 -0
- package/src/core/tool/toolResultStream.test.ts +50 -0
- package/src/core/tool/toolResultStream.ts +7 -2
- package/src/core/utils/stream/LineDecoderStream.test.ts +26 -2
- package/src/core/utils/stream/LineDecoderStream.ts +21 -11
- package/src/core/utils/stream/SSE.ts +6 -70
- package/src/core/utils/stream/SSEEventDecoder.test.ts +146 -0
- package/src/core/utils/stream/SSEEventDecoder.ts +109 -0
- package/src/core/utils/stream/SSEEventDecoderStream.test.ts +42 -0
- package/src/core/utils/stream/SSEEventDecoderStream.ts +34 -0
- package/src/core/utils/stream/merge.ts +31 -9
- package/src/gorp.test.ts +42 -0
- package/src/index.ts +21 -6
- package/src/resumable/ResumableStreamContext.test.ts +116 -1
- package/src/resumable/ResumableStreamContext.ts +32 -5
- package/src/resumable/createResumableAssistantStreamResponse.test.ts +1 -25
- package/src/utils/AsyncIterableStream.test.ts +61 -0
- package/src/utils/AsyncIterableStream.ts +18 -3
- package/src/utils.ts +4 -0
- package/dist/core/object/ObjectStreamAccumulator.d.ts +0 -15
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +0 -1
- package/dist/core/object/ObjectStreamAccumulator.js.map +0 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +0 -17
- package/dist/core/object/ObjectStreamResponse.d.ts.map +0 -1
- package/dist/core/object/ObjectStreamResponse.js +0 -57
- package/dist/core/object/ObjectStreamResponse.js.map +0 -1
- package/dist/core/object/createObjectStream.d.ts +0 -19
- package/dist/core/object/createObjectStream.d.ts.map +0 -1
- package/dist/core/object/createObjectStream.js.map +0 -1
- package/dist/core/object/types.d.ts +0 -18
- package/dist/core/object/types.d.ts.map +0 -1
- package/dist/utils/json/is-json.d.ts +0 -9
- package/dist/utils/json/is-json.d.ts.map +0 -1
- package/dist/utils/json/is-json.js +0 -17
- package/dist/utils/json/is-json.js.map +0 -1
- package/src/core/object/ObjectStreamResponse.ts +0 -109
- package/src/utils/json/is-json.ts +0 -43
- /package/dist/core/{object → gorp}/types.js +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//#region src/core/utils/stream/SSEEventDecoder.ts
|
|
2
|
+
var SSEEventDecoder = class {
|
|
3
|
+
lineBuffer = "";
|
|
4
|
+
dataLines = [];
|
|
5
|
+
eventName;
|
|
6
|
+
lastEventId;
|
|
7
|
+
retry;
|
|
8
|
+
pendingLF = false;
|
|
9
|
+
trailing;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.trailing = options?.trailing ?? "drop";
|
|
12
|
+
}
|
|
13
|
+
push(text) {
|
|
14
|
+
const events = [];
|
|
15
|
+
if (text === "") return events;
|
|
16
|
+
if (this.pendingLF && text.startsWith("\n")) text = text.slice(1);
|
|
17
|
+
this.pendingLF = text.endsWith("\r");
|
|
18
|
+
this.lineBuffer += text;
|
|
19
|
+
const lines = this.lineBuffer.split(/\r\n|\r|\n/);
|
|
20
|
+
this.lineBuffer = lines.pop();
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
const event = this.processLine(line);
|
|
23
|
+
if (event) events.push(event);
|
|
24
|
+
}
|
|
25
|
+
return events;
|
|
26
|
+
}
|
|
27
|
+
flush() {
|
|
28
|
+
if (this.trailing === "drop") {
|
|
29
|
+
this.resetFrame();
|
|
30
|
+
this.lineBuffer = "";
|
|
31
|
+
this.pendingLF = false;
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (this.lineBuffer.length > 0) this.processLine(this.lineBuffer);
|
|
35
|
+
this.lineBuffer = "";
|
|
36
|
+
this.pendingLF = false;
|
|
37
|
+
return this.dispatchEvent();
|
|
38
|
+
}
|
|
39
|
+
processLine(line) {
|
|
40
|
+
if (line === "") return this.dispatchEvent();
|
|
41
|
+
if (line.startsWith(":")) return null;
|
|
42
|
+
const separator = line.indexOf(":");
|
|
43
|
+
const field = separator === -1 ? line : line.slice(0, separator);
|
|
44
|
+
let value = separator === -1 ? "" : line.slice(separator + 1);
|
|
45
|
+
if (value.startsWith(" ")) value = value.slice(1);
|
|
46
|
+
switch (field) {
|
|
47
|
+
case "data":
|
|
48
|
+
this.dataLines.push(value);
|
|
49
|
+
break;
|
|
50
|
+
case "event":
|
|
51
|
+
this.eventName = value;
|
|
52
|
+
break;
|
|
53
|
+
case "id":
|
|
54
|
+
if (!value.includes("\0")) this.lastEventId = value;
|
|
55
|
+
break;
|
|
56
|
+
case "retry": {
|
|
57
|
+
const retry = Number(value);
|
|
58
|
+
if (/^\d+$/.test(value) && Number.isSafeInteger(retry)) this.retry = retry;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
dispatchEvent() {
|
|
65
|
+
if (this.dataLines.length === 0) {
|
|
66
|
+
this.resetFrame();
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const event = { data: this.dataLines.join("\n") };
|
|
70
|
+
if (this.eventName !== void 0) event.event = this.eventName;
|
|
71
|
+
if (this.lastEventId !== void 0) event.id = this.lastEventId;
|
|
72
|
+
if (this.retry !== void 0) event.retry = this.retry;
|
|
73
|
+
this.resetFrame();
|
|
74
|
+
return event;
|
|
75
|
+
}
|
|
76
|
+
resetFrame() {
|
|
77
|
+
this.dataLines = [];
|
|
78
|
+
this.eventName = void 0;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { SSEEventDecoder };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=SSEEventDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSEEventDecoder.js","names":[],"sources":["../../../../src/core/utils/stream/SSEEventDecoder.ts"],"sourcesContent":["export type SSEEvent = {\n event?: string;\n data: string;\n id?: string;\n retry?: number;\n};\n\nexport class SSEEventDecoder {\n private lineBuffer = \"\";\n private dataLines: string[] = [];\n private eventName: string | undefined;\n private lastEventId: string | undefined;\n private retry: number | undefined;\n private pendingLF = false;\n private readonly trailing: \"drop\" | \"dispatch\";\n\n constructor(options?: { trailing?: \"drop\" | \"dispatch\" }) {\n this.trailing = options?.trailing ?? \"drop\";\n }\n\n push(text: string): SSEEvent[] {\n const events: SSEEvent[] = [];\n if (text === \"\") return events;\n\n // Lines end with LF, CRLF, or CR. A chunk-trailing \"\\r\" terminates its\n // line immediately; pendingLF then swallows the leading \"\\n\" of the next\n // chunk so a CRLF split across chunks is not counted twice.\n if (this.pendingLF && text.startsWith(\"\\n\")) text = text.slice(1);\n this.pendingLF = text.endsWith(\"\\r\");\n\n this.lineBuffer += text;\n const lines = this.lineBuffer.split(/\\r\\n|\\r|\\n/);\n this.lineBuffer = lines.pop()!;\n\n for (const line of lines) {\n const event = this.processLine(line);\n if (event) events.push(event);\n }\n\n return events;\n }\n\n flush(): SSEEvent | null {\n if (this.trailing === \"drop\") {\n this.resetFrame();\n this.lineBuffer = \"\";\n this.pendingLF = false;\n return null;\n }\n\n if (this.lineBuffer.length > 0) {\n this.processLine(this.lineBuffer);\n }\n\n this.lineBuffer = \"\";\n this.pendingLF = false;\n return this.dispatchEvent();\n }\n\n private processLine(line: string): SSEEvent | null {\n if (line === \"\") return this.dispatchEvent();\n if (line.startsWith(\":\")) return null;\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n\n switch (field) {\n case \"data\":\n this.dataLines.push(value);\n break;\n case \"event\":\n this.eventName = value;\n break;\n case \"id\":\n if (!value.includes(\"\\u0000\")) this.lastEventId = value;\n break;\n case \"retry\": {\n const retry = Number(value);\n if (/^\\d+$/.test(value) && Number.isSafeInteger(retry)) {\n this.retry = retry;\n }\n break;\n }\n }\n\n return null;\n }\n\n private dispatchEvent(): SSEEvent | null {\n if (this.dataLines.length === 0) {\n this.resetFrame();\n return null;\n }\n\n const event: SSEEvent = { data: this.dataLines.join(\"\\n\") };\n if (this.eventName !== undefined) event.event = this.eventName;\n if (this.lastEventId !== undefined) event.id = this.lastEventId;\n if (this.retry !== undefined) event.retry = this.retry;\n this.resetFrame();\n return event;\n }\n\n private resetFrame() {\n this.dataLines = [];\n this.eventName = undefined;\n }\n}\n"],"mappings":";AAOA,IAAa,kBAAb,MAA6B;CAC3B,aAAqB;CACrB,YAA8B,CAAC;CAC/B;CACA;CACA;CACA,YAAoB;CACpB;CAEA,YAAY,SAA8C;EACxD,KAAK,WAAW,SAAS,YAAY;CACvC;CAEA,KAAK,MAA0B;EAC7B,MAAM,SAAqB,CAAC;EAC5B,IAAI,SAAS,IAAI,OAAO;EAKxB,IAAI,KAAK,aAAa,KAAK,WAAW,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC;EAChE,KAAK,YAAY,KAAK,SAAS,IAAI;EAEnC,KAAK,cAAc;EACnB,MAAM,QAAQ,KAAK,WAAW,MAAM,YAAY;EAChD,KAAK,aAAa,MAAM,IAAI;EAE5B,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,QAAQ,KAAK,YAAY,IAAI;GACnC,IAAI,OAAO,OAAO,KAAK,KAAK;EAC9B;EAEA,OAAO;CACT;CAEA,QAAyB;EACvB,IAAI,KAAK,aAAa,QAAQ;GAC5B,KAAK,WAAW;GAChB,KAAK,aAAa;GAClB,KAAK,YAAY;GACjB,OAAO;EACT;EAEA,IAAI,KAAK,WAAW,SAAS,GAC3B,KAAK,YAAY,KAAK,UAAU;EAGlC,KAAK,aAAa;EAClB,KAAK,YAAY;EACjB,OAAO,KAAK,cAAc;CAC5B;CAEA,YAAoB,MAA+B;EACjD,IAAI,SAAS,IAAI,OAAO,KAAK,cAAc;EAC3C,IAAI,KAAK,WAAW,GAAG,GAAG,OAAO;EAEjC,MAAM,YAAY,KAAK,QAAQ,GAAG;EAClC,MAAM,QAAQ,cAAc,KAAK,OAAO,KAAK,MAAM,GAAG,SAAS;EAC/D,IAAI,QAAQ,cAAc,KAAK,KAAK,KAAK,MAAM,YAAY,CAAC;EAC5D,IAAI,MAAM,WAAW,GAAG,GAAG,QAAQ,MAAM,MAAM,CAAC;EAEhD,QAAQ,OAAR;GACE,KAAK;IACH,KAAK,UAAU,KAAK,KAAK;IACzB;GACF,KAAK;IACH,KAAK,YAAY;IACjB;GACF,KAAK;IACH,IAAI,CAAC,MAAM,SAAS,IAAQ,GAAG,KAAK,cAAc;IAClD;GACF,KAAK,SAAS;IACZ,MAAM,QAAQ,OAAO,KAAK;IAC1B,IAAI,QAAQ,KAAK,KAAK,KAAK,OAAO,cAAc,KAAK,GACnD,KAAK,QAAQ;IAEf;GACF;EACF;EAEA,OAAO;CACT;CAEA,gBAAyC;EACvC,IAAI,KAAK,UAAU,WAAW,GAAG;GAC/B,KAAK,WAAW;GAChB,OAAO;EACT;EAEA,MAAM,QAAkB,EAAE,MAAM,KAAK,UAAU,KAAK,IAAI,EAAE;EAC1D,IAAI,KAAK,cAAc,KAAA,GAAW,MAAM,QAAQ,KAAK;EACrD,IAAI,KAAK,gBAAgB,KAAA,GAAW,MAAM,KAAK,KAAK;EACpD,IAAI,KAAK,UAAU,KAAA,GAAW,MAAM,QAAQ,KAAK;EACjD,KAAK,WAAW;EAChB,OAAO;CACT;CAEA,aAAqB;EACnB,KAAK,YAAY,CAAC;EAClB,KAAK,YAAY,KAAA;CACnB;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/core/utils/stream/SSEEventDecoderStream.d.ts
|
|
2
|
+
type PipelineSSEEvent = {
|
|
3
|
+
event: string;
|
|
4
|
+
data: string;
|
|
5
|
+
id?: string;
|
|
6
|
+
retry?: number;
|
|
7
|
+
};
|
|
8
|
+
declare class SSEEventDecoderStream extends TransformStream<string, PipelineSSEEvent> {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { PipelineSSEEvent, SSEEventDecoderStream };
|
|
13
|
+
//# sourceMappingURL=SSEEventDecoderStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSEEventDecoderStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/SSEEventDecoderStream.ts"],"mappings":";KAGY;EACV;EACA;EACA;EACA;;cAGW,8BAA8B,wBAEzC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SSEEventDecoder } from "./SSEEventDecoder.js";
|
|
2
|
+
//#region src/core/utils/stream/SSEEventDecoderStream.ts
|
|
3
|
+
var SSEEventDecoderStream = class extends TransformStream {
|
|
4
|
+
constructor() {
|
|
5
|
+
const decoder = new SSEEventDecoder({ trailing: "drop" });
|
|
6
|
+
const normalize = (event) => ({
|
|
7
|
+
...event,
|
|
8
|
+
event: event.event || "message"
|
|
9
|
+
});
|
|
10
|
+
super({
|
|
11
|
+
transform(chunk, controller) {
|
|
12
|
+
for (const event of decoder.push(chunk)) controller.enqueue(normalize(event));
|
|
13
|
+
},
|
|
14
|
+
flush(controller) {
|
|
15
|
+
const event = decoder.flush();
|
|
16
|
+
if (event) controller.enqueue(normalize(event));
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
export { SSEEventDecoderStream };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=SSEEventDecoderStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSEEventDecoderStream.js","names":[],"sources":["../../../../src/core/utils/stream/SSEEventDecoderStream.ts"],"sourcesContent":["import { SSEEventDecoder } from \"./SSEEventDecoder\";\nimport type { SSEEvent } from \"./SSEEventDecoder\";\n\nexport type PipelineSSEEvent = {\n event: string;\n data: string;\n id?: string;\n retry?: number;\n};\n\nexport class SSEEventDecoderStream extends TransformStream<\n string,\n PipelineSSEEvent\n> {\n constructor() {\n const decoder = new SSEEventDecoder({ trailing: \"drop\" });\n const normalize = (event: SSEEvent): PipelineSSEEvent => ({\n ...event,\n event: event.event || \"message\",\n });\n\n super({\n transform(chunk, controller) {\n for (const event of decoder.push(chunk)) {\n controller.enqueue(normalize(event));\n }\n },\n flush(controller) {\n const event = decoder.flush();\n if (event) controller.enqueue(normalize(event));\n },\n });\n }\n}\n"],"mappings":";;AAUA,IAAa,wBAAb,cAA2C,gBAGzC;CACA,cAAc;EACZ,MAAM,UAAU,IAAI,gBAAgB,EAAE,UAAU,OAAO,CAAC;EACxD,MAAM,aAAa,WAAuC;GACxD,GAAG;GACH,OAAO,MAAM,SAAS;EACxB;EAEA,MAAM;GACJ,UAAU,OAAO,YAAY;IAC3B,KAAK,MAAM,SAAS,QAAQ,KAAK,KAAK,GACpC,WAAW,QAAQ,UAAU,KAAK,CAAC;GAEvC;GACA,MAAM,YAAY;IAChB,MAAM,QAAQ,QAAQ,MAAM;IAC5B,IAAI,OAAO,WAAW,QAAQ,UAAU,KAAK,CAAC;GAChD;EACF,CAAC;CACH;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnderlyingReadable.d.ts","names":[],"sources":["../../../../src/core/utils/stream/UnderlyingReadable.ts"],"mappings":";KAAY,
|
|
1
|
+
{"version":3,"file":"UnderlyingReadable.d.ts","names":[],"sources":["../../../../src/core/utils/stream/UnderlyingReadable.ts"],"mappings":";KAAY,mBAAmB;EAC7B,SAAS,YAAY;EACrB,QAAQ,YAAY,uBAAuB;EAC3C,SAAS"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
|
|
2
|
-
|
|
3
2
|
//#region src/core/utils/stream/merge.d.ts
|
|
4
3
|
declare const createMergeStream: () => {
|
|
5
4
|
readable: ReadableStream<AssistantStreamChunk>;
|
|
6
5
|
isSealed(): boolean;
|
|
6
|
+
isCancelled(): boolean;
|
|
7
|
+
isErrored(): boolean;
|
|
7
8
|
seal(): void;
|
|
8
9
|
addStream(stream: ReadableStream<AssistantStreamChunk>): void;
|
|
9
10
|
enqueue(chunk: AssistantStreamChunk): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","names":[],"sources":["../../../../src/core/utils/stream/merge.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge.d.ts","names":[],"sources":["../../../../src/core/utils/stream/merge.ts"],"mappings":";;cAQa;;;;;;EA2FS,UAAA,QAAA,eAAe;EAelB,QAAA,OAAA"}
|
|
@@ -3,11 +3,20 @@ import { promiseWithResolvers } from "../../../utils/promiseWithResolvers.js";
|
|
|
3
3
|
const createMergeStream = () => {
|
|
4
4
|
const list = [];
|
|
5
5
|
let sealed = false;
|
|
6
|
+
let cancelled = false;
|
|
7
|
+
let errored = false;
|
|
6
8
|
let controller;
|
|
7
9
|
let currentPull;
|
|
10
|
+
const cancelAllReaders = () => {
|
|
11
|
+
list.forEach((item) => {
|
|
12
|
+
item.reader.cancel().catch(() => void 0);
|
|
13
|
+
});
|
|
14
|
+
list.length = 0;
|
|
15
|
+
};
|
|
8
16
|
const handlePull = (item) => {
|
|
9
17
|
if (!item.promise) item.promise = item.reader.read().then(({ done, value }) => {
|
|
10
18
|
item.promise = void 0;
|
|
19
|
+
if (cancelled || errored) return;
|
|
11
20
|
if (done) {
|
|
12
21
|
list.splice(list.indexOf(item), 1);
|
|
13
22
|
if (sealed && list.length === 0) controller.close();
|
|
@@ -15,11 +24,10 @@ const createMergeStream = () => {
|
|
|
15
24
|
currentPull?.resolve();
|
|
16
25
|
currentPull = void 0;
|
|
17
26
|
}).catch((e) => {
|
|
27
|
+
if (cancelled || errored) return;
|
|
28
|
+
errored = true;
|
|
18
29
|
console.error(e);
|
|
19
|
-
|
|
20
|
-
item.reader.cancel();
|
|
21
|
-
});
|
|
22
|
-
list.length = 0;
|
|
30
|
+
cancelAllReaders();
|
|
23
31
|
controller.error(e);
|
|
24
32
|
currentPull?.reject(e);
|
|
25
33
|
currentPull = void 0;
|
|
@@ -38,20 +46,31 @@ const createMergeStream = () => {
|
|
|
38
46
|
return currentPull.promise;
|
|
39
47
|
},
|
|
40
48
|
cancel() {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
49
|
+
cancelled = true;
|
|
50
|
+
cancelAllReaders();
|
|
51
|
+
currentPull?.resolve();
|
|
52
|
+
currentPull = void 0;
|
|
45
53
|
}
|
|
46
54
|
}),
|
|
47
55
|
isSealed() {
|
|
48
56
|
return sealed;
|
|
49
57
|
},
|
|
58
|
+
isCancelled() {
|
|
59
|
+
return cancelled;
|
|
60
|
+
},
|
|
61
|
+
isErrored() {
|
|
62
|
+
return errored;
|
|
63
|
+
},
|
|
50
64
|
seal() {
|
|
65
|
+
if (cancelled || errored) return;
|
|
51
66
|
sealed = true;
|
|
52
67
|
if (list.length === 0) controller.close();
|
|
53
68
|
},
|
|
54
69
|
addStream(stream) {
|
|
70
|
+
if (cancelled || errored) {
|
|
71
|
+
stream.cancel().catch(() => void 0);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
55
74
|
if (sealed) throw new Error("Cannot add streams after the run callback has settled.");
|
|
56
75
|
const item = { reader: stream.getReader() };
|
|
57
76
|
list.push(item);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","names":[],"sources":["../../../../src/core/utils/stream/merge.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { promiseWithResolvers } from \"../../../utils/promiseWithResolvers\";\n\ntype MergeStreamItem = {\n reader: ReadableStreamDefaultReader<AssistantStreamChunk>;\n promise?: Promise<unknown> | undefined;\n};\n\nexport const createMergeStream = () => {\n const list: MergeStreamItem[] = [];\n let sealed = false;\n let controller: ReadableStreamDefaultController<AssistantStreamChunk>;\n let currentPull: ReturnType<typeof promiseWithResolvers<void>> | undefined;\n\n const handlePull = (item: MergeStreamItem) => {\n if (!item.promise) {\n // TODO for most streams, we can directly pipeTo to avoid the microTask queue\n // add an option to eagerly pipe the stream to the merge stream\n // ideally, using assistant-stream w sync run method + piping to a sync WritableStream runs in the same microtask\n // this is useful because we often use AssistantStreams internally as a serialization utility, e. g. AssistantTransformStream\n // idea: avoid reader.read() by instead using a WritableStream & if (!hasPendingPull) await waitForPull()?\n item.promise = item.reader\n .read()\n .then(({ done, value }) => {\n item.promise = undefined;\n if (done) {\n list.splice(list.indexOf(item), 1);\n if (sealed && list.length === 0) {\n controller.close();\n }\n } else {\n controller.enqueue(value);\n }\n\n currentPull?.resolve();\n currentPull = undefined;\n })\n .catch((e) => {\n
|
|
1
|
+
{"version":3,"file":"merge.js","names":[],"sources":["../../../../src/core/utils/stream/merge.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { promiseWithResolvers } from \"../../../utils/promiseWithResolvers\";\n\ntype MergeStreamItem = {\n reader: ReadableStreamDefaultReader<AssistantStreamChunk>;\n promise?: Promise<unknown> | undefined;\n};\n\nexport const createMergeStream = () => {\n const list: MergeStreamItem[] = [];\n let sealed = false;\n let cancelled = false;\n let errored = false;\n let controller: ReadableStreamDefaultController<AssistantStreamChunk>;\n let currentPull: ReturnType<typeof promiseWithResolvers<void>> | undefined;\n\n const cancelAllReaders = () => {\n list.forEach((item) => {\n void item.reader.cancel().catch(() => undefined);\n });\n list.length = 0;\n };\n\n const handlePull = (item: MergeStreamItem) => {\n if (!item.promise) {\n // TODO for most streams, we can directly pipeTo to avoid the microTask queue\n // add an option to eagerly pipe the stream to the merge stream\n // ideally, using assistant-stream w sync run method + piping to a sync WritableStream runs in the same microtask\n // this is useful because we often use AssistantStreams internally as a serialization utility, e. g. AssistantTransformStream\n // idea: avoid reader.read() by instead using a WritableStream & if (!hasPendingPull) await waitForPull()?\n item.promise = item.reader\n .read()\n .then(({ done, value }) => {\n item.promise = undefined;\n if (cancelled || errored) return;\n\n if (done) {\n list.splice(list.indexOf(item), 1);\n if (sealed && list.length === 0) {\n controller.close();\n }\n } else {\n controller.enqueue(value);\n }\n\n currentPull?.resolve();\n currentPull = undefined;\n })\n .catch((e) => {\n if (cancelled || errored) return;\n\n errored = true;\n console.error(e);\n cancelAllReaders();\n\n controller.error(e);\n\n currentPull?.reject(e);\n currentPull = undefined;\n });\n }\n };\n\n const readable = new ReadableStream<AssistantStreamChunk>({\n start(c) {\n controller = c;\n },\n pull() {\n currentPull = promiseWithResolvers();\n list.forEach((item) => {\n handlePull(item);\n });\n\n return currentPull.promise;\n },\n cancel() {\n cancelled = true;\n cancelAllReaders();\n currentPull?.resolve();\n currentPull = undefined;\n },\n });\n\n return {\n readable,\n isSealed() {\n return sealed;\n },\n isCancelled() {\n return cancelled;\n },\n isErrored() {\n return errored;\n },\n seal() {\n if (cancelled || errored) return;\n sealed = true;\n if (list.length === 0) controller.close();\n },\n addStream(stream: ReadableStream<AssistantStreamChunk>) {\n if (cancelled || errored) {\n void stream.cancel().catch(() => undefined);\n return;\n }\n\n if (sealed)\n throw new Error(\n \"Cannot add streams after the run callback has settled.\",\n );\n\n const item = { reader: stream.getReader() };\n list.push(item);\n handlePull(item);\n },\n enqueue(chunk: AssistantStreamChunk) {\n this.addStream(\n new ReadableStream({\n start(c) {\n c.enqueue(chunk);\n c.close();\n },\n }),\n );\n },\n };\n};\n\n// TODO\n// export class SpanContainerMerger {\n// public get isSealed() {\n// return this.mergeStream.isSealed();\n// }\n\n// public get readable() {\n// return this.mergeStream.readable;\n// }\n\n// private subAllocator = new Counter();\n// private mergeStream = createMergeStream();\n\n// constructor() {\n// // id 0 is auto allocated\n// this.subAllocator.up();\n// }\n\n// add(stream: ReadableStream<AssistantStreamChunk>) {\n// this.mergeStream.addStream(\n// stream.pipeThrough(new SpanParentEncoder(this.subAllocator)),\n// );\n// }\n\n// enqueue(chunk: AssistantStreamChunk & { parentId: 0 }) {\n// this.mergeStream.addStream(\n// new ReadableStream({\n// start(c) {\n// c.enqueue(chunk);\n// c.close();\n// },\n// }),\n// );\n// }\n\n// seal() {\n// this.mergeStream.seal();\n// }\n// }\n\n// export class SpanContainerSplitter {\n// public writable;\n\n// private isSealed = false;\n// private writers = new Map<\n// number,\n// WritableStreamDefaultWriter<AssistantStreamChunk>\n// >();\n\n// private closeTasks: Promise<void>[] = [];\n\n// private allocator = new Counter();\n// private subAllocator = new Counter();\n\n// constructor() {\n// // id 0 is auto-allocated\n// this.allocator.up();\n\n// this.writable = new WritableStream({\n// write: (chunk) => {\n// const { type, parentId } = chunk;\n\n// const writer = this.writers.get(parentId);\n// if (writer === undefined) throw new Error(\"Parent id not found\");\n\n// writer.write(chunk);\n\n// if (type === \"span\") {\n// // allocate a new span id\n// this.writers.set(this.allocator.up(), writer);\n// }\n// if (type === \"finish\") {\n// this.writers.delete(parentId);\n// writer.close();\n\n// if (this.writers.size === 0) {\n// const closeTask = this.writable.close();\n// this.closeTasks.push(closeTask);\n// closeTask.then(() => {\n// this.closeTasks.splice(this.closeTasks.indexOf(closeTask), 1);\n// });\n// }\n// }\n// },\n// close: async () => {\n// if (this.writers.size > 0) throw new Error(\"Not all writers closed\");\n\n// // await and throw on any errors\n// await Promise.all(this.closeTasks);\n// },\n// });\n// }\n\n// add(stream: WritableStream<AssistantStreamChunk>) {\n// if (this.isSealed) throw new Error(\"Cannot add streams after sealing\");\n\n// const decoder = new SpanParentDecoder(this.subAllocator);\n// decoder.readable.pipeTo(stream);\n\n// this.writers.set(this.allocator.up(), decoder.writable.getWriter());\n// }\n\n// seal() {\n// this.isSealed = true;\n// if (this.writers.size === 0) this.writable.close();\n// }\n// }\n"],"mappings":";;AAQA,MAAa,0BAA0B;CACrC,MAAM,OAA0B,CAAC;CACjC,IAAI,SAAS;CACb,IAAI,YAAY;CAChB,IAAI,UAAU;CACd,IAAI;CACJ,IAAI;CAEJ,MAAM,yBAAyB;EAC7B,KAAK,SAAS,SAAS;GACrB,KAAU,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EACjD,CAAC;EACD,KAAK,SAAS;CAChB;CAEA,MAAM,cAAc,SAA0B;EAC5C,IAAI,CAAC,KAAK,SAMR,KAAK,UAAU,KAAK,OACjB,KAAK,CAAC,CACN,MAAM,EAAE,MAAM,YAAY;GACzB,KAAK,UAAU,KAAA;GACf,IAAI,aAAa,SAAS;GAE1B,IAAI,MAAM;IACR,KAAK,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC;IACjC,IAAI,UAAU,KAAK,WAAW,GAC5B,WAAW,MAAM;GAErB,OACE,WAAW,QAAQ,KAAK;GAG1B,aAAa,QAAQ;GACrB,cAAc,KAAA;EAChB,CAAC,CAAC,CACD,OAAO,MAAM;GACZ,IAAI,aAAa,SAAS;GAE1B,UAAU;GACV,QAAQ,MAAM,CAAC;GACf,iBAAiB;GAEjB,WAAW,MAAM,CAAC;GAElB,aAAa,OAAO,CAAC;GACrB,cAAc,KAAA;EAChB,CAAC;CAEP;CAsBA,OAAO;EACL,UAAA,IArBmB,eAAqC;GACxD,MAAM,GAAG;IACP,aAAa;GACf;GACA,OAAO;IACL,cAAc,qBAAqB;IACnC,KAAK,SAAS,SAAS;KACrB,WAAW,IAAI;IACjB,CAAC;IAED,OAAO,YAAY;GACrB;GACA,SAAS;IACP,YAAY;IACZ,iBAAiB;IACjB,aAAa,QAAQ;IACrB,cAAc,KAAA;GAChB;EACF,CAGS;EACP,WAAW;GACT,OAAO;EACT;EACA,cAAc;GACZ,OAAO;EACT;EACA,YAAY;GACV,OAAO;EACT;EACA,OAAO;GACL,IAAI,aAAa,SAAS;GAC1B,SAAS;GACT,IAAI,KAAK,WAAW,GAAG,WAAW,MAAM;EAC1C;EACA,UAAU,QAA8C;GACtD,IAAI,aAAa,SAAS;IACxB,OAAY,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;IAC1C;GACF;GAEA,IAAI,QACF,MAAM,IAAI,MACR,wDACF;GAEF,MAAM,OAAO,EAAE,QAAQ,OAAO,UAAU,EAAE;GAC1C,KAAK,KAAK,IAAI;GACd,WAAW,IAAI;EACjB;EACA,QAAQ,OAA6B;GACnC,KAAK,UACH,IAAI,eAAe,EACjB,MAAM,GAAG;IACP,EAAE,QAAQ,KAAK;IACf,EAAE,MAAM;GACV,EACF,CAAC,CACH;EACF;CACF;AACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
|
|
2
2
|
import { Counter } from "../Counter.js";
|
|
3
|
-
|
|
4
3
|
//#region src/core/utils/stream/path-utils.d.ts
|
|
5
4
|
declare class PathAppendEncoder extends TransformStream<AssistantStreamChunk, AssistantStreamChunk> {
|
|
6
5
|
constructor(idx: number);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.d.ts","names":[],"sources":["../../../../src/core/utils/stream/path-utils.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","names":[],"sources":["../../../../src/core/utils/stream/path-utils.ts"],"mappings":";;;cAGa,0BAA0B,gBACrC,sBACA;EAEY,YAAA;;cAYD,0BAA0B,gBACrC,sBACA;EAEY,YAAA;;cAmBD,yBAAyB,gBACpC,sBACA;EAEY,YAAA,SAAS"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils/json/json-value.js";
|
|
2
2
|
import { ToolModelContentPart } from "../tool/tool-types.js";
|
|
3
|
-
|
|
4
3
|
//#region src/core/utils/types.d.ts
|
|
5
4
|
type TextStatus = {
|
|
6
5
|
type: "running";
|
|
@@ -43,7 +42,9 @@ type ToolCallStatus = {
|
|
|
43
42
|
* themselves.
|
|
44
43
|
*/
|
|
45
44
|
type ToolCallTiming = {
|
|
46
|
-
/** Epoch milliseconds when the tool call started streaming or executing. */
|
|
45
|
+
/** Epoch milliseconds when the tool call started streaming or executing. */
|
|
46
|
+
readonly startedAt: number;
|
|
47
|
+
/** Epoch milliseconds when the result landed. Absent while the call runs. */
|
|
47
48
|
readonly completedAt?: number;
|
|
48
49
|
};
|
|
49
50
|
type ToolCallPartBase = {
|
|
@@ -122,12 +123,19 @@ type AssistantMessageStatus = {
|
|
|
122
123
|
error?: ReadonlyJSONValue;
|
|
123
124
|
};
|
|
124
125
|
type AssistantMessageTiming = {
|
|
125
|
-
/** Timestamp when the stream started (ms since epoch) */
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
126
|
+
/** Timestamp when the stream started (ms since epoch) */
|
|
127
|
+
streamStartTime: number;
|
|
128
|
+
/** Time to first text token (ms), undefined if no text was generated */
|
|
129
|
+
firstTokenTime?: number;
|
|
130
|
+
/** Total stream duration (ms) */
|
|
131
|
+
totalStreamTime?: number;
|
|
132
|
+
/** Estimated or actual completion token count */
|
|
133
|
+
tokenCount?: number;
|
|
134
|
+
/** Tokens per second throughput */
|
|
135
|
+
tokensPerSecond?: number;
|
|
136
|
+
/** Total number of chunks received */
|
|
137
|
+
totalChunks: number;
|
|
138
|
+
/** Number of tool calls in the message */
|
|
131
139
|
toolCallCount: number;
|
|
132
140
|
};
|
|
133
141
|
type AssistantMessage = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/core/utils/types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/core/utils/types.ts"],"mappings":";;;KAMK;EAEC;;EAGA;EACA;;EAGA;EACA;;KAOM;EACV;EACA;EACA,QAAQ;EACR;;KAGU;EACV;EACA;EACA,QAAQ;EACR;;KAGG;EAEC;EACA;;EAGA;EACA;;EAGA;EACA;;EAGA;EACA;;;;;;;;KASM;;WAED;;WAEA;;KAGN;EACH;EACA,QAAQ;EACR;EACA;EACA;EACA,MAAM;EACN,SAAS;EACT,WAAW;EACX,SAAS;EACT,wBAAwB;EACxB;EACA;;KAGG,4BAA4B;EAC/B;EACA;EACA;;KAGG,yBAAyB;EAC5B;EACA,QAAQ;EACR,WAAW;EACX,wBAAwB;EACxB;;KAGU,eAAe,4BAA4B;KAE3C;EACV;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA,MAAM;EACN;;KAGU,uBACR,WACA,gBACA,eACA,aACA,WACA;KAEC;EACH;EACA;;KAGG;EAEC;EACA;;EAGA;EACA;EACA;EAQA,QAAQ;EACR;;KAGM;EAEN;;EAGA;EACA;;EAGA;EACA;;EAGA;EACA;EAOA,QAAQ;;KAGF;;EAEV;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;KAGU;EACV;EACA,QAAQ;EACR,OAAO;;;;EAIP,SAAS;EAET;IACE,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,OAAO;IACP,QAAQ;IACR,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withPromiseOrValue.d.ts","names":[],"sources":["../../../src/core/utils/withPromiseOrValue.ts"],"mappings":";iBAAgB,
|
|
1
|
+
{"version":3,"file":"withPromiseOrValue.d.ts","names":[],"sources":["../../../src/core/utils/withPromiseOrValue.ts"],"mappings":";iBAAgB,mBAAmB,GACjC,gBAAgB,IAAI,YAAY,IAChC,cAAc,OAAO,MAAM,0BAC3B,eAAe,mBAAmB,2BACjC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
import { ReadonlyJSONValue } from "./utils/json/json-value.js";
|
|
1
2
|
import { TextStreamController } from "./core/modules/text.js";
|
|
2
3
|
import { McpServerConfig, ProviderOptions, Tool, ToolCallReader, ToolDeclaration, ToolModelContentPart, ToolModelOutputFunction } from "./core/tool/tool-types.js";
|
|
3
4
|
import { ToolResponse, ToolResponseLike } from "./core/tool/ToolResponse.js";
|
|
4
5
|
import { ToolCallStreamController } from "./core/modules/tool-call.js";
|
|
5
6
|
import { AssistantMessage, AssistantMessageTiming, DataPart, ToolCallTiming } from "./core/utils/types.js";
|
|
6
7
|
import { AssistantStreamController, createAssistantStream, createAssistantStreamController, createAssistantStreamResponse } from "./core/modules/assistant-stream.js";
|
|
7
|
-
import
|
|
8
|
+
import "./utils.js";
|
|
9
|
+
import { AssistantTransportStateOperation, GorpStreamChunk, GorpStreamOperation } from "./core/gorp/types.js";
|
|
8
10
|
import { AssistantStreamChunk } from "./core/AssistantStreamChunk.js";
|
|
9
11
|
import { AssistantStream } from "./core/AssistantStream.js";
|
|
10
12
|
import { AssistantMessageStream } from "./core/accumulators/AssistantMessageStream.js";
|
|
11
13
|
import { AssistantMessageAccumulator, createInitialMessage } from "./core/accumulators/assistant-message-accumulator.js";
|
|
12
14
|
import { GenericAssistantMessage, GenericFilePart, GenericMessage, GenericSystemMessage, GenericTextPart, GenericToolCallPart, GenericToolMessage, GenericToolResultPart, GenericUserMessage, toGenericMessages } from "./core/converters/toGenericMessages.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
+
import { GorpStreamDeltaTracker } from "./core/gorp/GorpStreamDeltaTracker.js";
|
|
16
|
+
import { GorpStreamResponse } from "./core/gorp/GorpStreamResponse.js";
|
|
15
17
|
import { PlainTextDecoder, PlainTextEncoder } from "./core/serialization/PlainText.js";
|
|
16
18
|
import { AssistantTransportDecoder, AssistantTransportEncoder } from "./core/serialization/assistant-transport/AssistantTransport.js";
|
|
17
19
|
import { DataStreamDecoder, DataStreamEncoder } from "./core/serialization/data-stream/DataStream.js";
|
|
@@ -20,4 +22,23 @@ import { UIMessageStreamDecoder, UIMessageStreamDecoderOptions } from "./core/se
|
|
|
20
22
|
import { ToolExecutionStream } from "./core/tool/ToolExecutionStream.js";
|
|
21
23
|
import { ToToolsJSONSchemaOptions, ToolJSONSchema, toJSONSchema, toPartialJSONSchema, toToolsJSONSchema } from "./core/tool/schema-utils.js";
|
|
22
24
|
import { ToolResultStreamOptions, toolResultStream, unstable_runPendingTools } from "./core/tool/toolResultStream.js";
|
|
23
|
-
|
|
25
|
+
//#region src/index.d.ts
|
|
26
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
27
|
+
declare const createObjectStream: ({ execute, defaultValue }: {
|
|
28
|
+
execute: (controller: {
|
|
29
|
+
readonly abortSignal: AbortSignal;
|
|
30
|
+
enqueue(operations: readonly GorpStreamOperation[]): void;
|
|
31
|
+
}) => void | PromiseLike<void>;
|
|
32
|
+
defaultValue?: ReadonlyJSONValue;
|
|
33
|
+
}) => ReadableStream<GorpStreamChunk>;
|
|
34
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
35
|
+
declare const ObjectStreamResponse: typeof GorpStreamResponse;
|
|
36
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
37
|
+
type ObjectStreamResponse = GorpStreamResponse;
|
|
38
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
39
|
+
declare const fromObjectStreamResponse: (response: Response) => ReadableStream<GorpStreamChunk>;
|
|
40
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
41
|
+
type ObjectStreamChunk = GorpStreamChunk;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { type AssistantMessage, AssistantMessageAccumulator, AssistantMessageStream, type AssistantMessageTiming, AssistantStream, type AssistantStreamChunk, type AssistantStreamController, AssistantTransportDecoder, GorpStreamDeltaTracker as AssistantTransportDeltaTracker, AssistantTransportEncoder, type AssistantTransportStateOperation, type DataPart, DataStreamDecoder, DataStreamEncoder, type GenericAssistantMessage, type GenericFilePart, type GenericMessage, type GenericSystemMessage, type GenericTextPart, type GenericToolCallPart, type GenericToolMessage, type GenericToolResultPart, type GenericUserMessage, type McpServerConfig, ObjectStreamChunk, ObjectStreamResponse, PlainTextDecoder, PlainTextEncoder, type ProviderOptions, type TextStreamController, type ToToolsJSONSchemaOptions, type Tool, type ToolCallReader, type ToolCallStreamController, type ToolCallTiming, type ToolDeclaration, ToolExecutionStream, type ToolJSONSchema, type ToolModelContentPart, type ToolModelOutputFunction, ToolResponse, type ToolResponseLike, type ToolResultStreamOptions, type UIMessageStreamChunk, type UIMessageStreamDataChunk, UIMessageStreamDecoder, type UIMessageStreamDecoderOptions, createAssistantStream, createAssistantStreamController, createAssistantStreamResponse, createObjectStream, fromObjectStreamResponse, toGenericMessages, toJSONSchema, toPartialJSONSchema, toToolsJSONSchema, createInitialMessage as unstable_createInitialMessage, unstable_runPendingTools, toolResultStream as unstable_toolResultStream };
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;cA4Ea,uBAAkB,SAAA;;;;;;MAAmB,eAAA;;cAErC,6BAAoB;;KAErB,uBAAuB;;cAEtB,2BAAwB,UAAA,aAAA,eAAA;;KAEzB,oBAAoB"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,18 @@ import { ToolResponse } from "./core/tool/ToolResponse.js";
|
|
|
10
10
|
import { ToolExecutionStream } from "./core/tool/ToolExecutionStream.js";
|
|
11
11
|
import { toolResultStream, unstable_runPendingTools } from "./core/tool/toolResultStream.js";
|
|
12
12
|
import { toJSONSchema, toPartialJSONSchema, toToolsJSONSchema } from "./core/tool/schema-utils.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { createGorpStream } from "./core/gorp/createGorpStream.js";
|
|
14
|
+
import { GorpStreamResponse, fromGorpStreamResponse } from "./core/gorp/GorpStreamResponse.js";
|
|
15
|
+
import { GorpStreamDeltaTracker } from "./core/gorp/GorpStreamDeltaTracker.js";
|
|
15
16
|
import { toGenericMessages } from "./core/converters/toGenericMessages.js";
|
|
16
|
-
|
|
17
|
+
//#region src/index.ts
|
|
18
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
19
|
+
const createObjectStream = createGorpStream;
|
|
20
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
21
|
+
const ObjectStreamResponse = GorpStreamResponse;
|
|
22
|
+
/** @deprecated Use the assistant-transport surface instead. */
|
|
23
|
+
const fromObjectStreamResponse = fromGorpStreamResponse;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { AssistantMessageAccumulator, AssistantMessageStream, AssistantStream, AssistantTransportDecoder, GorpStreamDeltaTracker as AssistantTransportDeltaTracker, AssistantTransportEncoder, DataStreamDecoder, DataStreamEncoder, ObjectStreamResponse, PlainTextDecoder, PlainTextEncoder, ToolExecutionStream, ToolResponse, UIMessageStreamDecoder, createAssistantStream, createAssistantStreamController, createAssistantStreamResponse, createObjectStream, fromObjectStreamResponse, toGenericMessages, toJSONSchema, toPartialJSONSchema, toToolsJSONSchema, createInitialMessage as unstable_createInitialMessage, unstable_runPendingTools, toolResultStream as unstable_toolResultStream };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export {\n createAssistantStream,\n createAssistantStreamResponse,\n createAssistantStreamController,\n} from \"./core/modules/assistant-stream\";\nexport {\n AssistantMessageAccumulator,\n createInitialMessage as unstable_createInitialMessage,\n} from \"./core/accumulators/assistant-message-accumulator\";\nexport { AssistantStream } from \"./core/AssistantStream\";\nexport type { AssistantStreamController } from \"./core/modules/assistant-stream\";\nexport type { AssistantStreamChunk } from \"./core/AssistantStreamChunk\";\nexport {\n DataStreamDecoder,\n DataStreamEncoder,\n} from \"./core/serialization/data-stream/DataStream\";\nexport {\n PlainTextDecoder,\n PlainTextEncoder,\n} from \"./core/serialization/PlainText\";\nexport {\n AssistantTransportDecoder,\n AssistantTransportEncoder,\n} from \"./core/serialization/assistant-transport/AssistantTransport\";\nexport {\n UIMessageStreamDecoder,\n type UIMessageStreamChunk,\n type UIMessageStreamDataChunk,\n type UIMessageStreamDecoderOptions,\n} from \"./core/serialization/ui-message-stream/UIMessageStream\";\nexport { AssistantMessageStream } from \"./core/accumulators/AssistantMessageStream\";\nexport type {\n AssistantMessage,\n AssistantMessageTiming,\n DataPart,\n ToolCallTiming,\n} from \"./core/utils/types\";\n\nexport type {\n Tool,\n ToolDeclaration,\n McpServerConfig,\n ToolModelContentPart,\n ToolModelOutputFunction,\n} from \"./core/tool/tool-types\";\nexport { ToolResponse, type ToolResponseLike } from \"./core/tool/ToolResponse\";\nexport { ToolExecutionStream } from \"./core/tool/ToolExecutionStream\";\nexport type { ProviderOptions, ToolCallReader } from \"./core/tool/tool-types\";\nexport {\n toolResultStream as unstable_toolResultStream,\n unstable_runPendingTools,\n type ToolResultStreamOptions,\n} from \"./core/tool/toolResultStream\";\nexport {\n toJSONSchema,\n toPartialJSONSchema,\n toToolsJSONSchema,\n type ToolJSONSchema,\n type ToToolsJSONSchemaOptions,\n} from \"./core/tool/schema-utils\";\n\nexport type { TextStreamController } from \"./core/modules/text\";\nexport type { ToolCallStreamController } from \"./core/modules/tool-call\";\n\nimport { createGorpStream } from \"./core/gorp/createGorpStream\";\nimport {\n GorpStreamResponse,\n fromGorpStreamResponse,\n} from \"./core/gorp/GorpStreamResponse\";\nimport type { GorpStreamChunk } from \"./core/gorp/types\";\nimport { GorpStreamDeltaTracker } from \"./core/gorp/GorpStreamDeltaTracker\";\n\nexport { GorpStreamDeltaTracker as AssistantTransportDeltaTracker };\nexport type { AssistantTransportStateOperation } from \"./core/gorp/types\";\n\n/** @deprecated Use the assistant-transport surface instead. */\nexport const createObjectStream = createGorpStream;\n/** @deprecated Use the assistant-transport surface instead. */\nexport const ObjectStreamResponse = GorpStreamResponse;\n/** @deprecated Use the assistant-transport surface instead. */\nexport type ObjectStreamResponse = GorpStreamResponse;\n/** @deprecated Use the assistant-transport surface instead. */\nexport const fromObjectStreamResponse = fromGorpStreamResponse;\n/** @deprecated Use the assistant-transport surface instead. */\nexport type ObjectStreamChunk = GorpStreamChunk;\n\nexport {\n toGenericMessages,\n type GenericMessage,\n type GenericSystemMessage,\n type GenericUserMessage,\n type GenericAssistantMessage,\n type GenericToolMessage,\n type GenericTextPart,\n type GenericFilePart,\n type GenericToolCallPart,\n type GenericToolResultPart,\n} from \"./core/converters/toGenericMessages\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4EA,MAAa,qBAAqB;;AAElC,MAAa,uBAAuB;;AAIpC,MAAa,2BAA2B"}
|
package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts
CHANGED
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
|
|
10
10
|
*/
|
|
11
11
|
type JSONSchema7TypeName = "string" //
|
|
12
|
-
| "number" | "integer" | "boolean" | "object" | "array" | "null";
|
|
12
|
+
| "number" | "integer" | "boolean" | "object" | "array" | "null";
|
|
13
13
|
/**
|
|
14
14
|
* Primitive type
|
|
15
15
|
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
|
|
16
16
|
*/
|
|
17
17
|
type JSONSchema7Type = string //
|
|
18
|
-
| number | boolean | JSONSchema7Object | JSONSchema7Array | null;
|
|
18
|
+
| number | boolean | JSONSchema7Object | JSONSchema7Array | null;
|
|
19
19
|
// Workaround for infinite type recursion
|
|
20
20
|
interface JSONSchema7Object {
|
|
21
21
|
[key: string]: JSONSchema7Type;
|
|
@@ -137,5 +137,5 @@ interface JSONSchema7 {
|
|
|
137
137
|
examples?: JSONSchema7Type | undefined;
|
|
138
138
|
}
|
|
139
139
|
//#endregion
|
|
140
|
-
export { JSONSchema7 };
|
|
140
|
+
export { JSONSchema7, JSONSchema7Array, JSONSchema7Definition, JSONSchema7Object, JSONSchema7Type, JSONSchema7TypeName, JSONSchema7Version };
|
|
141
141
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;KA+iBY;;;;;;KAaA;sBAIN,oBACA;;UAIW;GACZ,cAAc;;;;UAKF,yBAAyB,MAAM;;;;;;;;;;;;KAapC;;;;;KAMA,wBAAwB;UACnB;EACb;EACA;EACA,UAAU;EACV;;;;;EAMA;KACK,cAAc;;;;;EAMnB,OAAO,sBAAsB;EAC7B,OAAO;EACP,QAAQ;;;;EAKR;EACA;EACA;EACA;EACA;;;;EAKA;EACA;EACA;;;;EAKA,QAAQ,wBAAwB;EAChC,kBAAkB;EAClB;EACA;EACA;EACA,WAAW;;;;EAKX;EACA;EACA;EACA;KACK,cAAc;;EAEnB;KACK,cAAc;;EAEnB,uBAAuB;EACvB;KACK,cAAc;;EAEnB,gBAAgB;;;;EAKhB,KAAK;EACL,OAAO;EACP,OAAO;;;;EAKP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,MAAM;;;;EAKN;;;;EAKA;EACA;;;;EAKA;KACK,cAAc;;;;;EAMnB;EACA;EACA,UAAU;EACV;EACA;EACA,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResumableStreamContext.d.ts","names":[],"sources":["../../src/resumable/ResumableStreamContext.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ResumableStreamContext.d.ts","names":[],"sources":["../../src/resumable/ResumableStreamContext.ts"],"mappings":";;KAQY;WACD,OAAO;WACP;;;;;;WAMA,aAAa,SAAS;WACtB,aAAa,kBAAkB,MAAM;WACrC,YAAY,kBAAkB;WAC9B,cACP,kBACA,0BACA;WAEO,WAAW,kBAAkB;;UAGvB;;EAEf,IACE,kBACA,kBAAkB,eAAe,cAChC,QAAQ,eAAe;;EAG1B,OAAO,mBAAmB,QAAQ,eAAe;;EAGjD,cAAc,mBAAmB,QAAQ,eAAe;EAExD,OAAO,mBAAmB,QAAQ;EAElC,OAAO,mBAAmB;;iBAkBZ,6BACd,SAAS,gCACR"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
import { withPromiseOrValue } from "../core/utils/withPromiseOrValue.js";
|
|
1
2
|
import { ResumableStreamError } from "./errors.js";
|
|
2
3
|
//#region src/resumable/ResumableStreamContext.ts
|
|
4
|
+
const invokeObservabilityHook = (name, hook, ...args) => {
|
|
5
|
+
if (!hook) return;
|
|
6
|
+
withPromiseOrValue(() => hook(...args), () => {}, (error) => {
|
|
7
|
+
console.error(`resumable stream ${name} hook failed:`, error);
|
|
8
|
+
});
|
|
9
|
+
};
|
|
3
10
|
function createResumableStreamContext(options) {
|
|
4
11
|
const { store, waitUntil, onAcquire, onAppend, onFinalize, onError } = options;
|
|
5
12
|
const acquireOptions = options.ttlMs !== void 0 ? { ttlMs: options.ttlMs } : void 0;
|
|
6
13
|
return {
|
|
7
14
|
async run(streamId, makeStream) {
|
|
8
15
|
const role = await store.acquire(streamId, acquireOptions);
|
|
9
|
-
onAcquire
|
|
16
|
+
invokeObservabilityHook("onAcquire", onAcquire, streamId, role);
|
|
10
17
|
if (role === "producer") startProducerTask(store, streamId, makeStream, {
|
|
11
18
|
waitUntil,
|
|
12
19
|
onAppend,
|
|
@@ -42,13 +49,13 @@ function startProducerTask(store, streamId, makeStream, hooks) {
|
|
|
42
49
|
const { done, value } = await reader.read();
|
|
43
50
|
if (done) break;
|
|
44
51
|
await store.append(streamId, value);
|
|
45
|
-
onAppend
|
|
52
|
+
invokeObservabilityHook("onAppend", onAppend, streamId, value.byteLength);
|
|
46
53
|
}
|
|
47
54
|
await store.finalize(streamId, "done");
|
|
48
|
-
onFinalize
|
|
55
|
+
invokeObservabilityHook("onFinalize", onFinalize, streamId, "done");
|
|
49
56
|
} catch (err) {
|
|
50
57
|
cancelled = true;
|
|
51
|
-
onError
|
|
58
|
+
invokeObservabilityHook("onError", onError, streamId, err);
|
|
52
59
|
const message = err instanceof Error ? err.message : String(err);
|
|
53
60
|
try {
|
|
54
61
|
await reader?.cancel(err);
|
|
@@ -57,7 +64,7 @@ function startProducerTask(store, streamId, makeStream, hooks) {
|
|
|
57
64
|
}
|
|
58
65
|
try {
|
|
59
66
|
await store.finalize(streamId, "error", message);
|
|
60
|
-
onFinalize
|
|
67
|
+
invokeObservabilityHook("onFinalize", onFinalize, streamId, "error", message);
|
|
61
68
|
} catch (finalizeErr) {
|
|
62
69
|
console.error("resumable stream finalize failed:", finalizeErr);
|
|
63
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResumableStreamContext.js","names":[],"sources":["../../src/resumable/ResumableStreamContext.ts"],"sourcesContent":["import { ResumableStreamError } from \"./errors\";\nimport type {\n ResumableStreamRole,\n ResumableStreamStatus,\n ResumableStreamStore,\n} from \"./types\";\n\nexport type ResumableStreamContextOptions = {\n readonly store: ResumableStreamStore;\n readonly ttlMs?: number;\n /**\n * Required on serverless runtimes that terminate background work when the\n * request handler returns (Vercel, Cloudflare). Pass `after` from\n * `next/server` so the producer task outlives the response.\n */\n readonly waitUntil?: (promise: Promise<unknown>) => void;\n readonly onAcquire?: (streamId: string, role: ResumableStreamRole) => void;\n readonly onAppend?: (streamId: string, byteLength: number) => void;\n readonly onFinalize?: (\n streamId: string,\n status: \"done\" | \"error\",\n error?: string,\n ) => void;\n readonly onError?: (streamId: string, error: unknown) => void;\n};\n\nexport interface ResumableStreamContext {\n /** Producer or consumer entrypoint. Atomically elects the role. */\n run(\n streamId: string,\n makeStream: () => ReadableStream<Uint8Array>,\n ): Promise<ReadableStream<Uint8Array>>;\n\n /** Returns `null` when the stream does not exist. */\n resume(streamId: string): Promise<ReadableStream<Uint8Array> | null>;\n\n /** Throws `ResumableStreamError(\"missing\")` when the stream does not exist. */\n requireResume(streamId: string): Promise<ReadableStream<Uint8Array>>;\n\n status(streamId: string): Promise<ResumableStreamStatus>;\n\n delete(streamId: string): Promise<void>;\n}\n\nexport function createResumableStreamContext(\n options: ResumableStreamContextOptions,\n): ResumableStreamContext {\n const { store, waitUntil, onAcquire, onAppend, onFinalize, onError } =\n options;\n const acquireOptions =\n options.ttlMs !== undefined ? { ttlMs: options.ttlMs } : undefined;\n\n return {\n async run(streamId, makeStream) {\n const role = await store.acquire(streamId, acquireOptions);\n onAcquire
|
|
1
|
+
{"version":3,"file":"ResumableStreamContext.js","names":[],"sources":["../../src/resumable/ResumableStreamContext.ts"],"sourcesContent":["import { ResumableStreamError } from \"./errors\";\nimport { withPromiseOrValue } from \"../core/utils/withPromiseOrValue\";\nimport type {\n ResumableStreamRole,\n ResumableStreamStatus,\n ResumableStreamStore,\n} from \"./types\";\n\nexport type ResumableStreamContextOptions = {\n readonly store: ResumableStreamStore;\n readonly ttlMs?: number;\n /**\n * Required on serverless runtimes that terminate background work when the\n * request handler returns (Vercel, Cloudflare). Pass `after` from\n * `next/server` so the producer task outlives the response.\n */\n readonly waitUntil?: (promise: Promise<unknown>) => void;\n readonly onAcquire?: (streamId: string, role: ResumableStreamRole) => void;\n readonly onAppend?: (streamId: string, byteLength: number) => void;\n readonly onFinalize?: (\n streamId: string,\n status: \"done\" | \"error\",\n error?: string,\n ) => void;\n readonly onError?: (streamId: string, error: unknown) => void;\n};\n\nexport interface ResumableStreamContext {\n /** Producer or consumer entrypoint. Atomically elects the role. */\n run(\n streamId: string,\n makeStream: () => ReadableStream<Uint8Array>,\n ): Promise<ReadableStream<Uint8Array>>;\n\n /** Returns `null` when the stream does not exist. */\n resume(streamId: string): Promise<ReadableStream<Uint8Array> | null>;\n\n /** Throws `ResumableStreamError(\"missing\")` when the stream does not exist. */\n requireResume(streamId: string): Promise<ReadableStream<Uint8Array>>;\n\n status(streamId: string): Promise<ResumableStreamStatus>;\n\n delete(streamId: string): Promise<void>;\n}\n\nconst invokeObservabilityHook = <TArgs extends unknown[]>(\n name: string,\n hook: ((...args: TArgs) => void) | undefined,\n ...args: TArgs\n): void => {\n if (!hook) return;\n void withPromiseOrValue(\n () => hook(...args),\n () => {},\n (error) => {\n console.error(`resumable stream ${name} hook failed:`, error);\n },\n );\n};\n\nexport function createResumableStreamContext(\n options: ResumableStreamContextOptions,\n): ResumableStreamContext {\n const { store, waitUntil, onAcquire, onAppend, onFinalize, onError } =\n options;\n const acquireOptions =\n options.ttlMs !== undefined ? { ttlMs: options.ttlMs } : undefined;\n\n return {\n async run(streamId, makeStream) {\n const role = await store.acquire(streamId, acquireOptions);\n invokeObservabilityHook(\"onAcquire\", onAcquire, streamId, role);\n if (role === \"producer\") {\n startProducerTask(store, streamId, makeStream, {\n waitUntil,\n onAppend,\n onFinalize,\n onError,\n });\n }\n return readFromStore(store, streamId);\n },\n\n async resume(streamId) {\n const status = await store.status(streamId);\n if (status === \"missing\") return null;\n return readFromStore(store, streamId);\n },\n\n async requireResume(streamId) {\n const status = await store.status(streamId);\n if (status === \"missing\") {\n throw new ResumableStreamError(\n \"missing\",\n `resumable stream not found: ${streamId}`,\n );\n }\n return readFromStore(store, streamId);\n },\n\n async status(streamId) {\n return store.status(streamId);\n },\n\n async delete(streamId) {\n await store.delete(streamId);\n },\n };\n}\n\ntype ProducerHooks = {\n readonly waitUntil: ((promise: Promise<unknown>) => void) | undefined;\n readonly onAppend:\n | ((streamId: string, byteLength: number) => void)\n | undefined;\n readonly onFinalize:\n | ((streamId: string, status: \"done\" | \"error\", error?: string) => void)\n | undefined;\n readonly onError: ((streamId: string, error: unknown) => void) | undefined;\n};\n\nfunction startProducerTask(\n store: ResumableStreamStore,\n streamId: string,\n makeStream: () => ReadableStream<Uint8Array>,\n hooks: ProducerHooks,\n): void {\n const { waitUntil, onAppend, onFinalize, onError } = hooks;\n const task = (async () => {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let cancelled = false;\n try {\n reader = makeStream().getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n await store.append(streamId, value);\n invokeObservabilityHook(\n \"onAppend\",\n onAppend,\n streamId,\n value.byteLength,\n );\n }\n await store.finalize(streamId, \"done\");\n invokeObservabilityHook(\"onFinalize\", onFinalize, streamId, \"done\");\n } catch (err) {\n cancelled = true;\n invokeObservabilityHook(\"onError\", onError, streamId, err);\n const message = err instanceof Error ? err.message : String(err);\n try {\n await reader?.cancel(err);\n } catch (cancelErr) {\n console.error(\"resumable stream reader cancel failed:\", cancelErr);\n }\n try {\n await store.finalize(streamId, \"error\", message);\n invokeObservabilityHook(\n \"onFinalize\",\n onFinalize,\n streamId,\n \"error\",\n message,\n );\n } catch (finalizeErr) {\n console.error(\"resumable stream finalize failed:\", finalizeErr);\n }\n } finally {\n if (!cancelled) reader?.releaseLock();\n }\n })();\n\n if (waitUntil) waitUntil(task);\n task.catch((err) => {\n console.error(\"resumable producer task failed:\", err);\n });\n}\n\nfunction readFromStore(\n store: ResumableStreamStore,\n streamId: string,\n): ReadableStream<Uint8Array> {\n const ac = new AbortController();\n let iterator: AsyncIterator<{ chunk: Uint8Array }> | undefined;\n\n return new ReadableStream<Uint8Array>({\n start() {\n iterator = store.read(streamId, \"\", ac.signal)[Symbol.asyncIterator]();\n },\n async pull(controller) {\n try {\n if (!iterator) return;\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value.chunk);\n } catch (err) {\n // the platform never calls cancel() on errored streams, so unwind\n // the store iterator and abort the signal explicitly.\n ac.abort();\n try {\n await iterator?.return?.();\n } catch {}\n controller.error(err);\n }\n },\n cancel() {\n ac.abort();\n iterator?.return?.().catch(() => {});\n },\n });\n}\n"],"mappings":";;;AA6CA,MAAM,2BACJ,MACA,MACA,GAAG,SACM;CACT,IAAI,CAAC,MAAM;CACX,yBACQ,KAAK,GAAG,IAAI,SACZ,CAAC,IACN,UAAU;EACT,QAAQ,MAAM,oBAAoB,KAAK,gBAAgB,KAAK;CAC9D,CACF;AACF;AAEA,SAAgB,6BACd,SACwB;CACxB,MAAM,EAAE,OAAO,WAAW,WAAW,UAAU,YAAY,YACzD;CACF,MAAM,iBACJ,QAAQ,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,KAAA;CAE3D,OAAO;EACL,MAAM,IAAI,UAAU,YAAY;GAC9B,MAAM,OAAO,MAAM,MAAM,QAAQ,UAAU,cAAc;GACzD,wBAAwB,aAAa,WAAW,UAAU,IAAI;GAC9D,IAAI,SAAS,YACX,kBAAkB,OAAO,UAAU,YAAY;IAC7C;IACA;IACA;IACA;GACF,CAAC;GAEH,OAAO,cAAc,OAAO,QAAQ;EACtC;EAEA,MAAM,OAAO,UAAU;GAErB,IAAI,MADiB,MAAM,OAAO,QAAQ,MAC3B,WAAW,OAAO;GACjC,OAAO,cAAc,OAAO,QAAQ;EACtC;EAEA,MAAM,cAAc,UAAU;GAE5B,IAAI,MADiB,MAAM,OAAO,QAAQ,MAC3B,WACb,MAAM,IAAI,qBACR,WACA,+BAA+B,UACjC;GAEF,OAAO,cAAc,OAAO,QAAQ;EACtC;EAEA,MAAM,OAAO,UAAU;GACrB,OAAO,MAAM,OAAO,QAAQ;EAC9B;EAEA,MAAM,OAAO,UAAU;GACrB,MAAM,MAAM,OAAO,QAAQ;EAC7B;CACF;AACF;AAaA,SAAS,kBACP,OACA,UACA,YACA,OACM;CACN,MAAM,EAAE,WAAW,UAAU,YAAY,YAAY;CACrD,MAAM,QAAQ,YAAY;EACxB,IAAI;EACJ,IAAI,YAAY;EAChB,IAAI;GACF,SAAS,WAAW,CAAC,CAAC,UAAU;GAChC,OAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;IACV,MAAM,MAAM,OAAO,UAAU,KAAK;IAClC,wBACE,YACA,UACA,UACA,MAAM,UACR;GACF;GACA,MAAM,MAAM,SAAS,UAAU,MAAM;GACrC,wBAAwB,cAAc,YAAY,UAAU,MAAM;EACpE,SAAS,KAAK;GACZ,YAAY;GACZ,wBAAwB,WAAW,SAAS,UAAU,GAAG;GACzD,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAC/D,IAAI;IACF,MAAM,QAAQ,OAAO,GAAG;GAC1B,SAAS,WAAW;IAClB,QAAQ,MAAM,0CAA0C,SAAS;GACnE;GACA,IAAI;IACF,MAAM,MAAM,SAAS,UAAU,SAAS,OAAO;IAC/C,wBACE,cACA,YACA,UACA,SACA,OACF;GACF,SAAS,aAAa;IACpB,QAAQ,MAAM,qCAAqC,WAAW;GAChE;EACF,UAAU;GACR,IAAI,CAAC,WAAW,QAAQ,YAAY;EACtC;CACF,EAAA,CAAG;CAEH,IAAI,WAAW,UAAU,IAAI;CAC7B,KAAK,OAAO,QAAQ;EAClB,QAAQ,MAAM,mCAAmC,GAAG;CACtD,CAAC;AACH;AAEA,SAAS,cACP,OACA,UAC4B;CAC5B,MAAM,KAAK,IAAI,gBAAgB;CAC/B,IAAI;CAEJ,OAAO,IAAI,eAA2B;EACpC,QAAQ;GACN,WAAW,MAAM,KAAK,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,cAAc,CAAC;EACvE;EACA,MAAM,KAAK,YAAY;GACrB,IAAI;IACF,IAAI,CAAC,UAAU;IACf,MAAM,EAAE,MAAM,UAAU,MAAM,SAAS,KAAK;IAC5C,IAAI,MAAM;KACR,WAAW,MAAM;KACjB;IACF;IACA,WAAW,QAAQ,MAAM,KAAK;GAChC,SAAS,KAAK;IAGZ,GAAG,MAAM;IACT,IAAI;KACF,MAAM,UAAU,SAAS;IAC3B,QAAQ,CAAC;IACT,WAAW,MAAM,GAAG;GACtB;EACF;EACA,SAAS;GACP,GAAG,MAAM;GACT,UAAU,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;EACrC;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","names":[],"sources":["../../src/resumable/constants.ts"],"mappings":";cAAa
|
|
1
|
+
{"version":3,"file":"constants.d.ts","names":[],"sources":["../../src/resumable/constants.ts"],"mappings":";cAAa"}
|