@fluidframework/merge-tree 2.2.0 → 2.3.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.
Files changed (168) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +20 -0
  3. package/dist/attributionCollection.d.ts.map +1 -1
  4. package/dist/attributionCollection.js +1 -29
  5. package/dist/attributionCollection.js.map +1 -1
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +3 -4
  8. package/dist/client.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/legacy.d.ts +1 -0
  13. package/dist/localReference.d.ts.map +1 -1
  14. package/dist/localReference.js +0 -2
  15. package/dist/localReference.js.map +1 -1
  16. package/dist/mergeTree.d.ts +1 -30
  17. package/dist/mergeTree.d.ts.map +1 -1
  18. package/dist/mergeTree.js +131 -167
  19. package/dist/mergeTree.js.map +1 -1
  20. package/dist/mergeTreeNodes.d.ts +16 -1
  21. package/dist/mergeTreeNodes.d.ts.map +1 -1
  22. package/dist/mergeTreeNodes.js +5 -2
  23. package/dist/mergeTreeNodes.js.map +1 -1
  24. package/dist/partialLengths.d.ts.map +1 -1
  25. package/dist/partialLengths.js +8 -54
  26. package/dist/partialLengths.js.map +1 -1
  27. package/dist/properties.d.ts.map +1 -1
  28. package/dist/properties.js +0 -2
  29. package/dist/properties.js.map +1 -1
  30. package/dist/revertibles.d.ts.map +1 -1
  31. package/dist/revertibles.js +0 -14
  32. package/dist/revertibles.js.map +1 -1
  33. package/dist/segmentGroupCollection.d.ts.map +1 -1
  34. package/dist/segmentGroupCollection.js +0 -2
  35. package/dist/segmentGroupCollection.js.map +1 -1
  36. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  37. package/dist/segmentPropertiesManager.js +1 -3
  38. package/dist/segmentPropertiesManager.js.map +1 -1
  39. package/dist/snapshotLoader.d.ts.map +1 -1
  40. package/dist/snapshotLoader.js +1 -4
  41. package/dist/snapshotLoader.js.map +1 -1
  42. package/dist/snapshotV1.d.ts.map +1 -1
  43. package/dist/snapshotV1.js +1 -11
  44. package/dist/snapshotV1.js.map +1 -1
  45. package/dist/snapshotlegacy.d.ts.map +1 -1
  46. package/dist/snapshotlegacy.js +0 -1
  47. package/dist/snapshotlegacy.js.map +1 -1
  48. package/dist/sortedSegmentSet.d.ts +0 -1
  49. package/dist/sortedSegmentSet.d.ts.map +1 -1
  50. package/dist/sortedSegmentSet.js +1 -9
  51. package/dist/sortedSegmentSet.js.map +1 -1
  52. package/dist/sortedSet.d.ts.map +1 -1
  53. package/dist/sortedSet.js +0 -4
  54. package/dist/sortedSet.js.map +1 -1
  55. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  56. package/dist/test/client.conflictFarm.spec.js +36 -27
  57. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  58. package/dist/test/client.replay.spec.js +1 -1
  59. package/dist/test/client.replay.spec.js.map +1 -1
  60. package/dist/test/mergeTreeOperationRunner.d.ts +2 -1
  61. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  62. package/dist/test/mergeTreeOperationRunner.js +29 -11
  63. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  64. package/dist/test/obliterate.spec.js +55 -0
  65. package/dist/test/obliterate.spec.js.map +1 -1
  66. package/dist/test/reconnectHelper.d.ts +0 -1
  67. package/dist/test/reconnectHelper.d.ts.map +1 -1
  68. package/dist/test/reconnectHelper.js +1 -1
  69. package/dist/test/reconnectHelper.js.map +1 -1
  70. package/dist/test/testClientLogger.d.ts.map +1 -1
  71. package/dist/test/testClientLogger.js +17 -7
  72. package/dist/test/testClientLogger.js.map +1 -1
  73. package/dist/zamboni.d.ts.map +1 -1
  74. package/dist/zamboni.js +0 -4
  75. package/dist/zamboni.js.map +1 -1
  76. package/lib/attributionCollection.d.ts.map +1 -1
  77. package/lib/attributionCollection.js +1 -29
  78. package/lib/attributionCollection.js.map +1 -1
  79. package/lib/client.d.ts.map +1 -1
  80. package/lib/client.js +3 -4
  81. package/lib/client.js.map +1 -1
  82. package/lib/index.d.ts +1 -1
  83. package/lib/index.d.ts.map +1 -1
  84. package/lib/index.js.map +1 -1
  85. package/lib/legacy.d.ts +1 -0
  86. package/lib/localReference.d.ts.map +1 -1
  87. package/lib/localReference.js +0 -2
  88. package/lib/localReference.js.map +1 -1
  89. package/lib/mergeTree.d.ts +1 -30
  90. package/lib/mergeTree.d.ts.map +1 -1
  91. package/lib/mergeTree.js +132 -168
  92. package/lib/mergeTree.js.map +1 -1
  93. package/lib/mergeTreeNodes.d.ts +16 -1
  94. package/lib/mergeTreeNodes.d.ts.map +1 -1
  95. package/lib/mergeTreeNodes.js +5 -2
  96. package/lib/mergeTreeNodes.js.map +1 -1
  97. package/lib/partialLengths.d.ts.map +1 -1
  98. package/lib/partialLengths.js +8 -54
  99. package/lib/partialLengths.js.map +1 -1
  100. package/lib/properties.d.ts.map +1 -1
  101. package/lib/properties.js +0 -2
  102. package/lib/properties.js.map +1 -1
  103. package/lib/revertibles.d.ts.map +1 -1
  104. package/lib/revertibles.js +0 -14
  105. package/lib/revertibles.js.map +1 -1
  106. package/lib/segmentGroupCollection.d.ts.map +1 -1
  107. package/lib/segmentGroupCollection.js +0 -2
  108. package/lib/segmentGroupCollection.js.map +1 -1
  109. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  110. package/lib/segmentPropertiesManager.js +1 -3
  111. package/lib/segmentPropertiesManager.js.map +1 -1
  112. package/lib/snapshotLoader.d.ts.map +1 -1
  113. package/lib/snapshotLoader.js +1 -4
  114. package/lib/snapshotLoader.js.map +1 -1
  115. package/lib/snapshotV1.d.ts.map +1 -1
  116. package/lib/snapshotV1.js +1 -11
  117. package/lib/snapshotV1.js.map +1 -1
  118. package/lib/snapshotlegacy.d.ts.map +1 -1
  119. package/lib/snapshotlegacy.js +0 -1
  120. package/lib/snapshotlegacy.js.map +1 -1
  121. package/lib/sortedSegmentSet.d.ts +0 -1
  122. package/lib/sortedSegmentSet.d.ts.map +1 -1
  123. package/lib/sortedSegmentSet.js +1 -9
  124. package/lib/sortedSegmentSet.js.map +1 -1
  125. package/lib/sortedSet.d.ts.map +1 -1
  126. package/lib/sortedSet.js +0 -4
  127. package/lib/sortedSet.js.map +1 -1
  128. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
  129. package/lib/test/client.conflictFarm.spec.js +37 -28
  130. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  131. package/lib/test/client.replay.spec.js +1 -1
  132. package/lib/test/client.replay.spec.js.map +1 -1
  133. package/lib/test/mergeTreeOperationRunner.d.ts +2 -1
  134. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  135. package/lib/test/mergeTreeOperationRunner.js +30 -12
  136. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  137. package/lib/test/obliterate.spec.js +55 -0
  138. package/lib/test/obliterate.spec.js.map +1 -1
  139. package/lib/test/reconnectHelper.d.ts +0 -1
  140. package/lib/test/reconnectHelper.d.ts.map +1 -1
  141. package/lib/test/reconnectHelper.js +1 -1
  142. package/lib/test/reconnectHelper.js.map +1 -1
  143. package/lib/test/testClientLogger.d.ts.map +1 -1
  144. package/lib/test/testClientLogger.js +18 -8
  145. package/lib/test/testClientLogger.js.map +1 -1
  146. package/lib/tsdoc-metadata.json +1 -1
  147. package/lib/zamboni.d.ts.map +1 -1
  148. package/lib/zamboni.js +0 -4
  149. package/lib/zamboni.js.map +1 -1
  150. package/package.json +22 -21
  151. package/src/attributionCollection.ts +14 -42
  152. package/src/client.ts +8 -9
  153. package/src/index.ts +1 -0
  154. package/src/localReference.ts +1 -3
  155. package/src/mergeTree.ts +185 -208
  156. package/src/mergeTreeNodes.ts +22 -3
  157. package/src/partialLengths.ts +23 -68
  158. package/src/properties.ts +1 -3
  159. package/src/revertibles.ts +7 -21
  160. package/src/segmentGroupCollection.ts +1 -3
  161. package/src/segmentPropertiesManager.ts +0 -1
  162. package/src/snapshotLoader.ts +2 -4
  163. package/src/snapshotV1.ts +5 -15
  164. package/src/snapshotlegacy.ts +1 -2
  165. package/src/sortedSegmentSet.ts +3 -10
  166. package/src/sortedSet.ts +2 -6
  167. package/src/zamboni.ts +4 -8
  168. package/tsconfig.json +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"zamboni.js","sourceRoot":"","sources":["../src/zamboni.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"./mergeTreeDeltaCallback.js\";\nimport {\n\ttype MergeBlock,\n\tIMergeNode,\n\tISegment,\n\tMarker,\n\tMaxNodesInBlock,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n} from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\n\nexport const zamboniSegmentsMax = 2;\nfunction underflow(node: MergeBlock): boolean {\n\treturn node.childCount < MaxNodesInBlock / 2;\n}\n\nexport function zamboniSegments(\n\tmergeTree: MergeTree,\n\tzamboniSegmentsMaxCount = zamboniSegmentsMax,\n): void {\n\tif (!mergeTree.collabWindow.collaborating) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n\t\tlet segmentToScour = mergeTree.segmentsToScour.peek()?.value;\n\t\tif (!segmentToScour || segmentToScour.maxSeq > mergeTree.collabWindow.minSeq) {\n\t\t\tbreak;\n\t\t}\n\t\tsegmentToScour = mergeTree.segmentsToScour.get()!;\n\t\t// Only skip scouring if needs scour is explicitly false, not true or undefined\n\t\tif (\n\t\t\tsegmentToScour?.segment?.parent &&\n\t\t\tsegmentToScour.segment.parent.needsScour !== false\n\t\t) {\n\t\t\tconst block = segmentToScour.segment.parent;\n\t\t\tconst childrenCopy: IMergeNode[] = [];\n\t\t\tscourNode(block, childrenCopy, mergeTree);\n\t\t\t// This will avoid the cost of re-scouring nodes\n\t\t\t// that have recently been scoured\n\t\t\tblock.needsScour = false;\n\n\t\t\tconst newChildCount = childrenCopy.length;\n\n\t\t\tif (newChildCount < block.childCount) {\n\t\t\t\tblock.childCount = newChildCount;\n\t\t\t\tblock.children = childrenCopy;\n\t\t\t\tfor (let j = 0; j < newChildCount; j++) {\n\t\t\t\t\t// Non null asserting here since its looping though childrenCopy.length so j at childrenCopy will always exist\n\t\t\t\t\tblock.assignChild(childrenCopy[j]!, j, false);\n\t\t\t\t}\n\n\t\t\t\tif (underflow(block) && block.parent) {\n\t\t\t\t\tpackParent(block.parent, mergeTree);\n\t\t\t\t} else {\n\t\t\t\t\tmergeTree.nodeUpdateOrdinals(block);\n\t\t\t\t\tmergeTree.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Interior node with all node children\nexport function packParent(parent: MergeBlock, mergeTree: MergeTree): void {\n\tconst children = parent.children;\n\tlet childIndex: number;\n\tlet childBlock: MergeBlock;\n\tconst holdNodes: IMergeNode[] = [];\n\tfor (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t// Debug assert not isLeaf()\n\t\tchildBlock = children[childIndex] as MergeBlock;\n\t\tscourNode(childBlock, holdNodes, mergeTree);\n\t\t// Will replace this block with a packed block\n\t\tchildBlock.parent = undefined;\n\t}\n\tif (holdNodes.length > 0) {\n\t\tconst totalNodeCount = holdNodes.length;\n\t\tconst halfOfMaxNodeCount = MaxNodesInBlock / 2;\n\t\tlet childCount = Math.min(\n\t\t\tMaxNodesInBlock - 1,\n\t\t\tMath.floor(totalNodeCount / halfOfMaxNodeCount),\n\t\t);\n\t\tif (childCount < 1) {\n\t\t\tchildCount = 1;\n\t\t}\n\t\tconst baseNodesInBlockCount = Math.floor(totalNodeCount / childCount);\n\t\tlet remainderCount = totalNodeCount % childCount;\n\t\tconst packedBlocks: IMergeNode[] = Array.from({ length: MaxNodesInBlock });\n\t\tlet childrenPackedCount = 0;\n\t\tfor (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n\t\t\tlet nodeCount = baseNodesInBlockCount;\n\t\t\tif (remainderCount > 0) {\n\t\t\t\tnodeCount++;\n\t\t\t\tremainderCount--;\n\t\t\t}\n\t\t\tconst packedBlock = mergeTree.makeBlock(nodeCount);\n\t\t\tfor (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\tconst nodeToPack = holdNodes[childrenPackedCount++]!;\n\t\t\t\tpackedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n\t\t\t}\n\t\t\tpackedBlock.parent = parent;\n\t\t\tpackedBlocks[nodeIndex] = packedBlock;\n\t\t\tmergeTree.nodeUpdateLengthNewStructure(packedBlock);\n\t\t}\n\t\tparent.children = packedBlocks;\n\t\tfor (let j = 0; j < childCount; j++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tparent.assignChild(packedBlocks[j]!, j, false);\n\t\t}\n\t\tparent.childCount = childCount;\n\t} else {\n\t\tparent.children = [];\n\t\tparent.childCount = 0;\n\t}\n\tif (underflow(parent) && parent.parent) {\n\t\tpackParent(parent.parent, mergeTree);\n\t} else {\n\t\tmergeTree.nodeUpdateOrdinals(parent);\n\t\tmergeTree.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n\t}\n}\n\nfunction scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree): void {\n\t// The previous segment is tracked while scouring for the purposes of merging adjacent segments\n\t// when possible.\n\tlet prevSegment: ISegment | undefined;\n\tfor (let k = 0; k < node.childCount; k++) {\n\t\t// TODO Non null asserting, why is this not null?\n\t\tconst childNode = node.children[k]!;\n\t\tif (!childNode.isLeaf() || !childNode.segmentGroups.empty) {\n\t\t\tholdNodes.push(childNode);\n\t\t\tprevSegment = undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = childNode;\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst moveInfo = toMoveInfo(segment);\n\t\tif (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t// If the segment's removal is below the MSN and it's not being held onto by a tracking group,\n\t\t\t// it can be unlinked (i.e. removed from the merge-tree)\n\t\t\tif (\n\t\t\t\t((!!removalInfo && seqLTE(removalInfo.removedSeq, mergeTree.collabWindow.minSeq)) ||\n\t\t\t\t\t(!!moveInfo && seqLTE(moveInfo.movedSeq, mergeTree.collabWindow.minSeq))) &&\n\t\t\t\tsegment.trackingCollection.empty\n\t\t\t) {\n\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeMaintenanceType.UNLINK,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tsegment.parent = undefined;\n\n\t\t\t\tif (Marker.is(segment)) {\n\t\t\t\t\tmergeTree.unlinkMarker(segment);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t}\n\n\t\t\tprevSegment = undefined;\n\t\t} else {\n\t\t\tif (segment.seq! <= mergeTree.collabWindow.minSeq) {\n\t\t\t\tconst segmentHasPositiveLength = (mergeTree.localNetLength(segment) ?? 0) > 0;\n\t\t\t\tconst canAppend =\n\t\t\t\t\tprevSegment?.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prevSegment.properties, segment.properties) &&\n\t\t\t\t\tprevSegment.trackingCollection.matches(segment.trackingCollection) &&\n\t\t\t\t\tsegmentHasPositiveLength;\n\n\t\t\t\tif (canAppend) {\n\t\t\t\t\tprevSegment!.append(segment);\n\t\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toperation: MergeTreeMaintenanceType.APPEND,\n\t\t\t\t\t\t\tdeltaSegments: [{ segment: prevSegment! }, { segment }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\n\t\t\t\t\tsegment.parent = undefined;\n\t\t\t\t\tfor (const tg of segment.trackingCollection.trackingGroups) tg.unlink(segment);\n\t\t\t\t} else {\n\t\t\t\t\tholdNodes.push(segment);\n\t\t\t\t\tprevSegment = segmentHasPositiveLength ? segment : undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t\tprevSegment = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"zamboni.js","sourceRoot":"","sources":["../src/zamboni.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"./mergeTreeDeltaCallback.js\";\nimport {\n\ttype MergeBlock,\n\tIMergeNode,\n\tISegment,\n\tMarker,\n\tMaxNodesInBlock,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n} from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\n\nexport const zamboniSegmentsMax = 2;\nfunction underflow(node: MergeBlock): boolean {\n\treturn node.childCount < MaxNodesInBlock / 2;\n}\n\nexport function zamboniSegments(\n\tmergeTree: MergeTree,\n\tzamboniSegmentsMaxCount = zamboniSegmentsMax,\n): void {\n\tif (!mergeTree.collabWindow.collaborating) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n\t\tlet segmentToScour = mergeTree.segmentsToScour.peek()?.value;\n\t\tif (!segmentToScour || segmentToScour.maxSeq > mergeTree.collabWindow.minSeq) {\n\t\t\tbreak;\n\t\t}\n\t\tsegmentToScour = mergeTree.segmentsToScour.get()!;\n\t\t// Only skip scouring if needs scour is explicitly false, not true or undefined\n\t\tif (\n\t\t\tsegmentToScour?.segment?.parent &&\n\t\t\tsegmentToScour.segment.parent.needsScour !== false\n\t\t) {\n\t\t\tconst block = segmentToScour.segment.parent;\n\t\t\tconst childrenCopy: IMergeNode[] = [];\n\t\t\tscourNode(block, childrenCopy, mergeTree);\n\t\t\t// This will avoid the cost of re-scouring nodes\n\t\t\t// that have recently been scoured\n\t\t\tblock.needsScour = false;\n\n\t\t\tconst newChildCount = childrenCopy.length;\n\n\t\t\tif (newChildCount < block.childCount) {\n\t\t\t\tblock.childCount = newChildCount;\n\t\t\t\tblock.children = childrenCopy;\n\t\t\t\tfor (let j = 0; j < newChildCount; j++) {\n\t\t\t\t\tblock.assignChild(childrenCopy[j], j, false);\n\t\t\t\t}\n\n\t\t\t\tif (underflow(block) && block.parent) {\n\t\t\t\t\tpackParent(block.parent, mergeTree);\n\t\t\t\t} else {\n\t\t\t\t\tmergeTree.nodeUpdateOrdinals(block);\n\t\t\t\t\tmergeTree.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Interior node with all node children\nexport function packParent(parent: MergeBlock, mergeTree: MergeTree): void {\n\tconst children = parent.children;\n\tlet childIndex: number;\n\tlet childBlock: MergeBlock;\n\tconst holdNodes: IMergeNode[] = [];\n\tfor (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t// Debug assert not isLeaf()\n\t\tchildBlock = children[childIndex] as MergeBlock;\n\t\tscourNode(childBlock, holdNodes, mergeTree);\n\t\t// Will replace this block with a packed block\n\t\tchildBlock.parent = undefined;\n\t}\n\tif (holdNodes.length > 0) {\n\t\tconst totalNodeCount = holdNodes.length;\n\t\tconst halfOfMaxNodeCount = MaxNodesInBlock / 2;\n\t\tlet childCount = Math.min(\n\t\t\tMaxNodesInBlock - 1,\n\t\t\tMath.floor(totalNodeCount / halfOfMaxNodeCount),\n\t\t);\n\t\tif (childCount < 1) {\n\t\t\tchildCount = 1;\n\t\t}\n\t\tconst baseNodesInBlockCount = Math.floor(totalNodeCount / childCount);\n\t\tlet remainderCount = totalNodeCount % childCount;\n\t\tconst packedBlocks: IMergeNode[] = Array.from({ length: MaxNodesInBlock });\n\t\tlet childrenPackedCount = 0;\n\t\tfor (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n\t\t\tlet nodeCount = baseNodesInBlockCount;\n\t\t\tif (remainderCount > 0) {\n\t\t\t\tnodeCount++;\n\t\t\t\tremainderCount--;\n\t\t\t}\n\t\t\tconst packedBlock = mergeTree.makeBlock(nodeCount);\n\t\t\tfor (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n\t\t\t\tconst nodeToPack = holdNodes[childrenPackedCount++];\n\t\t\t\tpackedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n\t\t\t}\n\t\t\tpackedBlock.parent = parent;\n\t\t\tpackedBlocks[nodeIndex] = packedBlock;\n\t\t\tmergeTree.nodeUpdateLengthNewStructure(packedBlock);\n\t\t}\n\t\tparent.children = packedBlocks;\n\t\tfor (let j = 0; j < childCount; j++) {\n\t\t\tparent.assignChild(packedBlocks[j], j, false);\n\t\t}\n\t\tparent.childCount = childCount;\n\t} else {\n\t\tparent.children = [];\n\t\tparent.childCount = 0;\n\t}\n\tif (underflow(parent) && parent.parent) {\n\t\tpackParent(parent.parent, mergeTree);\n\t} else {\n\t\tmergeTree.nodeUpdateOrdinals(parent);\n\t\tmergeTree.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n\t}\n}\n\nfunction scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree): void {\n\t// The previous segment is tracked while scouring for the purposes of merging adjacent segments\n\t// when possible.\n\tlet prevSegment: ISegment | undefined;\n\tfor (let k = 0; k < node.childCount; k++) {\n\t\tconst childNode = node.children[k];\n\t\tif (!childNode.isLeaf() || !childNode.segmentGroups.empty) {\n\t\t\tholdNodes.push(childNode);\n\t\t\tprevSegment = undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = childNode;\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst moveInfo = toMoveInfo(segment);\n\t\tif (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t// If the segment's removal is below the MSN and it's not being held onto by a tracking group,\n\t\t\t// it can be unlinked (i.e. removed from the merge-tree)\n\t\t\tif (\n\t\t\t\t((!!removalInfo && seqLTE(removalInfo.removedSeq, mergeTree.collabWindow.minSeq)) ||\n\t\t\t\t\t(!!moveInfo && seqLTE(moveInfo.movedSeq, mergeTree.collabWindow.minSeq))) &&\n\t\t\t\tsegment.trackingCollection.empty\n\t\t\t) {\n\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeMaintenanceType.UNLINK,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tsegment.parent = undefined;\n\n\t\t\t\tif (Marker.is(segment)) {\n\t\t\t\t\tmergeTree.unlinkMarker(segment);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t}\n\n\t\t\tprevSegment = undefined;\n\t\t} else {\n\t\t\tif (segment.seq! <= mergeTree.collabWindow.minSeq) {\n\t\t\t\tconst segmentHasPositiveLength = (mergeTree.localNetLength(segment) ?? 0) > 0;\n\t\t\t\tconst canAppend =\n\t\t\t\t\tprevSegment?.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prevSegment.properties, segment.properties) &&\n\t\t\t\t\tprevSegment.trackingCollection.matches(segment.trackingCollection) &&\n\t\t\t\t\tsegmentHasPositiveLength;\n\n\t\t\t\tif (canAppend) {\n\t\t\t\t\tprevSegment!.append(segment);\n\t\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toperation: MergeTreeMaintenanceType.APPEND,\n\t\t\t\t\t\t\tdeltaSegments: [{ segment: prevSegment! }, { segment }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\n\t\t\t\t\tsegment.parent = undefined;\n\t\t\t\t\tfor (const tg of segment.trackingCollection.trackingGroups) tg.unlink(segment);\n\t\t\t\t} else {\n\t\t\t\t\tholdNodes.push(segment);\n\t\t\t\t\tprevSegment = segmentHasPositiveLength ? segment : undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t\tprevSegment = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/merge-tree",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Merge tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -79,31 +79,31 @@
79
79
  "temp-directory": "nyc/.nyc_output"
80
80
  },
