@livestore/common 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0 → 0.0.0-snapshot-8115ad48d5a57244358c943ecc92bb0a30274b87

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 (272) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +34 -13
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +20 -2
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts +1 -1
  11. package/dist/bounded-collections.d.ts.map +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  16. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  17. package/dist/devtools/devtools-messages-leader.d.ts +45 -45
  18. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.js +11 -11
  20. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  21. package/dist/index.d.ts +2 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -5
  24. package/dist/index.js.map +1 -1
  25. package/dist/leader-thread/LeaderSyncProcessor.d.ts +25 -12
  26. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  27. package/dist/leader-thread/LeaderSyncProcessor.js +146 -98
  28. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  29. package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
  30. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  31. package/dist/leader-thread/{apply-mutation.js → apply-event.js} +45 -45
  32. package/dist/leader-thread/apply-event.js.map +1 -0
  33. package/dist/leader-thread/eventlog.d.ts +27 -0
  34. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  35. package/dist/leader-thread/eventlog.js +123 -0
  36. package/dist/leader-thread/eventlog.js.map +1 -0
  37. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  38. package/dist/leader-thread/leader-worker-devtools.js +21 -19
  39. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  40. package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
  41. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  42. package/dist/leader-thread/make-leader-thread-layer.js +23 -16
  43. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  44. package/dist/leader-thread/mod.d.ts +1 -1
  45. package/dist/leader-thread/mod.d.ts.map +1 -1
  46. package/dist/leader-thread/mod.js +1 -1
  47. package/dist/leader-thread/mod.js.map +1 -1
  48. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  49. package/dist/leader-thread/recreate-db.js +6 -7
  50. package/dist/leader-thread/recreate-db.js.map +1 -1
  51. package/dist/leader-thread/types.d.ts +14 -15
  52. package/dist/leader-thread/types.d.ts.map +1 -1
  53. package/dist/materializer-helper.d.ts +23 -0
  54. package/dist/materializer-helper.d.ts.map +1 -0
  55. package/dist/materializer-helper.js +70 -0
  56. package/dist/materializer-helper.js.map +1 -0
  57. package/dist/query-builder/api.d.ts +56 -51
  58. package/dist/query-builder/api.d.ts.map +1 -1
  59. package/dist/query-builder/api.js +3 -5
  60. package/dist/query-builder/api.js.map +1 -1
  61. package/dist/query-builder/astToSql.d.ts.map +1 -1
  62. package/dist/query-builder/astToSql.js +59 -37
  63. package/dist/query-builder/astToSql.js.map +1 -1
  64. package/dist/query-builder/impl.d.ts +2 -3
  65. package/dist/query-builder/impl.d.ts.map +1 -1
  66. package/dist/query-builder/impl.js +48 -46
  67. package/dist/query-builder/impl.js.map +1 -1
  68. package/dist/query-builder/impl.test.d.ts +86 -1
  69. package/dist/query-builder/impl.test.d.ts.map +1 -1
  70. package/dist/query-builder/impl.test.js +223 -36
  71. package/dist/query-builder/impl.test.js.map +1 -1
  72. package/dist/rehydrate-from-eventlog.d.ts +15 -0
  73. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  74. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +26 -25
  75. package/dist/rehydrate-from-eventlog.js.map +1 -0
  76. package/dist/schema/EventDef.d.ts +136 -0
  77. package/dist/schema/EventDef.d.ts.map +1 -0
  78. package/dist/schema/EventDef.js +58 -0
  79. package/dist/schema/EventDef.js.map +1 -0
  80. package/dist/schema/EventId.d.ts +7 -2
  81. package/dist/schema/EventId.d.ts.map +1 -1
  82. package/dist/schema/EventId.js +18 -3
  83. package/dist/schema/EventId.js.map +1 -1
  84. package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
  85. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  86. package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
  87. package/dist/schema/LiveStoreEvent.js.map +1 -0
  88. package/dist/schema/client-document-def.d.ts +223 -0
  89. package/dist/schema/client-document-def.d.ts.map +1 -0
  90. package/dist/schema/client-document-def.js +170 -0
  91. package/dist/schema/client-document-def.js.map +1 -0
  92. package/dist/schema/client-document-def.test.d.ts +2 -0
  93. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  94. package/dist/schema/client-document-def.test.js +201 -0
  95. package/dist/schema/client-document-def.test.js.map +1 -0
  96. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  97. package/dist/schema/events.d.ts +2 -0
  98. package/dist/schema/events.d.ts.map +1 -0
  99. package/dist/schema/events.js +2 -0
  100. package/dist/schema/events.js.map +1 -0
  101. package/dist/schema/mod.d.ts +4 -3
  102. package/dist/schema/mod.d.ts.map +1 -1
  103. package/dist/schema/mod.js +4 -3
  104. package/dist/schema/mod.js.map +1 -1
  105. package/dist/schema/schema.d.ts +26 -22
  106. package/dist/schema/schema.d.ts.map +1 -1
  107. package/dist/schema/schema.js +45 -43
  108. package/dist/schema/schema.js.map +1 -1
  109. package/dist/schema/sqlite-state.d.ts +12 -0
  110. package/dist/schema/sqlite-state.d.ts.map +1 -0
  111. package/dist/schema/sqlite-state.js +36 -0
  112. package/dist/schema/sqlite-state.js.map +1 -0
  113. package/dist/schema/system-tables.d.ts +67 -98
  114. package/dist/schema/system-tables.d.ts.map +1 -1
  115. package/dist/schema/system-tables.js +62 -48
  116. package/dist/schema/system-tables.js.map +1 -1
  117. package/dist/schema/table-def.d.ts +26 -96
  118. package/dist/schema/table-def.d.ts.map +1 -1
  119. package/dist/schema/table-def.js +14 -64
  120. package/dist/schema/table-def.js.map +1 -1
  121. package/dist/schema/view.d.ts +3 -0
  122. package/dist/schema/view.d.ts.map +1 -0
  123. package/dist/schema/view.js +3 -0
  124. package/dist/schema/view.js.map +1 -0
  125. package/dist/schema-management/common.d.ts +4 -4
  126. package/dist/schema-management/common.d.ts.map +1 -1
  127. package/dist/schema-management/migrations.d.ts.map +1 -1
  128. package/dist/schema-management/migrations.js +6 -6
  129. package/dist/schema-management/migrations.js.map +1 -1
  130. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  131. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  132. package/dist/schema-management/validate-mutation-defs.js +17 -17
  133. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  134. package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
  135. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  136. package/dist/sync/ClientSessionSyncProcessor.js +33 -30
  137. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  138. package/dist/sync/next/facts.d.ts +19 -19
  139. package/dist/sync/next/facts.d.ts.map +1 -1
  140. package/dist/sync/next/facts.js +2 -2
  141. package/dist/sync/next/facts.js.map +1 -1
  142. package/dist/sync/next/history-dag-common.d.ts +3 -3
  143. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  144. package/dist/sync/next/history-dag-common.js +1 -1
  145. package/dist/sync/next/history-dag-common.js.map +1 -1
  146. package/dist/sync/next/history-dag.js +1 -1
  147. package/dist/sync/next/history-dag.js.map +1 -1
  148. package/dist/sync/next/rebase-events.d.ts +7 -7
  149. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  150. package/dist/sync/next/rebase-events.js +5 -5
  151. package/dist/sync/next/rebase-events.js.map +1 -1
  152. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  153. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  154. package/dist/sync/next/test/compact-events.test.js +71 -71
  155. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  156. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  157. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  158. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  159. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  160. package/dist/sync/next/test/mod.d.ts +1 -1
  161. package/dist/sync/next/test/mod.d.ts.map +1 -1
  162. package/dist/sync/next/test/mod.js +1 -1
  163. package/dist/sync/next/test/mod.js.map +1 -1
  164. package/dist/sync/sync.d.ts +3 -3
  165. package/dist/sync/sync.d.ts.map +1 -1
  166. package/dist/sync/syncstate.d.ts +30 -30
  167. package/dist/sync/syncstate.d.ts.map +1 -1
  168. package/dist/sync/syncstate.js +73 -40
  169. package/dist/sync/syncstate.js.map +1 -1
  170. package/dist/sync/syncstate.test.js +175 -184
  171. package/dist/sync/syncstate.test.js.map +1 -1
  172. package/dist/sync/validate-push-payload.d.ts +2 -2
  173. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  174. package/dist/sync/validate-push-payload.js.map +1 -1
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +1 -1
  177. package/package.json +3 -3
  178. package/src/__tests__/fixture.ts +36 -15
  179. package/src/adapter-types.ts +33 -13
  180. package/src/debug-info.ts +1 -0
  181. package/src/devtools/devtools-messages-leader.ts +13 -13
  182. package/src/index.ts +2 -5
  183. package/src/leader-thread/LeaderSyncProcessor.ts +210 -138
  184. package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +61 -61
  185. package/src/leader-thread/eventlog.ts +199 -0
  186. package/src/leader-thread/leader-worker-devtools.ts +22 -19
  187. package/src/leader-thread/make-leader-thread-layer.ts +51 -29
  188. package/src/leader-thread/mod.ts +1 -1
  189. package/src/leader-thread/recreate-db.ts +6 -8
  190. package/src/leader-thread/types.ts +15 -16
  191. package/src/materializer-helper.ts +110 -0
  192. package/src/query-builder/api.ts +77 -103
  193. package/src/query-builder/astToSql.ts +68 -39
  194. package/src/query-builder/impl.test.ts +239 -42
  195. package/src/query-builder/impl.ts +72 -56
  196. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +35 -38
  197. package/src/schema/EventDef.ts +216 -0
  198. package/src/schema/EventId.ts +23 -4
  199. package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
  200. package/src/schema/client-document-def.test.ts +239 -0
  201. package/src/schema/client-document-def.ts +444 -0
  202. package/src/schema/db-schema/dsl/mod.ts +0 -1
  203. package/src/schema/events.ts +1 -0
  204. package/src/schema/mod.ts +4 -3
  205. package/src/schema/schema.ts +78 -68
  206. package/src/schema/sqlite-state.ts +62 -0
  207. package/src/schema/system-tables.ts +42 -53
  208. package/src/schema/table-def.ts +51 -209
  209. package/src/schema/view.ts +2 -0
  210. package/src/schema-management/common.ts +4 -4
  211. package/src/schema-management/migrations.ts +8 -9
  212. package/src/schema-management/validate-mutation-defs.ts +22 -24
  213. package/src/sync/ClientSessionSyncProcessor.ts +41 -36
  214. package/src/sync/next/facts.ts +31 -32
  215. package/src/sync/next/history-dag-common.ts +4 -4
  216. package/src/sync/next/history-dag.ts +1 -1
  217. package/src/sync/next/rebase-events.ts +13 -13
  218. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  219. package/src/sync/next/test/compact-events.test.ts +73 -73
  220. package/src/sync/next/test/event-fixtures.ts +219 -0
  221. package/src/sync/next/test/mod.ts +1 -1
  222. package/src/sync/sync.ts +3 -3
  223. package/src/sync/syncstate.test.ts +180 -189
  224. package/src/sync/syncstate.ts +162 -100
  225. package/src/sync/validate-push-payload.ts +2 -2
  226. package/src/version.ts +1 -1
  227. package/tsconfig.json +1 -0
  228. package/dist/derived-mutations.d.ts +0 -109
  229. package/dist/derived-mutations.d.ts.map +0 -1
  230. package/dist/derived-mutations.js +0 -54
  231. package/dist/derived-mutations.js.map +0 -1
  232. package/dist/derived-mutations.test.d.ts +0 -2
  233. package/dist/derived-mutations.test.d.ts.map +0 -1
  234. package/dist/derived-mutations.test.js +0 -93
  235. package/dist/derived-mutations.test.js.map +0 -1
  236. package/dist/init-singleton-tables.d.ts +0 -4
  237. package/dist/init-singleton-tables.d.ts.map +0 -1
  238. package/dist/init-singleton-tables.js +0 -16
  239. package/dist/init-singleton-tables.js.map +0 -1
  240. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  241. package/dist/leader-thread/apply-mutation.js.map +0 -1
  242. package/dist/leader-thread/mutationlog.d.ts +0 -27
  243. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  244. package/dist/leader-thread/mutationlog.js +0 -124
  245. package/dist/leader-thread/mutationlog.js.map +0 -1
  246. package/dist/mutation.d.ts +0 -20
  247. package/dist/mutation.d.ts.map +0 -1
  248. package/dist/mutation.js +0 -68
  249. package/dist/mutation.js.map +0 -1
  250. package/dist/query-info.d.ts +0 -41
  251. package/dist/query-info.d.ts.map +0 -1
  252. package/dist/query-info.js +0 -7
  253. package/dist/query-info.js.map +0 -1
  254. package/dist/rehydrate-from-mutationlog.d.ts +0 -15
  255. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  256. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  257. package/dist/schema/MutationEvent.d.ts.map +0 -1
  258. package/dist/schema/MutationEvent.js.map +0 -1
  259. package/dist/schema/mutations.d.ts +0 -115
  260. package/dist/schema/mutations.d.ts.map +0 -1
  261. package/dist/schema/mutations.js +0 -42
  262. package/dist/schema/mutations.js.map +0 -1
  263. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  264. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  265. package/src/derived-mutations.test.ts +0 -101
  266. package/src/derived-mutations.ts +0 -170
  267. package/src/init-singleton-tables.ts +0 -24
  268. package/src/leader-thread/mutationlog.ts +0 -202
  269. package/src/mutation.ts +0 -108
  270. package/src/query-info.ts +0 -83
  271. package/src/schema/mutations.ts +0 -193
  272. package/src/sync/next/test/mutation-fixtures.ts +0 -228
