Fix
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
54
packages/server/src/rpc/routers/index.ts
Normal file
54
packages/server/src/rpc/routers/index.ts
Normal 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
|
||||||
|
}> {}
|
||||||
Reference in New Issue
Block a user