@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
@@ -1 +1 @@
1
- {"version":3,"file":"Virtualization.tests.js","sourceRoot":"","sources":["../../src/test/Virtualization.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { EditHandle, EditLog } from '../EditLog';\nimport { Edit, EditWithoutId, newEdit, fullHistorySummarizer_0_1_0 } from '../generic';\nimport { SharedTree, setTrait, Change } from '../default-edits';\nimport { assertNotUndefined } from '../Common';\nimport { SharedTreeSummary_0_0_2 } from '../SummaryBackCompatibility';\nimport { initialTree } from '../InitialTree';\nimport { SharedTreeDiagnosticEvent } from '../generic/GenericSharedTree';\nimport { createStableEdits, makeTestNode, setUpLocalServerTestSharedTree, testTrait } from './utilities/TestUtilities';\n\ndescribe('SharedTree history virtualization', () => {\n\tlet sharedTree: SharedTree;\n\tlet testObjectProvider: TestObjectProvider;\n\n\t// Create a summary used to test catchup blobbing\n\tconst summaryToCatchUp: SharedTreeSummary_0_0_2<Change> = {\n\t\tcurrentTree: initialTree,\n\t\tversion: '0.0.2',\n\t\tsequencedEdits: createStableEdits(250),\n\t};\n\n\tbeforeEach(async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\t});\n\n\tafterEach(async () => {\n\t\ttestObjectProvider.reset();\n\t});\n\n\t// Adds edits to sharedTree1 to make up the specified number of chunks.\n\tconst processNewEditChunks = async (numberOfChunks = 1) => {\n\t\tconst expectedEdits: Edit<Change>[] = [];\n\n\t\t// Add some edits to create a chunk with.\n\t\twhile (expectedEdits.length < (sharedTree.edits as EditLog<Change>).editsPerChunk * numberOfChunks) {\n\t\t\tconst edit = newEdit(setTrait(testTrait, [makeTestNode()]));\n\t\t\texpectedEdits.push(edit);\n\t\t\tsharedTree.processLocalEdit(edit);\n\t\t}\n\n\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\treturn expectedEdits;\n\t};\n\n\tit('can upload edit chunks and load chunks from handles', async () => {\n\t\tconst expectedEdits: Edit<Change>[] = await processNewEditChunks();\n\n\t\tconst summary = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\n\t\tconst { editHistory } = summary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\t\texpect(typeof (editChunks[0].chunk as EditHandle).get).to.equal('function');\n\n\t\t// Load a second tree using the summary\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({ testObjectProvider });\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Ensure chunked edit can be retrieved\n\t\texpect((await sharedTree2.edits.getEditAtIndex(2)).id).to.equal(expectedEdits[2].id);\n\t});\n\n\tit('can upload catchup blobs', async () => {\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for the op to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tsharedTree.loadSummary(summaryToCatchUp);\n\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(1);\n\n\t\tconst { editHistory } = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\t\texpect(typeof (editChunks[0].chunk as EditHandle).get).to.equal('function');\n\t});\n\n\tit('only uploads catchup blobs from one client', async () => {\n\t\t// Create more connected trees\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t});\n\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree3.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for processing again in case there are more no ops\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t// Try to load summaries on all the trees\n\t\tsharedTree.loadSummary(summaryToCatchUp);\n\t\tsharedTree2.loadSummary(summaryToCatchUp);\n\t\tsharedTree3.loadSummary(summaryToCatchUp);\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(1);\n\n\t\t// Make sure the trees are still the same\n\t\texpect(sharedTree.equals(sharedTree2)).to.be.true;\n\t\texpect(sharedTree.equals(sharedTree3)).to.be.true;\n\t});\n\n\tit(\"doesn't upload incomplete chunks\", async () => {\n\t\tconst edit = newEdit(setTrait(testTrait, [makeTestNode()]));\n\t\tsharedTree.processLocalEdit(edit);\n\n\t\t// Wait for the op to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tconst { editHistory } = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\n\t\t// The chunk given by the summary should be an array of length 1.\n\t\tconst { chunk } = editChunks[0];\n\t\texpect(Array.isArray(chunk)).to.be.true;\n\t\texpect((chunk as EditWithoutId<Change>[]).length).to.equal(1);\n\t});\n\n\tit('can upload full chunks with incomplete chunks in the edit log', async () => {\n\t\tconst expectedEdits: Edit<Change>[] = [];\n\n\t\t// Add some edits to create a chunk with.\n\t\twhile (expectedEdits.length < (sharedTree.edits as EditLog<Change>).editsPerChunk + 10) {\n\t\t\tconst edit = newEdit(setTrait(testTrait, [makeTestNode()]));\n\t\t\texpectedEdits.push(edit);\n\t\t\tsharedTree.processLocalEdit(edit);\n\t\t}\n\n\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tconst { editHistory } = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(2);\n\t\texpect(typeof (editChunks[0].chunk as EditHandle).get).to.equal('function');\n\t\texpect(Array.isArray(editChunks[1].chunk)).to.be.true;\n\t\texpect((editChunks[1].chunk as EditWithoutId<Change>[]).length).to.equal(10);\n\t});\n\n\tit('correctly saves handles and their corresponding starting revisions to the summary', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait processNewEditChunks(4);\n\n\t\tconst { editHistory } = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(4);\n\n\t\t// Make sure each starting revision is correct and each chunk in the summary is a handle\n\t\teditChunks.forEach(({ startRevision, chunk }, index) => {\n\t\t\texpect(startRevision).to.equal(index * (sharedTree.edits as EditLog<Change>).editsPerChunk);\n\t\t\texpect(typeof (chunk as EditHandle).get).to.equal('function');\n\t\t});\n\t});\n\n\tit('sends handle ops to connected clients when chunks are uploaded', async () => {\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t});\n\n\t\t// All shared trees should have no edits or chunks\n\t\texpect(\n\t\t\tfullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView).editHistory?.editChunks.length\n\t\t).to.equal(0);\n\t\texpect(\n\t\t\tfullHistorySummarizer_0_1_0(sharedTree2.edits, sharedTree2.currentView).editHistory?.editChunks.length\n\t\t).to.equal(0);\n\t\texpect(\n\t\t\tfullHistorySummarizer_0_1_0(sharedTree3.edits, sharedTree3.currentView).editHistory?.editChunks.length\n\t\t).to.equal(0);\n\n\t\tawait processNewEditChunks();\n\n\t\t// All shared trees should have the new handle\n\t\tconst sharedTreeSummary = fullHistorySummarizer_0_1_0(sharedTree.edits, sharedTree.currentView);\n\t\tconst sharedTree2Summary = fullHistorySummarizer_0_1_0(sharedTree2.edits, sharedTree2.currentView);\n\t\tconst sharedTree3Summary = fullHistorySummarizer_0_1_0(sharedTree3.edits, sharedTree3.currentView);\n\t\tconst sharedTreeChunk = assertNotUndefined(sharedTreeSummary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree2Chunk = assertNotUndefined(sharedTree2Summary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree3Chunk = assertNotUndefined(sharedTree3Summary.editHistory).editChunks[0].chunk;\n\n\t\t// Make sure the chunk of the first shared tree is a handle\n\t\texpect(typeof (sharedTreeChunk as EditHandle).get).to.equal('function');\n\n\t\tconst sharedTreeHandleRoute = (sharedTreeChunk as any).absolutePath;\n\t\tconst sharedTree2HandleRoute = (sharedTree2Chunk as any).absolutePath;\n\t\tconst sharedTree3HandleRoute = (sharedTree3Chunk as any).absolutePath;\n\n\t\t// Make sure the handle route of the first shared tree is a string\n\t\texpect(typeof sharedTreeHandleRoute).to.equal('string');\n\n\t\texpect(sharedTreeHandleRoute).to.equal(sharedTree2HandleRoute);\n\t\texpect(sharedTree2HandleRoute).to.equal(sharedTree3HandleRoute);\n\t});\n});\n"]}
1
+ {"version":3,"file":"Virtualization.tests.js","sourceRoot":"","sources":["../../src/test/Virtualization.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { EditLog } from '../EditLog';\nimport { assertNotUndefined } from '../Common';\nimport { initialTree } from '../InitialTree';\nimport { SharedTree } from '../SharedTree';\nimport {\n\tChangeInternal,\n\tEdit,\n\tPayload,\n\treservedIdCount,\n\tFluidEditHandle,\n\tSharedTreeSummary,\n\tWriteFormat,\n\teditsPerChunk,\n} from '../persisted-types';\nimport { SharedTreeDiagnosticEvent } from '../EventTypes';\nimport { IdCompressor } from '../id-compressor';\nimport { createSessionId } from '../id-compressor/NumericUuid';\nimport { SharedTreeEncoder_0_1_1 } from '../SharedTreeEncoder';\nimport { CachingLogViewer } from '../LogViewer';\nimport { RevisionView } from '../RevisionView';\nimport { MutableStringInterner } from '../StringInterner';\nimport {\n\tapplyNoop,\n\tcreateStableEdits,\n\tmakeNodeIdContext,\n\tsetUpLocalServerTestSharedTree,\n} from './utilities/TestUtilities';\nimport { SimpleTestTree } from './utilities/TestNode';\n\ndescribe('SharedTree history virtualization', () => {\n\tlet sharedTree: SharedTree;\n\tlet testObjectProvider: TestObjectProvider;\n\tlet editChunksUploaded = 0;\n\tconst editCount = 250;\n\tconst expectedFullChunkCount = Math.floor(editCount / editsPerChunk);\n\n\t// Create a summary used to test catchup blobbing\n\tfunction createCatchUpSummary(numberOfEdits: number, payload?: (i: number) => Payload): SharedTreeSummary {\n\t\tconst idCompressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\tconst context = makeNodeIdContext(idCompressor);\n\t\tconst edits = createStableEdits(numberOfEdits, context, payload);\n\t\tidCompressor.finalizeCreationRange(idCompressor.takeNextCreationRange());\n\t\tconst editLog = new EditLog<ChangeInternal>();\n\t\tfor (let i = 0; i < edits.length; i++) {\n\t\t\teditLog.addSequencedEdit(edits[i], { sequenceNumber: i + 1, referenceSequenceNumber: i });\n\t\t}\n\t\tconst logViewer = new CachingLogViewer(\n\t\t\teditLog,\n\t\t\tRevisionView.fromTree(initialTree, context, true),\n\t\t\tundefined,\n\t\t\ttrue\n\t\t);\n\n\t\tconst internedStrings = [\n\t\t\tSimpleTestTree.definition,\n\t\t\tSimpleTestTree.traitLabel,\n\t\t\tSimpleTestTree.leftTraitLabel,\n\t\t\tSimpleTestTree.rightTraitLabel,\n\t\t];\n\t\tconst interner = new MutableStringInterner(internedStrings);\n\t\tconst encoder = new SharedTreeEncoder_0_1_1(true);\n\t\treturn encoder.encodeSummary(\n\t\t\teditLog,\n\t\t\tlogViewer.getRevisionViewInSession(Number.POSITIVE_INFINITY),\n\t\t\tcontext,\n\t\t\tcontext,\n\t\t\tinterner,\n\t\t\tidCompressor.serialize(false)\n\t\t);\n\t}\n\n\tbeforeEach(async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t});\n\n\tafterEach(() => {\n\t\teditChunksUploaded = 0;\n\t});\n\n\t// Replace sharedTree with one that writes summary format 0.0.2\n\tconst useSharedTreeSummaryv0_0_2 = async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t};\n\n\t// Adds edits to sharedTree1 to make up the specified number of chunks.\n\tconst addNewEditChunks = async (numberOfChunks = 1, additionalEdits = 0) => {\n\t\tconst expectedEdits: Edit<unknown>[] = [];\n\n\t\t// Add some edits to create a chunk with.\n\t\twhile (expectedEdits.length < (sharedTree.edits as EditLog).editsPerChunk * numberOfChunks + additionalEdits) {\n\t\t\texpectedEdits.push(applyNoop(sharedTree));\n\t\t}\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\treturn expectedEdits;\n\t};\n\n\tit('can upload edit chunks and load chunks from handles', async () => {\n\t\tconst expectedEdits: Edit<unknown>[] = await addNewEditChunks();\n\n\t\tconst summary = sharedTree.saveSummary() as SharedTreeSummary;\n\n\t\tconst { editHistory } = summary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\n\t\t// Load a second tree using the summary\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Ensure chunked edit can be retrieved\n\t\texpect((await sharedTree2.edits.getEditAtIndex(2)).id).to.equal(expectedEdits[2].id);\n\t});\n\n\tit('can upload catchup blobs', async () => {\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for the op to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tsharedTree.loadSummary(createCatchUpSummary(250));\n\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(expectedFullChunkCount + 1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\t});\n\n\tit('only uploads catchup blobs from one client', async () => {\n\t\t// Create more connected trees\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree3.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for processing again in case there are more no ops\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t// Try to load summaries on all the trees\n\t\tconst summary = createCatchUpSummary(250);\n\t\tsharedTree.loadSummary(summary);\n\t\tsharedTree2.loadSummary(summary);\n\t\tsharedTree3.loadSummary(summary);\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\t// Make sure the trees are still the same\n\t\texpect(sharedTree.equals(sharedTree2)).to.be.true;\n\t\texpect(sharedTree.equals(sharedTree3)).to.be.true;\n\t});\n\n\tit(\"doesn't upload incomplete chunks\", async () => {\n\t\tawait addNewEditChunks(0, 50);\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n\n\tit('can upload full chunks with incomplete chunks in the edit log', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(1, 50);\n\t\texpect(editChunksUploaded).to.equal(1);\n\t});\n\n\tit('correctly saves handles and their corresponding starting revisions to the summary', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(4);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(4);\n\n\t\t// Make sure each starting revision is correct and each chunk in the summary is a handle\n\t\teditChunks.forEach(({ startRevision, chunk }, index) => {\n\t\t\texpect(startRevision).to.equal(index * (sharedTree.edits as EditLog).editsPerChunk);\n\t\t\texpect(typeof (chunk as FluidEditHandle).get).to.equal('function');\n\t\t});\n\t});\n\n\tit('sends handle ops to connected clients when chunks are uploaded', async () => {\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\t// All shared trees should have no edits or chunks\n\t\texpect((sharedTree.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree2.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree3.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\n\t\tawait addNewEditChunks();\n\n\t\t// All shared trees should have the new handle\n\t\tconst sharedTreeSummary = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree2Summary = sharedTree2.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree3Summary = sharedTree3.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTreeChunk = assertNotUndefined(sharedTreeSummary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree2Chunk = assertNotUndefined(sharedTree2Summary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree3Chunk = assertNotUndefined(sharedTree3Summary.editHistory).editChunks[0].chunk;\n\n\t\t// Make sure the chunk of the first shared tree is a handle\n\t\texpect(typeof (sharedTreeChunk as FluidEditHandle).get).to.equal('function');\n\n\t\tconst sharedTreeHandleRoute = (sharedTreeChunk as any).absolutePath;\n\t\tconst sharedTree2HandleRoute = (sharedTree2Chunk as any).absolutePath;\n\t\tconst sharedTree3HandleRoute = (sharedTree3Chunk as any).absolutePath;\n\n\t\t// Make sure the handle route of the first shared tree is a string\n\t\texpect(typeof sharedTreeHandleRoute).to.equal('string');\n\n\t\texpect(sharedTreeHandleRoute).to.equal(sharedTree2HandleRoute);\n\t\texpect(sharedTree2HandleRoute).to.equal(sharedTree3HandleRoute);\n\t});\n\n\tit('does not cause misaligned chunks', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(1, 50);\n\n\t\tconst summary = sharedTree.saveSummary();\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not cause misaligned chunks for format version 0.0.2', async () => {\n\t\tawait useSharedTreeSummaryv0_0_2();\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\n\t\t// Add enough edits for a chunk and a half\n\t\tawait addNewEditChunks(1, 50);\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(sharedTree.saveSummary());\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not upload blobs larger than 4MB', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent({\n\t\t\teventName: 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure',\n\t\t});\n\t\tconst numberOfEdits = editsPerChunk;\n\t\tconst fourMegas = 2 ** 22;\n\t\t// Without the 1.1, we would generate 100 edits of size roughly 40kb here, but not all of them end up in the first edit chunk\n\t\t// due to some setup edits.\n\t\t// So we'd barely land within the 4MB limit. Bumping each payload size by 10% is enough to account for this.\n\t\tconst bigPayload = 'a'.repeat(Math.ceil((1.1 * fourMegas) / numberOfEdits));\n\t\tconst fakeSummary = createCatchUpSummary(numberOfEdits, () => bigPayload);\n\t\tsharedTree.loadSummary(fakeSummary);\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n});\n"]}
@@ -0,0 +1,19 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { AsyncGenerator, Operation, OperationGenerationConfig } from './Types';
6
+ export declare function makeOpGenerator(passedConfig: OperationGenerationConfig): AsyncGenerator<Operation, undefined>;
7
+ /**
8
+ * Higher-order generator operator which creates a new generator producing the first `n` elements of `generator`.
9
+ */
10
+ export declare function take<T, TAdditionalState>(n: number, generator: AsyncGenerator<T, TAdditionalState>): AsyncGenerator<T, TAdditionalState>;
11
+ /**
12
+ * @returns a deterministic generator that always returns the items of `contents` in order.
13
+ */
14
+ export declare function generatorFromArray<T, TAdditionalState>(contents: T[]): AsyncGenerator<T, TAdditionalState>;
15
+ /**
16
+ * Higher-order generator operator which exhausts each input generator sequentially before moving on to the next.
17
+ */
18
+ export declare function chain<T, TAdditionalState>(...generators: AsyncGenerator<T, TAdditionalState>[]): AsyncGenerator<T, TAdditionalState>;
19
+ //# sourceMappingURL=Generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAQN,cAAc,EAGd,SAAS,EACT,yBAAyB,EAGzB,MAAM,SAAS,CAAC;AAmWjB,wBAAgB,eAAe,CAAC,YAAY,EAAE,yBAAyB,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CA2B7G;AAsED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,gBAAgB,EACvC,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAC5C,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,CASrC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAS1G;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,gBAAgB,EACxC,GAAG,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,GAClD,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAcrC"}
@@ -0,0 +1,420 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import Prando from 'prando';
6
+ import { v5 } from 'uuid';
7
+ import { IsoBuffer } from '@fluidframework/common-utils';
8
+ import { Side, WriteFormat } from '../../persisted-types';
9
+ import { ChangeType, StablePlace, StableRange } from '../../ChangeTypes';
10
+ import { fail } from '../../Common';
11
+ import { rangeFromStableRange } from '../../TreeViewUtilities';
12
+ import { done, } from './Types';
13
+ function uuid(rand) {
14
+ return v5(rand.nextString(16), '33f960ec-f1e4-4fca-8dcd-223c6647fcc7');
15
+ }
16
+ const defaultJoinConfig = {
17
+ maximumActiveCollaborators: 10,
18
+ maximumPassiveCollaborators: 10,
19
+ writeFormat: [WriteFormat.v0_0_2, WriteFormat.v0_1_1],
20
+ summarizeHistory: [false],
21
+ };
22
+ function makeJoinGenerator(passedConfig) {
23
+ const config = Object.assign(Object.assign({}, defaultJoinConfig), passedConfig);
24
+ return async ({ rand, activeCollaborators, passiveCollaborators }) => {
25
+ const activeAllowed = activeCollaborators.length < config.maximumActiveCollaborators;
26
+ const passiveAllowed = passiveCollaborators.length < config.maximumPassiveCollaborators;
27
+ const isObserver = activeAllowed && passiveAllowed
28
+ ? rand.nextBoolean()
29
+ : activeAllowed
30
+ ? false
31
+ : passiveAllowed
32
+ ? true
33
+ : fail('Cannot generate join op when both active and passive collaborators are at the configured limit.');
34
+ return {
35
+ type: 'join',
36
+ summarizeHistory: rand.nextArrayItem(config.summarizeHistory),
37
+ writeFormat: rand.nextArrayItem(config.writeFormat),
38
+ isObserver,
39
+ };
40
+ };
41
+ }
42
+ async function leaveGenerator({ rand, activeCollaborators, passiveCollaborators }) {
43
+ const canUsePassive = passiveCollaborators.length > 0;
44
+ const canUseActive = activeCollaborators.length > 0;
45
+ const isObserver = canUsePassive && canUseActive
46
+ ? rand.nextBoolean()
47
+ : canUsePassive
48
+ ? true
49
+ : canUseActive
50
+ ? false
51
+ : fail('Cannot generate a leave op when there are no clients.');
52
+ const index = rand.nextInt(0, (isObserver ? passiveCollaborators : activeCollaborators).length - 1);
53
+ return { type: 'leave', isObserver, index };
54
+ }
55
+ const defaultInsertConfig = {
56
+ definitionPoolSize: 20,
57
+ maxTreeSequenceSize: 3,
58
+ };
59
+ const defaultEditConfig = {
60
+ maxTreeSize: Number.POSITIVE_INFINITY,
61
+ insertWeight: 3,
62
+ insertConfig: defaultInsertConfig,
63
+ deleteWeight: 1,
64
+ moveWeight: 1,
65
+ setPayloadWeight: 1,
66
+ traitLabelPoolSize: 20,
67
+ };
68
+ const makeEditGenerator = (passedConfig) => {
69
+ const config = Object.assign(Object.assign({}, defaultEditConfig), passedConfig);
70
+ const insertConfig = Object.assign(Object.assign({}, defaultInsertConfig), config.insertConfig);
71
+ const poolRand = new Prando(0);
72
+ const traitLabelPool = Array.from({ length: config.traitLabelPoolSize }, () => uuid(poolRand));
73
+ const traitLabelGenerator = ({ rand }) => rand.nextArrayItem(traitLabelPool);
74
+ const definitionPool = Array.from({ length: insertConfig.definitionPoolSize }, () => uuid(poolRand));
75
+ const definitionGenerator = ({ rand }) => rand.nextArrayItem(definitionPool);
76
+ function traitGenerator(state, { view, idList }) {
77
+ var _a;
78
+ const id = state.rand.nextArrayItem(idList);
79
+ return (_a = view.tryGetTraitLocation(id)) !== null && _a !== void 0 ? _a : { parent: id, label: traitLabelGenerator(state) };
80
+ }
81
+ function placeGenerator(state, context) {
82
+ const { rand } = state;
83
+ const { view, idList } = context;
84
+ // Note: this gives a 50% chance of adding to a new trait; we may want to tune this at some point
85
+ if (rand.nextBoolean()) {
86
+ const parent = rand.nextArrayItem(idList);
87
+ return StablePlace.atStartOf({ parent, label: traitLabelGenerator(state) });
88
+ }
89
+ const traitLocation = traitGenerator(state, context);
90
+ const trait = view.getTrait(traitLocation);
91
+ // For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.
92
+ // index === trait.length is treated as either the start or end of the trait.
93
+ const makeDescriptor = () => ({
94
+ index: rand.nextInt(0, trait.length),
95
+ side: rand.nextBoolean() ? Side.Before : Side.After,
96
+ });
97
+ const descriptor = makeDescriptor();
98
+ const placeFromDescriptor = ({ index, side }) => index === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };
99
+ return placeFromDescriptor(descriptor);
100
+ }
101
+ function rangeGenerator(state, context) {
102
+ const { rand } = state;
103
+ const { view } = context;
104
+ const traitLocation = traitGenerator(state, context);
105
+ const trait = view.getTrait(traitLocation);
106
+ // For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.
107
+ // index === trait.length is treated as either the start or end of the trait.
108
+ const makeDescriptor = () => ({
109
+ index: rand.nextInt(0, trait.length),
110
+ side: rand.nextBoolean() ? Side.Before : Side.After,
111
+ });
112
+ const descriptor1 = makeDescriptor();
113
+ let descriptor2;
114
+ do {
115
+ descriptor2 = makeDescriptor();
116
+ } while (descriptor1.index === descriptor2.index && descriptor1.side === descriptor2.side);
117
+ const sortedDescriptors = [descriptor1, descriptor2];
118
+ sortedDescriptors.sort((a, b) => {
119
+ if (a.index === b.index && a.side === b.side) {
120
+ return 0;
121
+ }
122
+ if (a.index === trait.length) {
123
+ if (a.side === Side.After) {
124
+ return -1;
125
+ }
126
+ return 1;
127
+ }
128
+ if (b.index === trait.length) {
129
+ if (b.side === Side.After) {
130
+ return 1;
131
+ }
132
+ return -1;
133
+ }
134
+ if (a.index < b.index) {
135
+ return -1;
136
+ }
137
+ return a.side === Side.Before ? -1 : 1;
138
+ });
139
+ const [startDescriptor, endDescriptor] = sortedDescriptors;
140
+ const placeFromDescriptor = ({ index, side }) => index === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };
141
+ const start = placeFromDescriptor(startDescriptor);
142
+ const end = placeFromDescriptor(endDescriptor);
143
+ return StableRange.from(start).to(end);
144
+ }
145
+ function treeGenerator(state, context) {
146
+ const { rand } = state;
147
+ const treeType = rand.nextArrayItem(['leaf', 'stick', 'balanced']);
148
+ const makeNode = (traits) => ({
149
+ identifier: context.idGenerator.generateNodeId(),
150
+ definition: definitionGenerator(state),
151
+ traits: traits !== null && traits !== void 0 ? traits : {},
152
+ });
153
+ switch (treeType) {
154
+ case 'leaf':
155
+ return makeNode();
156
+ case 'stick':
157
+ return makeNode({
158
+ [traitLabelGenerator(state)]: [makeNode({ [traitLabelGenerator(state)]: [makeNode()] })],
159
+ });
160
+ case 'balanced':
161
+ return makeNode({
162
+ [traitLabelGenerator(state)]: [makeNode()],
163
+ [traitLabelGenerator(state)]: [makeNode()],
164
+ });
165
+ default:
166
+ fail(`Unexpected treeType ${treeType}`);
167
+ }
168
+ }
169
+ async function insertGenerator(state, context) {
170
+ const { maxTreeSequenceSize } = insertConfig;
171
+ const id = 1;
172
+ const { view } = context;
173
+ const isValidInsertPlace = (destination) => {
174
+ // Disallow insertion adjacent to the root node.
175
+ if (destination.referenceSibling === view.root) {
176
+ return false;
177
+ }
178
+ return true;
179
+ };
180
+ let destination;
181
+ do {
182
+ destination = placeGenerator(state, context);
183
+ } while (!isValidInsertPlace(destination));
184
+ return {
185
+ fuzzType: 'insert',
186
+ build: {
187
+ type: ChangeType.Build,
188
+ destination: id,
189
+ source: Array.from({ length: state.rand.nextInt(1, maxTreeSequenceSize) }, () => treeGenerator(state, context)),
190
+ },
191
+ insert: {
192
+ type: ChangeType.Insert,
193
+ destination,
194
+ source: id,
195
+ },
196
+ };
197
+ }
198
+ async function deleteGenerator(state, context) {
199
+ const { view } = context;
200
+ const isValidDeleteRange = (source) => {
201
+ // Disallow deletion of the root node.
202
+ if (source.start.referenceSibling === view.root || source.end.referenceSibling === view.root) {
203
+ return false;
204
+ }
205
+ return true;
206
+ };
207
+ let source;
208
+ do {
209
+ source = rangeGenerator(state, context);
210
+ } while (!isValidDeleteRange(source));
211
+ return {
212
+ fuzzType: 'delete',
213
+ type: ChangeType.Detach,
214
+ source,
215
+ };
216
+ }
217
+ async function moveGenerator(state, context) {
218
+ const id = 1;
219
+ const { view } = context;
220
+ const isValidMoveRange = ({ start, end }, destination) => {
221
+ var _a, _b, _c, _d;
222
+ // An ancestor cannot be moved to be a sibling of its descendant.
223
+ const forbiddenDescendantId = (_c = (_b = (_a = destination.referenceTrait) === null || _a === void 0 ? void 0 : _a.parent) !== null && _b !== void 0 ? _b : destination.referenceSibling) !== null && _c !== void 0 ? _c : fail('Invalid place');
224
+ const unadjustedStartIndex = view.findIndexWithinTrait(start);
225
+ const unadjustedEndIndex = view.findIndexWithinTrait(end);
226
+ const startIndex = unadjustedStartIndex + (start.side === Side.After ? 1 : 0);
227
+ const endIndex = unadjustedEndIndex + (end.side === Side.After ? 1 : 0);
228
+ const idsInSource = new Set(view.getTrait(start.trait).slice(startIndex, endIndex));
229
+ for (let current = forbiddenDescendantId; current !== undefined; current = (_d = view.tryGetParentViewNode(current)) === null || _d === void 0 ? void 0 : _d.identifier) {
230
+ if (idsInSource.has(current)) {
231
+ return false;
232
+ }
233
+ }
234
+ return true;
235
+ };
236
+ let source;
237
+ let destination;
238
+ do {
239
+ source = rangeGenerator(state, context);
240
+ destination = placeGenerator(state, context);
241
+ } while (!isValidMoveRange(rangeFromStableRange(view, source), destination));
242
+ return {
243
+ fuzzType: 'move',
244
+ detach: {
245
+ type: ChangeType.Detach,
246
+ destination: id,
247
+ source,
248
+ },
249
+ insert: {
250
+ type: ChangeType.Insert,
251
+ destination,
252
+ source: id,
253
+ },
254
+ };
255
+ }
256
+ async function setPayloadGenerator({ rand }, { idList, view, dataStoreRuntime }) {
257
+ const nodeToModify = rand.nextArrayItem(idList);
258
+ const getPayloadContents = async (rand) => {
259
+ if (rand.nextBoolean()) {
260
+ return rand.nextString(4);
261
+ }
262
+ const handle = await dataStoreRuntime.uploadBlob(IsoBuffer.from(rand.nextString(10)));
263
+ return { blob: handle };
264
+ };
265
+ const viewNode = view.getViewNode(nodeToModify);
266
+ const payload = viewNode.payload !== undefined
267
+ ? rand.nextBoolean()
268
+ ? await getPayloadContents(rand)
269
+ : undefined
270
+ : undefined;
271
+ return {
272
+ fuzzType: 'setPayload',
273
+ type: ChangeType.SetValue,
274
+ nodeToModify: rand.nextArrayItem(idList),
275
+ payload,
276
+ };
277
+ }
278
+ const baseEditGenerator = createWeightedGenerator([
279
+ [insertGenerator, config.insertWeight, (_, { idList }) => idList.length < config.maxTreeSize],
280
+ [deleteGenerator, config.deleteWeight, (_, { idList }) => idList.length > 1],
281
+ [moveGenerator, config.moveWeight, (_, { idList }) => idList.length > 1],
282
+ [setPayloadGenerator, config.setPayloadWeight],
283
+ ]);
284
+ return async (state) => {
285
+ const { rand, activeCollaborators } = state;
286
+ const index = rand.nextInt(0, activeCollaborators.length - 1);
287
+ const { tree } = activeCollaborators[index];
288
+ const view = tree.currentView;
289
+ const idList = getIdList(view);
290
+ const contents = await baseEditGenerator(state, {
291
+ view,
292
+ idList,
293
+ dataStoreRuntime: tree.getRuntime(),
294
+ idGenerator: tree,
295
+ });
296
+ if (contents === done) {
297
+ return done;
298
+ }
299
+ return { type: 'edit', contents, index };
300
+ };
301
+ };
302
+ const defaultOpConfig = {
303
+ editConfig: defaultEditConfig,
304
+ joinConfig: defaultJoinConfig,
305
+ editWeight: 10,
306
+ joinWeight: 1,
307
+ leaveWeight: 1,
308
+ synchronizeWeight: 1,
309
+ };
310
+ export function makeOpGenerator(passedConfig) {
311
+ const config = Object.assign(Object.assign({}, defaultOpConfig), passedConfig);
312
+ const { maximumPassiveCollaborators, maximumActiveCollaborators } = Object.assign(Object.assign({}, defaultJoinConfig), config.joinConfig);
313
+ const maximumCollaborators = maximumPassiveCollaborators + maximumActiveCollaborators;
314
+ const collaboratorsMatches = (criteria) => ({ activeCollaborators, passiveCollaborators }) => criteria(activeCollaborators.length + passiveCollaborators.length);
315
+ const atLeastOneClient = collaboratorsMatches((count) => count > 0);
316
+ const atLeastOneActiveClient = ({ activeCollaborators }) => activeCollaborators.length > 0;
317
+ const opWeights = [
318
+ [makeEditGenerator(config.editConfig), config.editWeight, atLeastOneActiveClient],
319
+ [
320
+ makeJoinGenerator(config.joinConfig),
321
+ config.joinWeight,
322
+ collaboratorsMatches((count) => count < maximumCollaborators),
323
+ ],
324
+ [leaveGenerator, config.leaveWeight, atLeastOneClient],
325
+ [{ type: 'synchronize' }, config.synchronizeWeight, atLeastOneClient],
326
+ ];
327
+ return createWeightedGenerator(opWeights);
328
+ }
329
+ function createWeightedGenerator(weights) {
330
+ const cumulativeSums = [];
331
+ let totalWeight = 0;
332
+ for (const [tOrGenerator, weight, shouldAccept] of weights) {
333
+ const cumulativeWeight = totalWeight + weight;
334
+ cumulativeSums.push([tOrGenerator, cumulativeWeight, shouldAccept]);
335
+ totalWeight = cumulativeWeight;
336
+ }
337
+ return async (state, additionalState) => {
338
+ var _a;
339
+ const { rand } = state;
340
+ const sample = () => {
341
+ const weightSelected = rand.nextInt(1, totalWeight);
342
+ let opIndex = 0;
343
+ while (cumulativeSums[opIndex][1] < weightSelected) {
344
+ opIndex++;
345
+ }
346
+ return opIndex;
347
+ };
348
+ let index;
349
+ let shouldAccept;
350
+ do {
351
+ index = sample();
352
+ shouldAccept = cumulativeSums[index][2];
353
+ } while (!((_a = shouldAccept === null || shouldAccept === void 0 ? void 0 : shouldAccept(state, additionalState)) !== null && _a !== void 0 ? _a : true));
354
+ const [tOrGenerator] = cumulativeSums[index];
355
+ return typeof tOrGenerator === 'function'
356
+ ? tOrGenerator(state, additionalState)
357
+ : tOrGenerator;
358
+ };
359
+ }
360
+ function getIdList(tree) {
361
+ var _a;
362
+ const allIds = [];
363
+ const toVisit = [tree.root];
364
+ while (toVisit.length > 0) {
365
+ const id = (_a = toVisit.pop()) !== null && _a !== void 0 ? _a : fail();
366
+ allIds.push(id);
367
+ const node = tree.getViewNode(id);
368
+ for (const [_, childIds] of node.traits) {
369
+ toVisit.push(...childIds);
370
+ }
371
+ }
372
+ return allIds;
373
+ }
374
+ /**
375
+ * Higher-order generator operator which creates a new generator producing the first `n` elements of `generator`.
376
+ */
377
+ export function take(n, generator) {
378
+ let count = 0;
379
+ return async (state, additionalState) => {
380
+ if (count < n) {
381
+ count++;
382
+ return generator(state, additionalState);
383
+ }
384
+ return done;
385
+ };
386
+ }
387
+ /**
388
+ * @returns a deterministic generator that always returns the items of `contents` in order.
389
+ */
390
+ export function generatorFromArray(contents) {
391
+ let index = -1;
392
+ return async () => {
393
+ var _a;
394
+ if (index < contents.length) {
395
+ index++;
396
+ return (_a = contents[index]) !== null && _a !== void 0 ? _a : done;
397
+ }
398
+ return done;
399
+ };
400
+ }
401
+ /**
402
+ * Higher-order generator operator which exhausts each input generator sequentially before moving on to the next.
403
+ */
404
+ export function chain(...generators) {
405
+ let currentIndex = 0;
406
+ return async (state, additionalState) => {
407
+ while (currentIndex < generators.length) {
408
+ const generator = generators[currentIndex];
409
+ const result = await generator(state, additionalState);
410
+ if (result !== done) {
411
+ return result;
412
+ }
413
+ else {
414
+ currentIndex++;
415
+ }
416
+ }
417
+ return done;
418
+ };
419
+ }
420
+ //# sourceMappingURL=Generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport Prando from 'prando';\nimport { v5 } from 'uuid';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { Side, TraitMap, WriteFormat } from '../../persisted-types';\nimport { BuildNode, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { TraitLocation, TreeView, TreeViewRange } from '../../TreeView';\nimport { Definition, DetachedSequenceId, NodeId, TraitLabel } from '../../Identifiers';\nimport { fail } from '../../Common';\nimport { rangeFromStableRange } from '../../TreeViewUtilities';\nimport {\n\tdone,\n\tEditGenerationConfig,\n\tFuzzChange,\n\tFuzzDelete,\n\tFuzzInsert,\n\tFuzzMove,\n\tFuzzTestState,\n\tAsyncGenerator,\n\tInsertGenerationConfig,\n\tJoinGenerationConfig,\n\tOperation,\n\tOperationGenerationConfig,\n\tTreeContext,\n\tTreeLeave,\n} from './Types';\n\nfunction uuid(rand: Prando): string {\n\treturn v5(rand.nextString(16), '33f960ec-f1e4-4fca-8dcd-223c6647fcc7');\n}\n\nconst defaultJoinConfig: Required<JoinGenerationConfig> = {\n\tmaximumActiveCollaborators: 10,\n\tmaximumPassiveCollaborators: 10,\n\twriteFormat: [WriteFormat.v0_0_2, WriteFormat.v0_1_1],\n\tsummarizeHistory: [false],\n};\n\nfunction makeJoinGenerator(passedConfig: JoinGenerationConfig): AsyncGenerator<Operation, undefined> {\n\tconst config = { ...defaultJoinConfig, ...passedConfig };\n\treturn async ({ rand, activeCollaborators, passiveCollaborators }) => {\n\t\tconst activeAllowed = activeCollaborators.length < config.maximumActiveCollaborators;\n\t\tconst passiveAllowed = passiveCollaborators.length < config.maximumPassiveCollaborators;\n\t\tconst isObserver =\n\t\t\tactiveAllowed && passiveAllowed\n\t\t\t\t? rand.nextBoolean()\n\t\t\t\t: activeAllowed\n\t\t\t\t? false\n\t\t\t\t: passiveAllowed\n\t\t\t\t? true\n\t\t\t\t: fail(\n\t\t\t\t\t\t'Cannot generate join op when both active and passive collaborators are at the configured limit.'\n\t\t\t\t );\n\t\treturn {\n\t\t\ttype: 'join',\n\t\t\tsummarizeHistory: rand.nextArrayItem(config.summarizeHistory),\n\t\t\twriteFormat: rand.nextArrayItem(config.writeFormat),\n\t\t\tisObserver,\n\t\t};\n\t};\n}\n\nasync function leaveGenerator({ rand, activeCollaborators, passiveCollaborators }: FuzzTestState): Promise<TreeLeave> {\n\tconst canUsePassive = passiveCollaborators.length > 0;\n\tconst canUseActive = activeCollaborators.length > 0;\n\tconst isObserver =\n\t\tcanUsePassive && canUseActive\n\t\t\t? rand.nextBoolean()\n\t\t\t: canUsePassive\n\t\t\t? true\n\t\t\t: canUseActive\n\t\t\t? false\n\t\t\t: fail('Cannot generate a leave op when there are no clients.');\n\tconst index = rand.nextInt(0, (isObserver ? passiveCollaborators : activeCollaborators).length - 1);\n\treturn { type: 'leave', isObserver, index };\n}\n\nconst defaultInsertConfig: Required<InsertGenerationConfig> = {\n\tdefinitionPoolSize: 20,\n\tmaxTreeSequenceSize: 3,\n};\n\nconst defaultEditConfig: Required<EditGenerationConfig> = {\n\tmaxTreeSize: Number.POSITIVE_INFINITY,\n\tinsertWeight: 3,\n\tinsertConfig: defaultInsertConfig,\n\tdeleteWeight: 1,\n\tmoveWeight: 1,\n\tsetPayloadWeight: 1,\n\ttraitLabelPoolSize: 20,\n};\n\nconst makeEditGenerator = (passedConfig: EditGenerationConfig): AsyncGenerator<Operation, undefined> => {\n\tconst config = { ...defaultEditConfig, ...passedConfig };\n\tconst insertConfig = { ...defaultInsertConfig, ...config.insertConfig };\n\tconst poolRand = new Prando(0);\n\tconst traitLabelPool = Array.from({ length: config.traitLabelPoolSize }, () => uuid(poolRand) as TraitLabel);\n\tconst traitLabelGenerator = ({ rand }: FuzzTestState) => rand.nextArrayItem(traitLabelPool);\n\n\tconst definitionPool = Array.from({ length: insertConfig.definitionPoolSize }, () => uuid(poolRand) as Definition);\n\tconst definitionGenerator = ({ rand }: FuzzTestState) => rand.nextArrayItem(definitionPool);\n\n\tfunction traitGenerator(state: FuzzTestState, { view, idList }: TreeContext): TraitLocation {\n\t\tconst id = state.rand.nextArrayItem(idList);\n\t\treturn view.tryGetTraitLocation(id) ?? { parent: id, label: traitLabelGenerator(state) };\n\t}\n\n\tfunction placeGenerator(state: FuzzTestState, context: TreeContext): StablePlace {\n\t\tconst { rand } = state;\n\t\tconst { view, idList } = context;\n\t\t// Note: this gives a 50% chance of adding to a new trait; we may want to tune this at some point\n\t\tif (rand.nextBoolean()) {\n\t\t\tconst parent = rand.nextArrayItem(idList);\n\t\t\treturn StablePlace.atStartOf({ parent, label: traitLabelGenerator(state) });\n\t\t}\n\t\tconst traitLocation = traitGenerator(state, context);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: rand.nextInt(0, trait.length),\n\t\t\tside: rand.nextBoolean() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor = makeDescriptor();\n\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\treturn placeFromDescriptor(descriptor);\n\t}\n\n\tfunction rangeGenerator(state: FuzzTestState, context: TreeContext): StableRange {\n\t\tconst { rand } = state;\n\t\tconst { view } = context;\n\t\tconst traitLocation = traitGenerator(state, context);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: rand.nextInt(0, trait.length),\n\t\t\tside: rand.nextBoolean() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor1 = makeDescriptor();\n\t\tlet descriptor2: Descriptor;\n\t\tdo {\n\t\t\tdescriptor2 = makeDescriptor();\n\t\t} while (descriptor1.index === descriptor2.index && descriptor1.side === descriptor2.side);\n\n\t\tconst sortedDescriptors = [descriptor1, descriptor2];\n\t\tsortedDescriptors.sort((a, b) => {\n\t\t\tif (a.index === b.index && a.side === b.side) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (a.index === trait.length) {\n\t\t\t\tif (a.side === Side.After) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (b.index === trait.length) {\n\t\t\t\tif (b.side === Side.After) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.index < b.index) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn a.side === Side.Before ? -1 : 1;\n\t\t});\n\t\tconst [startDescriptor, endDescriptor] = sortedDescriptors;\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\tconst start = placeFromDescriptor(startDescriptor);\n\t\tconst end = placeFromDescriptor(endDescriptor);\n\t\treturn StableRange.from(start).to(end);\n\t}\n\n\tfunction treeGenerator(state: FuzzTestState, context: TreeContext): BuildNode {\n\t\tconst { rand } = state;\n\t\tconst treeType = rand.nextArrayItem(['leaf', 'stick', 'balanced']);\n\t\tconst makeNode = (traits?: TraitMap<BuildNode>): BuildNode => ({\n\t\t\tidentifier: context.idGenerator.generateNodeId(),\n\t\t\tdefinition: definitionGenerator(state),\n\t\t\ttraits: traits ?? {},\n\t\t});\n\t\tswitch (treeType) {\n\t\t\tcase 'leaf':\n\t\t\t\treturn makeNode();\n\t\t\tcase 'stick':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode({ [traitLabelGenerator(state)]: [makeNode()] })],\n\t\t\t\t});\n\t\t\tcase 'balanced':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t});\n\t\t\tdefault:\n\t\t\t\tfail(`Unexpected treeType ${treeType}`);\n\t\t}\n\t}\n\n\tasync function insertGenerator(state: FuzzTestState, context: TreeContext): Promise<FuzzInsert> {\n\t\tconst { maxTreeSequenceSize } = insertConfig;\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = context;\n\t\tconst isValidInsertPlace = (destination: StablePlace): boolean => {\n\t\t\t// Disallow insertion adjacent to the root node.\n\t\t\tif (destination.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tdestination = placeGenerator(state, context);\n\t\t} while (!isValidInsertPlace(destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'insert',\n\t\t\tbuild: {\n\t\t\t\ttype: ChangeType.Build,\n\t\t\t\tdestination: id,\n\t\t\t\tsource: Array.from({ length: state.rand.nextInt(1, maxTreeSequenceSize) }, () =>\n\t\t\t\t\ttreeGenerator(state, context)\n\t\t\t\t),\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function deleteGenerator(state: FuzzTestState, context: TreeContext): Promise<FuzzDelete> {\n\t\tconst { view } = context;\n\t\tconst isValidDeleteRange = (source: StableRange): boolean => {\n\t\t\t// Disallow deletion of the root node.\n\t\t\tif (source.start.referenceSibling === view.root || source.end.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state, context);\n\t\t} while (!isValidDeleteRange(source));\n\n\t\treturn {\n\t\t\tfuzzType: 'delete',\n\t\t\ttype: ChangeType.Detach,\n\t\t\tsource,\n\t\t};\n\t}\n\n\tasync function moveGenerator(state: FuzzTestState, context: TreeContext): Promise<FuzzMove> {\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = context;\n\n\t\tconst isValidMoveRange = ({ start, end }: TreeViewRange, destination: StablePlace): boolean => {\n\t\t\t// An ancestor cannot be moved to be a sibling of its descendant.\n\t\t\tconst forbiddenDescendantId =\n\t\t\t\tdestination.referenceTrait?.parent ?? destination.referenceSibling ?? fail('Invalid place');\n\n\t\t\tconst unadjustedStartIndex: number = view.findIndexWithinTrait(start);\n\t\t\tconst unadjustedEndIndex: number = view.findIndexWithinTrait(end);\n\t\t\tconst startIndex = unadjustedStartIndex + (start.side === Side.After ? 1 : 0);\n\t\t\tconst endIndex = unadjustedEndIndex + (end.side === Side.After ? 1 : 0);\n\n\t\t\tconst idsInSource = new Set(view.getTrait(start.trait).slice(startIndex, endIndex));\n\t\t\tfor (\n\t\t\t\tlet current: NodeId | undefined = forbiddenDescendantId;\n\t\t\t\tcurrent !== undefined;\n\t\t\t\tcurrent = view.tryGetParentViewNode(current)?.identifier\n\t\t\t) {\n\t\t\t\tif (idsInSource.has(current)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state, context);\n\t\t\tdestination = placeGenerator(state, context);\n\t\t} while (!isValidMoveRange(rangeFromStableRange(view, source), destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'move',\n\t\t\tdetach: {\n\t\t\t\ttype: ChangeType.Detach,\n\t\t\t\tdestination: id,\n\t\t\t\tsource,\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function setPayloadGenerator(\n\t\t{ rand }: FuzzTestState,\n\t\t{ idList, view, dataStoreRuntime }: TreeContext\n\t): Promise<FuzzChange> {\n\t\tconst nodeToModify = rand.nextArrayItem(idList);\n\t\tconst getPayloadContents = async (rand: Prando): Promise<string | { blob: IFluidHandle<ArrayBufferLike> }> => {\n\t\t\tif (rand.nextBoolean()) {\n\t\t\t\treturn rand.nextString(4);\n\t\t\t}\n\t\t\tconst handle = await dataStoreRuntime.uploadBlob(IsoBuffer.from(rand.nextString(10)));\n\t\t\treturn { blob: handle };\n\t\t};\n\n\t\tconst viewNode = view.getViewNode(nodeToModify);\n\t\tconst payload =\n\t\t\tviewNode.payload !== undefined\n\t\t\t\t? rand.nextBoolean()\n\t\t\t\t\t? await getPayloadContents(rand)\n\t\t\t\t\t: undefined\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tfuzzType: 'setPayload',\n\t\t\ttype: ChangeType.SetValue,\n\t\t\tnodeToModify: rand.nextArrayItem(idList),\n\t\t\tpayload,\n\t\t};\n\t}\n\n\tconst baseEditGenerator = createWeightedGenerator<FuzzChange, TreeContext>([\n\t\t[insertGenerator, config.insertWeight, (_, { idList }) => idList.length < config.maxTreeSize],\n\t\t[deleteGenerator, config.deleteWeight, (_, { idList }) => idList.length > 1],\n\t\t[moveGenerator, config.moveWeight, (_, { idList }) => idList.length > 1],\n\t\t[setPayloadGenerator, config.setPayloadWeight],\n\t]);\n\n\treturn async (state: FuzzTestState): Promise<Operation | typeof done> => {\n\t\tconst { rand, activeCollaborators } = state;\n\t\tconst index = rand.nextInt(0, activeCollaborators.length - 1);\n\t\tconst { tree } = activeCollaborators[index];\n\t\tconst view = tree.currentView;\n\t\tconst idList = getIdList(view);\n\t\tconst contents = await baseEditGenerator(state, {\n\t\t\tview,\n\t\t\tidList,\n\t\t\tdataStoreRuntime: tree.getRuntime(),\n\t\t\tidGenerator: tree,\n\t\t});\n\t\tif (contents === done) {\n\t\t\treturn done;\n\t\t}\n\t\treturn { type: 'edit', contents, index };\n\t};\n};\n\nconst defaultOpConfig: Required<OperationGenerationConfig> = {\n\teditConfig: defaultEditConfig,\n\tjoinConfig: defaultJoinConfig,\n\teditWeight: 10,\n\tjoinWeight: 1,\n\tleaveWeight: 1,\n\tsynchronizeWeight: 1,\n};\n\nexport function makeOpGenerator(passedConfig: OperationGenerationConfig): AsyncGenerator<Operation, undefined> {\n\tconst config = {\n\t\t...defaultOpConfig,\n\t\t...passedConfig,\n\t};\n\n\tconst { maximumPassiveCollaborators, maximumActiveCollaborators } = { ...defaultJoinConfig, ...config.joinConfig };\n\tconst maximumCollaborators = maximumPassiveCollaborators + maximumActiveCollaborators;\n\n\tconst collaboratorsMatches =\n\t\t(criteria: (collaboratorCount: number) => boolean): AcceptanceCondition<undefined> =>\n\t\t({ activeCollaborators, passiveCollaborators }) =>\n\t\t\tcriteria(activeCollaborators.length + passiveCollaborators.length);\n\tconst atLeastOneClient = collaboratorsMatches((count) => count > 0);\n\tconst atLeastOneActiveClient: AcceptanceCondition<undefined> = ({ activeCollaborators }) =>\n\t\tactiveCollaborators.length > 0;\n\tconst opWeights: Weights<Operation, undefined> = [\n\t\t[makeEditGenerator(config.editConfig), config.editWeight, atLeastOneActiveClient],\n\t\t[\n\t\t\tmakeJoinGenerator(config.joinConfig),\n\t\t\tconfig.joinWeight,\n\t\t\tcollaboratorsMatches((count) => count < maximumCollaborators),\n\t\t],\n\t\t[leaveGenerator, config.leaveWeight, atLeastOneClient],\n\t\t[{ type: 'synchronize' }, config.synchronizeWeight, atLeastOneClient],\n\t];\n\treturn createWeightedGenerator(opWeights);\n}\n\ntype AcceptanceCondition<TAdditionalState> = (state: FuzzTestState, additionalState: TAdditionalState) => boolean;\n\n/**\n * Array of weighted generators to select from.\n *\n * A generator should only be invoked if the corresponding `AcceptanceCondition` evaluates to true.\n * This is useful in practice to avoid invoking generators for known-to-be invalid actions based on the current state:\n * for example, a \"leave\" op cannot be generated if there are no currently connected clients.\n */\ntype Weights<T, TAdditionalState> = [\n\tT | AsyncGenerator<T, TAdditionalState>,\n\tnumber,\n\tAcceptanceCondition<TAdditionalState>?\n][];\n\nfunction createWeightedGenerator<T, TAdditionalState>(\n\tweights: Weights<T, TAdditionalState>\n): AsyncGenerator<T, TAdditionalState> {\n\tconst cumulativeSums: [T | AsyncGenerator<T, TAdditionalState>, number, AcceptanceCondition<TAdditionalState>?][] =\n\t\t[];\n\tlet totalWeight = 0;\n\tfor (const [tOrGenerator, weight, shouldAccept] of weights) {\n\t\tconst cumulativeWeight = totalWeight + weight;\n\t\tcumulativeSums.push([tOrGenerator, cumulativeWeight, shouldAccept]);\n\t\ttotalWeight = cumulativeWeight;\n\t}\n\n\treturn async (state, additionalState) => {\n\t\tconst { rand } = state;\n\t\tconst sample = () => {\n\t\t\tconst weightSelected = rand.nextInt(1, totalWeight);\n\n\t\t\tlet opIndex = 0;\n\t\t\twhile (cumulativeSums[opIndex][1] < weightSelected) {\n\t\t\t\topIndex++;\n\t\t\t}\n\n\t\t\treturn opIndex;\n\t\t};\n\n\t\tlet index;\n\t\tlet shouldAccept: AcceptanceCondition<TAdditionalState> | undefined;\n\t\tdo {\n\t\t\tindex = sample();\n\t\t\tshouldAccept = cumulativeSums[index][2];\n\t\t} while (!(shouldAccept?.(state, additionalState) ?? true));\n\n\t\tconst [tOrGenerator] = cumulativeSums[index];\n\t\treturn typeof tOrGenerator === 'function'\n\t\t\t? (tOrGenerator as AsyncGenerator<T, TAdditionalState>)(state, additionalState)\n\t\t\t: (tOrGenerator as unknown as T);\n\t};\n}\n\nfunction getIdList(tree: TreeView): NodeId[] {\n\tconst allIds: NodeId[] = [];\n\tconst toVisit: NodeId[] = [tree.root];\n\twhile (toVisit.length > 0) {\n\t\tconst id = toVisit.pop() ?? fail();\n\t\tallIds.push(id);\n\t\tconst node = tree.getViewNode(id);\n\t\tfor (const [_, childIds] of node.traits) {\n\t\t\ttoVisit.push(...childIds);\n\t\t}\n\t}\n\treturn allIds;\n}\n\n/**\n * Higher-order generator operator which creates a new generator producing the first `n` elements of `generator`.\n */\nexport function take<T, TAdditionalState>(\n\tn: number,\n\tgenerator: AsyncGenerator<T, TAdditionalState>\n): AsyncGenerator<T, TAdditionalState> {\n\tlet count = 0;\n\treturn async (state, additionalState) => {\n\t\tif (count < n) {\n\t\t\tcount++;\n\t\t\treturn generator(state, additionalState);\n\t\t}\n\t\treturn done;\n\t};\n}\n\n/**\n * @returns a deterministic generator that always returns the items of `contents` in order.\n */\nexport function generatorFromArray<T, TAdditionalState>(contents: T[]): AsyncGenerator<T, TAdditionalState> {\n\tlet index = -1;\n\treturn async () => {\n\t\tif (index < contents.length) {\n\t\t\tindex++;\n\t\t\treturn contents[index] ?? done;\n\t\t}\n\t\treturn done;\n\t};\n}\n\n/**\n * Higher-order generator operator which exhausts each input generator sequentially before moving on to the next.\n */\nexport function chain<T, TAdditionalState>(\n\t...generators: AsyncGenerator<T, TAdditionalState>[]\n): AsyncGenerator<T, TAdditionalState> {\n\tlet currentIndex = 0;\n\treturn async (state, additionalState) => {\n\t\twhile (currentIndex < generators.length) {\n\t\t\tconst generator = generators[currentIndex];\n\t\t\tconst result = await generator(state, additionalState);\n\t\t\tif (result !== done) {\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\tcurrentIndex++;\n\t\t\t}\n\t\t}\n\t\treturn done;\n\t};\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { FuzzTestState, AsyncGenerator, Operation } from './Types';
6
+ /**
7
+ * Performs random actions on a set of clients.
8
+ * @param generator finite generator for a sequence of Operations to test. The test will run until this generator is exhausted.
9
+ * @param seed the seed for the random generation of the fuzz actions
10
+ * @param synchronizeAtEnd if provided, all client will have all operations delivered from the server at the end of the test
11
+ * @param saveInfo optionally provide an operation number at which a history of all operations will be saved to disk at a given filepath.
12
+ * This can be useful for debugging why a fuzz test may have failed.
13
+ */
14
+ export declare function performFuzzActions(generator: AsyncGenerator<Operation, undefined>, seed: number, synchronizeAtEnd?: boolean, saveInfo?: {
15
+ saveAt?: number;
16
+ saveOnFailure: boolean;
17
+ filepath: string;
18
+ }): Promise<Required<FuzzTestState>>;
19
+ export declare function runSharedTreeFuzzTests(title: string): void;
20
+ //# sourceMappingURL=SharedTreeFuzzTests.d.ts.map