@algolia/requester-browser-xhr 5.8.1 → 5.9.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.
@@ -1,5 +1,3 @@
1
- import { Requester } from '@algolia/client-common';
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}}
2
2
 
3
- declare function createXhrRequester(): Requester;
4
-
5
- export { createXhrRequester };
3
+ export { m as createXhrRequester };
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/requester.xhr';
package/index.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/requester.xhr.js');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@algolia/requester-browser-xhr",
3
- "version": "5.8.1",
3
+ "version": "5.9.0",
4
4
  "description": "Promise-based request library for browser using xhr.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,8 +21,8 @@
21
21
  "react-native": "./dist/requester.xhr.js",
22
22
  "files": [
23
23
  "dist",
24
- "src",
25
- "index.ts"
24
+ "index.d.ts",
25
+ "index.js"
26
26
  ],
27
27
  "scripts": {
28
28
  "build": "yarn clean && yarn tsup",
@@ -31,15 +31,15 @@
31
31
  "test:bundle": "publint . && attw --pack . --ignore-rules cjs-resolves-to-esm"
32
32
  },
33
33
  "dependencies": {
34
- "@algolia/client-common": "5.8.1"
34
+ "@algolia/client-common": "5.9.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@arethetypeswrong/cli": "0.16.4",
38
- "@types/node": "22.7.4",
38
+ "@types/node": "22.7.5",
39
39
  "jsdom": "25.0.1",
40
40
  "publint": "0.2.11",
41
41
  "tsup": "8.3.0",
42
- "typescript": "5.6.2",
42
+ "typescript": "5.6.3",
43
43
  "vitest": "2.1.2",
44
44
  "xhr-mock": "2.5.1"
45
45
  },
