Select Git revision
1_TABLES.sql
api.service.ts 5.55 KiB
import axios, { AxiosError, AxiosInstance } from 'axios';
import { API_QUERY_REFERER, API_URL } from '../config';
import { GiteaPublicProperties } from '../model/giteaPublicProperties.model';
import { SshKeyPair } from '../model/sshKeyPair.model';
import { extensionError as error } from '../recorder/utils/log';
import { Attempt } from '../model/attempt';
import Controller from './controller';
import ExtensionStore from './extensionStore';
import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
import { MissionUser } from './mission/model/missionUser';
import UserMission, { User } from './mission/model/userMission';
export default class ApiService {
private axiosInstance: AxiosInstance;
private static _instance: ApiService;
static get instance(): ApiService {
if (!ApiService._instance) {
ApiService._instance = new ApiService();
}
return ApiService._instance;
}
private constructor() {
this.axiosInstance = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
referer: API_QUERY_REFERER,
},
});
this.initApiInterceptor();
}
initApiInterceptor() {
this.initRequestInterceptor();
this.initResponseInterceptor();
}
private initRequestInterceptor() {
this.axiosInstance.interceptors.request.use(
async (config) => {
const accessToken = await ExtensionStore.instance.getAccessToken();
if (accessToken && config.headers) {
config.headers['authorization'] = `BEARER ${accessToken}`;
}
return config;
},
(error) => {
return Promise.reject(error);
},
);
}
private initResponseInterceptor() {
this.axiosInstance.interceptors.response.use(
(res) => {
return res;
},
async (err) => {
return await this.handleResponseError(err);
},
);
}
private async handleResponseError(err) {
const originalConfig = err.config;
if (err.response) {
// Access Token was expired