@verdant-web/store 2.8.5 → 3.0.0

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 (278) hide show
  1. package/dist/bundle/index.js +9 -10
  2. package/dist/bundle/index.js.map +4 -4
  3. package/dist/cjs/DocumentManager.d.ts +1 -1
  4. package/dist/cjs/DocumentManager.js +1 -1
  5. package/dist/cjs/DocumentManager.js.map +1 -1
  6. package/dist/cjs/IDBService.d.ts +28 -7
  7. package/dist/cjs/IDBService.js +50 -13
  8. package/dist/cjs/IDBService.js.map +1 -1
  9. package/dist/cjs/UndoHistory.d.ts +1 -1
  10. package/dist/cjs/UndoHistory.js +6 -2
  11. package/dist/cjs/UndoHistory.js.map +1 -1
  12. package/dist/cjs/__tests__/batching.test.js +3 -1
  13. package/dist/cjs/__tests__/batching.test.js.map +1 -1
  14. package/dist/cjs/__tests__/documents.test.js +37 -6
  15. package/dist/cjs/__tests__/documents.test.js.map +1 -1
  16. package/dist/cjs/__tests__/fixtures/testStorage.d.ts +2 -2
  17. package/dist/cjs/__tests__/fixtures/testStorage.js +2 -1
  18. package/dist/cjs/__tests__/fixtures/testStorage.js.map +1 -1
  19. package/dist/cjs/__tests__/legacyOids.test.js +50 -17
  20. package/dist/cjs/__tests__/legacyOids.test.js.map +1 -1
  21. package/dist/cjs/__tests__/mutations.test.js +9 -3
  22. package/dist/cjs/__tests__/mutations.test.js.map +1 -1
  23. package/dist/cjs/__tests__/queries.test.js +6 -2
  24. package/dist/cjs/__tests__/queries.test.js.map +1 -1
  25. package/dist/cjs/__tests__/setup/indexedDB.d.ts +1 -1
  26. package/dist/cjs/__tests__/setup/indexedDB.js +8 -1
  27. package/dist/cjs/__tests__/setup/indexedDB.js.map +1 -1
  28. package/dist/cjs/__tests__/undo.test.js +16 -9
  29. package/dist/cjs/__tests__/undo.test.js.map +1 -1
  30. package/dist/cjs/client/Client.d.ts +1 -1
  31. package/dist/cjs/client/Client.js +7 -3
  32. package/dist/cjs/client/Client.js.map +1 -1
  33. package/dist/cjs/client/ClientDescriptor.js +21 -6
  34. package/dist/cjs/client/ClientDescriptor.js.map +1 -1
  35. package/dist/cjs/context.d.ts +10 -1
  36. package/dist/cjs/entities/Entity.d.ts +106 -178
  37. package/dist/cjs/entities/Entity.js +558 -376
  38. package/dist/cjs/entities/Entity.js.map +1 -1
  39. package/dist/cjs/entities/Entity.test.d.ts +1 -0
  40. package/dist/cjs/entities/Entity.test.js +194 -0
  41. package/dist/cjs/entities/Entity.test.js.map +1 -0
  42. package/dist/cjs/entities/EntityCache.d.ts +15 -0
  43. package/dist/cjs/entities/EntityCache.js +39 -0
  44. package/dist/cjs/entities/EntityCache.js.map +1 -0
  45. package/dist/cjs/entities/EntityMetadata.d.ts +68 -0
  46. package/dist/cjs/entities/EntityMetadata.js +261 -0
  47. package/dist/cjs/entities/EntityMetadata.js.map +1 -0
  48. package/dist/cjs/entities/EntityStore.d.ts +63 -68
  49. package/dist/cjs/entities/EntityStore.js +294 -438
  50. package/dist/cjs/entities/EntityStore.js.map +1 -1
  51. package/dist/cjs/entities/OperationBatcher.d.ts +52 -0
  52. package/dist/cjs/entities/OperationBatcher.js +165 -0
  53. package/dist/cjs/entities/OperationBatcher.js.map +1 -0
  54. package/dist/cjs/entities/types.d.ts +84 -0
  55. package/dist/cjs/entities/types.js +3 -0
  56. package/dist/cjs/entities/types.js.map +1 -0
  57. package/dist/cjs/files/EntityFile.d.ts +5 -2
  58. package/dist/cjs/files/EntityFile.js +8 -4
  59. package/dist/cjs/files/EntityFile.js.map +1 -1
  60. package/dist/cjs/files/FileManager.d.ts +3 -1
  61. package/dist/cjs/files/FileManager.js +5 -3
  62. package/dist/cjs/files/FileManager.js.map +1 -1
  63. package/dist/cjs/files/FileStorage.js +7 -7
  64. package/dist/cjs/files/FileStorage.js.map +1 -1
  65. package/dist/cjs/files/utils.d.ts +2 -0
  66. package/dist/cjs/files/utils.js +5 -2
  67. package/dist/cjs/files/utils.js.map +1 -1
  68. package/dist/cjs/idb.d.ts +2 -0
  69. package/dist/cjs/idb.js +50 -4
  70. package/dist/cjs/idb.js.map +1 -1
  71. package/dist/cjs/index.d.ts +1 -1
  72. package/dist/cjs/metadata/AckInfoStore.js +1 -1
  73. package/dist/cjs/metadata/AckInfoStore.js.map +1 -1
  74. package/dist/cjs/metadata/BaselinesStore.d.ts +4 -1
  75. package/dist/cjs/metadata/BaselinesStore.js +19 -10
  76. package/dist/cjs/metadata/BaselinesStore.js.map +1 -1
  77. package/dist/cjs/metadata/LocalReplicaStore.d.ts +1 -1
  78. package/dist/cjs/metadata/LocalReplicaStore.js +11 -5
  79. package/dist/cjs/metadata/LocalReplicaStore.js.map +1 -1
  80. package/dist/cjs/metadata/Metadata.d.ts +26 -5
  81. package/dist/cjs/metadata/Metadata.js +55 -18
  82. package/dist/cjs/metadata/Metadata.js.map +1 -1
  83. package/dist/cjs/metadata/OperationsStore.d.ts +3 -0
  84. package/dist/cjs/metadata/OperationsStore.js +35 -15
  85. package/dist/cjs/metadata/OperationsStore.js.map +1 -1
  86. package/dist/cjs/migration/openDatabase.js +31 -10
  87. package/dist/cjs/migration/openDatabase.js.map +1 -1
  88. package/dist/cjs/queries/BaseQuery.js +13 -1
  89. package/dist/cjs/queries/BaseQuery.js.map +1 -1
  90. package/dist/cjs/queries/CollectionQueries.js +1 -1
  91. package/dist/cjs/queries/CollectionQueries.js.map +1 -1
  92. package/dist/cjs/queries/FindAllQuery.js +1 -0
  93. package/dist/cjs/queries/FindAllQuery.js.map +1 -1
  94. package/dist/cjs/queries/QueryCache.d.ts +1 -0
  95. package/dist/cjs/queries/QueryCache.js +4 -0
  96. package/dist/cjs/queries/QueryCache.js.map +1 -1
  97. package/dist/cjs/queries/QueryableStorage.d.ts +20 -0
  98. package/dist/cjs/queries/QueryableStorage.js +84 -0
  99. package/dist/cjs/queries/QueryableStorage.js.map +1 -0
  100. package/dist/cjs/queries/dbQueries.js +13 -3
  101. package/dist/cjs/queries/dbQueries.js.map +1 -1
  102. package/dist/cjs/sync/FileSync.d.ts +1 -0
  103. package/dist/cjs/sync/FileSync.js +1 -0
  104. package/dist/cjs/sync/FileSync.js.map +1 -1
  105. package/dist/cjs/sync/PushPullSync.d.ts +2 -1
  106. package/dist/cjs/sync/PushPullSync.js +7 -1
  107. package/dist/cjs/sync/PushPullSync.js.map +1 -1
  108. package/dist/cjs/sync/Sync.d.ts +6 -3
  109. package/dist/cjs/sync/Sync.js +9 -4
  110. package/dist/cjs/sync/Sync.js.map +1 -1
  111. package/dist/cjs/sync/WebSocketSync.d.ts +4 -1
  112. package/dist/cjs/sync/WebSocketSync.js +41 -11
  113. package/dist/cjs/sync/WebSocketSync.js.map +1 -1
  114. package/dist/esm/DocumentManager.d.ts +1 -1
  115. package/dist/esm/DocumentManager.js +1 -1
  116. package/dist/esm/DocumentManager.js.map +1 -1
  117. package/dist/esm/IDBService.d.ts +28 -7
  118. package/dist/esm/IDBService.js +51 -14
  119. package/dist/esm/IDBService.js.map +1 -1
  120. package/dist/esm/UndoHistory.d.ts +1 -1
  121. package/dist/esm/UndoHistory.js +6 -2
  122. package/dist/esm/UndoHistory.js.map +1 -1
  123. package/dist/esm/__tests__/batching.test.js +3 -1
  124. package/dist/esm/__tests__/batching.test.js.map +1 -1
  125. package/dist/esm/__tests__/documents.test.js +37 -6
  126. package/dist/esm/__tests__/documents.test.js.map +1 -1
  127. package/dist/esm/__tests__/fixtures/testStorage.d.ts +2 -2
  128. package/dist/esm/__tests__/fixtures/testStorage.js +2 -1
  129. package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
  130. package/dist/esm/__tests__/legacyOids.test.js +50 -17
  131. package/dist/esm/__tests__/legacyOids.test.js.map +1 -1
  132. package/dist/esm/__tests__/mutations.test.js +9 -3
  133. package/dist/esm/__tests__/mutations.test.js.map +1 -1
  134. package/dist/esm/__tests__/queries.test.js +6 -2
  135. package/dist/esm/__tests__/queries.test.js.map +1 -1
  136. package/dist/esm/__tests__/setup/indexedDB.d.ts +1 -1
  137. package/dist/esm/__tests__/setup/indexedDB.js +8 -1
  138. package/dist/esm/__tests__/setup/indexedDB.js.map +1 -1
  139. package/dist/esm/__tests__/undo.test.js +16 -9
  140. package/dist/esm/__tests__/undo.test.js.map +1 -1
  141. package/dist/esm/client/Client.d.ts +1 -1
  142. package/dist/esm/client/Client.js +7 -3
  143. package/dist/esm/client/Client.js.map +1 -1
  144. package/dist/esm/client/ClientDescriptor.js +21 -6
  145. package/dist/esm/client/ClientDescriptor.js.map +1 -1
  146. package/dist/esm/context.d.ts +10 -1
  147. package/dist/esm/entities/Entity.d.ts +106 -178
  148. package/dist/esm/entities/Entity.js +559 -376
  149. package/dist/esm/entities/Entity.js.map +1 -1
  150. package/dist/esm/entities/Entity.test.d.ts +1 -0
  151. package/dist/esm/entities/Entity.test.js +192 -0
  152. package/dist/esm/entities/Entity.test.js.map +1 -0
  153. package/dist/esm/entities/EntityCache.d.ts +15 -0
  154. package/dist/esm/entities/EntityCache.js +35 -0
  155. package/dist/esm/entities/EntityCache.js.map +1 -0
  156. package/dist/esm/entities/EntityMetadata.d.ts +68 -0
  157. package/dist/esm/entities/EntityMetadata.js +256 -0
  158. package/dist/esm/entities/EntityMetadata.js.map +1 -0
  159. package/dist/esm/entities/EntityStore.d.ts +63 -68
  160. package/dist/esm/entities/EntityStore.js +295 -439
  161. package/dist/esm/entities/EntityStore.js.map +1 -1
  162. package/dist/esm/entities/OperationBatcher.d.ts +52 -0
  163. package/dist/esm/entities/OperationBatcher.js +161 -0
  164. package/dist/esm/entities/OperationBatcher.js.map +1 -0
  165. package/dist/esm/entities/types.d.ts +84 -0
  166. package/dist/esm/entities/types.js +2 -0
  167. package/dist/esm/entities/types.js.map +1 -0
  168. package/dist/esm/files/EntityFile.d.ts +5 -2
  169. package/dist/esm/files/EntityFile.js +8 -4
  170. package/dist/esm/files/EntityFile.js.map +1 -1
  171. package/dist/esm/files/FileManager.d.ts +3 -1
  172. package/dist/esm/files/FileManager.js +5 -3
  173. package/dist/esm/files/FileManager.js.map +1 -1
  174. package/dist/esm/files/FileStorage.js +7 -7
  175. package/dist/esm/files/FileStorage.js.map +1 -1
  176. package/dist/esm/files/utils.d.ts +2 -0
  177. package/dist/esm/files/utils.js +4 -2
  178. package/dist/esm/files/utils.js.map +1 -1
  179. package/dist/esm/idb.d.ts +2 -0
  180. package/dist/esm/idb.js +47 -3
  181. package/dist/esm/idb.js.map +1 -1
  182. package/dist/esm/index.d.ts +1 -1
  183. package/dist/esm/metadata/AckInfoStore.js +1 -1
  184. package/dist/esm/metadata/AckInfoStore.js.map +1 -1
  185. package/dist/esm/metadata/BaselinesStore.d.ts +4 -1
  186. package/dist/esm/metadata/BaselinesStore.js +19 -10
  187. package/dist/esm/metadata/BaselinesStore.js.map +1 -1
  188. package/dist/esm/metadata/LocalReplicaStore.d.ts +1 -1
  189. package/dist/esm/metadata/LocalReplicaStore.js +11 -5
  190. package/dist/esm/metadata/LocalReplicaStore.js.map +1 -1
  191. package/dist/esm/metadata/Metadata.d.ts +26 -5
  192. package/dist/esm/metadata/Metadata.js +56 -19
  193. package/dist/esm/metadata/Metadata.js.map +1 -1
  194. package/dist/esm/metadata/OperationsStore.d.ts +3 -0
  195. package/dist/esm/metadata/OperationsStore.js +35 -15
  196. package/dist/esm/metadata/OperationsStore.js.map +1 -1
  197. package/dist/esm/migration/openDatabase.js +32 -11
  198. package/dist/esm/migration/openDatabase.js.map +1 -1
  199. package/dist/esm/queries/BaseQuery.js +13 -1
  200. package/dist/esm/queries/BaseQuery.js.map +1 -1
  201. package/dist/esm/queries/CollectionQueries.js +1 -1
  202. package/dist/esm/queries/CollectionQueries.js.map +1 -1
  203. package/dist/esm/queries/FindAllQuery.js +1 -0
  204. package/dist/esm/queries/FindAllQuery.js.map +1 -1
  205. package/dist/esm/queries/QueryCache.d.ts +1 -0
  206. package/dist/esm/queries/QueryCache.js +4 -0
  207. package/dist/esm/queries/QueryCache.js.map +1 -1
  208. package/dist/esm/queries/QueryableStorage.d.ts +20 -0
  209. package/dist/esm/queries/QueryableStorage.js +80 -0
  210. package/dist/esm/queries/QueryableStorage.js.map +1 -0
  211. package/dist/esm/queries/dbQueries.js +13 -3
  212. package/dist/esm/queries/dbQueries.js.map +1 -1
  213. package/dist/esm/sync/FileSync.d.ts +1 -0
  214. package/dist/esm/sync/FileSync.js +1 -0
  215. package/dist/esm/sync/FileSync.js.map +1 -1
  216. package/dist/esm/sync/PushPullSync.d.ts +2 -1
  217. package/dist/esm/sync/PushPullSync.js +7 -1
  218. package/dist/esm/sync/PushPullSync.js.map +1 -1
  219. package/dist/esm/sync/Sync.d.ts +6 -3
  220. package/dist/esm/sync/Sync.js +9 -4
  221. package/dist/esm/sync/Sync.js.map +1 -1
  222. package/dist/esm/sync/WebSocketSync.d.ts +4 -1
  223. package/dist/esm/sync/WebSocketSync.js +41 -11
  224. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  225. package/dist/tsconfig-cjs.tsbuildinfo +1 -1
  226. package/dist/tsconfig.tsbuildinfo +1 -1
  227. package/package.json +8 -7
  228. package/src/DocumentManager.ts +1 -1
  229. package/src/IDBService.ts +78 -17
  230. package/src/UndoHistory.ts +5 -3
  231. package/src/__tests__/batching.test.ts +5 -2
  232. package/src/__tests__/documents.test.ts +44 -6
  233. package/src/__tests__/fixtures/testStorage.ts +3 -0
  234. package/src/__tests__/legacyOids.test.ts +53 -17
  235. package/src/__tests__/mutations.test.ts +9 -3
  236. package/src/__tests__/queries.test.ts +6 -2
  237. package/src/__tests__/setup/indexedDB.ts +8 -1
  238. package/src/__tests__/undo.test.ts +17 -9
  239. package/src/client/Client.ts +7 -3
  240. package/src/client/ClientDescriptor.ts +24 -8
  241. package/src/context.ts +16 -1
  242. package/src/entities/Entity.test.ts +218 -0
  243. package/src/entities/Entity.ts +696 -616
  244. package/src/entities/EntityCache.ts +41 -0
  245. package/src/entities/EntityMetadata.ts +364 -0
  246. package/src/entities/EntityStore.ts +384 -621
  247. package/src/entities/OperationBatcher.ts +251 -0
  248. package/src/entities/types.ts +154 -0
  249. package/src/files/EntityFile.ts +9 -4
  250. package/src/files/FileManager.ts +5 -3
  251. package/src/files/FileStorage.ts +7 -13
  252. package/src/files/utils.ts +6 -2
  253. package/src/idb.ts +51 -3
  254. package/src/index.ts +1 -1
  255. package/src/metadata/AckInfoStore.ts +1 -1
  256. package/src/metadata/BaselinesStore.ts +16 -24
  257. package/src/metadata/LocalReplicaStore.ts +13 -6
  258. package/src/metadata/Metadata.ts +109 -24
  259. package/src/metadata/OperationsStore.ts +37 -16
  260. package/src/migration/openDatabase.ts +32 -10
  261. package/src/queries/BaseQuery.ts +14 -1
  262. package/src/queries/CollectionQueries.ts +1 -1
  263. package/src/queries/FindAllQuery.ts +4 -0
  264. package/src/queries/QueryCache.ts +5 -0
  265. package/src/queries/QueryableStorage.ts +107 -0
  266. package/src/queries/dbQueries.ts +10 -3
  267. package/src/sync/FileSync.ts +2 -0
  268. package/src/sync/PushPullSync.ts +8 -1
  269. package/src/sync/Sync.ts +14 -6
  270. package/src/sync/WebSocketSync.ts +47 -10
  271. package/dist/cjs/entities/DocumentFamiliyCache.d.ts +0 -96
  272. package/dist/cjs/entities/DocumentFamiliyCache.js +0 -287
  273. package/dist/cjs/entities/DocumentFamiliyCache.js.map +0 -1
  274. package/dist/esm/entities/DocumentFamiliyCache.d.ts +0 -96
  275. package/dist/esm/entities/DocumentFamiliyCache.js +0 -283
  276. package/dist/esm/entities/DocumentFamiliyCache.js.map +0 -1
  277. package/src/entities/DocumentFamiliyCache.ts +0 -426
  278. package/src/entities/design.tldr +0 -808
