From 0d792ad8be16f2a3245c6238f005a4360a420abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 17 Jul 2024 07:26:57 +0200 Subject: [PATCH] ServerTime --- packages/common/src/data/ServerTime.type.ts | 4 ++++ packages/common/src/data/index.ts | 1 + packages/server/src/rpc/RPCRouter.ts | 13 ++++++++++--- packages/webui/src/routes/index.lazy.tsx | 9 ++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 packages/common/src/data/ServerTime.type.ts diff --git a/packages/common/src/data/ServerTime.type.ts b/packages/common/src/data/ServerTime.type.ts new file mode 100644 index 0000000..585ea6d --- /dev/null +++ b/packages/common/src/data/ServerTime.type.ts @@ -0,0 +1,4 @@ +import { Schema as S } from "@effect/schema" + + +export const ServerTime = S.DateFromString diff --git a/packages/common/src/data/index.ts b/packages/common/src/data/index.ts index 5dcc9d8..00c5177 100644 --- a/packages/common/src/data/index.ts +++ b/packages/common/src/data/index.ts @@ -1 +1,2 @@ +export * from "./ServerTime.type" export * from "./Todo.class" diff --git a/packages/server/src/rpc/RPCRouter.ts b/packages/server/src/rpc/RPCRouter.ts index 2e2c559..057b687 100644 --- a/packages/server/src/rpc/RPCRouter.ts +++ b/packages/server/src/rpc/RPCRouter.ts @@ -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(emit => { + observable(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")), ) ) diff --git a/packages/webui/src/routes/index.lazy.tsx b/packages/webui/src/routes/index.lazy.tsx index f1f3cd7..327381a 100644 --- a/packages/webui/src/routes/index.lazy.tsx +++ b/packages/webui/src/routes/index.lazy.tsx @@ -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 (
-

{serverTime}

+

{serverTime.toString()}

{todos.map(todo => (