{"version":3,"file":"index.mjs","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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"}