summaryrefslogtreecommitdiff
path: root/u/server/response.ts
diff options
context:
space:
mode:
Diffstat (limited to 'u/server/response.ts')
-rw-r--r--u/server/response.ts44
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,
+ );
+ }
+}