@livestore/devtools-web-common 0.3.0-dev.5 → 0.3.0-dev.50

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.
@@ -1,131 +0,0 @@
1
- import { Devtools, liveStoreVersion } from '@livestore/common'
2
- import type { Scope, Worker } from '@livestore/utils/effect'
3
- import { Deferred, Effect, PubSub, Schema, Stream } from '@livestore/utils/effect'
4
-
5
- import { makeChannelForConnectedMeshNode, makeWebDevtoolsConnectedMeshNode } from '../web-channel/index.js'
6
- import type * as WorkerSchema from '../worker/schema.js'
7
-
8
- // TODO use a unique bridgeId for each connection (similar to web bridge)
9
- // TODO refactor the bridge creation code to be re-used for both web and node and possibly expo
10
- export const prepareWebDevtoolsBridge = ({
11
- worker,
12
- workerTargetName,
13
- storeId,
14
- clientId,
15
- sessionId,
16
- }: {
17
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>
18
- /** Usually `shared-worker` */
19
- workerTargetName: string
20
- storeId: string
21
- clientId: string
22
- sessionId: string
23
- }): Effect.Effect<Devtools.PrepareDevtoolsBridge, never, Scope.Scope> =>
24
- Effect.gen(function* () {
25
- const meshNode = yield* makeWebDevtoolsConnectedMeshNode({
26
- nodeName: `devtools`,
27
- target: workerTargetName,
28
- worker,
29
- })
30
-
31
- // @ts-expect-error typing
32
- globalThis.__debugWebMeshNode = meshNode
33
-
34
- // const appHostId = `${storeId}-${sessionId}`
35
- const isLeader = true // For now we only support a single node instance, which always is the leader
36
-
37
- // TODO maybe we need a temporary channel to create a unique bridge channel e..g see appHostInfoDeferred below
38
- const webDevtoolsChannelStore = yield* makeChannelForConnectedMeshNode({
39
- node: meshNode,
40
- target: `client-session-${storeId}-${clientId}-${sessionId}`,
41
- schema: { listen: Devtools.MessageFromAppClientSession, send: Devtools.MessageToAppClientSession },
42
- })
43
-
44
- const webDevtoolsChannelCoordinator = yield* makeChannelForConnectedMeshNode({
45
- node: meshNode,
46
- target: `leader-${storeId}-${clientId}`,
47
- schema: { listen: Devtools.MessageFromAppLeader, send: Devtools.MessageToAppLeader },
48
- })
49
-
50
- const responsePubSub = yield* PubSub.unbounded<
51
- Devtools.MessageFromAppLeader | Devtools.MessageFromAppClientSession
52
- >().pipe(Effect.acquireRelease(PubSub.shutdown))
53
-
54
- // const appHostInfoDeferred = yield* Deferred.make<{ appHostId: string; isLeader: boolean }>()
55
-
56
- yield* webDevtoolsChannelCoordinator.listen.pipe(
57
- Stream.flatten(),
58
- // Stream.tapLogWithLabel('fromCoordinator.listen'),
59
- Stream.tap((msg) =>
60
- Effect.gen(function* () {
61
- yield* PubSub.publish(responsePubSub, msg)
62
- }),
63
- ),
64
- Stream.runDrain,
65
- Effect.withSpan('portForDevtoolsChannelCoordinator.listen'),
66
- Effect.tapCauseLogPretty,
67
- Effect.forkScoped,
68
- )
69
-
70
- yield* webDevtoolsChannelStore.listen.pipe(
71
- Stream.flatten(),
72
- // Stream.tapLogWithLabel('fromStore.listen'),
73
- Stream.tap((msg) =>
74
- Effect.gen(function* () {
75
- yield* PubSub.publish(responsePubSub, msg)
76
- }),
77
- ),
78
- Stream.runDrain,
79
- Effect.withSpan('portForDevtoolsChannelStore.listen'),
80
- Effect.tapCauseLogPretty,
81
- Effect.forkScoped,
82
- )
83
-
84
- // yield* webDevtoolsChannelCoordinator.send(Devtools.DevtoolsReady.make({ liveStoreVersion }))
85
-
86
- // const { appHostId, isLeader } = yield* Deferred.await(appHostInfoDeferred)
87
-
88
- // TODO improve disconnect handling
89
- yield* Deferred.await(webDevtoolsChannelCoordinator.closedDeferred).pipe(
90
- Effect.tap(() =>
91
- PubSub.publish(responsePubSub, Devtools.Disconnect.make({ liveStoreVersion, clientId, sessionId })),
92
- ),
93
- Effect.tapCauseLogPretty,
94
- Effect.forkScoped,
95
- )
96
-
97
- // TODO improve disconnect handling
98
- yield* Deferred.await(webDevtoolsChannelStore.closedDeferred).pipe(
99
- Effect.tap(() =>
100
- PubSub.publish(responsePubSub, Devtools.Disconnect.make({ liveStoreVersion, clientId, sessionId })),
101
- ),
102
- Effect.tapCauseLogPretty,
103
- Effect.forkScoped,
104
- )
105
-
106
- const sendToAppHost: Devtools.PrepareDevtoolsBridge['sendToAppHost'] = (msg) =>
107
- Effect.gen(function* () {
108
- // NOTE it's possible that a message is for both the coordinator and the store (e.g. Disconnect)
109
- if (Schema.is(Devtools.MessageToAppLeader)(msg)) {
110
- yield* webDevtoolsChannelCoordinator.send(msg)
111
- }
112
-
113
- if (Schema.is(Devtools.MessageToAppClientSession)(msg)) {
114
- yield* webDevtoolsChannelStore.send(msg)
115
- }
116
- }).pipe(Effect.withSpan('sendToAppHost'), Effect.orDie)
117
-
118
- const copyToClipboard = (text: string) =>
119
- Effect.sync(() => {
120
- navigator.clipboard.writeText(text)
121
- })
122
-
123
- return {
124
- responsePubSub,
125
- sendToAppHost,
126
- clientId,
127
- sessionId,
128
- copyToClipboard,
129
- isLeader,
130
- } satisfies Devtools.PrepareDevtoolsBridge
131
- }).pipe(Effect.orDie)
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src",
6
- "tsBuildInfoFile": "./dist/.tsbuildinfo"
7
- },
8
- "include": ["./src"],
9
- "references": [{ "path": "../common" }, { "path": "../utils" }, { "path": "../webmesh" }]
10
- }