@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
@@ -3,34 +3,33 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { ITelemetryLogger } from "@fluidframework/common-definitions";
7
6
  import {
8
- stringToBuffer,
9
- Uint8ArrayToString,
10
- } from "@fluidframework/common-utils";
7
+ ITelemetryLoggerExt,
8
+ MonitoringContext,
9
+ PerformanceEvent,
10
+ createChildMonitoringContext,
11
+ } from "@fluidframework/telemetry-utils";
12
+ import { stringToBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
11
13
  import {
12
- IDocumentStorageService,
13
- ISummaryContext,
14
- IDocumentStorageServicePolicies,
14
+ IDocumentStorageService,
15
+ ISummaryContext,
16
+ IDocumentStorageServicePolicies,
15
17
  } from "@fluidframework/driver-definitions";
16
- import { buildHierarchy } from "@fluidframework/protocol-base";
18
+ import { buildGitTreeHierarchy } from "@fluidframework/protocol-base";
17
19
  import {
18
- ICreateBlobResponse,
19
- ISnapshotTreeEx,
20
- ISummaryHandle,
21
- ISummaryTree,
22
- IVersion,
20
+ ICreateBlobResponse,
21
+ ISnapshotTreeEx,
22
+ ISummaryHandle,
23
+ ISummaryTree,
24
+ IVersion,
23
25
  } from "@fluidframework/protocol-definitions";
24
- import {
25
- GitManager,
26
- ISummaryUploadManager,
27
- SummaryTreeUploadManager,
28
- } from "@fluidframework/server-services-client";
29
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
30
26
  import { IRouterliciousDriverPolicies } from "./policies";
31
27
  import { ICache, InMemoryCache } from "./cache";
32
28
  import { RetriableGitManager } from "./retriableGitManager";
33
29
  import { ISnapshotTreeVersion } from "./definitions";
30
+ import { GitManager } from "./gitManager";
31
+ import { ISummaryUploadManager } from "./storageContracts";
32
+ import { SummaryTreeUploadManager } from "./summaryTreeUploadManager";
34
33
 
35
34
  const isNode = typeof window === "undefined";
36
35
 
@@ -40,180 +39,200 @@ const isNode = typeof window === "undefined";
40
39
  * Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.
41
40
  */
42
41
  export class ShreddedSummaryDocumentStorageService implements IDocumentStorageService {
43
- // The values of this cache is useless. We only need the keys. So we are always putting
44
- // empty strings as values.
45
- protected readonly blobsShaCache = new Map<string, string>();
46
- private readonly blobCache: ICache<ArrayBufferLike> | undefined;
47
- private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;
48
-
49
- public get repositoryUrl(): string {
50
- return "";
51
- }
52
-
53
- private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {
54
- const manager = await this.getStorageManager();
55
- return new SummaryTreeUploadManager(
56
- new RetriableGitManager(manager, this.logger),
57
- this.blobsShaCache,
58
- this.getPreviousFullSnapshot.bind(this),
59
- );
60
- }
61
-
62
- constructor(
63
- protected readonly id: string,
64
- protected readonly manager: GitManager,
65
- protected readonly logger: ITelemetryLogger,
66
- public readonly policies: IDocumentStorageServicePolicies = {},
67
- driverPolicies?: IRouterliciousDriverPolicies,
68
- blobCache?: ICache<ArrayBufferLike>,
69
- snapshotTreeCache?: ICache<ISnapshotTreeVersion>,
70
- private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async () => this.manager,
71
- ) {
72
- if (driverPolicies?.enableRestLess === true || isNode) {
73
- this.blobCache = blobCache ?? new InMemoryCache();
74
- this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();
75
- }
76
- }
77
-
78
- public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
79
- const id = versionId ? versionId : this.id;
80
- const commits = await PerformanceEvent.timedExecAsync(
81
- this.logger,
82
- {
83
- eventName: "getVersions",
84
- versionId: id,
85
- count,
86
- },
87
- async () => {
88
- const manager = await this.getStorageManager();
89
- return manager.getCommits(id, count);
90
- },
91
- );
92
- return commits.map((commit) => ({
93
- date: commit.commit.author.date,
94
- id: commit.sha,
95
- treeId: commit.commit.tree.sha,
96
- }));
97
- }
98
-
99
- public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {
100
- let requestVersion = version;
101
- if (!requestVersion) {
102
- const versions = await this.getVersions(this.id, 1);
103
- if (versions.length === 0) {
104
- return null;
105
- }
106
-
107
- requestVersion = versions[0];
108
- }
109
-
110
- const cachedSnapshotTree = await this.snapshotTreeCache?.get(this.getCacheKey(requestVersion.treeId));
111
- if (cachedSnapshotTree) {
112
- return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;
113
- }
114
-
115
- const rawTree = await PerformanceEvent.timedExecAsync(
116
- this.logger,
117
- {
118
- eventName: "getSnapshotTree",
119
- treeId: requestVersion.treeId,
120
- },
121
- async (event) => {
122
- const manager = await this.getStorageManager();
123
- const response = await manager.getTree(requestVersion!.treeId);
124
- event.end({
125
- size: response.tree.length,
126
- });
127
- return response;
128
- },
129
- );
130
- const tree = buildHierarchy(rawTree, this.blobsShaCache, true);
131
- await this.snapshotTreeCache?.put(
132
- this.getCacheKey(tree.id),
133
- { id: requestVersion.id, snapshotTree: tree },
134
- );
135
- return tree;
136
- }
137
-
138
- public async readBlob(blobId: string): Promise<ArrayBufferLike> {
139
- const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));
140
- if (cachedBlob) {
141
- return cachedBlob;
142
- }
143
-
144
- const value = await PerformanceEvent.timedExecAsync(
145
- this.logger,
146
- {
147
- eventName: "readBlob",
148
- blobId,
149
- },
150
- async (event) => {
151
- const manager = await this.getStorageManager();
152
- const response = await manager.getBlob(blobId);
153
- event.end({
154
- size: response.size,
155
- });
156
- return response;
157
- },
158
- );
159
- this.blobsShaCache.set(value.sha, "");
160
- const bufferContent = stringToBuffer(value.content, value.encoding);
161
- await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);
162
- return bufferContent;
163
- }
164
-
165
- public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {
166
- const summaryHandle = await PerformanceEvent.timedExecAsync(
167
- this.logger,
168
- {
169
- eventName: "uploadSummaryWithContext",
170
- },
171
- async () => {
172
- const summaryUploadManager = await this.getSummaryUploadManager();
173
- return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? "", "channel");
174
- },
175
- );
176
- return summaryHandle;
177
- }
178
-
179
- public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {
180
- throw new Error("NOT IMPLEMENTED!");
181
- }
182
-
183
- public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {
184
- const uint8ArrayFile = new Uint8Array(file);
185
- return PerformanceEvent.timedExecAsync(
186
- this.logger,
187
- {
188
- eventName: "createBlob",
189
- size: uint8ArrayFile.length,
190
- },
191
- async (event) => {
192
- const manager = await this.getStorageManager();
193
- const response = await manager.createBlob(
194
- Uint8ArrayToString(
195
- uint8ArrayFile, "base64"),
196
- "base64").then((r) => ({ id: r.sha, url: r.url }));
197
- event.end({
198
- blobId: response.id,
199
- });
200
- return response;
201
- },
202
- );
203
- }
204
-
205
- private async getPreviousFullSnapshot(parentHandle: string): Promise<ISnapshotTreeEx | null | undefined> {
206
- return parentHandle
207
- ? this.getVersions(parentHandle, 1)
208
- .then(async (versions) => {
209
- // Clear the cache as the getSnapshotTree call will fill the cache.
210
- this.blobsShaCache.clear();
211
- return this.getSnapshotTree(versions[0]);
212
- })
213
- : undefined;
214
- }
215
-
216
- private getCacheKey(blobId: string): string {
217
- return `${this.id}:${blobId}`;
218
- }
42
+ private readonly mc: MonitoringContext;
43
+ // The values of this cache is useless. We only need the keys. So we are always putting
44
+ // empty strings as values.
45
+ protected readonly blobsShaCache = new Map<string, string>();
46
+ private readonly blobCache: ICache<ArrayBufferLike> | undefined;
47
+ private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;
48
+
49
+ public readonly repositoryUrl = "";
50
+
51
+ private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {
52
+ const manager = await this.getStorageManager();
53
+ return new SummaryTreeUploadManager(
54
+ new RetriableGitManager(manager, this.logger),
55
+ this.blobsShaCache,
56
+ this.getPreviousFullSnapshot.bind(this),
57
+ );
58
+ }
59
+
60
+ constructor(
61
+ protected readonly id: string,
62
+ protected readonly manager: GitManager,
63
+ protected readonly logger: ITelemetryLoggerExt,
64
+ public readonly policies: IDocumentStorageServicePolicies,
65
+ driverPolicies?: IRouterliciousDriverPolicies,
66
+ blobCache?: ICache<ArrayBufferLike>,
67
+ snapshotTreeCache?: ICache<ISnapshotTreeVersion>,
68
+ private readonly getStorageManager: (
69
+ disableCache?: boolean,
70
+ ) => Promise<GitManager> = async () => this.manager,
71
+ ) {
72
+ if (driverPolicies?.enableRestLess === true || isNode) {
73
+ this.blobCache = blobCache ?? new InMemoryCache();
74
+ this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();
75
+ }
76
+
77
+ this.mc = createChildMonitoringContext({
78
+ logger,
79
+ });
80
+ }
81
+
82
+ public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
83
+ const id = versionId ? versionId : this.id;
84
+ const commits = await PerformanceEvent.timedExecAsync(
85
+ this.logger,
86
+ {
87
+ eventName: "getVersions",
88
+ versionId: id,
89
+ count,
90
+ },
91
+ async () => {
92
+ const manager = await this.getStorageManager();
93
+ return (await manager.getCommits(id, count)).content;
94
+ },
95
+ );
96
+ return commits.map((commit) => ({
97
+ date: commit.commit.author.date,
98
+ id: commit.sha,
99
+ treeId: commit.commit.tree.sha,
100
+ }));
101
+ }
102
+
103
+ public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {
104
+ let requestVersion = version;
105
+ if (!requestVersion) {
106
+ const versions = await this.getVersions(this.id, 1);
107
+ if (versions.length === 0) {
108
+ return null;
109
+ }
110
+
111
+ requestVersion = versions[0];
112
+ }
113
+
114
+ const cachedSnapshotTree = await this.snapshotTreeCache?.get(
115
+ this.getCacheKey(requestVersion.treeId),
116
+ );
117
+ if (cachedSnapshotTree) {
118
+ return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;
119
+ }
120
+
121
+ const rawTree = await PerformanceEvent.timedExecAsync(
122
+ this.logger,
123
+ {
124
+ eventName: "getSnapshotTree",
125
+ treeId: requestVersion.treeId,
126
+ },
127
+ async (event) => {
128
+ const manager = await this.getStorageManager();
129
+ const response = (await manager.getTree(requestVersion!.treeId)).content;
130
+ event.end({
131
+ size: response.tree.length,
132
+ });
133
+ return response;
134
+ },
135
+ );
136
+ const tree = buildGitTreeHierarchy(rawTree, this.blobsShaCache, true);
137
+ await this.snapshotTreeCache?.put(this.getCacheKey(tree.id), {
138
+ id: requestVersion.id,
139
+ snapshotTree: tree,
140
+ });
141
+ return tree;
142
+ }
143
+
144
+ public async readBlob(blobId: string): Promise<ArrayBufferLike> {
145
+ const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));
146
+ if (cachedBlob) {
147
+ return cachedBlob;
148
+ }
149
+
150
+ const value = await PerformanceEvent.timedExecAsync(
151
+ this.logger,
152
+ {
153
+ eventName: "readBlob",
154
+ blobId,
155
+ },
156
+ async (event) => {
157
+ const manager = await this.getStorageManager();
158
+ const response = (await manager.getBlob(blobId)).content;
159
+ event.end({
160
+ size: response.size,
161
+ });
162
+ return response;
163
+ },
164
+ undefined, // workers
165
+ undefined, // recordHeapSize
166
+ this.mc.config.getNumber("Fluid.Driver.ReadBlobTelemetrySampling"),
167
+ );
168
+ this.blobsShaCache.set(value.sha, "");
169
+ const bufferContent = stringToBuffer(value.content, value.encoding);
170
+ await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);
171
+ return bufferContent;
172
+ }
173
+
174
+ public async uploadSummaryWithContext(
175
+ summary: ISummaryTree,
176
+ context: ISummaryContext,
177
+ ): Promise<string> {
178
+ const summaryHandle = await PerformanceEvent.timedExecAsync(
179
+ this.logger,
180
+ {
181
+ eventName: "uploadSummaryWithContext",
182
+ proposalHandle: context.proposalHandle,
183
+ ackHandle: context.ackHandle,
184
+ referenceSequenceNumber: context.referenceSequenceNumber,
185
+ },
186
+ async () => {
187
+ const summaryUploadManager = await this.getSummaryUploadManager();
188
+ return summaryUploadManager.writeSummaryTree(
189
+ summary,
190
+ context.ackHandle ?? "",
191
+ "channel",
192
+ );
193
+ },
194
+ );
195
+ return summaryHandle;
196
+ }
197
+
198
+ public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {
199
+ throw new Error("NOT IMPLEMENTED!");
200
+ }
201
+
202
+ public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {
203
+ const uint8ArrayFile = new Uint8Array(file);
204
+ return PerformanceEvent.timedExecAsync(
205
+ this.logger,
206
+ {
207
+ eventName: "createBlob",
208
+ size: uint8ArrayFile.length,
209
+ },
210
+ async (event) => {
211
+ const manager = await this.getStorageManager();
212
+ const response = await manager
213
+ .createBlob(Uint8ArrayToString(uint8ArrayFile, "base64"), "base64")
214
+ .then((r) => ({ id: r.content.sha, url: r.content.url }));
215
+ event.end({
216
+ blobId: response.id,
217
+ });
218
+ return response;
219
+ },
220
+ );
221
+ }
222
+
223
+ private async getPreviousFullSnapshot(
224
+ parentHandle: string,
225
+ ): Promise<ISnapshotTreeEx | null | undefined> {
226
+ return parentHandle
227
+ ? this.getVersions(parentHandle, 1).then(async (versions) => {
228
+ // Clear the cache as the getSnapshotTree call will fill the cache.
229
+ this.blobsShaCache.clear();
230
+ return this.getSnapshotTree(versions[0]);
231
+ })
232
+ : undefined;
233
+ }
234
+
235
+ private getCacheKey(blobId: string): string {
236
+ return `${this.id}:${blobId}`;
237
+ }
219
238
  }