@@ -1,9 +1,9 @@
1
- import { casesHandled, shouldNeverHappen } from '@livestore/utils'
1
+ import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
2
  import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import { UnexpectedError } from '../adapter-types.js'
5
5
  import * as EventId from '../schema/EventId.js'
6
- import * as MutationEvent from '../schema/MutationEvent.js'
6
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
7
7
 
8
8
  /**
9
9
  * SyncState represents the current sync state of a sync node relative to an upstream node.
@@ -43,7 +43,7 @@ import * as MutationEvent from '../schema/MutationEvent.js'
43
43
  * handling cases such as upstream rebase, advance and local push.
44
44
  */
45
45
  export class SyncState extends Schema.Class<SyncState>('SyncState')({
46
- pending: Schema.Array(MutationEvent.EncodedWithMeta),
46
+ pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
47
47
  /** What this node expects the next upstream node to have as its own local head */
48
48
  upstreamHead: EventId.EventId,
49
49
  /** Equivalent to `pending.at(-1)?.id` if there are pending events */
@@ -61,17 +61,17 @@ export class SyncState extends Schema.Class<SyncState>('SyncState')({
61
61
  */
62
62
  export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
63
63
  /** Events which need to be rolled back */
64
- rollbackEvents: Schema.Array(MutationEvent.EncodedWithMeta),
64
+ rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
65
65
  /** Events which need to be applied after the rollback (already rebased by the upstream node) */
66
- newEvents: Schema.Array(MutationEvent.EncodedWithMeta),
66
+ newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
67
67
  }) {}
68
68
 
69
69
  export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
70
- newEvents: Schema.Array(MutationEvent.EncodedWithMeta),
70
+ newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
71
71
  }) {}
