1import * as Cloudflare from "@/Cloudflare/index.ts";
2import * as Alchemy from "@/index.ts";
3import * as Effect from "effect/Effect";
4import * as pathe from "pathe";
5import UrlEffectWorker from "./url-effect-worker.ts";
6
7export const UrlAsyncWorker = Cloudflare.Worker("UrlAsyncWorker", {
8 main: pathe.resolve(import.meta.dirname, "url-async-worker.ts"),
9 env: {
10 PUBLIC_URL: Cloudflare.Worker.URL,
11 },
12});
13
14export type UrlAsyncWorkerEnv = Cloudflare.InferEnv<typeof UrlAsyncWorker>;
15
16// Compile-time guarantee that `InferEnv` maps the `Worker.URL` tag to `string`.
17type _AssertPublicUrlIsString = UrlAsyncWorkerEnv["PUBLIC_URL"] extends string
18 ? true
19 : never;
20const _typecheck: _AssertPublicUrlIsString = true;
21void _typecheck;
22
23export default Alchemy.Stack(
24 "WorkerUrlStack",
25 {
26 providers: Cloudflare.providers(),
27 state: Cloudflare.state(),
28 },
29 Effect.gen(function* () {
30 const effectWorker = yield* UrlEffectWorker;
31 const asyncWorker = yield* UrlAsyncWorker;
32
33 return {
34 effectUrl: effectWorker.url.as<string>(),
35 asyncUrl: asyncWorker.url.as<string>(),
36 };
37 }),
38);