@fluidframework/routerlicious-driver 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (368) hide show
  1. package/.eslintrc.js +10 -12
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +156 -0
  4. package/README.md +39 -1
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/routerlicious-driver.api.md +108 -0
  9. package/dist/cache.cjs +30 -0
  10. package/dist/cache.cjs.map +1 -0
  11. package/dist/cache.d.ts +7 -0
  12. package/dist/cache.d.ts.map +1 -1
  13. package/dist/{definitions.js → contracts.cjs} +1 -1
  14. package/dist/contracts.cjs.map +1 -0
  15. package/dist/contracts.d.ts +42 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/{createNewUtils.js → createNewUtils.cjs} +7 -5
  18. package/dist/createNewUtils.cjs.map +1 -0
  19. package/dist/createNewUtils.d.ts +1 -1
  20. package/dist/createNewUtils.d.ts.map +1 -1
  21. package/dist/{defaultTokenProvider.js → defaultTokenProvider.cjs} +2 -1
  22. package/dist/defaultTokenProvider.cjs.map +1 -0
  23. package/dist/defaultTokenProvider.d.ts +1 -0
  24. package/dist/defaultTokenProvider.d.ts.map +1 -1
  25. package/dist/definitions.cjs +7 -0
  26. package/dist/definitions.cjs.map +1 -0
  27. package/dist/definitions.d.ts.map +1 -1
  28. package/dist/deltaStorageService.cjs +122 -0
  29. package/dist/deltaStorageService.cjs.map +1 -0
  30. package/dist/deltaStorageService.d.ts +7 -6
  31. package/dist/deltaStorageService.d.ts.map +1 -1
  32. package/dist/{documentDeltaConnection.js → documentDeltaConnection.cjs} +8 -13
  33. package/dist/documentDeltaConnection.cjs.map +1 -0
  34. package/dist/documentDeltaConnection.d.ts +3 -4
  35. package/dist/documentDeltaConnection.d.ts.map +1 -1
  36. package/dist/{documentService.js → documentService.cjs} +61 -64
  37. package/dist/documentService.cjs.map +1 -0
  38. package/dist/documentService.d.ts +12 -4
  39. package/dist/documentService.d.ts.map +1 -1
  40. package/dist/{documentServiceFactory.js → documentServiceFactory.cjs} +87 -33
  41. package/dist/documentServiceFactory.cjs.map +1 -0
  42. package/dist/documentServiceFactory.d.ts +5 -3
  43. package/dist/documentServiceFactory.d.ts.map +1 -1
  44. package/dist/{documentStorageService.js → documentStorageService.cjs} +18 -16
  45. package/dist/documentStorageService.cjs.map +1 -0
  46. package/dist/documentStorageService.d.ts +4 -3
  47. package/dist/documentStorageService.d.ts.map +1 -1
  48. package/dist/errorUtils.cjs +87 -0
  49. package/dist/errorUtils.cjs.map +1 -0
  50. package/dist/errorUtils.d.ts +56 -10
  51. package/dist/errorUtils.d.ts.map +1 -1
  52. package/dist/gitManager.cjs +46 -0
  53. package/dist/gitManager.cjs.map +1 -0
  54. package/dist/gitManager.d.ts +27 -0
  55. package/dist/gitManager.d.ts.map +1 -0
  56. package/dist/historian.cjs +72 -0
  57. package/dist/historian.cjs.map +1 -0
  58. package/dist/historian.d.ts +34 -0
  59. package/dist/historian.d.ts.map +1 -0
  60. package/dist/index.cjs +19 -0
  61. package/dist/index.cjs.map +1 -0
  62. package/dist/index.d.ts +5 -8
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/mapWithExpiration.cjs +105 -0
  65. package/dist/mapWithExpiration.cjs.map +1 -0
  66. package/dist/mapWithExpiration.d.ts +34 -0
  67. package/dist/mapWithExpiration.d.ts.map +1 -0
  68. package/dist/{nullBlobStorageService.js → nullBlobStorageService.cjs} +5 -5
  69. package/dist/nullBlobStorageService.cjs.map +1 -0
  70. package/dist/nullBlobStorageService.d.ts.map +1 -1
  71. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  72. package/dist/packageVersion.cjs.map +1 -0
  73. package/dist/packageVersion.d.ts +1 -1
  74. package/dist/packageVersion.d.ts.map +1 -1
  75. package/dist/{policies.js → policies.cjs} +1 -1
  76. package/dist/policies.cjs.map +1 -0
  77. package/dist/policies.d.ts +22 -9
  78. package/dist/policies.d.ts.map +1 -1
  79. package/dist/r11sSnapshotParser.cjs +73 -0
  80. package/dist/r11sSnapshotParser.cjs.map +1 -0
  81. package/dist/r11sSnapshotParser.d.ts +14 -0
  82. package/dist/r11sSnapshotParser.d.ts.map +1 -0
  83. package/dist/restWrapper.cjs +249 -0
  84. package/dist/restWrapper.cjs.map +1 -0
  85. package/dist/restWrapper.d.ts +32 -12
  86. package/dist/restWrapper.d.ts.map +1 -1
  87. package/dist/restWrapperBase.cjs +89 -0
  88. package/dist/restWrapperBase.cjs.map +1 -0
  89. package/dist/restWrapperBase.d.ts +26 -0
  90. package/dist/restWrapperBase.d.ts.map +1 -0
  91. package/dist/retriableGitManager.cjs +40 -0
  92. package/dist/retriableGitManager.cjs.map +1 -0
  93. package/dist/retriableGitManager.d.ts +13 -23
  94. package/dist/retriableGitManager.d.ts.map +1 -1
  95. package/dist/routerlicious-driver-alpha.d.ts +92 -0
  96. package/dist/routerlicious-driver-beta.d.ts +98 -0
  97. package/dist/routerlicious-driver-public.d.ts +98 -0
  98. package/dist/routerlicious-driver-untrimmed.d.ts +261 -0
  99. package/dist/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.cjs} +41 -34
  100. package/dist/shreddedSummaryDocumentStorageService.cjs.map +1 -0
  101. package/dist/shreddedSummaryDocumentStorageService.d.ts +6 -5
  102. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  103. package/dist/storageContracts.cjs +7 -0
  104. package/dist/storageContracts.cjs.map +1 -0
  105. package/dist/storageContracts.d.ts +45 -0
  106. package/dist/storageContracts.d.ts.map +1 -0
  107. package/dist/summaryTreeUploadManager.cjs +110 -0
  108. package/dist/summaryTreeUploadManager.cjs.map +1 -0
  109. package/dist/summaryTreeUploadManager.d.ts +23 -0
  110. package/dist/summaryTreeUploadManager.d.ts.map +1 -0
  111. package/dist/{tokens.js → tokens.cjs} +1 -1
  112. package/dist/tokens.cjs.map +1 -0
  113. package/dist/tokens.d.ts +34 -5
  114. package/dist/tokens.d.ts.map +1 -1
  115. package/dist/treeUtils.cjs +107 -0
  116. package/dist/treeUtils.cjs.map +1 -0
  117. package/dist/treeUtils.d.ts +58 -0
  118. package/dist/treeUtils.d.ts.map +1 -0
  119. package/dist/tsdoc-metadata.json +11 -0
  120. package/dist/{urlUtils.js → urlUtils.cjs} +21 -25
  121. package/dist/urlUtils.cjs.map +1 -0
  122. package/dist/urlUtils.d.ts +2 -2
  123. package/dist/urlUtils.d.ts.map +1 -1
  124. package/dist/wholeSummaryDocumentStorageService.cjs +253 -0
  125. package/dist/wholeSummaryDocumentStorageService.cjs.map +1 -0
  126. package/dist/wholeSummaryDocumentStorageService.d.ts +10 -8
  127. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  128. package/dist/wholeSummaryUploadManager.cjs +37 -0
  129. package/dist/wholeSummaryUploadManager.cjs.map +1 -0
  130. package/dist/wholeSummaryUploadManager.d.ts +16 -0
  131. package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
  132. package/lib/{cache.d.ts → cache.d.mts} +8 -1
  133. package/lib/cache.d.mts.map +1 -0
  134. package/lib/cache.mjs +25 -0
  135. package/lib/cache.mjs.map +1 -0
  136. package/lib/contracts.d.mts +42 -0
  137. package/lib/contracts.d.mts.map +1 -0
  138. package/lib/{definitions.js → contracts.mjs} +1 -1
  139. package/lib/contracts.mjs.map +1 -0
  140. package/lib/{createNewUtils.d.ts → createNewUtils.d.mts} +2 -2
  141. package/lib/createNewUtils.d.mts.map +1 -0
  142. package/lib/{createNewUtils.js → createNewUtils.mjs} +7 -5
  143. package/lib/createNewUtils.mjs.map +1 -0
  144. package/lib/{defaultTokenProvider.d.ts → defaultTokenProvider.d.mts} +3 -2
  145. package/lib/defaultTokenProvider.d.mts.map +1 -0
  146. package/lib/{defaultTokenProvider.js → defaultTokenProvider.mjs} +2 -1
  147. package/lib/defaultTokenProvider.mjs.map +1 -0
  148. package/lib/{definitions.d.ts → definitions.d.mts} +1 -1
  149. package/lib/definitions.d.mts.map +1 -0
  150. package/lib/definitions.mjs +6 -0
  151. package/{dist/definitions.js.map → lib/definitions.mjs.map} +1 -1
  152. package/lib/{deltaStorageService.d.ts → deltaStorageService.d.mts} +9 -8
  153. package/lib/deltaStorageService.d.mts.map +1 -0
  154. package/lib/deltaStorageService.mjs +117 -0
  155. package/lib/deltaStorageService.mjs.map +1 -0
  156. package/lib/{documentDeltaConnection.d.ts → documentDeltaConnection.d.mts} +4 -5
  157. package/lib/documentDeltaConnection.d.mts.map +1 -0
  158. package/lib/{documentDeltaConnection.js → documentDeltaConnection.mjs} +8 -13
  159. package/lib/documentDeltaConnection.mjs.map +1 -0
  160. package/lib/{documentService.d.ts → documentService.d.mts} +17 -9
  161. package/lib/documentService.d.mts.map +1 -0
  162. package/lib/{documentService.js → documentService.mjs} +60 -44
  163. package/lib/documentService.mjs.map +1 -0
  164. package/lib/{documentServiceFactory.d.ts → documentServiceFactory.d.mts} +8 -6
  165. package/lib/documentServiceFactory.d.mts.map +1 -0
  166. package/lib/{documentServiceFactory.js → documentServiceFactory.mjs} +88 -34
  167. package/lib/documentServiceFactory.mjs.map +1 -0
  168. package/lib/{documentStorageService.d.ts → documentStorageService.d.mts} +8 -7
  169. package/lib/documentStorageService.d.mts.map +1 -0
  170. package/lib/{documentStorageService.js → documentStorageService.mjs} +19 -17
  171. package/lib/documentStorageService.mjs.map +1 -0
  172. package/lib/errorUtils.d.mts +93 -0
  173. package/lib/errorUtils.d.mts.map +1 -0
  174. package/lib/errorUtils.mjs +81 -0
  175. package/lib/errorUtils.mjs.map +1 -0
  176. package/lib/gitManager.d.mts +27 -0
  177. package/lib/gitManager.d.mts.map +1 -0
  178. package/lib/gitManager.mjs +42 -0
  179. package/lib/gitManager.mjs.map +1 -0
  180. package/lib/historian.d.mts +34 -0
  181. package/lib/historian.d.mts.map +1 -0
  182. package/lib/historian.mjs +67 -0
  183. package/lib/historian.mjs.map +1 -0
  184. package/lib/index.d.mts +10 -0
  185. package/lib/index.d.mts.map +1 -0
  186. package/lib/index.mjs +8 -0
  187. package/lib/index.mjs.map +1 -0
  188. package/lib/mapWithExpiration.d.mts +34 -0
  189. package/lib/mapWithExpiration.d.mts.map +1 -0
  190. package/lib/mapWithExpiration.mjs +101 -0
  191. package/lib/mapWithExpiration.mjs.map +1 -0
  192. package/lib/{nullBlobStorageService.d.ts → nullBlobStorageService.d.mts} +1 -1
  193. package/lib/nullBlobStorageService.d.mts.map +1 -0
  194. package/lib/{nullBlobStorageService.js → nullBlobStorageService.mjs} +5 -5
  195. package/lib/nullBlobStorageService.mjs.map +1 -0
  196. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  197. package/lib/packageVersion.d.mts.map +1 -0
  198. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  199. package/lib/packageVersion.mjs.map +1 -0
  200. package/lib/{policies.d.ts → policies.d.mts} +23 -10
  201. package/lib/policies.d.mts.map +1 -0
  202. package/lib/{policies.js → policies.mjs} +1 -1
  203. package/lib/policies.mjs.map +1 -0
  204. package/lib/r11sSnapshotParser.d.mts +14 -0
  205. package/lib/r11sSnapshotParser.d.mts.map +1 -0
  206. package/lib/r11sSnapshotParser.mjs +69 -0
  207. package/lib/r11sSnapshotParser.mjs.map +1 -0
  208. package/lib/restWrapper.d.mts +53 -0
  209. package/lib/restWrapper.d.mts.map +1 -0
  210. package/lib/restWrapper.mjs +236 -0
  211. package/lib/restWrapper.mjs.map +1 -0
  212. package/lib/restWrapperBase.d.mts +26 -0
  213. package/lib/restWrapperBase.d.mts.map +1 -0
  214. package/lib/restWrapperBase.mjs +84 -0
  215. package/lib/restWrapperBase.mjs.map +1 -0
  216. package/lib/retriableGitManager.d.mts +24 -0
  217. package/lib/retriableGitManager.d.mts.map +1 -0
  218. package/lib/retriableGitManager.mjs +36 -0
  219. package/lib/retriableGitManager.mjs.map +1 -0
  220. package/lib/routerlicious-driver-alpha.d.mts +92 -0
  221. package/lib/routerlicious-driver-beta.d.mts +98 -0
  222. package/lib/routerlicious-driver-public.d.mts +98 -0
  223. package/lib/routerlicious-driver-untrimmed.d.mts +261 -0
  224. package/lib/{shreddedSummaryDocumentStorageService.d.ts → shreddedSummaryDocumentStorageService.d.mts} +10 -9
  225. package/lib/shreddedSummaryDocumentStorageService.d.mts.map +1 -0
  226. package/lib/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.mjs} +41 -34
  227. package/lib/shreddedSummaryDocumentStorageService.mjs.map +1 -0
  228. package/lib/storageContracts.d.mts +45 -0
  229. package/lib/storageContracts.d.mts.map +1 -0
  230. package/lib/storageContracts.mjs +6 -0
  231. package/lib/storageContracts.mjs.map +1 -0
  232. package/lib/summaryTreeUploadManager.d.mts +23 -0
  233. package/lib/summaryTreeUploadManager.d.mts.map +1 -0
  234. package/lib/summaryTreeUploadManager.mjs +106 -0
  235. package/lib/summaryTreeUploadManager.mjs.map +1 -0
  236. package/lib/{tokens.d.ts → tokens.d.mts} +35 -6
  237. package/lib/tokens.d.mts.map +1 -0
  238. package/lib/{tokens.js → tokens.mjs} +1 -1
  239. package/lib/tokens.mjs.map +1 -0
  240. package/lib/treeUtils.d.mts +58 -0
  241. package/lib/treeUtils.d.mts.map +1 -0
  242. package/lib/treeUtils.mjs +100 -0
  243. package/lib/treeUtils.mjs.map +1 -0
  244. package/lib/{urlUtils.d.ts → urlUtils.d.mts} +3 -3
  245. package/lib/urlUtils.d.mts.map +1 -0
  246. package/lib/urlUtils.mjs +38 -0
  247. package/lib/urlUtils.mjs.map +1 -0
  248. package/lib/{wholeSummaryDocumentStorageService.d.ts → wholeSummaryDocumentStorageService.d.mts} +13 -11
  249. package/lib/wholeSummaryDocumentStorageService.d.mts.map +1 -0
  250. package/lib/wholeSummaryDocumentStorageService.mjs +249 -0
  251. package/lib/wholeSummaryDocumentStorageService.mjs.map +1 -0
  252. package/lib/wholeSummaryUploadManager.d.mts +16 -0
  253. package/lib/wholeSummaryUploadManager.d.mts.map +1 -0
  254. package/lib/wholeSummaryUploadManager.mjs +33 -0
  255. package/lib/wholeSummaryUploadManager.mjs.map +1 -0
  256. package/package.json +142 -68
  257. package/prettier.config.cjs +8 -0
  258. package/src/cache.ts +25 -9
  259. package/src/contracts.ts +60 -0
  260. package/src/createNewUtils.ts +26 -24
  261. package/src/defaultTokenProvider.ts +14 -15
  262. package/src/definitions.ts +2 -2
  263. package/src/deltaStorageService.ts +145 -91
  264. package/src/documentDeltaConnection.ts +54 -52
  265. package/src/documentService.ts +272 -242
  266. package/src/documentServiceFactory.ts +338 -237
  267. package/src/documentStorageService.ts +92 -84
  268. package/src/errorUtils.ts +117 -79
  269. package/src/gitManager.ts +67 -0
  270. package/src/historian.ts +121 -0
  271. package/src/index.ts +15 -8
  272. package/src/mapWithExpiration.ts +124 -0
  273. package/src/nullBlobStorageService.ts +24 -21
  274. package/src/packageVersion.ts +1 -1
  275. package/src/policies.ts +51 -38
  276. package/src/r11sSnapshotParser.ts +82 -0
  277. package/src/restWrapper.ts +400 -216
  278. package/src/restWrapperBase.ts +146 -0
  279. package/src/retriableGitManager.ts +76 -153
  280. package/src/shreddedSummaryDocumentStorageService.ts +214 -195
  281. package/src/storageContracts.ts +63 -0
  282. package/src/summaryTreeUploadManager.ts +155 -0
  283. package/src/tokens.ts +74 -39
  284. package/src/treeUtils.ts +138 -0
  285. package/src/urlUtils.ts +27 -28
  286. package/src/wholeSummaryDocumentStorageService.ts +352 -252
  287. package/src/wholeSummaryUploadManager.ts +64 -0
  288. package/tsc-multi.test.json +4 -0
  289. package/tsconfig.json +10 -13
  290. package/dist/cache.js +0 -20
  291. package/dist/cache.js.map +0 -1
  292. package/dist/createNewUtils.js.map +0 -1
  293. package/dist/defaultTokenProvider.js.map +0 -1
  294. package/dist/deltaStorageService.js +0 -82
  295. package/dist/deltaStorageService.js.map +0 -1
  296. package/dist/documentDeltaConnection.js.map +0 -1
  297. package/dist/documentService.js.map +0 -1
  298. package/dist/documentServiceFactory.js.map +0 -1
  299. package/dist/documentStorageService.js.map +0 -1
  300. package/dist/errorUtils.js +0 -56
  301. package/dist/errorUtils.js.map +0 -1
  302. package/dist/index.js +0 -25
  303. package/dist/index.js.map +0 -1
  304. package/dist/nullBlobStorageService.js.map +0 -1
  305. package/dist/packageVersion.js.map +0 -1
  306. package/dist/policies.js.map +0 -1
  307. package/dist/restWrapper.js +0 -153
  308. package/dist/restWrapper.js.map +0 -1
  309. package/dist/retriableGitManager.js +0 -76
  310. package/dist/retriableGitManager.js.map +0 -1
  311. package/dist/shreddedSummaryDocumentStorageService.js.map +0 -1
  312. package/dist/tokens.js.map +0 -1
  313. package/dist/urlUtils.js.map +0 -1
  314. package/dist/wholeSummaryDocumentStorageService.js +0 -191
  315. package/dist/wholeSummaryDocumentStorageService.js.map +0 -1
  316. package/lib/cache.d.ts.map +0 -1
  317. package/lib/cache.js +0 -16
  318. package/lib/cache.js.map +0 -1
  319. package/lib/createNewUtils.d.ts.map +0 -1
  320. package/lib/createNewUtils.js.map +0 -1
  321. package/lib/defaultTokenProvider.d.ts.map +0 -1
  322. package/lib/defaultTokenProvider.js.map +0 -1
  323. package/lib/definitions.d.ts.map +0 -1
  324. package/lib/definitions.js.map +0 -1
  325. package/lib/deltaStorageService.d.ts.map +0 -1
  326. package/lib/deltaStorageService.js +0 -77
  327. package/lib/deltaStorageService.js.map +0 -1
  328. package/lib/documentDeltaConnection.d.ts.map +0 -1
  329. package/lib/documentDeltaConnection.js.map +0 -1
  330. package/lib/documentService.d.ts.map +0 -1
  331. package/lib/documentService.js.map +0 -1
  332. package/lib/documentServiceFactory.d.ts.map +0 -1
  333. package/lib/documentServiceFactory.js.map +0 -1
  334. package/lib/documentStorageService.d.ts.map +0 -1
  335. package/lib/documentStorageService.js.map +0 -1
  336. package/lib/errorUtils.d.ts +0 -47
  337. package/lib/errorUtils.d.ts.map +0 -1
  338. package/lib/errorUtils.js +0 -50
  339. package/lib/errorUtils.js.map +0 -1
  340. package/lib/index.d.ts +0 -13
  341. package/lib/index.d.ts.map +0 -1
  342. package/lib/index.js +0 -13
  343. package/lib/index.js.map +0 -1
  344. package/lib/nullBlobStorageService.d.ts.map +0 -1
  345. package/lib/nullBlobStorageService.js.map +0 -1
  346. package/lib/packageVersion.d.ts.map +0 -1
  347. package/lib/packageVersion.js.map +0 -1
  348. package/lib/policies.d.ts.map +0 -1
  349. package/lib/policies.js.map +0 -1
  350. package/lib/restWrapper.d.ts +0 -33
  351. package/lib/restWrapper.d.ts.map +0 -1
  352. package/lib/restWrapper.js +0 -144
  353. package/lib/restWrapper.js.map +0 -1
  354. package/lib/retriableGitManager.d.ts +0 -34
  355. package/lib/retriableGitManager.d.ts.map +0 -1
  356. package/lib/retriableGitManager.js +0 -72
  357. package/lib/retriableGitManager.js.map +0 -1
  358. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +0 -1
  359. package/lib/shreddedSummaryDocumentStorageService.js.map +0 -1
  360. package/lib/tokens.d.ts.map +0 -1
  361. package/lib/tokens.js.map +0 -1
  362. package/lib/urlUtils.d.ts.map +0 -1
  363. package/lib/urlUtils.js +0 -42
  364. package/lib/urlUtils.js.map +0 -1
  365. package/lib/wholeSummaryDocumentStorageService.d.ts.map +0 -1
  366. package/lib/wholeSummaryDocumentStorageService.js +0 -187
  367. package/lib/wholeSummaryDocumentStorageService.js.map +0 -1
  368. package/tsconfig.esnext.json +0 -7