72
72
 
73
73
  export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
74
- newEvents: Schema.Array(MutationEvent.EncodedWithMeta),
74
+ newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
75
75
  }) {}
76
76
 
77
77
  export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {}
@@ -110,9 +110,9 @@ export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
110
110
  export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeResultAdvance')({
111
111
  _tag: Schema.Literal('advance'),
112
112
  newSyncState: SyncState,
113
- newEvents: Schema.Array(MutationEvent.EncodedWithMeta),
113
+ newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
114
114
  /** Events which were previously pending but are now confirmed */
115
- confirmedEvents: Schema.Array(MutationEvent.EncodedWithMeta),
115
+ confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
116
116
  mergeContext: MergeContext,
117
117
  }) {
118
118
  toJSON = (): any => {
@@ -129,9 +129,9 @@ export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeR
129
129
  export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeResultRebase')({
130
130
  _tag: Schema.Literal('rebase'),
131
131
  newSyncState: SyncState,
132
- newEvents: Schema.Array(MutationEvent.EncodedWithMeta),
132
+ newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
133
133
  /** Events which need to be rolled back */
134
- rollbackEvents: Schema.Array(MutationEvent.EncodedWithMeta),
134
+ rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
135
135
  mergeContext: MergeContext,
136
136
  }) {
137
137
  toJSON = (): any => {
@@ -172,11 +172,16 @@ export class MergeResult extends Schema.Union(
172
172
  MergeResultUnexpectedError,
173
173
  ) {}
174
174
 
175
- const unexpectedError = (cause: unknown): MergeResultUnexpectedError =>
176
- MergeResultUnexpectedError.make({
175
+ const unexpectedError = (cause: unknown): MergeResultUnexpectedError => {
176
+ if (LS_DEV) {
177
+ debugger
178
+ }
179
+
180
+ return MergeResultUnexpectedError.make({
177
181
  _tag: 'unexpected-error',
178
182
  cause: new UnexpectedError({ cause }),
179
183
  })
184
+ }
180
185
 
181
186
  // TODO Idea: call merge recursively through hierarchy levels
182
187
  /*
@@ -194,12 +199,13 @@ export const merge = ({
194
199
  }: {
195
200
  syncState: SyncState
196
201
  payload: typeof Payload.Type
197
- isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean
198
- isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean
202
+ isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
203
+ isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
199
204
  /** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
200
205
  ignoreClientEvents?: boolean
201
206
  }): typeof MergeResult.Type => {
202
207
  validateSyncState(syncState)
208
+ validatePayload(payload)
203
209
 
204
210
  const mergeContext = MergeContext.make({ payload, syncState })
205
211
 
@@ -217,33 +223,37 @@ export const merge = ({
217
223
  isClientEvent,
218
224
  })
219
225
 
220
- return MergeResultRebase.make({
221
- _tag: 'rebase',
222
- newSyncState: new SyncState({
223
- pending: rebasedPending,
224
- upstreamHead: newUpstreamHead,
225
- localHead: rebasedPending.at(-1)?.id ?? newUpstreamHead,
226
+ return validateMergeResult(
227
+ MergeResultRebase.make({
228
+ _tag: 'rebase',
229
+ newSyncState: new SyncState({
230
+ pending: rebasedPending,
231
+ upstreamHead: newUpstreamHead,
232
+ localHead: rebasedPending.at(-1)?.id ?? newUpstreamHead,
233
+ }),
234
+ newEvents: [...payload.newEvents, ...rebasedPending],
235
+ rollbackEvents,
236
+ mergeContext,
226
237
  }),
227
- newEvents: [...payload.newEvents, ...rebasedPending],
228
- rollbackEvents,
229
- mergeContext,
230
- })
238
+ )
231
239
  }
232
240
 
233
241
  // #region upstream-advance
234
242
  case 'upstream-advance': {
235
243
  if (payload.newEvents.length === 0) {
236
- return MergeResultAdvance.make({
237
- _tag: 'advance',
238
- newSyncState: new SyncState({
239
- pending: syncState.pending,
240
- upstreamHead: syncState.upstreamHead,
241
- localHead: syncState.localHead,
244
+ return validateMergeResult(
245
+ MergeResultAdvance.make({
246
+ _tag: 'advance',
247
+ newSyncState: new SyncState({
248
+ pending: syncState.pending,
249
+ upstreamHead: syncState.upstreamHead,
250
+ localHead: syncState.localHead,
251
+ }),
252
+ newEvents: [],
253
+ confirmedEvents: [],
254
+ mergeContext: mergeContext,
242
255
  }),
243
- newEvents: [],
244
- confirmedEvents: [],
245
- mergeContext: mergeContext,
246
- })
256
+ )
247
257
  }
248
258
 
249
259
  // Validate that newEvents are sorted in ascending order by eventId
@@ -265,17 +275,6 @@ export const merge = ({
265
275
  )
266
276
  }
267
277
 
268
- // Validate that the parent id of the first incoming event is known
269
- const knownEventGlobalIds = [...syncState.pending].flatMap((e) => [e.id.global, e.parentId.global])
270
- knownEventGlobalIds.push(syncState.upstreamHead.global)
271
- const firstNewEvent = payload.newEvents[0]!
272
- const hasUnknownParentId = knownEventGlobalIds.includes(firstNewEvent.parentId.global) === false
273
- if (hasUnknownParentId) {
274
- return unexpectedError(
275
- `Incoming events must have a known parent id. Received: [${payload.newEvents.map((e) => EventId.toString(e.id)).join(', ')}]`,
276
- )
277
- }
278
-
279
278
  const newUpstreamHead = payload.newEvents.at(-1)!.id
280
279
 
281
280
  const divergentPendingIndex = findDivergencePoint({
@@ -313,17 +312,19 @@ export const merge = ({
313
312
  },
314
313
  )
315
314
 
316
- return MergeResultAdvance.make({
317
- _tag: 'advance',
318
- newSyncState: new SyncState({
319
- pending: pendingRemaining,
320
- upstreamHead: newUpstreamHead,
321
- localHead: pendingRemaining.at(-1)?.id ?? newUpstreamHead,
315
+ return validateMergeResult(
316
+ MergeResultAdvance.make({
317
+ _tag: 'advance',
318
+ newSyncState: new SyncState({
319
+ pending: pendingRemaining,
320
+ upstreamHead: newUpstreamHead,
321
+ localHead: pendingRemaining.at(-1)?.id ?? EventId.max(syncState.localHead, newUpstreamHead),
322
+ }),
323
+ newEvents,
324
+ confirmedEvents: pendingMatching,
325
+ mergeContext: mergeContext,
322
326
  }),
323
- newEvents,
324
- confirmedEvents: pendingMatching,
325
- mergeContext: mergeContext,
326
- })
327
+ )
327
328
  } else {
328
329
  const divergentPending = syncState.pending.slice(divergentPendingIndex)
329
330
  const rebasedPending = rebaseEvents({
@@ -340,17 +341,19 @@ export const merge = ({
340
341
  ignoreClientEvents,
341
342
  })
342
343
 
343
- return MergeResultRebase.make({
344
- _tag: 'rebase',
345
- newSyncState: new SyncState({
346
- pending: rebasedPending,
347
- upstreamHead: newUpstreamHead,
348
- localHead: rebasedPending.at(-1)!.id,
344
+ return validateMergeResult(
345
+ MergeResultRebase.make({
346
+ _tag: 'rebase',
347
+ newSyncState: new SyncState({
348
+ pending: rebasedPending,
349
+ upstreamHead: newUpstreamHead,
350
+ localHead: rebasedPending.at(-1)!.id,
351
+ }),
352
+ newEvents: [...payload.newEvents.slice(divergentNewEventsIndex), ...rebasedPending],
353
+ rollbackEvents: divergentPending,
354
+ mergeContext,
349
355
  }),
350
- newEvents: [...payload.newEvents.slice(divergentNewEventsIndex), ...rebasedPending],
351
- rollbackEvents: divergentPending,
352
- mergeContext,
353
- })
356
+ )
354
357
  }
355
358
  }
356
359
  // #endregion
@@ -358,13 +361,15 @@ export const merge = ({
358
361
  // This is the same as what's running in the sync backend
359
362
  case 'local-push': {
360
363
  if (payload.newEvents.length === 0) {
361
- return MergeResultAdvance.make({
362
- _tag: 'advance',
363
- newSyncState: syncState,
364
- newEvents: [],
365
- confirmedEvents: [],
366
- mergeContext: mergeContext,
367
- })
364
+ return validateMergeResult(
365
+ MergeResultAdvance.make({
366
+ _tag: 'advance',
367
+ newSyncState: syncState,
368
+ newEvents: [],
369
+ confirmedEvents: [],
370
+ mergeContext: mergeContext,
371
+ }),
372
+ )
368
373
  }
369
374
 
370
375
  const newEventsFirst = payload.newEvents.at(0)!
@@ -372,23 +377,27 @@ export const merge = ({
372
377
 
373
378
  if (invalidEventId) {
374
379
  const expectedMinimumId = EventId.nextPair(syncState.localHead, true).id
375
- return MergeResultReject.make({
376
- _tag: 'reject',
377
- expectedMinimumId,
378
- mergeContext,
379
- })
380
+ return validateMergeResult(
381
+ MergeResultReject.make({
382
+ _tag: 'reject',
383
+ expectedMinimumId,
384
+ mergeContext,
385
+ }),
386
+ )
380
387
  } else {
381
- return MergeResultAdvance.make({
382
- _tag: 'advance',
383
- newSyncState: new SyncState({
384
- pending: [...syncState.pending, ...payload.newEvents],
385
- upstreamHead: syncState.upstreamHead,
386
- localHead: payload.newEvents.at(-1)!.id,
388
+ return validateMergeResult(
389
+ MergeResultAdvance.make({
390
+ _tag: 'advance',
391
+ newSyncState: new SyncState({
392
+ pending: [...syncState.pending, ...payload.newEvents],
393
+ upstreamHead: syncState.upstreamHead,
394
+ localHead: payload.newEvents.at(-1)!.id,
395
+ }),
396
+ newEvents: payload.newEvents,
397
+ confirmedEvents: [],
398
+ mergeContext: mergeContext,
387
399
  }),
388
- newEvents: payload.newEvents,
389
- confirmedEvents: [],
390
- mergeContext: mergeContext,
391
- })
400
+ )
392
401
  }
393
402
  }
394
403
 
@@ -409,10 +418,10 @@ export const findDivergencePoint = ({
409
418
  isClientEvent,
410
419
  ignoreClientEvents,
411
420
  }: {
412
- existingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>
413
- incomingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>
414
- isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean
415
- isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean
421
+ existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
422
+ incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
423
+ isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
424
+ isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
416
425
  ignoreClientEvents: boolean
417
426
  }): number => {
418
427
  if (ignoreClientEvents) {
@@ -444,10 +453,10 @@ const rebaseEvents = ({
444
453
  baseEventId,
445
454
  isClientEvent,
446
455
  }: {
447
- events: ReadonlyArray<MutationEvent.EncodedWithMeta>
456
+ events: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
448
457
  baseEventId: EventId.EventId
449
- isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean
450
- }): ReadonlyArray<MutationEvent.EncodedWithMeta> => {
458
+ isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
459
+ }): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
451
460
  let prevEventId = baseEventId
452
461
  return events.map((event) => {
453
462
  const isLocal = isClientEvent(event)
@@ -466,17 +475,30 @@ const rebaseEvents = ({
466
475
  */
467
476
  const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
468
477
 
478
+ const validatePayload = (payload: typeof Payload.Type) => {
479
+ for (let i = 1; i < payload.newEvents.length; i++) {
480
+ if (EventId.isGreaterThanOrEqual(payload.newEvents[i - 1]!.id, payload.newEvents[i]!.id)) {
481
+ return unexpectedError(
482
+ `Events must be ordered in monotonically ascending order by eventId. Received: [${payload.newEvents.map((e) => EventId.toString(e.id)).join(', ')}]`,
483
+ )
484
+ }
485
+ }
486
+ }
487
+
469
488
  const validateSyncState = (syncState: SyncState) => {
470
489
  for (let i = 0; i < syncState.pending.length; i++) {
471
490
  const event = syncState.pending[i]!
472
491
  const nextEvent = syncState.pending[i + 1]
473
492
  if (nextEvent === undefined) break // Reached end of chain
474
493
 
475
- if (EventId.isGreaterThan(event.id, nextEvent.id)) {
476
- shouldNeverHappen('Events must be sorted in ascending order by eventId', {
477
- event,
478
- nextEvent,
479
- })
494
+ if (EventId.isGreaterThanOrEqual(event.id, nextEvent.id)) {
495
+ shouldNeverHappen(
496
+ `Events must be ordered in monotonically ascending order by eventId. Received: [${syncState.pending.map((e) => EventId.toString(e.id)).join(', ')}]`,
497
+ {
498
+ event,
499
+ nextEvent,
500
+ },
501
+ )
480
502
  }
481
503
 
482
504
  // If the global id has increased, then the client id must be 0
@@ -503,3 +525,43 @@ const validateSyncState = (syncState: SyncState) => {
503
525
  }
504
526
  }
505
527
  }
528
+
529
+ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
530
+ if (mergeResult._tag === 'unexpected-error' || mergeResult._tag === 'reject') return mergeResult
531
+
532
+ validateSyncState(mergeResult.newSyncState)
533
+
534
+ // Ensure local head is always greater than or equal to upstream head
535
+ if (EventId.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
536
+ shouldNeverHappen('Local head must be greater than or equal to upstream head', {
537
+ localHead: mergeResult.newSyncState.localHead,
538
+ upstreamHead: mergeResult.newSyncState.upstreamHead,
539
+ })
540
+ }
541
+
542
+ // Ensure new local head is greater than or equal to the previous local head
543
+ if (
544
+ EventId.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) ===
545
+ false
546
+ ) {
547
+ shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
548
+ localHead: mergeResult.newSyncState.localHead,
549
+ previousLocalHead: mergeResult.mergeContext.syncState.localHead,
550
+ })
551
+ }
552
+
553
+ // Ensure new upstream head is greater than or equal to the previous upstream head
554
+ if (
555
+ EventId.isGreaterThanOrEqual(
556
+ mergeResult.newSyncState.upstreamHead,
557
+ mergeResult.mergeContext.syncState.upstreamHead,
558
+ ) === false
559
+ ) {
560
+ shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
561
+ upstreamHead: mergeResult.newSyncState.upstreamHead,
562
+ previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
563
+ })
564
+ }
565
+
566
+ return mergeResult
567
+ }
@@ -1,11 +1,11 @@
1
1
  import { Effect } from '@livestore/utils/effect'
