assistant-stream 0.2.45 → 0.2.47
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/dist/core/AssistantStream.d.ts +1 -1
- package/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStream.js +15 -19
- package/dist/core/AssistantStream.js.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +2 -2
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.js +1 -0
- package/dist/core/AssistantStreamChunk.js.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.d.ts +2 -2
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +45 -50
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts +3 -3
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +339 -329
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/index.d.ts +17 -16
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -44
- package/dist/core/index.js.map +1 -1
- package/dist/core/modules/assistant-stream.d.ts +7 -7
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +159 -188
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.d.ts +2 -2
- package/dist/core/modules/text.d.ts.map +1 -1
- package/dist/core/modules/text.js +43 -47
- package/dist/core/modules/text.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts +5 -5
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +88 -89
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.d.ts +2 -2
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.js +49 -58
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +2 -2
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamResponse.js +70 -74
- package/dist/core/object/ObjectStreamResponse.js.map +1 -1
- package/dist/core/object/createObjectStream.d.ts +2 -2
- package/dist/core/object/createObjectStream.d.ts.map +1 -1
- package/dist/core/object/createObjectStream.js +45 -56
- package/dist/core/object/createObjectStream.js.map +1 -1
- package/dist/core/object/types.d.ts +1 -1
- package/dist/core/object/types.d.ts.map +1 -1
- package/dist/core/object/types.js +1 -0
- package/dist/core/object/types.js.map +1 -1
- package/dist/core/serialization/PlainText.d.ts +3 -3
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/PlainText.js +46 -47
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +3 -3
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +117 -112
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts +3 -3
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +355 -354
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +2 -2
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +22 -26
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +23 -28
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +19 -0
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -0
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +231 -0
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -0
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +78 -0
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -0
- package/dist/core/serialization/ui-message-stream/chunk-types.js +2 -0
- package/dist/core/serialization/ui-message-stream/chunk-types.js.map +1 -0
- package/dist/core/tool/ToolCallReader.d.ts +4 -4
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +303 -303
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +5 -5
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +140 -143
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +1 -1
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js +25 -29
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/index.d.ts +5 -5
- package/dist/core/tool/index.d.ts.map +1 -1
- package/dist/core/tool/index.js +3 -13
- package/dist/core/tool/index.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +3 -3
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/tool-types.js +1 -0
- package/dist/core/tool/tool-types.js.map +1 -1
- package/dist/core/tool/toolResultStream.d.ts +3 -3
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +118 -125
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.js +1 -0
- package/dist/core/tool/type-path-utils.js.map +1 -1
- package/dist/core/utils/Counter.js +6 -10
- package/dist/core/utils/Counter.js.map +1 -1
- package/dist/core/utils/generateId.js +1 -8
- package/dist/core/utils/generateId.js.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.js +42 -43
- package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts +2 -2
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.js +35 -45
- package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +24 -26
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.js +10 -14
- package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +1 -1
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +90 -98
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.js +1 -0
- package/dist/core/utils/stream/UnderlyingReadable.js.map +1 -1
- package/dist/core/utils/stream/merge.d.ts +1 -1
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +169 -81
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts +2 -2
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/core/utils/stream/path-utils.js +49 -56
- package/dist/core/utils/stream/path-utils.js.map +1 -1
- package/dist/core/utils/types.d.ts +1 -1
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/core/utils/types.js +1 -0
- package/dist/core/utils/types.js.map +1 -1
- package/dist/core/utils/withPromiseOrValue.js +14 -14
- package/dist/core/utils/withPromiseOrValue.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/AsyncIterableStream.js +15 -16
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -7
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/json/fix-json.js +365 -343
- package/dist/utils/json/fix-json.js.map +1 -1
- package/dist/utils/json/index.d.ts +1 -1
- package/dist/utils/json/index.d.ts.map +1 -1
- package/dist/utils/json/index.js +1 -0
- package/dist/utils/json/index.js.map +1 -1
- package/dist/utils/json/is-json.d.ts +1 -1
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/is-json.js +21 -25
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/json-value.js +1 -0
- package/dist/utils/json/json-value.js.map +1 -1
- package/dist/utils/json/parse-partial-json-object.d.ts +1 -1
- package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
- package/dist/utils/json/parse-partial-json-object.js +61 -56
- package/dist/utils/json/parse-partial-json-object.js.map +1 -1
- package/dist/utils/promiseWithResolvers.js +10 -13
- package/dist/utils/promiseWithResolvers.js.map +1 -1
- package/dist/utils.d.ts +5 -5
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -17
- package/dist/utils.js.map +1 -1
- package/package.json +26 -14
- package/src/core/index.ts +6 -0
- package/src/core/serialization/ui-message-stream/UIMessageStream.test.ts +370 -0
- package/src/core/serialization/ui-message-stream/UIMessageStream.ts +300 -0
- package/src/core/serialization/ui-message-stream/chunk-types.ts +60 -0
- package/dist/core/object/ObjectStream.test.d.ts +0 -2
- package/dist/core/object/ObjectStream.test.d.ts.map +0 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.test.d.ts +0 -2
- package/dist/core/serialization/assistant-transport/AssistantTransport.test.d.ts.map +0 -1
- package/dist/core/tool/toolResultStream.test.d.ts +0 -2
- package/dist/core/tool/toolResultStream.test.d.ts.map +0 -1
- package/dist/utils/json/parse-partial-json-object.test.d.ts +0 -2
- package/dist/utils/json/parse-partial-json-object.test.d.ts.map +0 -1
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
LineDecoderStream
|
|
26
|
-
};
|
|
1
|
+
export class LineDecoderStream extends TransformStream {
|
|
2
|
+
buffer = "";
|
|
3
|
+
constructor() {
|
|
4
|
+
super({
|
|
5
|
+
transform: (chunk, controller) => {
|
|
6
|
+
this.buffer += chunk;
|
|
7
|
+
const lines = this.buffer.split("\n");
|
|
8
|
+
// Process all complete lines
|
|
9
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
10
|
+
controller.enqueue(lines[i]);
|
|
11
|
+
}
|
|
12
|
+
// Keep the last incomplete line in the buffer
|
|
13
|
+
this.buffer = lines[lines.length - 1] || "";
|
|
14
|
+
},
|
|
15
|
+
flush: () => {
|
|
16
|
+
// If there's content in the buffer when the stream ends, it means
|
|
17
|
+
// the stream ended with an incomplete line (no trailing newline)
|
|
18
|
+
if (this.buffer) {
|
|
19
|
+
throw new Error(`Stream ended with an incomplete line: "${this.buffer}"`);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
27
25
|
//# sourceMappingURL=LineDecoderStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"
|
|
1
|
+
{"version":3,"file":"LineDecoderStream.js","sourceRoot":"","sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,eAA+B;IAC5D,MAAM,GAAG,EAAE,CAAC;IAEpB;QACE,KAAK,CAAC;YACJ,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC/B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEtC,6BAA6B;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACV,kEAAkE;gBAClE,iEAAiE;gBACjE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,MAAM,GAAG,CACzD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
export {
|
|
13
|
-
PipeableTransformStream
|
|
14
|
-
};
|
|
1
|
+
export class PipeableTransformStream extends TransformStream {
|
|
2
|
+
constructor(transform) {
|
|
3
|
+
super();
|
|
4
|
+
const readable = transform(super.readable);
|
|
5
|
+
Object.defineProperty(this, "readable", {
|
|
6
|
+
value: readable,
|
|
7
|
+
writable: false,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
}
|
|
15
11
|
//# sourceMappingURL=PipeableTransformStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/utils/stream/PipeableTransformStream.ts"],"
|
|
1
|
+
{"version":3,"file":"PipeableTransformStream.js","sourceRoot":"","sources":["../../../../src/core/utils/stream/PipeableTransformStream.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAA8B,SAAQ,eAAqB;IACtE,YAAY,SAA6D;QACvE,KAAK,EAAE,CAAC;QACR,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAwC,CAAC,CAAC;QAC3E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;YACtC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PipeableTransformStream } from "./PipeableTransformStream";
|
|
1
|
+
import { PipeableTransformStream } from "./PipeableTransformStream.js";
|
|
2
2
|
export declare class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array<ArrayBuffer>> {
|
|
3
3
|
static readonly headers: Headers;
|
|
4
4
|
headers: Headers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SSE.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/SSE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"SSE.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/SSE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,qCAAkC;AAGpE,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CACxD,CAAC,EACD,UAAU,CAAC,WAAW,CAAC,CACxB;IACC,MAAM,CAAC,QAAQ,CAAC,OAAO,UAIpB;IAEH,OAAO,UAAsB;;CAe9B;AAoED,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CACxD,UAAU,CAAC,WAAW,CAAC,EACvB,CAAC,CACF;;CAsBA"}
|
|
@@ -1,102 +1,94 @@
|
|
|
1
|
-
// src/core/utils/stream/SSE.ts
|
|
2
1
|
import { PipeableTransformStream } from "./PipeableTransformStream.js";
|
|
3
2
|
import { LineDecoderStream } from "./LineDecoderStream.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
headers = _SSEEncoder.headers;
|
|
11
|
-
constructor() {
|
|
12
|
-
super(
|
|
13
|
-
(readable) => readable.pipeThrough(
|
|
14
|
-
new TransformStream({
|
|
15
|
-
transform(chunk, controller) {
|
|
16
|
-
controller.enqueue(`data: ${JSON.stringify(chunk)}
|
|
17
|
-
|
|
18
|
-
`);
|
|
19
|
-
}
|
|
20
|
-
})
|
|
21
|
-
).pipeThrough(new TextEncoderStream())
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
var SSEEventStream = class extends TransformStream {
|
|
26
|
-
constructor() {
|
|
27
|
-
let eventBuffer = {};
|
|
28
|
-
let dataLines = [];
|
|
29
|
-
super({
|
|
30
|
-
start() {
|
|
31
|
-
eventBuffer = {};
|
|
32
|
-
dataLines = [];
|
|
33
|
-
},
|
|
34
|
-
transform(line, controller) {
|
|
35
|
-
if (line.startsWith(":")) return;
|
|
36
|
-
if (line === "") {
|
|
37
|
-
if (dataLines.length > 0) {
|
|
38
|
-
controller.enqueue({
|
|
39
|
-
event: eventBuffer.event || "message",
|
|
40
|
-
data: dataLines.join("\n"),
|
|
41
|
-
id: eventBuffer.id,
|
|
42
|
-
retry: eventBuffer.retry
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
eventBuffer = {};
|
|
46
|
-
dataLines = [];
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const [field, ...rest] = line.split(":");
|
|
50
|
-
const value = rest.join(":").trimStart();
|
|
51
|
-
switch (field) {
|
|
52
|
-
case "event":
|
|
53
|
-
eventBuffer.event = value;
|
|
54
|
-
break;
|
|
55
|
-
case "data":
|
|
56
|
-
dataLines.push(value);
|
|
57
|
-
break;
|
|
58
|
-
case "id":
|
|
59
|
-
eventBuffer.id = value;
|
|
60
|
-
break;
|
|
61
|
-
case "retry":
|
|
62
|
-
eventBuffer.retry = Number(value);
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
flush(controller) {
|
|
67
|
-
if (dataLines.length > 0) {
|
|
68
|
-
controller.enqueue({
|
|
69
|
-
event: eventBuffer.event || "message",
|
|
70
|
-
data: dataLines.join("\n"),
|
|
71
|
-
id: eventBuffer.id,
|
|
72
|
-
retry: eventBuffer.retry
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
}
|
|
3
|
+
export class SSEEncoder extends PipeableTransformStream {
|
|
4
|
+
static headers = new Headers({
|
|
5
|
+
"Content-Type": "text/event-stream",
|
|
6
|
+
"Cache-Control": "no-cache",
|
|
7
|
+
Connection: "keep-alive",
|
|
76
8
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
9
|
+
headers = SSEEncoder.headers;
|
|
10
|
+
constructor() {
|
|
11
|
+
super((readable) => readable
|
|
12
|
+
.pipeThrough(new TransformStream({
|
|
13
|
+
transform(chunk, controller) {
|
|
14
|
+
controller.enqueue(`data: ${JSON.stringify(chunk)}\n\n`);
|
|
15
|
+
},
|
|
16
|
+
}))
|
|
17
|
+
.pipeThrough(new TextEncoderStream()));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class SSEEventStream extends TransformStream {
|
|
21
|
+
constructor() {
|
|
22
|
+
let eventBuffer = {};
|
|
23
|
+
let dataLines = [];
|
|
24
|
+
super({
|
|
25
|
+
start() {
|
|
26
|
+
eventBuffer = {};
|
|
27
|
+
dataLines = [];
|
|
28
|
+
},
|
|
29
|
+
transform(line, controller) {
|
|
30
|
+
if (line.startsWith(":"))
|
|
31
|
+
return; // Ignore comments
|
|
32
|
+
if (line === "") {
|
|
33
|
+
if (dataLines.length > 0) {
|
|
34
|
+
controller.enqueue({
|
|
35
|
+
event: eventBuffer.event || "message",
|
|
36
|
+
data: dataLines.join("\n"),
|
|
37
|
+
id: eventBuffer.id,
|
|
38
|
+
retry: eventBuffer.retry,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
eventBuffer = {};
|
|
42
|
+
dataLines = [];
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const [field, ...rest] = line.split(":");
|
|
46
|
+
const value = rest.join(":").trimStart();
|
|
47
|
+
switch (field) {
|
|
48
|
+
case "event":
|
|
49
|
+
eventBuffer.event = value;
|
|
50
|
+
break;
|
|
51
|
+
case "data":
|
|
52
|
+
dataLines.push(value);
|
|
53
|
+
break;
|
|
54
|
+
case "id":
|
|
55
|
+
eventBuffer.id = value;
|
|
56
|
+
break;
|
|
57
|
+
case "retry":
|
|
58
|
+
eventBuffer.retry = Number(value);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
flush(controller) {
|
|
63
|
+
if (dataLines.length > 0) {
|
|
64
|
+
controller.enqueue({
|
|
65
|
+
event: eventBuffer.event || "message",
|
|
66
|
+
data: dataLines.join("\n"),
|
|
67
|
+
id: eventBuffer.id,
|
|
68
|
+
retry: eventBuffer.retry,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class SSEDecoder extends PipeableTransformStream {
|
|
76
|
+
constructor() {
|
|
77
|
+
super((readable) => readable
|
|
78
|
+
.pipeThrough(new TextDecoderStream())
|
|
79
|
+
.pipeThrough(new LineDecoderStream())
|
|
80
|
+
.pipeThrough(new SSEEventStream())
|
|
81
|
+
.pipeThrough(new TransformStream({
|
|
82
|
+
transform(event, controller) {
|
|
83
|
+
switch (event.event) {
|
|
84
|
+
case "message":
|
|
85
|
+
controller.enqueue(JSON.parse(event.data));
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
throw new Error(`Unknown SSE event type: ${event.event}`);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
})));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
102
94
|
//# sourceMappingURL=SSE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/utils/stream/SSE.ts"],"
|
|
1
|
+
{"version":3,"file":"SSE.js","sourceRoot":"","sources":["../../../../src/core/utils/stream/SSE.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"UnderlyingReadable.js","sourceRoot":"","sources":["../../../../src/core/utils/stream/UnderlyingReadable.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,sCAAmC;AAQlE,eAAO,MAAM,iBAAiB;;;;sBA0ER,cAAc,CAAC,oBAAoB,CAAC;mBAUvC,oBAAoB;CAWtC,CAAC"}
|
|
@@ -1,85 +1,173 @@
|
|
|
1
|
-
// src/core/utils/stream/merge.ts
|
|
2
1
|
import { promiseWithResolvers } from "../../../utils/promiseWithResolvers.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
export const createMergeStream = () => {
|
|
3
|
+
const list = [];
|
|
4
|
+
let sealed = false;
|
|
5
|
+
let controller;
|
|
6
|
+
let currentPull;
|
|
7
|
+
const handlePull = (item) => {
|
|
8
|
+
if (!item.promise) {
|
|
9
|
+
// TODO for most streams, we can directly pipeTo to avoid the microTask queue
|
|
10
|
+
// add an option to eagerly pipe the stream to the merge stream
|
|
11
|
+
// ideally, using assistant-stream w sync run method + piping to a sync WritableStream runs in the same microtask
|
|
12
|
+
// this is useful because we often use AssistantStreams internally as a serialization utility, e. g. AssistantTransformStream
|
|
13
|
+
// idea: avoid reader.read() by instead using a WritableStream & if (!hasPendingPull) await waitForPull()?
|
|
14
|
+
item.promise = item.reader
|
|
15
|
+
.read()
|
|
16
|
+
.then(({ done, value }) => {
|
|
17
|
+
item.promise = undefined;
|
|
18
|
+
if (done) {
|
|
19
|
+
list.splice(list.indexOf(item), 1);
|
|
20
|
+
if (sealed && list.length === 0) {
|
|
21
|
+
controller.close();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
controller.enqueue(value);
|
|
26
|
+
}
|
|
27
|
+
currentPull?.resolve();
|
|
28
|
+
currentPull = undefined;
|
|
29
|
+
})
|
|
30
|
+
.catch((e) => {
|
|
31
|
+
console.error(e);
|
|
32
|
+
list.forEach((item) => {
|
|
33
|
+
item.reader.cancel();
|
|
34
|
+
});
|
|
35
|
+
list.length = 0;
|
|
36
|
+
controller.error(e);
|
|
37
|
+
currentPull?.reject(e);
|
|
38
|
+
currentPull = undefined;
|
|
39
|
+
});
|
|
19
40
|
}
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
);
|
|
66
|
-
const item = { reader: stream.getReader() };
|
|
67
|
-
list.push(item);
|
|
68
|
-
handlePull(item);
|
|
69
|
-
},
|
|
70
|
-
enqueue(chunk) {
|
|
71
|
-
this.addStream(
|
|
72
|
-
new ReadableStream({
|
|
73
|
-
start(c) {
|
|
74
|
-
c.enqueue(chunk);
|
|
75
|
-
c.close();
|
|
76
|
-
}
|
|
77
|
-
})
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
export {
|
|
83
|
-
createMergeStream
|
|
41
|
+
};
|
|
42
|
+
const readable = new ReadableStream({
|
|
43
|
+
start(c) {
|
|
44
|
+
controller = c;
|
|
45
|
+
},
|
|
46
|
+
pull() {
|
|
47
|
+
currentPull = promiseWithResolvers();
|
|
48
|
+
list.forEach((item) => {
|
|
49
|
+
handlePull(item);
|
|
50
|
+
});
|
|
51
|
+
return currentPull.promise;
|
|
52
|
+
},
|
|
53
|
+
cancel() {
|
|
54
|
+
list.forEach((item) => {
|
|
55
|
+
item.reader.cancel();
|
|
56
|
+
});
|
|
57
|
+
list.length = 0;
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
readable,
|
|
62
|
+
isSealed() {
|
|
63
|
+
return sealed;
|
|
64
|
+
},
|
|
65
|
+
seal() {
|
|
66
|
+
sealed = true;
|
|
67
|
+
if (list.length === 0)
|
|
68
|
+
controller.close();
|
|
69
|
+
},
|
|
70
|
+
addStream(stream) {
|
|
71
|
+
if (sealed)
|
|
72
|
+
throw new Error("Cannot add streams after the run callback has settled.");
|
|
73
|
+
const item = { reader: stream.getReader() };
|
|
74
|
+
list.push(item);
|
|
75
|
+
handlePull(item);
|
|
76
|
+
},
|
|
77
|
+
enqueue(chunk) {
|
|
78
|
+
this.addStream(new ReadableStream({
|
|
79
|
+
start(c) {
|
|
80
|
+
c.enqueue(chunk);
|
|
81
|
+
c.close();
|
|
82
|
+
},
|
|
83
|
+
}));
|
|
84
|
+
},
|
|
85
|
+
};
|
|
84
86
|
};
|
|
87
|
+
// TODO
|
|
88
|
+
// export class SpanContainerMerger {
|
|
89
|
+
// public get isSealed() {
|
|
90
|
+
// return this.mergeStream.isSealed();
|
|
91
|
+
// }
|
|
92
|
+
// public get readable() {
|
|
93
|
+
// return this.mergeStream.readable;
|
|
94
|
+
// }
|
|
95
|
+
// private subAllocator = new Counter();
|
|
96
|
+
// private mergeStream = createMergeStream();
|
|
97
|
+
// constructor() {
|
|
98
|
+
// // id 0 is auto allocated
|
|
99
|
+
// this.subAllocator.up();
|
|
100
|
+
// }
|
|
101
|
+
// add(stream: ReadableStream<AssistantStreamChunk>) {
|
|
102
|
+
// this.mergeStream.addStream(
|
|
103
|
+
// stream.pipeThrough(new SpanParentEncoder(this.subAllocator)),
|
|
104
|
+
// );
|
|
105
|
+
// }
|
|
106
|
+
// enqueue(chunk: AssistantStreamChunk & { parentId: 0 }) {
|
|
107
|
+
// this.mergeStream.addStream(
|
|
108
|
+
// new ReadableStream({
|
|
109
|
+
// start(c) {
|
|
110
|
+
// c.enqueue(chunk);
|
|
111
|
+
// c.close();
|
|
112
|
+
// },
|
|
113
|
+
// }),
|
|
114
|
+
// );
|
|
115
|
+
// }
|
|
116
|
+
// seal() {
|
|
117
|
+
// this.mergeStream.seal();
|
|
118
|
+
// }
|
|
119
|
+
// }
|
|
120
|
+
// export class SpanContainerSplitter {
|
|
121
|
+
// public writable;
|
|
122
|
+
// private isSealed = false;
|
|
123
|
+
// private writers = new Map<
|
|
124
|
+
// number,
|
|
125
|
+
// WritableStreamDefaultWriter<AssistantStreamChunk>
|
|
126
|
+
// >();
|
|
127
|
+
// private closeTasks: Promise<void>[] = [];
|
|
128
|
+
// private allocator = new Counter();
|
|
129
|
+
// private subAllocator = new Counter();
|
|
130
|
+
// constructor() {
|
|
131
|
+
// // id 0 is auto-allocated
|
|
132
|
+
// this.allocator.up();
|
|
133
|
+
// this.writable = new WritableStream({
|
|
134
|
+
// write: (chunk) => {
|
|
135
|
+
// const { type, parentId } = chunk;
|
|
136
|
+
// const writer = this.writers.get(parentId);
|
|
137
|
+
// if (writer === undefined) throw new Error("Parent id not found");
|
|
138
|
+
// writer.write(chunk);
|
|
139
|
+
// if (type === "span") {
|
|
140
|
+
// // allocate a new span id
|
|
141
|
+
// this.writers.set(this.allocator.up(), writer);
|
|
142
|
+
// }
|
|
143
|
+
// if (type === "finish") {
|
|
144
|
+
// this.writers.delete(parentId);
|
|
145
|
+
// writer.close();
|
|
146
|
+
// if (this.writers.size === 0) {
|
|
147
|
+
// const closeTask = this.writable.close();
|
|
148
|
+
// this.closeTasks.push(closeTask);
|
|
149
|
+
// closeTask.then(() => {
|
|
150
|
+
// this.closeTasks.splice(this.closeTasks.indexOf(closeTask), 1);
|
|
151
|
+
// });
|
|
152
|
+
// }
|
|
153
|
+
// }
|
|
154
|
+
// },
|
|
155
|
+
// close: async () => {
|
|
156
|
+
// if (this.writers.size > 0) throw new Error("Not all writers closed");
|
|
157
|
+
// // await and throw on any errors
|
|
158
|
+
// await Promise.all(this.closeTasks);
|
|
159
|
+
// },
|
|
160
|
+
// });
|
|
161
|
+
// }
|
|
162
|
+
// add(stream: WritableStream<AssistantStreamChunk>) {
|
|
163
|
+
// if (this.isSealed) throw new Error("Cannot add streams after sealing");
|
|
164
|
+
// const decoder = new SpanParentDecoder(this.subAllocator);
|
|
165
|
+
// decoder.readable.pipeTo(stream);
|
|
166
|
+
// this.writers.set(this.allocator.up(), decoder.writable.getWriter());
|
|
167
|
+
// }
|
|
168
|
+
// seal() {
|
|
169
|
+
// this.isSealed = true;
|
|
170
|
+
// if (this.writers.size === 0) this.writable.close();
|
|
171
|
+
// }
|
|
172
|
+
// }
|
|
85
173
|
//# sourceMappingURL=merge.js.map
|