@playfast/reform-remote 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +16 -16
  2. package/dist/client.d.ts +33 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +80 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/memory.d.ts +7 -0
  11. package/dist/memory.d.ts.map +1 -0
  12. package/dist/memory.js +21 -0
  13. package/dist/memory.js.map +1 -0
  14. package/dist/react.d.ts +15 -0
  15. package/dist/react.d.ts.map +1 -0
  16. package/dist/react.js +11 -0
  17. package/dist/react.js.map +1 -0
  18. package/dist/server.d.ts +16 -0
  19. package/dist/server.d.ts.map +1 -0
  20. package/dist/server.js +56 -0
  21. package/dist/server.js.map +1 -0
  22. package/dist/transport.d.ts +53 -0
  23. package/dist/transport.d.ts.map +1 -0
  24. package/dist/transport.js +171 -0
  25. package/dist/transport.js.map +1 -0
  26. package/dist/wireNode.d.ts +24 -0
  27. package/dist/wireNode.d.ts.map +1 -0
  28. package/dist/wireNode.js +80 -0
  29. package/dist/wireNode.js.map +1 -0
  30. package/dist/wireRender.d.ts +20 -0
  31. package/dist/wireRender.d.ts.map +1 -0
  32. package/dist/wireRender.js +97 -0
  33. package/dist/wireRender.js.map +1 -0
  34. package/package.json +34 -22
  35. package/src/client-keyed-slot.test.ts +19 -6
  36. package/src/client-remount.test.ts +14 -5
  37. package/src/client.ts +74 -41
  38. package/src/counterFixtures.ts +142 -0
  39. package/src/fixtures.ts +10 -247
  40. package/src/listFixtures.ts +174 -0
  41. package/src/optionalFixtures.ts +64 -0
  42. package/src/react.ts +1 -6
  43. package/src/remote-view.typecheck.ts +3 -2
  44. package/src/server.test.ts +26 -12
  45. package/src/server.ts +150 -211
  46. package/src/slottedFixtures.ts +120 -0
  47. package/src/transport.test.ts +2 -1
  48. package/src/transport.ts +88 -24
  49. package/src/wireNode.ts +153 -0
  50. package/src/wireRender.ts +235 -0
  51. package/src/connect.ts +0 -44
  52. package/src/contract.ts +0 -3
  53. package/src/remote-server.ts +0 -109
  54. package/src/transport.types.ts +0 -29
