diff --git a/docs/further_reading.md b/docs/further_reading.md index 066be68..1112d2e 100644 --- a/docs/further_reading.md +++ b/docs/further_reading.md @@ -129,6 +129,7 @@ enableAnalytics: boolean; // enable analytics cache: KeyValueStore; // set custom cache (default lru cache) store: AsyncKeyValueStore; // set custom persistent store (default file store) logger: Logger; // set logger (default console) +axiosTimeout: number; // set timeout for requests to Harness (default 30s) ``` ## Singleton example diff --git a/src/client.ts b/src/client.ts index 917bc0d..191c814 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,6 +1,6 @@ import EventEmitter from 'events'; import jwt_decode from 'jwt-decode'; -import axios, { AxiosInstance } from 'axios'; +import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; import axiosRetry from 'axios-retry'; import { Claims, Options, StreamEvent, Target } from './types'; import { Configuration, ClientApi, FeatureConfig, Variation } from './openapi'; @@ -31,9 +31,6 @@ import { import https from 'https'; import * as fs from 'fs'; -axios.defaults.timeout = 30000; -axiosRetry(axios, { retries: 3, retryDelay: axiosRetry.exponentialDelay }); - enum Processor { POLL, STREAM, @@ -109,22 +106,13 @@ export default class Client { ); this.evaluator = new Evaluator(this.repository, this.log); - if (options.tlsTrustedCa) { - this.httpsCa = fs.readFileSync(options.tlsTrustedCa); - this.httpsClient = axios.create({ - httpsAgent: new https.Agent({ - ca: this.httpsCa, - }), - }); - - this.api = new ClientApi( - this.configuration, - this.options.baseUrl, - this.httpsClient, - ); - } else { - this.api = new ClientApi(this.configuration); - } + // Setup https client for sass or on-prem connections + this.httpsClient = this.createAxiosInstanceWithRetries(this.options); + this.api = new ClientApi( + this.configuration, + this.options.baseUrl, + this.httpsClient, + ); this.processEvents(); this.run(); @@ -297,6 +285,30 @@ export default class Client { return this.waitForInitializePromise; } + private createAxiosInstanceWithRetries(options: Options): AxiosInstance { + let axiosConfig: AxiosRequestConfig = { + timeout: options.axiosTimeout, + }; + + if (options.tlsTrustedCa) { + const httpsCa = fs.readFileSync(options.tlsTrustedCa); + // Set axiosConfig with httpsAgent when TLS config is provided + axiosConfig = { + ...axiosConfig, + httpsAgent: new https.Agent({ + ca: httpsCa, + }), + }; + } + + const instance: AxiosInstance = axios.create(axiosConfig); + axiosRetry(instance, { + retries: 3, + retryDelay: axiosRetry.exponentialDelay, + }); + return instance; + } + private initialize(processor: Processor): void { switch (processor) { case Processor.POLL: diff --git a/src/constants.ts b/src/constants.ts index 1539974..a9022a9 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -44,4 +44,5 @@ export const defaultOptions: Options = { cache: new LRU({ max: 100 }), store: new FileStore(), logger: new ConsoleLog(), + axiosTimeout: 30000, }; diff --git a/src/metrics.ts b/src/metrics.ts index 631029f..d6a700f 100644 --- a/src/metrics.ts +++ b/src/metrics.ts @@ -87,7 +87,7 @@ export class MetricsProcessor implements MetricsProcessorInterface { basePath: options.eventsUrl, }); if (httpsClient) { - this.api = new MetricsApi(this.conf, options.eventsUrl, this.httpsClient); + this.api = new MetricsApi(configuration, options.eventsUrl, this.httpsClient); } else { this.api = new MetricsApi(configuration); } diff --git a/src/types.ts b/src/types.ts index 66fdadc..61a67cc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,6 +13,7 @@ export interface Options { store?: AsyncKeyValueStore; logger?: Logger; tlsTrustedCa?: string; + axiosTimeout?: number; } export interface Claims { diff --git a/src/version.ts b/src/version.ts index f5ddf13..0a27cf3 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '1.7.0'; +export const VERSION = '1.8.0';