@@ -0,0 +1,63 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import * as git from "@fluidframework/gitresources";
7
+ import * as api from "@fluidframework/protocol-definitions";
8
+ import {
9
+ IWholeSummaryPayload,
10
+ IWholeSummaryPayloadType,
11
+ IWriteSummaryResponse,
12
+ } from "@fluidframework/server-services-client";
13
+ import { IR11sResponse } from "./restWrapper";
14
+ import { IWholeFlatSnapshot } from "./contracts";
15
+
16
+ /**
17
+ * Interface to a generic Git provider
18
+ */
19
+ export interface IHistorian {
20
+ getBlob(sha: string): Promise<IR11sResponse<git.IBlob>>;
21
+ createBlob(blob: git.ICreateBlobParams): Promise<IR11sResponse<git.ICreateBlobResponse>>;
22
+ getCommits(sha: string, count: number): Promise<IR11sResponse<git.ICommitDetails[]>>;
23
+ createTree(tree: git.ICreateTreeParams): Promise<IR11sResponse<git.ITree>>;
24
+ getTree(sha: string, recursive: boolean): Promise<IR11sResponse<git.ITree>>;
25
+ createSummary(
26
+ summary: IWholeSummaryPayload,
27
+ initial?: boolean,
28
+ ): Promise<IR11sResponse<IWriteSummaryResponse>>;
29
+ getSnapshot(sha: string): Promise<IR11sResponse<IWholeFlatSnapshot>>;
30
+ }
31
+
32
+ export interface IGitManager {
33
+ getCommits(sha: string, count: number): Promise<IR11sResponse<git.ICommitDetails[]>>;
34
+ getTree(root: string, recursive: boolean): Promise<IR11sResponse<git.ITree>>;
35
+ getBlob(sha: string): Promise<IR11sResponse<git.IBlob>>;
36
+ createBlob(content: string, encoding: string): Promise<IR11sResponse<git.ICreateBlobResponse>>;
37
+ createGitTree(params: git.ICreateTreeParams): Promise<IR11sResponse<git.ITree>>;
38
+ createSummary(
39
+ summary: IWholeSummaryPayload,
40
+ initial?: boolean,
41
+ ): Promise<IR11sResponse<IWriteSummaryResponse>>;
42
+ getSnapshot(sha: string): Promise<IR11sResponse<IWholeFlatSnapshot>>;
43
+ }
44
+
45
+ /**
46
+ * Uploads a summary to storage.
47
+ */
48
+ export interface ISummaryUploadManager {
49
+ /**
50
+ * Writes summary tree to storage.
51
+ * @param summaryTree - Summary tree to write to storage
52
+ * @param parentHandle - Parent summary acked handle (if available from summary ack)
53
+ * @param summaryType - type of summary being uploaded
54
+ * @param sequenceNumber - optional reference sequence number of the summary
55
+ * @returns Id of created tree as a string.
56
+ */
57
+ writeSummaryTree(
58
+ summaryTree: api.ISummaryTree,
59
+ parentHandle: string,
60
+ summaryType: IWholeSummaryPayloadType,
61
+ sequenceNumber?: number,
62
+ ): Promise<string>;
63
+ }
@@ -0,0 +1,155 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { gitHashFile, IsoBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
7
+ import { assert, unreachableCase } from "@fluidframework/core-utils";
8
+ import { ICreateTreeEntry } from "@fluidframework/gitresources";
9
+ import { getGitMode, getGitType } from "@fluidframework/protocol-base";
10
+ import {
11
+ ISnapshotTreeEx,
12
+ ISummaryTree,
13
+ SummaryObject,
14
+ SummaryType,
15
+ } from "@fluidframework/protocol-definitions";
16
+ import { IWholeSummaryPayloadType } from "@fluidframework/server-services-client";
17
+ import { IGitManager, ISummaryUploadManager } from "./storageContracts";
18
+
19
+ /**
20
+ * Recursively writes summary tree as individual summary blobs.
21
+ */
22
+ export class SummaryTreeUploadManager implements ISummaryUploadManager {
23
+ constructor(
24
+ private readonly manager: IGitManager,
25
+ private readonly blobsShaCache: Map<string, string>,
26
+ private readonly getPreviousFullSnapshot: (
27
+ parentHandle: string,
28
+ ) => Promise<ISnapshotTreeEx | null | undefined>,
29
+ ) {}
30
+
31
+ public async writeSummaryTree(
32
+ summaryTree: ISummaryTree,
33
+ parentHandle: string,
34
+ summaryType: IWholeSummaryPayloadType,
35
+ sequenceNumber?: number,
36
+ initial?: boolean,
37
+ ): Promise<string> {
38
+ const previousFullSnapshot = await this.getPreviousFullSnapshot(parentHandle);
39
+ return this.writeSummaryTreeCore(summaryTree, previousFullSnapshot ?? undefined);
40
+ }
41
+
42
+ private async writeSummaryTreeCore(
43
+ summaryTree: ISummaryTree,
44
+ previousFullSnapshot: ISnapshotTreeEx | undefined,
45
+ ): Promise<string> {
46
+ const entries = await Promise.all(
47
+ Object.keys(summaryTree.tree).map(async (key) => {
48
+ const entry = summaryTree.tree[key];
49
+ const pathHandle = await this.writeSummaryTreeObject(entry, previousFullSnapshot);
50
+ const treeEntry: ICreateTreeEntry = {
51
+ mode: getGitMode(entry),
52
+ path: encodeURIComponent(key),
53
+ sha: pathHandle,
54
+ type: getGitType(entry),
55
+ };
56
+ return treeEntry;
57
+ }),
58
+ );
59
+
60
+ const treeHandle = (await this.manager.createGitTree({ tree: entries })).content;
61
+ return treeHandle.sha;
62
+ }
63
+
64
+ private async writeSummaryTreeObject(
65
+ object: SummaryObject,
66
+ previousFullSnapshot: ISnapshotTreeEx | undefined,
67
+ ): Promise<string> {
68
+ switch (object.type) {
69
+ case SummaryType.Blob: {
70
+ return this.writeSummaryBlob(object.content);
71
+ }
72
+ case SummaryType.Handle: {
73
+ if (previousFullSnapshot === undefined) {
74
+ throw Error("Parent summary does not exist to reference by handle.");
75
+ }
76
+ return this.getIdFromPath(object.handleType, object.handle, previousFullSnapshot);
77
+ }
78
+ case SummaryType.Tree: {
79
+ return this.writeSummaryTreeCore(object, previousFullSnapshot);
80
+ }
81
+ case SummaryType.Attachment: {
82
+ return object.id;
83
+ }
84
+
85
+ default:
86
+ unreachableCase(object, `Unknown type: ${(object as any).type}`);
87
+ }
88
+ }
89
+
90
+ private async writeSummaryBlob(content: string | Uint8Array): Promise<string> {
91
+ const { parsedContent, encoding } =
92
+ typeof content === "string"
93
+ ? { parsedContent: content, encoding: "utf-8" }
94
+ : { parsedContent: Uint8ArrayToString(content, "base64"), encoding: "base64" };
95
+
96
+ // The gitHashFile would return the same hash as returned by the server as blob.sha
97
+ const hash = await gitHashFile(IsoBuffer.from(parsedContent, encoding));
98
+ if (!this.blobsShaCache.has(hash)) {
99
+ this.blobsShaCache.set(hash, "");
100
+ const blob = (await this.manager.createBlob(parsedContent, encoding)).content;
101
+ assert(hash === blob.sha, 0x0b6 /* "Blob.sha and hash do not match!!" */);
102
+ }
103
+ return hash;
104
+ }
105
+
106
+ private getIdFromPath(
107
+ handleType: SummaryType,
108
+ handlePath: string,
109
+ previousFullSnapshot: ISnapshotTreeEx,
110
+ ): string {
111
+ const path = handlePath.split("/").map((part) => decodeURIComponent(part));
112
+ if (path[0] === "") {
113
+ // root of tree should be unnamed
114
+ path.shift();
115
+ }
116
+ if (path.length === 0) {
117
+ return previousFullSnapshot.id;
118
+ }
119
+
120
+ return this.getIdFromPathCore(handleType, path, previousFullSnapshot);
121
+ }
122
+
123
+ private getIdFromPathCore(
124
+ handleType: SummaryType,
125
+ path: string[],
126
+ /** Previous snapshot, subtree relative to this path part */
127
+ previousSnapshot: ISnapshotTreeEx,
128
+ ): string {
129
+ assert(path.length > 0, 0x0b3 /* "Expected at least 1 path part" */);
130
+ const key = path[0];
131
+ if (path.length === 1) {
132
+ switch (handleType) {
133
+ case SummaryType.Blob: {
134
+ const tryId = previousSnapshot.blobs[key];
135
+ assert(
136
+ !!tryId,
137
+ 0x0b4 /* "Parent summary does not have blob handle for specified path." */,
138
+ );
139
+ return tryId;
140
+ }
141
+ case SummaryType.Tree: {
142
+ const tryId = previousSnapshot.trees[key]?.id;
143
+ assert(
144
+ !!tryId,
145
+ 0x0b5 /* "Parent summary does not have tree handle for specified path." */,
146
+ );
147
+ return tryId;
148
+ }
149
+ default:
150
+ throw Error(`Unexpected handle summary object type: "${handleType}".`);
151
+ }
152
+ }
153
+ return this.getIdFromPathCore(handleType, path.slice(1), previousSnapshot.trees[key]);
154
+ }
155
+ }