import axios, { AxiosInstance } from "axios"; import { APIOptions } from "./APIOptions"; import { AccessTokenResponse } from "./AccessTokenResponse"; import * as moment from "moment"; import { APIResponse } from "./APIResponse"; // tslint:disable: no-console export class SwychAxiosInstance { private accessToken: string; private expiresAt: moment.Moment; private axiosInstance: AxiosInstance; private constructor( private options: APIOptions, private getAccessToken: () => Promise> ) {} public static async newInstance( options: APIOptions, getAccessToken: () => Promise> ) { const instance = new SwychAxiosInstance(options, getAccessToken); await instance.initialize(); return instance; } public getAxiosInstance(): AxiosInstance { return this.axiosInstance; } private async initialize() { await this.setAccessToken(); this.axiosInstance = axios.create({ baseURL: `${this.options.baseUrl}`, // timeout: 1000, headers: { "Swych-Access-Token": this.accessToken } }); this.axiosInstance.interceptors.request.use(async config => { config = await this.checkAccessToken(config); return config; }); } private async checkAccessToken(config) { const expiryCheck = moment().add(60, "seconds"); if (expiryCheck.isAfter(this.expiresAt)) { console.log("checkAccessToken: modifying axios instance"); await this.initialize(); config.headers["Swych-Access-Token"] = this.accessToken; } return config; } private async setAccessToken(): Promise { const res = await this.getAccessToken(); const { response: accessTokenResponse } = res; // console.log(`setAccessToken: ${JSON.stringify(accessTokenResponse)}`) const { accessToken, expiresAt } = accessTokenResponse; this.accessToken = accessToken; this.expiresAt = moment(new Date(`${expiresAt}Z`)); } }