@algolia/requester-node-http 5.3.2 → 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.
- package/dist/requester.http.cjs +4 -13
- package/dist/requester.http.cjs.map +1 -1
- package/dist/requester.http.d.cts +2 -4
- package/dist/requester.http.d.ts +2 -4
- package/dist/requester.http.js +3 -11
- package/dist/requester.http.js.map +1 -1
- package/index.ts +0 -1
- package/package.json +5 -9
- package/src/__tests__/node-http-requester.test.ts +31 -27
- package/src/echoRequester.ts +0 -8
package/dist/requester.http.cjs
CHANGED
|
@@ -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
|
|
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
|
|
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/
|
|
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
|
|
16
|
+
export { type CreateHttpRequesterOptions, createHttpRequester };
|
package/dist/requester.http.d.ts
CHANGED
|
@@ -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
|
|
16
|
+
export { type CreateHttpRequesterOptions, createHttpRequester };
|
package/dist/requester.http.js
CHANGED
|
@@ -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
|
|
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
|
|
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/
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@algolia/requester-node-http",
|
|
3
|
-
"version": "5.
|
|
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": "
|
|
33
|
+
"test": "vitest --run",
|
|
34
34
|
"test:bundle": "publint . && attw --pack ."
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@algolia/client-common": "5.
|
|
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:
|
|
27
|
-
on:
|
|
28
|
-
once:
|
|
29
|
-
write:
|
|
30
|
-
end:
|
|
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 =
|
|
36
|
+
https.request = vi.fn(() => mockedRequestResponse);
|
|
36
37
|
});
|
|
37
38
|
|
|
38
39
|
afterAll(() => {
|
|
39
40
|
https.request = httpsBaseRequest;
|
|
40
41
|
http.request = httpBaseRequest;
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
vi.resetAllMocks();
|
|
43
|
+
vi.clearAllMocks();
|
|
43
44
|
});
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
test('allow init without parameters', () => {
|
|
46
47
|
expect(() => createHttpRequester()).not.toThrow();
|
|
47
48
|
});
|
|
48
49
|
|
|
49
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
afterAll(
|
|
167
|
+
() =>
|
|
168
|
+
new Promise((done) => {
|
|
169
|
+
done();
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
168
172
|
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
270
|
+
test('resolves general network errors', async () => {
|
|
267
271
|
nock(testQueryBaseUrl, { reqheaders: headers })
|
|
268
272
|
.post('/foo')
|
|
269
273
|
.query(testQueryHeader)
|
package/src/echoRequester.ts
DELETED
|
@@ -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
|
-
}
|