@livestore/common 0.4.0-dev.18 → 0.4.0-dev.19

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 (286) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +10 -10
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/adapter-types.d.ts +5 -5
  5. package/dist/adapter-types.d.ts.map +1 -1
  6. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  7. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  8. package/dist/devtools/devtools-messages-client-session.js +2 -2
  9. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  10. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  11. package/dist/devtools/devtools-messages-leader.d.ts +33 -28
  12. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-leader.js +8 -8
  14. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  15. package/dist/errors.d.ts +6 -6
  16. package/dist/errors.d.ts.map +1 -1
  17. package/dist/errors.js +7 -7
  18. package/dist/errors.js.map +1 -1
  19. package/dist/leader-thread/LeaderSyncProcessor.d.ts +2 -2
  20. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  21. package/dist/leader-thread/LeaderSyncProcessor.js +28 -28
  22. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  23. package/dist/leader-thread/eventlog.d.ts +13 -13
  24. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  25. package/dist/leader-thread/eventlog.js +12 -11
  26. package/dist/leader-thread/eventlog.js.map +1 -1
  27. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  28. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  29. package/dist/leader-thread/leader-worker-devtools.js +3 -3
  30. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  31. package/dist/leader-thread/make-leader-thread-layer.d.ts +2 -2
  32. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  33. package/dist/leader-thread/make-leader-thread-layer.js +10 -8
  34. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  35. package/dist/leader-thread/materialize-event.d.ts +1 -1
  36. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  37. package/dist/leader-thread/materialize-event.js +2 -2
  38. package/dist/leader-thread/materialize-event.js.map +1 -1
  39. package/dist/leader-thread/recreate-db.d.ts +2 -2
  40. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  41. package/dist/leader-thread/recreate-db.js +5 -5
  42. package/dist/leader-thread/recreate-db.js.map +1 -1
  43. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  44. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  45. package/dist/leader-thread/shutdown-channel.js +2 -2
  46. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  47. package/dist/leader-thread/types.d.ts +15 -15
  48. package/dist/leader-thread/types.d.ts.map +1 -1
  49. package/dist/make-client-session.d.ts +2 -2
  50. package/dist/make-client-session.d.ts.map +1 -1
  51. package/dist/materializer-helper.d.ts +5 -5
  52. package/dist/materializer-helper.d.ts.map +1 -1
  53. package/dist/materializer-helper.js.map +1 -1
  54. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  55. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  56. package/dist/rematerialize-from-eventlog.js +6 -6
  57. package/dist/rematerialize-from-eventlog.js.map +1 -1
  58. package/dist/schema/EventDef/define.d.ts +147 -0
  59. package/dist/schema/EventDef/define.d.ts.map +1 -0
  60. package/dist/schema/EventDef/define.js +139 -0
  61. package/dist/schema/EventDef/define.js.map +1 -0
  62. package/dist/schema/EventDef/event-def.d.ts +106 -0
  63. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  64. package/dist/schema/EventDef/event-def.js +2 -0
  65. package/dist/schema/EventDef/event-def.js.map +1 -0
  66. package/dist/schema/EventDef/facts.d.ts +118 -0
  67. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  68. package/dist/schema/EventDef/facts.js +53 -0
  69. package/dist/schema/EventDef/facts.js.map +1 -0
  70. package/dist/schema/EventDef/materializer.d.ts +155 -0
  71. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  72. package/dist/schema/EventDef/materializer.js +83 -0
  73. package/dist/schema/EventDef/materializer.js.map +1 -0
  74. package/dist/schema/EventDef/mod.d.ts +5 -0
  75. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  76. package/dist/schema/EventDef/mod.js +5 -0
  77. package/dist/schema/EventDef/mod.js.map +1 -0
  78. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  79. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  80. package/dist/schema/{EventSequenceNumber.js → EventSequenceNumber/client.js} +86 -39
  81. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  82. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  83. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  84. package/dist/schema/EventSequenceNumber/global.js +14 -0
  85. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  86. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  87. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  88. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  89. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  90. package/dist/schema/EventSequenceNumber.test.js +41 -41
  91. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  92. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +84 -101
  93. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  94. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +69 -52
  95. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  96. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  97. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  98. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  99. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  100. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  101. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  102. package/dist/schema/LiveStoreEvent/global.js +31 -0
  103. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  104. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  105. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  106. package/dist/schema/LiveStoreEvent/input.js +26 -0
  107. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  108. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  109. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  110. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  111. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  112. package/dist/schema/events.d.ts +1 -1
  113. package/dist/schema/events.d.ts.map +1 -1
  114. package/dist/schema/events.js +1 -1
  115. package/dist/schema/events.js.map +1 -1
  116. package/dist/schema/mod.d.ts +3 -3
  117. package/dist/schema/mod.d.ts.map +1 -1
  118. package/dist/schema/mod.js +3 -3
  119. package/dist/schema/mod.js.map +1 -1
  120. package/dist/schema/schema.d.ts +1 -1
  121. package/dist/schema/schema.d.ts.map +1 -1
  122. package/dist/schema/state/sqlite/client-document-def.d.ts +1 -1
  123. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  124. package/dist/schema/state/sqlite/client-document-def.js +2 -2
  125. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  126. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  127. package/dist/schema/state/sqlite/column-def.js +13 -0
  128. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  129. package/dist/schema/state/sqlite/column-def.test.js +2 -1
  130. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  131. package/dist/schema/state/sqlite/mod.d.ts +2 -2
  132. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  133. package/dist/schema/state/sqlite/mod.js +1 -1
  134. package/dist/schema/state/sqlite/mod.js.map +1 -1
  135. package/dist/schema/state/sqlite/query-builder/api.d.ts +12 -8
  136. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  137. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  138. package/dist/schema/state/sqlite/query-builder/astToSql.js +18 -11
  139. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  140. package/dist/schema/state/sqlite/query-builder/impl.test.js +119 -90
  141. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  142. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
  143. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  144. package/dist/schema/state/sqlite/system-tables/state-tables.js +3 -3
  145. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  146. package/dist/schema/unknown-events.d.ts +3 -3
  147. package/dist/schema/unknown-events.d.ts.map +1 -1
  148. package/dist/schema-management/migrations.d.ts +2 -2
  149. package/dist/schema-management/migrations.d.ts.map +1 -1
  150. package/dist/schema-management/migrations.js.map +1 -1
  151. package/dist/schema-management/validate-schema.d.ts +3 -3
  152. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  153. package/dist/schema-management/validate-schema.js +2 -2
  154. package/dist/schema-management/validate-schema.js.map +1 -1
  155. package/dist/sqlite-types.d.ts +3 -3
  156. package/dist/sqlite-types.d.ts.map +1 -1
  157. package/dist/sync/ClientSessionSyncProcessor.d.ts +5 -5
  158. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  159. package/dist/sync/ClientSessionSyncProcessor.js +12 -12
  160. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  161. package/dist/sync/errors.d.ts +9 -4
  162. package/dist/sync/errors.d.ts.map +1 -1
  163. package/dist/sync/errors.js +6 -6
  164. package/dist/sync/errors.js.map +1 -1
  165. package/dist/sync/mock-sync-backend.d.ts +6 -6
  166. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  167. package/dist/sync/mock-sync-backend.js +4 -4
  168. package/dist/sync/mock-sync-backend.js.map +1 -1
  169. package/dist/sync/next/compact-events.js +2 -2
  170. package/dist/sync/next/compact-events.js.map +1 -1
  171. package/dist/sync/next/facts.d.ts +5 -5
  172. package/dist/sync/next/facts.d.ts.map +1 -1
  173. package/dist/sync/next/facts.js.map +1 -1
  174. package/dist/sync/next/history-dag-common.d.ts +5 -5
  175. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  176. package/dist/sync/next/history-dag-common.js +5 -5
  177. package/dist/sync/next/history-dag-common.js.map +1 -1
  178. package/dist/sync/next/history-dag.d.ts.map +1 -1
  179. package/dist/sync/next/history-dag.js +8 -8
  180. package/dist/sync/next/history-dag.js.map +1 -1
  181. package/dist/sync/next/rebase-events.d.ts +5 -5
  182. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  183. package/dist/sync/next/rebase-events.js +5 -5
  184. package/dist/sync/next/rebase-events.js.map +1 -1
  185. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  186. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  187. package/dist/sync/next/test/event-fixtures.js +9 -9
  188. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  189. package/dist/sync/sync-backend-kv.d.ts +3 -3
  190. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  191. package/dist/sync/sync-backend-kv.js +3 -3
  192. package/dist/sync/sync-backend-kv.js.map +1 -1
  193. package/dist/sync/sync-backend.d.ts +9 -9
  194. package/dist/sync/sync-backend.d.ts.map +1 -1
  195. package/dist/sync/syncstate.d.ts +55 -42
  196. package/dist/sync/syncstate.d.ts.map +1 -1
  197. package/dist/sync/syncstate.js +42 -42
  198. package/dist/sync/syncstate.js.map +1 -1
  199. package/dist/sync/syncstate.test.js +40 -40
  200. package/dist/sync/syncstate.test.js.map +1 -1
  201. package/dist/sync/validate-push-payload.d.ts +1 -1
  202. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  203. package/dist/sync/validate-push-payload.js +2 -2
  204. package/dist/sync/validate-push-payload.js.map +1 -1
  205. package/dist/testing/event-factory.d.ts +3 -3
  206. package/dist/testing/event-factory.d.ts.map +1 -1
  207. package/dist/testing/event-factory.js +5 -7
  208. package/dist/testing/event-factory.js.map +1 -1
  209. package/dist/version.d.ts +1 -1
  210. package/dist/version.js +1 -1
  211. package/package.json +4 -4
  212. package/src/ClientSessionLeaderThreadProxy.ts +10 -10
  213. package/src/adapter-types.ts +5 -5
  214. package/src/devtools/devtools-messages-client-session.ts +2 -2
  215. package/src/devtools/devtools-messages-leader.ts +8 -8
  216. package/src/errors.ts +11 -13
  217. package/src/leader-thread/LeaderSyncProcessor.ts +54 -56
  218. package/src/leader-thread/eventlog.ts +21 -26
  219. package/src/leader-thread/leader-worker-devtools.ts +3 -3
  220. package/src/leader-thread/make-leader-thread-layer.ts +12 -10
  221. package/src/leader-thread/materialize-event.ts +3 -3
  222. package/src/leader-thread/recreate-db.ts +6 -6
  223. package/src/leader-thread/shutdown-channel.ts +2 -2
  224. package/src/leader-thread/types.ts +15 -15
  225. package/src/make-client-session.ts +2 -2
  226. package/src/materializer-helper.ts +5 -5
  227. package/src/rematerialize-from-eventlog.ts +6 -6
  228. package/src/schema/EventDef/define.ts +201 -0
  229. package/src/schema/EventDef/event-def.ts +120 -0
  230. package/src/schema/EventDef/facts.ts +135 -0
  231. package/src/schema/EventDef/materializer.ts +172 -0
  232. package/src/schema/EventDef/mod.ts +4 -0
  233. package/src/schema/EventSequenceNumber/client.ts +257 -0
  234. package/src/schema/EventSequenceNumber/global.ts +19 -0
  235. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  236. package/src/schema/EventSequenceNumber.test.ts +68 -50
  237. package/src/schema/LiveStoreEvent/client.ts +221 -0
  238. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  239. package/src/schema/LiveStoreEvent/global.ts +45 -0
  240. package/src/schema/LiveStoreEvent/input.ts +63 -0
  241. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  242. package/src/schema/events.ts +1 -1
  243. package/src/schema/mod.ts +3 -3
  244. package/src/schema/schema.ts +1 -1
  245. package/src/schema/state/sqlite/client-document-def.test.ts +2 -2
  246. package/src/schema/state/sqlite/client-document-def.ts +3 -3
  247. package/src/schema/state/sqlite/column-def.test.ts +2 -1
  248. package/src/schema/state/sqlite/column-def.ts +17 -0
  249. package/src/schema/state/sqlite/mod.ts +2 -2
  250. package/src/schema/state/sqlite/query-builder/api.ts +12 -8
  251. package/src/schema/state/sqlite/query-builder/astToSql.ts +20 -11
  252. package/src/schema/state/sqlite/query-builder/impl.test.ts +122 -90
  253. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +5 -5
  254. package/src/schema/state/sqlite/system-tables/state-tables.ts +3 -3
  255. package/src/schema/unknown-events.ts +3 -3
  256. package/src/schema-management/migrations.ts +2 -2
  257. package/src/schema-management/validate-schema.ts +3 -3
  258. package/src/sqlite-types.ts +3 -3
  259. package/src/sync/ClientSessionSyncProcessor.ts +17 -17
  260. package/src/sync/errors.ts +6 -6
  261. package/src/sync/mock-sync-backend.ts +16 -16
  262. package/src/sync/next/compact-events.ts +2 -2
  263. package/src/sync/next/facts.ts +6 -6
  264. package/src/sync/next/history-dag-common.ts +8 -8
  265. package/src/sync/next/history-dag.ts +14 -10
  266. package/src/sync/next/rebase-events.ts +11 -11
  267. package/src/sync/next/test/event-fixtures.ts +11 -11
  268. package/src/sync/sync-backend-kv.ts +3 -3
  269. package/src/sync/sync-backend.ts +9 -9
  270. package/src/sync/syncstate.test.ts +46 -46
  271. package/src/sync/syncstate.ts +59 -55
  272. package/src/sync/validate-push-payload.ts +4 -4
  273. package/src/testing/event-factory.ts +10 -12
  274. package/src/version.ts +1 -1
  275. package/dist/schema/EventDef.d.ts +0 -126
  276. package/dist/schema/EventDef.d.ts.map +0 -1
  277. package/dist/schema/EventDef.js +0 -46
  278. package/dist/schema/EventDef.js.map +0 -1
  279. package/dist/schema/EventSequenceNumber.d.ts +0 -89
  280. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  281. package/dist/schema/EventSequenceNumber.js.map +0 -1
  282. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  283. package/dist/schema/LiveStoreEvent.js.map +0 -1
  284. package/src/schema/EventDef.ts +0 -222
  285. package/src/schema/EventSequenceNumber.ts +0 -208
  286. package/src/schema/LiveStoreEvent.ts +0 -286
