@whatwg-node/node-fetch
Version:
Fetch API implementation for Node
81 lines (80 loc) • 2.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.fakePromise = void 0;
exports.getHeadersObj = getHeadersObj;
exports.defaultHeadersSerializer = defaultHeadersSerializer;
exports.isArrayBufferView = isArrayBufferView;
exports.isNodeReadable = isNodeReadable;
exports.isIterable = isIterable;
exports.shouldRedirect = shouldRedirect;
exports.wrapIncomingMessageWithPassthrough = wrapIncomingMessageWithPassthrough;
exports.endStream = endStream;
exports.safeWrite = safeWrite;
const node_events_1 = require("node:events");
const node_stream_1 = require("node:stream");
const promises_1 = require("node:stream/promises");
function isHeadersInstance(obj) {
return obj?.forEach != null;
}
function getHeadersObj(headers) {
if (headers == null || !isHeadersInstance(headers)) {
return headers;
}
// @ts-expect-error - `headersInit` is not a public property
if (headers.headersInit && !headers._map && !isHeadersInstance(headers.headersInit)) {
// @ts-expect-error - `headersInit` is not a public property
return headers.headersInit;
}
return Object.fromEntries(headers.entries());
}
function defaultHeadersSerializer(headers, onContentLength) {
const headerArray = [];
headers.forEach((value, key) => {
if (onContentLength && key === 'content-length') {
onContentLength(value);
}
headerArray.push(`${key}: ${value}`);
});
return headerArray;
}
var promise_helpers_1 = require("@whatwg-node/promise-helpers");
Object.defineProperty(exports, "fakePromise", { enumerable: true, get: function () { return promise_helpers_1.fakePromise; } });
function isArrayBufferView(obj) {
return obj != null && obj.buffer != null && obj.byteLength != null && obj.byteOffset != null;
}
function isNodeReadable(obj) {
return obj != null && obj.pipe != null;
}
function isIterable(value) {
return value?.[Symbol.iterator] != null;
}
function shouldRedirect(status) {
return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
}
function wrapIncomingMessageWithPassthrough({ incomingMessage, signal, passThrough = new node_stream_1.PassThrough(), onError = (e) => {
passThrough.destroy(e);
}, }) {
(0, promises_1.pipeline)(incomingMessage, passThrough, {
signal,
end: true,
})
.then(() => {
if (!incomingMessage.destroyed) {
incomingMessage.resume();
}
})
.catch(onError);
return passThrough;
}
function endStream(stream) {
// @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
return stream.end(null, null, null);
}
function safeWrite(chunk, stream, signal) {
const result = stream.write(chunk);
if (!result) {
return (0, node_events_1.once)(stream, 'drain', {
signal,
});
}
}