fets
Version:
TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience
71 lines (70 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Response = exports.createLazySerializedResponse = exports.isLazySerializedResponse = exports.defaultSerializer = exports.LAZY_SERIALIZED_RESPONSE = void 0;
const fetch_1 = require("@whatwg-node/fetch");
exports.LAZY_SERIALIZED_RESPONSE = Symbol('LAZY_SERIALIZED_RESPONSE');
const defaultSerializer = obj => JSON.stringify(obj);
exports.defaultSerializer = defaultSerializer;
function isLazySerializedResponse(response) {
return response[exports.LAZY_SERIALIZED_RESPONSE];
}
exports.isLazySerializedResponse = isLazySerializedResponse;
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 fetch_1.Headers(init);
}
if (!headers.has('content-type')) {
headers.set('content-type', JSON_CONTENT_TYPE);
}
return headers;
}
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;
},
[exports.LAZY_SERIALIZED_RESPONSE]: true,
init,
resolveWithSerializer(serializer) {
const serialized = serializer(jsonObj);
init.headers = getHeaders();
actualResponse = new fetch_1.Response(serialized, init);
},
json() {
return Promise.resolve(jsonObj);
},
get status() {
return (init?.status || 200);
},
get headers() {
return getHeaders();
},
};
}
exports.createLazySerializedResponse = createLazySerializedResponse;
// This allows us to hook into serialization of the response body
exports.Response = new Proxy(fetch_1.Response, {
get(OriginalResponse, prop, receiver) {
if (prop === 'json') {
return createLazySerializedResponse;
}
return Reflect.get(OriginalResponse, prop, receiver);
},
});