@fluidframework/sequence 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419

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 (349) hide show
  1. package/.eslintrc.js +9 -11
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +449 -0
  4. package/README.md +364 -183
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/sequence.api.md +741 -0
  8. package/dist/{defaultMap.js → defaultMap.cjs} +29 -22
  9. package/dist/defaultMap.cjs.map +1 -0
  10. package/dist/defaultMap.d.ts +7 -6
  11. package/dist/defaultMap.d.ts.map +1 -1
  12. package/dist/defaultMapInterfaces.cjs +7 -0
  13. package/dist/defaultMapInterfaces.cjs.map +1 -0
  14. package/dist/defaultMapInterfaces.d.ts +44 -12
  15. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  16. package/dist/index.cjs +60 -0
  17. package/dist/index.cjs.map +1 -0
  18. package/dist/index.d.ts +14 -12
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/intervalCollection.cjs +1159 -0
  21. package/dist/intervalCollection.cjs.map +1 -0
  22. package/dist/intervalCollection.d.ts +461 -162
  23. package/dist/intervalCollection.d.ts.map +1 -1
  24. package/dist/intervalIndex/endpointInRangeIndex.cjs +66 -0
  25. package/dist/intervalIndex/endpointInRangeIndex.cjs.map +1 -0
  26. package/dist/intervalIndex/endpointInRangeIndex.d.ts +34 -0
  27. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  28. package/dist/intervalIndex/endpointIndex.cjs +47 -0
  29. package/dist/intervalIndex/endpointIndex.cjs.map +1 -0
  30. package/dist/intervalIndex/endpointIndex.d.ts +38 -0
  31. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
  32. package/dist/intervalIndex/idIntervalIndex.cjs +44 -0
  33. package/dist/intervalIndex/idIntervalIndex.cjs.map +1 -0
  34. package/dist/intervalIndex/idIntervalIndex.d.ts +18 -0
  35. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  36. package/dist/intervalIndex/index.cjs +24 -0
  37. package/dist/intervalIndex/index.cjs.map +1 -0
  38. package/dist/intervalIndex/index.d.ts +13 -0
  39. package/dist/intervalIndex/index.d.ts.map +1 -0
  40. package/dist/{defaultMapInterfaces.js → intervalIndex/intervalIndex.cjs} +1 -1
  41. package/dist/intervalIndex/intervalIndex.cjs.map +1 -0
  42. package/dist/intervalIndex/intervalIndex.d.ts +30 -0
  43. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
  44. package/dist/intervalIndex/intervalIndexUtils.cjs +22 -0
  45. package/dist/intervalIndex/intervalIndexUtils.cjs.map +1 -0
  46. package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
  47. package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  48. package/dist/intervalIndex/overlappingIntervalsIndex.cjs +116 -0
  49. package/dist/intervalIndex/overlappingIntervalsIndex.cjs.map +1 -0
  50. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +44 -0
  51. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  52. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs +41 -0
  53. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs.map +1 -0
  54. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +11 -0
  55. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  56. package/dist/intervalIndex/sequenceIntervalIndexes.cjs +7 -0
  57. package/dist/intervalIndex/sequenceIntervalIndexes.cjs.map +1 -0
  58. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +35 -0
  59. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  60. package/dist/intervalIndex/startpointInRangeIndex.cjs +66 -0
  61. package/dist/intervalIndex/startpointInRangeIndex.cjs.map +1 -0
  62. package/dist/intervalIndex/startpointInRangeIndex.d.ts +34 -0
  63. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  64. package/dist/intervalTree.cjs +80 -0
  65. package/dist/intervalTree.cjs.map +1 -0
  66. package/dist/intervalTree.d.ts +24 -0
  67. package/dist/intervalTree.d.ts.map +1 -0
  68. package/dist/intervals/index.cjs +23 -0
  69. package/dist/intervals/index.cjs.map +1 -0
  70. package/dist/intervals/index.d.ts +8 -0
  71. package/dist/intervals/index.d.ts.map +1 -0
  72. package/dist/intervals/interval.cjs +181 -0
  73. package/dist/intervals/interval.cjs.map +1 -0
  74. package/dist/intervals/interval.d.ts +84 -0
  75. package/dist/intervals/interval.d.ts.map +1 -0
  76. package/dist/intervals/intervalUtils.cjs +83 -0
  77. package/dist/intervals/intervalUtils.cjs.map +1 -0
  78. package/dist/intervals/intervalUtils.d.ts +230 -0
  79. package/dist/intervals/intervalUtils.d.ts.map +1 -0
  80. package/dist/intervals/sequenceInterval.cjs +378 -0
  81. package/dist/intervals/sequenceInterval.cjs.map +1 -0
  82. package/dist/intervals/sequenceInterval.d.ts +137 -0
  83. package/dist/intervals/sequenceInterval.d.ts.map +1 -0
  84. package/dist/{localValues.js → localValues.cjs} +1 -1
  85. package/dist/localValues.cjs.map +1 -0
  86. package/dist/localValues.d.ts +2 -1
  87. package/dist/localValues.d.ts.map +1 -1
  88. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  89. package/dist/packageVersion.cjs.map +1 -0
  90. package/dist/packageVersion.d.ts +1 -1
  91. package/dist/packageVersion.d.ts.map +1 -1
  92. package/dist/revertibles.cjs +425 -0
  93. package/dist/revertibles.cjs.map +1 -0
  94. package/dist/revertibles.d.ts +86 -0
  95. package/dist/revertibles.d.ts.map +1 -0
  96. package/dist/sequence-alpha.d.ts +1315 -0
  97. package/dist/sequence-beta.d.ts +244 -0
  98. package/dist/sequence-public.d.ts +244 -0
  99. package/dist/sequence-untrimmed.d.ts +1803 -0
  100. package/dist/{sequence.js → sequence.cjs} +226 -156
  101. package/dist/sequence.cjs.map +1 -0
  102. package/dist/sequence.d.ts +125 -48
  103. package/dist/sequence.d.ts.map +1 -1
  104. package/dist/{sequenceDeltaEvent.js → sequenceDeltaEvent.cjs} +18 -8
  105. package/dist/sequenceDeltaEvent.cjs.map +1 -0
  106. package/dist/sequenceDeltaEvent.d.ts +24 -7
  107. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  108. package/dist/sequenceFactory.cjs +55 -0
  109. package/dist/sequenceFactory.cjs.map +1 -0
  110. package/dist/sequenceFactory.d.ts +3 -89
  111. package/dist/sequenceFactory.d.ts.map +1 -1
  112. package/dist/{sharedIntervalCollection.js → sharedIntervalCollection.cjs} +17 -22
  113. package/dist/sharedIntervalCollection.cjs.map +1 -0
  114. package/dist/sharedIntervalCollection.d.ts +12 -12
  115. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  116. package/dist/{sharedSequence.js → sharedSequence.cjs} +29 -22
  117. package/dist/sharedSequence.cjs.map +1 -0
  118. package/dist/sharedSequence.d.ts +14 -2
  119. package/dist/sharedSequence.d.ts.map +1 -1
  120. package/dist/sharedString.cjs +286 -0
  121. package/dist/sharedString.cjs.map +1 -0
  122. package/dist/sharedString.d.ts +58 -22
  123. package/dist/sharedString.d.ts.map +1 -1
  124. package/dist/tsdoc-metadata.json +11 -0
  125. package/lib/{defaultMap.d.ts → defaultMap.d.mts} +7 -6
  126. package/lib/defaultMap.d.mts.map +1 -0
  127. package/lib/{defaultMap.js → defaultMap.mjs} +28 -21
  128. package/lib/defaultMap.mjs.map +1 -0
  129. package/lib/{defaultMapInterfaces.d.ts → defaultMapInterfaces.d.mts} +44 -12
  130. package/lib/defaultMapInterfaces.d.mts.map +1 -0
  131. package/lib/defaultMapInterfaces.mjs +6 -0
  132. package/lib/defaultMapInterfaces.mjs.map +1 -0
  133. package/lib/index.d.mts +17 -0
  134. package/lib/index.d.mts.map +1 -0
  135. package/lib/index.mjs +16 -0
  136. package/lib/index.mjs.map +1 -0
  137. package/lib/intervalCollection.d.mts +569 -0
  138. package/lib/intervalCollection.d.mts.map +1 -0
  139. package/lib/intervalCollection.mjs +1144 -0
  140. package/lib/intervalCollection.mjs.map +1 -0
  141. package/lib/intervalIndex/endpointInRangeIndex.d.mts +34 -0
  142. package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +1 -0
  143. package/lib/intervalIndex/endpointInRangeIndex.mjs +61 -0
  144. package/lib/intervalIndex/endpointInRangeIndex.mjs.map +1 -0
  145. package/lib/intervalIndex/endpointIndex.d.mts +38 -0
  146. package/lib/intervalIndex/endpointIndex.d.mts.map +1 -0
  147. package/lib/intervalIndex/endpointIndex.mjs +42 -0
  148. package/lib/intervalIndex/endpointIndex.mjs.map +1 -0
  149. package/lib/intervalIndex/idIntervalIndex.d.mts +18 -0
  150. package/lib/intervalIndex/idIntervalIndex.d.mts.map +1 -0
  151. package/lib/intervalIndex/idIntervalIndex.mjs +40 -0
  152. package/lib/intervalIndex/idIntervalIndex.mjs.map +1 -0
  153. package/lib/intervalIndex/index.d.mts +13 -0
  154. package/lib/intervalIndex/index.d.mts.map +1 -0
  155. package/lib/intervalIndex/index.mjs +11 -0
  156. package/lib/intervalIndex/index.mjs.map +1 -0
  157. package/lib/intervalIndex/intervalIndex.d.mts +30 -0
  158. package/lib/intervalIndex/intervalIndex.d.mts.map +1 -0
  159. package/lib/{defaultMapInterfaces.js → intervalIndex/intervalIndex.mjs} +1 -1
  160. package/lib/intervalIndex/intervalIndex.mjs.map +1 -0
  161. package/lib/intervalIndex/intervalIndexUtils.d.mts +17 -0
  162. package/lib/intervalIndex/intervalIndexUtils.d.mts.map +1 -0
  163. package/lib/intervalIndex/intervalIndexUtils.mjs +18 -0
  164. package/lib/intervalIndex/intervalIndexUtils.mjs.map +1 -0
  165. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts +44 -0
  166. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +1 -0
  167. package/lib/intervalIndex/overlappingIntervalsIndex.mjs +111 -0
  168. package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +1 -0
  169. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts +11 -0
  170. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +1 -0
  171. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs +37 -0
  172. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +1 -0
  173. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts +35 -0
  174. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +1 -0
  175. package/lib/intervalIndex/sequenceIntervalIndexes.mjs +6 -0
  176. package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +1 -0
  177. package/lib/intervalIndex/startpointInRangeIndex.d.mts +34 -0
  178. package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +1 -0
  179. package/lib/intervalIndex/startpointInRangeIndex.mjs +61 -0
  180. package/lib/intervalIndex/startpointInRangeIndex.mjs.map +1 -0
  181. package/lib/intervalTree.d.mts +24 -0
  182. package/lib/intervalTree.d.mts.map +1 -0
  183. package/lib/intervalTree.mjs +76 -0
  184. package/lib/intervalTree.mjs.map +1 -0
  185. package/lib/intervals/index.d.mts +8 -0
  186. package/lib/intervals/index.d.mts.map +1 -0
  187. package/lib/intervals/index.mjs +8 -0
  188. package/lib/intervals/index.mjs.map +1 -0
  189. package/lib/intervals/interval.d.mts +84 -0
  190. package/lib/intervals/interval.d.mts.map +1 -0
  191. package/lib/intervals/interval.mjs +176 -0
  192. package/lib/intervals/interval.mjs.map +1 -0
  193. package/lib/intervals/intervalUtils.d.mts +230 -0
  194. package/lib/intervals/intervalUtils.d.mts.map +1 -0
  195. package/lib/intervals/intervalUtils.mjs +77 -0
  196. package/lib/intervals/intervalUtils.mjs.map +1 -0
  197. package/lib/intervals/sequenceInterval.d.mts +137 -0
  198. package/lib/intervals/sequenceInterval.d.mts.map +1 -0
  199. package/lib/intervals/sequenceInterval.mjs +370 -0
  200. package/lib/intervals/sequenceInterval.mjs.map +1 -0
  201. package/lib/{localValues.d.ts → localValues.d.mts} +3 -2
  202. package/lib/localValues.d.mts.map +1 -0
  203. package/lib/{localValues.js → localValues.mjs} +2 -2
  204. package/lib/localValues.mjs.map +1 -0
  205. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  206. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  207. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  208. package/lib/packageVersion.mjs.map +1 -0
  209. package/lib/revertibles.d.mts +86 -0
  210. package/lib/revertibles.d.mts.map +1 -0
  211. package/lib/revertibles.mjs +416 -0
  212. package/lib/revertibles.mjs.map +1 -0
  213. package/lib/sequence-alpha.d.mts +1315 -0
  214. package/lib/sequence-beta.d.mts +244 -0
  215. package/lib/sequence-public.d.mts +244 -0
  216. package/lib/sequence-untrimmed.d.mts +1803 -0
  217. package/lib/{sequence.d.ts → sequence.d.mts} +127 -50
  218. package/lib/sequence.d.mts.map +1 -0
  219. package/lib/{sequence.js → sequence.mjs} +225 -152
  220. package/lib/sequence.mjs.map +1 -0
  221. package/lib/{sequenceDeltaEvent.d.ts → sequenceDeltaEvent.d.mts} +24 -7
  222. package/lib/sequenceDeltaEvent.d.mts.map +1 -0
  223. package/lib/{sequenceDeltaEvent.js → sequenceDeltaEvent.mjs} +20 -8
  224. package/lib/sequenceDeltaEvent.mjs.map +1 -0
  225. package/lib/sequenceFactory.d.mts +22 -0
  226. package/lib/sequenceFactory.d.mts.map +1 -0
  227. package/lib/sequenceFactory.mjs +51 -0
  228. package/lib/sequenceFactory.mjs.map +1 -0
  229. package/lib/{sharedIntervalCollection.d.ts → sharedIntervalCollection.d.mts} +12 -12
  230. package/lib/sharedIntervalCollection.d.mts.map +1 -0
  231. package/lib/{sharedIntervalCollection.js → sharedIntervalCollection.mjs} +16 -21
  232. package/lib/sharedIntervalCollection.mjs.map +1 -0
  233. package/lib/{sharedSequence.d.ts → sharedSequence.d.mts} +15 -3
  234. package/lib/sharedSequence.d.mts.map +1 -0
  235. package/lib/{sharedSequence.js → sharedSequence.mjs} +30 -23
  236. package/lib/sharedSequence.mjs.map +1 -0
  237. package/lib/{sharedString.d.ts → sharedString.d.mts} +60 -24
  238. package/lib/sharedString.d.mts.map +1 -0
  239. package/lib/sharedString.mjs +281 -0
  240. package/lib/sharedString.mjs.map +1 -0
  241. package/package.json +146 -75
  242. package/prettier.config.cjs +8 -0
  243. package/sequence.test-files.tar +0 -0
  244. package/src/defaultMap.ts +417 -403
  245. package/src/defaultMapInterfaces.ts +157 -117
  246. package/src/index.ts +86 -26
  247. package/src/intervalCollection.ts +2043 -1563
  248. package/src/intervalIndex/endpointInRangeIndex.ts +116 -0
  249. package/src/intervalIndex/endpointIndex.ts +91 -0
  250. package/src/intervalIndex/idIntervalIndex.ts +64 -0
  251. package/src/intervalIndex/index.ts +25 -0
  252. package/src/intervalIndex/intervalIndex.ts +32 -0
  253. package/src/intervalIndex/intervalIndexUtils.ts +27 -0
  254. package/src/intervalIndex/overlappingIntervalsIndex.ts +187 -0
  255. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +80 -0
  256. package/src/intervalIndex/sequenceIntervalIndexes.ts +34 -0
  257. package/src/intervalIndex/startpointInRangeIndex.ts +114 -0
  258. package/src/intervalTree.ts +98 -0
  259. package/src/intervals/index.ts +25 -0
  260. package/src/intervals/interval.ts +238 -0
  261. package/src/intervals/intervalUtils.ts +288 -0
  262. package/src/intervals/sequenceInterval.ts +616 -0
  263. package/src/localValues.ts +68 -73
  264. package/src/packageVersion.ts +1 -1
  265. package/src/revertibles.ts +693 -0
  266. package/src/sequence.ts +845 -690
  267. package/src/sequenceDeltaEvent.ts +164 -131
  268. package/src/sequenceFactory.ts +58 -214
  269. package/src/sharedIntervalCollection.ts +161 -152
  270. package/src/sharedSequence.ts +181 -167
  271. package/src/sharedString.ts +390 -234
  272. package/tsc-multi.test.json +10 -0
  273. package/tsconfig.json +11 -13
  274. package/.editorconfig +0 -7
  275. package/.vscode/launch.json +0 -15
  276. package/dist/defaultMap.js.map +0 -1
  277. package/dist/defaultMapInterfaces.js.map +0 -1
  278. package/dist/index.js +0 -44
  279. package/dist/index.js.map +0 -1
  280. package/dist/intervalCollection.js +0 -1250
  281. package/dist/intervalCollection.js.map +0 -1
  282. package/dist/localValues.js.map +0 -1
  283. package/dist/packageVersion.js.map +0 -1
  284. package/dist/sequence.js.map +0 -1
  285. package/dist/sequenceDeltaEvent.js.map +0 -1
  286. package/dist/sequenceFactory.js +0 -192
  287. package/dist/sequenceFactory.js.map +0 -1
  288. package/dist/sharedIntervalCollection.js.map +0 -1
  289. package/dist/sharedNumberSequence.d.ts +0 -50
  290. package/dist/sharedNumberSequence.d.ts.map +0 -1
  291. package/dist/sharedNumberSequence.js +0 -61
  292. package/dist/sharedNumberSequence.js.map +0 -1
  293. package/dist/sharedObjectSequence.d.ts +0 -50
  294. package/dist/sharedObjectSequence.d.ts.map +0 -1
  295. package/dist/sharedObjectSequence.js +0 -61
  296. package/dist/sharedObjectSequence.js.map +0 -1
  297. package/dist/sharedSequence.js.map +0 -1
  298. package/dist/sharedString.js +0 -187
  299. package/dist/sharedString.js.map +0 -1
  300. package/dist/sparsematrix.d.ts +0 -139
  301. package/dist/sparsematrix.d.ts.map +0 -1
  302. package/dist/sparsematrix.js +0 -332
  303. package/dist/sparsematrix.js.map +0 -1
  304. package/lib/defaultMap.d.ts.map +0 -1
  305. package/lib/defaultMap.js.map +0 -1
  306. package/lib/defaultMapInterfaces.d.ts.map +0 -1
  307. package/lib/defaultMapInterfaces.js.map +0 -1
  308. package/lib/index.d.ts +0 -27
  309. package/lib/index.d.ts.map +0 -1
  310. package/lib/index.js +0 -26
  311. package/lib/index.js.map +0 -1
  312. package/lib/intervalCollection.d.ts +0 -270
  313. package/lib/intervalCollection.d.ts.map +0 -1
  314. package/lib/intervalCollection.js +0 -1238
  315. package/lib/intervalCollection.js.map +0 -1
  316. package/lib/localValues.d.ts.map +0 -1
  317. package/lib/localValues.js.map +0 -1
  318. package/lib/packageVersion.js.map +0 -1
  319. package/lib/sequence.d.ts.map +0 -1
  320. package/lib/sequence.js.map +0 -1
  321. package/lib/sequenceDeltaEvent.d.ts.map +0 -1
  322. package/lib/sequenceDeltaEvent.js.map +0 -1
  323. package/lib/sequenceFactory.d.ts +0 -108
  324. package/lib/sequenceFactory.d.ts.map +0 -1
  325. package/lib/sequenceFactory.js +0 -186
  326. package/lib/sequenceFactory.js.map +0 -1
  327. package/lib/sharedIntervalCollection.d.ts.map +0 -1
  328. package/lib/sharedIntervalCollection.js.map +0 -1
  329. package/lib/sharedNumberSequence.d.ts +0 -50
  330. package/lib/sharedNumberSequence.d.ts.map +0 -1
  331. package/lib/sharedNumberSequence.js +0 -57
  332. package/lib/sharedNumberSequence.js.map +0 -1
  333. package/lib/sharedObjectSequence.d.ts +0 -50
  334. package/lib/sharedObjectSequence.d.ts.map +0 -1
  335. package/lib/sharedObjectSequence.js +0 -57
  336. package/lib/sharedObjectSequence.js.map +0 -1
  337. package/lib/sharedSequence.d.ts.map +0 -1
  338. package/lib/sharedSequence.js.map +0 -1
  339. package/lib/sharedString.d.ts.map +0 -1
  340. package/lib/sharedString.js +0 -183
  341. package/lib/sharedString.js.map +0 -1
  342. package/lib/sparsematrix.d.ts +0 -139
  343. package/lib/sparsematrix.d.ts.map +0 -1
  344. package/lib/sparsematrix.js +0 -323
  345. package/lib/sparsematrix.js.map +0 -1
  346. package/src/sharedNumberSequence.ts +0 -62
  347. package/src/sharedObjectSequence.ts +0 -62
  348. package/src/sparsematrix.ts +0 -421
  349. package/tsconfig.esnext.json +0 -7
