1/**
2 * The dev sidecar entry: ONE process hosting every RPC-backed local
3 * provider — Cloudflare's workerd-backed providers, the floci-backed AWS
4 * providers, `Command.Dev` processes, framework dev servers — so their
5 * long-lived state survives exec-child hot reloads during `alchemy dev`.
6 *
7 * Providers arrive in groups: each `RpcProvider.effect` names the URL of a
8 * module whose default export is its group's provider layer (see
9 * `Cloudflare/Local.ts`, `AWS/Local/Local.ts`, `Command/Local.ts`,
10 * `Website/ServerLocal.ts`). A group is imported and built the first time
11 * a session asks for one of its types, so a Cloudflare-only stack never
12 * loads the AWS providers or starts the emulator they need. The spawner
13 * (`RpcSpawner`) forks this entry once per run; `RpcProviderProxy` points
14 * every provider at it.
15 */
16import * as Effect from "effect/Effect";
17import * as Layer from "effect/Layer";
18import * as RpcServer from "./RpcServer.ts";
19
20RpcServer.launch((group) =>
21 Effect.promise(() => import(group)).pipe(
22 Effect.flatMap((module: { default?: unknown }) =>
23 Layer.isLayer(module.default)
24 ? Effect.succeed(module.default as RpcServer.ProviderLayer)
25 : Effect.fail(
26 new Error(
27 `Provider group module ${group} must default-export its provider Layer`,
28 ),
29 ),
30 ),
31 ),
32);