fets
Version:
TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience
65 lines (64 loc) • 1.96 kB
JavaScript
import { Headers, Response as OriginalResponse } from '@whatwg-node/fetch';
export const LAZY_SERIALIZED_RESPONSE = Symbol('LAZY_SERIALIZED_RESPONSE');
export const defaultSerializer = obj => JSON.stringify(obj);
export function isLazySerializedResponse(response) {
return response[LAZY_SERIALIZED_RESPONSE];
}
function isHeadersLike(headers) {
return headers?.get && headers?.forEach;
}
const JSON_CONTENT_TYPE = 'application/json; charset=utf-8';
function getHeadersFromHeadersInit(init) {
let headers;
if (isHeadersLike(init)) {
headers = init;
}
else {
headers = new Headers(init);
}
if (!headers.has('content-type')) {
headers.set('content-type', JSON_CONTENT_TYPE);
}
return headers;
}
export function createLazySerializedResponse(jsonObj, init = {}) {
let actualResponse;
let headers;
function getHeaders() {
if (headers == null) {
headers = getHeadersFromHeadersInit(init.headers);
}
return headers;
}
return {
jsonObj,
get actualResponse() {
return actualResponse;
},
[LAZY_SERIALIZED_RESPONSE]: true,
init,
resolveWithSerializer(serializer) {
const serialized = serializer(jsonObj);
init.headers = getHeaders();
actualResponse = new OriginalResponse(serialized, init);
},
json() {
return Promise.resolve(jsonObj);
},
get status() {
return (init?.status || 200);
},
get headers() {
return getHeaders();
},
};
}
// This allows us to hook into serialization of the response body
export const Response = new Proxy(OriginalResponse, {
get(OriginalResponse, prop, receiver) {
if (prop === 'json') {
return createLazySerializedResponse;
}
return Reflect.get(OriginalResponse, prop, receiver);
},
});