ServerTime
This commit is contained in:
4
packages/common/src/data/ServerTime.type.ts
Normal file
4
packages/common/src/data/ServerTime.type.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import { Schema as S } from "@effect/schema"
|
||||||
|
|
||||||
|
|
||||||
|
export const ServerTime = S.DateFromString
|
||||||
@@ -1 +1,2 @@
|
|||||||
|
export * from "./ServerTime.type"
|
||||||
export * from "./Todo.class"
|
export * from "./Todo.class"
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { Schema as S } from "@effect/schema"
|
||||||
|
import { ServerTime } from "@todo-tests/common/data"
|
||||||
import { TRPCError } from "@trpc/server"
|
import { TRPCError } from "@trpc/server"
|
||||||
import { observable } from "@trpc/server/observable"
|
import { observable } from "@trpc/server/observable"
|
||||||
import { Context, Data, Effect, Fiber, Layer, Schedule } from "effect"
|
import { Context, Data, Effect, Fiber, Layer, Schedule } from "effect"
|
||||||
@@ -6,6 +8,9 @@ import { RPCProcedureBuilder } from "./procedures/RPCProcedureBuilder"
|
|||||||
import { todoRouter } from "./routers/todo"
|
import { todoRouter } from "./routers/todo"
|
||||||
|
|
||||||
|
|
||||||
|
const encodeServerTime = S.encode(ServerTime)
|
||||||
|
|
||||||
|
|
||||||
export const router = Effect.gen(function*() {
|
export const router = Effect.gen(function*() {
|
||||||
const t = yield* TRPCBuilder
|
const t = yield* TRPCBuilder
|
||||||
const procedure = yield* RPCProcedureBuilder
|
const procedure = yield* RPCProcedureBuilder
|
||||||
@@ -17,10 +22,12 @@ export const router = Effect.gen(function*() {
|
|||||||
|
|
||||||
serverTime: procedure
|
serverTime: procedure
|
||||||
.subscription(({ ctx }) =>
|
.subscription(({ ctx }) =>
|
||||||
observable<string>(emit => {
|
observable<typeof ServerTime.Encoded>(emit => {
|
||||||
const emitter = ctx.fork(
|
const emitter = ctx.fork(
|
||||||
Effect.sync(() => emit.next(new Date().toString())).pipe(
|
Effect.sync(() => new Date()).pipe(
|
||||||
Effect.repeat(Schedule.fixed("1 second"))
|
Effect.flatMap(encodeServerTime),
|
||||||
|
Effect.map(emit.next),
|
||||||
|
Effect.repeat(Schedule.fixed("1 second")),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Schema as S } from "@effect/schema"
|
import { Schema as S } from "@effect/schema"
|
||||||
import { createLazyFileRoute } from "@tanstack/react-router"
|
import { createLazyFileRoute } from "@tanstack/react-router"
|
||||||
|
import { ServerTime } from "@todo-tests/common/data"
|
||||||
import { Option, flow, identity } from "effect"
|
import { Option, flow, identity } from "effect"
|
||||||
import { type IObservableArray, observable } from "mobx"
|
import { type IObservableArray, observable } from "mobx"
|
||||||
import { observer } from "mobx-react-lite"
|
import { observer } from "mobx-react-lite"
|
||||||
@@ -9,6 +10,8 @@ import { VTodo } from "../todo/VTodo"
|
|||||||
import { trpc } from "../trpc/trpc"
|
import { trpc } from "../trpc/trpc"
|
||||||
|
|
||||||
|
|
||||||
|
const decodeServerTime = S.decodeSync(ServerTime)
|
||||||
|
|
||||||
const decodeTodos = flow(
|
const decodeTodos = flow(
|
||||||
S.decodeSync(
|
S.decodeSync(
|
||||||
S.mutable(S.Array(JsonifiableTodo))
|
S.mutable(S.Array(JsonifiableTodo))
|
||||||
@@ -19,10 +22,10 @@ const decodeTodos = flow(
|
|||||||
|
|
||||||
export const Index = observer(() => {
|
export const Index = observer(() => {
|
||||||
|
|
||||||
const [serverTime, setServerTime] = useState("")
|
const [serverTime, setServerTime] = useState(new Date())
|
||||||
|
|
||||||
trpc.serverTime.useSubscription(undefined, {
|
trpc.serverTime.useSubscription(undefined, {
|
||||||
onData: setServerTime
|
onData: flow(decodeServerTime, setServerTime)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -35,7 +38,7 @@ export const Index = observer(() => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-1 items-stretch">
|
<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 => (
|
{todos.map(todo => (
|
||||||
<VTodo
|
<VTodo
|
||||||
|
|||||||
Reference in New Issue
Block a user