@algolia/requester-node-http 5.3.1 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,22 +30,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // index.ts
31
31
  var requester_node_http_exports = {};
32
32
  __export(requester_node_http_exports, {
33
- createHttpRequester: () => createHttpRequester,
34
- echoRequester: () => echoRequester
33
+ createHttpRequester: () => createHttpRequester
35
34
  });
36
35
  module.exports = __toCommonJS(requester_node_http_exports);
37
36
 
38
- // src/echoRequester.ts
39
- var import_url = require("url");
40
- var import_client_common = require("@algolia/client-common");
41
- function echoRequester(status = 200) {
42
- return (0, import_client_common.createEchoRequester)({ getURL: (url) => new import_url.URL(url), status });
43
- }
44
-
45
37
  // src/createHttpRequester.ts
46
38
  var import_http = __toESM(require("http"), 1);
47
39
  var import_https = __toESM(require("https"), 1);
48
- var import_url2 = require("url");
40
+ var import_url = require("url");
49
41
  var agentOptions = { keepAlive: true };
50
42
  var defaultHttpAgent = new import_http.default.Agent(agentOptions);
51
43
  var defaultHttpsAgent = new import_https.default.Agent(agentOptions);
@@ -61,7 +53,7 @@ function createHttpRequester({
61
53
  return new Promise((resolve) => {
62
54
  let responseTimeout;
63
55
  let connectTimeout;
64
- const url = new import_url2.URL(request.url);
56
+ const url = new import_url.URL(request.url);
65
57
  const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;
66
58
  const options = {
67
59
  agent: url.protocol === "https:" ? httpsAgent : httpAgent,
@@ -122,7 +114,6 @@ function createHttpRequester({
122
114
  }
123
115
  // Annotate the CommonJS export names for ESM import in node:
124
116
  0 && (module.exports = {
125
- createHttpRequester,
126
- echoRequester
117
+ createHttpRequester
127
118
  });
128
119
  //# sourceMappingURL=requester.http.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/echoRequester.ts","../src/createHttpRequester.ts"],"sourcesContent":["export * from './src/echoRequester';\nexport * from './src/createHttpRequester';\n","import { URL } from 'url';\n\nimport { createEchoRequester } from '@algolia/client-common';\nimport type { Requester } from '@algolia/client-common';\n\nexport function echoRequester(status: number = 200): Requester {\n return createEchoRequester({ getURL: (url: string) => new URL(url), status });\n}\n","import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\n\nimport type { EndRequest, Requester, Response } from '@algolia/client-common';\n\nexport type CreateHttpRequesterOptions = Partial<{\n agent: http.Agent | https.Agent;\n httpAgent: http.Agent;\n httpsAgent: https.Agent;\n /**\n * RequestOptions to be merged with the end request, it will override default options if provided.\n */\n requesterOptions: https.RequestOptions;\n}>;\n\n// Global agents allow us to reuse the TCP protocol with multiple clients\nconst agentOptions = { keepAlive: true };\nconst defaultHttpAgent = new http.Agent(agentOptions);\nconst defaultHttpsAgent = new https.Agent(agentOptions);\n\nexport function createHttpRequester({\n agent: userGlobalAgent,\n httpAgent: userHttpAgent,\n httpsAgent: userHttpsAgent,\n requesterOptions = {},\n}: CreateHttpRequesterOptions = {}): Requester {\n const httpAgent = userHttpAgent || userGlobalAgent || defaultHttpAgent;\n const httpsAgent = userHttpsAgent || userGlobalAgent || defaultHttpsAgent;\n\n function send(request: EndRequest): Promise<Response> {\n return new Promise((resolve) => {\n let responseTimeout: NodeJS.Timeout | undefined;\n // eslint-disable-next-line prefer-const -- linter thinks this is not reassigned\n let connectTimeout: NodeJS.Timeout | undefined;\n const url = new URL(request.url);\n const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;\n const options: https.RequestOptions = {\n agent: url.protocol === 'https:' ? httpsAgent : httpAgent,\n hostname: url.hostname,\n path,\n method: request.method,\n ...requesterOptions,\n headers: {\n ...request.headers,\n ...requesterOptions.headers,\n },\n };\n\n if (url.port && !requesterOptions.port) {\n options.port = url.port;\n }\n\n const req = (url.protocol === 'https:' ? https : http).request(options, (response) => {\n let contentBuffers: Buffer[] = [];\n\n response.on('data', (chunk) => {\n contentBuffers = contentBuffers.concat(chunk);\n });\n\n response.on('end', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n\n resolve({\n status: response.statusCode || 0,\n content: Buffer.concat(contentBuffers).toString(),\n isTimedOut: false,\n });\n });\n });\n\n const createTimeout = (timeout: number, content: string): NodeJS.Timeout => {\n return setTimeout(() => {\n req.destroy();\n\n resolve({\n status: 0,\n content,\n isTimedOut: true,\n });\n }, timeout);\n };\n\n connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');\n\n req.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout!);\n resolve({ status: 0, content: error.message, isTimedOut: false });\n });\n\n req.once('response', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAAoB;AAEpB,2BAAoC;AAG7B,SAAS,cAAc,SAAiB,KAAgB;AAC7D,aAAO,0CAAoB,EAAE,QAAQ,CAAC,QAAgB,IAAI,eAAI,GAAG,GAAG,OAAO,CAAC;AAC9E;;;ACPA,kBAAiB;AACjB,mBAAkB;AAClB,IAAAA,cAAoB;AAepB,IAAM,eAAe,EAAE,WAAW,KAAK;AACvC,IAAM,mBAAmB,IAAI,YAAAC,QAAK,MAAM,YAAY;AACpD,IAAM,oBAAoB,IAAI,aAAAC,QAAM,MAAM,YAAY;AAE/C,SAAS,oBAAoB;AAAA,EAClC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB,CAAC;AACtB,IAAgC,CAAC,GAAc;AAC7C,QAAM,YAAY,iBAAiB,mBAAmB;AACtD,QAAM,aAAa,kBAAkB,mBAAmB;AAExD,WAAS,KAAK,SAAwC;AACpD,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI;AAEJ,UAAI;AACJ,YAAM,MAAM,IAAI,gBAAI,QAAQ,GAAG;AAC/B,YAAM,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAC9E,YAAM,UAAgC;AAAA,QACpC,OAAO,IAAI,aAAa,WAAW,aAAa;AAAA,QAChD,UAAU,IAAI;AAAA,QACd;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,QAAQ;AAAA,UACX,GAAG,iBAAiB;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ,CAAC,iBAAiB,MAAM;AACtC,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAEA,YAAM,OAAO,IAAI,aAAa,WAAW,aAAAA,UAAQ,YAAAD,SAAM,QAAQ,SAAS,CAAC,aAAa;AACpF,YAAI,iBAA2B,CAAC;AAEhC,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC7B,2BAAiB,eAAe,OAAO,KAAK;AAAA,QAC9C,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACvB,uBAAa,cAAgC;AAC7C,uBAAa,eAAiC;AAE9C,kBAAQ;AAAA,YACN,QAAQ,SAAS,cAAc;AAAA,YAC/B,SAAS,OAAO,OAAO,cAAc,EAAE,SAAS;AAAA,YAChD,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAED,YAAM,gBAAgB,CAAC,SAAiB,YAAoC;AAC1E,eAAO,WAAW,MAAM;AACtB,cAAI,QAAQ;AAEZ,kBAAQ;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH,GAAG,OAAO;AAAA,MACZ;AAEA,uBAAiB,cAAc,QAAQ,gBAAgB,oBAAoB;AAE3E,UAAI,GAAG,SAAS,CAAC,UAAU;AACzB,qBAAa,cAAgC;AAC7C,qBAAa,eAAgB;AAC7B,gBAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,MAClE,CAAC;AAED,UAAI,KAAK,YAAY,MAAM;AACzB,qBAAa,cAAgC;AAC7C,0BAAkB,cAAc,QAAQ,iBAAiB,gBAAgB;AAAA,MAC3E,CAAC;AAED,UAAI,QAAQ,SAAS,QAAW;AAC9B,YAAI,MAAM,QAAQ,IAAI;AAAA,MACxB;AAEA,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK;AAChB;","names":["import_url","http","https"]}
1
+ {"version":3,"sources":["../index.ts","../src/createHttpRequester.ts"],"sourcesContent":["export * from './src/createHttpRequester';\n","import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\n\nimport type { EndRequest, Requester, Response } from '@algolia/client-common';\n\nexport type CreateHttpRequesterOptions = Partial<{\n agent: http.Agent | https.Agent;\n httpAgent: http.Agent;\n httpsAgent: https.Agent;\n /**\n * RequestOptions to be merged with the end request, it will override default options if provided.\n */\n requesterOptions: https.RequestOptions;\n}>;\n\n// Global agents allow us to reuse the TCP protocol with multiple clients\nconst agentOptions = { keepAlive: true };\nconst defaultHttpAgent = new http.Agent(agentOptions);\nconst defaultHttpsAgent = new https.Agent(agentOptions);\n\nexport function createHttpRequester({\n agent: userGlobalAgent,\n httpAgent: userHttpAgent,\n httpsAgent: userHttpsAgent,\n requesterOptions = {},\n}: CreateHttpRequesterOptions = {}): Requester {\n const httpAgent = userHttpAgent || userGlobalAgent || defaultHttpAgent;\n const httpsAgent = userHttpsAgent || userGlobalAgent || defaultHttpsAgent;\n\n function send(request: EndRequest): Promise<Response> {\n return new Promise((resolve) => {\n let responseTimeout: NodeJS.Timeout | undefined;\n // eslint-disable-next-line prefer-const -- linter thinks this is not reassigned\n let connectTimeout: NodeJS.Timeout | undefined;\n const url = new URL(request.url);\n const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;\n const options: https.RequestOptions = {\n agent: url.protocol === 'https:' ? httpsAgent : httpAgent,\n hostname: url.hostname,\n path,\n method: request.method,\n ...requesterOptions,\n headers: {\n ...request.headers,\n ...requesterOptions.headers,\n },\n };\n\n if (url.port && !requesterOptions.port) {\n options.port = url.port;\n }\n\n const req = (url.protocol === 'https:' ? https : http).request(options, (response) => {\n let contentBuffers: Buffer[] = [];\n\n response.on('data', (chunk) => {\n contentBuffers = contentBuffers.concat(chunk);\n });\n\n response.on('end', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n\n resolve({\n status: response.statusCode || 0,\n content: Buffer.concat(contentBuffers).toString(),\n isTimedOut: false,\n });\n });\n });\n\n const createTimeout = (timeout: number, content: string): NodeJS.Timeout => {\n return setTimeout(() => {\n req.destroy();\n\n resolve({\n status: 0,\n content,\n isTimedOut: true,\n });\n }, timeout);\n };\n\n connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');\n\n req.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout!);\n resolve({ status: 0, content: error.message, isTimedOut: false });\n });\n\n req.once('response', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAiB;AACjB,mBAAkB;AAClB,iBAAoB;AAepB,IAAM,eAAe,EAAE,WAAW,KAAK;AACvC,IAAM,mBAAmB,IAAI,YAAAA,QAAK,MAAM,YAAY;AACpD,IAAM,oBAAoB,IAAI,aAAAC,QAAM,MAAM,YAAY;AAE/C,SAAS,oBAAoB;AAAA,EAClC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB,CAAC;AACtB,IAAgC,CAAC,GAAc;AAC7C,QAAM,YAAY,iBAAiB,mBAAmB;AACtD,QAAM,aAAa,kBAAkB,mBAAmB;AAExD,WAAS,KAAK,SAAwC;AACpD,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI;AAEJ,UAAI;AACJ,YAAM,MAAM,IAAI,eAAI,QAAQ,GAAG;AAC/B,YAAM,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAC9E,YAAM,UAAgC;AAAA,QACpC,OAAO,IAAI,aAAa,WAAW,aAAa;AAAA,QAChD,UAAU,IAAI;AAAA,QACd;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,QAAQ;AAAA,UACX,GAAG,iBAAiB;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ,CAAC,iBAAiB,MAAM;AACtC,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAEA,YAAM,OAAO,IAAI,aAAa,WAAW,aAAAA,UAAQ,YAAAD,SAAM,QAAQ,SAAS,CAAC,aAAa;AACpF,YAAI,iBAA2B,CAAC;AAEhC,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC7B,2BAAiB,eAAe,OAAO,KAAK;AAAA,QAC9C,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACvB,uBAAa,cAAgC;AAC7C,uBAAa,eAAiC;AAE9C,kBAAQ;AAAA,YACN,QAAQ,SAAS,cAAc;AAAA,YAC/B,SAAS,OAAO,OAAO,cAAc,EAAE,SAAS;AAAA,YAChD,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAED,YAAM,gBAAgB,CAAC,SAAiB,YAAoC;AAC1E,eAAO,WAAW,MAAM;AACtB,cAAI,QAAQ;AAEZ,kBAAQ;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH,GAAG,OAAO;AAAA,MACZ;AAEA,uBAAiB,cAAc,QAAQ,gBAAgB,oBAAoB;AAE3E,UAAI,GAAG,SAAS,CAAC,UAAU;AACzB,qBAAa,cAAgC;AAC7C,qBAAa,eAAgB;AAC7B,gBAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,MAClE,CAAC;AAED,UAAI,KAAK,YAAY,MAAM;AACzB,qBAAa,cAAgC;AAC7C,0BAAkB,cAAc,QAAQ,iBAAiB,gBAAgB;AAAA,MAC3E,CAAC;AAED,UAAI,QAAQ,SAAS,QAAW;AAC9B,YAAI,MAAM,QAAQ,IAAI;AAAA,MACxB;AAEA,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK;AAChB;","names":["http","https"]}
@@ -1,8 +1,6 @@
1
- import { Requester } from '@algolia/client-common';
2
1
  import http from 'http';
3
2
  import https from 'https';
4
-
5
- declare function echoRequester(status?: number): Requester;
3
+ import { Requester } from '@algolia/client-common';
6
4
 
7
5
  type CreateHttpRequesterOptions = Partial<{
8
6
  agent: http.Agent | https.Agent;
@@ -15,4 +13,4 @@ type CreateHttpRequesterOptions = Partial<{
15
13
  }>;
16
14
  declare function createHttpRequester({ agent: userGlobalAgent, httpAgent: userHttpAgent, httpsAgent: userHttpsAgent, requesterOptions, }?: CreateHttpRequesterOptions): Requester;
17
15
 
18
- export { type CreateHttpRequesterOptions, createHttpRequester, echoRequester };
16
+ export { type CreateHttpRequesterOptions, createHttpRequester };
@@ -1,8 +1,6 @@
1
- import { Requester } from '@algolia/client-common';
2
1
  import http from 'http';
3
2
  import https from 'https';
4
-
5
- declare function echoRequester(status?: number): Requester;
3
+ import { Requester } from '@algolia/client-common';
6
4
 
7
5
  type CreateHttpRequesterOptions = Partial<{
8
6
  agent: http.Agent | https.Agent;
@@ -15,4 +13,4 @@ type CreateHttpRequesterOptions = Partial<{
15
13
  }>;
16
14
  declare function createHttpRequester({ agent: userGlobalAgent, httpAgent: userHttpAgent, httpsAgent: userHttpsAgent, requesterOptions, }?: CreateHttpRequesterOptions): Requester;
17
15
 
18
- export { type CreateHttpRequesterOptions, createHttpRequester, echoRequester };
16
+ export { type CreateHttpRequesterOptions, createHttpRequester };
@@ -1,14 +1,7 @@
1
- // src/echoRequester.ts
2
- import { URL } from "url";
3
- import { createEchoRequester } from "@algolia/client-common";
4
- function echoRequester(status = 200) {
5
- return createEchoRequester({ getURL: (url) => new URL(url), status });
6
- }
7
-
8
1
  // src/createHttpRequester.ts
9
2
  import http from "http";
10
3
  import https from "https";
11
- import { URL as URL2 } from "url";
4
+ import { URL } from "url";
12
5
  var agentOptions = { keepAlive: true };
13
6
  var defaultHttpAgent = new http.Agent(agentOptions);
14
7
  var defaultHttpsAgent = new https.Agent(agentOptions);
@@ -24,7 +17,7 @@ function createHttpRequester({
24
17
  return new Promise((resolve) => {
25
18
  let responseTimeout;
26
19
  let connectTimeout;
27
- const url = new URL2(request.url);
20
+ const url = new URL(request.url);
28
21
  const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;
29
22
  const options = {
30
23
  agent: url.protocol === "https:" ? httpsAgent : httpAgent,
@@ -84,7 +77,6 @@ function createHttpRequester({
84
77
  return { send };
85
78
  }
86
79
  export {
87
- createHttpRequester,
88
- echoRequester
80
+ createHttpRequester
89
81
  };
90
82
  //# sourceMappingURL=requester.http.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/echoRequester.ts","../src/createHttpRequester.ts"],"sourcesContent":["import { URL } from 'url';\n\nimport { createEchoRequester } from '@algolia/client-common';\nimport type { Requester } from '@algolia/client-common';\n\nexport function echoRequester(status: number = 200): Requester {\n return createEchoRequester({ getURL: (url: string) => new URL(url), status });\n}\n","import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\n\nimport type { EndRequest, Requester, Response } from '@algolia/client-common';\n\nexport type CreateHttpRequesterOptions = Partial<{\n agent: http.Agent | https.Agent;\n httpAgent: http.Agent;\n httpsAgent: https.Agent;\n /**\n * RequestOptions to be merged with the end request, it will override default options if provided.\n */\n requesterOptions: https.RequestOptions;\n}>;\n\n// Global agents allow us to reuse the TCP protocol with multiple clients\nconst agentOptions = { keepAlive: true };\nconst defaultHttpAgent = new http.Agent(agentOptions);\nconst defaultHttpsAgent = new https.Agent(agentOptions);\n\nexport function createHttpRequester({\n agent: userGlobalAgent,\n httpAgent: userHttpAgent,\n httpsAgent: userHttpsAgent,\n requesterOptions = {},\n}: CreateHttpRequesterOptions = {}): Requester {\n const httpAgent = userHttpAgent || userGlobalAgent || defaultHttpAgent;\n const httpsAgent = userHttpsAgent || userGlobalAgent || defaultHttpsAgent;\n\n function send(request: EndRequest): Promise<Response> {\n return new Promise((resolve) => {\n let responseTimeout: NodeJS.Timeout | undefined;\n // eslint-disable-next-line prefer-const -- linter thinks this is not reassigned\n let connectTimeout: NodeJS.Timeout | undefined;\n const url = new URL(request.url);\n const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;\n const options: https.RequestOptions = {\n agent: url.protocol === 'https:' ? httpsAgent : httpAgent,\n hostname: url.hostname,\n path,\n method: request.method,\n ...requesterOptions,\n headers: {\n ...request.headers,\n ...requesterOptions.headers,\n },\n };\n\n if (url.port && !requesterOptions.port) {\n options.port = url.port;\n }\n\n const req = (url.protocol === 'https:' ? https : http).request(options, (response) => {\n let contentBuffers: Buffer[] = [];\n\n response.on('data', (chunk) => {\n contentBuffers = contentBuffers.concat(chunk);\n });\n\n response.on('end', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n\n resolve({\n status: response.statusCode || 0,\n content: Buffer.concat(contentBuffers).toString(),\n isTimedOut: false,\n });\n });\n });\n\n const createTimeout = (timeout: number, content: string): NodeJS.Timeout => {\n return setTimeout(() => {\n req.destroy();\n\n resolve({\n status: 0,\n content,\n isTimedOut: true,\n });\n }, timeout);\n };\n\n connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');\n\n req.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout!);\n resolve({ status: 0, content: error.message, isTimedOut: false });\n });\n\n req.once('response', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send };\n}\n"],"mappings":";AAAA,SAAS,WAAW;AAEpB,SAAS,2BAA2B;AAG7B,SAAS,cAAc,SAAiB,KAAgB;AAC7D,SAAO,oBAAoB,EAAE,QAAQ,CAAC,QAAgB,IAAI,IAAI,GAAG,GAAG,OAAO,CAAC;AAC9E;;;ACPA,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,OAAAA,YAAW;AAepB,IAAM,eAAe,EAAE,WAAW,KAAK;AACvC,IAAM,mBAAmB,IAAI,KAAK,MAAM,YAAY;AACpD,IAAM,oBAAoB,IAAI,MAAM,MAAM,YAAY;AAE/C,SAAS,oBAAoB;AAAA,EAClC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB,CAAC;AACtB,IAAgC,CAAC,GAAc;AAC7C,QAAM,YAAY,iBAAiB,mBAAmB;AACtD,QAAM,aAAa,kBAAkB,mBAAmB;AAExD,WAAS,KAAK,SAAwC;AACpD,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI;AAEJ,UAAI;AACJ,YAAM,MAAM,IAAIA,KAAI,QAAQ,GAAG;AAC/B,YAAM,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAC9E,YAAM,UAAgC;AAAA,QACpC,OAAO,IAAI,aAAa,WAAW,aAAa;AAAA,QAChD,UAAU,IAAI;AAAA,QACd;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,QAAQ;AAAA,UACX,GAAG,iBAAiB;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ,CAAC,iBAAiB,MAAM;AACtC,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAEA,YAAM,OAAO,IAAI,aAAa,WAAW,QAAQ,MAAM,QAAQ,SAAS,CAAC,aAAa;AACpF,YAAI,iBAA2B,CAAC;AAEhC,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC7B,2BAAiB,eAAe,OAAO,KAAK;AAAA,QAC9C,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACvB,uBAAa,cAAgC;AAC7C,uBAAa,eAAiC;AAE9C,kBAAQ;AAAA,YACN,QAAQ,SAAS,cAAc;AAAA,YAC/B,SAAS,OAAO,OAAO,cAAc,EAAE,SAAS;AAAA,YAChD,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAED,YAAM,gBAAgB,CAAC,SAAiB,YAAoC;AAC1E,eAAO,WAAW,MAAM;AACtB,cAAI,QAAQ;AAEZ,kBAAQ;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH,GAAG,OAAO;AAAA,MACZ;AAEA,uBAAiB,cAAc,QAAQ,gBAAgB,oBAAoB;AAE3E,UAAI,GAAG,SAAS,CAAC,UAAU;AACzB,qBAAa,cAAgC;AAC7C,qBAAa,eAAgB;AAC7B,gBAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,MAClE,CAAC;AAED,UAAI,KAAK,YAAY,MAAM;AACzB,qBAAa,cAAgC;AAC7C,0BAAkB,cAAc,QAAQ,iBAAiB,gBAAgB;AAAA,MAC3E,CAAC;AAED,UAAI,QAAQ,SAAS,QAAW;AAC9B,YAAI,MAAM,QAAQ,IAAI;AAAA,MACxB;AAEA,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK;AAChB;","names":["URL"]}
1
+ {"version":3,"sources":["../src/createHttpRequester.ts"],"sourcesContent":["import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\n\nimport type { EndRequest, Requester, Response } from '@algolia/client-common';\n\nexport type CreateHttpRequesterOptions = Partial<{\n agent: http.Agent | https.Agent;\n httpAgent: http.Agent;\n httpsAgent: https.Agent;\n /**\n * RequestOptions to be merged with the end request, it will override default options if provided.\n */\n requesterOptions: https.RequestOptions;\n}>;\n\n// Global agents allow us to reuse the TCP protocol with multiple clients\nconst agentOptions = { keepAlive: true };\nconst defaultHttpAgent = new http.Agent(agentOptions);\nconst defaultHttpsAgent = new https.Agent(agentOptions);\n\nexport function createHttpRequester({\n agent: userGlobalAgent,\n httpAgent: userHttpAgent,\n httpsAgent: userHttpsAgent,\n requesterOptions = {},\n}: CreateHttpRequesterOptions = {}): Requester {\n const httpAgent = userHttpAgent || userGlobalAgent || defaultHttpAgent;\n const httpsAgent = userHttpsAgent || userGlobalAgent || defaultHttpsAgent;\n\n function send(request: EndRequest): Promise<Response> {\n return new Promise((resolve) => {\n let responseTimeout: NodeJS.Timeout | undefined;\n // eslint-disable-next-line prefer-const -- linter thinks this is not reassigned\n let connectTimeout: NodeJS.Timeout | undefined;\n const url = new URL(request.url);\n const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`;\n const options: https.RequestOptions = {\n agent: url.protocol === 'https:' ? httpsAgent : httpAgent,\n hostname: url.hostname,\n path,\n method: request.method,\n ...requesterOptions,\n headers: {\n ...request.headers,\n ...requesterOptions.headers,\n },\n };\n\n if (url.port && !requesterOptions.port) {\n options.port = url.port;\n }\n\n const req = (url.protocol === 'https:' ? https : http).request(options, (response) => {\n let contentBuffers: Buffer[] = [];\n\n response.on('data', (chunk) => {\n contentBuffers = contentBuffers.concat(chunk);\n });\n\n response.on('end', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n\n resolve({\n status: response.statusCode || 0,\n content: Buffer.concat(contentBuffers).toString(),\n isTimedOut: false,\n });\n });\n });\n\n const createTimeout = (timeout: number, content: string): NodeJS.Timeout => {\n return setTimeout(() => {\n req.destroy();\n\n resolve({\n status: 0,\n content,\n isTimedOut: true,\n });\n }, timeout);\n };\n\n connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');\n\n req.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout!);\n resolve({ status: 0, content: error.message, isTimedOut: false });\n });\n\n req.once('response', () => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send };\n}\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,WAAW;AAepB,IAAM,eAAe,EAAE,WAAW,KAAK;AACvC,IAAM,mBAAmB,IAAI,KAAK,MAAM,YAAY;AACpD,IAAM,oBAAoB,IAAI,MAAM,MAAM,YAAY;AAE/C,SAAS,oBAAoB;AAAA,EAClC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB,CAAC;AACtB,IAAgC,CAAC,GAAc;AAC7C,QAAM,YAAY,iBAAiB,mBAAmB;AACtD,QAAM,aAAa,kBAAkB,mBAAmB;AAExD,WAAS,KAAK,SAAwC;AACpD,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI;AAEJ,UAAI;AACJ,YAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,YAAM,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAC9E,YAAM,UAAgC;AAAA,QACpC,OAAO,IAAI,aAAa,WAAW,aAAa;AAAA,QAChD,UAAU,IAAI;AAAA,QACd;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,QAAQ;AAAA,UACX,GAAG,iBAAiB;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ,CAAC,iBAAiB,MAAM;AACtC,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAEA,YAAM,OAAO,IAAI,aAAa,WAAW,QAAQ,MAAM,QAAQ,SAAS,CAAC,aAAa;AACpF,YAAI,iBAA2B,CAAC;AAEhC,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC7B,2BAAiB,eAAe,OAAO,KAAK;AAAA,QAC9C,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACvB,uBAAa,cAAgC;AAC7C,uBAAa,eAAiC;AAE9C,kBAAQ;AAAA,YACN,QAAQ,SAAS,cAAc;AAAA,YAC/B,SAAS,OAAO,OAAO,cAAc,EAAE,SAAS;AAAA,YAChD,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAED,YAAM,gBAAgB,CAAC,SAAiB,YAAoC;AAC1E,eAAO,WAAW,MAAM;AACtB,cAAI,QAAQ;AAEZ,kBAAQ;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH,GAAG,OAAO;AAAA,MACZ;AAEA,uBAAiB,cAAc,QAAQ,gBAAgB,oBAAoB;AAE3E,UAAI,GAAG,SAAS,CAAC,UAAU;AACzB,qBAAa,cAAgC;AAC7C,qBAAa,eAAgB;AAC7B,gBAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,MAClE,CAAC;AAED,UAAI,KAAK,YAAY,MAAM;AACzB,qBAAa,cAAgC;AAC7C,0BAAkB,cAAc,QAAQ,iBAAiB,gBAAgB;AAAA,MAC3E,CAAC;AAED,UAAI,QAAQ,SAAS,QAAW;AAC9B,YAAI,MAAM,QAAQ,IAAI;AAAA,MACxB;AAEA,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK;AAChB;","names":[]}
package/index.ts CHANGED
@@ -1,2 +1 @@
1
- export * from './src/echoRequester';
2
1
  export * from './src/createHttpRequester';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@algolia/requester-node-http",
3
- "version": "5.3.1",
3
+ "version": "5.4.0",
4
4
  "description": "Promise-based request library for node using the native http module.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,24 +30,20 @@
30
30
  "scripts": {
31
31
  "build": "yarn clean && yarn tsup",
32
32
  "clean": "rm -rf ./dist || true",
33
- "test": "jest",
33
+ "test": "vitest --run",
34
34
  "test:bundle": "publint . && attw --pack ."
35
35
  },
36
36
  "dependencies": {
37
- "@algolia/client-common": "5.3.1"
37
+ "@algolia/client-common": "5.4.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@arethetypeswrong/cli": "0.16.1",
41
- "@babel/preset-env": "7.25.4",
42
- "@babel/preset-typescript": "7.24.7",
43
- "@types/jest": "29.5.12",
44
41
  "@types/node": "22.5.1",
45
- "jest": "29.7.0",
46
42
  "nock": "13.5.5",
47
43
  "publint": "0.2.10",
48
- "ts-jest": "29.2.5",
49
44
  "tsup": "8.2.4",
50
- "typescript": "5.5.4"
45
+ "typescript": "5.5.4",
46
+ "vitest": "2.0.5"
51
47
  },
52
48
  "engines": {
53
49
  "node": ">= 14.0.0"
@@ -4,6 +4,7 @@ import { Readable } from 'stream';
4
4
 
5
5
  import type { EndRequest } from '@algolia/client-common';
6
6
  import nock from 'nock';
7
+ import { vi, describe, test, beforeAll, afterAll, expect } from 'vitest';
7
8
 
8
9
  import { createHttpRequester } from '../..';
9
10
  import {
@@ -23,33 +24,33 @@ const httpBaseRequest = http.request;
23
24
 
24
25
  describe('api', () => {
25
26
  const mockedRequestResponse = {
26
- destroy: jest.fn(),
27
- on: jest.fn(),
28
- once: jest.fn(),
29
- write: jest.fn(),
30
- end: jest.fn(),
27
+ destroy: vi.fn(),
28
+ on: vi.fn(),
29
+ once: vi.fn(),
30
+ write: vi.fn(),
31
+ end: vi.fn(),
31
32
  };
32
33
 
33
34
  beforeAll(() => {
34
35
  // @ts-expect-error we don't care about the response for those tests
35
- https.request = jest.fn(() => mockedRequestResponse);
36
+ https.request = vi.fn(() => mockedRequestResponse);
36
37
  });
37
38
 
38
39
  afterAll(() => {
39
40
  https.request = httpsBaseRequest;
40
41
  http.request = httpBaseRequest;
41
- jest.resetAllMocks();
42
- jest.clearAllMocks();
42
+ vi.resetAllMocks();
43
+ vi.clearAllMocks();
43
44
  });
44
45
 
45
- it('allow init without parameters', () => {
46
+ test('allow init without parameters', () => {
46
47
  expect(() => createHttpRequester()).not.toThrow();
47
48
  });
48
49
 
49
- it('allow providing custom agent', async () => {
50
+ test('allow providing custom agent', async () => {
50
51
  const agent = new http.Agent();
51
52
  // @ts-expect-error we don't care about the response for those tests
52
- http.request = jest.fn(() => mockedRequestResponse);
53
+ http.request = vi.fn(() => mockedRequestResponse);
53
54
  const tmpRequester = createHttpRequester({
54
55
  agent,
55
56
  });
@@ -62,7 +63,7 @@ describe('api', () => {
62
63
  expect(http.request).toHaveBeenCalled();
63
64
  });
64
65
 
65
- it('allow overriding default options', async () => {
66
+ test('allow overriding default options', async () => {
66
67
  const tmpRequester = createHttpRequester({
67
68
  requesterOptions: {
68
69
  headers: {
@@ -85,7 +86,7 @@ describe('api', () => {
85
86
  });
86
87
 
87
88
  describe('status code handling', () => {
88
- it('sends requests', async () => {
89
+ test('sends requests', async () => {
89
90
  const body = getStringifiedBody();
90
91
 
91
92
  nock(testQueryBaseUrl, { reqheaders: headers }).post('/foo').query(testQueryHeader).reply(200, body);
@@ -95,7 +96,7 @@ describe('status code handling', () => {
95
96
  expect(response.content).toEqual(body);
96
97
  });
97
98
 
98
- it('resolves status 200', async () => {
99
+ test('resolves status 200', async () => {
99
100
  const body = getStringifiedBody();
100
101
 
101
102
  nock(testQueryBaseUrl, { reqheaders: headers }).post('/foo').query(testQueryHeader).reply(200, body);
@@ -107,7 +108,7 @@ describe('status code handling', () => {
107
108
  expect(response.isTimedOut).toBe(false);
108
109
  });
109
110
 
110
- it('resolves status 300', async () => {
111
+ test('resolves status 300', async () => {
111
112
  const reason = 'Multiple Choices';
112
113
 
113
114
  nock(testQueryBaseUrl, { reqheaders: headers }).post('/foo').query(testQueryHeader).reply(300, reason);
@@ -119,7 +120,7 @@ describe('status code handling', () => {
119
120
  expect(response.isTimedOut).toBe(false);
120
121
  });
121
122
 
122
- it('resolves status 400', async () => {
123
+ test('resolves status 400', async () => {
123
124
  const body = getStringifiedBody({
124
125
  message: 'Invalid Application-Id or API-Key',
125
126
  });
@@ -133,7 +134,7 @@ describe('status code handling', () => {
133
134
  expect(response.isTimedOut).toBe(false);
134
135
  });
135
136
 
136
- it('handles chunked responses inside unicode character boundaries', async () => {
137
+ test('handles chunked responses inside unicode character boundaries', async () => {
137
138
  const data = Buffer.from('äöü');
138
139
 
139
140
  // create a test response stream that is chunked inside a unicode character
@@ -162,11 +163,14 @@ describe('timeout handling', () => {
162
163
  server.listen('1112');
163
164
  });
164
165
 
165
- afterAll((done) => {
166
- server.close(() => done());
167
- });
166
+ afterAll(
167
+ () =>
168
+ new Promise((done) => {
169
+ done();
170
+ }),
171
+ );
168
172
 
169
- it('timeouts with the given 1 seconds connection timeout', async () => {
173
+ test('timeouts with the given 1 seconds connection timeout', async () => {
170
174
  const before = Date.now();
171
175
  const response = await requester.send({
172
176
  ...timeoutRequest,
@@ -181,7 +185,7 @@ describe('timeout handling', () => {
181
185
  expect(now - before).toBeLessThanOrEqual(1200);
182
186
  });
183
187
 
184
- it('connection timeouts with the given 2 seconds connection timeout', async () => {
188
+ test('connection timeouts with the given 2 seconds connection timeout', async () => {
185
189
  const before = Date.now();
186
190
  const response = await requester.send({
187
191
  ...timeoutRequest,
@@ -196,7 +200,7 @@ describe('timeout handling', () => {
196
200
  expect(now - before).toBeLessThanOrEqual(2200);
197
201
  });
198
202
 
199
- it("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
203
+ test("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
200
204
  const before = Date.now();
201
205
 
202
206
  const response = await requester.send({
@@ -212,7 +216,7 @@ describe('timeout handling', () => {
212
216
  expect(now - before).toBeLessThanOrEqual(2200);
213
217
  });
214
218
 
215
- it("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
219
+ test("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
216
220
  const before = Date.now();
217
221
  const response = await requester.send({
218
222
  ...timeoutRequest,
@@ -227,7 +231,7 @@ describe('timeout handling', () => {
227
231
  expect(now - before).toBeLessThanOrEqual(3200);
228
232
  });
229
233
 
230
- it('do not timeouts if response appears before the timeout', async () => {
234
+ test('do not timeouts if response appears before the timeout', async () => {
231
235
  const before = Date.now();
232
236
  const response = await requester.send({
233
237
  ...requestStub,
@@ -246,7 +250,7 @@ describe('timeout handling', () => {
246
250
  });
247
251
 
248
252
  describe('error handling', (): void => {
249
- it('resolves dns not found', async () => {
253
+ test('resolves dns not found', async () => {
250
254
  const request: EndRequest = {
251
255
  url: 'https://this-dont-exist.algolia.com',
252
256
  method: 'POST',
@@ -263,7 +267,7 @@ describe('error handling', (): void => {
263
267
  expect(response.isTimedOut).toBe(false);
264
268
  });
265
269
 
266
- it('resolves general network errors', async () => {
270
+ test('resolves general network errors', async () => {
267
271
  nock(testQueryBaseUrl, { reqheaders: headers })
268
272
  .post('/foo')
269
273
  .query(testQueryHeader)
@@ -1,8 +0,0 @@
1
- import { URL } from 'url';
2
-
3
- import { createEchoRequester } from '@algolia/client-common';
4
- import type { Requester } from '@algolia/client-common';
5
-
6
- export function echoRequester(status: number = 200): Requester {
7
- return createEchoRequester({ getURL: (url: string) => new URL(url), status });
8
- }