@@ -0,0 +1,256 @@
1
+ import { applyPatch, areOidsRelated, assert, assignOid, cloneDeep, compareTimestampSchemaVersions, getWallClockTime, } from '@verdant-web/common';
2
+ export class EntityMetadata {
3
+ constructor({ oid, ctx, confirmedOperations, pendingOperations, baseline, }) {
4
+ this.baseline = null;
5
+ // these must be kept in timestamp order.
6
+ this.confirmedOperations = [];
7
+ this.pendingOperations = [];
8
+ /**
9
+ * Compute the current view of the entity.
10
+ */
11
+ this.computeView = (omitPending = false) => {
12
+ var _a, _b, _c, _d, _e, _f, _g;
13
+ const base = cloneDeep((_b = (_a = this.baseline) === null || _a === void 0 ? void 0 : _a.snapshot) !== null && _b !== void 0 ? _b : undefined);
14
+ const baselineTimestamp = (_d = (_c = this.baseline) === null || _c === void 0 ? void 0 : _c.timestamp) !== null && _d !== void 0 ? _d : null;
15
+ const confirmedResult = this.applyOperations(
16
+ // apply ops to baseline
17
+ base,
18
+ // deleted if there's no baseline
19
+ !base,
20
+ // we're applying confirmed ops first
21
+ this.confirmedOperations,
22
+ // latest timestamp is the baseline timestamp, if any
23
+ baselineTimestamp,
24
+ // only apply ops after the baseline timestamp
25
+ baselineTimestamp);
26
+ // now's the time to declare we saw the future if we did.
27
+ if (confirmedResult.futureSeen) {
28
+ this.ctx.globalEvents.emit('futureSeen', confirmedResult.futureSeen);
29
+ }
30
+ const pendingResult = omitPending
31
+ ? confirmedResult
32
+ : this.applyOperations(confirmedResult.view, confirmedResult.deleted,
33
+ // now we're applying pending operations
34
+ this.pendingOperations,
35
+ // keep our latest timestamp up to date
36
+ confirmedResult.latestTimestamp,
37
+ // we don't use after for pending ops, they're all
38
+ // logically in the future
39
+ null);
40
+ // before letting this data out into the wild, we need
41
+ // to associate its oid
42
+ if (pendingResult.view) {
43
+ assignOid(pendingResult.view, this.oid);
44
+ }
45
+ // note whether confirmed data has an operation/baseline from the current
46
+ // schema or not.
47
+ const fromOlderVersion = !!confirmedResult.latestTimestamp &&
48
+ compareTimestampSchemaVersions(confirmedResult.latestTimestamp, this.ctx.getNow()) < 0;
49
+ const empty = !this.baseline &&
50
+ !this.pendingOperations.length &&
51
+ !this.confirmedOperations.length;
52
+ if (empty) {
53
+ this.ctx.log('warn', `Tried to load Entity ${this.oid} with no data`);
54
+ }
55
+ const updatedAtTimestamp = (_f = (_e = pendingResult.latestTimestamp) !== null && _e !== void 0 ? _e : confirmedResult.latestTimestamp) !== null && _f !== void 0 ? _f : baselineTimestamp;
56
+ const updatedAt = updatedAtTimestamp
57
+ ? getWallClockTime(updatedAtTimestamp)
58
+ : 0;
59
+ if (!pendingResult.view && !pendingResult.deleted && !empty) {
60
+ this.ctx.log('warn', `Entity ${this.oid} has no view, no deleted flag, and not empty`);
61
+ debugger;
62
+ }
63
+ return {
64
+ view: (_g = pendingResult.view) !== null && _g !== void 0 ? _g : undefined,
65
+ deleted: pendingResult.deleted,
66
+ empty,
67
+ fromOlderVersion,
68
+ updatedAt,
69
+ };
70
+ };
71
+ this.addBaseline = (baseline) => {
72
+ var _a;
73
+ // opt out if our baseline is newer
74
+ if (this.baseline && this.baseline.timestamp >= baseline.timestamp) {
75
+ return;
76
+ }
77
+ this.baseline = baseline;
78
+ // we can now drop any confirmed ops older than the baseline
79
+ while (((_a = this.confirmedOperations[0]) === null || _a === void 0 ? void 0 : _a.timestamp) < baseline.timestamp) {
80
+ this.confirmedOperations.shift();
81
+ }
82
+ };
83
+ /**
84
+ * @returns total number of new operations added
85
+ */
86
+ this.addConfirmedOperations = (operations) => {
87
+ let totalAdded = 0;
88
+ // the operations must be inserted in timestamp order
89
+ for (const op of operations) {
90
+ const index = this.confirmedOperations.findIndex((o) => o.timestamp >= op.timestamp);
91
+ if (index !== -1) {
92
+ // ensure we don't have a duplicate
93
+ if (this.confirmedOperations[index].timestamp !== op.timestamp) {
94
+ // otherwise, insert at the right place
95
+ this.confirmedOperations.splice(index, 0, op);
96
+ totalAdded++;
97
+ }
98
+ }
99
+ else {
100
+ // otherwise, append
101
+ this.confirmedOperations.push(op);
102
+ totalAdded++;
103
+ }
104
+ // FIXME: seems inefficient
105
+ // remove this incoming op from pending if it's in there
106
+ const pendingPrior = this.pendingOperations.length;
107
+ this.pendingOperations = this.pendingOperations.filter((pendingOp) => op.timestamp !== pendingOp.timestamp);
108
+ totalAdded -= pendingPrior - this.pendingOperations.length;
109
+ }
110
+ return totalAdded;
111
+ };
112
+ this.addPendingOperation = (operation) => {
113
+ // we can assume pending ops are always newer
114
+ this.pendingOperations.push(operation);
115
+ };
116
+ this.applyOperations = (base, deleted, operations, latestTimestamp, after) => {
117
+ let futureSeen = undefined;
118
+ const now = this.ctx.getNow();
119
+ for (const op of operations) {
120
+ // ignore ops before our after cutoff
121
+ if (after && op.timestamp <= after) {
122
+ continue;
123
+ }
124
+ // don't apply future ops
125
+ if (compareTimestampSchemaVersions(op.timestamp, now) > 0) {
126
+ futureSeen = op.timestamp;
127
+ continue;
128
+ }
129
+ // we don't actually delete the view when a delete op
130
+ // comes in. the view remains useful for calculating
131
+ // undo operations.
132
+ if (op.data.op === 'delete') {
133
+ deleted = true;
134
+ }
135
+ else {
136
+ base = applyPatch(base, op.data);
137
+ if (op.data.op === 'initialize') {
138
+ deleted = false;
139
+ }
140
+ }
141
+ // track the latest timestamp
142
+ if (!latestTimestamp || op.timestamp > latestTimestamp) {
143
+ latestTimestamp = op.timestamp;
144
+ }
145
+ }
146
+ return {
147
+ view: base,
148
+ latestTimestamp: latestTimestamp !== null && latestTimestamp !== void 0 ? latestTimestamp : null,
149
+ deleted,
150
+ futureSeen,
151
+ };
152
+ };
153
+ assert(oid, 'oid is required');
154
+ this.ctx = ctx;
155
+ this.oid = oid;
156
+ if (confirmedOperations) {
157
+ this.confirmedOperations = confirmedOperations;
158
+ }
159
+ if (pendingOperations) {
160
+ this.pendingOperations = pendingOperations;
161
+ }
162
+ if (baseline) {
163
+ this.baseline = baseline;
164
+ }
165
+ }
166
+ }
167
+ /**
168
+ * Represents the metadata for a group of entities underneath a Document.
169
+ * Metadata is separated out this way so that these classes can be
170
+ * garbage collected when the root Document goes out of scope.
171
+ */
172
+ export class EntityFamilyMetadata {
173
+ constructor({ ctx, onPendingOperations, rootOid, }) {
174
+ this.entities = new Map();
175
+ this.get = (oid) => {
176
+ assert(oid, 'oid is required');
177
+ if (!this.entities.has(oid)) {
178
+ this.entities.set(oid, new EntityMetadata({ oid, ctx: this.ctx }));
179
+ }
180
+ return this.entities.get(oid);
181
+ };
182
+ this.getAllOids = () => {
183
+ return Array.from(this.entities.keys());
184
+ };
185
+ this.addConfirmedData = ({ baselines = [], operations = {}, isLocal = false, }) => {
186
+ var _a;
187
+ const changes = {};
188
+ for (const baseline of baselines) {
189
+ if (!areOidsRelated(this.rootOid, baseline.oid)) {
190
+ throw new Error(`Invalid baseline for entity ${this.rootOid}: ` +
191
+ JSON.stringify(baseline));
192
+ }
193
+ this.get(baseline.oid).addBaseline(baseline);
194
+ }
195
+ for (const [oid, ops] of Object.entries(operations)) {
196
+ if (!areOidsRelated(this.rootOid, oid)) {
197
+ throw new Error(`Invalid operations for entity ${this.rootOid}: ` +
198
+ JSON.stringify(ops));
199
+ }
200
+ const added = this.get(oid).addConfirmedOperations(ops);
201
+ if (added !== 0) {
202
+ (_a = changes[oid]) !== null && _a !== void 0 ? _a : (changes[oid] = { oid, isLocal });
203
+ }
204
+ }
205
+ return Object.values(changes);
206
+ };
207
+ /**
208
+ * Adds local, unconfirmed operations to the system.
209
+ * The API is different here to streamline for the way
210
+ * local changes are usually handled, as a list.
211
+ */
212
+ this.addPendingData = (operations) => {
213
+ var _a;
214
+ var _b;
215
+ const changes = {};
216
+ for (const op of operations) {
217
+ this.get(op.oid).addPendingOperation(op);
218
+ (_a = changes[_b = op.oid]) !== null && _a !== void 0 ? _a : (changes[_b] = { oid: op.oid, isLocal: true });
219
+ }
220
+ this.onPendingOperations(operations);
221
+ return Object.values(changes);
222
+ };
223
+ this.replaceAllData = ({ operations = {}, baselines = [], }) => {
224
+ var _a, _b;
225
+ var _c;
226
+ const oids = Array.from(this.entities.keys());
227
+ this.entities.clear();
228
+ const changes = {};
229
+ // changes apply to all the entities we removed things from, too
230
+ for (const oid of oids) {
231
+ changes[oid] = { oid, isLocal: false };
232
+ }
233
+ for (const baseline of baselines) {
234
+ if (!areOidsRelated(this.rootOid, baseline.oid)) {
235
+ throw new Error(`Invalid baseline for entity ${this.rootOid}: ` +
236
+ JSON.stringify(baseline));
237
+ }
238
+ this.get(baseline.oid).addBaseline(baseline);
239
+ (_a = changes[_c = baseline.oid]) !== null && _a !== void 0 ? _a : (changes[_c] = { oid: baseline.oid, isLocal: false });
240
+ }
241
+ for (const [oid, ops] of Object.entries(operations)) {
242
+ if (!areOidsRelated(this.rootOid, oid)) {
243
+ throw new Error(`Invalid operations for entity ${this.rootOid}: ` +
244
+ JSON.stringify(ops));
245
+ }
246
+ this.get(oid).addConfirmedOperations(ops);
247
+ (_b = changes[oid]) !== null && _b !== void 0 ? _b : (changes[oid] = { oid, isLocal: false });
248
+ }
249
+ return Object.values(changes);
250
+ };
251
+ this.ctx = ctx;
252
+ this.rootOid = rootOid;
253
+ this.onPendingOperations = onPendingOperations;
254
+ }
255
+ }
256
+ //# sourceMappingURL=EntityMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityMetadata.js","sourceRoot":"","sources":["../../../src/entities/EntityMetadata.ts"],"names":[],"mappings":"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"}
@@ -1,85 +1,80 @@
1
1
  import { DocumentBaseline, ObjectIdentifier, Operation } from '@verdant-web/common';
