import { BunRuntime } from "@effect/platform-bun" import { Todo } from "@todo-tests/common/data" import { Duration, Effect, Layer, Logger, Match, Option } from "effect" import { ServerConfig } from "./ServerConfig" import { Services } from "./Services" import { ExpressApp } from "./http/ExpressApp" import { ExpressHTTPServer } from "./http/ExpressHTTPServer" import { RPCPlaygroundRoute } from "./rpc/RPCPlaygroundRoute" import { RPCRoute } from "./rpc/RPCRoute" import { RPCRouter } from "./rpc/RPCRouter" import { RPCWebSocketServer } from "./rpc/RPCWebSocketServer" import { RPCProcedureBuilder } from "./rpc/procedures/RPCProcedureBuilder" import { TodoRepository } from "./todo/TodoRepository" import { TRPCBuilder } from "./trpc/TRPCBuilder" import { TRPCContextCreator } from "./trpc/TRPCContextCreator" const ServerDev = Layer.empty.pipe( Layer.provideMerge(RPCRoute.Live), Layer.provideMerge(RPCPlaygroundRoute.Dev), Layer.provideMerge(RPCWebSocketServer.Live), Layer.provideMerge(RPCRouter.Live), Layer.provideMerge(RPCProcedureBuilder.Live), Layer.provideMerge(TRPCBuilder.Live), Layer.provideMerge(TRPCContextCreator.Live), Layer.provideMerge(ExpressHTTPServer.Live), Layer.provideMerge(ExpressApp.Live), ) const ServerLive = Layer.empty.pipe( Layer.provideMerge(RPCRoute.Live), Layer.provideMerge(RPCPlaygroundRoute.Live), Layer.provideMerge(RPCWebSocketServer.Live), Layer.provideMerge(RPCRouter.Live), Layer.provideMerge(RPCProcedureBuilder.Live), Layer.provideMerge(TRPCBuilder.Live), Layer.provideMerge(TRPCContextCreator.Live), Layer.provideMerge(ExpressHTTPServer.Live), Layer.provideMerge(ExpressApp.Live), ) const main = Effect.gen(function*() { const mode = yield* ServerConfig.mode const todos = yield* TodoRepository // yield* Effect.fork( // todos.todos.changes.pipe( // Stream.runForEach(values => Effect.gen(function*() { // yield* Console.log("Todos updated:") // yield* Console.log(values) // })) // ) // ) yield* todos.add(new Todo({ id: Option.none(), order: 0, content: "Sort the socks", due: Option.none(), completed: false, createdAt: new Date(), updatedAt: new Date(), })) yield* todos.add(new Todo({ id: Option.none(), order: 1, content: "Sort the dog", due: Option.none(), completed: false, createdAt: new Date(), updatedAt: new Date(), })) yield* todos.add(new Todo({ id: Option.none(), order: 2, content: "Sort the car", due: Option.none(), completed: false, createdAt: new Date(), updatedAt: new Date(), })) yield* Effect.fork( todos.add(new Todo({ id: Option.none(), order: 1, content: "Clean the pool", due: Option.none(), completed: false, createdAt: new Date(), updatedAt: new Date(), })).pipe( Effect.delay(Duration.seconds(5)) ) ) return yield* Layer.launch(Match.value(mode).pipe( Match.when("development", () => ServerDev), Match.when("production", () => ServerLive), Match.exhaustive, )) }) BunRuntime.runMain(main.pipe( Effect.provide(Services.Dev), Effect.provide(Logger.structured), Effect.scoped, ))