rekwest
Version:
The robust request library that humanity deserves 🌐
165 lines (164 loc) • 5.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.stripHeaders = exports.snoop = exports.sameOrigin = exports.normalizeHeaders = exports.normalize = exports.merge = exports.isReadableStream = exports.isPipeStream = exports.isFileLike = exports.dispatch = exports.copyWithMerge = exports.brandCheck = exports.augment = 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 _config = _interopRequireWildcard(require("./config.cjs"));
var _errors = require("./errors.cjs");
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_ACCEPT_ENCODING,
HTTP2_HEADER_STATUS
} = _nodeHttp.default.constants;
const augment = (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.augment = augment;
const brandCheck = (value, ctor) => {
if (!(value instanceof ctor)) {
throw new TypeError('Illegal invocation.');
}
};
exports.brandCheck = brandCheck;
const copyWithMerge = (target, ...rest) => {
target = structuredClone(target);
if (!rest.length) {
return target;
}
return merge(target, ...rest);
};
exports.copyWithMerge = copyWithMerge;
const dispatch = (req, {
body
}) => {
if ((0, _nodeStream.isReadable)(body)) {
body.pipe(req);
} else {
req.end(body);
}
};
exports.dispatch = dispatch;
const isFileLike = value => {
return [_nodeBuffer.Blob, _nodeBuffer.File].some(it => value instanceof it);
};
exports.isFileLike = isFileLike;
const isPipeStream = value => {
return value instanceof _nodeStream.Readable;
};
exports.isPipeStream = isPipeStream;
const isReadableStream = value => {
return value instanceof ReadableStream;
};
exports.isReadableStream = isReadableStream;
const merge = (target, ...rest) => {
rest = rest.filter(it => Object(it) === 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, '');
}
return Object.assign(options, {
headers: normalizeHeaders(options.headers),
method: options.method.toUpperCase(),
url: new URL(url, options.baseURL)
});
};
exports.normalize = normalize;
const normalizeHeaders = headers => {
const collector = {};
for (const [key, value] of Object.entries(headers ?? {})) {
const name = key.toLowerCase();
collector[key] = value;
if (key === HTTP2_HEADER_ACCEPT_ENCODING && !_config.isZstdSupported) {
const stripped = value.replace(/\s?zstd,?/gi, '').trim();
if (stripped) {
collector[key] = stripped;
} else {
Reflect.deleteProperty(collector, name);
}
}
}
return collector;
};
exports.normalizeHeaders = normalizeHeaders;
const sameOrigin = (a, b) => a.protocol === b.protocol && a.hostname === b.hostname && a.port === b.port;
exports.sameOrigin = sameOrigin;
const snoop = (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.snoop = snoop;
const stripHeaders = (headers = {}, names = []) => {
names = new Set(names);
return Object.fromEntries(Object.entries(headers).filter(([key]) => !names.has(key.toLowerCase())));
};
exports.stripHeaders = stripHeaders;
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.toLowerCase().trim());
exports.unwind = unwind;