@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
@@ -6,11 +6,13 @@ import { IFluidHandle } from "@fluidframework/core-interfaces";
6
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
7
7
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
8
8
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
9
- import { ISerializableValue, ISerializedValue, IValueType, ISharedDefaultMapEvents, IMapMessageLocalMetadata, SequenceOptions, IValueTypeOperationValue } from "./defaultMapInterfaces";
9
+ import { ISerializableIntervalCollection, IIntervalCollectionType, ISharedDefaultMapEvents, IMapMessageLocalMetadata, SequenceOptions, IIntervalCollectionTypeOperationValue } from "./intervalCollectionMapInterfaces.js";
10
+ import { type ISerializableInterval } from "./intervals/index.js";
11
+ import { type IntervalCollection } from "./intervalCollection.js";
10
12
  /**
11
- * Describes an operation specific to a value type.
13
+ * Description of a map delta operation
12
14
  */
13
- export interface IMapValueTypeOperation {
15
+ export interface IMapOperation {
14
16
  /**
15
17
  * String identifier of the operation type.
16
18
  */
@@ -21,23 +23,15 @@ export interface IMapValueTypeOperation {
21
23
  key: string;
22
24
  /**
23
25
  * Value of the operation, specific to the value type.
24
- * @alpha
25
26
  */
26
- value: IValueTypeOperationValue;
27
+ value: IIntervalCollectionTypeOperationValue;
27
28
  }
28
- /**
29
- * Description of a map delta operation
30
- */
31
- export type IMapOperation = IMapValueTypeOperation;
32
29
  /**
33
30
  * Defines the in-memory object structure to be used for the conversion to/from serialized.
34
31
  * Directly used in JSON.stringify, direct result from JSON.parse
35
32
  */
36
33
  export interface IMapDataObjectSerializable {
37
- [key: string]: ISerializableValue;
38
- }
39
- export interface IMapDataObjectSerialized {
40
- [key: string]: ISerializedValue;
34
+ [key: string]: ISerializableIntervalCollection;
41
35
  }
42
36
  /**
43
37
  * A DefaultMap is a map-like distributed data structure, supporting operations on values stored by
@@ -46,7 +40,7 @@ export interface IMapDataObjectSerialized {
46
40
  * Creation of values is implicit on access (either via `get` or a remote op application referring to
47
41
  * a collection that wasn't previously known)
48
42
  */
49
- export declare class DefaultMap<T> {
43
+ export declare class IntervalCollectionMap<T extends ISerializableInterval> {
50
44
  private readonly serializer;
51
45
  private readonly handle;
52
46
  private readonly submitMessage;
@@ -60,7 +54,7 @@ export declare class DefaultMap<T> {
60
54
  /**
61
55
  * Mapping of op types to message handlers.
62
56
  */
63
- private readonly messageHandlers;
57
+ private readonly messageHandler;
64
58
  /**
65
59
  * The in-memory data the map is storing.
66
60
  */
@@ -73,56 +67,29 @@ export declare class DefaultMap<T> {
73
67
  * @param type - The value type to create at values of this map
74
68
  * @param eventEmitter - The object that will emit map events
75
69
  */
76
- constructor(serializer: IFluidSerializer, handle: IFluidHandle, submitMessage: (op: IMapValueTypeOperation, localOpMetadata: IMapMessageLocalMetadata) => void, type: IValueType<T>, options?: Partial<SequenceOptions> | undefined, eventEmitter?: TypedEventEmitter<ISharedDefaultMapEvents>);
70
+ constructor(serializer: IFluidSerializer, handle: IFluidHandle, submitMessage: (op: IMapOperation, localOpMetadata: IMapMessageLocalMetadata) => void, type: IIntervalCollectionType<T>, options?: Partial<SequenceOptions> | undefined, eventEmitter?: TypedEventEmitter<ISharedDefaultMapEvents>);
77
71
  /**
78
72
  * Get an iterator over the keys in this map.
79
73
  * @returns The iterator
80
74
  */
81
75
  keys(): IterableIterator<string>;
82
- /**
83
- * Get an iterator over the entries in this map.
84
- * @returns The iterator
85
- */
86
- entries(): IterableIterator<[string, any]>;
87
76
  /**
88
77
  * Get an iterator over the values in this map.
89
78
  * @returns The iterator
90
79
  */
91
80
  values(): IterableIterator<any>;
92
- /**
93
- * Get an iterator over the entries in this map.
94
- * @returns The iterator
95
- */
96
- [Symbol.iterator](): IterableIterator<[string, any]>;
97
- /**
98
- * Executes the given callback on each entry in the map.
99
- * @param callbackFn - Callback function
100
- */
101
- forEach(callbackFn: (value: any, key: string, map: Map<string, any>) => void): void;
102
81
  /**
103
82
  * {@inheritDoc ISharedMap.get}
104
83
  */
105
- get(key: string): T;
106
- /**
107
- * Check if a key exists in the map.
108
- * @param key - The key to check
109
- * @returns True if the key exists, false otherwise
110
- */
111
- has(key: string): boolean;
112
- /**
113
- * Serializes the data stored in the shared map to a JSON string
114
- * @param serializer - The serializer to use to serialize handles in its values.
115
- * @returns A JSON string containing serialized map data
116
- */
117
- getSerializedStorage(serializer: IFluidSerializer): IMapDataObjectSerialized;
84
+ get(key: string): IntervalCollection<T>;
118
85
  getSerializableStorage(serializer: IFluidSerializer): IMapDataObjectSerializable;
119
86
  serialize(serializer: IFluidSerializer): string;
120
87
  /**
121
88
  * Populate the kernel with the given map data.
122
- * @param data - A JSON string containing serialized map data
89
+ *
90
+ * @param serialized - A JSON string containing serialized map data
123
91
  */
124
- populateFromSerializable(json: IMapDataObjectSerializable): void;
125
- populate(json: string): void;
92
+ populate(serialized: string): void;
126
93
  /**
127
94
  * Submit the given op if a handler is registered.
128
95
  * @param op - The operation to attempt to submit
@@ -131,8 +98,8 @@ export declare class DefaultMap<T> {
131
98
  * also sent if we are asked to resubmit the message.
132
99
  * @returns True if the operation was submitted, false otherwise.
133
100
  */
134
- tryResubmitMessage(op: IMapOperation, localOpMetadata: IMapMessageLocalMetadata): boolean;
135
- tryGetStashedOpLocalMetadata(op: unknown): IMapMessageLocalMetadata | undefined;
101
+ tryResubmitMessage(op: unknown, localOpMetadata: IMapMessageLocalMetadata): boolean;
102
+ tryApplyStashedOp(op: unknown): boolean;
136
103
  /**
137
104
  * Process the given op if a handler is registered.
138
105
  * @param message - The message to process
@@ -141,7 +108,7 @@ export declare class DefaultMap<T> {
141
108
  * For messages from a remote client, this will be undefined.
142
109
  * @returns True if the operation was processed, false otherwise.
143
110
  */
144
- tryProcessMessage(op: IMapOperation, local: boolean, message: ISequencedDocumentMessage | undefined, localOpMetadata: unknown): boolean;
111
+ tryProcessMessage(op: unknown, local: boolean, message: ISequencedDocumentMessage, localOpMetadata: unknown): boolean;
145
112
  /**
146
113
  * Initializes a default ValueType at the provided key.
147
114
  * Should be used when a map operation incurs creation.
@@ -160,17 +127,11 @@ export declare class DefaultMap<T> {
160
127
  * @returns The local value that was produced
161
128
  */
162
129
  private makeLocal;
163
- /**
164
- * Get the message handlers for the map.
165
- * @returns A map of string op names to IMapMessageHandlers for those ops
166
- */
167
- private getMessageHandlers;
168
130
  /**
169
131
  * Create an emitter for a value type to emit ops from the given key.
170
- * @alpha
171
132
  * @param key - The key of the map that the value type will be stored on
172
133
  * @returns A value op emitter for the given key
173
134
  */
174
135
  private makeMapValueOpEmitter;
175
136
  }
176
- //# sourceMappingURL=defaultMap.d.ts.map
137
+ //# sourceMappingURL=intervalCollectionMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervalCollectionMap.d.ts","sourceRoot":"","sources":["../src/intervalCollectionMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAa,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EACN,+BAA+B,EAI/B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,eAAe,EACf,qCAAqC,EACrC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAGN,KAAK,qBAAqB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIN,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,IAAI,EAAE,KAAK,CAAC;IAEZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,qCAAqC,CAAC;CAC7C;AACD;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,+BAA+B,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,qBAAa,qBAAqB,CAAC,CAAC,SAAS,qBAAqB;IAyDhE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAI9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;aACT,YAAY;IAhE7B;;OAEG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CA8B7B;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0D;IAE/E;;;;;;;OAOG;gBAEe,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,CAC/B,EAAE,EAAE,aAAa,EACjB,eAAe,EAAE,wBAAwB,KACrC,IAAI,EACQ,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAChC,OAAO,CAAC,sCAA0B,EACnC,YAAY,6CAAmD;IAGhF;;;OAGG;IACI,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIvC;;;OAGG;IACI,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC;IAetC;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC;IAMvC,sBAAsB,CAAC,UAAU,EAAE,gBAAgB,GAAG,0BAA0B;IAQhF,SAAS,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM;IAItD;;;;OAIG;IACI,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA4BzC;;;;;;;OAOG;IACI,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,wBAAwB,GAAG,OAAO;IAQnF,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAsC9C;;;;;;;OAOG;IACI,iBAAiB,CACvB,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,yBAAyB,EAClC,eAAe,EAAE,OAAO,GACtB,OAAO;IAaV;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;;;;;OASG;IACH,OAAO,CAAC,SAAS;IAkBjB;;;;OAIG;IAEH,OAAO,CAAC,qBAAqB;CAyB7B"}
@@ -4,11 +4,12 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.DefaultMap = void 0;
7
+ exports.IntervalCollectionMap = void 0;
8
8
  const shared_object_base_1 = require("@fluidframework/shared-object-base");
9
9
  const client_utils_1 = require("@fluid-internal/client-utils");
10
10
  const core_utils_1 = require("@fluidframework/core-utils");
11
- const localValues_1 = require("./localValues");
11
+ const IntervalCollectionValues_js_1 = require("./IntervalCollectionValues.js");
12
+ const intervalCollection_js_1 = require("./intervalCollection.js");
12
13
  function isMapOperation(op) {
13
14
  return typeof op === "object" && op !== null && "type" in op && op.type === "act";
14
15
  }
@@ -19,7 +20,7 @@ function isMapOperation(op) {
19
20
  * Creation of values is implicit on access (either via `get` or a remote op application referring to
20
21
  * a collection that wasn't previously known)
21
22
  */
22
- class DefaultMap {
23
+ class IntervalCollectionMap {
23
24
  /**
24
25
  * The number of key/value pairs stored in the map.
25
26
  */
@@ -44,12 +45,34 @@ class DefaultMap {
44
45
  /**
45
46
  * Mapping of op types to message handlers.
46
47
  */
47
- this.messageHandlers = new Map();
48
+ this.messageHandler = {
49
+ process: (op, local, message, localOpMetadata) => {
50
+ const localValue = this.data.get(op.key) ?? this.createCore(op.key, local);
51
+ const handler = localValue.getOpHandler(op.value.opName);
52
+ const previousValue = localValue.value;
53
+ const translatedValue = op.value.value;
54
+ handler.process(previousValue, translatedValue, local, message, localOpMetadata);
55
+ const event = { key: op.key, previousValue };
56
+ this.eventEmitter.emit("valueChanged", event, local, message, this.eventEmitter);
57
+ },
58
+ submit: (op, localOpMetadata) => {
59
+ this.submitMessage(op, localOpMetadata);
60
+ },
61
+ resubmit: (op, localOpMetadata) => {
62
+ const localValue = this.data.get(op.key);
63
+ (0, core_utils_1.assert)(localValue !== undefined, 0x3f8 /* Local value expected on resubmission */);
64
+ const handler = localValue.getOpHandler(op.value.opName);
65
+ const rebased = handler.rebase(localValue.value, op.value, localOpMetadata);
66
+ if (rebased !== undefined) {
67
+ const { rebasedOp, rebasedLocalOpMetadata } = rebased;
68
+ this.submitMessage({ ...op, value: rebasedOp }, rebasedLocalOpMetadata);
69
+ }
70
+ },
71
+ };
48
72
  /**
49
73
  * The in-memory data the map is storing.
50
74
  */
51
75
  this.data = new Map();
52
- this.messageHandlers = this.getMessageHandlers();
53
76
  }
54
77
  /**
55
78
  * Get an iterator over the keys in this map.
@@ -58,25 +81,6 @@ class DefaultMap {
58
81
  keys() {
59
82
  return this.data.keys();
60
83
  }
61
- /**
62
- * Get an iterator over the entries in this map.
63
- * @returns The iterator
64
- */
65
- entries() {
66
- const localEntriesIterator = this.data.entries();
67
- const iterator = {
68
- next() {
69
- const nextVal = localEntriesIterator.next();
70
- return nextVal.done
71
- ? { value: undefined, done: true }
72
- : { value: [nextVal.value[0], nextVal.value[1].value], done: false }; // Unpack the stored value
73
- },
74
- [Symbol.iterator]() {
75
- return this;
76
- },
77
- };
78
- return iterator;
79
- }
80
84
  /**
81
85
  * Get an iterator over the values in this map.
82
86
  * @returns The iterator
@@ -96,22 +100,6 @@ class DefaultMap {
96
100
  };
97
101
  return iterator;
98
102
  }
99
- /**
100
- * Get an iterator over the entries in this map.
101
- * @returns The iterator
102
- */
103
- [Symbol.iterator]() {
104
- return this.entries();
105
- }
106
- /**
107
- * Executes the given callback on each entry in the map.
108
- * @param callbackFn - Callback function
109
- */
110
- forEach(callbackFn) {
111
- this.data.forEach((localValue, key, m) => {
112
- callbackFn(localValue.value, key, m);
113
- });
114
- }
115
103
  /**
116
104
  * {@inheritDoc ISharedMap.get}
117
105
  */
@@ -119,30 +107,10 @@ class DefaultMap {
119
107
  const localValue = this.data.get(key) ?? this.createCore(key, true);
120
108
  return localValue.value;
121
109
  }
122
- /**
123
- * Check if a key exists in the map.
124
- * @param key - The key to check
125
- * @returns True if the key exists, false otherwise
126
- */
127
- has(key) {
128
- return this.data.has(key);
129
- }
130
- /**
131
- * Serializes the data stored in the shared map to a JSON string
132
- * @param serializer - The serializer to use to serialize handles in its values.
133
- * @returns A JSON string containing serialized map data
134
- */
135
- getSerializedStorage(serializer) {
136
- const serializableMapData = {};
137
- this.data.forEach((localValue, key) => {
138
- serializableMapData[key] = localValue.makeSerialized(serializer, this.handle);
139
- });
140
- return serializableMapData;
141
- }
142
110
  getSerializableStorage(serializer) {
143
111
  const serializableMapData = {};
144
112
  this.data.forEach((localValue, key) => {
145
- serializableMapData[key] = (0, localValues_1.makeSerializable)(localValue, serializer, this.handle);
113
+ serializableMapData[key] = (0, IntervalCollectionValues_js_1.makeSerializable)(localValue, serializer, this.handle);
146
114
  });
147
115
  return serializableMapData;
148
116
  }
@@ -151,10 +119,12 @@ class DefaultMap {
151
119
  }
152
120
  /**
153
121
  * Populate the kernel with the given map data.
154
- * @param data - A JSON string containing serialized map data
122
+ *
123
+ * @param serialized - A JSON string containing serialized map data
155
124
  */
156
- populateFromSerializable(json) {
157
- for (const [key, serializable] of Object.entries(json)) {
125
+ populate(serialized) {
126
+ const parsed = this.serializer.parse(serialized);
127
+ for (const [key, serializable] of Object.entries(parsed)) {
158
128
  // Back-compat: legacy documents may have handles to an intervalCollection map kernel.
159
129
  // These collections should be empty, and ValueTypes are no longer supported.
160
130
  if (serializable.type === shared_object_base_1.ValueType[shared_object_base_1.ValueType.Plain] ||
@@ -173,9 +143,6 @@ class DefaultMap {
173
143
  this.data.set(localValue.key, localValue.value);
174
144
  }
175
145
  }
176
- populate(json) {
177
- this.populateFromSerializable(JSON.parse(json));
178
- }
179
146
  /**
180
147
  * Submit the given op if a handler is registered.
181
148
  * @param op - The operation to attempt to submit
@@ -185,20 +152,47 @@ class DefaultMap {
185
152
  * @returns True if the operation was submitted, false otherwise.
186
153
  */
187
154
  tryResubmitMessage(op, localOpMetadata) {
188
- const type = op.type;
189
- const handler = this.messageHandlers.get(type);
190
- if (handler !== undefined) {
191
- handler.resubmit(op, localOpMetadata);
155
+ if (isMapOperation(op)) {
156
+ this.messageHandler.resubmit(op, localOpMetadata);
192
157
  return true;
193
158
  }
194
159
  return false;
195
160
  }
196
- tryGetStashedOpLocalMetadata(op) {
197
- if (isMapOperation(op) && this.messageHandlers.has(op.type)) {
198
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
199
- return this.messageHandlers.get(op.type).getStashedOpLocalMetadata(op);
161
+ tryApplyStashedOp(op) {
162
+ if (isMapOperation(op)) {
163
+ const { value, key } = op;
164
+ const map = this.get(key);
165
+ switch (value.opName) {
166
+ case "add": {
167
+ map.add({
168
+ // Todo: we should improve typing so we know add ops always have start and end
169
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
170
+ start: (0, intervalCollection_js_1.toSequencePlace)(value.value.start, value.value.startSide),
171
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
172
+ end: (0, intervalCollection_js_1.toSequencePlace)(value.value.end, value.value.endSide),
173
+ props: value.value.properties,
174
+ });
175
+ return true;
176
+ }
177
+ case "change": {
178
+ const { [intervalCollection_js_1.reservedIntervalIdKey]: id, ...props } = value.value.properties ?? {};
179
+ map.change(id, {
180
+ start: (0, intervalCollection_js_1.toOptionalSequencePlace)(value.value.start, value.value.startSide),
181
+ end: (0, intervalCollection_js_1.toOptionalSequencePlace)(value.value.end, value.value.endSide),
182
+ props,
183
+ });
184
+ return true;
185
+ }
186
+ case "delete": {
187
+ const { [intervalCollection_js_1.reservedIntervalIdKey]: id } = value.value.properties ?? {};
188
+ map.removeIntervalById(id);
189
+ return true;
190
+ }
191
+ default:
192
+ throw new Error("unknown ops should not be stashed");
193
+ }
200
194
  }
201
- return undefined;
195
+ return false;
202
196
  }
203
197
  /**
204
198
  * Process the given op if a handler is registered.
@@ -209,9 +203,8 @@ class DefaultMap {
209
203
  * @returns True if the operation was processed, false otherwise.
210
204
  */
211
205
  tryProcessMessage(op, local, message, localOpMetadata) {
212
- const handler = this.messageHandlers.get(op.type);
213
- if (handler !== undefined) {
214
- handler.process(op, local, message, localOpMetadata);
206
+ if (isMapOperation(op)) {
207
+ this.messageHandler.process(op, local, message, localOpMetadata);
215
208
  return true;
216
209
  }
217
210
  return false;
@@ -223,7 +216,7 @@ class DefaultMap {
223
216
  * @param local - Whether the message originated from the local client
224
217
  */
225
218
  createCore(key, local) {
226
- const localValue = new localValues_1.ValueTypeLocalValue(this.type.factory.load(this.makeMapValueOpEmitter(key), undefined, this.options), this.type);
219
+ const localValue = new IntervalCollectionValues_js_1.IntervalCollectionTypeLocalValue(this.type.factory.load(this.makeMapValueOpEmitter(key), undefined, this.options), this.type);
227
220
  const previousValue = this.data.get(key);
228
221
  this.data.set(key, localValue);
229
222
  const event = { key, previousValue };
@@ -243,55 +236,11 @@ class DefaultMap {
243
236
  makeLocal(key, serializable) {
244
237
  (0, core_utils_1.assert)(serializable.type !== shared_object_base_1.ValueType[shared_object_base_1.ValueType.Plain] &&
245
238
  serializable.type !== shared_object_base_1.ValueType[shared_object_base_1.ValueType.Shared], 0x2e1 /* "Support for plain value types removed." */);
246
- serializable.value = (0, shared_object_base_1.parseHandles)(serializable.value, this.serializer);
247
239
  const localValue = this.type.factory.load(this.makeMapValueOpEmitter(key), serializable.value, this.options);
248
- return new localValues_1.ValueTypeLocalValue(localValue, this.type);
249
- }
250
- /**
251
- * Get the message handlers for the map.
252
- * @returns A map of string op names to IMapMessageHandlers for those ops
253
- */
254
- getMessageHandlers() {
255
- const messageHandlers = new Map();
256
- // Ops with type "act" describe actions taken by custom value type handlers of whatever item is
257
- // being addressed. These custom handlers can be retrieved from the ValueTypeLocalValue which has
258
- // stashed its valueType (and therefore its handlers). We also emit a valueChanged for anyone
259
- // watching for manipulations of that item.
260
- messageHandlers.set("act", {
261
- process: (op, local, message, localOpMetadata) => {
262
- const localValue = this.data.get(op.key) ?? this.createCore(op.key, local);
263
- const handler = localValue.getOpHandler(op.value.opName);
264
- const previousValue = localValue.value;
265
- const translatedValue = (0, shared_object_base_1.parseHandles)(op.value.value, this.serializer);
266
- handler.process(previousValue, translatedValue, local, message, localOpMetadata);
267
- const event = { key: op.key, previousValue };
268
- this.eventEmitter.emit("valueChanged", event, local, message, this.eventEmitter);
269
- },
270
- submit: (op, localOpMetadata) => {
271
- this.submitMessage(op, localOpMetadata);
272
- },
273
- resubmit: (op, localOpMetadata) => {
274
- const localValue = this.data.get(op.key);
275
- (0, core_utils_1.assert)(localValue !== undefined, 0x3f8 /* Local value expected on resubmission */);
276
- const handler = localValue.getOpHandler(op.value.opName);
277
- const rebased = handler.rebase(localValue.value, op.value, localOpMetadata);
278
- if (rebased !== undefined) {
279
- const { rebasedOp, rebasedLocalOpMetadata } = rebased;
280
- this.submitMessage({ ...op, value: rebasedOp }, rebasedLocalOpMetadata);
281
- }
282
- },
283
- getStashedOpLocalMetadata: (op) => {
284
- const localValue = this.data.get(op.key) ?? this.createCore(op.key, true);
285
- (0, core_utils_1.assert)(localValue !== undefined, 0x879 /* Local value expected on applying stashed op */);
286
- const handler = localValue.getOpHandler(op.value.opName);
287
- return handler.applyStashedOp(localValue.value, op.value);
288
- },
289
- });
290
- return messageHandlers;
240
+ return new IntervalCollectionValues_js_1.IntervalCollectionTypeLocalValue(localValue, this.type);
291
241
  }
292
242
  /**
293
243
  * Create an emitter for a value type to emit ops from the given key.
294
- * @alpha
295
244
  * @param key - The key of the map that the value type will be stored on
296
245
  * @returns A value op emitter for the given key
297
246
  */
@@ -299,13 +248,12 @@ class DefaultMap {
299
248
  makeMapValueOpEmitter(key) {
300
249
  // eslint-disable-next-line import/no-deprecated
301
250
  const emit = (opName, previousValue, params, localOpMetadata) => {
302
- const translatedParams = (0, shared_object_base_1.makeHandlesSerializable)(params, this.serializer, this.handle);
303
251
  const op = {
304
252
  key,
305
253
  type: "act",
306
254
  value: {
307
255
  opName,
308
- value: translatedParams,
256
+ value: params,
309
257
  },
310
258
  };
311
259
  this.submitMessage(op, localOpMetadata);
@@ -315,5 +263,5 @@ class DefaultMap {
315
263
  return { emit };
316
264
  }
317
265
  }
318
- exports.DefaultMap = DefaultMap;
319
- //# sourceMappingURL=defaultMap.js.map
266
+ exports.IntervalCollectionMap = IntervalCollectionMap;
267
+ //# sourceMappingURL=intervalCollectionMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervalCollectionMap.js","sourceRoot":"","sources":["../src/intervalCollectionMap.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IFluidSerializer, ValueType } from \"@fluidframework/shared-object-base\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { makeSerializable, IntervalCollectionTypeLocalValue } from \"./IntervalCollectionValues.js\";\nimport {\n\tISerializableIntervalCollection,\n\tIValueChanged,\n\t// eslint-disable-next-line import/no-deprecated\n\tIValueOpEmitter,\n\tIIntervalCollectionType,\n\tISharedDefaultMapEvents,\n\tIMapMessageLocalMetadata,\n\tSequenceOptions,\n\tIIntervalCollectionTypeOperationValue,\n} from \"./intervalCollectionMapInterfaces.js\";\nimport {\n\tSerializedIntervalDelta,\n\tIntervalDeltaOpType,\n\ttype ISerializableInterval,\n} from \"./intervals/index.js\";\nimport {\n\ttoSequencePlace,\n\ttoOptionalSequencePlace,\n\treservedIntervalIdKey,\n\ttype IntervalCollection,\n} from \"./intervalCollection.js\";\n\nfunction isMapOperation(op: unknown): op is IMapOperation {\n\treturn typeof op === \"object\" && op !== null && \"type\" in op && op.type === \"act\";\n}\n\n/**\n * Description of a map delta operation\n */\nexport interface IMapOperation {\n\t/**\n\t * String identifier of the operation type.\n\t */\n\ttype: \"act\";\n\n\t/**\n\t * Map key being modified.\n\t */\n\tkey: string;\n\n\t/**\n\t * Value of the operation, specific to the value type.\n\t */\n\tvalue: IIntervalCollectionTypeOperationValue;\n}\n/**\n * Defines the in-memory object structure to be used for the conversion to/from serialized.\n * Directly used in JSON.stringify, direct result from JSON.parse\n */\nexport interface IMapDataObjectSerializable {\n\t[key: string]: ISerializableIntervalCollection;\n}\n\n/**\n * A DefaultMap is a map-like distributed data structure, supporting operations on values stored by\n * string key locations.\n *\n * Creation of values is implicit on access (either via `get` or a remote op application referring to\n * a collection that wasn't previously known)\n */\nexport class IntervalCollectionMap<T extends ISerializableInterval> {\n\t/**\n\t * The number of key/value pairs stored in the map.\n\t */\n\tpublic get size(): number {\n\t\treturn this.data.size;\n\t}\n\n\t/**\n\t * Mapping of op types to message handlers.\n\t */\n\tprivate readonly messageHandler = {\n\t\tprocess: (\n\t\t\top: IMapOperation,\n\t\t\tlocal: boolean,\n\t\t\tmessage: ISequencedDocumentMessage,\n\t\t\tlocalOpMetadata: IMapMessageLocalMetadata,\n\t\t) => {\n\t\t\tconst localValue = this.data.get(op.key) ?? this.createCore(op.key, local);\n\t\t\tconst handler = localValue.getOpHandler(op.value.opName);\n\t\t\tconst previousValue = localValue.value;\n\t\t\tconst translatedValue = op.value.value as any;\n\t\t\thandler.process(previousValue, translatedValue, local, message, localOpMetadata);\n\t\t\tconst event: IValueChanged = { key: op.key, previousValue };\n\t\t\tthis.eventEmitter.emit(\"valueChanged\", event, local, message, this.eventEmitter);\n\t\t},\n\t\tsubmit: (op: IMapOperation, localOpMetadata: IMapMessageLocalMetadata) => {\n\t\t\tthis.submitMessage(op, localOpMetadata);\n\t\t},\n\t\tresubmit: (op: IMapOperation, localOpMetadata: IMapMessageLocalMetadata) => {\n\t\t\tconst localValue = this.data.get(op.key);\n\n\t\t\tassert(localValue !== undefined, 0x3f8 /* Local value expected on resubmission */);\n\n\t\t\tconst handler = localValue.getOpHandler(op.value.opName);\n\t\t\tconst rebased = handler.rebase(localValue.value, op.value, localOpMetadata);\n\t\t\tif (rebased !== undefined) {\n\t\t\t\tconst { rebasedOp, rebasedLocalOpMetadata } = rebased;\n\t\t\t\tthis.submitMessage({ ...op, value: rebasedOp }, rebasedLocalOpMetadata);\n\t\t\t}\n\t\t},\n\t};\n\n\t/**\n\t * The in-memory data the map is storing.\n\t */\n\tprivate readonly data = new Map<string, IntervalCollectionTypeLocalValue<T>>();\n\n\t/**\n\t * Create a new default map.\n\t * @param serializer - The serializer to serialize / parse handles\n\t * @param handle - The handle of the shared object using the kernel\n\t * @param submitMessage - A callback to submit a message through the shared object\n\t * @param type - The value type to create at values of this map\n\t * @param eventEmitter - The object that will emit map events\n\t */\n\tconstructor(\n\t\tprivate readonly serializer: IFluidSerializer,\n\t\tprivate readonly handle: IFluidHandle,\n\t\tprivate readonly submitMessage: (\n\t\t\top: IMapOperation,\n\t\t\tlocalOpMetadata: IMapMessageLocalMetadata,\n\t\t) => void,\n\t\tprivate readonly type: IIntervalCollectionType<T>,\n\t\tprivate readonly options?: Partial<SequenceOptions>,\n\t\tpublic readonly eventEmitter = new TypedEventEmitter<ISharedDefaultMapEvents>(),\n\t) {}\n\n\t/**\n\t * Get an iterator over the keys in this map.\n\t * @returns The iterator\n\t */\n\tpublic keys(): IterableIterator<string> {\n\t\treturn this.data.keys();\n\t}\n\n\t/**\n\t * Get an iterator over the values in this map.\n\t * @returns The iterator\n\t */\n\tpublic values(): IterableIterator<any> {\n\t\tconst localValuesIterator = this.data.values();\n\t\tconst iterator = {\n\t\t\tnext(): IteratorResult<any> {\n\t\t\t\tconst nextVal = localValuesIterator.next();\n\t\t\t\treturn nextVal.done\n\t\t\t\t\t? { value: undefined, done: true }\n\t\t\t\t\t: { value: nextVal.value.value, done: false }; // Unpack the stored value\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\t/**\n\t * {@inheritDoc ISharedMap.get}\n\t */\n\tpublic get(key: string): IntervalCollection<T> {\n\t\tconst localValue = this.data.get(key) ?? this.createCore(key, true);\n\n\t\treturn localValue.value;\n\t}\n\n\tpublic getSerializableStorage(serializer: IFluidSerializer): IMapDataObjectSerializable {\n\t\tconst serializableMapData: IMapDataObjectSerializable = {};\n\t\tthis.data.forEach((localValue, key) => {\n\t\t\tserializableMapData[key] = makeSerializable(localValue, serializer, this.handle);\n\t\t});\n\t\treturn serializableMapData;\n\t}\n\n\tpublic serialize(serializer: IFluidSerializer): string {\n\t\treturn JSON.stringify(this.getSerializableStorage(serializer));\n\t}\n\n\t/**\n\t * Populate the kernel with the given map data.\n\t *\n\t * @param serialized - A JSON string containing serialized map data\n\t */\n\tpublic populate(serialized: string): void {\n\t\tconst parsed = this.serializer.parse(serialized) as IMapDataObjectSerializable;\n\n\t\tfor (const [key, serializable] of Object.entries(parsed)) {\n\t\t\t// Back-compat: legacy documents may have handles to an intervalCollection map kernel.\n\t\t\t// These collections should be empty, and ValueTypes are no longer supported.\n\t\t\tif (\n\t\t\t\tserializable.type === ValueType[ValueType.Plain] ||\n\t\t\t\tserializable.type === ValueType[ValueType.Shared]\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Back-compat: Sequence previously arbitrarily prefixed all interval collection keys with\n\t\t\t// \"intervalCollections/\". This would burden users trying to iterate the collection and\n\t\t\t// access its value, as well as those trying to match a create message to its underlying\n\t\t\t// collection. See https://github.com/microsoft/FluidFramework/issues/10557 for more context.\n\t\t\tconst normalizedKey = key.startsWith(\"intervalCollections/\") ? key.substring(20) : key;\n\n\t\t\tconst localValue = {\n\t\t\t\tkey: normalizedKey,\n\t\t\t\tvalue: this.makeLocal(key, serializable),\n\t\t\t};\n\n\t\t\tthis.data.set(localValue.key, localValue.value);\n\t\t}\n\t}\n\n\t/**\n\t * Submit the given op if a handler is registered.\n\t * @param op - The operation to attempt to submit\n\t * @param localOpMetadata - The local metadata associated with the op. This is kept locally by the runtime\n\t * and not sent to the server. This will be sent back when this message is received back from the server. This is\n\t * also sent if we are asked to resubmit the message.\n\t * @returns True if the operation was submitted, false otherwise.\n\t */\n\tpublic tryResubmitMessage(op: unknown, localOpMetadata: IMapMessageLocalMetadata): boolean {\n\t\tif (isMapOperation(op)) {\n\t\t\tthis.messageHandler.resubmit(op, localOpMetadata);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic tryApplyStashedOp(op: unknown): boolean {\n\t\tif (isMapOperation(op)) {\n\t\t\tconst { value, key } = op;\n\t\t\tconst map = this.get(key);\n\n\t\t\tswitch (value.opName) {\n\t\t\t\tcase \"add\": {\n\t\t\t\t\tmap.add({\n\t\t\t\t\t\t// Todo: we should improve typing so we know add ops always have start and end\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tstart: toSequencePlace(value.value.start!, value.value.startSide),\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tend: toSequencePlace(value.value.end!, value.value.endSide),\n\t\t\t\t\t\tprops: value.value.properties,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcase \"change\": {\n\t\t\t\t\tconst { [reservedIntervalIdKey]: id, ...props } = value.value.properties ?? {};\n\t\t\t\t\tmap.change(id, {\n\t\t\t\t\t\tstart: toOptionalSequencePlace(value.value.start, value.value.startSide),\n\t\t\t\t\t\tend: toOptionalSequencePlace(value.value.end, value.value.endSide),\n\t\t\t\t\t\tprops,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst { [reservedIntervalIdKey]: id } = value.value.properties ?? {};\n\t\t\t\t\tmap.removeIntervalById(id);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"unknown ops should not be stashed\");\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Process the given op if a handler is registered.\n\t * @param message - The message to process\n\t * @param local - Whether the message originated from the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t * @returns True if the operation was processed, false otherwise.\n\t */\n\tpublic tryProcessMessage(\n\t\top: unknown,\n\t\tlocal: boolean,\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocalOpMetadata: unknown,\n\t): boolean {\n\t\tif (isMapOperation(op)) {\n\t\t\tthis.messageHandler.process(\n\t\t\t\top,\n\t\t\t\tlocal,\n\t\t\t\tmessage,\n\t\t\t\tlocalOpMetadata as IMapMessageLocalMetadata,\n\t\t\t);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Initializes a default ValueType at the provided key.\n\t * Should be used when a map operation incurs creation.\n\t * @param key - The key being initialized\n\t * @param local - Whether the message originated from the local client\n\t */\n\tprivate createCore(key: string, local: boolean): IntervalCollectionTypeLocalValue<T> {\n\t\tconst localValue = new IntervalCollectionTypeLocalValue(\n\t\t\tthis.type.factory.load(this.makeMapValueOpEmitter(key), undefined, this.options),\n\t\t\tthis.type,\n\t\t);\n\t\tconst previousValue = this.data.get(key);\n\t\tthis.data.set(key, localValue);\n\t\tconst event: IValueChanged = { key, previousValue };\n\t\tthis.eventEmitter.emit(\"create\", event, local, this.eventEmitter);\n\t\treturn localValue;\n\t}\n\n\t/**\n\t * The remote ISerializableValue we're receiving (either as a result of a load or an incoming set op) will\n\t * have the information we need to create a real object, but will not be the real object yet. For example,\n\t * we might know it's a map and the map's ID but not have the actual map or its data yet. makeLocal's\n\t * job is to convert that information into a real object for local usage.\n\t * @param key - The key that the caller intends to store the local value into (used for ops later). But\n\t * doesn't actually store the local value into that key. So better not lie!\n\t * @param serializable - The remote information that we can convert into a real object\n\t * @returns The local value that was produced\n\t */\n\tprivate makeLocal(\n\t\tkey: string,\n\t\tserializable: ISerializableIntervalCollection,\n\t): IntervalCollectionTypeLocalValue<T> {\n\t\tassert(\n\t\t\tserializable.type !== ValueType[ValueType.Plain] &&\n\t\t\t\tserializable.type !== ValueType[ValueType.Shared],\n\t\t\t0x2e1 /* \"Support for plain value types removed.\" */,\n\t\t);\n\n\t\tconst localValue = this.type.factory.load(\n\t\t\tthis.makeMapValueOpEmitter(key),\n\t\t\tserializable.value,\n\t\t\tthis.options,\n\t\t);\n\t\treturn new IntervalCollectionTypeLocalValue(localValue, this.type);\n\t}\n\n\t/**\n\t * Create an emitter for a value type to emit ops from the given key.\n\t * @param key - The key of the map that the value type will be stored on\n\t * @returns A value op emitter for the given key\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate makeMapValueOpEmitter(key: string): IValueOpEmitter {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst emit: IValueOpEmitter[\"emit\"] = (\n\t\t\topName: IntervalDeltaOpType,\n\t\t\tpreviousValue: unknown,\n\t\t\tparams: SerializedIntervalDelta,\n\t\t\tlocalOpMetadata: IMapMessageLocalMetadata,\n\t\t): void => {\n\t\t\tconst op: IMapOperation = {\n\t\t\t\tkey,\n\t\t\t\ttype: \"act\",\n\t\t\t\tvalue: {\n\t\t\t\t\topName,\n\t\t\t\t\tvalue: params,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.submitMessage(op, localOpMetadata);\n\n\t\t\tconst event: IValueChanged = { key, previousValue };\n\t\t\tthis.eventEmitter.emit(\"valueChanged\", event, true, null, this.eventEmitter);\n\t\t};\n\n\t\treturn { emit };\n\t}\n}\n"]}
@@ -5,7 +5,8 @@
5
5
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
6
  import { ISharedObjectEvents } from "@fluidframework/shared-object-base";
7
7
  import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
8
- import { ISerializedInterval, IntervalOpType, SerializedIntervalDelta, IntervalDeltaOpType } from "./intervals/index.mjs";
8
+ import { ISerializedInterval, IntervalOpType, SerializedIntervalDelta, IntervalDeltaOpType, type ISerializableInterval } from "./intervals/index.js";
9
+ import type { IntervalCollection } from "./intervalCollection.js";
9
10
  /**
10
11
  * Type of "valueChanged" event parameter.
11
12
  */
@@ -75,30 +76,28 @@ export interface SequenceOptions {
75
76
  * A value factory is used to serialize/deserialize value types to a map
76
77
  * @alpha
77
78
  */
78
- export interface IValueFactory<T> {
79
+ export interface IIntervalCollectionFactory<T extends ISerializableInterval> {
79
80
  /**
80
81
  * Create a new value type. Used both in creation of new value types, as well as in loading existing ones
81
82
  * from remote.
82
83
  * @param emitter - Emitter object that the created value type will use to emit operations
83
84
  * @param raw - Initialization parameters as defined by the value type
84
85
  * @returns The new value type
85
- * @alpha
86
86
  */
87
- load(emitter: IValueOpEmitter, raw: any, options?: Partial<SequenceOptions>): T;
87
+ load(emitter: IValueOpEmitter, raw: any, options?: Partial<SequenceOptions>): IntervalCollection<T>;
88
88
  /**
89
89
  * Given a value type, provides a JSONable form of its data to be used for snapshotting. This data must be
90
90
  * loadable using the load method of its factory.
91
91
  * @param value - The value type to serialize
92
92
  * @returns The JSONable form of the value type
93
- * @alpha
94
93
  */
95
- store(value: T): any;
94
+ store(value: IntervalCollection<T>): any;
96
95
  }
97
96
  /**
98
97
  * Defines an operation that a value type is able to handle.
99
98
  * @alpha
100
99
  */
101
- export interface IValueOperation<T> {
100
+ export interface IIntervalCollectionOperation<T extends ISerializableInterval> {
102
101
  /**
103
102
  * Performs the actual processing on the incoming operation.
104
103
  * @param value - The current value stored at the given key, which should be the value type
@@ -106,9 +105,8 @@ export interface IValueOperation<T> {
106
105
  * @param local - Whether the operation originated from this client
107
106
  * @param message - The operation itself
108
107
  * @param localOpMetadata - any local metadata submitted by `IValueOpEmitter.emit`.
109
- * @alpha
110
108
  */
111
- process(value: T, params: ISerializedInterval, local: boolean, message: ISequencedDocumentMessage | undefined, localOpMetadata: IMapMessageLocalMetadata | undefined): void;
109
+ process(value: IntervalCollection<T>, params: ISerializedInterval, local: boolean, message: ISequencedDocumentMessage | undefined, localOpMetadata: IMapMessageLocalMetadata | undefined): void;
112
110
  /**
113
111
  * Rebases an `op` on `value` from its original perspective (ref/local seq) to the current
114
112
  * perspective. Should be invoked on reconnection.
@@ -117,31 +115,27 @@ export interface IValueOperation<T> {
117
115
  * @param localOpMetadata - Any local metadata that was originally submitted with the op.
118
116
  * @returns A rebased version of the op and any local metadata that should be submitted with it.
119
117
  */
120
- rebase(value: T, op: IValueTypeOperationValue, localOpMetadata: IMapMessageLocalMetadata): {
121
- rebasedOp: IValueTypeOperationValue;
118
+ rebase(value: IntervalCollection<T>, op: IIntervalCollectionTypeOperationValue, localOpMetadata: IMapMessageLocalMetadata): {
119
+ rebasedOp: IIntervalCollectionTypeOperationValue;
122
120
  rebasedLocalOpMetadata: IMapMessageLocalMetadata;
123
121
  } | undefined;
124
- applyStashedOp(value: T, op: IValueTypeOperationValue): IMapMessageLocalMetadata;
125
122
  }
126
123
  /**
127
124
  * Defines a value type that can be registered on a container type.
128
125
  */
129
- export interface IValueType<T> {
126
+ export interface IIntervalCollectionType<T extends ISerializableInterval> {
130
127
  /**
131
128
  * Name of the value type.
132
- * @alpha
133
129
  */
134
130
  name: string;
135
131
  /**
136
132
  * Factory method used to convert to/from a JSON form of the type.
137
- * @alpha
138
133
  */
139
- factory: IValueFactory<T>;
134
+ factory: IIntervalCollectionFactory<T>;
140
135
  /**
141
136
  * Operations that can be applied to the value type.
142
- * @alpha
143
137
  */
144
- ops: Map<IntervalOpType, IValueOperation<T>>;
138
+ ops: Map<IntervalOpType, IIntervalCollectionOperation<T>>;
145
139
  }
146
140
  export interface ISharedDefaultMapEvents extends ISharedObjectEvents {
147
141
  (event: "valueChanged" | "create", listener: (changed: IValueChanged, local: boolean, target: IEventThisPlaceHolder) => void): void;
@@ -157,7 +151,7 @@ export interface ISharedDefaultMapEvents extends ISharedObjectEvents {
157
151
  * The DefaultMap implementation for sequence has been specialized to only support a single ValueType, which serializes
158
152
  * and deserializes via .store() and .load().
159
153
  */
160
- export interface ISerializableValue {
154
+ export interface ISerializableIntervalCollection {
161
155
  /**
162
156
  * A type annotation to help indicate how the value serializes.
163
157
  */
@@ -167,7 +161,7 @@ export interface ISerializableValue {
167
161
  */
168
162
  value: any;
169
163
  }
170
- export interface ISerializedValue {
164
+ export interface ISerializedIntervalCollection {
171
165
  /**
172
166
  * A type annotation to help indicate how the value serializes.
173
167
  */
@@ -186,7 +180,7 @@ export interface ISerializedValue {
186
180
  * it just describes an operation to be applied to an already-in-memory value.
187
181
  * @alpha
188
182
  */
189
- export interface IValueTypeOperationValue {
183
+ export interface IIntervalCollectionTypeOperationValue {
190
184
  /**
191
185
  * The name of the operation.
192
186
  */
@@ -196,4 +190,4 @@ export interface IValueTypeOperationValue {
196
190
  */
197
191
  value: SerializedIntervalDelta;
198
192
  }
199
- //# sourceMappingURL=defaultMapInterfaces.d.mts.map
193
+ //# sourceMappingURL=intervalCollectionMapInterfaces.d.ts.map