1import * as Cloudflare from "@/Cloudflare";
2import * as Alchemy from "@/index.ts";
3import * as Effect from "effect/Effect";
4import * as pathe from "pathe";
5import ArtifactsEffectWorker from "./effect-worker.ts";
6import { Repos } from "./shared.ts";
7
8/**
9 * Async-style Worker that declares the shared Artifacts namespace on its `env`.
10 * `InferEnv` resolves `REPOS` to the native `cf.Artifacts` runtime binding.
11 */
12export const AsyncWorker = Cloudflare.Worker("ArtifactsAsyncWorker", {
13 main: pathe.resolve(import.meta.dirname, "async-worker.ts"),
14 env: {
15 REPOS: Repos,
16 },
17});
18
19export type AsyncWorkerEnv = Cloudflare.InferEnv<typeof AsyncWorker>;
20
21/**
22 * Deploys both invocation styles — the Effect-native worker
23 * (`Cloudflare.Artifacts.ReadWriteNamespace(Repos)` + `ReadWriteNamespaceBinding`) and the async
24 * worker (`env: { REPOS }`) — against one shared Artifacts namespace, so the
25 * driver test can exercise the client surface (`create`/`list`/`get`/`delete`)
26 * over both.
27 */
28export default Alchemy.Stack(
29 "ArtifactsBindingStack",
30 { providers: Cloudflare.providers(), state: Cloudflare.state() },
31 Effect.gen(function* () {
32 const asyncWorker = yield* AsyncWorker;
33 const effectWorker = yield* ArtifactsEffectWorker;
34 return {
35 asyncWorkerUrl: asyncWorker.url.as<string>(),
36 effectWorkerUrl: effectWorker.url.as<string>(),
37 };
38 }),
39);