@fluidframework/merge-tree 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.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.js → .eslintrc.cjs} +4 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +4 -0
- package/api-extractor-cjs.json +8 -0
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -9
- package/api-report/merge-tree.api.md +6 -12
- package/dist/MergeTreeTextHelper.d.ts +2 -2
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +3 -3
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +15 -15
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +31 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +103 -92
- package/dist/client.js.map +1 -1
- package/dist/collections/index.d.ts +2 -2
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js +6 -6
- package/dist/collections/index.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +3 -3
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +8 -8
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +20 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -71
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +9 -39
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +29 -24
- package/dist/localReference.js.map +1 -1
- package/dist/merge-tree-alpha.d.ts +28 -450
- package/dist/merge-tree-beta.d.ts +0 -438
- package/dist/merge-tree-public.d.ts +0 -438
- package/dist/merge-tree-untrimmed.d.ts +28 -787
- package/dist/mergeTree.d.ts +11 -19
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +201 -189
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +3 -7
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +17 -14
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +32 -32
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts +2 -2
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +2 -2
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +3 -3
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +7 -7
- package/dist/opBuilder.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/partialLengths.d.ts +5 -5
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +29 -29
- package/dist/partialLengths.js.map +1 -1
- package/dist/referencePositions.d.ts +4 -4
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +2 -2
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +7 -7
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +39 -39
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +3 -3
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +2 -2
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +8 -8
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts +3 -3
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +5 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +3 -3
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +19 -19
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +3 -3
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +35 -18
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -2
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +22 -10
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +3 -3
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +2 -2
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js +15 -15
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/PartialLengths.perf.spec.js +13 -13
- package/dist/test/PartialLengths.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js +25 -25
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +3 -3
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +9 -9
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +46 -46
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +13 -13
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/{beastTest.d.ts → beastTest.spec.d.ts} +3 -3
- package/dist/test/beastTest.spec.d.ts.map +1 -0
- package/dist/test/{beastTest.js → beastTest.spec.js} +120 -119
- package/dist/test/beastTest.spec.js.map +1 -0
- package/dist/test/client.annotateMarker.spec.js +13 -13
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/{client.apis.d.ts → client.apis.spec.d.ts} +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -0
- package/dist/test/{client.apis.js → client.apis.spec.js} +8 -8
- package/dist/test/client.apis.spec.js.map +1 -0
- package/dist/test/client.applyMsg.spec.js +106 -43
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +33 -21
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -13
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +9 -9
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +4 -4
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +72 -72
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +18 -18
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +2 -2
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +10 -10
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -11
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +83 -83
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +9 -9
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +137 -137
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +2 -2
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +4 -4
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +4 -4
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +16 -0
- package/dist/test/dirname.cjs.map +1 -0
- package/dist/test/dirname.d.cts +6 -0
- package/dist/test/dirname.d.cts.map +1 -0
- package/dist/test/index.d.ts +8 -8
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +82 -81
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +39 -39
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +39 -39
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +35 -35
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +77 -77
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +42 -42
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +15 -15
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +14 -14
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +9 -9
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +4 -4
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +16 -15
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +5 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +85 -88
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.d.ts +6 -0
- package/dist/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
- package/dist/test/obliterate.deltaCallback.spec.js +146 -0
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -0
- package/dist/test/obliterate.partialLength.spec.js +39 -44
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +15 -18
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +16 -16
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +5 -5
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js +58 -64
- 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 +8 -8
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +3 -3
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +18 -18
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +21 -21
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.js +67 -67
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +3 -3
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +16 -16
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +4 -4
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +11 -11
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +22 -22
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +9 -9
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +13 -16
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +57 -59
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts +3 -3
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +19 -19
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testServer.d.ts +3 -3
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js +8 -8
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +14 -6
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +36 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +10 -10
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +12 -12
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/{wordUnitTests.d.ts → wordUnitTests.spec.d.ts} +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -0
- package/dist/test/{wordUnitTests.js → wordUnitTests.spec.js} +16 -15
- package/dist/test/wordUnitTests.spec.js.map +1 -0
- package/dist/textSegment.d.ts +3 -3
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +2 -2
- package/dist/textSegment.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/zamboni.d.ts +2 -2
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +19 -19
- package/dist/zamboni.js.map +1 -1
- package/lib/{MergeTreeTextHelper.d.mts → MergeTreeTextHelper.d.ts} +3 -3
- package/lib/MergeTreeTextHelper.d.ts.map +1 -0
- package/lib/{MergeTreeTextHelper.mjs → MergeTreeTextHelper.js} +3 -2
- package/lib/MergeTreeTextHelper.js.map +1 -0
- package/lib/{attributionCollection.d.mts → attributionCollection.d.ts} +2 -2
- package/lib/attributionCollection.d.ts.map +1 -0
- package/lib/{attributionCollection.mjs → attributionCollection.js} +1 -1
- package/lib/attributionCollection.js.map +1 -0
- package/lib/{attributionPolicy.d.mts → attributionPolicy.d.ts} +2 -2
- package/lib/attributionPolicy.d.ts.map +1 -0
- package/lib/{attributionPolicy.mjs → attributionPolicy.js} +4 -4
- package/lib/attributionPolicy.js.map +1 -0
- package/lib/{client.d.mts → client.d.ts} +32 -13
- package/lib/client.d.ts.map +1 -0
- package/lib/{client.mjs → client.js} +42 -31
- package/lib/client.js.map +1 -0
- package/lib/collections/{index.d.mts → index.d.ts} +3 -3
- package/lib/collections/index.d.ts.map +1 -0
- package/lib/collections/index.js +7 -0
- package/lib/collections/index.js.map +1 -0
- package/lib/collections/{list.d.mts → list.d.ts} +1 -1
- package/lib/collections/list.d.ts.map +1 -0
- package/lib/collections/{list.mjs → list.js} +1 -1
- package/lib/collections/list.js.map +1 -0
- package/lib/collections/{rbTree.d.mts → rbTree.d.ts} +1 -1
- package/lib/collections/rbTree.d.ts.map +1 -0
- package/lib/collections/{rbTree.mjs → rbTree.js} +1 -1
- package/lib/collections/rbTree.js.map +1 -0
- package/lib/{constants.d.mts → constants.d.ts} +1 -1
- package/lib/constants.d.ts.map +1 -0
- package/lib/{constants.mjs → constants.js} +1 -1
- package/lib/constants.js.map +1 -0
- package/lib/{endOfTreeSegment.d.mts → endOfTreeSegment.d.ts} +4 -4
- package/lib/endOfTreeSegment.d.ts.map +1 -0
- package/lib/{endOfTreeSegment.mjs → endOfTreeSegment.js} +3 -3
- package/lib/endOfTreeSegment.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +21 -21
- package/lib/index.d.ts.map +1 -0
- package/lib/{index.mjs → index.js} +20 -20
- package/lib/index.js.map +1 -0
- package/lib/{localReference.d.mts → localReference.d.ts} +10 -40
- package/lib/localReference.d.ts.map +1 -0
- package/lib/{localReference.mjs → localReference.js} +12 -6
- package/lib/localReference.js.map +1 -0
- package/lib/{merge-tree-alpha.d.mts → merge-tree-alpha.d.ts} +28 -450
- package/lib/merge-tree-beta.d.ts +230 -0
- package/lib/merge-tree-public.d.ts +230 -0
- package/lib/{merge-tree-untrimmed.d.mts → merge-tree-untrimmed.d.ts} +28 -787
- package/lib/{mergeTree.d.mts → mergeTree.d.ts} +12 -20
- package/lib/mergeTree.d.ts.map +1 -0
- package/lib/{mergeTree.mjs → mergeTree.js} +47 -32
- package/lib/mergeTree.js.map +1 -0
- package/lib/{mergeTreeDeltaCallback.d.mts → mergeTreeDeltaCallback.d.ts} +8 -8
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -0
- package/lib/{mergeTreeDeltaCallback.mjs → mergeTreeDeltaCallback.js} +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -0
- package/lib/{mergeTreeNodeWalk.d.mts → mergeTreeNodeWalk.d.ts} +2 -2
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -0
- package/lib/{mergeTreeNodeWalk.mjs → mergeTreeNodeWalk.js} +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -0
- package/lib/{mergeTreeNodes.d.mts → mergeTreeNodes.d.ts} +18 -15
- package/lib/mergeTreeNodes.d.ts.map +1 -0
- package/lib/{mergeTreeNodes.mjs → mergeTreeNodes.js} +12 -10
- package/lib/mergeTreeNodes.js.map +1 -0
- package/lib/{mergeTreeTracking.d.mts → mergeTreeTracking.d.ts} +3 -3
- package/lib/mergeTreeTracking.d.ts.map +1 -0
- package/lib/{mergeTreeTracking.mjs → mergeTreeTracking.js} +3 -2
- package/lib/mergeTreeTracking.js.map +1 -0
- package/lib/{opBuilder.d.mts → opBuilder.d.ts} +4 -4
- package/lib/{opBuilder.d.mts.map → opBuilder.d.ts.map} +1 -1
- package/lib/{opBuilder.mjs → opBuilder.js} +2 -2
- package/lib/opBuilder.js.map +1 -0
- package/lib/{ops.d.mts → ops.d.ts} +1 -1
- package/lib/ops.d.ts.map +1 -0
- package/lib/{ops.mjs → ops.js} +1 -1
- package/lib/ops.js.map +1 -0
- package/lib/{ordinal.d.mts → ordinal.d.ts} +1 -1
- package/lib/ordinal.d.ts.map +1 -0
- package/lib/{ordinal.mjs → ordinal.js} +2 -1
- package/lib/ordinal.js.map +1 -0
- package/lib/{partialLengths.d.mts → partialLengths.d.ts} +6 -6
- package/lib/partialLengths.d.ts.map +1 -0
- package/lib/{partialLengths.mjs → partialLengths.js} +11 -10
- package/lib/partialLengths.js.map +1 -0
- package/lib/{properties.d.mts → properties.d.ts} +1 -1
- package/lib/properties.d.ts.map +1 -0
- package/lib/{properties.mjs → properties.js} +1 -1
- package/lib/properties.js.map +1 -0
- package/lib/{referencePositions.d.mts → referencePositions.d.ts} +5 -5
- package/lib/referencePositions.d.ts.map +1 -0
- package/lib/{referencePositions.mjs → referencePositions.js} +2 -2
- package/lib/referencePositions.js.map +1 -0
- package/lib/{revertibles.d.mts → revertibles.d.ts} +8 -8
- package/lib/revertibles.d.ts.map +1 -0
- package/lib/{revertibles.mjs → revertibles.js} +13 -13
- package/lib/revertibles.js.map +1 -0
- package/lib/{segmentGroupCollection.d.mts → segmentGroupCollection.d.ts} +2 -2
- package/lib/segmentGroupCollection.d.ts.map +1 -0
- package/lib/{segmentGroupCollection.mjs → segmentGroupCollection.js} +2 -2
- package/lib/segmentGroupCollection.js.map +1 -0
- package/lib/{segmentPropertiesManager.d.mts → segmentPropertiesManager.d.ts} +3 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -0
- package/lib/{segmentPropertiesManager.mjs → segmentPropertiesManager.js} +5 -3
- package/lib/segmentPropertiesManager.js.map +1 -0
- package/lib/{snapshotChunks.d.mts → snapshotChunks.d.ts} +4 -4
- package/lib/snapshotChunks.d.ts.map +1 -0
- package/lib/{snapshotChunks.mjs → snapshotChunks.js} +2 -2
- package/lib/snapshotChunks.js.map +1 -0
- package/lib/{snapshotLoader.d.mts → snapshotLoader.d.ts} +4 -4
- package/lib/snapshotLoader.d.ts.map +1 -0
- package/lib/{snapshotLoader.mjs → snapshotLoader.js} +10 -9
- package/lib/snapshotLoader.js.map +1 -0
- package/lib/{snapshotV1.d.mts → snapshotV1.d.ts} +4 -4
- package/lib/snapshotV1.d.ts.map +1 -0
- package/lib/{snapshotV1.mjs → snapshotV1.js} +24 -7
- package/lib/snapshotV1.js.map +1 -0
- package/lib/{snapshotlegacy.d.mts → snapshotlegacy.d.ts} +3 -3
- package/lib/snapshotlegacy.d.ts.map +1 -0
- package/lib/{snapshotlegacy.mjs → snapshotlegacy.js} +17 -4
- package/lib/snapshotlegacy.js.map +1 -0
- package/lib/{sortedSegmentSet.d.mts → sortedSegmentSet.d.ts} +4 -4
- package/lib/sortedSegmentSet.d.ts.map +1 -0
- package/lib/{sortedSegmentSet.mjs → sortedSegmentSet.js} +3 -2
- package/lib/sortedSegmentSet.js.map +1 -0
- package/lib/{sortedSet.d.mts → sortedSet.d.ts} +1 -1
- package/lib/sortedSet.d.ts.map +1 -0
- package/lib/{sortedSet.mjs → sortedSet.js} +1 -1
- package/lib/sortedSet.js.map +1 -0
- package/lib/test/Insertion.perf.spec.d.ts +6 -0
- package/lib/test/Insertion.perf.spec.d.ts.map +1 -0
- package/lib/test/Insertion.perf.spec.js +111 -0
- package/lib/test/Insertion.perf.spec.js.map +1 -0
- package/lib/test/PartialLengths.perf.spec.d.ts +6 -0
- package/lib/test/PartialLengths.perf.spec.d.ts.map +1 -0
- package/lib/test/PartialLengths.perf.spec.js +65 -0
- package/lib/test/PartialLengths.perf.spec.js.map +1 -0
- package/lib/test/Removal.perf.spec.d.ts +6 -0
- package/lib/test/Removal.perf.spec.d.ts.map +1 -0
- package/lib/test/Removal.perf.spec.js +164 -0
- package/lib/test/Removal.perf.spec.js.map +1 -0
- package/lib/test/Snapshot.perf.spec.d.ts +6 -0
- package/lib/test/Snapshot.perf.spec.d.ts.map +1 -0
- package/lib/test/Snapshot.perf.spec.js +31 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -0
- package/lib/test/attributionCollection.perf.spec.d.ts +6 -0
- package/lib/test/attributionCollection.perf.spec.d.ts.map +1 -0
- package/lib/test/attributionCollection.perf.spec.js +229 -0
- package/lib/test/attributionCollection.perf.spec.js.map +1 -0
- package/lib/test/attributionCollection.spec.d.ts +6 -0
- package/lib/test/attributionCollection.spec.d.ts.map +1 -0
- package/lib/test/attributionCollection.spec.js +484 -0
- package/lib/test/attributionCollection.spec.js.map +1 -0
- package/lib/test/attributionPolicy.spec.d.ts +6 -0
- package/lib/test/attributionPolicy.spec.d.ts.map +1 -0
- package/lib/test/attributionPolicy.spec.js +187 -0
- package/lib/test/attributionPolicy.spec.js.map +1 -0
- package/lib/test/beastTest.spec.d.ts +54 -0
- package/lib/test/beastTest.spec.d.ts.map +1 -0
- package/lib/test/beastTest.spec.js +1318 -0
- package/lib/test/beastTest.spec.js.map +1 -0
- package/lib/test/client.annotateMarker.spec.d.ts +6 -0
- package/lib/test/client.annotateMarker.spec.d.ts.map +1 -0
- package/lib/test/client.annotateMarker.spec.js +43 -0
- package/lib/test/client.annotateMarker.spec.js.map +1 -0
- package/lib/test/client.apis.spec.d.ts +7 -0
- package/lib/test/client.apis.spec.d.ts.map +1 -0
- package/lib/test/client.apis.spec.js +67 -0
- package/lib/test/client.apis.spec.js.map +1 -0
- package/lib/test/client.applyMsg.spec.d.ts +6 -0
- package/lib/test/client.applyMsg.spec.d.ts.map +1 -0
- package/lib/test/client.applyMsg.spec.js +561 -0
- package/lib/test/client.applyMsg.spec.js.map +1 -0
- package/lib/test/client.applyStashedOpFarm.spec.d.ts +12 -0
- package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
- package/lib/test/client.applyStashedOpFarm.spec.js +153 -0
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -0
- package/lib/test/client.attributionFarm.spec.d.ts +7 -0
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -0
- package/lib/test/client.attributionFarm.spec.js +92 -0
- package/lib/test/client.attributionFarm.spec.js.map +1 -0
- package/lib/test/client.conflictFarm.spec.d.ts +15 -0
- package/lib/test/client.conflictFarm.spec.d.ts.map +1 -0
- package/lib/test/client.conflictFarm.spec.js +85 -0
- package/lib/test/client.conflictFarm.spec.js.map +1 -0
- package/lib/test/client.getPosition.spec.d.ts +6 -0
- package/lib/test/client.getPosition.spec.d.ts.map +1 -0
- package/lib/test/client.getPosition.spec.js +52 -0
- package/lib/test/client.getPosition.spec.js.map +1 -0
- package/lib/test/client.localReference.spec.d.ts +6 -0
- package/lib/test/client.localReference.spec.d.ts.map +1 -0
- package/lib/test/client.localReference.spec.js +468 -0
- package/lib/test/client.localReference.spec.js.map +1 -0
- package/lib/test/client.localReferenceFarm.spec.d.ts +6 -0
- package/lib/test/client.localReferenceFarm.spec.d.ts.map +1 -0
- package/lib/test/client.localReferenceFarm.spec.js +86 -0
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -0
- package/lib/test/client.rebasePosition.spec.d.ts +6 -0
- package/lib/test/client.rebasePosition.spec.d.ts.map +1 -0
- package/lib/test/client.rebasePosition.spec.js +100 -0
- package/lib/test/client.rebasePosition.spec.js.map +1 -0
- package/lib/test/client.reconnectFarm.spec.d.ts +12 -0
- package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -0
- package/lib/test/client.reconnectFarm.spec.js +88 -0
- package/lib/test/client.reconnectFarm.spec.js.map +1 -0
- package/lib/test/client.replay.spec.d.ts +6 -0
- package/lib/test/client.replay.spec.d.ts.map +1 -0
- package/lib/test/client.replay.spec.js +57 -0
- package/lib/test/client.replay.spec.js.map +1 -0
- package/lib/test/client.rollback.spec.d.ts +6 -0
- package/lib/test/client.rollback.spec.d.ts.map +1 -0
- package/lib/test/client.rollback.spec.js +451 -0
- package/lib/test/client.rollback.spec.js.map +1 -0
- package/lib/test/client.rollbackFarm.spec.d.ts +6 -0
- package/lib/test/client.rollbackFarm.spec.d.ts.map +1 -0
- package/lib/test/client.rollbackFarm.spec.js +46 -0
- package/lib/test/client.rollbackFarm.spec.js.map +1 -0
- package/lib/test/client.searchForMarker.spec.d.ts +6 -0
- package/lib/test/client.searchForMarker.spec.d.ts.map +1 -0
- package/lib/test/client.searchForMarker.spec.js +495 -0
- package/lib/test/client.searchForMarker.spec.js.map +1 -0
- package/lib/test/client.walkSegments.spec.d.ts +6 -0
- package/lib/test/client.walkSegments.spec.d.ts.map +1 -0
- package/lib/test/client.walkSegments.spec.js +52 -0
- package/lib/test/client.walkSegments.spec.js.map +1 -0
- package/lib/test/collections.list.spec.d.ts +6 -0
- package/lib/test/collections.list.spec.d.ts.map +1 -0
- package/lib/test/collections.list.spec.js +82 -0
- package/lib/test/collections.list.spec.js.map +1 -0
- package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
- package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +33 -0
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
- package/lib/test/dirname.cjs +16 -0
- package/lib/test/dirname.cjs.map +1 -0
- package/lib/test/dirname.d.cts +6 -0
- package/lib/test/dirname.d.cts.map +1 -0
- package/lib/test/index.d.ts +13 -0
- package/lib/test/index.d.ts.map +1 -0
- package/lib/test/index.js +13 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
- package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +140 -0
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
- package/lib/test/mergeTree.annotate.spec.d.ts +6 -0
- package/lib/test/mergeTree.annotate.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.annotate.spec.js +446 -0
- package/lib/test/mergeTree.annotate.spec.js.map +1 -0
- package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
- package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +124 -0
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
- package/lib/test/mergeTree.insertingWalk.spec.d.ts +6 -0
- package/lib/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.insertingWalk.spec.js +277 -0
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -0
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +176 -0
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js +128 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
- package/lib/test/mergeTree.walk.spec.d.ts +6 -0
- package/lib/test/mergeTree.walk.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.walk.spec.js +61 -0
- package/lib/test/mergeTree.walk.spec.js.map +1 -0
- package/lib/test/mergeTree.zamboni.spec.d.ts +6 -0
- package/lib/test/mergeTree.zamboni.spec.d.ts.map +1 -0
- package/lib/test/mergeTree.zamboni.spec.js +50 -0
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -0
- package/lib/test/mergeTreeOperationRunner.d.ts +63 -0
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -0
- package/lib/test/mergeTreeOperationRunner.js +207 -0
- package/lib/test/mergeTreeOperationRunner.js.map +1 -0
- package/lib/test/mergeTreeOperationRunner.spec.d.ts +6 -0
- package/lib/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
- package/lib/test/mergeTreeOperationRunner.spec.js +154 -0
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -0
- package/lib/test/obliterate.concurrent.spec.d.ts +6 -0
- package/lib/test/obliterate.concurrent.spec.d.ts.map +1 -0
- package/lib/test/obliterate.concurrent.spec.js +1441 -0
- package/lib/test/obliterate.concurrent.spec.js.map +1 -0
- package/lib/test/obliterate.deltaCallback.spec.d.ts +6 -0
- package/lib/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
- package/lib/test/obliterate.deltaCallback.spec.js +144 -0
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -0
- package/lib/test/obliterate.partialLength.spec.d.ts +6 -0
- package/lib/test/obliterate.partialLength.spec.d.ts.map +1 -0
- package/lib/test/obliterate.partialLength.spec.js +272 -0
- package/lib/test/obliterate.partialLength.spec.js.map +1 -0
- package/lib/test/obliterate.reconnect.spec.d.ts +6 -0
- package/lib/test/obliterate.reconnect.spec.d.ts.map +1 -0
- package/lib/test/obliterate.reconnect.spec.js +159 -0
- package/lib/test/obliterate.reconnect.spec.js.map +1 -0
- package/lib/test/obliterate.spec.d.ts +6 -0
- package/lib/test/obliterate.spec.d.ts.map +1 -0
- package/lib/test/obliterate.spec.js +160 -0
- package/lib/test/obliterate.spec.js.map +1 -0
- package/lib/test/ordinal.spec.d.ts +2 -0
- package/lib/test/ordinal.spec.d.ts.map +1 -0
- package/lib/test/ordinal.spec.js +38 -0
- package/lib/test/ordinal.spec.js.map +1 -0
- package/lib/test/partialLength.spec.d.ts +6 -0
- package/lib/test/partialLength.spec.d.ts.map +1 -0
- package/lib/test/partialLength.spec.js +274 -0
- package/lib/test/partialLength.spec.js.map +1 -0
- package/lib/test/properties.spec.d.ts +6 -0
- package/lib/test/properties.spec.d.ts.map +1 -0
- package/lib/test/properties.spec.js +53 -0
- package/lib/test/properties.spec.js.map +1 -0
- package/lib/test/reconnectHelper.d.ts +48 -0
- package/lib/test/reconnectHelper.d.ts.map +1 -0
- package/lib/test/reconnectHelper.js +82 -0
- package/lib/test/reconnectHelper.js.map +1 -0
- package/lib/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
- package/lib/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
- package/lib/test/resetPendingSegmentsToOp.spec.js +235 -0
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -0
- package/lib/test/revertibleFarm.spec.d.ts +6 -0
- package/lib/test/revertibleFarm.spec.d.ts.map +1 -0
- package/lib/test/revertibleFarm.spec.js +119 -0
- package/lib/test/revertibleFarm.spec.js.map +1 -0
- package/lib/test/revertibles.spec.d.ts +17 -0
- package/lib/test/revertibles.spec.d.ts.map +1 -0
- package/lib/test/revertibles.spec.js +381 -0
- package/lib/test/revertibles.spec.js.map +1 -0
- package/lib/test/segmentGroupCollection.spec.d.ts +6 -0
- package/lib/test/segmentGroupCollection.spec.d.ts.map +1 -0
- package/lib/test/segmentGroupCollection.spec.js +58 -0
- package/lib/test/segmentGroupCollection.spec.js.map +1 -0
- package/lib/test/snapshot.spec.d.ts +6 -0
- package/lib/test/snapshot.spec.d.ts.map +1 -0
- package/lib/test/snapshot.spec.js +176 -0
- package/lib/test/snapshot.spec.js.map +1 -0
- package/lib/test/snapshot.utils.d.ts +33 -0
- package/lib/test/snapshot.utils.d.ts.map +1 -0
- package/lib/test/snapshot.utils.js +104 -0
- package/lib/test/snapshot.utils.js.map +1 -0
- package/lib/test/snapshotlegacy.spec.d.ts +6 -0
- package/lib/test/snapshotlegacy.spec.d.ts.map +1 -0
- package/lib/test/snapshotlegacy.spec.js +137 -0
- package/lib/test/snapshotlegacy.spec.js.map +1 -0
- package/lib/test/sortedSegmentSet.spec.d.ts +6 -0
- package/lib/test/sortedSegmentSet.spec.d.ts.map +1 -0
- package/lib/test/sortedSegmentSet.spec.js +93 -0
- package/lib/test/sortedSegmentSet.spec.js.map +1 -0
- package/lib/test/testClient.d.ts +116 -0
- package/lib/test/testClient.d.ts.map +1 -0
- package/lib/test/testClient.js +430 -0
- package/lib/test/testClient.js.map +1 -0
- package/lib/test/testClientLogger.d.ts +44 -0
- package/lib/test/testClientLogger.d.ts.map +1 -0
- package/lib/test/testClientLogger.js +282 -0
- package/lib/test/testClientLogger.js.map +1 -0
- package/lib/test/testSerializer.d.ts +18 -0
- package/lib/test/testSerializer.d.ts.map +1 -0
- package/lib/test/testSerializer.js +29 -0
- package/lib/test/testSerializer.js.map +1 -0
- package/lib/test/testServer.d.ts +36 -0
- package/lib/test/testServer.d.ts.map +1 -0
- package/lib/test/testServer.js +133 -0
- package/lib/test/testServer.js.map +1 -0
- package/lib/test/testUtils.d.ts +77 -0
- package/lib/test/testUtils.d.ts.map +1 -0
- package/lib/test/testUtils.js +151 -0
- package/lib/test/testUtils.js.map +1 -0
- package/lib/test/text.d.ts +9 -0
- package/lib/test/text.d.ts.map +1 -0
- package/lib/test/text.js +71 -0
- package/lib/test/text.js.map +1 -0
- package/lib/test/tracking.spec.d.ts +6 -0
- package/lib/test/tracking.spec.d.ts.map +1 -0
- package/lib/test/tracking.spec.js +118 -0
- package/lib/test/tracking.spec.js.map +1 -0
- package/lib/test/types/validateMergeTreePrevious.generated.d.ts +2 -0
- package/lib/test/types/validateMergeTreePrevious.generated.d.ts.map +1 -0
- package/lib/test/types/validateMergeTreePrevious.generated.js +228 -0
- package/lib/test/types/validateMergeTreePrevious.generated.js.map +1 -0
- package/lib/test/wordUnitTests.spec.d.ts +6 -0
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -0
- package/lib/test/wordUnitTests.spec.js +166 -0
- package/lib/test/wordUnitTests.spec.js.map +1 -0
- package/lib/{textSegment.d.mts → textSegment.d.ts} +4 -4
- package/lib/textSegment.d.ts.map +1 -0
- package/lib/{textSegment.mjs → textSegment.js} +2 -2
- package/lib/textSegment.js.map +1 -0
- package/lib/{zamboni.d.mts → zamboni.d.ts} +3 -3
- package/lib/zamboni.d.ts.map +1 -0
- package/lib/{zamboni.mjs → zamboni.js} +7 -6
- package/lib/zamboni.js.map +1 -0
- package/package.json +50 -57
- package/src/MergeTreeTextHelper.ts +4 -4
- package/src/attributionCollection.ts +1 -1
- package/src/attributionPolicy.ts +5 -5
- package/src/client.ts +50 -41
- package/src/collections/index.ts +2 -2
- package/src/endOfTreeSegment.ts +5 -5
- package/src/index.ts +20 -20
- package/src/localReference.ts +13 -7
- package/src/mergeTree.ts +53 -44
- package/src/mergeTreeDeltaCallback.ts +3 -8
- package/src/mergeTreeNodeWalk.ts +1 -1
- package/src/mergeTreeNodes.ts +21 -19
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +3 -3
- package/src/partialLengths.ts +10 -10
- package/src/referencePositions.ts +4 -4
- package/src/revertibles.ts +14 -18
- package/src/segmentGroupCollection.ts +2 -2
- package/src/segmentPropertiesManager.ts +3 -3
- package/src/snapshotChunks.ts +4 -4
- package/src/snapshotLoader.ts +14 -11
- package/src/snapshotV1.ts +29 -9
- package/src/snapshotlegacy.ts +19 -5
- package/src/sortedSegmentSet.ts +3 -3
- package/src/textSegment.ts +3 -3
- package/src/zamboni.ts +7 -7
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/api-extractor-esm.json +0 -17
- package/dist/test/beastTest.d.ts.map +0 -1
- package/dist/test/beastTest.js.map +0 -1
- package/dist/test/client.apis.d.ts.map +0 -1
- package/dist/test/client.apis.js.map +0 -1
- package/dist/test/wordUnitTests.d.ts.map +0 -1
- package/dist/test/wordUnitTests.js.map +0 -1
- package/lib/MergeTreeTextHelper.d.mts.map +0 -1
- package/lib/MergeTreeTextHelper.mjs.map +0 -1
- package/lib/attributionCollection.d.mts.map +0 -1
- package/lib/attributionCollection.mjs.map +0 -1
- package/lib/attributionPolicy.d.mts.map +0 -1
- package/lib/attributionPolicy.mjs.map +0 -1
- package/lib/client.d.mts.map +0 -1
- package/lib/client.mjs.map +0 -1
- package/lib/collections/index.d.mts.map +0 -1
- package/lib/collections/index.mjs +0 -7
- package/lib/collections/index.mjs.map +0 -1
- package/lib/collections/list.d.mts.map +0 -1
- package/lib/collections/list.mjs.map +0 -1
- package/lib/collections/rbTree.d.mts.map +0 -1
- package/lib/collections/rbTree.mjs.map +0 -1
- package/lib/constants.d.mts.map +0 -1
- package/lib/constants.mjs.map +0 -1
- package/lib/endOfTreeSegment.d.mts.map +0 -1
- package/lib/endOfTreeSegment.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs.map +0 -1
- package/lib/localReference.d.mts.map +0 -1
- package/lib/localReference.mjs.map +0 -1
- package/lib/merge-tree-beta.d.mts +0 -668
- package/lib/merge-tree-public.d.mts +0 -668
- package/lib/mergeTree.d.mts.map +0 -1
- package/lib/mergeTree.mjs.map +0 -1
- package/lib/mergeTreeDeltaCallback.d.mts.map +0 -1
- package/lib/mergeTreeDeltaCallback.mjs.map +0 -1
- package/lib/mergeTreeNodeWalk.d.mts.map +0 -1
- package/lib/mergeTreeNodeWalk.mjs.map +0 -1
- package/lib/mergeTreeNodes.d.mts.map +0 -1
- package/lib/mergeTreeNodes.mjs.map +0 -1
- package/lib/mergeTreeTracking.d.mts.map +0 -1
- package/lib/mergeTreeTracking.mjs.map +0 -1
- package/lib/opBuilder.mjs.map +0 -1
- package/lib/ops.d.mts.map +0 -1
- package/lib/ops.mjs.map +0 -1
- package/lib/ordinal.d.mts.map +0 -1
- package/lib/ordinal.mjs.map +0 -1
- package/lib/partialLengths.d.mts.map +0 -1
- package/lib/partialLengths.mjs.map +0 -1
- package/lib/properties.d.mts.map +0 -1
- package/lib/properties.mjs.map +0 -1
- package/lib/referencePositions.d.mts.map +0 -1
- package/lib/referencePositions.mjs.map +0 -1
- package/lib/revertibles.d.mts.map +0 -1
- package/lib/revertibles.mjs.map +0 -1
- package/lib/segmentGroupCollection.d.mts.map +0 -1
- package/lib/segmentGroupCollection.mjs.map +0 -1
- package/lib/segmentPropertiesManager.d.mts.map +0 -1
- package/lib/segmentPropertiesManager.mjs.map +0 -1
- package/lib/snapshotChunks.d.mts.map +0 -1
- package/lib/snapshotChunks.mjs.map +0 -1
- package/lib/snapshotLoader.d.mts.map +0 -1
- package/lib/snapshotLoader.mjs.map +0 -1
- package/lib/snapshotV1.d.mts.map +0 -1
- package/lib/snapshotV1.mjs.map +0 -1
- package/lib/snapshotlegacy.d.mts.map +0 -1
- package/lib/snapshotlegacy.mjs.map +0 -1
- package/lib/sortedSegmentSet.d.mts.map +0 -1
- package/lib/sortedSegmentSet.mjs.map +0 -1
- package/lib/sortedSet.d.mts.map +0 -1
- package/lib/sortedSet.mjs.map +0 -1
- package/lib/textSegment.d.mts.map +0 -1
- package/lib/textSegment.mjs.map +0 -1
- package/lib/zamboni.d.mts.map +0 -1
- package/lib/zamboni.mjs.map +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { SortedSegmentSet } from "../sortedSegmentSet.js";
|
|
7
|
+
import { ReferenceType } from "../ops.js";
|
|
8
|
+
import { TrackingGroup } from "../mergeTreeTracking.js";
|
|
9
|
+
import { TestClient } from "./testClient.js";
|
|
10
|
+
const segmentCount = 15;
|
|
11
|
+
function validateSorted(set, getOrdinal, prefix) {
|
|
12
|
+
for (let i = 0; i < set.size - 1; i++) {
|
|
13
|
+
const a = getOrdinal(set.items[i]);
|
|
14
|
+
const b = getOrdinal(set.items[i + 1]);
|
|
15
|
+
assert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);
|
|
16
|
+
assert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);
|
|
17
|
+
assert(a <= b, `${prefix}: Not sorted at item ${i}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function validateSet(client, set, getOrdinal) {
|
|
21
|
+
validateSorted(set, getOrdinal, "initial");
|
|
22
|
+
// add content to shift ordinals in tree
|
|
23
|
+
for (let i = 0; i < segmentCount * 5; i++) {
|
|
24
|
+
client.insertTextLocal((i * 3) % client.getLength(), `X`);
|
|
25
|
+
}
|
|
26
|
+
validateSorted(set, getOrdinal, "after insert");
|
|
27
|
+
for (let i = set.size; set.size > 0; i += set.size) {
|
|
28
|
+
// jump around the list a bit, so its not just an in-order remove
|
|
29
|
+
const item = set.items[i % set.size];
|
|
30
|
+
assert.equal(set.remove(item), true, "remove failed");
|
|
31
|
+
assert.equal(set.has(item), false);
|
|
32
|
+
validateSorted(set, getOrdinal, "during remove");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
describe("SortedSegmentSet", () => {
|
|
36
|
+
const localUserLongId = "localUser";
|
|
37
|
+
let client;
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
client = new TestClient();
|
|
40
|
+
for (let i = 0; i < segmentCount; i++) {
|
|
41
|
+
client.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));
|
|
42
|
+
}
|
|
43
|
+
client.startOrUpdateCollaboration(localUserLongId);
|
|
44
|
+
});
|
|
45
|
+
it("SortedSegmentSet of objects with segments", () => {
|
|
46
|
+
const set = new SortedSegmentSet();
|
|
47
|
+
for (let i = 0; i < client.getLength(); i++) {
|
|
48
|
+
for (const pos of [i, client.getLength() - 1 - i]) {
|
|
49
|
+
const segment = client.getContainingSegment(pos).segment;
|
|
50
|
+
assert(segment);
|
|
51
|
+
const item = { segment };
|
|
52
|
+
assert.equal(set.has(item), false);
|
|
53
|
+
set.addOrUpdate(item);
|
|
54
|
+
assert.equal(set.has(item), true);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
assert.equal(set.size, client.getLength() * 2);
|
|
58
|
+
validateSet(client, set, (i) => i.segment.ordinal);
|
|
59
|
+
});
|
|
60
|
+
it("SortedSegmentSet of segments", () => {
|
|
61
|
+
const set = new SortedSegmentSet();
|
|
62
|
+
for (let i = 0; i < client.getLength(); i++) {
|
|
63
|
+
for (const pos of [i, client.getLength() - 1 - i]) {
|
|
64
|
+
const segment = client.getContainingSegment(pos).segment;
|
|
65
|
+
assert(segment);
|
|
66
|
+
set.addOrUpdate(segment);
|
|
67
|
+
assert.equal(set.has(segment), true);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
assert.equal(set.size, segmentCount);
|
|
71
|
+
validateSet(client, set, (i) => i.ordinal);
|
|
72
|
+
});
|
|
73
|
+
it("SortedSegmentSet of local references", () => {
|
|
74
|
+
// using a sorted segment set directly creates problems,
|
|
75
|
+
// as we don't correctly split, or merge, so leverage
|
|
76
|
+
// the tracking group for correct behavior in those case
|
|
77
|
+
// and spy it's internal set
|
|
78
|
+
const set = new TrackingGroup();
|
|
79
|
+
for (let i = 0; i < client.getLength(); i++) {
|
|
80
|
+
for (const pos of [i, client.getLength() - 1 - i]) {
|
|
81
|
+
const segmentInfo = client.getContainingSegment(pos);
|
|
82
|
+
assert(segmentInfo?.segment);
|
|
83
|
+
const lref = client.createLocalReferencePosition(segmentInfo.segment, segmentInfo.offset, ReferenceType.SlideOnRemove, undefined);
|
|
84
|
+
assert.equal(set.has(lref), false);
|
|
85
|
+
set.link(lref);
|
|
86
|
+
assert.equal(set.has(lref), true);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
assert.equal(set.size, client.getLength() * 2);
|
|
90
|
+
validateSet(client, set.trackedSet, (i) => i.getSegment()?.ordinal);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=sortedSegmentSet.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortedSegmentSet.spec.js","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SortedSegmentSet, SortedSegmentSetItem } from \"../sortedSegmentSet.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { LocalReferencePosition } from \"../localReference.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { TestClient } from \"./testClient.js\";\nconst segmentCount = 15;\n\nfunction validateSorted<T extends SortedSegmentSetItem>(\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n\tprefix: string,\n) {\n\tfor (let i = 0; i < set.size - 1; i++) {\n\t\tconst a = getOrdinal(set.items[i]);\n\t\tconst b = getOrdinal(set.items[i + 1]);\n\t\tassert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);\n\t\tassert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);\n\t\tassert(a <= b, `${prefix}: Not sorted at item ${i}`);\n\t}\n}\n\nfunction validateSet<T extends SortedSegmentSetItem>(\n\tclient: TestClient,\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n) {\n\tvalidateSorted(set, getOrdinal, \"initial\");\n\n\t// add content to shift ordinals in tree\n\tfor (let i = 0; i < segmentCount * 5; i++) {\n\t\tclient.insertTextLocal((i * 3) % client.getLength(), `X`);\n\t}\n\tvalidateSorted(set, getOrdinal, \"after insert\");\n\n\tfor (let i = set.size; set.size > 0; i += set.size) {\n\t\t// jump around the list a bit, so its not just an in-order remove\n\t\tconst item = set.items[i % set.size];\n\t\tassert.equal(set.remove(item), true, \"remove failed\");\n\t\tassert.equal(set.has(item), false);\n\t\tvalidateSorted(set, getOrdinal, \"during remove\");\n\t}\n}\n\ndescribe(\"SortedSegmentSet\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tclient.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"SortedSegmentSet of objects with segments\", () => {\n\t\tconst set = new SortedSegmentSet<{ segment: ISegment }>();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tconst item = { segment };\n\t\t\t\tassert.equal(set.has(item), false);\n\t\t\t\tset.addOrUpdate(item);\n\t\t\t\tassert.equal(set.has(item), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet(client, set, (i) => i.segment.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of segments\", () => {\n\t\tconst set = new SortedSegmentSet();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tset.addOrUpdate(segment);\n\t\t\t\tassert.equal(set.has(segment), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, segmentCount);\n\t\tvalidateSet(client, set, (i) => i.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of local references\", () => {\n\t\t// using a sorted segment set directly creates problems,\n\t\t// as we don't correctly split, or merge, so leverage\n\t\t// the tracking group for correct behavior in those case\n\t\t// and spy it's internal set\n\t\tconst set = new TrackingGroup();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segmentInfo = client.getContainingSegment(pos);\n\t\t\t\tassert(segmentInfo?.segment);\n\t\t\t\tconst lref = client.createLocalReferencePosition(\n\t\t\t\t\tsegmentInfo.segment,\n\t\t\t\t\tsegmentInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tassert.equal(set.has(lref), false);\n\t\t\t\tset.link(lref);\n\t\t\t\tassert.equal(set.has(lref), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet<LocalReferencePosition>(\n\t\t\tclient,\n\t\t\t(set as any).trackedSet,\n\t\t\t(i) => i.getSegment()?.ordinal,\n\t\t);\n\t});\n});\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { ISequencedDocumentMessage, ISummaryTree, ITree } from "@fluidframework/protocol-definitions";
|
|
6
|
+
import { MockStorage } from "@fluidframework/test-runtime-utils";
|
|
7
|
+
import { AttributionKey } from "@fluidframework/runtime-definitions";
|
|
8
|
+
import { Client } from "../client.js";
|
|
9
|
+
import { DoublyLinkedList } from "../collections/index.js";
|
|
10
|
+
import { ISegment } from "../mergeTreeNodes.js";
|
|
11
|
+
import { IJSONSegment, IMarkerDef, IMergeTreeOp, ReferenceType } from "../ops.js";
|
|
12
|
+
import { PropertySet } from "../properties.js";
|
|
13
|
+
import { MergeTree } from "../mergeTree.js";
|
|
14
|
+
import { IMergeTreeDeltaOpArgs } from "../mergeTreeDeltaCallback.js";
|
|
15
|
+
import { MergeTreeRevertibleDriver } from "../revertibles.js";
|
|
16
|
+
import { IMergeTreeOptions, ReferencePosition } from "../index.js";
|
|
17
|
+
import { TestSerializer } from "./testSerializer.js";
|
|
18
|
+
export declare function specToSegment(spec: IJSONSegment): ISegment;
|
|
19
|
+
export declare class TestClient extends Client {
|
|
20
|
+
static searchChunkSize: number;
|
|
21
|
+
static readonly serializer: TestSerializer;
|
|
22
|
+
measureOps: boolean;
|
|
23
|
+
accumTime: number;
|
|
24
|
+
accumWindowTime: number;
|
|
25
|
+
accumWindow: number;
|
|
26
|
+
accumOps: number;
|
|
27
|
+
maxWindowTime: number;
|
|
28
|
+
/**
|
|
29
|
+
* Used for in-memory testing. This will queue a reference string for each client message.
|
|
30
|
+
*/
|
|
31
|
+
static useCheckQ: boolean;
|
|
32
|
+
static createFromClientSnapshot(client1: TestClient, newLongClientId: string): Promise<TestClient>;
|
|
33
|
+
static createFromSnapshot(snapshotTree: ITree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegment, options?: PropertySet): Promise<TestClient>;
|
|
34
|
+
static createFromSummary(summaryTree: ISummaryTree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegment, options?: PropertySet): Promise<TestClient>;
|
|
35
|
+
static createFromStorage(storage: MockStorage, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegment, options?: PropertySet): Promise<TestClient>;
|
|
36
|
+
readonly mergeTree: MergeTree;
|
|
37
|
+
readonly checkQ: DoublyLinkedList<string>;
|
|
38
|
+
protected readonly q: DoublyLinkedList<ISequencedDocumentMessage>;
|
|
39
|
+
private readonly textHelper;
|
|
40
|
+
constructor(options?: IMergeTreeOptions & PropertySet, specToSeg?: typeof specToSegment, getMinInFlightRefSeq?: () => number | undefined);
|
|
41
|
+
obliterateRange({ start, end, refSeq, clientId, seq, overwrite, opArgs, }: {
|
|
42
|
+
start: number;
|
|
43
|
+
end: number;
|
|
44
|
+
refSeq: number;
|
|
45
|
+
clientId: number;
|
|
46
|
+
seq: number;
|
|
47
|
+
overwrite?: boolean;
|
|
48
|
+
opArgs: IMergeTreeDeltaOpArgs;
|
|
49
|
+
}): void;
|
|
50
|
+
getText(start?: number, end?: number): string;
|
|
51
|
+
enqueueTestString(): void;
|
|
52
|
+
getMessageCount(): number;
|
|
53
|
+
enqueueMsg(msg: ISequencedDocumentMessage): void;
|
|
54
|
+
dequeueMsg(): ISequencedDocumentMessage | undefined;
|
|
55
|
+
applyMessages(msgCount: number): boolean;
|
|
56
|
+
insertTextLocal(pos: number, text: string, props?: PropertySet): import("../ops.js").IMergeTreeInsertMsg | undefined;
|
|
57
|
+
insertTextRemote(pos: number, text: string, props: PropertySet | undefined, seq: number, refSeq: number, longClientId: string): void;
|
|
58
|
+
removeRangeRemote(start: number, end: number, seq: number, refSeq: number, longClientId: string): void;
|
|
59
|
+
annotateRangeRemote(start: number, end: number, props: PropertySet, seq: number, refSeq: number, longClientId: string): void;
|
|
60
|
+
insertMarkerLocal(pos: number, behaviors: ReferenceType, props?: PropertySet): import("../ops.js").IMergeTreeInsertMsg | undefined;
|
|
61
|
+
insertMarkerRemote(pos: number, markerDef: IMarkerDef, props: PropertySet, seq: number, refSeq: number, longClientId: string): void;
|
|
62
|
+
relText(clientId: number, refSeq: number): string;
|
|
63
|
+
makeOpMessage(op: IMergeTreeOp | undefined, seq?: number, refSeq?: number, longClientId?: string, minSeqNumber?: number): ISequencedDocumentMessage;
|
|
64
|
+
validate(): void;
|
|
65
|
+
searchFromPos(pos: number, target: RegExp): {
|
|
66
|
+
text: string;
|
|
67
|
+
pos: number;
|
|
68
|
+
} | undefined;
|
|
69
|
+
findRandomWord(): {
|
|
70
|
+
text: string;
|
|
71
|
+
pos: number;
|
|
72
|
+
} | undefined;
|
|
73
|
+
debugDumpTree(tree: MergeTree): void;
|
|
74
|
+
/**
|
|
75
|
+
* Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective
|
|
76
|
+
* of the current sequence number. This is desirable when rebasing operations for reconnection. Perform
|
|
77
|
+
* slow-path computations in this function without leveraging the merge-tree's structure
|
|
78
|
+
*/
|
|
79
|
+
rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number;
|
|
80
|
+
findReconnectionPosition(segment: ISegment, localSeq: number): number;
|
|
81
|
+
/**
|
|
82
|
+
* @param channel - Attribution channel name to request information from.
|
|
83
|
+
* @returns an array of all attribution seq#s from the current perspective.
|
|
84
|
+
* The `i`th entry of the array is the attribution key for the character at position `i`.
|
|
85
|
+
* Validates segments either all have attribution information or none of them.
|
|
86
|
+
* If no segment has attribution information, returns undefined.
|
|
87
|
+
*/
|
|
88
|
+
getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[];
|
|
89
|
+
/**
|
|
90
|
+
* Override and add some test only metrics
|
|
91
|
+
*/
|
|
92
|
+
applyMsg(msg: ISequencedDocumentMessage, local?: boolean): void;
|
|
93
|
+
/**
|
|
94
|
+
* Override and add some test only metrics
|
|
95
|
+
*/
|
|
96
|
+
updateMinSeq(minSeq: number): void;
|
|
97
|
+
slowSearchForMarker(startPos: number, markerLabel: string, forwards?: boolean): ReferencePosition | undefined;
|
|
98
|
+
}
|
|
99
|
+
export type TestClientRevertibleDriver = MergeTreeRevertibleDriver & Partial<{
|
|
100
|
+
submitOpCallback?: (op: IMergeTreeOp | undefined) => void;
|
|
101
|
+
}>;
|
|
102
|
+
export declare const createRevertDriver: (client: TestClient) => TestClientRevertibleDriver;
|
|
103
|
+
export interface MergeTreeStats {
|
|
104
|
+
maxHeight: number;
|
|
105
|
+
nodeCount: number;
|
|
106
|
+
leafCount: number;
|
|
107
|
+
removedLeafCount: number;
|
|
108
|
+
liveCount: number;
|
|
109
|
+
histo: number[];
|
|
110
|
+
windowTime?: number;
|
|
111
|
+
packTime?: number;
|
|
112
|
+
ordTime?: number;
|
|
113
|
+
maxOrdTime?: number;
|
|
114
|
+
}
|
|
115
|
+
export declare function getStats(tree: MergeTree): MergeTreeStats;
|
|
116
|
+
//# sourceMappingURL=testClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testClient.d.ts","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { makeRandom } from "@fluid-private/stochastic-test-utils";
|
|
7
|
+
import { createChildLogger } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { MessageType, } from "@fluidframework/protocol-definitions";
|
|
9
|
+
import { MockStorage } from "@fluidframework/test-runtime-utils";
|
|
10
|
+
import { Trace } from "@fluid-internal/client-utils";
|
|
11
|
+
import { Client } from "../client.js";
|
|
12
|
+
import { DoublyLinkedList } from "../collections/index.js";
|
|
13
|
+
import { UnassignedSequenceNumber } from "../constants.js";
|
|
14
|
+
import { Marker, MaxNodesInBlock } from "../mergeTreeNodes.js";
|
|
15
|
+
import { createAnnotateRangeOp, createInsertSegmentOp, createRemoveRangeOp } from "../opBuilder.js";
|
|
16
|
+
import { MergeTreeDeltaType, ReferenceType, } from "../ops.js";
|
|
17
|
+
import { SnapshotLegacy } from "../snapshotlegacy.js";
|
|
18
|
+
import { TextSegment } from "../textSegment.js";
|
|
19
|
+
import { getSlideToSegoff } from "../mergeTree.js";
|
|
20
|
+
import { MergeTreeTextHelper } from "../MergeTreeTextHelper.js";
|
|
21
|
+
import { backwardExcursion, forwardExcursion, walkAllChildSegments } from "../mergeTreeNodeWalk.js";
|
|
22
|
+
import { DetachedReferencePosition, refHasTileLabel } from "../referencePositions.js";
|
|
23
|
+
import { TestSerializer } from "./testSerializer.js";
|
|
24
|
+
import { nodeOrdinalsHaveIntegrity } from "./testUtils.js";
|
|
25
|
+
export function specToSegment(spec) {
|
|
26
|
+
const maybeText = TextSegment.fromJSONObject(spec);
|
|
27
|
+
if (maybeText) {
|
|
28
|
+
return maybeText;
|
|
29
|
+
}
|
|
30
|
+
const maybeMarker = Marker.fromJSONObject(spec);
|
|
31
|
+
if (maybeMarker) {
|
|
32
|
+
return maybeMarker;
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`Unrecognized IJSONSegment type: '${JSON.stringify(spec)}'`);
|
|
35
|
+
}
|
|
36
|
+
const random = makeRandom(0xdeadbeef, 0xfeedbed);
|
|
37
|
+
export class TestClient extends Client {
|
|
38
|
+
static async createFromClientSnapshot(client1, newLongClientId) {
|
|
39
|
+
const snapshot = new SnapshotLegacy(client1.mergeTree, createChildLogger({ namespace: "fluid:snapshot" }));
|
|
40
|
+
snapshot.extractSync();
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
42
|
+
const summaryTree = snapshot.emit([], TestClient.serializer, undefined).summary;
|
|
43
|
+
return TestClient.createFromSummary(summaryTree, newLongClientId, client1.specToSegment, client1.mergeTree.options);
|
|
44
|
+
}
|
|
45
|
+
static async createFromSnapshot(snapshotTree, newLongClientId, specToSeg, options) {
|
|
46
|
+
return TestClient.createFromStorage(new MockStorage(snapshotTree), newLongClientId, specToSeg, options);
|
|
47
|
+
}
|
|
48
|
+
static async createFromSummary(summaryTree, newLongClientId, specToSeg, options) {
|
|
49
|
+
return TestClient.createFromStorage(MockStorage.createFromSummary(summaryTree), newLongClientId, specToSeg, options);
|
|
50
|
+
}
|
|
51
|
+
static async createFromStorage(storage, newLongClientId, specToSeg, options) {
|
|
52
|
+
const client2 = new TestClient(options, specToSeg);
|
|
53
|
+
const { catchupOpsP } = await client2.load({
|
|
54
|
+
logger: client2.logger,
|
|
55
|
+
clientId: newLongClientId,
|
|
56
|
+
}, storage, TestClient.serializer);
|
|
57
|
+
await catchupOpsP;
|
|
58
|
+
return client2;
|
|
59
|
+
}
|
|
60
|
+
constructor(options, specToSeg = specToSegment, getMinInFlightRefSeq = () => undefined) {
|
|
61
|
+
super(specToSeg, createChildLogger({ namespace: "fluid:testClient" }), options, getMinInFlightRefSeq);
|
|
62
|
+
this.measureOps = false;
|
|
63
|
+
this.accumTime = 0;
|
|
64
|
+
this.accumWindowTime = 0;
|
|
65
|
+
this.accumWindow = 0;
|
|
66
|
+
this.accumOps = 0;
|
|
67
|
+
this.maxWindowTime = 0;
|
|
68
|
+
this.checkQ = new DoublyLinkedList();
|
|
69
|
+
this.q = new DoublyLinkedList();
|
|
70
|
+
this.mergeTree = this._mergeTree;
|
|
71
|
+
this.textHelper = new MergeTreeTextHelper(this.mergeTree);
|
|
72
|
+
// Validate by default
|
|
73
|
+
this.on("delta", (o, d) => {
|
|
74
|
+
// assert.notEqual(d.deltaSegments.length, 0);
|
|
75
|
+
d.deltaSegments.forEach((s) => {
|
|
76
|
+
if (d.operation === MergeTreeDeltaType.INSERT) {
|
|
77
|
+
const seg = s.segment;
|
|
78
|
+
assert.notEqual(seg.parent, undefined);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
obliterateRange({ start, end, refSeq, clientId, seq, overwrite = false, opArgs, }) {
|
|
84
|
+
this.mergeTree.obliterateRange(start, end, refSeq, clientId, seq, overwrite, opArgs);
|
|
85
|
+
}
|
|
86
|
+
getText(start, end) {
|
|
87
|
+
return this.textHelper.getText(this.getCurrentSeq(), this.getClientId(), "", start, end);
|
|
88
|
+
}
|
|
89
|
+
enqueueTestString() {
|
|
90
|
+
this.checkQ.push(this.getText());
|
|
91
|
+
}
|
|
92
|
+
getMessageCount() {
|
|
93
|
+
return this.q.length;
|
|
94
|
+
}
|
|
95
|
+
enqueueMsg(msg) {
|
|
96
|
+
this.q.push(msg);
|
|
97
|
+
}
|
|
98
|
+
dequeueMsg() {
|
|
99
|
+
return this.q.shift()?.data;
|
|
100
|
+
}
|
|
101
|
+
applyMessages(msgCount) {
|
|
102
|
+
let currMsgCount = msgCount;
|
|
103
|
+
while (currMsgCount > 0) {
|
|
104
|
+
const msg = this.dequeueMsg();
|
|
105
|
+
if (msg) {
|
|
106
|
+
this.applyMsg(msg);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
currMsgCount--;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
insertTextLocal(pos, text, props) {
|
|
116
|
+
const segment = new TextSegment(text);
|
|
117
|
+
if (props) {
|
|
118
|
+
segment.addProperties(props);
|
|
119
|
+
}
|
|
120
|
+
return this.insertSegmentLocal(pos, segment);
|
|
121
|
+
}
|
|
122
|
+
insertTextRemote(pos, text, props, seq, refSeq, longClientId) {
|
|
123
|
+
const segment = new TextSegment(text);
|
|
124
|
+
if (props) {
|
|
125
|
+
segment.addProperties(props);
|
|
126
|
+
}
|
|
127
|
+
this.applyMsg(this.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId));
|
|
128
|
+
}
|
|
129
|
+
removeRangeRemote(start, end, seq, refSeq, longClientId) {
|
|
130
|
+
this.applyMsg(this.makeOpMessage(createRemoveRangeOp(start, end), seq, refSeq, longClientId));
|
|
131
|
+
}
|
|
132
|
+
annotateRangeRemote(start, end, props, seq, refSeq, longClientId) {
|
|
133
|
+
this.applyMsg(this.makeOpMessage(createAnnotateRangeOp(start, end, props), seq, refSeq, longClientId));
|
|
134
|
+
}
|
|
135
|
+
insertMarkerLocal(pos, behaviors, props) {
|
|
136
|
+
const segment = new Marker(behaviors);
|
|
137
|
+
if (props) {
|
|
138
|
+
segment.addProperties(props);
|
|
139
|
+
}
|
|
140
|
+
return this.insertSegmentLocal(pos, segment);
|
|
141
|
+
}
|
|
142
|
+
insertMarkerRemote(pos, markerDef, props, seq, refSeq, longClientId) {
|
|
143
|
+
const segment = new Marker(markerDef.refType ?? ReferenceType.Tile);
|
|
144
|
+
if (props) {
|
|
145
|
+
segment.addProperties(props);
|
|
146
|
+
}
|
|
147
|
+
this.applyMsg(this.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId));
|
|
148
|
+
}
|
|
149
|
+
relText(clientId, refSeq) {
|
|
150
|
+
return `cli: ${this.getLongClientId(clientId)} refSeq: ${refSeq}: ${this.textHelper.getText(refSeq, clientId)}`;
|
|
151
|
+
}
|
|
152
|
+
makeOpMessage(op, seq = UnassignedSequenceNumber, refSeq = this.getCurrentSeq(), longClientId, minSeqNumber = 0) {
|
|
153
|
+
if (op === undefined) {
|
|
154
|
+
throw new Error("op cannot be undefined");
|
|
155
|
+
}
|
|
156
|
+
const msg = {
|
|
157
|
+
clientId: longClientId ?? this.longClientId ?? "",
|
|
158
|
+
clientSequenceNumber: 1,
|
|
159
|
+
contents: op,
|
|
160
|
+
metadata: undefined,
|
|
161
|
+
minimumSequenceNumber: minSeqNumber,
|
|
162
|
+
referenceSequenceNumber: refSeq,
|
|
163
|
+
sequenceNumber: seq,
|
|
164
|
+
timestamp: Date.now(),
|
|
165
|
+
traces: [],
|
|
166
|
+
type: MessageType.Operation,
|
|
167
|
+
};
|
|
168
|
+
return msg;
|
|
169
|
+
}
|
|
170
|
+
validate() {
|
|
171
|
+
assert(nodeOrdinalsHaveIntegrity(this.mergeTree.root));
|
|
172
|
+
}
|
|
173
|
+
searchFromPos(pos, target) {
|
|
174
|
+
let start = pos;
|
|
175
|
+
let chunk = "";
|
|
176
|
+
while (start < this.getLength()) {
|
|
177
|
+
chunk = this.getText(start, start + TestClient.searchChunkSize);
|
|
178
|
+
const result = chunk.match(target);
|
|
179
|
+
if (result?.index) {
|
|
180
|
+
return { text: result[0], pos: result.index + start };
|
|
181
|
+
}
|
|
182
|
+
start += TestClient.searchChunkSize;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
findRandomWord() {
|
|
186
|
+
const len = this.getLength();
|
|
187
|
+
const pos = random.integer(0, len);
|
|
188
|
+
const nextWord = this.searchFromPos(pos, /\s\w+\b/);
|
|
189
|
+
return nextWord;
|
|
190
|
+
}
|
|
191
|
+
debugDumpTree(tree) {
|
|
192
|
+
// want the segment's content and the state of insert/remove
|
|
193
|
+
const test = [];
|
|
194
|
+
walkAllChildSegments(tree.root, (segment) => {
|
|
195
|
+
const prefixes = [];
|
|
196
|
+
prefixes.push(segment.seq !== UnassignedSequenceNumber ? segment.seq : `L${segment.localSeq}`);
|
|
197
|
+
if (segment.removedSeq !== undefined) {
|
|
198
|
+
prefixes.push(segment.removedSeq !== UnassignedSequenceNumber
|
|
199
|
+
? segment.removedSeq
|
|
200
|
+
: `L${segment.localRemovedSeq}`);
|
|
201
|
+
}
|
|
202
|
+
test.push(`${prefixes.join(",")}:${segment.text}`);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective
|
|
207
|
+
* of the current sequence number. This is desirable when rebasing operations for reconnection. Perform
|
|
208
|
+
* slow-path computations in this function without leveraging the merge-tree's structure
|
|
209
|
+
*/
|
|
210
|
+
rebasePosition(pos, seqNumberFrom, localSeq) {
|
|
211
|
+
let segment;
|
|
212
|
+
let posAccumulated = 0;
|
|
213
|
+
let offset = pos;
|
|
214
|
+
const isInsertedInView = (seg) => (seg.seq !== undefined &&
|
|
215
|
+
seg.seq !== UnassignedSequenceNumber &&
|
|
216
|
+
seg.seq <= seqNumberFrom) ||
|
|
217
|
+
(seg.localSeq !== undefined && seg.localSeq <= localSeq);
|
|
218
|
+
const isRemovedFromView = ({ removedSeq, localRemovedSeq }) => (removedSeq !== undefined &&
|
|
219
|
+
removedSeq !== UnassignedSequenceNumber &&
|
|
220
|
+
removedSeq <= seqNumberFrom) ||
|
|
221
|
+
(localRemovedSeq !== undefined && localRemovedSeq <= localSeq);
|
|
222
|
+
walkAllChildSegments(this.mergeTree.root, (seg) => {
|
|
223
|
+
assert(seg.seq !== undefined || seg.localSeq !== undefined, "either seq or localSeq should be defined");
|
|
224
|
+
segment = seg;
|
|
225
|
+
if (isInsertedInView(seg) && !isRemovedFromView(seg)) {
|
|
226
|
+
posAccumulated += seg.cachedLength;
|
|
227
|
+
if (offset >= seg.cachedLength) {
|
|
228
|
+
offset -= seg.cachedLength;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Keep going while we've yet to reach the segment at the desired position
|
|
232
|
+
return posAccumulated <= pos;
|
|
233
|
+
});
|
|
234
|
+
assert(segment !== undefined, "No segment found");
|
|
235
|
+
const segoff = getSlideToSegoff({ segment, offset }) ?? segment;
|
|
236
|
+
if (segoff.segment === undefined || segoff.offset === undefined) {
|
|
237
|
+
return DetachedReferencePosition;
|
|
238
|
+
}
|
|
239
|
+
return this.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;
|
|
240
|
+
}
|
|
241
|
+
findReconnectionPosition(segment, localSeq) {
|
|
242
|
+
const fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);
|
|
243
|
+
let segmentPosition = 0;
|
|
244
|
+
const isInsertedInView = (seg) => seg.localSeq === undefined || seg.localSeq <= localSeq;
|
|
245
|
+
const isRemovedFromView = ({ removedSeq, localRemovedSeq }) => removedSeq !== undefined &&
|
|
246
|
+
(removedSeq !== UnassignedSequenceNumber ||
|
|
247
|
+
(localRemovedSeq !== undefined && localRemovedSeq <= localSeq));
|
|
248
|
+
const isMovedFromView = ({ movedSeq, localMovedSeq }) => movedSeq !== undefined &&
|
|
249
|
+
(movedSeq !== UnassignedSequenceNumber ||
|
|
250
|
+
(localMovedSeq !== undefined && localMovedSeq <= localSeq));
|
|
251
|
+
/*
|
|
252
|
+
Walk the segments up to the current segment, and calculate its
|
|
253
|
+
position taking into account local segments that were modified,
|
|
254
|
+
after the current segment.
|
|
255
|
+
*/
|
|
256
|
+
walkAllChildSegments(this.mergeTree.root, (seg) => {
|
|
257
|
+
// If we've found the desired segment, terminate the walk and return 'segmentPosition'.
|
|
258
|
+
if (seg === segment) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
// Otherwise, advance segmentPosition if the segment has been inserted and not removed
|
|
262
|
+
// with respect to the given 'localSeq'.
|
|
263
|
+
//
|
|
264
|
+
// Note that all ACKed / remote ops are applied and we only need concern ourself with
|
|
265
|
+
// determining if locally pending ops fall before/after the given 'localSeq'.
|
|
266
|
+
if (isInsertedInView(seg) && !isRemovedFromView(seg) && !isMovedFromView(seg)) {
|
|
267
|
+
segmentPosition += seg.cachedLength;
|
|
268
|
+
}
|
|
269
|
+
return true;
|
|
270
|
+
});
|
|
271
|
+
assert.equal(fasterComputedPosition, segmentPosition, "Expected fast-path computation to match result from walk all segments");
|
|
272
|
+
return segmentPosition;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* @param channel - Attribution channel name to request information from.
|
|
276
|
+
* @returns an array of all attribution seq#s from the current perspective.
|
|
277
|
+
* The `i`th entry of the array is the attribution key for the character at position `i`.
|
|
278
|
+
* Validates segments either all have attribution information or none of them.
|
|
279
|
+
* If no segment has attribution information, returns undefined.
|
|
280
|
+
*/
|
|
281
|
+
getAllAttributionSeqs(channel) {
|
|
282
|
+
const seqs = [];
|
|
283
|
+
this.walkAllSegments((segment) => {
|
|
284
|
+
for (let i = 0; i < segment.cachedLength; i++) {
|
|
285
|
+
const key = segment.attribution?.getAtOffset(i, channel);
|
|
286
|
+
seqs.push(key?.type === "op" ? key.seq : key);
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
});
|
|
290
|
+
return seqs;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Override and add some test only metrics
|
|
294
|
+
*/
|
|
295
|
+
applyMsg(msg, local = false) {
|
|
296
|
+
let traceStart;
|
|
297
|
+
if (this.measureOps) {
|
|
298
|
+
traceStart = Trace.start();
|
|
299
|
+
}
|
|
300
|
+
super.applyMsg(msg, local);
|
|
301
|
+
if (traceStart) {
|
|
302
|
+
this.accumTime += elapsedMicroseconds(traceStart);
|
|
303
|
+
this.accumOps++;
|
|
304
|
+
this.accumWindow += this.getCurrentSeq() - this.getCollabWindow().minSeq;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Override and add some test only metrics
|
|
309
|
+
*/
|
|
310
|
+
updateMinSeq(minSeq) {
|
|
311
|
+
let trace;
|
|
312
|
+
if (this.measureOps) {
|
|
313
|
+
trace = Trace.start();
|
|
314
|
+
}
|
|
315
|
+
super.updateMinSeq(minSeq);
|
|
316
|
+
if (trace) {
|
|
317
|
+
const elapsed = elapsedMicroseconds(trace);
|
|
318
|
+
this.accumWindowTime += elapsed;
|
|
319
|
+
if (elapsed > this.maxWindowTime) {
|
|
320
|
+
this.maxWindowTime = elapsed;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
slowSearchForMarker(startPos, markerLabel, forwards = true) {
|
|
325
|
+
let foundMarker;
|
|
326
|
+
const { segment } = this.getContainingSegment(startPos);
|
|
327
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
328
|
+
const segWithParent = segment;
|
|
329
|
+
if (Marker.is(segWithParent)) {
|
|
330
|
+
if (refHasTileLabel(segWithParent, markerLabel)) {
|
|
331
|
+
foundMarker = segWithParent;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
if (forwards) {
|
|
336
|
+
forwardExcursion(segWithParent, (seg) => {
|
|
337
|
+
if (Marker.is(seg)) {
|
|
338
|
+
if (refHasTileLabel(seg, markerLabel)) {
|
|
339
|
+
foundMarker = seg;
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
backwardExcursion(segWithParent, (seg) => {
|
|
347
|
+
if (Marker.is(seg)) {
|
|
348
|
+
if (refHasTileLabel(seg, markerLabel)) {
|
|
349
|
+
foundMarker = seg;
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return foundMarker;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
TestClient.searchChunkSize = 256;
|
|
360
|
+
TestClient.serializer = new TestSerializer();
|
|
361
|
+
/**
|
|
362
|
+
* Used for in-memory testing. This will queue a reference string for each client message.
|
|
363
|
+
*/
|
|
364
|
+
TestClient.useCheckQ = false;
|
|
365
|
+
function elapsedMicroseconds(trace) {
|
|
366
|
+
return trace.trace().duration * 1000;
|
|
367
|
+
}
|
|
368
|
+
export const createRevertDriver = (client) => {
|
|
369
|
+
return {
|
|
370
|
+
removeRange(start, end) {
|
|
371
|
+
const op = client.removeRangeLocal(start, end);
|
|
372
|
+
this.submitOpCallback?.(op);
|
|
373
|
+
},
|
|
374
|
+
annotateRange(start, end, props) {
|
|
375
|
+
const op = client.annotateRangeLocal(start, end, props);
|
|
376
|
+
this.submitOpCallback?.(op);
|
|
377
|
+
},
|
|
378
|
+
insertFromSpec(pos, spec) {
|
|
379
|
+
const op = client.insertSegmentLocal(pos, client.specToSegment(spec));
|
|
380
|
+
this.submitOpCallback?.(op);
|
|
381
|
+
},
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
export function getStats(tree) {
|
|
385
|
+
const nodeGetStats = (block) => {
|
|
386
|
+
const stats = {
|
|
387
|
+
maxHeight: 0,
|
|
388
|
+
nodeCount: 0,
|
|
389
|
+
leafCount: 0,
|
|
390
|
+
removedLeafCount: 0,
|
|
391
|
+
liveCount: 0,
|
|
392
|
+
histo: [],
|
|
393
|
+
};
|
|
394
|
+
for (let k = 0; k < MaxNodesInBlock; k++) {
|
|
395
|
+
stats.histo[k] = 0;
|
|
396
|
+
}
|
|
397
|
+
for (let i = 0; i < block.childCount; i++) {
|
|
398
|
+
const child = block.children[i];
|
|
399
|
+
let height = 1;
|
|
400
|
+
if (!child.isLeaf()) {
|
|
401
|
+
const childStats = nodeGetStats(child);
|
|
402
|
+
height = 1 + childStats.maxHeight;
|
|
403
|
+
stats.nodeCount += childStats.nodeCount;
|
|
404
|
+
stats.leafCount += childStats.leafCount;
|
|
405
|
+
stats.removedLeafCount += childStats.removedLeafCount;
|
|
406
|
+
stats.liveCount += childStats.liveCount;
|
|
407
|
+
for (let j = 0; j < MaxNodesInBlock; j++) {
|
|
408
|
+
stats.histo[j] += childStats.histo[j];
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
stats.leafCount++;
|
|
413
|
+
const segment = child;
|
|
414
|
+
if (segment.removedSeq !== undefined) {
|
|
415
|
+
stats.removedLeafCount++;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (height > stats.maxHeight) {
|
|
419
|
+
stats.maxHeight = height;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
stats.histo[block.childCount]++;
|
|
423
|
+
stats.nodeCount++;
|
|
424
|
+
stats.liveCount += block.childCount;
|
|
425
|
+
return stats;
|
|
426
|
+
};
|
|
427
|
+
const rootStats = nodeGetStats(tree.root);
|
|
428
|
+
return rootStats;
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=testClient.js.map
|