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 { DedicatedQueue } from "./dedicated-consumer-queue.ts";
6
7/** Produces to the queue consumed by `dedicated-consumer-worker.ts`. */
8export default class ProducerWorker extends Cloudflare.Worker<ProducerWorker>()(
9 "dedicated-producer-worker",
10 { main: import.meta.url },
11 Effect.gen(function* () {
12 const queue = yield* Cloudflare.Queues.WriteQueue(yield* DedicatedQueue);
13 return {
14 fetch: Effect.gen(function* () {
15 const request = yield* HttpServerRequest;
16 const url = new URL(request.url, "http://x");
17 if (url.pathname === "/send") {
18 yield* queue
19 .send({ text: url.searchParams.get("text") ?? "hello" })
20 .pipe(Effect.orDie);
21 return yield* HttpServerResponse.json(
22 { sent: true },
23 { status: 202 },
24 );
25 }
26 return HttpServerResponse.text("Not Found", { status: 404 });
27 }),
28 };
29 }).pipe(Effect.provide(Cloudflare.Queues.WriteQueueBinding)),
30) {}