{"version":3,"file":"index.cjs","sources":["../src/error.ts","../src/streaming.ts","../src/uploads.ts","../src/util.ts","../src/client.ts"],"sourcesContent":["import { type ReqHeaders } from './types';\n\nexport const castToError = (err: any): Error => {\n  if (err instanceof Error) return err;\n  return new Error(err);\n};\n\nexport class HttpException extends Error {}\n\nexport class APIError extends HttpException {\n  readonly status: number | undefined;\n  readonly headers: ReqHeaders | undefined;\n  readonly error: NonNullable<unknown> | undefined;\n\n  readonly code: string | null | undefined;\n  readonly param: string | null | undefined;\n  readonly type: string | undefined;\n\n  constructor(\n    status: number | undefined,\n    error: NonNullable<unknown> | undefined,\n    message: string | undefined,\n    headers: ReqHeaders | undefined,\n  ) {\n    super(`${APIError.makeMessage(status, error, message)}`);\n    this.status = status;\n    this.headers = headers;\n\n    const data = error as Record<string, any>;\n    this.error = data;\n    this.code = data?.['code'];\n    this.param = data?.['param'];\n    this.type = data?.['type'];\n  }\n\n  private static makeMessage(\n    status: number | undefined,\n    error: any,\n    message: string | undefined,\n  ) {\n    const msg = error?.message\n      ? typeof error.message === 'string'\n        ? error.message\n        : JSON.stringify(error.message)\n      : error\n        ? JSON.stringify(error)\n        : message;\n\n    if (status && msg) {\n      return `${status} ${msg}`;\n    }\n    if (status) {\n      return `${status} status code (no body)`;\n    }\n    if (msg) {\n      return msg;\n    }\n    return '(no status code or body)';\n  }\n\n  static generate(\n    status: number | undefined,\n    errorResponse: NonNullable<unknown> | undefined,\n    message: string | undefined,\n    headers: ReqHeaders | undefined,\n  ) {\n    if (!status) {\n      return new APIConnectionError({ cause: castToError(errorResponse) });\n    }\n\n    const error = (errorResponse as Record<string, any>)?.['error'];\n\n    if (status === 400) {\n      return new BadRequestError(status, error, message, headers);\n    }\n\n    if (status === 401) {\n      return new AuthenticationError(status, error, message, headers);\n    }\n\n    if (status === 403) {\n      return new PermissionDeniedError(status, error, message, headers);\n    }\n\n    if (status === 404) {\n      return new NotFoundError(status, error, message, headers);\n    }\n\n    if (status === 409) {\n      return new ConflictError(status, error, message, headers);\n    }\n\n    if (status === 422) {\n      return new UnprocessableEntityError(status, error, message, headers);\n    }\n\n    if (status === 429) {\n      return new RateLimitError(status, error, message, headers);\n    }\n\n    if (status >= 500) {\n      return new InternalServerError(status, error, message, headers);\n    }\n\n    return new APIError(status, error, message, headers);\n  }\n}\n\nexport class APIUserAbortError extends APIError {\n  override readonly status: undefined = undefined;\n\n  constructor({ message }: { message?: string } = {}) {\n    super(undefined, undefined, message || 'Request was aborted.', undefined);\n  }\n}\n\nexport class APIConnectionError extends APIError {\n  override readonly status: undefined = undefined;\n\n  constructor({\n    message,\n    cause,\n  }: {\n    message?: string;\n    cause?: Error | undefined;\n  }) {\n    super(undefined, undefined, message || 'Connection error.', undefined);\n    // in some environments the 'cause' property is already declared\n    // @ts-ignore\n    if (cause) this.cause = cause;\n  }\n}\n\nexport class APIConnectionTimeoutError extends APIConnectionError {\n  constructor({ message }: { message?: string } = {}) {\n    super({ message: message ?? 'Request timed out.' });\n  }\n}\n\nexport class BadRequestError extends APIError {\n  override readonly status: 400 = 400 as const;\n}\n\nexport class AuthenticationError extends APIError {\n  override readonly status: 401 = 401 as const;\n}\n\nexport class PermissionDeniedError extends APIError {\n  override readonly status: 403 = 403 as const;\n}\n\nexport class NotFoundError extends APIError {\n  override readonly status: 404 = 404 as const;\n}\n\nexport class ConflictError extends APIError {\n  override readonly status: 409 = 409 as const;\n}\n\nexport class UnprocessableEntityError extends APIError {\n  override readonly status: 422 = 422 as const;\n}\n\nexport class RateLimitError extends APIError {\n  override readonly status: 429 = 429 as const;\n}\n\nexport class InternalServerError extends APIError {}\n","import { APIError, HttpException } from './error';\n\nexport type Bytes =\n  | string\n  | ArrayBuffer\n  | Uint8Array\n  | Buffer\n  | null\n  | undefined;\n\nexport type ServerSentEvent = {\n  event: string | null;\n  data: string;\n  raw: string[];\n};\n\nexport class Stream<Item> implements AsyncIterable<Item> {\n  controller: AbortController;\n\n  constructor(\n    private iterator: () => AsyncIterator<Item>,\n    controller: AbortController,\n  ) {\n    this.controller = controller;\n  }\n\n  static fromSSEResponse<Item>(\n    response: Response,\n    controller: AbortController,\n  ) {\n    let consumed = false;\n    const decoder = new SSEDecoder();\n\n    async function* iterMessages(): AsyncGenerator<\n      ServerSentEvent,\n      void,\n      unknown\n    > {\n      if (!response.body) {\n        controller.abort();\n        throw new HttpException(\n          `Attempted to iterate over a response with no body`,\n        );\n      }\n\n      const lineDecoder = new LineDecoder();\n\n      const iter = readableStreamAsyncIterable<Bytes>(response.body);\n      for await (const chunk of iter) {\n        for (const line of lineDecoder.decode(chunk)) {\n          const sse = decoder.decode(line);\n          if (sse) yield sse;\n        }\n      }\n\n      for (const line of lineDecoder.flush()) {\n        const sse = decoder.decode(line);\n        if (sse) yield sse;\n      }\n    }\n\n    async function* iterator(): AsyncIterator<Item, any, undefined> {\n      if (consumed) {\n        throw new Error(\n          'Cannot iterate over a consumed stream, use `.tee()` to split the stream.',\n        );\n      }\n      consumed = true;\n      let done = false;\n      try {\n        for await (const sse of iterMessages()) {\n          if (done) continue;\n\n          if (sse.data.startsWith('[DONE]')) {\n            done = true;\n            continue;\n          }\n\n          if (sse.event === null) {\n            let data;\n\n            try {\n              data = JSON.parse(sse.data);\n            } catch (e) {\n              console.error(`Could not parse message into JSON:`, sse.data);\n              console.error(`From chunk:`, sse.raw);\n              throw e;\n            }\n\n            if (data && data.error) {\n              throw new APIError(undefined, data.error, undefined, undefined);\n            }\n\n            yield data;\n          }\n        }\n        done = true;\n      } catch (e) {\n        // If the user calls `stream.controller.abort()`, we should exit without throwing.\n        if (e instanceof Error && e.name === 'AbortError') return;\n        throw e;\n      } finally {\n        // If the user `break`s, abort the ongoing request.\n        if (!done) controller.abort();\n      }\n    }\n\n    return new Stream(iterator, controller);\n  }\n\n  /**\n   * Generates a Stream from a newline-separated ReadableStream\n   * where each item is a JSON value.\n   */\n  static fromReadableStream<Item>(\n    readableStream: globalThis.ReadableStream,\n    controller: AbortController,\n  ) {\n    let consumed = false;\n\n    async function* iterLines(): AsyncGenerator<string, void, unknown> {\n      const lineDecoder = new LineDecoder();\n\n      const iter = readableStreamAsyncIterable<Bytes>(readableStream);\n      for await (const chunk of iter) {\n        for (const line of lineDecoder.decode(chunk)) {\n          yield line;\n        }\n      }\n\n      for (const line of lineDecoder.flush()) {\n        yield line;\n      }\n    }\n\n    async function* iterator(): AsyncIterator<Item, any, undefined> {\n      if (consumed) {\n        throw new Error(\n          'Cannot iterate over a consumed stream, use `.tee()` to split the stream.',\n        );\n      }\n      consumed = true;\n      let done = false;\n      try {\n        for await (const line of iterLines()) {\n          if (done) continue;\n          if (line) yield JSON.parse(line);\n        }\n        done = true;\n      } catch (e) {\n        // If the user calls `stream.controller.abort()`, we should exit without throwing.\n        if (e instanceof Error && e.name === 'AbortError') return;\n        throw e;\n      } finally {\n        // If the user `break`s, abort the ongoing request.\n        if (!done) controller.abort();\n      }\n    }\n\n    return new Stream(iterator, controller);\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<Item> {\n    return this.iterator();\n  }\n\n  /**\n   * Splits the stream into two streams which can be\n   * independently read from at different speeds.\n   */\n  tee(): [Stream<Item>, Stream<Item>] {\n    const left: Array<Promise<IteratorResult<Item>>> = [];\n    const right: Array<Promise<IteratorResult<Item>>> = [];\n    const iterator = this.iterator();\n\n    const teeIterator = (\n      queue: Array<Promise<IteratorResult<Item>>>,\n    ): AsyncIterator<Item> => {\n      return {\n        next: () => {\n          if (queue.length === 0) {\n            const result = iterator.next();\n            left.push(result);\n            right.push(result);\n          }\n          return queue.shift()!;\n        },\n      };\n    };\n\n    return [\n      new Stream(() => teeIterator(left), this.controller),\n      new Stream(() => teeIterator(right), this.controller),\n    ];\n  }\n\n  /**\n   * Converts this stream to a newline-separated ReadableStream of\n   * JSON stringified values in the stream\n   * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n   */\n  toReadableStream(): globalThis.ReadableStream {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n\n    let iter: AsyncIterator<Item>;\n    const encoder = new TextEncoder();\n\n    return new ReadableStream({\n      async start() {\n        iter = self[Symbol.asyncIterator]();\n      },\n      async pull(ctrl) {\n        try {\n          const { value, done } = await iter.next();\n          if (done) return ctrl.close();\n\n          const bytes = encoder.encode(JSON.stringify(value) + '\\n');\n\n          ctrl.enqueue(bytes);\n        } catch (err) {\n          ctrl.error(err);\n        }\n      },\n      async cancel() {\n        await iter.return?.();\n      },\n    });\n  }\n}\n\nexport class SSEDecoder {\n  private data: string[];\n  private event: string | null;\n  private chunks: string[];\n\n  constructor() {\n    this.event = null;\n    this.data = [];\n    this.chunks = [];\n  }\n\n  decode(line: string) {\n    if (line.endsWith('\\r')) {\n      line = line.substring(0, line.length - 1);\n    }\n\n    if (!line) {\n      // empty line and we didn't previously encounter any messages\n      if (!this.event && !this.data.length) return null;\n\n      const sse: ServerSentEvent = {\n        event: this.event,\n        data: this.data.join('\\n'),\n        raw: this.chunks,\n      };\n\n      this.event = null;\n      this.data = [];\n      this.chunks = [];\n\n      return sse;\n    }\n\n    this.chunks.push(line);\n\n    if (line.startsWith(':')) {\n      return null;\n    }\n\n    const [fieldname, _, raw] = partition(line, ':');\n\n    let value = raw;\n    if (value.startsWith(' ')) {\n      value = value.substring(1);\n    }\n\n    if (fieldname === 'event') {\n      this.event = value;\n    } else if (fieldname === 'data') {\n      this.data.push(value);\n    }\n\n    return null;\n  }\n}\n\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n  // prettier-ignore\n  static NEWLINE_CHARS = new Set(['\\n', '\\r', '\\x0b', '\\x0c', '\\x1c', '\\x1d', '\\x1e', '\\x85', '\\u2028', '\\u2029']);\n  static NEWLINE_REGEXP = /\\r\\n|[\\n\\r\\x0b\\x0c\\x1c\\x1d\\x1e\\x85\\u2028\\u2029]/g;\n\n  buffer: string[];\n  trailingCR: boolean;\n  textDecoder: any; // TextDecoder found in browsers; not typed to avoid pulling in either \"dom\" or \"node\" types.\n\n  constructor() {\n    this.buffer = [];\n    this.trailingCR = false;\n  }\n\n  decode(chunk: Bytes): string[] {\n    let text = this.decodeText(chunk);\n\n    if (this.trailingCR) {\n      text = '\\r' + text;\n      this.trailingCR = false;\n    }\n    if (text.endsWith('\\r')) {\n      this.trailingCR = true;\n      text = text.slice(0, -1);\n    }\n\n    if (!text) {\n      return [];\n    }\n\n    const trailingNewline = LineDecoder.NEWLINE_CHARS.has(\n      text[text.length - 1] || '',\n    );\n    let lines = text.split(LineDecoder.NEWLINE_REGEXP);\n\n    if (lines.length === 1 && !trailingNewline) {\n      this.buffer.push(lines[0]!);\n      return [];\n    }\n\n    if (this.buffer.length > 0) {\n      lines = [this.buffer.join('') + lines[0], ...lines.slice(1)];\n      this.buffer = [];\n    }\n\n    if (!trailingNewline) {\n      this.buffer = [lines.pop() || ''];\n    }\n\n    return lines;\n  }\n\n  decodeText(bytes: Bytes): string {\n    if (bytes == null) return '';\n    if (typeof bytes === 'string') return bytes;\n\n    // Node:\n    if (typeof Buffer !== 'undefined') {\n      if (bytes instanceof Buffer) {\n        return bytes.toString();\n      }\n      if (bytes instanceof Uint8Array) {\n        return Buffer.from(bytes).toString();\n      }\n\n      throw new HttpException(\n        `Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global \"Buffer\" defined, which this library assumes to be Node. Please report this error.`,\n      );\n    }\n\n    // Browser\n    if (typeof TextDecoder !== 'undefined') {\n      if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) {\n        this.textDecoder ??= new TextDecoder('utf8');\n        return this.textDecoder.decode(bytes);\n      }\n\n      throw new HttpException(\n        `Unexpected: received non-Uint8Array/ArrayBuffer (${\n          (bytes as any).constructor.name\n        }) in a web platform. Please report this error.`,\n      );\n    }\n\n    throw new HttpException(\n      `Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`,\n    );\n  }\n\n  flush(): string[] {\n    if (!this.buffer.length && !this.trailingCR) {\n      return [];\n    }\n\n    const lines = [this.buffer.join('')];\n    this.buffer = [];\n    this.trailingCR = false;\n    return lines;\n  }\n}\n\nfunction partition(str: string, delimiter: string): [string, string, string] {\n  const index = str.indexOf(delimiter);\n  if (index !== -1) {\n    return [\n      str.substring(0, index),\n      delimiter,\n      str.substring(index + delimiter.length),\n    ];\n  }\n\n  return [str, '', ''];\n}\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function readableStreamAsyncIterable<T>(\n  stream: any,\n): AsyncIterableIterator<T> {\n  if (stream[Symbol.asyncIterator]) return stream;\n\n  const reader = stream.getReader();\n  return {\n    async next() {\n      try {\n        const result = await reader.read();\n        if (result?.done) reader.releaseLock(); // release lock when stream becomes closed\n        return result;\n      } catch (e) {\n        reader.releaseLock(); // release lock when stream becomes errored\n        throw e;\n      }\n    },\n    async return() {\n      const cancelPromise = reader.cancel();\n      reader.releaseLock();\n      await cancelPromise;\n      return { done: true, value: undefined };\n    },\n    [Symbol.asyncIterator]() {\n      return this;\n    },\n  };\n}\n","import {\n  File,\n  type FsReadStream,\n  getMultipartRequestOptions,\n  isFsReadStream,\n  MultipartBody,\n} from './_shims/index';\nimport { type RequestOptions } from './types';\n\ntype BlobLikePart =\n  | string\n  | ArrayBuffer\n  | ArrayBufferView\n  | BlobLike\n  | Uint8Array\n  | DataView;\nexport type BlobPart =\n  | string\n  | ArrayBuffer\n  | ArrayBufferView\n  | Blob\n  | Uint8Array\n  | DataView;\n\n/**\n * Typically, this is a native \"File\" class.\n *\n * We provide the {@link toFile} utility to convert a variety of objects\n * into the File class.\n *\n * For convenience, you can also pass a fetch Response, or in Node,\n * the result of fs.createReadStream().\n */\nexport type Uploadable = FileLike | ResponseLike | FsReadStream;\n\n/**\n * Intended to match web.Blob, node.Blob, node-fetch.Blob, etc.\n */\nexport interface BlobLike {\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */\n  readonly size: number;\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */\n  readonly type: string;\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */\n  text(): Promise<string>;\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */\n  slice(start?: number, end?: number): BlobLike;\n  // unfortunately @types/node-fetch@^2.6.4 doesn't type the arrayBuffer method\n}\n\n/**\n * Intended to match web.File, node.File, node-fetch.File, etc.\n */\nexport interface FileLike extends BlobLike {\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */\n  readonly lastModified: number;\n  /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */\n  readonly name: string;\n}\n\n/**\n * Intended to match web.Response, node.Response, node-fetch.Response, etc.\n */\nexport interface ResponseLike {\n  url: string;\n  blob(): Promise<BlobLike>;\n}\n\nexport const isResponseLike = (value: any): value is ResponseLike =>\n  value != null &&\n  typeof value === 'object' &&\n  typeof value.url === 'string' &&\n  typeof value.blob === 'function';\n\nexport const isFileLike = (value: any): value is FileLike =>\n  value != null &&\n  typeof value === 'object' &&\n  typeof value.name === 'string' &&\n  typeof value.lastModified === 'number' &&\n  isBlobLike(value);\n\n/**\n * The BlobLike type omits arrayBuffer() because `@types/node-fetch@^2.6.4` lacks it; but this check\n * adds the arrayBuffer() method type because it is available and used at runtime\n */\nexport const isBlobLike = (\n  value: any,\n): value is BlobLike & { arrayBuffer(): Promise<ArrayBuffer> } =>\n  value != null &&\n  typeof value === 'object' &&\n  typeof value.size === 'number' &&\n  typeof value.type === 'string' &&\n  typeof value.text === 'function' &&\n  typeof value.slice === 'function' &&\n  typeof value.arrayBuffer === 'function';\n\nexport const isUploadable = (value: any): value is Uploadable => {\n  return isFileLike(value) || isResponseLike(value) || isFsReadStream!(value);\n};\n\nexport type ToFileInput =\n  | Uploadable\n  | Exclude<BlobLikePart, string>\n  | AsyncIterable<BlobLikePart>;\n\n/**\n * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats\n * @param value - the raw content of the file.  Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s\n * @param name - the name of the file. If omitted, toFile will try to determine a file name from bits if possible\n * @param options - additional properties\n * @returns a {@link File} with the given properties\n */\nexport async function toFile(\n  value: ToFileInput | PromiseLike<ToFileInput>,\n  name?: string | null | undefined,\n  options: FilePropertyBag | undefined = {},\n): Promise<FileLike> {\n  // If it's a promise, resolve it.\n  value = await value;\n\n  if (isResponseLike(value)) {\n    const blob = await value.blob();\n    name ||= new URL(value.url).pathname.split(/[\\\\/]/).pop() ?? 'unknown_file';\n\n    return new File([blob as any], name, options);\n  }\n\n  const bits = await getBytes(value);\n\n  name ||= getName(value) ?? 'unknown_file';\n\n  if (!options.type) {\n    const type = (bits[0] as any)?.type;\n    if (typeof type === 'string') {\n      options = { ...options, type };\n    }\n  }\n\n  return new File(bits, name, options);\n}\n\nasync function getBytes(value: ToFileInput): Promise<Array<BlobPart>> {\n  const parts: Array<BlobPart> = [];\n  if (\n    typeof value === 'string' ||\n    ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.\n    value instanceof ArrayBuffer\n  ) {\n    parts.push(value);\n  } else if (isBlobLike(value)) {\n    parts.push(await value.arrayBuffer());\n  } else if (\n    isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc.\n  ) {\n    for await (const chunk of value) {\n      parts.push(chunk as BlobPart); // TODO, consider validating?\n    }\n  } else {\n    throw new Error(\n      `Unexpected data type: ${typeof value}; constructor: ${value?.constructor\n        ?.name}; props: ${propsForError(value)}`,\n    );\n  }\n\n  return parts;\n}\n\nfunction propsForError(value: any): string {\n  const props = Object.getOwnPropertyNames(value);\n  return `[${props.map(p => `\"${p}\"`).join(', ')}]`;\n}\n\nfunction getName(value: any): string | undefined {\n  return (\n    getStringFromMaybeBuffer(value.name) ||\n    getStringFromMaybeBuffer(value.filename) ||\n    // For fs.ReadStream\n    getStringFromMaybeBuffer(value.path)?.split(/[\\\\/]/).pop()\n  );\n}\n\nconst getStringFromMaybeBuffer = (\n  x: string | Buffer | unknown,\n): string | undefined => {\n  if (typeof x === 'string') return x;\n  if (typeof Buffer !== 'undefined' && x instanceof Buffer) return String(x);\n  return undefined;\n};\n\nconst isAsyncIterableIterator = (\n  value: any,\n): value is AsyncIterableIterator<unknown> =>\n  value != null &&\n  typeof value === 'object' &&\n  typeof value[Symbol.asyncIterator] === 'function';\n\nexport const isMultipartBody = (body: any): body is MultipartBody =>\n  body &&\n  typeof body === 'object' &&\n  body.body &&\n  body[Symbol.toStringTag] === 'MultipartBody';\n\n/**\n * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value.\n * Otherwise returns the request as is.\n */\nexport const maybeMultipartFormRequestOptions = async <\n  T extends NonNullable<unknown> = Record<string, unknown>,\n>(\n  opts: RequestOptions<T>,\n): Promise<RequestOptions<T | MultipartBody>> => {\n  if (!hasUploadableValue(opts.body)) return opts;\n\n  const form = await createForm(opts.body);\n  return getMultipartRequestOptions!(form, opts);\n};\n\nexport const multipartFormRequestOptions = async <\n  T extends NonNullable<unknown> = Record<string, unknown>,\n>(\n  opts: RequestOptions<T>,\n): Promise<RequestOptions<T | MultipartBody>> => {\n  const form = await createForm(opts.body);\n  return getMultipartRequestOptions!(form, opts);\n};\n\nexport const createForm = async <T = Record<string, unknown>>(\n  body: T | undefined,\n): Promise<FormData> => {\n  const form = new FormData();\n  await Promise.all(\n    Object.entries(body || {}).map(([key, value]) =>\n      addFormValue(form, key, value),\n    ),\n  );\n  return form;\n};\n\nconst hasUploadableValue = (value: unknown): boolean => {\n  if (isUploadable(value)) return true;\n  if (Array.isArray(value)) return value.some(hasUploadableValue);\n  if (value && typeof value === 'object') {\n    for (const k in value) {\n      if (hasUploadableValue((value as any)[k])) return true;\n    }\n  }\n  return false;\n};\n\nconst addFormValue = async (\n  form: FormData,\n  key: string,\n  value: unknown,\n): Promise<void> => {\n  if (value === undefined) return;\n  if (value == null) {\n    throw new TypeError(\n      `Received null for \"${key}\"; to pass null in FormData, you must use the string 'null'`,\n    );\n  }\n\n  // TODO: make nested formats configurable\n  if (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean'\n  ) {\n    form.append(key, String(value));\n  } else if (isUploadable(value)) {\n    const file = await toFile(value);\n    form.append(key, file as File);\n  } else if (Array.isArray(value)) {\n    await Promise.all(\n      value.map(entry => addFormValue(form, key + '[]', entry)),\n    );\n  } else if (typeof value === 'object') {\n    await Promise.all(\n      Object.entries(value).map(([name, prop]) =>\n        addFormValue(form, `${key}[${name}]`, prop),\n      ),\n    );\n  } else {\n    throw new TypeError(\n      `Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`,\n    );\n  }\n};\n","import { type Readable } from './_shims/index';\nimport { HttpException } from './error';\nimport type { Fetch, KeysEnum, RequestOptions } from './types';\n\nexport {\n  maybeMultipartFormRequestOptions,\n  multipartFormRequestOptions,\n  createForm,\n  type Uploadable,\n} from './uploads';\n\nexport const safeJSON = (text: string) => {\n  try {\n    return JSON.parse(text);\n  } catch (err) {\n    return undefined;\n  }\n};\n\nexport const sleep = (ms: number) =>\n  new Promise(resolve => setTimeout(resolve, ms));\n\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(\n  obj: NonNullable<unknown> | null | undefined,\n): boolean {\n  if (!obj) return true;\n  for (const _k in obj) return false;\n  return true;\n}\n\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn(obj: NonNullable<unknown>, key: string): boolean {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function debug(action: string, ...args: any[]) {\n  if (typeof process !== 'undefined' && process.env['DEBUG'] === 'true') {\n    console.log(`DINGTALK:DEBUG:${action}`, ...args);\n  }\n}\n\n/**\n * https://stackoverflow.com/a/2117523\n */\nexport const uuid4 = () => {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n};\n\n// https://stackoverflow.com/a/19709846\nconst startsWithSchemeRegexp = new RegExp('^(?:[a-z]+:)?//', 'i');\n\nexport const isAbsoluteURL = (url: string): boolean => {\n  return startsWithSchemeRegexp.test(url);\n};\n\n// This is required so that we can determine if a given object matches the RequestOptions\n// type at runtime. While this requires duplication, it is enforced by the TypeScript\n// compiler such that any missing / extraneous keys will cause an error.\nconst requestOptionsKeys: KeysEnum<RequestOptions> = {\n  method: true,\n  path: true,\n  query: true,\n  body: true,\n  headers: true,\n  duplex: true,\n\n  maxRetries: true,\n  stream: true,\n  timeout: true,\n  httpAgent: true,\n  signal: true,\n  idempotencyKey: true,\n\n  __binaryResponse: true,\n};\n\nexport const isRequestOptions = (\n  obj: unknown,\n): obj is RequestOptions<Record<string, unknown> | Readable> => {\n  return (\n    typeof obj === 'object' &&\n    obj !== null &&\n    !isEmptyObj(obj) &&\n    Object.keys(obj).every(k => hasOwn(requestOptionsKeys, k))\n  );\n};\n\nexport const createResponseHeaders = (\n  headers: Awaited<ReturnType<Fetch>>['headers'],\n): Record<string, string> => {\n  return new Proxy(\n    Object.fromEntries(\n      // @ts-ignore\n      headers.entries(),\n    ),\n    {\n      get(target, name) {\n        const key = name.toString();\n        return target[key.toLowerCase()] || target[key];\n      },\n    },\n  );\n};\n\nexport const validatePositiveInteger = (name: string, n: unknown): number => {\n  if (typeof n !== 'number' || !Number.isInteger(n)) {\n    throw new HttpException(`${name} must be an integer`);\n  }\n  if (n < 0) {\n    throw new HttpException(`${name} must be a positive integer`);\n  }\n  return n;\n};\n","import {\n  type Agent,\n  fetch,\n  getDefaultAgent,\n  type HeadersInit,\n  type RequestInfo,\n  type RequestInit,\n  kind as shimsKind,\n} from './_shims/index';\nimport {\n  APIConnectionError,\n  APIConnectionTimeoutError,\n  APIError,\n  APIUserAbortError,\n  castToError,\n  HttpException,\n} from './error';\nimport { Stream } from './streaming';\nimport type {\n  APIResponseProps,\n  DefaultQuery,\n  Fetch,\n  FinalRequestOptions,\n  HTTPMethod,\n  PromiseOrValue,\n  ReqHeaders,\n  RequestClient,\n  RequestOptions,\n} from './types';\nimport { isMultipartBody } from './uploads';\nimport {\n  createResponseHeaders,\n  debug,\n  isAbsoluteURL,\n  isEmptyObj,\n  safeJSON,\n  sleep,\n  uuid4,\n  validatePositiveInteger,\n} from './util';\n\nexport {\n  maybeMultipartFormRequestOptions,\n  multipartFormRequestOptions,\n  createForm,\n  type Uploadable,\n} from './uploads';\n\nexport async function defaultParseResponse<T>(\n  props: APIResponseProps,\n): Promise<T> {\n  const { response } = props;\n  if (props.options.stream) {\n    debug(\n      'response',\n      response.status,\n      response.url,\n      response.headers,\n      response.body,\n    );\n\n    // Note: there is an invariant here that isn't represented in the type system\n    // that if you set `stream: true` the response type must also be `Stream<T>`\n    return Stream.fromSSEResponse(response, props.controller) as any;\n  }\n\n  // fetch refuses to read the body when the status code is 204.\n  if (response.status === 204) {\n    return null as T;\n  }\n\n  if (props.options.__binaryResponse) {\n    return response as unknown as T;\n  }\n\n  const contentType = response.headers.get('content-type');\n  if (contentType?.includes('application/json')) {\n    const json = await response.json();\n\n    debug('response', response.status, response.url, response.headers, json);\n\n    return json as T;\n  }\n\n  const text = await response.text();\n  debug('response', response.status, response.url, response.headers, text);\n\n  // TODO handle blob, arraybuffer, other content types, etc.\n  return text as unknown as T;\n}\n\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class APIPromise<T> extends Promise<T> {\n  private parsedPromise: Promise<T> | undefined;\n\n  constructor(\n    private responsePromise: Promise<APIResponseProps>,\n    private parseResponse: (\n      props: APIResponseProps,\n    ) => PromiseOrValue<T> = defaultParseResponse,\n  ) {\n    super(resolve => {\n      // this is maybe a bit weird but this has to be a no-op to not implicitly\n      // parse the response body; instead .then, .catch, .finally are overridden\n      // to parse the response\n      resolve(null as any);\n    });\n  }\n\n  _thenUnwrap<U>(transform: (data: T) => U): APIPromise<U> {\n    return new APIPromise(this.responsePromise, async props =>\n      transform(await this.parseResponse(props)),\n    );\n  }\n\n  /**\n   * Gets the raw `Response` instance instead of parsing the response\n   * data.\n   *\n   * If you want to parse the response body but still get the `Response`\n   * instance, you can use {@link withResponse()}.\n   */\n  asResponse(): Promise<Response> {\n    return this.responsePromise.then(p => p.response);\n  }\n\n  /**\n   * Gets the parsed response data and the raw `Response` instance.\n   *\n   * If you just want to get the raw `Response` instance without parsing it,\n   * you can use {@link asResponse()}.\n   */\n  async withResponse(): Promise<{ data: T; response: Response }> {\n    const [data, response] = await Promise.all([\n      this.parse(),\n      this.asResponse(),\n    ]);\n    return { data, response };\n  }\n\n  private parse(): Promise<T> {\n    if (!this.parsedPromise) {\n      this.parsedPromise = this.responsePromise.then(this.parseResponse);\n    }\n    return this.parsedPromise;\n  }\n\n  override then<TResult1 = T, TResult2 = never>(\n    onfulfilled?:\n      | ((value: T) => TResult1 | PromiseLike<TResult1>)\n      | undefined\n      | null,\n    onrejected?:\n      | ((reason: any) => TResult2 | PromiseLike<TResult2>)\n      | undefined\n      | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.parse().then(onfulfilled, onrejected);\n  }\n\n  override catch<TResult = never>(\n    onrejected?:\n      | ((reason: any) => TResult | PromiseLike<TResult>)\n      | undefined\n      | null,\n  ): Promise<T | TResult> {\n    return this.parse().catch(onrejected);\n  }\n\n  override finally(onfinally?: (() => void) | undefined | null): Promise<T> {\n    return this.parse().finally(onfinally);\n  }\n}\n\nexport interface APIClientOptions {\n  baseURL: string;\n  maxRetries?: number | undefined;\n  timeout?: number | undefined;\n  httpAgent?: Agent | undefined;\n  fetch?: Fetch | undefined;\n}\n\nexport class APIClient {\n  baseURL: string;\n  maxRetries: number;\n  timeout: number;\n  httpAgent: Agent | undefined;\n\n  protected fetch: Fetch;\n  protected idempotencyHeader?: string;\n\n  constructor({\n    baseURL,\n    maxRetries = 2,\n    timeout = 600000, // 10 minutes\n    httpAgent,\n    fetch: overrideFetch,\n  }: APIClientOptions) {\n    this.baseURL = baseURL;\n    this.maxRetries = validatePositiveInteger('maxRetries', maxRetries);\n    this.timeout = validatePositiveInteger('timeout', timeout);\n    this.httpAgent = httpAgent;\n\n    this.fetch = overrideFetch ?? fetch;\n  }\n\n  /**\n   * Override this to add your own auth headers.\n   *\n   * ```ts\n   *  {\n   *    Authorization: 'Bearer 123',\n   *  }\n   * ```\n   */\n  protected authHeaders(\n    _opts: FinalRequestOptions,\n  ): PromiseOrValue<ReqHeaders> {\n    return {};\n  }\n\n  /**\n   * Override this to add your own default headers.\n   */\n  protected async defaultHeaders(\n    opts: FinalRequestOptions,\n  ): Promise<ReqHeaders> {\n    const authHeaders = await this.authHeaders(opts);\n\n    return {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'User-Agent': this.getUserAgent(),\n      ...authHeaders,\n    };\n  }\n\n  protected defaultQuery(): DefaultQuery | undefined {\n    return undefined;\n  }\n\n  /**\n   * Override this to add your own headers validation:\n   */\n  protected validateHeaders(_headers: ReqHeaders, _customHeaders: ReqHeaders) {}\n\n  protected defaultIdempotencyKey(): string {\n    return `stainless-node-retry-${uuid4()}`;\n  }\n\n  get<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.methodRequest('get', path, opts);\n  }\n\n  post<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.methodRequest('post', path, opts);\n  }\n\n  patch<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.methodRequest('patch', path, opts);\n  }\n\n  put<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.methodRequest('put', path, opts);\n  }\n\n  delete<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.methodRequest('delete', path, opts);\n  }\n\n  private methodRequest<Req extends NonNullable<unknown>, Rsp>(\n    method: HTTPMethod,\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    return this.request(\n      Promise.resolve(opts).then(opts => ({ method, path, ...opts })),\n    );\n  }\n\n  getAPIList<Item, PageClass extends AbstractPage<Item> = AbstractPage<Item>>(\n    path: string,\n    Page: new (...args: any[]) => PageClass,\n    opts?: RequestOptions<any>,\n  ): PagePromise<PageClass, Item> {\n    return this.requestAPIList(Page, { method: 'get', path, ...opts });\n  }\n\n  private calculateContentLength(body: unknown): string | null {\n    if (typeof body === 'string') {\n      if (typeof Buffer !== 'undefined') {\n        return Buffer.byteLength(body, 'utf8').toString();\n      }\n\n      if (typeof TextEncoder !== 'undefined') {\n        const encoder = new TextEncoder();\n        const encoded = encoder.encode(body);\n        return encoded.length.toString();\n      }\n    }\n\n    return null;\n  }\n\n  protected async buildRequest<Req extends NonNullable<unknown>>(\n    options: FinalRequestOptions<Req>,\n  ): Promise<{ req: RequestInit; url: string; timeout: number }> {\n    const { method, path, query, headers: headers = {} } = options;\n\n    const body = isMultipartBody(options.body)\n      ? options.body.body\n      : options.body\n        ? JSON.stringify(options.body, null, 2)\n        : null;\n    const contentLength = this.calculateContentLength(body);\n\n    const url = this.buildURL(path!, query);\n    if ('timeout' in options)\n      validatePositiveInteger('timeout', options.timeout);\n    const timeout = options.timeout ?? this.timeout;\n    const httpAgent =\n      options.httpAgent ?? this.httpAgent ?? getDefaultAgent!(url);\n    const minAgentTimeout = timeout + 1000;\n    if (\n      typeof (httpAgent as any)?.options?.timeout === 'number' &&\n      minAgentTimeout > ((httpAgent as any).options.timeout ?? 0)\n    ) {\n      // Allow any given request to bump our agent active socket timeout.\n      // This may seem strange, but leaking active sockets should be rare and not particularly problematic,\n      // and without mutating agent we would need to create more of them.\n      // This tradeoff optimizes for performance.\n      (httpAgent as any).options.timeout = minAgentTimeout;\n    }\n\n    if (this.idempotencyHeader && method !== 'get') {\n      if (!options.idempotencyKey)\n        options.idempotencyKey = this.defaultIdempotencyKey();\n      headers[this.idempotencyHeader] = options.idempotencyKey;\n    }\n\n    const defaultHeaders = await this.defaultHeaders(options);\n\n    const reqHeaders: Record<string, string> = {\n      ...(contentLength && { 'Content-Length': contentLength }),\n      ...defaultHeaders,\n      ...headers,\n    };\n    // let builtin fetch set the Content-Type for multipart bodies\n    if (isMultipartBody(options.body) && shimsKind !== 'node') {\n      delete reqHeaders['Content-Type'];\n    }\n\n    // Strip any headers being explicitly omitted with null\n    Object.keys(reqHeaders).forEach(\n      key => reqHeaders[key] === null && delete reqHeaders[key],\n    );\n\n    const req: RequestInit = {\n      method,\n      ...(body && { body: body as any }),\n      headers: reqHeaders,\n      duplex: options.duplex,\n      ...(httpAgent && { agent: httpAgent }),\n      // @ts-ignore node-fetch uses a custom AbortSignal type that is\n      // not compatible with standard web types\n      signal: options.signal ?? null,\n    };\n\n    this.validateHeaders(reqHeaders, headers);\n\n    return { req, url, timeout };\n  }\n\n  /**\n   * Used as a callback for mutating the given `RequestInit` object.\n   *\n   * This is useful for cases where you want to add certain headers based off of\n   * the request properties, e.g. `method` or `url`.\n   */\n  protected async prepareRequest(\n    _request: RequestInit,\n    _config: { url: string; options: FinalRequestOptions },\n  ): Promise<void> {}\n\n  protected parseHeaders(\n    headers: HeadersInit | null | undefined,\n  ): Record<string, string> {\n    return !headers\n      ? {}\n      : Symbol.iterator in headers\n        ? Object.fromEntries(\n            Array.from(headers as Iterable<string[]>).map(header => [\n              ...header,\n            ]),\n          )\n        : { ...headers };\n  }\n\n  protected makeStatusError(\n    status: number | undefined,\n    error: NonNullable<unknown> | undefined,\n    message: string | undefined,\n    headers: ReqHeaders | undefined,\n  ) {\n    return APIError.generate(status, error, message, headers);\n  }\n\n  request<Req extends NonNullable<unknown>, Rsp>(\n    options: PromiseOrValue<FinalRequestOptions<Req>>,\n    remainingRetries: number | null = null,\n  ): APIPromise<Rsp> {\n    return new APIPromise(this.makeRequest(options, remainingRetries));\n  }\n\n  protected async makeRequest(\n    optionsInput: PromiseOrValue<FinalRequestOptions>,\n    retriesRemaining: number | null,\n  ): Promise<APIResponseProps> {\n    const options = await optionsInput;\n    if (retriesRemaining == null) {\n      retriesRemaining = options.maxRetries ?? this.maxRetries;\n    }\n\n    const { req, url, timeout } = await this.buildRequest(options);\n\n    await this.prepareRequest(req, { url, options });\n\n    debug('request', url, options, req.headers);\n\n    if (options.signal?.aborted) {\n      throw new APIUserAbortError();\n    }\n\n    const controller = new AbortController();\n    const response = await this.fetchWithTimeout(\n      url,\n      req,\n      timeout,\n      controller,\n    ).catch(castToError);\n\n    if (response instanceof Error) {\n      if (options.signal?.aborted) {\n        throw new APIUserAbortError();\n      }\n      if (retriesRemaining) {\n        return this.retryRequest(options, retriesRemaining);\n      }\n      if (response.name === 'AbortError') {\n        throw new APIConnectionTimeoutError();\n      }\n      throw new APIConnectionError({ cause: response });\n    }\n\n    const responseHeaders = createResponseHeaders(response.headers);\n\n    if (!response.ok) {\n      if (retriesRemaining && this.shouldRetry(response)) {\n        return this.retryRequest(options, retriesRemaining, responseHeaders);\n      }\n\n      const errText = await response.text().catch(e => castToError(e).message);\n      const errJSON = safeJSON(errText);\n      const errMessage = errJSON ? undefined : errText;\n\n      debug('response', response.status, url, responseHeaders, errMessage);\n\n      const err = this.makeStatusError(\n        response.status,\n        errJSON,\n        errMessage,\n        responseHeaders,\n      );\n      throw err;\n    }\n\n    return { response, options, controller };\n  }\n\n  simple<Req extends NonNullable<unknown>, Rsp>(\n    path: string,\n    opts?: PromiseOrValue<RequestOptions<Req>>,\n  ): APIPromise<Rsp> {\n    const optionsInput = Promise.resolve(opts).then<FinalRequestOptions<Req>>(\n      opts => ({ method: 'get', path, ...opts }),\n    );\n\n    return new APIPromise(this.makeSimpleRequest(optionsInput));\n  }\n\n  protected async makeSimpleRequest(\n    optionsInput: PromiseOrValue<FinalRequestOptions>,\n    retriesRemaining?: number | null,\n  ): Promise<APIResponseProps> {\n    const options = await optionsInput;\n    if (retriesRemaining == null) {\n      retriesRemaining = options.maxRetries ?? this.maxRetries;\n    }\n\n    const body = isMultipartBody(options.body)\n      ? options.body.body\n      : options.body\n        ? JSON.stringify(options.body, null, 2)\n        : null;\n\n    // @ts-expect-error\n    const url = this.buildURL(options.path!, options.query);\n\n    if ('timeout' in options) {\n      validatePositiveInteger('timeout', options.timeout);\n    }\n\n    const timeout = options.timeout ?? this.timeout;\n\n    const httpAgent =\n      options.httpAgent ?? this.httpAgent ?? getDefaultAgent!(url);\n    const minAgentTimeout = timeout + 1000;\n    if (\n      typeof (httpAgent as any)?.options?.timeout === 'number' &&\n      minAgentTimeout > ((httpAgent as any).options.timeout ?? 0)\n    ) {\n      // Allow any given request to bump our agent active socket timeout.\n      // This may seem strange, but leaking active sockets should be rare and not particularly problematic,\n      // and without mutating agent we would need to create more of them.\n      // This tradeoff optimizes for performance.\n      (httpAgent as any).options.timeout = minAgentTimeout;\n    }\n\n    const req: RequestInit = {\n      method: options.method || 'get',\n      ...(body && { body: body as any }),\n      headers: options.headers,\n      ...(httpAgent && { agent: httpAgent }),\n      // @ts-ignore node-fetch uses a custom AbortSignal type that is\n      // not compatible with standard web types\n      signal: options.signal ?? null,\n    };\n\n    debug('request', url, options, req.headers);\n\n    const controller = new AbortController();\n    const response = await this.fetchWithTimeout(\n      url,\n      req,\n      timeout,\n      controller,\n    ).catch(castToError);\n\n    if (response instanceof Error) {\n      if (req.signal?.aborted) {\n        throw new APIUserAbortError();\n      }\n\n      if (response.name === 'AbortError') {\n        throw new APIConnectionTimeoutError();\n      }\n      throw new APIConnectionError({ cause: response });\n    }\n\n    const responseHeaders = createResponseHeaders(response.headers);\n\n    if (!response.ok) {\n      const errText = await response.text().catch(e => castToError(e).message);\n      const errJSON = safeJSON(errText);\n      const errMessage = errJSON ? undefined : errText;\n\n      debug('response', response.status, url, responseHeaders, errMessage);\n\n      const err = this.makeStatusError(\n        response.status,\n        errJSON,\n        errMessage,\n        responseHeaders,\n      );\n      throw err;\n    }\n\n    return { response, options, controller };\n  }\n\n  requestAPIList<\n    Item = unknown,\n    PageClass extends AbstractPage<Item> = AbstractPage<Item>,\n  >(\n    Page: new (\n      ...args: ConstructorParameters<typeof AbstractPage>\n    ) => PageClass,\n    options: FinalRequestOptions,\n  ): PagePromise<PageClass, Item> {\n    const request = this.makeRequest(options, null);\n    return new PagePromise<PageClass, Item>(this, request, Page);\n  }\n\n  buildURL<Req extends Record<string, unknown>>(\n    path: string,\n    query: Req | null | undefined,\n  ): string {\n    const url = isAbsoluteURL(path)\n      ? new URL(path)\n      : new URL(\n          this.baseURL +\n            (this.baseURL.endsWith('/') && path.startsWith('/')\n              ? path.slice(1)\n              : path),\n        );\n\n    const defaultQuery = this.defaultQuery();\n    if (!isEmptyObj(defaultQuery)) {\n      query = { ...defaultQuery, ...query } as Req;\n    }\n\n    if (query) {\n      url.search = this.stringifyQuery(query);\n    }\n\n    return url.toString();\n  }\n\n  protected stringifyQuery(query: Record<string, unknown>): string {\n    return Object.entries(query)\n      .filter(([_, value]) => typeof value !== 'undefined')\n      .map(([key, value]) => {\n        if (\n          typeof value === 'string' ||\n          typeof value === 'number' ||\n          typeof value === 'boolean'\n        ) {\n          return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n        }\n        if (value === null) {\n          return `${encodeURIComponent(key)}=`;\n        }\n        throw new HttpException(\n          `Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`,\n        );\n      })\n      .join('&');\n  }\n\n  async fetchWithTimeout(\n    url: RequestInfo,\n    init: RequestInit | undefined,\n    ms: number,\n    controller: AbortController,\n  ): Promise<Response> {\n    const { signal, ...options } = init || {};\n    if (signal) signal.addEventListener('abort', () => controller.abort());\n\n    const timeout = setTimeout(() => controller.abort(), ms);\n\n    return (\n      this.getRequestClient()\n        // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n        .fetch.call(undefined, url, {\n          signal: controller.signal as any,\n          ...options,\n        })\n        .finally(() => {\n          clearTimeout(timeout);\n        })\n    );\n  }\n\n  protected getRequestClient(): RequestClient {\n    return { fetch: this.fetch };\n  }\n\n  private shouldRetry(response: Response): boolean {\n    // Note this is not a standard header.\n    const shouldRetryHeader = response.headers.get('x-should-retry');\n\n    // If the server explicitly says whether or not to retry, obey.\n    if (shouldRetryHeader === 'true') return true;\n    if (shouldRetryHeader === 'false') return false;\n\n    // Retry on request timeouts.\n    if (response.status === 408) return true;\n\n    // Retry on lock timeouts.\n    if (response.status === 409) return true;\n\n    // Retry on rate limits.\n    if (response.status === 429) return true;\n\n    // Retry internal errors.\n    if (response.status >= 500) return true;\n\n    return false;\n  }\n\n  private async retryRequest(\n    options: FinalRequestOptions,\n    retriesRemaining: number,\n    responseHeaders?: ReqHeaders | undefined,\n  ): Promise<APIResponseProps> {\n    // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n    let timeoutMillis: number | undefined;\n    const retryAfterHeader = responseHeaders?.['retry-after'];\n    if (retryAfterHeader) {\n      const timeoutSeconds = parseInt(retryAfterHeader);\n      if (!Number.isNaN(timeoutSeconds)) {\n        timeoutMillis = timeoutSeconds * 1000;\n      } else {\n        timeoutMillis = Date.parse(retryAfterHeader) - Date.now();\n      }\n    }\n\n    // If the API asks us to wait a certain amount of time (and it's a reasonable amount),\n    // just do what it says, but otherwise calculate a default\n    if (\n      !timeoutMillis ||\n      !Number.isInteger(timeoutMillis) ||\n      timeoutMillis <= 0 ||\n      timeoutMillis > 60 * 1000\n    ) {\n      const maxRetries = options.maxRetries ?? this.maxRetries;\n      timeoutMillis = this.calculateDefaultRetryTimeoutMillis(\n        retriesRemaining,\n        maxRetries,\n      );\n    }\n    await sleep(timeoutMillis);\n\n    return this.makeRequest(options, retriesRemaining - 1);\n  }\n\n  private calculateDefaultRetryTimeoutMillis(\n    retriesRemaining: number,\n    maxRetries: number,\n  ): number {\n    const initialRetryDelay = 0.5;\n    const maxRetryDelay = 8.0;\n\n    const numRetries = maxRetries - retriesRemaining;\n\n    // Apply exponential backoff, but not more than the max.\n    const sleepSeconds = Math.min(\n      initialRetryDelay * Math.pow(2, numRetries),\n      maxRetryDelay,\n    );\n\n    // Apply some jitter, take up to at most 25 percent of the retry time.\n    const jitter = 1 - Math.random() * 0.25;\n\n    return sleepSeconds * jitter * 1000;\n  }\n\n  protected getUserAgent(): string {\n    return `${this.constructor.name}/JS`;\n  }\n\n  static create(\n    baseURL: string,\n    options?: Omit<APIClientOptions, 'baseURL'>,\n  ): APIClient {\n    return new APIClient({ baseURL, ...options });\n  }\n}\n\nexport type PageInfo =\n  | { url: URL }\n  | { params: Record<string, unknown> | null };\n\nexport abstract class AbstractPage<Item> implements AsyncIterable<Item> {\n  #client: APIClient;\n  protected options: FinalRequestOptions;\n\n  protected response: Response;\n  protected body: unknown;\n\n  constructor(\n    client: APIClient,\n    response: Response,\n    body: unknown,\n    options: FinalRequestOptions,\n  ) {\n    this.#client = client;\n    this.options = options;\n    this.response = response;\n    this.body = body;\n  }\n\n  /**\n   * @deprecated Use nextPageInfo instead\n   */\n  abstract nextPageParams(): Partial<Record<string, unknown>> | null;\n  abstract nextPageInfo(): PageInfo | null;\n\n  abstract getPaginatedItems(): Item[];\n\n  hasNextPage(): boolean {\n    const items = this.getPaginatedItems();\n    if (!items.length) return false;\n    return this.nextPageInfo() != null;\n  }\n\n  async getNextPage(): Promise<this> {\n    const nextInfo = this.nextPageInfo();\n    if (!nextInfo) {\n      throw new HttpException(\n        'No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.',\n      );\n    }\n    const nextOptions = { ...this.options };\n    if ('params' in nextInfo) {\n      nextOptions.query = { ...nextOptions.query, ...nextInfo.params };\n    } else if ('url' in nextInfo) {\n      const params = [\n        ...Object.entries(nextOptions.query || {}),\n        ...nextInfo.url.searchParams.entries(),\n      ];\n      for (const [key, value] of params) {\n        nextInfo.url.searchParams.set(key, value as any);\n      }\n      nextOptions.query = undefined;\n      nextOptions.path = nextInfo.url.toString();\n    }\n    return await this.#client.requestAPIList(\n      this.constructor as any,\n      nextOptions,\n    );\n  }\n\n  async *iterPages() {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let page: AbstractPage<Item> = this;\n    yield page;\n    while (page.hasNextPage()) {\n      page = await page.getNextPage();\n      yield page;\n    }\n  }\n\n  async *[Symbol.asyncIterator]() {\n    for await (const page of this.iterPages()) {\n      for (const item of page.getPaginatedItems()) {\n        yield item;\n      }\n    }\n  }\n}\n\n/**\n * This subclass of Promise will resolve to an instantiated Page once the request completes.\n *\n * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:\n *\n * ```ts\n * for await (const item of client.items.list()) {\n *   console.log(item)\n * }\n * ```\n */\nexport class PagePromise<\n    PageClass extends AbstractPage<Item>,\n    Item = ReturnType<PageClass['getPaginatedItems']>[number],\n  >\n  extends APIPromise<PageClass>\n  implements AsyncIterable<Item>\n{\n  constructor(\n    client: APIClient,\n    request: Promise<APIResponseProps>,\n    Page: new (\n      ...args: ConstructorParameters<typeof AbstractPage>\n    ) => PageClass,\n  ) {\n    super(\n      request,\n      async props =>\n        new Page(\n          client,\n          props.response,\n          await defaultParseResponse(props),\n          props.options,\n        ),\n    );\n  }\n\n  /**\n   * Allow auto-paginating iteration on an un awaited list call, eg:\n   *\n   * ```ts\n   * for await (const item of client.items.list()) {\n   *   console.log(item)\n   * }\n   * ```\n   */\n  async *[Symbol.asyncIterator]() {\n    const page = await this;\n    for await (const item of page) {\n      yield item;\n    }\n  }\n}\n"],"names":["castToError","err","HttpException","APIError","status","error","message","headers","data","msg","errorResponse","APIConnectionError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","APIUserAbortError","cause","APIConnectionTimeoutError","Stream","iterator","controller","response","consumed","decoder","SSEDecoder","iterMessages","lineDecoder","LineDecoder","iter","readableStreamAsyncIterable","chunk","line","sse","done","e","readableStream","iterLines","left","right","teeIterator","queue","result","self","encoder","ctrl","value","bytes","fieldname","_","raw","partition","text","trailingNewline","lines","str","delimiter","index","stream","reader","cancelPromise","isResponseLike","isFileLike","isBlobLike","isUploadable","isFsReadStream","toFile","name","options","blob","File","bits","getBytes","getName","type","parts","isAsyncIterableIterator","propsForError","p","getStringFromMaybeBuffer","x","isMultipartBody","body","maybeMultipartFormRequestOptions","opts","hasUploadableValue","form","createForm","getMultipartRequestOptions","multipartFormRequestOptions","key","addFormValue","k","file","entry","prop","safeJSON","sleep","ms","resolve","isEmptyObj","obj","_k","hasOwn","debug","action","args","uuid4","c","r","startsWithSchemeRegexp","isAbsoluteURL","url","requestOptionsKeys","isRequestOptions","createResponseHeaders","target","validatePositiveInteger","n","defaultParseResponse","props","json","APIPromise","responsePromise","parseResponse","transform","onfulfilled","onrejected","onfinally","APIClient","baseURL","maxRetries","timeout","httpAgent","overrideFetch","fetch","_opts","authHeaders","_headers","_customHeaders","path","method","Page","query","contentLength","getDefaultAgent","minAgentTimeout","defaultHeaders","reqHeaders","shimsKind","req","_request","_config","header","remainingRetries","optionsInput","retriesRemaining","responseHeaders","errText","errJSON","errMessage","request","PagePromise","defaultQuery","init","signal","shouldRetryHeader","timeoutMillis","retryAfterHeader","timeoutSeconds","numRetries","sleepSeconds","jitter","AbstractPage","#client","client","nextInfo","nextOptions","params","page","item"],"mappings":"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"}