@@ -3,118 +3,172 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { ITelemetryProperties } from "@fluidframework/core-interfaces";
7
+ import { getW3CData, validateMessages } from "@fluidframework/driver-base";
6
8
  import {
7
- IDeltaStorageService,
8
- IDocumentDeltaStorageService,
9
- IDeltasFetchResult,
10
- IStream,
9
+ IDeltaStorageService,
10
+ IDocumentDeltaStorageService,
11
+ IDeltasFetchResult,
12
+ IStream,
11
13
  } from "@fluidframework/driver-definitions";
12
14
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
13
- import { readAndParse, requestOps, emptyMessageStream } from "@fluidframework/driver-utils";
14
- import { TelemetryNullLogger } from "@fluidframework/common-utils";
15
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
16
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
17
- import { RestWrapper } from "@fluidframework/server-services-client";
15
+ import {
16
+ readAndParse,
17
+ requestOps,
18
+ emptyMessageStream,
19
+ streamObserver,
20
+ } from "@fluidframework/driver-utils";
21
+ import { ITelemetryLoggerExt, PerformanceEvent } from "@fluidframework/telemetry-utils";
18
22
  import { DocumentStorageService } from "./documentStorageService";
23
+ import { RestWrapper } from "./restWrapperBase";
19
24
 