package/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './src/createXhrRequester';
@@ -1,229 +0,0 @@
1
- import type http from 'http';
2
- import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test } from 'vitest';
3
- import type { MockRequest, MockResponse } from 'xhr-mock';
4
- import mock from 'xhr-mock';
5
-
6
- import type { EndRequest } from '@algolia/client-common';
7
-
8
- import { createXhrRequester } from '../..';
9
- import {
10
- BASE_URL,
11
- createTestServer,
12
- getStringifiedBody,
13
- headers,
14
- requestStub,
15
- timeoutRequest,
16
- } from '../../../../tests/utils';
17
-
18
- const requester = createXhrRequester();
19
-
20
- describe('status code handling', () => {
21
- beforeEach(() => {
22
- mock.setup();
23
- });
24
- afterEach(() => {
25
- mock.teardown();
26
- });
27
-
28
- test('sends requests', async () => {
29
- mock.post(BASE_URL, (req: MockRequest, res: MockResponse): MockResponse => {
30
- expect(req.method()).toEqual('POST');
31
- expect(req.header('content-type')).toEqual('text/plain');
32
- expect(req.body()).toEqual(JSON.stringify({ foo: 'bar' }));
33
-
34
- return res.status(200);
35
- });
36
-
37
- await requester.send(requestStub);
38
- });
39
-
40
- test('resolves status 200', async () => {
41
- const body = getStringifiedBody();
42
-
43
- mock.post(BASE_URL, {
44
- status: 200,
45
- body: requestStub.data,
46
- });
47
-
48
- const response = await requester.send(requestStub);
49
-
50
- expect(response.status).toBe(200);
51
- expect(response.content).toBe(body);
52
- expect(response.isTimedOut).toBe(false);
53
- });
54
-
55
- test('resolves status 300', async () => {
56
- const reason = 'Multiple Choices';
57
-
58
- mock.post(BASE_URL, {
59
- status: 300,
60
- reason,
61
- });
62
-
63
- const response = await requester.send(requestStub);
64
-
65
- expect(response.status).toBe(300);
66
- expect(response.content).toBe(''); // No body returned here on xhr
67
- expect(response.isTimedOut).toBe(false);
68
- });
69
-
70
- test('resolves status 400', async () => {
71
- const body = getStringifiedBody({
72
- message: 'Invalid Application-Id or API-Key',
73
- });
74
-
75
- mock.post(BASE_URL, {
76
- status: 400,
77
- body,
78
- });
79
-
80
- const response = await requester.send(requestStub);
81
-
82
- expect(response.status).toBe(400);
83
- expect(response.content).toBe(body);
84
- expect(response.isTimedOut).toBe(false);
85
- });
86
-
87
- test('handles the protocol', async () => {
88
- const body = getStringifiedBody();
89
-
90
- mock.post('http://localhost/', {
91
- status: 200,
92
- body,
93
- });
94
-
95
- const response = await requester.send({
96
- ...requestStub,
97
- url: 'http://localhost',
98
- });
99
-
100
- expect(response.status).toBe(200);
101
- expect(response.content).toBe(body);
102
- expect(response.isTimedOut).toBe(false);
103
- });
104
- });
105
-
106
- describe('timeout handling', () => {
107
- let server: http.Server;
108
- // setup http server to test timeout
109
- beforeAll(() => {
110
- server = createTestServer();
111
-
112
- server.listen('1111');
113
- });
114
-
115
- afterAll(
116
- () =>
117
- new Promise((done) => {
118
- done();
119
- }),
120
- );
121
-
122
- test('connection timeouts with the given 1 seconds connection timeout', async () => {
123
- const before = Date.now();
124
- const response = await requester.send({
125
- ...timeoutRequest,
126
- connectTimeout: 1000,
127
- url: 'http://localhost:1111/connection_timeout',
128
- });
129
-
130
- const now = Date.now();
131
-
132
- expect(response.content).toBe('Connection timeout');
133
- expect(now - before).toBeGreaterThanOrEqual(999);
134
- expect(now - before).toBeLessThanOrEqual(1200);
135
- });
136
-
137
- test('connection timeouts with the given 2 seconds connection timeout', async () => {
138
- const before = Date.now();
139
- const response = await requester.send({
140
- ...timeoutRequest,
141
- connectTimeout: 2000,
142
- url: 'http://localhost:1111/connection_timeout',
143
- });
144
-
145
- const now = Date.now();
146
-
147
- expect(response.content).toBe('Connection timeout');
148
- expect(now - before).toBeGreaterThanOrEqual(1990);
149
- expect(now - before).toBeLessThanOrEqual(2200);
150
- });
151
-
152
- test("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
153
- const before = Date.now();
154
-
155
- const response = await requester.send({
156
- ...timeoutRequest,
157
- responseTimeout: 2000,
158
- url: 'http://localhost:1111',
159
- });
160
-
161
- const now = Date.now();
162
-
163
- expect(response.content).toBe('Socket timeout');
164
- expect(now - before).toBeGreaterThanOrEqual(1990);
165
- expect(now - before).toBeLessThanOrEqual(2200);
166
- });
167
-
168
- test("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
169
- const before = Date.now();
170
-
171
- const response = await requester.send({
172
- ...timeoutRequest,
173
- responseTimeout: 3000,
174
- url: 'http://localhost:1111',
175
- });
176
-
177
- const now = Date.now();
178
-
179
- expect(response.content).toBe('Socket timeout');
180
- expect(now - before).toBeGreaterThanOrEqual(2999);
181
- expect(now - before).toBeLessThanOrEqual(3200);
182
- });
183
-
184
- test('do not timeouts if response appears before the timeout', async () => {
185
- const before = Date.now();
186
- const response = await requester.send({
187
- ...requestStub,
188
- responseTimeout: 6000,
189
- url: 'http://localhost:1111',
190
- });
191
-
192
- const now = Date.now();
193
-
194
- expect(response.isTimedOut).toBe(false);
195
- expect(response.status).toBe(200);
196
- expect(response.content).toBe('{"foo": "bar"}');
197
- expect(now - before).toBeGreaterThanOrEqual(4999);
198
- expect(now - before).toBeLessThanOrEqual(5200);
199
- }, 10000); // This is a long-running test, default server timeout is set to 5000ms
200
- });
201
-
202
- describe('error handling', () => {
203
- test('resolves dns not found', async () => {
204
- const request: EndRequest = {
205
- url: 'https://this-dont-exist.algolia.com',
206
- method: 'POST',
207
- headers,
208
- data: getStringifiedBody(),
209
- responseTimeout: 2000,
210
- connectTimeout: 1000,
211
- };
212
-
213
- const response = await requester.send(request);
214
-
215
- expect(response.status).toBe(0);
216
- expect(response.content).toBe('Network request failed');
217
- expect(response.isTimedOut).toBe(false);
218
- });
219
-
220
- test('resolves general network errors', async () => {
221
- mock.post(BASE_URL, () => Promise.reject(new Error('This is a general error')));
222
-
223
- const response = await requester.send(requestStub);
224
-
225
- expect(response.status).toBe(0);
226
- expect(response.content).toBe('Network request failed');
227
- expect(response.isTimedOut).toBe(false);
228
- });
229
- });
@@ -1,67 +0,0 @@
1
- import type { EndRequest, Requester, Response } from '@algolia/client-common';
2
-
3
- type Timeout = ReturnType<typeof setTimeout>;
4
-
5
- export function createXhrRequester(): Requester {
6
- function send(request: EndRequest): Promise<Response> {
7
- return new Promise((resolve) => {
8
- const baseRequester = new XMLHttpRequest();
9
- baseRequester.open(request.method, request.url, true);
10
-
11
- Object.keys(request.headers).forEach((key) => baseRequester.setRequestHeader(key, request.headers[key]));
12
-
13
- const createTimeout = (timeout: number, content: string): Timeout => {
14
- return setTimeout(() => {
15
- baseRequester.abort();
16
-
17
- resolve({
18
- status: 0,
19
- content,
20
- isTimedOut: true,
21
- });
22
- }, timeout);
23
- };
24
-
25
- const connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');
26
-
27
- let responseTimeout: Timeout | undefined;
28
-
29
- baseRequester.onreadystatechange = (): void => {
30
- if (baseRequester.readyState > baseRequester.OPENED && responseTimeout === undefined) {
31
- clearTimeout(connectTimeout);
32
-
33
- responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');
34
- }
35
- };
36
-
37
- baseRequester.onerror = (): void => {
38
- // istanbul ignore next
39
- if (baseRequester.status === 0) {
40
- clearTimeout(connectTimeout);
41
- clearTimeout(responseTimeout!);
42
-
43
- resolve({
44
- content: baseRequester.responseText || 'Network request failed',
45
- status: baseRequester.status,
46
- isTimedOut: false,
47
- });
48
- }
49
- };
50
-
51
- baseRequester.onload = (): void => {
52
- clearTimeout(connectTimeout);
53
- clearTimeout(responseTimeout!);
54
-
55
- resolve({
56
- content: baseRequester.responseText,
57
- status: baseRequester.status,
58
- isTimedOut: false,
59
- });
60
- };
61
-
62
- baseRequester.send(request.data);
63
- });
64
- }
65
-
66
- return { send };
67
- }