@fluidframework/merge-tree 2.1.0-276985 → 2.1.0
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/.eslintrc.cjs +2 -4
- package/CHANGELOG.md +15 -0
- package/README.md +109 -1
- package/api-extractor/api-extractor.current.json +5 -0
- package/api-extractor/api-extractor.legacy.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/merge-tree.legacy.alpha.api.md +10 -22
- package/api-report/merge-tree.legacy.public.api.md +9 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +65 -17
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -37
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +5 -2
- package/dist/collections/list.js.map +1 -1
- package/dist/collections/rbTree.d.ts +2 -2
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +23 -35
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +4 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/localReference.d.ts +16 -6
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +31 -20
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +0 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +127 -112
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -5
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +29 -20
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +3 -3
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +6 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +5 -0
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/ordinal.d.ts.map +1 -1
- package/dist/ordinal.js +7 -0
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +4 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +101 -53
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +4 -1
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -6
- package/dist/perspective.js.map +1 -1
- package/dist/properties.d.ts +13 -10
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +22 -11
- package/dist/properties.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/referencePositions.d.ts +7 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -0
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +6 -0
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +50 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +7 -3
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +20 -15
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +10 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +14 -10
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +20 -8
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -2
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +8 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +4 -0
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +1 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +3 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +69 -68
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +29 -27
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -4
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +32 -30
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +5 -5
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -1
- package/dist/test/client.apis.spec.js +5 -7
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +125 -103
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -8
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +4 -2
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +10 -10
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +111 -104
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +14 -10
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +12 -12
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +12 -9
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -10
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +87 -84
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +3 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +122 -112
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +7 -7
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +14 -14
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +1 -0
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/dirname.d.cts.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +87 -87
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +3 -3
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +10 -10
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +28 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +165 -165
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +20 -21
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +7 -7
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +13 -13
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +9 -9
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +10 -4
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/properties.spec.js +15 -15
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +4 -4
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +28 -20
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +11 -10
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +96 -57
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +17 -17
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +5 -5
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +6 -6
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +18 -13
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +22 -18
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +6 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +30 -32
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +39 -38
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +5 -5
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +0 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +15 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +50 -46
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +10 -10
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -3
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +7 -2
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +65 -17
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +65 -37
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +5 -2
- package/lib/collections/list.js.map +1 -1
- package/lib/collections/rbTree.d.ts +2 -2
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +23 -35
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +4 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.d.ts +16 -6
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +31 -20
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +0 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +127 -112
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -5
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +29 -20
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +3 -3
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +6 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +5 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js.map +1 -1
- package/lib/ordinal.d.ts.map +1 -1
- package/lib/ordinal.js +7 -0
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +4 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +101 -53
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +4 -1
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +7 -6
- package/lib/perspective.js.map +1 -1
- package/lib/properties.d.ts +13 -10
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +22 -11
- package/lib/properties.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts +7 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +7 -0
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +6 -0
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +50 -21
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +7 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +20 -15
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +10 -5
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +14 -10
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +20 -8
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -2
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +8 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +4 -0
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +1 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +3 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +3 -2
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js +3 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -4
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +26 -24
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.d.ts.map +1 -1
- package/lib/test/client.apis.spec.js +4 -6
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +72 -50
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +12 -7
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +4 -2
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +14 -7
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +13 -9
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +11 -8
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +8 -7
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +14 -11
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +3 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +29 -19
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/dirname.cjs +1 -0
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/dirname.d.cts.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +27 -15
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +4 -4
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +2 -3
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.js +7 -1
- package/lib/test/ordinal.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/properties.spec.js +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +4 -4
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +22 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +8 -7
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.d.ts.map +1 -1
- package/lib/test/revertibles.spec.js +93 -54
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +10 -5
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +6 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +6 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +25 -27
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +37 -36
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +5 -5
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +0 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +6 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js +9 -5
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +9 -9
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +3 -3
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -2
- package/lib/zamboni.js.map +1 -1
- package/package.json +29 -27
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionCollection.ts +71 -28
- package/src/attributionPolicy.ts +14 -9
- package/src/client.ts +120 -71
- package/src/collections/list.ts +9 -6
- package/src/collections/rbTree.ts +62 -71
- package/src/endOfTreeSegment.ts +21 -10
- package/src/localReference.ts +61 -43
- package/src/mergeTree.ts +229 -178
- package/src/mergeTreeNodeWalk.ts +2 -1
- package/src/mergeTreeNodes.ts +59 -46
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +6 -1
- package/src/ops.ts +5 -0
- package/src/ordinal.ts +8 -1
- package/src/partialLengths.ts +143 -87
- package/src/perspective.ts +10 -7
- package/src/properties.ts +36 -18
- package/src/referencePositions.ts +7 -0
- package/src/revertibles.ts +71 -41
- package/src/segmentGroupCollection.ts +8 -6
- package/src/segmentPropertiesManager.ts +28 -24
- package/src/snapshotChunks.ts +12 -7
- package/src/snapshotLoader.ts +20 -17
- package/src/snapshotV1.ts +36 -18
- package/src/snapshotlegacy.ts +7 -5
- package/src/sortedSegmentSet.ts +9 -3
- package/src/sortedSet.ts +7 -3
- package/src/textSegment.ts +9 -9
- package/src/zamboni.ts +14 -10
- package/tsconfig.json +0 -1
package/src/partialLengths.ts
CHANGED
|
@@ -33,7 +33,7 @@ class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number>
|
|
|
33
33
|
public addOrUpdate(
|
|
34
34
|
newItem: PartialSequenceLength,
|
|
35
35
|
update?: (existingItem: PartialSequenceLength, newItem: PartialSequenceLength) => void,
|
|
36
|
-
) {
|
|
36
|
+
): void {
|
|
37
37
|
const prev = this.latestLeq(newItem.seq);
|
|
38
38
|
|
|
39
39
|
if (prev?.seq !== newItem.seq) {
|
|
@@ -92,15 +92,21 @@ class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number>
|
|
|
92
92
|
const mindex = this.latestLeqIndex(minSeq);
|
|
93
93
|
let minLength = 0;
|
|
94
94
|
if (mindex >= 0) {
|
|
95
|
-
|
|
95
|
+
// TODO Non null asserting, why is this not null?
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
97
|
+
minLength = this.keySortedItems[mindex]!.len;
|
|
96
98
|
const seqCount = this.size;
|
|
97
99
|
if (mindex <= seqCount - 1) {
|
|
98
100
|
// Still some entries remaining
|
|
99
101
|
const remainingCount = seqCount - mindex - 1;
|
|
100
102
|
// Copy down
|
|
101
103
|
for (let i = 0; i < remainingCount; i++) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
// TODO Non null asserting, why is this not null?
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
106
|
+
this.keySortedItems[i] = this.keySortedItems[i + mindex + 1]!;
|
|
107
|
+
// TODO Non null asserting, why is this not null?
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
109
|
+
this.keySortedItems[i]!.len -= minLength;
|
|
104
110
|
}
|
|
105
111
|
this.keySortedItems.length = remainingCount;
|
|
106
112
|
}
|
|
@@ -301,7 +307,9 @@ export class PartialSequenceLengths {
|
|
|
301
307
|
let hasInternalChild = false;
|
|
302
308
|
const childPartials: PartialSequenceLengths[] = [];
|
|
303
309
|
for (let i = 0; i < block.childCount; i++) {
|
|
304
|
-
|
|
310
|
+
// TODO Non null asserting, why is this not null?
|
|
311
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
312
|
+
const child = block.children[i]!;
|
|
305
313
|
if (!child.isLeaf()) {
|
|
306
314
|
hasInternalChild = true;
|
|
307
315
|
if (recur) {
|
|
@@ -335,7 +343,9 @@ export class PartialSequenceLengths {
|
|
|
335
343
|
const childOverlapRemoves: LocalPartialSequenceLength[][] = [];
|
|
336
344
|
for (let i = 0; i < childPartialsLen; i++) {
|
|
337
345
|
const { segmentCount, minLength, partialLengths, unsequencedRecords } =
|
|
338
|
-
|
|
346
|
+
// TODO Non null asserting, why is this not null?
|
|
347
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
348
|
+
childPartials[i]!;
|
|
339
349
|
combinedPartialLengths.segmentCount += segmentCount;
|
|
340
350
|
combinedPartialLengths.minLength += minLength;
|
|
341
351
|
childPartialLengths.push(partialLengths.items as PartialSequenceLength[]);
|
|
@@ -352,7 +362,7 @@ export class PartialSequenceLengths {
|
|
|
352
362
|
if (computeLocalPartials) {
|
|
353
363
|
combinedPartialLengths.unsequencedRecords = {
|
|
354
364
|
partialLengths: mergePartialLengths(childUnsequencedPartialLengths),
|
|
355
|
-
overlappingRemoves:
|
|
365
|
+
overlappingRemoves: [...mergeSortedListsBySeq(childOverlapRemoves)],
|
|
356
366
|
cachedOverlappingByRefSeq: new Map(),
|
|
357
367
|
};
|
|
358
368
|
}
|
|
@@ -371,8 +381,8 @@ export class PartialSequenceLengths {
|
|
|
371
381
|
}
|
|
372
382
|
|
|
373
383
|
/**
|
|
374
|
-
*
|
|
375
|
-
* MergeBlock.
|
|
384
|
+
* Creates and returns a PartialSequenceLengths structure that tracks the lengths of only the
|
|
385
|
+
* leaf children of the provided MergeBlock.
|
|
376
386
|
*/
|
|
377
387
|
private static fromLeaves(
|
|
378
388
|
block: MergeBlock,
|
|
@@ -387,7 +397,9 @@ export class PartialSequenceLengths {
|
|
|
387
397
|
combinedPartialLengths.segmentCount = block.childCount;
|
|
388
398
|
|
|
389
399
|
for (let i = 0; i < block.childCount; i++) {
|
|
390
|
-
|
|
400
|
+
// TODO Non null asserting, why is this not null?
|
|
401
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
402
|
+
const child = block.children[i]!;
|
|
391
403
|
if (child.isLeaf()) {
|
|
392
404
|
// Leaf segment
|
|
393
405
|
const segment = child;
|
|
@@ -438,7 +450,10 @@ export class PartialSequenceLengths {
|
|
|
438
450
|
return combinedPartialLengths;
|
|
439
451
|
}
|
|
440
452
|
|
|
441
|
-
private static getOverlapClients(
|
|
453
|
+
private static getOverlapClients(
|
|
454
|
+
overlapClientIds: number[],
|
|
455
|
+
seglen: number,
|
|
456
|
+
): RedBlackTree<number, IOverlapClient> {
|
|
442
457
|
const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);
|
|
443
458
|
for (const clientId of overlapClientIds) {
|
|
444
459
|
bst.put(clientId, { clientId, seglen });
|
|
@@ -450,14 +465,14 @@ export class PartialSequenceLengths {
|
|
|
450
465
|
partialLength: PartialSequenceLength,
|
|
451
466
|
overlapRemoveClientIds: number[],
|
|
452
467
|
seglen: number,
|
|
453
|
-
) {
|
|
468
|
+
): void {
|
|
454
469
|
if (partialLength.overlapRemoveClients) {
|
|
455
470
|
for (const clientId of overlapRemoveClientIds) {
|
|
456
471
|
const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);
|
|
457
|
-
if (
|
|
458
|
-
partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });
|
|
459
|
-
} else {
|
|
472
|
+
if (overlapClientNode) {
|
|
460
473
|
overlapClientNode.data.seglen += seglen;
|
|
474
|
+
} else {
|
|
475
|
+
partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });
|
|
461
476
|
}
|
|
462
477
|
}
|
|
463
478
|
} else {
|
|
@@ -472,14 +487,14 @@ export class PartialSequenceLengths {
|
|
|
472
487
|
partialLength: PartialSequenceLength,
|
|
473
488
|
overlapMoveClientIds: number[],
|
|
474
489
|
seglen: number,
|
|
475
|
-
) {
|
|
490
|
+
): void {
|
|
476
491
|
if (partialLength.overlapObliterateClients) {
|
|
477
492
|
for (const clientId of overlapMoveClientIds) {
|
|
478
493
|
const overlapClientNode = partialLength.overlapObliterateClients.get(clientId);
|
|
479
|
-
if (
|
|
480
|
-
partialLength.overlapObliterateClients.put(clientId, { clientId, seglen });
|
|
481
|
-
} else {
|
|
494
|
+
if (overlapClientNode) {
|
|
482
495
|
overlapClientNode.data.seglen += seglen;
|
|
496
|
+
} else {
|
|
497
|
+
partialLength.overlapObliterateClients.put(clientId, { clientId, seglen });
|
|
483
498
|
}
|
|
484
499
|
}
|
|
485
500
|
} else {
|
|
@@ -504,7 +519,7 @@ export class PartialSequenceLengths {
|
|
|
504
519
|
segment: ISegment,
|
|
505
520
|
firstGte: PartialSequenceLength,
|
|
506
521
|
clientIds: number[],
|
|
507
|
-
) {
|
|
522
|
+
): void {
|
|
508
523
|
const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
|
|
509
524
|
|
|
510
525
|
PartialSequenceLengths.accumulateMoveClientOverlap(
|
|
@@ -527,6 +542,8 @@ export class PartialSequenceLengths {
|
|
|
527
542
|
}
|
|
528
543
|
|
|
529
544
|
/**
|
|
545
|
+
* Tracks which clients have made concurrent obliterates.
|
|
546
|
+
*
|
|
530
547
|
* @param obliterateOverlapLen - Length of segment with overlap
|
|
531
548
|
* @param clientIds - Ids of clients that have concurrently obliterated this
|
|
532
549
|
* segment
|
|
@@ -562,7 +579,7 @@ export class PartialSequenceLengths {
|
|
|
562
579
|
clientId: number,
|
|
563
580
|
removeClientOverlap: number[] | undefined,
|
|
564
581
|
moveClientOverlap: number[] | undefined,
|
|
565
|
-
) {
|
|
582
|
+
): void {
|
|
566
583
|
const firstGte = partials.firstGte(seq);
|
|
567
584
|
|
|
568
585
|
let partialLengthEntry: PartialSequenceLength;
|
|
@@ -636,7 +653,7 @@ export class PartialSequenceLengths {
|
|
|
636
653
|
segment: ISegment,
|
|
637
654
|
removalInfo?: IRemovalInfo,
|
|
638
655
|
moveInfo?: IMoveInfo,
|
|
639
|
-
) {
|
|
656
|
+
): void {
|
|
640
657
|
const removalIsLocal =
|
|
641
658
|
!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;
|
|
642
659
|
const moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;
|
|
@@ -670,13 +687,17 @@ export class PartialSequenceLengths {
|
|
|
670
687
|
segmentLen = -segmentLen;
|
|
671
688
|
// The client who performed the remove is always stored
|
|
672
689
|
// in the first position of removalInfo.
|
|
673
|
-
|
|
690
|
+
// TODO Non null asserting, why is this not null?
|
|
691
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
692
|
+
clientId = removalInfo.removedClientIds[0]!;
|
|
674
693
|
const hasOverlap = removalInfo.removedClientIds.length > 1;
|
|
675
694
|
removeClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;
|
|
676
695
|
} else if (moveInfo) {
|
|
677
696
|
// The client who performed the move is always stored
|
|
678
697
|
// in the first position of moveInfo.
|
|
679
|
-
|
|
698
|
+
// TODO Non null asserting, why is this not null?
|
|
699
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
700
|
+
clientId = moveInfo.movedClientIds[0]!;
|
|
680
701
|
|
|
681
702
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
682
703
|
seqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;
|
|
@@ -712,7 +733,9 @@ export class PartialSequenceLengths {
|
|
|
712
733
|
if (moveInfo && removalInfo && removeHappenedFirst && !moveIsLocal) {
|
|
713
734
|
// The client who performed the remove is always stored
|
|
714
735
|
// in the first position of removalInfo.
|
|
715
|
-
|
|
736
|
+
// TODO Non null asserting, why is this not null?
|
|
737
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
738
|
+
const moveClientId = moveInfo.movedClientIds[0]!;
|
|
716
739
|
const hasOverlap = moveInfo.movedClientIds.length > 1;
|
|
717
740
|
|
|
718
741
|
PartialSequenceLengths.updatePartialsAfterInsertion(
|
|
@@ -735,7 +758,9 @@ export class PartialSequenceLengths {
|
|
|
735
758
|
: removalInfo.removedSeq;
|
|
736
759
|
// The client who performed the remove is always stored
|
|
737
760
|
// in the first position of removalInfo.
|
|
738
|
-
|
|
761
|
+
// TODO Non null asserting, why is this not null?
|
|
762
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
763
|
+
const removeClientId = removalInfo.removedClientIds[0]!;
|
|
739
764
|
const hasOverlap = removalInfo.removedClientIds.length > 1;
|
|
740
765
|
|
|
741
766
|
PartialSequenceLengths.updatePartialsAfterInsertion(
|
|
@@ -781,7 +806,11 @@ export class PartialSequenceLengths {
|
|
|
781
806
|
localIndexFirstGTE < unsequencedRecords.overlappingRemoves.length;
|
|
782
807
|
localIndexFirstGTE++
|
|
783
808
|
) {
|
|
784
|
-
if (
|
|
809
|
+
if (
|
|
810
|
+
// TODO Non null asserting, why is this not null?
|
|
811
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
812
|
+
unsequencedRecords.overlappingRemoves[localIndexFirstGTE]!.seq >= seqOrLocalSeq
|
|
813
|
+
) {
|
|
785
814
|
break;
|
|
786
815
|
}
|
|
787
816
|
}
|
|
@@ -807,7 +836,7 @@ export class PartialSequenceLengths {
|
|
|
807
836
|
seqSeglen: number,
|
|
808
837
|
remoteObliteratedLen?: number,
|
|
809
838
|
clientId?: number,
|
|
810
|
-
) {
|
|
839
|
+
): void {
|
|
811
840
|
let seqPartialLen: PartialSequenceLength | undefined;
|
|
812
841
|
let penultPartialLen: PartialSequenceLength | undefined;
|
|
813
842
|
let pLen = partialLengths.latestLeq(seq);
|
|
@@ -822,7 +851,7 @@ export class PartialSequenceLengths {
|
|
|
822
851
|
penultPartialLen = pLen;
|
|
823
852
|
}
|
|
824
853
|
}
|
|
825
|
-
const len = penultPartialLen
|
|
854
|
+
const len = penultPartialLen === undefined ? seqSeglen : penultPartialLen.len + seqSeglen;
|
|
826
855
|
if (seqPartialLen === undefined) {
|
|
827
856
|
seqPartialLen = {
|
|
828
857
|
clientId,
|
|
@@ -903,25 +932,16 @@ export class PartialSequenceLengths {
|
|
|
903
932
|
clientId: number,
|
|
904
933
|
// eslint-disable-next-line import/no-deprecated
|
|
905
934
|
collabWindow: CollaborationWindow,
|
|
906
|
-
) {
|
|
935
|
+
): void {
|
|
907
936
|
let seqSeglen = 0;
|
|
908
937
|
let remoteObliteratedLen = 0;
|
|
909
938
|
let segCount = 0;
|
|
910
939
|
// Compute length for seq across children
|
|
911
940
|
for (let i = 0; i < node.childCount; i++) {
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
const branchPartialLengths = childBlock.partialLengths!;
|
|
917
|
-
const partialLengths = branchPartialLengths.partialLengths;
|
|
918
|
-
const leqPartial = partialLengths.latestLeq(seq);
|
|
919
|
-
if (leqPartial && leqPartial.seq === seq) {
|
|
920
|
-
seqSeglen += leqPartial.seglen;
|
|
921
|
-
remoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;
|
|
922
|
-
}
|
|
923
|
-
segCount += branchPartialLengths.segmentCount;
|
|
924
|
-
} else {
|
|
941
|
+
// TODO Non null asserting, why is this not null?
|
|
942
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
943
|
+
const child = node.children[i]!;
|
|
944
|
+
if (child.isLeaf()) {
|
|
925
945
|
const segment = child;
|
|
926
946
|
const removalInfo = toRemovalInfo(segment);
|
|
927
947
|
const moveInfo = toMoveInfo(segment);
|
|
@@ -978,6 +998,17 @@ export class PartialSequenceLengths {
|
|
|
978
998
|
}
|
|
979
999
|
}
|
|
980
1000
|
segCount++;
|
|
1001
|
+
} else {
|
|
1002
|
+
const childBlock = child;
|
|
1003
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1004
|
+
const branchPartialLengths = childBlock.partialLengths!;
|
|
1005
|
+
const partialLengths = branchPartialLengths.partialLengths;
|
|
1006
|
+
const leqPartial = partialLengths.latestLeq(seq);
|
|
1007
|
+
if (leqPartial && leqPartial.seq === seq) {
|
|
1008
|
+
seqSeglen += leqPartial.seglen;
|
|
1009
|
+
remoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;
|
|
1010
|
+
}
|
|
1011
|
+
segCount += branchPartialLengths.segmentCount;
|
|
981
1012
|
}
|
|
982
1013
|
}
|
|
983
1014
|
this.segmentCount = segCount;
|
|
@@ -992,7 +1023,9 @@ export class PartialSequenceLengths {
|
|
|
992
1023
|
);
|
|
993
1024
|
this.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();
|
|
994
1025
|
PartialSequenceLengths.addSeq(
|
|
995
|
-
this
|
|
1026
|
+
// TODO Non null asserting, why is this not null?
|
|
1027
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1028
|
+
this.clientSeqNumbers[clientId]!,
|
|
996
1029
|
seq,
|
|
997
1030
|
seqSeglen + remoteObliteratedLen,
|
|
998
1031
|
undefined,
|
|
@@ -1015,15 +1048,19 @@ export class PartialSequenceLengths {
|
|
|
1015
1048
|
* Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object
|
|
1016
1049
|
* constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.
|
|
1017
1050
|
*/
|
|
1018
|
-
public getPartialLength(refSeq: number, clientId: number, localSeq?: number) {
|
|
1051
|
+
public getPartialLength(refSeq: number, clientId: number, localSeq?: number): number {
|
|
1019
1052
|
let pLen = this.minLength;
|
|
1020
1053
|
const cliLatestIndex = this.cliLatest(clientId);
|
|
1021
|
-
|
|
1054
|
+
// TODO Non null asserting, why is this not null?
|
|
1055
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1056
|
+
const cliSeq = this.clientSeqNumbers[clientId]!;
|
|
1022
1057
|
pLen += this.partialLengths.latestLeq(refSeq)?.len ?? 0;
|
|
1023
1058
|
|
|
1024
1059
|
if (localSeq === undefined) {
|
|
1025
1060
|
if (cliLatestIndex >= 0) {
|
|
1026
|
-
|
|
1061
|
+
// TODO Non null asserting, why is this not null?
|
|
1062
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1063
|
+
const cliLatest = cliSeq.items[cliLatestIndex]!;
|
|
1027
1064
|
if (cliLatest.seq > refSeq) {
|
|
1028
1065
|
// The client has local edits after refSeq, add in the length adjustments
|
|
1029
1066
|
pLen += cliLatest.len;
|
|
@@ -1103,19 +1140,21 @@ export class PartialSequenceLengths {
|
|
|
1103
1140
|
return overlap?.len ?? 0;
|
|
1104
1141
|
}
|
|
1105
1142
|
|
|
1106
|
-
public toString(glc?: (id: number) => string, indentCount = 0) {
|
|
1143
|
+
public toString(glc?: (id: number) => string, indentCount = 0): string {
|
|
1107
1144
|
let buf = "";
|
|
1108
1145
|
for (const partial of this.partialLengths.items) {
|
|
1109
1146
|
buf += `(${partial.seq},${partial.len}) `;
|
|
1110
1147
|
}
|
|
1111
1148
|
|
|
1112
|
-
//
|
|
1149
|
+
// TODO Non null asserting, why is this not null?
|
|
1150
|
+
// eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax, guard-for-in
|
|
1113
1151
|
for (const clientId in this.clientSeqNumbers) {
|
|
1114
|
-
|
|
1152
|
+
const seqNumber = this.clientSeqNumbers[clientId];
|
|
1153
|
+
if (seqNumber !== undefined && seqNumber.size > 0) {
|
|
1115
1154
|
buf += `Client `;
|
|
1116
1155
|
buf += glc ? `${glc(+clientId)}` : `${clientId}`;
|
|
1117
1156
|
buf += "[";
|
|
1118
|
-
for (const partial of
|
|
1157
|
+
for (const partial of seqNumber.items) {
|
|
1119
1158
|
buf += `(${partial.seq},${partial.len})`;
|
|
1120
1159
|
}
|
|
1121
1160
|
buf += "]";
|
|
@@ -1127,7 +1166,7 @@ export class PartialSequenceLengths {
|
|
|
1127
1166
|
|
|
1128
1167
|
// Clear away partial sums for sequence numbers earlier than the current window
|
|
1129
1168
|
// eslint-disable-next-line import/no-deprecated
|
|
1130
|
-
private zamboni(segmentWindow: CollaborationWindow) {
|
|
1169
|
+
private zamboni(segmentWindow: CollaborationWindow): void {
|
|
1131
1170
|
this.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);
|
|
1132
1171
|
this.minSeq = segmentWindow.minSeq;
|
|
1133
1172
|
// eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax
|
|
@@ -1139,14 +1178,16 @@ export class PartialSequenceLengths {
|
|
|
1139
1178
|
}
|
|
1140
1179
|
}
|
|
1141
1180
|
|
|
1142
|
-
private addClientSeqNumber(clientId: number, seq: number, seglen: number) {
|
|
1181
|
+
private addClientSeqNumber(clientId: number, seq: number, seglen: number): void {
|
|
1143
1182
|
this.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();
|
|
1144
|
-
|
|
1183
|
+
// TODO Non null asserting, why is this not null?
|
|
1184
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1185
|
+
const cli = this.clientSeqNumbers[clientId]!;
|
|
1145
1186
|
cli.addOrUpdate({ seq, len: 0, seglen });
|
|
1146
1187
|
}
|
|
1147
1188
|
|
|
1148
1189
|
// Assumes sequence number already coalesced and that this is called in increasing `seq` order.
|
|
1149
|
-
private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {
|
|
1190
|
+
private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength): void {
|
|
1150
1191
|
const seglen = partialLength.seglen + (partialLength.remoteObliteratedLen ?? 0);
|
|
1151
1192
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1152
1193
|
this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, seglen);
|
|
@@ -1174,7 +1215,7 @@ export class PartialSequenceLengths {
|
|
|
1174
1215
|
return this.clientSeqNumbers[clientId]?.latestLeq(refSeq);
|
|
1175
1216
|
}
|
|
1176
1217
|
|
|
1177
|
-
private cliLatest(clientId: number) {
|
|
1218
|
+
private cliLatest(clientId: number): number {
|
|
1178
1219
|
const cliSeqs = this.clientSeqNumbers[clientId];
|
|
1179
1220
|
return cliSeqs && cliSeqs.size > 0 ? cliSeqs.size - 1 : -1;
|
|
1180
1221
|
}
|
|
@@ -1268,7 +1309,7 @@ export function verifyExpectedPartialLengths(
|
|
|
1268
1309
|
refSeq: number,
|
|
1269
1310
|
clientId: number,
|
|
1270
1311
|
localSeq?: number,
|
|
1271
|
-
) {
|
|
1312
|
+
): void {
|
|
1272
1313
|
if (
|
|
1273
1314
|
(!mergeTree.collabWindow.collaborating || mergeTree.collabWindow.clientId === clientId) &&
|
|
1274
1315
|
(node.isLeaf() || localSeq === undefined)
|
|
@@ -1301,7 +1342,7 @@ export function verifyExpectedPartialLengths(
|
|
|
1301
1342
|
}
|
|
1302
1343
|
}
|
|
1303
1344
|
|
|
1304
|
-
export function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths) {
|
|
1345
|
+
export function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths): void {
|
|
1305
1346
|
if (partialSeqLengths["clientSeqNumbers"]) {
|
|
1306
1347
|
for (const cliSeq of partialSeqLengths["clientSeqNumbers"]) {
|
|
1307
1348
|
if (cliSeq) {
|
|
@@ -1343,6 +1384,27 @@ function cloneOverlapRemoveClients(
|
|
|
1343
1384
|
return newTree;
|
|
1344
1385
|
}
|
|
1345
1386
|
|
|
1387
|
+
function combineForOverlapClients(
|
|
1388
|
+
treeA: RedBlackTree<number, IOverlapClient> | undefined,
|
|
1389
|
+
treeB: RedBlackTree<number, IOverlapClient> | undefined,
|
|
1390
|
+
): RedBlackTree<number, IOverlapClient> | undefined {
|
|
1391
|
+
if (treeA) {
|
|
1392
|
+
if (treeB) {
|
|
1393
|
+
treeB.map((bProp: Property<number, IOverlapClient>) => {
|
|
1394
|
+
const aProp = treeA.get(bProp.key);
|
|
1395
|
+
if (aProp) {
|
|
1396
|
+
aProp.data.seglen += bProp.data.seglen;
|
|
1397
|
+
} else {
|
|
1398
|
+
treeA.put(bProp.data.clientId, { ...bProp.data });
|
|
1399
|
+
}
|
|
1400
|
+
return true;
|
|
1401
|
+
});
|
|
1402
|
+
}
|
|
1403
|
+
} else {
|
|
1404
|
+
return cloneOverlapRemoveClients(treeB);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1346
1408
|
/**
|
|
1347
1409
|
* Combines the `overlapRemoveClients` and `overlapObliterateClients` fields of
|
|
1348
1410
|
* two `PartialSequenceLength` objects, modifying the first PartialSequenceLength's
|
|
@@ -1350,34 +1412,19 @@ function cloneOverlapRemoveClients(
|
|
|
1350
1412
|
*
|
|
1351
1413
|
* Combination is performed additively on `seglen` on a per-client basis.
|
|
1352
1414
|
*/
|
|
1353
|
-
export function combineOverlapClients(
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
const aProp = treeA.get(bProp.key);
|
|
1362
|
-
if (aProp) {
|
|
1363
|
-
aProp.data.seglen += bProp.data.seglen;
|
|
1364
|
-
} else {
|
|
1365
|
-
treeA.put(bProp.data.clientId, { ...bProp.data });
|
|
1366
|
-
}
|
|
1367
|
-
return true;
|
|
1368
|
-
});
|
|
1369
|
-
}
|
|
1370
|
-
} else {
|
|
1371
|
-
return cloneOverlapRemoveClients(treeB);
|
|
1372
|
-
}
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
|
-
const overlapRemoveClients = combine(a.overlapRemoveClients, b.overlapRemoveClients);
|
|
1415
|
+
export function combineOverlapClients(
|
|
1416
|
+
a: PartialSequenceLength,
|
|
1417
|
+
b: PartialSequenceLength,
|
|
1418
|
+
): void {
|
|
1419
|
+
const overlapRemoveClients = combineForOverlapClients(
|
|
1420
|
+
a.overlapRemoveClients,
|
|
1421
|
+
b.overlapRemoveClients,
|
|
1422
|
+
);
|
|
1376
1423
|
if (overlapRemoveClients) {
|
|
1377
1424
|
a.overlapRemoveClients = overlapRemoveClients;
|
|
1378
1425
|
}
|
|
1379
1426
|
|
|
1380
|
-
const overlapObliterateClients =
|
|
1427
|
+
const overlapObliterateClients = combineForOverlapClients(
|
|
1381
1428
|
a.overlapObliterateClients,
|
|
1382
1429
|
b.overlapObliterateClients,
|
|
1383
1430
|
);
|
|
@@ -1433,7 +1480,7 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
|
|
|
1433
1480
|
private readonly nextSmallestIndex: number[];
|
|
1434
1481
|
|
|
1435
1482
|
constructor(private readonly sublists: T[][]) {
|
|
1436
|
-
this.nextSmallestIndex =
|
|
1483
|
+
this.nextSmallestIndex = Array.from({ length: sublists.length });
|
|
1437
1484
|
for (let i = 0; i < sublists.length; i++) {
|
|
1438
1485
|
this.nextSmallestIndex[i] = 0;
|
|
1439
1486
|
}
|
|
@@ -1444,9 +1491,16 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
|
|
|
1444
1491
|
let currentMin: T | undefined;
|
|
1445
1492
|
let currentMinIndex: number | undefined;
|
|
1446
1493
|
for (let i = 0; i < len; i++) {
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1494
|
+
// TODO Non null asserting, why is this not null?
|
|
1495
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1496
|
+
const candidateIndex = this.nextSmallestIndex[i]!;
|
|
1497
|
+
// TODO Non null asserting, why is this not null?
|
|
1498
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1499
|
+
const list = this.sublists[i]!;
|
|
1500
|
+
if (candidateIndex < list.length) {
|
|
1501
|
+
// TODO Non null asserting, why is this not null?
|
|
1502
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1503
|
+
const candidate = list[candidateIndex]!;
|
|
1450
1504
|
if (!currentMin || candidate.seq < currentMin.seq) {
|
|
1451
1505
|
currentMin = candidate;
|
|
1452
1506
|
currentMinIndex = i;
|
|
@@ -1470,7 +1524,9 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
|
|
|
1470
1524
|
function insertIntoList<T>(list: T[], index: number, elem: T): void {
|
|
1471
1525
|
if (index < list.length) {
|
|
1472
1526
|
for (let k = list.length; k > index; k--) {
|
|
1473
|
-
|
|
1527
|
+
// TODO Non null asserting, why is this not null?
|
|
1528
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1529
|
+
list[k] = list[k - 1]!;
|
|
1474
1530
|
}
|
|
1475
1531
|
list[index] = elem;
|
|
1476
1532
|
} else {
|
package/src/perspective.ts
CHANGED
|
@@ -49,7 +49,7 @@ export class PerspectiveImpl implements Perspective {
|
|
|
49
49
|
*/
|
|
50
50
|
public nextSegment(segment: ISegment, forward: boolean = true): ISegment {
|
|
51
51
|
let next: ISegment | undefined;
|
|
52
|
-
const action = (seg: ISegment) => {
|
|
52
|
+
const action = (seg: ISegment): boolean | undefined => {
|
|
53
53
|
if (isSegmentPresent(seg, this._seqTime)) {
|
|
54
54
|
next = seg;
|
|
55
55
|
return LeafAction.Exit;
|
|
@@ -60,6 +60,7 @@ export class PerspectiveImpl implements Perspective {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
+
* Finds the segment prior to the given segment.
|
|
63
64
|
* @param segment - The segment to start from.
|
|
64
65
|
* @returns the previous segment, or the start of the tree if there is no previous segment.
|
|
65
66
|
* @remarks This is a convenient equivalent to calling `nextSegment(segment, false)`.
|
|
@@ -70,6 +71,7 @@ export class PerspectiveImpl implements Perspective {
|
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
/**
|
|
74
|
+
* Determines if the given segment was removed before the given perspective.
|
|
73
75
|
* @param seg - The segment to check.
|
|
74
76
|
* @param seq - The latest sequence number to consider.
|
|
75
77
|
* @param localSeq - The latest local sequence number to consider.
|
|
@@ -87,6 +89,7 @@ export function wasRemovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime):
|
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
/**
|
|
92
|
+
* Determines if the given segment was moved before the given perspective.
|
|
90
93
|
* @param seg - The segment to check.
|
|
91
94
|
* @param refSeq - The latest sequence number to consider.
|
|
92
95
|
* @param localSeq - The latest local sequence number to consider.
|
|
@@ -111,7 +114,7 @@ export function wasRemovedOrMovedBefore(seg: ISegment, seqTime: SeqTime): boolea
|
|
|
111
114
|
}
|
|
112
115
|
|
|
113
116
|
/**
|
|
114
|
-
*
|
|
117
|
+
* Determines if the given segment is present in the given perspective.
|
|
115
118
|
* @param seg - The segment to check.
|
|
116
119
|
* @param seqTime - The latest sequence number and local sequence number to consider.
|
|
117
120
|
* @returns true iff this segment was inserted before the given perspective,
|
|
@@ -126,13 +129,13 @@ export function isSegmentPresent(seg: ISegment, seqTime: SeqTime): boolean {
|
|
|
126
129
|
if (!seqLTE(seg.seq, refSeq)) {
|
|
127
130
|
return false;
|
|
128
131
|
}
|
|
129
|
-
} else if (
|
|
130
|
-
// seg.seq === UnassignedSequenceNumber
|
|
132
|
+
} else if (
|
|
133
|
+
seg.localSeq !== undefined && // seg.seq === UnassignedSequenceNumber
|
|
131
134
|
// If the current perspective does not include local sequence numbers,
|
|
132
135
|
// then this segment does not exist yet.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
+
(localSeq === undefined || seg.localSeq > localSeq)
|
|
137
|
+
) {
|
|
138
|
+
return false;
|
|
136
139
|
}
|
|
137
140
|
}
|
|
138
141
|
if (wasRemovedOrMovedBefore(seg, seqTime)) {
|