@@ -1,208 +0,0 @@
1
- import { Brand, Schema } from '@livestore/utils/effect'
2
-
3
- export type ClientEventSequenceNumber = Brand.Branded<number, 'ClientEventSequenceNumber'>
4
- export const localEventSequenceNumber = Brand.nominal<ClientEventSequenceNumber>()
5
- export const ClientEventSequenceNumber = Schema.fromBrand(localEventSequenceNumber)(Schema.Int)
6
-
7
- export type GlobalEventSequenceNumber = Brand.Branded<number, 'GlobalEventSequenceNumber'>
8
- export const globalEventSequenceNumber = Brand.nominal<GlobalEventSequenceNumber>()
9
- export const GlobalEventSequenceNumber = Schema.fromBrand(globalEventSequenceNumber)(Schema.Int)
10
-
11
- export const clientDefault = 0 as any as ClientEventSequenceNumber
12
-
13
- export const rebaseGenerationDefault = 0
14
-
15
- /**
16
- * LiveStore event sequence number value consisting of a globally unique event sequence number
17
- * and a client sequence number.
18
- *
19
- * The client sequence number is only used for client-local events and starts from 0 for each global sequence number.
20
- *
21
- * For event notation documentation, see: contributor-docs/events-notation.md
22
- */
23
- export type EventSequenceNumber = {
24
- global: GlobalEventSequenceNumber
25
- client: ClientEventSequenceNumber
26
- /**
27
- * Generation integer that is incremented whenever the client rebased.
28
- * Remains constant for all subsequent events until another rebase occurs.
29
- */
30
- rebaseGeneration: number
31
- }
32
-
33
- export type EventSequenceNumberInput =
34
- | EventSequenceNumber
35
- | (Omit<typeof EventSequenceNumber.Encoded, 'rebaseGeneration'> & { rebaseGeneration?: number })
36
-
37
- // TODO adjust name to `ClientEventSequenceNumber`
38
- /**
39
- * NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
40
- */
41
- export const EventSequenceNumber = Schema.Struct({
42
- global: GlobalEventSequenceNumber,
43
- /** Only increments for client-local events */
44
- client: ClientEventSequenceNumber,
45
-
46
- // TODO also provide a way to see "confirmation level" of event (e.g. confirmed by leader/sync backend)
47
-
48
- // Client only
49
- rebaseGeneration: Schema.Int,
50
- }).annotations({
51
- title: 'LiveStore.EventSequenceNumber',
52
- pretty: () => (seqNum) => toString(seqNum),
53
- })
54
-
55
- /**
56
- * Compare two event sequence numbers i.e. checks if the first event sequence number is less than the second.
57
- * Comparison hierarchy: global > client > rebaseGeneration
58
- */
59
- export const compare = (a: EventSequenceNumber, b: EventSequenceNumber) => {
60
- if (a.global !== b.global) {
61
- return a.global - b.global
62
- }
63
- if (a.client !== b.client) {
64
- return a.client - b.client
65
- }
66
- return a.rebaseGeneration - b.rebaseGeneration
67
- }
68
-
69
- /**
70
- * Convert an event sequence number to a string representation.
71
- *
72
- * For notation documentation, see: contributor-docs/events-notation.md
73
- */
74
- export const toString = (seqNum: EventSequenceNumber) => {
75
- const rebaseGenerationStr = seqNum.rebaseGeneration > 0 ? `r${seqNum.rebaseGeneration}` : ''
76
- return seqNum.client === 0
77
- ? `e${seqNum.global}${rebaseGenerationStr}`
78
- : `e${seqNum.global}.${seqNum.client}${rebaseGenerationStr}`
79
- }
80
-
81
- /**
82
- * Convert a string representation of an event sequence number to an event sequence number.
83
- * Parses strings in the format: e{global}[.{client}][r{rebaseGeneration}]
84
- * Examples: "e0", "e0r1", "e0.1", "e0.1r1"
85
- *
86
- * For full notation documentation, see: contributor-docs/events-notation.md
87
- */
88
- export const fromString = (str: string): EventSequenceNumber => {
89
- if (!str.startsWith('e')) {
90
- throw new Error('Invalid event sequence number string: must start with "e"')
91
- }
92
-
93
- // Remove the 'e' prefix
94
- const remaining = str.slice(1)
95
-
96
- // Parse rebase generation if present
97
- let rebaseGeneration = rebaseGenerationDefault
98
- let withoutRebase = remaining
99
- const rebaseMatch = remaining.match(/r(\d+)$/)
100
- if (rebaseMatch !== null) {
101
- rebaseGeneration = Number.parseInt(rebaseMatch[1]!, 10)
102
- withoutRebase = remaining.slice(0, -rebaseMatch[0].length)
103
- }
104
-
105
- // Parse global and client parts
106
- const parts = withoutRebase.split('.')
107
-
108
- // Validate that parts contain only digits (and possibly empty for client)
109
- if (parts[0] === '' || !/^\d+$/.test(parts[0]!)) {
110
- throw new Error('Invalid event sequence number string: invalid number format')
111
- }
112
-
113
- if (parts.length > 1 && parts[1] !== undefined && (parts[1] === '' || !/^\d+$/.test(parts[1]))) {
114
- throw new Error('Invalid event sequence number string: invalid number format')
115
- }
116
-
117
- const global = Number.parseInt(parts[0]!, 10)
118
- const client = parts.length > 1 && parts[1] !== undefined ? Number.parseInt(parts[1], 10) : 0
119
-
120
- if (Number.isNaN(global) || Number.isNaN(client) || Number.isNaN(rebaseGeneration)) {
121
- throw new TypeError('Invalid event sequence number string: invalid number format')
122
- }
123
-
124
- return {
125
- global: global as any as GlobalEventSequenceNumber,
126
- client: client as any as ClientEventSequenceNumber,
127
- rebaseGeneration,
128
- }
129
- }
130
-
131
- export const fromGlobal = (seqNum: GlobalEventSequenceNumber) => ({
132
- global: seqNum,
133
- client: clientDefault,
134
- rebaseGeneration: rebaseGenerationDefault,
135
- })
136
-
137
- export const isEqual = (a: EventSequenceNumber, b: EventSequenceNumber) =>
138
- a.global === b.global && a.client === b.client && a.rebaseGeneration === b.rebaseGeneration
139
-
140
- export type EventSequenceNumberPair = { seqNum: EventSequenceNumber; parentSeqNum: EventSequenceNumber }
141
-
142
- export const ROOT = {
143
- global: 0 as any as GlobalEventSequenceNumber,
144
- client: clientDefault,
145
- rebaseGeneration: rebaseGenerationDefault,
146
- } satisfies EventSequenceNumber
147
-
148
- export const isGreaterThan = (a: EventSequenceNumber, b: EventSequenceNumber) => {
149
- return a.global > b.global || (a.global === b.global && a.client > b.client)
150
- }
151
-
152
- export const isGreaterThanOrEqual = (a: EventSequenceNumber, b: EventSequenceNumber) => {
153
- return a.global > b.global || (a.global === b.global && a.client >= b.client)
154
- }
155
-
156
- export const max = (a: EventSequenceNumber, b: EventSequenceNumber) => {
157
- return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b
158
- }
159
-
160
- export const diff = (a: EventSequenceNumber, b: EventSequenceNumber) => {
161
- return {
162
- global: a.global - b.global,
163
- client: a.client - b.client,
164
- }
165
- }
166
-
167
- export const make = (seqNum: EventSequenceNumberInput): EventSequenceNumber => {
168
- return Schema.is(EventSequenceNumber)(seqNum)
169
- ? seqNum
170
- : Schema.decodeSync(EventSequenceNumber)({
171
- ...seqNum,
172
- rebaseGeneration: seqNum.rebaseGeneration ?? rebaseGenerationDefault,
173
- })
174
- }
175
-
176
- /**
177
- * Computes the next event sequence/parent pair.
178
- */
179
- export const nextPair = ({
180
- seqNum,
181
- isClient,
182
- rebaseGeneration,
183
- }: {
184
- seqNum: EventSequenceNumber
185
- isClient: boolean
186
- rebaseGeneration?: number
187
- }): EventSequenceNumberPair => {
188
- if (isClient) {
189
- return {
190
- seqNum: {
191
- global: seqNum.global,
192
- client: (seqNum.client + 1) as any as ClientEventSequenceNumber,
193
- rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
194
- },
195
- parentSeqNum: seqNum,
196
- }
197
- }
198
-
199
- return {
200
- seqNum: {
201
- global: (seqNum.global + 1) as any as GlobalEventSequenceNumber,
202
- client: clientDefault,
203
- rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
204
- },
205
- // NOTE we always point to `client: 0` for non-client-local events
206
- parentSeqNum: { global: seqNum.global, client: clientDefault, rebaseGeneration: seqNum.rebaseGeneration },
207
- }
208
- }
@@ -1,286 +0,0 @@
1
- import { memoizeByRef } from '@livestore/utils'
2
- import { Option, Schema } from '@livestore/utils/effect'
3
-
4
- import type { EventDef, EventDefRecord } from './EventDef.ts'
5
- import * as EventSequenceNumber from './EventSequenceNumber.ts'
6
- import type { LiveStoreSchema } from './schema.ts'
7
-
8
- export namespace ForEventDef {
9
- export type PartialDecoded<TEventDef extends EventDef.Any> = {
10
- name: TEventDef['name']
11
- args: Schema.Schema.Type<TEventDef['schema']>
12
- }
13
-
14
- export type PartialEncoded<TEventDef extends EventDef.Any> = {
15
- name: TEventDef['name']
16
- args: Schema.Schema.Encoded<TEventDef['schema']>
17
- }
18
-
19
- export type Decoded<TEventDef extends EventDef.Any> = {
20
- name: TEventDef['name']
21
- args: Schema.Schema.Type<TEventDef['schema']>
22
- seqNum: EventSequenceNumber.EventSequenceNumber
23
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
24
- clientId: string
25
- sessionId: string
26
- }
27
-
28
- export type Encoded<TEventDef extends EventDef.Any> = {
29
- name: TEventDef['name']
30
- args: Schema.Schema.Encoded<TEventDef['schema']>
31
- seqNum: EventSequenceNumber.EventSequenceNumber
32
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
33
- clientId: string
34
- sessionId: string
35
- }
36
- }
37
-
38
- export type AnyDecoded = ForEventDef.Decoded<EventDef.Any>
39
- export const AnyDecoded = Schema.Struct({
40
- name: Schema.String,
41
- args: Schema.Any,
42
- seqNum: EventSequenceNumber.EventSequenceNumber,
43
- parentSeqNum: EventSequenceNumber.EventSequenceNumber,
44
- clientId: Schema.String,
45
- sessionId: Schema.String,
46
- }).annotations({ title: 'LiveStoreEvent.AnyDecoded' })
47
-
48
- export type AnyEncoded = ForEventDef.Encoded<EventDef.Any>
49
- export const AnyEncoded = Schema.Struct({
50
- name: Schema.String,
51
- args: Schema.Any,
52
- seqNum: EventSequenceNumber.EventSequenceNumber,
53
- parentSeqNum: EventSequenceNumber.EventSequenceNumber,
54
- clientId: Schema.String,
55
- sessionId: Schema.String,
56
- }).annotations({ title: 'LiveStoreEvent.AnyEncoded' })
57
-
58
- export const AnyEncodedGlobal = Schema.Struct({
59
- name: Schema.String,
60
- args: Schema.Any,
61
- seqNum: EventSequenceNumber.GlobalEventSequenceNumber,
62
- parentSeqNum: EventSequenceNumber.GlobalEventSequenceNumber,
63
- clientId: Schema.String,
64
- sessionId: Schema.String,
65
- }).annotations({ title: 'LiveStoreEvent.AnyEncodedGlobal' })
66
- export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type
67
-
68
- export type PartialAnyDecoded = ForEventDef.PartialDecoded<EventDef.Any>
69
- export type PartialAnyEncoded = ForEventDef.PartialEncoded<EventDef.Any>
70
-
71
- export const PartialAnyEncoded = Schema.Struct({
72
- name: Schema.String,
73
- args: Schema.Any,
74
- })
75
-
76
- export type PartialForSchema<TSchema extends LiveStoreSchema> = {
77
- [K in keyof TSchema['_EventDefMapType']]: ForEventDef.PartialDecoded<TSchema['_EventDefMapType'][K]>
78
- }[keyof TSchema['_EventDefMapType']]
79
-
80
- export type ForSchema<TSchema extends LiveStoreSchema> = {
81
- [K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
82
- }[keyof TSchema['_EventDefMapType']]
83
-
84
- export const isPartialEventDef = (event: AnyDecoded | PartialAnyDecoded): event is PartialAnyDecoded =>
85
- 'num' in event === false && 'parentSeqNum' in event === false
86
-
87
- export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
88
- {
89
- [K in keyof TEventDefRecord]: {
90
- name: K
91
- args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
92
- seqNum: EventSequenceNumber.EventSequenceNumber
93
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
94
- clientId: string
95
- sessionId: string
96
- }
97
- }[keyof TEventDefRecord],
98
- {
99
- [K in keyof TEventDefRecord]: {
100
- name: K
101
- args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
102
- seqNum: EventSequenceNumber.EventSequenceNumber
103
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
104
- clientId: string
105
- sessionId: string
106
- }
107
- }[keyof TEventDefRecord]
108
- >
109
-
110
- export type EventDefPartialSchema<TEventDefRecord extends EventDefRecord> = Schema.Schema<
111
- {
112
- [K in keyof TEventDefRecord]: {
113
- name: K
114
- args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
115
- }
116
- }[keyof TEventDefRecord],
117
- {
118
- [K in keyof TEventDefRecord]: {
119
- name: K
120
- args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
121
- }
122
- }[keyof TEventDefRecord]
123
- >
124
-
125
- export const makeEventDefSchema = <TSchema extends LiveStoreSchema>(
126
- schema: TSchema,
127
- ): ForEventDefRecord<TSchema['_EventDefMapType']> =>
128
- Schema.Union(
129
- ...[...schema.eventsDefsMap.values()].map((def) =>
130
- Schema.Struct({
131
- name: Schema.Literal(def.name),
132
- args: def.schema,
133
- seqNum: EventSequenceNumber.EventSequenceNumber,
134
- parentSeqNum: EventSequenceNumber.EventSequenceNumber,
135
- clientId: Schema.String,
136
- sessionId: Schema.String,
137
- }),
138
- ),
139
- ).annotations({ title: 'EventDef' }) as any
140
-
141
- export const makeEventDefPartialSchema = <TSchema extends LiveStoreSchema>(
142
- schema: TSchema,
143
- ): EventDefPartialSchema<TSchema['_EventDefMapType']> =>
144
- Schema.Union(
145
- ...[...schema.eventsDefsMap.values()].map((def) =>
146
- Schema.Struct({
147
- name: Schema.Literal(def.name),
148
- args: def.schema,
149
- }),
150
- ),
151
- ).annotations({ title: 'EventDefPartial' }) as any
152
-
153
- export const makeEventDefSchemaMemo = memoizeByRef(makeEventDefSchema)
154
-
155
- export const encodedFromGlobal = (event: AnyEncodedGlobal): AnyEncoded => ({
156
- ...event,
157
- seqNum: EventSequenceNumber.fromGlobal(event.seqNum),
158
- parentSeqNum: EventSequenceNumber.fromGlobal(event.parentSeqNum),
159
- })
160
-
161
- /** Equivalent to AnyEncoded but with a meta field and some convenience methods */
162
- export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.EncodedWithMeta')({
163
- name: Schema.String,
164
- args: Schema.Any,
165
- seqNum: EventSequenceNumber.EventSequenceNumber,
166
- parentSeqNum: EventSequenceNumber.EventSequenceNumber,
167
- clientId: Schema.String,
168
- sessionId: Schema.String,
169
- // TODO get rid of `meta` again by cleaning up the usage implementations
170
- meta: Schema.Struct({
171
- sessionChangeset: Schema.Union(
172
- Schema.TaggedStruct('sessionChangeset', {
173
- data: Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
174
- debug: Schema.Any.pipe(Schema.optional),
175
- }),
176
- Schema.TaggedStruct('no-op', {}),
177
- Schema.TaggedStruct('unset', {}),
178
- ),
179
- syncMetadata: Schema.Option(Schema.JsonValue),
180
- /** Used to detect if the materializer is side effecting (during dev) */
181
- materializerHashLeader: Schema.Option(Schema.Number),
182
- materializerHashSession: Schema.Option(Schema.Number),
183
- }).pipe(
184
- Schema.mutable,
185
- Schema.optional,
186
- Schema.withDefaults({
187
- constructor: () => ({
188
- sessionChangeset: { _tag: 'unset' as const },
189
- syncMetadata: Option.none(),
190
- materializerHashLeader: Option.none(),
191
- materializerHashSession: Option.none(),
192
- }),
193
- decoding: () => ({
194
- sessionChangeset: { _tag: 'unset' as const },
195
- syncMetadata: Option.none(),
196
- materializerHashLeader: Option.none(),
197
- materializerHashSession: Option.none(),
198
- }),
199
- }),
200
- ),
201
- }) {
202
- toJSON = (): any => {
203
- // Only used for logging/debugging
204
- // - More readable way to print the seqNum + parentSeqNum
205
- // - not including `meta`, `clientId`, `sessionId`
206
- return {
207
- seqNum: `${EventSequenceNumber.toString(this.seqNum)} → ${EventSequenceNumber.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
208
- name: this.name,
209
- args: this.args,
210
- }
211
- }
212
-
213
- /**
214
- * Example: (global event)
215
- * For event e2 → e1 which should be rebased on event e3 → e2
216
- * the resulting event num will be e4 → e3
217
- *
218
- * Example: (client event)
219
- * For event e2.1 → e2 which should be rebased on event e3 → e2
220
- * the resulting event num will be e3.1 → e3
221
- *
222
- * Syntax: e2.2 → e2.1
223
- * ^ ^ ^ ^
224
- * | | | +- client parent number
225
- * | | +--- global parent number
226
- * | +-- client number
227
- * +---- global number
228
- * Client num is omitted for global events
229
- */
230
- rebase = ({
231
- parentSeqNum,
232
- isClient,
233
- rebaseGeneration,
234
- }: {
235
- parentSeqNum: EventSequenceNumber.EventSequenceNumber
236
- isClient: boolean
237
- rebaseGeneration: number
238
- }) =>
239
- new EncodedWithMeta({
240
- ...this,
241
- ...EventSequenceNumber.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
242
- })
243
-
244
- static fromGlobal = (
245
- event: AnyEncodedGlobal,
246
- meta: {
247
- syncMetadata: Option.Option<Schema.JsonValue>
248
- materializerHashLeader: Option.Option<number>
249
- materializerHashSession: Option.Option<number>
250
- },
251
- ) =>
252
- new EncodedWithMeta({
253
- ...event,
254
- seqNum: {
255
- global: event.seqNum,
256
- client: EventSequenceNumber.clientDefault,
257
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
258
- },
259
- parentSeqNum: {
260
- global: event.parentSeqNum,
261
- client: EventSequenceNumber.clientDefault,
262
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
263
- },
264
- meta: {
265
- sessionChangeset: { _tag: 'unset' as const },
266
- syncMetadata: meta.syncMetadata,
267
- materializerHashLeader: meta.materializerHashLeader,
268
- materializerHashSession: meta.materializerHashSession,
269
- },
270
- })
271
-
272
- toGlobal = (): AnyEncodedGlobal => ({
273
- ...this,
274
- seqNum: this.seqNum.global,
275
- parentSeqNum: this.parentSeqNum.global,
276
- })
277
- }
278
-
279
- /** NOTE `meta` is not considered for equality */
280
- export const isEqualEncoded = (a: AnyEncoded, b: AnyEncoded) =>
281
- a.seqNum.global === b.seqNum.global &&
282
- a.seqNum.client === b.seqNum.client &&
283
- a.name === b.name &&
284
- a.clientId === b.clientId &&
285
- a.sessionId === b.sessionId &&
286
- JSON.stringify(a.args) === JSON.stringify(b.args) // TODO use schema equality here