ServerTime

This commit is contained in:
Julien Valverdé
2024-07-17 07:26:57 +02:00
parent d364eba805
commit 0d792ad8be
4 changed files with 21 additions and 6 deletions

View File

@@ -0,0 +1,4 @@
import { Schema as S } from "@effect/schema"
export const ServerTime = S.DateFromString

View File

@@ -1 +1,2 @@
export * from "./ServerTime.type"
export * from "./Todo.class"

View File

@@ -1,3 +1,5 @@
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 { Context, Data, Effect, Fiber, Layer, Schedule } from "effect"
@@ -6,6 +8,9 @@ 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
@@ -17,10 +22,12 @@ export const router = Effect.gen(function*() {
serverTime: procedure
.subscription(({ ctx }) =>
observable<string>(emit => {
observable<typeof ServerTime.Encoded>(emit => {
const emitter = ctx.fork(
Effect.sync(() => emit.next(new Date().toString())).pipe(
Effect.repeat(Schedule.fixed("1 second"))
Effect.sync(() => new Date()).pipe(
Effect.flatMap(encodeServerTime),
Effect.map(emit.next),
Effect.repeat(Schedule.fixed("1 second")),
)
)

View File

@@ -1,5 +1,6 @@
import { Schema as S } from "@effect/schema"
import { createLazyFileRoute } from "@tanstack/react-router"
import { ServerTime } from "@todo-tests/common/data"
import { Option, flow, identity } from "effect"
import { type IObservableArray, observable } from "mobx"
import { observer } from "mobx-react-lite"
@@ -9,6 +10,8 @@ import { VTodo } from "../todo/VTodo"
import { trpc } from "../trpc/trpc"
const decodeServerTime = S.decodeSync(ServerTime)
const decodeTodos = flow(
S.decodeSync(
S.mutable(S.Array(JsonifiableTodo))
@@ -19,10 +22,10 @@ const decodeTodos = flow(
export const Index = observer(() => {
const [serverTime, setServerTime] = useState("")
const [serverTime, setServerTime] = useState(new Date())
trpc.serverTime.useSubscription(undefined, {
onData: setServerTime
onData: flow(decodeServerTime, setServerTime)
})
@@ -35,7 +38,7 @@ export const Index = observer(() => {
return (
<div className="flex flex-col gap-1 items-stretch">
<p className="text-center">{serverTime}</p>
<p className="text-center">{serverTime.toString()}</p>
{todos.map(todo => (
<VTodo