1import * as Cloudflare from "@/Cloudflare/index.ts";
2import { remote } from "@/ProviderMode.ts";
3import * as Effect from "effect/Effect";
4import { HttpServerRequest } from "effect/http/HttpServerRequest";
5import * as HttpServerResponse from "effect/http/HttpServerResponse";
6
7/**
8 * Dev-mode fixture with two `send_email` bindings side by side: the default
9 * (lowered onto the local email simulator) and one piped through
10 * `Alchemy.remote()` (the live Cloudflare Email service, even in dev).
11 */
12export default class LocalSendEmailWorker extends Cloudflare.Worker<LocalSendEmailWorker>()(
13 "LocalSendEmailWorker",
14 {
15 main: import.meta.url,
16 },
17 Effect.gen(function* () {
18 const stub = yield* Cloudflare.Email.Send(
19 Cloudflare.Email.SendEmail("STUB_EMAIL"),
20 );
21 const live = yield* Cloudflare.Email.Send(
22 Cloudflare.Email.SendEmail("LIVE_EMAIL").pipe(remote()),
23 );
24
25 const send = Effect.fn(function* (client: Cloudflare.Email.SendClient) {
26 const request = yield* HttpServerRequest;
27 const url = new URL(request.url, "http://x");
28 const result = yield* client
29 .send({
30 from: url.searchParams.get("from")!,
31 to: url.searchParams.get("to")!,
32 subject: url.searchParams.get("subject") ?? "alchemy local test",
33 text: "sent from the alchemy dev-mode send_email test",
34 })
35 .pipe(
36 Effect.match({
37 onSuccess: () => ({ ok: true as const }),
38 onFailure: (err) => ({
39 ok: false as const,
40 message: err.message,
41 }),
42 }),
43 );
44 return yield* HttpServerResponse.json(result);
45 });
46
47 return {
48 fetch: Effect.gen(function* () {
49 const request = yield* HttpServerRequest;
50 const url = new URL(request.url, "http://x");
51 if (url.pathname === "/send-stub") {
52 return yield* send(stub);
53 }
54 if (url.pathname === "/send-live") {
55 return yield* send(live);
56 }
57 return HttpServerResponse.text("ok");
58 }),
59 };
60 }).pipe(Effect.provide(Cloudflare.Email.SendBinding)),
61) {}