81
81
  "dependencies": {
82
- "@fluid-internal/client-utils": "~2.2.0",
83
- "@fluidframework/container-definitions": "~2.2.0",
84
- "@fluidframework/core-interfaces": "~2.2.0",
85
- "@fluidframework/core-utils": "~2.2.0",
86
- "@fluidframework/datastore-definitions": "~2.2.0",
87
- "@fluidframework/driver-definitions": "~2.2.0",
88
- "@fluidframework/runtime-definitions": "~2.2.0",
89
- "@fluidframework/runtime-utils": "~2.2.0",
90
- "@fluidframework/shared-object-base": "~2.2.0",
91
- "@fluidframework/telemetry-utils": "~2.2.0"
82
+ "@fluid-internal/client-utils": "~2.3.0",
83
+ "@fluidframework/container-definitions": "~2.3.0",
84
+ "@fluidframework/core-interfaces": "~2.3.0",
85
+ "@fluidframework/core-utils": "~2.3.0",
86
+ "@fluidframework/datastore-definitions": "~2.3.0",
87
+ "@fluidframework/driver-definitions": "~2.3.0",
88
+ "@fluidframework/runtime-definitions": "~2.3.0",
89
+ "@fluidframework/runtime-utils": "~2.3.0",
90
+ "@fluidframework/shared-object-base": "~2.3.0",
91
+ "@fluidframework/telemetry-utils": "~2.3.0"
92
92
  },
