This commit is contained in:
Julien Valverdé
2024-07-06 01:51:25 +02:00
parent 89a76f85ac
commit a93123a912
7 changed files with 57 additions and 41 deletions

View File

@@ -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"))
const handler = expressHandler({
trpcApiEndpoint: yield* rpcRoot,
playgroundEndpoint,
router: yield* RPCRouter,
})
app.use(playgroundEndpoint,
yield* Effect.promise(() => expressHandler({
trpcApiEndpoint,
playgroundEndpoint,
router,
}))
)
app.use(playgroundEndpoint, yield* Effect.promise(() => handler))
}))
}

View 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)
}

View File

@@ -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,
}),
)

View 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"))

View File

@@ -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>