@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/client.ts
CHANGED
|
@@ -73,7 +73,6 @@ import {
|
|
|
73
73
|
MergeTreeDeltaType,
|
|
74
74
|
ReferenceType,
|
|
75
75
|
} from "./ops.js";
|
|
76
|
-
// eslint-disable-next-line import/no-deprecated
|
|
77
76
|
import { PropertySet, createMap } from "./properties.js";
|
|
78
77
|
import { DetachedReferencePosition, ReferencePosition } from "./referencePositions.js";
|
|
79
78
|
import { SnapshotLoader } from "./snapshotLoader.js";
|
|
@@ -161,14 +160,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
161
160
|
public readonly specToSegment: (spec: IJSONSegment) => ISegment,
|
|
162
161
|
public readonly logger: ITelemetryLoggerExt,
|
|
163
162
|
options?: IMergeTreeOptions & PropertySet,
|
|
164
|
-
private readonly getMinInFlightRefSeq: () => number | undefined = () =>
|
|
163
|
+
private readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>
|
|
164
|
+
undefined,
|
|
165
165
|
) {
|
|
166
166
|
super();
|
|
167
167
|
this._mergeTree = new MergeTree(options);
|
|
168
|
-
this._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {
|
|
168
|
+
this._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {
|
|
169
169
|
this.emit("delta", opArgs, deltaArgs, this);
|
|
170
170
|
};
|
|
171
|
-
this._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs) => {
|
|
171
|
+
this._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs): void => {
|
|
172
172
|
this.emit("maintenance", args, opArgs, this);
|
|
173
173
|
};
|
|
174
174
|
|
|
@@ -204,7 +204,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
204
204
|
return node?.data;
|
|
205
205
|
}
|
|
206
206
|
// eslint-disable-next-line import/no-deprecated
|
|
207
|
-
const taken: SegmentGroup[] =
|
|
207
|
+
const taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });
|
|
208
208
|
for (let i = taken.length - 1; i >= 0; i--) {
|
|
209
209
|
taken[i] = node!.data;
|
|
210
210
|
node = node!.prev;
|
|
@@ -271,6 +271,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
/**
|
|
274
|
+
* Create and insert a segment at the specified position.
|
|
274
275
|
* @param pos - The position to insert the segment at
|
|
275
276
|
* @param segment - The segment to insert
|
|
276
277
|
*/
|
|
@@ -284,6 +285,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
284
285
|
}
|
|
285
286
|
|
|
286
287
|
/**
|
|
288
|
+
* Create and insert a segment at the specified reference position.
|
|
287
289
|
* @param refPos - The reference position to insert the segment at
|
|
288
290
|
* @param segment - The segment to insert
|
|
289
291
|
*/
|
|
@@ -341,7 +343,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
341
343
|
): boolean {
|
|
342
344
|
return walkAllChildSegments(
|
|
343
345
|
this._mergeTree.root,
|
|
344
|
-
accum === undefined ? action : (seg) => action(seg, accum),
|
|
346
|
+
accum === undefined ? action : (seg): boolean => action(seg, accum),
|
|
345
347
|
);
|
|
346
348
|
}
|
|
347
349
|
|
|
@@ -434,7 +436,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
434
436
|
/**
|
|
435
437
|
* Removes a `LocalReferencePosition` from this client.
|
|
436
438
|
*/
|
|
437
|
-
public removeLocalReferencePosition(
|
|
439
|
+
public removeLocalReferencePosition(
|
|
440
|
+
lref: LocalReferencePosition,
|
|
441
|
+
): LocalReferencePosition | undefined {
|
|
438
442
|
return this._mergeTree.removeLocalReferencePosition(lref);
|
|
439
443
|
}
|
|
440
444
|
|
|
@@ -455,7 +459,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
455
459
|
* and convert the position to a character position.
|
|
456
460
|
* @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.
|
|
457
461
|
*/
|
|
458
|
-
public posFromRelativePos(relativePos: IRelativePosition) {
|
|
462
|
+
public posFromRelativePos(relativePos: IRelativePosition): number {
|
|
459
463
|
return this._mergeTree.posFromRelativePos(relativePos);
|
|
460
464
|
}
|
|
461
465
|
|
|
@@ -466,7 +470,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
466
470
|
/**
|
|
467
471
|
* Revert an op
|
|
468
472
|
*/
|
|
469
|
-
public rollback?(op:
|
|
473
|
+
public rollback?(op: unknown, localOpMetadata: unknown): void {
|
|
470
474
|
// eslint-disable-next-line import/no-deprecated
|
|
471
475
|
this._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);
|
|
472
476
|
}
|
|
@@ -553,6 +557,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
553
557
|
const clientArgs = this.getClientSequenceArgs(opArgs);
|
|
554
558
|
const range = this.getValidOpRange(op, clientArgs);
|
|
555
559
|
|
|
560
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
556
561
|
const segments = [this.specToSegment(op.seg)];
|
|
557
562
|
|
|
558
563
|
this._mergeTree.insertSegments(
|
|
@@ -615,10 +620,11 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
615
620
|
}
|
|
616
621
|
// Validate end if not insert, or insert has end
|
|
617
622
|
//
|
|
618
|
-
if (
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
623
|
+
if (
|
|
624
|
+
(op.type !== MergeTreeDeltaType.INSERT || end !== undefined) &&
|
|
625
|
+
(end === undefined || end <= start!)
|
|
626
|
+
) {
|
|
627
|
+
invalidPositions.push("end");
|
|
622
628
|
}
|
|
623
629
|
|
|
624
630
|
if (op.type === MergeTreeDeltaType.OBLITERATE && end !== undefined && end > length) {
|
|
@@ -654,18 +660,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
654
660
|
| ISequencedDocumentMessage
|
|
655
661
|
| Pick<ISequencedDocumentMessage, "referenceSequenceNumber" | "clientId">
|
|
656
662
|
| undefined,
|
|
657
|
-
) {
|
|
663
|
+
): {
|
|
664
|
+
clientId: number;
|
|
665
|
+
referenceSequenceNumber: number;
|
|
666
|
+
sequenceNumber: number;
|
|
667
|
+
} {
|
|
658
668
|
// If there this no sequenced message, then the op is local
|
|
659
669
|
// and unacked, so use this clients sequenced args
|
|
660
670
|
//
|
|
661
|
-
if (
|
|
662
|
-
const segWindow = this.getCollabWindow();
|
|
663
|
-
return {
|
|
664
|
-
clientId: segWindow.clientId,
|
|
665
|
-
referenceSequenceNumber: segWindow.currentSeq,
|
|
666
|
-
sequenceNumber: this.getLocalSequenceNumber(),
|
|
667
|
-
};
|
|
668
|
-
} else {
|
|
671
|
+
if (sequencedMessage) {
|
|
669
672
|
return {
|
|
670
673
|
clientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),
|
|
671
674
|
referenceSequenceNumber: sequencedMessage.referenceSequenceNumber,
|
|
@@ -673,6 +676,13 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
673
676
|
// return value isn't expected to have it either.
|
|
674
677
|
sequenceNumber: (sequencedMessage as ISequencedDocumentMessage).sequenceNumber,
|
|
675
678
|
};
|
|
679
|
+
} else {
|
|
680
|
+
const segWindow = this.getCollabWindow();
|
|
681
|
+
return {
|
|
682
|
+
clientId: segWindow.clientId,
|
|
683
|
+
referenceSequenceNumber: segWindow.currentSeq,
|
|
684
|
+
sequenceNumber: this.getLocalSequenceNumber(),
|
|
685
|
+
};
|
|
676
686
|
}
|
|
677
687
|
}
|
|
678
688
|
|
|
@@ -684,7 +694,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
684
694
|
return this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);
|
|
685
695
|
}
|
|
686
696
|
|
|
687
|
-
private ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs) {
|
|
697
|
+
private ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs): void {
|
|
688
698
|
if (opArgs.op.type === MergeTreeDeltaType.GROUP) {
|
|
689
699
|
for (const memberOp of opArgs.op.ops) {
|
|
690
700
|
this._mergeTree.ackPendingSegment({
|
|
@@ -698,27 +708,29 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
698
708
|
}
|
|
699
709
|
}
|
|
700
710
|
|
|
701
|
-
getOrAddShortClientId(longClientId: string) {
|
|
711
|
+
getOrAddShortClientId(longClientId: string): number {
|
|
702
712
|
if (!this.clientNameToIds.get(longClientId)) {
|
|
703
713
|
this.addLongClientId(longClientId);
|
|
704
714
|
}
|
|
705
715
|
return this.getShortClientId(longClientId);
|
|
706
716
|
}
|
|
707
717
|
|
|
708
|
-
protected getShortClientId(longClientId: string) {
|
|
718
|
+
protected getShortClientId(longClientId: string): number {
|
|
709
719
|
return this.clientNameToIds.get(longClientId)!.data;
|
|
710
720
|
}
|
|
711
721
|
|
|
712
|
-
getLongClientId(shortClientId: number) {
|
|
713
|
-
return shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : "original";
|
|
722
|
+
getLongClientId(shortClientId: number): string {
|
|
723
|
+
return shortClientId >= 0 ? this.shortClientIdMap[shortClientId]! : "original";
|
|
714
724
|
}
|
|
715
725
|
|
|
716
|
-
addLongClientId(longClientId: string) {
|
|
726
|
+
addLongClientId(longClientId: string): void {
|
|
717
727
|
this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);
|
|
718
728
|
this.shortClientIdMap.push(longClientId);
|
|
719
729
|
}
|
|
720
730
|
|
|
721
|
-
private getOrAddShortClientIdFromMessage(
|
|
731
|
+
private getOrAddShortClientIdFromMessage(
|
|
732
|
+
msg: Pick<ISequencedDocumentMessage, "clientId">,
|
|
733
|
+
): number {
|
|
722
734
|
return this.getOrAddShortClientId(msg.clientId ?? "server");
|
|
723
735
|
}
|
|
724
736
|
|
|
@@ -731,7 +743,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
731
743
|
* @param segment - The segment to find the position for
|
|
732
744
|
* @param localSeq - The localSeq to find the position of the segment at
|
|
733
745
|
*/
|
|
734
|
-
public findReconnectionPosition(segment: ISegment, localSeq: number) {
|
|
746
|
+
public findReconnectionPosition(segment: ISegment, localSeq: number): number {
|
|
735
747
|
assert(
|
|
736
748
|
localSeq <= this._mergeTree.collabWindow.localSeq,
|
|
737
749
|
0x032 /* "localSeq greater than collab window" */,
|
|
@@ -783,7 +795,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
783
795
|
const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);
|
|
784
796
|
let newOp: IMergeTreeDeltaOp | undefined;
|
|
785
797
|
switch (resetOp.type) {
|
|
786
|
-
case MergeTreeDeltaType.ANNOTATE:
|
|
798
|
+
case MergeTreeDeltaType.ANNOTATE: {
|
|
787
799
|
assert(
|
|
788
800
|
segment.propertyManager?.hasPendingProperties(resetOp.props) === true,
|
|
789
801
|
0x036 /* "Segment has no pending properties" */,
|
|
@@ -806,17 +818,20 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
806
818
|
);
|
|
807
819
|
}
|
|
808
820
|
break;
|
|
821
|
+
}
|
|
809
822
|
|
|
810
|
-
case MergeTreeDeltaType.INSERT:
|
|
823
|
+
case MergeTreeDeltaType.INSERT: {
|
|
811
824
|
assert(
|
|
812
825
|
segment.seq === UnassignedSequenceNumber,
|
|
813
826
|
0x037 /* "Segment already has assigned sequence number" */,
|
|
814
827
|
);
|
|
815
828
|
let segInsertOp = segment;
|
|
829
|
+
// The suppression is needed because the segment needs to have a type of any.
|
|
830
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
816
831
|
if (typeof resetOp.seg === "object" && resetOp.seg.props !== undefined) {
|
|
817
832
|
segInsertOp = segment.clone();
|
|
818
|
-
// eslint-disable-next-line import/no-deprecated
|
|
819
833
|
segInsertOp.properties = createMap();
|
|
834
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
|
|
820
835
|
segInsertOp.addProperties(resetOp.seg.props);
|
|
821
836
|
}
|
|
822
837
|
if (segment.movedSeq !== UnassignedSequenceNumber) {
|
|
@@ -824,8 +839,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
824
839
|
}
|
|
825
840
|
newOp = createInsertSegmentOp(segmentPosition, segInsertOp);
|
|
826
841
|
break;
|
|
842
|
+
}
|
|
827
843
|
|
|
828
|
-
case MergeTreeDeltaType.REMOVE:
|
|
844
|
+
case MergeTreeDeltaType.REMOVE: {
|
|
829
845
|
if (
|
|
830
846
|
segment.localRemovedSeq !== undefined &&
|
|
831
847
|
segment.removedSeq === UnassignedSequenceNumber &&
|
|
@@ -839,7 +855,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
839
855
|
);
|
|
840
856
|
}
|
|
841
857
|
break;
|
|
842
|
-
|
|
858
|
+
}
|
|
859
|
+
case MergeTreeDeltaType.OBLITERATE: {
|
|
843
860
|
if (
|
|
844
861
|
segment.localMovedSeq !== undefined &&
|
|
845
862
|
segment.movedSeq === UnassignedSequenceNumber &&
|
|
@@ -853,8 +870,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
853
870
|
);
|
|
854
871
|
}
|
|
855
872
|
break;
|
|
856
|
-
|
|
873
|
+
}
|
|
874
|
+
default: {
|
|
857
875
|
throw new Error(`Invalid op type`);
|
|
876
|
+
}
|
|
858
877
|
}
|
|
859
878
|
|
|
860
879
|
if (newOp && resetOp.type === MergeTreeDeltaType.OBLITERATE) {
|
|
@@ -892,23 +911,27 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
892
911
|
return opList;
|
|
893
912
|
}
|
|
894
913
|
|
|
895
|
-
private applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs) {
|
|
914
|
+
private applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs): void {
|
|
896
915
|
const op = opArgs.op;
|
|
897
916
|
const msg = opArgs.sequencedMessage;
|
|
898
917
|
this.getOrAddShortClientIdFromMessage(msg);
|
|
899
918
|
switch (op.type) {
|
|
900
|
-
case MergeTreeDeltaType.INSERT:
|
|
919
|
+
case MergeTreeDeltaType.INSERT: {
|
|
901
920
|
this.applyInsertOp(opArgs);
|
|
902
921
|
break;
|
|
903
|
-
|
|
922
|
+
}
|
|
923
|
+
case MergeTreeDeltaType.REMOVE: {
|
|
904
924
|
this.applyRemoveRangeOp(opArgs);
|
|
905
925
|
break;
|
|
906
|
-
|
|
926
|
+
}
|
|
927
|
+
case MergeTreeDeltaType.ANNOTATE: {
|
|
907
928
|
this.applyAnnotateRangeOp(opArgs);
|
|
908
929
|
break;
|
|
909
|
-
|
|
930
|
+
}
|
|
931
|
+
case MergeTreeDeltaType.OBLITERATE: {
|
|
910
932
|
this.applyObliterateRangeOp(opArgs);
|
|
911
933
|
break;
|
|
934
|
+
}
|
|
912
935
|
case MergeTreeDeltaType.GROUP: {
|
|
913
936
|
for (const memberOp of op.ops) {
|
|
914
937
|
this.applyRemoteOp({
|
|
@@ -919,34 +942,41 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
919
942
|
}
|
|
920
943
|
break;
|
|
921
944
|
}
|
|
922
|
-
default:
|
|
945
|
+
default: {
|
|
923
946
|
break;
|
|
947
|
+
}
|
|
924
948
|
}
|
|
925
949
|
}
|
|
926
950
|
|
|
927
951
|
public applyStashedOp(op: IMergeTreeOp): void {
|
|
928
952
|
switch (op.type) {
|
|
929
|
-
case MergeTreeDeltaType.INSERT:
|
|
953
|
+
case MergeTreeDeltaType.INSERT: {
|
|
930
954
|
this.applyInsertOp({ op });
|
|
931
955
|
break;
|
|
932
|
-
|
|
956
|
+
}
|
|
957
|
+
case MergeTreeDeltaType.REMOVE: {
|
|
933
958
|
this.applyRemoveRangeOp({ op });
|
|
934
959
|
break;
|
|
935
|
-
|
|
960
|
+
}
|
|
961
|
+
case MergeTreeDeltaType.ANNOTATE: {
|
|
936
962
|
this.applyAnnotateRangeOp({ op });
|
|
937
963
|
break;
|
|
938
|
-
|
|
964
|
+
}
|
|
965
|
+
case MergeTreeDeltaType.OBLITERATE: {
|
|
939
966
|
this.applyObliterateRangeOp({ op });
|
|
940
967
|
break;
|
|
941
|
-
|
|
968
|
+
}
|
|
969
|
+
case MergeTreeDeltaType.GROUP: {
|
|
942
970
|
op.ops.map((o) => this.applyStashedOp(o));
|
|
943
971
|
break;
|
|
944
|
-
|
|
972
|
+
}
|
|
973
|
+
default: {
|
|
945
974
|
unreachableCase(op, "unrecognized op type");
|
|
975
|
+
}
|
|
946
976
|
}
|
|
947
977
|
}
|
|
948
978
|
|
|
949
|
-
public applyMsg(msg: ISequencedDocumentMessage, local: boolean = false) {
|
|
979
|
+
public applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {
|
|
950
980
|
// Ensure client ID is registered
|
|
951
981
|
this.getOrAddShortClientIdFromMessage(msg);
|
|
952
982
|
// Apply if an operation message
|
|
@@ -969,7 +999,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
969
999
|
this.updateSeqNumbers(min, msg.sequenceNumber);
|
|
970
1000
|
}
|
|
971
1001
|
|
|
972
|
-
private updateSeqNumbers(min: number, seq: number) {
|
|
1002
|
+
private updateSeqNumbers(min: number, seq: number): void {
|
|
973
1003
|
const collabWindow = this.getCollabWindow();
|
|
974
1004
|
// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #
|
|
975
1005
|
assert(
|
|
@@ -1027,7 +1057,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1027
1057
|
// eslint-disable-next-line import/no-deprecated
|
|
1028
1058
|
return createGroupOp();
|
|
1029
1059
|
}
|
|
1030
|
-
|
|
1060
|
+
// TODO Non null asserting, why is this not null?
|
|
1061
|
+
firstGroup = segmentGroup[0]!;
|
|
1031
1062
|
} else {
|
|
1032
1063
|
firstGroup = segmentGroup;
|
|
1033
1064
|
}
|
|
@@ -1057,7 +1088,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1057
1088
|
);
|
|
1058
1089
|
|
|
1059
1090
|
for (let i = 0; i < resetOp.ops.length; i++) {
|
|
1060
|
-
|
|
1091
|
+
// Non null asserting because resetOp and segmentGroup are arrays of same length and loop is length of resetOp
|
|
1092
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i]!, segmentGroup[i]!));
|
|
1061
1093
|
}
|
|
1062
1094
|
} else {
|
|
1063
1095
|
// A group op containing a single op will pass a direct reference to 'segmentGroup'
|
|
@@ -1066,11 +1098,12 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1066
1098
|
resetOp.ops.length === 1,
|
|
1067
1099
|
0x03b /* "Number of ops in 'resetOp' must match the number of segment groups provided." */,
|
|
1068
1100
|
);
|
|
1069
|
-
|
|
1101
|
+
// Non null asserting because of length assert above
|
|
1102
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0]!, segmentGroup));
|
|
1070
1103
|
}
|
|
1071
1104
|
} else {
|
|
1072
1105
|
assert(
|
|
1073
|
-
(resetOp.type as
|
|
1106
|
+
(resetOp.type as unknown) !== MergeTreeDeltaType.GROUP,
|
|
1074
1107
|
0x03c /* "Reset op has 'group' delta type!" */,
|
|
1075
1108
|
);
|
|
1076
1109
|
assert(
|
|
@@ -1079,8 +1112,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1079
1112
|
);
|
|
1080
1113
|
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
|
|
1081
1114
|
}
|
|
1115
|
+
// TODO why are we non null asserting here?
|
|
1082
1116
|
// eslint-disable-next-line import/no-deprecated
|
|
1083
|
-
return opList.length === 1 ? opList[0] : createGroupOp(...opList);
|
|
1117
|
+
return opList.length === 1 ? opList[0]! : createGroupOp(...opList);
|
|
1084
1118
|
}
|
|
1085
1119
|
|
|
1086
1120
|
// eslint-disable-next-line import/no-deprecated
|
|
@@ -1139,38 +1173,43 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1139
1173
|
return loader.initialize(storage);
|
|
1140
1174
|
}
|
|
1141
1175
|
|
|
1142
|
-
private getLocalSequenceNumber() {
|
|
1176
|
+
private getLocalSequenceNumber(): number {
|
|
1143
1177
|
const segWindow = this.getCollabWindow();
|
|
1144
1178
|
return segWindow.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber;
|
|
1145
1179
|
}
|
|
1146
1180
|
|
|
1147
1181
|
// eslint-disable-next-line import/no-deprecated
|
|
1148
|
-
localTransaction(groupOp: IMergeTreeGroupMsg) {
|
|
1182
|
+
localTransaction(groupOp: IMergeTreeGroupMsg): void {
|
|
1149
1183
|
for (const op of groupOp.ops) {
|
|
1150
1184
|
const opArgs: IMergeTreeDeltaOpArgs = {
|
|
1151
1185
|
op,
|
|
1152
1186
|
groupOp,
|
|
1153
1187
|
};
|
|
1154
1188
|
switch (op.type) {
|
|
1155
|
-
case MergeTreeDeltaType.INSERT:
|
|
1189
|
+
case MergeTreeDeltaType.INSERT: {
|
|
1156
1190
|
this.applyInsertOp(opArgs);
|
|
1157
1191
|
break;
|
|
1158
|
-
|
|
1192
|
+
}
|
|
1193
|
+
case MergeTreeDeltaType.ANNOTATE: {
|
|
1159
1194
|
this.applyAnnotateRangeOp(opArgs);
|
|
1160
1195
|
break;
|
|
1161
|
-
|
|
1196
|
+
}
|
|
1197
|
+
case MergeTreeDeltaType.REMOVE: {
|
|
1162
1198
|
this.applyRemoveRangeOp(opArgs);
|
|
1163
1199
|
break;
|
|
1164
|
-
|
|
1200
|
+
}
|
|
1201
|
+
case MergeTreeDeltaType.OBLITERATE: {
|
|
1165
1202
|
this.applyObliterateRangeOp(opArgs);
|
|
1166
1203
|
break;
|
|
1167
|
-
|
|
1204
|
+
}
|
|
1205
|
+
default: {
|
|
1168
1206
|
break;
|
|
1207
|
+
}
|
|
1169
1208
|
}
|
|
1170
1209
|
}
|
|
1171
1210
|
}
|
|
1172
1211
|
|
|
1173
|
-
updateMinSeq(minSeq: number) {
|
|
1212
|
+
updateMinSeq(minSeq: number): void {
|
|
1174
1213
|
this._mergeTree.setMinSeq(minSeq);
|
|
1175
1214
|
}
|
|
1176
1215
|
|
|
@@ -1178,7 +1217,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1178
1217
|
pos: number,
|
|
1179
1218
|
sequenceArgs?: Pick<ISequencedDocumentMessage, "referenceSequenceNumber" | "clientId">,
|
|
1180
1219
|
localSeq?: number,
|
|
1181
|
-
) {
|
|
1220
|
+
): {
|
|
1221
|
+
segment: T | undefined;
|
|
1222
|
+
offset: number | undefined;
|
|
1223
|
+
} {
|
|
1182
1224
|
const { referenceSequenceNumber, clientId } =
|
|
1183
1225
|
this.getClientSequenceArgsForMessage(sequenceArgs);
|
|
1184
1226
|
return this._mergeTree.getContainingSegment<T>(
|
|
@@ -1189,7 +1231,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1189
1231
|
);
|
|
1190
1232
|
}
|
|
1191
1233
|
|
|
1192
|
-
getPropertiesAtPosition(pos: number) {
|
|
1234
|
+
getPropertiesAtPosition(pos: number): PropertySet | undefined {
|
|
1193
1235
|
let propertiesAtPosition: PropertySet | undefined;
|
|
1194
1236
|
const segoff = this.getContainingSegment(pos);
|
|
1195
1237
|
const seg = segoff.segment;
|
|
@@ -1199,7 +1241,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1199
1241
|
return propertiesAtPosition;
|
|
1200
1242
|
}
|
|
1201
1243
|
|
|
1202
|
-
getRangeExtentsOfPosition(pos: number) {
|
|
1244
|
+
getRangeExtentsOfPosition(pos: number): {
|
|
1245
|
+
posStart: number | undefined;
|
|
1246
|
+
posAfterEnd: number | undefined;
|
|
1247
|
+
} {
|
|
1203
1248
|
let posStart: number | undefined;
|
|
1204
1249
|
let posAfterEnd: number | undefined;
|
|
1205
1250
|
|
|
@@ -1212,19 +1257,23 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1212
1257
|
return { posStart, posAfterEnd };
|
|
1213
1258
|
}
|
|
1214
1259
|
|
|
1215
|
-
getCurrentSeq() {
|
|
1260
|
+
getCurrentSeq(): number {
|
|
1216
1261
|
return this.getCollabWindow().currentSeq;
|
|
1217
1262
|
}
|
|
1218
1263
|
|
|
1219
|
-
getClientId() {
|
|
1264
|
+
getClientId(): number {
|
|
1220
1265
|
return this.getCollabWindow().clientId;
|
|
1221
1266
|
}
|
|
1222
1267
|
|
|
1223
|
-
getLength() {
|
|
1268
|
+
getLength(): number {
|
|
1224
1269
|
return this._mergeTree.length ?? 0;
|
|
1225
1270
|
}
|
|
1226
1271
|
|
|
1227
|
-
startOrUpdateCollaboration(
|
|
1272
|
+
startOrUpdateCollaboration(
|
|
1273
|
+
longClientId: string | undefined,
|
|
1274
|
+
minSeq = 0,
|
|
1275
|
+
currentSeq = 0,
|
|
1276
|
+
): void {
|
|
1228
1277
|
// we should always have a client id if we are collaborating
|
|
1229
1278
|
// if the client id is undefined we are likely bound to a detached
|
|
1230
1279
|
// container, so we should keep going in local mode. once
|
|
@@ -1258,7 +1307,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1258
1307
|
* @param markerLabel - Label of the marker to search for
|
|
1259
1308
|
* @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`
|
|
1260
1309
|
*/
|
|
1261
|
-
searchForMarker(startPos: number, markerLabel: string, forwards = true) {
|
|
1310
|
+
searchForMarker(startPos: number, markerLabel: string, forwards = true): Marker | undefined {
|
|
1262
1311
|
const clientId = this.getClientId();
|
|
1263
1312
|
return this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);
|
|
1264
1313
|
}
|
package/src/collections/list.ts
CHANGED
|
@@ -33,11 +33,13 @@ class HeadNode<T> {
|
|
|
33
33
|
public get prev(): DataNode<T> | undefined {
|
|
34
34
|
return this._prev === this.headNode ? undefined : (this._prev as DataNode<T>);
|
|
35
35
|
}
|
|
36
|
-
public get list() {
|
|
36
|
+
public get list(): DoublyLinkedList<T> | undefined {
|
|
37
37
|
return this.headNode._list;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// The any is needed for use in the remove function, where the nodes are defined with a generic type.
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
43
|
const DeadHead = new HeadNode<any>(undefined);
|
|
42
44
|
|
|
43
45
|
class DataNode<T> extends HeadNode<T> implements ListNode<T> {
|
|
@@ -54,7 +56,7 @@ function insertAfter<T>(node: DataNode<T> | HeadNode<T>, items: T[]): ListNodeRa
|
|
|
54
56
|
let previousNode = node;
|
|
55
57
|
const oldNext = previousNode._next;
|
|
56
58
|
let newRange: ListNodeRange<T> | undefined;
|
|
57
|
-
|
|
59
|
+
for (const n of items) {
|
|
58
60
|
const newNode = new DataNode<T>(node.headNode, n);
|
|
59
61
|
if (newRange === undefined) {
|
|
60
62
|
newRange = { first: newNode, last: newNode };
|
|
@@ -64,7 +66,7 @@ function insertAfter<T>(node: DataNode<T> | HeadNode<T>, items: T[]): ListNodeRa
|
|
|
64
66
|
newNode._prev = previousNode;
|
|
65
67
|
previousNode._next = newNode;
|
|
66
68
|
previousNode = newNode;
|
|
67
|
-
}
|
|
69
|
+
}
|
|
68
70
|
oldNext._prev = previousNode;
|
|
69
71
|
previousNode._next = oldNext;
|
|
70
72
|
// explicitly prevent newRange from being undefined without casting,
|
|
@@ -191,6 +193,7 @@ export class DoublyLinkedList<T>
|
|
|
191
193
|
if (this._includes(node)) {
|
|
192
194
|
node._prev._next = node._next;
|
|
193
195
|
node._next._prev = node._prev;
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
194
197
|
node.headNode = node._next = node._prev = DeadHead;
|
|
195
198
|
this._len--;
|
|
196
199
|
return node;
|
|
@@ -222,10 +225,10 @@ export class DoublyLinkedList<T>
|
|
|
222
225
|
|
|
223
226
|
private _len: number = 0;
|
|
224
227
|
private readonly headNode: HeadNode<T> | DataNode<T> = new HeadNode(this);
|
|
225
|
-
public get length() {
|
|
228
|
+
public get length(): number {
|
|
226
229
|
return this._len;
|
|
227
230
|
}
|
|
228
|
-
public get empty() {
|
|
231
|
+
public get empty(): boolean {
|
|
229
232
|
return this._len === 0;
|
|
230
233
|
}
|
|
231
234
|
public get first(): ListNode<T> | undefined {
|
|
@@ -242,7 +245,7 @@ export function walkList<T>(
|
|
|
242
245
|
visitor: (node: ListNode<T>) => boolean | void,
|
|
243
246
|
start?: ListNode<T>,
|
|
244
247
|
forward: boolean = true,
|
|
245
|
-
) {
|
|
248
|
+
): boolean {
|
|
246
249
|
let current: ListNode<T> | undefined;
|
|
247
250
|
if (start) {
|
|
248
251
|
if (!list.includes(start)) {
|