@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdCompressor.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { v4, v5 } from 'uuid';\nimport {\n\tIdCompressor,\n\tisFinalId,\n\tisLocalId,\n\thasOngoingSession,\n\tlegacySharedTreeInitialTreeId,\n} from '../id-compressor/IdCompressor';\nimport {\n\tLocalCompressedId,\n\tFinalCompressedId,\n\tSessionSpaceCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n} from '../Identifiers';\nimport { assert, assertNotUndefined, fail } from '../Common';\nimport {\n\tassertIsStableId,\n\tcreateSessionId as createSessionId,\n\tincrementUuid,\n\tisStableId,\n\tnumericUuidFromStableId,\n\tstableIdFromNumericUuid,\n} from '../id-compressor/NumericUuid';\nimport { getIds } from '../id-compressor/IdRange';\nimport type { UnackedLocalId } from '../id-compressor';\nimport {\n\tcreateCompressor,\n\tperformFuzzActions,\n\tsessionIds,\n\tIdCompressorTestNetwork,\n\tClient,\n\tDestinationClient,\n\tMetaClient,\n\texpectSerializes,\n\troundtrip,\n\tsessionNumericUuids,\n} from './utilities/IdCompressorTestUtilities';\nimport { expectDefined } from './utilities/TestCommon';\n\ndescribe('IdCompressor', () => {\n\tit('detects invalid cluster sizes', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 1);\n\t\texpect(() => (compressor.clusterCapacity = -1)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = 0)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = IdCompressor.maxClusterSize + 1)).to.throw(\n\t\t\t'Clusters must not exceed max cluster size'\n\t\t);\n\t});\n\n\tit('reports the proper session ID', () => {\n\t\tconst sessionId = createSessionId();\n\t\tconst compressor = new IdCompressor(sessionId, 0);\n\t\texpect(compressor.localSessionId).to.equal(sessionId);\n\t});\n\n\tit('accepts different numbers of reserved IDs', () => {\n\t\tfor (const reservedIdCount of [0, 1, 5]) {\n\t\t\tconst compressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\t\tif (reservedIdCount > 0) {\n\t\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\t}\n\t\t}\n\t});\n\n\tdescribe('ID Generation', () => {\n\t\tit('can create a compressed ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can create compressed IDs with v5 overrides', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst uuidA = v5('foo', '7834b437-6e8c-4936-a1a3-0130b1178f17');\n\t\t\tconst uuidB = uuidA.slice(0, uuidA.length - 1) + (uuidA.charAt(uuidA.length - 1) === 'a' ? 'b' : 'a');\n\t\t\tconst idA = compressor.generateCompressedId(uuidA);\n\t\t\tconst idB = compressor.generateCompressedId(uuidB);\n\t\t\texpect(compressor.decompress(idA)).to.equal(uuidA);\n\t\t\texpect(compressor.decompress(idB)).to.equal(uuidB);\n\t\t});\n\n\t\tit('can manually create a compressed ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(id).to.equal(compressor.recompress(uuid));\n\t\t});\n\n\t\tit('will not decompress IDs it did not compress', () => {\n\t\t\tconst errorMessage = 'Compressed ID was not generated by this compressor';\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(() => compressor.decompress(-1 as LocalCompressedId)).to.throw(errorMessage);\n\t\t\texpect(() => compressor.decompress(compressor.reservedIdCount as FinalCompressedId)).to.throw(errorMessage);\n\t\t});\n\n\t\tit('will not re-compress uuids it did not originally compress', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.tryRecompress('5fff846a-efd4-42fb-8b78-b32ce2672f99')).to.be.undefined;\n\t\t});\n\n\t\tit('unifies duplicate overrides originating from the same compressor', () => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tconst localId1 = compressor.generateCompressedId(override);\n\t\t\tconst localId2 = compressor.generateCompressedId(override);\n\t\t\texpect(localId1).to.equal(localId2, 'only one local ID should be allocated for the same override');\n\t\t\texpect(compressor.decompress(localId1)).to.equal(override, 'override incorrectly associated with local ID');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort before the reserved session UUID', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted before the reserved UUID\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `0${legacySharedTreeInitialTreeId.slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 1 /* just needs to be > 0 */);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing override', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing override\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 0);\n\n\t\t\t// Client1 compresses a uuid with some override that will sort before the session uuid\n\t\t\tcompressor.generateCompressedId(`a${v4().slice(1)}`);\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing cluster', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing cluster\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession1 = `c${v4().slice(1)}` as SessionId;\n\t\t\tconst newSession2 = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor1 = new IdCompressor(newSession1, 0);\n\t\t\tconst compressor2 = new IdCompressor(newSession2, 0);\n\t\t\tcompressor1.clusterCapacity = 5;\n\t\t\tcompressor2.clusterCapacity = 5;\n\n\t\t\tcompressor2.generateCompressedId(); // one ID, enough to make a cluster\n\t\t\tcompressor1.finalizeCreationRange(compressor2.takeNextCreationRange());\n\n\t\t\tconst localId = compressor1.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor1.decompress(localId));\n\t\t\tconst localId3 = compressor1.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies unfinalized local overrides with final IDs from a remote session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, 3);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 3);\n\n\t\t\tconst override = 'override';\n\t\t\tconst local1 = compressor1.generateCompressedId(override);\n\t\t\tconst local2 = compressor2.generateCompressedId(override);\n\t\t\tconst creationRange = compressor2.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\n\t\t\texpect(compressor1.decompress(local1)).to.equal(override);\n\t\t\tconst final1 = compressor1.normalizeToOpSpace(local1);\n\t\t\tconst final2 = compressor2.normalizeToOpSpace(local2);\n\t\t\texpect(isFinalId(final1)).to.be.true;\n\t\t\texpect(final1).to.equal(final2);\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that have been finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst stableId = assertIsStableId(compressor.decompress(id));\n\t\t\tconst localId2 = compressor.generateCompressedId(stableId);\n\t\t\texpect(localId2).to.equal(id, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('cannot create negative amounts of local IDs', () => {\n\t\t\texpect(() => createCompressor(Client.Client1).generateCompressedIdRange(-1)).to.throw(\n\t\t\t\t'Must generate a nonzero number of IDs.'\n\t\t\t);\n\t\t});\n\n\t\tit('cannot create unacceptably large amounts of local IDs', () => {\n\t\t\texpect(() =>\n\t\t\t\tcreateCompressor(Client.Client1).generateCompressedIdRange(Number.MAX_SAFE_INTEGER + 2)\n\t\t\t).to.throw('The number of allocated local IDs must not exceed the JS maximum safe integer.');\n\t\t});\n\t});\n\n\tdescribe('can enumerate all locally created IDs', () => {\n\t\tconst idCount = 10;\n\t\tit('created without finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 10);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tif (i === Math.floor(idCount / 2)) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\t});\n\n\tit('only sends attribution info on the first range from each session', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 5, 'attribution');\n\t\tconst range1 = compressor.takeNextCreationRange();\n\t\texpectDefined(range1.attributionInfo);\n\t\tconst range2 = compressor.takeNextCreationRange();\n\t\texpect(range2.attributionInfo).to.be.undefined;\n\t});\n\n\tdescribe('can produce a creation range', () => {\n\t\tconst tests: {\n\t\t\ttitle: string;\n\t\t\toverrideIndices: number[];\n\t\t\tidCount: number;\n\t\t}[] = [\n\t\t\t{ title: 'that is empty', overrideIndices: [], idCount: 0 },\n\t\t\t{ title: 'with only sequential IDs', overrideIndices: [], idCount: 3 },\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID before an overriding ID',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID after an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID between sequential IDs',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID between override IDs',\n\t\t\t\toverrideIndices: [0, 2],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t];\n\n\t\ttests.forEach(({ title, overrideIndices, idCount }) => {\n\t\t\tit(title, () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\tvalidateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t});\n\n\t\t\ttests.forEach(({ title: title2, overrideIndices: overrideIndices2, idCount: idCount2 }) => {\n\t\t\t\tit(`${title2} after a range ${title}`, () => {\n\t\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\t\tconst lastTaken = validateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t\t\tvalidateIdCreationRange(compressor, idCount2, new Set(overrideIndices2), lastTaken);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tfunction validateIdCreationRange(\n\t\t\tcompressor: IdCompressor,\n\t\t\tidCount: number,\n\t\t\toverrideIndices: Set<number>,\n\t\t\tlastTakenId = 0 as UnackedLocalId\n\t\t): UnackedLocalId {\n\t\t\tconst overrides: [SessionSpaceCompressedId, string?][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst override = overrideIndices.has(i) ? v4() : undefined;\n\t\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\t\toverrides.push([id, override]);\n\t\t\t}\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tlet newLastTakenId = lastTakenId;\n\t\t\tlet idsActual = getIds(range);\n\t\t\tif (overrides.length === 0) {\n\t\t\t\texpect(idsActual).to.be.undefined;\n\t\t\t} else {\n\t\t\t\tidsActual = expectDefined(idsActual);\n\t\t\t\texpect(overrides[0][0]).to.equal(idsActual.first);\n\t\t\t\texpect(overrides[overrides.length - 1][0]).to.equal(idsActual.last);\n\t\t\t\tfor (const [id, uuid] of Object.entries(overrideIndices)) {\n\t\t\t\t\texpect(overrides[id][1]).to.equal(uuid);\n\t\t\t\t}\n\t\t\t\tnewLastTakenId = idsActual.last;\n\t\t\t}\n\n\t\t\treturn newLastTakenId;\n\t\t}\n\t});\n\n\tdescribe('Finalizing', () => {\n\t\tit('can finalize multiple overrides into the same cluster using different ranges', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override1 = 'override1';\n\t\t\tconst override2 = 'override2';\n\t\t\tconst id1 = compressor.generateCompressedId(override1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\tconst id2 = compressor.generateCompressedId(override2);\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tconst finalId1 = compressor.normalizeToOpSpace(id1);\n\t\t\tconst finalId2 = compressor.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId1)).to.equal(override1);\n\t\t\texpect(compressor.decompress(finalId2)).to.equal(override2);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges twice', () => {\n\t\t\tconst rangeCompressor = createCompressor(Client.Client1);\n\t\t\trangeCompressor.generateCompressedIdRange(3);\n\t\t\tconst batchRange = rangeCompressor.takeNextCreationRange();\n\t\t\trangeCompressor.finalizeCreationRange(batchRange);\n\t\t\texpect(() => rangeCompressor.finalizeCreationRange(batchRange)).to.throw('Ranges finalized out of order.');\n\n\t\t\t// Make a new compressor, as the first one will be left in a bad state\n\t\t\tconst explicitCompressor = createCompressor(Client.Client1);\n\t\t\texplicitCompressor.generateCompressedId();\n\t\t\texplicitCompressor.generateCompressedId('override');\n\t\t\tconst explicitRange = explicitCompressor.takeNextCreationRange();\n\t\t\texplicitCompressor.finalizeCreationRange(explicitRange);\n\t\t\texpect(() => explicitCompressor.finalizeCreationRange(explicitRange)).to.throw(\n\t\t\t\t'Ranges finalized out of order.'\n\t\t\t);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges out of order', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.takeNextCreationRange();\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst secondRange = compressor.takeNextCreationRange();\n\t\t\texpect(() => compressor.finalizeCreationRange(secondRange)).to.throw('Ranges finalized out of order.');\n\t\t});\n\n\t\tit('prevents finalizing unacceptably enormous amounts of ID allocation', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst integerLargerThanHalfMax = Math.round((Number.MAX_SAFE_INTEGER / 3) * 2);\n\t\t\tcompressor1.generateCompressedIdRange(integerLargerThanHalfMax);\n\t\t\tcompressor2.generateCompressedIdRange(integerLargerThanHalfMax);\n\t\t\tconst range1 = compressor1.takeNextCreationRange();\n\t\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range1);\n\t\t\texpect(() => compressor1.finalizeCreationRange(range2)).to.throw(\n\t\t\t\t'The number of allocated final IDs must not exceed the JS maximum safe integer.'\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Compression', () => {\n\t\tit('can re-compress a sequential uuid it generated', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress overrides from a remote client it has finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst override = 'override';\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst uuid = compressor.decompress(id);\n\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tcompressor2.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId1 = compressor2.recompress(uuid);\n\t\t\tconst finalId2 = compressor2.recompress(override);\n\t\t\tif (finalId1 === undefined || finalId2 === undefined) {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t});\n\n\t\tit('will not compress an override it never compressed or finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t// Leading zeroes to exploit calls to getOrNextLower on uuid maps, as it will be before test session uuids\n\t\t\tconst override = 'override';\n\t\t\texpect(compressor.tryRecompress(override)).to.be.undefined;\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 1))).to.be\n\t\t\t\t.undefined;\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tcompressor.generateCompressedIdRange(2);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 4))).to.be\n\t\t\t\t.undefined;\n\t\t});\n\t});\n\n\tdescribe('Decompression', () => {\n\t\tit('can decompress a local ID before and after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('can decompress reserved IDs', () => {\n\t\t\t// This is a glass box test in that it increments UUIDs\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\tconst reservedSessionUuid = numericUuidFromStableId(\n\t\t\t\tassertIsStableId(compressor.decompress(compressor.getReservedId(1)))\n\t\t\t);\n\t\t\tfor (let i = 1; i < compressor.reservedIdCount; i++) {\n\t\t\t\tconst reservedId = compressor.getReservedId(i);\n\t\t\t\tconst stable = compressor.decompress(reservedId);\n\t\t\t\texpect(stable).to.equal(stableIdFromNumericUuid(incrementUuid(reservedSessionUuid, i - 1)));\n\t\t\t\tconst finalIdForReserved = compressor.recompress(stable);\n\t\t\t\texpect(isLocalId(finalIdForReserved)).to.be.false;\n\t\t\t\texpect(finalIdForReserved).to.equal(reservedId);\n\t\t\t}\n\t\t\tconst outOfBoundsError = 'Reserved Id index out of bounds';\n\t\t\texpect(() => compressor.getReservedId(-1)).to.throw(outOfBoundsError);\n\t\t\texpect(() => compressor.getReservedId(compressor.reservedIdCount)).to.throw(outOfBoundsError);\n\t\t});\n\n\t\tit('can decompress a final ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst range = compressor.generateCompressedIdRange(1);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.normalizeToOpSpace(\n\t\t\t\tcompressor.getIdsFromRange(range, compressor.localSessionId).get(0)\n\t\t\t);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t});\n\n\t\tit('can decompress a final ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(uuid).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an override that is an UUID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst uuid = 'd1302ab1-3c08-4e79-a49a-4c39ac369c16';\n\t\t\tconst id = compressor.generateCompressedId(uuid);\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('properly sorts UUID-like overrides separately from true UUIDs', () => {\n\t\t\t// This is a glass box test that ensures overrides which would sort in between a cluster base UUID and an UUID higher up in the\n\t\t\t// same cluster are not accidentally retrieved during cluster ID lookup.\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `${compressor.localSessionId}6`;\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst decompressedId = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(decompressedId)).to.equal(id);\n\t\t});\n\n\t\tit('can decompress an override that starts with the reserved prefix character', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `\\ue15e${compressor.localSessionId}`;\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\t});\n\n\tdescribe('Normalization', () => {\n\t\tit('can normalize a local ID to op space before finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isLocalId(id)).to.be.true;\n\t\t\texpect(id).to.equal(normalized);\n\t\t});\n\n\t\tit('can normalize a local ID to op space after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isFinalId(normalized)).to.be.true;\n\t\t\texpect(id).to.not.equal(normalized);\n\t\t});\n\n\t\tit('cannot normalize a remote ID to session space if it has not been finalized', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst normalized = compressor1.normalizeToOpSpace(compressor1.generateCompressedId());\n\t\t\texpect(() => compressor2.normalizeToSessionSpace(normalized, compressor1.localSessionId)).to.throw(\n\t\t\t\t'No IDs have ever been finalized by the supplied session.'\n\t\t\t);\n\t\t});\n\n\t\tit('can normalize local and final IDs from a remote session to session space', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst id = compressor1.generateCompressedId();\n\t\t\tconst normalizedLocal = compressor1.normalizeToOpSpace(id);\n\t\t\tconst range = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range);\n\t\t\tconst normalizedFinal = compressor1.normalizeToOpSpace(id);\n\t\t\tcompressor2.finalizeCreationRange(range);\n\t\t\texpect(isLocalId(normalizedLocal)).to.be.true;\n\t\t\texpect(isFinalId(normalizedFinal)).to.be.true;\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedFinal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedLocal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Serialization', () => {\n\t\tit('can serialize an empty compressor', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(compressor);\n\t\t\texpect(serializedWithSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t\texpect(serializedNoSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t});\n\n\t\tit('correctly deserializes and resumes a session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, undefined, Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, undefined, Client.Client2);\n\t\t\tcompressor1.generateCompressedId();\n\t\t\tconst creationRange = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\t\t\tconst [_, serializedWithSession] = expectSerializes(compressor1);\n\t\t\tconst compressorResumed = IdCompressor.deserialize(serializedWithSession);\n\t\t\tcompressorResumed.generateCompressedId();\n\t\t\tconst range2 = compressorResumed.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range2);\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\texpect(\n\t\t\t\tIdCompressor.deserialize(compressor1.serialize(false), createSessionId()).equals(\n\t\t\t\t\tIdCompressor.deserialize(compressor2.serialize(false), createSessionId()),\n\t\t\t\t\tfalse // don't compare local state\n\t\t\t\t)\n\t\t\t).to.be.true;\n\t\t});\n\t});\n\n\t// No validation, as these leave the network in a broken state\n\tdescribeNetworkNoValidation('detects UUID collision', (itNetwork) => {\n\t\titNetwork(\n\t\t\t'when a client requests an override that is an UUID reserved for later allocation by a cluster',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\t\tconst id = network.getIdLog(Client.Client2)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor2.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 1);\n\t\t\t\texpect(() => network.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid })).to.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork(\n\t\t\t'when a new cluster is allocated whose base UUID collides with an existing override',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1); // new cluster\n\t\t\t\texpect(() => network.deliverOperations(Client.Client1)).to.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork('detects colliding override UUIDs when expanding a cluster', 1, (network) => {\n\t\t\t// This is a glass box test in that it is testing cluster expansion\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\tconst expansion = 3;\n\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), expansion);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, expansion, { 0: nextUuid });\n\t\t\texpect(() => network.deliverOperations(DestinationClient.All)).to.throw(\n\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribeNetwork('Networked', (itNetwork) => {\n\t\tdescribe('can attribute', () => {\n\t\t\titNetwork('local IDs before and after being finalized', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(Client.Client1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(Client.Client1);\n\t\t\t});\n\n\t\t\titNetwork('final IDs from a remote session', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst id = network.getSequencedIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('final IDs from multiple remote sessions', 1, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t// Ensure multiple clusters are made by each client. Cluster size === 1.\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst log = network.getSequencedIdLog(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[0].id)).to.equal(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[1].id)).to.equal(Client.Client2);\n\t\t\t\texpect(compressor.attributeId(log[2].id)).to.equal(Client.Client3);\n\t\t\t\texpect(compressor.attributeId(log[3].id)).to.equal(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[4].id)).to.equal(Client.Client2);\n\t\t\t\texpect(compressor.attributeId(log[5].id)).to.equal(Client.Client3);\n\t\t\t});\n\n\t\t\titNetwork('unified IDs', (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tconst allTargets = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tnetwork.allocateAndSendIds(client, 1, { 0: override });\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst firstTarget = allTargets[0][0];\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(firstTarget);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\titNetwork('upholds the invariant that IDs always decompress to the same UUID', 2, (network) => {\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5, {\n\t\t\t\t2: 'override2',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5, {\n\t\t\t\t3: 'override3',\n\t\t\t});\n\n\t\t\tconst preAckLocals = new Map<Client, [SessionSpaceCompressedId, string][]>();\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst locals: [SessionSpaceCompressedId, string][] = [];\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tlocals.push([idData.id, compressor.decompress(idData.id)]);\n\t\t\t\t}\n\t\t\t\tpreAckLocals.set(client, locals);\n\t\t\t}\n\n\t\t\t// Ack all IDs\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst preAckLocalIds = preAckLocals.get(client) ?? fail();\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tif (idData.originatingClient === client) {\n\t\t\t\t\t\texpect(isFinalId(idData.id)).to.be.false;\n\t\t\t\t\t\tconst currentUuid = compressor.decompress(idData.id);\n\t\t\t\t\t\texpect(currentUuid).to.equal(preAckLocalIds[i % preAckLocalIds.length][1]);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize session space IDs to op space', 5, (network) => {\n\t\t\tconst clusterCapacity = 5;\n\t\t\tconst idCount = clusterCapacity * 2;\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t}\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\texpect(idData.originatingClient).to.equal(client);\n\t\t\t\t\texpect(isLocalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\texpect(isFinalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a local session to session space IDs', (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst { range, sessionId } = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tconst id = compressor.normalizeToOpSpace(compressor.getIdsFromRange(range, sessionId).get(0));\n\t\t\texpect(isFinalId(id)).to.be.true;\n\t\t\texpect(isLocalId(compressor.normalizeToSessionSpace(id, compressor.localSessionId))).to.be.true;\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a remote session to session space IDs', (network) => {\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst { range, sessionId } = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t// Mimic sending a reference to an ID that hasn't been acked yet, such as in a slow network\n\t\t\tconst id = compressor1.normalizeToOpSpace(compressor1.getIdsFromRange(range, sessionId).get(0));\n\t\t\tconst getSessionNormalizedId = () => compressor2.normalizeToSessionSpace(id, compressor1.localSessionId);\n\t\t\texpect(getSessionNormalizedId).to.throw('No IDs have ever been finalized by the supplied session.');\n\t\t\tnetwork.deliverOperations(Client.Client2);\n\t\t\texpect(isFinalId(getSessionNormalizedId())).to.be.true;\n\t\t});\n\n\t\titNetwork('unifies duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst compressor3 = network.getCompressor(Client.Client3);\n\t\t\tconst clusterCapacity = compressor1.clusterCapacity;\n\n\t\t\t// Ensure some clusters exist to avoid simple case of empty clusters\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterCapacity);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst range1 = network.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tconst overrides1 = expectDefined(getIds(range1)?.overrides);\n\t\t\tconst id1 = compressor1.normalizeToSessionSpace(overrides1[0][0], compressor1.localSessionId);\n\t\t\tconst opNormalizedLocal1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isLocalId(opNormalizedLocal1)).to.be.true;\n\t\t\texpect(isFinalId(id1)).to.be.false;\n\n\t\t\tnetwork.deliverOperations(DestinationClient.Client1);\n\n\t\t\tconst finalId1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\tconst range2 = network.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tconst overrides2 = expectDefined(getIds(range2)?.overrides);\n\t\t\tconst id2 = compressor2.normalizeToSessionSpace(overrides2[0][0], compressor2.localSessionId);\n\t\t\tconst opNormalizedLocal2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isLocalId(opNormalizedLocal2)).to.be.true;\n\t\t\texpect(isFinalId(id2)).to.be.false;\n\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst finalId2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\texpect(finalId1).to.equal(finalId2);\n\n\t\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(finalId1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.decompress(id1)).to.equal(override);\n\t\t\texpect(compressor1.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor1.recompress(override)).to.equal(id1);\n\n\t\t\texpect(compressor2.normalizeToOpSpace(id2)).to.equal(finalId2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.decompress(id2)).to.equal(override);\n\t\t\texpect(compressor2.decompress(finalId2)).to.equal(override);\n\t\t\texpect(compressor2.tryRecompress(override)).to.equal(id2);\n\n\t\t\texpect(compressor3.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(finalId1);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor3.recompress(override)).to.equal(finalId1);\n\t\t});\n\n\t\titNetwork('maintains alignment after unifying duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2, 1);\n\t\t});\n\n\t\tfunction expectSequencedLogsAlign(\n\t\t\tnetwork: IdCompressorTestNetwork,\n\t\t\tclient1: Client,\n\t\t\tclient2: Client,\n\t\t\tnumUnifications = 0\n\t\t): void {\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tassert(client1 !== client2);\n\t\t\tconst log1 = network.getSequencedIdLog(client1);\n\t\t\tconst log2 = network.getSequencedIdLog(client2);\n\t\t\texpect(log1.length).to.equal(log2.length);\n\t\t\tconst compressor1 = network.getCompressor(client1);\n\t\t\tconst compressor2 = network.getCompressor(client2);\n\t\t\tconst ids = new Set<OpSpaceCompressedId>();\n\t\t\tconst uuidsOrOverrides = new Set<string>();\n\t\t\tfor (let i = 0; i < log1.length; i++) {\n\t\t\t\tconst data1 = log1[i];\n\t\t\t\tconst id1 = compressor1.normalizeToOpSpace(data1.id);\n\t\t\t\tconst id2 = compressor2.normalizeToOpSpace(log2[i].id);\n\t\t\t\texpect(isFinalId(id1)).to.be.true;\n\t\t\t\tids.add(id1);\n\t\t\t\texpect(id1).to.equal(id2);\n\t\t\t\tconst uuidOrOverride1 = compressor1.decompress(id1);\n\t\t\t\tuuidsOrOverrides.add(uuidOrOverride1);\n\t\t\t\tif (data1.expectedOverride === undefined) {\n\t\t\t\t\texpect(isStableId(uuidOrOverride1)).to.be.true;\n\t\t\t\t}\n\t\t\t\texpect(uuidOrOverride1).to.equal(compressor2.decompress(id2));\n\t\t\t}\n\t\t\tconst expectedSize = log1.length - numUnifications;\n\t\t\texpect(ids.size).to.equal(expectedSize);\n\t\t\texpect(uuidsOrOverrides.size).to.equal(expectedSize);\n\t\t}\n\n\t\titNetwork('produces ID spaces correctly', (network) => {\n\t\t\t// This test asserts that IDs returned from IDCompressor APIs are correctly encoded as either local or final.\n\t\t\t// This is a glass box test in that it assumes the negative/positive encoding of CompressedIds (negative = local, positive = final).\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\n\t\t\t// Client 1 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 1's IDs have not been acked so have no op space equivalent\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.lessThan(0));\n\n\t\t\t// Client 1's IDs are acked\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 3 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t1: 'override2',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client2).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 1 receives Client 2's IDs\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.slice(-3)\n\t\t\t\t.forEach((id) => expect(id.id).to.be.greaterThan(0));\n\n\t\t\t// All IDs have been acked or are from another client, and therefore have a final form in op space\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.greaterThan(0));\n\n\t\t\t// Compression should preserve ID space correctness\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst roundtripped = compressor1.recompress(compressor1.decompress(idData.id));\n\t\t\t\texpect(Math.sign(roundtripped)).to.equal(Math.sign(idData.id));\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst opNormalized = compressor1.normalizeToOpSpace(idData.id);\n\t\t\t\texpect(Math.sign(compressor1.normalizeToSessionSpace(opNormalized, idData.sessionId))).to.equal(\n\t\t\t\t\tMath.sign(idData.id)\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\titNetwork('produces consistent IDs with large fuzz input', (network) => {\n\t\t\tperformFuzzActions(network, 1984, true, undefined, true, 1000, 25, (network) =>\n\t\t\t\tnetwork.assertNetworkState()\n\t\t\t);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t});\n\n\t\titNetwork('can set the cluster size via constructor', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst { range, sessionId } = network.allocateAndSendIds(Client.Client2, 2);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst id = compressor.getIdsFromRange(range, sessionId).get(0);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(id).to.equal(compressor.reservedIdCount + compressor.clusterCapacity);\n\t\t});\n\n\t\titNetwork('can set the cluster size via API', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst initialClusterCapacity = compressor.clusterCapacity;\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, initialClusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, initialClusterCapacity);\n\t\t\tnetwork.enqueueCapacityChange(5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst { range, sessionId } = network.allocateAndSendIds(Client.Client2, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst id = compressor.getIdsFromRange(range, sessionId).get(0);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(id).to.equal(compressor.reservedIdCount + initialClusterCapacity * 2 + compressor.clusterCapacity);\n\t\t});\n\n\t\tdescribe('can get IDs from ranges', () => {\n\t\t\titNetwork('unless they are unfinalized and from a remote session', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tconst { range: unackedRemoteRange, sessionId } = network.allocateAndSendIds(Client.Client2, 5);\n\t\t\t\texpect(() => compressor.getIdsFromRange(unackedRemoteRange, sessionId)).to.throw(\n\t\t\t\t\t'Unknown session, range may not be finalized.'\n\t\t\t\t);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst { range: unackedRemoteRange2, sessionId: sessionId2 } = network.allocateAndSendIds(\n\t\t\t\t\tClient.Client2,\n\t\t\t\t\t5\n\t\t\t\t);\n\t\t\t\texpect(() => compressor.getIdsFromRange(unackedRemoteRange2, sessionId2)).to.throw(\n\t\t\t\t\t'Remote range must be finalized before getting IDs.'\n\t\t\t\t);\n\t\t\t});\n\n\t\t\titNetwork('that are unacked', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tconst { range: rangeDescriptor1, sessionId: sessionId1 } = network.allocateAndSendIds(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t5\n\t\t\t\t);\n\t\t\t\tconst range1 = compressor.getIdsFromRange(rangeDescriptor1, sessionId1);\n\t\t\t\tfor (let i = 0; i < range1.length; i++) {\n\t\t\t\t\texpect(range1.get(i)).to.equal(-(i + 1));\n\t\t\t\t}\n\t\t\t\tconst { range: rangeDescriptor2, sessionId: sessionId2 } = network.allocateAndSendIds(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t7\n\t\t\t\t);\n\t\t\t\tconst range2 = compressor.getIdsFromRange(rangeDescriptor2, sessionId2);\n\t\t\t\tfor (let i = 0; i < range2.length; i++) {\n\t\t\t\t\texpect(range2.get(i)).to.equal(-(i + 1 + range1.length));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('from the local session that are acked', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tconst { range, sessionId } = network.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tconst range1 = compressor.getIdsFromRange(range, sessionId);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\t\tfor (let i = 0; i < range1.length; i++) {\n\t\t\t\t\texpect(range1.get(i)).to.equal(-(i + 1));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('from a remote session that are in a single cluster', 5, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tconst clusterCapacity = compressor.clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\t// Spans an entire cluster\n\t\t\t\tconst { range: rangeFullCluster, sessionId: sessionId2 } = network.allocateAndSendIds(\n\t\t\t\t\tClient.Client2,\n\t\t\t\t\tclusterCapacity\n\t\t\t\t);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\t// Spans the middle 3 IDs in a cluster of size 5\n\t\t\t\tconst { range: rangeMiddleCluster } = network.allocateAndSendIds(Client.Client2, clusterCapacity - 2);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\t\tconst idsFullCluster = compressor.getIdsFromRange(rangeFullCluster, sessionId2);\n\t\t\t\tfor (let i = 0; i < idsFullCluster.length; i++) {\n\t\t\t\t\texpect(idsFullCluster.get(i)).to.equal(compressor.reservedIdCount + clusterCapacity + i);\n\t\t\t\t}\n\n\t\t\t\tconst idsMiddleCluster = compressor.getIdsFromRange(rangeMiddleCluster, sessionId2);\n\t\t\t\tfor (let i = 0; i < idsMiddleCluster.length; i++) {\n\t\t\t\t\texpect(idsMiddleCluster.get(i)).to.equal(compressor.reservedIdCount + clusterCapacity * 2 + 1 + i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('from a remote session that span multiple clusters', 5, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tconst clusterCapacity = compressor.clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity - 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst { range: rangeSpanningClusters, sessionId } = network.allocateAndSendIds(\n\t\t\t\t\tClient.Client2,\n\t\t\t\t\tclusterCapacity\n\t\t\t\t);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\t\tconst idsSpanningClusters = compressor.getIdsFromRange(rangeSpanningClusters, sessionId);\n\t\t\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t\t\texpect(idsSpanningClusters.get(i)).to.equal(compressor.reservedIdCount + clusterCapacity + 3 + i);\n\t\t\t\t}\n\t\t\t\tfor (let i = 2; i < idsSpanningClusters.length; i++) {\n\t\t\t\t\texpect(idsSpanningClusters.get(i)).to.equal(\n\t\t\t\t\t\tcompressor.reservedIdCount + clusterCapacity * 2 + 3 + i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\titNetwork('does not decompress ids for empty parts of clusters', 2, (network) => {\n\t\t\t// This is a glass box test in that it creates a final ID outside of the ID compressor\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst id = network.getSequencedIdLog(Client.Client2)[0].id;\n\t\t\texpect(isFinalId(id)).to.be.true;\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tconst emptyId = (id + 1) as FinalCompressedId;\n\t\t\texpect(() => network.getCompressor(Client.Client2).decompress(emptyId)).to.throw(\n\t\t\t\t'Compressed ID was not generated by this compressor'\n\t\t\t);\n\t\t});\n\n\t\tdescribe('Finalizing', () => {\n\t\t\titNetwork('can finalize IDs from multiple clients', (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t\t1: 'override1',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can finalize a range when the current cluster is full', 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t\t2: 'override3',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can finalize a range that spans multiple clusters', 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity - 2, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override3',\n\t\t\t\t\t1: 'override4',\n\t\t\t\t\t2: 'override5',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('Serialization', () => {\n\t\t\titNetwork(\n\t\t\t\t'prevents attempts to resume a session from a serialized compressor with no session',\n\t\t\t\t(network) => {\n\t\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t\tconst serializedWithoutLocalState = compressor.serialize(false);\n\t\t\t\t\texpect(() =>\n\t\t\t\t\t\tIdCompressor.deserialize(serializedWithoutLocalState, sessionIds.get(Client.Client2))\n\t\t\t\t\t).to.throw('Cannot resume existing session.');\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('round-trips local state', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t// Some un-acked locals at the end\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 4);\n\t\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(\n\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t);\n\t\t\t\texpect(hasOngoingSession(serializedWithSession)).to.be.true;\n\t\t\t\texpect(hasOngoingSession(serializedNoSession)).to.be.false;\n\t\t\t});\n\n\t\t\titNetwork('can serialize a partially empty cluster', 5, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize a full cluster', 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize full clusters from different clients', 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize clusters of different sizes and clients', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize clusters with overrides', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2, {\n\t\t\t\t\t1: 'override',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t2: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\n\t\t\t\t'packs IDs into a single cluster when a single client generates non-overridden ids',\n\t\t\t\t3,\n\t\t\t\t(network) => {\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 20);\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst [serialized1WithNoSession, serialized1WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized1WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized1WithSession.clusters.length).to.equal(1);\n\t\t\t\t\tconst [serialized3WithNoSession, serialized3WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client3)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized3WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized3WithSession.clusters.length).to.equal(1);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('serializes correctly after unifying duplicate overrides', 3, (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can resume a session and interact with multiple other clients', 3, (network) => {\n\t\t\t\tconst clusterSize = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.goOfflineThenResume(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 2);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can serialize after a large fuzz input', 3, (network) => {\n\t\t\t\tperformFuzzActions(network, Math.PI, true, undefined, true, 1000, 25, (network) => {\n\t\t\t\t\t// Periodically check that everyone in the network has the same serialized state\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst compressors = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\t\tlet deserializedPrev = roundtrip(compressors[0][1], false)[1];\n\t\t\t\t\tfor (let i = 1; i < compressors.length; i++) {\n\t\t\t\t\t\tconst deserializedCur = roundtrip(compressors[i][1], false)[1];\n\t\t\t\t\t\texpect(deserializedPrev.equals(deserializedCur, false)).to.be.true;\n\t\t\t\t\t\tdeserializedPrev = deserializedCur;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('stores override indices relative to their clusters', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, { 0: 'cluster1' });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, { 0: 'cluster2' });\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst serialized = network.getCompressor(Client.Client1).serialize(false);\n\t\t\t\texpect(serialized.clusters.length).to.equal(2);\n\t\t\t\texpect(serialized.clusters[0][2]?.[0][0]).to.equal(0);\n\t\t\t\texpect(serialized.clusters[1][2]?.[0][0]).to.equal(0);\n\t\t\t});\n\t\t});\n\t});\n});\n\ntype NetworkTestFunction = (title: string, test: (network: IdCompressorTestNetwork) => void) => void;\n\ntype NetworkTestFunctionWithCapacity = (\n\ttitle: string,\n\tinitialClusterCapacity: number,\n\ttest: (network: IdCompressorTestNetwork) => void\n) => void;\n\nfunction createNetworkTestFunction(validateAfter: boolean): NetworkTestFunction & NetworkTestFunctionWithCapacity {\n\treturn (\n\t\ttitle: string,\n\t\ttestOrCapacity: ((network: IdCompressorTestNetwork) => void) | number,\n\t\ttest?: (network: IdCompressorTestNetwork) => void\n\t) => {\n\t\tit(title, () => {\n\t\t\tconst hasCapacity = typeof testOrCapacity === 'number';\n\t\t\tconst capacity = hasCapacity ? testOrCapacity : undefined;\n\t\t\t// TODO: This cast can be removed on typescript 4.6\n\t\t\tconst network = new IdCompressorTestNetwork(capacity as number);\n\t\t\t// TODO: This cast can be removed on typescript 4.6\n\t\t\t((hasCapacity ? assertNotUndefined(test) : testOrCapacity) as (network: IdCompressorTestNetwork) => void)(\n\t\t\t\tnetwork\n\t\t\t);\n\t\t\tif (validateAfter) {\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.assertNetworkState();\n\t\t\t}\n\t\t});\n\t};\n}\n\nfunction describeNetwork(title: string, its: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n\n\tdescribe(`${title} (with validation)`, () => {\n\t\tits(createNetworkTestFunction(true));\n\t});\n}\n\nfunction describeNetworkNoValidation(\n\ttitle: string,\n\tits: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void\n) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdConversion.tests.d.ts","sourceRoot":"","sources":["../../src/test/IdConversion.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { expect } from 'chai';
|
|
6
|
+
import { StablePlace, StableRange } from '../ChangeTypes';
|
|
7
|
+
import { convertStablePlaceIds, convertStableRangeIds, convertNodeDataIds } from '../IdConversion';
|
|
8
|
+
import { refreshTestTree, areNodesEquivalent } from './utilities/TestUtilities';
|
|
9
|
+
describe('0_0_2 type conversions', () => {
|
|
10
|
+
const testTree = refreshTestTree();
|
|
11
|
+
it('can convert stable places', () => {
|
|
12
|
+
const stablePlace = StablePlace.after(testTree.left);
|
|
13
|
+
const stablePlaceInternal_0_0_2 = convertStablePlaceIds(stablePlace, convertToStableId);
|
|
14
|
+
const stablePlaceConverted = convertStablePlaceIds(stablePlaceInternal_0_0_2, convertToNodeId);
|
|
15
|
+
expect(stablePlace).to.deep.equal(stablePlaceConverted);
|
|
16
|
+
});
|
|
17
|
+
it('can convert stable ranges', () => {
|
|
18
|
+
const stableRange = StableRange.only(testTree.left);
|
|
19
|
+
const stableRangeInternal_0_0_2 = convertStableRangeIds(stableRange, convertToStableId);
|
|
20
|
+
const stableRangeConverted = convertStableRangeIds(stableRangeInternal_0_0_2, convertToNodeId);
|
|
21
|
+
expect(stableRange).to.deep.equal(stableRangeConverted);
|
|
22
|
+
});
|
|
23
|
+
it('can convert node data', () => {
|
|
24
|
+
const nodeData = testTree;
|
|
25
|
+
const nodeData_0_0_2 = convertNodeDataIds(nodeData, convertToStableId);
|
|
26
|
+
const nodeDataConverted = convertNodeDataIds(nodeData_0_0_2, convertToNodeId);
|
|
27
|
+
expect(areNodesEquivalent(nodeData, nodeDataConverted)).to.be.true;
|
|
28
|
+
});
|
|
29
|
+
function convertToStableId(id) {
|
|
30
|
+
return testTree.convertToStableNodeId(id);
|
|
31
|
+
}
|
|
32
|
+
function convertToNodeId(id) {
|
|
33
|
+
return testTree.convertToNodeId(id);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=IdConversion.tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdConversion.tests.js","sourceRoot":"","sources":["../../src/test/IdConversion.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEnC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACvE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAC9E,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,SAAS,iBAAiB,CAAC,EAAU;QACpC,OAAO,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,eAAe,CAAC,EAAgB;QACxC,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { StablePlace, StableRange } from '../ChangeTypes';\nimport { convertStablePlaceIds, convertStableRangeIds, convertNodeDataIds } from '../IdConversion';\nimport { NodeId, StableNodeId } from '../Identifiers';\nimport { refreshTestTree, areNodesEquivalent } from './utilities/TestUtilities';\n\ndescribe('0_0_2 type conversions', () => {\n\tconst testTree = refreshTestTree();\n\n\tit('can convert stable places', () => {\n\t\tconst stablePlace = StablePlace.after(testTree.left);\n\t\tconst stablePlaceInternal_0_0_2 = convertStablePlaceIds(stablePlace, convertToStableId);\n\t\tconst stablePlaceConverted = convertStablePlaceIds(stablePlaceInternal_0_0_2, convertToNodeId);\n\t\texpect(stablePlace).to.deep.equal(stablePlaceConverted);\n\t});\n\n\tit('can convert stable ranges', () => {\n\t\tconst stableRange = StableRange.only(testTree.left);\n\t\tconst stableRangeInternal_0_0_2 = convertStableRangeIds(stableRange, convertToStableId);\n\t\tconst stableRangeConverted = convertStableRangeIds(stableRangeInternal_0_0_2, convertToNodeId);\n\t\texpect(stableRange).to.deep.equal(stableRangeConverted);\n\t});\n\n\tit('can convert node data', () => {\n\t\tconst nodeData = testTree;\n\t\tconst nodeData_0_0_2 = convertNodeDataIds(nodeData, convertToStableId);\n\t\tconst nodeDataConverted = convertNodeDataIds(nodeData_0_0_2, convertToNodeId);\n\t\texpect(areNodesEquivalent(nodeData, nodeDataConverted)).to.be.true;\n\t});\n\n\tfunction convertToStableId(id: NodeId): StableNodeId {\n\t\treturn testTree.convertToStableNodeId(id);\n\t}\n\n\tfunction convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn testTree.convertToNodeId(id);\n\t}\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyCheckout.tests.d.ts","sourceRoot":"","sources":["../../src/test/LazyCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { expect } from 'chai';
|
|
6
|
+
import { Change, StableRange } from '../ChangeTypes';
|
|
7
|
+
import { LazyCheckout } from '../LazyCheckout';
|
|
8
|
+
import { checkoutTests } from './Checkout.tests';
|
|
9
|
+
import { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities';
|
|
10
|
+
checkoutTests('LazyCheckout', async (tree) => Promise.resolve(new LazyCheckout(tree)), () => {
|
|
11
|
+
it('updates lazily', async () => {
|
|
12
|
+
const { tree } = setUpTestSharedTree();
|
|
13
|
+
const testTree = setUpTestTree(tree);
|
|
14
|
+
const checkout = new LazyCheckout(tree);
|
|
15
|
+
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
16
|
+
tree.applyEdit(Change.delete(StableRange.only(testTree.left)));
|
|
17
|
+
expect(tree.currentView.equals(checkout.currentView)).to.be.false;
|
|
18
|
+
await checkout.waitForPendingUpdates();
|
|
19
|
+
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=LazyCheckout.tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyCheckout.tests.js","sourceRoot":"","sources":["../../src/test/LazyCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/E,aAAa,CACZ,cAAc,EACd,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EACvD,GAAG,EAAE;IACJ,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAClE,MAAM,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CACD,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { Change, StableRange } from '../ChangeTypes';\nimport { LazyCheckout } from '../LazyCheckout';\nimport { checkoutTests } from './Checkout.tests';\nimport { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities';\n\ncheckoutTests(\n\t'LazyCheckout',\n\tasync (tree) => Promise.resolve(new LazyCheckout(tree)),\n\t() => {\n\t\tit('updates lazily', async () => {\n\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst checkout = new LazyCheckout(tree);\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t\ttree.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.false;\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t});\n\t}\n);\n"]}
|