import { Either, type ITraceable, LogLevel, PenguenoError, type PenguenoRequest, type RequestFilter, type ServerTrace, 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)) .move(Promise.resolve(req.get())) .map( TraceUtil.promiseify((t) => { const { method: _method } = t.get(); const method = _method; if (!methods.includes(method)) { const msg = "that's not how you pet me (â‹Ÿīšâ‹ž)~"; t.trace.addTrace(LogLevel.WARN).trace(msg); return Either.left( new PenguenoError(msg, 405), ); } return Either.right(method); }), ) .get();