@livestore/livestore 0.3.0-dev.11 → 0.3.0-dev.12
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/dist/.tsbuildinfo +1 -1
- package/dist/SqliteDbWrapper.js +0 -1
- package/dist/SqliteDbWrapper.js.map +1 -1
- package/dist/live-queries/base-class.d.ts +2 -9
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +3 -5
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +1 -2
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.d.ts.map +1 -1
- package/dist/live-queries/db-query.js +1 -2
- package/dist/live-queries/db-query.js.map +1 -1
- package/dist/live-queries/db-query.test.js +46 -56
- package/dist/live-queries/db-query.test.js.map +1 -1
- package/dist/live-queries/graphql.d.ts.map +1 -1
- package/dist/live-queries/graphql.js +1 -2
- package/dist/live-queries/graphql.js.map +1 -1
- package/dist/reactive.d.ts +4 -0
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +9 -11
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +1 -1
- package/dist/reactive.test.js.map +1 -1
- package/dist/row-query-utils.d.ts +2 -2
- package/dist/row-query-utils.d.ts.map +1 -1
- package/dist/row-query-utils.js +3 -3
- package/dist/row-query-utils.js.map +1 -1
- package/dist/store/create-store.d.ts +5 -2
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +15 -1
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +3 -2
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +30 -8
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store.d.ts +2 -2
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +5 -3
- package/dist/store/store.js.map +1 -1
- package/package.json +5 -5
- package/src/SqliteDbWrapper.ts +0 -1
- package/src/live-queries/__snapshots__/db-query.test.ts.snap +0 -3
- package/src/live-queries/base-class.ts +5 -14
- package/src/live-queries/computed.ts +1 -2
- package/src/live-queries/db-query.test.ts +28 -26
- package/src/live-queries/db-query.ts +1 -2
- package/src/live-queries/graphql.ts +1 -2
- package/src/reactive.test.ts +1 -1
- package/src/reactive.ts +10 -12
- package/src/row-query-utils.ts +5 -5
- package/src/store/create-store.ts +35 -4
- package/src/store/devtools.ts +57 -12
- package/src/store/store.ts +7 -4
package/src/store/devtools.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientSession, DebugInfo } from '@livestore/common'
|
|
1
|
+
import type { ClientSession, ClientSessionSyncProcessor, DebugInfo, SyncState } from '@livestore/common'
|
|
2
2
|
import { Devtools, liveStoreVersion, UnexpectedError } from '@livestore/common'
|
|
3
3
|
import { throttle } from '@livestore/utils'
|
|
4
4
|
import type { WebChannel } from '@livestore/utils/effect'
|
|
@@ -15,6 +15,7 @@ type IStore = {
|
|
|
15
15
|
reactivityGraph: ReactivityGraph
|
|
16
16
|
sqliteDbWrapper: SqliteDbWrapper
|
|
17
17
|
activeQueries: ReferenceCountedSet<LiveQuery<any>>
|
|
18
|
+
syncProcessor: ClientSessionSyncProcessor
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
type Unsub = () => void
|
|
@@ -34,13 +35,17 @@ export const connectDevtoolsToStore = ({
|
|
|
34
35
|
storeDevtoolsChannel,
|
|
35
36
|
store,
|
|
36
37
|
}: {
|
|
37
|
-
storeDevtoolsChannel: WebChannel.WebChannel<
|
|
38
|
+
storeDevtoolsChannel: WebChannel.WebChannel<
|
|
39
|
+
Devtools.ClientSession.MessageToApp,
|
|
40
|
+
Devtools.ClientSession.MessageFromApp
|
|
41
|
+
>
|
|
38
42
|
store: IStore
|
|
39
43
|
}) =>
|
|
40
44
|
Effect.gen(function* () {
|
|
41
45
|
const reactivityGraphSubcriptions: SubMap = new Map()
|
|
42
46
|
const liveQueriesSubscriptions: SubMap = new Map()
|
|
43
47
|
const debugInfoHistorySubscriptions: SubMap = new Map()
|
|
48
|
+
const syncHeadClientSessionSubscriptions: SubMap = new Map()
|
|
44
49
|
|
|
45
50
|
const { clientId, sessionId } = store.clientSession
|
|
46
51
|
|
|
@@ -49,13 +54,14 @@ export const connectDevtoolsToStore = ({
|
|
|
49
54
|
reactivityGraphSubcriptions.forEach((unsub) => unsub())
|
|
50
55
|
liveQueriesSubscriptions.forEach((unsub) => unsub())
|
|
51
56
|
debugInfoHistorySubscriptions.forEach((unsub) => unsub())
|
|
57
|
+
syncHeadClientSessionSubscriptions.forEach((unsub) => unsub())
|
|
52
58
|
}),
|
|
53
59
|
)
|
|
54
60
|
|
|
55
|
-
const sendToDevtools = (message: Devtools.
|
|
61
|
+
const sendToDevtools = (message: Devtools.ClientSession.MessageFromApp) =>
|
|
56
62
|
storeDevtoolsChannel.send(message).pipe(Effect.tapCauseLogPretty, Effect.runFork)
|
|
57
63
|
|
|
58
|
-
const onMessage = (decodedMessage: typeof Devtools.
|
|
64
|
+
const onMessage = (decodedMessage: typeof Devtools.ClientSession.MessageToApp.Type) => {
|
|
59
65
|
// console.debug('@livestore/livestore:store:devtools:onMessage', decodedMessage)
|
|
60
66
|
|
|
61
67
|
if (decodedMessage.clientId !== clientId || decodedMessage.sessionId !== sessionId) {
|
|
@@ -63,7 +69,7 @@ export const connectDevtoolsToStore = ({
|
|
|
63
69
|
return
|
|
64
70
|
}
|
|
65
71
|
|
|
66
|
-
if (decodedMessage._tag === 'LSD.Disconnect') {
|
|
72
|
+
if (decodedMessage._tag === 'LSD.ClientSession.Disconnect') {
|
|
67
73
|
// console.error('TODO handle disconnect properly in store')
|
|
68
74
|
return
|
|
69
75
|
}
|
|
@@ -82,7 +88,7 @@ export const connectDevtoolsToStore = ({
|
|
|
82
88
|
requestIdleCallback(
|
|
83
89
|
() =>
|
|
84
90
|
sendToDevtools(
|
|
85
|
-
Devtools.ReactivityGraphRes.make({
|
|
91
|
+
Devtools.ClientSession.ReactivityGraphRes.make({
|
|
86
92
|
reactivityGraph: store.reactivityGraph.getSnapshot({ includeResults }),
|
|
87
93
|
requestId,
|
|
88
94
|
clientId,
|
|
@@ -106,7 +112,7 @@ export const connectDevtoolsToStore = ({
|
|
|
106
112
|
}
|
|
107
113
|
case 'LSD.ClientSession.DebugInfoReq': {
|
|
108
114
|
sendToDevtools(
|
|
109
|
-
Devtools.DebugInfoRes.make({
|
|
115
|
+
Devtools.ClientSession.DebugInfoRes.make({
|
|
110
116
|
debugInfo: store.sqliteDbWrapper.debugInfo,
|
|
111
117
|
requestId,
|
|
112
118
|
clientId,
|
|
@@ -132,7 +138,7 @@ export const connectDevtoolsToStore = ({
|
|
|
132
138
|
|
|
133
139
|
if (buffer.length > 10) {
|
|
134
140
|
sendToDevtools(
|
|
135
|
-
Devtools.DebugInfoHistoryRes.make({
|
|
141
|
+
Devtools.ClientSession.DebugInfoHistoryRes.make({
|
|
136
142
|
debugInfoHistory: buffer,
|
|
137
143
|
requestId,
|
|
138
144
|
clientId,
|
|
@@ -171,13 +177,17 @@ export const connectDevtoolsToStore = ({
|
|
|
171
177
|
}
|
|
172
178
|
case 'LSD.ClientSession.DebugInfoResetReq': {
|
|
173
179
|
store.sqliteDbWrapper.debugInfo.slowQueries.clear()
|
|
174
|
-
sendToDevtools(
|
|
180
|
+
sendToDevtools(
|
|
181
|
+
Devtools.ClientSession.DebugInfoResetRes.make({ requestId, clientId, sessionId, liveStoreVersion }),
|
|
182
|
+
)
|
|
175
183
|
break
|
|
176
184
|
}
|
|
177
185
|
case 'LSD.ClientSession.DebugInfoRerunQueryReq': {
|
|
178
186
|
const { queryStr, bindValues, queriedTables } = decodedMessage
|
|
179
187
|
store.sqliteDbWrapper.select(queryStr, bindValues, { queriedTables, skipCache: true })
|
|
180
|
-
sendToDevtools(
|
|
188
|
+
sendToDevtools(
|
|
189
|
+
Devtools.ClientSession.DebugInfoRerunQueryRes.make({ requestId, clientId, sessionId, liveStoreVersion }),
|
|
190
|
+
)
|
|
181
191
|
break
|
|
182
192
|
}
|
|
183
193
|
case 'LSD.ClientSession.ReactivityGraphUnsubscribe': {
|
|
@@ -191,7 +201,7 @@ export const connectDevtoolsToStore = ({
|
|
|
191
201
|
requestIdleCallback(
|
|
192
202
|
() =>
|
|
193
203
|
sendToDevtools(
|
|
194
|
-
Devtools.LiveQueriesRes.make({
|
|
204
|
+
Devtools.ClientSession.LiveQueriesRes.make({
|
|
195
205
|
liveQueries: [...store.activeQueries].map((q) => ({
|
|
196
206
|
_tag: q._tag,
|
|
197
207
|
id: q.id,
|
|
@@ -229,7 +239,42 @@ export const connectDevtoolsToStore = ({
|
|
|
229
239
|
liveQueriesSubscriptions.delete(requestId)
|
|
230
240
|
break
|
|
231
241
|
}
|
|
232
|
-
|
|
242
|
+
case 'LSD.ClientSession.SyncHeadSubscribe': {
|
|
243
|
+
const send = (syncState: SyncState) =>
|
|
244
|
+
sendToDevtools(
|
|
245
|
+
Devtools.ClientSession.SyncHeadRes.make({
|
|
246
|
+
local: syncState.localHead,
|
|
247
|
+
upstream: syncState.upstreamHead,
|
|
248
|
+
requestId,
|
|
249
|
+
clientId,
|
|
250
|
+
sessionId,
|
|
251
|
+
liveStoreVersion,
|
|
252
|
+
}),
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
send(store.syncProcessor.syncState.pipe(Effect.runSync))
|
|
256
|
+
|
|
257
|
+
syncHeadClientSessionSubscriptions.set(
|
|
258
|
+
requestId,
|
|
259
|
+
store.syncProcessor.syncState.changes.pipe(
|
|
260
|
+
Stream.tap((syncState) => send(syncState)),
|
|
261
|
+
Stream.runDrain,
|
|
262
|
+
Effect.interruptible,
|
|
263
|
+
Effect.tapCauseLogPretty,
|
|
264
|
+
Effect.runCallback,
|
|
265
|
+
),
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
break
|
|
269
|
+
}
|
|
270
|
+
case 'LSD.ClientSession.SyncHeadUnsubscribe': {
|
|
271
|
+
syncHeadClientSessionSubscriptions.get(requestId)?.()
|
|
272
|
+
syncHeadClientSessionSubscriptions.delete(requestId)
|
|
273
|
+
break
|
|
274
|
+
}
|
|
275
|
+
default: {
|
|
276
|
+
console.warn(`[LSD.ClientSession] Unknown message`, decodedMessage)
|
|
277
|
+
}
|
|
233
278
|
}
|
|
234
279
|
}
|
|
235
280
|
|
package/src/store/store.ts
CHANGED
|
@@ -96,7 +96,7 @@ export class Store<
|
|
|
96
96
|
// NOTE this is currently exposed for the Devtools databrowser to emit mutation events
|
|
97
97
|
readonly __mutationEventSchema
|
|
98
98
|
private unsyncedMutationEvents
|
|
99
|
-
|
|
99
|
+
readonly syncProcessor: ClientSessionSyncProcessor
|
|
100
100
|
readonly lifetimeScope: Scope.Scope
|
|
101
101
|
|
|
102
102
|
readonly boot: Effect.Effect<void, UnexpectedError, Scope.Scope>
|
|
@@ -195,7 +195,7 @@ export class Store<
|
|
|
195
195
|
this.reactivityGraph = reactivityGraph
|
|
196
196
|
this.reactivityGraph.context = {
|
|
197
197
|
store: this as unknown as Store<BaseGraphQLContext, LiveStoreSchema>,
|
|
198
|
-
|
|
198
|
+
defRcMap: new Map(),
|
|
199
199
|
reactivityGraph: new WeakRef(reactivityGraph),
|
|
200
200
|
otelTracer: otelOptions.tracer,
|
|
201
201
|
rootOtelContext: otelQueriesSpanContext,
|
|
@@ -594,15 +594,16 @@ export class Store<
|
|
|
594
594
|
|
|
595
595
|
hardReset: (mode: 'all-data' | 'only-app-db' = 'all-data') => {
|
|
596
596
|
Effect.gen(this, function* () {
|
|
597
|
+
const clientId = this.clientSession.clientId
|
|
597
598
|
yield* this.clientSession.leaderThread.sendDevtoolsMessage(
|
|
598
|
-
Devtools.
|
|
599
|
+
Devtools.Leader.ResetAllData.Request.make({ liveStoreVersion, mode, requestId: nanoid(), clientId }),
|
|
599
600
|
)
|
|
600
601
|
}).pipe(this.runEffectFork)
|
|
601
602
|
},
|
|
602
603
|
|
|
603
604
|
syncStates: () => {
|
|
604
605
|
Effect.gen(this, function* () {
|
|
605
|
-
const session = this.syncProcessor.
|
|
606
|
+
const session = yield* this.syncProcessor.syncState
|
|
606
607
|
console.log('Session sync state:', session.toJSON())
|
|
607
608
|
const leader = yield* this.clientSession.leaderThread.getSyncState
|
|
608
609
|
console.log('Leader sync state:', leader.toJSON())
|
|
@@ -614,6 +615,8 @@ export class Store<
|
|
|
614
615
|
.shutdown(cause ?? Cause.fail(IntentionalShutdownCause.make({ reason: 'manual' })))
|
|
615
616
|
.pipe(Effect.tapCauseLogPretty, Effect.provide(this.runtime), Effect.runFork)
|
|
616
617
|
},
|
|
618
|
+
|
|
619
|
+
version: liveStoreVersion,
|
|
617
620
|
}
|
|
618
621
|
|
|
619
622
|
// NOTE This is needed because when booting a Store via Effect it seems to call `toJSON` in the error path
|