This commit is contained in:
Julien Valverdé
2024-07-20 05:00:41 +02:00
parent 15f89974cf
commit 8ab38af883
2 changed files with 58 additions and 56 deletions

View File

@@ -1,64 +1,12 @@
import { Schema as S } from "@effect/schema" import { Context, Effect, Layer } from "effect"
import { ServerTime } from "@todo-tests/common/data" import { indexRouter } from "./routers"
import { TRPCError } from "@trpc/server"
import { observable } from "@trpc/server/observable"
import { Context, Data, Effect, Fiber, Layer, Schedule } from "effect"
import { TRPCBuilder } from "../trpc/TRPCBuilder"
import { RPCProcedureBuilder } from "./procedures/RPCProcedureBuilder"
import { todoRouter } from "./routers/todo"
const encodeServerTime = S.encode(ServerTime)
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")
)),
serverTime: procedure
.subscription(({ ctx }) =>
observable<typeof ServerTime.Encoded>(emit => {
const emitter = ctx.fork(
Effect.sync(() => new Date()).pipe(
Effect.flatMap(encodeServerTime),
Effect.map(emit.next),
Effect.repeat(Schedule.fixed("1 second")),
)
)
return () => ctx.fork(
Fiber.interrupt(emitter)
)
})
),
fail1: procedure.query(({ ctx }) => ctx.run(
Effect.fail(new AnError({ aValue: "A value" }))
)),
fail2: procedure.query(({ ctx }) => ctx.run(
Effect.fail(new TRPCError({ code: "NOT_IMPLEMENTED" }))
)),
todo: yield* todoRouter,
})
})
class AnError extends Data.TaggedError("AnError")<{
aValue: string
}> {}
export class RPCRouter extends Context.Tag("RPCRouter")<RPCRouter, export class RPCRouter extends Context.Tag("RPCRouter")<RPCRouter,
Effect.Effect.Success<typeof router> Effect.Effect.Success<typeof indexRouter>
>() {} >() {}
export module RPCRouter { export module RPCRouter {
export type Router = Context.Tag.Service<RPCRouter> export type Router = Context.Tag.Service<RPCRouter>
export const Live = Layer.effect(RPCRouter, router) export const Live = Layer.effect(RPCRouter, indexRouter)
} }

View File

@@ -0,0 +1,54 @@
import { Schema as S } from "@effect/schema"
import { ServerTime } from "@todo-tests/common/data"
import { TRPCError } from "@trpc/server"
import { observable } from "@trpc/server/observable"
import { Data, Effect, Fiber, Schedule } from "effect"
import { TRPCBuilder } from "../../trpc/TRPCBuilder"
import { RPCProcedureBuilder } from "../procedures/RPCProcedureBuilder"
import { todoRouter } from "./todo"
const encodeServerTime = S.encode(ServerTime)
export const indexRouter = Effect.gen(function*() {
const t = yield* TRPCBuilder
const procedure = yield* RPCProcedureBuilder
return t.router({
ping: procedure.query(({ ctx }) => ctx.run(
Effect.succeed("pong")
)),
serverTime: procedure
.subscription(({ ctx }) =>
observable<typeof ServerTime.Encoded>(emit => {
const emitter = ctx.fork(
Effect.sync(() => new Date()).pipe(
Effect.flatMap(encodeServerTime),
Effect.map(emit.next),
Effect.repeat(Schedule.fixed("1 second")),
)
)
return () => ctx.fork(
Fiber.interrupt(emitter)
)
})
),
fail1: procedure.query(({ ctx }) => ctx.run(
Effect.fail(new AnError({ aValue: "A value" }))
)),
fail2: procedure.query(({ ctx }) => ctx.run(
Effect.fail(new TRPCError({ code: "NOT_IMPLEMENTED" }))
)),
todo: yield* todoRouter,
})
})
class AnError extends Data.TaggedError("AnError")<{
aValue: string
}> {}