{"version":3,"sources":["../src/index.ts","../src/cache/createBrowserLocalStorageCache.ts","../src/cache/createNullCache.ts","../src/cache/createFallbackableCache.ts","../src/cache/createMemoryCache.ts","../src/constants.ts","../src/createAlgoliaAgent.ts","../src/createAuth.ts","../src/createIterablePromise.ts","../src/getAlgoliaAgent.ts","../src/logger/createNullLogger.ts","../src/logger/logWarning.ts","../src/sse.ts","../src/transporter/compress.ts","../src/transporter/createStatefulHost.ts","../src/transporter/errors.ts","../src/transporter/helpers.ts","../src/transporter/requestId.ts","../src/transporter/responses.ts","../src/transporter/stackTrace.ts","../src/transporter/createTransporter.ts","../src/types/logger.ts","../src/validateParam.ts"],"sourcesContent":["export * from './cache';\nexport * from './constants';\nexport * from './createAlgoliaAgent';\nexport * from './createAuth';\nexport * from './createIterablePromise';\nexport * from './getAlgoliaAgent';\nexport * from './logger';\nexport * from './sse';\nexport * from './transporter';\nexport * from './types';\nexport * from './validateParam';\n","import type { BrowserLocalStorageCacheItem, BrowserLocalStorageOptions, Cache, CacheEvents } from '../types';\n\nexport function createBrowserLocalStorageCache(options: BrowserLocalStorageOptions): Cache {\n  let storage: Storage;\n  // We've changed the namespace to avoid conflicts with v4, as this version is a huge breaking change\n  const namespaceKey = `algolia-client-js-${options.key}`;\n\n  function getStorage(): Storage {\n    if (storage === undefined) {\n      storage = options.localStorage || window.localStorage;\n    }\n\n    return storage;\n  }\n\n  function getNamespace<TValue>(): Record<string, TValue> {\n    return JSON.parse(getStorage().getItem(namespaceKey) || '{}');\n  }\n\n  function setNamespace(namespace: Record<string, any>): void {\n    getStorage().setItem(namespaceKey, JSON.stringify(namespace));\n  }\n\n  function yieldToMain(): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, 0));\n  }\n\n  function getFilteredNamespace(): {\n    namespace: Record<string, BrowserLocalStorageCacheItem>;\n    changed: boolean;\n  } {\n    const timeToLive = options.timeToLive ? options.timeToLive * 1000 : null;\n    const namespace = getNamespace<BrowserLocalStorageCacheItem>();\n    const currentTime = new Date().getTime();\n    let changed = false;\n\n    const filtered = Object.fromEntries(\n      Object.entries(namespace).filter(([, cacheItem]) => {\n        if (!cacheItem || cacheItem.timestamp === undefined) {\n          changed = true;\n          return false;\n        }\n\n        if (!timeToLive) {\n          return true;\n        }\n\n        if (cacheItem.timestamp + timeToLive < currentTime) {\n          changed = true;\n          return false;\n        }\n\n        return true;\n      }),\n    );\n\n    return { namespace: filtered, changed };\n  }\n\n  return {\n    get<TValue>(\n      key: Record<string, any> | string,\n      defaultValue: () => Promise<TValue>,\n      events: CacheEvents<TValue> = {\n        miss: () => Promise.resolve(),\n      },\n    ): Promise<TValue> {\n      return yieldToMain().then(() => {\n        const { namespace, changed } = getFilteredNamespace();\n        const cachedItem = namespace[JSON.stringify(key)];\n\n        if (changed) {\n          setNamespace(namespace);\n        }\n\n        if (cachedItem) {\n          return cachedItem.value as TValue;\n        }\n\n        return defaultValue().then((value) => events.miss(value).then(() => value));\n      });\n    },\n\n    set<TValue>(key: Record<string, any> | string, value: TValue): Promise<TValue> {\n      return yieldToMain().then(() => {\n        const namespace = getNamespace();\n\n        namespace[JSON.stringify(key)] = {\n          timestamp: new Date().getTime(),\n          value,\n        };\n\n        getStorage().setItem(namespaceKey, JSON.stringify(namespace));\n\n        return value;\n      });\n    },\n\n    delete(key: Record<string, any> | string): Promise<void> {\n      return yieldToMain().then(() => {\n        const namespace = getNamespace();\n\n        delete namespace[JSON.stringify(key)];\n\n        getStorage().setItem(namespaceKey, JSON.stringify(namespace));\n      });\n    },\n\n    clear(): Promise<void> {\n      return Promise.resolve().then(() => {\n        getStorage().removeItem(namespaceKey);\n      });\n    },\n  };\n}\n","import type { Cache, CacheEvents } from '../types';\n\nexport function createNullCache(): Cache {\n  return {\n    get<TValue>(\n      _key: Record<string, any> | string,\n      defaultValue: () => Promise<TValue>,\n      events: CacheEvents<TValue> = {\n        miss: (): Promise<void> => Promise.resolve(),\n      },\n    ): Promise<TValue> {\n      const value = defaultValue();\n\n      return value.then((result) => Promise.all([result, events.miss(result)])).then(([result]) => result);\n    },\n\n    set<TValue>(_key: Record<string, any> | string, value: TValue): Promise<TValue> {\n      return Promise.resolve(value);\n    },\n\n    delete(_key: Record<string, any> | string): Promise<void> {\n      return Promise.resolve();\n    },\n\n    clear(): Promise<void> {\n      return Promise.resolve();\n    },\n  };\n}\n","import type { Cache, CacheEvents, FallbackableCacheOptions } from '../types';\nimport { createNullCache } from './createNullCache';\n\nexport function createFallbackableCache(options: FallbackableCacheOptions): Cache {\n  const caches = [...options.caches];\n  const current = caches.shift();\n\n  if (current === undefined) {\n    return createNullCache();\n  }\n\n  return {\n    get<TValue>(\n      key: Record<string, any> | string,\n      defaultValue: () => Promise<TValue>,\n      events: CacheEvents<TValue> = {\n        miss: (): Promise<void> => Promise.resolve(),\n      },\n    ): Promise<TValue> {\n      return current.get(key, defaultValue, events).catch(() => {\n        return createFallbackableCache({ caches }).get(key, defaultValue, events);\n      });\n    },\n\n    set<TValue>(key: Record<string, any> | string, value: TValue): Promise<TValue> {\n      return current.set(key, value).catch(() => {\n        return createFallbackableCache({ caches }).set(key, value);\n      });\n    },\n\n    delete(key: Record<string, any> | string): Promise<void> {\n      return current.delete(key).catch(() => {\n        return createFallbackableCache({ caches }).delete(key);\n      });\n    },\n\n    clear(): Promise<void> {\n      return current.clear().catch(() => {\n        return createFallbackableCache({ caches }).clear();\n      });\n    },\n  };\n}\n","import type { Cache, CacheEvents, MemoryCacheOptions } from '../types';\n\nexport function createMemoryCache(options: MemoryCacheOptions = { serializable: true }): Cache {\n  let cache: Record<string, any> = {};\n\n  return {\n    get<TValue>(\n      key: Record<string, any> | string,\n      defaultValue: () => Promise<TValue>,\n      events: CacheEvents<TValue> = {\n        miss: (): Promise<void> => Promise.resolve(),\n      },\n    ): Promise<TValue> {\n      const keyAsString = JSON.stringify(key);\n\n      if (keyAsString in cache) {\n        return Promise.resolve(options.serializable ? JSON.parse(cache[keyAsString]) : cache[keyAsString]);\n      }\n\n      const promise = defaultValue();\n\n      return promise.then((value: TValue) => events.miss(value)).then(() => promise);\n    },\n\n    set<TValue>(key: Record<string, any> | string, value: TValue): Promise<TValue> {\n      cache[JSON.stringify(key)] = options.serializable ? JSON.stringify(value) : value;\n\n      return Promise.resolve(value);\n    },\n\n    delete(key: Record<string, unknown> | string): Promise<void> {\n      delete cache[JSON.stringify(key)];\n\n      return Promise.resolve();\n    },\n\n    clear(): Promise<void> {\n      cache = {};\n\n      return Promise.resolve();\n    },\n  };\n}\n","export const DEFAULT_CONNECT_TIMEOUT_BROWSER = 1000;\nexport const DEFAULT_READ_TIMEOUT_BROWSER = 2000;\nexport const DEFAULT_WRITE_TIMEOUT_BROWSER = 30000;\n\nexport const DEFAULT_CONNECT_TIMEOUT_NODE = 2000;\nexport const DEFAULT_READ_TIMEOUT_NODE = 5000;\nexport const DEFAULT_WRITE_TIMEOUT_NODE = 30000;\n\nexport const DEFAULT_REPLACE_ALL_OBJECTS_MAX_RETRIES = 800;\n","import type { AlgoliaAgent, AlgoliaAgentOptions } from './types';\n\nexport function createAlgoliaAgent(version: string): AlgoliaAgent {\n  const algoliaAgent = {\n    value: `Algolia for JavaScript (${version})`,\n    add(options: AlgoliaAgentOptions): AlgoliaAgent {\n      const addedAlgoliaAgent = `; ${options.segment}${options.version !== undefined ? ` (${options.version})` : ''}`;\n\n      if (algoliaAgent.value.indexOf(addedAlgoliaAgent) === -1) {\n        algoliaAgent.value = `${algoliaAgent.value}${addedAlgoliaAgent}`;\n      }\n\n      return algoliaAgent;\n    },\n  };\n\n  return algoliaAgent;\n}\n","import type { AuthMode, Headers, QueryParameters } from './types';\n\nexport function createAuth(\n  appId: string,\n  apiKey: string,\n  authMode: AuthMode = 'WithinHeaders',\n): {\n  readonly headers: () => Headers;\n  readonly queryParameters: () => QueryParameters;\n} {\n  const credentials = {\n    'x-algolia-api-key': apiKey,\n    'x-algolia-application-id': appId,\n  };\n\n  return {\n    headers(): Headers {\n      return authMode === 'WithinHeaders' ? credentials : {};\n    },\n\n    queryParameters(): QueryParameters {\n      return authMode === 'WithinQueryParameters' ? credentials : {};\n    },\n  };\n}\n","import type { CreateIterablePromise } from './types/createIterablePromise';\n\n/**\n * Helper: Returns the promise of a given `func` to iterate on, based on a given `validate` condition.\n *\n * @param createIterator - The createIterator options.\n * @param createIterator.func - The function to run, which returns a promise.\n * @param createIterator.validate - The validator function. It receives the resolved return of `func`.\n * @param createIterator.aggregator - The function that runs right after the `func` method has been executed, allows you to do anything with the response before `validate`.\n * @param createIterator.error - The `validate` condition to throw an error, and its message.\n * @param createIterator.timeout - The function to decide how long to wait between iterations.\n */\nexport function createIterablePromise<TResponse>({\n  func,\n  validate,\n  aggregator,\n  error,\n  timeout = (): number => 0,\n}: CreateIterablePromise<TResponse>): Promise<TResponse> {\n  const retry = (previousResponse?: TResponse | undefined): Promise<TResponse> => {\n    return new Promise<TResponse>((resolve, reject) => {\n      func(previousResponse)\n        .then(async (response) => {\n          if (aggregator) {\n            await aggregator(response);\n          }\n\n          if (await validate(response)) {\n            return resolve(response);\n          }\n\n          if (error && (await error.validate(response))) {\n            return reject(new Error(await error.message(response)));\n          }\n\n          return setTimeout(\n            () => {\n              retry(response).then(resolve).catch(reject);\n            },\n            await timeout(),\n          );\n        })\n        .catch((err) => {\n          reject(err);\n        });\n    });\n  };\n\n  return retry();\n}\n","import { createAlgoliaAgent } from './createAlgoliaAgent';\nimport type { AlgoliaAgent, AlgoliaAgentOptions } from './types';\n\nexport type GetAlgoliaAgent = {\n  algoliaAgents: AlgoliaAgentOptions[];\n  client: string;\n  version: string;\n};\n\nexport function getAlgoliaAgent({ algoliaAgents, client, version }: GetAlgoliaAgent): AlgoliaAgent {\n  const defaultAlgoliaAgent = createAlgoliaAgent(version).add({\n    segment: client,\n    version,\n  });\n\n  algoliaAgents.forEach((algoliaAgent) => defaultAlgoliaAgent.add(algoliaAgent));\n\n  return defaultAlgoliaAgent;\n}\n","import type { Logger } from '../types/logger';\n\nexport function createNullLogger(): Logger {\n  return {\n    debug(_message: string, _args?: any | undefined): Promise<void> {\n      return Promise.resolve();\n    },\n    info(_message: string, _args?: any | undefined): Promise<void> {\n      return Promise.resolve();\n    },\n    error(_message: string, _args?: any | undefined): Promise<void> {\n      return Promise.resolve();\n    },\n  };\n}\n","import type { Logger } from '../types';\n\n/**\n * Prefers the logger's optional `warn` method and falls back to `console.warn`, so warnings stay visible with the default no-op logger.\n */\nexport function logWarning(logger: Logger, message: string): void {\n  if (logger.warn) {\n    // a rejecting custom `warn` must not become a fatal unhandled rejection\n    void Promise.resolve(logger.warn(message)).catch(() => {});\n  } else {\n    console.warn(message);\n  }\n}\n","/**\n * WHATWG-compliant Server-Sent Events parser.\n *\n * Three-layer architecture:\n *   1. iterLines()    — byte chunking → line decoding\n *   2. SSEDecoder     — line → SSE event decoding\n *   3. iterSSEEvents  — top-level composer (exported)\n *\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n */\n\nconst MAX_LINE_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type ServerSentEvent = {\n  /** Concatenated data: field values, joined by '\\n'. */\n  data: string;\n  /** Event type from the event: field. Defaults to \"\" (empty string). */\n  event: string;\n  /** Last event ID. Persists across dispatches until changed. */\n  id: string | null;\n  /** Reconnection time in ms. Persists across dispatches until changed. */\n  retry: number | null;\n};\n\n/**\n * Wrapper for a parsed SSE event, yielded by the typed `*Stream` methods.\n *\n * - `data` is the JSON-parsed payload when parsing succeeds, `null` otherwise.\n * - `raw` is the original {@link ServerSentEvent} (always present).\n * - `error` is set when JSON parsing of `event.data` failed.\n */\nexport type StreamEvent<T = Record<string, unknown>> = {\n  /** Parsed data from the event, or `null` if parsing failed. */\n  data: T | null;\n  /** The original, unparsed SSE event. */\n  raw: ServerSentEvent;\n  /** The error that occurred while parsing `event.data`, if any. */\n  error?: Error;\n};\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Converts a ReadableStream into an AsyncIterable via getReader().\n * Fallback for environments where ReadableStream lacks Symbol.asyncIterator.\n */\nasync function* readableStreamToAsyncIterable(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array> {\n  const reader = stream.getReader();\n  try {\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) return;\n      yield value;\n    }\n  } finally {\n    reader.releaseLock();\n  }\n}\n\n/**\n * Normalizes the input to an AsyncIterable<Uint8Array>.\n * Prefers Symbol.asyncIterator if available; falls back to getReader().\n */\nfunction toAsyncIterable(stream: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>): AsyncIterable<Uint8Array> {\n  if (Symbol.asyncIterator in stream) {\n    return stream as AsyncIterable<Uint8Array>;\n  }\n  return readableStreamToAsyncIterable(stream as ReadableStream<Uint8Array>);\n}\n\n// ─── Layer 1: Byte stream → Lines ──────────────────────────────────────────\n\n/**\n * Yields individual lines from a byte stream.\n *\n * Handles \\r, \\n, and \\r\\n line endings, including \\r\\n split across chunks.\n * Uses offset tracking within each decoded chunk to avoid O(n²) buffer growth.\n * Strips BOM (U+FEFF) from the very first line.\n * Throws if the internal line buffer exceeds 10MB.\n */\nasync function* iterLines(stream: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>): AsyncGenerator<string> {\n  const decoder = new TextDecoder('utf-8');\n  const buffer: string[] = [];\n  let bufferSize = 0;\n  let trailingCR = false;\n  let isFirstLine = true;\n\n  for await (const chunk of toAsyncIterable(stream)) {\n    const text = decoder.decode(chunk, { stream: true });\n    let offset = 0;\n\n    // Handle \\r\\n split across chunks: if the previous chunk ended with \\r\n    // and this one starts with \\n, skip the \\n (it's the second half of \\r\\n)\n    if (trailingCR) {\n      trailingCR = false;\n      if (text.length > 0 && text[0] === '\\n') {\n        offset = 1;\n      }\n    }\n\n    while (offset < text.length) {\n      const crIdx = text.indexOf('\\r', offset);\n      const lfIdx = text.indexOf('\\n', offset);\n\n      // No more line endings in this chunk — buffer the rest\n      if (crIdx === -1 && lfIdx === -1) {\n        const remaining = text.slice(offset);\n        buffer.push(remaining);\n        bufferSize += remaining.length;\n        if (bufferSize > MAX_LINE_BUFFER_SIZE) {\n          throw new Error('SSE line buffer exceeded 10MB');\n        }\n        break;\n      }\n\n      let endIdx: number;\n      let skipLen: number;\n\n      if (crIdx !== -1 && (lfIdx === -1 || crIdx < lfIdx)) {\n        // \\r found before \\n (or no \\n at all)\n        endIdx = crIdx;\n        if (crIdx + 1 < text.length) {\n          // Peek ahead: \\r\\n or bare \\r\n          skipLen = text[crIdx + 1] === '\\n' ? 2 : 1;\n        } else {\n          // \\r at end of chunk — might be \\r\\n split across chunks\n          trailingCR = true;\n          skipLen = 1;\n        }\n      } else {\n        // \\n found before \\r (or no \\r at all)\n        // Safe: at least one of crIdx/lfIdx is != -1, and we're in the else\n        // branch, so lfIdx must be != -1\n        endIdx = lfIdx;\n        skipLen = 1;\n      }\n\n      const segment = text.slice(offset, endIdx);\n      buffer.push(segment);\n\n      let line = buffer.length === 1 ? buffer[0]! : buffer.join('');\n      buffer.length = 0;\n      bufferSize = 0;\n\n      // Strip BOM from the very first line only\n      if (isFirstLine) {\n        if (line.startsWith('\\uFEFF')) {\n          line = line.slice(1);\n        }\n        isFirstLine = false;\n      }\n\n      yield line;\n      offset = endIdx + skipLen;\n    }\n  }\n\n  // Flush TextDecoder (handles any remaining bytes from multi-byte sequences)\n  const remaining = decoder.decode();\n  if (remaining) {\n    buffer.push(remaining);\n  }\n\n  // Yield any remaining buffered content as the final line\n  if (buffer.length > 0) {\n    let line = buffer.join('');\n    if (isFirstLine && line.startsWith('\\uFEFF')) {\n      line = line.slice(1);\n    }\n    yield line;\n  }\n}\n\n// ─── Layer 2: Lines → SSE Events ──────────────────────────────────────────\n\n/**\n * Stateful SSE event decoder. Feed lines one at a time via decode().\n * Returns a ServerSentEvent on blank lines (dispatch), null otherwise.\n *\n * Per WHATWG spec §9.2.6:\n * - lastEventId persists across dispatches\n * - retry persists across dispatches (global reconnection setting)\n * - eventType resets after every blank line (even when data is empty)\n * - data buffer resets after dispatch\n * - id field containing NULL (\\0) is ignored entirely\n * - retry field must be ASCII digits only\n */\nclass SSEDecoder {\n  private data: string[] = [];\n  private eventType = '';\n  private lastEventId: string | null = null;\n  private retry: number | null = null;\n\n  decode(line: string): ServerSentEvent | null {\n    // Blank line → dispatch event or reset\n    if (line === '') {\n      return this.dispatch();\n    }\n\n    // Comment line (starts with ':')\n    if (line[0] === ':') {\n      return null;\n    }\n\n    // Parse field:value\n    const colonIdx = line.indexOf(':');\n    let field: string;\n    let value: string;\n\n    if (colonIdx === -1) {\n      // No colon → field is entire line, value is empty\n      field = line;\n      value = '';\n    } else {\n      field = line.slice(0, colonIdx);\n      value = line.slice(colonIdx + 1);\n      // Strip exactly ONE leading space (if present)\n      if (value[0] === ' ') {\n        value = value.slice(1);\n      }\n    }\n\n    switch (field) {\n      case 'data':\n        this.data.push(value);\n        break;\n      case 'event':\n        this.eventType = value;\n        break;\n      case 'id':\n        // Ignore if value contains NULL character (security: WHATWG spec)\n        if (!value.includes('\\0')) {\n          this.lastEventId = value;\n        }\n        break;\n      case 'retry':\n        // Must consist of ASCII digits only (no negatives, no whitespace)\n        if (/^[0-9]+$/.test(value)) {\n          this.retry = parseInt(value, 10);\n        }\n        break;\n      // Unknown fields: ignore silently\n    }\n\n    return null;\n  }\n\n  private dispatch(): ServerSentEvent | null {\n    // eventType resets on every blank line per WHATWG spec,\n    // regardless of whether we actually dispatch an event\n    const currentEventType = this.eventType;\n    this.eventType = '';\n\n    // Suppress dispatch when no data: lines were received\n    if (this.data.length === 0) {\n      return null;\n    }\n\n    const event: ServerSentEvent = {\n      data: this.data.join('\\n'),\n      event: currentEventType,\n      id: this.lastEventId,\n      retry: this.retry,\n    };\n\n    // Reset data buffer; lastEventId and retry persist across dispatches\n    this.data = [];\n\n    return event;\n  }\n}\n\n// ─── Layer 3: Top-level composer ──────────────────────────────────────────\n\n/**\n * Parses a byte stream as WHATWG Server-Sent Events.\n *\n * Accepts both ReadableStream<Uint8Array> (browser fetch) and\n * AsyncIterable<Uint8Array> (Node.js streams / Buffer chunks).\n *\n * @example\n * ```ts\n * const response = await fetch(url);\n * for await (const event of iterSSEEvents(response.body!)) {\n *   console.log(event.event, event.data);\n * }\n * ```\n */\nexport async function* iterSSEEvents(\n  stream: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>,\n): AsyncGenerator<ServerSentEvent> {\n  const decoder = new SSEDecoder();\n  for await (const line of iterLines(stream)) {\n    const event = decoder.decode(line);\n    if (event !== null) {\n      yield event;\n    }\n  }\n}\n","export const COMPRESSION_THRESHOLD = 750;\n","import type { Host, StatefulHost } from '../types';\n\n// By default, API Clients at Algolia have expiration delay of 5 mins.\n// In the JavaScript client, we have 2 mins.\nconst EXPIRATION_DELAY = 2 * 60 * 1000;\n\nexport function createStatefulHost(host: Host, status: StatefulHost['status'] = 'up'): StatefulHost {\n  const lastUpdate = Date.now();\n\n  function isUp(): boolean {\n    return status === 'up' || Date.now() - lastUpdate > EXPIRATION_DELAY;\n  }\n\n  function isTimedOut(): boolean {\n    return status === 'timed out' && Date.now() - lastUpdate <= EXPIRATION_DELAY;\n  }\n\n  return { ...host, status, lastUpdate, isUp, isTimedOut };\n}\n","import type { Headers, Response, StackFrame } from '../types';\n\nexport class AlgoliaError extends Error {\n  override name: string = 'AlgoliaError';\n\n  constructor(message: string, name: string) {\n    super(message);\n\n    if (name) {\n      this.name = name;\n    }\n  }\n}\n\nexport class IndexNotFoundError extends AlgoliaError {\n  constructor(indexName: string) {\n    super(`${indexName} does not exist`, 'IndexNotFoundError');\n  }\n}\n\nexport class IndicesInSameAppError extends AlgoliaError {\n  constructor() {\n    super('Indices are in the same application. Use operationIndex instead.', 'IndicesInSameAppError');\n  }\n}\n\nexport class IndexAlreadyExistsError extends AlgoliaError {\n  constructor(indexName: string) {\n    super(`${indexName} index already exists.`, 'IndexAlreadyExistsError');\n  }\n}\n\nexport class ErrorWithStackTrace extends AlgoliaError {\n  stackTrace: StackFrame[];\n\n  correlationId?: string | undefined;\n\n  constructor(message: string, stackTrace: StackFrame[], name: string, correlationId?: string | undefined) {\n    super(correlationId ? `${message} (Correlation-ID: ${correlationId})` : message, name);\n    // the array and object should be frozen to reflect the stackTrace at the time of the error\n    this.stackTrace = stackTrace;\n    this.correlationId = correlationId;\n  }\n}\n\nexport class RetryError extends ErrorWithStackTrace {\n  constructor(stackTrace: StackFrame[], correlationId?: string | undefined) {\n    super(\n      'Unreachable hosts - your application id may be incorrect. If the error persists, please visit our help center https://alg.li/support-unreachable-hosts or reach out to the Algolia Support team: https://alg.li/support',\n      stackTrace,\n      'RetryError',\n      correlationId,\n    );\n  }\n}\n\nexport class ApiError extends ErrorWithStackTrace {\n  status: number;\n\n  constructor(\n    message: string,\n    status: number,\n    stackTrace: StackFrame[],\n    name = 'ApiError',\n    correlationId?: string | undefined,\n  ) {\n    super(message, stackTrace, name, correlationId);\n    this.status = status;\n  }\n}\n\n/**\n * Thrown by `sendStream` when the HTTP status is not 2xx, so `requestStream` can\n * wait and retry on 429 using `Retry-After` without parsing the error message.\n */\nexport class StreamRequestError extends AlgoliaError {\n  status: number;\n\n  headers?: Headers | undefined;\n\n  constructor(status: number, body: string, headers?: Headers | undefined) {\n    super(`HTTP ${status}: ${body}`, 'StreamRequestError');\n    this.status = status;\n    this.headers = headers;\n  }\n}\n\nexport class DeserializationError extends AlgoliaError {\n  response: Response;\n\n  correlationId?: string | undefined;\n\n  constructor(message: string, response: Response, correlationId?: string | undefined) {\n    super(correlationId ? `${message} (Correlation-ID: ${correlationId})` : message, 'DeserializationError');\n    this.response = response;\n    this.correlationId = correlationId;\n  }\n}\n\nexport type DetailedErrorWithMessage = {\n  message: string;\n  label: string;\n};\n\nexport type DetailedErrorWithTypeID = {\n  id: string;\n  type: string;\n  name?: string | undefined;\n};\n\nexport type DetailedError = {\n  code: string;\n  details?: DetailedErrorWithMessage[] | DetailedErrorWithTypeID[] | undefined;\n};\n\n// DetailedApiError is only used by the ingestion client to return more informative error, other clients will use ApiClient.\nexport class DetailedApiError extends ApiError {\n  error: DetailedError;\n\n  constructor(\n    message: string,\n    status: number,\n    error: DetailedError,\n    stackTrace: StackFrame[],\n    correlationId?: string | undefined,\n  ) {\n    super(message, status, stackTrace, 'DetailedApiError', correlationId);\n    this.error = error;\n  }\n}\n","import type {\n  AlgoliaHttpResponse,\n  Headers,\n  Host,\n  QueryParameters,\n  Request,\n  RequestOptions,\n  Response,\n  StackFrame,\n} from '../types';\nimport { ApiError, DeserializationError, DetailedApiError } from './errors';\n\nexport function shuffle<TData>(array: TData[]): TData[] {\n  const shuffledArray = array;\n\n  for (let c = array.length - 1; c > 0; c--) {\n    const b = Math.floor(Math.random() * (c + 1));\n    const a = array[c];\n\n    shuffledArray[c] = array[b];\n    shuffledArray[b] = a;\n  }\n\n  return shuffledArray;\n}\n\nexport function serializeUrl(host: Host, path: string, queryParameters: QueryParameters): string {\n  const queryParametersAsString = serializeQueryParameters(queryParameters);\n  let url = `${host.protocol}://${host.url}${host.port ? `:${host.port}` : ''}/${\n    path.charAt(0) === '/' ? path.substring(1) : path\n  }`;\n\n  if (queryParametersAsString.length) {\n    url += `?${queryParametersAsString}`;\n  }\n\n  return url;\n}\n\nexport function serializeQueryParameters(parameters: QueryParameters): string {\n  return Object.keys(parameters)\n    .filter((key) => parameters[key] !== undefined)\n    .sort()\n    .map(\n      (key) =>\n        `${key}=${encodeURIComponent(\n          Object.prototype.toString.call(parameters[key]) === '[object Array]'\n            ? parameters[key].join(',')\n            : parameters[key],\n        ).replace(/\\+/g, '%20')}`,\n    )\n    .join('&');\n}\n\nexport function serializeData(request: Request, requestOptions: RequestOptions): string | undefined {\n  if (request.method === 'GET' || (request.data === undefined && requestOptions.data === undefined)) {\n    return undefined;\n  }\n\n  const data = Array.isArray(request.data) ? request.data : { ...request.data, ...requestOptions.data };\n\n  return JSON.stringify(data);\n}\n\nexport function serializeHeaders(\n  baseHeaders: Headers,\n  requestHeaders: Headers,\n  requestOptionsHeaders?: Headers | undefined,\n): Headers {\n  const headers: Headers = {\n    Accept: 'application/json',\n    ...baseHeaders,\n    ...requestHeaders,\n    ...requestOptionsHeaders,\n  };\n  const serializedHeaders: Headers = {};\n\n  Object.keys(headers).forEach((header) => {\n    const value = headers[header];\n    serializedHeaders[header.toLowerCase()] = value;\n  });\n\n  return serializedHeaders;\n}\n\nexport function deserializeSuccess<TObject>(response: Response): TObject {\n  // Handle 204 No Content and other empty responses\n  if (response.status === 204 || response.content.length === 0) {\n    return undefined as unknown as TObject;\n  }\n\n  try {\n    return JSON.parse(response.content);\n  } catch (e) {\n    throw new DeserializationError((e as Error).message, response, getCorrelationId(response.headers));\n  }\n}\n\nexport function deserializeSuccessWithHttpInfo<TData>(response: Response): AlgoliaHttpResponse<TData> {\n  return {\n    status: response.status,\n    headers: response.headers,\n    content: response.content,\n    data: deserializeSuccess<TData>(response),\n  };\n}\n\nexport function getCorrelationId(headers: Headers | undefined): string | undefined {\n  if (!headers) {\n    return undefined;\n  }\n\n  if (headers['correlation-id'] !== undefined) {\n    return headers['correlation-id'];\n  }\n\n  const header = Object.keys(headers).find((key) => key.toLowerCase() === 'correlation-id');\n\n  return header === undefined ? undefined : headers[header];\n}\n\nexport function getLastCorrelationId(stackTrace: StackFrame[]): string | undefined {\n  for (let i = stackTrace.length - 1; i >= 0; i--) {\n    const correlationId = getCorrelationId(stackTrace[i].response.headers);\n    if (correlationId !== undefined) {\n      return correlationId;\n    }\n  }\n\n  return undefined;\n}\n\nexport function deserializeFailure(response: Response, stackFrame: StackFrame[]): Error {\n  const { content, status } = response;\n  const correlationId = getCorrelationId(response.headers);\n  try {\n    const parsed = JSON.parse(content);\n    if ('error' in parsed) {\n      return new DetailedApiError(parsed.message, status, parsed.error, stackFrame, correlationId);\n    }\n    return new ApiError(parsed.message, status, stackFrame, 'ApiError', correlationId);\n  } catch {\n    // ..\n  }\n  return new ApiError(content, status, stackFrame, 'ApiError', correlationId);\n}\n","import type { Headers, QueryParameters, RequestOptions, Transporter } from '../types';\n\nconst BASE62_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\nconst REQUEST_ID_LENGTH = 11;\n\nexport function generateRequestId(): string {\n  let requestId = '';\n\n  if (typeof globalThis.crypto?.getRandomValues === 'function') {\n    const bytes = new Uint8Array(REQUEST_ID_LENGTH);\n    globalThis.crypto.getRandomValues(bytes);\n    for (const byte of bytes) {\n      requestId += BASE62_CHARS[byte % BASE62_CHARS.length];\n    }\n\n    return requestId;\n  }\n\n  for (let i = 0; i < REQUEST_ID_LENGTH; i++) {\n    requestId += BASE62_CHARS[Math.floor(Math.random() * BASE62_CHARS.length)];\n  }\n\n  return requestId;\n}\n\nfunction hasRequestId(headers: Headers | undefined, queryParameters: QueryParameters | undefined): boolean {\n  return (\n    (headers !== undefined && Object.keys(headers).some((header) => header.toLowerCase() === 'request-id')) ||\n    (queryParameters !== undefined &&\n      Object.keys(queryParameters).some((parameter) => parameter.toLowerCase() === 'x-algolia-request-id'))\n  );\n}\n\n/**\n * Returns request options carrying a Request-ID on the transporter's channel, so that every\n * request a multi-request helper performs shares the same ID. Returns the options unchanged\n * when the channel is off or when a Request-ID is already supplied. Never apply ahead of a\n * cacheable operation: the ID enters the cache key and defeats caching and deduplication.\n */\nexport function withRequestId(\n  transporter: Pick<Transporter, 'requestIdChannel' | 'baseHeaders' | 'baseQueryParameters'>,\n  requestOptions?: RequestOptions | undefined,\n): RequestOptions | undefined {\n  if (\n    transporter.requestIdChannel === undefined ||\n    hasRequestId(transporter.baseHeaders, transporter.baseQueryParameters) ||\n    hasRequestId(requestOptions?.headers, requestOptions?.queryParameters)\n  ) {\n    return requestOptions;\n  }\n\n  if (transporter.requestIdChannel === 'headers') {\n    return { ...requestOptions, headers: { ...requestOptions?.headers, 'request-id': generateRequestId() } };\n  }\n\n  return {\n    ...requestOptions,\n    queryParameters: { ...requestOptions?.queryParameters, 'x-algolia-request-id': generateRequestId() },\n  };\n}\n","import type { Headers, Response } from '../types';\n\nconst DEFAULT_RATE_LIMIT_WAIT_MS = 1000;\n\nexport function isNetworkError({ isTimedOut, status }: Omit<Response, 'content'>): boolean {\n  return !isTimedOut && ~~status === 0;\n}\n\nexport function isRetryable({ isTimedOut, status }: Omit<Response, 'content'>): boolean {\n  return isTimedOut || isNetworkError({ isTimedOut, status }) || (~~(status / 100) !== 2 && ~~(status / 100) !== 4);\n}\n\nexport function isSuccess({ status }: Pick<Response, 'status'>): boolean {\n  return ~~(status / 100) === 2;\n}\n\nexport function isRateLimited({ status }: Pick<Response, 'status'>): boolean {\n  return ~~status === 429;\n}\n\nconst HTTP_429_MESSAGE = /^HTTP 429(?:\\D|$)/;\n\n/**\n * 429 from `sendStream`: a status-bearing error, or the `HTTP 429:` string requesters used to throw.\n */\nexport function isRateLimitedError(error: unknown): boolean {\n  if (typeof error === 'object' && error !== null && 'status' in error) {\n    return isRateLimited(error as Pick<Response, 'status'>);\n  }\n\n  return error instanceof Error && HTTP_429_MESSAGE.test(error.message);\n}\n\nexport function headersFromError(error: unknown): Headers | undefined {\n  if (typeof error === 'object' && error !== null && 'headers' in error) {\n    return (error as { headers?: Headers }).headers;\n  }\n\n  return undefined;\n}\n\n/**\n * `Retry-After` as a wait in milliseconds.\n * Only a positive whole-number-of-seconds string is honored; anything else (missing, `0`, HTTP-date, junk) waits 1s.\n */\nexport function parseRetryAfterMs(headers: Headers | undefined): number {\n  const raw = headers?.['retry-after']?.trim();\n  if (raw === undefined || raw.length === 0) {\n    return DEFAULT_RATE_LIMIT_WAIT_MS;\n  }\n\n  if (!/^\\d+$/.test(raw)) {\n    return DEFAULT_RATE_LIMIT_WAIT_MS;\n  }\n\n  const seconds = Number.parseInt(raw, 10);\n  if (seconds <= 0) {\n    return DEFAULT_RATE_LIMIT_WAIT_MS;\n  }\n\n  return seconds * 1000;\n}\n","import type { Headers, StackFrame } from '../types';\n\nexport function stackTraceWithoutCredentials(stackTrace: StackFrame[]): StackFrame[] {\n  return stackTrace.map((stackFrame) => stackFrameWithoutCredentials(stackFrame));\n}\n\nexport function stackFrameWithoutCredentials(stackFrame: StackFrame): StackFrame {\n  const modifiedHeaders: Headers = stackFrame.request.headers['x-algolia-api-key']\n    ? { 'x-algolia-api-key': '*****' }\n    : {};\n\n  return {\n    ...stackFrame,\n    request: {\n      ...stackFrame.request,\n      headers: {\n        ...stackFrame.request.headers,\n        ...modifiedHeaders,\n      },\n    },\n  };\n}\n","import type { ServerSentEvent } from '../sse';\nimport { iterSSEEvents } from '../sse';\nimport type {\n  AlgoliaHttpResponse,\n  EndRequest,\n  Headers,\n  Host,\n  QueryParameters,\n  Request,\n  RequestOptions,\n  Response,\n  StackFrame,\n  TransporterOptions,\n  TransporterWithHttpInfo,\n} from '../types';\nimport { COMPRESSION_THRESHOLD } from './compress';\nimport { createStatefulHost } from './createStatefulHost';\nimport { RetryError } from './errors';\nimport {\n  deserializeFailure,\n  deserializeSuccess,\n  deserializeSuccessWithHttpInfo,\n  getLastCorrelationId,\n  serializeData,\n  serializeHeaders,\n  serializeUrl,\n} from './helpers';\nimport { generateRequestId } from './requestId';\nimport {\n  headersFromError,\n  isRateLimited,\n  isRateLimitedError,\n  isRetryable,\n  isSuccess,\n  parseRetryAfterMs,\n} from './responses';\nimport { stackFrameWithoutCredentials, stackTraceWithoutCredentials } from './stackTrace';\n\ntype RetryableOptions = {\n  hosts: Host[];\n  getTimeout: (retryCount: number, timeout: number) => number;\n};\n\nexport function createTransporter({\n  hosts,\n  hostsCache,\n  baseHeaders,\n  logger,\n  baseQueryParameters,\n  algoliaAgent,\n  timeouts,\n  requester,\n  requestsCache,\n  responsesCache,\n  compress,\n  compression,\n  requestIdChannel,\n  maxRateLimitRetries = 3,\n}: TransporterOptions): TransporterWithHttpInfo {\n  function injectRequestId(headers: Headers, queryParameters: QueryParameters): void {\n    if (\n      requestIdChannel === undefined ||\n      headers['request-id'] !== undefined ||\n      Object.keys(queryParameters).some((parameter) => parameter.toLowerCase() === 'x-algolia-request-id')\n    ) {\n      return;\n    }\n\n    if (requestIdChannel === 'headers') {\n      headers['request-id'] = generateRequestId();\n    } else {\n      queryParameters['x-algolia-request-id'] = generateRequestId();\n    }\n  }\n\n  const wait = (ms: number): Promise<void> =>\n    new Promise((resolve) => {\n      setTimeout(resolve, ms);\n    });\n\n  async function createRetryableOptions(compatibleHosts: Host[]): Promise<RetryableOptions> {\n    const statefulHosts = await Promise.all(\n      compatibleHosts.map((compatibleHost) => {\n        return hostsCache.get(compatibleHost, () => {\n          return Promise.resolve(createStatefulHost(compatibleHost));\n        });\n      }),\n    );\n    const hostsUp = statefulHosts.filter((host) => host.isUp());\n    const hostsTimedOut = statefulHosts.filter((host) => host.isTimedOut());\n\n    // Note, we put the hosts that previously timed out on the end of the list.\n    const hostsAvailable = [...hostsUp, ...hostsTimedOut];\n    const compatibleHostsAvailable = hostsAvailable.length > 0 ? hostsAvailable : compatibleHosts;\n\n    return {\n      hosts: compatibleHostsAvailable,\n      getTimeout(timeoutsCount: number, baseTimeout: number): number {\n        /**\n         * Imagine that you have 4 hosts, if timeouts will increase\n         * on the following way: 1 (timed out) > 4 (timed out) > 5 (200).\n         *\n         * Note that, the very next request, we start from the previous timeout.\n         *\n         *  5 (timed out) > 6 (timed out) > 7 ...\n         *\n         * This strategy may need to be reviewed, but is the strategy on the our\n         * current v3 version.\n         */\n        const timeoutMultiplier =\n          hostsTimedOut.length === 0 && timeoutsCount === 0 ? 1 : hostsTimedOut.length + 3 + timeoutsCount;\n\n        return timeoutMultiplier * baseTimeout;\n      },\n    };\n  }\n\n  async function retryableRequest(\n    request: Request,\n    requestOptions: RequestOptions,\n    isRead: boolean,\n  ): Promise<Response> {\n    const stackTrace: StackFrame[] = [];\n\n    /**\n     * First we prepare the payload that do not depend from hosts.\n     */\n    const serializedData = serializeData(request, requestOptions);\n    const headers = serializeHeaders(baseHeaders, request.headers, requestOptions.headers);\n\n    const wantsCompression =\n      compression === 'gzip' &&\n      serializedData !== undefined &&\n      serializedData.length > COMPRESSION_THRESHOLD &&\n      (request.method === 'POST' || request.method === 'PUT');\n\n    if (wantsCompression && compress === undefined) {\n      logger.info('Compression is disabled because no compress method is available.');\n    }\n\n    const shouldCompress = wantsCompression && compress !== undefined;\n    const data = shouldCompress ? await compress(serializedData) : serializedData;\n    if (shouldCompress) {\n      headers['content-encoding'] = 'gzip';\n    }\n\n    // On `GET`, the data is proxied to query parameters.\n    const dataQueryParameters: QueryParameters =\n      request.method === 'GET'\n        ? {\n            ...request.data,\n            ...requestOptions.data,\n          }\n        : {};\n\n    const queryParameters: QueryParameters = {\n      ...baseQueryParameters,\n      ...request.queryParameters,\n      ...dataQueryParameters,\n    };\n\n    if (algoliaAgent.value) {\n      queryParameters['x-algolia-agent'] = algoliaAgent.value;\n    }\n\n    if (requestOptions && requestOptions.queryParameters) {\n      for (const key of Object.keys(requestOptions.queryParameters)) {\n        // We want to keep `undefined` and `null` values,\n        // but also avoid stringifying `object`s, as they are\n        // handled in the `serializeUrl` step right after.\n        if (\n          !requestOptions.queryParameters[key] ||\n          Object.prototype.toString.call(requestOptions.queryParameters[key]) === '[object Object]'\n        ) {\n          queryParameters[key] = requestOptions.queryParameters[key];\n        } else {\n          queryParameters[key] = requestOptions.queryParameters[key].toString();\n        }\n      }\n    }\n\n    injectRequestId(headers, queryParameters);\n\n    let timeoutsCount = 0;\n    let rateLimitRetriesLeft = maxRateLimitRetries;\n\n    const retry = async (\n      retryableHosts: Host[],\n      getTimeout: (timeoutsCount: number, timeout: number) => number,\n    ): Promise<Response> => {\n      /**\n       * We iterate on each host, until there is no host left.\n       */\n      const host = retryableHosts.pop();\n      if (host === undefined) {\n        throw new RetryError(stackTraceWithoutCredentials(stackTrace), getLastCorrelationId(stackTrace));\n      }\n\n      const timeout = { ...timeouts, ...requestOptions.timeouts };\n\n      const payload: EndRequest = {\n        data,\n        headers,\n        method: request.method,\n        url: serializeUrl(host, request.path, queryParameters),\n        connectTimeout: getTimeout(timeoutsCount, timeout.connect),\n        responseTimeout: getTimeout(timeoutsCount, isRead ? timeout.read : timeout.write),\n      };\n\n      /**\n       * The stackFrame is pushed to the stackTrace so we\n       * can have information about onRetry and onFailure\n       * decisions.\n       */\n      const pushToStackTrace = (response: Response): StackFrame => {\n        const stackFrame: StackFrame = {\n          request: payload,\n          response,\n          host,\n          triesLeft: retryableHosts.length,\n        };\n\n        stackTrace.push(stackFrame);\n\n        return stackFrame;\n      };\n\n      const response = await requester.send(payload);\n\n      if (isRateLimited(response) && rateLimitRetriesLeft > 0) {\n        rateLimitRetriesLeft--;\n        retryableHosts.push(host);\n        const stackFrame = pushToStackTrace(response);\n        const waitMs = parseRetryAfterMs(response.headers);\n        logger.info('Retryable failure', {\n          ...stackFrameWithoutCredentials(stackFrame),\n          wait: waitMs,\n          rateLimitRetriesLeft,\n        });\n        await wait(waitMs);\n        return retry(retryableHosts, getTimeout);\n      }\n\n      if (isRetryable(response)) {\n        const stackFrame = pushToStackTrace(response);\n\n        // If response is a timeout, we increase the number of timeouts so we can increase the timeout later.\n        if (response.isTimedOut) {\n          timeoutsCount++;\n        }\n        /**\n         * Failures are individually sent to the logger, allowing\n         * the end user to debug / store stack frames even\n         * when a retry error does not happen.\n         */\n        logger.info('Retryable failure', stackFrameWithoutCredentials(stackFrame));\n\n        /**\n         * We also store the state of the host in failure cases. If the host, is\n         * down it will remain down for the next 2 minutes. In a timeout situation,\n         * this host will be added end of the list of hosts on the next request.\n         */\n        await hostsCache.set(host, createStatefulHost(host, response.isTimedOut ? 'timed out' : 'down'));\n\n        return retry(retryableHosts, getTimeout);\n      }\n\n      if (isSuccess(response)) {\n        return response;\n      }\n\n      pushToStackTrace(response);\n      throw deserializeFailure(response, stackTrace);\n    };\n\n    /**\n     * Finally, for each retryable host perform request until we got a non\n     * retryable response. Some notes here:\n     *\n     * 1. The reverse here is applied so we can apply a `pop` later on => more performant.\n     * 2. We also get from the retryable options a timeout multiplier that is tailored\n     * for the current context.\n     */\n    const compatibleHosts = hosts.filter(\n      (host) => host.accept === 'readWrite' || (isRead ? host.accept === 'read' : host.accept === 'write'),\n    );\n    const options = await createRetryableOptions(compatibleHosts);\n\n    return retry([...options.hosts].reverse(), options.getTimeout);\n  }\n\n  function createRequest<TResponse>(request: Request, requestOptions: RequestOptions = {}): Promise<TResponse> {\n    const createRetryableRequest = (): Promise<TResponse> => {\n      /**\n       * Then, we prepare a function factory that contains the construction of\n       * the retryable request. At this point, we may *not* perform the actual\n       * request. But we want to have the function factory ready.\n       */\n      return retryableRequest(request, requestOptions, isRead).then((response) =>\n        deserializeSuccess<TResponse>(response),\n      );\n    };\n\n    /**\n     * A read request is either a `GET` request, or a request that we make\n     * via the `read` transporter (e.g. `search`).\n     */\n    const isRead = request.useReadTransporter || request.method === 'GET';\n\n    /**\n     * Once we have the function factory ready, we need to determine of the\n     * request is \"cacheable\" - should be cached. Note that, once again,\n     * the user can force this option.\n     */\n    const cacheable = requestOptions.cacheable || request.cacheable;\n\n    /**\n     * If is not \"cacheable\", we immediately trigger the retryable request, no\n     * need to check cache implementations.\n     */\n    if (cacheable !== true) {\n      return createRetryableRequest();\n    }\n\n    /**\n     * If the request is \"cacheable\", we need to first compute the key to ask\n     * the cache implementations if this request is on progress or if the\n     * response already exists on the cache.\n     */\n    const key = {\n      request,\n      requestOptions,\n      transporter: {\n        queryParameters: baseQueryParameters,\n        headers: baseHeaders,\n      },\n    };\n\n    /**\n     * With the computed key, we first ask the responses cache\n     * implementation if this request was been resolved before.\n     */\n    return responsesCache.get(\n      key,\n      () => {\n        /**\n         * If the request has never resolved before, we actually ask if there\n         * is a current request with the same key on progress.\n         */\n        return requestsCache.get(key, () =>\n          /**\n           * Finally, if there is no request in progress with the same key,\n           * this `createRetryableRequest()` will actually trigger the\n           * retryable request.\n           */\n          requestsCache\n            .set(key, createRetryableRequest())\n            .then(\n              (response) => Promise.all([requestsCache.delete(key), response]),\n              (err) => Promise.all([requestsCache.delete(key), Promise.reject(err)]),\n            )\n            .then(([_, response]) => response),\n        );\n      },\n      {\n        /**\n         * Of course, once we get this response back from the server, we\n         * tell response cache to actually store the received response\n         * to be used later.\n         */\n        miss: (response) => responsesCache.set(key, response),\n      },\n    );\n  }\n\n  function createRequestWithHttpInfo<TData>(\n    request: Request,\n    requestOptions: RequestOptions = {},\n  ): Promise<AlgoliaHttpResponse<TData>> {\n    /**\n     * A read request is either a `GET` request, or a request that we make\n     * via the `read` transporter (e.g. `search`).\n     */\n    const isRead = request.useReadTransporter || request.method === 'GET';\n\n    /**\n     * The HTTP info variant always hits the network: both the requests and\n     * the responses caches are bypassed, even for `cacheable` requests, so\n     * that the returned status code and headers reflect an actual API call.\n     */\n    return retryableRequest(request, requestOptions, isRead).then((response) =>\n      deserializeSuccessWithHttpInfo<TData>(response),\n    );\n  }\n\n  async function* requestStream(\n    request: Request,\n    requestOptions: RequestOptions = {},\n  ): AsyncGenerator<ServerSentEvent> {\n    if (!requester.sendStream) {\n      throw new Error('This requester does not support streaming');\n    }\n\n    const data = serializeData(request, requestOptions);\n    const headers = serializeHeaders(baseHeaders, request.headers, requestOptions.headers);\n    headers['accept'] = 'text/event-stream';\n\n    // On `GET`, the data is proxied to query parameters.\n    const dataQueryParameters: QueryParameters =\n      request.method === 'GET'\n        ? {\n            ...request.data,\n            ...requestOptions.data,\n          }\n        : {};\n\n    const queryParameters: QueryParameters = {\n      ...baseQueryParameters,\n      ...request.queryParameters,\n      ...dataQueryParameters,\n    };\n\n    if (algoliaAgent.value) {\n      queryParameters['x-algolia-agent'] = algoliaAgent.value;\n    }\n\n    if (requestOptions && requestOptions.queryParameters) {\n      for (const key of Object.keys(requestOptions.queryParameters)) {\n        if (\n          !requestOptions.queryParameters[key] ||\n          Object.prototype.toString.call(requestOptions.queryParameters[key]) === '[object Object]'\n        ) {\n          queryParameters[key] = requestOptions.queryParameters[key];\n        } else {\n          queryParameters[key] = requestOptions.queryParameters[key].toString();\n        }\n      }\n    }\n\n    injectRequestId(headers, queryParameters);\n\n    const isRead = request.useReadTransporter || request.method === 'GET';\n    const compatibleHosts = hosts.filter(\n      (host) => host.accept === 'readWrite' || (isRead ? host.accept === 'read' : host.accept === 'write'),\n    );\n    const options = await createRetryableOptions(compatibleHosts);\n    const host = options.hosts[0];\n    if (!host) {\n      throw new RetryError([]);\n    }\n\n    const timeout = { ...timeouts, ...requestOptions.timeouts };\n    const payload: EndRequest = {\n      data,\n      headers,\n      method: request.method,\n      url: serializeUrl(host, request.path, queryParameters),\n      connectTimeout: timeout.connect,\n      responseTimeout: isRead ? timeout.read : timeout.write,\n    };\n\n    let rateLimitRetriesLeft = maxRateLimitRetries;\n    while (true) {\n      let stream: ReadableStream<Uint8Array>;\n      try {\n        stream = await requester.sendStream(payload);\n      } catch (error) {\n        if (isRateLimitedError(error) && rateLimitRetriesLeft > 0) {\n          rateLimitRetriesLeft--;\n          const waitMs = parseRetryAfterMs(headersFromError(error));\n          logger.info('Retryable failure', {\n            wait: waitMs,\n            rateLimitRetriesLeft,\n            host,\n          });\n          await wait(waitMs);\n          continue;\n        }\n        throw error;\n      }\n      yield* iterSSEEvents(stream);\n      return;\n    }\n  }\n\n  return {\n    hostsCache,\n    requester,\n    timeouts,\n    logger,\n    algoliaAgent,\n    baseHeaders,\n    baseQueryParameters,\n    requestIdChannel,\n    hosts,\n    maxRateLimitRetries,\n    request: createRequest,\n    requestWithHttpInfo: createRequestWithHttpInfo,\n    requestStream,\n    requestsCache,\n    responsesCache,\n  };\n}\n","export const LogLevelEnum: Readonly<Record<string, LogLevelType>> = {\n  Debug: 1,\n  Info: 2,\n  Error: 3,\n};\n\nexport type LogLevelType = 1 | 2 | 3;\n\nexport type Logger = {\n  /**\n   * Logs debug messages.\n   */\n  debug: (message: string, args?: any | undefined) => Promise<void>;\n\n  /**\n   * Logs info messages.\n   */\n  info: (message: string, args?: any | undefined) => Promise<void>;\n\n  /**\n   * Logs warning messages. When not implemented, warnings fall back to `console.warn` so they stay visible with the default no-op logger.\n   */\n  warn?: (message: string, args?: any | undefined) => Promise<void>;\n\n  /**\n   * Logs error messages.\n   */\n  error: (message: string, args?: any | undefined) => Promise<void>;\n};\n","export function validateRequired(field: string, method: string, value: unknown): void {\n  if (value == null || (typeof value === 'string' && value.length === 0)) {\n    throw new Error(`Parameter \\`${field}\\` is required when calling \\`${method}\\`.`);\n  }\n}\n"],"mappings":"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","names":["remaining","response","host"]}