@@ -1,81 +1,30 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SharedSegmentSequence = void 0;
4
2
  /*!
5
3
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
6
4
  * Licensed under the MIT License.
7
5
  */
8
- const common_utils_1 = require("@fluidframework/common-utils");
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.resetReentrancyLogCounter = exports.SharedSegmentSequence = void 0;
8
+ const core_utils_1 = require("@fluidframework/core-utils");
9
+ const client_utils_1 = require("@fluid-internal/client-utils");
9
10
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
10
11
  const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
11
12
  const merge_tree_1 = require("@fluidframework/merge-tree");
12
13
  const runtime_utils_1 = require("@fluidframework/runtime-utils");
13
14
  const shared_object_base_1 = require("@fluidframework/shared-object-base");
14
- const intervalCollection_1 = require("./intervalCollection");
15
- const defaultMap_1 = require("./defaultMap");
16
- const sequenceDeltaEvent_1 = require("./sequenceDeltaEvent");
15
+ const defaultMap_1 = require("./defaultMap.cjs");
16
+ const intervalCollection_1 = require("./intervalCollection.cjs");
17
+ const sequenceDeltaEvent_1 = require("./sequenceDeltaEvent.cjs");
17
18
  const snapshotFileName = "header";
18
19
  const contentPath = "content";
