/* Responsible for managing HTTP specific functionality */ // @ts-ignore import axios from 'axios' import { logError } from './utils' import * as types from './types/sdk' import makeTruevault from './makeTruevault' const makeRequest = function({ env, ...opts }: { env: types.Env tvKeys: any }): any { if (!env) { throw new Error('Invalid "env". It must be one of: ["testapi", "api"]') } const _auth: types.Auth = { token: undefined, phone_number: undefined, user_id: undefined, tv_uid: undefined, jwt_token: undefined, tv_access_token: undefined, } const _interceptors: types.AxiosInterceptors = { requests: {}, responses: {}, } const _req = axios.create({ baseURL: `https://${env}.aitmed.com/v1`, maxRedirects: 5, // default method: 'get', // default ...opts, }) const truevaultUtils = makeTruevault({ env, ...opts }) return { ...truevaultUtils, addRequestInterceptor(name: string, interceptor: any) { _interceptors.requests[name] = interceptor _req.interceptors.request.use(interceptor) return this }, addResponseInterceptor(name: string, interceptor: any) { _interceptors.responses[name] = interceptor _req.interceptors.response.use(interceptor) return this }, getBaseUrl() { return _req.defaults.baseURL }, getClient() { return _req }, getCurrentHeaders() { return _req.defaults.headers }, getInterceptors(type = 'request') { switch (type) { case 'request': return _interceptors.requests case 'response': return _interceptors.responses default: return _interceptors } }, getToken() { return _auth.token }, getUserId() { return _auth.user_id }, // same as setHeader() but without the console warning removeHeader(key: string) { delete _req.defaults.headers[key] return this }, removeInterceptor(name: string, type: string) { if (type === 'request') { const interceptor = _interceptors.requests[name] _req.interceptors.request.eject(interceptor) delete _interceptors.requests[name] } else if (type === 'response') { const interceptor = _interceptors.responses[name] _req.interceptors.response.eject(interceptor) delete _interceptors.responses[name] } return this }, removeTransformRequest() { _req.defaults.transformRequest = undefined return this }, removeTransformResponse() { _req.defaults.transformResponse = undefined return this }, setBaseUrl(url: string) { if (!url) { logError( 'WARNING: You tried to set a base URL but it was not set. ' + 'Refer to makeRequest.setBaseUrl', ) } else _req.defaults.baseURL = url return this }, setHeader(key: string, value: string) { if (!key || !value) { logError( 'WARNING: You tried to set a header but it was not set. ' + 'Refer to makeRequest.setHeader', ) } else _req.defaults.headers[key] = value return this }, setPhoneNumber(phone_number?: string) { if (!phone_number) { logError( 'WARNING: You tried to set a new token but it was not set. ' + 'Refer to makeRequest.setToken', ) } else _auth.phone_number = phone_number return this }, setToken(token?: string) { if (!token) { logError( 'WARNING: You tried to set a new token but it was not set. ' + 'Refer to makeRequest.setToken', ) } else _auth.token = token return this }, setTransformRequest(transformFunc: () => void) { if (typeof transformFunc === 'function') { _req.defaults.transformRequest = transformFunc } return this }, setTransformResponse(transformFunc: () => void) { if (typeof transformFunc === 'function') { _req.defaults.transformResponse = transformFunc } return this }, setUserId(userId: string) { if (!userId) { logError( 'WARNING: You tried to set a user_id but it was not set because it was null or undefined. ', ) } else _auth.user_id = userId return this }, generateAuthHeader(token: string) { return { Authorization: `JWT ${token}`, } }, } } export default makeRequest // { // "include": ["src/**/*"], // "exclude": ["node_modules"], // "compileOnSave": true, // "compilerOptions": { // "allowSyntheticDefaultImports": true, // "lib": ["es2016"], // "module": "commonjs", // "noImplicitAny": true, // "strictNullChecks": false, // "outDir": "./build", // "strict": true, // "target": "es5", // "watch": true // } // }