modelfusion 0.33.1 → 0.34.0

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.
Files changed (43) hide show
  1. package/{model-function/generate-text → event-source}/AsyncQueue.cjs +11 -10
  2. package/event-source/AsyncQueue.d.ts +8 -0
  3. package/{model-function/generate-text → event-source}/AsyncQueue.js +11 -10
  4. package/event-source/EventSourceParserStream.cjs +34 -0
  5. package/event-source/EventSourceParserStream.d.ts +15 -0
  6. package/event-source/EventSourceParserStream.js +30 -0
  7. package/event-source/convertReadableStreamToAsyncIterable.cjs +19 -0
  8. package/event-source/convertReadableStreamToAsyncIterable.d.ts +1 -0
  9. package/event-source/convertReadableStreamToAsyncIterable.js +15 -0
  10. package/event-source/createEventSourceStream.cjs +15 -0
  11. package/event-source/createEventSourceStream.d.ts +1 -0
  12. package/event-source/createEventSourceStream.js +11 -0
  13. package/event-source/index.cjs +19 -0
  14. package/event-source/index.d.ts +3 -0
  15. package/event-source/index.js +3 -0
  16. package/event-source/parseEventSourceStream.cjs +12 -0
  17. package/event-source/parseEventSourceStream.d.ts +4 -0
  18. package/event-source/parseEventSourceStream.js +8 -0
  19. package/event-source/readEventSourceStream.cjs +33 -0
  20. package/event-source/readEventSourceStream.d.ts +6 -0
  21. package/event-source/readEventSourceStream.js +26 -0
  22. package/index.cjs +1 -0
  23. package/index.d.ts +1 -0
  24. package/index.js +1 -0
  25. package/model-function/index.cjs +0 -1
  26. package/model-function/index.d.ts +0 -1
  27. package/model-function/index.js +0 -1
  28. package/model-provider/cohere/CohereTextGenerationModel.cjs +1 -1
  29. package/model-provider/cohere/CohereTextGenerationModel.js +1 -1
  30. package/model-provider/llamacpp/LlamaCppTextGenerationModel.cjs +21 -21
  31. package/model-provider/llamacpp/LlamaCppTextGenerationModel.js +21 -21
  32. package/model-provider/openai/OpenAITextGenerationModel.cjs +25 -23
  33. package/model-provider/openai/OpenAITextGenerationModel.js +25 -23
  34. package/model-provider/openai/chat/OpenAIChatStreamIterable.cjs +27 -24
  35. package/model-provider/openai/chat/OpenAIChatStreamIterable.js +27 -24
  36. package/package.json +2 -2
  37. package/model-function/generate-text/AsyncQueue.d.ts +0 -17
  38. package/model-function/generate-text/TextDeltaEventSource.cjs +0 -54
  39. package/model-function/generate-text/TextDeltaEventSource.d.ts +0 -5
  40. package/model-function/generate-text/TextDeltaEventSource.js +0 -46
  41. package/model-function/generate-text/parseEventSourceReadableStream.cjs +0 -30
  42. package/model-function/generate-text/parseEventSourceReadableStream.d.ts +0 -8
  43. package/model-function/generate-text/parseEventSourceReadableStream.js +0 -26
