import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; import { Logger } from "./logger"; import ConfigHelper from "./config-helper"; import * as https from "https"; const qs = require("qs"); const Spinner = require("cli-spinner").Spinner; export const spinner = new Spinner(); spinner.setSpinnerString("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"); export default class APIClient { client: AxiosInstance; logger: Logger; /** * jenkins remote api access client, only support api-token auth method * @param url * @param username * @param apiToken */ constructor(private readonly url: string) { } async init() { const cliConfigs = ConfigHelper.getConfig(); this.client = axios.create({ baseURL: this.url, maxRedirects: 0, httpsAgent: new https.Agent({ rejectUnauthorized: false }), timeout: 10e3 }); this.logger = new Logger(); this.client.interceptors.request.use((config: any) => { config.headers = { ...config.headers, ...{ "Authorization": `Bearer ${cliConfigs.openaiKey}` } }; this.logger.debug(`request headers: ${JSON.stringify(config.headers)}`); if (!spinner.isSpinning()) { spinner.start(); } this.logger.debug(`send request to ${config.baseURL}${config.url} with params: ${JSON.stringify(config.params)} and data: ${JSON.stringify(config.data)}`); return config; }, (err: any) => { return Promise.reject(err); }); this.client.interceptors.response.use((response: AxiosResponse) => { this.logger.debug("response received"); this.logger.debug(`url:${response.config.url} response: ${JSON.stringify(response.data)}`); spinner.stop(); return response; }, async (error: AxiosError) => { const { response, config } = error; let message = `api (${config.url}) `; if (response.status === 401) { message += `request unauthorized, please check your configuration and re-submit your request after api key updated.`; } if (response.status === 403) { message += `operation denied, please check and re-submit your request.`; } else if (response.status === 500) { message += `Something wrong in server, please try again later or contact dev team!;`; } else { message += `Request failed, status code \`${response.status}\`, message: ${(response)?.data?.message}.`; } this.logger.error(message); spinner.stop(); return Promise.reject(new Error(message)); }); } async get(path: string, options?: AxiosRequestConfig & { spinner: string }) { if (options?.spinner) { spinner.setSpinnerTitle(options.spinner); } return this.client.get(path, options); } async post(path: string, data: any, options?: AxiosRequestConfig & { spinner: string }) { if (options?.spinner) { spinner.setSpinnerTitle(options.spinner); } this.logger.debug("post data: " + JSON.stringify(data)); return this.client.post(path, data, options); } updateSpinnerText(text: string) { spinner.setSpinnerTitle(text); } }