2
2
 
3
- import type { EventId, MutationEvent } from '../schema/mod.js'
3
+ import type { EventId, LiveStoreEvent } from '../schema/mod.js'
4
4
  import { InvalidPushError } from './sync.js'
5
5
 
6
6
  // TODO proper batch validation
7
7
  export const validatePushPayload = (
8
- batch: ReadonlyArray<MutationEvent.AnyEncodedGlobal>,
8
+ batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>,
9
9
  currentEventId: EventId.GlobalEventId,
10
10
  ) =>
11
11
  Effect.gen(function* () {
package/src/version.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // import packageJson from '../package.json' with { type: 'json' }
3
3
  // export const liveStoreVersion = packageJson.version
4
4
 
5
- export const liveStoreVersion = '0.3.0-dev.26' as const
5
+ export const liveStoreVersion = '0.3.0-dev.28' as const
6
6
 
7
7
  /**
8
8
  * This version number is incremented whenever the internal storage format changes in a breaking way.
package/tsconfig.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "extends": "../../../tsconfig.base.json",
3
3
  "compilerOptions": {
4
+ "lib": ["ES2023"], // Needed for `Array.toSorted`
4
5
  "outDir": "./dist",
5
6
  "rootDir": "./src",
6
7
  "resolveJsonModule": true,
@@ -1,109 +0,0 @@
1
- import type { GetValForKey } from '@livestore/utils';
2
- import type { SqliteDsl } from './schema/db-schema/mod.js';
3
- import type * as MutationEvent from './schema/MutationEvent.js';
4
- import type * as DbSchema from './schema/table-def.js';
5
- export declare const makeDerivedMutationDefsForTable: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
6
- deriveMutations: {
7
- enabled: true;
8
- };
9
- }>>(table: TTableDef) => {
10
- insert: import("./schema/mutations.js").MutationDef<`_Derived_Create_${string}`, {
11
- readonly [x: string]: any;
12
- } & {
13
- readonly [x: string]: any;
14
- }, {
15
- readonly [x: string]: any;
16
- } & {
17
- readonly [x: string]: any;
18
- }>;
19
- update: import("./schema/mutations.js").MutationDef<`_Derived_Update_${string}`, {
20
- readonly values: {
21
- [x: string]: any;
22
- };
23
- readonly where: {
24
- [x: string]: any;
25
- };
26
- }, {
27
- readonly values: {
28
- [x: string]: any;
29
- };
30
- readonly where: {
31
- [x: string]: any;
32
- };
33
- }>;
34
- delete: import("./schema/mutations.js").MutationDef<`_Derived_Delete_${string}`, {
35
- readonly where: {
36
- [x: string]: any;
37
- };
38
- }, {
39
- readonly where: {
40
- [x: string]: any;
41
- };
42
- }>;
43
- };
44
- export declare const deriveCreateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
45
- deriveMutations: {
46
- enabled: true;
47
- };
48
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Create_${string}`, {
49
- readonly [x: string]: any;
50
- } & {
51
- readonly [x: string]: any;
52
- }, {
53
- readonly [x: string]: any;
54
- } & {
55
- readonly [x: string]: any;
56
- }>;
57
- export declare const deriveUpdateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
58
- deriveMutations: {
59
- enabled: true;
60
- };
61
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Update_${string}`, {
62
- readonly values: {
63
- [x: string]: any;
64
- };
65
- readonly where: {
66
- [x: string]: any;
67
- };
68
- }, {
69
- readonly values: {
70
- [x: string]: any;
71
- };
72
- readonly where: {
73
- [x: string]: any;
74
- };
75
- }>;
76
- export declare const deriveDeleteMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
77
- deriveMutations: {
78
- enabled: true;
79
- };
80
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Delete_${string}`, {
81
- readonly where: {
82
- [x: string]: any;
83
- };
84
- }, {
85
- readonly where: {
86
- [x: string]: any;
87
- };
88
- }>;
89
- /**
90
- * Convenience helper functions on top of the derived mutation definitions.
91
- */
92
- export type DerivedMutationHelperFns<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = {
93
- insert: DerivedMutationHelperFns.InsertMutationFn<TColumns, TOptions>;
94
- update: DerivedMutationHelperFns.UpdateMutationFn<TColumns, TOptions>;
95
- delete: DerivedMutationHelperFns.DeleteMutationFn<TColumns, TOptions>;
96
- };
97
- export declare namespace DerivedMutationHelperFns {
98
- export type InsertMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>) => MutationEvent.PartialAnyDecoded : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAnyDecoded>;
99
- export type UpdateMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>) => MutationEvent.PartialAnyDecoded : (args: {
100
- where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
101
- values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
102
- }) => MutationEvent.PartialAnyDecoded>;
103
- export type DeleteMutationFn<TColumns extends SqliteDsl.ConstraintColumns, _TOptions extends DbSchema.TableOptions> = (args: {
104
- where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
105
- }) => MutationEvent.PartialAnyDecoded;
106
- type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true ? TOptions['isSingleton'] extends true ? true : false : false;
107
- export {};
108
- }
109
- //# sourceMappingURL=derived-mutations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.d.ts","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -1,54 +0,0 @@
1
- import { ReadonlyRecord, Schema } from '@livestore/utils/effect';
2
- import { defineMutation } from './schema/mutations.js';
3
- import { getDefaultValuesDecoded } from './schema/schema-helpers.js';
4
- import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js';
5
- export const makeDerivedMutationDefsForTable = (table) => ({
6
- insert: deriveCreateMutationDef(table),
7
- update: deriveUpdateMutationDef(table),
8
- delete: deriveDeleteMutationDef(table),
9
- });
10
- export const deriveCreateMutationDef = (table) => {
11
- const tableName = table.sqliteDef.name;
12
- const [optionalFields, requiredColumns] = ReadonlyRecord.partition(table.sqliteDef.columns, (col) => col.nullable === false && col.default._tag === 'None');
13
- const insertSchema = Schema.Struct(ReadonlyRecord.map(requiredColumns, (col) => col.schema))
14
- .pipe(Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))))
15
- .annotations({ title: `${tableName}:Insert` });
16
- return defineMutation(`_Derived_Create_${tableName}`, insertSchema, ({ id, ...explicitDefaultValues }) => {
17
- const defaultValues = getDefaultValuesDecoded(table, explicitDefaultValues);
18
- const [sql, bindValues] = insertRow({
19
- tableName: table.sqliteDef.name,
20
- columns: table.sqliteDef.columns,
21
- values: { ...defaultValues, id },
22
- });
23
- return { sql, bindValues, writeTables: new Set([tableName]) };
24
- }, { clientOnly: table.options.deriveMutations.clientOnly });
25
- };
26
- export const deriveUpdateMutationDef = (table) => {
27
- const tableName = table.sqliteDef.name;
28
- return defineMutation(`_Derived_Update_${tableName}`, Schema.Struct({
29
- where: Schema.partial(table.schema),
30
- values: Schema.partial(table.schema),
31
- }).annotations({ title: `${tableName}:Update` }), ({ where, values }) => {
32
- const [sql, bindValues] = updateRows({
33
- tableName: table.sqliteDef.name,
34
- columns: table.sqliteDef.columns,
35
- where,
36
- updateValues: values,
37
- });
38
- return { sql, bindValues, writeTables: new Set([tableName]) };
39
- }, { clientOnly: table.options.deriveMutations.clientOnly });
40
- };
41
- export const deriveDeleteMutationDef = (table) => {
42
- const tableName = table.sqliteDef.name;
43
- return defineMutation(`_Derived_Delete_${tableName}`, Schema.Struct({
44
- where: Schema.partial(table.schema),
45
- }), ({ where }) => {
46
- const [sql, bindValues] = deleteRows({
47
- tableName: table.sqliteDef.name,
48
- columns: table.sqliteDef.columns,
49
- where,
50
- });
51
- return { sql, bindValues, writeTables: new Set([tableName]) };
52
- }, { clientOnly: table.options.deriveMutations.clientOnly });
53
- };
54
- //# sourceMappingURL=derived-mutations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.js","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=derived-mutations.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.test.d.ts","sourceRoot":"","sources":["../src/derived-mutations.test.ts"],"names":[],"mappings":""}