@fluidframework/routerlicious-driver 1.4.0-115997 → 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 (365) 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-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/routerlicious-driver.api.md +108 -0
  8. package/dist/cache.cjs +30 -0
  9. package/dist/cache.cjs.map +1 -0
  10. package/dist/cache.d.ts +7 -0
  11. package/dist/cache.d.ts.map +1 -1
  12. package/dist/{definitions.js → contracts.cjs} +1 -1
  13. package/dist/contracts.cjs.map +1 -0
  14. package/dist/contracts.d.ts +42 -0
  15. package/dist/contracts.d.ts.map +1 -0
  16. package/dist/{createNewUtils.js → createNewUtils.cjs} +7 -5
  17. package/dist/createNewUtils.cjs.map +1 -0
  18. package/dist/createNewUtils.d.ts +1 -1
  19. package/dist/createNewUtils.d.ts.map +1 -1
  20. package/dist/{defaultTokenProvider.js → defaultTokenProvider.cjs} +2 -1
  21. package/dist/defaultTokenProvider.cjs.map +1 -0
  22. package/dist/defaultTokenProvider.d.ts +1 -0
  23. package/dist/defaultTokenProvider.d.ts.map +1 -1
  24. package/dist/definitions.cjs +7 -0
  25. package/dist/definitions.cjs.map +1 -0
  26. package/dist/definitions.d.ts.map +1 -1
  27. package/dist/deltaStorageService.cjs +122 -0
  28. package/dist/deltaStorageService.cjs.map +1 -0
  29. package/dist/deltaStorageService.d.ts +7 -6
  30. package/dist/deltaStorageService.d.ts.map +1 -1
  31. package/dist/{documentDeltaConnection.js → documentDeltaConnection.cjs} +8 -13
  32. package/dist/documentDeltaConnection.cjs.map +1 -0
  33. package/dist/documentDeltaConnection.d.ts +3 -4
  34. package/dist/documentDeltaConnection.d.ts.map +1 -1
  35. package/dist/{documentService.js → documentService.cjs} +61 -64
  36. package/dist/documentService.cjs.map +1 -0
  37. package/dist/documentService.d.ts +12 -4
  38. package/dist/documentService.d.ts.map +1 -1
  39. package/dist/{documentServiceFactory.js → documentServiceFactory.cjs} +87 -33
  40. package/dist/documentServiceFactory.cjs.map +1 -0
  41. package/dist/documentServiceFactory.d.ts +5 -3
  42. package/dist/documentServiceFactory.d.ts.map +1 -1
  43. package/dist/{documentStorageService.js → documentStorageService.cjs} +18 -16
  44. package/dist/documentStorageService.cjs.map +1 -0
  45. package/dist/documentStorageService.d.ts +4 -3
  46. package/dist/documentStorageService.d.ts.map +1 -1
  47. package/dist/errorUtils.cjs +87 -0
  48. package/dist/errorUtils.cjs.map +1 -0
  49. package/dist/errorUtils.d.ts +56 -10
  50. package/dist/errorUtils.d.ts.map +1 -1
  51. package/dist/gitManager.cjs +46 -0
  52. package/dist/gitManager.cjs.map +1 -0
  53. package/dist/gitManager.d.ts +27 -0
  54. package/dist/gitManager.d.ts.map +1 -0
  55. package/dist/historian.cjs +72 -0
  56. package/dist/historian.cjs.map +1 -0
  57. package/dist/historian.d.ts +34 -0
  58. package/dist/historian.d.ts.map +1 -0
  59. package/dist/index.cjs +19 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.d.ts +5 -8
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/mapWithExpiration.cjs +105 -0
  64. package/dist/mapWithExpiration.cjs.map +1 -0
  65. package/dist/mapWithExpiration.d.ts +34 -0
  66. package/dist/mapWithExpiration.d.ts.map +1 -0
  67. package/dist/{nullBlobStorageService.js → nullBlobStorageService.cjs} +5 -5
  68. package/dist/nullBlobStorageService.cjs.map +1 -0
  69. package/dist/nullBlobStorageService.d.ts.map +1 -1
  70. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  71. package/dist/packageVersion.cjs.map +1 -0
  72. package/dist/packageVersion.d.ts +1 -1
  73. package/dist/packageVersion.d.ts.map +1 -1
  74. package/dist/{policies.js → policies.cjs} +1 -1
  75. package/dist/policies.cjs.map +1 -0
  76. package/dist/policies.d.ts +22 -9
  77. package/dist/policies.d.ts.map +1 -1
  78. package/dist/r11sSnapshotParser.cjs +73 -0
  79. package/dist/r11sSnapshotParser.cjs.map +1 -0
  80. package/dist/r11sSnapshotParser.d.ts +14 -0
  81. package/dist/r11sSnapshotParser.d.ts.map +1 -0
  82. package/dist/restWrapper.cjs +249 -0
  83. package/dist/restWrapper.cjs.map +1 -0
  84. package/dist/restWrapper.d.ts +32 -12
  85. package/dist/restWrapper.d.ts.map +1 -1
  86. package/dist/restWrapperBase.cjs +89 -0
  87. package/dist/restWrapperBase.cjs.map +1 -0
  88. package/dist/restWrapperBase.d.ts +26 -0
  89. package/dist/restWrapperBase.d.ts.map +1 -0
  90. package/dist/retriableGitManager.cjs +40 -0
  91. package/dist/retriableGitManager.cjs.map +1 -0
  92. package/dist/retriableGitManager.d.ts +13 -23
  93. package/dist/retriableGitManager.d.ts.map +1 -1
  94. package/dist/routerlicious-driver-alpha.d.ts +92 -0
  95. package/dist/routerlicious-driver-beta.d.ts +98 -0
  96. package/dist/routerlicious-driver-public.d.ts +98 -0
  97. package/dist/routerlicious-driver-untrimmed.d.ts +261 -0
  98. package/dist/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.cjs} +41 -34
  99. package/dist/shreddedSummaryDocumentStorageService.cjs.map +1 -0
  100. package/dist/shreddedSummaryDocumentStorageService.d.ts +6 -5
  101. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  102. package/dist/storageContracts.cjs +7 -0
  103. package/dist/storageContracts.cjs.map +1 -0
  104. package/dist/storageContracts.d.ts +45 -0
  105. package/dist/storageContracts.d.ts.map +1 -0
  106. package/dist/summaryTreeUploadManager.cjs +110 -0
  107. package/dist/summaryTreeUploadManager.cjs.map +1 -0
  108. package/dist/summaryTreeUploadManager.d.ts +23 -0
  109. package/dist/summaryTreeUploadManager.d.ts.map +1 -0
  110. package/dist/{tokens.js → tokens.cjs} +1 -1
  111. package/dist/tokens.cjs.map +1 -0
  112. package/dist/tokens.d.ts +34 -5
  113. package/dist/tokens.d.ts.map +1 -1
  114. package/dist/treeUtils.cjs +107 -0
  115. package/dist/treeUtils.cjs.map +1 -0
  116. package/dist/treeUtils.d.ts +58 -0
  117. package/dist/treeUtils.d.ts.map +1 -0
  118. package/dist/tsdoc-metadata.json +11 -0
  119. package/dist/{urlUtils.js → urlUtils.cjs} +21 -25
  120. package/dist/urlUtils.cjs.map +1 -0
  121. package/dist/urlUtils.d.ts +2 -2
  122. package/dist/urlUtils.d.ts.map +1 -1
  123. package/dist/wholeSummaryDocumentStorageService.cjs +253 -0
  124. package/dist/wholeSummaryDocumentStorageService.cjs.map +1 -0
  125. package/dist/wholeSummaryDocumentStorageService.d.ts +10 -8
  126. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  127. package/dist/wholeSummaryUploadManager.cjs +37 -0
  128. package/dist/wholeSummaryUploadManager.cjs.map +1 -0
  129. package/dist/wholeSummaryUploadManager.d.ts +16 -0
  130. package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
  131. package/lib/{cache.d.ts → cache.d.mts} +7 -0
  132. package/lib/cache.d.mts.map +1 -0
  133. package/lib/cache.mjs +25 -0
  134. package/lib/cache.mjs.map +1 -0
  135. package/lib/contracts.d.mts +42 -0
  136. package/lib/contracts.d.mts.map +1 -0
  137. package/lib/{definitions.js → contracts.mjs} +1 -1
  138. package/lib/contracts.mjs.map +1 -0
  139. package/lib/{createNewUtils.d.ts → createNewUtils.d.mts} +1 -1
  140. package/lib/{createNewUtils.d.ts.map → createNewUtils.d.mts.map} +1 -1
  141. package/lib/{createNewUtils.js → createNewUtils.mjs} +7 -5
  142. package/lib/createNewUtils.mjs.map +1 -0
  143. package/lib/{defaultTokenProvider.d.ts → defaultTokenProvider.d.mts} +2 -1
  144. package/lib/defaultTokenProvider.d.mts.map +1 -0
  145. package/lib/{defaultTokenProvider.js → defaultTokenProvider.mjs} +2 -1
  146. package/lib/defaultTokenProvider.mjs.map +1 -0
  147. package/lib/definitions.d.mts.map +1 -0
  148. package/lib/definitions.mjs +6 -0
  149. package/{dist/definitions.js.map → lib/definitions.mjs.map} +1 -1
  150. package/lib/{deltaStorageService.d.ts → deltaStorageService.d.mts} +8 -7
  151. package/lib/deltaStorageService.d.mts.map +1 -0
  152. package/lib/deltaStorageService.mjs +117 -0
  153. package/lib/deltaStorageService.mjs.map +1 -0
  154. package/lib/{documentDeltaConnection.d.ts → documentDeltaConnection.d.mts} +3 -4
  155. package/lib/documentDeltaConnection.d.mts.map +1 -0
  156. package/lib/{documentDeltaConnection.js → documentDeltaConnection.mjs} +8 -13
  157. package/lib/documentDeltaConnection.mjs.map +1 -0
  158. package/lib/{documentService.d.ts → documentService.d.mts} +16 -8
  159. package/lib/documentService.d.mts.map +1 -0
  160. package/lib/{documentService.js → documentService.mjs} +60 -44
  161. package/lib/documentService.mjs.map +1 -0
  162. package/lib/{documentServiceFactory.d.ts → documentServiceFactory.d.mts} +7 -5
  163. package/lib/documentServiceFactory.d.mts.map +1 -0
  164. package/lib/{documentServiceFactory.js → documentServiceFactory.mjs} +88 -34
  165. package/lib/documentServiceFactory.mjs.map +1 -0
  166. package/lib/{documentStorageService.d.ts → documentStorageService.d.mts} +7 -6
  167. package/lib/documentStorageService.d.mts.map +1 -0
  168. package/lib/{documentStorageService.js → documentStorageService.mjs} +19 -17
  169. package/lib/documentStorageService.mjs.map +1 -0
  170. package/lib/errorUtils.d.mts +93 -0
  171. package/lib/errorUtils.d.mts.map +1 -0
  172. package/lib/errorUtils.mjs +81 -0
  173. package/lib/errorUtils.mjs.map +1 -0
  174. package/lib/gitManager.d.mts +27 -0
  175. package/lib/gitManager.d.mts.map +1 -0
  176. package/lib/gitManager.mjs +42 -0
  177. package/lib/gitManager.mjs.map +1 -0
  178. package/lib/historian.d.mts +34 -0
  179. package/lib/historian.d.mts.map +1 -0
  180. package/lib/historian.mjs +67 -0
  181. package/lib/historian.mjs.map +1 -0
  182. package/lib/index.d.mts +10 -0
  183. package/lib/index.d.mts.map +1 -0
  184. package/lib/index.mjs +8 -0
  185. package/lib/index.mjs.map +1 -0
  186. package/lib/mapWithExpiration.d.mts +34 -0
  187. package/lib/mapWithExpiration.d.mts.map +1 -0
  188. package/lib/mapWithExpiration.mjs +101 -0
  189. package/lib/mapWithExpiration.mjs.map +1 -0
  190. package/lib/nullBlobStorageService.d.mts.map +1 -0
  191. package/lib/{nullBlobStorageService.js → nullBlobStorageService.mjs} +5 -5
  192. package/lib/nullBlobStorageService.mjs.map +1 -0
  193. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  194. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  195. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  196. package/lib/packageVersion.mjs.map +1 -0
  197. package/lib/{policies.d.ts → policies.d.mts} +22 -9
  198. package/lib/policies.d.mts.map +1 -0
  199. package/lib/{policies.js → policies.mjs} +1 -1
  200. package/lib/policies.mjs.map +1 -0
  201. package/lib/r11sSnapshotParser.d.mts +14 -0
  202. package/lib/r11sSnapshotParser.d.mts.map +1 -0
  203. package/lib/r11sSnapshotParser.mjs +69 -0
  204. package/lib/r11sSnapshotParser.mjs.map +1 -0
  205. package/lib/restWrapper.d.mts +53 -0
  206. package/lib/restWrapper.d.mts.map +1 -0
  207. package/lib/restWrapper.mjs +236 -0
  208. package/lib/restWrapper.mjs.map +1 -0
  209. package/lib/restWrapperBase.d.mts +26 -0
  210. package/lib/restWrapperBase.d.mts.map +1 -0
  211. package/lib/restWrapperBase.mjs +84 -0
  212. package/lib/restWrapperBase.mjs.map +1 -0
  213. package/lib/retriableGitManager.d.mts +24 -0
  214. package/lib/retriableGitManager.d.mts.map +1 -0
  215. package/lib/retriableGitManager.mjs +36 -0
  216. package/lib/retriableGitManager.mjs.map +1 -0
  217. package/lib/routerlicious-driver-alpha.d.mts +92 -0
  218. package/lib/routerlicious-driver-beta.d.mts +98 -0
  219. package/lib/routerlicious-driver-public.d.mts +98 -0
  220. package/lib/routerlicious-driver-untrimmed.d.mts +261 -0
  221. package/lib/{shreddedSummaryDocumentStorageService.d.ts → shreddedSummaryDocumentStorageService.d.mts} +9 -8
  222. package/lib/shreddedSummaryDocumentStorageService.d.mts.map +1 -0
  223. package/lib/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.mjs} +41 -34
  224. package/lib/shreddedSummaryDocumentStorageService.mjs.map +1 -0
  225. package/lib/storageContracts.d.mts +45 -0
  226. package/lib/storageContracts.d.mts.map +1 -0
  227. package/lib/storageContracts.mjs +6 -0
  228. package/lib/storageContracts.mjs.map +1 -0
  229. package/lib/summaryTreeUploadManager.d.mts +23 -0
  230. package/lib/summaryTreeUploadManager.d.mts.map +1 -0
  231. package/lib/summaryTreeUploadManager.mjs +106 -0
  232. package/lib/summaryTreeUploadManager.mjs.map +1 -0
  233. package/lib/{tokens.d.ts → tokens.d.mts} +34 -5
  234. package/lib/tokens.d.mts.map +1 -0
  235. package/lib/{tokens.js → tokens.mjs} +1 -1
  236. package/lib/tokens.mjs.map +1 -0
  237. package/lib/treeUtils.d.mts +58 -0
  238. package/lib/treeUtils.d.mts.map +1 -0
  239. package/lib/treeUtils.mjs +100 -0
  240. package/lib/treeUtils.mjs.map +1 -0
  241. package/lib/{urlUtils.d.ts → urlUtils.d.mts} +2 -2
  242. package/lib/urlUtils.d.mts.map +1 -0
  243. package/lib/urlUtils.mjs +38 -0
  244. package/lib/urlUtils.mjs.map +1 -0
  245. package/lib/{wholeSummaryDocumentStorageService.d.ts → wholeSummaryDocumentStorageService.d.mts} +12 -10
  246. package/lib/wholeSummaryDocumentStorageService.d.mts.map +1 -0
  247. package/lib/wholeSummaryDocumentStorageService.mjs +249 -0
  248. package/lib/wholeSummaryDocumentStorageService.mjs.map +1 -0
  249. package/lib/wholeSummaryUploadManager.d.mts +16 -0
  250. package/lib/wholeSummaryUploadManager.d.mts.map +1 -0
  251. package/lib/wholeSummaryUploadManager.mjs +33 -0
  252. package/lib/wholeSummaryUploadManager.mjs.map +1 -0
  253. package/package.json +104 -68
  254. package/prettier.config.cjs +8 -0
  255. package/src/cache.ts +25 -9
  256. package/src/contracts.ts +60 -0
  257. package/src/createNewUtils.ts +26 -24
  258. package/src/defaultTokenProvider.ts +14 -15
  259. package/src/definitions.ts +2 -2
  260. package/src/deltaStorageService.ts +145 -91
  261. package/src/documentDeltaConnection.ts +54 -52
  262. package/src/documentService.ts +272 -242
  263. package/src/documentServiceFactory.ts +338 -237
  264. package/src/documentStorageService.ts +92 -84
  265. package/src/errorUtils.ts +117 -79
  266. package/src/gitManager.ts +67 -0
  267. package/src/historian.ts +121 -0
  268. package/src/index.ts +15 -8
  269. package/src/mapWithExpiration.ts +124 -0
  270. package/src/nullBlobStorageService.ts +24 -21
  271. package/src/packageVersion.ts +1 -1
  272. package/src/policies.ts +51 -38
  273. package/src/r11sSnapshotParser.ts +82 -0
  274. package/src/restWrapper.ts +400 -216
  275. package/src/restWrapperBase.ts +146 -0
  276. package/src/retriableGitManager.ts +76 -153
  277. package/src/shreddedSummaryDocumentStorageService.ts +214 -195
  278. package/src/storageContracts.ts +63 -0
  279. package/src/summaryTreeUploadManager.ts +155 -0
  280. package/src/tokens.ts +74 -39
  281. package/src/treeUtils.ts +138 -0
  282. package/src/urlUtils.ts +27 -28
  283. package/src/wholeSummaryDocumentStorageService.ts +352 -252
  284. package/src/wholeSummaryUploadManager.ts +64 -0
  285. package/tsc-multi.test.json +4 -0
  286. package/tsconfig.json +10 -13
  287. package/dist/cache.js +0 -20
  288. package/dist/cache.js.map +0 -1
  289. package/dist/createNewUtils.js.map +0 -1
  290. package/dist/defaultTokenProvider.js.map +0 -1
  291. package/dist/deltaStorageService.js +0 -82
  292. package/dist/deltaStorageService.js.map +0 -1
  293. package/dist/documentDeltaConnection.js.map +0 -1
  294. package/dist/documentService.js.map +0 -1
  295. package/dist/documentServiceFactory.js.map +0 -1
  296. package/dist/documentStorageService.js.map +0 -1
  297. package/dist/errorUtils.js +0 -56
  298. package/dist/errorUtils.js.map +0 -1
  299. package/dist/index.js +0 -25
  300. package/dist/index.js.map +0 -1
  301. package/dist/nullBlobStorageService.js.map +0 -1
  302. package/dist/packageVersion.js.map +0 -1
  303. package/dist/policies.js.map +0 -1
  304. package/dist/restWrapper.js +0 -153
  305. package/dist/restWrapper.js.map +0 -1
  306. package/dist/retriableGitManager.js +0 -76
  307. package/dist/retriableGitManager.js.map +0 -1
  308. package/dist/shreddedSummaryDocumentStorageService.js.map +0 -1
  309. package/dist/tokens.js.map +0 -1
  310. package/dist/urlUtils.js.map +0 -1
  311. package/dist/wholeSummaryDocumentStorageService.js +0 -191
  312. package/dist/wholeSummaryDocumentStorageService.js.map +0 -1
  313. package/lib/cache.d.ts.map +0 -1
  314. package/lib/cache.js +0 -16
  315. package/lib/cache.js.map +0 -1
  316. package/lib/createNewUtils.js.map +0 -1
  317. package/lib/defaultTokenProvider.d.ts.map +0 -1
  318. package/lib/defaultTokenProvider.js.map +0 -1
  319. package/lib/definitions.d.ts.map +0 -1
  320. package/lib/definitions.js.map +0 -1
  321. package/lib/deltaStorageService.d.ts.map +0 -1
  322. package/lib/deltaStorageService.js +0 -77
  323. package/lib/deltaStorageService.js.map +0 -1
  324. package/lib/documentDeltaConnection.d.ts.map +0 -1
  325. package/lib/documentDeltaConnection.js.map +0 -1
  326. package/lib/documentService.d.ts.map +0 -1
  327. package/lib/documentService.js.map +0 -1
  328. package/lib/documentServiceFactory.d.ts.map +0 -1
  329. package/lib/documentServiceFactory.js.map +0 -1
  330. package/lib/documentStorageService.d.ts.map +0 -1
  331. package/lib/documentStorageService.js.map +0 -1
  332. package/lib/errorUtils.d.ts +0 -47
  333. package/lib/errorUtils.d.ts.map +0 -1
  334. package/lib/errorUtils.js +0 -50
  335. package/lib/errorUtils.js.map +0 -1
  336. package/lib/index.d.ts +0 -13
  337. package/lib/index.d.ts.map +0 -1
  338. package/lib/index.js +0 -13
  339. package/lib/index.js.map +0 -1
  340. package/lib/nullBlobStorageService.d.ts.map +0 -1
  341. package/lib/nullBlobStorageService.js.map +0 -1
  342. package/lib/packageVersion.js.map +0 -1
  343. package/lib/policies.d.ts.map +0 -1
  344. package/lib/policies.js.map +0 -1
  345. package/lib/restWrapper.d.ts +0 -33
  346. package/lib/restWrapper.d.ts.map +0 -1
  347. package/lib/restWrapper.js +0 -144
  348. package/lib/restWrapper.js.map +0 -1
  349. package/lib/retriableGitManager.d.ts +0 -34
  350. package/lib/retriableGitManager.d.ts.map +0 -1
  351. package/lib/retriableGitManager.js +0 -72
  352. package/lib/retriableGitManager.js.map +0 -1
  353. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +0 -1
  354. package/lib/shreddedSummaryDocumentStorageService.js.map +0 -1
  355. package/lib/tokens.d.ts.map +0 -1
  356. package/lib/tokens.js.map +0 -1
  357. package/lib/urlUtils.d.ts.map +0 -1
  358. package/lib/urlUtils.js +0 -42
  359. package/lib/urlUtils.js.map +0 -1
  360. package/lib/wholeSummaryDocumentStorageService.d.ts.map +0 -1
  361. package/lib/wholeSummaryDocumentStorageService.js +0 -187
  362. package/lib/wholeSummaryDocumentStorageService.js.map +0 -1
  363. package/tsconfig.esnext.json +0 -7
  364. /package/lib/{definitions.d.ts → definitions.d.mts} +0 -0
  365. /package/lib/{nullBlobStorageService.d.ts → nullBlobStorageService.d.mts} +0 -0
