1import * as Cloudflare from "@/Cloudflare/index.ts";
2import * as Effect from "effect/Effect";
3import { HttpServerRequest } from "effect/http/HttpServerRequest";
4import * as HttpServerResponse from "effect/http/HttpServerResponse";
5import { Email } from "./sender.ts";
6
7export default class SendEmailWorker extends Cloudflare.Worker<SendEmailWorker>()(
8 "SendEmailTestWorker",
9 {
10 main: import.meta.url,
11 },
12 Effect.gen(function* () {
13 const email = yield* Cloudflare.Email.Send(Email);
14
15 return {
16 fetch: Effect.gen(function* () {
17 const request = yield* HttpServerRequest;
18 const url = new URL(request.url, "http://x");
19
20 if (url.pathname === "/send") {
21 const from = url.searchParams.get("from")!;
22 const to = url.searchParams.get("to")!;
23 const subject = url.searchParams.get("subject") ?? "alchemy test";
24 const result = yield* email
25 .send({
26 from,
27 to,
28 subject,
29 text: `sent at ${new Date().toISOString()}`,
30 })
31 .pipe(
32 Effect.match({
33 onSuccess: () => ({ ok: true as const }),
34 onFailure: (err) => ({
35 ok: false as const,
36 message: err.message,
37 }),
38 }),
39 );
40 return yield* HttpServerResponse.json(result);
41 }
42
43 return HttpServerResponse.text("ok");
44 }),
45 };
46 }).pipe(Effect.provide(Cloudflare.Email.SendBinding)),
47) {}