{"version":3,"sources":["../../src/http/client.ts"],"names":[],"mappings":"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","file":"client.mjs","sourcesContent":["import axios from 'axios';\nimport type {\n  AxiosInstance,\n  AxiosResponse,\n  AxiosRequestConfig,\n  RawAxiosRequestHeaders,\n} from 'axios';\n\nimport { ConsoleLogger } from '../logging';\nimport type { ILogger } from '../logging';\n\nimport type { Interceptor } from './interceptor';\nimport type { Token } from './token';\n\n\nexport type ClientOptions = {\n  /**\n   * The client name\n   */\n  readonly name?: string;\n\n  /**\n   * The authorization token to use\n   */\n  readonly token?: Token;\n\n  /**\n   *: ILogger instance to use\n   */\n  readonly logger?: ILogger;\n\n  /**\n   * The baseUrl to prefix all client requests with\n   */\n  readonly baseUrl?: string;\n\n  /**\n   * Default request timeout (ms)\n   */\n  readonly timeout?: number;\n\n  /**\n   * Default headers\n   */\n  readonly headers?: RawAxiosRequestHeaders;\n\n  /**\n   * Default interceptors to register\n   */\n  readonly interceptors?: Array<Interceptor>;\n};\n\nexport type RequestConfig<D = any> = AxiosRequestConfig<D> & {\n  /**\n   * If provided, this token will be used instead of\n   * the default token provided in the `ClientOptions`\n   */\n  token?: Token;\n};\n\ntype InterceptorRegistry = {\n  readonly requestId?: number;\n  readonly responseId?: number;\n  readonly interceptor: Interceptor;\n};\n\nexport class Client {\n  token?: Token;\n  readonly name: string;\n\n  protected options: ClientOptions;\n  protected log: ILogger;\n  protected http: AxiosInstance;\n  protected seq: number = 0;\n  protected interceptors: Map<number, InterceptorRegistry>;\n\n  constructor(options: ClientOptions = {}) {\n    this.options = options;\n    this.name = options.name || 'http';\n    this.token = options.token;\n    this.log = options.logger || new ConsoleLogger(this.name);\n    this.interceptors = new Map<number, InterceptorRegistry>();\n    this.http = axios.create({\n      baseURL: options.baseUrl,\n      timeout: options.timeout,\n      headers: options.headers,\n    });\n\n    for (const interceptor of options.interceptors || []) {\n      this.use(interceptor);\n    }\n  }\n\n  async get<T = any, R = AxiosResponse<T>, D = any>(\n    url: string,\n    config?: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.get<T, R, D>(url, await this.withConfig(config));\n  }\n\n  async post<T = any, R = AxiosResponse<T>, D = any>(\n    url: string,\n    data?: D,\n    config?: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.post<T, R, D>(url, data, await this.withConfig(config));\n  }\n\n  async put<T = any, R = AxiosResponse<T>, D = any>(\n    url: string,\n    data?: D,\n    config?: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.put<T, R, D>(url, data, await this.withConfig(config));\n  }\n\n  async patch<T = any, R = AxiosResponse<T>, D = any>(\n    url: string,\n    data?: D,\n    config?: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.patch<T, R, D>(url, data, await this.withConfig(config));\n  }\n\n  async delete<T = any, R = AxiosResponse<T>, D = any>(\n    url: string,\n    config?: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.delete<T, R, D>(url, await this.withConfig(config));\n  }\n\n  async request<T = any, R = AxiosResponse<T>, D = any>(\n    config: RequestConfig<D>,\n  ): Promise<R> {\n    return this.http.request<T, R, D>(await this.withConfig(config));\n  }\n\n  /**\n   * Register an interceptor to use\n   * as middleware for the request/response/error\n   */\n  use(interceptor: Interceptor): number {\n    const id = ++this.seq;\n    let requestId: number | undefined = undefined;\n    let responseId: number | undefined = undefined;\n\n    if (interceptor.request) {\n      requestId = this.http.interceptors.request.use(\n        /* istanbul ignore next */\n        (config) => {\n          return interceptor.request!({ config, log: this.log });\n        },\n        /* istanbul ignore next */\n        (error: any) => {\n          if (!interceptor.error) return error;\n          return interceptor.error({ error, log: this.log });\n        },\n      );\n    }\n\n    if (interceptor.response) {\n      responseId = this.http.interceptors.response.use(\n        /* istanbul ignore next */\n        (res) => {\n          return interceptor.response!({ res, log: this.log });\n        },\n        /* istanbul ignore next */\n        (error: any) => {\n          if (!interceptor.error) return error;\n          return interceptor.error({ error, log: this.log });\n        },\n      );\n    }\n\n    this.interceptors.set(id, {\n      requestId,\n      responseId,\n      interceptor,\n    });\n\n    return id;\n  }\n\n  /**\n   * Eject an interceptor\n   */\n  eject(id: number): void {\n    const registry = this.interceptors.get(id);\n\n    if (!registry) return;\n\n    if (registry.requestId) {\n      this.http.interceptors.request.eject(registry.requestId);\n    }\n\n    if (registry.responseId) {\n      this.http.interceptors.response.eject(registry.responseId);\n    }\n\n    this.interceptors.delete(id);\n  }\n\n  /**\n   * Clear (Eject) all interceptors\n   */\n  clear(): void {\n    for (const id of this.interceptors.keys()) {\n      this.eject(id);\n    }\n  }\n\n  /**\n   * Create a copy of the client\n   */\n  clone(options?: ClientOptions): Client {\n    const findUA = (h?: RawAxiosRequestHeaders): string | undefined => {\n      if (!h) return undefined;\n      const key = Object.keys(h).find((k) => k.toLowerCase() === 'user-agent');\n      return key ? String(h[key]) : undefined;\n    };\n\n    const parentUA = findUA(this.options.headers);\n    const childUA = findUA(options?.headers);\n    const mergedUA =\n      parentUA && childUA ? `${childUA} ${parentUA}` : childUA || parentUA;\n\n    const headers = {\n      ...this.options.headers,\n      ...options?.headers,\n    };\n\n    if (mergedUA) {\n      for (const key of Object.keys(headers)) {\n        if (key.toLowerCase() === 'user-agent') {\n          delete headers[key];\n        }\n      }\n\n      headers['User-Agent'] = mergedUA;\n    }\n\n    return new Client({\n      ...this.options,\n      ...options,\n      headers,\n      interceptors: [\n        ...Array.from(this.interceptors.values()).map((i) => i.interceptor),\n      ],\n    });\n  }\n\n  protected async withConfig(\n    config: RequestConfig = {},\n  ): Promise<RequestConfig> {\n    let token = config.token || this.token;\n\n    if (config.token) {\n      delete config.token;\n    }\n\n    if (this.options.headers) {\n      if (!config.headers) {\n        config.headers = {};\n      }\n\n      for (const key in this.options.headers) {\n        config.headers[key] = this.options.headers[key];\n      }\n    }\n\n    if (token) {\n      if (!config.headers) {\n        config.headers = {};\n      }\n\n      if (typeof token === 'function') {\n        token = await token(config);\n      }\n\n      if (token && typeof token === 'object') {\n        token = token.toString();\n      }\n\n      config.headers['Authorization'] = `Bearer ${token}`;\n    }\n\n    return config;\n  }\n}\n"]}