@algolia/requester-node-http
Advanced tools
@@ -40,2 +40,3 @@ "use strict"; | ||
| var import_https = __toESM(require("https"), 1); | ||
| var import_stream = require("stream"); | ||
| var import_url = require("url"); | ||
@@ -60,2 +61,10 @@ var import_zlib = __toESM(require("zlib"), 1); | ||
| const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`; | ||
| const privateHeaders = { | ||
| "accept-encoding": "gzip" | ||
| }; | ||
| if (request.data !== void 0 && request.method === "DELETE") { | ||
| privateHeaders["content-length"] = String( | ||
| typeof request.data === "string" ? Buffer.byteLength(request.data) : request.data.byteLength | ||
| ); | ||
| } | ||
| const options = { | ||
@@ -68,3 +77,3 @@ agent: url.protocol === "https:" ? httpsAgent : httpAgent, | ||
| headers: { | ||
| "accept-encoding": "gzip", | ||
| ...privateHeaders, | ||
| ...request.headers, | ||
@@ -127,3 +136,44 @@ ...requesterOptions.headers | ||
| } | ||
| return { send }; | ||
| function sendStream(request) { | ||
| return new Promise((resolve, reject) => { | ||
| const url = new import_url.URL(request.url); | ||
| const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`; | ||
| const options = { | ||
| agent: url.protocol === "https:" ? httpsAgent : httpAgent, | ||
| hostname: url.hostname, | ||
| path, | ||
| method: request.method, | ||
| ...requesterOptions, | ||
| headers: { | ||
| ...request.headers, | ||
| ...requesterOptions.headers | ||
| } | ||
| }; | ||
| if (url.port && !requesterOptions.port) { | ||
| options.port = url.port; | ||
| } | ||
| const req = (url.protocol === "https:" ? import_https.default : import_http.default).request(options, (response) => { | ||
| const statusCode = response.statusCode || 0; | ||
| if (statusCode < 200 || statusCode >= 300) { | ||
| let body = ""; | ||
| response.on("data", (chunk) => { | ||
| body += chunk; | ||
| }); | ||
| response.on("end", () => { | ||
| reject(new Error(`HTTP ${statusCode}: ${body}`)); | ||
| }); | ||
| return; | ||
| } | ||
| resolve(import_stream.Readable.toWeb(response)); | ||
| }); | ||
| req.on("error", (error) => { | ||
| reject(error); | ||
| }); | ||
| if (request.data !== void 0) { | ||
| req.write(request.data); | ||
| } | ||
| req.end(); | ||
| }); | ||
| } | ||
| return { send, sendStream }; | ||
| } | ||
@@ -130,0 +180,0 @@ // Annotate the CommonJS export names for ESM import in node: |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/createHttpRequester.ts"],"sourcesContent":["export * from './createHttpRequester';\n","import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\nimport zlib from 'zlib';\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 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 'accept-encoding': 'gzip',\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 let buffer = Buffer.concat(contentBuffers);\n if (response.headers['content-encoding'] === 'gzip') {\n buffer = zlib.gunzipSync(buffer);\n }\n\n resolve({\n status: response.statusCode || 0,\n content: buffer.toString(),\n isTimedOut: false,\n });\n });\n\n response.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n resolve({ status: 0, content: error.message, isTimedOut: false });\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":"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","names":["http","https","zlib"]} | ||
| {"version":3,"sources":["../src/index.ts","../src/createHttpRequester.ts"],"sourcesContent":["export * from './createHttpRequester';\n","import http from 'http';\nimport https from 'https';\nimport { Readable } from 'stream';\nimport { URL } from 'url';\nimport zlib from 'zlib';\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 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 privateHeaders: Record<string, string> = {\n 'accept-encoding': 'gzip',\n };\n\n if (request.data !== undefined && request.method === 'DELETE') {\n privateHeaders['content-length'] = String(\n typeof request.data === 'string' ? Buffer.byteLength(request.data) : (request.data as Uint8Array).byteLength,\n );\n }\n\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 ...privateHeaders,\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 let buffer = Buffer.concat(contentBuffers);\n if (response.headers['content-encoding'] === 'gzip') {\n buffer = zlib.gunzipSync(buffer);\n }\n\n resolve({\n status: response.statusCode || 0,\n content: buffer.toString(),\n isTimedOut: false,\n });\n });\n\n response.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n resolve({ status: 0, content: error.message, isTimedOut: false });\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 function sendStream(request: EndRequest): Promise<ReadableStream<Uint8Array>> {\n return new Promise((resolve, reject) => {\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 const statusCode = response.statusCode || 0;\n\n if (statusCode < 200 || statusCode >= 300) {\n let body = '';\n response.on('data', (chunk) => {\n body += chunk;\n });\n response.on('end', () => {\n reject(new Error(`HTTP ${statusCode}: ${body}`));\n });\n return;\n }\n\n resolve(Readable.toWeb(response) as ReadableStream<Uint8Array>);\n });\n\n req.on('error', (error) => {\n reject(error);\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send, sendStream };\n}\n"],"mappings":"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","names":["http","https","zlib"]} |
| // src/createHttpRequester.ts | ||
| import http from "http"; | ||
| import https from "https"; | ||
| import { Readable } from "stream"; | ||
| import { URL } from "url"; | ||
@@ -23,2 +24,10 @@ import zlib from "zlib"; | ||
| const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`; | ||
| const privateHeaders = { | ||
| "accept-encoding": "gzip" | ||
| }; | ||
| if (request.data !== void 0 && request.method === "DELETE") { | ||
| privateHeaders["content-length"] = String( | ||
| typeof request.data === "string" ? Buffer.byteLength(request.data) : request.data.byteLength | ||
| ); | ||
| } | ||
| const options = { | ||
@@ -31,3 +40,3 @@ agent: url.protocol === "https:" ? httpsAgent : httpAgent, | ||
| headers: { | ||
| "accept-encoding": "gzip", | ||
| ...privateHeaders, | ||
| ...request.headers, | ||
@@ -90,3 +99,44 @@ ...requesterOptions.headers | ||
| } | ||
| return { send }; | ||
| function sendStream(request) { | ||
| return new Promise((resolve, reject) => { | ||
| const url = new URL(request.url); | ||
| const path = url.search === null ? url.pathname : `${url.pathname}${url.search}`; | ||
| const options = { | ||
| agent: url.protocol === "https:" ? httpsAgent : httpAgent, | ||
| hostname: url.hostname, | ||
| path, | ||
| method: request.method, | ||
| ...requesterOptions, | ||
| headers: { | ||
| ...request.headers, | ||
| ...requesterOptions.headers | ||
| } | ||
| }; | ||
| if (url.port && !requesterOptions.port) { | ||
| options.port = url.port; | ||
| } | ||
| const req = (url.protocol === "https:" ? https : http).request(options, (response) => { | ||
| const statusCode = response.statusCode || 0; | ||
| if (statusCode < 200 || statusCode >= 300) { | ||
| let body = ""; | ||
| response.on("data", (chunk) => { | ||
| body += chunk; | ||
| }); | ||
| response.on("end", () => { | ||
| reject(new Error(`HTTP ${statusCode}: ${body}`)); | ||
| }); | ||
| return; | ||
| } | ||
| resolve(Readable.toWeb(response)); | ||
| }); | ||
| req.on("error", (error) => { | ||
| reject(error); | ||
| }); | ||
| if (request.data !== void 0) { | ||
| req.write(request.data); | ||
| } | ||
| req.end(); | ||
| }); | ||
| } | ||
| return { send, sendStream }; | ||
| } | ||
@@ -93,0 +143,0 @@ export { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/createHttpRequester.ts"],"sourcesContent":["import http from 'http';\nimport https from 'https';\nimport { URL } from 'url';\nimport zlib from 'zlib';\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 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 'accept-encoding': 'gzip',\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 let buffer = Buffer.concat(contentBuffers);\n if (response.headers['content-encoding'] === 'gzip') {\n buffer = zlib.gunzipSync(buffer);\n }\n\n resolve({\n status: response.statusCode || 0,\n content: buffer.toString(),\n isTimedOut: false,\n });\n });\n\n response.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n resolve({ status: 0, content: error.message, isTimedOut: false });\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;AACpB,OAAO,UAAU;AAejB,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;AACJ,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,mBAAmB;AAAA,UACnB,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,cAAI,SAAS,OAAO,OAAO,cAAc;AACzC,cAAI,SAAS,QAAQ,kBAAkB,MAAM,QAAQ;AACnD,qBAAS,KAAK,WAAW,MAAM;AAAA,UACjC;AAEA,kBAAQ;AAAA,YACN,QAAQ,SAAS,cAAc;AAAA,YAC/B,SAAS,OAAO,SAAS;AAAA,YACzB,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAED,iBAAS,GAAG,SAAS,CAAC,UAAU;AAC9B,uBAAa,cAAgC;AAC7C,uBAAa,eAAiC;AAC9C,kBAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,QAClE,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":[]} | ||
| {"version":3,"sources":["../src/createHttpRequester.ts"],"sourcesContent":["import http from 'http';\nimport https from 'https';\nimport { Readable } from 'stream';\nimport { URL } from 'url';\nimport zlib from 'zlib';\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 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 privateHeaders: Record<string, string> = {\n 'accept-encoding': 'gzip',\n };\n\n if (request.data !== undefined && request.method === 'DELETE') {\n privateHeaders['content-length'] = String(\n typeof request.data === 'string' ? Buffer.byteLength(request.data) : (request.data as Uint8Array).byteLength,\n );\n }\n\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 ...privateHeaders,\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 let buffer = Buffer.concat(contentBuffers);\n if (response.headers['content-encoding'] === 'gzip') {\n buffer = zlib.gunzipSync(buffer);\n }\n\n resolve({\n status: response.statusCode || 0,\n content: buffer.toString(),\n isTimedOut: false,\n });\n });\n\n response.on('error', (error) => {\n clearTimeout(connectTimeout as NodeJS.Timeout);\n clearTimeout(responseTimeout as NodeJS.Timeout);\n resolve({ status: 0, content: error.message, isTimedOut: false });\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 function sendStream(request: EndRequest): Promise<ReadableStream<Uint8Array>> {\n return new Promise((resolve, reject) => {\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 const statusCode = response.statusCode || 0;\n\n if (statusCode < 200 || statusCode >= 300) {\n let body = '';\n response.on('data', (chunk) => {\n body += chunk;\n });\n response.on('end', () => {\n reject(new Error(`HTTP ${statusCode}: ${body}`));\n });\n return;\n }\n\n resolve(Readable.toWeb(response) as ReadableStream<Uint8Array>);\n });\n\n req.on('error', (error) => {\n reject(error);\n });\n\n if (request.data !== undefined) {\n req.write(request.data);\n }\n\n req.end();\n });\n }\n\n return { send, sendStream };\n}\n"],"mappings":"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","names":[]} |
+3
-3
| { | ||
| "name": "@algolia/requester-node-http", | ||
| "version": "5.53.0", | ||
| "version": "5.54.0", | ||
| "description": "Promise-based request library for node using the native http module.", | ||
@@ -38,3 +38,3 @@ "repository": { | ||
| "dependencies": { | ||
| "@algolia/client-common": "5.53.0" | ||
| "@algolia/client-common": "5.54.0" | ||
| }, | ||
@@ -53,3 +53,3 @@ "devDependencies": { | ||
| }, | ||
| "gitHead": "2658999ce3f428dfc8cab8e4946de263030245ba" | ||
| "gitHead": "b2006b248e1ed1a94168391b649d0ec897cd8812" | ||
| } |
33240
39.19%335
42.55%+ Added
- Removed