From ef51b25e4388cbdf3a27e23d9f1fa381ae20a5ad Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Fri, 16 May 2025 16:17:13 -0700 Subject: snapshot --- u/server/response.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 u/server/response.ts (limited to 'u/server/response.ts') diff --git a/u/server/response.ts b/u/server/response.ts new file mode 100644 index 0000000..59ca43d --- /dev/null +++ b/u/server/response.ts @@ -0,0 +1,44 @@ +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, + ); + } +} -- cgit v1.2.3-70-g09d2