| 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 | */ |
| 16 | import * as Effect from "effect/Effect"; |
| 17 | import * as Layer from "effect/Layer"; |
| 18 | import * as RpcServer from "./RpcServer.ts"; |
| 19 | |
| 20 | RpcServer.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 | ); |