@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
@@ -3,18 +3,20 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert } from "@fluidframework/common-utils";
6
+ import { assert } from "@fluidframework/core-utils";
7
7
  import {
8
- Client,
9
- IMergeTreeDeltaCallbackArgs,
10
- IMergeTreeDeltaOpArgs,
11
- IMergeTreeMaintenanceCallbackArgs,
12
- ISegment,
13
- MergeTreeDeltaOperationType,
14
- MergeTreeDeltaOperationTypes,
15
- MergeTreeMaintenanceType,
16
- PropertySet,
17
- SortedSegmentSet,
8
+ // eslint-disable-next-line import/no-deprecated
9
+ Client,
10
+ IMergeTreeDeltaCallbackArgs,
11
+ IMergeTreeDeltaOpArgs,
12
+ IMergeTreeMaintenanceCallbackArgs,
13
+ ISegment,
14
+ MergeTreeDeltaOperationType,
15
+ MergeTreeDeltaOperationTypes,
16
+ MergeTreeMaintenanceType,
17
+ PropertySet,
18
+ // eslint-disable-next-line import/no-deprecated
19
+ SortedSegmentSet,
18
20
  } from "@fluidframework/merge-tree";
19
21
 
20
22
  /**
@@ -23,79 +25,81 @@ import {
23
25
  * The properties of this object and its sub-objects represent the state of the sequence at the
24
26
  * point in time at which the operation was applied.
25
27
  * They will not take into any future modifications performed to the underlying sequence and merge tree.
28
+ * @alpha
26
29
  */
