71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import { assert, describe, it } from "@effect/vitest"
|
|
import { Effect, Layer, Schema } from "effect"
|
|
import { Atom, AtomRegistry, AtomRpc, Hydration } from "effect/unstable/reactivity"
|
|
import { Rpc, RpcGroup } from "effect/unstable/rpc"
|
|
|
|
const Group = RpcGroup.make(
|
|
Rpc.make("getUser", {
|
|
payload: Schema.Struct({
|
|
id: Schema.FiniteFromString
|
|
}),
|
|
success: Schema.Struct({
|
|
id: Schema.Number,
|
|
name: Schema.String
|
|
})
|
|
})
|
|
)
|
|
|
|
describe("AtomRpc", () => {
|
|
it.effect("query creates a serializable atom", () =>
|
|
Effect.gen(function*() {
|
|
const Client = AtomRpc.Service()("Client", {
|
|
group: Group,
|
|
protocol: Layer.empty,
|
|
makeEffect: Effect.succeed(
|
|
((tag: string, payload: { readonly id: number }) => {
|
|
if (tag !== "getUser") {
|
|
return Effect.die(`unexpected tag: ${tag}`)
|
|
}
|
|
return Effect.succeed({
|
|
id: payload.id,
|
|
name: `user-${payload.id}`
|
|
})
|
|
}) as any
|
|
)
|
|
})
|
|
|
|
const atom = Client.query("getUser", { id: 1 }, {
|
|
headers: {
|
|
"x-id": "abc"
|
|
},
|
|
serializationKey: "1"
|
|
})
|
|
|
|
if (!Atom.isSerializable(atom)) {
|
|
assert.fail("expected query atom to be serializable")
|
|
}
|
|
const key = atom[Atom.SerializableTypeId].key
|
|
|
|
const atomFromEncodedPayload = Client.query("getUser", { id: 1 }, {
|
|
headers: {
|
|
"x-id": "abc"
|
|
},
|
|
serializationKey: "1"
|
|
})
|
|
assert(Atom.isSerializable(atomFromEncodedPayload), "expected query atom from encoded payload to be serializable")
|
|
assert(atom === atomFromEncodedPayload)
|
|
assert.strictEqual(atomFromEncodedPayload[Atom.SerializableTypeId].key, key)
|
|
|
|
const registry = AtomRegistry.make()
|
|
const unmount = registry.mount(atom)
|
|
yield* Effect.yieldNow
|
|
yield* Effect.yieldNow
|
|
|
|
const dehydrated = Hydration.toValues(Hydration.dehydrate(registry))
|
|
assert.lengthOf(dehydrated, 1)
|
|
assert.strictEqual(dehydrated[0]!.key, key)
|
|
|
|
unmount()
|
|
}))
|
|
})
|