@fluid-experimental/tree 0.58.2001 → 0.59.2000-61729

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 (817) hide show
  1. package/README.md +159 -46
  2. package/dist/ChangeCompression.d.ts +39 -0
  3. package/dist/ChangeCompression.d.ts.map +1 -0
  4. package/dist/ChangeCompression.js +117 -0
  5. package/dist/ChangeCompression.js.map +1 -0
  6. package/{lib/default-edits/PersistedTypes.d.ts → dist/ChangeTypes.d.ts} +58 -105
  7. package/dist/ChangeTypes.d.ts.map +1 -0
  8. package/dist/{default-edits/PersistedTypes.js → ChangeTypes.js} +21 -76
  9. package/dist/ChangeTypes.js.map +1 -0
  10. package/dist/Checkout.d.ts +39 -27
  11. package/dist/Checkout.d.ts.map +1 -1
  12. package/dist/Checkout.js +61 -32
  13. package/dist/Checkout.js.map +1 -1
  14. package/dist/Common.d.ts +175 -38
  15. package/dist/Common.d.ts.map +1 -1
  16. package/dist/Common.js +240 -103
  17. package/dist/Common.js.map +1 -1
  18. package/dist/EagerCheckout.d.ts +24 -0
  19. package/dist/EagerCheckout.d.ts.map +1 -0
  20. package/dist/{BasicCheckout.js → EagerCheckout.js} +9 -6
  21. package/dist/EagerCheckout.js.map +1 -0
  22. package/dist/EditLog.d.ts +77 -63
  23. package/dist/EditLog.d.ts.map +1 -1
  24. package/dist/EditLog.js +85 -48
  25. package/dist/EditLog.js.map +1 -1
  26. package/dist/EditUtilities.d.ts +168 -0
  27. package/dist/EditUtilities.d.ts.map +1 -0
  28. package/dist/EditUtilities.js +373 -0
  29. package/dist/EditUtilities.js.map +1 -0
  30. package/dist/EventTypes.d.ts +73 -0
  31. package/dist/EventTypes.d.ts.map +1 -0
  32. package/dist/EventTypes.js +78 -0
  33. package/dist/EventTypes.js.map +1 -0
  34. package/dist/Forest.d.ts +29 -7
  35. package/dist/Forest.d.ts.map +1 -1
  36. package/dist/Forest.js +60 -36
  37. package/dist/Forest.js.map +1 -1
  38. package/dist/HistoryEditFactory.d.ts +20 -0
  39. package/dist/HistoryEditFactory.d.ts.map +1 -0
  40. package/dist/HistoryEditFactory.js +226 -0
  41. package/dist/HistoryEditFactory.js.map +1 -0
  42. package/dist/IdConversion.d.ts +12 -0
  43. package/dist/IdConversion.d.ts.map +1 -0
  44. package/dist/IdConversion.js +98 -0
  45. package/dist/IdConversion.js.map +1 -0
  46. package/dist/Identifiers.d.ts +89 -2
  47. package/dist/Identifiers.d.ts.map +1 -1
  48. package/dist/Identifiers.js +10 -0
  49. package/dist/Identifiers.js.map +1 -1
  50. package/dist/InitialTree.d.ts +2 -2
  51. package/dist/InitialTree.d.ts.map +1 -1
  52. package/dist/InitialTree.js +2 -1
  53. package/dist/InitialTree.js.map +1 -1
  54. package/dist/LazyCheckout.d.ts +28 -0
  55. package/dist/LazyCheckout.d.ts.map +1 -0
  56. package/dist/LazyCheckout.js +44 -0
  57. package/dist/LazyCheckout.js.map +1 -0
  58. package/dist/LogViewer.d.ts +129 -85
  59. package/dist/LogViewer.d.ts.map +1 -1
  60. package/dist/LogViewer.js +111 -85
  61. package/dist/LogViewer.js.map +1 -1
  62. package/dist/MergeHealth.d.ts +221 -0
  63. package/dist/MergeHealth.d.ts.map +1 -0
  64. package/dist/MergeHealth.js +263 -0
  65. package/dist/MergeHealth.js.map +1 -0
  66. package/dist/NodeIdUtilities.d.ts +105 -0
  67. package/dist/NodeIdUtilities.d.ts.map +1 -0
  68. package/dist/NodeIdUtilities.js +60 -0
  69. package/dist/NodeIdUtilities.js.map +1 -0
  70. package/dist/PayloadUtilities.d.ts +42 -0
  71. package/dist/PayloadUtilities.d.ts.map +1 -0
  72. package/dist/PayloadUtilities.js +114 -0
  73. package/dist/PayloadUtilities.js.map +1 -0
  74. package/dist/ReconciliationPath.d.ts +18 -13
  75. package/dist/ReconciliationPath.d.ts.map +1 -1
  76. package/dist/ReconciliationPath.js.map +1 -1
  77. package/dist/RevisionValueCache.d.ts +11 -2
  78. package/dist/RevisionValueCache.d.ts.map +1 -1
  79. package/dist/RevisionValueCache.js +2 -3
  80. package/dist/RevisionValueCache.js.map +1 -1
  81. package/dist/RevisionView.d.ts +83 -0
  82. package/dist/RevisionView.d.ts.map +1 -0
  83. package/dist/RevisionView.js +182 -0
  84. package/dist/RevisionView.js.map +1 -0
  85. package/dist/SerializationUtilities.d.ts +36 -0
  86. package/dist/SerializationUtilities.d.ts.map +1 -0
  87. package/dist/SerializationUtilities.js +102 -0
  88. package/dist/SerializationUtilities.js.map +1 -0
  89. package/dist/SharedTree.d.ts +439 -0
  90. package/dist/SharedTree.d.ts.map +1 -0
  91. package/dist/SharedTree.js +1109 -0
  92. package/dist/SharedTree.js.map +1 -0
  93. package/dist/SharedTreeEncoder.d.ts +102 -0
  94. package/dist/SharedTreeEncoder.d.ts.map +1 -0
  95. package/dist/SharedTreeEncoder.js +313 -0
  96. package/dist/SharedTreeEncoder.js.map +1 -0
  97. package/dist/StringInterner.d.ts +46 -0
  98. package/dist/StringInterner.d.ts.map +1 -0
  99. package/dist/StringInterner.js +61 -0
  100. package/dist/StringInterner.js.map +1 -0
  101. package/dist/Summary.d.ts +40 -0
  102. package/dist/Summary.d.ts.map +1 -0
  103. package/dist/Summary.js +23 -0
  104. package/dist/Summary.js.map +1 -0
  105. package/dist/SummaryBackCompatibility.d.ts +22 -22
  106. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  107. package/dist/SummaryBackCompatibility.js +30 -33
  108. package/dist/SummaryBackCompatibility.js.map +1 -1
  109. package/dist/SummaryTestUtilities.d.ts +31 -0
  110. package/dist/SummaryTestUtilities.d.ts.map +1 -0
  111. package/dist/SummaryTestUtilities.js +37 -0
  112. package/dist/SummaryTestUtilities.js.map +1 -0
  113. package/dist/Transaction.d.ts +71 -0
  114. package/dist/Transaction.d.ts.map +1 -0
  115. package/dist/Transaction.js +92 -0
  116. package/dist/Transaction.js.map +1 -0
  117. package/dist/TransactionInternal.d.ts +540 -0
  118. package/dist/TransactionInternal.d.ts.map +1 -0
  119. package/dist/TransactionInternal.js +626 -0
  120. package/dist/TransactionInternal.js.map +1 -0
  121. package/dist/TreeCompressor.d.ts +36 -0
  122. package/dist/TreeCompressor.d.ts.map +1 -0
  123. package/dist/TreeCompressor.js +137 -0
  124. package/dist/TreeCompressor.js.map +1 -0
  125. package/dist/TreeNodeHandle.d.ts +12 -18
  126. package/dist/TreeNodeHandle.d.ts.map +1 -1
  127. package/dist/TreeNodeHandle.js +13 -23
  128. package/dist/TreeNodeHandle.js.map +1 -1
  129. package/dist/TreeView.d.ts +166 -0
  130. package/dist/TreeView.d.ts.map +1 -0
  131. package/dist/TreeView.js +218 -0
  132. package/dist/TreeView.js.map +1 -0
  133. package/dist/TreeViewUtilities.d.ts +21 -0
  134. package/dist/TreeViewUtilities.d.ts.map +1 -0
  135. package/dist/TreeViewUtilities.js +77 -0
  136. package/dist/TreeViewUtilities.js.map +1 -0
  137. package/dist/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
  138. package/dist/UndoRedoHandler.d.ts.map +1 -0
  139. package/dist/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +5 -9
  140. package/dist/UndoRedoHandler.js.map +1 -0
  141. package/dist/id-compressor/AppendOnlySortedMap.d.ts +127 -0
  142. package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
  143. package/dist/id-compressor/AppendOnlySortedMap.js +283 -0
  144. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -0
  145. package/dist/id-compressor/IdCompressor.d.ts +389 -0
  146. package/dist/id-compressor/IdCompressor.d.ts.map +1 -0
  147. package/dist/id-compressor/IdCompressor.js +1353 -0
  148. package/dist/id-compressor/IdCompressor.js.map +1 -0
  149. package/dist/id-compressor/IdRange.d.ts +11 -0
  150. package/dist/id-compressor/IdRange.d.ts.map +1 -0
  151. package/dist/id-compressor/IdRange.js +29 -0
  152. package/dist/id-compressor/IdRange.js.map +1 -0
  153. package/dist/id-compressor/NumericUuid.d.ts +63 -0
  154. package/dist/id-compressor/NumericUuid.d.ts.map +1 -0
  155. package/dist/id-compressor/NumericUuid.js +377 -0
  156. package/dist/id-compressor/NumericUuid.js.map +1 -0
  157. package/dist/id-compressor/index.d.ts +12 -0
  158. package/dist/id-compressor/index.d.ts.map +1 -0
  159. package/dist/id-compressor/index.js +26 -0
  160. package/dist/id-compressor/index.js.map +1 -0
  161. package/dist/id-compressor/persisted-types/0.0.1.d.ts +156 -0
  162. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
  163. package/dist/id-compressor/persisted-types/0.0.1.js +7 -0
  164. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -0
  165. package/dist/id-compressor/persisted-types/index.d.ts +6 -0
  166. package/dist/id-compressor/persisted-types/index.d.ts.map +1 -0
  167. package/dist/id-compressor/persisted-types/index.js +18 -0
  168. package/dist/id-compressor/persisted-types/index.js.map +1 -0
  169. package/dist/index.d.ts +29 -9
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +50 -35
  172. package/dist/index.js.map +1 -1
  173. package/dist/persisted-types/0.0.2.d.ts +385 -0
  174. package/dist/persisted-types/0.0.2.d.ts.map +1 -0
  175. package/dist/persisted-types/0.0.2.js +113 -0
  176. package/dist/persisted-types/0.0.2.js.map +1 -0
  177. package/dist/persisted-types/0.1.1.d.ts +314 -0
  178. package/dist/persisted-types/0.1.1.d.ts.map +1 -0
  179. package/dist/persisted-types/0.1.1.js +153 -0
  180. package/dist/persisted-types/0.1.1.js.map +1 -0
  181. package/dist/persisted-types/index.d.ts +7 -0
  182. package/dist/persisted-types/index.d.ts.map +1 -0
  183. package/dist/persisted-types/index.js +20 -0
  184. package/dist/persisted-types/index.js.map +1 -0
  185. package/docs/0-1-1-Compression.md +228 -0
  186. package/docs/Breaking-Change-Migration.md +52 -0
  187. package/docs/Compression.md +2 -2
  188. package/docs/Telemetry.md +43 -0
  189. package/docs/Write-Format.md +19 -0
  190. package/lib/ChangeCompression.d.ts +39 -0
  191. package/lib/ChangeCompression.d.ts.map +1 -0
  192. package/lib/ChangeCompression.js +111 -0
  193. package/lib/ChangeCompression.js.map +1 -0
  194. package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -105
  195. package/lib/ChangeTypes.d.ts.map +1 -0
  196. package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
  197. package/lib/ChangeTypes.js.map +1 -0
  198. package/lib/Checkout.d.ts +39 -27
  199. package/lib/Checkout.d.ts.map +1 -1
  200. package/lib/Checkout.js +53 -24
  201. package/lib/Checkout.js.map +1 -1
  202. package/lib/Common.d.ts +175 -38
  203. package/lib/Common.d.ts.map +1 -1
  204. package/lib/Common.js +226 -101
  205. package/lib/Common.js.map +1 -1
  206. package/lib/EagerCheckout.d.ts +24 -0
  207. package/lib/EagerCheckout.d.ts.map +1 -0
  208. package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
  209. package/lib/EagerCheckout.js.map +1 -0
  210. package/lib/EditLog.d.ts +77 -63
  211. package/lib/EditLog.d.ts.map +1 -1
  212. package/lib/EditLog.js +83 -47
  213. package/lib/EditLog.js.map +1 -1
  214. package/lib/EditUtilities.d.ts +168 -0
  215. package/lib/EditUtilities.d.ts.map +1 -0
  216. package/lib/EditUtilities.js +353 -0
  217. package/lib/EditUtilities.js.map +1 -0
  218. package/lib/EventTypes.d.ts +73 -0
  219. package/lib/EventTypes.d.ts.map +1 -0
  220. package/lib/EventTypes.js +75 -0
  221. package/lib/EventTypes.js.map +1 -0
  222. package/lib/Forest.d.ts +29 -7
  223. package/lib/Forest.d.ts.map +1 -1
  224. package/lib/Forest.js +58 -35
  225. package/lib/Forest.js.map +1 -1
  226. package/lib/HistoryEditFactory.d.ts +20 -0
  227. package/lib/HistoryEditFactory.d.ts.map +1 -0
  228. package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
  229. package/lib/HistoryEditFactory.js.map +1 -0
  230. package/lib/IdConversion.d.ts +12 -0
  231. package/lib/IdConversion.d.ts.map +1 -0
  232. package/lib/IdConversion.js +91 -0
  233. package/lib/IdConversion.js.map +1 -0
  234. package/lib/Identifiers.d.ts +89 -2
  235. package/lib/Identifiers.d.ts.map +1 -1
  236. package/lib/Identifiers.js +8 -1
  237. package/lib/Identifiers.js.map +1 -1
  238. package/lib/InitialTree.d.ts +2 -2
  239. package/lib/InitialTree.d.ts.map +1 -1
  240. package/lib/InitialTree.js +2 -1
  241. package/lib/InitialTree.js.map +1 -1
  242. package/lib/LazyCheckout.d.ts +28 -0
  243. package/lib/LazyCheckout.d.ts.map +1 -0
  244. package/lib/LazyCheckout.js +40 -0
  245. package/lib/LazyCheckout.js.map +1 -0
  246. package/lib/LogViewer.d.ts +129 -85
  247. package/lib/LogViewer.d.ts.map +1 -1
  248. package/lib/LogViewer.js +103 -77
  249. package/lib/LogViewer.js.map +1 -1
  250. package/lib/MergeHealth.d.ts +221 -0
  251. package/lib/MergeHealth.d.ts.map +1 -0
  252. package/lib/MergeHealth.js +258 -0
  253. package/lib/MergeHealth.js.map +1 -0
  254. package/lib/NodeIdUtilities.d.ts +105 -0
  255. package/lib/NodeIdUtilities.d.ts.map +1 -0
  256. package/lib/NodeIdUtilities.js +53 -0
  257. package/lib/NodeIdUtilities.js.map +1 -0
  258. package/lib/PayloadUtilities.d.ts +42 -0
  259. package/lib/PayloadUtilities.d.ts.map +1 -0
  260. package/lib/PayloadUtilities.js +110 -0
  261. package/lib/PayloadUtilities.js.map +1 -0
  262. package/lib/ReconciliationPath.d.ts +18 -13
  263. package/lib/ReconciliationPath.d.ts.map +1 -1
  264. package/lib/ReconciliationPath.js.map +1 -1
  265. package/lib/RevisionValueCache.d.ts +11 -2
  266. package/lib/RevisionValueCache.d.ts.map +1 -1
  267. package/lib/RevisionValueCache.js +2 -3
  268. package/lib/RevisionValueCache.js.map +1 -1
  269. package/lib/RevisionView.d.ts +83 -0
  270. package/lib/RevisionView.d.ts.map +1 -0
  271. package/lib/RevisionView.js +175 -0
  272. package/lib/RevisionView.js.map +1 -0
  273. package/lib/SerializationUtilities.d.ts +36 -0
  274. package/lib/SerializationUtilities.d.ts.map +1 -0
  275. package/lib/SerializationUtilities.js +95 -0
  276. package/lib/SerializationUtilities.js.map +1 -0
  277. package/lib/SharedTree.d.ts +439 -0
  278. package/lib/SharedTree.d.ts.map +1 -0
  279. package/lib/SharedTree.js +1104 -0
  280. package/lib/SharedTree.js.map +1 -0
  281. package/lib/SharedTreeEncoder.d.ts +102 -0
  282. package/lib/SharedTreeEncoder.d.ts.map +1 -0
  283. package/lib/SharedTreeEncoder.js +308 -0
  284. package/lib/SharedTreeEncoder.js.map +1 -0
  285. package/lib/StringInterner.d.ts +46 -0
  286. package/lib/StringInterner.d.ts.map +1 -0
  287. package/lib/StringInterner.js +57 -0
  288. package/lib/StringInterner.js.map +1 -0
  289. package/lib/Summary.d.ts +40 -0
  290. package/lib/Summary.d.ts.map +1 -0
  291. package/lib/Summary.js +19 -0
  292. package/lib/Summary.js.map +1 -0
  293. package/lib/SummaryBackCompatibility.d.ts +22 -22
  294. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  295. package/lib/SummaryBackCompatibility.js +29 -32
  296. package/lib/SummaryBackCompatibility.js.map +1 -1
  297. package/lib/SummaryTestUtilities.d.ts +31 -0
  298. package/lib/SummaryTestUtilities.d.ts.map +1 -0
  299. package/lib/SummaryTestUtilities.js +32 -0
  300. package/lib/SummaryTestUtilities.js.map +1 -0
  301. package/lib/Transaction.d.ts +71 -0
  302. package/lib/Transaction.d.ts.map +1 -0
  303. package/lib/Transaction.js +88 -0
  304. package/lib/Transaction.js.map +1 -0
  305. package/lib/TransactionInternal.d.ts +540 -0
  306. package/lib/TransactionInternal.d.ts.map +1 -0
  307. package/lib/TransactionInternal.js +622 -0
  308. package/lib/TransactionInternal.js.map +1 -0
  309. package/lib/TreeCompressor.d.ts +36 -0
  310. package/lib/TreeCompressor.d.ts.map +1 -0
  311. package/lib/TreeCompressor.js +133 -0
  312. package/lib/TreeCompressor.js.map +1 -0
  313. package/lib/TreeNodeHandle.d.ts +12 -18
  314. package/lib/TreeNodeHandle.d.ts.map +1 -1
  315. package/lib/TreeNodeHandle.js +14 -24
  316. package/lib/TreeNodeHandle.js.map +1 -1
  317. package/lib/TreeView.d.ts +166 -0
  318. package/lib/TreeView.d.ts.map +1 -0
  319. package/lib/TreeView.js +214 -0
  320. package/lib/TreeView.js.map +1 -0
  321. package/lib/TreeViewUtilities.d.ts +21 -0
  322. package/lib/TreeViewUtilities.d.ts.map +1 -0
  323. package/lib/TreeViewUtilities.js +71 -0
  324. package/lib/TreeViewUtilities.js.map +1 -0
  325. package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
  326. package/lib/UndoRedoHandler.d.ts.map +1 -0
  327. package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
  328. package/lib/UndoRedoHandler.js.map +1 -0
  329. package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
  330. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
  331. package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
  332. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
  333. package/lib/id-compressor/IdCompressor.d.ts +389 -0
  334. package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
  335. package/lib/id-compressor/IdCompressor.js +1343 -0
  336. package/lib/id-compressor/IdCompressor.js.map +1 -0
  337. package/lib/id-compressor/IdRange.d.ts +11 -0
  338. package/lib/id-compressor/IdRange.d.ts.map +1 -0
  339. package/lib/id-compressor/IdRange.js +25 -0
  340. package/lib/id-compressor/IdRange.js.map +1 -0
  341. package/lib/id-compressor/NumericUuid.d.ts +63 -0
  342. package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
  343. package/lib/id-compressor/NumericUuid.js +365 -0
  344. package/lib/id-compressor/NumericUuid.js.map +1 -0
  345. package/lib/id-compressor/index.d.ts +12 -0
  346. package/lib/id-compressor/index.d.ts.map +1 -0
  347. package/lib/id-compressor/index.js +12 -0
  348. package/lib/id-compressor/index.js.map +1 -0
  349. package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
  350. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
  351. package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
  352. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
  353. package/lib/id-compressor/persisted-types/index.d.ts +6 -0
  354. package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
  355. package/lib/id-compressor/persisted-types/index.js +6 -0
  356. package/lib/id-compressor/persisted-types/index.js.map +1 -0
  357. package/lib/index.d.ts +29 -9
  358. package/lib/index.d.ts.map +1 -1
  359. package/lib/index.js +23 -6
  360. package/lib/index.js.map +1 -1
  361. package/lib/persisted-types/0.0.2.d.ts +385 -0
  362. package/lib/persisted-types/0.0.2.d.ts.map +1 -0
  363. package/lib/persisted-types/0.0.2.js +110 -0
  364. package/lib/persisted-types/0.0.2.js.map +1 -0
  365. package/lib/persisted-types/0.1.1.d.ts +314 -0
  366. package/lib/persisted-types/0.1.1.d.ts.map +1 -0
  367. package/lib/persisted-types/0.1.1.js +150 -0
  368. package/lib/persisted-types/0.1.1.js.map +1 -0
  369. package/lib/persisted-types/index.d.ts +7 -0
  370. package/lib/persisted-types/index.d.ts.map +1 -0
  371. package/lib/persisted-types/index.js +8 -0
  372. package/lib/persisted-types/index.js.map +1 -0
  373. package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
  374. package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
  375. package/lib/test/AppendOnlySortedMap.tests.js +169 -0
  376. package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
  377. package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
  378. package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
  379. package/lib/test/ChangeCompression.tests.js +145 -0
  380. package/lib/test/ChangeCompression.tests.js.map +1 -0
  381. package/lib/test/Checkout.tests.d.ts +2 -3
  382. package/lib/test/Checkout.tests.d.ts.map +1 -1
  383. package/lib/test/Checkout.tests.js +126 -69
  384. package/lib/test/Checkout.tests.js.map +1 -1
  385. package/lib/test/Common.tests.js +60 -2
  386. package/lib/test/Common.tests.js.map +1 -1
  387. package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
  388. package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
  389. package/lib/test/EagerCheckout.tests.js +20 -0
  390. package/lib/test/EagerCheckout.tests.js.map +1 -0
  391. package/lib/test/Edit.tests.js +22 -14
  392. package/lib/test/Edit.tests.js.map +1 -1
  393. package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
  394. package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
  395. package/lib/test/EditLog.perf.tests.js +30 -0
  396. package/lib/test/EditLog.perf.tests.js.map +1 -0
  397. package/lib/test/EditLog.tests.js +10 -6
  398. package/lib/test/EditLog.tests.js.map +1 -1
  399. package/lib/test/EditUtilities.tests.d.ts +6 -0
  400. package/lib/test/EditUtilities.tests.d.ts.map +1 -0
  401. package/lib/test/EditUtilities.tests.js +503 -0
  402. package/lib/test/EditUtilities.tests.js.map +1 -0
  403. package/lib/test/Forest.perf.tests.d.ts +6 -0
  404. package/lib/test/Forest.perf.tests.d.ts.map +1 -0
  405. package/lib/test/Forest.perf.tests.js +133 -0
  406. package/lib/test/Forest.perf.tests.js.map +1 -0
  407. package/lib/test/Forest.tests.js +54 -27
  408. package/lib/test/Forest.tests.js.map +1 -1
  409. package/lib/test/GenericTransaction.tests.js +12 -3
  410. package/lib/test/GenericTransaction.tests.js.map +1 -1
  411. package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
  412. package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
  413. package/lib/test/HistoryEditFactory.tests.js +90 -0
  414. package/lib/test/HistoryEditFactory.tests.js.map +1 -0
  415. package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
  416. package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
  417. package/lib/test/IdCompressor.perf.tests.js +304 -0
  418. package/lib/test/IdCompressor.perf.tests.js.map +1 -0
  419. package/lib/test/IdCompressor.tests.d.ts +6 -0
  420. package/lib/test/IdCompressor.tests.d.ts.map +1 -0
  421. package/lib/test/IdCompressor.tests.js +1075 -0
  422. package/lib/test/IdCompressor.tests.js.map +1 -0
  423. package/lib/test/IdConversion.tests.d.ts +6 -0
  424. package/lib/test/IdConversion.tests.d.ts.map +1 -0
  425. package/lib/test/IdConversion.tests.js +36 -0
  426. package/lib/test/IdConversion.tests.js.map +1 -0
  427. package/lib/test/LazyCheckout.tests.d.ts +6 -0
  428. package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
  429. package/lib/test/LazyCheckout.tests.js +22 -0
  430. package/lib/test/LazyCheckout.tests.js.map +1 -0
  431. package/lib/test/LogViewer.tests.js +276 -191
  432. package/lib/test/LogViewer.tests.js.map +1 -1
  433. package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
  434. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
  435. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
  436. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
  437. package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
  438. package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
  439. package/lib/test/NumericUuid.perf.tests.js +68 -0
  440. package/lib/test/NumericUuid.perf.tests.js.map +1 -0
  441. package/lib/test/NumericUuid.tests.d.ts +6 -0
  442. package/lib/test/NumericUuid.tests.d.ts.map +1 -0
  443. package/lib/test/NumericUuid.tests.js +191 -0
  444. package/lib/test/NumericUuid.tests.js.map +1 -0
  445. package/lib/test/RevisionView.tests.d.ts +6 -0
  446. package/lib/test/RevisionView.tests.d.ts.map +1 -0
  447. package/lib/test/RevisionView.tests.js +133 -0
  448. package/lib/test/RevisionView.tests.js.map +1 -0
  449. package/lib/test/SharedTree.perf.tests.d.ts +6 -0
  450. package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
  451. package/lib/test/SharedTree.perf.tests.js +39 -0
  452. package/lib/test/SharedTree.perf.tests.js.map +1 -0
  453. package/lib/test/SharedTree.tests.js +15 -3
  454. package/lib/test/SharedTree.tests.js.map +1 -1
  455. package/lib/test/StringInterner.tests.d.ts +6 -0
  456. package/lib/test/StringInterner.tests.d.ts.map +1 -0
  457. package/lib/test/StringInterner.tests.js +71 -0
  458. package/lib/test/StringInterner.tests.js.map +1 -0
  459. package/lib/test/Summary.tests.d.ts +8 -0
  460. package/lib/test/Summary.tests.d.ts.map +1 -0
  461. package/lib/test/Summary.tests.js +407 -0
  462. package/lib/test/Summary.tests.js.map +1 -0
  463. package/lib/test/Transaction.tests.js +109 -329
  464. package/lib/test/Transaction.tests.js.map +1 -1
  465. package/lib/test/TransactionInternal.tests.d.ts +6 -0
  466. package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
  467. package/lib/test/TransactionInternal.tests.js +568 -0
  468. package/lib/test/TransactionInternal.tests.js.map +1 -0
  469. package/lib/test/TreeCompression.tests.d.ts +6 -0
  470. package/lib/test/TreeCompression.tests.d.ts.map +1 -0
  471. package/lib/test/TreeCompression.tests.js +292 -0
  472. package/lib/test/TreeCompression.tests.js.map +1 -0
  473. package/lib/test/TreeView.tests.d.ts +6 -0
  474. package/lib/test/TreeView.tests.d.ts.map +1 -0
  475. package/lib/test/TreeView.tests.js +176 -0
  476. package/lib/test/TreeView.tests.js.map +1 -0
  477. package/lib/test/UndoRedoHandler.tests.js +2 -2
  478. package/lib/test/UndoRedoHandler.tests.js.map +1 -1
  479. package/lib/test/Virtualization.tests.js +146 -62
  480. package/lib/test/Virtualization.tests.js.map +1 -1
  481. package/lib/test/fuzz/Generators.d.ts +19 -0
  482. package/lib/test/fuzz/Generators.d.ts.map +1 -0
  483. package/lib/test/fuzz/Generators.js +420 -0
  484. package/lib/test/fuzz/Generators.js.map +1 -0
  485. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
  486. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
  487. package/lib/test/fuzz/SharedTreeFuzzTests.js +217 -0
  488. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
  489. package/lib/test/fuzz/Types.d.ts +133 -0
  490. package/lib/test/fuzz/Types.d.ts.map +1 -0
  491. package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
  492. package/lib/test/fuzz/Types.js.map +1 -0
  493. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
  494. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
  495. package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
  496. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
  497. package/lib/test/utilities/MockTransaction.d.ts +26 -7
  498. package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
  499. package/lib/test/utilities/MockTransaction.js +40 -11
  500. package/lib/test/utilities/MockTransaction.js.map +1 -1
  501. package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
  502. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
  503. package/lib/test/utilities/PendingLocalStateTests.js +105 -0
  504. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
  505. package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
  506. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  507. package/lib/test/utilities/SharedTreeTests.js +696 -439
  508. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  509. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
  510. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
  511. package/lib/test/utilities/SharedTreeVersioningTests.js +370 -0
  512. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
  513. package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
  514. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
  515. package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
  516. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
  517. package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
  518. package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
  519. package/lib/test/utilities/SummarySizeTests.js +158 -0
  520. package/lib/test/utilities/SummarySizeTests.js.map +1 -0
  521. package/lib/test/utilities/TestCommon.d.ts +9 -0
  522. package/lib/test/utilities/TestCommon.d.ts.map +1 -0
  523. package/lib/test/utilities/TestCommon.js +13 -0
  524. package/lib/test/utilities/TestCommon.js.map +1 -0
  525. package/lib/test/utilities/TestNode.d.ts +140 -0
  526. package/lib/test/utilities/TestNode.d.ts.map +1 -0
  527. package/lib/test/utilities/TestNode.js +292 -0
  528. package/lib/test/utilities/TestNode.js.map +1 -0
  529. package/lib/test/utilities/TestUtilities.d.ts +84 -70
  530. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  531. package/lib/test/utilities/TestUtilities.js +218 -143
  532. package/lib/test/utilities/TestUtilities.js.map +1 -1
  533. package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
  534. package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
  535. package/lib/test/utilities/UndoRedoTests.js +138 -149
  536. package/lib/test/utilities/UndoRedoTests.js.map +1 -1
  537. package/package.json +22 -17
  538. package/src/ChangeCompression.ts +159 -0
  539. package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -125
  540. package/src/Checkout.ts +82 -53
  541. package/src/Common.ts +317 -117
  542. package/src/EagerCheckout.ts +38 -0
  543. package/src/EditLog.ts +153 -100
  544. package/src/EditUtilities.ts +559 -0
  545. package/src/EventTypes.ts +74 -0
  546. package/src/Forest.ts +81 -73
  547. package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
  548. package/src/IdConversion.ts +125 -0
  549. package/src/Identifiers.ts +101 -1
  550. package/src/InitialTree.ts +5 -4
  551. package/src/LazyCheckout.ts +51 -0
  552. package/src/LogViewer.ts +242 -166
  553. package/src/MergeHealth.ts +447 -0
  554. package/src/NodeIdUtilities.ts +156 -0
  555. package/src/PayloadUtilities.ts +124 -0
  556. package/src/ReconciliationPath.ts +18 -13
  557. package/src/RevisionValueCache.ts +14 -5
  558. package/src/RevisionView.ts +252 -0
  559. package/src/SerializationUtilities.ts +130 -0
  560. package/src/SharedTree.ts +1501 -0
  561. package/src/SharedTreeEncoder.ts +493 -0
  562. package/src/StringInterner.ts +72 -0
  563. package/src/Summary.ts +48 -0
  564. package/src/SummaryBackCompatibility.ts +47 -57
  565. package/src/SummaryTestUtilities.ts +54 -0
  566. package/src/Transaction.ts +120 -0
  567. package/src/TransactionInternal.ts +1087 -0
  568. package/src/TreeCompressor.ts +213 -0
  569. package/src/TreeNodeHandle.ts +19 -32
  570. package/src/TreeView.ts +322 -0
  571. package/src/TreeViewUtilities.ts +77 -0
  572. package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
  573. package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
  574. package/src/id-compressor/IdCompressor.md +3 -0
  575. package/src/id-compressor/IdCompressor.ts +1848 -0
  576. package/src/id-compressor/IdRange.ts +33 -0
  577. package/src/id-compressor/NumericUuid.ts +414 -0
  578. package/src/id-compressor/index.ts +13 -0
  579. package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
  580. package/src/id-compressor/persisted-types/README.md +3 -0
  581. package/src/id-compressor/persisted-types/index.ts +6 -0
  582. package/src/index.ts +118 -59
  583. package/src/persisted-types/0.0.2.ts +442 -0
  584. package/src/persisted-types/0.1.1.ts +476 -0
  585. package/src/persisted-types/README.md +22 -0
  586. package/src/persisted-types/index.ts +9 -0
  587. package/.mocharc.js +0 -41
  588. package/api/tree.api.md +0 -729
  589. package/dist/BasicCheckout.d.ts +0 -23
  590. package/dist/BasicCheckout.d.ts.map +0 -1
  591. package/dist/BasicCheckout.js.map +0 -1
  592. package/dist/Snapshot.d.ts +0 -198
  593. package/dist/Snapshot.d.ts.map +0 -1
  594. package/dist/Snapshot.js +0 -267
  595. package/dist/Snapshot.js.map +0 -1
  596. package/dist/SnapshotUtilities.d.ts +0 -29
  597. package/dist/SnapshotUtilities.d.ts.map +0 -1
  598. package/dist/SnapshotUtilities.js +0 -73
  599. package/dist/SnapshotUtilities.js.map +0 -1
  600. package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
  601. package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
  602. package/dist/anchored-edits/AnchorResolution.js +0 -162
  603. package/dist/anchored-edits/AnchorResolution.js.map +0 -1
  604. package/dist/anchored-edits/Factory.d.ts +0 -56
  605. package/dist/anchored-edits/Factory.d.ts.map +0 -1
  606. package/dist/anchored-edits/Factory.js +0 -79
  607. package/dist/anchored-edits/Factory.js.map +0 -1
  608. package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
  609. package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
  610. package/dist/anchored-edits/PersistedTypes.js +0 -131
  611. package/dist/anchored-edits/PersistedTypes.js.map +0 -1
  612. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  613. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  614. package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
  615. package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  616. package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  617. package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  618. package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
  619. package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
  620. package/dist/anchored-edits/index.d.ts +0 -10
  621. package/dist/anchored-edits/index.d.ts.map +0 -1
  622. package/dist/anchored-edits/index.js +0 -34
  623. package/dist/anchored-edits/index.js.map +0 -1
  624. package/dist/default-edits/EditUtilities.d.ts +0 -57
  625. package/dist/default-edits/EditUtilities.d.ts.map +0 -1
  626. package/dist/default-edits/EditUtilities.js +0 -192
  627. package/dist/default-edits/EditUtilities.js.map +0 -1
  628. package/dist/default-edits/Factory.d.ts +0 -56
  629. package/dist/default-edits/Factory.d.ts.map +0 -1
  630. package/dist/default-edits/Factory.js +0 -79
  631. package/dist/default-edits/Factory.js.map +0 -1
  632. package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
  633. package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
  634. package/dist/default-edits/HistoryEditFactory.js +0 -187
  635. package/dist/default-edits/HistoryEditFactory.js.map +0 -1
  636. package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
  637. package/dist/default-edits/PersistedTypes.js.map +0 -1
  638. package/dist/default-edits/SharedTree.d.ts +0 -111
  639. package/dist/default-edits/SharedTree.d.ts.map +0 -1
  640. package/dist/default-edits/SharedTree.js +0 -124
  641. package/dist/default-edits/SharedTree.js.map +0 -1
  642. package/dist/default-edits/Summary.d.ts +0 -15
  643. package/dist/default-edits/Summary.d.ts.map +0 -1
  644. package/dist/default-edits/Summary.js +0 -35
  645. package/dist/default-edits/Summary.js.map +0 -1
  646. package/dist/default-edits/Transaction.d.ts +0 -41
  647. package/dist/default-edits/Transaction.d.ts.map +0 -1
  648. package/dist/default-edits/Transaction.js +0 -225
  649. package/dist/default-edits/Transaction.js.map +0 -1
  650. package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
  651. package/dist/default-edits/UndoRedoHandler.js.map +0 -1
  652. package/dist/default-edits/index.d.ts +0 -13
  653. package/dist/default-edits/index.d.ts.map +0 -1
  654. package/dist/default-edits/index.js +0 -41
  655. package/dist/default-edits/index.js.map +0 -1
  656. package/dist/generic/GenericEditUtilities.d.ts +0 -26
  657. package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
  658. package/dist/generic/GenericEditUtilities.js +0 -45
  659. package/dist/generic/GenericEditUtilities.js.map +0 -1
  660. package/dist/generic/GenericSharedTree.d.ts +0 -221
  661. package/dist/generic/GenericSharedTree.d.ts.map +0 -1
  662. package/dist/generic/GenericSharedTree.js +0 -447
  663. package/dist/generic/GenericSharedTree.js.map +0 -1
  664. package/dist/generic/GenericTransaction.d.ts +0 -87
  665. package/dist/generic/GenericTransaction.d.ts.map +0 -1
  666. package/dist/generic/GenericTransaction.js +0 -144
  667. package/dist/generic/GenericTransaction.js.map +0 -1
  668. package/dist/generic/PersistedTypes.d.ts +0 -194
  669. package/dist/generic/PersistedTypes.d.ts.map +0 -1
  670. package/dist/generic/PersistedTypes.js +0 -42
  671. package/dist/generic/PersistedTypes.js.map +0 -1
  672. package/dist/generic/Summary.d.ts +0 -63
  673. package/dist/generic/Summary.d.ts.map +0 -1
  674. package/dist/generic/Summary.js +0 -64
  675. package/dist/generic/Summary.js.map +0 -1
  676. package/dist/generic/index.d.ts +0 -10
  677. package/dist/generic/index.d.ts.map +0 -1
  678. package/dist/generic/index.js +0 -26
  679. package/dist/generic/index.js.map +0 -1
  680. package/docs/Future.md +0 -155
  681. package/lib/BasicCheckout.d.ts +0 -23
  682. package/lib/BasicCheckout.d.ts.map +0 -1
  683. package/lib/BasicCheckout.js.map +0 -1
  684. package/lib/Snapshot.d.ts +0 -198
  685. package/lib/Snapshot.d.ts.map +0 -1
  686. package/lib/Snapshot.js +0 -263
  687. package/lib/Snapshot.js.map +0 -1
  688. package/lib/SnapshotUtilities.d.ts +0 -29
  689. package/lib/SnapshotUtilities.d.ts.map +0 -1
  690. package/lib/SnapshotUtilities.js +0 -67
  691. package/lib/SnapshotUtilities.js.map +0 -1
  692. package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
  693. package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
  694. package/lib/anchored-edits/AnchorResolution.js +0 -152
  695. package/lib/anchored-edits/AnchorResolution.js.map +0 -1
  696. package/lib/anchored-edits/Factory.d.ts +0 -56
  697. package/lib/anchored-edits/Factory.d.ts.map +0 -1
  698. package/lib/anchored-edits/Factory.js +0 -74
  699. package/lib/anchored-edits/Factory.js.map +0 -1
  700. package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
  701. package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
  702. package/lib/anchored-edits/PersistedTypes.js +0 -128
  703. package/lib/anchored-edits/PersistedTypes.js.map +0 -1
  704. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  705. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  706. package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
  707. package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  708. package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  709. package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  710. package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
  711. package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
  712. package/lib/anchored-edits/index.d.ts +0 -10
  713. package/lib/anchored-edits/index.d.ts.map +0 -1
  714. package/lib/anchored-edits/index.js +0 -11
  715. package/lib/anchored-edits/index.js.map +0 -1
  716. package/lib/default-edits/EditUtilities.d.ts +0 -57
  717. package/lib/default-edits/EditUtilities.d.ts.map +0 -1
  718. package/lib/default-edits/EditUtilities.js +0 -181
  719. package/lib/default-edits/EditUtilities.js.map +0 -1
  720. package/lib/default-edits/Factory.d.ts +0 -56
  721. package/lib/default-edits/Factory.d.ts.map +0 -1
  722. package/lib/default-edits/Factory.js +0 -74
  723. package/lib/default-edits/Factory.js.map +0 -1
  724. package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
  725. package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
  726. package/lib/default-edits/HistoryEditFactory.js.map +0 -1
  727. package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
  728. package/lib/default-edits/PersistedTypes.js.map +0 -1
  729. package/lib/default-edits/SharedTree.d.ts +0 -111
  730. package/lib/default-edits/SharedTree.d.ts.map +0 -1
  731. package/lib/default-edits/SharedTree.js +0 -100
  732. package/lib/default-edits/SharedTree.js.map +0 -1
  733. package/lib/default-edits/Summary.d.ts +0 -15
  734. package/lib/default-edits/Summary.d.ts.map +0 -1
  735. package/lib/default-edits/Summary.js +0 -31
  736. package/lib/default-edits/Summary.js.map +0 -1
  737. package/lib/default-edits/Transaction.d.ts +0 -41
  738. package/lib/default-edits/Transaction.d.ts.map +0 -1
  739. package/lib/default-edits/Transaction.js +0 -221
  740. package/lib/default-edits/Transaction.js.map +0 -1
  741. package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
  742. package/lib/default-edits/UndoRedoHandler.js.map +0 -1
  743. package/lib/default-edits/index.d.ts +0 -13
  744. package/lib/default-edits/index.d.ts.map +0 -1
  745. package/lib/default-edits/index.js +0 -14
  746. package/lib/default-edits/index.js.map +0 -1
  747. package/lib/generic/GenericEditUtilities.d.ts +0 -26
  748. package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
  749. package/lib/generic/GenericEditUtilities.js +0 -38
  750. package/lib/generic/GenericEditUtilities.js.map +0 -1
  751. package/lib/generic/GenericSharedTree.d.ts +0 -221
  752. package/lib/generic/GenericSharedTree.d.ts.map +0 -1
  753. package/lib/generic/GenericSharedTree.js +0 -443
  754. package/lib/generic/GenericSharedTree.js.map +0 -1
  755. package/lib/generic/GenericTransaction.d.ts +0 -87
  756. package/lib/generic/GenericTransaction.d.ts.map +0 -1
  757. package/lib/generic/GenericTransaction.js +0 -140
  758. package/lib/generic/GenericTransaction.js.map +0 -1
  759. package/lib/generic/PersistedTypes.d.ts +0 -194
  760. package/lib/generic/PersistedTypes.d.ts.map +0 -1
  761. package/lib/generic/PersistedTypes.js +0 -39
  762. package/lib/generic/PersistedTypes.js.map +0 -1
  763. package/lib/generic/Summary.d.ts +0 -63
  764. package/lib/generic/Summary.d.ts.map +0 -1
  765. package/lib/generic/Summary.js +0 -58
  766. package/lib/generic/Summary.js.map +0 -1
  767. package/lib/generic/index.d.ts +0 -10
  768. package/lib/generic/index.d.ts.map +0 -1
  769. package/lib/generic/index.js +0 -11
  770. package/lib/generic/index.js.map +0 -1
  771. package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
  772. package/lib/test/Anchors.glassBox.tests.js +0 -410
  773. package/lib/test/Anchors.glassBox.tests.js.map +0 -1
  774. package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
  775. package/lib/test/BasicCheckout.tests.js +0 -8
  776. package/lib/test/BasicCheckout.tests.js.map +0 -1
  777. package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
  778. package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
  779. package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
  780. package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
  781. package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
  782. package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
  783. package/lib/test/Snapshot.tests.d.ts.map +0 -1
  784. package/lib/test/Snapshot.tests.js +0 -96
  785. package/lib/test/Snapshot.tests.js.map +0 -1
  786. package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
  787. package/lib/test/SnapshotUtilities.tests.js +0 -168
  788. package/lib/test/SnapshotUtilities.tests.js.map +0 -1
  789. package/lib/test/undoRedoStackManager.d.ts +0 -26
  790. package/lib/test/undoRedoStackManager.d.ts.map +0 -1
  791. package/lib/test/undoRedoStackManager.js +0 -176
  792. package/lib/test/undoRedoStackManager.js.map +0 -1
  793. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
  794. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
  795. package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
  796. package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
  797. package/src/BasicCheckout.ts +0 -34
  798. package/src/Snapshot.ts +0 -363
  799. package/src/SnapshotUtilities.ts +0 -88
  800. package/src/anchored-edits/AnchorResolution.ts +0 -442
  801. package/src/anchored-edits/Factory.ts +0 -94
  802. package/src/anchored-edits/PersistedTypes.ts +0 -310
  803. package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
  804. package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
  805. package/src/anchored-edits/index.ts +0 -21
  806. package/src/default-edits/EditUtilities.ts +0 -220
  807. package/src/default-edits/Factory.ts +0 -94
  808. package/src/default-edits/SharedTree.ts +0 -174
  809. package/src/default-edits/Summary.ts +0 -44
  810. package/src/default-edits/Transaction.ts +0 -262
  811. package/src/default-edits/index.ts +0 -29
  812. package/src/generic/GenericEditUtilities.ts +0 -46
  813. package/src/generic/GenericSharedTree.ts +0 -593
  814. package/src/generic/GenericTransaction.ts +0 -194
  815. package/src/generic/PersistedTypes.ts +0 -221
  816. package/src/generic/Summary.ts +0 -113
  817. package/src/generic/index.ts +0 -41
