diff options
Diffstat (limited to 'u/server/filter')
-rw-r--r-- | u/server/filter/index.ts | 34 | ||||
-rw-r--r-- | u/server/filter/json.ts | 42 | ||||
-rw-r--r-- | u/server/filter/method.ts | 30 |
3 files changed, 0 insertions, 106 deletions
diff --git a/u/server/filter/index.ts b/u/server/filter/index.ts deleted file mode 100644 index 75168c7..0000000 --- a/u/server/filter/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - type IEither, - type ITraceable, - LogLevel, - type PenguenoRequest, - type ServerTrace, -} from '@emprespresso/pengueno'; - -export enum ErrorSource { - USER = LogLevel.WARN, - SYSTEM = LogLevel.ERROR, -} - -export class PenguenoError extends Error { - public readonly source: ErrorSource; - constructor( - override readonly message: string, - public readonly status: number, - ) { - super(message); - this.source = Math.floor(status / 100) === 4 ? ErrorSource.USER : ErrorSource.SYSTEM; - } -} - -export interface RequestFilter< - T, - Err extends PenguenoError = PenguenoError, - RIn = ITraceable<PenguenoRequest, ServerTrace>, -> { - (req: RIn): IEither<Err, T> | Promise<IEither<Err, T>>; -} - -export * from './method.js'; -export * from './json.js'; diff --git a/u/server/filter/json.ts b/u/server/filter/json.ts deleted file mode 100644 index bc53d47..0000000 --- a/u/server/filter/json.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Either, - type IEither, - type ITraceable, - LogLevel, - Metric, - PenguenoError, - type PenguenoRequest, - type RequestFilter, - type ServerTrace, - TraceUtil, -} from '@emprespresso/pengueno'; - -export interface JsonTransformer<R, ParsedJson = unknown> { - (json: ITraceable<ParsedJson, ServerTrace>): IEither<PenguenoError, R>; -} - -const ParseJsonMetric = Metric.fromName('JsonParse').asResult(); -export const jsonModel = - <MessageT>(jsonTransformer: JsonTransformer<MessageT>): RequestFilter<MessageT> => - (r: ITraceable<PenguenoRequest, ServerTrace>) => - r - .flatMap(TraceUtil.withFunctionTrace(jsonModel)) - .flatMap(TraceUtil.withMetricTrace(ParseJsonMetric)) - .map((j) => - Either.fromFailableAsync<Error, MessageT>(<Promise<MessageT>>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(); diff --git a/u/server/filter/method.ts b/u/server/filter/method.ts deleted file mode 100644 index 7d6aa76..0000000 --- a/u/server/filter/method.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - Either, - HttpMethod, - IEither, - type ITraceable, - LogLevel, - PenguenoError, - type PenguenoRequest, - type RequestFilter, - type ServerTrace, - TraceUtil, -} from '@emprespresso/pengueno'; - -export const requireMethod = - (methods: Array<HttpMethod>): RequestFilter<HttpMethod> => - (req: ITraceable<PenguenoRequest, ServerTrace>) => - req - .flatMap(TraceUtil.withFunctionTrace(requireMethod)) - .map((t): IEither<PenguenoError, HttpMethod> => { - const { - req: { method }, - } = t.get(); - if (!methods.includes(method)) { - const msg = "that's not how you pet me (âīšâ)~"; - t.trace.traceScope(LogLevel.WARN).trace(msg); - return Either.left(new PenguenoError(msg, 405)); - } - return Either.right(method); - }) - .get(); |