Work
This commit is contained in:
@@ -2,8 +2,12 @@ import { Layer } from "effect"
|
||||
import { TodoRepository } from "./TodoRepository"
|
||||
|
||||
|
||||
type TServices =
|
||||
| TodoRepository
|
||||
|
||||
export interface Services extends TServices {}
|
||||
|
||||
|
||||
export const ServicesLive = Layer.mergeAll(
|
||||
TodoRepository.Live
|
||||
)
|
||||
|
||||
export interface Services extends Layer.Layer.Success<typeof ServicesLive> {}
|
||||
) satisfies Layer.Layer<Services, never, never>
|
||||
|
||||
@@ -7,6 +7,7 @@ import { TodoRepository, createDefaultTodos } from "./TodoRepository"
|
||||
import { ExpressApp } from "./express/ExpressApp"
|
||||
import { ExpressHTTPServer } from "./express/ExpressHTTPServer"
|
||||
import { RPCPlayground } from "./rpc/RPCPlayground"
|
||||
import { RPCRouter } from "./rpc/RPCRouter"
|
||||
import { RPCServer } from "./rpc/RPCServer"
|
||||
import { RPCProcedureBuilder } from "./rpc/procedures/RPCProcedureBuilder"
|
||||
import { TRPCBuilder } from "./trpc/TRPCBuilder"
|
||||
@@ -16,6 +17,7 @@ import { TRPCContextCreator } from "./trpc/TRPCContextCreator"
|
||||
const ServerLive = ExpressHTTPServer.Live.pipe(
|
||||
Layer.provide(RPCServer.Live),
|
||||
Layer.provide(RPCPlayground.Dev),
|
||||
Layer.provide(RPCRouter.Live),
|
||||
Layer.provide(RPCProcedureBuilder.Live),
|
||||
Layer.provide(TRPCBuilder.Live),
|
||||
Layer.provide(TRPCContextCreator.Live),
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Config, Effect, Layer } from "effect"
|
||||
import { Effect, Layer } from "effect"
|
||||
import { expressHandler } from "trpc-playground/handlers/express"
|
||||
import { ExpressApp } from "../express/ExpressApp"
|
||||
import { appRouter } from "./routers"
|
||||
import { RPCRouter } from "./RPCRouter"
|
||||
import { rpcPlaygroundRoot, rpcRoot } from "./config"
|
||||
|
||||
|
||||
export module RPCPlayground {
|
||||
@@ -9,17 +10,14 @@ export module RPCPlayground {
|
||||
|
||||
export const Dev = Layer.effectDiscard(Effect.gen(function*() {
|
||||
const app = yield* ExpressApp
|
||||
const router = yield* appRouter
|
||||
const playgroundEndpoint = yield* rpcPlaygroundRoot
|
||||
|
||||
const playgroundEndpoint = yield* Config.string("RPC_PANEL_ROOT").pipe(Config.withDefault("/rpc/playground"))
|
||||
const trpcApiEndpoint = yield* Config.string("RPC_ROOT").pipe(Config.withDefault("/rpc"))
|
||||
|
||||
app.use(playgroundEndpoint,
|
||||
yield* Effect.promise(() => expressHandler({
|
||||
trpcApiEndpoint,
|
||||
const handler = expressHandler({
|
||||
trpcApiEndpoint: yield* rpcRoot,
|
||||
playgroundEndpoint,
|
||||
router,
|
||||
}))
|
||||
)
|
||||
router: yield* RPCRouter,
|
||||
})
|
||||
|
||||
app.use(playgroundEndpoint, yield* Effect.promise(() => handler))
|
||||
}))
|
||||
}
|
||||
|
||||
28
packages/server/src/rpc/RPCRouter.ts
Normal file
28
packages/server/src/rpc/RPCRouter.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { Context, Effect, Layer } from "effect"
|
||||
import { TRPCBuilder } from "../trpc/TRPCBuilder"
|
||||
import { RPCProcedureBuilder } from "./procedures/RPCProcedureBuilder"
|
||||
import { todosRouter } from "./routers/todos"
|
||||
|
||||
|
||||
export const router = Effect.gen(function*() {
|
||||
const t = yield* TRPCBuilder
|
||||
const procedure = yield* RPCProcedureBuilder
|
||||
|
||||
return t.router({
|
||||
ping: procedure.query(({ ctx }) =>
|
||||
ctx.run(Effect.succeed("pong"))
|
||||
),
|
||||
|
||||
todos: yield* todosRouter,
|
||||
})
|
||||
})
|
||||
|
||||
export class RPCRouter extends Context.Tag("RPCRouter")<RPCRouter,
|
||||
Effect.Effect.Success<typeof router>
|
||||
>() {}
|
||||
|
||||
export module RPCRouter {
|
||||
export type Router = Context.Tag.Service<RPCRouter>
|
||||
|
||||
export const Live = Layer.effect(RPCRouter, router)
|
||||
}
|
||||
@@ -1,19 +1,18 @@
|
||||
import { createExpressMiddleware } from "@trpc/server/adapters/express"
|
||||
import { Config, Effect, Layer } from "effect"
|
||||
import { Effect, Layer } from "effect"
|
||||
import { ExpressApp } from "../express/ExpressApp"
|
||||
import { TRPCContextCreator } from "../trpc/TRPCContextCreator"
|
||||
import { appRouter } from "./routers"
|
||||
import { RPCRouter } from "./RPCRouter"
|
||||
import { rpcRoot } from "./config"
|
||||
|
||||
|
||||
export module RPCServer {
|
||||
export const Live = Layer.effectDiscard(Effect.gen(function*() {
|
||||
const app = yield* ExpressApp
|
||||
|
||||
app.use(
|
||||
yield* Config.string("RPC_ROOT").pipe(Config.withDefault("/rpc")),
|
||||
|
||||
app.use(yield* rpcRoot,
|
||||
createExpressMiddleware({
|
||||
router: yield* appRouter,
|
||||
router: yield* RPCRouter,
|
||||
createContext: yield* TRPCContextCreator,
|
||||
}),
|
||||
)
|
||||
|
||||
5
packages/server/src/rpc/config.ts
Normal file
5
packages/server/src/rpc/config.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { Config } from "effect"
|
||||
|
||||
|
||||
export const rpcRoot = Config.string("RPC_ROOT").pipe(Config.withDefault("/rpc"))
|
||||
export const rpcPlaygroundRoot = Config.string("RPC_PLAYGROUND_ROOT").pipe(Config.withDefault("/rpc/playground"))
|
||||
@@ -1,20 +0,0 @@
|
||||
import { Effect } from "effect"
|
||||
import { TRPCBuilder } from "../../trpc/TRPCBuilder"
|
||||
import { RPCProcedureBuilder } from "../procedures/RPCProcedureBuilder"
|
||||
import { todosRouter } from "./todos"
|
||||
|
||||
|
||||
export const appRouter = Effect.gen(function*() {
|
||||
const t = yield* TRPCBuilder
|
||||
const procedure = yield* RPCProcedureBuilder
|
||||
|
||||
return t.router({
|
||||
ping: procedure.query(({ ctx }) =>
|
||||
ctx.run(Effect.succeed("pong"))
|
||||
),
|
||||
|
||||
todos: yield* todosRouter,
|
||||
})
|
||||
})
|
||||
|
||||
export type AppRouter = Effect.Effect.Success<typeof appRouter>
|
||||
Reference in New Issue
Block a user