@whatwg-node/node-fetch
Version:
Fetch API implementation for Node
85 lines (84 loc) • 2.43 kB
JavaScript
function isHeadersInstance(obj) {
return obj?.forEach != null;
}
export function getHeadersObj(headers) {
if (headers == null || !isHeadersInstance(headers)) {
return headers;
}
return Object.fromEntries(headers.entries());
}
export function defaultHeadersSerializer(headers, onContentLength) {
const headerArray = [];
headers.forEach((value, key) => {
if (onContentLength && key === 'content-length') {
onContentLength(value);
}
headerArray.push(`${key}: ${value}`);
});
return headerArray;
}
function isPromise(val) {
return val?.then != null;
}
export function fakePromise(value) {
if (isPromise(value)) {
return value;
}
// Write a fake promise to avoid the promise constructor
// being called with `new Promise` in the browser.
return {
then(resolve) {
if (resolve) {
const callbackResult = resolve(value);
if (isPromise(callbackResult)) {
return callbackResult;
}
return fakePromise(callbackResult);
}
return this;
},
catch() {
return this;
},
finally(cb) {
if (cb) {
const callbackResult = cb();
if (isPromise(callbackResult)) {
return callbackResult.then(() => value);
}
return fakePromise(value);
}
return this;
},
[Symbol.toStringTag]: 'Promise',
};
}
export function isArrayBufferView(obj) {
return obj != null && obj.buffer != null && obj.byteLength != null && obj.byteOffset != null;
}
export function isNodeReadable(obj) {
return obj != null && obj.pipe != null;
}
export function createDeferredPromise() {
let resolveFn;
let rejectFn;
const promise = new Promise(function deferredPromiseExecutor(resolve, reject) {
resolveFn = resolve;
rejectFn = reject;
});
return {
promise,
get resolve() {
return resolveFn;
},
get reject() {
return rejectFn;
},
};
}
export function isIterable(value) {
return value?.[Symbol.iterator] != null;
}
export function shouldRedirect(status) {
return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
}