@@ -1,109 +0,0 @@
1
- import { Effect, Layer, ManagedRuntime, Option, PubSub, Queue } from 'effect'
2
- import {
3
- Bus,
4
- type CompositionService,
5
- forceSync,
6
- publish,
7
- type Scene,
8
- type SlotChild,
9
- Triggers,
10
- type TriggerRegistryApi,
11
- Wire,
12
- type WirePatch,
13
- type WireTree,
14
- type WireNode,
15
- } from '@playfast/reform'
16
- import { renderSceneToWire } from './server'
17
-
18
- type RuntimeServices = CompositionService | SlotChild | Bus
19
- const SETTLE_DRAIN = 30
20
- const settleDrain: Effect.Effect<void> = Effect.yieldNow().pipe(Effect.repeatN(SETTLE_DRAIN))
21
- const closedSceneLayer = (scene: Scene): Layer.Layer<RuntimeServices, never, never> =>
22
- // oxlint-disable-next-line reform-rules/no-type-assertion -- closed-scene erasure: scene.provide is typed to MountedServices, recovered structurally as RuntimeServices
23
- scene.provide.reduce((acc, layer) => Layer.merge(acc, layer)) as unknown as Layer.Layer<
24
- RuntimeServices,
25
- never,
26
- never
27
- >
28
- const handlesOf = (node: WireNode): ReadonlyArray<string> =>
29
- node.props.flatMap((prop) => (prop._tag === 'Event' ? [prop.handle] : []))
30
-
31
- export interface RemoteServer {
32
- readonly render: () => Promise<WireTree>
33
- readonly renderDiff: () => Promise<ReadonlyArray<WirePatch>>
34
- readonly invoke: (handle: string, encodedPayload: unknown) => Promise<void>
35
- readonly subscribe: (listener: () => void) => () => void
36
- readonly currentTree: () => WireTree
37
- readonly dispose: () => Promise<void>
38
- }
39
-
40
- export const makeRemoteServer = (scene: Scene): RemoteServer => {
41
- const runtime = ManagedRuntime.make(closedSceneLayer(scene))
42
- const registry: TriggerRegistryApi = forceSync(() => runtime.runSync(Triggers.make))
43
- const renderEffect = settleDrain.pipe(
44
- Effect.zipRight(renderSceneToWire(scene, { register: registry.register })),
45
- )
46
- const changeListeners = new Set<() => void>()
47
- const notifyChange = (): void => {
48
- changeListeners.forEach((listener) => listener())
49
- }
50
- runtime.runFork(
51
- Effect.scoped(
52
- Effect.gen(function* () {
53
- const bus = yield* Bus
54
- const subscription = yield* PubSub.subscribe(bus)
55
- yield* Queue.take(subscription).pipe(
56
- Effect.zipRight(Effect.sync(notifyChange)),
57
- Effect.forever,
58
- )
59
- }),
60
- ),
61
- )
62
- runtime.runSync(
63
- Effect.forEach(
64
- Option.getOrElse(Option.fromNullable(scene.boot), () => []),
65
- (event) => publish('High', event),
66
- ),
67
- )
68
- const frame: { tree: WireTree } = { tree: [] }
69
- const render = (): Promise<WireTree> =>
70
- runtime.runPromise(
71
- renderEffect.pipe(
72
- Effect.tap((tree) =>
73
- Effect.sync(() => {
74
- frame.tree = tree
75
- }),
76
- ),
77
- ),
78
- )
79
- const renderDiff = (): Promise<ReadonlyArray<WirePatch>> =>
80
- runtime.runPromise(
81
- Effect.gen(function* () {
82
- const next = yield* renderEffect
83
- const previous = frame.tree
84
- const patches = Wire.diff(previous, next)
85
- frame.tree = next
86
- const nextIds = new Set(next.map((node) => node.id))
87
- const staleHandles = previous.filter((node) => !nextIds.has(node.id)).flatMap(handlesOf)
88
- yield* Effect.forEach(staleHandles, (handle) => registry.revoke(handle))
89
- return patches
90
- }),
91
- )
92
- return {
93
- render,
94
- renderDiff,
95
- invoke: (handle, encodedPayload) =>
96
- runtime.runPromise(
97
- Effect.gen(function* () {
98
- yield* registry.invoke(handle, encodedPayload)
99
- yield* settleDrain
100
- }),
101
- ),
102
- subscribe: (listener) => {
103
- changeListeners.add(listener)
104
- return () => void changeListeners.delete(listener)
105
- },
106
- currentTree: () => frame.tree,
107
- dispose: () => runtime.dispose(),
108
- }
109
- }
@@ -1,29 +0,0 @@
1
- import type { WirePatch, WireTree } from '@playfast/reform'
2
-
3
- export interface SnapshotMessage {
4
- readonly _tag: 'Snapshot'
5
- readonly tree: WireTree
6
- }
7
-
8
- export interface PatchesMessage {
9
- readonly _tag: 'Patches'
10
- readonly patches: ReadonlyArray<WirePatch>
11
- }
12
-
13
- export type ServerMessage = SnapshotMessage | PatchesMessage
14
-
15
- export interface InvokeMessage {
16
- readonly _tag: 'Invoke'
17
- readonly handle: string
18
- readonly payload: unknown
19
- }
20
-
21
- export interface RemoteTransport<Out, In> {
22
- readonly send: (message: Out) => void
23
- readonly onMessage: (handler: (message: In) => void) => () => void
24
- }
25
-
26
- export interface ServerBinding {
27
- readonly start: () => Promise<void>
28
- readonly dispose: () => Promise<void>
29
- }