import { type IEither, isEither, type ITraceable, } from "@emprespresso/pengueno"; export type ResponseBody = object | string; export type TResponseInit = ResponseInit & { status: number }; const withJsonResponseType = (opts: TResponseInit): TResponseInit => { return { ...opts, headers: { "Content-Type": "application/json", ...(opts?.headers), }, }; }; export class JsonResponse extends Response { constructor( e: ITraceable>, opts: TResponseInit, ) { const responseOpts = withJsonResponseType(opts); const baseBody = { responseTime: Date.now(), }; if (isEither(e)) { super( JSON.stringify( e.fold((err, ok) => err ? ({ error: err! }) : ({ ok: ok! })), ), responseOpts, ); return; } super( JSON.stringify( (Math.floor(responseOpts.status / 100) < 4) ? { ok: e } : { error: e }, ), responseOpts, ); } }