@fluidframework/merge-tree 1.2.1 → 2.0.0-internal.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.
Files changed (231) hide show
  1. package/DEV.md +2 -2
  2. package/README.md +1 -1
  3. package/REFERENCEPOSITIONS.md +2 -2
  4. package/dist/MergeTreeTextHelper.d.ts +23 -0
  5. package/dist/MergeTreeTextHelper.d.ts.map +1 -0
  6. package/dist/MergeTreeTextHelper.js +136 -0
  7. package/dist/MergeTreeTextHelper.js.map +1 -0
  8. package/dist/base.d.ts +2 -26
  9. package/dist/base.d.ts.map +1 -1
  10. package/dist/base.js.map +1 -1
  11. package/dist/client.d.ts +21 -12
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +87 -27
  14. package/dist/client.js.map +1 -1
  15. package/dist/collections/heap.d.ts +28 -0
  16. package/dist/collections/heap.d.ts.map +1 -0
  17. package/dist/collections/heap.js +65 -0
  18. package/dist/collections/heap.js.map +1 -0
  19. package/dist/collections/index.d.ts +11 -0
  20. package/dist/collections/index.d.ts.map +1 -0
  21. package/dist/collections/index.js +23 -0
  22. package/dist/collections/index.js.map +1 -0
  23. package/dist/collections/intervalTree.d.ts +60 -0
  24. package/dist/collections/intervalTree.d.ts.map +1 -0
  25. package/dist/collections/intervalTree.js +99 -0
  26. package/dist/collections/intervalTree.js.map +1 -0
  27. package/dist/collections/list.d.ts +39 -0
  28. package/dist/collections/list.d.ts.map +1 -0
  29. package/dist/collections/list.js +155 -0
  30. package/dist/collections/list.js.map +1 -0
  31. package/dist/collections/rbTree.d.ts +154 -0
  32. package/dist/collections/rbTree.d.ts.map +1 -0
  33. package/dist/{collections.js → collections/rbTree.js} +10 -448
  34. package/dist/collections/rbTree.js.map +1 -0
  35. package/dist/collections/stack.d.ts +16 -0
  36. package/dist/collections/stack.d.ts.map +1 -0
  37. package/dist/collections/stack.js +30 -0
  38. package/dist/collections/stack.js.map +1 -0
  39. package/dist/collections/tst.d.ts +55 -0
  40. package/dist/collections/tst.d.ts.map +1 -0
  41. package/dist/collections/tst.js +171 -0
  42. package/dist/collections/tst.js.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/localReference.d.ts +48 -99
  48. package/dist/localReference.d.ts.map +1 -1
  49. package/dist/localReference.js +132 -169
  50. package/dist/localReference.js.map +1 -1
  51. package/dist/mergeTree.d.ts +38 -299
  52. package/dist/mergeTree.d.ts.map +1 -1
  53. package/dist/mergeTree.js +214 -598
  54. package/dist/mergeTree.js.map +1 -1
  55. package/dist/mergeTreeDeltaCallback.d.ts +1 -1
  56. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  57. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  58. package/dist/mergeTreeNodes.d.ts +269 -0
  59. package/dist/mergeTreeNodes.d.ts.map +1 -0
  60. package/dist/mergeTreeNodes.js +383 -0
  61. package/dist/mergeTreeNodes.js.map +1 -0
  62. package/dist/mergeTreeTracking.d.ts +1 -1
  63. package/dist/mergeTreeTracking.d.ts.map +1 -1
  64. package/dist/mergeTreeTracking.js.map +1 -1
  65. package/dist/opBuilder.d.ts +1 -1
  66. package/dist/opBuilder.d.ts.map +1 -1
  67. package/dist/opBuilder.js.map +1 -1
  68. package/dist/partialLengths.d.ts +130 -15
  69. package/dist/partialLengths.d.ts.map +1 -1
  70. package/dist/partialLengths.js +230 -138
  71. package/dist/partialLengths.js.map +1 -1
  72. package/dist/properties.d.ts.map +1 -1
  73. package/dist/properties.js.map +1 -1
  74. package/dist/referencePositions.d.ts +6 -26
  75. package/dist/referencePositions.d.ts.map +1 -1
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/segmentGroupCollection.d.ts +2 -1
  78. package/dist/segmentGroupCollection.d.ts.map +1 -1
  79. package/dist/segmentGroupCollection.js +3 -0
  80. package/dist/segmentGroupCollection.js.map +1 -1
  81. package/dist/segmentPropertiesManager.d.ts +10 -1
  82. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  83. package/dist/segmentPropertiesManager.js +41 -6
  84. package/dist/segmentPropertiesManager.js.map +1 -1
  85. package/dist/snapshotLoader.d.ts.map +1 -1
  86. package/dist/snapshotLoader.js.map +1 -1
  87. package/dist/snapshotV1.d.ts +1 -1
  88. package/dist/snapshotV1.d.ts.map +1 -1
  89. package/dist/snapshotV1.js.map +1 -1
  90. package/dist/snapshotlegacy.d.ts +5 -1
  91. package/dist/snapshotlegacy.d.ts.map +1 -1
  92. package/dist/snapshotlegacy.js +4 -0
  93. package/dist/snapshotlegacy.js.map +1 -1
  94. package/dist/sortedSegmentSet.d.ts +1 -1
  95. package/dist/sortedSegmentSet.d.ts.map +1 -1
  96. package/dist/sortedSegmentSet.js.map +1 -1
  97. package/dist/textSegment.d.ts +7 -7
  98. package/dist/textSegment.d.ts.map +1 -1
  99. package/dist/textSegment.js +3 -125
  100. package/dist/textSegment.js.map +1 -1
  101. package/lib/MergeTreeTextHelper.d.ts +23 -0
  102. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  103. package/lib/MergeTreeTextHelper.js +132 -0
  104. package/lib/MergeTreeTextHelper.js.map +1 -0
  105. package/lib/base.d.ts +2 -26
  106. package/lib/base.d.ts.map +1 -1
  107. package/lib/base.js.map +1 -1
  108. package/lib/client.d.ts +21 -12
  109. package/lib/client.d.ts.map +1 -1
  110. package/lib/client.js +85 -25
  111. package/lib/client.js.map +1 -1
  112. package/lib/collections/heap.d.ts +28 -0
  113. package/lib/collections/heap.d.ts.map +1 -0
  114. package/lib/collections/heap.js +61 -0
  115. package/lib/collections/heap.js.map +1 -0
  116. package/lib/collections/index.d.ts +11 -0
  117. package/lib/collections/index.d.ts.map +1 -0
  118. package/lib/collections/index.js +11 -0
  119. package/lib/collections/index.js.map +1 -0
  120. package/lib/collections/intervalTree.d.ts +60 -0
  121. package/lib/collections/intervalTree.d.ts.map +1 -0
  122. package/lib/collections/intervalTree.js +94 -0
  123. package/lib/collections/intervalTree.js.map +1 -0
  124. package/lib/collections/list.d.ts +39 -0
  125. package/lib/collections/list.d.ts.map +1 -0
  126. package/lib/collections/list.js +149 -0
  127. package/lib/collections/list.js.map +1 -0
  128. package/lib/collections/rbTree.d.ts +154 -0
  129. package/lib/collections/rbTree.d.ts.map +1 -0
  130. package/lib/{collections.js → collections/rbTree.js} +9 -439
  131. package/lib/collections/rbTree.js.map +1 -0
  132. package/lib/collections/stack.d.ts +16 -0
  133. package/lib/collections/stack.d.ts.map +1 -0
  134. package/lib/collections/stack.js +26 -0
  135. package/lib/collections/stack.js.map +1 -0
  136. package/lib/collections/tst.d.ts +55 -0
  137. package/lib/collections/tst.d.ts.map +1 -0
  138. package/lib/collections/tst.js +167 -0
  139. package/lib/collections/tst.js.map +1 -0
  140. package/lib/index.d.ts +3 -1
  141. package/lib/index.d.ts.map +1 -1
  142. package/lib/index.js +3 -1
  143. package/lib/index.js.map +1 -1
  144. package/lib/localReference.d.ts +48 -99
  145. package/lib/localReference.d.ts.map +1 -1
  146. package/lib/localReference.js +132 -170
  147. package/lib/localReference.js.map +1 -1
  148. package/lib/mergeTree.d.ts +38 -299
  149. package/lib/mergeTree.d.ts.map +1 -1
  150. package/lib/mergeTree.js +190 -563
  151. package/lib/mergeTree.js.map +1 -1
  152. package/lib/mergeTreeDeltaCallback.d.ts +1 -1
  153. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  154. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  155. package/lib/mergeTreeNodes.d.ts +269 -0
  156. package/lib/mergeTreeNodes.d.ts.map +1 -0
  157. package/lib/mergeTreeNodes.js +369 -0
  158. package/lib/mergeTreeNodes.js.map +1 -0
  159. package/lib/mergeTreeTracking.d.ts +1 -1
  160. package/lib/mergeTreeTracking.d.ts.map +1 -1
  161. package/lib/mergeTreeTracking.js.map +1 -1
  162. package/lib/opBuilder.d.ts +1 -1
  163. package/lib/opBuilder.d.ts.map +1 -1
  164. package/lib/opBuilder.js.map +1 -1
  165. package/lib/partialLengths.d.ts +130 -15
  166. package/lib/partialLengths.d.ts.map +1 -1
  167. package/lib/partialLengths.js +227 -135
  168. package/lib/partialLengths.js.map +1 -1
  169. package/lib/properties.d.ts.map +1 -1
  170. package/lib/properties.js.map +1 -1
  171. package/lib/referencePositions.d.ts +6 -26
  172. package/lib/referencePositions.d.ts.map +1 -1
  173. package/lib/referencePositions.js.map +1 -1
  174. package/lib/segmentGroupCollection.d.ts +2 -1
  175. package/lib/segmentGroupCollection.d.ts.map +1 -1
  176. package/lib/segmentGroupCollection.js +3 -0
  177. package/lib/segmentGroupCollection.js.map +1 -1
  178. package/lib/segmentPropertiesManager.d.ts +10 -1
  179. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  180. package/lib/segmentPropertiesManager.js +41 -6
  181. package/lib/segmentPropertiesManager.js.map +1 -1
  182. package/lib/snapshotLoader.d.ts.map +1 -1
  183. package/lib/snapshotLoader.js.map +1 -1
  184. package/lib/snapshotV1.d.ts +1 -1
  185. package/lib/snapshotV1.d.ts.map +1 -1
  186. package/lib/snapshotV1.js.map +1 -1
  187. package/lib/snapshotlegacy.d.ts +5 -1
  188. package/lib/snapshotlegacy.d.ts.map +1 -1
  189. package/lib/snapshotlegacy.js +4 -0
  190. package/lib/snapshotlegacy.js.map +1 -1
  191. package/lib/sortedSegmentSet.d.ts +1 -1
  192. package/lib/sortedSegmentSet.d.ts.map +1 -1
  193. package/lib/sortedSegmentSet.js.map +1 -1
  194. package/lib/textSegment.d.ts +7 -7
  195. package/lib/textSegment.d.ts.map +1 -1
  196. package/lib/textSegment.js +1 -122
  197. package/lib/textSegment.js.map +1 -1
  198. package/package.json +93 -17
  199. package/src/MergeTreeTextHelper.ts +172 -0
  200. package/src/base.ts +2 -35
  201. package/src/client.ts +114 -30
  202. package/src/collections/heap.ts +75 -0
  203. package/src/collections/index.ts +11 -0
  204. package/src/collections/intervalTree.ts +140 -0
  205. package/src/collections/list.ts +165 -0
  206. package/src/{collections.ts → collections/rbTree.ts} +79 -538
  207. package/src/collections/stack.ts +27 -0
  208. package/src/collections/tst.ts +212 -0
  209. package/src/index.ts +8 -2
  210. package/src/localReference.ts +152 -203
  211. package/src/mergeTree.ts +265 -868
  212. package/src/mergeTreeDeltaCallback.ts +1 -1
  213. package/src/mergeTreeNodes.ts +676 -0
  214. package/src/mergeTreeTracking.ts +1 -1
  215. package/src/opBuilder.ts +1 -1
  216. package/src/partialLengths.ts +295 -150
  217. package/src/properties.ts +1 -0
  218. package/src/referencePositions.ts +7 -27
  219. package/src/segmentGroupCollection.ts +5 -1
  220. package/src/segmentPropertiesManager.ts +45 -6
  221. package/src/snapshotLoader.ts +2 -1
  222. package/src/snapshotV1.ts +2 -2
  223. package/src/snapshotlegacy.ts +6 -2
  224. package/src/sortedSegmentSet.ts +1 -1
  225. package/src/textSegment.ts +10 -157
  226. package/dist/collections.d.ts +0 -197
  227. package/dist/collections.d.ts.map +0 -1
  228. package/dist/collections.js.map +0 -1
  229. package/lib/collections.d.ts +0 -197
  230. package/lib/collections.d.ts.map +0 -1
  231. package/lib/collections.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n toRemovalInfo,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number | undefined, minSeq: number) {\n return seq !== undefined && seq !== UnassignedSequenceNumber && seq <= minSeq;\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n if (seqLTE(segment.seq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo = toRemovalInfo(segment);\n if (seqLTE(removalInfo?.removedSeq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n seq = removalInfo.removedSeq;\n segmentLen = -segmentLen;\n // this code still assume removed client id and\n // overlap clients are separate. so we need to pull\n // then apart first.\n clientId = removalInfo.removedClientIds[0];\n removeClientOverlap = removalInfo.removedClientIds.length > 1\n ? removalInfo.removedClientIds.slice(1)\n : undefined;\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n // len will be assigned below, making this assertion true.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo = toRemovalInfo(segment);\n\n if (segment.seq === seq) {\n if (removalInfo?.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo?.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property, RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n toRemovalInfo,\n} from \"./mergeTreeNodes\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\n/**\n * Tracks length information for a part of a MergeTree (block) at a given time (seq).\n * These objects are associated with internal nodes (i.e. blocks).\n */\nexport interface PartialSequenceLength {\n /**\n * Sequence number\n */\n seq: number;\n /**\n * The length of the associated block.\n */\n len: number;\n /**\n * The delta between the current length of the associated block and its length at the previous seq number.\n */\n seglen: number;\n /**\n * clientId for the client that submitted the op with sequence number `seq`.\n */\n clientId?: number;\n /**\n * This field maps each client to the size of the intersection between segments deleted at this seq\n * and segments concurrently deleted by that client.\n *\n * For example, this PartialSequenceLength:\n * ```typescript\n * {\n * seq: 5,\n * len: 100,\n * seglen: -10,\n * clientId: 0,\n * overlapRemoveClients: <RedBlack tree with key-values expressed by>{\n * 1: { clientId: 1, seglen: -5 },\n * 3: { clientId: 3, seglen: -10 }\n * }\n * }\n * ```\n *\n * corresponds to an op submitted by client 0 which:\n * - reduces the length of this block by 10 (it may have deleted a single segment of length 10,\n * several segments totalling length 10, or even delete and add content for a total reduction of 10 length)\n * - was concurrent to an op submitted by client 1 that also removed some of the same segments,\n * whose length totalled 5\n * - was concurrent to an op submitted by client 3 that removed some of the same segments,\n * whose length totalled 10\n */\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keeps track of partial sums of segment lengths for all sequence numbers in the current collaboration window.\n * Only used during active collaboration.\n *\n * This class is associated with an internal node (block) of a MergeTree. It efficiently answers queries of the form\n * \"What is the length of `block` from the perspective of some particular seq and clientId?\".\n *\n * It also supports incremental updating of state for newly-sequenced ops that don't affect the structure of the\n * MergeTree.\n *\n * To answer these queries, it pre-builds several lists which track the length of the block at a per-sequence-number\n * level. These lists are:\n *\n * 1. (`partialLengths`): Stores the total length of the block.\n * 2. (`clientSeqNumbers[clientId]`): Stores only the total lengths of segments submitted by `clientId`. [see footnote]\n *\n * The reason both lists are necessary is that resolving the length of the block from the perspective of\n * (clientId, refSeq) requires including both of the following types of segments:\n * 1. Segments sequenced before `refSeq`\n * 2. Segments submitted by `clientId`\n *\n * This is possible with the above bookkeeping, using:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (clientSeqNumbers total length at most recent op)\n * - (clientSeqNumbers total length at refSeq)\n *\n * where the subtraction avoids double-counting segments submitted by clientId sequenced within the collab window.\n *\n * This algorithm scales roughly linearly with number of editing clients and the size of the collab window.\n * (certain unlikely sequences of operations may introduce log factors on those variables)\n *\n * Note: there is some slight complication with clientSeqNumbers resulting from the possibility of different clients\n * concurrently removing the same segment. See the field's documentation for more details.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node. If `recur` is false, it is assumed that each interior node child of this block\n * has its partials up to date.\n * @param collabWindow - segment window of the segment tree containing `block`.\n * @param recur - whether to recursively compute partial lengths for internal children of `block`.\n * This incurs more work, but gives correct bookkeeping in the case that a descendant in the merge tree has been\n * modified without bubbling up the resulting partial length change to this block's partials.\n */\n public static combine(block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n const leafPartialLengths = PartialSequenceLengths.fromLeaves(block, collabWindow);\n\n let hasInternalChild = false;\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n hasInternalChild = true;\n if (recur) {\n child.partialLengths =\n PartialSequenceLengths.combine(child, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(child.partialLengths!);\n }\n }\n\n // If there are no internal children, the PartialSequenceLengths returns from `fromLeaves` is exactly correct.\n // Otherwise, we must additively combine all of the children partial lengths to get this block's totals.\n const combinedPartialLengths\n = hasInternalChild ? new PartialSequenceLengths(collabWindow.minSeq) : leafPartialLengths;\n if (hasInternalChild) {\n if (leafPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(leafPartialLengths);\n }\n\n const childPartialsLen = childPartials.length;\n\n const childPartialLengths: PartialSequenceLength[][] = [];\n for (let i = 0; i < childPartialsLen; i++) {\n const { segmentCount, minLength, partialLengths } = childPartials[i];\n combinedPartialLengths.segmentCount += segmentCount;\n combinedPartialLengths.minLength += minLength;\n childPartialLengths.push(partialLengths);\n }\n\n // All child PartialSequenceLengths are now sorted temporally (i.e. by seq). Since\n // a given MergeTree operation can affect multiple segments, there may be multiple entries\n // for a given seq. We run through them in order, coalescing all length information for a given\n // seq together into `combinedPartialLengths`.\n let currentPartial: PartialSequenceLength | undefined;\n for (const partialLength of mergeSortedListsBySeq(childPartialLengths)) {\n if (!currentPartial || currentPartial.seq !== partialLength.seq) {\n // Start a new seq entry.\n currentPartial = {\n ...partialLength,\n len: (currentPartial?.len ?? 0) + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n };\n combinedPartialLengths.partialLengths.push(currentPartial);\n } else {\n // Update existing entry\n currentPartial.seglen += partialLength.seglen;\n currentPartial.len += partialLength.seglen;\n combineOverlapClients(currentPartial, partialLength);\n }\n }\n\n for (const partial of combinedPartialLengths.partialLengths) {\n combinedPartialLengths.addClientSeqNumberFromPartial(partial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n return combinedPartialLengths;\n }\n\n /**\n * @returns a PartialSequenceLengths structure which tracks only lengths of leaf children of the provided\n * IMergeBlock.\n */\n private static fromLeaves(block: IMergeBlock, collabWindow: CollaborationWindow): PartialSequenceLengths {\n const combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number | undefined, minSeq: number) {\n return seq !== undefined && seq !== UnassignedSequenceNumber && seq <= minSeq;\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n if (seqLTE(segment.seq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo = toRemovalInfo(segment);\n if (seqLTE(removalInfo?.removedSeq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n return combinedPartialLengths;\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n /**\n * Inserts length information about the insertion of `segment` into `combinedPartialLengths.partialLengths`.\n * Does not update the clientSeqNumbers field to account for this segment.\n * If `removalInfo` is defined, this operation updates the bookkeeping to account for the removal of this\n * segment at the removedSeq instead.\n */\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n seq = removalInfo.removedSeq;\n segmentLen = -segmentLen;\n // this code still assume removed client id and\n // overlap clients are separate. so we need to pull\n // then apart first.\n clientId = removalInfo.removedClientIds[0];\n removeClientOverlap = removalInfo.removedClientIds.length > 1\n ? removalInfo.removedClientIds.slice(1)\n : undefined;\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n let partialLengthEntry: PartialSequenceLength | undefined\n = seqPartials[indexFirstGTE]?.seq === seq ? seqPartials[indexFirstGTE] : undefined;\n if (partialLengthEntry !== undefined) {\n // Existing entry at this seq--this occurs for ops that insert/delete more than one segment.\n partialLengthEntry.seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n partialLengthEntry = {\n seq,\n clientId,\n len: 0,\n seglen: segmentLen,\n overlapRemoveClients: removeClientOverlap\n ? PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen)\n : undefined,\n };\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = partialLengthEntry;\n } else {\n seqPartials.push(partialLengthEntry);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n const len = penultPartialLen !== undefined ? penultPartialLen.len + seqSeglen : seqSeglen;\n if (seqPartialLen === undefined) {\n seqPartialLen = {\n clientId,\n len,\n seglen: seqSeglen,\n seq,\n };\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n seqPartialLen.len = len;\n // Assert client id matches\n }\n }\n\n /**\n * Length of the block this PartialSequenceLength corresponds to when viewed at `minSeq`.\n */\n private minLength = 0;\n\n /**\n * Total number of segments in the subtree rooted at the block this PartialSequenceLength corresponds to.\n */\n private segmentCount = 0;\n\n /**\n * List of PartialSequenceLength objects--ordered by increasing seq--giving length information about\n * the block associated with this PartialSequenceLengths object.\n *\n * `partialLengths[i].len` contains the length of this block considering only sequenced segments with\n * `sequenceNumber <= partialLengths[i].seq`.\n */\n private readonly partialLengths: PartialSequenceLength[] = [];\n\n /**\n * clientSeqNumbers[clientId] is a list of partial lengths for sequenced ops which either:\n * - were submitted by `clientId`.\n * - deleted a range containing segments that were concurrently deleted by `clientId`\n *\n * The second case is referred to as the \"overlapping delete\" case. It is necessary to avoid double-counting\n * the removal of those segments in queries including clientId.\n */\n private readonly clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(\n /**\n * The minimumSequenceNumber as defined by the collab window used in the last call to `update`,\n * or if no such calls have been made, the one used on construction.\n */\n public minSeq: number) { }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree (and `update` has been called\n // on all descendant PartialSequenceLengths)\n // TODO: assert client id matches\n public update(\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo = toRemovalInfo(segment);\n\n if (segment.seq === seq) {\n if (removalInfo?.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo?.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n // Subtract out double-counted lengths: segments still in the collab window but before\n // the refSeq submitted by the client we're querying for were counted in each addition above.\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n this.minSeq = segmentWindow.minSeq;\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced and that this is called in increasing `seq` order.\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n\n/**\n * Clones an `overlapRemoveClients` red-black tree.\n */\nfunction cloneOverlapRemoveClients(\n oldTree: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n}\n\n/**\n * Combines the `overlapRemoveClients` field of two `PartialSequenceLength` objects,\n * modifying the first PartialSequenceLength's bookkeeping in-place.\n *\n * Combination is performed additively on `seglen` on a per-client basis.\n */\nfunction combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n}\n\n/**\n * Given a collection of PartialSequenceLength lists--each sorted by sequence number--returns an iterable that yields\n * each PartialSequenceLength in sequence order.\n *\n * This is equivalent to flattening the input list and sorting it by sequence number. If the number of lists to merge is\n * a constant, however, this approach is advantageous asymptotically.\n */\nfunction mergeSortedListsBySeq(lists: PartialSequenceLength[][]): Iterable<PartialSequenceLength> {\n class PartialSequenceLengthIterator {\n /**\n * nextSmallestIndex[i] is the next element of sublists[i] to check.\n * In other words, the iterator has already yielded elements of sublists[i] *up through*\n * sublists[i][nextSmallestIndex[i] - 1].\n */\n private readonly nextSmallestIndex: number[];\n\n constructor(private readonly sublists: PartialSequenceLength[][]) {\n this.nextSmallestIndex = new Array(sublists.length);\n for (let i = 0; i < sublists.length; i++) {\n this.nextSmallestIndex[i] = 0;\n }\n }\n\n public next(): { value: PartialSequenceLength; done: false; } | { value: undefined; done: true; } {\n const len = this.sublists.length;\n let currentMin: PartialSequenceLength | undefined;\n let currentMinIndex: number | undefined;\n for (let i = 0; i < len; i++) {\n const candidateIndex = this.nextSmallestIndex[i];\n if (candidateIndex < this.sublists[i].length) {\n const candidate = this.sublists[i][candidateIndex];\n if (!currentMin || candidate.seq < currentMin.seq) {\n currentMin = candidate;\n currentMinIndex = i;\n }\n }\n }\n\n if (currentMin) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.nextSmallestIndex[currentMinIndex!]++;\n return { value: currentMin, done: false };\n } else {\n return { value: undefined, done: true };\n }\n }\n }\n\n return { [Symbol.iterator]: () => new PartialSequenceLengthIterator(lists) };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAwClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAiCrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAmBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAwClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAkCrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAmBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n default:\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n default:\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { Stack } from "./collections";
6
- import { ISegment } from "./mergeTree";
6
+ import { ISegment } from "./mergeTreeNodes";
7
7
  import { ReferenceType, ICombiningOp } from "./ops";
8
8
  import { PropertySet, MapLike } from "./properties";
9
9
  export declare const reservedTileLabelsKey = "referenceTileLabels";
@@ -21,32 +21,12 @@ export interface ReferencePosition {
21
21
  getSegment(): ISegment | undefined;
22
22
  getOffset(): number;
23
23
  addProperties(newProps: PropertySet, op?: ICombiningOp): void;
24
- isLeaf(): boolean;
25
- /**
26
- * @deprecated - use refHasTileLabels
27
- */
28
- hasTileLabels(): boolean;
29
- /**
30
- * @deprecated - use refHasRangeLabels
31
- */
32
- hasRangeLabels(): boolean;
33
- /**
34
- * @deprecated - use refHasTileLabel
35
- */
36
- hasTileLabel(label: string): boolean;
37
- /**
38
- * @deprecated - use refHasRangeLabel
39
- */
40
- hasRangeLabel(label: string): boolean;
41
- /**
42
- * @deprecated - use refGetTileLabels
43
- */
44
- getTileLabels(): string[] | undefined;
45
- /**
46
- * @deprecated - use refGetRangeLabels
47
- */
48
- getRangeLabels(): string[] | undefined;
24
+ isLeaf(): this is ISegment;
49
25
  }
26
+ /**
27
+ * @deprecated for internal use only. public export will be removed.
28
+ * @internal
29
+ */
50
30
  export declare type RangeStackMap = MapLike<Stack<ReferencePosition>>;
51
31
  export declare const DetachedReferencePosition = -1;
52
32
  export declare function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T;
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAIlH;AAED,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAEuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,OAAO,CAAC;IAElB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;IACzB;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC;IAC1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1C;AAED,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAc5F"}
1
+ {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAIlH;AAED,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAEuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC;CAC9B;AAED;;;GAGG;AACH,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAE9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAc5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.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 { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTree\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport function refTypeIncludesFlag(refPosOrType: ReferencePosition | ReferenceType, flags: ReferenceType): boolean {\n const refType = typeof refPosOrType === \"number\" ? refPosOrType : refPosOrType.refType;\n // eslint-disable-next-line no-bitwise\n return (refType & flags) !== 0;\n}\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n refTypeIncludesFlag(refPos, ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): boolean;\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels(): boolean;\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels(): boolean;\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean;\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean;\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined;\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) < 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) > 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n if (aSeg === undefined\n || (bSeg !== undefined &&\n aSeg.ordinal < bSeg.ordinal)) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.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 { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport function refTypeIncludesFlag(refPosOrType: ReferencePosition | ReferenceType, flags: ReferenceType): boolean {\n const refType = typeof refPosOrType === \"number\" ? refPosOrType : refPosOrType.refType;\n // eslint-disable-next-line no-bitwise\n return (refType & flags) !== 0;\n}\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n refTypeIncludesFlag(refPos, ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): this is ISegment;\n}\n\n/**\n * @deprecated for internal use only. public export will be removed.\n * @internal\n */\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\n\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) < 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) > 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n if (aSeg === undefined\n || (bSeg !== undefined &&\n aSeg.ordinal < bSeg.ordinal)) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ISegment, SegmentGroup } from "./mergeTree";
5
+ import { ISegment, SegmentGroup } from "./mergeTreeNodes";
6
6
  export declare class SegmentGroupCollection {
7
7
  private readonly segment;
8
8
  private readonly segmentGroups;
@@ -11,6 +11,7 @@ export declare class SegmentGroupCollection {
11
11
  get empty(): boolean;
12
12
  enqueue(segmentGroup: SegmentGroup): void;
13
13
  dequeue(): SegmentGroup | undefined;
14
+ pop?(): SegmentGroup | undefined;
14
15
  clear(): void;
15
16
  copyTo(segment: ISegment): void;
16
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segmentGroupCollection.d.ts","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErD,qBAAa,sBAAsB;IAGnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEtB,OAAO,EAAE,QAAQ;IAI9C,IAAW,IAAI,WAEd;IAED,IAAW,KAAK,YAEf;IAEM,OAAO,CAAC,YAAY,EAAE,YAAY;IAKlC,OAAO,IAAI,YAAY,GAAG,SAAS;IAInC,KAAK;IAIL,MAAM,CAAC,OAAO,EAAE,QAAQ;CAGlC"}
1
+ {"version":3,"file":"segmentGroupCollection.d.ts","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qBAAa,sBAAsB;IAGnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEtB,OAAO,EAAE,QAAQ;IAI9C,IAAW,IAAI,WAEd;IAED,IAAW,KAAK,YAEf;IAEM,OAAO,CAAC,YAAY,EAAE,YAAY;IAKlC,OAAO,IAAI,YAAY,GAAG,SAAS;IAInC,GAAG,CAAC,IAAI,YAAY,GAAG,SAAS;IAIhC,KAAK;IAIL,MAAM,CAAC,OAAO,EAAE,QAAQ;CAGlC"}
@@ -21,6 +21,9 @@ export class SegmentGroupCollection {
21
21
  dequeue() {
22
22
  return this.segmentGroups.dequeue();
23
23
  }
24
+ pop() {
25
+ return this.segmentGroups.pop ? this.segmentGroups.pop() : undefined;
26
+ }
24
27
  clear() {
25
28
  this.segmentGroups.clear();
26
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segmentGroupCollection.js","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,OAAO,sBAAsB;IAG/B,YAA6B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,EAAgB,CAAC;IACtD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,YAA0B;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { List, ListMakeHead } from \"./collections\";\nimport { ISegment, SegmentGroup } from \"./mergeTree\";\n\nexport class SegmentGroupCollection {\n private readonly segmentGroups: List<SegmentGroup>;\n\n constructor(private readonly segment: ISegment) {\n this.segmentGroups = ListMakeHead<SegmentGroup>();\n }\n\n public get size() {\n return this.segmentGroups.count();\n }\n\n public get empty() {\n return this.segmentGroups.empty();\n }\n\n public enqueue(segmentGroup: SegmentGroup) {\n this.segmentGroups.enqueue(segmentGroup);\n segmentGroup.segments.push(this.segment);\n }\n\n public dequeue(): SegmentGroup | undefined {\n return this.segmentGroups.dequeue();\n }\n\n public clear() {\n this.segmentGroups.clear();\n }\n\n public copyTo(segment: ISegment) {\n this.segmentGroups.walk((sg) => segment.segmentGroups.enqueue(sg));\n }\n}\n"]}
1
+ {"version":3,"file":"segmentGroupCollection.js","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,OAAO,sBAAsB;IAG/B,YAA6B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,EAAgB,CAAC;IACtD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,YAA0B;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { List, ListMakeHead } from \"./collections\";\nimport { ISegment, SegmentGroup } from \"./mergeTreeNodes\";\n\nexport class SegmentGroupCollection {\n private readonly segmentGroups: List<SegmentGroup>;\n\n constructor(private readonly segment: ISegment) {\n this.segmentGroups = ListMakeHead<SegmentGroup>();\n }\n\n public get size() {\n return this.segmentGroups.count();\n }\n\n public get empty() {\n return this.segmentGroups.empty();\n }\n\n public enqueue(segmentGroup: SegmentGroup) {\n this.segmentGroups.enqueue(segmentGroup);\n segmentGroup.segments.push(this.segment);\n }\n\n public dequeue(): SegmentGroup | undefined {\n return this.segmentGroups.dequeue();\n }\n\n public pop?(): SegmentGroup | undefined {\n return this.segmentGroups.pop ? this.segmentGroups.pop() : undefined;\n }\n\n public clear() {\n this.segmentGroups.clear();\n }\n\n public copyTo(segment: ISegment) {\n this.segmentGroups.walk((sg) => segment.segmentGroups.enqueue(sg));\n }\n}\n"]}
@@ -4,12 +4,21 @@
4
4
  */
5
5
  import { ICombiningOp, IMergeTreeAnnotateMsg } from "./ops";
6
6
  import { PropertySet } from "./properties";
7
+ export declare enum PropertiesRollback {
8
+ /** Not in a rollback */
9
+ None = 0,
10
+ /** Rollback */
11
+ Rollback = 1,
12
+ /** Rollback of a rewrite */
13
+ Rewrite = 2
14
+ }
7
15
  export declare class PropertiesManager {
8
16
  private pendingKeyUpdateCount;
9
17
  private pendingRewriteCount;
10
18
  constructor();
11
19
  ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg): void;
12
- addProperties(oldProps: PropertySet, newProps: PropertySet, op?: ICombiningOp, seq?: number, collaborating?: boolean): PropertySet | undefined;
20
+ private decrementPendingCounts;
21
+ addProperties(oldProps: PropertySet, newProps: PropertySet, op?: ICombiningOp, seq?: number, collaborating?: boolean, rollback?: PropertiesRollback): PropertySet | undefined;
13
22
  copyTo(oldProps: PropertySet, newProps: PropertySet | undefined, newManager: PropertiesManager): PropertySet | undefined;
14
23
  hasPendingProperties(): boolean;
15
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAiBtD,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAAG,WAAW,GAAG,SAAS;IAuErD,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}
1
+ {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,oBAAY,kBAAkB;IAC1B,wBAAwB;IACxB,IAAI,IAAA;IAEJ,eAAe;IACf,QAAQ,IAAA;IAER,4BAA4B;IAC5B,OAAO,IAAA;CACV;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAK7D,OAAO,CAAC,sBAAsB;IAqBvB,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,EAC9B,QAAQ,GAAE,kBAA4C,GAAG,WAAW,GAAG,SAAS;IAyF7E,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}
@@ -4,19 +4,36 @@
4
4
  */
5
5
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
6
6
  import { assert } from "@fluidframework/common-utils";
7
- import { UnassignedSequenceNumber } from "./constants";
7
+ import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
8
8
  import { combine, createMap, } from "./properties";
9
+ export var PropertiesRollback;
10
+ (function (PropertiesRollback) {
11
+ /** Not in a rollback */
12
+ PropertiesRollback[PropertiesRollback["None"] = 0] = "None";
13
+ /** Rollback */
14
+ PropertiesRollback[PropertiesRollback["Rollback"] = 1] = "Rollback";
15
+ /** Rollback of a rewrite */
16
+ PropertiesRollback[PropertiesRollback["Rewrite"] = 2] = "Rewrite";
17
+ })(PropertiesRollback || (PropertiesRollback = {}));
9
18
  export class PropertiesManager {
10
19
  constructor() {
11
20
  this.pendingRewriteCount = 0;
12
21
  }
13
22
  ackPendingProperties(annotateOp) {
23
+ const rewrite = !!annotateOp.combiningOp && annotateOp.combiningOp.name === "rewrite";
24
+ this.decrementPendingCounts(rewrite, annotateOp.props);
25
+ }
26
+ decrementPendingCounts(rewrite, props) {
14
27
  var _a, _b;
15
- if (annotateOp.combiningOp && annotateOp.combiningOp.name === "rewrite") {
28
+ if (rewrite) {
16
29
  this.pendingRewriteCount--;
17
30
  }
18
- for (const key of Object.keys(annotateOp.props)) {
31
+ for (const key of Object.keys(props)) {
19
32
  if (((_a = this.pendingKeyUpdateCount) === null || _a === void 0 ? void 0 : _a[key]) !== undefined) {
33
+ if (rewrite && props[key] === null) {
34
+ // We don't track the pending count for this redundant case
35
+ continue;
36
+ }
20
37
  assert(this.pendingKeyUpdateCount[key] > 0, 0x05c /* "Trying to update more annotate props than do exist!" */);
21
38
  this.pendingKeyUpdateCount[key]--;
22
39
  if (((_b = this.pendingKeyUpdateCount) === null || _b === void 0 ? void 0 : _b[key]) === 0) {
@@ -26,20 +43,33 @@ export class PropertiesManager {
26
43
  }
27
44
  }
28
45
  }
29
- addProperties(oldProps, newProps, op, seq, collaborating = false) {
46
+ addProperties(oldProps, newProps, op, seq, collaborating = false, rollback = PropertiesRollback.None) {
30
47
  var _a;
31
48
  if (!this.pendingKeyUpdateCount) {
32
49
  this.pendingKeyUpdateCount = createMap();
33
50
  }
34
51
  // There are outstanding local rewrites, so block all non-local changes
35
- if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && collaborating) {
52
+ if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && seq !== UniversalSequenceNumber
53
+ && collaborating) {
36
54
  return undefined;
37
55
  }
56
+ // Clean up counts for rolled back edits before modifying oldProps
57
+ if (collaborating) {
58
+ if (rollback === PropertiesRollback.Rollback) {
59
+ this.decrementPendingCounts(false, newProps);
60
+ }
61
+ else if (rollback === PropertiesRollback.Rewrite) {
62
+ // oldProps is the correct props for tracking counts on rewrite because the ones in newProps include
63
+ // those that were implicitly cleared by the rewrite for which we don't track pending counts.
64
+ this.decrementPendingCounts(true, oldProps);
65
+ }
66
+ }
38
67
  const rewrite = (op && op.name === "rewrite");
39
68
  const combiningOp = !rewrite ? op ? op : undefined : undefined;
40
69
  const shouldModifyKey = (key) => {
41
70
  var _a;
42
71
  if (seq === UnassignedSequenceNumber
72
+ || seq === UniversalSequenceNumber
43
73
  || ((_a = this.pendingKeyUpdateCount) === null || _a === void 0 ? void 0 : _a[key]) === undefined
44
74
  || combiningOp) {
45
75
  return true;
@@ -64,6 +94,11 @@ export class PropertiesManager {
64
94
  for (const key of Object.keys(newProps)) {
65
95
  if (collaborating) {
66
96
  if (seq === UnassignedSequenceNumber) {
97
+ if (rewrite && newProps[key] === null) {
98
+ // This case has already been handled above and
99
+ // we don't want to track the pending count for it in case of rollback
100
+ continue;
101
+ }
67
102
  if (((_a = this.pendingKeyUpdateCount) === null || _a === void 0 ? void 0 : _a[key]) === undefined) {
68
103
  this.pendingKeyUpdateCount[key] = 0;
69
104
  }
@@ -74,7 +109,7 @@ export class PropertiesManager {
74
109
  }
75
110
  }
76
111
  const previousValue = oldProps[key];
77
- // The delta should be null if undefined, as thats how we encode delete
112
+ // The delta should be null if undefined, as that's how we encode delete
78
113
  deltas[key] = (previousValue === undefined) ? null : previousValue;
79
114
  let newValue;
80
115
  if (combiningOp) {
@@ -1 +1 @@
1
- {"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.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 { assert } from \"@fluidframework/common-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport { ICombiningOp, IMergeTreeAnnotateMsg } from \"./ops\";\nimport {\n combine,\n createMap,\n MapLike,\n PropertySet,\n} from \"./properties\";\n\nexport class PropertiesManager {\n private pendingKeyUpdateCount: MapLike<number> | undefined;\n private pendingRewriteCount: number;\n\n constructor() {\n this.pendingRewriteCount = 0;\n }\n\n public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n if (annotateOp.combiningOp && annotateOp.combiningOp.name === \"rewrite\") {\n this.pendingRewriteCount--;\n }\n for (const key of Object.keys(annotateOp.props)) {\n if (this.pendingKeyUpdateCount?.[key] !== undefined) {\n assert(this.pendingKeyUpdateCount[key] > 0,\n 0x05c /* \"Trying to update more annotate props than do exist!\" */);\n this.pendingKeyUpdateCount[key]--;\n if (this.pendingKeyUpdateCount?.[key] === 0) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.pendingKeyUpdateCount[key];\n }\n }\n }\n }\n\n public addProperties(\n oldProps: PropertySet,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collaborating: boolean = false): PropertySet | undefined {\n if (!this.pendingKeyUpdateCount) {\n this.pendingKeyUpdateCount = createMap<number>();\n }\n\n // There are outstanding local rewrites, so block all non-local changes\n if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && collaborating) {\n return undefined;\n }\n\n const rewrite = (op && op.name === \"rewrite\");\n const combiningOp = !rewrite ? op ? op : undefined : undefined;\n\n const shouldModifyKey = (key: string): boolean => {\n if (seq === UnassignedSequenceNumber\n || this.pendingKeyUpdateCount?.[key] === undefined\n || combiningOp) {\n return true;\n }\n return false;\n };\n\n const deltas: PropertySet = {};\n if (rewrite) {\n if (collaborating && seq === UnassignedSequenceNumber) {\n this.pendingRewriteCount++;\n }\n // We are re-writing so delete all the properties\n // not in the new props\n for (const key of Object.keys(oldProps)) {\n if (!newProps[key] && shouldModifyKey(key)) {\n deltas[key] = oldProps[key];\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n }\n }\n }\n\n for (const key of Object.keys(newProps)) {\n if (collaborating) {\n if (seq === UnassignedSequenceNumber) {\n if (this.pendingKeyUpdateCount?.[key] === undefined) {\n this.pendingKeyUpdateCount[key] = 0;\n }\n this.pendingKeyUpdateCount[key]++;\n } else if (!shouldModifyKey(key)) {\n continue;\n }\n }\n\n const previousValue: any = oldProps[key];\n // The delta should be null if undefined, as thats how we encode delete\n deltas[key] = (previousValue === undefined) ? null : previousValue;\n let newValue: any;\n if (combiningOp) {\n newValue = combine(combiningOp, previousValue, newValue, seq);\n } else {\n newValue = newProps[key];\n }\n if (newValue === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n } else {\n oldProps[key] = newValue;\n }\n }\n\n return deltas;\n }\n\n public copyTo(\n oldProps: PropertySet,\n newProps: PropertySet | undefined,\n newManager: PropertiesManager,\n ): PropertySet | undefined {\n if (oldProps) {\n if (!newProps) {\n // eslint-disable-next-line no-param-reassign\n newProps = createMap<any>();\n }\n if (!newManager) {\n throw new Error(\"Must provide new PropertyManager\");\n }\n for (const key of Object.keys(oldProps)) {\n newProps[key] = oldProps[key];\n }\n newManager.pendingRewriteCount = this.pendingRewriteCount;\n newManager.pendingKeyUpdateCount = createMap<number>();\n for (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n newManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n }\n }\n return newProps;\n }\n\n public hasPendingProperties() {\n return this.pendingRewriteCount > 0 || Object.keys(this.pendingKeyUpdateCount!).length > 0;\n }\n}\n"]}
1
+ {"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.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 { assert } from \"@fluidframework/common-utils\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { ICombiningOp, IMergeTreeAnnotateMsg } from \"./ops\";\nimport {\n combine,\n createMap,\n MapLike,\n PropertySet,\n} from \"./properties\";\n\nexport enum PropertiesRollback {\n /** Not in a rollback */\n None,\n\n /** Rollback */\n Rollback,\n\n /** Rollback of a rewrite */\n Rewrite,\n}\n\nexport class PropertiesManager {\n private pendingKeyUpdateCount: MapLike<number> | undefined;\n private pendingRewriteCount: number;\n\n constructor() {\n this.pendingRewriteCount = 0;\n }\n\n public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n const rewrite = !!annotateOp.combiningOp && annotateOp.combiningOp.name === \"rewrite\";\n this.decrementPendingCounts(rewrite, annotateOp.props);\n }\n\n private decrementPendingCounts(rewrite: boolean, props: PropertySet) {\n if (rewrite) {\n this.pendingRewriteCount--;\n }\n for (const key of Object.keys(props)) {\n if (this.pendingKeyUpdateCount?.[key] !== undefined) {\n if (rewrite && props[key] === null) {\n // We don't track the pending count for this redundant case\n continue;\n }\n assert(this.pendingKeyUpdateCount[key] > 0,\n 0x05c /* \"Trying to update more annotate props than do exist!\" */);\n this.pendingKeyUpdateCount[key]--;\n if (this.pendingKeyUpdateCount?.[key] === 0) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.pendingKeyUpdateCount[key];\n }\n }\n }\n }\n\n public addProperties(\n oldProps: PropertySet,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collaborating: boolean = false,\n rollback: PropertiesRollback = PropertiesRollback.None): PropertySet | undefined {\n if (!this.pendingKeyUpdateCount) {\n this.pendingKeyUpdateCount = createMap<number>();\n }\n\n // There are outstanding local rewrites, so block all non-local changes\n if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && seq !== UniversalSequenceNumber\n && collaborating) {\n return undefined;\n }\n\n // Clean up counts for rolled back edits before modifying oldProps\n if (collaborating) {\n if (rollback === PropertiesRollback.Rollback) {\n this.decrementPendingCounts(false, newProps);\n } else if (rollback === PropertiesRollback.Rewrite) {\n // oldProps is the correct props for tracking counts on rewrite because the ones in newProps include\n // those that were implicitly cleared by the rewrite for which we don't track pending counts.\n this.decrementPendingCounts(true, oldProps);\n }\n }\n\n const rewrite = (op && op.name === \"rewrite\");\n const combiningOp = !rewrite ? op ? op : undefined : undefined;\n\n const shouldModifyKey = (key: string): boolean => {\n if (seq === UnassignedSequenceNumber\n || seq === UniversalSequenceNumber\n || this.pendingKeyUpdateCount?.[key] === undefined\n || combiningOp) {\n return true;\n }\n return false;\n };\n\n const deltas: PropertySet = {};\n if (rewrite) {\n if (collaborating && seq === UnassignedSequenceNumber) {\n this.pendingRewriteCount++;\n }\n // We are re-writing so delete all the properties\n // not in the new props\n for (const key of Object.keys(oldProps)) {\n if (!newProps[key] && shouldModifyKey(key)) {\n deltas[key] = oldProps[key];\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n }\n }\n }\n\n for (const key of Object.keys(newProps)) {\n if (collaborating) {\n if (seq === UnassignedSequenceNumber) {\n if (rewrite && newProps[key] === null) {\n // This case has already been handled above and\n // we don't want to track the pending count for it in case of rollback\n continue;\n }\n if (this.pendingKeyUpdateCount?.[key] === undefined) {\n this.pendingKeyUpdateCount[key] = 0;\n }\n this.pendingKeyUpdateCount[key]++;\n } else if (!shouldModifyKey(key)) {\n continue;\n }\n }\n\n const previousValue: any = oldProps[key];\n // The delta should be null if undefined, as that's how we encode delete\n deltas[key] = (previousValue === undefined) ? null : previousValue;\n let newValue: any;\n if (combiningOp) {\n newValue = combine(combiningOp, previousValue, newValue, seq);\n } else {\n newValue = newProps[key];\n }\n if (newValue === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n } else {\n oldProps[key] = newValue;\n }\n }\n\n return deltas;\n }\n\n public copyTo(\n oldProps: PropertySet,\n newProps: PropertySet | undefined,\n newManager: PropertiesManager,\n ): PropertySet | undefined {\n if (oldProps) {\n if (!newProps) {\n // eslint-disable-next-line no-param-reassign\n newProps = createMap<any>();\n }\n if (!newManager) {\n throw new Error(\"Must provide new PropertyManager\");\n }\n for (const key of Object.keys(oldProps)) {\n newProps[key] = oldProps[key];\n }\n newManager.pendingRewriteCount = this.pendingRewriteCount;\n newManager.pendingKeyUpdateCount = createMap<number>();\n for (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n newManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n }\n }\n return newProps;\n }\n\n public hasPendingProperties() {\n return this.pendingRewriteCount > 0 || Object.keys(this.pendingKeyUpdateCount!).length > 0;\n }\n}\n"]}