fets
Version:
TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience
52 lines (51 loc) • 1.64 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 != null && response[LAZY_SERIALIZED_RESPONSE];
}
export function createLazySerializedResponse(jsonObj, init) {
let resolve;
const promise = new Promise(_resolve => {
resolve = _resolve;
});
let _serializerSet = false;
const headers = new Headers({
...init?.headers,
'Content-Type': 'application/json',
});
return {
jsonObj,
responsePromise: promise,
[LAZY_SERIALIZED_RESPONSE]: true,
init,
get serializerSet() {
return _serializerSet;
},
resolveWithSerializer(serializer) {
const serialized = serializer(jsonObj);
_serializerSet = true;
resolve(new OriginalResponse(serialized, {
...init,
status: init?.status || 200,
headers,
}));
},
async json() {
return jsonObj;
},
get status() {
return (init?.status || 200);
},
headers,
};
}
// 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);
},
});