@fluidframework/sequence 2.0.0-dev-rc.1.0.0.228517 → 2.0.0-dev-rc.2.0.0.245554

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 (388) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/README.md +2 -2
  5. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/sequence.api.md +15 -27
  8. package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  9. package/dist/IntervalCollectionValues.d.ts.map +1 -0
  10. package/dist/{localValues.js → IntervalCollectionValues.js} +4 -4
  11. package/dist/IntervalCollectionValues.js.map +1 -0
  12. package/dist/index.d.ts +11 -11
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +42 -42
  15. package/dist/index.js.map +1 -1
  16. package/dist/intervalCollection.d.ts +28 -22
  17. package/dist/intervalCollection.d.ts.map +1 -1
  18. package/dist/intervalCollection.js +59 -110
  19. package/dist/intervalCollection.js.map +1 -1
  20. package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +18 -57
  21. package/dist/intervalCollectionMap.d.ts.map +1 -0
  22. package/dist/{defaultMap.js → intervalCollectionMap.js} +77 -129
  23. package/dist/intervalCollectionMap.js.map +1 -0
  24. package/{lib/defaultMapInterfaces.d.mts → dist/intervalCollectionMapInterfaces.d.ts} +16 -22
  25. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
  26. package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  27. package/dist/intervalCollectionMapInterfaces.js.map +1 -0
  28. package/dist/intervalIndex/endpointInRangeIndex.d.ts +3 -3
  29. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  30. package/dist/intervalIndex/endpointInRangeIndex.js +8 -8
  31. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  32. package/dist/intervalIndex/endpointIndex.d.ts +3 -3
  33. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  34. package/dist/intervalIndex/endpointIndex.js +4 -4
  35. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  36. package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
  37. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  38. package/dist/intervalIndex/idIntervalIndex.js +2 -2
  39. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  40. package/dist/intervalIndex/index.d.ts +8 -8
  41. package/dist/intervalIndex/index.d.ts.map +1 -1
  42. package/dist/intervalIndex/index.js +16 -16
  43. package/dist/intervalIndex/index.js.map +1 -1
  44. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  45. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  46. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  47. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +7 -10
  48. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  49. package/dist/intervalIndex/overlappingIntervalsIndex.js +12 -13
  50. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  51. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
  52. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  53. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +7 -7
  54. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  55. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  56. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  57. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  58. package/dist/intervalIndex/startpointInRangeIndex.d.ts +3 -3
  59. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  60. package/dist/intervalIndex/startpointInRangeIndex.js +8 -8
  61. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  62. package/dist/intervalTree.d.ts +1 -1
  63. package/dist/intervalTree.d.ts.map +1 -1
  64. package/dist/intervalTree.js.map +1 -1
  65. package/dist/intervals/index.d.ts +3 -3
  66. package/dist/intervals/index.d.ts.map +1 -1
  67. package/dist/intervals/index.js +16 -16
  68. package/dist/intervals/index.js.map +1 -1
  69. package/dist/intervals/interval.d.ts +2 -2
  70. package/dist/intervals/interval.d.ts.map +1 -1
  71. package/dist/intervals/interval.js +2 -2
  72. package/dist/intervals/interval.js.map +1 -1
  73. package/dist/intervals/intervalUtils.d.ts +3 -3
  74. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  75. package/dist/intervals/intervalUtils.js +1 -1
  76. package/dist/intervals/intervalUtils.js.map +1 -1
  77. package/dist/intervals/sequenceInterval.d.ts +2 -2
  78. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  79. package/dist/intervals/sequenceInterval.js +22 -23
  80. package/dist/intervals/sequenceInterval.js.map +1 -1
  81. package/dist/package.json +3 -0
  82. package/dist/packageVersion.d.ts +1 -1
  83. package/dist/packageVersion.js +1 -1
  84. package/dist/packageVersion.js.map +1 -1
  85. package/dist/revertibles.d.ts +12 -12
  86. package/dist/revertibles.d.ts.map +1 -1
  87. package/dist/revertibles.js +26 -26
  88. package/dist/revertibles.js.map +1 -1
  89. package/dist/sequence-alpha.d.ts +172 -13
  90. package/dist/sequence-beta.d.ts +2 -0
  91. package/dist/sequence-public.d.ts +2 -0
  92. package/dist/sequence-untrimmed.d.ts +73 -14
  93. package/dist/sequence.d.ts +48 -5
  94. package/dist/sequence.d.ts.map +1 -1
  95. package/dist/sequence.js +103 -29
  96. package/dist/sequence.js.map +1 -1
  97. package/dist/sequenceFactory.d.ts +4 -1
  98. package/dist/sequenceFactory.d.ts.map +1 -1
  99. package/dist/sequenceFactory.js +8 -5
  100. package/dist/sequenceFactory.js.map +1 -1
  101. package/dist/sharedIntervalCollection.d.ts +2 -2
  102. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  103. package/dist/sharedIntervalCollection.js +5 -5
  104. package/dist/sharedIntervalCollection.js.map +1 -1
  105. package/dist/sharedSequence.d.ts +1 -1
  106. package/dist/sharedSequence.d.ts.map +1 -1
  107. package/dist/sharedSequence.js +2 -2
  108. package/dist/sharedSequence.js.map +1 -1
  109. package/dist/sharedString.d.ts +2 -2
  110. package/dist/sharedString.d.ts.map +1 -1
  111. package/dist/sharedString.js +6 -6
  112. package/dist/sharedString.js.map +1 -1
  113. package/dist/tsdoc-metadata.json +1 -1
  114. package/lib/{localValues.d.mts → IntervalCollectionValues.d.ts} +13 -12
  115. package/lib/IntervalCollectionValues.d.ts.map +1 -0
  116. package/lib/{localValues.mjs → IntervalCollectionValues.js} +2 -2
  117. package/lib/IntervalCollectionValues.js.map +1 -0
  118. package/lib/{index.d.mts → index.d.ts} +24 -12
  119. package/lib/index.d.ts.map +1 -0
  120. package/lib/{index.mjs → index.js} +11 -11
  121. package/lib/index.js.map +1 -0
  122. package/lib/{intervalCollection.d.mts → intervalCollection.d.ts} +29 -23
  123. package/lib/intervalCollection.d.ts.map +1 -0
  124. package/lib/{intervalCollection.mjs → intervalCollection.js} +23 -74
  125. package/lib/intervalCollection.js.map +1 -0
  126. package/lib/{defaultMap.d.mts → intervalCollectionMap.d.ts} +18 -57
  127. package/lib/intervalCollectionMap.d.ts.map +1 -0
  128. package/lib/{defaultMap.mjs → intervalCollectionMap.js} +75 -127
  129. package/lib/intervalCollectionMap.js.map +1 -0
  130. package/{dist/defaultMapInterfaces.d.ts → lib/intervalCollectionMapInterfaces.d.ts} +16 -22
  131. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
  132. package/lib/{intervalIndex/sequenceIntervalIndexes.mjs → intervalCollectionMapInterfaces.js} +1 -1
  133. package/lib/intervalCollectionMapInterfaces.js.map +1 -0
  134. package/lib/intervalIndex/{endpointInRangeIndex.d.mts → endpointInRangeIndex.d.ts} +4 -4
  135. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  136. package/lib/intervalIndex/{endpointInRangeIndex.mjs → endpointInRangeIndex.js} +3 -3
  137. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
  138. package/lib/intervalIndex/{endpointIndex.d.mts → endpointIndex.d.ts} +4 -4
  139. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
  140. package/lib/intervalIndex/{endpointIndex.mjs → endpointIndex.js} +2 -2
  141. package/lib/intervalIndex/endpointIndex.js.map +1 -0
  142. package/lib/intervalIndex/{idIntervalIndex.d.mts → idIntervalIndex.d.ts} +3 -3
  143. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  144. package/lib/intervalIndex/{idIntervalIndex.mjs → idIntervalIndex.js} +2 -2
  145. package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
  146. package/lib/intervalIndex/{index.d.mts → index.d.ts} +9 -9
  147. package/lib/intervalIndex/index.d.ts.map +1 -0
  148. package/lib/intervalIndex/{index.mjs → index.js} +7 -7
  149. package/lib/intervalIndex/index.js.map +1 -0
  150. package/lib/intervalIndex/{intervalIndex.d.mts → intervalIndex.d.ts} +2 -2
  151. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
  152. package/lib/intervalIndex/{intervalIndex.mjs → intervalIndex.js} +1 -1
  153. package/lib/intervalIndex/intervalIndex.js.map +1 -0
  154. package/lib/intervalIndex/{intervalIndexUtils.d.mts → intervalIndexUtils.d.ts} +1 -1
  155. package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  156. package/lib/intervalIndex/{intervalIndexUtils.mjs → intervalIndexUtils.js} +1 -1
  157. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
  158. package/lib/intervalIndex/{overlappingIntervalsIndex.d.mts → overlappingIntervalsIndex.d.ts} +8 -11
  159. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  160. package/lib/intervalIndex/{overlappingIntervalsIndex.mjs → overlappingIntervalsIndex.js} +8 -9
  161. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  162. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.d.mts → overlappingSequenceIntervalsIndex.d.ts} +3 -3
  163. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  164. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.mjs → overlappingSequenceIntervalsIndex.js} +3 -3
  165. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  166. package/lib/intervalIndex/{sequenceIntervalIndexes.d.mts → sequenceIntervalIndexes.d.ts} +3 -3
  167. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  168. package/lib/{defaultMapInterfaces.mjs → intervalIndex/sequenceIntervalIndexes.js} +1 -1
  169. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  170. package/lib/intervalIndex/{startpointInRangeIndex.d.mts → startpointInRangeIndex.d.ts} +4 -4
  171. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  172. package/lib/intervalIndex/{startpointInRangeIndex.mjs → startpointInRangeIndex.js} +3 -3
  173. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
  174. package/lib/{intervalTree.d.mts → intervalTree.d.ts} +2 -2
  175. package/lib/intervalTree.d.ts.map +1 -0
  176. package/lib/{intervalTree.mjs → intervalTree.js} +1 -1
  177. package/lib/intervalTree.js.map +1 -0
  178. package/lib/intervals/{index.d.mts → index.d.ts} +4 -4
  179. package/lib/intervals/index.d.ts.map +1 -0
  180. package/lib/intervals/{index.mjs → index.js} +4 -4
  181. package/lib/intervals/index.js.map +1 -0
  182. package/lib/intervals/{interval.d.mts → interval.d.ts} +3 -3
  183. package/lib/intervals/{interval.d.mts.map → interval.d.ts.map} +1 -1
  184. package/lib/intervals/{interval.mjs → interval.js} +2 -2
  185. package/lib/intervals/interval.js.map +1 -0
  186. package/lib/intervals/{intervalUtils.d.mts → intervalUtils.d.ts} +4 -4
  187. package/lib/intervals/intervalUtils.d.ts.map +1 -0
  188. package/lib/intervals/{intervalUtils.mjs → intervalUtils.js} +3 -2
  189. package/lib/intervals/intervalUtils.js.map +1 -0
  190. package/lib/intervals/{sequenceInterval.d.mts → sequenceInterval.d.ts} +3 -3
  191. package/lib/intervals/sequenceInterval.d.ts.map +1 -0
  192. package/lib/intervals/{sequenceInterval.mjs → sequenceInterval.js} +5 -4
  193. package/lib/intervals/{sequenceInterval.mjs.map → sequenceInterval.js.map} +1 -1
  194. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  195. package/lib/packageVersion.d.ts.map +1 -0
  196. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  197. package/lib/packageVersion.js.map +1 -0
  198. package/lib/{revertibles.d.mts → revertibles.d.ts} +13 -13
  199. package/lib/revertibles.d.ts.map +1 -0
  200. package/lib/{revertibles.mjs → revertibles.js} +11 -10
  201. package/lib/revertibles.js.map +1 -0
  202. package/lib/{sequence-alpha.d.mts → sequence-alpha.d.ts} +185 -13
  203. package/lib/{sequence-beta.d.mts → sequence-beta.d.ts} +15 -0
  204. package/lib/{sequence-public.d.mts → sequence-public.d.ts} +15 -0
  205. package/lib/{sequence-untrimmed.d.mts → sequence-untrimmed.d.ts} +86 -14
  206. package/lib/{sequence.d.mts → sequence.d.ts} +49 -6
  207. package/lib/sequence.d.ts.map +1 -0
  208. package/lib/{sequence.mjs → sequence.js} +100 -29
  209. package/lib/sequence.js.map +1 -0
  210. package/lib/{sequenceDeltaEvent.d.mts → sequenceDeltaEvent.d.ts} +1 -1
  211. package/lib/sequenceDeltaEvent.d.ts.map +1 -0
  212. package/lib/{sequenceDeltaEvent.mjs → sequenceDeltaEvent.js} +1 -1
  213. package/lib/sequenceDeltaEvent.js.map +1 -0
  214. package/lib/{sequenceFactory.d.mts → sequenceFactory.d.ts} +5 -2
  215. package/lib/sequenceFactory.d.ts.map +1 -0
  216. package/lib/{sequenceFactory.mjs → sequenceFactory.js} +6 -3
  217. package/lib/sequenceFactory.js.map +1 -0
  218. package/lib/{sharedIntervalCollection.d.mts → sharedIntervalCollection.d.ts} +3 -3
  219. package/lib/sharedIntervalCollection.d.ts.map +1 -0
  220. package/lib/{sharedIntervalCollection.mjs → sharedIntervalCollection.js} +5 -5
  221. package/lib/sharedIntervalCollection.js.map +1 -0
  222. package/lib/{sharedSequence.d.mts → sharedSequence.d.ts} +2 -2
  223. package/lib/sharedSequence.d.ts.map +1 -0
  224. package/lib/{sharedSequence.mjs → sharedSequence.js} +2 -2
  225. package/lib/sharedSequence.js.map +1 -0
  226. package/lib/{sharedString.d.mts → sharedString.d.ts} +3 -3
  227. package/lib/sharedString.d.ts.map +1 -0
  228. package/lib/{sharedString.mjs → sharedString.js} +3 -3
  229. package/lib/sharedString.js.map +1 -0
  230. package/lib/test/collections.intervalTree.js +73 -0
  231. package/lib/test/collections.intervalTree.js.map +1 -0
  232. package/lib/test/createSnapshotFiles.js +15 -0
  233. package/lib/test/createSnapshotFiles.js.map +1 -0
  234. package/lib/test/dirname.cjs +16 -0
  235. package/lib/test/dirname.cjs.map +1 -0
  236. package/lib/test/endpointInRangeIndex.spec.js +182 -0
  237. package/lib/test/endpointInRangeIndex.spec.js.map +1 -0
  238. package/lib/test/fuzz/fuzzUtils.js +362 -0
  239. package/lib/test/fuzz/fuzzUtils.js.map +1 -0
  240. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +87 -0
  241. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -0
  242. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +128 -0
  243. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -0
  244. package/lib/test/fuzz/sharedString.fuzz.spec.js +91 -0
  245. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -0
  246. package/lib/test/generateSharedStrings.js +138 -0
  247. package/lib/test/generateSharedStrings.js.map +1 -0
  248. package/lib/test/intervalCollection.detached.spec.js +126 -0
  249. package/lib/test/intervalCollection.detached.spec.js.map +1 -0
  250. package/lib/test/intervalCollection.events.spec.js +491 -0
  251. package/lib/test/intervalCollection.events.spec.js.map +1 -0
  252. package/lib/test/intervalCollection.perf.spec.js +88 -0
  253. package/lib/test/intervalCollection.perf.spec.js.map +1 -0
  254. package/lib/test/intervalCollection.snapshot.spec.js +171 -0
  255. package/lib/test/intervalCollection.snapshot.spec.js.map +1 -0
  256. package/lib/test/intervalCollection.spec.js +1660 -0
  257. package/lib/test/intervalCollection.spec.js.map +1 -0
  258. package/lib/test/intervalIndexTestUtils.js +49 -0
  259. package/lib/test/intervalIndexTestUtils.js.map +1 -0
  260. package/lib/test/intervalRebasing.spec.js +589 -0
  261. package/lib/test/intervalRebasing.spec.js.map +1 -0
  262. package/lib/test/intervalStashedOps.spec.js +142 -0
  263. package/lib/test/intervalStashedOps.spec.js.map +1 -0
  264. package/lib/test/intervalTestUtils.js +81 -0
  265. package/lib/test/intervalTestUtils.js.map +1 -0
  266. package/lib/test/marshalling.spec.js +55 -0
  267. package/lib/test/marshalling.spec.js.map +1 -0
  268. package/lib/test/memory/sharedSequence.spec.js +82 -0
  269. package/lib/test/memory/sharedSequence.spec.js.map +1 -0
  270. package/lib/test/memory/sharedString.spec.js +134 -0
  271. package/lib/test/memory/sharedString.spec.js.map +1 -0
  272. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +348 -0
  273. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -0
  274. package/lib/test/partialLoad.spec.js +211 -0
  275. package/lib/test/partialLoad.spec.js.map +1 -0
  276. package/lib/test/rebasing.spec.js +81 -0
  277. package/lib/test/rebasing.spec.js.map +1 -0
  278. package/lib/test/reentrancy.spec.js +174 -0
  279. package/lib/test/reentrancy.spec.js.map +1 -0
  280. package/lib/test/revertibles.spec.js +971 -0
  281. package/lib/test/revertibles.spec.js.map +1 -0
  282. package/lib/test/sequenceDeltaEvent.spec.js +2144 -0
  283. package/lib/test/sequenceDeltaEvent.spec.js.map +1 -0
  284. package/lib/test/sharedIntervalCollection.spec.js +159 -0
  285. package/lib/test/sharedIntervalCollection.spec.js.map +1 -0
  286. package/lib/test/sharedString.spec.js +532 -0
  287. package/lib/test/sharedString.spec.js.map +1 -0
  288. package/lib/test/snapshotEmptyProps.spec.js +45 -0
  289. package/lib/test/snapshotEmptyProps.spec.js.map +1 -0
  290. package/lib/test/snapshotVersion.spec.js +149 -0
  291. package/lib/test/snapshotVersion.spec.js.map +1 -0
  292. package/lib/test/startpointInRangeIndex.spec.js +182 -0
  293. package/lib/test/startpointInRangeIndex.spec.js.map +1 -0
  294. package/lib/test/subSequence.spec.js +92 -0
  295. package/lib/test/subSequence.spec.js.map +1 -0
  296. package/lib/test/types/validateSequencePrevious.generated.js +162 -0
  297. package/lib/test/types/validateSequencePrevious.generated.js.map +1 -0
  298. package/lib/test/v1IntervalCollectionHelpers.js +93 -0
  299. package/lib/test/v1IntervalCollectionHelpers.js.map +1 -0
  300. package/package.json +66 -60
  301. package/src/{localValues.ts → IntervalCollectionValues.ts} +23 -17
  302. package/src/index.ts +15 -11
  303. package/src/intervalCollection.ts +73 -106
  304. package/src/{defaultMap.ts → intervalCollectionMap.ts} +120 -211
  305. package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +24 -23
  306. package/src/intervalIndex/endpointInRangeIndex.ts +4 -4
  307. package/src/intervalIndex/endpointIndex.ts +3 -3
  308. package/src/intervalIndex/idIntervalIndex.ts +3 -4
  309. package/src/intervalIndex/index.ts +8 -8
  310. package/src/intervalIndex/intervalIndex.ts +1 -1
  311. package/src/intervalIndex/overlappingIntervalsIndex.ts +10 -11
  312. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +4 -4
  313. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
  314. package/src/intervalIndex/startpointInRangeIndex.ts +4 -4
  315. package/src/intervalTree.ts +1 -1
  316. package/src/intervals/index.ts +3 -3
  317. package/src/intervals/interval.ts +2 -4
  318. package/src/intervals/intervalUtils.ts +3 -3
  319. package/src/intervals/sequenceInterval.ts +3 -4
  320. package/src/packageVersion.ts +1 -1
  321. package/src/revertibles.ts +13 -13
  322. package/src/sequence.ts +128 -50
  323. package/src/sequenceFactory.ts +5 -2
  324. package/src/sharedIntervalCollection.ts +7 -11
  325. package/src/sharedSequence.ts +1 -1
  326. package/src/sharedString.ts +2 -2
  327. package/tsconfig.cjs.json +7 -0
  328. package/tsconfig.json +2 -5
  329. package/dist/defaultMap.d.ts.map +0 -1
  330. package/dist/defaultMap.js.map +0 -1
  331. package/dist/defaultMapInterfaces.d.ts.map +0 -1
  332. package/dist/defaultMapInterfaces.js.map +0 -1
  333. package/dist/localValues.d.ts.map +0 -1
  334. package/dist/localValues.js.map +0 -1
  335. package/lib/defaultMap.d.mts.map +0 -1
  336. package/lib/defaultMap.mjs.map +0 -1
  337. package/lib/defaultMapInterfaces.d.mts.map +0 -1
  338. package/lib/defaultMapInterfaces.mjs.map +0 -1
  339. package/lib/index.d.mts.map +0 -1
  340. package/lib/index.mjs.map +0 -1
  341. package/lib/intervalCollection.d.mts.map +0 -1
  342. package/lib/intervalCollection.mjs.map +0 -1
  343. package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +0 -1
  344. package/lib/intervalIndex/endpointInRangeIndex.mjs.map +0 -1
  345. package/lib/intervalIndex/endpointIndex.d.mts.map +0 -1
  346. package/lib/intervalIndex/endpointIndex.mjs.map +0 -1
  347. package/lib/intervalIndex/idIntervalIndex.d.mts.map +0 -1
  348. package/lib/intervalIndex/idIntervalIndex.mjs.map +0 -1
  349. package/lib/intervalIndex/index.d.mts.map +0 -1
  350. package/lib/intervalIndex/index.mjs.map +0 -1
  351. package/lib/intervalIndex/intervalIndex.d.mts.map +0 -1
  352. package/lib/intervalIndex/intervalIndex.mjs.map +0 -1
  353. package/lib/intervalIndex/intervalIndexUtils.d.mts.map +0 -1
  354. package/lib/intervalIndex/intervalIndexUtils.mjs.map +0 -1
  355. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +0 -1
  356. package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +0 -1
  357. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +0 -1
  358. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +0 -1
  359. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +0 -1
  360. package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +0 -1
  361. package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +0 -1
  362. package/lib/intervalIndex/startpointInRangeIndex.mjs.map +0 -1
  363. package/lib/intervalTree.d.mts.map +0 -1
  364. package/lib/intervalTree.mjs.map +0 -1
  365. package/lib/intervals/index.d.mts.map +0 -1
  366. package/lib/intervals/index.mjs.map +0 -1
  367. package/lib/intervals/interval.mjs.map +0 -1
  368. package/lib/intervals/intervalUtils.d.mts.map +0 -1
  369. package/lib/intervals/intervalUtils.mjs.map +0 -1
  370. package/lib/intervals/sequenceInterval.d.mts.map +0 -1
  371. package/lib/localValues.d.mts.map +0 -1
  372. package/lib/localValues.mjs.map +0 -1
  373. package/lib/packageVersion.d.mts.map +0 -1
  374. package/lib/packageVersion.mjs.map +0 -1
  375. package/lib/revertibles.d.mts.map +0 -1
  376. package/lib/revertibles.mjs.map +0 -1
  377. package/lib/sequence.d.mts.map +0 -1
  378. package/lib/sequence.mjs.map +0 -1
  379. package/lib/sequenceDeltaEvent.d.mts.map +0 -1
  380. package/lib/sequenceDeltaEvent.mjs.map +0 -1
  381. package/lib/sequenceFactory.d.mts.map +0 -1
  382. package/lib/sequenceFactory.mjs.map +0 -1
  383. package/lib/sharedIntervalCollection.d.mts.map +0 -1
  384. package/lib/sharedIntervalCollection.mjs.map +0 -1
  385. package/lib/sharedSequence.d.mts.map +0 -1
  386. package/lib/sharedSequence.mjs.map +0 -1
  387. package/lib/sharedString.d.mts.map +0 -1
  388. package/lib/sharedString.mjs.map +0 -1
