|
9 | 9 | type Row, |
10 | 10 | type ShapeStreamInterface, |
11 | 11 | } from "@electric-sql/client"; |
| 12 | +import { AsyncIterableStream, createAsyncIterableStream } from "../streams/asyncIterableStream.js"; |
12 | 13 |
|
13 | 14 | export type ZodShapeStreamOptions = { |
14 | 15 | headers?: Record<string, string>; |
@@ -82,57 +83,6 @@ export function zodShapeStream<TShapeSchema extends z.ZodTypeAny>( |
82 | 83 | }; |
83 | 84 | } |
84 | 85 |
|
85 | | -export type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>; |
86 | | - |
87 | | -export function createAsyncIterableStream<S, T>( |
88 | | - source: ReadableStream<S>, |
89 | | - transformer: Transformer<S, T> |
90 | | -): AsyncIterableStream<T> { |
91 | | - const transformedStream: any = source.pipeThrough(new TransformStream(transformer)); |
92 | | - |
93 | | - transformedStream[Symbol.asyncIterator] = () => { |
94 | | - const reader = transformedStream.getReader(); |
95 | | - return { |
96 | | - async next(): Promise<IteratorResult<string>> { |
97 | | - const { done, value } = await reader.read(); |
98 | | - return done ? { done: true, value: undefined } : { done: false, value }; |
99 | | - }, |
100 | | - }; |
101 | | - }; |
102 | | - |
103 | | - return transformedStream; |
104 | | -} |
105 | | - |
106 | | -export function createAsyncIterableReadable<S, T>( |
107 | | - source: ReadableStream<S>, |
108 | | - transformer: Transformer<S, T>, |
109 | | - signal: AbortSignal |
110 | | -): AsyncIterableStream<T> { |
111 | | - return new ReadableStream<T>({ |
112 | | - async start(controller) { |
113 | | - const transformedStream = source.pipeThrough(new TransformStream(transformer)); |
114 | | - const reader = transformedStream.getReader(); |
115 | | - |
116 | | - signal.addEventListener("abort", () => { |
117 | | - queueMicrotask(() => { |
118 | | - reader.cancel(); |
119 | | - controller.close(); |
120 | | - }); |
121 | | - }); |
122 | | - |
123 | | - while (true) { |
124 | | - const { done, value } = await reader.read(); |
125 | | - if (done) { |
126 | | - controller.close(); |
127 | | - break; |
128 | | - } |
129 | | - |
130 | | - controller.enqueue(value); |
131 | | - } |
132 | | - }, |
133 | | - }) as AsyncIterableStream<T>; |
134 | | -} |
135 | | - |
136 | 86 | class ReadableShapeStream<T extends Row<unknown> = Row> { |
137 | 87 | readonly #stream: ShapeStreamInterface<T>; |
138 | 88 | readonly #currentState: Map<string, T> = new Map(); |
|
0 commit comments