@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.
- package/README.md +16 -16
- package/dist/client.d.ts +33 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +80 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +7 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +21 -0
- package/dist/memory.js.map +1 -0
- package/dist/react.d.ts +15 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +11 -0
- package/dist/react.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/transport.d.ts +53 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +171 -0
- package/dist/transport.js.map +1 -0
- package/dist/wireNode.d.ts +24 -0
- package/dist/wireNode.d.ts.map +1 -0
- package/dist/wireNode.js +80 -0
- package/dist/wireNode.js.map +1 -0
- package/dist/wireRender.d.ts +20 -0
- package/dist/wireRender.d.ts.map +1 -0
- package/dist/wireRender.js +97 -0
- package/dist/wireRender.js.map +1 -0
- package/package.json +34 -22
- package/src/client-keyed-slot.test.ts +19 -6
- package/src/client-remount.test.ts +14 -5
- package/src/client.ts +74 -41
- package/src/counterFixtures.ts +142 -0
- package/src/fixtures.ts +10 -247
- package/src/listFixtures.ts +174 -0
- package/src/optionalFixtures.ts +64 -0
- package/src/react.ts +1 -6
- package/src/remote-view.typecheck.ts +3 -2
- package/src/server.test.ts +26 -12
- package/src/server.ts +150 -211
- package/src/slottedFixtures.ts +120 -0
- package/src/transport.test.ts +2 -1
- package/src/transport.ts +88 -24
- package/src/wireNode.ts +153 -0
- package/src/wireRender.ts +235 -0
- package/src/connect.ts +0 -44
- package/src/contract.ts +0 -3
- package/src/remote-server.ts +0 -109
- package/src/transport.types.ts +0 -29
package/src/remote-server.ts
DELETED
|
@@ -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
|
-
}
|
package/src/transport.types.ts
DELETED
|
@@ -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
|
-
}
|