@@ -3,23 +3,23 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export { IntervalIndex } from "./intervalIndex";
7
- export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex";
8
- export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex";
6
+ export { IntervalIndex } from "./intervalIndex.js";
7
+ export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex.js";
8
+ export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex.js";
9
9
  export {
10
10
  IEndpointInRangeIndex,
11
11
  createEndpointInRangeIndex,
12
12
  EndpointInRangeIndex,
13
- } from "./endpointInRangeIndex";
13
+ } from "./endpointInRangeIndex.js";
14
14
  export {
15
15
  IStartpointInRangeIndex,
16
16
  createStartpointInRangeIndex,
17
17
  StartpointInRangeIndex,
18
- } from "./startpointInRangeIndex";
19
- export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
18
+ } from "./startpointInRangeIndex.js";
19
+ export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
20
20
  export {
21
21
  IOverlappingIntervalsIndex,
22
22
  createOverlappingIntervalsIndex,
23
23
  OverlappingIntervalsIndex,
24
- } from "./overlappingIntervalsIndex";
25
- export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
24
+ } from "./overlappingIntervalsIndex.js";
25
+ export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex.js";
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ISerializableInterval } from "../intervals";
6
+ import { ISerializableInterval } from "../intervals/index.js";
7
7
 
8
8
  /**
9
9
  * Collection of intervals.
@@ -11,14 +11,14 @@ import {
11
11
  ISerializableInterval,
12
12
  sequenceIntervalHelpers,
13
13
  SequenceInterval,
14
- } from "../intervals";
15
- import { IntervalNode, IntervalTree } from "../intervalTree";
16
- import { SharedString } from "../sharedString";
17
- import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
18
- import { IntervalIndex } from "./intervalIndex";
14
+ } from "../intervals/index.js";
15
+ import { IntervalNode, IntervalTree } from "../intervalTree.js";
16
+ import { SharedString } from "../sharedString.js";
17
+ import { SequencePlace, endpointPosAndSide } from "../intervalCollection.js";
18
+ import { IntervalIndex } from "./intervalIndex.js";
19
19
 
20
20
  /**
21
- * @internal
21
+ * @alpha
22
22
  */