93
93
  "devDependencies": {
94
94
  "@arethetypeswrong/cli": "^0.15.2",
95
95
  "@biomejs/biome": "~1.8.3",
96
- "@fluid-internal/mocha-test-setup": "~2.2.0",
97
- "@fluid-private/stochastic-test-utils": "~2.2.0",
98
- "@fluid-private/test-pairwise-generator": "~2.2.0",
96
+ "@fluid-internal/mocha-test-setup": "~2.3.0",
97
+ "@fluid-private/stochastic-test-utils": "~2.3.0",
98
+ "@fluid-private/test-pairwise-generator": "~2.3.0",
99
99
  "@fluid-tools/benchmark": "^0.50.0",
100
- "@fluid-tools/build-cli": "^0.43.0",
100
+ "@fluid-tools/build-cli": "^0.46.0",
101
101
  "@fluidframework/build-common": "^2.0.3",
102
- "@fluidframework/build-tools": "^0.43.0",
103
- "@fluidframework/eslint-config-fluid": "^5.3.0",
104
- "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.1.0",
105
- "@fluidframework/test-runtime-utils": "~2.2.0",
106
- "@microsoft/api-extractor": "^7.45.1",
102
+ "@fluidframework/build-tools": "^0.46.0",
103
+ "@fluidframework/eslint-config-fluid": "^5.4.0",
104
+ "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.2.0",
105
+ "@fluidframework/test-runtime-utils": "~2.3.0",
106
+ "@microsoft/api-extractor": "7.47.8",
107
107
  "@types/diff": "^3.5.1",
108
108
  "@types/mocha": "^9.1.1",
109
109
  "@types/node": "^18.19.0",
@@ -123,7 +123,8 @@
123
123
  "typescript": "~5.4.5"
124
124
  },
