| 1 | import * as Cloudflare from "@/Cloudflare/index.ts"; |
| 2 | import * as Effect from "effect/Effect"; |
| 3 | import { HttpServerRequest } from "effect/http/HttpServerRequest"; |
| 4 | import * as HttpServerResponse from "effect/http/HttpServerResponse"; |
| 5 | import { DedicatedQueue } from "./dedicated-consumer-queue.ts"; |
| 6 | |
| 7 | /** Produces to the queue consumed by `dedicated-consumer-worker.ts`. */ |
| 8 | export 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 | ) {} |