index.cjs.map 39 KB

1
  1. {"version":3,"file":"index.cjs","sources":["../src/util/middlewareReducer.ts","../src/util/pubsub.ts","../src/createRequester.ts","../src/util/lowerCaseHeaders.ts","../src/request/node/proxy.ts","../src/request/node/simpleConcat.ts","../src/request/node/timedOut.ts","../src/request/node/tunnel.ts","../src/request/node-request.ts","../src/index.ts"],"sourcesContent":["import type {ApplyMiddleware, MiddlewareReducer} from '../types'\n\nexport const middlewareReducer = (middleware: MiddlewareReducer) =>\n function applyMiddleware(hook, defaultValue, ...args) {\n const bailEarly = hook === 'onError'\n\n let value = defaultValue\n for (let i = 0; i < middleware[hook].length; i++) {\n const handler = middleware[hook][i]\n // @ts-expect-error -- find a better way to deal with argument tuples\n value = handler(value, ...args)\n\n if (bailEarly && !value) {\n break\n }\n }\n\n return value\n } as ApplyMiddleware\n","// Code borrowed from https://github.com/bjoerge/nano-pubsub\n\nimport type {PubSub, Subscriber} from '../types'\n\nexport function createPubSub<Message = void>(): PubSub<Message> {\n const subscribers: {[id: string]: Subscriber<Message>} = Object.create(null)\n let nextId = 0\n function subscribe(subscriber: Subscriber<Message>) {\n const id = nextId++\n subscribers[id] = subscriber\n return function unsubscribe() {\n delete subscribers[id]\n }\n }\n\n function publish(event: Message) {\n for (const id in subscribers) {\n subscribers[id](event)\n }\n }\n\n return {\n publish,\n subscribe,\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {processOptions} from './middleware/defaultOptionsProcessor'\nimport {validateOptions} from './middleware/defaultOptionsValidator'\nimport type {\n HttpContext,\n HttpRequest,\n HttpRequestOngoing,\n Middleware,\n MiddlewareChannels,\n MiddlewareHooks,\n MiddlewareReducer,\n MiddlewareResponse,\n Middlewares,\n Requester,\n RequestOptions,\n} from './types'\nimport {middlewareReducer} from './util/middlewareReducer'\nimport {createPubSub} from './util/pubsub'\n\nconst channelNames = [\n 'request',\n 'response',\n 'progress',\n 'error',\n 'abort',\n] satisfies (keyof MiddlewareChannels)[]\nconst middlehooks = [\n 'processOptions',\n 'validateOptions',\n 'interceptRequest',\n 'finalizeOptions',\n 'onRequest',\n 'onResponse',\n 'onError',\n 'onReturn',\n 'onHeaders',\n] satisfies (keyof MiddlewareHooks)[]\n\n/** @public */\nexport function createRequester(initMiddleware: Middlewares, httpRequest: HttpRequest): Requester {\n const loadedMiddleware: Middlewares = []\n const middleware: MiddlewareReducer = middlehooks.reduce(\n (ware, name) => {\n ware[name] = ware[name] || []\n return ware\n },\n {\n processOptions: [processOptions],\n validateOptions: [validateOptions],\n } as any,\n )\n\n function request(opts: RequestOptions | string) {\n const onResponse = (reqErr: Error | null, res: MiddlewareResponse, ctx: HttpContext) => {\n let error = reqErr\n let response: MiddlewareResponse | null = res\n\n // We're processing non-errors first, in case a middleware converts the\n // response into an error (for instance, status >= 400 == HttpError)\n if (!error) {\n try {\n response = applyMiddleware('onResponse', res, ctx)\n } catch (err: any) {\n response = null\n error = err\n }\n }\n\n // Apply error middleware - if middleware return the same (or a different) error,\n // publish as an error event. If we *don't* return an error, assume it has been handled\n error = error && applyMiddleware('onError', error, ctx)\n\n // Figure out if we should publish on error/response channels\n if (error) {\n channels.error.publish(error)\n } else if (response) {\n channels.response.publish(response)\n }\n }\n\n const channels: MiddlewareChannels = channelNames.reduce((target, name) => {\n target[name] = createPubSub() as MiddlewareChannels[typeof name]\n return target\n }, {} as any)\n\n // Prepare a middleware reducer that can be reused throughout the lifecycle\n const applyMiddleware = middlewareReducer(middleware)\n\n // Parse the passed options\n const options = applyMiddleware('processOptions', opts as RequestOptions)\n\n // Validate the options\n applyMiddleware('validateOptions', options)\n\n // Build a context object we can pass to child handlers\n const context = {options, channels, applyMiddleware}\n\n // We need to hold a reference to the current, ongoing request,\n // in order to allow cancellation. In the case of the retry middleware,\n // a new request might be triggered\n let ongoingRequest: HttpRequestOngoing | undefined\n const unsubscribe = channels.request.subscribe((ctx) => {\n // Let request adapters (node/browser) perform the actual request\n ongoingRequest = httpRequest(ctx, (err, res) => onResponse(err, res!, ctx))\n })\n\n // If we abort the request, prevent further requests from happening,\n // and be sure to cancel any ongoing request (obviously)\n channels.abort.subscribe(() => {\n unsubscribe()\n if (ongoingRequest) {\n ongoingRequest.abort()\n }\n })\n\n // See if any middleware wants to modify the return value - for instance\n // the promise or observable middlewares\n const returnValue = applyMiddleware('onReturn', channels, context)\n\n // If return value has been modified by a middleware, we expect the middleware\n // to publish on the 'request' channel. If it hasn't been modified, we want to\n // trigger it right away\n if (returnValue === channels) {\n channels.request.publish(context)\n }\n\n return returnValue\n }\n\n request.use = function use(newMiddleware: Middleware) {\n if (!newMiddleware) {\n throw new Error('Tried to add middleware that resolved to falsey value')\n }\n\n if (typeof newMiddleware === 'function') {\n throw new Error(\n 'Tried to add middleware that was a function. It probably expects you to pass options to it.',\n )\n }\n\n if (newMiddleware.onReturn && middleware.onReturn.length > 0) {\n throw new Error(\n 'Tried to add new middleware with `onReturn` handler, but another handler has already been registered for this event',\n )\n }\n\n middlehooks.forEach((key) => {\n if (newMiddleware[key]) {\n middleware[key].push(newMiddleware[key] as any)\n }\n })\n\n loadedMiddleware.push(newMiddleware)\n return request\n }\n\n request.clone = () => createRequester(loadedMiddleware, httpRequest)\n\n initMiddleware.forEach(request.use)\n\n return request\n}\n","export function lowerCaseHeaders(headers: any) {\n return Object.keys(headers || {}).reduce((acc, header) => {\n acc[header.toLowerCase()] = headers[header]\n return acc\n }, {} as any)\n}\n","/**\n * Code borrowed from https://github.com/request/request\n * Apache License 2.0\n */\n\nimport url from 'url'\n\nfunction formatHostname(hostname: string) {\n // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'\n return hostname.replace(/^\\.*/, '.').toLowerCase()\n}\n\nfunction parseNoProxyZone(zoneStr: string) {\n const zone = zoneStr.trim().toLowerCase()\n\n const zoneParts = zone.split(':', 2)\n const zoneHost = formatHostname(zoneParts[0])\n const zonePort = zoneParts[1]\n const hasPort = zone.indexOf(':') > -1\n\n return {hostname: zoneHost, port: zonePort, hasPort: hasPort}\n}\n\nfunction uriInNoProxy(uri: any, noProxy: any) {\n const port = uri.port || (uri.protocol === 'https:' ? '443' : '80')\n const hostname = formatHostname(uri.hostname)\n const noProxyList = noProxy.split(',')\n\n // iterate through the noProxyList until it finds a match.\n return noProxyList.map(parseNoProxyZone).some((noProxyZone: any) => {\n const isMatchedAt = hostname.indexOf(noProxyZone.hostname)\n const hostnameMatched =\n isMatchedAt > -1 && isMatchedAt === hostname.length - noProxyZone.hostname.length\n\n if (noProxyZone.hasPort) {\n return port === noProxyZone.port && hostnameMatched\n }\n\n return hostnameMatched\n })\n}\n\nfunction getProxyFromUri(uri: any) {\n // Decide the proper request proxy to use based on the request URI object and the\n // environmental variables (NO_PROXY, HTTP_PROXY, etc.)\n // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html)\n const noProxy = process.env.NO_PROXY || process.env.no_proxy || ''\n\n // if the noProxy is a wildcard then return null\n if (noProxy === '*') {\n return null\n }\n\n // if the noProxy is not empty and the uri is found return null\n if (noProxy !== '' && uriInNoProxy(uri, noProxy)) {\n return null\n }\n\n // Check for HTTP or HTTPS Proxy in environment, else default to null\n if (uri.protocol === 'http:') {\n return process.env.HTTP_PROXY || process.env.http_proxy || null\n }\n\n if (uri.protocol === 'https:') {\n return (\n process.env.HTTPS_PROXY ||\n process.env.https_proxy ||\n process.env.HTTP_PROXY ||\n process.env.http_proxy ||\n null\n )\n }\n\n // if none of that works, return null\n // (What uri protocol are you using then?)\n return null\n}\n\nfunction getHostFromUri(uri: any) {\n let host = uri.host\n\n // Drop :port suffix from Host header if known protocol.\n if (uri.port) {\n if (\n (uri.port === '80' && uri.protocol === 'http:') ||\n (uri.port === '443' && uri.protocol === 'https:')\n ) {\n host = uri.hostname\n }\n }\n\n return host\n}\n\nfunction getHostHeaderWithPort(uri: any) {\n const port = uri.port || (uri.protocol === 'https:' ? '443' : '80')\n return `${uri.hostname}:${port}`\n}\n\nexport function rewriteUriForProxy(reqOpts: any, uri: any, proxy: any) {\n const headers = reqOpts.headers || {}\n const options = Object.assign({}, reqOpts, {headers})\n headers.host = headers.host || getHostHeaderWithPort(uri)\n options.protocol = proxy.protocol || options.protocol\n options.hostname = proxy.host.replace(/:\\d+/, '')\n options.port = proxy.port\n options.host = getHostFromUri(Object.assign({}, uri, proxy))\n options.href = `${options.protocol}//${options.host}${options.path}`\n options.path = url.format(uri)\n return options\n}\n\nexport function getProxyOptions(options: any) {\n let proxy\n // eslint-disable-next-line no-prototype-builtins\n if (options.hasOwnProperty('proxy')) {\n proxy = options.proxy\n } else {\n const uri = url.parse(options.url)\n proxy = getProxyFromUri(uri)\n }\n\n return typeof proxy === 'string' ? url.parse(proxy) : proxy\n}\n","/*! simple-concat. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexport function concat(stream: any, cb: any) {\n const chunks: any = []\n stream.on('data', function (chunk: any) {\n chunks.push(chunk)\n })\n stream.once('end', function () {\n if (cb) cb(null, Buffer.concat(chunks))\n cb = null\n })\n stream.once('error', function (err: any) {\n if (cb) cb(err)\n cb = null\n })\n}\n","// Copied from `@sanity/timed-out`\n\nexport function timedOut(req: any, time: any) {\n if (req.timeoutTimer) {\n return req\n }\n\n const delays = isNaN(time) ? time : {socket: time, connect: time}\n const hostHeader = req.getHeader('host')\n const host = hostHeader ? ' to ' + hostHeader : ''\n\n if (delays.connect !== undefined) {\n req.timeoutTimer = setTimeout(function timeoutHandler() {\n req.abort()\n const e: any = new Error('Connection timed out on request' + host)\n e.code = 'ETIMEDOUT'\n req.emit('error', e)\n }, delays.connect)\n }\n\n // Clear the connection timeout timer once a socket is assigned to the\n // request and is connected.\n req.on('socket', function assign(socket: any) {\n // Socket may come from Agent pool and may be already connected.\n if (!(socket.connecting || socket._connecting)) {\n connect()\n return\n }\n\n socket.once('connect', connect)\n })\n\n function clear() {\n if (req.timeoutTimer) {\n clearTimeout(req.timeoutTimer)\n req.timeoutTimer = null\n }\n }\n\n function connect() {\n clear()\n\n if (delays.socket !== undefined) {\n // Abort the request if there is no activity on the socket for more\n // than `delays.socket` milliseconds.\n req.setTimeout(delays.socket, function socketTimeoutHandler() {\n req.abort()\n const e: any = new Error('Socket timed out on request' + host)\n e.code = 'ESOCKETTIMEDOUT'\n req.emit('error', e)\n })\n }\n }\n\n return req.on('error', clear)\n}\n","/**\n * Code borrowed from https://github.com/request/request\n * Modified to be less request-specific, more functional\n * Apache License 2.0\n */\nimport * as tunnel from 'tunnel-agent'\nimport url from 'url'\n\nconst uriParts = [\n 'protocol',\n 'slashes',\n 'auth',\n 'host',\n 'port',\n 'hostname',\n 'hash',\n 'search',\n 'query',\n 'pathname',\n 'path',\n 'href',\n]\n\nconst defaultProxyHeaderWhiteList = [\n 'accept',\n 'accept-charset',\n 'accept-encoding',\n 'accept-language',\n 'accept-ranges',\n 'cache-control',\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-md5',\n 'content-range',\n 'content-type',\n 'connection',\n 'date',\n 'expect',\n 'max-forwards',\n 'pragma',\n 'referer',\n 'te',\n 'user-agent',\n 'via',\n]\n\nconst defaultProxyHeaderExclusiveList = ['proxy-authorization']\n\nexport function shouldEnable(options: any) {\n // Tunnel HTTPS by default. Allow the user to override this setting.\n\n // If user has specified a specific tunnel override...\n if (typeof options.tunnel !== 'undefined') {\n return Boolean(options.tunnel)\n }\n\n // If the destination is HTTPS, tunnel.\n const uri = url.parse(options.url)\n if (uri.protocol === 'https:') {\n return true\n }\n\n // Otherwise, do not use tunnel.\n return false\n}\n\nexport function applyAgent(opts: any = {}, proxy: any) {\n const options = Object.assign({}, opts)\n\n // Setup proxy header exclusive list and whitelist\n const proxyHeaderWhiteList = defaultProxyHeaderWhiteList\n .concat(options.proxyHeaderWhiteList || [])\n .map((header) => header.toLowerCase())\n\n const proxyHeaderExclusiveList = defaultProxyHeaderExclusiveList\n .concat(options.proxyHeaderExclusiveList || [])\n .map((header) => header.toLowerCase())\n\n // Get the headers we should send to the proxy\n const proxyHeaders = getAllowedProxyHeaders(options.headers, proxyHeaderWhiteList)\n proxyHeaders.host = constructProxyHost(options)\n\n // Reduce headers to the ones not exclusive for the proxy\n options.headers = Object.keys(options.headers || {}).reduce((headers, header) => {\n const isAllowed = proxyHeaderExclusiveList.indexOf(header.toLowerCase()) === -1\n if (isAllowed) {\n headers[header] = options.headers[header]\n }\n\n return headers\n }, {} as any)\n\n const tunnelFn = getTunnelFn(options, proxy)\n const tunnelOptions = constructTunnelOptions(options, proxy, proxyHeaders)\n options.agent = tunnelFn(tunnelOptions)\n\n return options\n}\n\nfunction getTunnelFn(options: any, proxy: any) {\n const uri = getUriParts(options)\n const tunnelFnName = constructTunnelFnName(uri, proxy)\n return tunnel[tunnelFnName]\n}\n\nfunction getUriParts(options: any) {\n return uriParts.reduce((uri, part) => {\n uri[part] = options[part]\n return uri\n }, {} as any)\n}\n\ntype UriProtocol = `http` | `https`\ntype ProxyProtocol = `Http` | `Https`\nfunction constructTunnelFnName(uri: any, proxy: any): `${UriProtocol}Over${ProxyProtocol}` {\n const uriProtocol = uri.protocol === 'https:' ? 'https' : 'http'\n const proxyProtocol = proxy.protocol === 'https:' ? 'Https' : 'Http'\n return `${uriProtocol}Over${proxyProtocol}`\n}\n\nfunction constructProxyHost(uri: any) {\n const port = uri.port\n const protocol = uri.protocol\n let proxyHost = `${uri.hostname}:`\n\n if (port) {\n proxyHost += port\n } else if (protocol === 'https:') {\n proxyHost += '443'\n } else {\n proxyHost += '80'\n }\n\n return proxyHost\n}\n\nfunction getAllowedProxyHeaders(headers: any, whiteList: any): any {\n return Object.keys(headers)\n .filter((header) => whiteList.indexOf(header.toLowerCase()) !== -1)\n .reduce((set: any, header: any) => {\n set[header] = headers[header]\n return set\n }, {})\n}\n\nfunction constructTunnelOptions(options: any, proxy: any, proxyHeaders: any) {\n return {\n proxy: {\n host: proxy.hostname,\n port: +proxy.port,\n proxyAuth: proxy.auth,\n headers: proxyHeaders,\n },\n headers: options.headers,\n ca: options.ca,\n cert: options.cert,\n key: options.key,\n passphrase: options.passphrase,\n pfx: options.pfx,\n ciphers: options.ciphers,\n rejectUnauthorized: options.rejectUnauthorized,\n secureOptions: options.secureOptions,\n secureProtocol: options.secureProtocol,\n }\n}\n","import decompressResponse from 'decompress-response'\nimport follow, {type FollowResponse, type RedirectableRequest} from 'follow-redirects'\nimport http from 'http'\nimport https from 'https'\nimport toStream from 'into-stream'\nimport isStream from 'is-stream'\nimport progressStream from 'progress-stream'\nimport qs from 'querystring'\nimport url from 'url'\n\nimport type {\n FinalizeNodeOptionsPayload,\n HttpRequest,\n MiddlewareResponse,\n RequestAdapter,\n} from '../types'\nimport {lowerCaseHeaders} from '../util/lowerCaseHeaders'\nimport {getProxyOptions, rewriteUriForProxy} from './node/proxy'\nimport {concat} from './node/simpleConcat'\nimport {timedOut} from './node/timedOut'\nimport * as tunneling from './node/tunnel'\n\n/** @public */\nexport const adapter: RequestAdapter = 'node'\n\n// Reduce a fully fledged node-style response object to\n// something that works in both browser and node environment\nconst reduceResponse = (\n res: any,\n reqUrl: string,\n method: string,\n body: any,\n): MiddlewareResponse => ({\n body,\n url: reqUrl,\n method: method,\n headers: res.headers,\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n})\n\nexport const httpRequester: HttpRequest = (context, cb) => {\n const {options} = context\n const uri = Object.assign({}, url.parse(options.url))\n\n if (typeof fetch === 'function' && options.fetch) {\n const controller = new AbortController()\n const reqOpts = context.applyMiddleware('finalizeOptions', {\n ...uri,\n method: options.method,\n headers: {\n ...(typeof options.fetch === 'object' && options.fetch.headers\n ? lowerCaseHeaders(options.fetch.headers)\n : {}),\n ...lowerCaseHeaders(options.headers),\n },\n maxRedirects: options.maxRedirects,\n }) as FinalizeNodeOptionsPayload\n const fetchOpts = {\n credentials: options.withCredentials ? 'include' : 'omit',\n ...(typeof options.fetch === 'object' ? options.fetch : {}),\n method: reqOpts.method,\n headers: reqOpts.headers,\n body: options.body,\n signal: controller.signal,\n } satisfies RequestInit\n\n // Allow middleware to inject a response, for instance in the case of caching or mocking\n const injectedResponse = context.applyMiddleware('interceptRequest', undefined, {\n adapter,\n context,\n })\n\n // If middleware injected a response, treat it as we normally would and return it\n // Do note that the injected response has to be reduced to a cross-environment friendly response\n if (injectedResponse) {\n const cbTimer = setTimeout(cb, 0, null, injectedResponse)\n const cancel = () => clearTimeout(cbTimer)\n return {abort: cancel}\n }\n\n const request = fetch(options.url, fetchOpts)\n\n // Let middleware know we're about to do a request\n context.applyMiddleware('onRequest', {options, adapter, request, context})\n\n request\n .then(async (res) => {\n const body = options.rawBody ? res.body : await res.text()\n\n const headers = {} as Record<string, string>\n res.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n cb(null, {\n body,\n url: res.url,\n method: options.method!,\n headers,\n statusCode: res.status,\n statusMessage: res.statusText,\n })\n })\n .catch((err) => {\n if (err.name == 'AbortError') return\n cb(err)\n })\n\n return {abort: () => controller.abort()}\n }\n\n const bodyType = isStream(options.body) ? 'stream' : typeof options.body\n if (\n bodyType !== 'undefined' &&\n bodyType !== 'stream' &&\n bodyType !== 'string' &&\n !Buffer.isBuffer(options.body)\n ) {\n throw new Error(`Request body must be a string, buffer or stream, got ${bodyType}`)\n }\n\n const lengthHeader: any = {}\n if (options.bodySize) {\n lengthHeader['content-length'] = options.bodySize\n } else if (options.body && bodyType !== 'stream') {\n lengthHeader['content-length'] = Buffer.byteLength(options.body)\n }\n\n // Make sure callback is not called in the event of a cancellation\n let aborted = false\n const callback = (err: Error | null, res?: MiddlewareResponse) => !aborted && cb(err, res)\n context.channels.abort.subscribe(() => {\n aborted = true\n })\n\n // Create a reduced subset of options meant for the http.request() method\n let reqOpts: any = Object.assign({}, uri, {\n method: options.method,\n headers: Object.assign({}, lowerCaseHeaders(options.headers), lengthHeader),\n maxRedirects: options.maxRedirects,\n })\n\n // Figure out proxying/tunnel options\n const proxy = getProxyOptions(options)\n const tunnel = proxy && tunneling.shouldEnable(options)\n\n // Allow middleware to inject a response, for instance in the case of caching or mocking\n const injectedResponse = context.applyMiddleware('interceptRequest', undefined, {\n adapter,\n context,\n })\n\n // If middleware injected a response, treat it as we normally would and return it\n // Do note that the injected response has to be reduced to a cross-environment friendly response\n if (injectedResponse) {\n const cbTimer = setImmediate(callback, null, injectedResponse)\n const abort = () => clearImmediate(cbTimer)\n return {abort}\n }\n\n // We're using the follow-redirects module to transparently follow redirects\n if (options.maxRedirects !== 0) {\n reqOpts.maxRedirects = options.maxRedirects || 5\n }\n\n // Apply currect options for proxy tunneling, if enabled\n if (proxy && tunnel) {\n reqOpts = tunneling.applyAgent(reqOpts, proxy)\n } else if (proxy && !tunnel) {\n reqOpts = rewriteUriForProxy(reqOpts, uri, proxy)\n }\n\n // Handle proxy authorization if present\n if (!tunnel && proxy && proxy.auth && !reqOpts.headers['proxy-authorization']) {\n const [username, password] = proxy.auth.username\n ? [proxy.auth.username, proxy.auth.password]\n : proxy.auth.split(':').map((item: any) => qs.unescape(item))\n\n const auth = Buffer.from(`${username}:${password}`, 'utf8')\n const authBase64 = auth.toString('base64')\n reqOpts.headers['proxy-authorization'] = `Basic ${authBase64}`\n }\n\n // Figure out transport (http/https, forwarding/non-forwarding agent)\n const transport = getRequestTransport(reqOpts, proxy, tunnel)\n if (typeof options.debug === 'function' && proxy) {\n options.debug(\n 'Proxying using %s',\n reqOpts.agent ? 'tunnel agent' : `${reqOpts.host}:${reqOpts.port}`,\n )\n }\n\n // See if we should try to request a compressed response (and decompress on return)\n const tryCompressed = reqOpts.method !== 'HEAD'\n if (tryCompressed && !reqOpts.headers['accept-encoding'] && options.compress !== false) {\n reqOpts.headers['accept-encoding'] = 'br, gzip, deflate'\n }\n\n const finalOptions = context.applyMiddleware(\n 'finalizeOptions',\n reqOpts,\n ) as FinalizeNodeOptionsPayload\n const request = transport.request(finalOptions, (response) => {\n const res = tryCompressed ? decompressResponse(response) : response\n const resStream = context.applyMiddleware('onHeaders', res, {\n headers: response.headers,\n adapter,\n context,\n })\n\n // On redirects, `responseUrl` is set\n const reqUrl = 'responseUrl' in response ? response.responseUrl : options.url\n\n if (options.stream) {\n callback(null, reduceResponse(res, reqUrl, reqOpts.method, resStream))\n return\n }\n\n // Concatenate the response body, then parse the response with middlewares\n concat(resStream, (err: any, data: any) => {\n if (err) {\n return callback(err)\n }\n\n const body = options.rawBody ? data : data.toString()\n const reduced = reduceResponse(res, reqUrl, reqOpts.method, body)\n return callback(null, reduced)\n })\n })\n\n if (options.timeout) {\n timedOut(request, options.timeout)\n }\n\n request.once('error', callback)\n\n // Cheating a bit here; since we're not concerned about the \"bundle size\" in node,\n // and modifying the body stream would be sorta tricky, we're just always going\n // to put a progress stream in the middle here. Note that\n const {bodyStream, progress} = getProgressStream(options)\n\n // Let middleware know we're about to do a request\n context.applyMiddleware('onRequest', {options, adapter, request, context, progress})\n\n if (bodyStream) {\n bodyStream.pipe(request)\n } else {\n request.end(options.body)\n }\n\n return {abort: () => request.abort()}\n}\n\nfunction getProgressStream(options: any) {\n if (!options.body) {\n return {}\n }\n\n const bodyIsStream = isStream(options.body)\n const length = options.bodySize || (bodyIsStream ? null : Buffer.byteLength(options.body))\n if (!length) {\n return bodyIsStream ? {bodyStream: options.body} : {}\n }\n\n const progress = progressStream({time: 16, length})\n const bodyStream = bodyIsStream ? options.body : toStream(options.body)\n return {bodyStream: bodyStream.pipe(progress), progress}\n}\n\nfunction getRequestTransport(\n reqOpts: any,\n proxy: any,\n tunnel: any,\n): {\n request: (\n options: any,\n callback: (response: http.IncomingMessage | (http.IncomingMessage & FollowResponse)) => void,\n ) => http.ClientRequest | RedirectableRequest<http.ClientRequest, http.IncomingMessage>\n} {\n const isHttpsRequest = reqOpts.protocol === 'https:'\n const transports =\n reqOpts.maxRedirects === 0\n ? {http: http, https: https}\n : {http: follow.http, https: follow.https}\n\n if (!proxy || tunnel) {\n return isHttpsRequest ? transports.https : transports.http\n }\n\n // Assume the proxy is an HTTPS proxy if port is 443, or if there is a\n // `protocol` option set that starts with https\n let isHttpsProxy = proxy.port === 443\n if (proxy.protocol) {\n isHttpsProxy = /^https:?/.test(proxy.protocol)\n }\n\n return isHttpsProxy ? transports.https : transports.http\n}\n\n// function isFile(val: any): val is File {\n// return typeof val === 'object' && val?.[Symbol.toStringTag] === 'File'\n// }\n\n// function isBlob(val: any): val is Blob {\n// return typeof val === 'object' && val?.[Symbol.toStringTag] === 'Blob'\n// }\n","import {createRequester} from './createRequester'\nimport {httpRequester} from './request/node-request'\nimport type {ExportEnv, HttpRequest, Middlewares, Requester} from './types'\n\nexport type * from './types'\n\n/** @public */\nexport const getIt = (\n initMiddleware: Middlewares = [],\n httpRequest: HttpRequest = httpRequester,\n): Requester => createRequester(initMiddleware, httpRequest)\n\n/** @public */\nexport const environment: ExportEnv = 'node'\n\n/** @public */\nexport {adapter} from './request/node-request'\n"],"names":["processOptions","validateOptions","url","tunnel","reqOpts","injectedResponse","request","isStream","tunneling.shouldEnable","tunneling.applyAgent","qs","decompressResponse","progressStream","toStream","http","https","follow"],"mappings":"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"}