27
- export abstract class SequenceEvent<TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes> {
28
- /**
29
- * @deprecated - Events no longer fire when the change they correspond to had no impact (e.g. a remote delete
30
- * event for a range that had already been deleted locally).
31
- * Clients can therefore assume this property is false.
32
- */
33
- public readonly isEmpty: boolean;
34
- public readonly deltaOperation: TOperation;
35
- private readonly sortedRanges: Lazy<SortedSegmentSet<ISequenceDeltaRange<TOperation>>>;
36
- private readonly pFirst: Lazy<ISequenceDeltaRange<TOperation>>;
37
- private readonly pLast: Lazy<ISequenceDeltaRange<TOperation>>;
38
-
39
- constructor(
40
- public readonly deltaArgs: IMergeTreeDeltaCallbackArgs<TOperation>,
41
- private readonly mergeTreeClient: Client,
42
- ) {
43
- assert(deltaArgs.deltaSegments.length > 0, 0x2d8 /* "Empty change event should not be emitted." */);
44
- this.isEmpty = false;
45
- this.deltaOperation = deltaArgs.operation;
46
-
47
- this.sortedRanges = new Lazy<SortedSegmentSet<ISequenceDeltaRange<TOperation>>>(
48
- () => {
49
- const set = new SortedSegmentSet<ISequenceDeltaRange<TOperation>>();
50
- this.deltaArgs.deltaSegments.forEach((delta) => {
51
- const newRange: ISequenceDeltaRange<TOperation> = {
52
- operation: this.deltaArgs.operation,
53
- position: this.mergeTreeClient.getPosition(delta.segment),
54
- propertyDeltas: delta.propertyDeltas,
55
- segment: delta.segment,
56
- };
57
- set.addOrUpdate(newRange);
58
- });
59
- return set;
60
- });
61
-
62
- this.pFirst = new Lazy<ISequenceDeltaRange<TOperation>>(
63
- () => this.sortedRanges.value.items[0],
64
- );
65
-
66
- this.pLast = new Lazy<ISequenceDeltaRange<TOperation>>(
67
- () => this.sortedRanges.value.items[this.sortedRanges.value.size - 1],
68
- );
69
- }
70
-
71
- /**
72
- * The in-order ranges affected by this delta.
73
- * These may not be continuous.
74
- */
75
- public get ranges(): readonly Readonly<ISequenceDeltaRange<TOperation>>[] {
76
- return this.sortedRanges.value.items;
77
- }
78
-
79
- /**
80
- * The client id of the client that made the change which caused the delta event
81
- */
82
- public get clientId(): string {
83
- return this.mergeTreeClient.longClientId;
84
- }
85
-
86
- /**
87
- * The first of the modified ranges.
88
- */
89
- public get first(): Readonly<ISequenceDeltaRange<TOperation>> {
90
- return this.pFirst.value;
91
- }
92
-
93
- /**
94
- * The last of the modified ranges.
95
- */
96
- public get last(): Readonly<ISequenceDeltaRange<TOperation>> {
97
- return this.pLast.value;
98
- }
30
+ export abstract class SequenceEvent<
31
+ TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes,
32
+ > {
33
+ public readonly deltaOperation: TOperation;
34
+ // eslint-disable-next-line import/no-deprecated
35
+ private readonly sortedRanges: Lazy<SortedSegmentSet<ISequenceDeltaRange<TOperation>>>;
36
+ private readonly pFirst: Lazy<ISequenceDeltaRange<TOperation>>;
37
+ private readonly pLast: Lazy<ISequenceDeltaRange<TOperation>>;
38
+
39
+ constructor(
40
+ public readonly deltaArgs: IMergeTreeDeltaCallbackArgs<TOperation>,
41
+ // eslint-disable-next-line import/no-deprecated
42
+ private readonly mergeTreeClient: Client,
43
+ ) {
44
+ assert(
45
+ deltaArgs.deltaSegments.length > 0,
46
+ 0x2d8 /* "Empty change event should not be emitted." */,
47
+ );
48
+ this.deltaOperation = deltaArgs.operation;
49
+
50
+ // eslint-disable-next-line import/no-deprecated
51
+ this.sortedRanges = new Lazy<SortedSegmentSet<ISequenceDeltaRange<TOperation>>>(() => {
52
+ // eslint-disable-next-line import/no-deprecated
53
+ const set = new SortedSegmentSet<ISequenceDeltaRange<TOperation>>();
54
+ this.deltaArgs.deltaSegments.forEach((delta) => {
55
+ const newRange: ISequenceDeltaRange<TOperation> = {
56
+ operation: this.deltaArgs.operation,
57
+ position: this.mergeTreeClient.getPosition(delta.segment),
58
+ propertyDeltas: delta.propertyDeltas ?? {},
59
+ segment: delta.segment,
60
+ };
61
+ set.addOrUpdate(newRange);
62
+ });
63
+ return set;
64
+ });
65
+
66
+ this.pFirst = new Lazy<ISequenceDeltaRange<TOperation>>(
67
+ () => this.sortedRanges.value.items[0],
68
+ );
69
+
70
+ this.pLast = new Lazy<ISequenceDeltaRange<TOperation>>(
71
+ () => this.sortedRanges.value.items[this.sortedRanges.value.size - 1],
72
+ );
73
+ }
74
+
75
+ /**
76
+ * The in-order ranges affected by this delta.
77
+ * These may not be continuous.
78
+ */
79
+ public get ranges(): readonly Readonly<ISequenceDeltaRange<TOperation>>[] {
80
+ return this.sortedRanges.value.items;
81
+ }
82
+
83
+ /**
84
+ * The client id of the client that made the change which caused the delta event
85
+ */
86
+ public get clientId(): string | undefined {
87
+ return this.mergeTreeClient.longClientId;
88
+ }
89
+
90
+ /**
91
+ * The first of the modified ranges.
92
+ */
93
+ public get first(): Readonly<ISequenceDeltaRange<TOperation>> {
94
+ return this.pFirst.value;
95
+ }
96
+
97
+ /**
98
+ * The last of the modified ranges.
99
+ */
100
+ public get last(): Readonly<ISequenceDeltaRange<TOperation>> {
101
+ return this.pLast.value;
102
+ }
99
103
  }
100
104
 
101
105
  /**
@@ -108,21 +112,23 @@ export abstract class SequenceEvent<TOperation extends MergeTreeDeltaOperationTy
108
112
  * For group ops, each op will get its own event, and the group op property will be set on the op args.
109
113
  *
110
114
  * Ops may get multiple events. For instance, an insert-replace will get a remove then an insert event.
115
+ * @alpha
111
116
  */
112
117
  export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationType> {
113
- /**
114
- * Whether the event was caused by a locally-made change.
115
- */
116
- public readonly isLocal: boolean;
117
-
118
- constructor(
119
- public readonly opArgs: IMergeTreeDeltaOpArgs,
120
- deltaArgs: IMergeTreeDeltaCallbackArgs,
121
- mergeTreeClient: Client,
122
- ) {
123
- super(deltaArgs, mergeTreeClient);
124
- this.isLocal = opArgs.sequencedMessage === undefined;
125
- }
118
+ /**
119
+ * Whether the event was caused by a locally-made change.
120
+ */
121
+ public readonly isLocal: boolean;
122
+
123
+ constructor(
124
+ public readonly opArgs: IMergeTreeDeltaOpArgs,
125
+ deltaArgs: IMergeTreeDeltaCallbackArgs,
126
+ // eslint-disable-next-line import/no-deprecated
127
+ mergeTreeClient: Client,
128
+ ) {
129
+ super(deltaArgs, mergeTreeClient);
130
+ this.isLocal = opArgs.sequencedMessage === undefined;
131
+ }
126
132
  }
127
133
 
128
134
  /**
@@ -131,49 +137,76 @@ export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationTyp
131
137
  * The properties of this object and its sub-objects represent the state of the sequence at the
132
138
  * point in time at which the operation was applied.
133
139
  * They will not take into consideration any future modifications performed to the underlying sequence and merge tree.
140
+ * @alpha
134
141
  */
135
142
  export class SequenceMaintenanceEvent extends SequenceEvent<MergeTreeMaintenanceType> {
136
- constructor(
137
- public readonly opArgs: IMergeTreeDeltaOpArgs | undefined,
138
- deltaArgs: IMergeTreeMaintenanceCallbackArgs,
139
- mergeTreeClient: Client,
140
- ) {
141
- super(deltaArgs, mergeTreeClient);
142
- }
143
+ constructor(
144
+ public readonly opArgs: IMergeTreeDeltaOpArgs | undefined,
145
+ deltaArgs: IMergeTreeMaintenanceCallbackArgs,
146
+ // eslint-disable-next-line import/no-deprecated
147
+ mergeTreeClient: Client,
148
+ ) {
149
+ super(deltaArgs, mergeTreeClient);
150
+ }
143
151
  }
144
152
 
145
153
  /**
146
154
  * A range that has changed corresponding to a segment modification.
155
+ * @alpha
147
156
  */
148
- export interface ISequenceDeltaRange<TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes> {
149
- operation: TOperation;
150
- /**
151
- * The index of the start of the range.
152
- */
153
- position: number;
154
- /**
155
- * The segment that corresponds to the range.
156
- */
157
- segment: ISegment;
158
- propertyDeltas: PropertySet;
157
+ export interface ISequenceDeltaRange<
158
+ TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes,
159
+ > {
160
+ /**
161
+ * The type of operation that changed this range.
162
+ *
163
+ * @remarks Consuming code should typically compare this to the enum values defined in
164
+ * `MergeTreeDeltaOperationTypes`.
165
+ */
166
+ operation: TOperation;
167
+
168
+ /**
169
+ * The index of the start of the range.
170
+ */
171
+ position: number;
172
+
173
+ /**
174
+ * The segment that corresponds to the range.
175
+ */
176
+ segment: ISegment;
177
+
178
+ /**
179
+ * Deltas object which contains all modified properties with their previous values.
180
+ * Since `undefined` doesn't survive a round-trip through JSON serialization, the old value being absent
181
+ * is instead encoded with `null`.
182
+ *
183
+ * @remarks This object is motivated by undo/redo scenarios, and provides a convenient "inverse op" to apply to
184
+ * undo a property change.
185
+ *
186
+ * @example
187
+ *
188
+ * If a segment initially had properties `{ foo: "1", bar: 2 }` and it was annotated with
189
+ * `{ foo: 3, baz: 5 }`, the corresponding event would have a `propertyDeltas` of `{ foo: "1", baz: null }`.
190
+ */
191
+ propertyDeltas: PropertySet;
159
192
  }
160
193
 
161
194
  class Lazy<T> {
162
- private pValue: T;
163
- private pEvaluated: boolean;
164
- constructor(private readonly valueGenerator: () => T) {
165
- this.pEvaluated = false;
166
- }
167
-
168
- public get evaluated(): boolean {
169
- return this.pEvaluated;
170
- }
171
-
172
- public get value(): T {
173
- if (!this.pEvaluated) {
174
- this.pEvaluated = true;
175
- this.pValue = this.valueGenerator();
176
- }
177
- return this.pValue;
178
- }
195
+ private pValue: T | undefined;
196
+ private pEvaluated: boolean;
197
+ constructor(private readonly valueGenerator: () => T) {
198
+ this.pEvaluated = false;
199
+ }
200
+
201
+ public get evaluated(): boolean {
202
+ return this.pEvaluated;
203
+ }
204
+
205
+ public get value(): T {
206
+ if (!this.pEvaluated) {
207
+ this.pEvaluated = true;
208
+ this.pValue = this.valueGenerator();
209
+ }
210
+ return this.pValue as T;
211
+ }
179
212
  }
@@ -4,224 +4,68 @@
4
4
  */
5
5
 
6
6
  import {
7
- IChannelAttributes,
8
- IFluidDataStoreRuntime,
9
- IChannelServices,
10
- IChannelFactory,
7
+ IChannelAttributes,
8
+ IFluidDataStoreRuntime,
9
+ IChannelServices,
10
+ IChannelFactory,
11
11
  } from "@fluidframework/datastore-definitions";
12
- import {
13
- IJSONSegment,
14
- Marker,
15
- TextSegment,
16
- } from "@fluidframework/merge-tree";
17
- import { ISharedObject } from "@fluidframework/shared-object-base";
12
+ import { Marker, TextSegment } from "@fluidframework/merge-tree";
18
13
  import { pkgVersion } from "./packageVersion";
19
- import { SharedNumberSequence } from "./sharedNumberSequence";
20
- import { SharedObjectSequence } from "./sharedObjectSequence";
21
- import { IJSONRunSegment, SubSequence } from "./sharedSequence";
22
14
  import { SharedString, SharedStringSegment } from "./sharedString";
23
15
 
24
- export class SharedStringFactory implements IChannelFactory {
25
- // TODO rename back to https://graph.microsoft.com/types/mergeTree/string once paparazzi is able to dynamically
26
- // load code
27
- public static Type = "https://graph.microsoft.com/types/mergeTree";
28
-
29
- public static readonly Attributes: IChannelAttributes = {
30
- type: SharedStringFactory.Type,
31
- snapshotFormatVersion: "0.1",
32
- packageVersion: pkgVersion,
33
- };
34
-
35
- public static segmentFromSpec(spec: any): SharedStringSegment {
36
- const maybeText = TextSegment.fromJSONObject(spec);
37
- if (maybeText) { return maybeText; }
38
-
39
- const maybeMarker = Marker.fromJSONObject(spec);
40
- if (maybeMarker) { return maybeMarker; }
41
- }
42
-
43
- public get type() {
44
- return SharedStringFactory.Type;
45
- }
46
-
47
- public get attributes() {
48
- return SharedStringFactory.Attributes;
49
- }
50
-
51
- /**
52
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
53
- */
54
- public async load(
55
- runtime: IFluidDataStoreRuntime,
56
- id: string,
57
- services: IChannelServices,
58
- attributes: IChannelAttributes): Promise<SharedString> {
59
- const sharedString = new SharedString(runtime, id, attributes);
60
- await sharedString.load(services);
61
- return sharedString;
62
- }
63
-
64
- public create(document: IFluidDataStoreRuntime, id: string): SharedString {
65
- const sharedString = new SharedString(document, id, this.attributes);
66
- sharedString.initializeLocal();
67
- return sharedString;
68
- }
69
- }
70
-
71
- /**
72
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
73
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
74
- */
75
- export class SharedObjectSequenceFactory implements IChannelFactory {
76
- /**
77
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
78
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
79
- */
80
- public static Type = "https://graph.microsoft.com/types/mergeTree/object-sequence";
81
-
82
- /**
83
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
84
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
85
- */
86
- public static readonly Attributes: IChannelAttributes = {
87
- type: SharedObjectSequenceFactory.Type,
88
- snapshotFormatVersion: "0.1",
89
- packageVersion: pkgVersion,
90
- };
91
-
92
- /**
93
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
94
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
95
- */
96
- public static segmentFromSpec(segSpec: IJSONSegment) {
97
- const runSegment = segSpec as IJSONRunSegment<object>;
98
- if (runSegment.items) {
99
- const seg = new SubSequence<object>(runSegment.items);
100
- if (runSegment.props) {
101
- seg.addProperties(runSegment.props);
102
- }
103
- return seg;
104
- }
105
- }
106
-
107
- /**
108
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
109
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
110
- */
111
- public get type() {
112
- return SharedObjectSequenceFactory.Type;
113
- }
114
-
115
- /**
116
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
117
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
118
- */
119
- public get attributes() {
120
- return SharedObjectSequenceFactory.Attributes;
121
- }
122
-
123
- /**
124
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
125
- *
126
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
127
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
128
- */
129
- public async load(
130
- runtime: IFluidDataStoreRuntime,
131
- id: string,
132
- services: IChannelServices,
133
- attributes: IChannelAttributes): Promise<ISharedObject> {
134
- const sharedSeq = new SharedObjectSequence<object>(runtime, id, attributes);
135
- await sharedSeq.load(services);
136
- return sharedSeq;
137
- }
138
-
139
- /**
140
- * @deprecated SharedObjectSequence is not recommended for use and will be removed in an upcoming release.
141
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
142
- */
143
- public create(document: IFluidDataStoreRuntime, id: string): ISharedObject {
144
- const sharedString = new SharedObjectSequence(document, id, this.attributes);
145
- sharedString.initializeLocal();
146
- return sharedString;
147
- }
148
- }
149
-
150
16
  /**
151
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
152
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
17
+ * @alpha
153
18
  */
154
- export class SharedNumberSequenceFactory implements IChannelFactory {
155
- /**
156
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
157
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
158
- */
159
- public static Type = "https://graph.microsoft.com/types/mergeTree/number-sequence";
160
-
161
- /**
162
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
163
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
164
- */
165
- public static readonly Attributes: IChannelAttributes = {
166
- type: SharedNumberSequenceFactory.Type,
167
- snapshotFormatVersion: "0.1",
168
- packageVersion: pkgVersion,
169
- };
170
-
171
- /**
172
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
173
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
174
- */
175
- public static segmentFromSpec(segSpec: IJSONSegment) {
176
- const runSegment = segSpec as IJSONRunSegment<number>;
177
- if (runSegment.items) {
178
- const seg = new SubSequence<number>(runSegment.items);
179
- if (runSegment.props) {
180
- seg.addProperties(runSegment.props);
181
- }
182
- return seg;
183
- }
184
- }
185
-
186
- /**
187
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
188
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
189
- */
190
- public get type() {
191
- return SharedNumberSequenceFactory.Type;
192
- }
193
-
194
- /**
195
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
196
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
197
- */
198
- public get attributes() {
199
- return SharedNumberSequenceFactory.Attributes;
200
- }
201
-
202
- /**
203
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
204
- *
205
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
206
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
207
- */
208
- public async load(
209
- runtime: IFluidDataStoreRuntime,
210
- id: string,
211
- services: IChannelServices,
212
- attributes: IChannelAttributes): Promise<ISharedObject> {
213
- const sharedSeq = new SharedNumberSequence(runtime, id, attributes);
214
- await sharedSeq.load(services);
215
- return sharedSeq;
216
- }
217
-
218
- /**
219
- * @deprecated SharedNumberSequence is not recommended for use and will be removed in an upcoming release.
220
- * For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
221
- */
222
- public create(document: IFluidDataStoreRuntime, id: string): ISharedObject {
223
- const sharedString = new SharedNumberSequence(document, id, this.attributes);
224
- sharedString.initializeLocal();
225
- return sharedString;
226
- }
19
+ export class SharedStringFactory implements IChannelFactory {
20
+ // TODO rename back to https://graph.microsoft.com/types/mergeTree/string once paparazzi is able to dynamically
21
+ // load code (UPDATE: paparazzi is gone... anything to do here?)
22
+ public static Type = "https://graph.microsoft.com/types/mergeTree";
23
+
24
+ public static readonly Attributes: IChannelAttributes = {
25
+ type: SharedStringFactory.Type,
26
+ snapshotFormatVersion: "0.1",
27
+ packageVersion: pkgVersion,
28
+ };
29
+
30
+ public static segmentFromSpec(spec: any): SharedStringSegment {
31
+ const maybeText = TextSegment.fromJSONObject(spec);
32
+ if (maybeText) {
33
+ return maybeText;
34
+ }
35
+
36
+ const maybeMarker = Marker.fromJSONObject(spec);
37
+ if (maybeMarker) {
38
+ return maybeMarker;
39
+ }
40
+
41
+ throw new Error(`Unrecognized IJSONObject`);
42
+ }
43
+
44
+ public get type() {
45
+ return SharedStringFactory.Type;
46
+ }
47
+
48
+ public get attributes() {
49
+ return SharedStringFactory.Attributes;
50
+ }
51
+
52
+ /**
53
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
54
+ */
55
+ public async load(
56
+ runtime: IFluidDataStoreRuntime,
57
+ id: string,
58
+ services: IChannelServices,
59
+ attributes: IChannelAttributes,
60
+ ): Promise<SharedString> {
61
+ const sharedString = new SharedString(runtime, id, attributes);
62
+ await sharedString.load(services);
63
+ return sharedString;
64
+ }
65
+
66
+ public create(document: IFluidDataStoreRuntime, id: string): SharedString {
67
+ const sharedString = new SharedString(document, id, this.attributes);
68
+ sharedString.initializeLocal();
69
+ return sharedString;
70
+ }
227
71
  }