125
125
  "typeValidation": {
126
- "broken": {}
126
+ "broken": {},
127
+ "entrypoint": "internal"
127
128
  },
128
129
  "scripts": {
129
130
  "api": "fluid-build . --task api",
@@ -247,20 +247,14 @@ export class AttributionCollection implements IAttributionCollection<Attribution
247
247
  let index = this.findIndex(startOffset);
248
248
  let attributionKey = this.get(index);
249
249
  if (attributionKey !== undefined) {
250
- // TODO Non null asserting, why is this not null?
251
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
252
- result.push({ offset: this.offsets[index]!, key: attributionKey });
250
+ result.push({ offset: this.offsets[index], key: attributionKey });
253
251
  }
254
252
  index++;
255
253
  const endOffsetVal = endOffset ?? Number.MAX_SAFE_INTEGER;
256
- // TODO Non null asserting, why is this not null?
257
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
258
- while (index < this.offsets.length && endOffsetVal >= this.offsets[index]!) {
254
+ while (index < this.offsets.length && endOffsetVal >= this.offsets[index]) {
259
255
  attributionKey = this.get(index);
260
256
  if (attributionKey !== undefined) {
261
- // TODO Non null asserting, why is this not null?
262
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
263
- result.push({ offset: this.offsets[index]!, key: attributionKey });
257
+ result.push({ offset: this.offsets[index], key: attributionKey });
264
258
  }
265
259
  index++;
266
260
  }
@@ -272,9 +266,7 @@ export class AttributionCollection implements IAttributionCollection<Attribution
272
266
  // for attribution collections with under ~64 entries, and even at maximum size (which would require a maximum
273
267
  // length segment with every offset having different attribution), getAtOffset is on the order of 100ns.
274
268
  let i = 0;
275
- // TODO Non null asserting, why is this not null?
276
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
277
- while (i < this.offsets.length && offset > this.offsets[i]!) {
269
+ while (i < this.offsets.length && offset > this.offsets[i]) {
278
270
  i++;
279
271
  }
280
272
  return this.offsets[i] === offset ? i : i - 1;
@@ -296,13 +288,8 @@ export class AttributionCollection implements IAttributionCollection<Attribution
296
288
  const splitIndex = this.findIndex(pos);
297
289
  const splitCollection = new AttributionCollection(this.length - pos);
298
290
  for (let i = splitIndex; i < this.keys.length; i++) {
299
- // TODO Non null asserting, why is this not null?
300
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
301
- splitCollection.offsets.push(Math.max(this.offsets[i]! - pos, 0));
302
- const key = this.keys[i];
303
- if (key !== undefined) {
304
- splitCollection.keys.push(key);
305
- }
291
+ splitCollection.offsets.push(Math.max(this.offsets[i] - pos, 0));
292
+ splitCollection.keys.push(this.keys[i]);
306
293
  }
307
294
 
308
295
  if (this.channels) {
@@ -323,11 +310,8 @@ export class AttributionCollection implements IAttributionCollection<Attribution
323
310
  const lastEntry = this.keys[this.keys.length - 1];
324
311
  for (let i = 0; i < other.keys.length; i++) {
325
312
  if (i !== 0 || !areEqualAttributionKeys(lastEntry, other.keys[i])) {
326
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
327
- this.offsets.push(other.offsets[i]! + this.length);
328
- // Looping through the keys, so we can be sure that the key is not undefined.
329
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
330
- this.keys.push(other.keys[i]!);
313
+ this.offsets.push(other.offsets[i] + this.length);
314
+ this.keys.push(other.keys[i]);
331
315
  }
332
316
  }
333
317
 
@@ -357,9 +341,7 @@ export class AttributionCollection implements IAttributionCollection<Attribution
357
341
  const root: ExtractGeneric<IAttributionCollectionSpec<AttributionKey>["root"]>[] =
358
342
  Array.from({ length: this.keys.length });
359
343
  for (let i = 0; i < this.keys.length; i++) {
360
- // TODO Non null asserting, why is this not null?
361
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
362
- root[i] = { offset: this.offsets[i]!, key: this.keys[i]! };
344
+ root[i] = { offset: this.offsets[i], key: this.keys[i] };
363
345
  }
364
346
  const result: IAttributionCollectionSpec<AttributionKey> = {
365
347
  root,
@@ -446,28 +428,18 @@ export class AttributionCollection implements IAttributionCollection<Attribution
446
428
  seq === null ? null : typeof seq === "object" ? seq : { type: "op", seq },
447
429
  );
448
430
  };
449
- // TODO Non null asserting, why is this not null?
450
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
451
- if (posBreakpoints[curIndex]! > cumulativeSegPos) {
431
+ if (posBreakpoints[curIndex] > cumulativeSegPos) {
452
432
  curIndex--;
453
433
  }
454
434
 
455
- // TODO Non null asserting, why is this not null?
456
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
457
- while (posBreakpoints[curIndex]! < cumulativeSegPos + segment.cachedLength) {
458
- // TODO Non null asserting, why is this not null?
459
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
460
- const nextOffset = Math.max(posBreakpoints[curIndex]! - cumulativeSegPos, 0);
461
- // TODO Non null asserting, why is this not null?
462
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
463
- pushEntry(nextOffset, seqs[curIndex]!);
435
+ while (posBreakpoints[curIndex] < cumulativeSegPos + segment.cachedLength) {
436
+ const nextOffset = Math.max(posBreakpoints[curIndex] - cumulativeSegPos, 0);
437
+ pushEntry(nextOffset, seqs[curIndex]);
464
438
  curIndex++;
465
439
  }
466
440
 
467
441
  if (attribution.offsets.length === 0) {
468
- // TODO Non null asserting, why is this not null?
469
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
470
- pushEntry(0, seqs[curIndex - 1]!);
442
+ pushEntry(0, seqs[curIndex - 1]);
471
443
  }
472
444
 
473
445
  assignToSegment(attribution, segment);
package/src/client.ts CHANGED
@@ -712,7 +712,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
712
712
  }
713
713
 
714
714
  getLongClientId(shortClientId: number): string {
715
- return shortClientId >= 0 ? this.shortClientIdMap[shortClientId]! : "original";
715
+ return shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : "original";
716
716
  }
717
717
 
718
718
  addLongClientId(longClientId: string): void {
@@ -765,6 +765,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
765
765
  segments: [],
766
766
  localSeq: segmentGroup.localSeq,
767
767
  refSeq: this.getCollabWindow().currentSeq,
768
+ obliterateInfo: {
769
+ ...segmentGroup.obliterateInfo!,
770
+ },
768
771
  };
769
772
 
770
773
  const opList: IMergeTreeDeltaOp[] = [];
@@ -1062,8 +1065,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1062
1065
  // eslint-disable-next-line import/no-deprecated
1063
1066
  return createGroupOp();
1064
1067
  }
1065
- // TODO Non null asserting, why is this not null?
1066
- firstGroup = segmentGroup[0]!;
1068
+ firstGroup = segmentGroup[0];
1067
1069
  } else {
1068
1070
  firstGroup = segmentGroup;
1069
1071
  }
@@ -1093,8 +1095,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1093
1095
  );
1094
1096
 
1095
1097
  for (let i = 0; i < resetOp.ops.length; i++) {
1096
- // Non null asserting because resetOp and segmentGroup are arrays of same length and loop is length of resetOp
1097
- opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i]!, segmentGroup[i]!));
1098
+ opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));
1098
1099
  }
