1import * as Cloudflare from "@/Cloudflare";
2import * as Alchemy from "@/index";
3import * as Effect from "effect/Effect";
4import * as pathe from "pathe";
5import BrowserEffectWorker from "./effect-worker.ts";
6
7const asyncWorkerMain = pathe.resolve(import.meta.dirname, "async-worker.ts");
8
9export const AsyncWorker = Cloudflare.Worker("BrowserAsyncWorker", {
10 main: asyncWorkerMain,
11 compatibility: {
12 flags: ["nodejs_compat"],
13 },
14 env: {
15 BROWSER: Cloudflare.Browser("BROWSER"),
16 },
17});
18
19export type AsyncWorkerEnv = Cloudflare.InferEnv<typeof AsyncWorker>;
20
21export default Alchemy.Stack(
22 "BrowserBindingStack",
23 {
24 providers: Cloudflare.providers(),
25 state: Cloudflare.state(),
26 },
27 Effect.gen(function* () {
28 const asyncWorker = yield* AsyncWorker;
29 const effectWorker = yield* BrowserEffectWorker;
30
31 return {
32 asyncWorkerUrl: asyncWorker.url.as<string>(),
33 effectWorkerUrl: effectWorker.url.as<string>(),
34 };
35 }),
36);