ai 6.0.259 → 6.0.261

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.
@@ -8,11 +8,19 @@ import { createResolvablePromise } from './create-resolvable-promise';
8
8
  */
9
9
  export function createStitchableStream<T>(): {
10
10
  stream: ReadableStream<T>;
11
- addStream: (innerStream: ReadableStream<T>) => void;
11
+ addStream: (
12
+ innerStream: ReadableStream<T>,
13
+ callbacks?: {
14
+ onError?: (error: unknown) => void;
15
+ },
16
+ ) => void;
12
17
  close: () => void;
13
18
  terminate: () => void;
14
19
  } {
15
- let innerStreamReaders: ReadableStreamDefaultReader<T>[] = [];
20
+ let innerStreams: Array<{
21
+ reader: ReadableStreamDefaultReader<T>;
22
+ onError?: (error: unknown) => void;
23
+ }> = [];
16
24
  let controller: ReadableStreamDefaultController<T> | null = null;
17
25
  let isClosed = false;
18
26
  let waitForNewStream = createResolvablePromise<void>();
@@ -21,34 +29,34 @@ export function createStitchableStream<T>(): {
21
29
  isClosed = true;
22
30
  waitForNewStream.resolve();
23
31
 
24
- innerStreamReaders.forEach(reader => reader.cancel());
25
- innerStreamReaders = [];
32
+ innerStreams.forEach(({ reader }) => reader.cancel());
33
+ innerStreams = [];
26
34
  controller?.close();
27
35
  };
28
36
 
29
37
  const processPull = async () => {
30
38
  // Case 1: Outer stream is closed and no more inner streams
31
- if (isClosed && innerStreamReaders.length === 0) {
39
+ if (isClosed && innerStreams.length === 0) {
32
40
  controller?.close();
33
41
  return;
34
42
  }
35
43
 
36
44
  // Case 2: No inner streams available, but outer stream is open
37
45
  // wait for a new inner stream to be added or the outer stream to close
38
- if (innerStreamReaders.length === 0) {
46
+ if (innerStreams.length === 0) {
39
47
  waitForNewStream = createResolvablePromise<void>();
40
48
  await waitForNewStream.promise;
41
49
  return processPull();
42
50
  }
43
51
 
44
52
  try {
45
- const { value, done } = await innerStreamReaders[0].read();
53
+ const { value, done } = await innerStreams[0].reader.read();
46
54
 
47
55
  if (done) {
48
56
  // Case 3: Current inner stream is done
49
- innerStreamReaders.shift(); // Remove the finished stream
57
+ innerStreams.shift(); // Remove the finished stream
50
58
 
51
- if (innerStreamReaders.length === 0 && isClosed) {
59
+ if (innerStreams.length === 0 && isClosed) {
52
60
  // when closed and no more inner streams, stop pulling
53
61
  controller?.close();
54
62
  } else {
@@ -61,8 +69,9 @@ export function createStitchableStream<T>(): {
61
69
  }
62
70
  } catch (error) {
63
71
  // Case 5: Current inner stream throws an error
72
+ innerStreams[0].onError?.(error);
64
73
  controller?.error(error);
65
- innerStreamReaders.shift(); // Remove the errored stream
74
+ innerStreams.shift(); // Remove the errored stream
66
75
  terminate(); // we have errored, terminate all streams
67
76
  }
68
77
  };
@@ -74,19 +83,27 @@ export function createStitchableStream<T>(): {
74
83
  },
75
84
  pull: processPull,
76
85
  async cancel() {
77
- for (const reader of innerStreamReaders) {
86
+ for (const { reader } of innerStreams) {
78
87
  await reader.cancel();
79
88
  }
80
- innerStreamReaders = [];
89
+ innerStreams = [];
81
90
  isClosed = true;
82
91
  },
83
92
  }),
84
- addStream: (innerStream: ReadableStream<T>) => {
93
+ addStream: (
94
+ innerStream: ReadableStream<T>,
95
+ callbacks?: {
96
+ onError?: (error: unknown) => void;
97
+ },
98
+ ) => {
85
99
  if (isClosed) {
86
100
  throw new Error('Cannot add inner stream: outer stream is closed');
87
101
  }
88
102
 
89
- innerStreamReaders.push(innerStream.getReader());
103
+ innerStreams.push({
104
+ reader: innerStream.getReader(),
105
+ ...callbacks,
106
+ });
90
107
  waitForNewStream.resolve();
91
108
  },
92
109
 
@@ -98,7 +115,7 @@ export function createStitchableStream<T>(): {
98
115
  isClosed = true;
99
116
  waitForNewStream.resolve();
100
117
 
101
- if (innerStreamReaders.length === 0) {
118
+ if (innerStreams.length === 0) {
102
119
  controller?.close();
103
120
  }
104
121
  },