20
- const MaxBatchDeltas = 2000; // Maximum number of ops we can fetch at a time
25
+ /**
26
+ * Maximum number of ops we can fetch at a time. This should be kept at 2k, as
27
+ * server determines whether to try to fallback to long-term storage if the ops range requested is larger than
28
+ * what they have locally available in short-term storage. So if we request 2k ops, they know it is not a
29
+ * specific request and they don't fall to long term storage which takes time.
30
+ * Please coordinate to AFR team if this value need to be changed.
31
+ */
32
+ const MaxBatchDeltas = 2000;
21
33
 
22
34
  /**
23
35
  * Storage service limited to only being able to fetch documents for a specific document
24
36
  */
25
37
  export class DocumentDeltaStorageService implements IDocumentDeltaStorageService {
26
- constructor(
27
- private readonly tenantId: string,
28
- private readonly id: string,
29
- private readonly deltaStorageService: IDeltaStorageService,
30
- private readonly documentStorageService: DocumentStorageService) {
31
- }
38
+ constructor(
39
+ private readonly tenantId: string,
40
+ private readonly id: string,
41
+ private readonly deltaStorageService: IDeltaStorageService,
42
+ private readonly documentStorageService: DocumentStorageService,
43
+ private readonly logger: ITelemetryLoggerExt,
44
+ ) {}
45
+
46
+ private logtailSha: string | undefined = this.documentStorageService.logTailSha;
47
+ private snapshotOps: ISequencedDocumentMessage[] | undefined;
48
+
49
+ fetchMessages(
50
+ fromTotal: number,
51
+ toTotal: number | undefined,
52
+ abortSignal?: AbortSignal,
53
+ cachedOnly?: boolean,
54
+ fetchReason?: string,
55
+ ): IStream<ISequencedDocumentMessage[]> {
56
+ if (cachedOnly) {
57
+ return emptyMessageStream;
58
+ }
32
59
 
33
- private logtailSha: string | undefined = this.documentStorageService.logTailSha;
60
+ let opsFromSnapshot = 0;
61
+ let opsFromStorage = 0;
62
+ const requestCallback = async (
63
+ from: number,
64
+ to: number,
65
+ telemetryProps: ITelemetryProperties,
66
+ ) => {
67
+ this.snapshotOps = this.logtailSha
68
+ ? await readAndParse<ISequencedDocumentMessage[]>(
69
+ this.documentStorageService,
70
+ this.logtailSha,
71
+ )
72
+ : [];
73
+ this.logtailSha = undefined;
34
74
 
35
- fetchMessages(from: number,
36
- to: number | undefined,
37
- abortSignal?: AbortSignal,
38
- cachedOnly?: boolean,
39
- fetchReason?: string,
40
- ): IStream<ISequencedDocumentMessage[]> {
41
- if (cachedOnly) {
42
- return emptyMessageStream;
43
- }
44
- return requestOps(
45
- this.getCore.bind(this),
46
- // Staging: starting with no concurrency, listening for feedback first.
47
- // In future releases we will switch to actual concurrency
48
- 1, // concurrency
49
- from, // inclusive
50
- to, // exclusive
51
- MaxBatchDeltas,
52
- new TelemetryNullLogger(),
53
- abortSignal,
54
- fetchReason,
55
- );
56
- }
75
+ if (this.snapshotOps !== undefined && this.snapshotOps.length !== 0) {
76
+ const messages = this.snapshotOps.filter(
77
+ (op) => op.sequenceNumber >= from && op.sequenceNumber < to,
78
+ );
79
+ validateMessages("snapshotOps", messages, from, this.logger, false /* strict */);
80
+ if (messages.length > 0 && messages[0].sequenceNumber === from) {
81
+ this.snapshotOps = this.snapshotOps.filter((op) => op.sequenceNumber >= to);
82
+ opsFromSnapshot += messages.length;
83
+ return { messages, partialResult: true };
84
+ }
85
+ this.snapshotOps = undefined;
86
+ }
57
87
 
58
- private async getCore(from: number, to: number): Promise<IDeltasFetchResult> {
59
- const opsFromLogTail = this.logtailSha
60
- ? await readAndParse<ISequencedDocumentMessage[]>(this.documentStorageService, this.logtailSha)
61
- : [];
88
+ const ops = await this.deltaStorageService.get(this.tenantId, this.id, from, to);
89
+ validateMessages("storage", ops.messages, from, this.logger, false /* strict */);
90
+ opsFromStorage += ops.messages.length;
91
+ return ops;
92
+ };
62
93
 
63
- this.logtailSha = undefined;
64
- if (opsFromLogTail.length > 0) {
65
- const messages = opsFromLogTail.filter((op) =>
66
- op.sequenceNumber >= from,
67
- );
68
- if (messages.length > 0) {
69
- return { messages, partialResult: true };
70
- }
71
- }
94
+ const stream = requestOps(
95
+ async (from: number, to: number, telemetryProps: ITelemetryProperties) => {
96
+ const result = await requestCallback(from, to, telemetryProps);
97
+ // Catch all case, just in case
98
+ validateMessages("catch all", result.messages, from, this.logger);
99
+ return result;
100
+ },
101
+ // Staging: starting with no concurrency, listening for feedback first.
102
+ // In future releases we will switch to actual concurrency
103
+ 1, // concurrency
104
+ fromTotal, // inclusive
105
+ toTotal, // exclusive
106
+ MaxBatchDeltas,
107
+ this.logger,
108
+ abortSignal,
109
+ fetchReason,
110
+ );
72
111
 
73
- return this.deltaStorageService.get(this.tenantId, this.id, from, to);
74
- }
112
+ return streamObserver(stream, (result) => {
113
+ if (result.done && opsFromSnapshot + opsFromStorage !== 0) {
114
+ this.logger.sendPerformanceEvent({
115
+ eventName: "CacheOpsRetrieved",
116
+ opsFromSnapshot,
117
+ opsFromStorage,
118
+ });
119
+ }
120
+ });
121
+ }
75
122
  }
