History

feat: API contract, server handler, and frontend with effect-atom

- packages/core/api: HttpApi contract with ToolsApi + SecretsApi groups SDK tagged errors pass through directly with status annotations (ToolNotFoundError→404, PolicyDeniedError→403, etc.) - apps/server: API handler implementation via HttpApiBuilder Exports createApiHandler() for reuse (no baked-in server runtime) Handlers are pure pass-through — no manual error catching - apps/web: Vite + React frontend served on same port as API Vite plugin forwards /v1/*, /docs, /openapi.json to Effect handler effect-atom integration: AtomHttpApi.Tag typed client, query/mutation atoms RegistryProvider + useAtomValue with Result pattern matching - Catalog pins @effect/platform, platform-bun, platform-node, cluster - All 9 packages typecheck clean

Rhys Sullivan committed 7 months ago

Commit 8babea81 parent 00219a926 files · +1022 −32Browse files

Showing the changes to apps/server/src/main.ts (1 of 26 files). Show all

Unified · Split

apps/server/src/main.ts+40−0
@@ -0,0 +1,40 @@
1import {
2 HttpApiBuilder,
3 HttpApiSwagger,
4 HttpMiddleware,
5 HttpServer,
6} from "@effect/platform";
7import { Layer } from "effect";
8
9import { ExecutorApi } from "@executor/api";
10import { ToolsHandlers } from "./handlers/tools";
11import { SecretsHandlers } from "./handlers/secrets";
12import { ExecutorServiceLive } from "./services/executor";
13
14// ---------------------------------------------------------------------------
15// API layer — wire handlers
16// ---------------------------------------------------------------------------
17
18const ApiLive = HttpApiBuilder.api(ExecutorApi).pipe(
19 Layer.provide([ToolsHandlers, SecretsHandlers]),
20 Layer.provide(ExecutorServiceLive),
21);
22
23// ---------------------------------------------------------------------------
24// Web handler — usable by Vite plugin, standalone server, tests, etc.
25// ---------------------------------------------------------------------------
26
27export const createApiHandler = () =>
28 HttpApiBuilder.toWebHandler(
29 HttpApiSwagger.layer().pipe(
30 Layer.provideMerge(HttpApiBuilder.middlewareOpenApi()),
31 Layer.provideMerge(HttpApiBuilder.middlewareCors()),
32 Layer.provideMerge(ApiLive),
33 Layer.provideMerge(HttpServer.layerContext),
34 ),
35 { middleware: HttpMiddleware.logger },
36 );
37
38export type ApiHandler = ReturnType<typeof createApiHandler>;
39
40export { ExecutorServiceLive } from "./services/executor";

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t