@fluid-experimental/tree 0.58.2002 → 0.59.1000
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.
- package/README.md +159 -46
- package/dist/ChangeCompression.d.ts +39 -0
- package/dist/ChangeCompression.d.ts.map +1 -0
- package/dist/ChangeCompression.js +117 -0
- package/dist/ChangeCompression.js.map +1 -0
- package/{lib/default-edits/PersistedTypes.d.ts → dist/ChangeTypes.d.ts} +58 -105
- package/dist/ChangeTypes.d.ts.map +1 -0
- package/dist/{default-edits/PersistedTypes.js → ChangeTypes.js} +21 -76
- package/dist/ChangeTypes.js.map +1 -0
- package/dist/Checkout.d.ts +39 -27
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +61 -32
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +175 -38
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +240 -103
- package/dist/Common.js.map +1 -1
- package/dist/EagerCheckout.d.ts +24 -0
- package/dist/EagerCheckout.d.ts.map +1 -0
- package/dist/{BasicCheckout.js → EagerCheckout.js} +9 -6
- package/dist/EagerCheckout.js.map +1 -0
- package/dist/EditLog.d.ts +77 -63
- package/dist/EditLog.d.ts.map +1 -1
- package/dist/EditLog.js +85 -48
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.d.ts +168 -0
- package/dist/EditUtilities.d.ts.map +1 -0
- package/dist/EditUtilities.js +373 -0
- package/dist/EditUtilities.js.map +1 -0
- package/dist/EventTypes.d.ts +73 -0
- package/dist/EventTypes.d.ts.map +1 -0
- package/dist/EventTypes.js +78 -0
- package/dist/EventTypes.js.map +1 -0
- package/dist/Forest.d.ts +29 -7
- package/dist/Forest.d.ts.map +1 -1
- package/dist/Forest.js +60 -36
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +20 -0
- package/dist/HistoryEditFactory.d.ts.map +1 -0
- package/dist/HistoryEditFactory.js +226 -0
- package/dist/HistoryEditFactory.js.map +1 -0
- package/dist/IdConversion.d.ts +12 -0
- package/dist/IdConversion.d.ts.map +1 -0
- package/dist/IdConversion.js +98 -0
- package/dist/IdConversion.js.map +1 -0
- package/dist/Identifiers.d.ts +89 -2
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js +10 -0
- package/dist/Identifiers.js.map +1 -1
- package/dist/InitialTree.d.ts +2 -2
- package/dist/InitialTree.d.ts.map +1 -1
- package/dist/InitialTree.js +2 -1
- package/dist/InitialTree.js.map +1 -1
- package/dist/LazyCheckout.d.ts +28 -0
- package/dist/LazyCheckout.d.ts.map +1 -0
- package/dist/LazyCheckout.js +44 -0
- package/dist/LazyCheckout.js.map +1 -0
- package/dist/LogViewer.d.ts +129 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +111 -85
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.d.ts +221 -0
- package/dist/MergeHealth.d.ts.map +1 -0
- package/dist/MergeHealth.js +263 -0
- package/dist/MergeHealth.js.map +1 -0
- package/dist/NodeIdUtilities.d.ts +105 -0
- package/dist/NodeIdUtilities.d.ts.map +1 -0
- package/dist/NodeIdUtilities.js +60 -0
- package/dist/NodeIdUtilities.js.map +1 -0
- package/dist/PayloadUtilities.d.ts +42 -0
- package/dist/PayloadUtilities.d.ts.map +1 -0
- package/dist/PayloadUtilities.js +114 -0
- package/dist/PayloadUtilities.js.map +1 -0
- package/dist/ReconciliationPath.d.ts +18 -13
- package/dist/ReconciliationPath.d.ts.map +1 -1
- package/dist/ReconciliationPath.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +11 -2
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +2 -3
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.d.ts +83 -0
- package/dist/RevisionView.d.ts.map +1 -0
- package/dist/RevisionView.js +182 -0
- package/dist/RevisionView.js.map +1 -0
- package/dist/SerializationUtilities.d.ts +36 -0
- package/dist/SerializationUtilities.d.ts.map +1 -0
- package/dist/SerializationUtilities.js +102 -0
- package/dist/SerializationUtilities.js.map +1 -0
- package/dist/SharedTree.d.ts +439 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1109 -0
- package/dist/SharedTree.js.map +1 -0
- package/dist/SharedTreeEncoder.d.ts +102 -0
- package/dist/SharedTreeEncoder.d.ts.map +1 -0
- package/dist/SharedTreeEncoder.js +313 -0
- package/dist/SharedTreeEncoder.js.map +1 -0
- package/dist/StringInterner.d.ts +46 -0
- package/dist/StringInterner.d.ts.map +1 -0
- package/dist/StringInterner.js +61 -0
- package/dist/StringInterner.js.map +1 -0
- package/dist/Summary.d.ts +40 -0
- package/dist/Summary.d.ts.map +1 -0
- package/dist/Summary.js +23 -0
- package/dist/Summary.js.map +1 -0
- package/dist/SummaryBackCompatibility.d.ts +22 -22
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js +30 -33
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/SummaryTestUtilities.d.ts +31 -0
- package/dist/SummaryTestUtilities.d.ts.map +1 -0
- package/dist/SummaryTestUtilities.js +37 -0
- package/dist/SummaryTestUtilities.js.map +1 -0
- package/dist/Transaction.d.ts +52 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +72 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +540 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +626 -0
- package/dist/TransactionInternal.js.map +1 -0
- package/dist/TreeCompressor.d.ts +36 -0
- package/dist/TreeCompressor.d.ts.map +1 -0
- package/dist/TreeCompressor.js +137 -0
- package/dist/TreeCompressor.js.map +1 -0
- package/dist/TreeNodeHandle.d.ts +12 -18
- package/dist/TreeNodeHandle.d.ts.map +1 -1
- package/dist/TreeNodeHandle.js +13 -23
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.d.ts +166 -0
- package/dist/TreeView.d.ts.map +1 -0
- package/dist/TreeView.js +218 -0
- package/dist/TreeView.js.map +1 -0
- package/dist/TreeViewUtilities.d.ts +21 -0
- package/dist/TreeViewUtilities.d.ts.map +1 -0
- package/dist/TreeViewUtilities.js +77 -0
- package/dist/TreeViewUtilities.js.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/dist/UndoRedoHandler.d.ts.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +5 -9
- package/dist/UndoRedoHandler.js.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.js +283 -0
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/dist/id-compressor/IdCompressor.d.ts +389 -0
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -0
- package/dist/id-compressor/IdCompressor.js +1353 -0
- package/dist/id-compressor/IdCompressor.js.map +1 -0
- package/dist/id-compressor/IdRange.d.ts +11 -0
- package/dist/id-compressor/IdRange.d.ts.map +1 -0
- package/dist/id-compressor/IdRange.js +29 -0
- package/dist/id-compressor/IdRange.js.map +1 -0
- package/dist/id-compressor/NumericUuid.d.ts +63 -0
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -0
- package/dist/id-compressor/NumericUuid.js +377 -0
- package/dist/id-compressor/NumericUuid.js.map +1 -0
- package/dist/id-compressor/index.d.ts +12 -0
- package/dist/id-compressor/index.d.ts.map +1 -0
- package/dist/id-compressor/index.js +26 -0
- package/dist/id-compressor/index.js.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.js +7 -0
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/dist/id-compressor/persisted-types/index.d.ts +6 -0
- package/dist/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/index.js +18 -0
- package/dist/id-compressor/persisted-types/index.js.map +1 -0
- package/dist/index.d.ts +29 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -35
- package/dist/index.js.map +1 -1
- package/dist/persisted-types/0.0.2.d.ts +385 -0
- package/dist/persisted-types/0.0.2.d.ts.map +1 -0
- package/dist/persisted-types/0.0.2.js +113 -0
- package/dist/persisted-types/0.0.2.js.map +1 -0
- package/dist/persisted-types/0.1.1.d.ts +314 -0
- package/dist/persisted-types/0.1.1.d.ts.map +1 -0
- package/dist/persisted-types/0.1.1.js +153 -0
- package/dist/persisted-types/0.1.1.js.map +1 -0
- package/dist/persisted-types/index.d.ts +7 -0
- package/dist/persisted-types/index.d.ts.map +1 -0
- package/dist/persisted-types/index.js +20 -0
- package/dist/persisted-types/index.js.map +1 -0
- package/docs/0-1-1-Compression.md +228 -0
- package/docs/Breaking-Change-Migration.md +52 -0
- package/docs/Compression.md +2 -2
- package/docs/Telemetry.md +43 -0
- package/docs/Write-Format.md +19 -0
- package/lib/ChangeCompression.d.ts +39 -0
- package/lib/ChangeCompression.d.ts.map +1 -0
- package/lib/ChangeCompression.js +111 -0
- package/lib/ChangeCompression.js.map +1 -0
- package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -105
- package/lib/ChangeTypes.d.ts.map +1 -0
- package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
- package/lib/ChangeTypes.js.map +1 -0
- package/lib/Checkout.d.ts +39 -27
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +53 -24
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +175 -38
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +226 -101
- package/lib/Common.js.map +1 -1
- package/lib/EagerCheckout.d.ts +24 -0
- package/lib/EagerCheckout.d.ts.map +1 -0
- package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
- package/lib/EagerCheckout.js.map +1 -0
- package/lib/EditLog.d.ts +77 -63
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +83 -47
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +168 -0
- package/lib/EditUtilities.d.ts.map +1 -0
- package/lib/EditUtilities.js +353 -0
- package/lib/EditUtilities.js.map +1 -0
- package/lib/EventTypes.d.ts +73 -0
- package/lib/EventTypes.d.ts.map +1 -0
- package/lib/EventTypes.js +75 -0
- package/lib/EventTypes.js.map +1 -0
- package/lib/Forest.d.ts +29 -7
- package/lib/Forest.d.ts.map +1 -1
- package/lib/Forest.js +58 -35
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +20 -0
- package/lib/HistoryEditFactory.d.ts.map +1 -0
- package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
- package/lib/HistoryEditFactory.js.map +1 -0
- package/lib/IdConversion.d.ts +12 -0
- package/lib/IdConversion.d.ts.map +1 -0
- package/lib/IdConversion.js +91 -0
- package/lib/IdConversion.js.map +1 -0
- package/lib/Identifiers.d.ts +89 -2
- package/lib/Identifiers.d.ts.map +1 -1
- package/lib/Identifiers.js +8 -1
- package/lib/Identifiers.js.map +1 -1
- package/lib/InitialTree.d.ts +2 -2
- package/lib/InitialTree.d.ts.map +1 -1
- package/lib/InitialTree.js +2 -1
- package/lib/InitialTree.js.map +1 -1
- package/lib/LazyCheckout.d.ts +28 -0
- package/lib/LazyCheckout.d.ts.map +1 -0
- package/lib/LazyCheckout.js +40 -0
- package/lib/LazyCheckout.js.map +1 -0
- package/lib/LogViewer.d.ts +129 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +103 -77
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.d.ts +221 -0
- package/lib/MergeHealth.d.ts.map +1 -0
- package/lib/MergeHealth.js +258 -0
- package/lib/MergeHealth.js.map +1 -0
- package/lib/NodeIdUtilities.d.ts +105 -0
- package/lib/NodeIdUtilities.d.ts.map +1 -0
- package/lib/NodeIdUtilities.js +53 -0
- package/lib/NodeIdUtilities.js.map +1 -0
- package/lib/PayloadUtilities.d.ts +42 -0
- package/lib/PayloadUtilities.d.ts.map +1 -0
- package/lib/PayloadUtilities.js +110 -0
- package/lib/PayloadUtilities.js.map +1 -0
- package/lib/ReconciliationPath.d.ts +18 -13
- package/lib/ReconciliationPath.d.ts.map +1 -1
- package/lib/ReconciliationPath.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +11 -2
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +2 -3
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.d.ts +83 -0
- package/lib/RevisionView.d.ts.map +1 -0
- package/lib/RevisionView.js +175 -0
- package/lib/RevisionView.js.map +1 -0
- package/lib/SerializationUtilities.d.ts +36 -0
- package/lib/SerializationUtilities.d.ts.map +1 -0
- package/lib/SerializationUtilities.js +95 -0
- package/lib/SerializationUtilities.js.map +1 -0
- package/lib/SharedTree.d.ts +439 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1104 -0
- package/lib/SharedTree.js.map +1 -0
- package/lib/SharedTreeEncoder.d.ts +102 -0
- package/lib/SharedTreeEncoder.d.ts.map +1 -0
- package/lib/SharedTreeEncoder.js +308 -0
- package/lib/SharedTreeEncoder.js.map +1 -0
- package/lib/StringInterner.d.ts +46 -0
- package/lib/StringInterner.d.ts.map +1 -0
- package/lib/StringInterner.js +57 -0
- package/lib/StringInterner.js.map +1 -0
- package/lib/Summary.d.ts +40 -0
- package/lib/Summary.d.ts.map +1 -0
- package/lib/Summary.js +19 -0
- package/lib/Summary.js.map +1 -0
- package/lib/SummaryBackCompatibility.d.ts +22 -22
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js +29 -32
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/SummaryTestUtilities.d.ts +31 -0
- package/lib/SummaryTestUtilities.d.ts.map +1 -0
- package/lib/SummaryTestUtilities.js +32 -0
- package/lib/SummaryTestUtilities.js.map +1 -0
- package/lib/Transaction.d.ts +52 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +68 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +540 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +622 -0
- package/lib/TransactionInternal.js.map +1 -0
- package/lib/TreeCompressor.d.ts +36 -0
- package/lib/TreeCompressor.d.ts.map +1 -0
- package/lib/TreeCompressor.js +133 -0
- package/lib/TreeCompressor.js.map +1 -0
- package/lib/TreeNodeHandle.d.ts +12 -18
- package/lib/TreeNodeHandle.d.ts.map +1 -1
- package/lib/TreeNodeHandle.js +14 -24
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.d.ts +166 -0
- package/lib/TreeView.d.ts.map +1 -0
- package/lib/TreeView.js +214 -0
- package/lib/TreeView.js.map +1 -0
- package/lib/TreeViewUtilities.d.ts +21 -0
- package/lib/TreeViewUtilities.d.ts.map +1 -0
- package/lib/TreeViewUtilities.js +71 -0
- package/lib/TreeViewUtilities.js.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/lib/UndoRedoHandler.d.ts.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
- package/lib/UndoRedoHandler.js.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/lib/id-compressor/IdCompressor.d.ts +389 -0
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
- package/lib/id-compressor/IdCompressor.js +1343 -0
- package/lib/id-compressor/IdCompressor.js.map +1 -0
- package/lib/id-compressor/IdRange.d.ts +11 -0
- package/lib/id-compressor/IdRange.d.ts.map +1 -0
- package/lib/id-compressor/IdRange.js +25 -0
- package/lib/id-compressor/IdRange.js.map +1 -0
- package/lib/id-compressor/NumericUuid.d.ts +63 -0
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
- package/lib/id-compressor/NumericUuid.js +365 -0
- package/lib/id-compressor/NumericUuid.js.map +1 -0
- package/lib/id-compressor/index.d.ts +12 -0
- package/lib/id-compressor/index.d.ts.map +1 -0
- package/lib/id-compressor/index.js +12 -0
- package/lib/id-compressor/index.js.map +1 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/lib/id-compressor/persisted-types/index.d.ts +6 -0
- package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/lib/id-compressor/persisted-types/index.js +6 -0
- package/lib/id-compressor/persisted-types/index.js.map +1 -0
- package/lib/index.d.ts +29 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +23 -6
- package/lib/index.js.map +1 -1
- package/lib/persisted-types/0.0.2.d.ts +385 -0
- package/lib/persisted-types/0.0.2.d.ts.map +1 -0
- package/lib/persisted-types/0.0.2.js +110 -0
- package/lib/persisted-types/0.0.2.js.map +1 -0
- package/lib/persisted-types/0.1.1.d.ts +314 -0
- package/lib/persisted-types/0.1.1.d.ts.map +1 -0
- package/lib/persisted-types/0.1.1.js +150 -0
- package/lib/persisted-types/0.1.1.js.map +1 -0
- package/lib/persisted-types/index.d.ts +7 -0
- package/lib/persisted-types/index.d.ts.map +1 -0
- package/lib/persisted-types/index.js +8 -0
- package/lib/persisted-types/index.js.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.js +169 -0
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
- package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
- package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
- package/lib/test/ChangeCompression.tests.js +145 -0
- package/lib/test/ChangeCompression.tests.js.map +1 -0
- package/lib/test/Checkout.tests.d.ts +2 -3
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +126 -69
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +60 -2
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
- package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
- package/lib/test/EagerCheckout.tests.js +20 -0
- package/lib/test/EagerCheckout.tests.js.map +1 -0
- package/lib/test/Edit.tests.js +22 -14
- package/lib/test/Edit.tests.js.map +1 -1
- package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
- package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
- package/lib/test/EditLog.perf.tests.js +30 -0
- package/lib/test/EditLog.perf.tests.js.map +1 -0
- package/lib/test/EditLog.tests.js +10 -6
- package/lib/test/EditLog.tests.js.map +1 -1
- package/lib/test/EditUtilities.tests.d.ts +6 -0
- package/lib/test/EditUtilities.tests.d.ts.map +1 -0
- package/lib/test/EditUtilities.tests.js +503 -0
- package/lib/test/EditUtilities.tests.js.map +1 -0
- package/lib/test/Forest.perf.tests.d.ts +6 -0
- package/lib/test/Forest.perf.tests.d.ts.map +1 -0
- package/lib/test/Forest.perf.tests.js +133 -0
- package/lib/test/Forest.perf.tests.js.map +1 -0
- package/lib/test/Forest.tests.js +54 -27
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/GenericTransaction.tests.js +12 -3
- package/lib/test/GenericTransaction.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
- package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
- package/lib/test/HistoryEditFactory.tests.js +90 -0
- package/lib/test/HistoryEditFactory.tests.js.map +1 -0
- package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
- package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.perf.tests.js +304 -0
- package/lib/test/IdCompressor.perf.tests.js.map +1 -0
- package/lib/test/IdCompressor.tests.d.ts +6 -0
- package/lib/test/IdCompressor.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.tests.js +1075 -0
- package/lib/test/IdCompressor.tests.js.map +1 -0
- package/lib/test/IdConversion.tests.d.ts +6 -0
- package/lib/test/IdConversion.tests.d.ts.map +1 -0
- package/lib/test/IdConversion.tests.js +36 -0
- package/lib/test/IdConversion.tests.js.map +1 -0
- package/lib/test/LazyCheckout.tests.d.ts +6 -0
- package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
- package/lib/test/LazyCheckout.tests.js +22 -0
- package/lib/test/LazyCheckout.tests.js.map +1 -0
- package/lib/test/LogViewer.tests.js +276 -191
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
- package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
- package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.perf.tests.js +68 -0
- package/lib/test/NumericUuid.perf.tests.js.map +1 -0
- package/lib/test/NumericUuid.tests.d.ts +6 -0
- package/lib/test/NumericUuid.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.tests.js +191 -0
- package/lib/test/NumericUuid.tests.js.map +1 -0
- package/lib/test/RevisionView.tests.d.ts +6 -0
- package/lib/test/RevisionView.tests.d.ts.map +1 -0
- package/lib/test/RevisionView.tests.js +133 -0
- package/lib/test/RevisionView.tests.js.map +1 -0
- package/lib/test/SharedTree.perf.tests.d.ts +6 -0
- package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
- package/lib/test/SharedTree.perf.tests.js +39 -0
- package/lib/test/SharedTree.perf.tests.js.map +1 -0
- package/lib/test/SharedTree.tests.js +15 -3
- package/lib/test/SharedTree.tests.js.map +1 -1
- package/lib/test/StringInterner.tests.d.ts +6 -0
- package/lib/test/StringInterner.tests.d.ts.map +1 -0
- package/lib/test/StringInterner.tests.js +71 -0
- package/lib/test/StringInterner.tests.js.map +1 -0
- package/lib/test/Summary.tests.d.ts +8 -0
- package/lib/test/Summary.tests.d.ts.map +1 -0
- package/lib/test/Summary.tests.js +407 -0
- package/lib/test/Summary.tests.js.map +1 -0
- package/lib/test/Transaction.tests.js +76 -330
- package/lib/test/Transaction.tests.js.map +1 -1
- package/lib/test/TransactionInternal.tests.d.ts +6 -0
- package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
- package/lib/test/TransactionInternal.tests.js +568 -0
- package/lib/test/TransactionInternal.tests.js.map +1 -0
- package/lib/test/TreeCompression.tests.d.ts +6 -0
- package/lib/test/TreeCompression.tests.d.ts.map +1 -0
- package/lib/test/TreeCompression.tests.js +292 -0
- package/lib/test/TreeCompression.tests.js.map +1 -0
- package/lib/test/TreeView.tests.d.ts +6 -0
- package/lib/test/TreeView.tests.d.ts.map +1 -0
- package/lib/test/TreeView.tests.js +176 -0
- package/lib/test/TreeView.tests.js.map +1 -0
- package/lib/test/UndoRedoHandler.tests.js +2 -2
- package/lib/test/UndoRedoHandler.tests.js.map +1 -1
- package/lib/test/Virtualization.tests.js +146 -62
- package/lib/test/Virtualization.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +19 -0
- package/lib/test/fuzz/Generators.d.ts.map +1 -0
- package/lib/test/fuzz/Generators.js +420 -0
- package/lib/test/fuzz/Generators.js.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js +217 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
- package/lib/test/fuzz/Types.d.ts +133 -0
- package/lib/test/fuzz/Types.d.ts.map +1 -0
- package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
- package/lib/test/fuzz/Types.js.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
- package/lib/test/utilities/MockTransaction.d.ts +26 -7
- package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
- package/lib/test/utilities/MockTransaction.js +40 -11
- package/lib/test/utilities/MockTransaction.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
- package/lib/test/utilities/PendingLocalStateTests.js +105 -0
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
- package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +696 -439
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js +370 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
- package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
- package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
- package/lib/test/utilities/SummarySizeTests.js +158 -0
- package/lib/test/utilities/SummarySizeTests.js.map +1 -0
- package/lib/test/utilities/TestCommon.d.ts +9 -0
- package/lib/test/utilities/TestCommon.d.ts.map +1 -0
- package/lib/test/utilities/TestCommon.js +13 -0
- package/lib/test/utilities/TestCommon.js.map +1 -0
- package/lib/test/utilities/TestNode.d.ts +140 -0
- package/lib/test/utilities/TestNode.d.ts.map +1 -0
- package/lib/test/utilities/TestNode.js +292 -0
- package/lib/test/utilities/TestNode.js.map +1 -0
- package/lib/test/utilities/TestUtilities.d.ts +84 -70
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +218 -143
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
- package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +138 -149
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +22 -17
- package/src/ChangeCompression.ts +159 -0
- package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -125
- package/src/Checkout.ts +82 -53
- package/src/Common.ts +317 -117
- package/src/EagerCheckout.ts +38 -0
- package/src/EditLog.ts +153 -100
- package/src/EditUtilities.ts +559 -0
- package/src/EventTypes.ts +74 -0
- package/src/Forest.ts +81 -73
- package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
- package/src/IdConversion.ts +125 -0
- package/src/Identifiers.ts +101 -1
- package/src/InitialTree.ts +5 -4
- package/src/LazyCheckout.ts +51 -0
- package/src/LogViewer.ts +242 -166
- package/src/MergeHealth.ts +447 -0
- package/src/NodeIdUtilities.ts +156 -0
- package/src/PayloadUtilities.ts +124 -0
- package/src/ReconciliationPath.ts +18 -13
- package/src/RevisionValueCache.ts +14 -5
- package/src/RevisionView.ts +252 -0
- package/src/SerializationUtilities.ts +130 -0
- package/src/SharedTree.ts +1501 -0
- package/src/SharedTreeEncoder.ts +493 -0
- package/src/StringInterner.ts +72 -0
- package/src/Summary.ts +48 -0
- package/src/SummaryBackCompatibility.ts +47 -57
- package/src/SummaryTestUtilities.ts +54 -0
- package/src/Transaction.ts +89 -0
- package/src/TransactionInternal.ts +1087 -0
- package/src/TreeCompressor.ts +213 -0
- package/src/TreeNodeHandle.ts +19 -32
- package/src/TreeView.ts +322 -0
- package/src/TreeViewUtilities.ts +77 -0
- package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
- package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
- package/src/id-compressor/IdCompressor.md +3 -0
- package/src/id-compressor/IdCompressor.ts +1848 -0
- package/src/id-compressor/IdRange.ts +33 -0
- package/src/id-compressor/NumericUuid.ts +414 -0
- package/src/id-compressor/index.ts +13 -0
- package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
- package/src/id-compressor/persisted-types/README.md +3 -0
- package/src/id-compressor/persisted-types/index.ts +6 -0
- package/src/index.ts +118 -59
- package/src/persisted-types/0.0.2.ts +442 -0
- package/src/persisted-types/0.1.1.ts +476 -0
- package/src/persisted-types/README.md +22 -0
- package/src/persisted-types/index.ts +9 -0
- package/.mocharc.js +0 -41
- package/api/tree.api.md +0 -729
- package/dist/BasicCheckout.d.ts +0 -23
- package/dist/BasicCheckout.d.ts.map +0 -1
- package/dist/BasicCheckout.js.map +0 -1
- package/dist/Snapshot.d.ts +0 -198
- package/dist/Snapshot.d.ts.map +0 -1
- package/dist/Snapshot.js +0 -267
- package/dist/Snapshot.js.map +0 -1
- package/dist/SnapshotUtilities.d.ts +0 -29
- package/dist/SnapshotUtilities.d.ts.map +0 -1
- package/dist/SnapshotUtilities.js +0 -73
- package/dist/SnapshotUtilities.js.map +0 -1
- package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
- package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/dist/anchored-edits/AnchorResolution.js +0 -162
- package/dist/anchored-edits/AnchorResolution.js.map +0 -1
- package/dist/anchored-edits/Factory.d.ts +0 -56
- package/dist/anchored-edits/Factory.d.ts.map +0 -1
- package/dist/anchored-edits/Factory.js +0 -79
- package/dist/anchored-edits/Factory.js.map +0 -1
- package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
- package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/anchored-edits/PersistedTypes.js +0 -131
- package/dist/anchored-edits/PersistedTypes.js.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
- package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
- package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/dist/anchored-edits/index.d.ts +0 -10
- package/dist/anchored-edits/index.d.ts.map +0 -1
- package/dist/anchored-edits/index.js +0 -34
- package/dist/anchored-edits/index.js.map +0 -1
- package/dist/default-edits/EditUtilities.d.ts +0 -57
- package/dist/default-edits/EditUtilities.d.ts.map +0 -1
- package/dist/default-edits/EditUtilities.js +0 -192
- package/dist/default-edits/EditUtilities.js.map +0 -1
- package/dist/default-edits/Factory.d.ts +0 -56
- package/dist/default-edits/Factory.d.ts.map +0 -1
- package/dist/default-edits/Factory.js +0 -79
- package/dist/default-edits/Factory.js.map +0 -1
- package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
- package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/dist/default-edits/HistoryEditFactory.js +0 -187
- package/dist/default-edits/HistoryEditFactory.js.map +0 -1
- package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/default-edits/PersistedTypes.js.map +0 -1
- package/dist/default-edits/SharedTree.d.ts +0 -111
- package/dist/default-edits/SharedTree.d.ts.map +0 -1
- package/dist/default-edits/SharedTree.js +0 -124
- package/dist/default-edits/SharedTree.js.map +0 -1
- package/dist/default-edits/Summary.d.ts +0 -15
- package/dist/default-edits/Summary.d.ts.map +0 -1
- package/dist/default-edits/Summary.js +0 -35
- package/dist/default-edits/Summary.js.map +0 -1
- package/dist/default-edits/Transaction.d.ts +0 -41
- package/dist/default-edits/Transaction.d.ts.map +0 -1
- package/dist/default-edits/Transaction.js +0 -225
- package/dist/default-edits/Transaction.js.map +0 -1
- package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/dist/default-edits/UndoRedoHandler.js.map +0 -1
- package/dist/default-edits/index.d.ts +0 -13
- package/dist/default-edits/index.d.ts.map +0 -1
- package/dist/default-edits/index.js +0 -41
- package/dist/default-edits/index.js.map +0 -1
- package/dist/generic/GenericEditUtilities.d.ts +0 -26
- package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
- package/dist/generic/GenericEditUtilities.js +0 -45
- package/dist/generic/GenericEditUtilities.js.map +0 -1
- package/dist/generic/GenericSharedTree.d.ts +0 -221
- package/dist/generic/GenericSharedTree.d.ts.map +0 -1
- package/dist/generic/GenericSharedTree.js +0 -447
- package/dist/generic/GenericSharedTree.js.map +0 -1
- package/dist/generic/GenericTransaction.d.ts +0 -87
- package/dist/generic/GenericTransaction.d.ts.map +0 -1
- package/dist/generic/GenericTransaction.js +0 -144
- package/dist/generic/GenericTransaction.js.map +0 -1
- package/dist/generic/PersistedTypes.d.ts +0 -194
- package/dist/generic/PersistedTypes.d.ts.map +0 -1
- package/dist/generic/PersistedTypes.js +0 -42
- package/dist/generic/PersistedTypes.js.map +0 -1
- package/dist/generic/Summary.d.ts +0 -63
- package/dist/generic/Summary.d.ts.map +0 -1
- package/dist/generic/Summary.js +0 -64
- package/dist/generic/Summary.js.map +0 -1
- package/dist/generic/index.d.ts +0 -10
- package/dist/generic/index.d.ts.map +0 -1
- package/dist/generic/index.js +0 -26
- package/dist/generic/index.js.map +0 -1
- package/docs/Future.md +0 -155
- package/lib/BasicCheckout.d.ts +0 -23
- package/lib/BasicCheckout.d.ts.map +0 -1
- package/lib/BasicCheckout.js.map +0 -1
- package/lib/Snapshot.d.ts +0 -198
- package/lib/Snapshot.d.ts.map +0 -1
- package/lib/Snapshot.js +0 -263
- package/lib/Snapshot.js.map +0 -1
- package/lib/SnapshotUtilities.d.ts +0 -29
- package/lib/SnapshotUtilities.d.ts.map +0 -1
- package/lib/SnapshotUtilities.js +0 -67
- package/lib/SnapshotUtilities.js.map +0 -1
- package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
- package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/lib/anchored-edits/AnchorResolution.js +0 -152
- package/lib/anchored-edits/AnchorResolution.js.map +0 -1
- package/lib/anchored-edits/Factory.d.ts +0 -56
- package/lib/anchored-edits/Factory.d.ts.map +0 -1
- package/lib/anchored-edits/Factory.js +0 -74
- package/lib/anchored-edits/Factory.js.map +0 -1
- package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
- package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/anchored-edits/PersistedTypes.js +0 -128
- package/lib/anchored-edits/PersistedTypes.js.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
- package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
- package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/lib/anchored-edits/index.d.ts +0 -10
- package/lib/anchored-edits/index.d.ts.map +0 -1
- package/lib/anchored-edits/index.js +0 -11
- package/lib/anchored-edits/index.js.map +0 -1
- package/lib/default-edits/EditUtilities.d.ts +0 -57
- package/lib/default-edits/EditUtilities.d.ts.map +0 -1
- package/lib/default-edits/EditUtilities.js +0 -181
- package/lib/default-edits/EditUtilities.js.map +0 -1
- package/lib/default-edits/Factory.d.ts +0 -56
- package/lib/default-edits/Factory.d.ts.map +0 -1
- package/lib/default-edits/Factory.js +0 -74
- package/lib/default-edits/Factory.js.map +0 -1
- package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
- package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/lib/default-edits/HistoryEditFactory.js.map +0 -1
- package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/default-edits/PersistedTypes.js.map +0 -1
- package/lib/default-edits/SharedTree.d.ts +0 -111
- package/lib/default-edits/SharedTree.d.ts.map +0 -1
- package/lib/default-edits/SharedTree.js +0 -100
- package/lib/default-edits/SharedTree.js.map +0 -1
- package/lib/default-edits/Summary.d.ts +0 -15
- package/lib/default-edits/Summary.d.ts.map +0 -1
- package/lib/default-edits/Summary.js +0 -31
- package/lib/default-edits/Summary.js.map +0 -1
- package/lib/default-edits/Transaction.d.ts +0 -41
- package/lib/default-edits/Transaction.d.ts.map +0 -1
- package/lib/default-edits/Transaction.js +0 -221
- package/lib/default-edits/Transaction.js.map +0 -1
- package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/lib/default-edits/UndoRedoHandler.js.map +0 -1
- package/lib/default-edits/index.d.ts +0 -13
- package/lib/default-edits/index.d.ts.map +0 -1
- package/lib/default-edits/index.js +0 -14
- package/lib/default-edits/index.js.map +0 -1
- package/lib/generic/GenericEditUtilities.d.ts +0 -26
- package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
- package/lib/generic/GenericEditUtilities.js +0 -38
- package/lib/generic/GenericEditUtilities.js.map +0 -1
- package/lib/generic/GenericSharedTree.d.ts +0 -221
- package/lib/generic/GenericSharedTree.d.ts.map +0 -1
- package/lib/generic/GenericSharedTree.js +0 -443
- package/lib/generic/GenericSharedTree.js.map +0 -1
- package/lib/generic/GenericTransaction.d.ts +0 -87
- package/lib/generic/GenericTransaction.d.ts.map +0 -1
- package/lib/generic/GenericTransaction.js +0 -140
- package/lib/generic/GenericTransaction.js.map +0 -1
- package/lib/generic/PersistedTypes.d.ts +0 -194
- package/lib/generic/PersistedTypes.d.ts.map +0 -1
- package/lib/generic/PersistedTypes.js +0 -39
- package/lib/generic/PersistedTypes.js.map +0 -1
- package/lib/generic/Summary.d.ts +0 -63
- package/lib/generic/Summary.d.ts.map +0 -1
- package/lib/generic/Summary.js +0 -58
- package/lib/generic/Summary.js.map +0 -1
- package/lib/generic/index.d.ts +0 -10
- package/lib/generic/index.d.ts.map +0 -1
- package/lib/generic/index.js +0 -11
- package/lib/generic/index.js.map +0 -1
- package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
- package/lib/test/Anchors.glassBox.tests.js +0 -410
- package/lib/test/Anchors.glassBox.tests.js.map +0 -1
- package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
- package/lib/test/BasicCheckout.tests.js +0 -8
- package/lib/test/BasicCheckout.tests.js.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
- package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
- package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
- package/lib/test/Snapshot.tests.d.ts.map +0 -1
- package/lib/test/Snapshot.tests.js +0 -96
- package/lib/test/Snapshot.tests.js.map +0 -1
- package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
- package/lib/test/SnapshotUtilities.tests.js +0 -168
- package/lib/test/SnapshotUtilities.tests.js.map +0 -1
- package/lib/test/undoRedoStackManager.d.ts +0 -26
- package/lib/test/undoRedoStackManager.d.ts.map +0 -1
- package/lib/test/undoRedoStackManager.js +0 -176
- package/lib/test/undoRedoStackManager.js.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
- package/src/BasicCheckout.ts +0 -34
- package/src/Snapshot.ts +0 -363
- package/src/SnapshotUtilities.ts +0 -88
- package/src/anchored-edits/AnchorResolution.ts +0 -442
- package/src/anchored-edits/Factory.ts +0 -94
- package/src/anchored-edits/PersistedTypes.ts +0 -310
- package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
- package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
- package/src/anchored-edits/index.ts +0 -21
- package/src/default-edits/EditUtilities.ts +0 -220
- package/src/default-edits/Factory.ts +0 -94
- package/src/default-edits/SharedTree.ts +0 -174
- package/src/default-edits/Summary.ts +0 -44
- package/src/default-edits/Transaction.ts +0 -262
- package/src/default-edits/index.ts +0 -29
- package/src/generic/GenericEditUtilities.ts +0 -46
- package/src/generic/GenericSharedTree.ts +0 -593
- package/src/generic/GenericTransaction.ts +0 -194
- package/src/generic/PersistedTypes.ts +0 -221
- package/src/generic/Summary.ts +0 -113
- package/src/generic/index.ts +0 -41
package/src/LogViewer.ts
CHANGED
|
@@ -3,22 +3,21 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { ITelemetryBaseLogger } from '@fluidframework/common-definitions';
|
|
7
6
|
import Denque from 'denque';
|
|
8
7
|
import { assert, fail, noop } from './Common';
|
|
9
8
|
import { EditLog, SequencedOrderedEditId } from './EditLog';
|
|
10
|
-
import { Snapshot } from './Snapshot';
|
|
11
|
-
import { Edit, EditStatus, EditingResult, GenericTransaction } from './generic';
|
|
12
9
|
import { EditId } from './Identifiers';
|
|
13
|
-
import { RevisionValueCache } from './RevisionValueCache';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
10
|
+
import { Revision, RevisionValueCache } from './RevisionValueCache';
|
|
11
|
+
import { ReconciliationChange, ReconciliationEdit, ReconciliationPath } from './ReconciliationPath';
|
|
12
|
+
import { ChangeInternal, Edit, EditStatus } from './persisted-types';
|
|
13
|
+
import { RevisionView } from './RevisionView';
|
|
14
|
+
import { EditingResult, TransactionInternal } from './TransactionInternal';
|
|
16
15
|
|
|
17
16
|
/**
|
|
18
|
-
* Callback for when an edit is applied (meaning the result of applying it to a particular
|
|
17
|
+
* Callback for when an edit is applied (meaning the result of applying it to a particular revision is computed).
|
|
19
18
|
*
|
|
20
|
-
* Edits may be applied any time a
|
|
21
|
-
* Depending on the caching policy of the LogViewer, a given edit may or may not be applied in order to compute a
|
|
19
|
+
* Edits may be applied any time a TreeView is computed that includes them.
|
|
20
|
+
* Depending on the caching policy of the LogViewer, a given edit may or may not be applied in order to compute a TreeView containing it.
|
|
22
21
|
*
|
|
23
22
|
* If the same edit occurs in different contexts (ex: a local edit is adjusted for a new remote edit),
|
|
24
23
|
* that it will be reapplied, and this may result in different results.
|
|
@@ -36,46 +35,63 @@ import { ReconciliationEdit, ReconciliationPath } from './ReconciliationPath';
|
|
|
36
35
|
export type EditStatusCallback = (editResult: EditStatus, editId: EditId, wasCached: boolean) => void;
|
|
37
36
|
|
|
38
37
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
38
|
+
* Callback for when a sequenced edit is applied.
|
|
39
|
+
* This includes local edits though the callback is only invoked once the sequenced version is received.
|
|
40
|
+
*
|
|
41
|
+
* For edits that were local (see {@link SequencedEditResult.wasLocal}, this callback will only be called once.
|
|
42
|
+
* For non-local edits, it may be called multiple times: the number of calls and when they occur depends on caching and is an implementation
|
|
43
|
+
* detail.
|
|
44
|
+
*/
|
|
45
|
+
export type SequencedEditResultCallback = (args: SequencedEditResult) => void;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The relevant information pertaining to the application of a sequenced edit.
|
|
41
49
|
*/
|
|
42
|
-
export
|
|
50
|
+
export interface SequencedEditResult {
|
|
43
51
|
/**
|
|
44
|
-
*
|
|
45
|
-
* Used for referencing and de-duplicating edits.
|
|
52
|
+
* The edit that was applied.
|
|
46
53
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
edit: Edit<ChangeInternal>;
|
|
55
|
+
/**
|
|
56
|
+
* true iff the edit was local.
|
|
57
|
+
*/
|
|
58
|
+
wasLocal: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* The result of applying the edit.
|
|
61
|
+
*/
|
|
62
|
+
result: AttemptedEditResultCacheEntry;
|
|
63
|
+
/**
|
|
64
|
+
* The reconciliation path for the edit.
|
|
65
|
+
*/
|
|
66
|
+
reconciliationPath: ReconciliationPath;
|
|
67
|
+
}
|
|
49
68
|
|
|
50
69
|
/**
|
|
51
70
|
* The data cached by `CachingLogViewer` for an edit.
|
|
52
71
|
*/
|
|
53
|
-
export type EditCacheEntry
|
|
54
|
-
| SuccessfulEditCacheEntry<TChange>
|
|
55
|
-
| UnsuccessfulEditCacheEntry
|
|
56
|
-
| SummarizedEditResultCacheEntry;
|
|
72
|
+
export type EditCacheEntry = SuccessfulEditCacheEntry | UnsuccessfulEditCacheEntry | SummarizedEditResultCacheEntry;
|
|
57
73
|
|
|
58
74
|
/**
|
|
59
75
|
* The data cached by `CachingLogViewer` for an edit that it has attempted to apply locally.
|
|
60
76
|
*/
|
|
61
|
-
export type AttemptedEditResultCacheEntry
|
|
77
|
+
export type AttemptedEditResultCacheEntry = SuccessfulEditCacheEntry | UnsuccessfulEditCacheEntry;
|
|
62
78
|
|
|
63
79
|
/**
|
|
64
80
|
* The data cached by `CachingLogViewer` for an edit that it has successfully applied locally.
|
|
65
81
|
*/
|
|
66
|
-
export interface SuccessfulEditCacheEntry
|
|
82
|
+
export interface SuccessfulEditCacheEntry {
|
|
67
83
|
/**
|
|
68
|
-
* The
|
|
84
|
+
* The revision view resulting from the edit.
|
|
69
85
|
*/
|
|
70
|
-
|
|
86
|
+
readonly view: RevisionView;
|
|
71
87
|
/**
|
|
72
|
-
* The status code for the edit that produced the
|
|
88
|
+
* The status code for the edit that produced the revision.
|
|
73
89
|
*/
|
|
74
|
-
status: EditStatus.Applied;
|
|
90
|
+
readonly status: EditStatus.Applied;
|
|
75
91
|
/**
|
|
76
92
|
* The resolved changes that were applied during the edit and their associated outcome.
|
|
77
93
|
*/
|
|
78
|
-
steps: readonly
|
|
94
|
+
readonly steps: readonly ReconciliationChange[];
|
|
79
95
|
}
|
|
80
96
|
|
|
81
97
|
/**
|
|
@@ -83,13 +99,17 @@ export interface SuccessfulEditCacheEntry<TChange> {
|
|
|
83
99
|
*/
|
|
84
100
|
export interface UnsuccessfulEditCacheEntry {
|
|
85
101
|
/**
|
|
86
|
-
* The
|
|
102
|
+
* The revision view resulting from the edit.
|
|
87
103
|
*/
|
|
88
|
-
readonly
|
|
104
|
+
readonly view: RevisionView;
|
|
89
105
|
/**
|
|
90
|
-
* The status code for the edit that produced the
|
|
106
|
+
* The status code for the edit that produced the revision.
|
|
91
107
|
*/
|
|
92
|
-
status: EditStatus.Invalid | EditStatus.Malformed;
|
|
108
|
+
readonly status: EditStatus.Invalid | EditStatus.Malformed;
|
|
109
|
+
/**
|
|
110
|
+
* Information about the failure encountered by the edit
|
|
111
|
+
*/
|
|
112
|
+
readonly failure: TransactionInternal.Failure;
|
|
93
113
|
}
|
|
94
114
|
|
|
95
115
|
/**
|
|
@@ -98,71 +118,85 @@ export interface UnsuccessfulEditCacheEntry {
|
|
|
98
118
|
*/
|
|
99
119
|
export interface SummarizedEditResultCacheEntry {
|
|
100
120
|
/**
|
|
101
|
-
* The
|
|
121
|
+
* The revision view resulting from the edit.
|
|
122
|
+
*/
|
|
123
|
+
readonly view: RevisionView;
|
|
124
|
+
/**
|
|
125
|
+
* Not specified on `SummarizedEditResultCacheEntry`.
|
|
126
|
+
* Declared to allow checking `entry.status` against undefined.
|
|
102
127
|
*/
|
|
103
|
-
|
|
104
|
-
status?: undefined;
|
|
128
|
+
readonly status?: never;
|
|
105
129
|
}
|
|
106
130
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
131
|
+
export type CachedEditingResult = AttemptedEditResultCacheEntry & {
|
|
132
|
+
/**
|
|
133
|
+
* Unique identifier for this edit. Must never be reused.
|
|
134
|
+
* Used for referencing and de-duplicating edits.
|
|
135
|
+
*/
|
|
136
|
+
readonly id: EditId;
|
|
137
|
+
readonly before: RevisionView;
|
|
138
|
+
readonly changes: readonly ChangeInternal[];
|
|
139
|
+
};
|
|
116
140
|
|
|
117
141
|
/**
|
|
118
|
-
* Creates `
|
|
142
|
+
* Creates `RevisionView`s for the revisions in an `EditLog`
|
|
119
143
|
*/
|
|
120
144
|
export interface LogViewer {
|
|
121
145
|
/**
|
|
122
|
-
* Returns the `
|
|
146
|
+
* Returns the `TreeView` output associated with the largest revision in `editLog` less than (but not equal to) the supplied revision.
|
|
123
147
|
*
|
|
124
148
|
* For example:
|
|
125
|
-
* - revision 0 returns the
|
|
126
|
-
* - revision 1 returns the output of editLog[0] (or
|
|
149
|
+
* - revision 0 returns the initialRevision.
|
|
150
|
+
* - revision 1 returns the output of editLog[0] (or initialRevision if there is no edit 0).
|
|
127
151
|
* - revision Number.POSITIVE_INFINITY returns the newest revision.
|
|
128
152
|
*/
|
|
129
|
-
|
|
153
|
+
getRevisionView(revision: Revision): Promise<RevisionView>;
|
|
130
154
|
|
|
131
155
|
/**
|
|
132
|
-
* Returns the `
|
|
156
|
+
* Returns the `TreeView` output associated with the largest revision in `editLog` less than (but not equal to) the supplied revision.
|
|
133
157
|
* Can only be used to retrieve revisions added during the current sessions.
|
|
134
158
|
*
|
|
135
159
|
* For example:
|
|
136
|
-
* - revision 0 returns the
|
|
137
|
-
* - revision 1 returns the output of editLog[0] (or
|
|
160
|
+
* - revision 0 returns the initialRevision.
|
|
161
|
+
* - revision 1 returns the output of editLog[0] (or initialRevision if there is no edit 0).
|
|
138
162
|
* - revision Number.POSITIVE_INFINITY returns the newest revision.
|
|
139
163
|
*/
|
|
140
|
-
|
|
164
|
+
getRevisionViewInSession(revision: Revision): RevisionView;
|
|
141
165
|
}
|
|
142
166
|
|
|
143
167
|
/**
|
|
144
|
-
* Creates
|
|
168
|
+
* Creates views for revisions associated with an EditLog and caches the results.
|
|
169
|
+
*
|
|
170
|
+
* Does so by listening for edits added to the log. If the underlying EditLog or its listeners need to be reused beyond the lifetime of
|
|
171
|
+
* a CachingLogViewer instance, that instance should be disposed with `detachFromEditLog` to ensure it is garbage-collectable.
|
|
145
172
|
* @internal
|
|
146
173
|
*/
|
|
147
|
-
export class CachingLogViewer
|
|
148
|
-
public readonly log: EditLog<
|
|
174
|
+
export class CachingLogViewer implements LogViewer {
|
|
175
|
+
public readonly log: EditLog<ChangeInternal>;
|
|
149
176
|
|
|
150
177
|
/**
|
|
151
|
-
* Maximum size of the sequenced
|
|
178
|
+
* Maximum size of the sequenced revision cache.
|
|
152
179
|
*/
|
|
153
180
|
public static readonly sequencedCacheSizeMax = 50;
|
|
154
181
|
|
|
155
182
|
/**
|
|
156
|
-
* A cache for local
|
|
183
|
+
* A cache for local revisions.
|
|
157
184
|
* It is invalidated whenever a new sequenced edit (that was not already a local edit) is added to the log.
|
|
158
185
|
* When a previously local edit is sequenced, this cache is adjusted to account for it, not invalidated.
|
|
159
186
|
*/
|
|
160
|
-
private readonly
|
|
187
|
+
private readonly localRevisionCache = new Denque<AttemptedEditResultCacheEntry>();
|
|
161
188
|
|
|
162
189
|
/**
|
|
163
|
-
* Cache of sequenced
|
|
190
|
+
* Cache of sequenced revisions.
|
|
164
191
|
*/
|
|
165
|
-
private readonly
|
|
192
|
+
private readonly sequencedRevisionCache: RevisionValueCache<EditCacheEntry>;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Called whenever a sequenced edit is applied.
|
|
196
|
+
* This will have been called at least once for any edit if a revision after than edit has been requested.
|
|
197
|
+
* It may be called multiple times: the number of calls and when they occur depends on caching and is an implementation detail.
|
|
198
|
+
*/
|
|
199
|
+
private readonly processSequencedEditResult: SequencedEditResultCallback;
|
|
166
200
|
|
|
167
201
|
/**
|
|
168
202
|
* Called whenever an edit is processed.
|
|
@@ -176,11 +210,6 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
176
210
|
*/
|
|
177
211
|
private readonly expensiveValidation: boolean;
|
|
178
212
|
|
|
179
|
-
/**
|
|
180
|
-
* Telemetry logger, used to log events such as edit application rejection.
|
|
181
|
-
*/
|
|
182
|
-
private readonly logger: ITelemetryBaseLogger;
|
|
183
|
-
|
|
184
213
|
/**
|
|
185
214
|
* The ordered queue of edits that originated from this client that have never been applied (by this log viewer) in a sequenced state.
|
|
186
215
|
* This means these edits may be local or sequenced, and may have been applied (possibly multiple times) while still local.
|
|
@@ -194,28 +223,44 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
194
223
|
* as part of the transaction, then submitting it.
|
|
195
224
|
* This cache helps optimize that case by avoiding recomputing the edit if no other edits were added during the transaction.
|
|
196
225
|
*/
|
|
197
|
-
private cachedEditResult?: { editId: EditId; result: EditingResult
|
|
226
|
+
private cachedEditResult?: { editId: EditId; result: EditingResult };
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Cache entry for the highest revision.
|
|
230
|
+
* `undefined` when not cached.
|
|
231
|
+
*/
|
|
232
|
+
private highestRevisionCacheEntry?: EditCacheEntry;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Removes this log viewer from the set of handleEditAdded listeners on its underlying log.
|
|
236
|
+
* This should be called if the underlying log or its listeners are re-used past the lifetime of this log viewer.
|
|
237
|
+
*/
|
|
238
|
+
public readonly detachFromEditLog: () => void;
|
|
198
239
|
|
|
199
|
-
|
|
240
|
+
/**
|
|
241
|
+
* @returns true if the highest revision is cached.
|
|
242
|
+
*/
|
|
243
|
+
public highestRevisionCached(): boolean {
|
|
244
|
+
return this.highestRevisionCacheEntry !== undefined;
|
|
245
|
+
}
|
|
200
246
|
|
|
201
247
|
/**
|
|
202
248
|
* Create a new LogViewer
|
|
203
|
-
* @param log - the edit log which
|
|
204
|
-
* @param baseTree - the tree used in the
|
|
205
|
-
* @param knownRevisions - a set of [sequencedRevision,
|
|
249
|
+
* @param log - the edit log which revisions will be based on.
|
|
250
|
+
* @param baseTree - the tree used in the view corresponding to the 0th revision.
|
|
251
|
+
* @param knownRevisions - a set of [sequencedRevision, view] pairs that are known (have been precomputed) at construction time.
|
|
206
252
|
* These revisions are guaranteed to never be evicted from the cache.
|
|
207
253
|
* @param expensiveValidation - Iff true, additional correctness assertions will be run during LogViewer operations.
|
|
208
254
|
* @param processEditStatus - called after applying an edit.
|
|
209
|
-
* @param
|
|
255
|
+
* @param processSequencedEditResult - called after applying a sequenced edit.
|
|
210
256
|
*/
|
|
211
257
|
public constructor(
|
|
212
|
-
log: EditLog<
|
|
213
|
-
|
|
214
|
-
knownRevisions: [Revision, EditCacheEntry
|
|
258
|
+
log: EditLog<ChangeInternal>,
|
|
259
|
+
baseView: RevisionView,
|
|
260
|
+
knownRevisions: [Revision, EditCacheEntry][] = [],
|
|
215
261
|
expensiveValidation = false,
|
|
216
262
|
processEditStatus: EditStatusCallback = noop,
|
|
217
|
-
|
|
218
|
-
transactionFactory: (snapshot: Snapshot) => GenericTransaction<TChange>,
|
|
263
|
+
processSequencedEditResult: SequencedEditResultCallback = noop,
|
|
219
264
|
minimumSequenceNumber = 0
|
|
220
265
|
) {
|
|
221
266
|
this.log = log;
|
|
@@ -229,83 +274,86 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
229
274
|
});
|
|
230
275
|
}
|
|
231
276
|
|
|
232
|
-
this.
|
|
277
|
+
this.sequencedRevisionCache = new RevisionValueCache(
|
|
233
278
|
CachingLogViewer.sequencedCacheSizeMax,
|
|
234
279
|
minimumSequenceNumber,
|
|
235
|
-
[...knownRevisions, [0, {
|
|
280
|
+
[...knownRevisions, [0, { view: baseView }]]
|
|
236
281
|
);
|
|
237
282
|
this.processEditStatus = processEditStatus ?? noop;
|
|
283
|
+
this.processSequencedEditResult = processSequencedEditResult ?? noop;
|
|
238
284
|
this.expensiveValidation = expensiveValidation;
|
|
239
|
-
this.
|
|
240
|
-
this.transactionFactory = transactionFactory;
|
|
241
|
-
this.log.registerEditAddedHandler(this.handleEditAdded.bind(this));
|
|
285
|
+
this.detachFromEditLog = this.log.registerEditAddedHandler(this.handleEditAdded.bind(this));
|
|
242
286
|
}
|
|
243
287
|
|
|
244
288
|
/**
|
|
245
|
-
*
|
|
246
|
-
* As a performance optimization, this method also caches snapshots generated by local edits if they are sequenced without
|
|
289
|
+
* As a performance optimization, this method caches views generated by local edits if they are sequenced without
|
|
247
290
|
* being interleaved with remote edits.
|
|
248
291
|
*/
|
|
249
|
-
private handleEditAdded(edit: Edit<
|
|
292
|
+
private handleEditAdded(edit: Edit<ChangeInternal>, isLocal: boolean, wasLocal: boolean): void {
|
|
293
|
+
// Clear highestRevisionCacheEntry, since what revision is highest might change.
|
|
294
|
+
// Note that as an optimization we could skip clearing this when a local edit is sequenced.
|
|
295
|
+
this.highestRevisionCacheEntry = undefined;
|
|
296
|
+
|
|
250
297
|
if (isLocal) {
|
|
251
298
|
this.unappliedSelfEdits.push(edit.id);
|
|
252
299
|
} else if (wasLocal) {
|
|
253
300
|
// If the new sequenced edit was generated by this client, the corresponding cache entry (if there is one)
|
|
254
301
|
// will be at the front of the queue. If the queue is empty, then a concurrent sequenced edit from remote client
|
|
255
302
|
// must have invalidated the queue cache.
|
|
256
|
-
const entry = this.
|
|
303
|
+
const entry = this.localRevisionCache.shift();
|
|
257
304
|
if (entry !== undefined) {
|
|
258
305
|
const revision = this.log.numberOfSequencedEdits;
|
|
259
|
-
const
|
|
260
|
-
this.
|
|
306
|
+
const { view } = entry;
|
|
307
|
+
this.sequencedRevisionCache.cacheValue(
|
|
261
308
|
revision,
|
|
262
309
|
entry.status === EditStatus.Applied
|
|
263
310
|
? {
|
|
264
|
-
|
|
311
|
+
view,
|
|
265
312
|
status: entry.status,
|
|
266
313
|
steps: entry.steps,
|
|
267
314
|
}
|
|
268
315
|
: {
|
|
269
|
-
|
|
316
|
+
view,
|
|
270
317
|
status: entry.status,
|
|
318
|
+
failure: entry.failure,
|
|
271
319
|
}
|
|
272
320
|
);
|
|
273
|
-
this.handleSequencedEditResult(edit, entry);
|
|
321
|
+
this.handleSequencedEditResult(edit, entry, []);
|
|
274
322
|
}
|
|
275
323
|
} else {
|
|
276
324
|
// Invalidate any cached results of applying edits which are ordered after `edit` (which are all remaining local edits)
|
|
277
|
-
this.
|
|
325
|
+
this.localRevisionCache.clear();
|
|
278
326
|
}
|
|
279
327
|
}
|
|
280
328
|
|
|
281
|
-
public async getEditResult(revision: Revision): Promise<EditCacheEntry
|
|
329
|
+
public async getEditResult(revision: Revision): Promise<EditCacheEntry> {
|
|
282
330
|
const startingPoint = this.getStartingPoint(revision);
|
|
283
331
|
const { startRevision } = startingPoint;
|
|
284
|
-
let current: EditCacheEntry
|
|
332
|
+
let current: EditCacheEntry = startingPoint;
|
|
285
333
|
for (let i = startRevision; i < revision && i < this.log.length; i++) {
|
|
286
334
|
const edit = await this.log.getEditAtIndex(i);
|
|
287
|
-
current = this.applyEdit(current.
|
|
335
|
+
current = this.applyEdit(current.view, edit, i);
|
|
288
336
|
}
|
|
289
337
|
return current;
|
|
290
338
|
}
|
|
291
339
|
|
|
292
|
-
public async
|
|
293
|
-
return (await this.getEditResult(revision)).
|
|
340
|
+
public async getRevisionView(revision: Revision): Promise<RevisionView> {
|
|
341
|
+
return (await this.getEditResult(revision)).view;
|
|
294
342
|
}
|
|
295
343
|
|
|
296
|
-
public getEditResultInSession(revision: Revision): EditCacheEntry
|
|
344
|
+
public getEditResultInSession(revision: Revision): EditCacheEntry {
|
|
297
345
|
const startingPoint = this.getStartingPoint(revision);
|
|
298
346
|
const { startRevision } = startingPoint;
|
|
299
|
-
let current: EditCacheEntry
|
|
347
|
+
let current: EditCacheEntry = startingPoint;
|
|
300
348
|
for (let i = startRevision; i < revision && i < this.log.length; i++) {
|
|
301
349
|
const edit = this.log.getEditInSessionAtIndex(i);
|
|
302
|
-
current = this.applyEdit(current.
|
|
350
|
+
current = this.applyEdit(current.view, edit, i);
|
|
303
351
|
}
|
|
304
352
|
return current;
|
|
305
353
|
}
|
|
306
354
|
|
|
307
|
-
public
|
|
308
|
-
return this.getEditResultInSession(revision).
|
|
355
|
+
public getRevisionViewInSession(revision: Revision): RevisionView {
|
|
356
|
+
return this.getEditResultInSession(revision).view;
|
|
309
357
|
}
|
|
310
358
|
|
|
311
359
|
/**
|
|
@@ -318,105 +366,120 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
318
366
|
// Sequence numbers in Fluid are 1-indexed, meaning they correspond to revisions, and can be used as revisions.
|
|
319
367
|
// This ensures that all revisions >= minimumSequenceNumber are kept in the cache, meaning that even if all clients are caught up
|
|
320
368
|
// the most recent sequenced revision will be cached.
|
|
321
|
-
this.
|
|
369
|
+
this.sequencedRevisionCache.updateRetentionWindow(minimumSequenceNumber);
|
|
322
370
|
}
|
|
323
371
|
|
|
324
372
|
/**
|
|
325
|
-
* Inform the CachingLogViewer that a particular edit is
|
|
326
|
-
*
|
|
373
|
+
* Inform the CachingLogViewer that a particular edit is known to have a specific result when applied to a particular TreeView.
|
|
374
|
+
* CachingLogViewer may use this information as an optimization to avoid re-running the edit if re-applied to the same TreeView.
|
|
327
375
|
*/
|
|
328
|
-
public setKnownEditingResult(edit: Edit<
|
|
376
|
+
public setKnownEditingResult(edit: Edit<ChangeInternal>, result: EditingResult): void {
|
|
329
377
|
this.cachedEditResult = { editId: edit.id, result };
|
|
330
378
|
}
|
|
331
379
|
|
|
332
380
|
/**
|
|
333
|
-
* @returns the cached
|
|
381
|
+
* @returns the cached revision view closest to the requested `revision`.
|
|
334
382
|
*/
|
|
335
|
-
private getStartingPoint(revision: Revision): { startRevision: Revision } & EditCacheEntry
|
|
336
|
-
// Per the documentation for revision, the returned
|
|
383
|
+
private getStartingPoint(revision: Revision): { startRevision: Revision } & EditCacheEntry {
|
|
384
|
+
// Per the documentation for revision, the returned view should be the output of the edit at the largest index <= `revision`.
|
|
337
385
|
const revisionClamped = Math.min(revision, this.log.length);
|
|
338
|
-
|
|
386
|
+
|
|
387
|
+
// If the highest revision is requested, and it's cached, use highestRevisionCacheEntry.
|
|
388
|
+
if (revisionClamped === this.log.length && this.highestRevisionCacheEntry !== undefined) {
|
|
389
|
+
return { ...this.highestRevisionCacheEntry, startRevision: revisionClamped };
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
let current: EditCacheEntry;
|
|
339
393
|
let startRevision: Revision;
|
|
340
394
|
const { numberOfSequencedEdits } = this.log;
|
|
341
395
|
const isLocalRevision = revisionClamped > numberOfSequencedEdits;
|
|
342
|
-
if (isLocalRevision && !this.
|
|
343
|
-
const { length } = this.
|
|
344
|
-
// Local
|
|
396
|
+
if (isLocalRevision && !this.localRevisionCache.isEmpty()) {
|
|
397
|
+
const { length } = this.localRevisionCache;
|
|
398
|
+
// Local revision view cache is indexed such that the view for revision 0 (a local edit) is stored at index 0 in the cache.
|
|
345
399
|
// This is because the local cache does not contain an entry for the implicit initial tree edit.
|
|
346
400
|
const localCacheIndex = revisionClamped - 1 - numberOfSequencedEdits;
|
|
347
401
|
if (localCacheIndex < length) {
|
|
348
402
|
const cached =
|
|
349
|
-
this.
|
|
403
|
+
this.localRevisionCache.peekAt(localCacheIndex) ?? fail('missing tail of localRevisionViewCache');
|
|
350
404
|
return {
|
|
351
405
|
...cached,
|
|
352
406
|
startRevision: revisionClamped,
|
|
353
407
|
};
|
|
354
408
|
} else {
|
|
355
|
-
current = this.
|
|
409
|
+
current = this.localRevisionCache.peekAt(length - 1) ?? fail('missing tail of localRevisionViewCache');
|
|
356
410
|
startRevision = numberOfSequencedEdits + length;
|
|
357
411
|
}
|
|
358
412
|
} else {
|
|
359
|
-
const [cachedRevision,
|
|
360
|
-
this.
|
|
413
|
+
const [cachedRevision, cachedView] =
|
|
414
|
+
this.sequencedRevisionCache.getClosestEntry(revisionClamped) ??
|
|
415
|
+
fail('No preceding revision view cached.');
|
|
416
|
+
|
|
361
417
|
startRevision = cachedRevision;
|
|
362
|
-
current =
|
|
418
|
+
current = cachedView;
|
|
363
419
|
}
|
|
364
420
|
return { startRevision, ...current };
|
|
365
421
|
}
|
|
366
422
|
|
|
367
423
|
/**
|
|
368
|
-
* Helper for applying an edit at the supplied
|
|
424
|
+
* Helper for applying an edit at the supplied revision view.
|
|
369
425
|
* Must only be called in the order that edits appear in the log.
|
|
370
426
|
* Must only be called once for a given local edit as long as the local cache has not been invalidated.
|
|
371
427
|
* Must only be called once for a given sequenced edit.
|
|
372
|
-
* @returns the resulting
|
|
428
|
+
* @returns the resulting revision view and the outcome of edit that produced it.
|
|
373
429
|
*/
|
|
374
430
|
private applyEdit(
|
|
375
|
-
|
|
376
|
-
edit: Edit<
|
|
431
|
+
prevView: RevisionView,
|
|
432
|
+
edit: Edit<ChangeInternal>,
|
|
377
433
|
editIndex: number
|
|
378
|
-
): AttemptedEditResultCacheEntry
|
|
379
|
-
let editingResult: EditingResult
|
|
434
|
+
): AttemptedEditResultCacheEntry {
|
|
435
|
+
let editingResult: EditingResult;
|
|
380
436
|
let cached;
|
|
437
|
+
let reconciliationPath: ReconciliationPath = [];
|
|
381
438
|
if (
|
|
382
439
|
this.cachedEditResult !== undefined &&
|
|
383
440
|
this.cachedEditResult.editId === edit.id &&
|
|
384
|
-
this.cachedEditResult.result.before ===
|
|
441
|
+
this.cachedEditResult.result.before === prevView
|
|
385
442
|
) {
|
|
386
443
|
editingResult = this.cachedEditResult.result;
|
|
387
444
|
cached = true;
|
|
388
445
|
} else {
|
|
389
|
-
|
|
390
|
-
|
|
446
|
+
reconciliationPath = this.reconciliationPathFromEdit(edit.id);
|
|
447
|
+
editingResult = TransactionInternal.factory(prevView)
|
|
448
|
+
.applyChanges(edit.changes, reconciliationPath)
|
|
391
449
|
.close();
|
|
392
450
|
cached = false;
|
|
393
451
|
}
|
|
394
452
|
|
|
395
453
|
const revision = editIndex + 1;
|
|
396
|
-
let
|
|
454
|
+
let nextView: RevisionView;
|
|
397
455
|
if (editingResult.status === EditStatus.Applied) {
|
|
398
|
-
|
|
456
|
+
nextView = editingResult.after;
|
|
399
457
|
} else {
|
|
400
|
-
|
|
458
|
+
nextView = prevView;
|
|
401
459
|
}
|
|
402
460
|
|
|
403
461
|
const computedCacheEntry =
|
|
404
462
|
editingResult.status === EditStatus.Applied
|
|
405
|
-
? {
|
|
406
|
-
: {
|
|
463
|
+
? { view: nextView, status: editingResult.status, steps: editingResult.steps }
|
|
464
|
+
: { view: nextView, status: editingResult.status, failure: editingResult.failure };
|
|
407
465
|
|
|
408
466
|
if (this.log.isSequencedRevision(revision)) {
|
|
409
|
-
this.
|
|
410
|
-
this.handleSequencedEditResult(edit, computedCacheEntry);
|
|
467
|
+
this.sequencedRevisionCache.cacheValue(revision, computedCacheEntry);
|
|
468
|
+
this.handleSequencedEditResult(edit, computedCacheEntry, reconciliationPath);
|
|
411
469
|
} else {
|
|
412
|
-
// This relies on local edits being append only, and that generating the
|
|
413
|
-
// the
|
|
470
|
+
// This relies on local edits being append only, and that generating the view for a local revision requires generating
|
|
471
|
+
// the views for all local revisions before it in the log. Thus, generating such a view will necessarily require
|
|
414
472
|
// calls to this method for all local revisions prior, guaranteeing the correct push order.
|
|
415
473
|
assert(
|
|
416
|
-
revision === this.log.numberOfSequencedEdits + this.
|
|
417
|
-
'Local
|
|
474
|
+
revision === this.log.numberOfSequencedEdits + this.localRevisionCache.length + 1,
|
|
475
|
+
'Local revision view cached out of order.'
|
|
418
476
|
);
|
|
419
|
-
this.
|
|
477
|
+
this.localRevisionCache.push(computedCacheEntry);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Only update highestRevisionCacheEntry if this snapshot is the highest revision.
|
|
481
|
+
if (revision >= this.log.length) {
|
|
482
|
+
this.highestRevisionCacheEntry = computedCacheEntry;
|
|
420
483
|
}
|
|
421
484
|
|
|
422
485
|
this.processEditStatus(editingResult.status, this.log.getIdAtIndex(editIndex), cached);
|
|
@@ -424,23 +487,21 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
424
487
|
}
|
|
425
488
|
|
|
426
489
|
/**
|
|
427
|
-
* Helper for performing caching
|
|
490
|
+
* Helper for performing caching when a sequenced local edit is first applied.
|
|
491
|
+
* Invokes the `processSequencedEditResult` handler that was passed to the constructor (if any).
|
|
428
492
|
* Must only be called for non-cached sequenced edits.
|
|
429
493
|
*/
|
|
430
|
-
private handleSequencedEditResult(
|
|
494
|
+
private handleSequencedEditResult(
|
|
495
|
+
edit: Edit<ChangeInternal>,
|
|
496
|
+
result: AttemptedEditResultCacheEntry,
|
|
497
|
+
reconciliationPath: ReconciliationPath
|
|
498
|
+
): void {
|
|
499
|
+
let wasLocal = false;
|
|
431
500
|
// This is the first time this sequenced edit has been processed by this LogViewer. If it was a local edit, log telemetry
|
|
432
501
|
// in the event that it was invalid or malformed.
|
|
433
502
|
if (this.unappliedSelfEdits.length > 0) {
|
|
434
503
|
if (edit.id === this.unappliedSelfEdits.peekFront()) {
|
|
435
|
-
|
|
436
|
-
this.logger.send({
|
|
437
|
-
category: 'generic',
|
|
438
|
-
eventName:
|
|
439
|
-
result.status === EditStatus.Malformed
|
|
440
|
-
? 'MalformedSharedTreeEdit'
|
|
441
|
-
: 'InvalidSharedTreeEdit',
|
|
442
|
-
});
|
|
443
|
-
}
|
|
504
|
+
wasLocal = true;
|
|
444
505
|
this.unappliedSelfEdits.shift();
|
|
445
506
|
} else if (this.expensiveValidation) {
|
|
446
507
|
for (let i = 0; i < this.unappliedSelfEdits.length; i++) {
|
|
@@ -448,6 +509,7 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
448
509
|
}
|
|
449
510
|
}
|
|
450
511
|
}
|
|
512
|
+
this.processSequencedEditResult({ edit, wasLocal, result, reconciliationPath });
|
|
451
513
|
}
|
|
452
514
|
|
|
453
515
|
/**
|
|
@@ -456,8 +518,8 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
456
518
|
* yet supported.
|
|
457
519
|
* @param editId - The ID for the edit to get the reconciliation path for.
|
|
458
520
|
*/
|
|
459
|
-
public reconciliationPathFromEdit(editId: EditId): ReconciliationPath
|
|
460
|
-
const reconciliationPath: ReconciliationEdit
|
|
521
|
+
public reconciliationPathFromEdit(editId: EditId): ReconciliationPath {
|
|
522
|
+
const reconciliationPath: ReconciliationEdit[] = [];
|
|
461
523
|
let cached = false;
|
|
462
524
|
return new Proxy(reconciliationPath, {
|
|
463
525
|
get: (target, prop): unknown => {
|
|
@@ -476,12 +538,21 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
476
538
|
const firstEdit = this.getEditResultFromSequenceNumber(targetSequenceNumber);
|
|
477
539
|
if (firstEdit !== undefined) {
|
|
478
540
|
if (firstEdit.status === EditStatus.Applied) {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
541
|
+
const firstEditInfo = this.log.getOrderedEditId(
|
|
542
|
+
firstEdit.id
|
|
543
|
+
) as SequencedOrderedEditId;
|
|
544
|
+
if (
|
|
545
|
+
firstEditInfo.sequenceInfo !== undefined &&
|
|
546
|
+
firstEditInfo.sequenceInfo.sequenceNumber >
|
|
547
|
+
orderedId.sequenceInfo.referenceSequenceNumber
|
|
548
|
+
) {
|
|
549
|
+
reconciliationPath.push({
|
|
550
|
+
...firstEdit.steps,
|
|
551
|
+
before: firstEdit.before,
|
|
552
|
+
after: firstEdit.view,
|
|
553
|
+
length: firstEdit.steps.length,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
485
556
|
}
|
|
486
557
|
const lowestIndex = this.log.getIndexOfId(firstEdit.id) + 1;
|
|
487
558
|
const highestIndex = this.log.getIndexOfId(editId) - 1;
|
|
@@ -491,7 +562,7 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
491
562
|
reconciliationPath.push({
|
|
492
563
|
...edit.steps,
|
|
493
564
|
before: edit.before,
|
|
494
|
-
after: edit.
|
|
565
|
+
after: edit.view,
|
|
495
566
|
length: edit.steps.length,
|
|
496
567
|
});
|
|
497
568
|
}
|
|
@@ -509,7 +580,7 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
509
580
|
/**
|
|
510
581
|
* @returns Edit information for the earliest known sequenced edit.
|
|
511
582
|
*/
|
|
512
|
-
public earliestSequencedEditInSession(): { edit: Edit<
|
|
583
|
+
public earliestSequencedEditInSession(): { edit: Edit<ChangeInternal>; sequenceNumber: number } | undefined {
|
|
513
584
|
const earliestEditIndex = this.log.earliestAvailableEditIndex;
|
|
514
585
|
const lastSequencedEdit = this.log.numberOfSequencedEdits + earliestEditIndex - 1;
|
|
515
586
|
for (let index = earliestEditIndex; index <= lastSequencedEdit; ++index) {
|
|
@@ -525,9 +596,9 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
525
596
|
/**
|
|
526
597
|
* @returns Edit result information for the edit at the given `index`.
|
|
527
598
|
*/
|
|
528
|
-
private getEditResultFromIndex(index: number):
|
|
599
|
+
private getEditResultFromIndex(index: number): CachedEditingResult {
|
|
529
600
|
const edit = this.log.getEditInSessionAtIndex(index);
|
|
530
|
-
const before = this.
|
|
601
|
+
const before = this.getRevisionViewInSession(index);
|
|
531
602
|
const resultAfter = this.getEditResultInSession(index + 1);
|
|
532
603
|
if (resultAfter.status === undefined) {
|
|
533
604
|
fail('The status of every edit in session should be known');
|
|
@@ -538,22 +609,25 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
538
609
|
status: EditStatus.Applied,
|
|
539
610
|
before,
|
|
540
611
|
changes: edit.changes,
|
|
541
|
-
|
|
612
|
+
view: resultAfter.view,
|
|
542
613
|
steps: resultAfter.steps,
|
|
543
614
|
}
|
|
544
615
|
: {
|
|
545
616
|
id: edit.id,
|
|
546
617
|
status: resultAfter.status,
|
|
618
|
+
failure: resultAfter.failure,
|
|
547
619
|
before,
|
|
620
|
+
view: resultAfter.view,
|
|
548
621
|
changes: edit.changes,
|
|
549
622
|
};
|
|
550
623
|
}
|
|
551
624
|
|
|
552
625
|
/**
|
|
553
626
|
* @param sequenceNumber - The server-assigned sequenced number assigned to the edit of interest.
|
|
554
|
-
* @returns Edit result information for the edit with the given sequence number
|
|
627
|
+
* @returns Edit result information for the edit with the given sequence number or the nearest sequenced edit before that.
|
|
628
|
+
* Undefined if no sequenced edit occurred at or prior to the given sequenceNumber.
|
|
555
629
|
*/
|
|
556
|
-
public getEditResultFromSequenceNumber(sequenceNumber: number):
|
|
630
|
+
public getEditResultFromSequenceNumber(sequenceNumber: number): CachedEditingResult | undefined {
|
|
557
631
|
const earliestSequenced = this.earliestSequencedEditInSession();
|
|
558
632
|
if (earliestSequenced !== undefined && sequenceNumber >= earliestSequenced.sequenceNumber) {
|
|
559
633
|
const lowestIndex = this.log.getIndexOfId(earliestSequenced.edit.id);
|
|
@@ -568,7 +642,7 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
568
642
|
// has been processed by a different DDS (several DDSes can share the same stream of operations and will only see those
|
|
569
643
|
// relevant to them). In such cases, we return the edit info for the last known edit before that.
|
|
570
644
|
if (orderedId.sequenceInfo && orderedId.sequenceInfo.sequenceNumber <= sequenceNumber) {
|
|
571
|
-
const before = this.
|
|
645
|
+
const before = this.getRevisionViewInSession(index);
|
|
572
646
|
const resultAfter = this.getEditResultInSession(index + 1);
|
|
573
647
|
if (resultAfter.status === undefined) {
|
|
574
648
|
fail('The status of every edit in session should be known');
|
|
@@ -579,13 +653,15 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
579
653
|
status: EditStatus.Applied,
|
|
580
654
|
before,
|
|
581
655
|
changes: edit.changes,
|
|
582
|
-
|
|
656
|
+
view: resultAfter.view,
|
|
583
657
|
steps: resultAfter.steps,
|
|
584
658
|
}
|
|
585
659
|
: {
|
|
586
660
|
id: edit.id,
|
|
587
661
|
status: resultAfter.status,
|
|
662
|
+
failure: resultAfter.failure,
|
|
588
663
|
before,
|
|
664
|
+
view: resultAfter.view,
|
|
589
665
|
changes: edit.changes,
|
|
590
666
|
};
|
|
591
667
|
}
|