@@ -0,0 +1,60 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ISnapshotTree } from "@fluidframework/protocol-definitions";
7
+
8
+ /*
9
+ *
10
+ * Whole Snapshot Download Data Structures
11
+ *
12
+ */
13
+
14
+ export interface IWholeFlatSnapshotTreeEntryTree {
15
+ path: string;
16
+ type: "tree";
17
+ // Indicates that this tree entry is unreferenced. If this is not present, the tree entry is considered referenced.
18
+ unreferenced?: true;
19
+ }
20
+
21
+ export interface IWholeFlatSnapshotTreeEntryBlob {
22
+ id: string;
23
+ path: string;
24
+ type: "blob";
25
+ }
26
+
27
+ export type IWholeFlatSnapshotTreeEntry =
28
+ | IWholeFlatSnapshotTreeEntryTree
29
+ | IWholeFlatSnapshotTreeEntryBlob;
30
+
31
+ export interface IWholeFlatSnapshotTree {
32
+ entries: IWholeFlatSnapshotTreeEntry[];
33
+ id: string;
34
+ sequenceNumber: number;
35
+ }
36
+
37
+ export interface IWholeFlatSnapshotBlob {
38
+ content: string;
39
+ encoding: "base64" | "utf-8";
40
+ id: string;
41
+ size: number;
42
+ }
43
+
44
+ export interface IWholeFlatSnapshot {
45
+ // The same as the id of the first snapshot tree in the trees array.
46
+ id: string;
47
+ // Receive an array of snapshot trees for future-proofing, however, always length 1 for now.
48
+ trees: IWholeFlatSnapshotTree[];
49
+ blobs?: IWholeFlatSnapshotBlob[];
50
+ }
51
+
52
+ /**
53
+ * Normalized Whole Summary with decoded blobs and unflattened snapshot tree.
54
+ */
55
+ export interface INormalizedWholeSnapshot {
56
+ blobs: Map<string, ArrayBuffer>;
57
+ snapshotTree: ISnapshotTree;
58
+ sequenceNumber: number | undefined;
59
+ id: string;
60
+ }
@@ -3,37 +3,39 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { Uint8ArrayToString } from "@fluidframework/common-utils";
6
+ import { Uint8ArrayToString } from "@fluid-internal/client-utils";
7
7
  import { ISummaryTree, SummaryType } from "@fluidframework/protocol-definitions";
