From 92f407b74bb80dba0de725628d65aa22d0dae57b Mon Sep 17 00:00:00 2001 From: Aleksandr Levochkin <107044793+aleksandrlevochkin@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:06:44 +0200 Subject: [PATCH] Add ability to pass global agent options for `HttpClient` (#378) * Increase timeout for global agent * Add ability to pass global agent options to http client constructor * Update version in test projects --------- Co-authored-by: v-levockina --- lib/HttpClient.ts | 14 +++++++++++++- lib/Interfaces.ts | 6 ++++++ package-lock.json | 4 ++-- package.json | 2 +- samples/basic/package-lock.json | 2 +- test/package-lock.json | 2 +- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/HttpClient.ts b/lib/HttpClient.ts index 498959c4..ffb71a87 100644 --- a/lib/HttpClient.ts +++ b/lib/HttpClient.ts @@ -121,6 +121,10 @@ export class HttpClient implements ifm.IHttpClient { private _ca: string; private _cert: string; private _key: string; + private _httpGlobalAgentOptions: ifm.IHttpGlobalAgentOptions = { + keepAlive: false, + timeout: 30_000 + }; constructor(userAgent: string | null | undefined, handlers?: ifm.IRequestHandler[], requestOptions?: ifm.IRequestOptions) { this.userAgent = userAgent; @@ -148,6 +152,10 @@ export class HttpClient implements ifm.IHttpClient { }); } + if (requestOptions.globalAgentOptions) { + this._httpGlobalAgentOptions = requestOptions.globalAgentOptions; + } + this._certConfig = requestOptions.cert; if (this._certConfig) { @@ -529,7 +537,11 @@ export class HttpClient implements ifm.IHttpClient { // if not using private agent and tunnel agent isn't setup then use global agent if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; + const globalAgentOptions: http.AgentOptions = { + keepAlive: this._httpGlobalAgentOptions.keepAlive, + timeout: this._httpGlobalAgentOptions.timeout + }; + agent = usingSsl ? new https.Agent(globalAgentOptions) : new http.Agent(globalAgentOptions); } if (usingSsl && this._ignoreSslError) { diff --git a/lib/Interfaces.ts b/lib/Interfaces.ts index 464d18a1..ce1da027 100644 --- a/lib/Interfaces.ts +++ b/lib/Interfaces.ts @@ -47,6 +47,7 @@ export interface IRequestOptions { ignoreSslError?: boolean; proxy?: IProxyConfiguration; cert?: ICertConfiguration; + globalAgentOptions?: IHttpGlobalAgentOptions; allowRedirects?: boolean; allowRedirectDowngrade?: boolean; maxRedirects?: number; @@ -72,6 +73,11 @@ export interface ICertConfiguration { passphrase?: string; } +export interface IHttpGlobalAgentOptions { + keepAlive?: boolean; + timeout?: number; +} + export interface IRequestQueryParams { options?: { separator?: string, diff --git a/package-lock.json b/package-lock.json index 235ee65c..973e738f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "typed-rest-client", - "version": "2.0.2", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "typed-rest-client", - "version": "2.0.2", + "version": "2.1.0", "license": "MIT", "dependencies": { "des.js": "^1.1.0", diff --git a/package.json b/package.json index 0cc5e940..4d51c5fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typed-rest-client", - "version": "2.0.2", + "version": "2.1.0", "description": "Node Rest and Http Clients for use with TypeScript", "main": "./RestClient.js", "scripts": { diff --git a/samples/basic/package-lock.json b/samples/basic/package-lock.json index f4807bd5..7fd3ccd5 100644 --- a/samples/basic/package-lock.json +++ b/samples/basic/package-lock.json @@ -18,7 +18,7 @@ }, "../../_build": { "name": "typed-rest-client", - "version": "2.0.2", + "version": "2.1.0", "license": "MIT", "dependencies": { "des.js": "^1.1.0", diff --git a/test/package-lock.json b/test/package-lock.json index 59df3bff..628c2490 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -14,7 +14,7 @@ }, "../_build": { "name": "typed-rest-client", - "version": "2.0.2", + "version": "2.1.0", "license": "MIT", "dependencies": { "des.js": "^1.1.0",