@fluidframework/merge-tree 2.0.0-internal.8.0.0 → 2.0.0-rc.1.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/CHANGELOG.md +38 -0
- package/README.md +0 -6
- package/api-extractor-esm.json +17 -0
- package/api-extractor-lint.json +1 -10
- package/api-extractor.json +0 -4
- package/api-report/merge-tree.api.md +4 -9
- package/dist/client.d.ts +0 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +0 -7
- package/dist/client.js.map +1 -1
- package/dist/merge-tree-alpha.d.ts +27 -12
- package/dist/merge-tree-beta.d.ts +0 -16
- package/dist/merge-tree-public.d.ts +0 -16
- package/dist/merge-tree-untrimmed.d.ts +5 -29
- package/dist/mergeTree.d.ts +0 -17
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +0 -130
- package/dist/mergeTree.js.map +1 -1
- package/dist/ops.d.ts +1 -1
- package/dist/ops.js +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/revertibles.d.ts +4 -4
- package/dist/revertibles.js +3 -3
- package/dist/revertibles.js.map +1 -1
- package/dist/test/Insertion.perf.spec.d.ts +6 -0
- package/dist/test/Insertion.perf.spec.d.ts.map +1 -0
- package/dist/test/Insertion.perf.spec.js +113 -0
- package/dist/test/Insertion.perf.spec.js.map +1 -0
- package/dist/test/PartialLengths.perf.spec.d.ts +6 -0
- package/dist/test/PartialLengths.perf.spec.d.ts.map +1 -0
- package/dist/test/PartialLengths.perf.spec.js +67 -0
- package/dist/test/PartialLengths.perf.spec.js.map +1 -0
- package/dist/test/Removal.perf.spec.d.ts +6 -0
- package/dist/test/Removal.perf.spec.d.ts.map +1 -0
- package/dist/test/Removal.perf.spec.js +166 -0
- package/dist/test/Removal.perf.spec.js.map +1 -0
- package/dist/test/Snapshot.perf.spec.d.ts +6 -0
- package/dist/test/Snapshot.perf.spec.d.ts.map +1 -0
- package/dist/test/Snapshot.perf.spec.js +33 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -0
- package/dist/test/attributionCollection.perf.spec.d.ts +6 -0
- package/dist/test/attributionCollection.perf.spec.d.ts.map +1 -0
- package/dist/test/attributionCollection.perf.spec.js +231 -0
- package/dist/test/attributionCollection.perf.spec.js.map +1 -0
- package/dist/test/attributionCollection.spec.d.ts +6 -0
- package/dist/test/attributionCollection.spec.d.ts.map +1 -0
- package/dist/test/attributionCollection.spec.js +486 -0
- package/dist/test/attributionCollection.spec.js.map +1 -0
- package/dist/test/attributionPolicy.spec.d.ts +6 -0
- package/dist/test/attributionPolicy.spec.d.ts.map +1 -0
- package/dist/test/attributionPolicy.spec.js +189 -0
- package/dist/test/attributionPolicy.spec.js.map +1 -0
- package/dist/test/beastTest.d.ts +54 -0
- package/dist/test/beastTest.d.ts.map +1 -0
- package/dist/test/beastTest.js +1333 -0
- package/dist/test/beastTest.js.map +1 -0
- package/dist/test/client.annotateMarker.spec.d.ts +6 -0
- package/dist/test/client.annotateMarker.spec.d.ts.map +1 -0
- package/dist/test/client.annotateMarker.spec.js +45 -0
- package/dist/test/client.annotateMarker.spec.js.map +1 -0
- package/dist/test/client.apis.d.ts +7 -0
- package/dist/test/client.apis.d.ts.map +1 -0
- package/dist/test/client.apis.js +72 -0
- package/dist/test/client.apis.js.map +1 -0
- package/dist/test/client.applyMsg.spec.d.ts +6 -0
- package/dist/test/client.applyMsg.spec.d.ts.map +1 -0
- package/dist/test/client.applyMsg.spec.js +500 -0
- package/dist/test/client.applyMsg.spec.js.map +1 -0
- package/dist/test/client.applyStashedOpFarm.spec.d.ts +12 -0
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
- package/dist/test/client.applyStashedOpFarm.spec.js +144 -0
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -0
- package/dist/test/client.attributionFarm.spec.d.ts +7 -0
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -0
- package/dist/test/client.attributionFarm.spec.js +96 -0
- package/dist/test/client.attributionFarm.spec.js.map +1 -0
- package/dist/test/client.conflictFarm.spec.d.ts +15 -0
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -0
- package/dist/test/client.conflictFarm.spec.js +88 -0
- package/dist/test/client.conflictFarm.spec.js.map +1 -0
- package/dist/test/client.getPosition.spec.d.ts +6 -0
- package/dist/test/client.getPosition.spec.d.ts.map +1 -0
- package/dist/test/client.getPosition.spec.js +54 -0
- package/dist/test/client.getPosition.spec.js.map +1 -0
- package/dist/test/client.localReference.spec.d.ts +6 -0
- package/dist/test/client.localReference.spec.d.ts.map +1 -0
- package/dist/test/client.localReference.spec.js +439 -0
- package/dist/test/client.localReference.spec.js.map +1 -0
- package/dist/test/client.localReferenceFarm.spec.d.ts +6 -0
- package/dist/test/client.localReferenceFarm.spec.d.ts.map +1 -0
- package/dist/test/client.localReferenceFarm.spec.js +88 -0
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -0
- package/dist/test/client.rebasePosition.spec.d.ts +6 -0
- package/dist/test/client.rebasePosition.spec.d.ts.map +1 -0
- package/dist/test/client.rebasePosition.spec.js +102 -0
- package/dist/test/client.rebasePosition.spec.js.map +1 -0
- package/dist/test/client.reconnectFarm.spec.d.ts +12 -0
- package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -0
- package/dist/test/client.reconnectFarm.spec.js +91 -0
- package/dist/test/client.reconnectFarm.spec.js.map +1 -0
- package/dist/test/client.replay.spec.d.ts +6 -0
- package/dist/test/client.replay.spec.d.ts.map +1 -0
- package/dist/test/client.replay.spec.js +85 -0
- package/dist/test/client.replay.spec.js.map +1 -0
- package/dist/test/client.rollback.spec.d.ts +6 -0
- package/dist/test/client.rollback.spec.d.ts.map +1 -0
- package/dist/test/client.rollback.spec.js +453 -0
- package/dist/test/client.rollback.spec.js.map +1 -0
- package/dist/test/client.rollbackFarm.spec.d.ts +6 -0
- package/dist/test/client.rollbackFarm.spec.d.ts.map +1 -0
- package/dist/test/client.rollbackFarm.spec.js +48 -0
- package/dist/test/client.rollbackFarm.spec.js.map +1 -0
- package/dist/test/client.searchForMarker.spec.d.ts +6 -0
- package/dist/test/client.searchForMarker.spec.d.ts.map +1 -0
- package/dist/test/client.searchForMarker.spec.js +446 -0
- package/dist/test/client.searchForMarker.spec.js.map +1 -0
- package/dist/test/client.walkSegments.spec.d.ts +6 -0
- package/dist/test/client.walkSegments.spec.d.ts.map +1 -0
- package/dist/test/client.walkSegments.spec.js +54 -0
- package/dist/test/client.walkSegments.spec.js.map +1 -0
- package/dist/test/collections.list.spec.d.ts +6 -0
- package/dist/test/collections.list.spec.d.ts.map +1 -0
- package/dist/test/collections.list.spec.js +84 -0
- package/dist/test/collections.list.spec.js.map +1 -0
- package/dist/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
- package/dist/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +35 -0
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
- package/dist/test/index.d.ts +13 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +88 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
- package/dist/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +142 -0
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
- package/dist/test/mergeTree.annotate.spec.d.ts +6 -0
- package/dist/test/mergeTree.annotate.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.annotate.spec.js +448 -0
- package/dist/test/mergeTree.annotate.spec.js.map +1 -0
- package/dist/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
- package/dist/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +126 -0
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
- package/dist/test/mergeTree.insertingWalk.spec.d.ts +6 -0
- package/dist/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.insertingWalk.spec.js +279 -0
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -0
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +178 -0
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js +130 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
- package/dist/test/mergeTree.walk.spec.d.ts +6 -0
- package/dist/test/mergeTree.walk.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.walk.spec.js +63 -0
- package/dist/test/mergeTree.walk.spec.js.map +1 -0
- package/dist/test/mergeTree.zamboni.spec.d.ts +6 -0
- package/dist/test/mergeTree.zamboni.spec.d.ts.map +1 -0
- package/dist/test/mergeTree.zamboni.spec.js +52 -0
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -0
- package/dist/test/mergeTreeOperationRunner.d.ts +63 -0
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -0
- package/dist/test/mergeTreeOperationRunner.js +245 -0
- package/dist/test/mergeTreeOperationRunner.js.map +1 -0
- package/dist/test/mergeTreeOperationRunner.spec.d.ts +6 -0
- package/dist/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
- package/dist/test/mergeTreeOperationRunner.spec.js +156 -0
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -0
- package/dist/test/obliterate.concurrent.spec.d.ts +6 -0
- package/dist/test/obliterate.concurrent.spec.d.ts.map +1 -0
- package/dist/test/obliterate.concurrent.spec.js +1446 -0
- package/dist/test/obliterate.concurrent.spec.js.map +1 -0
- package/dist/test/obliterate.partialLength.spec.d.ts +6 -0
- package/dist/test/obliterate.partialLength.spec.d.ts.map +1 -0
- package/dist/test/obliterate.partialLength.spec.js +279 -0
- package/dist/test/obliterate.partialLength.spec.js.map +1 -0
- package/dist/test/obliterate.reconnect.spec.d.ts +6 -0
- package/dist/test/obliterate.reconnect.spec.d.ts.map +1 -0
- package/dist/test/obliterate.reconnect.spec.js +164 -0
- package/dist/test/obliterate.reconnect.spec.js.map +1 -0
- package/dist/test/obliterate.spec.d.ts +6 -0
- package/dist/test/obliterate.spec.d.ts.map +1 -0
- package/dist/test/obliterate.spec.js +162 -0
- package/dist/test/obliterate.spec.js.map +1 -0
- package/dist/test/ordinal.spec.d.ts +2 -0
- package/dist/test/ordinal.spec.d.ts.map +1 -0
- package/dist/test/ordinal.spec.js +43 -0
- package/dist/test/ordinal.spec.js.map +1 -0
- package/dist/test/partialLength.spec.d.ts +6 -0
- package/dist/test/partialLength.spec.d.ts.map +1 -0
- package/dist/test/partialLength.spec.js +282 -0
- package/dist/test/partialLength.spec.js.map +1 -0
- package/dist/test/properties.spec.d.ts +6 -0
- package/dist/test/properties.spec.d.ts.map +1 -0
- package/dist/test/properties.spec.js +55 -0
- package/dist/test/properties.spec.js.map +1 -0
- package/dist/test/reconnectHelper.d.ts +48 -0
- package/dist/test/reconnectHelper.d.ts.map +1 -0
- package/dist/test/reconnectHelper.js +86 -0
- package/dist/test/reconnectHelper.js.map +1 -0
- package/dist/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
- package/dist/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
- package/dist/test/resetPendingSegmentsToOp.spec.js +218 -0
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -0
- package/dist/test/revertibleFarm.spec.d.ts +6 -0
- package/dist/test/revertibleFarm.spec.d.ts.map +1 -0
- package/dist/test/revertibleFarm.spec.js +124 -0
- package/dist/test/revertibleFarm.spec.js.map +1 -0
- package/dist/test/revertibles.spec.d.ts +17 -0
- package/dist/test/revertibles.spec.d.ts.map +1 -0
- package/dist/test/revertibles.spec.js +385 -0
- package/dist/test/revertibles.spec.js.map +1 -0
- package/dist/test/segmentGroupCollection.spec.d.ts +6 -0
- package/dist/test/segmentGroupCollection.spec.d.ts.map +1 -0
- package/dist/test/segmentGroupCollection.spec.js +60 -0
- package/dist/test/segmentGroupCollection.spec.js.map +1 -0
- package/dist/test/snapshot.spec.d.ts +6 -0
- package/dist/test/snapshot.spec.d.ts.map +1 -0
- package/dist/test/snapshot.spec.js +178 -0
- package/dist/test/snapshot.spec.js.map +1 -0
- package/dist/test/snapshot.utils.d.ts +33 -0
- package/dist/test/snapshot.utils.d.ts.map +1 -0
- package/dist/test/snapshot.utils.js +109 -0
- package/dist/test/snapshot.utils.js.map +1 -0
- package/dist/test/snapshotlegacy.spec.d.ts +6 -0
- package/dist/test/snapshotlegacy.spec.d.ts.map +1 -0
- package/dist/test/snapshotlegacy.spec.js +139 -0
- package/dist/test/snapshotlegacy.spec.js.map +1 -0
- package/dist/test/sortedSegmentSet.spec.d.ts +6 -0
- package/dist/test/sortedSegmentSet.spec.d.ts.map +1 -0
- package/dist/test/sortedSegmentSet.spec.js +95 -0
- package/dist/test/sortedSegmentSet.spec.js.map +1 -0
- package/dist/test/testClient.d.ts +119 -0
- package/dist/test/testClient.d.ts.map +1 -0
- package/dist/test/testClient.js +439 -0
- package/dist/test/testClient.js.map +1 -0
- package/dist/test/testClientLogger.d.ts +44 -0
- package/dist/test/testClientLogger.d.ts.map +1 -0
- package/dist/test/testClientLogger.js +287 -0
- package/dist/test/testClientLogger.js.map +1 -0
- package/dist/test/testSerializer.d.ts +18 -0
- package/dist/test/testSerializer.d.ts.map +1 -0
- package/dist/test/testSerializer.js +33 -0
- package/dist/test/testSerializer.js.map +1 -0
- package/dist/test/testServer.d.ts +36 -0
- package/dist/test/testServer.d.ts.map +1 -0
- package/dist/test/testServer.js +138 -0
- package/dist/test/testServer.js.map +1 -0
- package/dist/test/testUtils.d.ts +69 -0
- package/dist/test/testUtils.d.ts.map +1 -0
- package/dist/test/testUtils.js +149 -0
- package/dist/test/testUtils.js.map +1 -0
- package/dist/test/text.d.ts +9 -0
- package/dist/test/text.d.ts.map +1 -0
- package/dist/test/text.js +76 -0
- package/dist/test/text.js.map +1 -0
- package/dist/test/tracking.spec.d.ts +6 -0
- package/dist/test/tracking.spec.d.ts.map +1 -0
- package/dist/test/tracking.spec.js +120 -0
- package/dist/test/tracking.spec.js.map +1 -0
- package/dist/test/wordUnitTests.d.ts +6 -0
- package/dist/test/wordUnitTests.d.ts.map +1 -0
- package/dist/test/wordUnitTests.js +172 -0
- package/dist/test/wordUnitTests.js.map +1 -0
- package/lib/{MergeTreeTextHelper.d.ts → MergeTreeTextHelper.d.mts} +3 -3
- package/lib/MergeTreeTextHelper.d.mts.map +1 -0
- package/lib/{MergeTreeTextHelper.js → MergeTreeTextHelper.mjs} +5 -10
- package/lib/MergeTreeTextHelper.mjs.map +1 -0
- package/lib/{attributionCollection.d.ts → attributionCollection.d.mts} +2 -2
- package/lib/attributionCollection.d.mts.map +1 -0
- package/lib/{attributionCollection.js → attributionCollection.mjs} +9 -14
- package/lib/attributionCollection.mjs.map +1 -0
- package/lib/{attributionPolicy.d.ts → attributionPolicy.d.mts} +2 -2
- package/lib/attributionPolicy.d.mts.map +1 -0
- package/lib/{attributionPolicy.js → attributionPolicy.mjs} +21 -27
- package/lib/attributionPolicy.mjs.map +1 -0
- package/lib/{client.d.ts → client.d.mts} +9 -16
- package/lib/client.d.mts.map +1 -0
- package/lib/{client.js → client.mjs} +101 -110
- package/lib/client.mjs.map +1 -0
- package/lib/collections/{index.d.ts → index.d.mts} +3 -3
- package/lib/collections/index.d.mts.map +1 -0
- package/lib/collections/index.mjs +7 -0
- package/lib/collections/index.mjs.map +1 -0
- package/lib/collections/{list.d.ts → list.d.mts} +1 -1
- package/lib/collections/list.d.mts.map +1 -0
- package/lib/collections/{list.js → list.mjs} +6 -11
- package/lib/collections/list.mjs.map +1 -0
- package/lib/collections/{rbTree.d.ts → rbTree.d.mts} +1 -1
- package/lib/collections/rbTree.d.mts.map +1 -0
- package/lib/collections/{rbTree.js → rbTree.mjs} +16 -20
- package/lib/collections/rbTree.mjs.map +1 -0
- package/lib/{constants.d.ts → constants.d.mts} +1 -1
- package/lib/constants.d.mts.map +1 -0
- package/lib/constants.mjs +32 -0
- package/lib/constants.mjs.map +1 -0
- package/lib/{endOfTreeSegment.d.ts → endOfTreeSegment.d.mts} +4 -4
- package/lib/endOfTreeSegment.d.mts.map +1 -0
- package/lib/{endOfTreeSegment.js → endOfTreeSegment.mjs} +13 -18
- package/lib/endOfTreeSegment.mjs.map +1 -0
- package/lib/{index.d.ts → index.d.mts} +21 -21
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +24 -0
- package/lib/index.mjs.map +1 -0
- package/lib/{localReference.d.ts → localReference.d.mts} +7 -7
- package/lib/localReference.d.mts.map +1 -0
- package/lib/{localReference.js → localReference.mjs} +38 -47
- package/lib/localReference.mjs.map +1 -0
- package/lib/{merge-tree-alpha.d.ts → merge-tree-alpha.d.mts} +27 -12
- package/lib/{merge-tree-beta.d.ts → merge-tree-beta.d.mts} +0 -16
- package/lib/{merge-tree-public.d.ts → merge-tree-public.d.mts} +0 -16
- package/lib/{merge-tree-untrimmed.d.ts → merge-tree-untrimmed.d.mts} +5 -29
- package/lib/{mergeTree.d.ts → mergeTree.d.mts} +12 -29
- package/lib/mergeTree.d.mts.map +1 -0
- package/lib/{mergeTree.js → mergeTree.mjs} +203 -340
- package/lib/mergeTree.mjs.map +1 -0
- package/lib/{mergeTreeDeltaCallback.d.ts → mergeTreeDeltaCallback.d.mts} +4 -8
- package/lib/mergeTreeDeltaCallback.d.mts.map +1 -0
- package/lib/{mergeTreeDeltaCallback.js → mergeTreeDeltaCallback.mjs} +2 -5
- package/lib/mergeTreeDeltaCallback.mjs.map +1 -0
- package/lib/{mergeTreeNodeWalk.d.ts → mergeTreeNodeWalk.d.mts} +2 -2
- package/lib/mergeTreeNodeWalk.d.mts.map +1 -0
- package/lib/{mergeTreeNodeWalk.js → mergeTreeNodeWalk.mjs} +14 -21
- package/lib/mergeTreeNodeWalk.mjs.map +1 -0
- package/lib/{mergeTreeNodes.d.ts → mergeTreeNodes.d.mts} +12 -12
- package/lib/mergeTreeNodes.d.mts.map +1 -0
- package/lib/{mergeTreeNodes.js → mergeTreeNodes.mjs} +60 -76
- package/lib/mergeTreeNodes.mjs.map +1 -0
- package/lib/{mergeTreeTracking.d.ts → mergeTreeTracking.d.mts} +3 -3
- package/lib/mergeTreeTracking.d.mts.map +1 -0
- package/lib/{mergeTreeTracking.js → mergeTreeTracking.mjs} +6 -13
- package/lib/mergeTreeTracking.mjs.map +1 -0
- package/lib/{opBuilder.d.ts → opBuilder.d.mts} +4 -4
- package/lib/opBuilder.d.mts.map +1 -0
- package/lib/{opBuilder.js → opBuilder.mjs} +15 -25
- package/lib/opBuilder.mjs.map +1 -0
- package/lib/{ops.d.ts → ops.d.mts} +2 -2
- package/lib/ops.d.mts.map +1 -0
- package/lib/{ops.js → ops.mjs} +5 -8
- package/lib/ops.mjs.map +1 -0
- package/lib/{ordinal.d.ts → ordinal.d.mts} +1 -1
- package/lib/ordinal.d.mts.map +1 -0
- package/lib/{ordinal.js → ordinal.mjs} +4 -9
- package/lib/ordinal.mjs.map +1 -0
- package/lib/{partialLengths.d.ts → partialLengths.d.mts} +4 -4
- package/lib/partialLengths.d.mts.map +1 -0
- package/lib/{partialLengths.js → partialLengths.mjs} +38 -46
- package/lib/partialLengths.mjs.map +1 -0
- package/lib/{properties.d.ts → properties.d.mts} +1 -1
- package/lib/properties.d.mts.map +1 -0
- package/lib/{properties.js → properties.mjs} +7 -16
- package/lib/properties.mjs.map +1 -0
- package/lib/{referencePositions.d.ts → referencePositions.d.mts} +5 -5
- package/lib/referencePositions.d.mts.map +1 -0
- package/lib/referencePositions.mjs +70 -0
- package/lib/referencePositions.mjs.map +1 -0
- package/lib/{revertibles.d.ts → revertibles.d.mts} +12 -12
- package/lib/revertibles.d.mts.map +1 -0
- package/lib/{revertibles.js → revertibles.mjs} +60 -67
- package/lib/revertibles.mjs.map +1 -0
- package/lib/{segmentGroupCollection.d.ts → segmentGroupCollection.d.mts} +2 -2
- package/lib/segmentGroupCollection.d.mts.map +1 -0
- package/lib/{segmentGroupCollection.js → segmentGroupCollection.mjs} +5 -9
- package/lib/segmentGroupCollection.mjs.map +1 -0
- package/lib/{segmentPropertiesManager.d.ts → segmentPropertiesManager.d.mts} +3 -3
- package/lib/segmentPropertiesManager.d.mts.map +1 -0
- package/lib/{segmentPropertiesManager.js → segmentPropertiesManager.mjs} +14 -20
- package/lib/{segmentPropertiesManager.js.map → segmentPropertiesManager.mjs.map} +1 -1
- package/lib/{snapshotChunks.d.ts → snapshotChunks.d.mts} +4 -4
- package/lib/snapshotChunks.d.mts.map +1 -0
- package/lib/{snapshotChunks.js → snapshotChunks.mjs} +10 -17
- package/lib/snapshotChunks.mjs.map +1 -0
- package/lib/{snapshotLoader.d.ts → snapshotLoader.d.mts} +3 -3
- package/lib/snapshotLoader.d.mts.map +1 -0
- package/lib/{snapshotLoader.js → snapshotLoader.mjs} +33 -38
- package/lib/snapshotLoader.mjs.map +1 -0
- package/lib/{snapshotV1.d.ts → snapshotV1.d.mts} +4 -4
- package/lib/snapshotV1.d.mts.map +1 -0
- package/lib/{snapshotV1.js → snapshotV1.mjs} +28 -32
- package/lib/snapshotV1.mjs.map +1 -0
- package/lib/{snapshotlegacy.d.ts → snapshotlegacy.d.mts} +3 -3
- package/lib/snapshotlegacy.d.mts.map +1 -0
- package/lib/{snapshotlegacy.js → snapshotlegacy.mjs} +21 -26
- package/lib/snapshotlegacy.mjs.map +1 -0
- package/lib/{sortedSegmentSet.d.ts → sortedSegmentSet.d.mts} +4 -4
- package/lib/sortedSegmentSet.d.mts.map +1 -0
- package/lib/{sortedSegmentSet.js → sortedSegmentSet.mjs} +3 -8
- package/lib/sortedSegmentSet.mjs.map +1 -0
- package/lib/{sortedSet.d.ts → sortedSet.d.mts} +1 -1
- package/lib/sortedSet.d.mts.map +1 -0
- package/lib/{sortedSet.js → sortedSet.mjs} +2 -6
- package/lib/sortedSet.mjs.map +1 -0
- package/lib/{textSegment.d.ts → textSegment.d.mts} +4 -4
- package/lib/textSegment.d.mts.map +1 -0
- package/lib/{textSegment.js → textSegment.mjs} +8 -12
- package/lib/textSegment.mjs.map +1 -0
- package/lib/{zamboni.d.ts → zamboni.d.mts} +3 -3
- package/lib/zamboni.d.mts.map +1 -0
- package/lib/{zamboni.js → zamboni.mjs} +22 -28
- package/lib/zamboni.mjs.map +1 -0
- package/package.json +95 -164
- package/src/client.ts +0 -8
- package/src/mergeTree.ts +0 -226
- package/src/ops.ts +1 -1
- package/src/revertibles.ts +4 -4
- package/lib/MergeTreeTextHelper.d.ts.map +0 -1
- package/lib/MergeTreeTextHelper.js.map +0 -1
- package/lib/attributionCollection.d.ts.map +0 -1
- package/lib/attributionCollection.js.map +0 -1
- package/lib/attributionPolicy.d.ts.map +0 -1
- package/lib/attributionPolicy.js.map +0 -1
- package/lib/client.d.ts.map +0 -1
- package/lib/client.js.map +0 -1
- package/lib/collections/index.d.ts.map +0 -1
- package/lib/collections/index.js +0 -14
- package/lib/collections/index.js.map +0 -1
- package/lib/collections/list.d.ts.map +0 -1
- package/lib/collections/list.js.map +0 -1
- package/lib/collections/rbTree.d.ts.map +0 -1
- package/lib/collections/rbTree.js.map +0 -1
- package/lib/constants.d.ts.map +0 -1
- package/lib/constants.js +0 -35
- package/lib/constants.js.map +0 -1
- package/lib/endOfTreeSegment.d.ts.map +0 -1
- package/lib/endOfTreeSegment.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -80
- package/lib/index.js.map +0 -1
- package/lib/localReference.d.ts.map +0 -1
- package/lib/localReference.js.map +0 -1
- package/lib/mergeTree.d.ts.map +0 -1
- package/lib/mergeTree.js.map +0 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +0 -1
- package/lib/mergeTreeDeltaCallback.js.map +0 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +0 -1
- package/lib/mergeTreeNodeWalk.js.map +0 -1
- package/lib/mergeTreeNodes.d.ts.map +0 -1
- package/lib/mergeTreeNodes.js.map +0 -1
- package/lib/mergeTreeTracking.d.ts.map +0 -1
- package/lib/mergeTreeTracking.js.map +0 -1
- package/lib/opBuilder.d.ts.map +0 -1
- package/lib/opBuilder.js.map +0 -1
- package/lib/ops.d.ts.map +0 -1
- package/lib/ops.js.map +0 -1
- package/lib/ordinal.d.ts.map +0 -1
- package/lib/ordinal.js.map +0 -1
- package/lib/partialLengths.d.ts.map +0 -1
- package/lib/partialLengths.js.map +0 -1
- package/lib/properties.d.ts.map +0 -1
- package/lib/properties.js.map +0 -1
- package/lib/referencePositions.d.ts.map +0 -1
- package/lib/referencePositions.js +0 -80
- package/lib/referencePositions.js.map +0 -1
- package/lib/revertibles.d.ts.map +0 -1
- package/lib/revertibles.js.map +0 -1
- package/lib/segmentGroupCollection.d.ts.map +0 -1
- package/lib/segmentGroupCollection.js.map +0 -1
- package/lib/segmentPropertiesManager.d.ts.map +0 -1
- package/lib/snapshotChunks.d.ts.map +0 -1
- package/lib/snapshotChunks.js.map +0 -1
- package/lib/snapshotLoader.d.ts.map +0 -1
- package/lib/snapshotLoader.js.map +0 -1
- package/lib/snapshotV1.d.ts.map +0 -1
- package/lib/snapshotV1.js.map +0 -1
- package/lib/snapshotlegacy.d.ts.map +0 -1
- package/lib/snapshotlegacy.js.map +0 -1
- package/lib/sortedSegmentSet.d.ts.map +0 -1
- package/lib/sortedSegmentSet.js.map +0 -1
- package/lib/sortedSet.d.ts.map +0 -1
- package/lib/sortedSet.js.map +0 -1
- package/lib/textSegment.d.ts.map +0 -1
- package/lib/textSegment.js.map +0 -1
- package/lib/zamboni.d.ts.map +0 -1
- package/lib/zamboni.js.map +0 -1
- package/merge-tree.test-files.tar +0 -0
- package/src/mergeTreeExample1.pdf +0 -0
- package/tsconfig.esnext.json +0 -6
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TestClientLogger = exports.createClientsAtInitialState = void 0;
|
|
8
|
+
const assert_1 = require("assert");
|
|
9
|
+
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
const textSegment_1 = require("../textSegment");
|
|
12
|
+
const mergeTreeDeltaCallback_1 = require("../mergeTreeDeltaCallback");
|
|
13
|
+
const properties_1 = require("../properties");
|
|
14
|
+
const mergeTreeNodeWalk_1 = require("../mergeTreeNodeWalk");
|
|
15
|
+
const mergeTreeNodes_1 = require("../mergeTreeNodes");
|
|
16
|
+
const testClient_1 = require("./testClient");
|
|
17
|
+
function getOpString(msg) {
|
|
18
|
+
if (msg === undefined) {
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
const op = msg.contents;
|
|
22
|
+
const opType = op.type.toString();
|
|
23
|
+
const opPos =
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
25
|
+
op?.["pos1"] !== undefined
|
|
26
|
+
? // eslint-disable-next-line @typescript-eslint/dot-notation
|
|
27
|
+
`@${op["pos1"]}${op["pos2"] !== undefined ? `,${op["pos2"]}` : ""}`
|
|
28
|
+
: "";
|
|
29
|
+
const seq = msg.sequenceNumber < 0 ? "L" : (msg.sequenceNumber - msg.minimumSequenceNumber).toString();
|
|
30
|
+
const ref = (msg.referenceSequenceNumber - msg.minimumSequenceNumber).toString();
|
|
31
|
+
const client = msg.clientId;
|
|
32
|
+
return `${seq}:${ref}:${client}${opType}${opPos}`;
|
|
33
|
+
}
|
|
34
|
+
function arePropsEmpty(props) {
|
|
35
|
+
return props === undefined || Object.entries(props).length === 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Compare properties, allowing empty to match undefined
|
|
39
|
+
*/
|
|
40
|
+
function matchPropertiesHandleEmpty(a, b) {
|
|
41
|
+
return (0, properties_1.matchProperties)(a, b) || (arePropsEmpty(a) && arePropsEmpty(b));
|
|
42
|
+
}
|
|
43
|
+
function createClientsAtInitialState(opts, ...clientIds) {
|
|
44
|
+
const setup = (c) => {
|
|
45
|
+
c.insertTextLocal(0, opts.initialState);
|
|
46
|
+
while (c.getText().includes("-")) {
|
|
47
|
+
const index = c.getText().indexOf("-");
|
|
48
|
+
c.removeRangeLocal(index, index + 1);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const all = [];
|
|
52
|
+
const clients = {};
|
|
53
|
+
for (const id of clientIds) {
|
|
54
|
+
if (clients[id] === undefined) {
|
|
55
|
+
const client = new testClient_1.TestClient(opts.options);
|
|
56
|
+
clients[id] = client;
|
|
57
|
+
all.push(client);
|
|
58
|
+
setup(client);
|
|
59
|
+
client.startOrUpdateCollaboration(id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { ...clients, all };
|
|
63
|
+
}
|
|
64
|
+
exports.createClientsAtInitialState = createClientsAtInitialState;
|
|
65
|
+
class TestClientLogger {
|
|
66
|
+
static toString(clients) {
|
|
67
|
+
return clients
|
|
68
|
+
.map((c) => this.getSegString(c))
|
|
69
|
+
.reduce((pv, cv) => {
|
|
70
|
+
pv[0] += `|${cv.acked.padEnd(cv.local.length, "")}`;
|
|
71
|
+
pv[1] += `|${cv.local.padEnd(cv.acked.length, "")}`;
|
|
72
|
+
return pv;
|
|
73
|
+
}, ["", ""])
|
|
74
|
+
.join("\n");
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Unsubscribes this logger from its clients' events. Consider using this for tests with client lifetime
|
|
78
|
+
* extending significantly past the logger's.
|
|
79
|
+
*/
|
|
80
|
+
dispose() {
|
|
81
|
+
for (const cb of this.disposeCallbacks) {
|
|
82
|
+
cb();
|
|
83
|
+
}
|
|
84
|
+
this.disposeCallbacks.length = 0;
|
|
85
|
+
}
|
|
86
|
+
constructor(clients, title) {
|
|
87
|
+
this.clients = clients;
|
|
88
|
+
this.title = title;
|
|
89
|
+
this.incrementalLog = false;
|
|
90
|
+
this.paddings = [];
|
|
91
|
+
this.roundLogLines = [];
|
|
92
|
+
this.ackedLine = [];
|
|
93
|
+
this.localLine = [];
|
|
94
|
+
this.disposeCallbacks = [];
|
|
95
|
+
const logHeaders = [];
|
|
96
|
+
clients.forEach((c, i) => {
|
|
97
|
+
logHeaders.push("op");
|
|
98
|
+
logHeaders.push(`client ${c.longClientId}`);
|
|
99
|
+
const callback = (deltaArgs) => {
|
|
100
|
+
if (this.lastDeltaArgs?.sequencedMessage !== deltaArgs?.sequencedMessage ||
|
|
101
|
+
this.lastDeltaArgs?.op !== deltaArgs?.op) {
|
|
102
|
+
this.addNewLogLine();
|
|
103
|
+
this.lastDeltaArgs = deltaArgs;
|
|
104
|
+
}
|
|
105
|
+
const clientLogIndex = i * 2;
|
|
106
|
+
this.ackedLine[clientLogIndex] =
|
|
107
|
+
deltaArgs === undefined
|
|
108
|
+
? ""
|
|
109
|
+
: getOpString(deltaArgs.sequencedMessage !== undefined
|
|
110
|
+
? { ...deltaArgs.sequencedMessage, contents: deltaArgs.op }
|
|
111
|
+
: c.makeOpMessage(deltaArgs.op));
|
|
112
|
+
const segStrings = TestClientLogger.getSegString(c);
|
|
113
|
+
this.ackedLine[clientLogIndex + 1] = segStrings.acked;
|
|
114
|
+
this.localLine[clientLogIndex + 1] = segStrings.local;
|
|
115
|
+
this.paddings[clientLogIndex] = Math.max(this.ackedLine[clientLogIndex].length, this.localLine[clientLogIndex].length, this.paddings[clientLogIndex]);
|
|
116
|
+
this.paddings[clientLogIndex + 1] = Math.max(this.ackedLine[clientLogIndex + 1].length, this.localLine[clientLogIndex + 1].length, this.paddings[clientLogIndex + 1]);
|
|
117
|
+
};
|
|
118
|
+
const maintenanceCallback = (main, op) => {
|
|
119
|
+
if (main.operation === mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.ACKNOWLEDGED) {
|
|
120
|
+
callback(op);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
c.on("delta", callback);
|
|
124
|
+
c.on("maintenance", maintenanceCallback);
|
|
125
|
+
this.disposeCallbacks.push(() => {
|
|
126
|
+
c.off("delta", callback);
|
|
127
|
+
c.off("maintenance", maintenanceCallback);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
this.roundLogLines.push(logHeaders);
|
|
131
|
+
this.roundLogLines[0].forEach((v) => this.paddings.push(v.length));
|
|
132
|
+
this.addNewLogLine(); // capture initial state
|
|
133
|
+
}
|
|
134
|
+
addNewLogLine() {
|
|
135
|
+
if (this.incrementalLog) {
|
|
136
|
+
while (this.roundLogLines.length > 0) {
|
|
137
|
+
const logLine = this.roundLogLines.shift();
|
|
138
|
+
if (logLine?.some((c) => c.trim().length > 0)) {
|
|
139
|
+
console.log(logLine.map((v, i) => v.padEnd(this.paddings[i])).join(" | "));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
this.ackedLine = [];
|
|
144
|
+
this.localLine = [];
|
|
145
|
+
this.clients.forEach((cc, clientLogIndex) => {
|
|
146
|
+
const segStrings = TestClientLogger.getSegString(cc);
|
|
147
|
+
this.ackedLine.push("", segStrings.acked);
|
|
148
|
+
this.localLine.push("", segStrings.local);
|
|
149
|
+
this.paddings[clientLogIndex] = Math.max(this.ackedLine[clientLogIndex].length, this.localLine[clientLogIndex].length, this.paddings[clientLogIndex]);
|
|
150
|
+
this.paddings[clientLogIndex + 1] = Math.max(this.ackedLine[clientLogIndex + 1].length, this.localLine[clientLogIndex + 1].length, this.paddings[clientLogIndex + 1]);
|
|
151
|
+
});
|
|
152
|
+
this.roundLogLines.push(this.ackedLine);
|
|
153
|
+
this.roundLogLines.push(this.localLine);
|
|
154
|
+
}
|
|
155
|
+
validate(opts) {
|
|
156
|
+
const baseText = opts?.baseText ?? this.clients[0].getText();
|
|
157
|
+
const errorPrefix = opts?.errorPrefix ? `${opts?.errorPrefix}: ` : "";
|
|
158
|
+
// cache all the properties of client 0 for faster look up
|
|
159
|
+
const properties = Array.from({ length: this.clients[0].getLength() }).map((_, i) => this.clients[0].getPropertiesAtPosition(i));
|
|
160
|
+
this.clients.forEach((c) => {
|
|
161
|
+
if (opts?.baseText === undefined && c === this.clients[0]) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// ensure all clients have seen the same ops
|
|
165
|
+
assert_1.strict.equal(c.getCurrentSeq(), this.clients[0].getCurrentSeq(), `${errorPrefix}${c.longClientId} current seq does not match client ${this.clients[0].longClientId}`);
|
|
166
|
+
// Pre-check to avoid this.toString() in the string template
|
|
167
|
+
if (c.getText() !== baseText) {
|
|
168
|
+
assert_1.strict.equal(c.getText(), baseText, `${errorPrefix}\n${this.toString()}\nClient ${c.longClientId} does not match client ${opts?.baseText ? "baseText" : this.clients[0].longClientId}`);
|
|
169
|
+
}
|
|
170
|
+
if (c === this.clients[0]) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let pos = 0;
|
|
174
|
+
(0, mergeTreeNodeWalk_1.depthFirstNodeWalk)(c.mergeTree.root, c.mergeTree.root.children[0], undefined, (seg) => {
|
|
175
|
+
if ((0, mergeTreeNodes_1.toRemovalInfo)(seg) === undefined) {
|
|
176
|
+
const segProps = seg.properties;
|
|
177
|
+
for (let i = 0; i < seg.cachedLength; i++) {
|
|
178
|
+
if (!matchPropertiesHandleEmpty(segProps, properties[pos + i])) {
|
|
179
|
+
assert_1.strict.deepStrictEqual(segProps, properties[pos + i], `${errorPrefix}\n${this.toString()}\nClient ${c.longClientId} does not match client ${this.clients[0].longClientId} properties at pos ${pos + i}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
pos += seg.cachedLength;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
if (opts?.clear === true) {
|
|
187
|
+
this.roundLogLines.splice(1, this.roundLogLines.length);
|
|
188
|
+
this.roundLogLines[0].forEach((v, i) => (this.paddings[i] = v.length));
|
|
189
|
+
this.addNewLogLine(); // capture initial state
|
|
190
|
+
}
|
|
191
|
+
return baseText;
|
|
192
|
+
}
|
|
193
|
+
static validate(clients, title) {
|
|
194
|
+
const logger = new TestClientLogger(clients, title);
|
|
195
|
+
const result = logger.validate();
|
|
196
|
+
logger.dispose();
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
toString(excludeHeader = false) {
|
|
200
|
+
let str = "";
|
|
201
|
+
if (!excludeHeader) {
|
|
202
|
+
str +=
|
|
203
|
+
`_: Local State\n` +
|
|
204
|
+
`-: Deleted ~:Deleted <= MinSeq\n` +
|
|
205
|
+
`*: Unacked Insert and Delete\n` +
|
|
206
|
+
`${this.clients[0].getCollabWindow().minSeq}: msn/offset\n` +
|
|
207
|
+
`Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n` +
|
|
208
|
+
`sequence number represented as offset from msn. L means local.\n` +
|
|
209
|
+
`op types: 0) insert 1) remove 2) annotate\n`;
|
|
210
|
+
if (this.title) {
|
|
211
|
+
str += `${this.title}\n`;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
str += this.roundLogLines
|
|
215
|
+
.filter((line) => line.some((c) => c.trim().length > 0))
|
|
216
|
+
.map((line) => line.map((v, i) => v.padEnd(this.paddings[i])).join(" | "))
|
|
217
|
+
.join("\n");
|
|
218
|
+
return str;
|
|
219
|
+
}
|
|
220
|
+
addLogsToError(e) {
|
|
221
|
+
if (e instanceof Error) {
|
|
222
|
+
e.message += `\n${this.toString()}`;
|
|
223
|
+
return e;
|
|
224
|
+
}
|
|
225
|
+
return new telemetry_utils_1.LoggingError(`${e}\n${this.toString()}`);
|
|
226
|
+
}
|
|
227
|
+
static getSegString(client) {
|
|
228
|
+
let acked = "";
|
|
229
|
+
let local = "";
|
|
230
|
+
const nodes = [...client.mergeTree.root.children];
|
|
231
|
+
let parent = nodes[0]?.parent;
|
|
232
|
+
while (nodes.length > 0) {
|
|
233
|
+
const node = nodes.shift();
|
|
234
|
+
if (node) {
|
|
235
|
+
if (node.isLeaf()) {
|
|
236
|
+
if (node.parent !== parent) {
|
|
237
|
+
if (acked.length > 0) {
|
|
238
|
+
acked += " ";
|
|
239
|
+
local += " ";
|
|
240
|
+
}
|
|
241
|
+
parent = node.parent;
|
|
242
|
+
}
|
|
243
|
+
const text = textSegment_1.TextSegment.is(node)
|
|
244
|
+
? node.text
|
|
245
|
+
: mergeTreeNodes_1.Marker.is(node)
|
|
246
|
+
? "¶"
|
|
247
|
+
: undefined;
|
|
248
|
+
if (text !== undefined) {
|
|
249
|
+
const removedNode = (0, mergeTreeNodes_1.toRemovalInfo)(node);
|
|
250
|
+
if (removedNode !== undefined) {
|
|
251
|
+
if (removedNode.removedSeq === constants_1.UnassignedSequenceNumber) {
|
|
252
|
+
acked += "_".repeat(text.length);
|
|
253
|
+
local +=
|
|
254
|
+
node.seq === constants_1.UnassignedSequenceNumber
|
|
255
|
+
? "*".repeat(text.length)
|
|
256
|
+
: "-".repeat(text.length);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
const removedSymbol = (0, mergeTreeNodes_1.seqLTE)(removedNode.removedSeq, client.getCollabWindow().minSeq)
|
|
260
|
+
? "~"
|
|
261
|
+
: "-";
|
|
262
|
+
acked += removedSymbol.repeat(text.length);
|
|
263
|
+
local += " ".repeat(text.length);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
if (node.seq === constants_1.UnassignedSequenceNumber) {
|
|
268
|
+
acked += "_".repeat(text.length);
|
|
269
|
+
local += text;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
acked += text;
|
|
273
|
+
local += " ".repeat(text.length);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
nodes.push(...node.children);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return { acked, local };
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
exports.TestClientLogger = TestClientLogger;
|
|
287
|
+
//# sourceMappingURL=testClientLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testClientLogger.js","sourceRoot":"","sources":["../../src/test/testClientLogger.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 { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { UnassignedSequenceNumber } from \"../constants\";\nimport { IMergeTreeOp } from \"../ops\";\nimport { TextSegment } from \"../textSegment\";\nimport { IMergeTreeDeltaOpArgs, MergeTreeMaintenanceType } from \"../mergeTreeDeltaCallback\";\nimport { matchProperties, PropertySet } from \"../properties\";\nimport { depthFirstNodeWalk } from \"../mergeTreeNodeWalk\";\nimport { Marker, seqLTE, toRemovalInfo } from \"../mergeTreeNodes\";\nimport { IMergeTreeOptions } from \"..\";\nimport { TestClient } from \"./testClient\";\n\nfunction getOpString(msg: ISequencedDocumentMessage | undefined) {\n\tif (msg === undefined) {\n\t\treturn \"\";\n\t}\n\tconst op = msg.contents as IMergeTreeOp;\n\tconst opType = op.type.toString();\n\tconst opPos =\n\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\top?.[\"pos1\"] !== undefined\n\t\t\t? // eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t `@${op[\"pos1\"]}${op[\"pos2\"] !== undefined ? `,${op[\"pos2\"]}` : \"\"}`\n\t\t\t: \"\";\n\n\tconst seq =\n\t\tmsg.sequenceNumber < 0 ? \"L\" : (msg.sequenceNumber - msg.minimumSequenceNumber).toString();\n\tconst ref = (msg.referenceSequenceNumber - msg.minimumSequenceNumber).toString();\n\tconst client = msg.clientId;\n\treturn `${seq}:${ref}:${client}${opType}${opPos}`;\n}\n\nfunction arePropsEmpty(props: PropertySet | undefined) {\n\treturn props === undefined || Object.entries(props).length === 0;\n}\n\n/**\n * Compare properties, allowing empty to match undefined\n */\nfunction matchPropertiesHandleEmpty(a: PropertySet | undefined, b: PropertySet | undefined) {\n\treturn matchProperties(a, b) || (arePropsEmpty(a) && arePropsEmpty(b));\n}\n\ntype ClientMap<TClientName extends string> = Partial<Record<TClientName, TestClient>>;\n\nexport function createClientsAtInitialState<\n\tTClients extends ClientMap<TClientName>,\n\tTClientName extends string = string & keyof TClients,\n>(\n\topts: {\n\t\tinitialState: string;\n\t\toptions?: IMergeTreeOptions & PropertySet;\n\t},\n\t...clientIds: TClientName[]\n): Record<keyof TClients, TestClient> & { all: TestClient[] } {\n\tconst setup = (c: TestClient) => {\n\t\tc.insertTextLocal(0, opts.initialState);\n\t\twhile (c.getText().includes(\"-\")) {\n\t\t\tconst index = c.getText().indexOf(\"-\");\n\t\t\tc.removeRangeLocal(index, index + 1);\n\t\t}\n\t};\n\tconst all: TestClient[] = [];\n\tconst clients: Partial<Record<keyof TClients, TestClient>> = {};\n\tfor (const id of clientIds) {\n\t\tif (clients[id] === undefined) {\n\t\t\tconst client = new TestClient(opts.options);\n\t\t\tclients[id] = client;\n\t\t\tall.push(client);\n\t\t\tsetup(client);\n\t\t\tclient.startOrUpdateCollaboration(id);\n\t\t}\n\t}\n\n\treturn { ...(clients as Record<keyof TClients, TestClient>), all };\n}\nexport class TestClientLogger {\n\tpublic static toString(clients: readonly TestClient[]) {\n\t\treturn clients\n\t\t\t.map((c) => this.getSegString(c))\n\t\t\t.reduce<[string, string]>(\n\t\t\t\t(pv, cv) => {\n\t\t\t\t\tpv[0] += `|${cv.acked.padEnd(cv.local.length, \"\")}`;\n\t\t\t\t\tpv[1] += `|${cv.local.padEnd(cv.acked.length, \"\")}`;\n\t\t\t\t\treturn pv;\n\t\t\t\t},\n\t\t\t\t[\"\", \"\"],\n\t\t\t)\n\t\t\t.join(\"\\n\");\n\t}\n\n\tprivate readonly incrementalLog = false;\n\n\tprivate readonly paddings: number[] = [];\n\tprivate readonly roundLogLines: string[][] = [];\n\n\tprivate ackedLine: string[] = [];\n\tprivate localLine: string[] = [];\n\t// initialize to private instance, so first real edit will create a new line\n\tprivate lastDeltaArgs: IMergeTreeDeltaOpArgs | undefined;\n\n\tprivate readonly disposeCallbacks: (() => void)[] = [];\n\n\t/**\n\t * Unsubscribes this logger from its clients' events. Consider using this for tests with client lifetime\n\t * extending significantly past the logger's.\n\t */\n\tpublic dispose(): void {\n\t\tfor (const cb of this.disposeCallbacks) {\n\t\t\tcb();\n\t\t}\n\t\tthis.disposeCallbacks.length = 0;\n\t}\n\n\tconstructor(\n\t\tprivate readonly clients: readonly TestClient[],\n\t\tprivate readonly title?: string,\n\t) {\n\t\tconst logHeaders: string[] = [];\n\t\tclients.forEach((c, i) => {\n\t\t\tlogHeaders.push(\"op\");\n\t\t\tlogHeaders.push(`client ${c.longClientId}`);\n\t\t\tconst callback = (deltaArgs: IMergeTreeDeltaOpArgs | undefined) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.lastDeltaArgs?.sequencedMessage !== deltaArgs?.sequencedMessage ||\n\t\t\t\t\tthis.lastDeltaArgs?.op !== deltaArgs?.op\n\t\t\t\t) {\n\t\t\t\t\tthis.addNewLogLine();\n\t\t\t\t\tthis.lastDeltaArgs = deltaArgs;\n\t\t\t\t}\n\t\t\t\tconst clientLogIndex = i * 2;\n\n\t\t\t\tthis.ackedLine[clientLogIndex] =\n\t\t\t\t\tdeltaArgs === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: getOpString(\n\t\t\t\t\t\t\t\tdeltaArgs.sequencedMessage !== undefined\n\t\t\t\t\t\t\t\t\t? { ...deltaArgs.sequencedMessage, contents: deltaArgs.op }\n\t\t\t\t\t\t\t\t\t: c.makeOpMessage(deltaArgs.op),\n\t\t\t\t\t\t );\n\t\t\t\tconst segStrings = TestClientLogger.getSegString(c);\n\t\t\t\tthis.ackedLine[clientLogIndex + 1] = segStrings.acked;\n\t\t\t\tthis.localLine[clientLogIndex + 1] = segStrings.local;\n\n\t\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t\t);\n\n\t\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst maintenanceCallback = (main, op) => {\n\t\t\t\tif (main.operation === MergeTreeMaintenanceType.ACKNOWLEDGED) {\n\t\t\t\t\tcallback(op);\n\t\t\t\t}\n\t\t\t};\n\t\t\tc.on(\"delta\", callback);\n\t\t\tc.on(\"maintenance\", maintenanceCallback);\n\t\t\tthis.disposeCallbacks.push(() => {\n\t\t\t\tc.off(\"delta\", callback);\n\t\t\t\tc.off(\"maintenance\", maintenanceCallback);\n\t\t\t});\n\t\t});\n\t\tthis.roundLogLines.push(logHeaders);\n\t\tthis.roundLogLines[0].forEach((v) => this.paddings.push(v.length));\n\t\tthis.addNewLogLine(); // capture initial state\n\t}\n\n\tprivate addNewLogLine() {\n\t\tif (this.incrementalLog) {\n\t\t\twhile (this.roundLogLines.length > 0) {\n\t\t\t\tconst logLine = this.roundLogLines.shift();\n\t\t\t\tif (logLine?.some((c) => c.trim().length > 0)) {\n\t\t\t\t\tconsole.log(logLine.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.ackedLine = [];\n\t\tthis.localLine = [];\n\t\tthis.clients.forEach((cc, clientLogIndex) => {\n\t\t\tconst segStrings = TestClientLogger.getSegString(cc);\n\t\t\tthis.ackedLine.push(\"\", segStrings.acked);\n\t\t\tthis.localLine.push(\"\", segStrings.local);\n\n\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t);\n\n\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t);\n\t\t});\n\t\tthis.roundLogLines.push(this.ackedLine);\n\t\tthis.roundLogLines.push(this.localLine);\n\t}\n\n\tpublic validate(opts?: { clear?: boolean; baseText?: string; errorPrefix?: string }) {\n\t\tconst baseText = opts?.baseText ?? this.clients[0].getText();\n\t\tconst errorPrefix = opts?.errorPrefix ? `${opts?.errorPrefix}: ` : \"\";\n\t\t// cache all the properties of client 0 for faster look up\n\t\tconst properties = Array.from({ length: this.clients[0].getLength() }).map((_, i) =>\n\t\t\tthis.clients[0].getPropertiesAtPosition(i),\n\t\t);\n\t\tthis.clients.forEach((c) => {\n\t\t\tif (opts?.baseText === undefined && c === this.clients[0]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// ensure all clients have seen the same ops\n\t\t\tassert.equal(\n\t\t\t\tc.getCurrentSeq(),\n\t\t\t\tthis.clients[0].getCurrentSeq(),\n\t\t\t\t`${errorPrefix}${c.longClientId} current seq does not match client ${this.clients[0].longClientId}`,\n\t\t\t);\n\t\t\t// Pre-check to avoid this.toString() in the string template\n\t\t\tif (c.getText() !== baseText) {\n\t\t\t\tassert.equal(\n\t\t\t\t\tc.getText(),\n\t\t\t\t\tbaseText,\n\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t} does not match client ${\n\t\t\t\t\t\topts?.baseText ? \"baseText\" : this.clients[0].longClientId\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (c === this.clients[0]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet pos = 0;\n\t\t\tdepthFirstNodeWalk(c.mergeTree.root, c.mergeTree.root.children[0], undefined, (seg) => {\n\t\t\t\tif (toRemovalInfo(seg) === undefined) {\n\t\t\t\t\tconst segProps = seg.properties;\n\t\t\t\t\tfor (let i = 0; i < seg.cachedLength; i++) {\n\t\t\t\t\t\tif (!matchPropertiesHandleEmpty(segProps, properties[pos + i])) {\n\t\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\t\tsegProps,\n\t\t\t\t\t\t\t\tproperties[pos + i],\n\t\t\t\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t\t\t\t} does not match client ${\n\t\t\t\t\t\t\t\t\tthis.clients[0].longClientId\n\t\t\t\t\t\t\t\t} properties at pos ${pos + i}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpos += seg.cachedLength;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tif (opts?.clear === true) {\n\t\t\tthis.roundLogLines.splice(1, this.roundLogLines.length);\n\t\t\tthis.roundLogLines[0].forEach((v, i) => (this.paddings[i] = v.length));\n\t\t\tthis.addNewLogLine(); // capture initial state\n\t\t}\n\t\treturn baseText;\n\t}\n\n\tstatic validate(clients: readonly TestClient[], title?: string) {\n\t\tconst logger = new TestClientLogger(clients, title);\n\t\tconst result = logger.validate();\n\t\tlogger.dispose();\n\t\treturn result;\n\t}\n\n\tpublic toString(excludeHeader: boolean = false) {\n\t\tlet str = \"\";\n\t\tif (!excludeHeader) {\n\t\t\tstr +=\n\t\t\t\t`_: Local State\\n` +\n\t\t\t\t`-: Deleted ~:Deleted <= MinSeq\\n` +\n\t\t\t\t`*: Unacked Insert and Delete\\n` +\n\t\t\t\t`${this.clients[0].getCollabWindow().minSeq}: msn/offset\\n` +\n\t\t\t\t`Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\\n` +\n\t\t\t\t`sequence number represented as offset from msn. L means local.\\n` +\n\t\t\t\t`op types: 0) insert 1) remove 2) annotate\\n`;\n\n\t\t\tif (this.title) {\n\t\t\t\tstr += `${this.title}\\n`;\n\t\t\t}\n\t\t}\n\t\tstr += this.roundLogLines\n\t\t\t.filter((line) => line.some((c) => c.trim().length > 0))\n\t\t\t.map((line) => line.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"))\n\t\t\t.join(\"\\n\");\n\t\treturn str;\n\t}\n\n\tpublic addLogsToError(e: unknown): Error {\n\t\tif (e instanceof Error) {\n\t\t\te.message += `\\n${this.toString()}`;\n\t\t\treturn e;\n\t\t}\n\n\t\treturn new LoggingError(`${e}\\n${this.toString()}`);\n\t}\n\n\tprivate static getSegString(client: TestClient): { acked: string; local: string } {\n\t\tlet acked: string = \"\";\n\t\tlet local: string = \"\";\n\t\tconst nodes = [...client.mergeTree.root.children];\n\t\tlet parent = nodes[0]?.parent;\n\t\twhile (nodes.length > 0) {\n\t\t\tconst node = nodes.shift();\n\t\t\tif (node) {\n\t\t\t\tif (node.isLeaf()) {\n\t\t\t\t\tif (node.parent !== parent) {\n\t\t\t\t\t\tif (acked.length > 0) {\n\t\t\t\t\t\t\tacked += \" \";\n\t\t\t\t\t\t\tlocal += \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparent = node.parent;\n\t\t\t\t\t}\n\t\t\t\t\tconst text = TextSegment.is(node)\n\t\t\t\t\t\t? node.text\n\t\t\t\t\t\t: Marker.is(node)\n\t\t\t\t\t\t? \"¶\"\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (text !== undefined) {\n\t\t\t\t\t\tconst removedNode = toRemovalInfo(node);\n\t\t\t\t\t\tif (removedNode !== undefined) {\n\t\t\t\t\t\t\tif (removedNode.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\t\tacked += \"_\".repeat(text.length);\n\t\t\t\t\t\t\t\tlocal +=\n\t\t\t\t\t\t\t\t\tnode.seq === UnassignedSequenceNumber\n\t\t\t\t\t\t\t\t\t\t? \"*\".repeat(text.length)\n\t\t\t\t\t\t\t\t\t\t: \"-\".repeat(text.length);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst removedSymbol = seqLTE(\n\t\t\t\t\t\t\t\t\tremovedNode.removedSeq,\n\t\t\t\t\t\t\t\t\tclient.getCollabWindow().minSeq,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t? \"~\"\n\t\t\t\t\t\t\t\t\t: \"-\";\n\t\t\t\t\t\t\t\tacked += removedSymbol.repeat(text.length);\n\t\t\t\t\t\t\t\tlocal += \" \".repeat(text.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (node.seq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\t\tacked += \"_\".repeat(text.length);\n\t\t\t\t\t\t\t\tlocal += text;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tacked += text;\n\t\t\t\t\t\t\t\tlocal += \" \".repeat(text.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnodes.push(...node.children);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { acked, local };\n\t}\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
7
|
+
/**
|
|
8
|
+
* Test serializer implementation for merge tree tests
|
|
9
|
+
*/
|
|
10
|
+
export declare class TestSerializer implements IFluidSerializer {
|
|
11
|
+
constructor();
|
|
12
|
+
get IFluidSerializer(): this;
|
|
13
|
+
encode(input: any, bind: IFluidHandle): void;
|
|
14
|
+
decode(input: any): any;
|
|
15
|
+
stringify(value: any, bind: IFluidHandle): string;
|
|
16
|
+
parse(value: string): any;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=testSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testSerializer.d.ts","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE;;GAEG;AACH,qBAAa,cAAe,YAAW,gBAAgB;;IAGtD,IAAW,gBAAgB,SAE1B;IAEM,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY;IAIrC,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAIvB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY;IAKxC,KAAK,CAAC,KAAK,EAAE,MAAM;CAI1B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TestSerializer = void 0;
|
|
8
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
9
|
+
/**
|
|
10
|
+
* Test serializer implementation for merge tree tests
|
|
11
|
+
*/
|
|
12
|
+
class TestSerializer {
|
|
13
|
+
constructor() { }
|
|
14
|
+
get IFluidSerializer() {
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
encode(input, bind) {
|
|
18
|
+
throw new Error("Method not implemented.");
|
|
19
|
+
}
|
|
20
|
+
decode(input) {
|
|
21
|
+
throw new Error("Method not implemented.");
|
|
22
|
+
}
|
|
23
|
+
stringify(value, bind) {
|
|
24
|
+
(0, core_utils_1.assert)(bind === undefined, "Test serializer should not be called with bind handles");
|
|
25
|
+
return JSON.stringify(value);
|
|
26
|
+
}
|
|
27
|
+
parse(value) {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
29
|
+
return JSON.parse(value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.TestSerializer = TestSerializer;
|
|
33
|
+
//# sourceMappingURL=testSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testSerializer.js","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2DAAoD;AAIpD;;GAEG;AACH,MAAa,cAAc;IAC1B,gBAAsB,CAAC;IAEvB,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,KAAU,EAAE,IAAkB;QAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,KAAU;QACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,IAAkB;QAC9C,IAAA,mBAAM,EAAC,IAAI,KAAK,SAAS,EAAE,wDAAwD,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,KAAa;QACzB,+DAA+D;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACD;AAxBD,wCAwBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\n\n/**\n * Test serializer implementation for merge tree tests\n */\nexport class TestSerializer implements IFluidSerializer {\n\tpublic constructor() {}\n\n\tpublic get IFluidSerializer() {\n\t\treturn this;\n\t}\n\n\tpublic encode(input: any, bind: IFluidHandle) {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic decode(input: any): any {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic stringify(value: any, bind: IFluidHandle) {\n\t\tassert(bind === undefined, \"Test serializer should not be called with bind handles\");\n\t\treturn JSON.stringify(value);\n\t}\n\n\tpublic parse(value: string) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn JSON.parse(value);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
6
|
+
import { Heap } from "@fluidframework/core-utils";
|
|
7
|
+
import { RedBlackTree } from "../collections";
|
|
8
|
+
import { PropertySet } from "../properties";
|
|
9
|
+
import { TestClient } from "./testClient";
|
|
10
|
+
interface ClientSeq {
|
|
11
|
+
refSeq: number;
|
|
12
|
+
clientId: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Server for tests. Simulates client communication by directing placing
|
|
16
|
+
* messages in client queues.
|
|
17
|
+
*/
|
|
18
|
+
export declare class TestServer extends TestClient {
|
|
19
|
+
seq: number;
|
|
20
|
+
clients: TestClient[];
|
|
21
|
+
clientSeqNumbers: Heap<ClientSeq>;
|
|
22
|
+
upstreamMap: RedBlackTree<number, number>;
|
|
23
|
+
constructor(options?: PropertySet);
|
|
24
|
+
addClients(clients: TestClient[]): void;
|
|
25
|
+
applyMsg(msg: ISequencedDocumentMessage): boolean;
|
|
26
|
+
transformUpstreamMessage(msg: ISequencedDocumentMessage): void;
|
|
27
|
+
copyMsg(msg: ISequencedDocumentMessage): ISequencedDocumentMessage;
|
|
28
|
+
private minSeq;
|
|
29
|
+
applyMessages(msgCount: number): boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Used for in-memory testing. This will queue a reference string for each client message.
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkTextMatchRelative(refSeq: number, clientId: number, server: TestServer, msg: ISequencedDocumentMessage): boolean;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=testServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testServer.d.ts","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,IAAI,EAAa,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,UAAU,SAAS;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAOD;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACzC,GAAG,SAAK;IACR,OAAO,EAAE,UAAU,EAAE,CAAM;IAC3B,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAA0C;IAC3E,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAoD;gBACjF,OAAO,CAAC,EAAE,WAAW;IAIjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE;IAWhC,QAAQ,CAAC,GAAG,EAAE,yBAAyB;IAYvC,wBAAwB,CAAC,GAAG,EAAE,yBAAyB;IAcvD,OAAO,CAAC,GAAG,EAAE,yBAAyB;IAYtC,OAAO,CAAC,MAAM,CAAK;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM;CA0C9B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,yBAAyB,WAe9B"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.checkTextMatchRelative = exports.TestServer = void 0;
|
|
8
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
9
|
+
const collections_1 = require("../collections");
|
|
10
|
+
const mergeTreeNodes_1 = require("../mergeTreeNodes");
|
|
11
|
+
const MergeTreeTextHelper_1 = require("../MergeTreeTextHelper");
|
|
12
|
+
const testClient_1 = require("./testClient");
|
|
13
|
+
const clientSeqComparer = {
|
|
14
|
+
min: { refSeq: -1, clientId: "" },
|
|
15
|
+
compare: (a, b) => a.refSeq - b.refSeq,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Server for tests. Simulates client communication by directing placing
|
|
19
|
+
* messages in client queues.
|
|
20
|
+
*/
|
|
21
|
+
class TestServer extends testClient_1.TestClient {
|
|
22
|
+
constructor(options) {
|
|
23
|
+
super(options);
|
|
24
|
+
this.seq = 1;
|
|
25
|
+
this.clients = [];
|
|
26
|
+
this.clientSeqNumbers = new core_utils_1.Heap(clientSeqComparer);
|
|
27
|
+
this.upstreamMap = new collections_1.RedBlackTree(mergeTreeNodes_1.compareNumbers);
|
|
28
|
+
this.minSeq = 0;
|
|
29
|
+
}
|
|
30
|
+
addClients(clients) {
|
|
31
|
+
this.clientSeqNumbers = new core_utils_1.Heap(clientSeqComparer);
|
|
32
|
+
this.clients = clients;
|
|
33
|
+
for (const client of clients) {
|
|
34
|
+
this.clientSeqNumbers.add({
|
|
35
|
+
refSeq: client.getCurrentSeq(),
|
|
36
|
+
clientId: client.longClientId ?? "",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
applyMsg(msg) {
|
|
41
|
+
super.applyMsg(msg);
|
|
42
|
+
if (testClient_1.TestClient.useCheckQ) {
|
|
43
|
+
const clid = this.getShortClientId(msg.clientId);
|
|
44
|
+
return checkTextMatchRelative(msg.referenceSequenceNumber, clid, this, msg);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// TODO: remove mappings when no longer needed using min seq
|
|
51
|
+
// in upstream message
|
|
52
|
+
transformUpstreamMessage(msg) {
|
|
53
|
+
if (msg.referenceSequenceNumber > 0) {
|
|
54
|
+
msg.referenceSequenceNumber =
|
|
55
|
+
this.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;
|
|
56
|
+
}
|
|
57
|
+
msg.origin = {
|
|
58
|
+
id: "A",
|
|
59
|
+
sequenceNumber: msg.sequenceNumber,
|
|
60
|
+
minimumSequenceNumber: msg.minimumSequenceNumber,
|
|
61
|
+
};
|
|
62
|
+
this.upstreamMap.put(msg.sequenceNumber, this.seq);
|
|
63
|
+
msg.sequenceNumber = -1;
|
|
64
|
+
}
|
|
65
|
+
copyMsg(msg) {
|
|
66
|
+
return {
|
|
67
|
+
clientId: msg.clientId,
|
|
68
|
+
clientSequenceNumber: msg.clientSequenceNumber,
|
|
69
|
+
contents: msg.contents,
|
|
70
|
+
minimumSequenceNumber: msg.minimumSequenceNumber,
|
|
71
|
+
referenceSequenceNumber: msg.referenceSequenceNumber,
|
|
72
|
+
sequenceNumber: msg.sequenceNumber,
|
|
73
|
+
type: msg.type,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
applyMessages(msgCount) {
|
|
77
|
+
let _msgCount = msgCount;
|
|
78
|
+
while (_msgCount > 0) {
|
|
79
|
+
const msg = this.dequeueMsg();
|
|
80
|
+
if (msg) {
|
|
81
|
+
if (msg.sequenceNumber >= 0) {
|
|
82
|
+
this.transformUpstreamMessage(msg);
|
|
83
|
+
}
|
|
84
|
+
msg.sequenceNumber = this.seq++;
|
|
85
|
+
msg.minimumSequenceNumber = this.minSeq;
|
|
86
|
+
if (this.applyMsg(msg)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
if (this.clients) {
|
|
90
|
+
let minCli = this.clientSeqNumbers.peek()?.value;
|
|
91
|
+
if (minCli &&
|
|
92
|
+
minCli.clientId === msg.clientId &&
|
|
93
|
+
minCli.refSeq < msg.referenceSequenceNumber) {
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
95
|
+
const cliSeq = this.clientSeqNumbers.get();
|
|
96
|
+
const oldSeq = cliSeq.refSeq;
|
|
97
|
+
cliSeq.refSeq = msg.referenceSequenceNumber;
|
|
98
|
+
this.clientSeqNumbers.add(cliSeq);
|
|
99
|
+
minCli = this.clientSeqNumbers.peek()?.value;
|
|
100
|
+
if (minCli && minCli.refSeq > oldSeq) {
|
|
101
|
+
msg.minimumSequenceNumber = minCli.refSeq;
|
|
102
|
+
this.minSeq = minCli.refSeq;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
for (const client of this.clients) {
|
|
106
|
+
client.enqueueMsg(msg);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
_msgCount--;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.TestServer = TestServer;
|
|
119
|
+
/**
|
|
120
|
+
* Used for in-memory testing. This will queue a reference string for each client message.
|
|
121
|
+
*/
|
|
122
|
+
function checkTextMatchRelative(refSeq, clientId, server, msg) {
|
|
123
|
+
const client = server.clients[clientId];
|
|
124
|
+
const serverText = new MergeTreeTextHelper_1.MergeTreeTextHelper(server.mergeTree).getText(refSeq, clientId);
|
|
125
|
+
const cliText = client.checkQ.shift()?.data;
|
|
126
|
+
if (cliText === undefined || cliText !== serverText) {
|
|
127
|
+
console.log(`mismatch `);
|
|
128
|
+
console.log(msg);
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
130
|
+
console.log(server.mergeTree.toString());
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
132
|
+
console.log(client.mergeTree.toString());
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
exports.checkTextMatchRelative = checkTextMatchRelative;
|
|
138
|
+
//# sourceMappingURL=testServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.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 { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { Heap, IComparer } from \"@fluidframework/core-utils\";\nimport { RedBlackTree } from \"../collections\";\nimport { compareNumbers } from \"../mergeTreeNodes\";\nimport { PropertySet } from \"../properties\";\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper\";\nimport { TestClient } from \"./testClient\";\n\ninterface ClientSeq {\n\trefSeq: number;\n\tclientId: string;\n}\n\nconst clientSeqComparer: IComparer<ClientSeq> = {\n\tmin: { refSeq: -1, clientId: \"\" },\n\tcompare: (a, b) => a.refSeq - b.refSeq,\n};\n\n/**\n * Server for tests. Simulates client communication by directing placing\n * messages in client queues.\n */\nexport class TestServer extends TestClient {\n\tseq = 1;\n\tclients: TestClient[] = [];\n\tclientSeqNumbers: Heap<ClientSeq> = new Heap<ClientSeq>(clientSeqComparer);\n\tupstreamMap: RedBlackTree<number, number> = new RedBlackTree<number, number>(compareNumbers);\n\tconstructor(options?: PropertySet) {\n\t\tsuper(options);\n\t}\n\n\taddClients(clients: TestClient[]) {\n\t\tthis.clientSeqNumbers = new Heap<ClientSeq>(clientSeqComparer);\n\t\tthis.clients = clients;\n\t\tfor (const client of clients) {\n\t\t\tthis.clientSeqNumbers.add({\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t\tclientId: client.longClientId ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\tapplyMsg(msg: ISequencedDocumentMessage) {\n\t\tsuper.applyMsg(msg);\n\t\tif (TestClient.useCheckQ) {\n\t\t\tconst clid = this.getShortClientId(msg.clientId as string);\n\t\t\treturn checkTextMatchRelative(msg.referenceSequenceNumber, clid, this, msg);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// TODO: remove mappings when no longer needed using min seq\n\t// in upstream message\n\ttransformUpstreamMessage(msg: ISequencedDocumentMessage) {\n\t\tif (msg.referenceSequenceNumber > 0) {\n\t\t\tmsg.referenceSequenceNumber =\n\t\t\t\tthis.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;\n\t\t}\n\t\tmsg.origin = {\n\t\t\tid: \"A\",\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t};\n\t\tthis.upstreamMap.put(msg.sequenceNumber, this.seq);\n\t\tmsg.sequenceNumber = -1;\n\t}\n\n\tcopyMsg(msg: ISequencedDocumentMessage) {\n\t\treturn {\n\t\t\tclientId: msg.clientId,\n\t\t\tclientSequenceNumber: msg.clientSequenceNumber,\n\t\t\tcontents: msg.contents,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t\treferenceSequenceNumber: msg.referenceSequenceNumber,\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\ttype: msg.type,\n\t\t} as any as ISequencedDocumentMessage;\n\t}\n\n\tprivate minSeq = 0;\n\n\tapplyMessages(msgCount: number) {\n\t\tlet _msgCount = msgCount;\n\t\twhile (_msgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tif (msg.sequenceNumber >= 0) {\n\t\t\t\t\tthis.transformUpstreamMessage(msg);\n\t\t\t\t}\n\t\t\t\tmsg.sequenceNumber = this.seq++;\n\t\t\t\tmsg.minimumSequenceNumber = this.minSeq;\n\t\t\t\tif (this.applyMsg(msg)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (this.clients) {\n\t\t\t\t\tlet minCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\tif (\n\t\t\t\t\t\tminCli &&\n\t\t\t\t\t\tminCli.clientId === msg.clientId &&\n\t\t\t\t\t\tminCli.refSeq < msg.referenceSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tconst cliSeq = this.clientSeqNumbers.get()!;\n\t\t\t\t\t\tconst oldSeq = cliSeq.refSeq;\n\t\t\t\t\t\tcliSeq.refSeq = msg.referenceSequenceNumber;\n\t\t\t\t\t\tthis.clientSeqNumbers.add(cliSeq);\n\t\t\t\t\t\tminCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\t\tif (minCli && minCli.refSeq > oldSeq) {\n\t\t\t\t\t\t\tmsg.minimumSequenceNumber = minCli.refSeq;\n\t\t\t\t\t\t\tthis.minSeq = minCli.refSeq;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\t\tclient.enqueueMsg(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t_msgCount--;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * Used for in-memory testing. This will queue a reference string for each client message.\n */\nexport function checkTextMatchRelative(\n\trefSeq: number,\n\tclientId: number,\n\tserver: TestServer,\n\tmsg: ISequencedDocumentMessage,\n) {\n\tconst client = server.clients[clientId];\n\tconst serverText = new MergeTreeTextHelper(server.mergeTree).getText(refSeq, clientId);\n\tconst cliText = client.checkQ.shift()?.data;\n\tif (cliText === undefined || cliText !== serverText) {\n\t\tconsole.log(`mismatch `);\n\t\tconsole.log(msg);\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(server.mergeTree.toString());\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(client.mergeTree.toString());\n\t\treturn true;\n\t}\n\treturn false;\n}\n"]}
|