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();