@@ -0,0 +1,1109 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SharedTree = exports.SharedTreeFactory = void 0;
8
+ const common_utils_1 = require("@fluidframework/common-utils");
9
+ const container_definitions_1 = require("@fluidframework/container-definitions");
10
+ const shared_object_base_1 = require("@fluidframework/shared-object-base");
11
+ const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
12
+ const Common_1 = require("./Common");
13
+ const EditLog_1 = require("./EditLog");
14
+ const Identifiers_1 = require("./Identifiers");
15
+ const InitialTree_1 = require("./InitialTree");
16
+ const LogViewer_1 = require("./LogViewer");
17
+ const SummaryBackCompatibility_1 = require("./SummaryBackCompatibility");
18
+ const persisted_types_1 = require("./persisted-types");
19
+ const Summary_1 = require("./Summary");
20
+ const EditUtilities_1 = require("./EditUtilities");
21
+ const NodeIdUtilities_1 = require("./NodeIdUtilities");
22
+ const EventTypes_1 = require("./EventTypes");
23
+ const RevisionView_1 = require("./RevisionView");
24
+ const SharedTreeEncoder_1 = require("./SharedTreeEncoder");
25
+ const HistoryEditFactory_1 = require("./HistoryEditFactory");
26
+ const ChangeTypes_1 = require("./ChangeTypes");
27
+ const id_compressor_1 = require("./id-compressor");
28
+ const IdConversion_1 = require("./IdConversion");
29
+ const StringInterner_1 = require("./StringInterner");
30
+ /**
31
+ * Factory for SharedTree.
32
+ * Includes history in the summary.
33
+ * @public
34
+ */
35
+ class SharedTreeFactory {
36
+ /**
37
+ * Get a factory for SharedTree to register with the data store.
38
+ * @param writeFormat - Determines the format version the SharedTree will write ops and summaries in. See [the write format
39
+ * documentation](../docs/Write-Format.md) for more information.
40
+ * @param summarizeHistory - Determines if the history is included in summaries and if edit chunks are uploaded when they are full.
41
+ * See the [breaking change migration documentation](docs/Breaking-Change-Migration) for more details on this scheme.
42
+ * @param expensiveValidation - Enables expensive asserts on SharedTree.
43
+ * @returns A factory that creates `SharedTree`s and loads them from storage.
44
+ */
45
+ constructor(writeFormat, summarizeHistory = false, expensiveValidation = false) {
46
+ this.writeFormat = writeFormat;
47
+ this.summarizeHistory = summarizeHistory;
48
+ this.expensiveValidation = expensiveValidation;
49
+ }
50
+ /**
51
+ * {@inheritDoc @fluidframework/shared-object-base#ISharedObjectFactory."type"}
52
+ */
53
+ get type() {
54
+ return SharedTreeFactory.Type;
55
+ }
56
+ /**
57
+ * {@inheritDoc @fluidframework/shared-object-base#ISharedObjectFactory.attributes}
58
+ */
59
+ get attributes() {
60
+ return SharedTreeFactory.Attributes;
61
+ }
62
+ /**
63
+ * {@inheritDoc @fluidframework/shared-object-base#ISharedObjectFactory.load}
64
+ */
65
+ async load(runtime, id, services, _channelAttributes) {
66
+ const sharedTree = this.createSharedTree(runtime, id);
67
+ await sharedTree.load(services);
68
+ return sharedTree;
69
+ }
70
+ /**
71
+ * Create a new SharedTree.
72
+ * @param runtime - data store runtime that owns the new SharedTree
73
+ * @param id - optional name for the SharedTree
74
+ */
75
+ create(runtime, id, expensiveValidation = false) {
76
+ this.expensiveValidation = expensiveValidation;
77
+ const sharedTree = this.createSharedTree(runtime, id);
78
+ sharedTree.initializeLocal();
79
+ return sharedTree;
80
+ }
81
+ createSharedTree(runtime, id) {
82
+ const sharedTree = new SharedTree(runtime, id, this.writeFormat, this.summarizeHistory, this.expensiveValidation);
83
+ return sharedTree;
84
+ }
85
+ }
86
+ exports.SharedTreeFactory = SharedTreeFactory;
87
+ /**
88
+ * {@inheritDoc @fluidframework/shared-object-base#ISharedObjectFactory."type"}
89
+ */
90
+ SharedTreeFactory.Type = 'SharedTree';
91
+ /**
92
+ * {@inheritDoc @fluidframework/shared-object-base#ISharedObjectFactory.attributes}
93
+ */
94
+ SharedTreeFactory.Attributes = {
95
+ type: SharedTreeFactory.Type,
96
+ snapshotFormatVersion: '0.1',
97
+ packageVersion: '0.1',
98
+ };
99
+ /**
100
+ * Filename where the snapshot is stored.
101
+ */
102
+ const snapshotFileName = 'header';
103
+ /**
104
+ * Used for version comparison.
105
+ */
106
+ const sortedWriteVersions = [persisted_types_1.WriteFormat.v0_0_2, persisted_types_1.WriteFormat.v0_1_1];
107
+ const sharedTreeTelemetryProperties = { all: { isSharedTreeEvent: true } };
108
+ /**
109
+ * A [distributed tree](../Readme.md).
110
+ * @public
111
+ */
112
+ class SharedTree extends shared_object_base_1.SharedObject {
113
+ /**
114
+ * Create a new SharedTreeFactory.
115
+ * @param runtime - The runtime the SharedTree will be associated with
116
+ * @param id - Unique ID for the SharedTree
117
+ * @param writeFormat - Determines the format version the SharedTree will write ops and summaries in. See [the write format
118
+ * documentation](../docs/Write-Format.md) for more information.
119
+ * @param summarizeHistory - Determines if the history is included in summaries and if edit chunks are uploaded when they are full.
120
+ * @param expensiveValidation - Enable expensive asserts.
121
+ */
122
+ constructor(runtime, id, writeFormat, summarizeHistory = false, expensiveValidation = false) {
123
+ super(id, runtime, SharedTreeFactory.Attributes);
124
+ this.writeFormat = writeFormat;
125
+ this.expensiveValidation = expensiveValidation;
126
+ this.idCompressor = new id_compressor_1.IdCompressor(id_compressor_1.createSessionId(), persisted_types_1.reservedIdCount);
127
+ this.idNormalizer = {
128
+ tree: this,
129
+ get localSessionId() {
130
+ return this.tree.idCompressor.localSessionId;
131
+ },
132
+ normalizeToOpSpace: (id) => this.idCompressor.normalizeToOpSpace(id),
133
+ normalizeToSessionSpace: (id, sessionId) => this.idCompressor.normalizeToSessionSpace(id, sessionId),
134
+ };
135
+ // The initial tree's definition isn't included in any op by default but it should still be interned. Including it here ensures that.
136
+ this.interner = new StringInterner_1.MutableStringInterner([InitialTree_1.initialTree.definition]);
137
+ this.processEditResult = (editResult, editId) => {
138
+ // TODO:#44859: Invalid results should be handled by the app
139
+ this.emit(SharedTree.eventFromEditResult(editResult), editId);
140
+ };
141
+ this.processSequencedEditResult = ({ edit, wasLocal, result, reconciliationPath, }) => {
142
+ const eventArguments = {
143
+ edit,
144
+ wasLocal,
145
+ tree: this,
146
+ logger: this.sequencedEditAppliedLogger,
147
+ reconciliationPath,
148
+ outcome: result,
149
+ };
150
+ this.emit(EventTypes_1.SharedTreeEvent.SequencedEditApplied, eventArguments);
151
+ };
152
+ /**
153
+ * Re-computes currentIsOldest and emits an event if it has changed.
154
+ * TODO:#55900: Get rid of copy-pasted OldestClientObserver code
155
+ */
156
+ this.updateOldest = () => {
157
+ const oldest = this.computeIsOldest();
158
+ if (this.currentIsOldest !== oldest) {
159
+ this.currentIsOldest = oldest;
160
+ if (oldest) {
161
+ this.emit('becameOldest');
162
+ this.logger.sendTelemetryEvent({ eventName: 'BecameOldestClient' });
163
+ }
164
+ else {
165
+ this.emit('lostOldest');
166
+ }
167
+ }
168
+ };
169
+ this.summarizeHistory = summarizeHistory === false ? false : true;
170
+ this.uploadEditChunks = summarizeHistory === false ? false : summarizeHistory.uploadEditChunks;
171
+ // This code is somewhat duplicated from OldestClientObserver because it currently depends on the container runtime
172
+ // which SharedTree does not have access to.
173
+ // TODO:#55900: Get rid of copy-pasted OldestClientObserver code
174
+ const quorum = this.runtime.getQuorum();
175
+ this.currentIsOldest = this.computeIsOldest();
176
+ quorum.on('addMember', this.updateOldest);
177
+ quorum.on('removeMember', this.updateOldest);
178
+ runtime.on('connected', this.updateOldest);
179
+ runtime.on('disconnected', this.updateOldest);
180
+ this.logger = telemetry_utils_1.ChildLogger.create(runtime.logger, 'SharedTree', sharedTreeTelemetryProperties);
181
+ this.sequencedEditAppliedLogger = telemetry_utils_1.ChildLogger.create(this.logger, 'SequencedEditApplied', sharedTreeTelemetryProperties);
182
+ const { editLog, cachingLogViewer } = this.initializeNewEditLogFromSummary({
183
+ editChunks: [],
184
+ editIds: [],
185
+ }, undefined, this.idCompressor, // TODO: Attribution info
186
+ this.processEditResult, this.processSequencedEditResult, persisted_types_1.WriteFormat.v0_1_1);
187
+ this.editLog = editLog;
188
+ this.cachingLogViewer = cachingLogViewer;
189
+ this.encoder_0_0_2 = new SharedTreeEncoder_1.SharedTreeEncoder_0_0_2(this.summarizeHistory);
190
+ this.encoder_0_1_1 = new SharedTreeEncoder_1.SharedTreeEncoder_0_1_1(this.summarizeHistory);
191
+ }
192
+ /**
193
+ * Create a new SharedTree. It will contain the default value (see initialTree).
194
+ */
195
+ static create(runtime, id) {
196
+ return runtime.createChannel(id, SharedTreeFactory.Type);
197
+ }
198
+ /**
199
+ * Get a factory for SharedTree to register with the data store.
200
+ * @param summarizeHistory - Determines if the history is included in summaries and if edit chunks are uploaded when they are full.
201
+ *
202
+ * On 0.1.1 documents, due to current code limitations, this parameter is only impactful for newly created documents.
203
+ * `SharedTree`s which load existing documents will summarize history if and only if the loaded summary included history.
204
+ *
205
+ * The technical limitations here relate to clients with mixed versions collaborating.
206
+ * In the future we may allow modification of whether or not a particular document saves history, but only via a consensus mechanism.
207
+ * See the skipped test in SharedTreeFuzzTests.ts for more details on this issue.
208
+ * See docs/Breaking-Change-Migration for more details on the consensus scheme.
209
+ * @param writeFormat - Determines the format version the SharedTree will write ops and summaries in.
210
+ * This format may be updated to a newer (supported) version at runtime if a collaborating shared-tree
211
+ * that was initialized with a newer write version connects to the session. Care must be taken when changing this value,
212
+ * as a staged rollout must of occurred such that all collaborating clients must have the code to read at least the version
213
+ * written.
214
+ * See [the write format documentation](../docs/Write-Format.md) for more information.
215
+ * @returns A factory that creates `SharedTree`s and loads them from storage.
216
+ */
217
+ static getFactory(writeFormat, summarizeHistory = false) {
218
+ // On 0.1.1 documents, due to current code limitations, all clients MUST agree on the value of `summarizeHistory`.
219
+ // Note that this means staged rollout changing this value should not be attempted.
220
+ // It is possible to update shared-tree to correctly handle such a staged rollout, but that hasn't been implemented.
221
+ // See the skipped test in SharedTreeFuzzTests.ts for more details on this issue.
222
+ return new SharedTreeFactory(writeFormat, summarizeHistory);
223
+ }
224
+ /**
225
+ * Viewer for trees defined by editLog. This allows access to views of the tree at different revisions (various points in time).
226
+ */
227
+ get logViewer() {
228
+ return this.cachingLogViewer;
229
+ }
230
+ getWriteFormat() {
231
+ return this.writeFormat;
232
+ }
233
+ /**
234
+ * Computes the oldest client in the quorum, true by default if the container is detached and false by default if the client isn't connected.
235
+ * TODO:#55900: Get rid of copy-pasted OldestClientObserver code
236
+ */
237
+ computeIsOldest() {
238
+ // If the container is detached, we are the only ones that know about it and are the oldest by default.
239
+ if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
240
+ return true;
241
+ }
242
+ // If we're not connected we can't be the oldest connected client.
243
+ if (!this.runtime.connected) {
244
+ return false;
245
+ }
246
+ Common_1.assert(this.runtime.clientId !== undefined, 'Client id should be set if connected.');
247
+ const quorum = this.runtime.getQuorum();
248
+ const selfSequencedClient = quorum.getMember(this.runtime.clientId);
249
+ // When in readonly mode our clientId will not be present in the quorum.
250
+ if (selfSequencedClient === undefined) {
251
+ return false;
252
+ }
253
+ const members = quorum.getMembers();
254
+ for (const sequencedClient of members.values()) {
255
+ if (sequencedClient.sequenceNumber < selfSequencedClient.sequenceNumber) {
256
+ return false;
257
+ }
258
+ }
259
+ // No member of the quorum was older
260
+ return true;
261
+ }
262
+ /**
263
+ * @returns the current view of the tree.
264
+ */
265
+ get currentView() {
266
+ return this.logViewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
267
+ }
268
+ /**
269
+ * Generates a node identifier.
270
+ * The returned IDs may be used as the identifier of a node in the SharedTree.
271
+ * `NodeId`s are *always* unique and stable within the scope of the tree and session that generated them. They are *not* unique within
272
+ * a Fluid container, and *cannot* be compared across instances of a SharedTree. They are *not* stable across sessions/lifetimes of a
273
+ * SharedTree, and *cannot* be persisted (e.g. stored in payloads, uploaded in blobs, etc.). If stable persistence is needed,
274
+ * NodeIdConverter.convertToStableNodeId may be used to return a corresponding UUID that is globally unique and stable.
275
+ * @param override - if supplied, calls to `convertToStableNodeId` using the returned node ID will return the override instead of
276
+ * the UUID. Calls to `generateNodeId` with the same override always return the same ID. Performance note: passing an override string
277
+ * incurs a storage cost that is significantly higher that a node ID without one, and should be avoided if possible.
278
+ * @public
279
+ */
280
+ generateNodeId(override) {
281
+ return this.idCompressor.generateCompressedId(override);
282
+ }
283
+ /**
284
+ * Given a NodeId, returns the corresponding stable ID or throws if the supplied node ID was not generated with this tree (`NodeId`s
285
+ * may not be used across SharedTree instances, see `generateNodeId` for more).
286
+ * The returned value will be a UUID, unless the creation of `id` used an override string (see `generateNodeId` for more).
287
+ * The result is safe to persist and re-use across `SharedTree` instances, unlike `NodeId`.
288
+ * @public
289
+ */
290
+ convertToStableNodeId(id) {
291
+ var _a;
292
+ return (_a = this.idCompressor.tryDecompress(id)) !== null && _a !== void 0 ? _a : Common_1.fail('Node id is not known to this SharedTree');
293
+ }
294
+ /**
295
+ * Given a NodeId, attempt to return the corresponding stable ID.
296
+ * The returned value will be a UUID, unless the creation of `id` used an override string (see `generateNodeId` for more).
297
+ * The returned stable ID is undefined if `id` was never created with this SharedTree. If a stable ID is returned, this does not imply
298
+ * that there is a node with `id` in the current revision of the tree, only that `id` was at some point generated by some instance of
299
+ * this tree.
300
+ * @public
301
+ */
302
+ tryConvertToStableNodeId(id) {
303
+ return this.idCompressor.tryDecompress(id);
304
+ }
305
+ /**
306
+ * Given a stable ID, return the corresponding NodeId or throws if the supplied stable ID was never generated with this tree, either
307
+ * as a UUID corresponding to a `NodeId` or as an override passed to `generateNodeId`.
308
+ * If a stable ID is returned, this does not imply that there is a node with `id` in the current revision of the tree, only that
309
+ * `id` was at some point generated by an instance of this SharedTree.
310
+ * @public
311
+ */
312
+ convertToNodeId(id) {
313
+ var _a;
314
+ return ((_a = this.idCompressor.tryRecompress(id)) !== null && _a !== void 0 ? _a : Common_1.fail('Stable node id is not known to this SharedTree'));
315
+ }
316
+ /**
317
+ * Given a stable ID, return the corresponding NodeId or return undefined if the supplied stable ID was never generated with this tree,
318
+ * either as a UUID corresponding to a `NodeId` or as an override passed to `generateNodeId`.
319
+ * If a stable ID is returned, this does not imply that there is a node with `id` in the current revision of the tree, only that
320
+ * `id` was at some point generated by an instance of this SharedTree.
321
+ * @public
322
+ */
323
+ tryConvertToNodeId(id) {
324
+ return this.idCompressor.tryRecompress(id);
325
+ }
326
+ /**
327
+ * @returns the edit history of the tree.
328
+ * @public
329
+ */
330
+ get edits() {
331
+ return this.editLog;
332
+ }
333
+ /**
334
+ * @returns the edit history of the tree. The format of the contents of edits are subject to change and should not be relied upon.
335
+ * @internal
336
+ */
337
+ get editsInternal() {
338
+ return this.editLog;
339
+ }
340
+ deserializeHandle(serializedHandle) {
341
+ const deserializeHandle = this.serializer.parse(serializedHandle);
342
+ Common_1.assert(typeof deserializeHandle === 'object');
343
+ return deserializeHandle;
344
+ }
345
+ /**
346
+ * Uploads the edit chunk and sends the chunk starting revision along with the resulting handle as an op.
347
+ */
348
+ async uploadEditChunk(edits, startRevision) {
349
+ var _a;
350
+ Common_1.assert(this.writeFormat !== persisted_types_1.WriteFormat.v0_0_2, 'Edit chunking is not supported in v0_0_2');
351
+ // SPO attachment blob upload limit is set here:
352
+ // https://onedrive.visualstudio.com/SharePoint%20Online/_git/SPO?path=%2Fsts%2Fstsom%2FPrague%2FSPPragueProtocolConfig.cs&version=GBmaster&line=82&lineEnd=82&lineStartColumn=29&lineEndColumn=116&lineStyle=plain&_a=contents
353
+ // TODO:#59754: Create chunks based on data buffer size instead of number of edits
354
+ const blobUploadSizeLimit = 4194304;
355
+ try {
356
+ const chunkContents = this.encoder_0_1_1.encodeEditChunk(edits, NodeIdUtilities_1.sequencedIdNormalizer(this.idNormalizer), this.interner);
357
+ const serializedContents = shared_object_base_1.serializeHandles(chunkContents, this.serializer, this.handle);
358
+ const buffer = common_utils_1.IsoBuffer.from(serializedContents);
359
+ const bufferSize = buffer.byteLength;
360
+ Common_1.assert(bufferSize <= blobUploadSizeLimit, `Edit chunk size ${bufferSize} is larger than blob upload size limit of ${blobUploadSizeLimit} bytes.`);
361
+ const editHandle = await this.runtime.uploadBlob(buffer);
362
+ const handleOp = {
363
+ editHandle: (_a = shared_object_base_1.serializeHandles(editHandle, this.serializer, this.handle)) !== null && _a !== void 0 ? _a : Common_1.fail('Edit chunk handle could not be serialized.'),
364
+ startRevision,
365
+ type: persisted_types_1.SharedTreeOpType.Handle,
366
+ version: this.writeFormat,
367
+ };
368
+ this.submitOp(handleOp);
369
+ this.emit(EventTypes_1.SharedTreeDiagnosticEvent.EditChunkUploaded);
370
+ }
371
+ catch (error) {
372
+ // If chunk load fails, we will try again later in loadCore on the oldest client so we log the error instead of throwing.
373
+ this.logger.sendErrorEvent({
374
+ eventName: 'EditChunkUploadFailure',
375
+ }, error);
376
+ }
377
+ }
378
+ /**
379
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
380
+ */
381
+ summarizeCore(serializer) {
382
+ return shared_object_base_1.createSingleBlobSummary(snapshotFileName, this.saveSerializedSummary({ serializer }));
383
+ }
384
+ /**
385
+ * Saves this SharedTree into a serialized summary. This is used for testing.
386
+ *
387
+ * @param summarizer - Optional summarizer to use. If not passed in, SharedTree's summarizer is used.
388
+ * @internal
389
+ */
390
+ saveSerializedSummary(options) {
391
+ const { serializer } = options || {};
392
+ return Summary_1.serialize(this.saveSummary(), serializer !== null && serializer !== void 0 ? serializer : this.serializer, this.handle);
393
+ }
394
+ /**
395
+ * Initialize shared tree with a serialized summary. This is used for testing.
396
+ * @returns - statistics about the loaded summary.
397
+ * @internal
398
+ */
399
+ loadSerializedSummary(blobData) {
400
+ const summary = SummaryBackCompatibility_1.deserialize(blobData, this.serializer);
401
+ this.loadSummary(summary);
402
+ return SummaryBackCompatibility_1.getSummaryStatistics(summary);
403
+ }
404
+ /**
405
+ * Saves this SharedTree into a deserialized summary.
406
+ * @internal
407
+ */
408
+ saveSummary() {
409
+ // If local changes exist, emulate the sequencing of those changes.
410
+ // Doing so is necessary so edits created during DataObject.initializingFirstTime are included.
411
+ // Doing so is safe because it is guaranteed that the DDS has not yet been attached. This is because summary creation is only
412
+ // ever invoked on a DataObject containing local changes when it is attached for the first time. In post-attach flows, an extra
413
+ // instance of the DataObject is created for generating summaries and will never have local edits.
414
+ if (this.editLog.numberOfLocalEdits > 0) {
415
+ Common_1.assert(this.runtime.attachState !== container_definitions_1.AttachState.Attached, 'Summarizing should not occur with local edits except on first attach.');
416
+ if (this.writeFormat === persisted_types_1.WriteFormat.v0_1_1) {
417
+ // Since we're the first client to attach, we can safely finalize ourselves since we're the only ones who have made IDs.
418
+ this.idCompressor.finalizeCreationRange(this.idCompressor.takeNextCreationRange());
419
+ for (const edit of this.editLog.getLocalEdits()) {
420
+ this.internStringsFromEdit(edit);
421
+ }
422
+ }
423
+ this.editLog.sequenceLocalEdits();
424
+ }
425
+ Common_1.assert(this.editLog.numberOfLocalEdits === 0, 'generateSummary must not be called with local edits');
426
+ return this.generateSummary();
427
+ }
428
+ /**
429
+ * Generates a SharedTree summary for the current state of the tree.
430
+ * Will never be called when local edits are present.
431
+ */
432
+ generateSummary() {
433
+ var _a;
434
+ try {
435
+ switch (this.writeFormat) {
436
+ case persisted_types_1.WriteFormat.v0_0_2:
437
+ return this.encoder_0_0_2.encodeSummary(this.editLog, this.currentView, this);
438
+ case persisted_types_1.WriteFormat.v0_1_1:
439
+ return this.encoder_0_1_1.encodeSummary(this.editLog, this.currentView, this, this.idNormalizer, this.interner, this.idCompressor.serialize(false));
440
+ default:
441
+ Common_1.fail('Unknown version');
442
+ }
443
+ }
444
+ catch (error) {
445
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.sendErrorEvent({
446
+ eventName: 'UnsupportedSummaryWriteFormat',
447
+ formatVersion: this.writeFormat,
448
+ });
449
+ throw error;
450
+ }
451
+ }
452
+ /**
453
+ * Initialize shared tree with a deserialized summary.
454
+ * @internal
455
+ */
456
+ loadSummary(summary) {
457
+ const { version: loadedSummaryVersion } = summary;
458
+ if (isUpdateRequired(loadedSummaryVersion, this.writeFormat)) {
459
+ this.submitOp({ type: persisted_types_1.SharedTreeOpType.Update, version: this.writeFormat });
460
+ this.logger.sendTelemetryEvent({
461
+ eventName: 'RequestVersionUpdate',
462
+ versionFrom: loadedSummaryVersion,
463
+ versionTo: this.writeFormat,
464
+ });
465
+ }
466
+ if (compareSummaryFormatVersions(loadedSummaryVersion, this.writeFormat) !== 0) {
467
+ // Write whatever format the loaded summary uses (this is the current agreed-upon format: it may be updated by an update op)
468
+ this.changeWriteFormat(loadedSummaryVersion);
469
+ }
470
+ Common_1.assert(this.idCompressor.getAllIdsFromLocalSession().next().done === true, 'Summary load should not be executed after local state is created.');
471
+ let convertedSummary;
472
+ switch (loadedSummaryVersion) {
473
+ case persisted_types_1.WriteFormat.v0_0_2:
474
+ convertedSummary = this.encoder_0_0_2.decodeSummary(summary);
475
+ break;
476
+ case persisted_types_1.WriteFormat.v0_1_1: {
477
+ const typedSummary = summary;
478
+ // See comment in factory constructor--ensure we write a consistent type of summary as how the document began.
479
+ const loadedSummaryIncludesHistory = typedSummary.currentTree !== undefined;
480
+ if (loadedSummaryIncludesHistory !== this.summarizeHistory) {
481
+ this.summarizeHistory = loadedSummaryIncludesHistory;
482
+ this.uploadEditChunks = loadedSummaryIncludesHistory;
483
+ this.encoder_0_1_1 = new SharedTreeEncoder_1.SharedTreeEncoder_0_1_1(this.summarizeHistory);
484
+ }
485
+ convertedSummary = this.encoder_0_1_1.decodeSummary(summary);
486
+ break;
487
+ }
488
+ default:
489
+ Common_1.fail('Unknown version');
490
+ }
491
+ const { editHistory, currentTree, idCompressor, interner } = convertedSummary;
492
+ this.interner = interner;
493
+ this.interner.getOrCreateInternedId(InitialTree_1.initialTree.definition);
494
+ if (compareSummaryFormatVersions(loadedSummaryVersion, persisted_types_1.WriteFormat.v0_1_1) < 0) {
495
+ const { editIds, editChunks } = editHistory;
496
+ this.logger.sendTelemetryEvent({
497
+ eventName: 'SummaryConversion',
498
+ formatVersion: persisted_types_1.WriteFormat.v0_1_1,
499
+ historySize: editIds.length,
500
+ totalNumberOfChunks: editChunks.length,
501
+ uploadedChunks: EditLog_1.getNumberOfHandlesFromEditLogSummary(editHistory),
502
+ });
503
+ }
504
+ this.initializeNewEditLogFromSummary(editHistory, currentTree, idCompressor, this.processEditResult, this.processSequencedEditResult, summary.version);
505
+ if (this.runtime.connected) {
506
+ const noChunksReadyForUpload = this.editLog.getEditChunksReadyForUpload()[Symbol.iterator]().next().done;
507
+ if (noChunksReadyForUpload === undefined || !noChunksReadyForUpload) {
508
+ // A client does not become a member of the quorum until it is within the collaboration window.
509
+ //
510
+ // The collaboration window is the range from the minimum sequence number enforced by the server and head.
511
+ // When a client sends an op, they include the last sequence number the client has processed. We call this the reference
512
+ // sequence number.
513
+ //
514
+ // If there are no members in the quorum, we send a no op op in order to have this client added as a member to the quorum.
515
+ // This is required so we can ensure only the oldest client will upload blobs during summary load.
516
+ if (this.runtime.getQuorum().getMembers().size === 0) {
517
+ const noop = {
518
+ type: persisted_types_1.SharedTreeOpType.NoOp,
519
+ version: this.writeFormat,
520
+ };
521
+ this.submitOp(noop);
522
+ this.logger.sendTelemetryEvent({ eventName: 'NoOpSent' });
523
+ }
524
+ else if (this.currentIsOldest) {
525
+ this.uploadCatchUpBlobs();
526
+ }
527
+ }
528
+ // If this client becomes the oldest, it should take care of uploading catch up blobs.
529
+ this.on('becameOldest', () => this.uploadCatchUpBlobs());
530
+ }
531
+ }
532
+ static eventFromEditResult(editStatus) {
533
+ switch (editStatus) {
534
+ case persisted_types_1.EditStatus.Applied:
535
+ return EventTypes_1.SharedTreeDiagnosticEvent.AppliedEdit;
536
+ case persisted_types_1.EditStatus.Invalid:
537
+ return EventTypes_1.SharedTreeDiagnosticEvent.DroppedInvalidEdit;
538
+ default:
539
+ return EventTypes_1.SharedTreeDiagnosticEvent.DroppedMalformedEdit;
540
+ }
541
+ }
542
+ /**
543
+ * Initializes a new `EditLog` and `CachingLogViewer` on this `SharedTree`, replacing and disposing of any previously existing ones.
544
+ * @returns the initialized values (this is mostly to keep the constructor happy)
545
+ */
546
+ initializeNewEditLogFromSummary(editHistory, currentTree, idCompressor, editStatusCallback, sequencedEditResultCallback, version) {
547
+ var _a, _b;
548
+ this.idCompressor = idCompressor;
549
+ // Dispose the current log viewer if it exists. This ensures that re-used EditAddedHandlers below don't retain references to old
550
+ // log viewers.
551
+ (_a = this.cachingLogViewer) === null || _a === void 0 ? void 0 : _a.detachFromEditLog();
552
+ const indexOfFirstEditInSession = version === persisted_types_1.WriteFormat.v0_0_2 || ((editHistory === null || editHistory === void 0 ? void 0 : editHistory.editIds.length) === 1 && version === persisted_types_1.WriteFormat.v0_1_1)
553
+ ? 0
554
+ : editHistory === null || editHistory === void 0 ? void 0 : editHistory.editIds.length;
555
+ // Use previously registered EditAddedHandlers if there is an existing EditLog.
556
+ const editLog = new EditLog_1.EditLog(editHistory, this.logger, (_b = this.editLog) === null || _b === void 0 ? void 0 : _b.editAddedHandlers, indexOfFirstEditInSession);
557
+ editLog.on(EventTypes_1.SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {
558
+ this.emit(EventTypes_1.SharedTreeDiagnosticEvent.UnexpectedHistoryChunk);
559
+ });
560
+ let knownRevisions;
561
+ if (currentTree !== undefined) {
562
+ const currentView = RevisionView_1.RevisionView.fromTree(currentTree);
563
+ // TODO:#47830: Store multiple checkpoints in summary.
564
+ knownRevisions = [[editLog.length, { view: currentView }]];
565
+ }
566
+ const logViewer = new LogViewer_1.CachingLogViewer(editLog, RevisionView_1.RevisionView.fromTree(InitialTree_1.initialTree, this), knownRevisions, this.expensiveValidation, editStatusCallback, sequencedEditResultCallback, 0);
567
+ this.editLog = editLog;
568
+ this.cachingLogViewer = logViewer;
569
+ return { editLog, cachingLogViewer: logViewer };
570
+ }
571
+ /**
572
+ * Upload any full chunks that have yet to be uploaded.
573
+ */
574
+ uploadCatchUpBlobs() {
575
+ if (this.writeFormat !== persisted_types_1.WriteFormat.v0_0_2 && this.uploadEditChunks) {
576
+ for (const [startRevision, chunk] of this.editLog.getEditChunksReadyForUpload()) {
577
+ this.uploadEditChunk(chunk, startRevision)
578
+ .then(() => {
579
+ this.emit(EventTypes_1.SharedTreeDiagnosticEvent.CatchUpBlobUploaded);
580
+ this.logger.sendTelemetryEvent({ eventName: 'CatchUpBlobUpload', chunkSize: chunk.length });
581
+ })
582
+ // It is safe to swallow errors from edit chunk upload because the next summary load will
583
+ // do another attempt to upload the edit chunks that couldn't previously be uploaded
584
+ .catch((error) => { });
585
+ }
586
+ }
587
+ }
588
+ /**
589
+ * Compares this shared tree to another for equality. Should only be used for internal correctness testing.
590
+ *
591
+ * Equality means that the histories as captured by the EditLogs are equivalent.
592
+ *
593
+ * Equality does not include:
594
+ * - if an edit is open
595
+ * - the shared tree's id
596
+ * - local vs sequenced status of edits
597
+ * - registered event listeners
598
+ * - state of caches
599
+ *
600
+ * @internal
601
+ * */
602
+ equals(sharedTree) {
603
+ if (!EditUtilities_1.areRevisionViewsSemanticallyEqual(this.currentView, this, sharedTree.currentView, sharedTree)) {
604
+ return false;
605
+ }
606
+ return this.editLog.equals(sharedTree.editLog);
607
+ }
608
+ /**
609
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}
610
+ */
611
+ async loadCore(storage) {
612
+ const summaryLoadPerformanceEvent = telemetry_utils_1.PerformanceEvent.start(this.logger, { eventName: 'SummaryLoad' });
613
+ try {
614
+ const newBlob = await storage.readBlob(snapshotFileName);
615
+ const blobData = common_utils_1.bufferToString(newBlob, 'utf8');
616
+ const stats = this.loadSerializedSummary(blobData);
617
+ summaryLoadPerformanceEvent.end(stats);
618
+ }
619
+ catch (error) {
620
+ summaryLoadPerformanceEvent.cancel({ eventName: 'SummaryLoadFailure' }, error);
621
+ throw error;
622
+ }
623
+ }
624
+ /**
625
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processCore}
626
+ */
627
+ processCore(message, local) {
628
+ const typedMessage = message;
629
+ this.cachingLogViewer.setMinimumSequenceNumber(typedMessage.minimumSequenceNumber);
630
+ const op = typedMessage.contents;
631
+ const { type, version } = op;
632
+ const resolvedVersion = version !== null && version !== void 0 ? version : persisted_types_1.WriteFormat.v0_0_2;
633
+ const sameVersion = resolvedVersion === this.writeFormat;
634
+ // Edit and handle ops should only be processed if they're the same version as the tree write version.
635
+ // Update ops should only be processed if they're not the same version.
636
+ if (sameVersion) {
637
+ if (type === persisted_types_1.SharedTreeOpType.Handle) {
638
+ const { editHandle, startRevision } = op;
639
+ const baseHandle = this.deserializeHandle(editHandle);
640
+ const decodedHandle = {
641
+ get: async () => {
642
+ const contents = await baseHandle.get();
643
+ const parsedContents = JSON.parse(common_utils_1.IsoBuffer.from(contents).toString());
644
+ return this.encoder_0_1_1.decodeEditChunk(parsedContents, NodeIdUtilities_1.sequencedIdNormalizer(this.idNormalizer), this.interner);
645
+ },
646
+ baseHandle,
647
+ };
648
+ this.editLog.processEditChunkHandle(decodedHandle, startRevision);
649
+ }
650
+ else if (type === persisted_types_1.SharedTreeOpType.Edit) {
651
+ if (op.version === persisted_types_1.WriteFormat.v0_1_1) {
652
+ // TODO: This cast can be removed on typescript 4.6
653
+ this.idCompressor.finalizeCreationRange(op.idRange);
654
+ }
655
+ // TODO: This cast can be removed on typescript 4.6
656
+ const edit = this.parseSequencedEdit(op);
657
+ if (op.version === persisted_types_1.WriteFormat.v0_1_1) {
658
+ this.internStringsFromEdit(edit);
659
+ }
660
+ this.processSequencedEdit(edit, typedMessage);
661
+ }
662
+ }
663
+ else if (type === persisted_types_1.SharedTreeOpType.Update) {
664
+ this.processVersionUpdate(op.version);
665
+ }
666
+ else if (compareSummaryFormatVersions(resolvedVersion, this.writeFormat) === 1) {
667
+ // An op version newer than our current version should not be received. If this happens, either an
668
+ // incorrect op version has been written or an update op was skipped.
669
+ const error = 'Newer op version received by a client that has yet to be updated.';
670
+ this.logger.sendErrorEvent({
671
+ eventName: 'UnexpectedNewerOpVersion',
672
+ }, error);
673
+ Common_1.fail(error);
674
+ }
675
+ }
676
+ /**
677
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.registerCore}
678
+ */
679
+ registerCore() {
680
+ // Do nothing
681
+ }
682
+ /**
683
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}
684
+ */
685
+ onDisconnect() {
686
+ // Do nothing
687
+ }
688
+ /**
689
+ * Parses a sequenced edit. This is only invoked for ops with version matching the current `writeFormat`.
690
+ */
691
+ parseSequencedEdit(op) {
692
+ // TODO:Type Safety: Improve type safety around op sending/parsing (e.g. discriminated union over version field somehow)
693
+ switch (op.version) {
694
+ case persisted_types_1.WriteFormat.v0_0_2:
695
+ return this.encoder_0_0_2.decodeEditOp(op, this.encodeSemiSerializedEdit.bind(this), this);
696
+ case persisted_types_1.WriteFormat.v0_1_1:
697
+ return this.encoder_0_1_1.decodeEditOp(op, this.encodeSemiSerializedEdit.bind(this), this.idNormalizer, this.interner);
698
+ default:
699
+ Common_1.fail('Unknown op version');
700
+ }
701
+ }
702
+ encodeSemiSerializedEdit(semiSerializedEdit) {
703
+ // semiSerializedEdit may have handles which have been replaced by `serializer.encode`.
704
+ // Since there is no API to un-replace them except via parse, re-stringify the edit, then parse it.
705
+ // Stringify using JSON, not IFluidSerializer since OPs use JSON directly.
706
+ // TODO:Performance:#48025: Avoid this serialization round trip.
707
+ const encodedEdit = this.serializer.parse(JSON.stringify(semiSerializedEdit));
708
+ return encodedEdit;
709
+ }
710
+ processSequencedEdit(edit, message) {
711
+ const { id: editId } = edit;
712
+ const wasLocalEdit = this.editLog.isLocalEdit(editId);
713
+ // If the id of the supplied edit matches a non-local edit already present in the log, this would normally be indicative of an error.
714
+ // However, the @fluidframework packages prior to 0.37.x have a bug which can cause data corruption by sequencing duplicate edits--
715
+ // see discussion on the following github issue: https://github.com/microsoft/FluidFramework/issues/4399
716
+ // To work around this issue, we currently tolerate duplicate ops in loaded documents.
717
+ // This could be strengthened in the future to only apply to documents which may have been impacted.
718
+ const shouldIgnoreEdit = this.editLog.tryGetIndexOfId(editId) !== undefined && !wasLocalEdit;
719
+ if (shouldIgnoreEdit) {
720
+ return;
721
+ }
722
+ if (wasLocalEdit) {
723
+ this.editLog.addSequencedEdit(edit, message);
724
+ // If this client created the edit that filled up a chunk, it is responsible for uploading that chunk.
725
+ if (compareSummaryFormatVersions(this.writeFormat, persisted_types_1.WriteFormat.v0_0_2) > 0 && this.uploadEditChunks) {
726
+ const lastPair = this.editLog.getLastEditChunk();
727
+ if (lastPair !== undefined) {
728
+ const [startRevision, chunk] = lastPair;
729
+ const edits = Common_1.assertNotUndefined(chunk.edits);
730
+ if (edits.length === this.editLog.editsPerChunk) {
731
+ this.uploadEditChunk(edits, startRevision)
732
+ .then(() => {
733
+ this.logger.sendTelemetryEvent({
734
+ eventName: 'EditChunkUpload',
735
+ chunkSize: edits.length,
736
+ });
737
+ })
738
+ // It is safe to swallow errors from edit chunk upload because the next summary load will
739
+ // do another attempt to upload the edit chunks that couldn't previously be uploaded
740
+ .catch((error) => { });
741
+ }
742
+ }
743
+ }
744
+ }
745
+ else {
746
+ this.applyEditLocally(edit, message);
747
+ }
748
+ }
749
+ /**
750
+ * Updates SharedTree to the provided version if the version is a valid write version newer than the current version.
751
+ * @param version - The version to update to.
752
+ */
753
+ processVersionUpdate(version) {
754
+ if (isUpdateRequired(this.writeFormat, version)) {
755
+ telemetry_utils_1.PerformanceEvent.timedExec(this.logger, { eventName: 'VersionUpdate', version }, () => {
756
+ if (compareSummaryFormatVersions(version, persisted_types_1.WriteFormat.v0_1_1) >= 0) {
757
+ this.upgradeFrom_0_0_2_to_0_1_1();
758
+ }
759
+ else {
760
+ throw new Error(`Updating to version ${version} is not supported.`);
761
+ }
762
+ this.changeWriteFormat(version);
763
+ // The edit log may contain some local edits submitted after the version update op was submitted but
764
+ // before we receive the message it has been sequenced. Since these edits must be sequenced after the version
765
+ // update op, they will be discarded. These edits are then re-submitted using the new format.
766
+ for (const edit of this.editLog.getLocalEdits()) {
767
+ this.submitEditOp(edit);
768
+ }
769
+ if (this.currentIsOldest) {
770
+ this.uploadCatchUpBlobs();
771
+ }
772
+ }, {
773
+ end: true,
774
+ cancel: 'error',
775
+ });
776
+ }
777
+ }
778
+ upgradeFrom_0_0_2_to_0_1_1() {
779
+ // Reset the string interner, re-populate only with information that there is consensus on
780
+ this.interner = new StringInterner_1.MutableStringInterner([InitialTree_1.initialTree.definition]);
781
+ const oldIdCompressor = this.idCompressor;
782
+ // Create the IdCompressor that will be used after the upgrade
783
+ const newIdCompressor = new id_compressor_1.IdCompressor(id_compressor_1.createSessionId(), persisted_types_1.reservedIdCount); // TODO: attribution info
784
+ const newContext = NodeIdUtilities_1.getNodeIdContext(newIdCompressor);
785
+ // Generate all local IDs in the new compressor that were in the old compressor and preserve their UUIDs.
786
+ // This will allow the client to continue to use local IDs that were allocated pre-upgrade
787
+ for (const localId of oldIdCompressor.getAllIdsFromLocalSession()) {
788
+ newIdCompressor.generateCompressedId(oldIdCompressor.decompress(localId));
789
+ }
790
+ const unifyHistoricalIds = (context) => {
791
+ for (let i = 0; i < this.editLog.numberOfSequencedEdits; i++) {
792
+ const edit = this.editsInternal.getEditInSessionAtIndex(i);
793
+ IdConversion_1.convertEditIds(edit, (id) => context.generateNodeId(this.convertToStableNodeId(id)));
794
+ }
795
+ };
796
+ // Construct a temporary "ghost" compressor which is used to generate final IDs that will be consistent across all upgrading clients
797
+ const ghostIdCompressor = new id_compressor_1.IdCompressor(persisted_types_1.ghostSessionId, persisted_types_1.reservedIdCount); // TODO: attribution info
798
+ const ghostContext = NodeIdUtilities_1.getNodeIdContext(ghostIdCompressor);
799
+ if (this.summarizeHistory) {
800
+ // All clients have the full history, and can therefore all "generate" the same final IDs for every ID in the history
801
+ // via the ghost compressor.
802
+ unifyHistoricalIds(ghostContext);
803
+ // The same logic applies to string interning, so intern all the strings in the history (superset of those in the current view)
804
+ for (let i = 0; i < this.editLog.numberOfSequencedEdits; i++) {
805
+ this.internStringsFromEdit(this.editsInternal.getEditInSessionAtIndex(i));
806
+ }
807
+ }
808
+ else {
809
+ // Clients do not have the full history, but all share the same current view (sequenced). They can all finalize the same final
810
+ // IDs for every ID in the view via the ghost compressor.
811
+ // The same logic applies for the string interner.
812
+ for (const node of this.logViewer.getRevisionViewInSession(this.editLog.numberOfSequencedEdits)) {
813
+ ghostContext.generateNodeId(this.convertToStableNodeId(node.identifier));
814
+ this.interner.getOrCreateInternedId(node.definition);
815
+ for (const label of [...node.traits.keys()].sort()) {
816
+ this.interner.getOrCreateInternedId(label);
817
+ }
818
+ }
819
+ // Every node in this client's history can simply be generated in the new compressor as well, preserving the UUID
820
+ unifyHistoricalIds(newContext);
821
+ }
822
+ // Finalize any IDs in the ghost compressor into the actual compressor. This simulates all clients reaching a consensus on those IDs
823
+ newIdCompressor.finalizeCreationRange(ghostIdCompressor.takeNextCreationRange());
824
+ this.idCompressor = newIdCompressor;
825
+ }
826
+ applyEdit(headOrChanges, ...tail) {
827
+ const changes = Array.isArray(headOrChanges) ? headOrChanges : [headOrChanges, ...tail];
828
+ const id = EditUtilities_1.newEditId();
829
+ const internalEdit = {
830
+ id,
831
+ changes: changes.map((c) => this.internalizeChange(c)),
832
+ };
833
+ this.submitEditOp(internalEdit);
834
+ this.applyEditLocally(internalEdit, undefined);
835
+ return internalEdit;
836
+ }
837
+ /**
838
+ * Applies a set of internal changes to this tree. The result will be reflected in `SharedTree.currentView`.
839
+ * External users should use one of the more specialized functions, like `applyEdit` which handles constructing the actual `Edit`
840
+ * and uses public Change types.
841
+ * This is exposed for internal use only.
842
+ * @internal
843
+ */
844
+ applyEditInternal(editOrChanges) {
845
+ let edit;
846
+ if (Array.isArray(editOrChanges)) {
847
+ const id = EditUtilities_1.newEditId();
848
+ edit = { id, changes: editOrChanges };
849
+ }
850
+ else {
851
+ edit = editOrChanges;
852
+ }
853
+ this.submitEditOp(edit);
854
+ this.applyEditLocally(edit, undefined);
855
+ return edit;
856
+ }
857
+ /**
858
+ * Converts a public Change type to an internal representation.
859
+ * This is exposed for internal use only.
860
+ * @internal
861
+ */
862
+ internalizeChange(change) {
863
+ switch (change.type) {
864
+ case ChangeTypes_1.ChangeType.Insert:
865
+ return {
866
+ source: change.source,
867
+ destination: EditUtilities_1.deepCloneStablePlace(change.destination),
868
+ type: persisted_types_1.ChangeTypeInternal.Insert,
869
+ };
870
+ case ChangeTypes_1.ChangeType.Detach: {
871
+ const detach = {
872
+ source: EditUtilities_1.deepCloneStableRange(change.source),
873
+ type: persisted_types_1.ChangeTypeInternal.Detach,
874
+ };
875
+ Common_1.copyPropertyIfDefined(change, detach, 'destination');
876
+ return detach;
877
+ }
878
+ case ChangeTypes_1.ChangeType.Build: {
879
+ if (isTreeNodeSequence(change.source)) {
880
+ const source = change.source.map((buildNode) => EditUtilities_1.convertTreeNodes(buildNode, (nodeData) => EditUtilities_1.internalizeBuildNode(nodeData, this), (x) => typeof x === 'number'));
881
+ return {
882
+ source,
883
+ destination: change.destination,
884
+ type: persisted_types_1.ChangeTypeInternal.Build,
885
+ };
886
+ }
887
+ else {
888
+ const source = EditUtilities_1.convertTreeNodes(change.source, (nodeData) => EditUtilities_1.internalizeBuildNode(nodeData, this), (x) => typeof x === 'number');
889
+ return {
890
+ source: [source],
891
+ destination: change.destination,
892
+ type: persisted_types_1.ChangeTypeInternal.Build,
893
+ };
894
+ }
895
+ }
896
+ case ChangeTypes_1.ChangeType.SetValue:
897
+ return {
898
+ nodeToModify: change.nodeToModify,
899
+ payload: change.payload,
900
+ type: persisted_types_1.ChangeTypeInternal.SetValue,
901
+ };
902
+ case ChangeTypes_1.ChangeType.Constraint: {
903
+ const constraint = {
904
+ effect: change.effect,
905
+ toConstrain: change.toConstrain,
906
+ type: persisted_types_1.ChangeTypeInternal.Constraint,
907
+ };
908
+ Common_1.copyPropertyIfDefined(change, constraint, 'contentHash');
909
+ Common_1.copyPropertyIfDefined(change, constraint, 'identityHash');
910
+ Common_1.copyPropertyIfDefined(change, constraint, 'label');
911
+ Common_1.copyPropertyIfDefined(change, constraint, 'length');
912
+ Common_1.copyPropertyIfDefined(change, constraint, 'parentNode');
913
+ return constraint;
914
+ }
915
+ default:
916
+ Common_1.fail('unexpected change type');
917
+ }
918
+ }
919
+ applyEditLocally(edit, message) {
920
+ const isSequenced = message !== undefined;
921
+ if (isSequenced) {
922
+ // TODO: This cast can be removed on typescript 4.6
923
+ this.editLog.addSequencedEdit(edit, message);
924
+ }
925
+ else {
926
+ this.editLog.addLocalEdit(edit);
927
+ }
928
+ const eventArguments = {
929
+ editId: edit.id,
930
+ local: !isSequenced,
931
+ tree: this,
932
+ };
933
+ this.emit(EventTypes_1.SharedTreeEvent.EditCommitted, eventArguments);
934
+ }
935
+ /**
936
+ * Reverts a previous edit by applying a new edit containing the inverse of the original edit's changes.
937
+ * @param editId - the edit to revert
938
+ * @returns the id of the new edit, or undefined if the original edit could not be inverted given the current tree state.
939
+ * @public
940
+ */
941
+ revert(editId) {
942
+ const index = this.edits.getIndexOfId(editId);
943
+ const edit = this.editLog.getEditInSessionAtIndex(index);
944
+ const before = this.logViewer.getRevisionViewInSession(index);
945
+ const changes = this.revertChanges(edit.changes, before);
946
+ if (changes === undefined) {
947
+ return undefined;
948
+ }
949
+ return this.applyEditInternal(changes).id;
950
+ }
951
+ /**
952
+ * Revert the given changes
953
+ * @param changes - the changes to revert
954
+ * @param before - the revision view before the changes were originally applied
955
+ * @returns the inverse of `changes` or undefined if the changes could not be inverted for the given tree state.
956
+ * @internal
957
+ */
958
+ revertChanges(changes, before) {
959
+ return HistoryEditFactory_1.revert(changes, before);
960
+ }
961
+ /**
962
+ * Submits an edit by the local client to the runtime.
963
+ */
964
+ submitEditOp(edit) {
965
+ // Only submit ops if attached, since op submission can have stateful side effects (e.g. changing the IdCompressor)
966
+ // Ops will be submitted again when attached (see loadSummary())
967
+ if (this.isAttached()) {
968
+ switch (this.writeFormat) {
969
+ case persisted_types_1.WriteFormat.v0_0_2:
970
+ this.submitOp(this.encoder_0_0_2.encodeEditOp(edit, this.serializeEdit.bind(this), this));
971
+ break;
972
+ case persisted_types_1.WriteFormat.v0_1_1:
973
+ this.submitOp(this.encoder_0_1_1.encodeEditOp(edit, this.serializeEdit.bind(this), this.idCompressor.takeNextCreationRange(), this.idNormalizer, this.interner));
974
+ break;
975
+ default:
976
+ Common_1.fail('Unknown version');
977
+ }
978
+ }
979
+ }
980
+ serializeEdit(preparedEdit) {
981
+ return this.serializer.encode(preparedEdit, this.handle);
982
+ }
983
+ /** A type-safe `submitLocalMessage` wrapper to enforce op format */
984
+ submitOp(content, localOpMetadata = undefined) {
985
+ Common_1.assert(compareSummaryFormatVersions(content.version, this.writeFormat) === 0, 'Attempted to submit op of wrong version');
986
+ this.submitLocalMessage(content, localOpMetadata);
987
+ }
988
+ getRuntime() {
989
+ return this.runtime;
990
+ }
991
+ /**
992
+ * "Pending local state" refers to ops submitted to the runtime that have not yet been acked.
993
+ * When closing a container, hosts have the option to stash this pending local state somewhere to be reapplied
994
+ * later (to avoid data loss).
995
+ * If a host then loads a container using that stashed state, this function is called for each stashed op, and is expected to:
996
+ * 1. Update this DDS to reflect that state locally.
997
+ * 2. Return any `localOpMetadata` that would have been associated with this op.
998
+ *
999
+ * @param content - op to apply locally.
1000
+ */
1001
+ applyStashedOp(op) {
1002
+ const sharedTreeOp = op;
1003
+ switch (sharedTreeOp.type) {
1004
+ case persisted_types_1.SharedTreeOpType.Edit: {
1005
+ switch (this.writeFormat) {
1006
+ case persisted_types_1.WriteFormat.v0_0_2:
1007
+ switch (sharedTreeOp.version) {
1008
+ case persisted_types_1.WriteFormat.v0_0_2: {
1009
+ const edit = this.parseSequencedEdit(sharedTreeOp);
1010
+ this.applyEditLocally(edit, undefined);
1011
+ break;
1012
+ }
1013
+ case persisted_types_1.WriteFormat.v0_1_1:
1014
+ // TODO:#74390: Implement
1015
+ Common_1.fail('Received stashed op 0.1.1 before upgrade');
1016
+ default:
1017
+ Common_1.fail('Unknown version');
1018
+ }
1019
+ break;
1020
+ case persisted_types_1.WriteFormat.v0_1_1:
1021
+ switch (sharedTreeOp.version) {
1022
+ case persisted_types_1.WriteFormat.v0_0_2:
1023
+ // TODO:#74390: Implement
1024
+ Common_1.fail('v0.1.1 does not support stashed ops.');
1025
+ case persisted_types_1.WriteFormat.v0_1_1:
1026
+ // TODO:#74390: Implement
1027
+ Common_1.fail('v0.1.1 does not support stashed ops.');
1028
+ default:
1029
+ Common_1.fail('Unknown version');
1030
+ }
1031
+ default:
1032
+ Common_1.fail('Unknown version');
1033
+ }
1034
+ break;
1035
+ }
1036
+ // Handle and update ops are only acknowledged by the client that generated them upon sequencing--no local changes necessary.
1037
+ case persisted_types_1.SharedTreeOpType.Handle:
1038
+ case persisted_types_1.SharedTreeOpType.Update:
1039
+ case persisted_types_1.SharedTreeOpType.NoOp:
1040
+ break;
1041
+ default:
1042
+ Common_1.fail('Unrecognized op');
1043
+ }
1044
+ }
1045
+ changeWriteFormat(newFormat) {
1046
+ this.writeFormat = newFormat;
1047
+ this.emit(EventTypes_1.SharedTreeDiagnosticEvent.WriteVersionChanged, newFormat);
1048
+ }
1049
+ /**
1050
+ * Interns all Definitions and TraitLabel_s referenced by the provided edit.
1051
+ *
1052
+ * Clients must have consensus on the interned values to guarantee the interned ID is valid.
1053
+ */
1054
+ internStringsFromEdit(edit) {
1055
+ for (const change of edit.changes) {
1056
+ if (change.type === persisted_types_1.ChangeTypeInternal.Build) {
1057
+ for (const root of change.source) {
1058
+ EditUtilities_1.walkTree(root, (node) => {
1059
+ this.interner.getOrCreateInternedId(node.definition);
1060
+ for (const trait of Object.keys(node.traits)) {
1061
+ this.interner.getOrCreateInternedId(trait);
1062
+ }
1063
+ }, Identifiers_1.isDetachedSequenceId);
1064
+ }
1065
+ }
1066
+ else if (change.type === persisted_types_1.ChangeTypeInternal.Insert) {
1067
+ const { referenceTrait } = change.destination;
1068
+ if (referenceTrait !== undefined) {
1069
+ this.interner.getOrCreateInternedId(referenceTrait.label);
1070
+ }
1071
+ }
1072
+ }
1073
+ }
1074
+ }
1075
+ exports.SharedTree = SharedTree;
1076
+ /**
1077
+ * @returns 1 if versionA is newer, -1 if versionB is newer, and 0 if the versions are the same.
1078
+ * @throws if either version isn't a valid WriteFormat version.
1079
+ */
1080
+ function compareSummaryFormatVersions(versionA, versionB) {
1081
+ const versionAIndex = sortedWriteVersions.indexOf(versionA);
1082
+ const versionBIndex = sortedWriteVersions.indexOf(versionB);
1083
+ if (versionAIndex === -1 || versionBIndex === -1) {
1084
+ Common_1.fail('Summary version being compared cannot be read.');
1085
+ }
1086
+ if (versionAIndex < versionBIndex) {
1087
+ return -1;
1088
+ }
1089
+ else if (versionAIndex > versionBIndex) {
1090
+ return 1;
1091
+ }
1092
+ return 0;
1093
+ }
1094
+ /**
1095
+ * Checks if the summary version needs to be updated.
1096
+ * @returns true if the old version is older than the new version.
1097
+ * @throws if the new version isn't a supported WriteFormat version.
1098
+ */
1099
+ function isUpdateRequired(oldVersion, newVersion) {
1100
+ const newVersionIndex = sortedWriteVersions.indexOf(newVersion);
1101
+ if (newVersionIndex === -1) {
1102
+ Common_1.fail('New write version is invalid.');
1103
+ }
1104
+ return compareSummaryFormatVersions(oldVersion, newVersion) === -1 ? true : false;
1105
+ }
1106
+ function isTreeNodeSequence(source) {
1107
+ return Array.isArray(source);
1108
+ }
1109
+ //# sourceMappingURL=SharedTree.js.map