2
2
  import { Context } from '../context.js';
3
- import { FileManager } from '../files/FileManager.js';
4
3
  import { Metadata } from '../metadata/Metadata.js';
5
- export interface OperationBatch {
6
- run: (fn: () => void) => this;
7
- flush: () => Promise<void>;
8
- discard: () => void;
9
- }
10
- export declare class EntityStore {
11
- private documentFamilyCaches;
12
- meta: Metadata;
13
- private operationBatcher;
14
- files: FileManager;
15
- private context;
16
- private unsubscribes;
17
- private _disposed;
18
- private get log();
19
- private get db();
20
- private get undoHistory();
21
- private get schema();
22
- private currentBatchKey;
23
- private defaultBatchTimeout;
24
- constructor({ context, meta, batchTimeout, files, }: {
25
- context: Context;
4
+ import { Entity } from './Entity.js';
5
+ import { Disposable } from '../utils/Disposable.js';
6
+ import { FileManager } from '../files/FileManager.js';
7
+ import { WeakEvent } from 'weak-event';
8
+ import { abort } from 'process';
9
+ export type EntityStoreEventData = {
10
+ oid: ObjectIdentifier;
11
+ operations?: Record<string, Operation[]>;
12
+ baselines?: DocumentBaseline[];
13
+ isLocal: boolean;
14
+ };
15
+ export type EntityStoreEvents = {
16
+ add: WeakEvent<EntityStore, EntityStoreEventData>;
17
+ replace: WeakEvent<EntityStore, EntityStoreEventData>;
18
+ resetAll: WeakEvent<EntityStore, void>;
19
+ };
20
+ type IncomingData = {
21
+ operations?: Operation[];
22
+ baselines?: DocumentBaseline[];
23
+ reset?: boolean;
24
+ isLocal?: boolean;
25
+ };
26
+ export declare class EntityStore extends Disposable {
27
+ private ctx;
28
+ private meta;
29
+ private files;
30
+ private batcher;
31
+ private queryableStorage;
32
+ private events;
33
+ private cache;
34
+ private pendingEntityPromises;
35
+ private abortDataQueueController;
36
+ private ongoingResetPromise;
37
+ private entityFinalizationRegistry;
38
+ constructor({ ctx, meta, files, }: {
39
+ ctx: Context;
26
40
  meta: Metadata;
27
41
  files: FileManager;
28
- batchTimeout?: number;
29
42
  });
30
- setContext: (context: Context) => void;
31
- private getDocumentSchema;
32
- private refreshFamilyCache;
33
- private openFamilyCache;
34
- private onEntityChange;
35
- private writeDocumentToStorage;
36
- get: (oid: ObjectIdentifier) => Promise<import("./Entity.js").Entity<any, any, any> | null>;
37
- /**
38
- * Advanced usage!
39
- * Immediately returns an entity if it exists in the memory cache. An
40
- * entity would be cached if it has been retrieved by a live query.
41
- */
42
- getCached: (oid: ObjectIdentifier) => import("./Entity.js").Entity<any, any, any> | null;
43
- /**
44
- * Creates a new document and returns an Entity for it. The created
45
- * document is submitted to storage and sync.
46
- */
47
- create: (initial: any, oid: ObjectIdentifier, options: {
48
- undoable?: boolean;
49
- }) => Promise<import("./Entity.js").Entity<any, any, any>>;
50
- private addOperationsToOpenCaches;
51
- private addBaselinesToOpenCaches;
52
- private addDataToOpenCaches;
53
- addData: ({ operations, baselines, reset, }: {
54
- operations: Operation[];
55
- baselines: DocumentBaseline[];
56
- reset?: boolean | undefined;
57
- }) => Promise<void>;
58
- addLocalOperations: (operations: Operation[]) => Promise<void>;
59
- batch: ({ undoable, batchName, max, timeout, }?: {
43
+ get batch(): ({ undoable, batchName, max, timeout, }?: {
60
44
  undoable?: boolean | undefined;
61
45
  batchName?: string | undefined;
62
46
  max?: number | null | undefined;
63
47
  timeout?: number | null | undefined;
64
- }) => OperationBatch;
48
+ }) => import("./OperationBatcher.js").OperationBatch;
49
+ get flushAllBatches(): () => Promise<any[]>;
50
+ addData: (data: IncomingData) => Promise<void>;
51
+ private resetData;
52
+ private processData;
53
+ hydrate: (oid: string, opts?: {
54
+ abort: AbortSignal;
55
+ }) => Promise<Entity | null>;
56
+ destroy: () => Promise<void>;
65
57
  /**
66
- * @deprecated use `batch` instead
58
+ * Creates a new Entity with the given initial data.
67
59
  */
68
- flushPatches: () => Promise<void>;
69
- flushAllBatches: () => Promise<void>;
70
- private flushOperations;
71
- private submitOperations;
72
- private getInverseOperations;
73
- private createUndo;
74
- delete: (oid: ObjectIdentifier, options?: {
60
+ create: (initial: any, oid: ObjectIdentifier, { undoable }?: {
61
+ undoable?: boolean | undefined;
62
+ }) => Promise<Entity<any, any, any>>;
63
+ deleteAll: (oids: ObjectIdentifier[], options?: {
75
64
  undoable?: boolean;
76
65
  }) => Promise<void>;
77
- deleteAll: (oids: ObjectIdentifier[], options?: {
66
+ delete: (oid: ObjectIdentifier, options?: {
78
67
  undoable?: boolean;
79
68
  }) => Promise<void>;
80
- reset: () => Promise<void>;
81
- destroy: () => Promise<void>;
82
- private handleRebase;
83
- private resetStoredDocuments;
84
- private refreshAllCaches;
69
+ private getCollectionSchema;
70
+ /**
71
+ * Constructs an entity from an OID, but does not load it.
72
+ */
73
+ private constructEntity;
74
+ private onPendingOperations;
75
+ /**
76
+ * Loads initial Entity data from storage
77
+ */
78
+ private loadEntity;
85
79
  }
80
+ export {};