20
+ /**
21
+ * @alpha
22
+ */
19
23
  class SharedSegmentSequence extends shared_object_base_1.SharedObject {
20
- constructor(dataStoreRuntime, id, attributes, segmentFromSpec) {
21
- super(id, dataStoreRuntime, attributes, "fluid_sequence_");
22
- this.dataStoreRuntime = dataStoreRuntime;
23
- this.id = id;
24
- this.segmentFromSpec = segmentFromSpec;
25
- // Deferred that triggers once the object is loaded
26
- this.loadedDeferred = new common_utils_1.Deferred();
27
- // cache out going ops created when partial loading
28
- this.loadedDeferredOutgoingOps = [];
29
- // cache incoming ops that arrive when partial loading
30
- this.deferIncomingOps = true;
31
- this.loadedDeferredIncomingOps = [];
32
- this.messagesSinceMSNChange = [];
33
- this.loadedDeferred.promise.catch((error) => {
34
- this.logger.sendErrorEvent({ eventName: "SequenceLoadFailed" }, error);
35
- });
36
- this.client = new merge_tree_1.Client(segmentFromSpec, telemetry_utils_1.ChildLogger.create(this.logger, "SharedSegmentSequence.MergeTreeClient"), dataStoreRuntime.options);
37
- super.on("newListener", (event) => {
38
- switch (event) {
39
- case "sequenceDelta":
40
- if (!this.client.mergeTreeDeltaCallback) {
41
- this.client.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {
42
- this.emit("sequenceDelta", new sequenceDeltaEvent_1.SequenceDeltaEvent(opArgs, deltaArgs, this.client), this);
43
- };
44
- }
45
- break;
46
- case "maintenance":
47
- if (!this.client.mergeTreeMaintenanceCallback) {
48
- this.client.mergeTreeMaintenanceCallback = (args, opArgs) => {
49
- this.emit("maintenance", new sequenceDeltaEvent_1.SequenceMaintenanceEvent(opArgs, args, this.client), this);
50
- };
51
- }
52
- break;
53
- default:
54
- }
55
- });
56
- super.on("removeListener", (event) => {
57
- switch (event) {
58
- case "sequenceDelta":
59
- if (super.listenerCount(event) === 0) {
60
- this.client.mergeTreeDeltaCallback = undefined;
61
- }
62
- break;
63
- case "maintenance":
64
- if (super.listenerCount(event) === 0) {
65
- this.client.mergeTreeMaintenanceCallback = undefined;
66
- }
67
- break;
68
- default:
69
- break;
70
- }
71
- });
72
- this.intervalCollections = new defaultMap_1.DefaultMap(this.serializer, this.handle, (op, localOpMetadata) => this.submitLocalMessage(op, localOpMetadata), new intervalCollection_1.SequenceIntervalCollectionValueType());
73
- }
74
24
  get loaded() {
75
25
  return this.loadedDeferred.promise;
76
26
  }
77
27
  static createOpsFromDelta(event) {
78
- var _a, _b;
79
28
  const ops = [];
80
29
  for (const r of event.ranges) {
81
30
  switch (event.deltaOperation) {
@@ -83,14 +32,15 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
83
32
  const lastAnnotate = ops[ops.length - 1];
84
33
  const props = {};
85
34
  for (const key of Object.keys(r.propertyDeltas)) {
86
- props[key] = (_b = (_a = r.segment.properties) === null || _a === void 0 ? void 0 : _a[key]) !== null && _b !== void 0 ? _b : null;
35
+ props[key] = r.segment.properties?.[key] ?? null;
87
36
  }
88
- if (lastAnnotate && lastAnnotate.pos2 === r.position &&
37
+ if (lastAnnotate &&
38
+ lastAnnotate.pos2 === r.position &&
89
39
  (0, merge_tree_1.matchProperties)(lastAnnotate.props, props)) {
90
40
  lastAnnotate.pos2 += r.segment.cachedLength;
91
41
  }
92
42
  else {
93
- ops.push((0, merge_tree_1.createAnnotateRangeOp)(r.position, r.position + r.segment.cachedLength, props, undefined));
43
+ ops.push((0, merge_tree_1.createAnnotateRangeOp)(r.position, r.position + r.segment.cachedLength, props));
94
44
  }
95
45
  break;
96
46
  }
@@ -99,7 +49,8 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
99
49
  break;
100
50
  case merge_tree_1.MergeTreeDeltaType.REMOVE: {
101
51
  const lastRem = ops[ops.length - 1];
102
- if ((lastRem === null || lastRem === void 0 ? void 0 : lastRem.pos1) === r.position) {
52
+ if (lastRem?.pos1 === r.position) {
53
+ (0, core_utils_1.assert)(lastRem.pos2 !== undefined, 0x3ff /* pos2 should not be undefined here */);
103
54
  lastRem.pos2 += r.segment.cachedLength;
104
55
  }
105
56
  else {
@@ -107,26 +58,94 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
107
58
  }
108
59
  break;
109
60
  }
61
+ case merge_tree_1.MergeTreeDeltaType.OBLITERATE: {
62
+ const lastRem = ops[ops.length - 1];
63
+ if (lastRem?.pos1 === r.position) {
64
+ (0, core_utils_1.assert)(lastRem.pos2 !== undefined, 0x874 /* pos2 should not be undefined here */);
65
+ lastRem.pos2 += r.segment.cachedLength;
66
+ }
67
+ else {
68
+ ops.push((0, merge_tree_1.createObliterateRangeOp)(r.position, r.position + r.segment.cachedLength));
69
+ }
70
+ break;
71
+ }
110
72
  default:
111
73
  }
112
74
  }
113
75
  return ops;
114
76
  }
77
+ constructor(dataStoreRuntime, id, attributes, segmentFromSpec) {
78
+ super(id, dataStoreRuntime, attributes, "fluid_sequence_");
79
+ this.dataStoreRuntime = dataStoreRuntime;
80
+ this.id = id;
81
+ this.segmentFromSpec = segmentFromSpec;
82
+ /** `Deferred` that triggers once the object is loaded */
83
+ this.loadedDeferred = new core_utils_1.Deferred();
84
+ // cache out going ops created when partial loading
85
+ this.loadedDeferredOutgoingOps = [];
86
+ // cache incoming ops that arrive when partial loading
87
+ this.deferIncomingOps = true;
88
+ this.loadedDeferredIncomingOps = [];
89
+ this.messagesSinceMSNChange = [];
90
+ this.guardReentrancy =
91
+ dataStoreRuntime.options.sharedStringPreventReentrancy ?? true
92
+ ? ensureNoReentrancy
93
+ : createReentrancyDetector((depth) => {
94
+ if (totalReentrancyLogs > 0) {
95
+ totalReentrancyLogs--;
96
+ this.logger.sendTelemetryEvent({ eventName: "LocalOpReentry", depth }, new telemetry_utils_1.LoggingError(reentrancyErrorMessage));
97
+ }
98
+ });
99
+ this.loadedDeferred.promise.catch((error) => {
100
+ this.logger.sendErrorEvent({ eventName: "SequenceLoadFailed" }, error);
101
+ });
102
+ // eslint-disable-next-line import/no-deprecated
103
+ this.client = new merge_tree_1.Client(segmentFromSpec, (0, telemetry_utils_1.createChildLogger)({
104
+ logger: this.logger,
105
+ namespace: "SharedSegmentSequence.MergeTreeClient",
106
+ }), dataStoreRuntime.options);
107
+ this.client.prependListener("delta", (opArgs, deltaArgs) => {
108
+ const event = new sequenceDeltaEvent_1.SequenceDeltaEvent(opArgs, deltaArgs, this.client);
109
+ if (opArgs.stashed !== true && event.isLocal) {
110
+ this.submitSequenceMessage(opArgs.op);
111
+ }
112
+ this.emit("sequenceDelta", event, this);
113
+ });
114
+ this.client.on("maintenance", (args, opArgs) => {
115
+ this.emit("maintenance", new sequenceDeltaEvent_1.SequenceMaintenanceEvent(opArgs, args, this.client), this);
116
+ });
117
+ this.intervalCollections = new defaultMap_1.DefaultMap(this.serializer, this.handle, (op, localOpMetadata) => this.submitLocalMessage(op, localOpMetadata), new intervalCollection_1.SequenceIntervalCollectionValueType(), dataStoreRuntime.options);
118
+ }
115
119
  /**
116
120
  * @param start - The inclusive start of the range to remove
117
121
  * @param end - The exclusive end of the range to remove
118
122
  */
119
123
  removeRange(start, end) {
120
- const removeOp = this.client.removeRangeLocal(start, end);
121
- if (removeOp) {
122
- this.submitSequenceMessage(removeOp);
123
- }
124
- return removeOp;
124
+ this.guardReentrancy(() => this.client.removeRangeLocal(start, end));
125
125
  }
126
+ /**
127
+ * Obliterate is similar to remove, but differs in that segments concurrently
128
+ * inserted into an obliterated range will also be removed
129
+ *
130
+ * @param start - The inclusive start of the range to obliterate
131
+ * @param end - The exclusive end of the range to obliterate
132
+ */
133
+ obliterateRange(start, end) {
134
+ this.guardReentrancy(() => this.client.obliterateRangeLocal(start, end));
135
+ }
136
+ /**
137
+ * @deprecated The ability to create group ops will be removed in an upcoming
138
+ * release, as group ops are redundant with the native batching capabilities
139
+ * of the runtime
140
+ */
126
141
  groupOperation(groupOp) {
127
- this.client.localTransaction(groupOp);
128
- this.submitSequenceMessage(groupOp);
142
+ this.guardReentrancy(() => this.client.localTransaction(groupOp));
129
143
  }
144
+ /**
145
+ * Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.
146
+ * If the position is past the end of the string, `segment` and `offset` on the returned object may be undefined.
147
+ * @param pos - Character position (index) into the current local view of the SharedString.
148
+ */
130
149
  getContainingSegment(pos) {
131
150
  return this.client.getContainingSegment(pos);
132
151
  }
@@ -150,14 +169,10 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
150
169
  * @param start - The inclusive start position of the range to annotate
151
170
  * @param end - The exclusive end position of the range to annotate
152
171
  * @param props - The properties to annotate the range with
153
- * @param combiningOp - Optional. Specifies how to combine values for the property, such as "incr" for increment.
154
172
  *
155
173
  */
156
- annotateRange(start, end, props, combiningOp) {
157
- const annotateOp = this.client.annotateRangeLocal(start, end, props, combiningOp);
158
- if (annotateOp) {
159
- this.submitSequenceMessage(annotateOp);
160
- }
174
+ annotateRange(start, end, props) {
175
+ this.guardReentrancy(() => this.client.annotateRangeLocal(start, end, props));
161
176
  }
162
177
  getPropertiesAtPosition(pos) {
163
178
  return this.client.getPropertiesAtPosition(pos);
@@ -166,27 +181,28 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
166
181
  return this.client.getRangeExtentsOfPosition(pos);
167
182
  }
168
183
  /**
169
- * @deprecated - use createLocalReferencePosition
184
+ * Creates a `LocalReferencePosition` on this SharedString. If the refType does not include
185
+ * ReferenceType.Transient, the returned reference will be added to the localRefs on the provided segment.
186
+ * @param segment - Segment to add the local reference on
187
+ * @param offset - Offset on the segment at which to place the local reference
188
+ * @param refType - ReferenceType for the created local reference
189
+ * @param properties - PropertySet to place on the created local reference
170
190
  */
171
- createPositionReference(segment, offset, refType) {
172
- const lref = new merge_tree_1.LocalReference(this.client, segment, offset, refType);
173
- if (refType !== merge_tree_1.ReferenceType.Transient) {
174
- this.addLocalReference(lref);
175
- }
176
- return lref;
177
- }
178
- createLocalReferencePosition(segment, offset, refType, properties) {
179
- return this.client.createLocalReferencePosition(segment, offset, refType, properties);
191
+ createLocalReferencePosition(segment, offset, refType, properties, slidingPreference, canSlideToEndpoint) {
192
+ return this.client.createLocalReferencePosition(segment, offset, refType, properties, slidingPreference, canSlideToEndpoint);
180
193
  }
181
194
  /**
182
- * @deprecated - use localReferencePositionToPosition
195
+ * Resolves a `ReferencePosition` into a character position using this client's perspective.
183
196
  */
184
- localRefToPos(localRef) {
185
- return this.client.localReferencePositionToPosition(localRef);
186
- }
187
197
  localReferencePositionToPosition(lref) {
188
198
  return this.client.localReferencePositionToPosition(lref);
189
199
  }
200
+ /**
201
+ * Removes a `LocalReferencePosition` from this SharedString.
202
+ */
203
+ removeLocalReferencePosition(lref) {
204
+ return this.client.removeLocalReferencePosition(lref);
205
+ }
190
206
  /**
191
207
  * Resolves a remote client's position against the local sequence
192
208
  * and returns the remote client's position relative to the local
@@ -212,29 +228,14 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
212
228
  const metadata = this.client.peekPendingSegmentGroups(message.type === merge_tree_1.MergeTreeDeltaType.GROUP ? message.ops.length : 1);
213
229
  // if loading isn't complete, we need to cache
214
230
  // local ops until loading is complete, and then
215
- // they will be resent
231
+ // they will be present
216
232
  if (!this.loadedDeferred.isCompleted) {
217
- this.loadedDeferredOutgoingOps.push([translated, metadata]);
233
+ this.loadedDeferredOutgoingOps.push(metadata ? [translated, metadata] : translated);
218
234
  }
219
235
  else {
220
236
  this.submitLocalMessage(translated, metadata);
221
237
  }
222
238
  }
223
- /**
224
- * @deprecated - use createLocalReferencePosition
225
- */
226
- addLocalReference(lref) {
227
- return this.client.addLocalReference(lref);
228
- }
229
- /**
230
- * @deprecated - use removeLocalReferencePosition
231
- */
232
- removeLocalReference(lref) {
233
- return this.client.removeLocalReferencePosition(lref);
234
- }
235
- removeLocalReferencePosition(lref) {
236
- return this.client.removeLocalReferencePosition(lref);
237
- }
238
239
  /**
239
240
  * Given a position specified relative to a marker id, lookup the marker
240
241
  * and convert the position to a character position.
@@ -245,53 +246,70 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
245
246
  }
246
247
  /**
247
248
  * Walk the underlying segments of the sequence.
248
- * The walked segments may extend beyond the range
249
- * if the segments cross the ranges start or end boundaries.
250
- * Set split range to true to ensure only segments within the
251
- * range are walked.
249
+ * The walked segments may extend beyond the range if the segments cross the
250
+ * ranges start or end boundaries.
252
251
  *
253
- * @param handler - The function to handle each segment
252
+ * Set split range to true to ensure only segments within the range are walked.
253
+ *
254
+ * @param handler - The function to handle each segment. Traversal ends if
255
+ * this function returns true.
254
256
  * @param start - Optional. The start of range walk.
255
257
  * @param end - Optional. The end of range walk
256
258
  * @param accum - Optional. An object that will be passed to the handler for accumulation
257
259
  * @param splitRange - Optional. Splits boundary segments on the range boundaries
258
260
  */
259
261
  walkSegments(handler, start, end, accum, splitRange = false) {
260
- return this.client.walkSegments(handler, start, end, accum, splitRange);
261
- }
262
- getStackContext(startPos, rangeLabels) {
263
- return this.client.getStackContext(startPos, rangeLabels);
262
+ this.client.walkSegments(handler, start, end, accum, splitRange);
264
263
  }
264
+ /**
265
+ * @returns The most recent sequence number which has been acked by the server and processed by this
266
+ * SharedSegmentSequence.
267
+ */
265
268
  getCurrentSeq() {
266
269
  return this.client.getCurrentSeq();
267
270
  }
271
+ /**
272
+ * Inserts a segment directly before a `ReferencePosition`.
273
+ * @param refPos - The reference position to insert the segment at
274
+ * @param segment - The segment to insert
275
+ */
268
276
  insertAtReferencePosition(pos, segment) {
269
- const insertOp = this.client.insertAtReferencePositionLocal(pos, segment);
270
- if (insertOp) {
271
- this.submitSequenceMessage(insertOp);
272
- }
277
+ this.guardReentrancy(() => this.client.insertAtReferencePositionLocal(pos, segment));
273
278
  }
274
279
  /**
275
- * @deprecated - IntervalCollections are created on a first-write wins basis, and concurrent creates
276
- * are supported. Use `getIntervalCollection` instead.
280
+ * Inserts a segment
281
+ * @param start - The position to insert the segment at
282
+ * @param spec - The segment to inserts spec
277
283
  */
278
- async waitIntervalCollection(label) {
279
- return this.intervalCollections.get(label);
284
+ insertFromSpec(pos, spec) {
285
+ const segment = this.segmentFromSpec(spec);
286
+ this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
280
287
  }
288
+ /**
289
+ * Retrieves the interval collection keyed on `label`. If no such interval collection exists,
290
+ * creates one.
291
+ */
281
292
  getIntervalCollection(label) {
282
293
  return this.intervalCollections.get(label);
283
294
  }
284
295
  /**
285
- * @returns an iterable object that enumerates the IntervalCollection labels
286
- * Usage:
296
+ * @returns An iterable object that enumerates the IntervalCollection labels.
297
+ *
298
+ * @example
299
+ *
300
+ * ```typescript
287
301
  * const iter = this.getIntervalCollectionKeys();
288
302
  * for (key of iter)
289
303
  * const collection = this.getIntervalCollection(key);
290
304
  * ...
291
- */
305
+ * ```
306
+ */
292
307
  getIntervalCollectionLabels() {
293
308
  return this.intervalCollections.keys();
294
309
  }
310
+ /**
311
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
312
+ */
295
313
  summarizeCore(serializer, telemetryContext) {
296
314
  const builder = new runtime_utils_1.SummaryTreeBuilder();
297
315
  // conditionally write the interval collection blob
@@ -328,19 +346,24 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
328
346
  const insert = this.client.insertSegmentLocal(insertIndex, segment);
329
347
  if (insert) {
330
348
  if (start < end) {
331
- const remove = this.client.removeRangeLocal(start, end);
332
- this.submitSequenceMessage((0, merge_tree_1.createGroupOp)(insert, remove));
333
- }
334
- else {
335
- this.submitSequenceMessage(insert);
349
+ this.client.removeRangeLocal(start, end);
336
350
  }
337
351
  }
338
352
  }
353
+ /**
354
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onConnect}
355
+ */
339
356
  onConnect() {
340
357
  // Update merge tree collaboration information with new client ID and then resend pending ops
341
358
  this.client.startOrUpdateCollaboration(this.runtime.clientId);
342
359
  }
360
+ /**
361
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}
362
+ */
343
363
  onDisconnect() { }
364
+ /**
365
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.reSubmitCore}
366
+ */
344
367
  reSubmitCore(content, localOpMetadata) {
345
368
  if (!this.intervalCollections.tryResubmitMessage(content, localOpMetadata)) {
346
369
  this.submitSequenceMessage(this.client.regeneratePendingOp(content, localOpMetadata));
@@ -350,10 +373,9 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
350
373
  * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}
351
374
  */
352
375
  async loadCore(storage) {
353
- var _a;
354
376
  if (await storage.contains(snapshotFileName)) {
355
377
  const blob = await storage.readBlob(snapshotFileName);
356
- const header = (0, common_utils_1.bufferToString)(blob, "utf8");
378
+ const header = (0, client_utils_1.bufferToString)(blob, "utf8");
357
379
  this.intervalCollections.populate(header);
358
380
  }
359
381
  try {
@@ -367,10 +389,11 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
367
389
  .then((msgs) => {
368
390
  msgs.forEach((m) => {
369
391
  const collabWindow = this.client.getCollabWindow();
370
- if (m.minimumSequenceNumber < collabWindow.minSeq
371
- || m.referenceSequenceNumber < collabWindow.minSeq
372
- || m.sequenceNumber <= collabWindow.minSeq
373
- || m.sequenceNumber <= collabWindow.currentSeq) {
392
+ if (m.minimumSequenceNumber < collabWindow.minSeq ||
393
+ m.referenceSequenceNumber < collabWindow.minSeq ||
394
+ m.sequenceNumber <= collabWindow.minSeq ||
395
+ // sequenceNumber could be the same if messages are part of a grouped batch
396
+ m.sequenceNumber < collabWindow.currentSeq) {
374
397
  throw new Error(`Invalid catchup operations in snapshot: ${JSON.stringify({
375
398
  op: {
376
399
  seq: m.sequenceNumber,
@@ -390,7 +413,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
390
413
  .catch((error) => {
391
414
  this.loadFinished(error);
392
415
  });
393
- if (((_a = this.dataStoreRuntime.options) === null || _a === void 0 ? void 0 : _a.sequenceInitializeFromHeaderOnly) !== true) {
416
+ if (this.dataStoreRuntime.options?.sequenceInitializeFromHeaderOnly !== true) {
394
417
  // if we not doing partial load, await the catch up ops,
395
418
  // and the finalization of the load
396
419
  await loadCatchUpOps;
@@ -400,29 +423,37 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
400
423
  this.loadFinished(error);
401
424
  }
402
425
  }
426
+ /**
427
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processCore}
428
+ */
403
429
  processCore(message, local, localOpMetadata) {
404
430
  // if loading isn't complete, we need to cache all
405
431
  // incoming ops to be applied after loading is complete
406
432
  if (this.deferIncomingOps) {
407
- (0, common_utils_1.assert)(!local, 0x072 /* "Unexpected local op when loading not finished" */);
433
+ (0, core_utils_1.assert)(!local, 0x072 /* "Unexpected local op when loading not finished" */);
408
434
  this.loadedDeferredIncomingOps.push(message);
409
435
  }
410
436
  else {
411
- (0, common_utils_1.assert)(message.type === protocol_definitions_1.MessageType.Operation, 0x073 /* "Sequence message not operation" */);
437
+ (0, core_utils_1.assert)(message.type === protocol_definitions_1.MessageType.Operation, 0x073 /* "Sequence message not operation" */);
412
438
  const handled = this.intervalCollections.tryProcessMessage(message.contents, local, message, localOpMetadata);
413
439
  if (!handled) {
414
440
  this.processMergeTreeMsg(message, local);
415
441
  }
416
442
  }
417
443
  }
444
+ /**
445
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.didAttach}
446
+ */
418
447
  didAttach() {
419
- var _a;
420
448
  // If we are not local, and we've attached we need to start generating and sending ops
421
449
  // so start collaboration and provide a default client id incase we are not connected
422
450
  if (this.isAttached()) {
423
- this.client.startOrUpdateCollaboration((_a = this.runtime.clientId) !== null && _a !== void 0 ? _a : "attached");
451
+ this.client.startOrUpdateCollaboration(this.runtime.clientId ?? "attached");
424
452
  }
425
453
  }
454
+ /**
455
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.initializeLocalCore}
456
+ */
426
457
  initializeLocalCore() {
427
458
  super.initializeLocalCore();
428
459
  this.loadFinished();
@@ -431,18 +462,19 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
431
462
  * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}
432
463
  */
433
464
  applyStashedOp(content) {
434
- return this.client.applyStashedOp(content);
465
+ return this.client.applyStashedOp((0, shared_object_base_1.parseHandles)(content, this.serializer));
435
466
  }
436
467
  summarizeMergeTree(serializer) {
437
468
  // Are we fully loaded? If not, things will go south
438
- (0, common_utils_1.assert)(this.loadedDeferred.isCompleted, 0x074 /* "Snapshot called when not fully loaded" */);
469
+ (0, core_utils_1.assert)(this.loadedDeferred.isCompleted, 0x074 /* "Snapshot called when not fully loaded" */);
439
470
  const minSeq = this.runtime.deltaManager.minimumSequenceNumber;
440
471
  this.processMinSequenceNumberChanged(minSeq);
441
- this.messagesSinceMSNChange.forEach((m) => { m.minimumSequenceNumber = minSeq; });
472
+ this.messagesSinceMSNChange.forEach((m) => {
473
+ m.minimumSequenceNumber = minSeq;
474
+ });
442
475
  return this.client.summarize(this.runtime, this.handle, serializer, this.messagesSinceMSNChange);
443
476
  }
444
477
  processMergeTreeMsg(rawMessage, local) {
445
- var _a, _b;
446
478
  const message = (0, shared_object_base_1.parseHandles)(rawMessage, this.serializer);
447
479
  const ops = [];
448
480
  function transformOps(event) {
@@ -450,23 +482,28 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
450
482
  }
451
483
  const needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;
452
484
  let stashMessage = message;
453
- if (((_a = this.runtime.options) === null || _a === void 0 ? void 0 : _a.newMergeTreeSnapshotFormat) !== true) {
485
+ if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
454
486
  if (needsTransformation) {
455
487
  this.on("sequenceDelta", transformOps);
456
488
  }
457
489
  }
458
490
  this.client.applyMsg(message, local);
459
- if (((_b = this.runtime.options) === null || _b === void 0 ? void 0 : _b.newMergeTreeSnapshotFormat) !== true) {
491
+ if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
460
492
  if (needsTransformation) {
461
493
  this.removeListener("sequenceDelta", transformOps);
462
494
  // shallow clone the message as we only overwrite top level properties,
463
495
  // like referenceSequenceNumber and content only
464
- stashMessage = Object.assign(Object.assign({}, message), { referenceSequenceNumber: stashMessage.sequenceNumber - 1, contents: ops.length !== 1 ? (0, merge_tree_1.createGroupOp)(...ops) : ops[0] });
496
+ stashMessage = {
497
+ ...message,
498
+ referenceSequenceNumber: stashMessage.sequenceNumber - 1,
499
+ // eslint-disable-next-line import/no-deprecated
500
+ contents: ops.length !== 1 ? (0, merge_tree_1.createGroupOp)(...ops) : ops[0],
501
+ };
465
502
  }
466
503
  this.messagesSinceMSNChange.push(stashMessage);
467
504
  // Do GC every once in a while...
468
- if (this.messagesSinceMSNChange.length > 20
469
- && this.messagesSinceMSNChange[20].sequenceNumber < message.minimumSequenceNumber) {
505
+ if (this.messagesSinceMSNChange.length > 20 &&
506
+ this.messagesSinceMSNChange[20].sequenceNumber < message.minimumSequenceNumber) {
470
507
  this.processMinSequenceNumberChanged(message.minimumSequenceNumber);
471
508
  }
472
509
  }
@@ -516,7 +553,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
516
553
  if (!intervalCollection.attached) {
517
554
  intervalCollection.attachGraph(this.client, key);
518
555
  }
519
- (0, common_utils_1.assert)(previousValue === undefined, 0x2c1 /* "Creating an interval collection that already exists?" */);
556
+ (0, core_utils_1.assert)(previousValue === undefined, 0x2c1 /* "Creating an interval collection that already exists?" */);
520
557
  this.emit("createIntervalCollection", key, local, this);
521
558
  });
522
559
  // Initialize existing SharedIntervalCollections
@@ -527,4 +564,37 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
527
564
  }
528
565
  }
529
566
  exports.SharedSegmentSequence = SharedSegmentSequence;
530
- //# sourceMappingURL=sequence.js.map
567
+ function createReentrancyDetector(onReentrancy) {
568
+ let depth = 0;
569
+ function detectReentrancy(callback) {
570
+ if (depth > 0) {
571
+ onReentrancy(depth);
572
+ }
573
+ depth++;
574
+ try {
575
+ return callback();
576
+ }
577
+ finally {
578
+ depth--;
579
+ }
580
+ }
581
+ return detectReentrancy;
582
+ }
583
+ /**
584
+ * Apps which generate reentrant behavior may do so at a high frequency.
585
+ * Logging even per-SharedSegmentSequence instance might be too noisy, and having a few logs from a session
586
+ * is likely enough.
587
+ */
588
+ let totalReentrancyLogs = 3;
589
+ /**
590
+ * Resets the reentrancy log counter. Test-only API.
591
+ */
592
+ function resetReentrancyLogCounter() {
593
+ totalReentrancyLogs = 3;
594
+ }
595
+ exports.resetReentrancyLogCounter = resetReentrancyLogCounter;
596
+ const reentrancyErrorMessage = "Reentrancy detected in sequence local ops";
597
+ const ensureNoReentrancy = createReentrancyDetector(() => {
598
+ throw new telemetry_utils_1.LoggingError(reentrancyErrorMessage);
599
+ });
600
+ //# sourceMappingURL=sequence.cjs.map