@fluid-experimental/tree 0.58.2001 → 0.59.1000-61898
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 +9 -9
- 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 -100
- 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 +59 -31
- 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 +130 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +110 -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 +90 -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 +400 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1074 -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 +53 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +76 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +543 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +622 -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/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 -100
- 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 +51 -23
- 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 +130 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +102 -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 +90 -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 +400 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1069 -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 +53 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +72 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +543 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +618 -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 +269 -187
- 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 +147 -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 -120
- package/src/Checkout.ts +81 -52
- 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 +141 -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 +1458 -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 +94 -0
- package/src/TransactionInternal.ts +1088 -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 +119 -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/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, TransactionFactory } 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,45 @@ 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:
|
|
263
|
+
processSequencedEditResult: SequencedEditResultCallback = noop,
|
|
264
|
+
private readonly transactionFactory: TransactionFactory,
|
|
219
265
|
minimumSequenceNumber = 0
|
|
220
266
|
) {
|
|
221
267
|
this.log = log;
|
|
@@ -229,83 +275,87 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
229
275
|
});
|
|
230
276
|
}
|
|
231
277
|
|
|
232
|
-
this.
|
|
278
|
+
this.sequencedRevisionCache = new RevisionValueCache(
|
|
233
279
|
CachingLogViewer.sequencedCacheSizeMax,
|
|
234
280
|
minimumSequenceNumber,
|
|
235
|
-
[...knownRevisions, [0, {
|
|
281
|
+
[...knownRevisions, [0, { view: baseView }]]
|
|
236
282
|
);
|
|
237
283
|
this.processEditStatus = processEditStatus ?? noop;
|
|
284
|
+
this.processSequencedEditResult = processSequencedEditResult ?? noop;
|
|
238
285
|
this.expensiveValidation = expensiveValidation;
|
|
239
|
-
this.logger = logger;
|
|
240
286
|
this.transactionFactory = transactionFactory;
|
|
241
|
-
this.log.registerEditAddedHandler(this.handleEditAdded.bind(this));
|
|
287
|
+
this.detachFromEditLog = this.log.registerEditAddedHandler(this.handleEditAdded.bind(this));
|
|
242
288
|
}
|
|
243
289
|
|
|
244
290
|
/**
|
|
245
|
-
*
|
|
246
|
-
* As a performance optimization, this method also caches snapshots generated by local edits if they are sequenced without
|
|
291
|
+
* As a performance optimization, this method caches views generated by local edits if they are sequenced without
|
|
247
292
|
* being interleaved with remote edits.
|
|
248
293
|
*/
|
|
249
|
-
private handleEditAdded(edit: Edit<
|
|
294
|
+
private handleEditAdded(edit: Edit<ChangeInternal>, isLocal: boolean, wasLocal: boolean): void {
|
|
295
|
+
// Clear highestRevisionCacheEntry, since what revision is highest might change.
|
|
296
|
+
// Note that as an optimization we could skip clearing this when a local edit is sequenced.
|
|
297
|
+
this.highestRevisionCacheEntry = undefined;
|
|
298
|
+
|
|
250
299
|
if (isLocal) {
|
|
251
300
|
this.unappliedSelfEdits.push(edit.id);
|
|
252
301
|
} else if (wasLocal) {
|
|
253
302
|
// If the new sequenced edit was generated by this client, the corresponding cache entry (if there is one)
|
|
254
303
|
// will be at the front of the queue. If the queue is empty, then a concurrent sequenced edit from remote client
|
|
255
304
|
// must have invalidated the queue cache.
|
|
256
|
-
const entry = this.
|
|
305
|
+
const entry = this.localRevisionCache.shift();
|
|
257
306
|
if (entry !== undefined) {
|
|
258
307
|
const revision = this.log.numberOfSequencedEdits;
|
|
259
|
-
const
|
|
260
|
-
this.
|
|
308
|
+
const { view } = entry;
|
|
309
|
+
this.sequencedRevisionCache.cacheValue(
|
|
261
310
|
revision,
|
|
262
311
|
entry.status === EditStatus.Applied
|
|
263
312
|
? {
|
|
264
|
-
|
|
313
|
+
view,
|
|
265
314
|
status: entry.status,
|
|
266
315
|
steps: entry.steps,
|
|
267
316
|
}
|
|
268
317
|
: {
|
|
269
|
-
|
|
318
|
+
view,
|
|
270
319
|
status: entry.status,
|
|
320
|
+
failure: entry.failure,
|
|
271
321
|
}
|
|
272
322
|
);
|
|
273
|
-
this.handleSequencedEditResult(edit, entry);
|
|
323
|
+
this.handleSequencedEditResult(edit, entry, []);
|
|
274
324
|
}
|
|
275
325
|
} else {
|
|
276
326
|
// Invalidate any cached results of applying edits which are ordered after `edit` (which are all remaining local edits)
|
|
277
|
-
this.
|
|
327
|
+
this.localRevisionCache.clear();
|
|
278
328
|
}
|
|
279
329
|
}
|
|
280
330
|
|
|
281
|
-
public async getEditResult(revision: Revision): Promise<EditCacheEntry
|
|
331
|
+
public async getEditResult(revision: Revision): Promise<EditCacheEntry> {
|
|
282
332
|
const startingPoint = this.getStartingPoint(revision);
|
|
283
333
|
const { startRevision } = startingPoint;
|
|
284
|
-
let current: EditCacheEntry
|
|
334
|
+
let current: EditCacheEntry = startingPoint;
|
|
285
335
|
for (let i = startRevision; i < revision && i < this.log.length; i++) {
|
|
286
336
|
const edit = await this.log.getEditAtIndex(i);
|
|
287
|
-
current = this.applyEdit(current.
|
|
337
|
+
current = this.applyEdit(current.view, edit, i);
|
|
288
338
|
}
|
|
289
339
|
return current;
|
|
290
340
|
}
|
|
291
341
|
|
|
292
|
-
public async
|
|
293
|
-
return (await this.getEditResult(revision)).
|
|
342
|
+
public async getRevisionView(revision: Revision): Promise<RevisionView> {
|
|
343
|
+
return (await this.getEditResult(revision)).view;
|
|
294
344
|
}
|
|
295
345
|
|
|
296
|
-
public getEditResultInSession(revision: Revision): EditCacheEntry
|
|
346
|
+
public getEditResultInSession(revision: Revision): EditCacheEntry {
|
|
297
347
|
const startingPoint = this.getStartingPoint(revision);
|
|
298
348
|
const { startRevision } = startingPoint;
|
|
299
|
-
let current: EditCacheEntry
|
|
349
|
+
let current: EditCacheEntry = startingPoint;
|
|
300
350
|
for (let i = startRevision; i < revision && i < this.log.length; i++) {
|
|
301
351
|
const edit = this.log.getEditInSessionAtIndex(i);
|
|
302
|
-
current = this.applyEdit(current.
|
|
352
|
+
current = this.applyEdit(current.view, edit, i);
|
|
303
353
|
}
|
|
304
354
|
return current;
|
|
305
355
|
}
|
|
306
356
|
|
|
307
|
-
public
|
|
308
|
-
return this.getEditResultInSession(revision).
|
|
357
|
+
public getRevisionViewInSession(revision: Revision): RevisionView {
|
|
358
|
+
return this.getEditResultInSession(revision).view;
|
|
309
359
|
}
|
|
310
360
|
|
|
311
361
|
/**
|
|
@@ -318,105 +368,118 @@ export class CachingLogViewer<TChange> implements LogViewer {
|
|
|
318
368
|
// Sequence numbers in Fluid are 1-indexed, meaning they correspond to revisions, and can be used as revisions.
|
|
319
369
|
// This ensures that all revisions >= minimumSequenceNumber are kept in the cache, meaning that even if all clients are caught up
|
|
320
370
|
// the most recent sequenced revision will be cached.
|
|
321
|
-
this.
|
|
371
|
+
this.sequencedRevisionCache.updateRetentionWindow(minimumSequenceNumber);
|
|
322
372
|
}
|
|
323
373
|
|
|
324
374
|
/**
|
|
325
|
-
* Inform the CachingLogViewer that a particular edit is
|
|
326
|
-
*
|
|
375
|
+
* Inform the CachingLogViewer that a particular edit is known to have a specific result when applied to a particular TreeView.
|
|
376
|
+
* CachingLogViewer may use this information as an optimization to avoid re-running the edit if re-applied to the same TreeView.
|
|
327
377
|
*/
|
|
328
|
-
public setKnownEditingResult(edit: Edit<
|
|
378
|
+
public setKnownEditingResult(edit: Edit<ChangeInternal>, result: EditingResult): void {
|
|
329
379
|
this.cachedEditResult = { editId: edit.id, result };
|
|
330
380
|
}
|
|
331
381
|
|
|
332
382
|
/**
|
|
333
|
-
* @returns the cached
|
|
383
|
+
* @returns the cached revision view closest to the requested `revision`.
|
|
334
384
|
*/
|
|
335
|
-
private getStartingPoint(revision: Revision): { startRevision: Revision } & EditCacheEntry
|
|
336
|
-
// Per the documentation for revision, the returned
|
|
385
|
+
private getStartingPoint(revision: Revision): { startRevision: Revision } & EditCacheEntry {
|
|
386
|
+
// Per the documentation for revision, the returned view should be the output of the edit at the largest index <= `revision`.
|
|
337
387
|
const revisionClamped = Math.min(revision, this.log.length);
|
|
338
|
-
|
|
388
|
+
|
|
389
|
+
// If the highest revision is requested, and it's cached, use highestRevisionCacheEntry.
|
|
390
|
+
if (revisionClamped === this.log.length && this.highestRevisionCacheEntry !== undefined) {
|
|
391
|
+
return { ...this.highestRevisionCacheEntry, startRevision: revisionClamped };
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
let current: EditCacheEntry;
|
|
339
395
|
let startRevision: Revision;
|
|
340
396
|
const { numberOfSequencedEdits } = this.log;
|
|
341
397
|
const isLocalRevision = revisionClamped > numberOfSequencedEdits;
|
|
342
|
-
if (isLocalRevision && !this.
|
|
343
|
-
const { length } = this.
|
|
344
|
-
// Local
|
|
398
|
+
if (isLocalRevision && !this.localRevisionCache.isEmpty()) {
|
|
399
|
+
const { length } = this.localRevisionCache;
|
|
400
|
+
// 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
401
|
// This is because the local cache does not contain an entry for the implicit initial tree edit.
|
|
346
402
|
const localCacheIndex = revisionClamped - 1 - numberOfSequencedEdits;
|
|
347
403
|
if (localCacheIndex < length) {
|
|
348
404
|
const cached =
|
|
349
|
-
this.
|
|
405
|
+
this.localRevisionCache.peekAt(localCacheIndex) ?? fail('missing tail of localRevisionViewCache');
|
|
350
406
|
return {
|
|
351
407
|
...cached,
|
|
352
408
|
startRevision: revisionClamped,
|
|
353
409
|
};
|
|
354
410
|
} else {
|
|
355
|
-
current = this.
|
|
411
|
+
current = this.localRevisionCache.peekAt(length - 1) ?? fail('missing tail of localRevisionViewCache');
|
|
356
412
|
startRevision = numberOfSequencedEdits + length;
|
|
357
413
|
}
|
|
358
414
|
} else {
|
|
359
|
-
const [cachedRevision,
|
|
360
|
-
this.
|
|
415
|
+
const [cachedRevision, cachedView] =
|
|
416
|
+
this.sequencedRevisionCache.getClosestEntry(revisionClamped) ??
|
|
417
|
+
fail('No preceding revision view cached.');
|
|
418
|
+
|
|
361
419
|
startRevision = cachedRevision;
|
|
362
|
-
current =
|
|
420
|
+
current = cachedView;
|
|
363
421
|
}
|
|
364
422
|
return { startRevision, ...current };
|
|
365
423
|
}
|
|
366
424
|
|
|
367
425
|
/**
|
|
368
|
-
* Helper for applying an edit at the supplied
|
|
426
|
+
* Helper for applying an edit at the supplied revision view.
|
|
369
427
|
* Must only be called in the order that edits appear in the log.
|
|
370
428
|
* Must only be called once for a given local edit as long as the local cache has not been invalidated.
|
|
371
429
|
* Must only be called once for a given sequenced edit.
|
|
372
|
-
* @returns the resulting
|
|
430
|
+
* @returns the resulting revision view and the outcome of edit that produced it.
|
|
373
431
|
*/
|
|
374
432
|
private applyEdit(
|
|
375
|
-
|
|
376
|
-
edit: Edit<
|
|
433
|
+
prevView: RevisionView,
|
|
434
|
+
edit: Edit<ChangeInternal>,
|
|
377
435
|
editIndex: number
|
|
378
|
-
): AttemptedEditResultCacheEntry
|
|
379
|
-
let editingResult: EditingResult
|
|
436
|
+
): AttemptedEditResultCacheEntry {
|
|
437
|
+
let editingResult: EditingResult;
|
|
380
438
|
let cached;
|
|
439
|
+
let reconciliationPath: ReconciliationPath = [];
|
|
381
440
|
if (
|
|
382
441
|
this.cachedEditResult !== undefined &&
|
|
383
442
|
this.cachedEditResult.editId === edit.id &&
|
|
384
|
-
this.cachedEditResult.result.before ===
|
|
443
|
+
this.cachedEditResult.result.before === prevView
|
|
385
444
|
) {
|
|
386
445
|
editingResult = this.cachedEditResult.result;
|
|
387
446
|
cached = true;
|
|
388
447
|
} else {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
.close();
|
|
448
|
+
reconciliationPath = this.reconciliationPathFromEdit(edit.id);
|
|
449
|
+
editingResult = this.transactionFactory(prevView).applyChanges(edit.changes, reconciliationPath).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
|
}
|