@fluid-experimental/tree 0.58.2001 → 0.59.2000-61729
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +71 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +92 -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 +71 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +88 -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 +109 -329
- 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 +120 -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
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ITelemetryLogger } from '@fluidframework/common-definitions';
|
|
7
|
+
import { assertNotUndefined, fail } from './Common';
|
|
8
|
+
import { PlaceValidationResult, RangeValidationResultKind } from './EditUtilities';
|
|
9
|
+
import { SharedTreeEvent } from './EventTypes';
|
|
10
|
+
import { EditStatus } from './persisted-types';
|
|
11
|
+
import { SequencedEditAppliedEventArguments, SharedTree } from './SharedTree';
|
|
12
|
+
import { TransactionInternal } from './TransactionInternal';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Logs generic telemetry for failed sequenced edits.
|
|
16
|
+
* Only failing edits that were originally made locally are logged.
|
|
17
|
+
* @param tree - The tree for which to log the telemetry.
|
|
18
|
+
*/
|
|
19
|
+
export function useFailedSequencedEditTelemetry(tree: SharedTree): { disable: () => void } {
|
|
20
|
+
function onEdit({ wasLocal, logger, outcome }: SequencedEditAppliedEventArguments): void {
|
|
21
|
+
if (wasLocal && outcome.status !== EditStatus.Applied) {
|
|
22
|
+
logger.send({
|
|
23
|
+
category: 'generic',
|
|
24
|
+
eventName:
|
|
25
|
+
outcome.status === EditStatus.Malformed ? 'MalformedSharedTreeEdit' : 'InvalidSharedTreeEdit',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
tree.on(SharedTreeEvent.SequencedEditApplied, onEdit);
|
|
30
|
+
return {
|
|
31
|
+
disable: () => {
|
|
32
|
+
tree.off(SharedTreeEvent.SequencedEditApplied, onEdit);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Statistics about the health of collaborative edit merging when using {@link SharedTree}.
|
|
39
|
+
* All of those numbers constitute a tally since the last heartbeat was logged or cleared.
|
|
40
|
+
*/
|
|
41
|
+
export interface MergeHealthStats {
|
|
42
|
+
/** Number of sequenced edits applied (failed or not). */
|
|
43
|
+
editCount: number;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Number of sequenced edits that failed to apply.
|
|
47
|
+
* Such cases are also counted under {@link MergeHealthStats.editCount}.
|
|
48
|
+
*
|
|
49
|
+
* If this number is greater than the sum of:
|
|
50
|
+
* * {@link MergeHealthStats.badPlaceCount}
|
|
51
|
+
* * {@link MergeHealthStats.badRangeCount}
|
|
52
|
+
* * {@link MergeHealthStats.constraintViolationCount}
|
|
53
|
+
* * {@link MergeHealthStats.idAlreadyInUseCount}
|
|
54
|
+
* * {@link MergeHealthStats.unknownIdCount}
|
|
55
|
+
* * {@link MergeHealthStats.malformedEditCount}
|
|
56
|
+
*
|
|
57
|
+
* then some failure scenarios are not being tracked adequately.
|
|
58
|
+
*/
|
|
59
|
+
failedEditCount: number;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Number of sequenced edits that failed to apply due to a bad place.
|
|
63
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
64
|
+
*
|
|
65
|
+
* If this number is greater than the sum of:
|
|
66
|
+
* * {@link MergeHealthStats.deletedAncestorBadPlaceCount}
|
|
67
|
+
* * {@link MergeHealthStats.deletedSiblingBadPlaceCount}
|
|
68
|
+
*
|
|
69
|
+
* then some failure scenarios are not being tracked adequately.
|
|
70
|
+
*/
|
|
71
|
+
badPlaceCount: number;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Number of sequenced edits that failed to apply due to a bad range.
|
|
75
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
76
|
+
*
|
|
77
|
+
* If this number is greater than the sum of:
|
|
78
|
+
* * {@link MergeHealthStats.deletedAncestorBadRangeCount}
|
|
79
|
+
* * {@link MergeHealthStats.deletedSiblingBadRangeCount}
|
|
80
|
+
* * {@link MergeHealthStats.updatedRangeInvertedCount}
|
|
81
|
+
* * {@link MergeHealthStats.updatedRangeHasPlacesInDifferentTraitsCount}
|
|
82
|
+
* * {@link MergeHealthStats.updatedRangeBadPlaceCount}
|
|
83
|
+
* * {@link MergeHealthStats.updatedRangeNeverValidPlaceCount}
|
|
84
|
+
*
|
|
85
|
+
* then some failure scenarios are not being tracked adequately.
|
|
86
|
+
*/
|
|
87
|
+
badRangeCount: number;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Number of sequenced edits that failed to apply due to a place whose ancestors had been concurrently deleted.
|
|
91
|
+
* Such cases are also counted under {@link MergeHealthStats.badPlaceCount}.
|
|
92
|
+
*/
|
|
93
|
+
deletedAncestorBadPlaceCount: number;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Number of sequenced edits that failed to apply due to a range whose ancestors had been concurrently deleted.
|
|
97
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
98
|
+
*/
|
|
99
|
+
deletedAncestorBadRangeCount: number;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Number of sequenced edits that failed to apply due to a place whose sibling (but not its parent) had been concurrently deleted.
|
|
103
|
+
* Such cases are also counted under {@link MergeHealthStats.badPlaceCount}.
|
|
104
|
+
*/
|
|
105
|
+
deletedSiblingBadPlaceCount: number;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Number of sequenced edits that failed to apply due to a range whose delimiting sibling(s) (but not its parent) had been concurrently
|
|
109
|
+
* deleted.
|
|
110
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
111
|
+
*/
|
|
112
|
+
deletedSiblingBadRangeCount: number;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Number of sequenced edits that failed to apply due to a range whose places were resolvable but inverted (i.e., end before start).
|
|
116
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
117
|
+
*/
|
|
118
|
+
updatedRangeInvertedCount: number;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Number of sequenced edits that failed to apply due to a range whose places were resolvable but in different traits.
|
|
122
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
123
|
+
*/
|
|
124
|
+
updatedRangeHasPlacesInDifferentTraitsCount: number;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Number of sequenced edits that failed to apply due to a range whose places were resolvable but bad.
|
|
128
|
+
* This should not happen because place resolution is expected to either return a valid place or fail.
|
|
129
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
130
|
+
*/
|
|
131
|
+
updatedRangeBadPlaceCount: number;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Number of sequenced edits that failed to apply due to a range whose places were not resolvable due to not being valid for any state.
|
|
135
|
+
* Such cases are also counted under {@link MergeHealthStats.badRangeCount}.
|
|
136
|
+
*/
|
|
137
|
+
updatedRangeNeverValidPlaceCount: number;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Number of sequenced edits that failed to apply due to a constraint violation.
|
|
141
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
142
|
+
*
|
|
143
|
+
* If this number is greater than the sum of:
|
|
144
|
+
* * {@link MergeHealthStats.rangeConstraintViolationCount}
|
|
145
|
+
* * {@link MergeHealthStats.lengthConstraintViolationCount}
|
|
146
|
+
* * {@link MergeHealthStats.parentConstraintViolationCount}
|
|
147
|
+
* * {@link MergeHealthStats.labelConstraintViolationCount}
|
|
148
|
+
*
|
|
149
|
+
* then some failure scenarios are not being tracked adequately.
|
|
150
|
+
*/
|
|
151
|
+
constraintViolationCount: number;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Number of sequenced edits that failed to apply due to a constrained range becoming invalid or malformed.
|
|
155
|
+
* Such cases are also counted under {@link MergeHealthStats.constraintViolationCount}.
|
|
156
|
+
*/
|
|
157
|
+
rangeConstraintViolationCount: number;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Number of sequenced edits that failed to apply due to a constrained range having a different length.
|
|
161
|
+
* Such cases are also counted under {@link MergeHealthStats.constraintViolationCount}.
|
|
162
|
+
*/
|
|
163
|
+
lengthConstraintViolationCount: number;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Number of sequenced edits that failed to apply due to a constrained range being under a different parent.
|
|
167
|
+
* Such cases are also counted under {@link MergeHealthStats.constraintViolationCount}.
|
|
168
|
+
*/
|
|
169
|
+
parentConstraintViolationCount: number;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Number of sequenced edits that failed to apply due to a constrained range being under a different label.
|
|
173
|
+
* Such cases are also counted under {@link MergeHealthStats.constraintViolationCount}.
|
|
174
|
+
*/
|
|
175
|
+
labelConstraintViolationCount: number;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Number of sequenced edits that failed to apply due to an ID collision.
|
|
179
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
180
|
+
*/
|
|
181
|
+
idAlreadyInUseCount: number;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Number of sequenced edits that failed to apply due to an ID being unknown.
|
|
185
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
186
|
+
*/
|
|
187
|
+
unknownIdCount: number;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Number of sequenced edits that failed to apply due to an edit becoming malformed.
|
|
191
|
+
* This should theoretically never happen.
|
|
192
|
+
* Such cases are also counted under {@link MergeHealthStats.failedEditCount}.
|
|
193
|
+
*/
|
|
194
|
+
malformedEditCount: number;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The counts of occurrences for a given path length. `pathLengths[1] === 2` means two occurrences of length one.
|
|
198
|
+
*/
|
|
199
|
+
pathLengths: number[];
|
|
200
|
+
|
|
201
|
+
/** The highest number previous attempts on a sequenced edit. */
|
|
202
|
+
maxAttemptCount: number;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Aggregates and logs telemetry about the success of concurrent edits.
|
|
207
|
+
*/
|
|
208
|
+
export class SharedTreeMergeHealthTelemetryHeartbeat {
|
|
209
|
+
private heartbeatTimerId = 0;
|
|
210
|
+
private readonly treeData = new Map<SharedTree, { tally: MergeHealthStats; logger?: ITelemetryLogger }>();
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Adds a tree to the set of tree to log merge health telemetry for.
|
|
214
|
+
* Noop if such a tree was already in the set.
|
|
215
|
+
* @param tree - The tree to log merge health telemetry for.
|
|
216
|
+
*/
|
|
217
|
+
public attachTree(tree: SharedTree) {
|
|
218
|
+
if (this.treeData.has(tree) === false) {
|
|
219
|
+
this.resetTreeData(tree);
|
|
220
|
+
tree.on(SharedTreeEvent.SequencedEditApplied, this.sequencedEditHandler);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Removes a tree from the set of tree to log merge health telemetry for.
|
|
226
|
+
* Noop if such a tree was never in the set.
|
|
227
|
+
* @param tree - The tree to stop logging merge health telemetry for.
|
|
228
|
+
*/
|
|
229
|
+
public detachTree(tree: SharedTree) {
|
|
230
|
+
if (this.treeData.has(tree)) {
|
|
231
|
+
tree.off(SharedTreeEvent.SequencedEditApplied, this.sequencedEditHandler);
|
|
232
|
+
this.treeData.delete(tree);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Exposes the aggregated statistics about merge health for the given tree.
|
|
238
|
+
* @param tree - The tree to get stats for.
|
|
239
|
+
* @returns Aggregated statistics about merge health for the given tree.
|
|
240
|
+
*/
|
|
241
|
+
public getStats(tree: SharedTree): MergeHealthStats {
|
|
242
|
+
return assertNotUndefined(this.treeData.get(tree), 'No such tree was attached to the logger').tally;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Removes all trees from the set of tree to log merge health telemetry for.
|
|
247
|
+
*/
|
|
248
|
+
public detachAllTrees() {
|
|
249
|
+
for (const tree of this.treeData.keys()) {
|
|
250
|
+
this.detachTree(tree);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Resets the aggregated merge health data for the given tree.
|
|
256
|
+
* @param tree - The tree to reset the merge health data for.
|
|
257
|
+
*/
|
|
258
|
+
public resetTreeData(tree: SharedTree): void {
|
|
259
|
+
this.treeData.set(tree, {
|
|
260
|
+
tally: {
|
|
261
|
+
maxAttemptCount: 0,
|
|
262
|
+
pathLengths: [],
|
|
263
|
+
editCount: 0,
|
|
264
|
+
failedEditCount: 0,
|
|
265
|
+
badPlaceCount: 0,
|
|
266
|
+
badRangeCount: 0,
|
|
267
|
+
|
|
268
|
+
deletedAncestorBadPlaceCount: 0,
|
|
269
|
+
deletedAncestorBadRangeCount: 0,
|
|
270
|
+
|
|
271
|
+
deletedSiblingBadPlaceCount: 0,
|
|
272
|
+
deletedSiblingBadRangeCount: 0,
|
|
273
|
+
updatedRangeInvertedCount: 0,
|
|
274
|
+
updatedRangeHasPlacesInDifferentTraitsCount: 0,
|
|
275
|
+
updatedRangeBadPlaceCount: 0,
|
|
276
|
+
updatedRangeNeverValidPlaceCount: 0,
|
|
277
|
+
|
|
278
|
+
constraintViolationCount: 0,
|
|
279
|
+
rangeConstraintViolationCount: 0,
|
|
280
|
+
lengthConstraintViolationCount: 0,
|
|
281
|
+
parentConstraintViolationCount: 0,
|
|
282
|
+
labelConstraintViolationCount: 0,
|
|
283
|
+
|
|
284
|
+
idAlreadyInUseCount: 0,
|
|
285
|
+
unknownIdCount: 0,
|
|
286
|
+
malformedEditCount: 0,
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Enables the regular telemetry logging of merge health data.
|
|
293
|
+
* The first message will be sent after `interval` milliseconds. See {@link SharedTreeMergeHealthTelemetryHeartbeat.flushHeartbeat} for
|
|
294
|
+
* immediate logging.
|
|
295
|
+
* @param interval - The amount of time in milliseconds between log messages.
|
|
296
|
+
*/
|
|
297
|
+
public startHeartbeat(interval: number = 60000): void {
|
|
298
|
+
if (this.heartbeatTimerId !== 0) {
|
|
299
|
+
this.stopHeartbeat();
|
|
300
|
+
}
|
|
301
|
+
this.heartbeatTimerId = window.setInterval(this.logHeartbeat, interval);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Disables the regular telemetry logging of merge health data.
|
|
306
|
+
*/
|
|
307
|
+
public stopHeartbeat(): void {
|
|
308
|
+
window.clearInterval(this.heartbeatTimerId);
|
|
309
|
+
this.heartbeatTimerId = 0;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Sends all collected merge health data and resets the aggregated state.
|
|
314
|
+
*/
|
|
315
|
+
public flushHeartbeat(): void {
|
|
316
|
+
this.logHeartbeat();
|
|
317
|
+
this.clearData();
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Resets all aggregated state.
|
|
322
|
+
*/
|
|
323
|
+
public clearData(): void {
|
|
324
|
+
for (const tree of this.treeData.keys()) {
|
|
325
|
+
this.resetTreeData(tree);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Receives SequencedEditApplied events from trees.
|
|
331
|
+
*/
|
|
332
|
+
private readonly sequencedEditHandler = (params: SequencedEditAppliedEventArguments) => {
|
|
333
|
+
const { edit, tree, wasLocal, logger, outcome, reconciliationPath } = params;
|
|
334
|
+
if (wasLocal) {
|
|
335
|
+
const tallyAndLogger = this.treeData.get(tree) ?? fail('Should only receive events for registered trees');
|
|
336
|
+
tallyAndLogger.logger = logger;
|
|
337
|
+
const tally = tallyAndLogger.tally;
|
|
338
|
+
tally.editCount += 1;
|
|
339
|
+
tally.pathLengths[reconciliationPath.length] = (tally.pathLengths[reconciliationPath.length] ?? 0) + 1;
|
|
340
|
+
if (edit.pastAttemptCount !== undefined && edit.pastAttemptCount > tally.maxAttemptCount) {
|
|
341
|
+
tally.maxAttemptCount = edit.pastAttemptCount;
|
|
342
|
+
}
|
|
343
|
+
if (outcome.status !== EditStatus.Applied) {
|
|
344
|
+
tally.failedEditCount += 1;
|
|
345
|
+
switch (outcome.failure.kind) {
|
|
346
|
+
case TransactionInternal.FailureKind.BadPlace: {
|
|
347
|
+
tally.badPlaceCount += 1;
|
|
348
|
+
if (outcome.failure.placeFailure === PlaceValidationResult.MissingSibling) {
|
|
349
|
+
tally.deletedSiblingBadPlaceCount += 1;
|
|
350
|
+
} else if (outcome.failure.placeFailure === PlaceValidationResult.MissingParent) {
|
|
351
|
+
tally.deletedAncestorBadPlaceCount += 1;
|
|
352
|
+
}
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
case TransactionInternal.FailureKind.BadRange: {
|
|
356
|
+
tally.badRangeCount += 1;
|
|
357
|
+
switch (outcome.failure.rangeFailure) {
|
|
358
|
+
case RangeValidationResultKind.Inverted:
|
|
359
|
+
tally.updatedRangeInvertedCount += 1;
|
|
360
|
+
break;
|
|
361
|
+
case RangeValidationResultKind.PlacesInDifferentTraits:
|
|
362
|
+
tally.updatedRangeHasPlacesInDifferentTraitsCount += 1;
|
|
363
|
+
break;
|
|
364
|
+
case RangeValidationResultKind.BadPlace:
|
|
365
|
+
tally.updatedRangeBadPlaceCount += 1;
|
|
366
|
+
break;
|
|
367
|
+
default:
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
case TransactionInternal.FailureKind.ConstraintViolation: {
|
|
373
|
+
tally.constraintViolationCount += 1;
|
|
374
|
+
switch (outcome.failure.violation.kind) {
|
|
375
|
+
case TransactionInternal.ConstraintViolationKind.BadRange: {
|
|
376
|
+
tally.rangeConstraintViolationCount += 1;
|
|
377
|
+
}
|
|
378
|
+
case TransactionInternal.ConstraintViolationKind.BadLength: {
|
|
379
|
+
tally.lengthConstraintViolationCount += 1;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
case TransactionInternal.ConstraintViolationKind.BadParent: {
|
|
383
|
+
tally.parentConstraintViolationCount += 1;
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
case TransactionInternal.ConstraintViolationKind.BadLabel: {
|
|
387
|
+
tally.labelConstraintViolationCount += 1;
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
default: {
|
|
391
|
+
// If this doesn't type-check, the above switch statement needs to be extended to handle a new case.
|
|
392
|
+
const _: never = outcome.failure.violation;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
case TransactionInternal.FailureKind.IdAlreadyInUse: {
|
|
398
|
+
tally.idAlreadyInUseCount += 1;
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
case TransactionInternal.FailureKind.UnknownId: {
|
|
402
|
+
tally.unknownIdCount += 1;
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
case TransactionInternal.FailureKind.DetachedSequenceIdAlreadyInUse:
|
|
406
|
+
case TransactionInternal.FailureKind.DetachedSequenceNotFound:
|
|
407
|
+
case TransactionInternal.FailureKind.DuplicateIdInBuild:
|
|
408
|
+
case TransactionInternal.FailureKind.UnusedDetachedSequence: {
|
|
409
|
+
tally.malformedEditCount += 1;
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
default: {
|
|
413
|
+
// If this doesn't type-check, the above switch statement needs to be extended to handle a new case.
|
|
414
|
+
const _: never = outcome.failure;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Logs the accumulated merge health data to each tree's designated logger.
|
|
423
|
+
*/
|
|
424
|
+
private readonly logHeartbeat = () => {
|
|
425
|
+
for (const [tree, { tally, logger }] of this.treeData) {
|
|
426
|
+
if (logger && tally.editCount > 0) {
|
|
427
|
+
// Note: all this data is for sequenced edits that were originally produced by the local client.
|
|
428
|
+
logger.send({
|
|
429
|
+
category: 'Heartbeat',
|
|
430
|
+
eventName: 'EditMergeHealth',
|
|
431
|
+
...tally,
|
|
432
|
+
// The counts of occurrences for a given path length.
|
|
433
|
+
// '1:2' means two occurrences of length one.
|
|
434
|
+
// Overwrites `tally.pathLengths` which is incompatible with ITelemetryBaseEvent.
|
|
435
|
+
pathLengths: pathLengthsCounts(tally.pathLengths),
|
|
436
|
+
});
|
|
437
|
+
this.resetTreeData(tree);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function pathLengthsCounts(lengths: readonly number[]): string {
|
|
444
|
+
return Object.entries(lengths)
|
|
445
|
+
.map(([length, count]) => `${length}:${count}`)
|
|
446
|
+
.join(',');
|
|
447
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { assert } from './Common';
|
|
7
|
+
import { IdCompressor, isFinalId } from './id-compressor';
|
|
8
|
+
import { FinalNodeId, NodeId, OpSpaceNodeId, SessionId, StableNodeId } from './Identifiers';
|
|
9
|
+
import { NodeData } from './persisted-types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* An object which can generate node IDs and convert node IDs between compressed and stable variants
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export interface NodeIdContext extends NodeIdGenerator, NodeIdConverter {}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* An object which can generate node IDs
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export interface NodeIdGenerator {
|
|
22
|
+
/**
|
|
23
|
+
* Generates a node identifier.
|
|
24
|
+
* The returned IDs may be used as the identifier of a node in the SharedTree.
|
|
25
|
+
* `NodeId`s are *always* unique and stable within the scope of the tree and session that generated them. They are *not* unique within
|
|
26
|
+
* a Fluid container, and *cannot* be compared across instances of a SharedTree. They are *not* stable across sessions/lifetimes of a
|
|
27
|
+
* SharedTree, and *cannot* be persisted (e.g. stored in payloads, uploaded in blobs, etc.). If stable persistence is needed,
|
|
28
|
+
* NodeIdConverter.convertToStableNodeId may be used to return a corresponding UUID that is globally unique and stable.
|
|
29
|
+
* @param override - if supplied, calls to `convertToStableNodeId` using the returned node ID will return the override instead of
|
|
30
|
+
* the UUID. Calls to `generateNodeId` with the same override always return the same ID. Performance note: passing an override string
|
|
31
|
+
* incurs a storage cost that is significantly higher that a node ID without one, and should be avoided if possible.
|
|
32
|
+
*/
|
|
33
|
+
generateNodeId(override?: string): NodeId;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* An object which can convert node IDs between compressed and stable variants
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export interface NodeIdConverter {
|
|
41
|
+
/**
|
|
42
|
+
* Given a NodeId, returns the corresponding stable ID or throws if the supplied node ID was not generated with this tree (`NodeId`s
|
|
43
|
+
* may not be used across SharedTree instances, see `generateNodeId` for more).
|
|
44
|
+
* The returned value will be a UUID, unless the creation of `id` used an override string (see `generateNodeId` for more).
|
|
45
|
+
* The result is safe to persist and re-use across `SharedTree` instances, unlike `NodeId`.
|
|
46
|
+
*/
|
|
47
|
+
convertToStableNodeId(id: NodeId): StableNodeId;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Given a NodeId, attempt to return the corresponding stable ID.
|
|
51
|
+
* The returned value will be a UUID, unless the creation of `id` used an override string (see `generateNodeId` for more).
|
|
52
|
+
* The returned stable ID is undefined if `id` was never created with this SharedTree. If a stable ID is returned, this does not imply
|
|
53
|
+
* that there is a node with `id` in the current revision of the tree, only that `id` was at some point generated by some instance of
|
|
54
|
+
* this tree.
|
|
55
|
+
*/
|
|
56
|
+
tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Given a stable ID, return the corresponding NodeId or throws if the supplied stable ID was never generated with this tree, either
|
|
60
|
+
* as a UUID corresponding to a `NodeId` or as an override passed to `generateNodeId`.
|
|
61
|
+
* If a stable ID is returned, this does not imply that there is a node with `id` in the current revision of the tree, only that
|
|
62
|
+
* `id` was at some point generated by an instance of this SharedTree.
|
|
63
|
+
*/
|
|
64
|
+
convertToNodeId(id: StableNodeId): NodeId;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Given a stable ID, return the corresponding NodeId or return undefined if the supplied stable ID was never generated with this tree,
|
|
68
|
+
* either as a UUID corresponding to a `NodeId` or as an override passed to `generateNodeId`.
|
|
69
|
+
* If a stable ID is returned, this does not imply that there is a node with `id` in the current revision of the tree, only that
|
|
70
|
+
* `id` was at some point generated by an instance of this SharedTree.
|
|
71
|
+
*/
|
|
72
|
+
tryConvertToNodeId(id: StableNodeId): NodeId | undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* An object which can normalize node IDs. See docs on {@link IdCompressor} for semantics of normalization.
|
|
77
|
+
*/
|
|
78
|
+
export interface NodeIdNormalizer<TId extends OpSpaceNodeId> {
|
|
79
|
+
localSessionId: SessionId;
|
|
80
|
+
/**
|
|
81
|
+
* Normalizes the given ID to op space
|
|
82
|
+
*/
|
|
83
|
+
normalizeToOpSpace(id: NodeId): TId;
|
|
84
|
+
/**
|
|
85
|
+
* Normalizes the given ID to session space
|
|
86
|
+
*/
|
|
87
|
+
normalizeToSessionSpace(id: TId, sessionId: SessionId): NodeId;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* An object which can normalize node IDs. It is contextualized to a known session context, and therefore
|
|
92
|
+
* can normalize IDs into session space without requiring any additional information.
|
|
93
|
+
*/
|
|
94
|
+
export interface ContextualizedNodeIdNormalizer<TId extends OpSpaceNodeId>
|
|
95
|
+
extends Omit<NodeIdNormalizer<TId>, 'localSessionId' | 'normalizeToSessionSpace'> {
|
|
96
|
+
/**
|
|
97
|
+
* Normalizes the given ID to session space
|
|
98
|
+
*/
|
|
99
|
+
normalizeToSessionSpace(id: TId): NodeId;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Create a {@link ContextualizedNodeIdNormalizer} that uses either the given session ID to normalize IDs
|
|
104
|
+
* to session space. If no ID is given, it will use the local session ID belonging to the normalizer.
|
|
105
|
+
*/
|
|
106
|
+
export function scopeIdNormalizer<TId extends OpSpaceNodeId>(
|
|
107
|
+
idNormalizer: NodeIdNormalizer<TId>,
|
|
108
|
+
sessionId?: SessionId
|
|
109
|
+
): ContextualizedNodeIdNormalizer<TId> {
|
|
110
|
+
return {
|
|
111
|
+
normalizeToOpSpace: (id) => idNormalizer.normalizeToOpSpace(id),
|
|
112
|
+
normalizeToSessionSpace: (id) =>
|
|
113
|
+
idNormalizer.normalizeToSessionSpace(id, sessionId ?? idNormalizer.localSessionId),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Create a {@link ContextualizedNodeIdNormalizer} that uses the local session ID belonging to the normalizer
|
|
119
|
+
* to normalize IDs to session space. These IDs are expected to be sequenced, and will fail to normalize if
|
|
120
|
+
* they are not.
|
|
121
|
+
*/
|
|
122
|
+
export function sequencedIdNormalizer<TId extends OpSpaceNodeId>(
|
|
123
|
+
idNormalizer: NodeIdNormalizer<TId>
|
|
124
|
+
): ContextualizedNodeIdNormalizer<FinalNodeId & TId> {
|
|
125
|
+
return {
|
|
126
|
+
normalizeToOpSpace: (id) => {
|
|
127
|
+
const normalized = idNormalizer.normalizeToOpSpace(id);
|
|
128
|
+
assert(isFinalId(normalized));
|
|
129
|
+
return normalized;
|
|
130
|
+
},
|
|
131
|
+
normalizeToSessionSpace: (id) => {
|
|
132
|
+
const normalized = idNormalizer.normalizeToSessionSpace(id, idNormalizer.localSessionId);
|
|
133
|
+
assert(isFinalId(normalized));
|
|
134
|
+
return normalized;
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function getNodeIdContext(compressor: IdCompressor): NodeIdContext & NodeIdNormalizer<OpSpaceNodeId> {
|
|
140
|
+
return {
|
|
141
|
+
generateNodeId: (override?: string) => compressor.generateCompressedId(override) as NodeId,
|
|
142
|
+
convertToNodeId: (id: StableNodeId) => compressor.recompress(id) as NodeId,
|
|
143
|
+
tryConvertToNodeId: (id: StableNodeId) => compressor.tryRecompress(id) as NodeId | undefined,
|
|
144
|
+
convertToStableNodeId: (id: NodeId) => compressor.decompress(id) as StableNodeId,
|
|
145
|
+
tryConvertToStableNodeId: (id: NodeId) => compressor.tryDecompress(id) as StableNodeId,
|
|
146
|
+
normalizeToOpSpace: (id: NodeId) => compressor.normalizeToOpSpace(id) as OpSpaceNodeId,
|
|
147
|
+
normalizeToSessionSpace: (id: OpSpaceNodeId, sessionId: SessionId) =>
|
|
148
|
+
compressor.normalizeToSessionSpace(id, sessionId) as NodeId,
|
|
149
|
+
localSessionId: compressor.localSessionId,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Accepts either a node or a node's identifier, and returns the identifier */
|
|
154
|
+
export function getNodeId<TId extends number | string>(node: TId | NodeData<TId>): TId {
|
|
155
|
+
return (node as NodeData<TId>).identifier ?? (node as TId);
|
|
156
|
+
}
|