/* eslint-disable @typescript-eslint/no-explicit-any */ import axios from 'axios' import { buildStorage, CacheRequestConfig, setupCache, } from 'axios-cache-interceptor' import log from 'loglevel' import { ApiConfig, DEFAULT_API_CONFIG } from './api-config' import { ApiResponse, ApisauceInstance, create } from './apisauce' interface ApisauceCacheInstance extends ApisauceInstance { axiosInstance: ReturnType get: ( url: string, params?: Record, axiosConfig?: CacheRequestConfig, ) => Promise> delete: ( url: string, params?: Record, axiosConfig?: CacheRequestConfig, ) => Promise> head: ( url: string, params?: Record, axiosConfig?: CacheRequestConfig, ) => Promise> post: ( url: string, data?: any, axiosConfig?: CacheRequestConfig, ) => Promise> put: ( url: string, data?: any, axiosConfig?: CacheRequestConfig, ) => Promise> patch: ( url: string, data?: any, axiosConfig?: CacheRequestConfig, ) => Promise> link: ( url: string, params?: Record, axiosConfig?: CacheRequestConfig, ) => Promise> unlink: ( url: string, params?: Record, axiosConfig?: CacheRequestConfig, ) => Promise> } /** * Manages all requests to the API. */ export class Api { /** * The underlying apisauce instance which performs the requests. */ apisauce: ApisauceCacheInstance /** * Configurable options. */ config: ApiConfig /** * Creates the api. * * @param config The configuration to use. */ constructor(config: ApiConfig = DEFAULT_API_CONFIG) { this.config = config const axiosInstance = axios.create({ baseURL: this.config.baseUrl, timeout: this.config.timeout, httpsAgent: this.config.httpsAgent, withCredentials: true, headers: { Accept: 'application/json', ...(this.config.headers || {}), }, }) const axiosCache = setupCache(axiosInstance, { ttl: this.config.cacheTtl, debug: (msg) => log.debug(msg), storage: config.storage ? buildStorage(config.storage) : undefined, }) const apisauce = create({ baseURL: this.config.baseUrl, axiosInstance: axiosCache as any, }) as unknown as ApisauceCacheInstance this.apisauce = apisauce } changeUid(uid: string) { this.apisauce.setHeaders({ ...this.config.headers, uid, }) } }