assistant-stream 0.3.15 → 0.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/core/AssistantStream.d.ts +35 -31
- package/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStream.js +39 -37
- package/dist/core/AssistantStream.js.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +71 -78
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.js +0 -2
- package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +52 -48
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/TimingTracker.d.ts +15 -11
- package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
- package/dist/core/accumulators/TimingTracker.js +36 -43
- package/dist/core/accumulators/TimingTracker.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/converters/toGenericMessages.d.ts +49 -47
- package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
- package/dist/core/converters/toGenericMessages.js +122 -136
- package/dist/core/converters/toGenericMessages.js.map +1 -1
- package/dist/core/modules/assistant-stream.d.ts +62 -66
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +174 -182
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.d.ts +11 -7
- package/dist/core/modules/text.d.ts.map +1 -1
- package/dist/core/modules/text.js +45 -45
- package/dist/core/modules/text.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts +15 -11
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +81 -96
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.js +44 -52
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamResponse.js +52 -71
- package/dist/core/object/ObjectStreamResponse.js.map +1 -1
- package/dist/core/object/createObjectStream.d.ts +14 -8
- package/dist/core/object/createObjectStream.d.ts.map +1 -1
- package/dist/core/object/createObjectStream.js +50 -47
- package/dist/core/object/createObjectStream.js.map +1 -1
- package/dist/core/object/types.d.ts +14 -11
- package/dist/core/object/types.d.ts.map +1 -1
- package/dist/core/object/types.js +0 -2
- package/dist/core/serialization/PlainText.d.ts +11 -7
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/PlainText.js +40 -48
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +320 -371
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +27 -23
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +23 -24
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
- package/dist/core/tool/ToolCallReader.d.ts +34 -30
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +264 -317
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +123 -146
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +41 -41
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js +50 -56
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/schema-utils.d.ts +19 -15
- package/dist/core/tool/schema-utils.d.ts.map +1 -1
- package/dist/core/tool/schema-utils.js +50 -84
- package/dist/core/tool/schema-utils.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +103 -122
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/tool-types.js +0 -2
- package/dist/core/tool/toolResultStream.d.ts +11 -9
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +127 -157
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.d.ts +8 -19
- package/dist/core/tool/type-path-utils.d.ts.map +1 -1
- package/dist/core/tool/type-path-utils.js +0 -2
- package/dist/core/utils/Counter.d.ts +6 -3
- package/dist/core/utils/Counter.d.ts.map +1 -1
- package/dist/core/utils/Counter.js +10 -6
- package/dist/core/utils/Counter.js.map +1 -1
- package/dist/core/utils/generateId.d.ts +4 -1
- package/dist/core/utils/generateId.d.ts.map +1 -1
- package/dist/core/utils/generateId.js +5 -1
- package/dist/core/utils/generateId.js.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
- package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
- package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
- package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +23 -26
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
- package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
- package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +10 -6
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +79 -91
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
- package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
- package/dist/core/utils/stream/merge.d.ts +11 -7
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +68 -170
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts +11 -7
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/core/utils/stream/path-utils.js +46 -52
- package/dist/core/utils/stream/path-utils.js.map +1 -1
- package/dist/core/utils/types.d.ts +109 -113
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/core/utils/types.js +0 -2
- package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
- package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
- package/dist/core/utils/withPromiseOrValue.js +12 -15
- package/dist/core/utils/withPromiseOrValue.js.map +1 -1
- package/dist/index.d.ts +23 -24
- package/dist/index.js +16 -16
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
- package/dist/resumable/ResumableStreamContext.d.ts +28 -24
- package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.js +99 -114
- package/dist/resumable/ResumableStreamContext.js.map +1 -1
- package/dist/resumable/constants.d.ts +4 -1
- package/dist/resumable/constants.d.ts.map +1 -1
- package/dist/resumable/constants.js +5 -1
- package/dist/resumable/constants.js.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
- package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
- package/dist/resumable/errors.d.ts +8 -5
- package/dist/resumable/errors.d.ts.map +1 -1
- package/dist/resumable/errors.js +14 -12
- package/dist/resumable/errors.js.map +1 -1
- package/dist/resumable/index.d.ts +7 -7
- package/dist/resumable/index.js +5 -5
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
- package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
- package/dist/resumable/stores/ioredis.d.ts +9 -5
- package/dist/resumable/stores/ioredis.d.ts.map +1 -1
- package/dist/resumable/stores/ioredis.js +70 -82
- package/dist/resumable/stores/ioredis.js.map +1 -1
- package/dist/resumable/stores/redis-impl.d.ts +51 -48
- package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
- package/dist/resumable/stores/redis-impl.js +176 -176
- package/dist/resumable/stores/redis-impl.js.map +1 -1
- package/dist/resumable/stores/redis.d.ts +31 -28
- package/dist/resumable/stores/redis.d.ts.map +1 -1
- package/dist/resumable/stores/redis.js +87 -95
- package/dist/resumable/stores/redis.js.map +1 -1
- package/dist/resumable/types.d.ts +29 -26
- package/dist/resumable/types.d.ts.map +1 -1
- package/dist/resumable/types.js +0 -2
- package/dist/utils/AsyncIterableStream.d.ts +5 -2
- package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.js +17 -16
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/json/fix-json.d.ts +4 -1
- package/dist/utils/json/fix-json.d.ts.map +1 -1
- package/dist/utils/json/fix-json.js +286 -380
- package/dist/utils/json/fix-json.js.map +1 -1
- package/dist/utils/json/is-json.d.ts +8 -4
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/is-json.js +13 -21
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/json-value.d.ts +7 -4
- package/dist/utils/json/json-value.d.ts.map +1 -1
- package/dist/utils/json/json-value.js +0 -2
- package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
- package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
- package/dist/utils/json/parse-partial-json-object.js +50 -62
- package/dist/utils/json/parse-partial-json-object.js.map +1 -1
- package/dist/utils/promiseWithResolvers.d.ts +7 -4
- package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
- package/dist/utils/promiseWithResolvers.js +17 -10
- package/dist/utils/promiseWithResolvers.js.map +1 -1
- package/dist/utils.d.ts +6 -6
- package/dist/utils.js +5 -5
- package/package.json +3 -3
- package/dist/core/AssistantStreamChunk.js.map +0 -1
- package/dist/core/object/types.js.map +0 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
- package/dist/core/tool/tool-types.js.map +0 -1
- package/dist/core/tool/type-path-utils.js.map +0 -1
- package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
- package/dist/core/utils/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resumable/index.d.ts.map +0 -1
- package/dist/resumable/index.js.map +0 -1
- package/dist/resumable/types.js.map +0 -1
- package/dist/utils/json/json-value.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
|
@@ -1,27 +1,31 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { ResumableStreamRole, ResumableStreamStatus, ResumableStreamStore } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/resumable/ResumableStreamContext.d.ts
|
|
4
|
+
type ResumableStreamContextOptions = {
|
|
5
|
+
readonly store: ResumableStreamStore;
|
|
6
|
+
readonly ttlMs?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Required on serverless runtimes that terminate background work when the
|
|
9
|
+
* request handler returns (Vercel, Cloudflare). Pass `after` from
|
|
10
|
+
* `next/server` so the producer task outlives the response.
|
|
11
|
+
*/
|
|
12
|
+
readonly waitUntil?: (promise: Promise<unknown>) => void;
|
|
13
|
+
readonly onAcquire?: (streamId: string, role: ResumableStreamRole) => void;
|
|
14
|
+
readonly onAppend?: (streamId: string, byteLength: number) => void;
|
|
15
|
+
readonly onFinalize?: (streamId: string, status: "done" | "error", error?: string) => void;
|
|
16
|
+
readonly onError?: (streamId: string, error: unknown) => void;
|
|
15
17
|
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
interface ResumableStreamContext {
|
|
19
|
+
/** Producer or consumer entrypoint. Atomically elects the role. */
|
|
20
|
+
run(streamId: string, makeStream: () => ReadableStream<Uint8Array>): Promise<ReadableStream<Uint8Array>>;
|
|
21
|
+
/** Returns `null` when the stream does not exist. */
|
|
22
|
+
resume(streamId: string): Promise<ReadableStream<Uint8Array> | null>;
|
|
23
|
+
/** Throws `ResumableStreamError("missing")` when the stream does not exist. */
|
|
24
|
+
requireResume(streamId: string): Promise<ReadableStream<Uint8Array>>;
|
|
25
|
+
status(streamId: string): Promise<ResumableStreamStatus>;
|
|
26
|
+
delete(streamId: string): Promise<void>;
|
|
25
27
|
}
|
|
26
|
-
|
|
28
|
+
declare function createResumableStreamContext(options: ResumableStreamContextOptions): ResumableStreamContext;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { ResumableStreamContext, ResumableStreamContextOptions, createResumableStreamContext };
|
|
27
31
|
//# sourceMappingURL=ResumableStreamContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResumableStreamContext.d.ts","
|
|
1
|
+
{"version":3,"file":"ResumableStreamContext.d.ts","names":[],"sources":["../../src/resumable/ResumableStreamContext.ts"],"mappings":";;;KAOY,6BAAA;EAAA,SACD,KAAA,EAAO,oBAAA;EAAA,SACP,KAAA;EAF8B;;;;;EAAA,SAQ9B,SAAA,IAAa,OAAA,EAAS,OAAA;EAAA,SACtB,SAAA,IAAa,QAAA,UAAkB,IAAA,EAAM,mBAAA;EAAA,SACrC,QAAA,IAAY,QAAA,UAAkB,UAAA;EAAA,SAC9B,UAAA,IACP,QAAA,UACA,MAAA,oBACA,KAAA;EAAA,SAEO,OAAA,IAAW,QAAA,UAAkB,KAAA;AAAA;AAAA,UAGvB,sBAAA;EAXO;EAatB,GAAA,CACE,QAAA,UACA,UAAA,QAAkB,cAAA,CAAe,UAAA,IAChC,OAAA,CAAQ,cAAA,CAAe,UAAA;EAfJ;EAkBtB,MAAA,CAAO,QAAA,WAAmB,OAAA,CAAQ,cAAA,CAAe,UAAA;EAlBT;EAqBxC,aAAA,CAAc,QAAA,WAAmB,OAAA,CAAQ,cAAA,CAAe,UAAA;EAExD,MAAA,CAAO,QAAA,WAAmB,OAAA,CAAQ,qBAAA;EAElC,MAAA,CAAO,QAAA,WAAmB,OAAA;AAAA;AAAA,iBAGZ,4BAAA,CACd,OAAA,EAAS,6BAAA,GACR,sBAAsB"}
|
|
@@ -1,121 +1,106 @@
|
|
|
1
1
|
import { ResumableStreamError } from "./errors.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return store.status(streamId);
|
|
34
|
-
},
|
|
35
|
-
async delete(streamId) {
|
|
36
|
-
await store.delete(streamId);
|
|
37
|
-
},
|
|
38
|
-
};
|
|
2
|
+
//#region src/resumable/ResumableStreamContext.ts
|
|
3
|
+
function createResumableStreamContext(options) {
|
|
4
|
+
const { store, waitUntil, onAcquire, onAppend, onFinalize, onError } = options;
|
|
5
|
+
const acquireOptions = options.ttlMs !== void 0 ? { ttlMs: options.ttlMs } : void 0;
|
|
6
|
+
return {
|
|
7
|
+
async run(streamId, makeStream) {
|
|
8
|
+
const role = await store.acquire(streamId, acquireOptions);
|
|
9
|
+
onAcquire?.(streamId, role);
|
|
10
|
+
if (role === "producer") startProducerTask(store, streamId, makeStream, {
|
|
11
|
+
waitUntil,
|
|
12
|
+
onAppend,
|
|
13
|
+
onFinalize,
|
|
14
|
+
onError
|
|
15
|
+
});
|
|
16
|
+
return readFromStore(store, streamId);
|
|
17
|
+
},
|
|
18
|
+
async resume(streamId) {
|
|
19
|
+
if (await store.status(streamId) === "missing") return null;
|
|
20
|
+
return readFromStore(store, streamId);
|
|
21
|
+
},
|
|
22
|
+
async requireResume(streamId) {
|
|
23
|
+
if (await store.status(streamId) === "missing") throw new ResumableStreamError("missing", `resumable stream not found: ${streamId}`);
|
|
24
|
+
return readFromStore(store, streamId);
|
|
25
|
+
},
|
|
26
|
+
async status(streamId) {
|
|
27
|
+
return store.status(streamId);
|
|
28
|
+
},
|
|
29
|
+
async delete(streamId) {
|
|
30
|
+
await store.delete(streamId);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
39
33
|
}
|
|
40
34
|
function startProducerTask(store, streamId, makeStream, hooks) {
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
})();
|
|
80
|
-
if (waitUntil)
|
|
81
|
-
waitUntil(task);
|
|
82
|
-
task.catch((err) => {
|
|
83
|
-
console.error("resumable producer task failed:", err);
|
|
84
|
-
});
|
|
35
|
+
const { waitUntil, onAppend, onFinalize, onError } = hooks;
|
|
36
|
+
const task = (async () => {
|
|
37
|
+
let reader;
|
|
38
|
+
let cancelled = false;
|
|
39
|
+
try {
|
|
40
|
+
reader = makeStream().getReader();
|
|
41
|
+
while (true) {
|
|
42
|
+
const { done, value } = await reader.read();
|
|
43
|
+
if (done) break;
|
|
44
|
+
await store.append(streamId, value);
|
|
45
|
+
onAppend?.(streamId, value.byteLength);
|
|
46
|
+
}
|
|
47
|
+
await store.finalize(streamId, "done");
|
|
48
|
+
onFinalize?.(streamId, "done");
|
|
49
|
+
} catch (err) {
|
|
50
|
+
cancelled = true;
|
|
51
|
+
onError?.(streamId, err);
|
|
52
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
53
|
+
try {
|
|
54
|
+
await reader?.cancel(err);
|
|
55
|
+
} catch (cancelErr) {
|
|
56
|
+
console.error("resumable stream reader cancel failed:", cancelErr);
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await store.finalize(streamId, "error", message);
|
|
60
|
+
onFinalize?.(streamId, "error", message);
|
|
61
|
+
} catch (finalizeErr) {
|
|
62
|
+
console.error("resumable stream finalize failed:", finalizeErr);
|
|
63
|
+
}
|
|
64
|
+
} finally {
|
|
65
|
+
if (!cancelled) reader?.releaseLock();
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
if (waitUntil) waitUntil(task);
|
|
69
|
+
task.catch((err) => {
|
|
70
|
+
console.error("resumable producer task failed:", err);
|
|
71
|
+
});
|
|
85
72
|
}
|
|
86
73
|
function readFromStore(store, streamId) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
cancel() {
|
|
116
|
-
ac.abort();
|
|
117
|
-
iterator?.return?.().catch(() => { });
|
|
118
|
-
},
|
|
119
|
-
});
|
|
74
|
+
const ac = new AbortController();
|
|
75
|
+
let iterator;
|
|
76
|
+
return new ReadableStream({
|
|
77
|
+
start() {
|
|
78
|
+
iterator = store.read(streamId, "", ac.signal)[Symbol.asyncIterator]();
|
|
79
|
+
},
|
|
80
|
+
async pull(controller) {
|
|
81
|
+
try {
|
|
82
|
+
if (!iterator) return;
|
|
83
|
+
const { done, value } = await iterator.next();
|
|
84
|
+
if (done) {
|
|
85
|
+
controller.close();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
controller.enqueue(value.chunk);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
ac.abort();
|
|
91
|
+
try {
|
|
92
|
+
await iterator?.return?.();
|
|
93
|
+
} catch {}
|
|
94
|
+
controller.error(err);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
cancel() {
|
|
98
|
+
ac.abort();
|
|
99
|
+
iterator?.return?.().catch(() => {});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
120
102
|
}
|
|
103
|
+
//#endregion
|
|
104
|
+
export { createResumableStreamContext };
|
|
105
|
+
|
|
121
106
|
//# sourceMappingURL=ResumableStreamContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResumableStreamContext.js","
|
|
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?.(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 onAppend?.(streamId, value.byteLength);\n }\n await store.finalize(streamId, \"done\");\n onFinalize?.(streamId, \"done\");\n } catch (err) {\n cancelled = true;\n 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 onFinalize?.(streamId, \"error\", message);\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":";;AA4CA,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,YAAY,UAAU,IAAI;GAC1B,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,EAAE,UAAU;GAChC,OAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;IACV,MAAM,MAAM,OAAO,UAAU,KAAK;IAClC,WAAW,UAAU,MAAM,UAAU;GACvC;GACA,MAAM,MAAM,SAAS,UAAU,MAAM;GACrC,aAAa,UAAU,MAAM;EAC/B,SAAS,KAAK;GACZ,YAAY;GACZ,UAAU,UAAU,GAAG;GACvB,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,aAAa,UAAU,SAAS,OAAO;GACzC,SAAS,aAAa;IACpB,QAAQ,MAAM,qCAAqC,WAAW;GAChE;EACF,UAAU;GACR,IAAI,CAAC,WAAW,QAAQ,YAAY;EACtC;CACF,GAAG;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,EAAE,OAAO,eAAe;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,EAAE,YAAY,CAAC,CAAC;EACrC;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","
|
|
1
|
+
{"version":3,"file":"constants.d.ts","names":[],"sources":["../../src/resumable/constants.ts"],"mappings":";cAAa,cAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../src/resumable/constants.ts"],"sourcesContent":["export const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n"],"mappings":";AAAA,MAAa,iBAAiB,OAAU,KAAK"}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { AssistantStreamController } from "../core/modules/assistant-stream.js";
|
|
2
|
+
import { AssistantStreamEncoder } from "../core/AssistantStream.js";
|
|
3
|
+
import { ResumableStreamContext } from "./ResumableStreamContext.js";
|
|
4
|
+
|
|
5
|
+
//#region src/resumable/createResumableAssistantStreamResponse.d.ts
|
|
6
|
+
declare const RESUMABLE_STREAM_ID_HEADER = "x-resumable-stream-id";
|
|
7
|
+
type CreateResumableAssistantStreamResponseOptions = {
|
|
8
|
+
readonly context: ResumableStreamContext;
|
|
9
|
+
readonly streamId: string;
|
|
10
|
+
readonly callback: (controller: AssistantStreamController) => PromiseLike<void> | void; /** Defaults to `DataStreamEncoder`. Also consulted for response headers. */
|
|
11
|
+
readonly encoder?: () => AssistantStreamEncoder;
|
|
12
|
+
readonly headers?: HeadersInit;
|
|
12
13
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/** Defaults to a 404 JSON response. */
|
|
21
|
-
readonly missingResponse?: () => Response;
|
|
14
|
+
declare function createResumableAssistantStreamResponse(options: CreateResumableAssistantStreamResponseOptions): Promise<Response>;
|
|
15
|
+
type CreateResumeAssistantStreamResponseOptions = {
|
|
16
|
+
readonly context: ResumableStreamContext;
|
|
17
|
+
readonly streamId: string; /** Read for `headers` only; the encoder transform is not invoked on resume. */
|
|
18
|
+
readonly encoder?: () => AssistantStreamEncoder;
|
|
19
|
+
readonly headers?: HeadersInit; /** Defaults to a 404 JSON response. */
|
|
20
|
+
readonly missingResponse?: () => Response;
|
|
22
21
|
};
|
|
23
|
-
|
|
22
|
+
declare function createResumeAssistantStreamResponse(options: CreateResumeAssistantStreamResponseOptions): Promise<Response>;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { CreateResumableAssistantStreamResponseOptions, CreateResumeAssistantStreamResponseOptions, RESUMABLE_STREAM_ID_HEADER, createResumableAssistantStreamResponse, createResumeAssistantStreamResponse };
|
|
24
25
|
//# sourceMappingURL=createResumableAssistantStreamResponse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createResumableAssistantStreamResponse.d.ts","
|
|
1
|
+
{"version":3,"file":"createResumableAssistantStreamResponse.d.ts","names":[],"sources":["../../src/resumable/createResumableAssistantStreamResponse.ts"],"mappings":";;;;;cAQa,0BAAA;AAAA,KAED,6CAAA;EAAA,SACD,OAAA,EAAS,sBAAA;EAAA,SACT,QAAA;EAAA,SACA,QAAA,GACP,UAAA,EAAY,yBAAA,KACT,WAAA,eAPgC;EAAA,SAS5B,OAAA,SAAgB,sBAAA;EAAA,SAChB,OAAA,GAAU,WAAA;AAAA;AAAA,iBAGC,sCAAA,CACpB,OAAA,EAAS,6CAAA,GACR,OAAA,CAAQ,QAAA;AAAA,KAaC,0CAAA;EAAA,SACD,OAAA,EAAS,sBAAA;EAAA,SACT,QAAA,UArBgB;EAAA,SAuBhB,OAAA,SAAgB,sBAAA;EAAA,SAChB,OAAA,GAAU,WAAA,EAvBW;EAAA,SAyBrB,eAAA,SAAwB,QAAA;AAAA;AAAA,iBAGb,mCAAA,CACpB,OAAA,EAAS,0CAAA,GACR,OAAA,CAAQ,QAAA"}
|
|
@@ -1,40 +1,33 @@
|
|
|
1
|
-
import { createAssistantStream, } from "../core/modules/assistant-stream.js";
|
|
2
1
|
import { DataStreamEncoder } from "../core/serialization/data-stream/DataStream.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
2
|
+
import { createAssistantStream } from "../core/modules/assistant-stream.js";
|
|
3
|
+
//#region src/resumable/createResumableAssistantStreamResponse.ts
|
|
4
|
+
const RESUMABLE_STREAM_ID_HEADER = "x-resumable-stream-id";
|
|
5
|
+
async function createResumableAssistantStreamResponse(options) {
|
|
6
|
+
const encoder = (options.encoder ?? (() => new DataStreamEncoder()))();
|
|
7
|
+
const stream = await options.context.run(options.streamId, () => {
|
|
8
|
+
return createAssistantStream(options.callback).pipeThrough(encoder);
|
|
9
|
+
});
|
|
10
|
+
return new Response(stream, { headers: mergeHeaders(encoder.headers, options.headers, options.streamId) });
|
|
13
11
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const encoder = (options.encoder ?? (() => new DataStreamEncoder()))();
|
|
20
|
-
return new Response(stream, {
|
|
21
|
-
headers: mergeHeaders(encoder.headers, options.headers, options.streamId),
|
|
22
|
-
});
|
|
12
|
+
async function createResumeAssistantStreamResponse(options) {
|
|
13
|
+
const stream = await options.context.resume(options.streamId);
|
|
14
|
+
if (!stream) return options.missingResponse?.() ?? defaultMissingResponse();
|
|
15
|
+
const encoder = (options.encoder ?? (() => new DataStreamEncoder()))();
|
|
16
|
+
return new Response(stream, { headers: mergeHeaders(encoder.headers, options.headers, options.streamId) });
|
|
23
17
|
}
|
|
24
18
|
function defaultMissingResponse() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
return new Response(JSON.stringify({ error: "stream not found" }), {
|
|
20
|
+
status: 404,
|
|
21
|
+
headers: { "Content-Type": "application/json" }
|
|
22
|
+
});
|
|
29
23
|
}
|
|
30
24
|
function mergeHeaders(encoderHeaders, extra, streamId) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
merged.set(RESUMABLE_STREAM_ID_HEADER, streamId);
|
|
38
|
-
return merged;
|
|
25
|
+
const merged = new Headers(encoderHeaders ?? {});
|
|
26
|
+
if (extra) for (const [key, value] of new Headers(extra)) merged.set(key, value);
|
|
27
|
+
merged.set(RESUMABLE_STREAM_ID_HEADER, streamId);
|
|
28
|
+
return merged;
|
|
39
29
|
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { RESUMABLE_STREAM_ID_HEADER, createResumableAssistantStreamResponse, createResumeAssistantStreamResponse };
|
|
32
|
+
|
|
40
33
|
//# sourceMappingURL=createResumableAssistantStreamResponse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createResumableAssistantStreamResponse.js","
|
|
1
|
+
{"version":3,"file":"createResumableAssistantStreamResponse.js","names":[],"sources":["../../src/resumable/createResumableAssistantStreamResponse.ts"],"sourcesContent":["import type { AssistantStreamEncoder } from \"../core/AssistantStream\";\nimport {\n createAssistantStream,\n type AssistantStreamController,\n} from \"../core/modules/assistant-stream\";\nimport { DataStreamEncoder } from \"../core/serialization/data-stream/DataStream\";\nimport type { ResumableStreamContext } from \"./ResumableStreamContext\";\n\nexport const RESUMABLE_STREAM_ID_HEADER = \"x-resumable-stream-id\";\n\nexport type CreateResumableAssistantStreamResponseOptions = {\n readonly context: ResumableStreamContext;\n readonly streamId: string;\n readonly callback: (\n controller: AssistantStreamController,\n ) => PromiseLike<void> | void;\n /** Defaults to `DataStreamEncoder`. Also consulted for response headers. */\n readonly encoder?: () => AssistantStreamEncoder;\n readonly headers?: HeadersInit;\n};\n\nexport async function createResumableAssistantStreamResponse(\n options: CreateResumableAssistantStreamResponseOptions,\n): Promise<Response> {\n const encoder = (options.encoder ?? (() => new DataStreamEncoder()))();\n\n const stream = await options.context.run(options.streamId, () => {\n const aStream = createAssistantStream(options.callback);\n return aStream.pipeThrough(encoder);\n });\n\n return new Response(stream, {\n headers: mergeHeaders(encoder.headers, options.headers, options.streamId),\n });\n}\n\nexport type CreateResumeAssistantStreamResponseOptions = {\n readonly context: ResumableStreamContext;\n readonly streamId: string;\n /** Read for `headers` only; the encoder transform is not invoked on resume. */\n readonly encoder?: () => AssistantStreamEncoder;\n readonly headers?: HeadersInit;\n /** Defaults to a 404 JSON response. */\n readonly missingResponse?: () => Response;\n};\n\nexport async function createResumeAssistantStreamResponse(\n options: CreateResumeAssistantStreamResponseOptions,\n): Promise<Response> {\n const stream = await options.context.resume(options.streamId);\n if (!stream) {\n return options.missingResponse?.() ?? defaultMissingResponse();\n }\n const encoder = (options.encoder ?? (() => new DataStreamEncoder()))();\n return new Response(stream, {\n headers: mergeHeaders(encoder.headers, options.headers, options.streamId),\n });\n}\n\nfunction defaultMissingResponse(): Response {\n return new Response(JSON.stringify({ error: \"stream not found\" }), {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nfunction mergeHeaders(\n encoderHeaders: Headers | undefined,\n extra: HeadersInit | undefined,\n streamId: string,\n): Headers {\n const merged = new Headers(encoderHeaders ?? {});\n if (extra) {\n for (const [key, value] of new Headers(extra)) {\n merged.set(key, value);\n }\n }\n merged.set(RESUMABLE_STREAM_ID_HEADER, streamId);\n return merged;\n}\n"],"mappings":";;;AAQA,MAAa,6BAA6B;AAa1C,eAAsB,uCACpB,SACmB;CACnB,MAAM,WAAW,QAAQ,kBAAkB,IAAI,kBAAkB,IAAI;CAErE,MAAM,SAAS,MAAM,QAAQ,QAAQ,IAAI,QAAQ,gBAAgB;EAE/D,OADgB,sBAAsB,QAAQ,QACjC,EAAE,YAAY,OAAO;CACpC,CAAC;CAED,OAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS,aAAa,QAAQ,SAAS,QAAQ,SAAS,QAAQ,QAAQ,EAC1E,CAAC;AACH;AAYA,eAAsB,oCACpB,SACmB;CACnB,MAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,QAAQ,QAAQ;CAC5D,IAAI,CAAC,QACH,OAAO,QAAQ,kBAAkB,KAAK,uBAAuB;CAE/D,MAAM,WAAW,QAAQ,kBAAkB,IAAI,kBAAkB,IAAI;CACrE,OAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS,aAAa,QAAQ,SAAS,QAAQ,SAAS,QAAQ,QAAQ,EAC1E,CAAC;AACH;AAEA,SAAS,yBAAmC;CAC1C,OAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,mBAAmB,CAAC,GAAG;EACjE,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;CAChD,CAAC;AACH;AAEA,SAAS,aACP,gBACA,OACA,UACS;CACT,MAAM,SAAS,IAAI,QAAQ,kBAAkB,CAAC,CAAC;CAC/C,IAAI,OACF,KAAK,MAAM,CAAC,KAAK,UAAU,IAAI,QAAQ,KAAK,GAC1C,OAAO,IAAI,KAAK,KAAK;CAGzB,OAAO,IAAI,4BAA4B,QAAQ;CAC/C,OAAO;AACT"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
//#region src/resumable/errors.d.ts
|
|
2
|
+
type ResumableStreamErrorCode = "missing" | "exists" | "finalized" | "invalid-id";
|
|
3
|
+
declare class ResumableStreamError extends Error {
|
|
4
|
+
readonly code: ResumableStreamErrorCode;
|
|
5
|
+
constructor(code: ResumableStreamErrorCode, message: string);
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
+
declare function validateStreamId(streamId: string): void;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ResumableStreamError, ResumableStreamErrorCode, validateStreamId };
|
|
7
10
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","
|
|
1
|
+
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/resumable/errors.ts"],"mappings":";KAAY,wBAAA;AAAA,cAMC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;cAEH,IAAA,EAAM,wBAAA,EAA0B,OAAA;AAAA;AAAA,iBAS9B,gBAAA,CAAiB,QAAgB"}
|
package/dist/resumable/errors.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
1
|
+
//#region src/resumable/errors.ts
|
|
2
|
+
var ResumableStreamError = class extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "ResumableStreamError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
9
10
|
const STREAM_ID_PATTERN = /^[A-Za-z0-9_.:-]{1,256}$/;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
throw new ResumableStreamError("invalid-id", `Invalid streamId: ${streamId} (must match ${STREAM_ID_PATTERN})`);
|
|
13
|
-
}
|
|
11
|
+
function validateStreamId(streamId) {
|
|
12
|
+
if (!STREAM_ID_PATTERN.test(streamId)) throw new ResumableStreamError("invalid-id", `Invalid streamId: ${streamId} (must match ${STREAM_ID_PATTERN})`);
|
|
14
13
|
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { ResumableStreamError, validateStreamId };
|
|
16
|
+
|
|
15
17
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/resumable/errors.ts"],"sourcesContent":["export type ResumableStreamErrorCode =\n | \"missing\"\n | \"exists\"\n | \"finalized\"\n | \"invalid-id\";\n\nexport class ResumableStreamError extends Error {\n readonly code: ResumableStreamErrorCode;\n\n constructor(code: ResumableStreamErrorCode, message: string) {\n super(message);\n this.name = \"ResumableStreamError\";\n this.code = code;\n }\n}\n\nconst STREAM_ID_PATTERN = /^[A-Za-z0-9_.:-]{1,256}$/;\n\nexport function validateStreamId(streamId: string): void {\n if (!STREAM_ID_PATTERN.test(streamId)) {\n throw new ResumableStreamError(\n \"invalid-id\",\n `Invalid streamId: ${streamId} (must match ${STREAM_ID_PATTERN})`,\n );\n }\n}\n"],"mappings":";AAMA,IAAa,uBAAb,cAA0C,MAAM;CAC9C;CAEA,YAAY,MAAgC,SAAiB;EAC3D,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;AAEA,MAAM,oBAAoB;AAE1B,SAAgB,iBAAiB,UAAwB;CACvD,IAAI,CAAC,kBAAkB,KAAK,QAAQ,GAClC,MAAM,IAAI,qBACR,cACA,qBAAqB,SAAS,eAAe,kBAAkB,EACjE;AAEJ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { ResumableStreamAcquireOptions, ResumableStreamEntry, ResumableStreamRole, ResumableStreamStatus, ResumableStreamStore } from "./types.js";
|
|
2
|
+
import { ResumableStreamContext, ResumableStreamContextOptions, createResumableStreamContext } from "./ResumableStreamContext.js";
|
|
3
|
+
import { CreateResumableAssistantStreamResponseOptions, CreateResumeAssistantStreamResponseOptions, RESUMABLE_STREAM_ID_HEADER, createResumableAssistantStreamResponse, createResumeAssistantStreamResponse } from "./createResumableAssistantStreamResponse.js";
|
|
4
|
+
import { ResumableStreamError, ResumableStreamErrorCode } from "./errors.js";
|
|
5
|
+
import { InMemoryResumableStreamStoreOptions, createInMemoryResumableStreamStore } from "./stores/InMemoryResumableStreamStore.js";
|
|
6
|
+
import { RedisLikeClient, RedisResumableStreamStoreOptions } from "./stores/redis-impl.js";
|
|
7
|
+
export { type CreateResumableAssistantStreamResponseOptions, type CreateResumeAssistantStreamResponseOptions, type InMemoryResumableStreamStoreOptions, RESUMABLE_STREAM_ID_HEADER, type RedisLikeClient, type RedisResumableStreamStoreOptions, type ResumableStreamAcquireOptions, type ResumableStreamContext, type ResumableStreamContextOptions, type ResumableStreamEntry, ResumableStreamError, type ResumableStreamErrorCode, type ResumableStreamRole, type ResumableStreamStatus, type ResumableStreamStore, createInMemoryResumableStreamStore, createResumableAssistantStreamResponse, createResumableStreamContext, createResumeAssistantStreamResponse };
|