UNPKG

@mvxiv/http-service

Version:

Http service for frontend build upon axios

61 lines (51 loc) 1.75 kB
import { default as axios, AxiosInstance } from 'axios'; const useSetHeader = instance => (key, value) => { delete instance.defaults.headers[key]; delete instance.defaults.headers.common[key]; instance.defaults.headers.common[key] = value; }; const useSetInterceptors = instance => interceptors => { for (const [type, interceptorsTuples] of Object.entries(interceptors)) { for (const tuple of interceptorsTuples) { instance.interceptors[type].use(...tuple); } } }; const mergeSerializers = config => { const { transformRequest, transformResponse } = config; if (Array.isArray(transformRequest)) { config.transformRequest = [...transformRequest, ...axios.defaults.transformRequest]; } if (Array.isArray(transformResponse)) { config.transformResponse = [...axios.defaults.transformResponse, ...transformResponse]; } }; /** * @param { object } config - axios config * @param { object } [interceptors] * @returns {{ httpService: AxiosInstance, defineService: function, setHeader: function}} */ export const useHttpService = (config, interceptors) => { mergeSerializers(config); const httpService = axios.create(config); httpService.interceptors.response.use( response => response.data, error => Promise.reject(error) ); const setHeader = useSetHeader(httpService); const setInterceptors = useSetInterceptors(httpService); if (interceptors) { setInterceptors(interceptors); } const defineService = (constructor, args = []) => { const constructorArgs = [httpService, ...args]; const instance = Reflect.construct(constructor, constructorArgs); return () => instance; }; return { httpService, defineService, setHeader, setInterceptors, }; };