From 9970036d203ba2d0a46b35ba6fad21d49441cdd4 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sun, 27 Jul 2025 17:03:10 -0700 Subject: hai --- lib/server/filter/json.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 lib/server/filter/json.ts (limited to 'lib/server/filter/json.ts') diff --git a/lib/server/filter/json.ts b/lib/server/filter/json.ts new file mode 100644 index 0000000..bc53d47 --- /dev/null +++ b/lib/server/filter/json.ts @@ -0,0 +1,42 @@ +import { + Either, + type IEither, + type ITraceable, + LogLevel, + Metric, + PenguenoError, + type PenguenoRequest, + type RequestFilter, + type ServerTrace, + TraceUtil, +} from '@emprespresso/pengueno'; + +export interface JsonTransformer { + (json: ITraceable): IEither; +} + +const ParseJsonMetric = Metric.fromName('JsonParse').asResult(); +export const jsonModel = + (jsonTransformer: JsonTransformer): RequestFilter => + (r: ITraceable) => + r + .flatMap(TraceUtil.withFunctionTrace(jsonModel)) + .flatMap(TraceUtil.withMetricTrace(ParseJsonMetric)) + .map((j) => + Either.fromFailableAsync(>j.get().req.json()).then((either) => + either.mapLeft((errReason) => { + j.trace.traceScope(LogLevel.WARN).trace(errReason); + return new PenguenoError('seems to be invalid JSON (>//<) can you fix?', 400); + }), + ), + ) + .flatMapAsync(TraceUtil.promiseify(TraceUtil.traceResultingEither(ParseJsonMetric))) + .map( + TraceUtil.promiseify((traceableEitherJson) => + traceableEitherJson + .get() + .mapRight((j) => traceableEitherJson.move(j)) + .flatMap(jsonTransformer), + ), + ) + .get(); -- cgit v1.2.3-70-g09d2