8
8
 
9
9
  /**
10
10
  * Utility api to convert ISummaryTree to a summary tree where blob contents are only utf8 strings.
11
11
  * @param summary - Summary supplied by the runtime to upload.
12
- * @returns - Modified summary tree where the blob contents could be utf8 string only.
12
+ * @returns Modified summary tree where the blob contents could be utf8 string only.
13
13
  */
14
14
  export function convertSummaryToCreateNewSummary(summary: ISummaryTree): ISummaryTree {
15
- const keys = Object.keys(summary.tree);
16
- for (const key of keys) {
17
- const summaryObject = summary.tree[key];
15
+ const keys = Object.keys(summary.tree);
16
+ for (const key of keys) {
17
+ const summaryObject = summary.tree[key];
18
18
 
19
- switch (summaryObject.type) {
20
- case SummaryType.Tree: {
21
- summary.tree[key] = convertSummaryToCreateNewSummary(summaryObject);
22
- break;
23
- }
24
- case SummaryType.Blob: {
25
- summaryObject.content = typeof summaryObject.content === "string" ?
26
- summaryObject.content : Uint8ArrayToString(summaryObject.content, "utf8");
27
- break;
28
- }
29
- case SummaryType.Handle: {
30
- throw new Error("No handle should be present for first summary!!");
31
- }
32
- default: {
33
- throw new Error(`Unknown tree type ${summaryObject.type}`);
34
- }
35
- }
36
- }
19
+ switch (summaryObject.type) {
20
+ case SummaryType.Tree: {
21
+ summary.tree[key] = convertSummaryToCreateNewSummary(summaryObject);
22
+ break;
23
+ }
24
+ case SummaryType.Blob: {
25
+ summaryObject.content =
26
+ typeof summaryObject.content === "string"
27
+ ? summaryObject.content
28
+ : Uint8ArrayToString(summaryObject.content, "utf8");
29
+ break;
30
+ }
31
+ case SummaryType.Handle: {
32
+ throw new Error("No handle should be present for first summary!!");
33
+ }
34
+ default: {
35
+ throw new Error(`Unknown tree type ${summaryObject.type}`);
36
+ }
37
+ }
38
+ }
37
39
 
38
- return summary;
40
+ return summary;
39
41
  }