@@ -1,16 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AsyncQueue = void 0;
4
- /**
5
- * @internal
6
- */
7
4
  class AsyncQueue {
8
5
  constructor() {
9
6
  Object.defineProperty(this, "queue", {
10
7
  enumerable: true,
11
8
  configurable: true,
12
9
  writable: true,
13
- value: void 0
10
+ value: []
14
11
  });
15
12
  Object.defineProperty(this, "resolvers", {
16
13
  enumerable: true,
@@ -22,11 +19,8 @@ class AsyncQueue {
22
19
  enumerable: true,
23
20
  configurable: true,
24
21
  writable: true,
25
- value: void 0
22
+ value: false
26
23
  });
27
- this.queue = [];
28
- this.resolvers = [];
29
- this.closed = false;
30
24
  }
31
25
  push(value) {
32
26
  if (this.closed) {
@@ -43,6 +37,7 @@ class AsyncQueue {
43
37
  close() {
44
38
  while (this.resolvers.length) {
45
39
  const resolve = this.resolvers.shift();
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
41
  resolve?.({ value: undefined, done: true });
47
42
  }
48
43
  this.closed = true;
@@ -51,13 +46,19 @@ class AsyncQueue {
51
46
  return {
52
47
  next: () => {
53
48
  if (this.queue.length > 0) {
54
- return Promise.resolve({ value: this.queue.shift(), done: false });
49
+ return Promise.resolve({
50
+ value: this.queue.shift(),
51
+ done: false,
52
+ });
55
53
  }
56
54
  else if (this.closed) {
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
56
  return Promise.resolve({ value: undefined, done: true });
58
57
  }
59
58
  else {
60
- return new Promise((resolve) => this.resolvers.push(resolve));
59
+ return new Promise((resolve) => {
60
+ this.resolvers.push(resolve);
61
+ });
61
62
  }
62
63
  },
63
64
  };
@@ -0,0 +1,8 @@
1
+ export declare class AsyncQueue<T> implements AsyncIterable<T> {
2
+ private queue;
3
+ private resolvers;
4
+ private closed;
5
+ push(value: T): void;
6
+ close(): void;
7
+ [Symbol.asyncIterator](): AsyncIterator<T>;
8
+ }
@@ -1,13 +1,10 @@
1
- /**
2
- * @internal
3
- */
4
1
  export class AsyncQueue {
5
2
  constructor() {
6
3
  Object.defineProperty(this, "queue", {
7
4
  enumerable: true,
8
5
  configurable: true,
9
6
  writable: true,
10
- value: void 0
7
+ value: []
11
8
  });
12
9
  Object.defineProperty(this, "resolvers", {
13
10
  enumerable: true,
@@ -19,11 +16,8 @@ export class AsyncQueue {
19
16
  enumerable: true,
20
17
  configurable: true,
21
18
  writable: true,
22
- value: void 0
19
+ value: false
23
20
  });
24
- this.queue = [];
25
- this.resolvers = [];
26
- this.closed = false;
27
21
  }
28
22
  push(value) {
29
23
  if (this.closed) {
@@ -40,6 +34,7 @@ export class AsyncQueue {
40
34
  close() {
41
35
  while (this.resolvers.length) {
42
36
  const resolve = this.resolvers.shift();
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
38
  resolve?.({ value: undefined, done: true });
44
39
  }
45
40
  this.closed = true;
@@ -48,13 +43,19 @@ export class AsyncQueue {
48
43
  return {
49
44
  next: () => {
50
45
  if (this.queue.length > 0) {
51
- return Promise.resolve({ value: this.queue.shift(), done: false });
46
+ return Promise.resolve({
47
+ value: this.queue.shift(),
48
+ done: false,
49
+ });
52
50
  }
53
51
  else if (this.closed) {
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
53
  return Promise.resolve({ value: undefined, done: true });
55
54
  }
56
55
  else {
57
- return new Promise((resolve) => this.resolvers.push(resolve));
56
+ return new Promise((resolve) => {
57
+ this.resolvers.push(resolve);
58
+ });
58
59
  }
59
60
  },
60
61
  };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventSourceParserStream = void 0;
4
+ const eventsource_parser_1 = require("eventsource-parser");
5
+ /**
6
+ * A TransformStream that ingests a stream of strings and produces a stream of ParsedEvents.
7
+ *
8
+ * @example
9
+ * ```
10
+ * const eventStream =
11
+ * response.body
12
+ * .pipeThrough(new TextDecoderStream())
13
+ * .pipeThrough(new EventSourceParserStream())
14
+ * ```
15
+ */
16
+ // Copied from https://github.com/rexxars/eventsource-parser/blob/main/src/stream.ts to avoid issues with the commonjs build.
17
+ class EventSourceParserStream extends TransformStream {
18
+ constructor() {
19
+ let parser;
20
+ super({
21
+ start(controller) {
22
+ parser = (0, eventsource_parser_1.createParser)((event) => {
23
+ if (event.type === "event") {
24
+ controller.enqueue(event);
25
+ }
26
+ });
27
+ },
28
+ transform(chunk) {
29
+ parser.feed(chunk);
30
+ },
31
+ });
32
+ }
33
+ }
34
+ exports.EventSourceParserStream = EventSourceParserStream;
@@ -0,0 +1,15 @@
1
+ import { ParsedEvent } from "eventsource-parser";
2
+ /**
3
+ * A TransformStream that ingests a stream of strings and produces a stream of ParsedEvents.
4
+ *
5
+ * @example
6
+ * ```
7
+ * const eventStream =
8
+ * response.body
9
+ * .pipeThrough(new TextDecoderStream())
10
+ * .pipeThrough(new EventSourceParserStream())
11
+ * ```
12
+ */
13
+ export declare class EventSourceParserStream extends TransformStream<string, ParsedEvent> {
14
+ constructor();
15
+ }
@@ -0,0 +1,30 @@
1
+ import { createParser, } from "eventsource-parser";
2
+ /**
3
+ * A TransformStream that ingests a stream of strings and produces a stream of ParsedEvents.
4
+ *
5
+ * @example
6
+ * ```
7
+ * const eventStream =
8
+ * response.body
9
+ * .pipeThrough(new TextDecoderStream())
10
+ * .pipeThrough(new EventSourceParserStream())
11
+ * ```
12
+ */
13
+ // Copied from https://github.com/rexxars/eventsource-parser/blob/main/src/stream.ts to avoid issues with the commonjs build.
14
+ export class EventSourceParserStream extends TransformStream {
15
+ constructor() {
16
+ let parser;
17
+ super({
18
+ start(controller) {
19
+ parser = createParser((event) => {
20
+ if (event.type === "event") {
21
+ controller.enqueue(event);
22
+ }
23
+ });
24
+ },
25
+ transform(chunk) {
26
+ parser.feed(chunk);
27
+ },
28
+ });
29
+ }
30
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertReadableStreamToAsyncIterable = void 0;
4
+ async function* convertReadableStreamToAsyncIterable(stream) {
5
+ const reader = stream.getReader();
6
+ try {
7
+ while (true) {
8
+ const { done, value } = await reader.read();
9
+ if (done) {
10
+ return; // This will close the generator
11
+ }
12
+ yield value;
13
+ }
14
+ }
15
+ finally {
16
+ reader.releaseLock();
17
+ }
18
+ }
19
+ exports.convertReadableStreamToAsyncIterable = convertReadableStreamToAsyncIterable;
@@ -0,0 +1 @@
1
+ export declare function convertReadableStreamToAsyncIterable<T>(stream: ReadableStream<T>): AsyncIterable<T>;
@@ -0,0 +1,15 @@
1
+ export async function* convertReadableStreamToAsyncIterable(stream) {
2
+ const reader = stream.getReader();
3
+ try {
4
+ while (true) {
5
+ const { done, value } = await reader.read();
6
+ if (done) {
7
+ return; // This will close the generator
8
+ }
9
+ yield value;
10
+ }
11
+ }
12
+ finally {
13
+ reader.releaseLock();
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEventSourceStream = void 0;
4
+ const textEncoder = new TextEncoder();
5
+ function createEventSourceStream(events) {
6
+ return new ReadableStream({
7
+ async start(controller) {
8
+ for await (const event of events) {
9
+ controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(event)}\n\n`));
10
+ }
11
+ controller.close();
12
+ },
13
+ });
14
+ }
15
+ exports.createEventSourceStream = createEventSourceStream;
@@ -0,0 +1 @@
1
+ export declare function createEventSourceStream(events: AsyncIterable<unknown>): ReadableStream<any>;
@@ -0,0 +1,11 @@
1
+ const textEncoder = new TextEncoder();
2
+ export function createEventSourceStream(events) {
3
+ return new ReadableStream({
4
+ async start(controller) {
5
+ for await (const event of events) {
6
+ controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(event)}\n\n`));
7
+ }
8
+ controller.close();
9
+ },
10
+ });
11
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AsyncQueue.cjs"), exports);
18
+ __exportStar(require("./createEventSourceStream.cjs"), exports);
19
+ __exportStar(require("./readEventSourceStream.cjs"), exports);
@@ -0,0 +1,3 @@
1
+ export * from "./AsyncQueue.js";
2
+ export * from "./createEventSourceStream.js";
3
+ export * from "./readEventSourceStream.js";
@@ -0,0 +1,3 @@
1
+ export * from "./AsyncQueue.js";
2
+ export * from "./createEventSourceStream.js";
3
+ export * from "./readEventSourceStream.js";
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseEventSourceStream = void 0;
4
+ const convertReadableStreamToAsyncIterable_js_1 = require("./convertReadableStreamToAsyncIterable.cjs");
5
+ const EventSourceParserStream_js_1 = require("./EventSourceParserStream.cjs");
6
+ async function parseEventSourceStream({ stream, }) {
7
+ const eventStream = stream
8
+ .pipeThrough(new TextDecoderStream())
9
+ .pipeThrough(new EventSourceParserStream_js_1.EventSourceParserStream());
10
+ return (0, convertReadableStreamToAsyncIterable_js_1.convertReadableStreamToAsyncIterable)(eventStream);
11
+ }
12
+ exports.parseEventSourceStream = parseEventSourceStream;
@@ -0,0 +1,4 @@
1
+ import { ParsedEvent } from "eventsource-parser";
2
+ export declare function parseEventSourceStream({ stream, }: {
3
+ stream: ReadableStream<Uint8Array>;
4
+ }): Promise<AsyncIterable<ParsedEvent>>;
@@ -0,0 +1,8 @@
1
+ import { convertReadableStreamToAsyncIterable } from "./convertReadableStreamToAsyncIterable.js";
2
+ import { EventSourceParserStream } from "./EventSourceParserStream.js";
3
+ export async function parseEventSourceStream({ stream, }) {
4
+ const eventStream = stream
5
+ .pipeThrough(new TextDecoderStream())
6
+ .pipeThrough(new EventSourceParserStream());
7
+ return convertReadableStreamToAsyncIterable(eventStream);
8
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readEventSourceStream = void 0;
7
+ const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
+ const AsyncQueue_js_1 = require("./AsyncQueue.cjs");
9
+ const parseEventSourceStream_js_1 = require("./parseEventSourceStream.cjs");
10
+ function readEventSourceStream({ stream, schema, errorHandler, }) {
11
+ const queue = new AsyncQueue_js_1.AsyncQueue();
12
+ // run async (no await on purpose):
13
+ (0, parseEventSourceStream_js_1.parseEventSourceStream)({ stream })
14
+ .then(async (events) => {
15
+ try {
16
+ for await (const event of events) {
17
+ queue.push(schema.parse(secure_json_parse_1.default.parse(event.data)));
18
+ }
19
+ }
20
+ catch (error) {
21
+ errorHandler?.(error);
22
+ }
23
+ finally {
24
+ queue.close();
25
+ }
26
+ })
27
+ .catch((error) => {
28
+ errorHandler?.(error);
29
+ queue.close();
30
+ });
31
+ return queue;
32
+ }
33
+ exports.readEventSourceStream = readEventSourceStream;
@@ -0,0 +1,6 @@
1
+ import { ErrorHandler } from "../util/ErrorHandler.js";
2
+ export declare function readEventSourceStream<T>({ stream, schema, errorHandler, }: {
3
+ stream: ReadableStream<Uint8Array>;
4
+ schema: Zod.Schema<T>;
5
+ errorHandler?: ErrorHandler;
6
+ }): AsyncIterable<T>;
@@ -0,0 +1,26 @@
1
+ import SecureJSON from "secure-json-parse";
2
+ import { AsyncQueue } from "./AsyncQueue.js";
3
+ import { parseEventSourceStream } from "./parseEventSourceStream.js";
4
+ export function readEventSourceStream({ stream, schema, errorHandler, }) {
5
+ const queue = new AsyncQueue();
6
+ // run async (no await on purpose):
7
+ parseEventSourceStream({ stream })
8
+ .then(async (events) => {
9
+ try {
10
+ for await (const event of events) {
11
+ queue.push(schema.parse(SecureJSON.parse(event.data)));
12
+ }
13
+ }
14
+ catch (error) {
15
+ errorHandler?.(error);
16
+ }
17
+ finally {
18
+ queue.close();
19
+ }
20
+ })
21
+ .catch((error) => {
22
+ errorHandler?.(error);
23
+ queue.close();
24
+ });
25
+ return queue;
26
+ }
package/index.cjs CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./composed-function/index.cjs"), exports);
18
18
  __exportStar(require("./core/index.cjs"), exports);
19
19
  __exportStar(require("./cost/index.cjs"), exports);
20
+ __exportStar(require("./event-source/index.cjs"), exports);
20
21
  __exportStar(require("./model-function/index.cjs"), exports);
21
22
  __exportStar(require("./model-provider/index.cjs"), exports);
22
23
  __exportStar(require("./observability/index.cjs"), exports);
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./composed-function/index.js";
2
2
  export * from "./core/index.js";
3
3
  export * from "./cost/index.js";
4
+ export * from "./event-source/index.js";
4
5
  export * from "./model-function/index.js";
5
6
  export * from "./model-provider/index.js";
6
7
  export * from "./observability/index.js";
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./composed-function/index.js";
2
2
  export * from "./core/index.js";
3
3
  export * from "./cost/index.js";
4
+ export * from "./event-source/index.js";
4
5
  export * from "./model-function/index.js";
5
6
  export * from "./model-provider/index.js";
6
7
  export * from "./observability/index.js";
@@ -37,7 +37,6 @@ __exportStar(require("./generate-structure/StructureValidationError.cjs"), expor
37
37
  __exportStar(require("./generate-structure/generateStructure.cjs"), exports);
38
38
  __exportStar(require("./generate-structure/generateStructureOrText.cjs"), exports);
39
39
  __exportStar(require("./generate-text/DeltaEvent.cjs"), exports);
40
- __exportStar(require("./generate-text/TextDeltaEventSource.cjs"), exports);
41
40
  __exportStar(require("./generate-text/TextGenerationEvent.cjs"), exports);
42
41
  __exportStar(require("./generate-text/TextGenerationModel.cjs"), exports);
43
42
  __exportStar(require("./generate-text/TextStreamingEvent.cjs"), exports);
@@ -21,7 +21,6 @@ export * from "./generate-structure/StructureValidationError.js";
21
21
  export * from "./generate-structure/generateStructure.js";
22
22
  export * from "./generate-structure/generateStructureOrText.js";
23
23
  export * from "./generate-text/DeltaEvent.js";
24
- export * from "./generate-text/TextDeltaEventSource.js";
25
24
  export * from "./generate-text/TextGenerationEvent.js";
26
25
  export * from "./generate-text/TextGenerationModel.js";
27
26
  export * from "./generate-text/TextStreamingEvent.js";
@@ -21,7 +21,6 @@ export * from "./generate-structure/StructureValidationError.js";
21
21
  export * from "./generate-structure/generateStructure.js";
22
22
  export * from "./generate-structure/generateStructureOrText.js";
23
23
  export * from "./generate-text/DeltaEvent.js";
24
- export * from "./generate-text/TextDeltaEventSource.js";
25
24
  export * from "./generate-text/TextGenerationEvent.js";
26
25
  export * from "./generate-text/TextGenerationModel.js";
27
26
  export * from "./generate-text/TextStreamingEvent.js";
@@ -7,7 +7,7 @@ exports.CohereTextGenerationResponseFormat = exports.CohereTextGenerationModel =
7
7
  const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
8
  const zod_1 = require("zod");
9
9
  const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
10
- const AsyncQueue_js_1 = require("../../model-function/generate-text/AsyncQueue.cjs");
10
+ const AsyncQueue_js_1 = require("../../event-source/AsyncQueue.cjs");
11
11
  const countTokens_js_1 = require("../../model-function/tokenize-text/countTokens.cjs");
12
12
  const PromptFormatTextGenerationModel_js_1 = require("../../prompt/PromptFormatTextGenerationModel.cjs");
13
13
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
@@ -1,7 +1,7 @@
1
1
  import SecureJSON from "secure-json-parse";
2
2
  import { z } from "zod";
3
3
  import { AbstractModel } from "../../model-function/AbstractModel.js";
4
- import { AsyncQueue } from "../../model-function/generate-text/AsyncQueue.js";
4
+ import { AsyncQueue } from "../../event-source/AsyncQueue.js";
5
5
  import { countTokens } from "../../model-function/tokenize-text/countTokens.js";
6
6
  import { PromptFormatTextGenerationModel } from "../../prompt/PromptFormatTextGenerationModel.js";
7
7
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
@@ -7,8 +7,8 @@ exports.LlamaCppTextGenerationResponseFormat = exports.LlamaCppTextGenerationMod
7
7
  const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
8
  const zod_1 = __importDefault(require("zod"));
9
9
  const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
10
- const AsyncQueue_js_1 = require("../../model-function/generate-text/AsyncQueue.cjs");
11
- const parseEventSourceReadableStream_js_1 = require("../../model-function/generate-text/parseEventSourceReadableStream.cjs");
10
+ const AsyncQueue_js_1 = require("../../event-source/AsyncQueue.cjs");
11
+ const parseEventSourceStream_js_1 = require("../../event-source/parseEventSourceStream.cjs");
12
12
  const PromptFormatTextGenerationModel_js_1 = require("../../prompt/PromptFormatTextGenerationModel.cjs");
13
13
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
14
14
  const postToApi_js_1 = require("../../core/api/postToApi.cjs");
@@ -215,14 +215,11 @@ async function createLlamaCppFullDeltaIterableQueue(stream) {
215
215
  const queue = new AsyncQueue_js_1.AsyncQueue();
216
216
  let content = "";
217
217
  // process the stream asynchonously (no 'await' on purpose):
218
- (0, parseEventSourceReadableStream_js_1.parseEventSourceReadableStream)({
219
- stream,
220
- callback: (event) => {
221
- if (event.type !== "event") {
222
- return;
223
- }
224
- const data = event.data;
225
- try {
218
+ (0, parseEventSourceStream_js_1.parseEventSourceStream)({ stream })
219
+ .then(async (events) => {
220
+ try {
221
+ for await (const event of events) {
222
+ const data = event.data;
226
223
  const json = secure_json_parse_1.default.parse(data);
227
224
  const parseResult = llamaCppTextStreamingResponseSchema.safeParse(json);
228
225
  if (!parseResult.success) {
@@ -233,26 +230,29 @@ async function createLlamaCppFullDeltaIterableQueue(stream) {
233
230
  queue.close();
234
231
  return;
235
232
  }
236
- const event = parseResult.data;
237
- content += event.content;
233
+ const eventData = parseResult.data;
234
+ content += eventData.content;
238
235
  queue.push({
239
236
  type: "delta",
240
237
  fullDelta: {
241
238
  content,
242
- isComplete: event.stop,
243
- delta: event.content,
239
+ isComplete: eventData.stop,
240
+ delta: eventData.content,
244
241
  },
245
242
  });
246
- if (event.stop) {
243
+ if (eventData.stop) {
247
244
  queue.close();
248
245
  }
249
246
  }
250
- catch (error) {
251
- queue.push({ type: "error", error });
252
- queue.close();
253
- return;
254
- }
255
- },
247
+ }
248
+ catch (error) {
249
+ queue.push({ type: "error", error });
250
+ queue.close();
251
+ }
252
+ })
253
+ .catch((error) => {
254
+ queue.push({ type: "error", error });
255
+ queue.close();
256
256
  });
257
257
  return queue;
258
258
  }
@@ -1,8 +1,8 @@
1
1
  import SecureJSON from "secure-json-parse";
2
2
  import z from "zod";
3
3
  import { AbstractModel } from "../../model-function/AbstractModel.js";
4
- import { AsyncQueue } from "../../model-function/generate-text/AsyncQueue.js";
5
- import { parseEventSourceReadableStream } from "../../model-function/generate-text/parseEventSourceReadableStream.js";
4
+ import { AsyncQueue } from "../../event-source/AsyncQueue.js";
5
+ import { parseEventSourceStream } from "../../event-source/parseEventSourceStream.js";
6
6
  import { PromptFormatTextGenerationModel } from "../../prompt/PromptFormatTextGenerationModel.js";
7
7
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
8
8
  import { createJsonResponseHandler, postJsonToApi, } from "../../core/api/postToApi.js";
@@ -208,14 +208,11 @@ async function createLlamaCppFullDeltaIterableQueue(stream) {
208
208
  const queue = new AsyncQueue();
209
209
  let content = "";
210
210
  // process the stream asynchonously (no 'await' on purpose):
211
- parseEventSourceReadableStream({
212
- stream,
213
- callback: (event) => {
214
- if (event.type !== "event") {
215
- return;
216
- }
217
- const data = event.data;
218
- try {
211
+ parseEventSourceStream({ stream })
212
+ .then(async (events) => {
213
+ try {
214
+ for await (const event of events) {
215
+ const data = event.data;
219
216
  const json = SecureJSON.parse(data);
220
217
  const parseResult = llamaCppTextStreamingResponseSchema.safeParse(json);
221
218
  if (!parseResult.success) {
@@ -226,26 +223,29 @@ async function createLlamaCppFullDeltaIterableQueue(stream) {
226
223
  queue.close();
227
224
  return;
228
225
  }
229
- const event = parseResult.data;
230
- content += event.content;
226
+ const eventData = parseResult.data;
227
+ content += eventData.content;
231
228
  queue.push({
232
229
  type: "delta",
233
230
  fullDelta: {
234
231
  content,
235
- isComplete: event.stop,
236
- delta: event.content,
232
+ isComplete: eventData.stop,
233
+ delta: eventData.content,
237
234
  },
238
235
  });
239
- if (event.stop) {
236
+ if (eventData.stop) {
240
237
  queue.close();
241
238
  }
242
239
  }
243
- catch (error) {
244
- queue.push({ type: "error", error });
245
- queue.close();
246
- return;
247
- }
248
- },
240
+ }
241
+ catch (error) {
242
+ queue.push({ type: "error", error });
243
+ queue.close();
244
+ }
245
+ })
246
+ .catch((error) => {
247
+ queue.push({ type: "error", error });
248
+ queue.close();
249
249
  });
250
250
  return queue;
251
251
  }
@@ -7,8 +7,8 @@ exports.OpenAITextResponseFormat = exports.OpenAITextGenerationModel = exports.c
7
7
  const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
8
  const zod_1 = __importDefault(require("zod"));
9
9
  const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
10
- const AsyncQueue_js_1 = require("../../model-function/generate-text/AsyncQueue.cjs");
11
- const parseEventSourceReadableStream_js_1 = require("../../model-function/generate-text/parseEventSourceReadableStream.cjs");
10
+ const AsyncQueue_js_1 = require("../../event-source/AsyncQueue.cjs");
11
+ const parseEventSourceStream_js_1 = require("../../event-source/parseEventSourceStream.cjs");
12
12
  const countTokens_js_1 = require("../../model-function/tokenize-text/countTokens.cjs");
13
13
  const PromptFormatTextGenerationModel_js_1 = require("../../prompt/PromptFormatTextGenerationModel.cjs");
14
14
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
@@ -335,18 +335,15 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
335
335
  const queue = new AsyncQueue_js_1.AsyncQueue();
336
336
  const streamDelta = [];
337
337
  // process the stream asynchonously (no 'await' on purpose):
338
- (0, parseEventSourceReadableStream_js_1.parseEventSourceReadableStream)({
339
- stream,
340
- callback: (event) => {
341
- if (event.type !== "event") {
342
- return;
343
- }
344
- const data = event.data;
345
- if (data === "[DONE]") {
346
- queue.close();
347
- return;
348
- }
349
- try {
338
+ (0, parseEventSourceStream_js_1.parseEventSourceStream)({ stream })
339
+ .then(async (events) => {
340
+ try {
341
+ for await (const event of events) {
342
+ const data = event.data;
343
+ if (data === "[DONE]") {
344
+ queue.close();
345
+ return;
346
+ }
350
347
  const json = secure_json_parse_1.default.parse(data);
351
348
  const parseResult = textResponseStreamEventSchema.safeParse(json);
352
349
  if (!parseResult.success) {
@@ -357,9 +354,9 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
357
354
  queue.close();
358
355
  return;
359
356
  }
360
- const event = parseResult.data;
361
- for (let i = 0; i < event.choices.length; i++) {
362
- const eventChoice = event.choices[i];
357
+ const eventData = parseResult.data;
358
+ for (let i = 0; i < eventData.choices.length; i++) {
359
+ const eventChoice = eventData.choices[i];
363
360
  const delta = eventChoice.text;
364
361
  if (streamDelta[i] == null) {
365
362
  streamDelta[i] = {
@@ -383,12 +380,17 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
383
380
  fullDelta: streamDeltaDeepCopy,
384
381
  });
385
382
  }
386
- catch (error) {
387
- queue.push({ type: "error", error });
388
- queue.close();
389
- return;
390
- }
391
- },
383
+ }
384
+ catch (error) {
385
+ queue.push({ type: "error", error });
386
+ queue.close();
387
+ return;
388
+ }
389
+ })
390
+ .catch((error) => {
391
+ queue.push({ type: "error", error });
392
+ queue.close();
393
+ return;
392
394
  });
393
395
  return queue;
394
396
  }
@@ -1,8 +1,8 @@
1
1
  import SecureJSON from "secure-json-parse";
2
2
  import z from "zod";
3
3
  import { AbstractModel } from "../../model-function/AbstractModel.js";
4
- import { AsyncQueue } from "../../model-function/generate-text/AsyncQueue.js";
5
- import { parseEventSourceReadableStream } from "../../model-function/generate-text/parseEventSourceReadableStream.js";
4
+ import { AsyncQueue } from "../../event-source/AsyncQueue.js";
5
+ import { parseEventSourceStream } from "../../event-source/parseEventSourceStream.js";
6
6
  import { countTokens } from "../../model-function/tokenize-text/countTokens.js";
7
7
  import { PromptFormatTextGenerationModel } from "../../prompt/PromptFormatTextGenerationModel.js";
8
8
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
@@ -325,18 +325,15 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
325
325
  const queue = new AsyncQueue();
326
326
  const streamDelta = [];
327
327
  // process the stream asynchonously (no 'await' on purpose):
328
- parseEventSourceReadableStream({
329
- stream,
330
- callback: (event) => {
331
- if (event.type !== "event") {
332
- return;
333
- }
334
- const data = event.data;
335
- if (data === "[DONE]") {
336
- queue.close();
337
- return;
338
- }
339
- try {
328
+ parseEventSourceStream({ stream })
329
+ .then(async (events) => {
330
+ try {
331
+ for await (const event of events) {
332
+ const data = event.data;
333
+ if (data === "[DONE]") {
334
+ queue.close();
335
+ return;
336
+ }
340
337
  const json = SecureJSON.parse(data);
341
338
  const parseResult = textResponseStreamEventSchema.safeParse(json);
342
339
  if (!parseResult.success) {
@@ -347,9 +344,9 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
347
344
  queue.close();
348
345
  return;
349
346
  }
350
- const event = parseResult.data;
351
- for (let i = 0; i < event.choices.length; i++) {
352
- const eventChoice = event.choices[i];
347
+ const eventData = parseResult.data;
348
+ for (let i = 0; i < eventData.choices.length; i++) {
349
+ const eventChoice = eventData.choices[i];
353
350
  const delta = eventChoice.text;
354
351
  if (streamDelta[i] == null) {
355
352
  streamDelta[i] = {
@@ -373,12 +370,17 @@ async function createOpenAITextFullDeltaIterableQueue(stream) {
373
370
  fullDelta: streamDeltaDeepCopy,
374
371
  });
375
372
  }
376
- catch (error) {
377
- queue.push({ type: "error", error });
378
- queue.close();
379
- return;
380
- }
381
- },
373
+ }
374
+ catch (error) {
375
+ queue.push({ type: "error", error });
376
+ queue.close();
377
+ return;
378
+ }
379
+ })
380
+ .catch((error) => {
381
+ queue.push({ type: "error", error });
382
+ queue.close();
383
+ return;
382
384
  });
383
385
  return queue;
384
386
  }
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createOpenAIChatFullDeltaIterableQueue = void 0;
7
7
  const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
8
  const zod_1 = require("zod");
9
- const AsyncQueue_js_1 = require("../../../model-function/generate-text/AsyncQueue.cjs");
10
- const parseEventSourceReadableStream_js_1 = require("../../../model-function/generate-text/parseEventSourceReadableStream.cjs");
9
+ const AsyncQueue_js_1 = require("../../../event-source/AsyncQueue.cjs");
10
+ const parseEventSourceStream_js_1 = require("../../../event-source/parseEventSourceStream.cjs");
11
11
  const chatResponseStreamEventSchema = zod_1.z.object({
12
12
  choices: zod_1.z.array(zod_1.z.object({
13
13
  delta: zod_1.z.object({
@@ -32,18 +32,15 @@ async function createOpenAIChatFullDeltaIterableQueue(stream) {
32
32
  const queue = new AsyncQueue_js_1.AsyncQueue();
33
33
  const streamDelta = [];
34
34
  // process the stream asynchonously (no 'await' on purpose):
35
- (0, parseEventSourceReadableStream_js_1.parseEventSourceReadableStream)({
36
- stream,
37
- callback: (event) => {
38
- if (event.type !== "event") {
39
- return;
40
- }
41
- const data = event.data;
42
- if (data === "[DONE]") {
43
- queue.close();
44
- return;
45
- }
46
- try {
35
+ (0, parseEventSourceStream_js_1.parseEventSourceStream)({ stream })
36
+ .then(async (events) => {
37
+ try {
38
+ for await (const event of events) {
39
+ const data = event.data;
40
+ if (data === "[DONE]") {
41
+ queue.close();
42
+ return;
43
+ }
47
44
  const json = secure_json_parse_1.default.parse(data);
48
45
  const parseResult = chatResponseStreamEventSchema.safeParse(json);
49
46
  if (!parseResult.success) {
@@ -54,9 +51,9 @@ async function createOpenAIChatFullDeltaIterableQueue(stream) {
54
51
  queue.close();
55
52
  return;
56
53
  }
57
- const event = parseResult.data;
58
- for (let i = 0; i < event.choices.length; i++) {
59
- const eventChoice = event.choices[i];
54
+ const eventData = parseResult.data;
55
+ for (let i = 0; i < eventData.choices.length; i++) {
56
+ const eventChoice = eventData.choices[i];
60
57
  const delta = eventChoice.delta;
61
58
  if (streamDelta[i] == null) {
62
59
  streamDelta[i] = {
@@ -85,7 +82,8 @@ async function createOpenAIChatFullDeltaIterableQueue(stream) {
85
82
  choice.function_call.name += delta.function_call.name;
86
83
  }
87
84
  if (delta.function_call.arguments != undefined) {
88
- choice.function_call.arguments += delta.function_call.arguments;
85
+ choice.function_call.arguments +=
86
+ delta.function_call.arguments;
89
87
  }
90
88
  }
91
89
  if (delta.role != undefined) {
@@ -100,12 +98,17 @@ async function createOpenAIChatFullDeltaIterableQueue(stream) {
100
98
  fullDelta: streamDeltaDeepCopy,
101
99
  });
102
100
  }
103
- catch (error) {
104
- queue.push({ type: "error", error });
105
- queue.close();
106
- return;
107
- }
108
- },
101
+ }
102
+ catch (error) {
103
+ queue.push({ type: "error", error });
104
+ queue.close();
105
+ return;
106
+ }
107
+ })
108
+ .catch((error) => {
109
+ queue.push({ type: "error", error });
110
+ queue.close();
111
+ return;
109
112
  });
110
113
  return queue;
111
114
  }
@@ -1,7 +1,7 @@
1
1
  import SecureJSON from "secure-json-parse";
2
2
  import { z } from "zod";
3
- import { AsyncQueue } from "../../../model-function/generate-text/AsyncQueue.js";
4
- import { parseEventSourceReadableStream } from "../../../model-function/generate-text/parseEventSourceReadableStream.js";
3
+ import { AsyncQueue } from "../../../event-source/AsyncQueue.js";
4
+ import { parseEventSourceStream } from "../../../event-source/parseEventSourceStream.js";
5
5
  const chatResponseStreamEventSchema = z.object({
6
6
  choices: z.array(z.object({
7
7
  delta: z.object({
@@ -26,18 +26,15 @@ export async function createOpenAIChatFullDeltaIterableQueue(stream) {
26
26
  const queue = new AsyncQueue();
27
27
  const streamDelta = [];
28
28
  // process the stream asynchonously (no 'await' on purpose):
29
- parseEventSourceReadableStream({
30
- stream,
31
- callback: (event) => {
32
- if (event.type !== "event") {
33
- return;
34
- }
35
- const data = event.data;
36
- if (data === "[DONE]") {
37
- queue.close();
38
- return;
39
- }
40
- try {
29
+ parseEventSourceStream({ stream })
30
+ .then(async (events) => {
31
+ try {
32
+ for await (const event of events) {
33
+ const data = event.data;
34
+ if (data === "[DONE]") {
35
+ queue.close();
36
+ return;
37
+ }
41
38
  const json = SecureJSON.parse(data);
42
39
  const parseResult = chatResponseStreamEventSchema.safeParse(json);
43
40
  if (!parseResult.success) {
@@ -48,9 +45,9 @@ export async function createOpenAIChatFullDeltaIterableQueue(stream) {
48
45
  queue.close();
49
46
  return;
50
47
  }
51
- const event = parseResult.data;
52
- for (let i = 0; i < event.choices.length; i++) {
53
- const eventChoice = event.choices[i];
48
+ const eventData = parseResult.data;
49
+ for (let i = 0; i < eventData.choices.length; i++) {
50
+ const eventChoice = eventData.choices[i];
54
51
  const delta = eventChoice.delta;
55
52
  if (streamDelta[i] == null) {
56
53
  streamDelta[i] = {
@@ -79,7 +76,8 @@ export async function createOpenAIChatFullDeltaIterableQueue(stream) {
79
76
  choice.function_call.name += delta.function_call.name;
80
77
  }
81
78
  if (delta.function_call.arguments != undefined) {
82
- choice.function_call.arguments += delta.function_call.arguments;
79
+ choice.function_call.arguments +=
80
+ delta.function_call.arguments;
83
81
  }
84
82
  }
85
83
  if (delta.role != undefined) {
@@ -94,12 +92,17 @@ export async function createOpenAIChatFullDeltaIterableQueue(stream) {
94
92
  fullDelta: streamDeltaDeepCopy,
95
93
  });
96
94
  }
97
- catch (error) {
98
- queue.push({ type: "error", error });
99
- queue.close();
100
- return;
101
- }
102
- },
95
+ }
96
+ catch (error) {
97
+ queue.push({ type: "error", error });
98
+ queue.close();
99
+ return;
100
+ }
101
+ })
102
+ .catch((error) => {
103
+ queue.push({ type: "error", error });
104
+ queue.close();
105
+ return;
103
106
  });
104
107
  return queue;
105
108
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modelfusion",
3
3
  "description": "Build multimodal applications, chatbots, and agents with JavaScript and TypeScript.",
4
- "version": "0.33.1",
4
+ "version": "0.34.0",
5
5
  "author": "Lars Grammel",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -51,7 +51,7 @@
51
51
  "dist": "npm run clean && npm run lint && npm run build && npm run dist:copy-files"
52
52
  },
53
53
  "dependencies": {
54
- "eventsource-parser": "1.0.0",
54
+ "eventsource-parser": "1.1.1",
55
55
  "js-tiktoken": "1.0.7",
56
56
  "nanoid": "3.3.6",
57
57
  "secure-json-parse": "2.7.0",
@@ -1,17 +0,0 @@
1
- /**
2
- * @internal
3
- */
4
- export declare class AsyncQueue<T> implements AsyncIterable<T | undefined> {
5
- queue: T[];
6
- resolvers: Array<(options: {
7
- value: T | undefined;
8
- done: boolean;
9
- }) => void>;
10
- closed: boolean;
11
- constructor();
12
- push(value: T): void;
13
- close(): void;
14
- [Symbol.asyncIterator](): {
15
- next: () => Promise<IteratorResult<T | undefined, T | undefined>>;
16
- };
17
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.parseTextDeltaEventSource = exports.createTextDeltaEventSource = void 0;
7
- const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
8
- const zod_1 = require("zod");
9
- const AsyncQueue_js_1 = require("./AsyncQueue.cjs");
10
- const parseEventSourceReadableStream_js_1 = require("./parseEventSourceReadableStream.cjs");
11
- const textEncoder = new TextEncoder();
12
- const textDeltaEventDataSchema = zod_1.z.object({
13
- textDelta: zod_1.z.string().optional(),
14
- isFinished: zod_1.z.boolean(),
15
- });
16
- function enqueueData(controller, data) {
17
- controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(data)}\n\n`));
18
- }
19
- function createTextDeltaEventSource(textDeltas) {
20
- return new ReadableStream({
21
- async start(controller) {
22
- for await (const textDelta of textDeltas) {
23
- enqueueData(controller, { textDelta, isFinished: false });
24
- }
25
- enqueueData(controller, { isFinished: true });
26
- },
27
- });
28
- }
29
- exports.createTextDeltaEventSource = createTextDeltaEventSource;
30
- function parseTextDeltaEventSource(stream, options) {
31
- const queue = new AsyncQueue_js_1.AsyncQueue();
32
- // run async (no await on purpose):
33
- (0, parseEventSourceReadableStream_js_1.parseEventSourceReadableStream)({
34
- stream,
35
- callback: (event) => {
36
- if (event.type !== "event") {
37
- return;
38
- }
39
- try {
40
- const data = textDeltaEventDataSchema.parse(secure_json_parse_1.default.parse(event.data));
41
- queue.push(data.textDelta);
42
- if (data.isFinished) {
43
- queue.close();
44
- }
45
- }
46
- catch (error) {
47
- options?.errorHandler(error);
48
- queue.close();
49
- }
50
- },
51
- });
52
- return queue;
53
- }
54
- exports.parseTextDeltaEventSource = parseTextDeltaEventSource;
@@ -1,5 +0,0 @@
1
- import { ErrorHandler } from "../../util/ErrorHandler.js";
2
- export declare function createTextDeltaEventSource(textDeltas: AsyncIterable<string>): ReadableStream<any>;
3
- export declare function parseTextDeltaEventSource(stream: ReadableStream<Uint8Array>, options?: {
4
- errorHandler: ErrorHandler;
5
- }): AsyncIterable<string | undefined>;
@@ -1,46 +0,0 @@
1
- import SecureJSON from "secure-json-parse";
2
- import { z } from "zod";
3
- import { AsyncQueue } from "./AsyncQueue.js";
4
- import { parseEventSourceReadableStream } from "./parseEventSourceReadableStream.js";
5
- const textEncoder = new TextEncoder();
6
- const textDeltaEventDataSchema = z.object({
7
- textDelta: z.string().optional(),
8
- isFinished: z.boolean(),
9
- });
10
- function enqueueData(controller, data) {
11
- controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(data)}\n\n`));
12
- }
13
- export function createTextDeltaEventSource(textDeltas) {
14
- return new ReadableStream({
15
- async start(controller) {
16
- for await (const textDelta of textDeltas) {
17
- enqueueData(controller, { textDelta, isFinished: false });
18
- }
19
- enqueueData(controller, { isFinished: true });
20
- },
21
- });
22
- }
23
- export function parseTextDeltaEventSource(stream, options) {
24
- const queue = new AsyncQueue();
25
- // run async (no await on purpose):
26
- parseEventSourceReadableStream({
27
- stream,
28
- callback: (event) => {
29
- if (event.type !== "event") {
30
- return;
31
- }
32
- try {
33
- const data = textDeltaEventDataSchema.parse(SecureJSON.parse(event.data));
34
- queue.push(data.textDelta);
35
- if (data.isFinished) {
36
- queue.close();
37
- }
38
- }
39
- catch (error) {
40
- options?.errorHandler(error);
41
- queue.close();
42
- }
43
- },
44
- });
45
- return queue;
46
- }
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseEventSourceReadableStream = void 0;
4
- const eventsource_parser_1 = require("eventsource-parser");
5
- async function* convertReadableStreamToAsyncIterable(reader) {
6
- while (true) {
7
- const result = await reader.read();
8
- if (result.done) {
9
- break;
10
- }
11
- yield result.value;
12
- }
13
- }
14
- /**
15
- * @internal
16
- */
17
- async function parseEventSourceReadableStream({ stream, callback, }) {
18
- try {
19
- const parser = (0, eventsource_parser_1.createParser)(callback);
20
- const decoder = new TextDecoder();
21
- const iterable = convertReadableStreamToAsyncIterable(stream.getReader());
22
- for await (const value of iterable) {
23
- parser.feed(decoder.decode(value));
24
- }
25
- }
26
- catch (error) {
27
- console.error(error); // TODO introduce error handler param
28
- }
29
- }
30
- exports.parseEventSourceReadableStream = parseEventSourceReadableStream;
@@ -1,8 +0,0 @@
1
- import { EventSourceParseCallback } from "eventsource-parser";
2
- /**
3
- * @internal
4
- */
5
- export declare function parseEventSourceReadableStream({ stream, callback, }: {
6
- stream: ReadableStream<Uint8Array>;
7
- callback: EventSourceParseCallback;
8
- }): Promise<void>;
@@ -1,26 +0,0 @@
1
- import { createParser } from "eventsource-parser";
2
- async function* convertReadableStreamToAsyncIterable(reader) {
3
- while (true) {
4
- const result = await reader.read();
5
- if (result.done) {
6
- break;
7
- }
8
- yield result.value;
9
- }
10
- }
11
- /**
12
- * @internal
13
- */
14
- export async function parseEventSourceReadableStream({ stream, callback, }) {
15
- try {
16
- const parser = createParser(callback);
17
- const decoder = new TextDecoder();
18
- const iterable = convertReadableStreamToAsyncIterable(stream.getReader());
19
- for await (const value of iterable) {
20
- parser.feed(decoder.decode(value));
21
- }
22
- }
23
- catch (error) {
24
- console.error(error); // TODO introduce error handler param
25
- }
26
- }