{"version":3,"sources":["../../src/http/client.ts"],"names":[],"mappings":"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","file":"client.mjs","sourcesContent":["import axios, {\n  AxiosInstance,\n  AxiosResponse,\n  AxiosRequestConfig,\n  RawAxiosRequestHeaders,\n} from 'axios';\n\nimport { ConsoleLogger, ILogger } from '../logging';\n\nimport { Interceptor } from './interceptor';\nimport { Token } from './token';\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>(url: string, config?: RequestConfig<D>) {\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  ) {\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  ) {\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  ) {\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>(url: string, config?: RequestConfig<D>) {\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>(config: RequestConfig<D>) {\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) {\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) {\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() {\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) {\n    return new Client({\n      ...this.options,\n      ...options,\n      headers: {\n        ...this.options.headers,\n        ...options?.headers,\n      },\n      interceptors: [...Array.from(this.interceptors.values()).map((i) => i.interceptor)],\n    });\n  }\n\n  protected async withConfig(config: 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"]}