@livestore/common 0.3.0-dev.11 → 0.3.0-dev.13

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 (280) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +21 -21
  3. package/dist/adapter-types.d.ts +41 -18
  4. package/dist/adapter-types.d.ts.map +1 -1
  5. package/dist/adapter-types.js +12 -0
  6. package/dist/adapter-types.js.map +1 -1
  7. package/dist/db-schema/ast/sqlite.d.ts +69 -0
  8. package/dist/db-schema/ast/sqlite.d.ts.map +1 -0
  9. package/dist/db-schema/ast/sqlite.js +71 -0
  10. package/dist/db-schema/ast/sqlite.js.map +1 -0
  11. package/dist/db-schema/ast/validate.d.ts +3 -0
  12. package/dist/db-schema/ast/validate.d.ts.map +1 -0
  13. package/dist/db-schema/ast/validate.js +12 -0
  14. package/dist/db-schema/ast/validate.js.map +1 -0
  15. package/dist/db-schema/dsl/field-defs.d.ts +90 -0
  16. package/dist/db-schema/dsl/field-defs.d.ts.map +1 -0
  17. package/dist/db-schema/dsl/field-defs.js +87 -0
  18. package/dist/db-schema/dsl/field-defs.js.map +1 -0
  19. package/dist/db-schema/dsl/field-defs.test.d.ts +2 -0
  20. package/dist/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  21. package/dist/db-schema/dsl/field-defs.test.js +29 -0
  22. package/dist/db-schema/dsl/field-defs.test.js.map +1 -0
  23. package/dist/db-schema/dsl/index.d.ts +88 -0
  24. package/dist/db-schema/dsl/index.d.ts.map +1 -0
  25. package/dist/db-schema/dsl/index.js +35 -0
  26. package/dist/db-schema/dsl/index.js.map +1 -0
  27. package/dist/db-schema/dsl/mod.d.ts +90 -0
  28. package/dist/db-schema/dsl/mod.d.ts.map +1 -0
  29. package/dist/db-schema/dsl/mod.js +35 -0
  30. package/dist/db-schema/dsl/mod.js.map +1 -0
  31. package/dist/db-schema/dsl/sqlite/field-defs.d.ts +90 -0
  32. package/dist/db-schema/dsl/sqlite/field-defs.d.ts.map +1 -0
  33. package/dist/db-schema/dsl/sqlite/field-defs.js +86 -0
  34. package/dist/db-schema/dsl/sqlite/field-defs.js.map +1 -0
  35. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts +2 -0
  36. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts.map +1 -0
  37. package/dist/db-schema/dsl/sqlite/field-defs.test.js +29 -0
  38. package/dist/db-schema/dsl/sqlite/field-defs.test.js.map +1 -0
  39. package/dist/db-schema/dsl/sqlite/index.d.ts +88 -0
  40. package/dist/db-schema/dsl/sqlite/index.d.ts.map +1 -0
  41. package/dist/db-schema/dsl/sqlite/index.js +35 -0
  42. package/dist/db-schema/dsl/sqlite/index.js.map +1 -0
  43. package/dist/db-schema/hash.d.ts +2 -0
  44. package/dist/db-schema/hash.d.ts.map +1 -0
  45. package/dist/db-schema/hash.js +14 -0
  46. package/dist/db-schema/hash.js.map +1 -0
  47. package/dist/db-schema/index.d.ts +4 -0
  48. package/dist/db-schema/index.d.ts.map +1 -0
  49. package/dist/db-schema/index.js +6 -0
  50. package/dist/db-schema/index.js.map +1 -0
  51. package/dist/db-schema/mod.d.ts +3 -0
  52. package/dist/db-schema/mod.d.ts.map +1 -0
  53. package/dist/db-schema/mod.js +3 -0
  54. package/dist/db-schema/mod.js.map +1 -0
  55. package/dist/derived-mutations.d.ts +1 -1
  56. package/dist/derived-mutations.d.ts.map +1 -1
  57. package/dist/derived-mutations.js +3 -3
  58. package/dist/derived-mutations.js.map +1 -1
  59. package/dist/devtools/devtools-bridge.d.ts +10 -7
  60. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  61. package/dist/devtools/devtools-messages-client-session.d.ts +101 -28
  62. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  63. package/dist/devtools/devtools-messages-client-session.js +19 -3
  64. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  65. package/dist/devtools/devtools-messages-common.d.ts +24 -32
  66. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  67. package/dist/devtools/devtools-messages-common.js +19 -10
  68. package/dist/devtools/devtools-messages-common.js.map +1 -1
  69. package/dist/devtools/devtools-messages-leader.d.ts +220 -56
  70. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  71. package/dist/devtools/devtools-messages-leader.js +57 -9
  72. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  73. package/dist/devtools/devtools-messages.d.ts +2 -2
  74. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  75. package/dist/devtools/devtools-messages.js +2 -2
  76. package/dist/devtools/devtools-messages.js.map +1 -1
  77. package/dist/index.d.ts +1 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/index.js.map +1 -1
  81. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  82. package/dist/leader-thread/LeaderSyncProcessor.js +50 -35
  83. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  84. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  85. package/dist/leader-thread/apply-mutation.js +8 -6
  86. package/dist/leader-thread/apply-mutation.js.map +1 -1
  87. package/dist/leader-thread/connection.d.ts +31 -3
  88. package/dist/leader-thread/connection.d.ts.map +1 -1
  89. package/dist/leader-thread/connection.js +18 -3
  90. package/dist/leader-thread/connection.js.map +1 -1
  91. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  92. package/dist/leader-thread/leader-worker-devtools.js +56 -31
  93. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  94. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  95. package/dist/leader-thread/make-leader-thread-layer.js +23 -6
  96. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  97. package/dist/leader-thread/mutationlog.d.ts +1 -1
  98. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  99. package/dist/leader-thread/mutationlog.js +7 -5
  100. package/dist/leader-thread/mutationlog.js.map +1 -1
  101. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +4 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +13 -8
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/types.d.ts +22 -15
  107. package/dist/leader-thread/types.d.ts.map +1 -1
  108. package/dist/leader-thread/types.js +1 -3
  109. package/dist/leader-thread/types.js.map +1 -1
  110. package/dist/query-builder/api.d.ts +3 -3
  111. package/dist/query-builder/api.d.ts.map +1 -1
  112. package/dist/query-builder/impl.js.map +1 -1
  113. package/dist/query-builder/impl.test.js +16 -1
  114. package/dist/query-builder/impl.test.js.map +1 -1
  115. package/dist/query-info.d.ts +3 -3
  116. package/dist/query-info.d.ts.map +1 -1
  117. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  118. package/dist/rehydrate-from-mutationlog.js +8 -6
  119. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  120. package/dist/schema/EventId.d.ts +10 -9
  121. package/dist/schema/EventId.d.ts.map +1 -1
  122. package/dist/schema/EventId.js +14 -11
  123. package/dist/schema/EventId.js.map +1 -1
  124. package/dist/schema/EventId.test.js +3 -3
  125. package/dist/schema/EventId.test.js.map +1 -1
  126. package/dist/schema/MutationEvent.d.ts +37 -12
  127. package/dist/schema/MutationEvent.d.ts.map +1 -1
  128. package/dist/schema/MutationEvent.js +20 -4
  129. package/dist/schema/MutationEvent.js.map +1 -1
  130. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  131. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  132. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  133. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  134. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  135. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  136. package/dist/schema/db-schema/ast/validate.js +12 -0
  137. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  138. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  139. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  140. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  141. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  142. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  143. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  144. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  145. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  146. package/dist/schema/db-schema/dsl/mod.d.ts +88 -0
  147. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  148. package/dist/schema/db-schema/dsl/mod.js +35 -0
  149. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  150. package/dist/schema/db-schema/hash.d.ts +2 -0
  151. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  152. package/dist/schema/db-schema/hash.js +14 -0
  153. package/dist/schema/db-schema/hash.js.map +1 -0
  154. package/dist/schema/db-schema/mod.d.ts +3 -0
  155. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  156. package/dist/schema/db-schema/mod.js +3 -0
  157. package/dist/schema/db-schema/mod.js.map +1 -0
  158. package/dist/schema/mod.d.ts +1 -0
  159. package/dist/schema/mod.d.ts.map +1 -1
  160. package/dist/schema/mod.js +1 -0
  161. package/dist/schema/mod.js.map +1 -1
  162. package/dist/schema/mutations.d.ts +4 -8
  163. package/dist/schema/mutations.d.ts.map +1 -1
  164. package/dist/schema/mutations.js +2 -2
  165. package/dist/schema/mutations.js.map +1 -1
  166. package/dist/schema/schema-helpers.js +1 -1
  167. package/dist/schema/schema-helpers.js.map +1 -1
  168. package/dist/schema/schema.d.ts +1 -1
  169. package/dist/schema/schema.d.ts.map +1 -1
  170. package/dist/schema/schema.js +1 -1
  171. package/dist/schema/schema.js.map +1 -1
  172. package/dist/schema/system-tables.d.ts +47 -29
  173. package/dist/schema/system-tables.d.ts.map +1 -1
  174. package/dist/schema/system-tables.js +10 -7
  175. package/dist/schema/system-tables.js.map +1 -1
  176. package/dist/schema/table-def.d.ts +18 -14
  177. package/dist/schema/table-def.d.ts.map +1 -1
  178. package/dist/schema/table-def.js +3 -4
  179. package/dist/schema/table-def.js.map +1 -1
  180. package/dist/schema-management/migrations.d.ts +3 -3
  181. package/dist/schema-management/migrations.d.ts.map +1 -1
  182. package/dist/schema-management/migrations.js +7 -2
  183. package/dist/schema-management/migrations.js.map +1 -1
  184. package/dist/sql-queries/sql-queries.d.ts +1 -1
  185. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  186. package/dist/sql-queries/sql-queries.js.map +1 -1
  187. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  188. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  189. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  190. package/dist/sql-queries/types.d.ts +2 -1
  191. package/dist/sql-queries/types.d.ts.map +1 -1
  192. package/dist/sql-queries/types.js.map +1 -1
  193. package/dist/sync/ClientSessionSyncProcessor.d.ts +3 -5
  194. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  195. package/dist/sync/ClientSessionSyncProcessor.js +38 -12
  196. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  197. package/dist/sync/next/facts.js +1 -1
  198. package/dist/sync/next/facts.js.map +1 -1
  199. package/dist/sync/next/history-dag-common.d.ts +2 -0
  200. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  201. package/dist/sync/next/history-dag-common.js +3 -1
  202. package/dist/sync/next/history-dag-common.js.map +1 -1
  203. package/dist/sync/next/history-dag.d.ts.map +1 -1
  204. package/dist/sync/next/history-dag.js +1 -1
  205. package/dist/sync/next/history-dag.js.map +1 -1
  206. package/dist/sync/next/rebase-events.d.ts +3 -1
  207. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  208. package/dist/sync/next/rebase-events.js +5 -3
  209. package/dist/sync/next/rebase-events.js.map +1 -1
  210. package/dist/sync/next/test/compact-events.calculator.test.js +12 -12
  211. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  212. package/dist/sync/next/test/compact-events.test.js +43 -43
  213. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  214. package/dist/sync/next/test/mutation-fixtures.d.ts +11 -11
  215. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  216. package/dist/sync/next/test/mutation-fixtures.js +12 -10
  217. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  218. package/dist/sync/sync.d.ts +2 -2
  219. package/dist/sync/syncstate.d.ts +9 -9
  220. package/dist/sync/syncstate.js +6 -6
  221. package/dist/sync/syncstate.js.map +1 -1
  222. package/dist/sync/syncstate.test.js +18 -16
  223. package/dist/sync/syncstate.test.js.map +1 -1
  224. package/dist/version.d.ts +1 -1
  225. package/dist/version.js +1 -1
  226. package/package.json +2 -3
  227. package/src/adapter-types.ts +35 -17
  228. package/src/derived-mutations.ts +4 -4
  229. package/src/devtools/devtools-bridge.ts +10 -7
  230. package/src/devtools/devtools-messages-client-session.ts +26 -10
  231. package/src/devtools/devtools-messages-common.ts +37 -8
  232. package/src/devtools/devtools-messages-leader.ts +78 -16
  233. package/src/devtools/devtools-messages.ts +2 -2
  234. package/src/index.ts +1 -1
  235. package/src/leader-thread/LeaderSyncProcessor.ts +59 -38
  236. package/src/leader-thread/apply-mutation.ts +15 -5
  237. package/src/leader-thread/connection.ts +48 -3
  238. package/src/leader-thread/leader-worker-devtools.ts +85 -35
  239. package/src/leader-thread/make-leader-thread-layer.ts +29 -9
  240. package/src/leader-thread/mutationlog.ts +8 -6
  241. package/src/leader-thread/recreate-db.ts +19 -10
  242. package/src/leader-thread/types.ts +22 -15
  243. package/src/query-builder/api.ts +4 -4
  244. package/src/query-builder/impl.test.ts +22 -1
  245. package/src/query-builder/impl.ts +2 -2
  246. package/src/query-info.ts +3 -3
  247. package/src/rehydrate-from-mutationlog.ts +8 -6
  248. package/src/schema/EventId.test.ts +3 -3
  249. package/src/schema/EventId.ts +20 -16
  250. package/src/schema/MutationEvent.ts +31 -6
  251. package/src/schema/db-schema/ast/sqlite.ts +142 -0
  252. package/src/schema/db-schema/ast/validate.ts +13 -0
  253. package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  254. package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
  255. package/src/schema/db-schema/dsl/field-defs.ts +242 -0
  256. package/src/schema/db-schema/dsl/mod.ts +195 -0
  257. package/src/schema/db-schema/hash.ts +14 -0
  258. package/src/schema/db-schema/mod.ts +2 -0
  259. package/src/schema/mod.ts +1 -0
  260. package/src/schema/mutations.ts +6 -19
  261. package/src/schema/schema-helpers.ts +1 -1
  262. package/src/schema/schema.ts +2 -2
  263. package/src/schema/system-tables.ts +10 -7
  264. package/src/schema/table-def.ts +17 -16
  265. package/src/schema-management/migrations.ts +10 -6
  266. package/src/sql-queries/sql-queries.ts +1 -1
  267. package/src/sql-queries/sql-query-builder.ts +1 -2
  268. package/src/sql-queries/types.ts +3 -1
  269. package/src/sync/ClientSessionSyncProcessor.ts +44 -14
  270. package/src/sync/next/facts.ts +1 -1
  271. package/src/sync/next/history-dag-common.ts +5 -1
  272. package/src/sync/next/history-dag.ts +1 -1
  273. package/src/sync/next/rebase-events.ts +8 -2
  274. package/src/sync/next/test/compact-events.calculator.test.ts +12 -12
  275. package/src/sync/next/test/compact-events.test.ts +43 -43
  276. package/src/sync/next/test/mutation-fixtures.ts +16 -12
  277. package/src/sync/syncstate.test.ts +19 -17
  278. package/src/sync/syncstate.ts +6 -6
  279. package/src/version.ts +1 -1
  280. package/tsconfig.json +1 -1
