Launch Week Day 3: Introducing Organization Notifications in Socket.Learn More
Socket
Book a DemoSign in
Socket

@algolia/requester-browser-xhr

Package Overview
Dependencies
Maintainers
3
Versions
304
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@algolia/requester-browser-xhr - npm Package Compare versions

Comparing version
5.3.2
to
5.4.0
+1
-3
dist/requester.xhr.d.ts

@@ -5,4 +5,2 @@ import { Requester } from '@algolia/client-common';

declare function echoRequester(status?: number): Requester;
export { createXhrRequester, echoRequester };
export { createXhrRequester };

@@ -1,2 +0,2 @@

function c(){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,m)=>setTimeout(()=>{e.abort(),s({status:0,content:m,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}}import{createEchoRequester as a}from"@algolia/client-common";function p(r=200){return a({getURL:t=>new URL(t),status:r})}export{c as createXhrRequester,p as echoRequester};
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};
//# sourceMappingURL=requester.xhr.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/createXhrRequester.ts","../src/echoRequester.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","import { 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"],"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,CClEA,OAAS,uBAAAU,MAA2B,yBAG7B,SAASC,EAAcC,EAAiB,IAAgB,CAC7D,OAAOF,EAAoB,CAAE,OAASG,GAAgB,IAAI,IAAIA,CAAG,EAAG,OAAAD,CAAO,CAAC,CAC9E","names":["createXhrRequester","send","request","resolve","baseRequester","key","createTimeout","timeout","content","connectTimeout","responseTimeout","createEchoRequester","echoRequester","status","url"]}
{"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"]}
export * from './src/createXhrRequester';
export * from './src/echoRequester';
{
"name": "@algolia/requester-browser-xhr",
"version": "5.3.2",
"version": "5.4.0",
"description": "Promise-based request library for browser using xhr.",

@@ -29,20 +29,16 @@ "repository": {

"clean": "rm -rf ./dist || true",
"test": "jest",
"test": "vitest --run",
"test:bundle": "publint . && attw --pack . --ignore-rules cjs-resolves-to-esm"
},
"dependencies": {
"@algolia/client-common": "5.3.2"
"@algolia/client-common": "5.4.0"
},
"devDependencies": {
"@arethetypeswrong/cli": "0.16.1",
"@babel/preset-env": "7.25.4",
"@babel/preset-typescript": "7.24.7",
"@types/jest": "29.5.12",
"@types/node": "22.5.1",
"jest": "29.7.0",
"jest-environment-jsdom": "29.7.0",
"jsdom": "25.0.0",
"publint": "0.2.10",
"ts-jest": "29.2.5",
"tsup": "8.2.4",
"typescript": "5.5.4",
"vitest": "2.0.5",
"xhr-mock": "2.5.1"

@@ -49,0 +45,0 @@ },

import type http from 'http';
import type { EndRequest } from '@algolia/client-common';
import { describe, test, beforeAll, afterAll, beforeEach, afterEach, expect } from 'vitest';
import type { MockRequest, MockResponse } from 'xhr-mock';

@@ -20,6 +21,10 @@ import mock from 'xhr-mock';

describe('status code handling', () => {
beforeEach(() => mock.setup());
afterEach(() => mock.teardown());
beforeEach(() => {
mock.setup();
});
afterEach(() => {
mock.teardown();
});
it('sends requests', async () => {
test('sends requests', async () => {
mock.post(BASE_URL, (req: MockRequest, res: MockResponse): MockResponse => {

@@ -36,3 +41,3 @@ expect(req.method()).toEqual('POST');

it('resolves status 200', async () => {
test('resolves status 200', async () => {
const body = getStringifiedBody();

@@ -52,3 +57,3 @@

it('resolves status 300', async () => {
test('resolves status 300', async () => {
const reason = 'Multiple Choices';

@@ -68,3 +73,3 @@

it('resolves status 400', async () => {
test('resolves status 400', async () => {
const body = getStringifiedBody({

@@ -86,3 +91,3 @@ message: 'Invalid Application-Id or API-Key',

it('handles the protocol', async () => {
test('handles the protocol', async () => {
const body = getStringifiedBody();

@@ -115,7 +120,10 @@

afterAll((done) => {
server.close(() => done());
});
afterAll(
() =>
new Promise((done) => {
done();
}),
);
it('connection timeouts with the given 1 seconds connection timeout', async () => {
test('connection timeouts with the given 1 seconds connection timeout', async () => {
const before = Date.now();

@@ -135,3 +143,3 @@ const response = await requester.send({

it('connection timeouts with the given 2 seconds connection timeout', async () => {
test('connection timeouts with the given 2 seconds connection timeout', async () => {
const before = Date.now();

@@ -151,3 +159,3 @@ const response = await requester.send({

it("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
test("socket timeouts if response don't appears before the timeout with 2 seconds timeout", async () => {
const before = Date.now();

@@ -168,3 +176,3 @@

it("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
test("socket timeouts if response don't appears before the timeout with 3 seconds timeout", async () => {
const before = Date.now();

@@ -185,3 +193,3 @@

it('do not timeouts if response appears before the timeout', async () => {
test('do not timeouts if response appears before the timeout', async () => {
const before = Date.now();

@@ -205,3 +213,3 @@ const response = await requester.send({

describe('error handling', () => {
it('resolves dns not found', async () => {
test('resolves dns not found', async () => {
const request: EndRequest = {

@@ -223,3 +231,3 @@ url: 'https://this-dont-exist.algolia.com',

it('resolves general network errors', async () => {
test('resolves general network errors', async () => {
mock.post(BASE_URL, () => Promise.reject(new Error('This is a general error')));

@@ -226,0 +234,0 @@

import { createEchoRequester } from '@algolia/client-common';
import type { Requester } from '@algolia/client-common';
export function echoRequester(status: number = 200): Requester {
return createEchoRequester({ getURL: (url: string) => new URL(url), status });
}