76
123
 
77
124
  /**
78
125
  * Provides access to the underlying delta storage on the server for routerlicious driver.
79
126
  */
80
127
  export class DeltaStorageService implements IDeltaStorageService {
81
- constructor(
82
- private readonly url: string,
83
- private readonly restWrapper: RestWrapper,
84
- private readonly logger: ITelemetryLogger,
85
- private readonly getRestWrapper: () => Promise<RestWrapper> = async () => this.restWrapper,
86
- private readonly getDeltaStorageUrl: () => string = () => this.url,
87
- ) {
88
- }
128
+ constructor(
129
+ private readonly url: string,
130
+ private readonly restWrapper: RestWrapper,
131
+ private readonly logger: ITelemetryLoggerExt,
132
+ private readonly getRestWrapper: () => Promise<RestWrapper> = async () => this.restWrapper,
133
+ private readonly getDeltaStorageUrl: () => string = () => this.url,
134
+ ) {}
89
135
 
90
- public async get(
91
- tenantId: string,
92
- id: string,
93
- from: number, // inclusive
94
- to: number, // exclusive
95
- ): Promise<IDeltasFetchResult> {
96
- const ops = await PerformanceEvent.timedExecAsync(
97
- this.logger,
98
- {
99
- eventName: "getDeltas",
100
- from,
101
- to,
102
- },
103
- async (event) => {
104
- const restWrapper = await this.getRestWrapper();
105
- const url = this.getDeltaStorageUrl();
106
- const response = await restWrapper.get<ISequencedDocumentMessage[]>(
107
- url,
108
- { from: from - 1, to });
109
- event.end({
110
- count: response.length,
111
- });
112
- return response;
113
- },
114
- );
136
+ public async get(
137
+ tenantId: string,
138
+ id: string,
139
+ from: number, // inclusive
140
+ to: number, // exclusive
141
+ ): Promise<IDeltasFetchResult> {
142
+ const ops = await PerformanceEvent.timedExecAsync(
143
+ this.logger,
144
+ {
145
+ eventName: "OpsFetch",
146
+ from,
147
+ to,
148
+ },
149
+ async (event) => {
150
+ const restWrapper = await this.getRestWrapper();
151
+ const url = this.getDeltaStorageUrl();
152
+ const response = await restWrapper.get<ISequencedDocumentMessage[]>(url, {
153
+ from: from - 1,
154
+ to,
155
+ });
156
+ event.end({
157
+ length: response.content.length,
158
+ details: JSON.stringify({
159
+ firstOpSeqNumber: response.content[0]?.sequenceNumber,
160
+ lastOpSeqNumber:
161
+ response.content[response.content.length - 1]?.sequenceNumber,
162
+ }),
163
+ ...response.propsToLog,
164
+ ...getW3CData(response.requestUrl, "xmlhttprequest"),
165
+ });
166
+ return response.content;
167
+ },
168
+ );
115
169
 
116
- // It is assumed that server always returns all the ops that it has in the range that was requested.
117
- // This may change in the future, if so, we need to adjust and receive "end" value from server in such case.
118
- return { messages: ops, partialResult: false };
119
- }
170
+ // It is assumed that server always returns all the ops that it has in the range that was requested.
171
+ // This may change in the future, if so, we need to adjust and receive "end" value from server in such case.
172
+ return { messages: ops, partialResult: false };
173
+ }
120
174
  }