@@ -2,8 +2,7 @@ import type { Cause, Queue, Scope, SubscriptionRef, WebChannel } from '@livestor
2
2
  import { Effect, Schema, Stream } from '@livestore/utils/effect'
3
3
 
4
4
  import type * as Devtools from './devtools/index.js'
5
- import type { EventId } from './schema/EventId.js'
6
- import type { LiveStoreSchema, MutationEvent } from './schema/mod.js'
5
+ import type { EventId, LiveStoreSchema, MutationEvent } from './schema/mod.js'
7
6
  import type { InvalidPushError } from './sync/sync.js'
8
7
  import type { PayloadUpstream, SyncState } from './sync/syncstate.js'
9
8
  import type { PreparedBindValues } from './util.js'
@@ -26,7 +25,7 @@ export type SqliteDbChangeset = {
26
25
  apply: () => void
27
26
  }
28
27
 
29
- export type ClientSession = {
28
+ export interface ClientSession {
30
29
  /** SQLite database with synchronous API running in the same thread (usually in-memory) */
31
30
  sqliteDb: SqliteDb
32
31
  devtools: { enabled: false } | { enabled: true; pullLatch: Effect.Latch; pushLatch: Effect.Latch }
@@ -39,18 +38,24 @@ export type ClientSession = {
39
38
  leaderThread: ClientSessionLeaderThreadProxy
40
39
  }
41
40
 
42
- export type ClientSessionLeaderThreadProxy = {
41
+ export interface ClientSessionLeaderThreadProxy {
43
42
  mutations: {
44
43
  pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
45
44
  push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
46
- initialMutationEventId: EventId
45
+ }
46
+ /** The initial state after the leader thread has booted */
47
+ readonly initialState: {
48
+ /** The latest mutation event id during boot. Used for the client session to resume syncing. */
49
+ readonly leaderHead: EventId.EventId
50
+ /** The migrations report from the leader thread */
51
+ readonly migrationsReport: MigrationsReport
47
52
  }
48
53
  export: Effect.Effect<Uint8Array, UnexpectedError>
49
54
  getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
50
55
  getSyncState: Effect.Effect<SyncState, UnexpectedError>
51
56
  networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
52
57
  /** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
53
- sendDevtoolsMessage: (message: Devtools.MessageToAppLeader) => Effect.Effect<void, UnexpectedError>
58
+ sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void, UnexpectedError>
54
59
  }
55
60
 
56
61
  /**
@@ -58,7 +63,7 @@ export type ClientSessionLeaderThreadProxy = {
58
63
  * Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
59
64
  * Can be either in-memory or persisted to disk.
60
65
  */
61
- export type SqliteDb<TReq = any, TMetadata extends TReq = TReq> = {
66
+ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
62
67
  _tag: 'SqliteDb'
63
68
  metadata: TMetadata
64
69
  prepare(queryStr: string): PreparedStatement
@@ -102,12 +107,11 @@ export type ResetMode = 'all-data' | 'only-app-db'
102
107
  export const NetworkStatus = Schema.Struct({
103
108
  isConnected: Schema.Boolean,
104
109
  timestampMs: Schema.Number,
110
+ /** Whether the network status devtools latch is closed. Used to simulate network disconnection. */
111
+ latchClosed: Schema.Boolean,
105
112
  })
106
113
 
107
- export type NetworkStatus = {
108
- isConnected: boolean
109
- timestampMs: number
110
- }
114
+ export type NetworkStatus = typeof NetworkStatus.Type
111
115
 
112
116
  export const BootStateProgress = Schema.Struct({
113
117
  done: Schema.Number,
@@ -199,7 +203,7 @@ export type MigrationHooks = {
199
203
 
200
204
  export type MigrationHook = (db: SqliteDb) => void | Promise<void> | Effect.Effect<void, unknown>
201
205
 
202
- export type MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = LiveStoreSchema> = {
206
+ export interface MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = LiveStoreSchema> {
203
207
  strategy: 'from-mutation-log'
204
208
  /**
205
209
  * Mutations to exclude in the mutation log
@@ -213,13 +217,11 @@ export type MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = Li
213
217
  }
214
218
  }
215
219
 
216
- export type StoreDevtoolsChannel = WebChannel.WebChannel<
217
- Devtools.MessageToAppClientSession,
218
- Devtools.MessageFromAppClientSession
219
- >
220
+ export interface ClientSessionDevtoolsChannel
221
+ extends WebChannel.WebChannel<Devtools.ClientSession.MessageToApp, Devtools.ClientSession.MessageFromApp> {}
220
222
 
221
223
  export type ConnectDevtoolsToStore = (
222
- storeDevtoolsChannel: StoreDevtoolsChannel,
224
+ storeDevtoolsChannel: ClientSessionDevtoolsChannel,
223
225
  ) => Effect.Effect<void, UnexpectedError, Scope.Scope>
224
226
 
225
227
  export type Adapter = (opts: {
@@ -231,3 +233,19 @@ export type Adapter = (opts: {
231
233
  shutdown: (cause: Cause.Cause<any>) => Effect.Effect<void>
232
234
  connectDevtoolsToStore: ConnectDevtoolsToStore
233
235
  }) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
236
+
237
+ export const MigrationsReportEntry = Schema.Struct({
238
+ tableName: Schema.String,
239
+ hashes: Schema.Struct({
240
+ expected: Schema.Number,
241
+ actual: Schema.optional(Schema.Number),
242
+ }),
243
+ })
244
+
245
+ export const MigrationsReport = Schema.Struct({
246
+ migrations: Schema.Array(MigrationsReportEntry),
247
+ })
248
+
249
+ export type MigrationsReport = typeof MigrationsReport.Type
250
+
251
+ export type MigrationsReportEntry = typeof MigrationsReportEntry.Type
@@ -1,7 +1,7 @@
1
- import type { SqliteDsl } from '@livestore/db-schema'
2
1
  import type { GetValForKey } from '@livestore/utils'
3
2
  import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
4
3
 
4
+ import type { SqliteDsl } from './schema/db-schema/mod.js'
5
5
  import type * as MutationEvent from './schema/MutationEvent.js'
6
6
  import { defineMutation } from './schema/mutations.js'
7
7
  import { getDefaultValuesDecoded } from './schema/schema-helpers.js'
@@ -54,7 +54,7 @@ export const deriveCreateMutationDef = <
54
54
 
55
55
  return { sql, bindValues, writeTables: new Set([tableName]) }
56
56
  },
57
- { localOnly: table.options.deriveMutations.localOnly },
57
+ { clientOnly: table.options.deriveMutations.clientOnly },
58
58
  )
59
59
  }
60
60
 
@@ -84,7 +84,7 @@ export const deriveUpdateMutationDef = <
84
84
 
85
85
  return { sql, bindValues, writeTables: new Set([tableName]) }
86
86
  },
87
- { localOnly: table.options.deriveMutations.localOnly },
87
+ { clientOnly: table.options.deriveMutations.clientOnly },
88
88
  )
89
89
  }
90
90
 
@@ -112,7 +112,7 @@ export const deriveDeleteMutationDef = <
112
112
 
113
113
  return { sql, bindValues, writeTables: new Set([tableName]) }
114
114
  },
115
- { localOnly: table.options.deriveMutations.localOnly },
115
+ { clientOnly: table.options.deriveMutations.clientOnly },
116
116
  )
117
117
  }
118
118
 
@@ -1,14 +1,17 @@
1
- import type { Effect, PubSub } from '@livestore/utils/effect'
1
+ import type { Effect, WebChannel } from '@livestore/utils/effect'
2
2
 
3
3
  import type * as Devtools from './devtools-messages.js'
4
4
 
5
5
  export type PrepareDevtoolsBridge = {
6
- /** Messages coming from the app host (usually responses to requests) */
7
- responsePubSub: PubSub.PubSub<Devtools.MessageFromAppLeader | Devtools.MessageFromAppClientSession>
8
- sendToAppHost: (msg: Devtools.MessageToAppLeader | Devtools.MessageToAppClientSession) => Effect.Effect<void>
9
- clientId: string
10
- sessionId: string
6
+ webchannels: {
7
+ leader: WebChannel.WebChannel<Devtools.Leader.MessageFromApp, Devtools.Leader.MessageToApp>
8
+ clientSession: WebChannel.WebChannel<Devtools.ClientSession.MessageFromApp, Devtools.ClientSession.MessageToApp>
9
+ }
10
+ clientInfo: {
11
+ clientId: string
12
+ sessionId: string
13
+ isLeader: boolean
14
+ }
11
15
  copyToClipboard: (text: string) => Effect.Effect<void>
12
16
  sendEscapeKey?: Effect.Effect<void>
13
- isLeader: boolean
14
17
  }
@@ -1,8 +1,9 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
3
  import { DebugInfo } from '../debug-info.js'
4
+ import { EventId } from '../schema/mod.js'
4
5
  import { PreparedBindValues } from '../util.js'
5
- import { Disconnect, LSDClientSessionReqResMessage } from './devtools-messages-common.js'
6
+ import { LSDClientSessionChannelMessage, LSDClientSessionReqResMessage } from './devtools-messages-common.js'
6
7
 
7
8
  export class DebugInfoReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoReq', {}) {}
8
9
 
@@ -39,6 +40,13 @@ export class DebugInfoRerunQueryRes extends LSDClientSessionReqResMessage(
39
40
  {},
40
41
  ) {}
41
42
 
43
+ export class SyncHeadSubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadSubscribe', {}) {}
44
+ export class SyncHeadUnsubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadUnsubscribe', {}) {}
45
+ export class SyncHeadRes extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadRes', {
46
+ local: EventId.EventId,
47
+ upstream: EventId.EventId,
48
+ }) {}
49
+
42
50
  export class ReactivityGraphSubscribe extends LSDClientSessionReqResMessage(
43
51
  'LSD.ClientSession.ReactivityGraphSubscribe',
44
52
  {
@@ -78,7 +86,13 @@ export class LiveQueriesRes extends LSDClientSessionReqResMessage('LSD.ClientSes
78
86
  liveQueries: Schema.Array(SerializedLiveQuery),
79
87
  }) {}
80
88
 
81
- export const MessageToAppClientSession = Schema.Union(
89
+ export class Ping extends LSDClientSessionReqResMessage('LSD.ClientSession.Ping', {}) {}
90
+
91
+ export class Pong extends LSDClientSessionReqResMessage('LSD.ClientSession.Pong', {}) {}
92
+
93
+ export class Disconnect extends LSDClientSessionChannelMessage('LSD.ClientSession.Disconnect', {}) {}
94
+
95
+ export const MessageToApp = Schema.Union(
82
96
  DebugInfoReq,
83
97
  DebugInfoHistorySubscribe,
84
98
  DebugInfoHistoryUnsubscribe,
@@ -89,13 +103,14 @@ export const MessageToAppClientSession = Schema.Union(
89
103
  LiveQueriesSubscribe,
90
104
  LiveQueriesUnsubscribe,
91
105
  Disconnect,
92
- // TODO also introduce a ping/pong protocol for the client session <> devtools connection
93
- // Ping,
94
- ).annotations({ identifier: 'LSD.MessageToAppClientSession' })
106
+ Ping,
107
+ SyncHeadSubscribe,
108
+ SyncHeadUnsubscribe,
109
+ ).annotations({ identifier: 'LSD.ClientSession.MessageToApp' })
95
110
 
96
- export type MessageToAppClientSession = typeof MessageToAppClientSession.Type
111
+ export type MessageToApp = typeof MessageToApp.Type
97
112
 
98
- export const MessageFromAppClientSession = Schema.Union(
113
+ export const MessageFromApp = Schema.Union(
99
114
  DebugInfoRes,
100
115
  DebugInfoHistoryRes,
101
116
  DebugInfoResetRes,
@@ -103,7 +118,8 @@ export const MessageFromAppClientSession = Schema.Union(
103
118
  ReactivityGraphRes,
104
119
  LiveQueriesRes,
105
120
  Disconnect,
106
- // Pong,
107
- ).annotations({ identifier: 'LSD.MessageFromAppClientSession' })
121
+ Pong,
122
+ SyncHeadRes,
123
+ ).annotations({ identifier: 'LSD.ClientSession.MessageFromApp' })
108
124
 
109
- export type MessageFromAppClientSession = typeof MessageFromAppClientSession.Type
125
+ export type MessageFromApp = typeof MessageFromApp.Type
@@ -2,10 +2,10 @@ import { Schema } from '@livestore/utils/effect'
2
2
 
3
3
  import { liveStoreVersion as pkgVersion } from '../version.js'
4
4
 
5
- const requestId = Schema.String
6
- const clientId = Schema.String
7
- const sessionId = Schema.String
8
- const liveStoreVersion = Schema.Literal(pkgVersion)
5
+ export const requestId = Schema.String
6
+ export const clientId = Schema.String
7
+ export const sessionId = Schema.String
8
+ export const liveStoreVersion = Schema.Literal(pkgVersion)
9
9
 
10
10
  export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
11
11
  Schema.TaggedStruct(tag, {
@@ -15,6 +15,7 @@ export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fiel
15
15
 
16
16
  export const LSDChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
17
17
  LSDMessage(tag, {
18
+ clientId,
18
19
  ...fields,
19
20
  })
20
21
 
@@ -45,8 +46,36 @@ export const LSDReqResMessage = <Tag extends string, Fields extends Schema.Struc
45
46
  ...fields,
46
47
  })
47
48
 
48
- export class Disconnect extends LSDClientSessionChannelMessage('LSD.Disconnect', {}) {}
49
-
50
- export class Ping extends LSDReqResMessage('LSD.Ping', {}) {}
49
+ type DefaultFields = {
50
+ readonly requestId: typeof Schema.String
51
+ readonly liveStoreVersion: typeof liveStoreVersion
52
+ readonly clientId: typeof Schema.String
53
+ }
51
54
 
52
- export class Pong extends LSDReqResMessage('LSD.Pong', {}) {}
55
+ export const LeaderReqResMessage = <
56
+ Tag extends string,
57
+ ReqFields extends Schema.Struct.Fields,
58
+ ResFields extends Schema.Struct.Fields,
59
+ >(
60
+ tag: Tag,
61
+ fields: {
62
+ payload: ReqFields
63
+ success: ResFields
64
+ },
65
+ ): {
66
+ Request: Schema.TaggedStruct<`${Tag}.Request`, ReqFields & DefaultFields>
67
+ Response: Schema.TaggedStruct<`${Tag}.Response`, ResFields & DefaultFields>
68
+ } => {
69
+ return {
70
+ Request: Schema.TaggedStruct(`${tag}.Request`, {
71
+ requestId,
72
+ liveStoreVersion,
73
+ ...fields.payload,
74
+ }).annotations({ identifier: `${tag}.Request` }),
75
+ Response: Schema.TaggedStruct(`${tag}.Response`, {
76
+ requestId,
77
+ liveStoreVersion,
78
+ ...fields.success,
79
+ }).annotations({ identifier: `${tag}.Response` }),
80
+ } as any
81
+ }
@@ -1,15 +1,21 @@
1
1
  import { Schema, Transferable } from '@livestore/utils/effect'
2
2
 
3
- import { NetworkStatus } from '../adapter-types.js'
3
+ import { NetworkStatus, UnexpectedError } from '../adapter-types.js'
4
+ import { EventId } from '../schema/mod.js'
4
5
  import * as MutationEvent from '../schema/MutationEvent.js'
5
- import { Disconnect, LSDMessage, LSDReqResMessage, Ping, Pong } from './devtools-messages-common.js'
6
+ import * as SyncState from '../sync/syncstate.js'
7
+ import {
8
+ LeaderReqResMessage,
9
+ liveStoreVersion,
10
+ LSDMessage,
11
+ LSDReqResMessage,
12
+ requestId,
13
+ } from './devtools-messages-common.js'
6
14
 
7
15
  export class ResetAllDataReq extends LSDReqResMessage('LSD.Leader.ResetAllDataReq', {
8
16
  mode: Schema.Literal('all-data', 'only-app-db'),
9
17
  }) {}
10
18
 
11
- export class ResetAllDataRes extends LSDReqResMessage('LSD.Leader.ResetAllDataRes', {}) {}
12
-
13
19
  export class DatabaseFileInfoReq extends LSDReqResMessage('LSD.Leader.DatabaseFileInfoReq', {}) {}
14
20
 
15
21
  export class DatabaseFileInfo extends Schema.Struct({
@@ -47,6 +53,13 @@ export class SyncHistoryRes extends LSDReqResMessage('LSD.Leader.SyncHistoryRes'
47
53
  metadata: Schema.Option(Schema.JsonValue),
48
54
  }) {}
49
55
 
56
+ export class SyncHeadSubscribe extends LSDReqResMessage('LSD.Leader.SyncHeadSubscribe', {}) {}
57
+ export class SyncHeadUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHeadUnsubscribe', {}) {}
58
+ export class SyncHeadRes extends LSDReqResMessage('LSD.Leader.SyncHeadRes', {
59
+ local: EventId.EventId,
60
+ upstream: EventId.EventId,
61
+ }) {}
62
+
50
63
  export class SnapshotReq extends LSDReqResMessage('LSD.Leader.SnapshotReq', {}) {}
51
64
 
52
65
  export class SnapshotRes extends LSDReqResMessage('LSD.Leader.SnapshotRes', {
@@ -62,13 +75,13 @@ export class LoadDatabaseFileRes extends LSDReqResMessage('LSD.Leader.LoadDataba
62
75
  }) {}
63
76
 
64
77
  // TODO refactor this to use push/pull semantics
65
- export class MutationBroadcast extends LSDMessage('LSD.Leader.MutationBroadcast', {
66
- mutationEventEncoded: MutationEvent.AnyEncoded,
78
+ export class SyncPull extends LSDMessage('LSD.Leader.SyncPull', {
79
+ payload: SyncState.PayloadUpstream,
67
80
  }) {}
68
81
 
69
82
  // TODO refactor this to use push/pull semantics
70
83
  export class RunMutationReq extends LSDReqResMessage('LSD.Leader.RunMutationReq', {
71
- mutationEventEncoded: MutationEvent.AnyEncoded.pipe(Schema.omit('id', 'parentId')),
84
+ mutationEventEncoded: MutationEvent.PartialAnyEncoded,
72
85
  }) {}
73
86
 
74
87
  export class RunMutationRes extends LSDReqResMessage('LSD.Leader.RunMutationRes', {}) {}
@@ -79,11 +92,55 @@ export class MutationLogRes extends LSDReqResMessage('LSD.Leader.MutationLogRes'
79
92
  mutationLog: Transferable.Uint8Array,
80
93
  }) {}
81
94
 
82
- export const MessageToAppLeader = Schema.Union(
95
+ export class Ping extends LSDReqResMessage('LSD.Leader.Ping', {}) {}
96
+
97
+ export class Pong extends LSDReqResMessage('LSD.Leader.Pong', {}) {}
98
+
99
+ export class Disconnect extends LSDReqResMessage('LSD.Leader.Disconnect', {}) {}
100
+
101
+ export const SetSyncLatch = LeaderReqResMessage('LSD.Leader.SetSyncLatch', {
102
+ payload: {
103
+ closeLatch: Schema.Boolean,
104
+ },
105
+ success: {},
106
+ })
107
+
108
+ export const ResetAllData = LeaderReqResMessage('LSD.Leader.ResetAllData', {
109
+ payload: {
110
+ mode: Schema.Literal('all-data', 'only-app-db'),
111
+ },
112
+ success: {},
113
+ })
114
+
115
+ // TODO move to `Schema.TaggedRequest` once new RPC is ready https://github.com/Effect-TS/effect/pull/4362
116
+ export class DatabaseFileInfo_ extends Schema.TaggedRequest<DatabaseFileInfo_>()('LSD.Leader.DatabaseFileInfo', {
117
+ payload: {
118
+ requestId,
119
+ liveStoreVersion,
120
+ },
121
+ success: DatabaseFileInfo,
122
+ failure: UnexpectedError,
123
+ }) {}
124
+
125
+ export class NetworkStatus_ extends Schema.TaggedRequest<NetworkStatus_>()('LSD.Leader.NetworkStatus', {
126
+ payload: {
127
+ requestId,
128
+ liveStoreVersion,
129
+ },
130
+ success: NetworkStatus,
131
+ failure: UnexpectedError,
132
+ }) {}
133
+
134
+ export const MessageToApp_ = Schema.Union(DatabaseFileInfo_, NetworkStatus_)
135
+
136
+ export type MessageToApp_ = typeof MessageToApp_.Type
137
+ //
138
+
139
+ export const MessageToApp = Schema.Union(
83
140
  SnapshotReq,
84
141
  LoadDatabaseFileReq,
85
142
  MutationLogReq,
86
- ResetAllDataReq,
143
+ ResetAllData.Request,
87
144
  NetworkStatusSubscribe,
88
145
  NetworkStatusUnsubscribe,
89
146
  Disconnect,
@@ -93,23 +150,28 @@ export const MessageToAppLeader = Schema.Union(
93
150
  SyncHistorySubscribe,
94
151
  SyncHistoryUnsubscribe,
95
152
  SyncingInfoReq,
96
- ).annotations({ identifier: 'LSD.MessageToAppLeader' })
153
+ SyncHeadSubscribe,
154
+ SyncHeadUnsubscribe,
155
+ SetSyncLatch.Request,
156
+ ).annotations({ identifier: 'LSD.Leader.MessageToApp' })
97
157
 
98
- export type MessageToAppLeader = typeof MessageToAppLeader.Type
158
+ export type MessageToApp = typeof MessageToApp.Type
99
159
 
100
- export const MessageFromAppLeader = Schema.Union(
160
+ export const MessageFromApp = Schema.Union(
101
161
  SnapshotRes,
102
162
  LoadDatabaseFileRes,
103
163
  MutationLogRes,
104
- ResetAllDataRes,
105
164
  Disconnect,
106
- MutationBroadcast,
165
+ SyncPull,
107
166
  NetworkStatusRes,
108
167
  RunMutationRes,
109
168
  Pong,
110
169
  DatabaseFileInfoRes,
111
170
  SyncHistoryRes,
112
171
  SyncingInfoRes,
113
- ).annotations({ identifier: 'LSD.MessageFromAppLeader' })
172
+ SyncHeadRes,
173
+ ResetAllData.Response,
174
+ SetSyncLatch.Response,
175
+ ).annotations({ identifier: 'LSD.Leader.MessageFromApp' })
114
176
 
115
- export type MessageFromAppLeader = typeof MessageFromAppLeader.Type
177
+ export type MessageFromApp = typeof MessageFromApp.Type
@@ -1,3 +1,3 @@
1
- export * from './devtools-messages-client-session.js'
2
- export * from './devtools-messages-leader.js'
1
+ export * as ClientSession from './devtools-messages-client-session.js'
2
+ export * as Leader from './devtools-messages-leader.js'
3
3
  export * from './devtools-messages-common.js'
package/src/index.ts CHANGED
@@ -13,5 +13,5 @@ export * from './debug-info.js'
13
13
  export * from './bounded-collections.js'
14
14
  export * from './version.js'
15
15
  export * from './query-builder/mod.js'
16
- export * from './sync/syncstate.js'
16
+ export * as SyncState from './sync/syncstate.js'
17
17
  export * from './otel.js'