blob: 5ca5716ad9d05307a0179316895acf526c307976 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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<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();
|