UNPKG

@langchain/core

Version:
1 lines 13.3 kB
{"version":3,"file":"stream.cjs","names":["AsyncLocalStorageProviderSingleton","pickRunnableConfigKeys","raceWithSignal"],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { pickRunnableConfigKeys } from \"../runnables/config.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport type { IterableReadableStreamInterface } from \"../types/_internal.js\";\nimport { raceWithSignal } from \"./signal.js\";\n\n// Re-exported for backwards compatibility\n// Do NOT import this type from this file inside the project. Instead, always import from `types/_internal.js`\n// when using internally\nexport type { IterableReadableStreamInterface };\n\n/*\n * Support async iterator syntax for ReadableStreams in all environments.\n * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport class IterableReadableStream<T>\n extends ReadableStream<T>\n implements IterableReadableStreamInterface<T>\n{\n public reader: ReadableStreamDefaultReader<T>;\n\n ensureReader() {\n if (!this.reader) {\n this.reader = this.getReader();\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n this.ensureReader();\n try {\n const result = await this.reader.read();\n if (result.done) {\n this.reader.releaseLock(); // release lock when stream becomes closed\n return {\n done: true,\n value: undefined,\n };\n } else {\n return {\n done: false,\n value: result.value,\n };\n }\n } catch (e) {\n this.reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.ensureReader();\n // If wrapped in a Node stream, cancel is already called.\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n return { done: true, value: undefined };\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n async throw(e: any): Promise<IteratorResult<T>> {\n this.ensureReader();\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n throw e;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // oxlint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n\n static fromReadableStream<T>(stream: ReadableStream<T>) {\n // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream\n const reader = stream.getReader();\n return new IterableReadableStream<T>({\n start(controller) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n }\n\n static fromAsyncGenerator<T>(generator: AsyncGenerator<T>) {\n return new IterableReadableStream<T>({\n async pull(controller) {\n const { value, done } = await generator.next();\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n }\n // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled\n controller.enqueue(value);\n },\n async cancel(reason) {\n await generator.return(reason);\n },\n });\n }\n}\n\nexport function atee<T>(\n iter: AsyncGenerator<T>,\n length = 2\n): AsyncGenerator<T>[] {\n const buffers = Array.from(\n { length },\n () => [] as Array<IteratorResult<T> | IteratorReturnResult<T>>\n );\n return buffers.map(async function* makeIter(buffer) {\n while (true) {\n if (buffer.length === 0) {\n const result = await iter.next();\n for (const buffer of buffers) {\n buffer.push(result);\n }\n } else if (buffer[0].done) {\n return;\n } else {\n yield buffer.shift()!.value;\n }\n }\n });\n}\n\nexport function concat<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Array<any> | string | number | Record<string, any> | any,\n>(first: T, second: T): T {\n if (Array.isArray(first) && Array.isArray(second)) {\n return first.concat(second) as T;\n } else if (typeof first === \"string\" && typeof second === \"string\") {\n return (first + second) as T;\n } else if (typeof first === \"number\" && typeof second === \"number\") {\n return (first + second) as T;\n } else if (\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (first as any).concat(second) as T;\n } else if (typeof first === \"object\" && typeof second === \"object\") {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [key, value] of Object.entries(second as Record<string, any>)) {\n if (key in chunk && !Array.isArray(chunk[key])) {\n chunk[key] = concat(chunk[key], value);\n } else {\n chunk[key] = value;\n }\n }\n return chunk as T;\n } else {\n throw new Error(`Cannot concat ${typeof first} and ${typeof second}`);\n }\n}\n\nexport class AsyncGeneratorWithSetup<\n S = unknown,\n T = unknown,\n TReturn = unknown,\n TNext = unknown,\n> implements AsyncGenerator<T, TReturn, TNext> {\n private generator: AsyncGenerator<T>;\n\n public setup: Promise<S>;\n\n public config?: unknown;\n\n public signal?: AbortSignal;\n\n private firstResult: Promise<IteratorResult<T>>;\n\n private firstResultUsed = false;\n\n constructor(params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }) {\n this.generator = params.generator;\n this.config = params.config;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n this.signal = params.signal ?? (this.config as any)?.signal;\n // setup is a promise that resolves only after the first iterator value\n // is available. this is useful when setup of several piped generators\n // needs to happen in logical order, ie. in the order in which input to\n // to each generator is available.\n this.setup = new Promise((resolve, reject) => {\n // oxlint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n // Abort the first read too so timeouts can stop streams before the\n // first chunk is available.\n this.firstResult = this.signal\n ? raceWithSignal(params.generator.next(), this.signal)\n : params.generator.next();\n if (params.startSetup) {\n this.firstResult.then(params.startSetup).then(resolve, reject);\n } else {\n this.firstResult.then((_result) => resolve(undefined as S), reject);\n }\n },\n true\n );\n });\n }\n\n async next(...args: [] | [TNext]): Promise<IteratorResult<T>> {\n this.signal?.throwIfAborted();\n\n if (!this.firstResultUsed) {\n this.firstResultUsed = true;\n return this.firstResult;\n }\n\n return AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n this.config as Record<string, unknown> | undefined\n ),\n this.signal\n ? async () => {\n return raceWithSignal(this.generator.next(...args), this.signal);\n }\n : async () => {\n return this.generator.next(...args);\n },\n true\n );\n }\n\n async return(\n value?: TReturn | PromiseLike<TReturn>\n ): Promise<IteratorResult<T>> {\n return this.generator.return(value);\n }\n\n async throw(e: Error): Promise<IteratorResult<T>> {\n return this.generator.throw(e);\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // oxlint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n}\n\nexport async function pipeGeneratorWithSetup<\n S,\n A extends unknown[],\n T,\n TReturn,\n TNext,\n U,\n UReturn,\n UNext,\n>(\n to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>,\n generator: AsyncGenerator<T, TReturn, TNext>,\n startSetup: () => Promise<S>,\n signal: AbortSignal | undefined,\n ...args: A\n) {\n const gen = new AsyncGeneratorWithSetup({\n generator,\n startSetup,\n signal,\n });\n const setup = await gen.setup;\n return { output: to(gen, setup, ...args), setup };\n}\n"],"mappings":"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"}