1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { Cause, Effect, Exit } from "npm:effect";
type Handler<T> = (req: Request) => T;
export function http<E>(effect: Handler<Effect.Effect<Response, E>>): Handler<Promise<Response>> {
return async req => {
const exit = await Effect.runPromiseExit(effect(req));
return Exit.match(exit, {
onFailure: e => Response.json({ ok: false, error: Cause.pretty(e) }),
onSuccess: result => result,
});
};
}
export function requestJSON<T>(r: Request) {
return Effect.tryPromise(() => r.json() as Promise<T>).pipe(
Effect.catchAll(() => Effect.fail(`Could not parse Request as JSON`)),
);
}