From 3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Wed, 14 May 2025 18:02:34 -0700 Subject: moar --- u/server/activity/health.ts | 39 +++++++++++++++++++++++++++++++++++++++ u/server/activity/mod.ts | 8 ++++++++ u/server/filter/json.ts | 32 ++++++++++++++++++++++++++++++++ u/server/filter/method.ts | 37 +++++++++++++++++++++++++++++++++++++ u/server/filter/mod.ts | 13 +++++++++++++ u/server/mod.ts | 1 + 6 files changed, 130 insertions(+) create mode 100644 u/server/activity/health.ts create mode 100644 u/server/activity/mod.ts create mode 100644 u/server/filter/json.ts create mode 100644 u/server/filter/method.ts create mode 100644 u/server/filter/mod.ts (limited to 'u/server') diff --git a/u/server/activity/health.ts b/u/server/activity/health.ts new file mode 100644 index 0000000..bf1f52c --- /dev/null +++ b/u/server/activity/health.ts @@ -0,0 +1,39 @@ +import { + Either, + getRequiredEnv, + getStdout, + type ITraceable, + LogLevel, + type Mapper, + TraceUtil, +} from "@emprespresso/pengueno"; + +type HealthCheckInput = "healthy?"; +type HealthCheckOutput = "healthy!"; + +const HealthCheckActivity = ( + check: Mapper< + ITraceable, + Promise> + >, +) => +(req: ITraceable) => + req.bimap(TraceUtil.withFunctionTrace(HealthCheckActivity)) + .flatMap((r) => r.move( "healthy?")) + .map(check) + .map(TraceUtil.promiseify(({ item: health, trace }) => { + health.mapBoth((e) => { + trace.addTrace(LogLevel.ERROR).trace(`${e}`); + return new Response( + "oh no, i need to eat more vegetables (。•́︿•̀。)...\n", + { status: 500 }, + ); + }, (_healthy) => { + const msg = `think im healthy!! (✿˘◡˘) ready to do work~`; + trace.trace(msg); + return new Response( + msg + "\n", + { status: 200 }, + ); + }); + })); diff --git a/u/server/activity/mod.ts b/u/server/activity/mod.ts new file mode 100644 index 0000000..6908c26 --- /dev/null +++ b/u/server/activity/mod.ts @@ -0,0 +1,8 @@ +import type { RequestFilter } from "@emprespresso/pengueno"; + +export class r200 extends Response { + public override readonly status = 200; +} + +export interface IActivity extends RequestFilter { +} diff --git a/u/server/filter/json.ts b/u/server/filter/json.ts new file mode 100644 index 0000000..3f11915 --- /dev/null +++ b/u/server/filter/json.ts @@ -0,0 +1,32 @@ +import { + Either, + type IEither, + type ITraceable, + LogLevel, + type RequestFilter, + TraceUtil, +} from "@emprespresso/pengueno"; + +type JsonTransformer = ( + json: ITraceable, +) => IEither; +export const json = ( + jsonTransformer: JsonTransformer, +): RequestFilter => +(r: ITraceable) => + r.bimap(TraceUtil.withFunctionTrace(json)) + .map(({ item: request }) => Either.fromFailableAsync(request.json())) + .map( + TraceUtil.promiseify(({ item: eitherJson, trace }) => + eitherJson.mapLeft((errReason) => { + trace.addTrace(LogLevel.WARN).trace(`${errReason}`); + const err = "seems to be invalid JSON (>//<) can you fix?"; + return new Error(err); + }) + .flatMap(jsonTransformer) + .mapLeft((err) => { + trace.addTrace(LogLevel.WARN).trace(`${err}`); + return new Response(err.message, { status: 400 }); + }) + ), + ).item; diff --git a/u/server/filter/method.ts b/u/server/filter/method.ts new file mode 100644 index 0000000..2bf45a0 --- /dev/null +++ b/u/server/filter/method.ts @@ -0,0 +1,37 @@ +import { + Either, + type ITraceable, + LogLevel, + type RequestFilter, + TraceUtil, +} from "@emprespresso/pengueno"; + +type HttpMethod = + | "POST" + | "GET" + | "HEAD" + | "PUT" + | "DELETE" + | "CONNECT" + | "OPTIONS" + | "TRACE" + | "PATCH"; + +export const requireMethod = + (methods: Array): RequestFilter => + (req: ITraceable) => + req.bimap(TraceUtil.withFunctionTrace(requireMethod)) + .map(({ item }) => Promise.resolve(item)) + .map(TraceUtil.promiseify(({ item: request, trace }) => { + const { method: _method } = request; + const method = _method; + if (!methods.includes(method)) { + const msg = "that's not how you pet me (⋟﹏⋞)~"; + trace.addTrace(LogLevel.WARN).trace(msg); + return Either.left( + new Response(msg + "\n", { status: 405 }), + ); + } + + return Either.right(method); + })).item; diff --git a/u/server/filter/mod.ts b/u/server/filter/mod.ts new file mode 100644 index 0000000..3256d35 --- /dev/null +++ b/u/server/filter/mod.ts @@ -0,0 +1,13 @@ +import type { IEither, ITraceable } from "@emprespresso/pengueno"; + +export interface RequestFilter< + T, + Trace, + RIn = ITraceable, + Err = Response, +> { + (req: RIn): Promise>; +} + +export * from "./method.ts"; +export * from "./json.ts"; diff --git a/u/server/mod.ts b/u/server/mod.ts index e69de29..556771d 100644 --- a/u/server/mod.ts +++ b/u/server/mod.ts @@ -0,0 +1 @@ +export * from "./filter/mod.ts"; -- cgit v1.2.3-70-g09d2