23
23
  export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
24
24
  extends IntervalIndex<TInterval> {
@@ -39,9 +39,6 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
39
39
  ): void;
40
40
  }
41
41
 
42
- /**
43
- * @public
44
- */
45
42
  export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
46
43
  implements IOverlappingIntervalsIndex<TInterval>
47
44
  {
@@ -150,7 +147,9 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
150
147
  if (
151
148
  startPos === undefined ||
152
149
  endPos === undefined ||
153
- endPos < startPos ||
150
+ (typeof startPos === "number" && typeof endPos === "number" && endPos < startPos) ||
151
+ (startPos === "end" && endPos !== "end") ||
152
+ (startPos !== "start" && endPos === "start") ||
154
153
  this.intervalTree.intervals.isEmpty()
155
154
  ) {
156
155
  return [];
@@ -177,7 +176,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
177
176
  }
178
177
 
179
178
  /**
180
- * @internal
179
+ * @alpha
181
180
  */
182
181
  export function createOverlappingIntervalsIndex(
183
182
  sharedString: SharedString,
@@ -16,10 +16,10 @@ import {
16
16
  IntervalType,
17
17
  SequenceInterval,
18
18
  createPositionReferenceFromSegoff,
19
- } from "../intervals";
20
- import { SharedString } from "../sharedString";
21
- import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
22
- import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
19
+ } from "../intervals/index.js";
20
+ import { SharedString } from "../sharedString.js";
21
+ import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
22
+ import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
23
23
 
24
24
  /**
25
25
  * @public
@@ -4,8 +4,8 @@
4
4
  */
5
5
 
6
6
  import { ISegment } from "@fluidframework/merge-tree";
7
- import { SequenceInterval } from "../intervals";
8
- import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
7
+ import { SequenceInterval } from "../intervals/index.js";
8
+ import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
9
9
 
10
10
  /**
11
11
  * This namespace contains specialiazations of indexes which support spatial queries
@@ -11,10 +11,10 @@ import {
11
11
  IntervalType,
12
12
  SequenceInterval,
13
13
  sequenceIntervalHelpers,
14
- } from "../intervals";
15
- import { SharedString } from "../sharedString";
16
- import { IntervalIndex } from "./intervalIndex";
17
- import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
14
+ } from "../intervals/index.js";
15
+ import { SharedString } from "../sharedString.js";
16
+ import { IntervalIndex } from "./intervalIndex.js";
17
+ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils.js";
18
18
 
19
19
  /**
20
20
  * Collection of intervals.
@@ -10,7 +10,7 @@ import {
10
10
  RedBlackTree,
11
11
  RBNodeActions,
12
12
  } from "@fluidframework/merge-tree";
13
- import { IInterval } from "./intervals";
13
+ import { IInterval } from "./intervals/index.js";
14
14
 
15
15
  export interface AugmentedIntervalNode {
16
16
  minmax: IInterval;
@@ -16,11 +16,11 @@ export {
16
16
  CompressedSerializedInterval,
17
17
  endReferenceSlidingPreference,
18
18
  startReferenceSlidingPreference,
19
- } from "./intervalUtils";
20
- export { Interval, createInterval, intervalHelpers } from "./interval";
19
+ } from "./intervalUtils.js";
20
+ export { Interval, createInterval, intervalHelpers } from "./interval.js";
21
21
  export {
22
22
  SequenceInterval,
23
23
  createSequenceInterval,
24
24
  createPositionReferenceFromSegoff,
25
25
  sequenceIntervalHelpers,
26
- } from "./sequenceInterval";
26
+ } from "./sequenceInterval.js";
@@ -13,10 +13,8 @@ import {
13
13
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
14
14
  import { assert } from "@fluidframework/core-utils";
15
15
  import { UsageError } from "@fluidframework/telemetry-utils";
16
- import { SequencePlace } from "../intervalCollection";
17
- import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils";
18
-
19
- const reservedIntervalIdKey = "intervalId";
16
+ import { SequencePlace, reservedIntervalIdKey } from "../intervalCollection.js";
17
+ import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils.js";
20
18
 
21
19
  /**
22
20
  * Serializable interval whose endpoints are plain-old numbers.
@@ -12,7 +12,7 @@ import {
12
12
  SlidingPreference,
13
13
  } from "@fluidframework/merge-tree";
14
14
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
15
- import { SequencePlace, Side } from "../intervalCollection";
15
+ import { SequencePlace, Side } from "../intervalCollection.js";
16
16
 
17
17
  /**
18
18
  * Basic interval abstraction
@@ -81,7 +81,7 @@ export type IntervalDeltaOpType = (typeof IntervalDeltaOpType)[keyof typeof Inte
81
81
 
82
82
  /**
83
83
  * Values are used in revertibles.
84
- * @internal
84
+ * @alpha
85
85
  */
86
86
  export const IntervalOpType = {
87
87
  ...IntervalDeltaOpType,
@@ -89,7 +89,7 @@ export const IntervalOpType = {
89
89
  POSITION_REMOVE: "positionRemove",
90
90
  } as const;
91
91
  /**
92
- * @internal
92
+ * @alpha
93
93
  */
94
94
  export type IntervalOpType = (typeof IntervalOpType)[keyof typeof IntervalOpType];
95
95
 
@@ -31,8 +31,9 @@ import {
31
31
  Side,
32
32
  computeStickinessFromSide,
33
33
  endpointPosAndSide,
34
+ reservedIntervalIdKey,
34
35
  sidesFromStickiness,
35
- } from "../intervalCollection";
36
+ } from "../intervalCollection.js";
36
37
  import {
37
38
  IIntervalHelpers,
38
39
  ISerializableInterval,
@@ -41,9 +42,7 @@ import {
41
42
  IntervalType,
42
43
  endReferenceSlidingPreference,
43
44
  startReferenceSlidingPreference,
44
- } from "./intervalUtils";
45
-
46
- const reservedIntervalIdKey = "intervalId";
45
+ } from "./intervalUtils.js";
47
46
 
48
47
  function compareSides(sideA: Side, sideB: Side): number {
49
48
  if (sideA === sideB) {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.0.0-dev-rc.1.0.0.228517";
9
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
@@ -23,14 +23,14 @@ import {
23
23
  getSlideToSegoff,
24
24
  SlidingPreference,
25
25
  } from "@fluidframework/merge-tree";
26
- import { InteriorSequencePlace, Side } from "./intervalCollection";
27
- import { IntervalOpType, SequenceInterval } from "./intervals";
28
- import { SharedString, SharedStringSegment } from "./sharedString";
29
- import { ISequenceDeltaRange, SequenceDeltaEvent } from "./sequenceDeltaEvent";
26
+ import { InteriorSequencePlace, Side } from "./intervalCollection.js";
27
+ import { IntervalOpType, SequenceInterval } from "./intervals/index.js";
28
+ import { SharedString, SharedStringSegment } from "./sharedString.js";
29
+ import { ISequenceDeltaRange, SequenceDeltaEvent } from "./sequenceDeltaEvent.js";
30
30
 
31
31
  /**
32
32
  * Data for undoing edits on SharedStrings and Intervals.
33
- * @internal
33
+ * @alpha
34
34
  */
35
35
  export type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;
36
36
 
@@ -38,7 +38,7 @@ const idMap = new Map<string, string>();
38
38
 
39
39
  /**
40
40
  * Data for undoing edits affecting Intervals.
41
- * @internal
41
+ * @alpha
42
42
  */
43
43
  export type IntervalRevertible =
44
44
  | {
@@ -92,7 +92,7 @@ function getUpdatedId(intervalId: string): string {
92
92
 
93
93
  /**
94
94
  * Create revertibles for adding an interval
95
- * @internal
95
+ * @alpha
96
96
  */
97
97
  export function appendAddIntervalToRevertibles(
98
98
  interval: SequenceInterval,
@@ -108,7 +108,7 @@ export function appendAddIntervalToRevertibles(
108
108
 
109
109
  /**
110
110
  * Create revertibles for deleting an interval
111
- * @internal
111
+ * @alpha
112
112
  */
113
113
  export function appendDeleteIntervalToRevertibles(
114
114
  string: SharedString,
@@ -160,7 +160,7 @@ export function appendDeleteIntervalToRevertibles(
160
160
 
161
161
  /**
162
162
  * Create revertibles for moving endpoints of an interval
163
- * @internal
163
+ * @alpha
164
164
  */
165
165
  export function appendChangeIntervalToRevertibles(
166
166
  string: SharedString,
@@ -210,7 +210,7 @@ export function appendChangeIntervalToRevertibles(
210
210
 
211
211
  /**
212
212
  * Create revertibles for changing properties of an interval
213
- * @internal
213
+ * @alpha
214
214
  */
215
215
  export function appendIntervalPropertyChangedToRevertibles(
216
216
  interval: SequenceInterval,
@@ -270,7 +270,7 @@ function addIfRevertibleRef(
270
270
  /**
271
271
  * Create revertibles for SharedStringDeltas, handling indirectly modified intervals
272
272
  * (e.g. reverting remove of a range that contains an interval will move the interval back)
273
- * @internal
273
+ * @alpha
274
274
  */
275
275
  export function appendSharedStringDeltaToRevertibles(
276
276
  string: SharedString,
@@ -363,7 +363,7 @@ export function appendSharedStringDeltaToRevertibles(
363
363
 
364
364
  /**
365
365
  * Clean up resources held by revertibles that are no longer needed.
366
- * @internal
366
+ * @alpha
367
367
  */
368
368
  export function discardSharedStringRevertibles(
369
369
  sharedString: SharedString,
@@ -654,7 +654,7 @@ function revertLocalSequenceRemove(
654
654
 
655
655
  /**
656
656
  * Invoke revertibles to reverse prior edits
657
- * @internal
657
+ * @alpha
658
658
  */
659
659
  export function revertSharedStringRevertibles(
660
660
  sharedString: SharedString,
package/src/sequence.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import Deque from "double-ended-queue";
6
7
  import { assert, Deferred } from "@fluidframework/core-utils";
7
8
  import { bufferToString } from "@fluid-internal/client-utils";
8
9
  import { LoggingError, createChildLogger } from "@fluidframework/telemetry-utils";
@@ -44,23 +45,17 @@ import {
44
45
  import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
45
46
  import {
46
47
  IFluidSerializer,
47
- makeHandlesSerializable,
48
- parseHandles,
49
48
  SharedObject,
50
49
  ISharedObjectEvents,
51
50
  } from "@fluidframework/shared-object-base";
52
51
  import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
53
52
  import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
54
- import { DefaultMap, IMapOperation } from "./defaultMap";
55
- import { IMapMessageLocalMetadata, IValueChanged } from "./defaultMapInterfaces";
56
- import { SequenceInterval } from "./intervals";
57
- import {
58
- IIntervalCollection,
59
- IntervalCollection,
60
- SequenceIntervalCollectionValueType,
61
- } from "./intervalCollection";
62
- import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent";
63
- import { ISharedIntervalCollection } from "./sharedIntervalCollection";
53
+ import { IntervalCollectionMap, IMapOperation } from "./intervalCollectionMap.js";
54
+ import { IMapMessageLocalMetadata, IValueChanged } from "./intervalCollectionMapInterfaces.js";
55
+ import { SequenceInterval } from "./intervals/index.js";
56
+ import { IIntervalCollection, SequenceIntervalCollectionValueType } from "./intervalCollection.js";
57
+ import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent.js";
58
+ import { ISharedIntervalCollection } from "./sharedIntervalCollection.js";
64
59
 
65
60
  const snapshotFileName = "header";
66
61
  const contentPath = "content";
@@ -212,6 +207,40 @@ export abstract class SharedSegmentSequence<T extends ISegment>
212
207
  return ops;
213
208
  }
214
209
 
210
+ /**
211
+ * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.
212
+ * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process
213
+ * incoming leave/join ops before putting an op that this DDS submits over the wire.
214
+ *
215
+ * E.g. SharedString submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime
216
+ * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber
217
+ * on the SharedString op is 11.
218
+ *
219
+ * The reference sequence numbers placed in this queue are also not accurate for stashed ops due to how the applyStashedOp
220
+ * flow works at the runtime level. This is a legitimate bug, and AB#6602 tracks one way to fix it (stop reaching all the way
221
+ * to deltaManager's lastSequenceNumber to obtain refSeq, instead leveraging some analogous notion on the container or datastore
222
+ * runtime).
223
+ */
224
+ private readonly inFlightRefSeqs = new Deque<number>();
225
+
226
+ private ongoingResubmitRefSeq: number | undefined;
227
+
228
+ /**
229
+ * Gets the reference sequence number (i.e. sequence number of the runtime's last processed op) for an op submitted
230
+ * in the current context.
231
+ *
232
+ * This value can be optionally overridden using `useResubmitRefSeq`.
233
+ * IntervalCollection's resubmit logic currently relies on preserving merge information from when the op was originally submitted,
234
+ * even if the op is resubmitted more than once. Thus during resubmit, `inFlightRefSeqs` gets populated with the
235
+ * original refSeq rather than the refSeq at the time of reconnection.
236
+ *
237
+ * @remarks - In some not fully understood cases, the runtime may process incoming ops before putting an op that this
238
+ * DDS submits over the wire. See `inFlightRefSeqs` for more details.
239
+ */
240
+ private get currentRefSeq() {
241
+ return this.ongoingResubmitRefSeq ?? this.runtime.deltaManager.lastSequenceNumber;
242
+ }
243
+
215
244
  // eslint-disable-next-line import/no-deprecated
216
245
  protected client: Client;
217
246
  /** `Deferred` that triggers once the object is loaded */
@@ -224,7 +253,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
224
253
  private readonly loadedDeferredIncomingOps: ISequencedDocumentMessage[] = [];
225
254
 
226
255
  private messagesSinceMSNChange: ISequencedDocumentMessage[] = [];
227
- private readonly intervalCollections: DefaultMap<IntervalCollection<SequenceInterval>>;
256
+ private readonly intervalCollections: IntervalCollectionMap<SequenceInterval>;
228
257
  constructor(
229
258
  private readonly dataStoreRuntime: IFluidDataStoreRuntime,
230
259
  public id: string,
@@ -233,6 +262,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
233
262
  ) {
234
263
  super(id, dataStoreRuntime, attributes, "fluid_sequence_");
235
264
 
265
+ const getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);
236
266
  this.guardReentrancy =
237
267
  dataStoreRuntime.options.sharedStringPreventReentrancy ?? true
238
268
  ? ensureNoReentrancy
@@ -258,11 +288,12 @@ export abstract class SharedSegmentSequence<T extends ISegment>
258
288
  namespace: "SharedSegmentSequence.MergeTreeClient",
259
289
  }),
260
290
  dataStoreRuntime.options,
291
+ getMinInFlightRefSeq,
261
292
  );
262
293
 
263
294
  this.client.prependListener("delta", (opArgs, deltaArgs) => {
264
295
  const event = new SequenceDeltaEvent(opArgs, deltaArgs, this.client);
265
- if (opArgs.stashed !== true && event.isLocal) {
296
+ if (event.isLocal) {
266
297
  this.submitSequenceMessage(opArgs.op);
267
298
  }
268
299
  this.emit("sequenceDelta", event, this);
@@ -272,10 +303,17 @@ export abstract class SharedSegmentSequence<T extends ISegment>
272
303
  this.emit("maintenance", new SequenceMaintenanceEvent(opArgs, args, this.client), this);
273
304
  });
274
305
 
275
- this.intervalCollections = new DefaultMap(
306
+ this.intervalCollections = new IntervalCollectionMap(
276
307
  this.serializer,
277
308
  this.handle,
278
- (op, localOpMetadata) => this.submitLocalMessage(op, localOpMetadata),
309
+ (op, localOpMetadata) => {
310
+ if (!this.isAttached()) {
311
+ return;
312
+ }
313
+
314
+ this.inFlightRefSeqs.push(this.currentRefSeq);
315
+ this.submitLocalMessage(op, localOpMetadata);
316
+ },
279
317
  new SequenceIntervalCollectionValueType(),
280
318
  dataStoreRuntime.options,
281
319
  );
@@ -385,6 +423,11 @@ export abstract class SharedSegmentSequence<T extends ISegment>
385
423
 
386
424
  /**
387
425
  * Resolves a `ReferencePosition` into a character position using this client's perspective.
426
+ *
427
+ * Reference positions that point to a character that has been removed will
428
+ * always return the position of the nearest non-removed character, regardless
429
+ * of `ReferenceType`. To handle this case specifically, one may wish
430
+ * to look at the segment returned by `ReferencePosition.getSegment`.
388
431
  */
389
432
  public localReferencePositionToPosition(lref: ReferencePosition): number {
390
433
  return this.client.localReferencePositionToPosition(lref);
@@ -427,7 +470,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
427
470
  if (!this.isAttached()) {
428
471
  return;
429
472
  }
430
- const translated = makeHandlesSerializable(message, this.serializer, this.handle);
473
+
474
+ this.inFlightRefSeqs.push(this.currentRefSeq);
475
+
431
476
  const metadata = this.client.peekPendingSegmentGroups(
432
477
  message.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,
433
478
  );
@@ -436,9 +481,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
436
481
  // local ops until loading is complete, and then
437
482
  // they will be present
438
483
  if (!this.loadedDeferred.isCompleted) {
439
- this.loadedDeferredOutgoingOps.push(metadata ? [translated, metadata] : translated);
484
+ this.loadedDeferredOutgoingOps.push(metadata ? [message, metadata] : (message as any));
440
485
  } else {
441
- this.submitLocalMessage(translated, metadata);
486
+ this.submitLocalMessage(message, metadata);
442
487
  }
443
488
  }
444
489
 
@@ -571,11 +616,12 @@ export abstract class SharedSegmentSequence<T extends ISegment>
571
616
  const insertIndex: number = Math.max(start, end);
572
617
 
573
618
  // Insert first, so local references can slide to the inserted seg if any
574
- const insert = this.client.insertSegmentLocal(insertIndex, segment);
575
- if (insert) {
576
- if (start < end) {
577
- this.client.removeRangeLocal(start, end);
578
- }
619
+ const insert = this.guardReentrancy(() =>
620
+ this.client.insertSegmentLocal(insertIndex, segment),
621
+ );
622
+
623
+ if (insert && start < end) {
624
+ this.removeRange(start, end);
579
625
  }
580
626
  }
581
627
 
@@ -596,19 +642,26 @@ export abstract class SharedSegmentSequence<T extends ISegment>
596
642
  * {@inheritDoc @fluidframework/shared-object-base#SharedObject.reSubmitCore}
597
643
  */
598
644
  protected reSubmitCore(content: any, localOpMetadata: unknown) {
599
- if (
600
- !this.intervalCollections.tryResubmitMessage(
601
- content,
602
- localOpMetadata as IMapMessageLocalMetadata,
603
- )
604
- ) {
605
- this.submitSequenceMessage(
606
- this.client.regeneratePendingOp(
607
- content as IMergeTreeOp,
608
- localOpMetadata as SegmentGroup | SegmentGroup[],
609
- ),
610
- );
611
- }
645
+ const originalRefSeq = this.inFlightRefSeqs.shift();
646
+ assert(
647
+ originalRefSeq !== undefined,
648
+ 0x8bb /* Expected a recorded refSeq when resubmitting an op */,
649
+ );
650
+ this.useResubmitRefSeq(originalRefSeq, () => {
651
+ if (
652
+ !this.intervalCollections.tryResubmitMessage(
653
+ content,
654
+ localOpMetadata as IMapMessageLocalMetadata,
655
+ )
656
+ ) {
657
+ this.submitSequenceMessage(
658
+ this.client.regeneratePendingOp(
659
+ content as IMergeTreeOp,
660
+ localOpMetadata as SegmentGroup | SegmentGroup[],
661
+ ),
662
+ );
663
+ }
664
+ });
612
665
  }
613
666
 
614
667
  /**
@@ -665,7 +718,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
665
718
  .catch((error) => {
666
719
  this.loadFinished(error);
667
720
  });
668
- if (this.dataStoreRuntime.options?.sequenceInitializeFromHeaderOnly !== true) {
721
+ if (this.dataStoreRuntime.options.sequenceInitializeFromHeaderOnly !== true) {
669
722
  // if we not doing partial load, await the catch up ops,
670
723
  // and the finalization of the load
671
724
  await loadCatchUpOps;
@@ -683,6 +736,18 @@ export abstract class SharedSegmentSequence<T extends ISegment>
683
736
  local: boolean,
684
737
  localOpMetadata: unknown,
685
738
  ) {
739
+ if (local) {
740
+ const recordedRefSeq = this.inFlightRefSeqs.shift();
741
+ assert(recordedRefSeq !== undefined, 0x8bc /* No pending recorded refSeq found */);
742
+ // TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because
743
+ // the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op
744
+ // flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for
745
+ // one of its messages, the delta manager has actually already seen subsequent messages from collaborators
746
+ // which the in-flight message is concurrent to.
747
+ // See "handles stashed ops created on top of sequenced local ops" for one such test case.
748
+ // assert(recordedRefSeq <= message.referenceSequenceNumber, "RefSeq mismatch");
749
+ }
750
+
686
751
  // if loading isn't complete, we need to cache all
687
752
  // incoming ops to be applied after loading is complete
688
753
  if (this.deferIncomingOps) {
@@ -729,13 +794,10 @@ export abstract class SharedSegmentSequence<T extends ISegment>
729
794
  /**
730
795
  * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}
731
796
  */
732
- protected applyStashedOp(content: any): unknown {
733
- const parsedContent = parseHandles(content, this.serializer);
734
- const metadata =
735
- this.intervalCollections.tryGetStashedOpLocalMetadata(parsedContent) ??
736
- this.client.applyStashedOp(parsedContent);
737
- assert(!!metadata, 0x87d /* Metadata is undefined */);
738
- return metadata;
797
+ protected applyStashedOp(content: any): void {
798
+ if (!this.intervalCollections.tryApplyStashedOp(content)) {
799
+ this.client.applyStashedOp(content);
800
+ }
739
801
  }
740
802
 
741
803
  private summarizeMergeTree(serializer: IFluidSerializer): ISummaryTreeWithStats {
@@ -760,16 +822,18 @@ export abstract class SharedSegmentSequence<T extends ISegment>
760
822
  );
761
823
  }
762
824
 
763
- private processMergeTreeMsg(rawMessage: ISequencedDocumentMessage, local?: boolean) {
764
- const message = parseHandles(rawMessage, this.serializer);
765
-
825
+ /**
826
+ *
827
+ * @param message - Message with decoded and hydrated handles
828
+ */
829
+ private processMergeTreeMsg(message: ISequencedDocumentMessage, local?: boolean) {
766
830
  const ops: IMergeTreeDeltaOp[] = [];
767
831
  function transformOps(event: SequenceDeltaEvent) {
768
832
  ops.push(...SharedSegmentSequence.createOpsFromDelta(event));
769
833
  }
770
834
  const needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;
771
835
  let stashMessage: Readonly<ISequencedDocumentMessage> = message;
772
- if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
836
+ if (this.runtime.options.newMergeTreeSnapshotFormat !== true) {
773
837
  if (needsTransformation) {
774
838
  this.on("sequenceDelta", transformOps);
775
839
  }
@@ -777,7 +841,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
777
841
 
778
842
  this.client.applyMsg(message, local);
779
843
 
780
- if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
844
+ if (this.runtime.options.newMergeTreeSnapshotFormat !== true) {
781
845
  if (needsTransformation) {
782
846
  this.removeListener("sequenceDelta", transformOps);
783
847
  // shallow clone the message as we only overwrite top level properties,
@@ -866,6 +930,20 @@ export abstract class SharedSegmentSequence<T extends ISegment>
866
930
  intervalCollection.attachGraph(this.client, key);
867
931
  }
868
932
  }
933
+
934
+ /**
935
+ * Overrides the "currently applicable reference sequence number" for the duration of the callback.
936
+ * See remarks on `currentRefSeq` for more context.
937
+ */
938
+ private useResubmitRefSeq(refSeq: number, callback: () => void) {
939
+ const previousResubmitRefSeq = this.ongoingResubmitRefSeq;
940
+ this.ongoingResubmitRefSeq = refSeq;
941
+ try {
942
+ callback();
943
+ } finally {
944
+ this.ongoingResubmitRefSeq = previousResubmitRefSeq;
945
+ }
946
+ }
869
947
  }
870
948
 
871
949
  function createReentrancyDetector(
@@ -10,8 +10,8 @@ import {
10
10
  IChannelFactory,
11
11
  } from "@fluidframework/datastore-definitions";
12
12
  import { Marker, TextSegment } from "@fluidframework/merge-tree";
13
- import { pkgVersion } from "./packageVersion";
14
- import { SharedString, SharedStringSegment } from "./sharedString";
13
+ import { pkgVersion } from "./packageVersion.js";
14
+ import { SharedString, SharedStringSegment } from "./sharedString.js";
15
15
 
16
16
  /**
17
17
  * @alpha
@@ -63,6 +63,9 @@ export class SharedStringFactory implements IChannelFactory {
63
63
  return sharedString;
64
64
  }
65
65
 
66
+ /**
67
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}
68
+ */
66
69
  public create(document: IFluidDataStoreRuntime, id: string): SharedString {
67
70
  const sharedString = new SharedString(document, id, this.attributes);
68
71
  sharedString.initializeLocal();