UNPKG

fets

Version:

TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience

65 lines (64 loc) 1.96 kB
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); }, });