UNPKG

rekwest

Version:

The robust request library that humanity deserves 🌐

184 lines (183 loc) 6.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sameOrigin = exports.normalize = exports.merge = exports.maxRetryAfterError = exports.maxRetryAfter = exports.isReadableStream = exports.isFileLike = exports.dispatch = exports.decompress = exports.copyWithMerge = exports.compress = exports.brandCheck = exports.affix = exports.admix = void 0; exports.tap = tap; exports.unwind = exports.toCamelCase = void 0; var _nodeBuffer = require("node:buffer"); var _nodeHttp = _interopRequireDefault(require("node:http2")); var _nodeStream = require("node:stream"); var _nodeZlib = _interopRequireDefault(require("node:zlib")); var _config = _interopRequireWildcard(require("./config")); var _errors = require("./errors"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const { HTTP2_HEADER_RETRY_AFTER, HTTP2_HEADER_STATUS } = _nodeHttp.default.constants; const admix = (res, headers, options) => { const { h2 } = options; if (h2) { Reflect.defineProperty(res, 'headers', { enumerable: true, value: headers }); Reflect.defineProperty(res, 'httpVersion', { enumerable: true, value: `${h2 + 1}.0` }); Reflect.defineProperty(res, 'statusCode', { enumerable: true, value: headers[HTTP2_HEADER_STATUS] }); } Reflect.defineProperty(res, 'ok', { enumerable: true, value: /^2\d{2}$/.test(res.statusCode) }); Reflect.defineProperty(res, 'redirected', { enumerable: true, value: !!options.redirected }); }; exports.admix = admix; const affix = (client, req, options) => { req.once('close', () => client?.close()); req.once('end', () => client?.close()); req.once('timeout', () => req.destroy(new _errors.TimeoutError(`Timed out after ${options.timeout} ms.`))); req.once('trailers', trailers => { Reflect.defineProperty(req, 'trailers', { enumerable: true, value: trailers }); }); }; exports.affix = affix; const brandCheck = (value, ctor) => { if (!(value instanceof ctor)) { throw new TypeError('Illegal invocation'); } }; exports.brandCheck = brandCheck; const compress = (readable, encodings = '') => { const encoders = []; encodings = unwind(encodings); for (const encoding of encodings) { if (/\bbr\b/i.test(encoding)) { encoders.push(_nodeZlib.default.createBrotliCompress()); } else if (/\bdeflate(?!-(?:\w+)?)\b/i.test(encoding)) { encoders.push(_nodeZlib.default.createDeflate()); } else if (/\bdeflate-raw\b/i.test(encoding)) { encoders.push(_nodeZlib.default.createDeflateRaw()); } else if (/\bgzip\b/i.test(encoding)) { encoders.push(_nodeZlib.default.createGzip()); } else if (_config.isZstdSupported && /\bzstd\b/i.test(encoding)) { encoders.push(_nodeZlib.default.createZstdCompress()); } else { return readable; } } return (0, _nodeStream.pipeline)(readable, ...encoders, () => void 0); }; exports.compress = compress; const copyWithMerge = (target, ...rest) => { target = structuredClone(target); if (!rest.length) { return target; } return merge(target, ...rest); }; exports.copyWithMerge = copyWithMerge; const decompress = (readable, encodings = '') => { const decoders = []; encodings = unwind(encodings); for (const encoding of encodings) { if (/\bbr\b/i.test(encoding)) { decoders.push(_nodeZlib.default.createBrotliDecompress()); } else if (/\bdeflate(?!-(?:\w+)?)\b/i.test(encoding)) { decoders.push(_nodeZlib.default.createInflate()); } else if (/\bdeflate-raw\b/i.test(encoding)) { decoders.push(_nodeZlib.default.createInflateRaw()); } else if (/\bgzip\b/i.test(encoding)) { decoders.push(_nodeZlib.default.createGunzip()); } else if (_config.isZstdSupported && /\bzstd\b/i.test(encoding)) { decoders.push(_nodeZlib.default.createZstdDecompress()); } else { return readable; } } return (0, _nodeStream.pipeline)(readable, ...decoders, () => void 0); }; exports.decompress = decompress; const dispatch = ({ body }, req) => { if (body?.pipe?.constructor === Function) { body.pipe(req); } else { req.end(body); } }; exports.dispatch = dispatch; const isFileLike = instance => { return [_nodeBuffer.Blob.name, _nodeBuffer.File.name].includes(instance?.[Symbol.toStringTag]); }; exports.isFileLike = isFileLike; const isReadableStream = instance => { return ReadableStream.name === instance?.[Symbol.toStringTag]; }; exports.isReadableStream = isReadableStream; const maxRetryAfter = exports.maxRetryAfter = Symbol('maxRetryAfter'); const maxRetryAfterError = (interval, options) => new _errors.RequestError(`Maximum '${HTTP2_HEADER_RETRY_AFTER}' limit exceeded: ${interval} ms.`, options); exports.maxRetryAfterError = maxRetryAfterError; const merge = (target, ...rest) => { rest = rest.filter(it => it === Object(it)); for (const source of rest) { for (const key of Object.getOwnPropertyNames(source)) { const sv = source[key]; const tv = target[key]; if (Object(sv) === sv && Object(tv) === tv) { target[key] = merge(tv, sv); continue; } target[key] = source[key]; } } return target; }; exports.merge = merge; const normalize = (url, options = {}) => { if (!options.redirected) { options = copyWithMerge(_config.default.defaults, options); } if (options.trimTrailingSlashes) { url = `${url}`.replace(/(?<!:)\/+/g, '/'); } if (options.stripTrailingSlash) { url = `${url}`.replace(/\/$|\/(?=#)|\/(?=\?)/g, ''); } url = new URL(url, options.baseURL); return Object.assign(options, { url }); }; exports.normalize = normalize; const sameOrigin = (a, b) => a.protocol === b.protocol && a.hostname === b.hostname && a.port === b.port; exports.sameOrigin = sameOrigin; async function* tap(value) { if (Reflect.has(value, Symbol.asyncIterator)) { yield* value; } else if (value.stream) { yield* value.stream(); } else { yield await value.arrayBuffer(); } } const toCamelCase = str => str?.toLowerCase().replace(/\p{Punctuation}.|\p{White_Space}./gu, val => val.replace(/\p{Punctuation}+|\p{White_Space}+/gu, '').toUpperCase()); exports.toCamelCase = toCamelCase; const unwind = encodings => encodings.split(',').map(it => it.trim()); exports.unwind = unwind;