@@ -3,10 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
6
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
7
7
  import { DocumentDeltaConnection } from "@fluidframework/driver-base";
8
- import { IDocumentDeltaConnection } from "@fluidframework/driver-definitions";
9
- import { IAnyDriverError } from "@fluidframework/driver-utils";
8
+ import { IAnyDriverError, IDocumentDeltaConnection } from "@fluidframework/driver-definitions";
10
9
  import { IClient, IConnect } from "@fluidframework/protocol-definitions";
11
10
  import type { io as SocketIOClientStatic } from "socket.io-client";
12
11
  import { errorObjectFromSocketError, IR11sSocketError } from "./errorUtils";
@@ -18,57 +17,60 @@ const protocolVersions = ["^0.4.0", "^0.3.0", "^0.2.0", "^0.1.0"];
18
17
  * Wrapper over the shared one for driver specific translation.
19
18
  */
20
19
  export class R11sDocumentDeltaConnection extends DocumentDeltaConnection {
21
- public static async create(
22
- tenantId: string,
23
- id: string,
24
- token: string | null,
25
- io: typeof SocketIOClientStatic,
26
- client: IClient,
27
- url: string,
28
- logger: ITelemetryLogger,
29
- timeoutMs = 20000): Promise<IDocumentDeltaConnection> {
30
- const socket = io(
31
- url,
32
- {
33
- query: {
34
- documentId: id,
35
- tenantId,
36
- },
37
- reconnection: false,
38
- // Default to websocket connection, with long-polling disabled
39
- transports: ["websocket"],
40
- timeout: timeoutMs,
41
- });
20
+ public static async create(
21
+ tenantId: string,
22
+ id: string,
23
+ token: string | null,
24
+ io: typeof SocketIOClientStatic,
25
+ client: IClient,
26
+ url: string,
27
+ logger: ITelemetryLoggerExt,
28
+ timeoutMs = 20000,
29
+ enableLongPollingDowngrade = true,
30
+ ): Promise<IDocumentDeltaConnection> {
31
+ const socket = io(url, {
32
+ query: {
33
+ documentId: id,
34
+ tenantId,
35
+ },
36
+ reconnection: false,
37
+ // Default to websocket connection, with long-polling disabled
38
+ transports: ["websocket"],
39
+ timeout: timeoutMs,
40
+ });
42
41
 
43
- const connectMessage: IConnect = {
44
- client,
45
- id,
46
- mode: client.mode,
47
- tenantId,
48
- token, // Token is going to indicate tenant level information, etc...
49
- versions: protocolVersions,
50
- relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(";"),
51
- };
42
+ const connectMessage: IConnect = {
43
+ client,
44
+ id,
45
+ mode: client.mode,
46
+ tenantId,
47
+ token, // Token is going to indicate tenant level information, etc...
48
+ versions: protocolVersions,
49
+ relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(
50
+ ";",
51
+ ),
52
+ };
52
53
 
53
- // TODO: expose to host at factory level
54
- const enableLongPollingDowngrades = true;
55
- const deltaConnection = new R11sDocumentDeltaConnection(socket, id, logger, enableLongPollingDowngrades);
54
+ const deltaConnection = new R11sDocumentDeltaConnection(
55
+ socket,
56
+ id,
57
+ logger,
58
+ enableLongPollingDowngrade,
59
+ );
56
60
 
57
- await deltaConnection.initialize(connectMessage, timeoutMs);
58
- return deltaConnection;
59
- }
61
+ await deltaConnection.initialize(connectMessage, timeoutMs);
62
+ return deltaConnection;
63
+ }
60
64
 
61
- /**
62
- * Error raising for socket.io issues
63
- */
64
- protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {
65
- // Note: we suspect the incoming error object is either:
66
- // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
67
- // - anything else: let base class handle it
68
- if (canRetry && Number.isInteger(error?.code) && typeof error?.message === "string") {
69
- return errorObjectFromSocketError(error as IR11sSocketError, handler);
70
- } else {
71
- return super.createErrorObject(handler, error, canRetry);
72
- }
73
- }
65
+ /**
66
+ * Error raising for socket.io issues
67
+ */
68
+ protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {
69
+ // Note: we suspect the incoming error object is either:
70
+ // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
71
+ // - anything else: let base class handle it
72
+ return canRetry && Number.isInteger(error?.code) && typeof error?.message === "string"
73
+ ? errorObjectFromSocketError(error as IR11sSocketError, handler)
74
+ : super.createErrorObject(handler, error, canRetry);
75
+ }
74
76
  }