{"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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"}