UNPKG

@langchain/core

Version:
1 lines 13.5 kB
{"version":3,"file":"stream.cjs","names":["e: any","stream: ReadableStream<T>","generator: AsyncGenerator<T>","iter: AsyncGenerator<T>","buffer","first: T","second: T","params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }","AsyncLocalStorageProviderSingleton","pickRunnableConfigKeys","raceWithSignal","value?: TReturn | PromiseLike<TReturn>","e: Error","to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>","generator: AsyncGenerator<T, TReturn, TNext>","startSetup: () => Promise<S>","signal: AbortSignal | undefined"],"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 // eslint-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 // eslint-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 // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // eslint-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{\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 // eslint-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 // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n this.firstResult = 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 // eslint-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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"}