diff options
Diffstat (limited to 'u/server/response.ts')
-rw-r--r-- | u/server/response.ts | 44 |
1 files changed, 44 insertions, 0 deletions
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<IEither<ResponseBody, ResponseBody>>, + opts: TResponseInit, + ) { + const responseOpts = withJsonResponseType(opts); + const baseBody = { + responseTime: Date.now(), + }; + if (isEither<ResponseBody, ResponseBody>(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, + ); + } +} |