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