@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.
Files changed (54) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/SqliteDbWrapper.js +0 -1
  3. package/dist/SqliteDbWrapper.js.map +1 -1
  4. package/dist/live-queries/base-class.d.ts +2 -9
  5. package/dist/live-queries/base-class.d.ts.map +1 -1
  6. package/dist/live-queries/base-class.js +3 -5
  7. package/dist/live-queries/base-class.js.map +1 -1
  8. package/dist/live-queries/computed.d.ts.map +1 -1
  9. package/dist/live-queries/computed.js +1 -2
  10. package/dist/live-queries/computed.js.map +1 -1
  11. package/dist/live-queries/db-query.d.ts.map +1 -1
  12. package/dist/live-queries/db-query.js +1 -2
  13. package/dist/live-queries/db-query.js.map +1 -1
  14. package/dist/live-queries/db-query.test.js +46 -56
  15. package/dist/live-queries/db-query.test.js.map +1 -1
  16. package/dist/live-queries/graphql.d.ts.map +1 -1
  17. package/dist/live-queries/graphql.js +1 -2
  18. package/dist/live-queries/graphql.js.map +1 -1
  19. package/dist/reactive.d.ts +4 -0
  20. package/dist/reactive.d.ts.map +1 -1
  21. package/dist/reactive.js +9 -11
  22. package/dist/reactive.js.map +1 -1
  23. package/dist/reactive.test.js +1 -1
  24. package/dist/reactive.test.js.map +1 -1
  25. package/dist/row-query-utils.d.ts +2 -2
  26. package/dist/row-query-utils.d.ts.map +1 -1
  27. package/dist/row-query-utils.js +3 -3
  28. package/dist/row-query-utils.js.map +1 -1
  29. package/dist/store/create-store.d.ts +5 -2
  30. package/dist/store/create-store.d.ts.map +1 -1
  31. package/dist/store/create-store.js +15 -1
  32. package/dist/store/create-store.js.map +1 -1
  33. package/dist/store/devtools.d.ts +3 -2
  34. package/dist/store/devtools.d.ts.map +1 -1
  35. package/dist/store/devtools.js +30 -8
  36. package/dist/store/devtools.js.map +1 -1
  37. package/dist/store/store.d.ts +2 -2
  38. package/dist/store/store.d.ts.map +1 -1
  39. package/dist/store/store.js +5 -3
  40. package/dist/store/store.js.map +1 -1
  41. package/package.json +5 -5
  42. package/src/SqliteDbWrapper.ts +0 -1
  43. package/src/live-queries/__snapshots__/db-query.test.ts.snap +0 -3
  44. package/src/live-queries/base-class.ts +5 -14
  45. package/src/live-queries/computed.ts +1 -2
  46. package/src/live-queries/db-query.test.ts +28 -26
  47. package/src/live-queries/db-query.ts +1 -2
  48. package/src/live-queries/graphql.ts +1 -2
  49. package/src/reactive.test.ts +1 -1
  50. package/src/reactive.ts +10 -12
  51. package/src/row-query-utils.ts +5 -5
  52. package/src/store/create-store.ts +35 -4
  53. package/src/store/devtools.ts +57 -12
  54. package/src/store/store.ts +7 -4
@@ -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<Devtools.MessageToAppClientSession, Devtools.MessageFromAppClientSession>
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.MessageFromAppClientSession) =>
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.MessageToAppClientSession.Type) => {
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(Devtools.DebugInfoResetRes.make({ requestId, clientId, sessionId, liveStoreVersion }))
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(Devtools.DebugInfoRerunQueryRes.make({ requestId, clientId, sessionId, liveStoreVersion }))
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
- // No default
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
 
@@ -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
- private syncProcessor: ClientSessionSyncProcessor
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
- liveQueryRCMap: new Map(),
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.ResetAllDataReq.make({ liveStoreVersion, mode, requestId: nanoid() }),
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.syncStateRef.current
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