1099
1100
  } else {
1100
1101
  // A group op containing a single op will pass a direct reference to 'segmentGroup'
@@ -1103,8 +1104,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1103
1104
  resetOp.ops.length === 1,
1104
1105
  0x03b /* "Number of ops in 'resetOp' must match the number of segment groups provided." */,
1105
1106
  );
1106
- // Non null asserting because of length assert above
1107
- opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0]!, segmentGroup));
1107
+ opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));
1108
1108
  }
1109
1109
  } else {
1110
1110
  assert(
@@ -1117,9 +1117,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1117
1117
  );
1118
1118
  opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
1119
1119
  }
1120
- // TODO why are we non null asserting here?
1121
1120
  // eslint-disable-next-line import/no-deprecated
1122
- return opList.length === 1 ? opList[0]! : createGroupOp(...opList);
1121
+ return opList.length === 1 ? opList[0] : createGroupOp(...opList);
1123
1122
  }
1124
1123
 
1125
1124
  // eslint-disable-next-line import/no-deprecated
package/src/index.ts CHANGED
@@ -70,6 +70,7 @@ export {
70
70
  reservedMarkerSimpleTypeKey,
71
71
  SegmentGroup,
72
72
  toRemovalInfo,
73
+ ObliterateInfo,
73
74
  } from "./mergeTreeNodes.js";
74
75
  export {
75
76
  Trackable,
@@ -297,9 +297,7 @@ export class LocalReferenceCollection {
297
297
  const iterator = {
298
298
  next(): IteratorResult<LocalReferencePosition> {
299
299
  while (subiterators.length > 0) {
300
- // TODO Non null asserting, why is this not null?
301
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
302
- const next = subiterators[0]!.next();
300
+ const next = subiterators[0].next();
303
301
  if (next.done === true) {
304
302
  subiterators.shift();
305
303
  } else {