diff options
Diffstat (limited to 'u/server/filter')
-rw-r--r-- | u/server/filter/json.ts | 69 | ||||
-rw-r--r-- | u/server/filter/method.ts | 40 | ||||
-rw-r--r-- | u/server/filter/mod.ts | 10 |
3 files changed, 63 insertions, 56 deletions
diff --git a/u/server/filter/json.ts b/u/server/filter/json.ts index 4a2961e..79eabac 100644 --- a/u/server/filter/json.ts +++ b/u/server/filter/json.ts @@ -16,36 +16,39 @@ export interface JsonTransformer<R, ParsedJson = unknown> { } const ParseJsonMetric = Metric.fromName("JsonParse"); -export const jsonModel = <MessageT>( - jsonTransformer: JsonTransformer<MessageT>, -): RequestFilter<MessageT> => -(r: ITraceable<PenguenoRequest, ServerTrace>) => - r.bimap(TraceUtil.withMetricTrace(ParseJsonMetric)) - .map((j) => - Either.fromFailableAsync<Error, MessageT>(j.get().json()) - .then((either) => - either.mapLeft((errReason) => { - j.trace.addTrace(LogLevel.WARN).trace(`${errReason}`); - return new PenguenoError( - "seems to be invalid JSON (>//<) can you fix?", - 400, - ); - }) - ) - ) - .peek( - TraceUtil.promiseify((traceableEither) => - traceableEither.get().mapBoth( - () => traceableEither.trace.trace(ParseJsonMetric.failure), - () => traceableEither.trace.trace(ParseJsonMetric.success), - ) - ), - ) - .map( - TraceUtil.promiseify((traceableEitherJson) => - traceableEitherJson.get() - .mapRight(traceableEitherJson.move) - .flatMap(jsonTransformer) - ), - ) - .get(); +export const jsonModel = + <MessageT>( + jsonTransformer: JsonTransformer<MessageT>, + ): RequestFilter<MessageT> => + (r: ITraceable<PenguenoRequest, ServerTrace>) => + r + .bimap(TraceUtil.withMetricTrace(ParseJsonMetric)) + .map((j) => + Either.fromFailableAsync<Error, MessageT>(j.get().json()).then( + (either) => + either.mapLeft((errReason) => { + j.trace.addTrace(LogLevel.WARN).trace(`${errReason}`); + return new PenguenoError( + "seems to be invalid JSON (>//<) can you fix?", + 400, + ); + }), + ), + ) + .peek( + TraceUtil.promiseify((traceableEither) => + traceableEither.get().mapBoth( + () => traceableEither.trace.trace(ParseJsonMetric.failure), + () => traceableEither.trace.trace(ParseJsonMetric.success), + ), + ), + ) + .map( + TraceUtil.promiseify((traceableEitherJson) => + traceableEitherJson + .get() + .mapRight(traceableEitherJson.move) + .flatMap(jsonTransformer), + ), + ) + .get(); diff --git a/u/server/filter/method.ts b/u/server/filter/method.ts index 6b0419d..9901c6f 100644 --- a/u/server/filter/method.ts +++ b/u/server/filter/method.ts @@ -20,22 +20,24 @@ type HttpMethod = | "TRACE" | "PATCH"; -export const requireMethod = ( - methods: Array<HttpMethod>, -): RequestFilter<HttpMethod> => -(req: ITraceable<PenguenoRequest, ServerTrace>) => - req.bimap(TraceUtil.withFunctionTrace(requireMethod)) - .move(Promise.resolve(req.get())) - .map(TraceUtil.promiseify((t) => { - const { method: _method } = t.get(); - const method = <HttpMethod> _method; - if (!methods.includes(method)) { - const msg = "that's not how you pet me (⋟﹏⋞)~"; - t.trace.addTrace(LogLevel.WARN).trace(msg); - return Either.left<PenguenoError, HttpMethod>( - new PenguenoError(msg, 405), - ); - } - return Either.right<PenguenoError, HttpMethod>(method); - })) - .get(); +export const requireMethod = + (methods: Array<HttpMethod>): RequestFilter<HttpMethod> => + (req: ITraceable<PenguenoRequest, ServerTrace>) => + req + .bimap(TraceUtil.withFunctionTrace(requireMethod)) + .move(Promise.resolve(req.get())) + .map( + TraceUtil.promiseify((t) => { + const { method: _method } = t.get(); + const method = <HttpMethod>_method; + if (!methods.includes(method)) { + const msg = "that's not how you pet me (⋟﹏⋞)~"; + t.trace.addTrace(LogLevel.WARN).trace(msg); + return Either.left<PenguenoError, HttpMethod>( + new PenguenoError(msg, 405), + ); + } + return Either.right<PenguenoError, HttpMethod>(method); + }), + ) + .get(); diff --git a/u/server/filter/mod.ts b/u/server/filter/mod.ts index bbf37df..3b247fc 100644 --- a/u/server/filter/mod.ts +++ b/u/server/filter/mod.ts @@ -13,11 +13,13 @@ export enum ErrorSource { export class PenguenoError extends Error { public readonly source: ErrorSource; - constructor(message: string, public readonly status: number) { + constructor( + message: string, + public readonly status: number, + ) { super(message); - this.source = Math.floor(status / 100) === 4 - ? ErrorSource.USER - : ErrorSource.SYSTEM; + this.source = + Math.floor(status / 100) === 4 ? ErrorSource.USER : ErrorSource.SYSTEM; } } |