@algolia/requester-browser-xhr 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.xhr.d.ts
CHANGED
package/dist/requester.xhr.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function m(){function r(t){return new Promise(s=>{let e=new XMLHttpRequest;e.open(t.method,t.url,!0),Object.keys(t.headers).forEach(n=>e.setRequestHeader(n,t.headers[n]));let i=(n,a)=>setTimeout(()=>{e.abort(),s({status:0,content:a,isTimedOut:!0})},n),u=i(t.connectTimeout,"Connection timeout"),o;e.onreadystatechange=()=>{e.readyState>e.OPENED&&o===void 0&&(clearTimeout(u),o=i(t.responseTimeout,"Socket timeout"))},e.onerror=()=>{e.status===0&&(clearTimeout(u),clearTimeout(o),s({content:e.responseText||"Network request failed",status:e.status,isTimedOut:!1}))},e.onload=()=>{clearTimeout(u),clearTimeout(o),s({content:e.responseText,status:e.status,isTimedOut:!1})},e.send(t.data)})}return{send:r}}export{m as createXhrRequester};
|
|
2
2
|
//# sourceMappingURL=requester.xhr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createXhrRequester.ts"
|
|
1
|
+
{"version":3,"sources":["../src/createXhrRequester.ts"],"sourcesContent":["import type { EndRequest, Requester, Response } from '@algolia/client-common';\n\ntype Timeout = ReturnType<typeof setTimeout>;\n\nexport function createXhrRequester(): Requester {\n function send(request: EndRequest): Promise<Response> {\n return new Promise((resolve) => {\n const baseRequester = new XMLHttpRequest();\n baseRequester.open(request.method, request.url, true);\n\n Object.keys(request.headers).forEach((key) => baseRequester.setRequestHeader(key, request.headers[key]));\n\n const createTimeout = (timeout: number, content: string): Timeout => {\n return setTimeout(() => {\n baseRequester.abort();\n\n resolve({\n status: 0,\n content,\n isTimedOut: true,\n });\n }, timeout);\n };\n\n const connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');\n\n let responseTimeout: Timeout | undefined;\n\n baseRequester.onreadystatechange = (): void => {\n if (baseRequester.readyState > baseRequester.OPENED && responseTimeout === undefined) {\n clearTimeout(connectTimeout);\n\n responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');\n }\n };\n\n baseRequester.onerror = (): void => {\n // istanbul ignore next\n if (baseRequester.status === 0) {\n clearTimeout(connectTimeout);\n clearTimeout(responseTimeout!);\n\n resolve({\n content: baseRequester.responseText || 'Network request failed',\n status: baseRequester.status,\n isTimedOut: false,\n });\n }\n };\n\n baseRequester.onload = (): void => {\n clearTimeout(connectTimeout);\n clearTimeout(responseTimeout!);\n\n resolve({\n content: baseRequester.responseText,\n status: baseRequester.status,\n isTimedOut: false,\n });\n };\n\n baseRequester.send(request.data);\n });\n }\n\n return { send };\n}\n"],"mappings":"AAIO,SAASA,GAAgC,CAC9C,SAASC,EAAKC,EAAwC,CACpD,OAAO,IAAI,QAASC,GAAY,CAC9B,IAAMC,EAAgB,IAAI,eAC1BA,EAAc,KAAKF,EAAQ,OAAQA,EAAQ,IAAK,EAAI,EAEpD,OAAO,KAAKA,EAAQ,OAAO,EAAE,QAASG,GAAQD,EAAc,iBAAiBC,EAAKH,EAAQ,QAAQG,CAAG,CAAC,CAAC,EAEvG,IAAMC,EAAgB,CAACC,EAAiBC,IAC/B,WAAW,IAAM,CACtBJ,EAAc,MAAM,EAEpBD,EAAQ,CACN,OAAQ,EACR,QAAAK,EACA,WAAY,EACd,CAAC,CACH,EAAGD,CAAO,EAGNE,EAAiBH,EAAcJ,EAAQ,eAAgB,oBAAoB,EAE7EQ,EAEJN,EAAc,mBAAqB,IAAY,CACzCA,EAAc,WAAaA,EAAc,QAAUM,IAAoB,SACzE,aAAaD,CAAc,EAE3BC,EAAkBJ,EAAcJ,EAAQ,gBAAiB,gBAAgB,EAE7E,EAEAE,EAAc,QAAU,IAAY,CAE9BA,EAAc,SAAW,IAC3B,aAAaK,CAAc,EAC3B,aAAaC,CAAgB,EAE7BP,EAAQ,CACN,QAASC,EAAc,cAAgB,yBACvC,OAAQA,EAAc,OACtB,WAAY,EACd,CAAC,EAEL,EAEAA,EAAc,OAAS,IAAY,CACjC,aAAaK,CAAc,EAC3B,aAAaC,CAAgB,EAE7BP,EAAQ,CACN,QAASC,EAAc,aACvB,OAAQA,EAAc,OACtB,WAAY,EACd,CAAC,CACH,EAEAA,EAAc,KAAKF,EAAQ,IAAI,CACjC,CAAC,CACH,CAEA,MAAO,CAAE,KAAAD,CAAK,CAChB","names":["createXhrRequester","send","request","resolve","baseRequester","key","createTimeout","timeout","content","connectTimeout","responseTimeout"]}
|
package/index.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@algolia/requester-browser-xhr",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0",
|
|
4
4
|
"description": "Promise-based request library for browser using xhr.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,24 +26,20 @@
|
|
|
26
26
|
"scripts": {
|
|
27
27
|
"build": "yarn clean && yarn tsup",
|
|
28
28
|
"clean": "rm -rf ./dist || true",
|
|
29
|
-
"test": "
|
|
29
|
+
"test": "vitest --run",
|
|
30
30
|
"test:bundle": "publint . && attw --pack . --ignore-rules cjs-resolves-to-esm"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@algolia/client-common": "5.
|
|
33
|
+
"@algolia/client-common": "5.4.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@arethetypeswrong/cli": "0.16.1",
|
|
37
|
-
"@babel/preset-env": "7.25.4",
|
|
38
|
-
"@babel/preset-typescript": "7.24.7",
|
|
39
|
-
"@types/jest": "29.5.12",
|
|
40
37
|
"@types/node": "22.5.1",
|
|
41
|
-
"
|
|
42
|
-
"jest-environment-jsdom": "29.7.0",
|
|
38
|
+
"jsdom": "25.0.0",
|
|
43
39
|
"publint": "0.2.10",
|
|
44
|
-
"ts-jest": "29.2.5",
|
|
45
40
|
"tsup": "8.2.4",
|
|
46
41
|
"typescript": "5.5.4",
|
|
42
|
+
"vitest": "2.0.5",
|
|
47
43
|
"xhr-mock": "2.5.1"
|
|
48
44
|
},
|
|
49
45
|
"engines": {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type http from 'http';
|
|
2
2
|
|
|
3
3
|
import type { EndRequest } from '@algolia/client-common';
|
|
4
|
+
import { describe, test, beforeAll, afterAll, beforeEach, afterEach, expect } from 'vitest';
|
|
4
5
|
import type { MockRequest, MockResponse } from 'xhr-mock';
|
|
5
6
|
import mock from 'xhr-mock';
|
|
6
7
|
|
|
@@ -17,10 +18,14 @@ import {
|
|
|
17
18
|
const requester = createXhrRequester();
|
|
18
19
|
|
|
19
20
|
describe('status code handling', () => {
|
|
20
|
-
beforeEach(() =>
|
|
21
|
-
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
mock.setup();
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
mock.teardown();
|
|
26
|
+
});
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
test('sends requests', async () => {
|
|
24
29
|
mock.post(BASE_URL, (req: MockRequest, res: MockResponse): MockResponse => {
|
|
25
30
|
expect(req.method()).toEqual('POST');
|
|
26
31
|
expect(req.header('content-type')).toEqual('text/plain');
|
|
@@ -32,7 +37,7 @@ describe('status code handling', () => {
|
|
|
32
37
|
await requester.send(requestStub);
|
|
33
38
|
});
|
|
34
39
|
|
|
35
|
-
|
|
40
|
+
test('resolves status 200', async () => {
|
|
36
41
|
const body = getStringifiedBody();
|
|
37
42
|
|
|
38
43
|
mock.post(BASE_URL, {
|
|
@@ -47,7 +52,7 @@ describe('status code handling', () => {
|
|
|
47
52
|
expect(response.isTimedOut).toBe(false);
|
|
48
53
|
});
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
test('resolves status 300', async () => {
|
|
51
56
|
const reason = 'Multiple Choices';
|
|
52
57
|
|
|
53
58
|
mock.post(BASE_URL, {
|
|
@@ -62,7 +67,7 @@ describe('status code handling', () => {
|
|
|
62
67
|
expect(response.isTimedOut).toBe(false);
|
|
63
68
|
});
|
|
64
69
|
|
|
65
|
-
|
|
70
|
+
test('resolves status 400', async () => {
|
|
66
71
|
const body = getStringifiedBody({
|
|
67
72
|
message: 'Invalid Application-Id or API-Key',
|
|
68
73
|
});
|
|
@@ -79,7 +84,7 @@ describe('status code handling', () => {
|
|
|
79
84
|
expect(response.isTimedOut).toBe(false);
|
|
80
85
|
});
|
|
81
86
|
|
|
82
|
-
|
|
87
|
+
test('handles the protocol', async () => {
|
|
83
88
|
const body = getStringifiedBody();
|
|
84
89
|
|
|
85
90
|
mock.post('http://localhost/', {
|
|
@@ -107,11 +112,14 @@ describe('timeout handling', () => {
|
|
|
107
112
|
server.listen('1111');
|
|
108
113
|
});
|
|
109
114
|
|
|
110
|
-
afterAll(
|
|
111
|
-
|
|
112
|
-
|
|
115
|
+
afterAll(
|
|
116
|
+
() =>
|
|
117
|
+
new Promise((done) => {
|
|
118
|
+
done();
|
|
119
|
+
}),
|
|
120
|
+
);
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
test('connection timeouts with the given 1 seconds connection timeout', async () => {
|
|
115
123
|
const before = Date.now();
|
|
116
124
|
const response = await requester.send({
|
|
117
125
|
...timeoutRequest,
|
|
@@ -126,7 +134,7 @@ describe('timeout handling', () => {
|
|
|
126
134
|
expect(now - before).toBeLessThanOrEqual(1200);
|
|
127
135
|
});
|
|
128
136
|
|
|
129
|
-
|
|
137
|
+
test('connection timeouts with the given 2 seconds connection timeout', async () => {
|
|
130
138
|
const before = Date.now();
|
|
131
139
|
const response = await requester.send({
|
|
132
140
|
...timeoutRequest,
|
|
@@ -141,7 +149,7 @@ describe('timeout handling', () => {
|
|
|
141
149
|
expect(now - before).toBeLessThanOrEqual(2200);
|
|
142
150
|
});
|
|
143
151
|
|
|
144
|
-
|
|
152
|
+
test("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
|
|
145
153
|
const before = Date.now();
|
|
146
154
|
|
|
147
155
|
const response = await requester.send({
|
|
@@ -157,7 +165,7 @@ describe('timeout handling', () => {
|
|
|
157
165
|
expect(now - before).toBeLessThanOrEqual(2200);
|
|
158
166
|
});
|
|
159
167
|
|
|
160
|
-
|
|
168
|
+
test("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
|
|
161
169
|
const before = Date.now();
|
|
162
170
|
|
|
163
171
|
const response = await requester.send({
|
|
@@ -173,7 +181,7 @@ describe('timeout handling', () => {
|
|
|
173
181
|
expect(now - before).toBeLessThanOrEqual(3200);
|
|
174
182
|
});
|
|
175
183
|
|
|
176
|
-
|
|
184
|
+
test('do not timeouts if response appears before the timeout', async () => {
|
|
177
185
|
const before = Date.now();
|
|
178
186
|
const response = await requester.send({
|
|
179
187
|
...requestStub,
|
|
@@ -192,7 +200,7 @@ describe('timeout handling', () => {
|
|
|
192
200
|
});
|
|
193
201
|
|
|
194
202
|
describe('error handling', () => {
|
|
195
|
-
|
|
203
|
+
test('resolves dns not found', async () => {
|
|
196
204
|
const request: EndRequest = {
|
|
197
205
|
url: 'https://this-dont-exist.algolia.com',
|
|
198
206
|
method: 'POST',
|
|
@@ -209,7 +217,7 @@ describe('error handling', () => {
|
|
|
209
217
|
expect(response.isTimedOut).toBe(false);
|
|
210
218
|
});
|
|
211
219
|
|
|
212
|
-
|
|
220
|
+
test('resolves general network errors', async () => {
|
|
213
221
|
mock.post(BASE_URL, () => Promise.reject(new Error('This is a general error')));
|
|
214
222
|
|
|
215
223
|
const response = await requester.send(requestStub);
|
package/src/echoRequester.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createEchoRequester } from '@algolia/client-common';
|
|
2
|
-
import type { Requester } from '@algolia/client-common';
|
|
3
|
-
|
|
4
|
-
export function echoRequester(status: number = 200): Requester {
|
|
5
|
-
return createEchoRequester({ getURL: (url: string) => new URL(url), status });
|
|
6
|
-
}
|