serverTime subscription

This commit is contained in:
Julien Valverdé
2024-07-17 03:45:59 +02:00
parent 52f7c5cc4b
commit 23ccc1da28
2 changed files with 28 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
import { TRPCError } from "@trpc/server"
import { Context, Data, Effect, Layer } from "effect"
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"
@@ -14,6 +15,22 @@ export const router = Effect.gen(function*() {
Effect.succeed("pong")
)),
serverTime: procedure
.subscription(({ ctx }) =>
observable<string>(emit => {
const emitter = ctx.fork(
Effect.sync(() => emit.next(new Date().toString())).pipe(
Effect.repeat(Schedule.spaced("1 second"))
)
)
return () => ctx.fork(
Fiber.interrupt(emitter)
)
})
),
fail1: procedure.query(({ ctx }) => ctx.run(
Effect.fail(new AnError({ aValue: "A value" }))
)),

View File

@@ -19,17 +19,24 @@ const decodeTodos = flow(
export const Index = observer(() => {
const [serverTime, setServerTime] = useState("")
trpc.serverTime.useSubscription(undefined, {
onData: setServerTime
})
const [todos, setTodos] = useState<IObservableArray<Todo>>(observable.array())
trpc.todo.changes.useSubscription(undefined, {
onData: data => {
setTodos(decodeTodos(data))
}
onData: flow(decodeTodos, setTodos)
})
return (
<div className="flex flex-col gap-1 items-stretch">
<p className="text-center">{serverTime}</p>
{todos.map(todo => (
<VTodo
key={Option.match(todo.id, {