0.1.17 #18

Merged
Thilawyn merged 37 commits from next into master 2024-09-07 20:56:30 +02:00
5 changed files with 55 additions and 88 deletions
Showing only changes of commit 65ef5f0896 - Show all commits

View File

@@ -1,8 +1,8 @@
import { Config, Effect, Layer } from "effect" import type { AnyRouter } from "@trpc/server"
import { Config, Context, Effect, Layer } from "effect"
import { ImportError } from "../../ImportError" import { ImportError } from "../../ImportError"
import { ExpressApp } from "../express" import { ExpressApp } from "../express"
import { TRPCUnknownContextCreator } from "./TRPCContextCreator" import { TRPCUnknownContextCreator } from "./TRPCContextCreator"
import { TRPCAnyRouter } from "./TRPCRouter"
const importTRPCServerExpressAdapter = Effect.tryPromise({ const importTRPCServerExpressAdapter = Effect.tryPromise({
@@ -10,17 +10,19 @@ const importTRPCServerExpressAdapter = Effect.tryPromise({
catch: cause => new ImportError({ path: "@trpc/server/adapters/express", cause }), catch: cause => new ImportError({ path: "@trpc/server/adapters/express", cause }),
}) })
export const TRPCExpressRouteLive = ( export const TRPCExpressRouteLive = <T extends AnyRouter>(
routerTag: Context.Tag<"@thilalib/TRCP/TRPCRouter", T>,
config: { config: {
readonly root: Config.Config<string> readonly root: Config.Config<string>
} },
) => Layer.effectDiscard(Effect.gen(function*() { ) => Layer.effectDiscard(Effect.gen(function*() {
const { createExpressMiddleware } = yield* importTRPCServerExpressAdapter const { createExpressMiddleware } = yield* importTRPCServerExpressAdapter
const app = yield* ExpressApp.ExpressApp const app = yield* ExpressApp.ExpressApp
app.use(yield* config.root, app.use(yield* config.root,
createExpressMiddleware({ createExpressMiddleware({
router: yield* TRPCAnyRouter, router: yield* routerTag,
createContext: (yield* TRPCUnknownContextCreator).createExpressContext, createContext: (yield* TRPCUnknownContextCreator).createExpressContext,
}) })
) )

View File

@@ -1,14 +1,9 @@
import type { AnyRouter, AnyRouterDef, Router } from "@trpc/server" import type { AnyRouter } from "@trpc/server"
import { Context, Effect, Layer } from "effect" import { Context, Effect, Layer } from "effect"
export class TRPCAnyRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")<TRPCAnyRouter,
AnyRouter
>() {}
export const make = < export const make = <
A extends Router<AnyRouterDef>, A extends AnyRouter,
E, R, E, R,
>(router: Effect.Effect<A, E, R>) => { >(router: Effect.Effect<A, E, R>) => {
class TRPCRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")<TRPCRouter, A>() {} class TRPCRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")<TRPCRouter, A>() {}

View File

@@ -1,16 +1,10 @@
import type { AnyRouter } from "@trpc/server"
import type { applyWSSHandler } from "@trpc/server/adapters/ws" import type { applyWSSHandler } from "@trpc/server/adapters/ws"
import { Config, Context, Effect, Layer } from "effect" import { Config, Context, Effect, Layer } from "effect"
import type ws from "ws" import type ws from "ws"
import { ImportError } from "../../ImportError" import { ImportError } from "../../ImportError"
import { ExpressNodeHTTPServer } from "../express" import { ExpressNodeHTTPServer } from "../express"
import { TRPCUnknownContextCreator } from "./TRPCContextCreator" import { TRPCUnknownContextCreator } from "./TRPCContextCreator"
import { TRPCAnyRouter } from "./TRPCRouter"
export class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer")<TRPCWebSocketServer, {
wss: ws.Server
handler: ReturnType<typeof applyWSSHandler>
}>() {}
const importWS = Effect.tryPromise({ const importWS = Effect.tryPromise({
@@ -23,7 +17,16 @@ const importTRPCServerWSAdapter = Effect.tryPromise({
catch: cause => new ImportError({ path: "@trpc/server/adapters/ws", cause }), catch: cause => new ImportError({ path: "@trpc/server/adapters/ws", cause }),
}) })
export const TRPCWebSocketServerLive = (
export const make = <T extends AnyRouter>(
routerTag: Context.Tag<"@thilalib/TRCP/TRPCRouter", T>
) => {
class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer")<TRPCWebSocketServer, {
wss: ws.Server
handler: ReturnType<typeof applyWSSHandler<T>>
}>() {}
const TRPCWebSocketServerLive = (
config: { config: {
readonly host: Config.Config<string> readonly host: Config.Config<string>
} }
@@ -46,7 +49,7 @@ export const TRPCWebSocketServerLive = (
wss, wss,
handler: applyWSSHandler({ handler: applyWSSHandler({
wss, wss,
router: yield* TRPCAnyRouter, router: yield* routerTag,
createContext: (yield* TRPCUnknownContextCreator).createWebSocketContext, createContext: (yield* TRPCUnknownContextCreator).createWebSocketContext,
}), }),
} }
@@ -62,3 +65,6 @@ export const TRPCWebSocketServerLive = (
}), }),
) )
})) }))
return { TRPCWebSocketServer, TRPCWebSocketServerLive }
}

View File

@@ -16,11 +16,10 @@ const router = TRPCBuilder.pipe(Effect.map(t => t.router({
}))) })))
const { TRPCRouter, TRPCRouterLive } = TRPC.TRPCRouter.make(router) const { TRPCRouter, TRPCRouterLive } = TRPC.TRPCRouter.make(router)
type TRouter = Context.Tag.Service<typeof TRPCRouter>
const ServerLive = Layer.empty.pipe( const ServerLive = Layer.empty.pipe(
Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive({ Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive(TRPCRouter, {
root: Config.succeed("/rpc") root: Config.succeed("/rpc")
})), })),

View File

@@ -1,35 +0,0 @@
import type { AnyRouter } from "@trpc/server"
import { Context, Effect, Layer } from "effect"
import * as TRPC from "."
const { TRPCBuilder, TRPCBuilderLive } = TRPC.TRPCBuilder.make<never>()
const router = TRPCBuilder.pipe(Effect.map(t => t.router({
ping: t.procedure.query(({ ctx }) => ctx.run(
Effect.succeed("pong")
)),
})))
export class TRPCAnyRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")<TRPCAnyRouter,
AnyRouter
>() {}
export class TRPCRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")<TRPCRouter,
Effect.Effect.Success<typeof router>
>() {}
const RouterLive = Layer.effect(TRPCRouter, router)
const AnyRouterLive = Layer.effect(TRPCAnyRouter, router)
const main = Effect.gen(function*() {
yield* TRPCAnyRouter
yield* TRPCRouter
})
const runnable = main.pipe(
Effect.provide(RouterLive),
Effect.provide(TRPCBuilderLive),
)