@@ -7,24 +7,23 @@ import { ITokenProvider, ITokenResponse } from "./tokens";
7
7
 
8
8
  /**
9
9
  * Default token provider in case the host does not provide one. It simply caches the provided jwt and returns it back.
10
+ * @internal
10
11
  */
11
12
 
12
13
  export class DefaultTokenProvider implements ITokenProvider {
13
- constructor(private readonly jwt: string) {
14
+ constructor(private readonly jwt: string) {}
14
15
 
15
- }
16
+ public async fetchOrdererToken(): Promise<ITokenResponse> {
17
+ return {
18
+ fromCache: true,
19
+ jwt: this.jwt,
20
+ };
21
+ }
16
22
 
17
- public async fetchOrdererToken(): Promise<ITokenResponse> {
18
- return {
19
- fromCache: true,
20
- jwt: this.jwt,
21
- };
22
- }
23
-
24
- public async fetchStorageToken(): Promise<ITokenResponse> {
25
- return {
26
- fromCache: true,
27
- jwt: this.jwt,
28
- };
29
- }
23
+ public async fetchStorageToken(): Promise<ITokenResponse> {
24
+ return {
25
+ fromCache: true,
26
+ jwt: this.jwt,
27
+ };
28
+ }
30
29
  }
@@ -6,6 +6,6 @@
6
6
  import { ISnapshotTree } from "@fluidframework/protocol-definitions";
7
7
 
8
8
  export interface ISnapshotTreeVersion {
9
- id: string;
10
- snapshotTree: ISnapshotTree;
9
+ id: string;
10
+ snapshotTree: ISnapshotTree;
11
11
  }
@@ -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
  }