rekwest
Version:
The robust request library that humanity deserves 🌐
184 lines (183 loc) • 6.99 kB
JavaScript
;
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;