@fluidframework/odsp-driver 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606

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 (353) hide show
  1. package/dist/WriteBufferUtils.d.ts.map +1 -1
  2. package/dist/WriteBufferUtils.js.map +1 -1
  3. package/dist/compactSnapshotParser.d.ts +1 -1
  4. package/dist/compactSnapshotParser.d.ts.map +1 -1
  5. package/dist/compactSnapshotParser.js +1 -1
  6. package/dist/compactSnapshotParser.js.map +1 -1
  7. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  8. package/dist/compactSnapshotWriter.js +1 -1
  9. package/dist/compactSnapshotWriter.js.map +1 -1
  10. package/dist/contracts.d.ts +2 -2
  11. package/dist/contracts.d.ts.map +1 -1
  12. package/dist/contracts.js.map +1 -1
  13. package/dist/createFile.d.ts +2 -2
  14. package/dist/createFile.d.ts.map +1 -1
  15. package/dist/createFile.js +7 -7
  16. package/dist/createFile.js.map +1 -1
  17. package/dist/createNewContainerOnExistingFile.d.ts +2 -2
  18. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -1
  19. package/dist/createNewContainerOnExistingFile.js +4 -4
  20. package/dist/createNewContainerOnExistingFile.js.map +1 -1
  21. package/dist/createNewUtils.d.ts +2 -2
  22. package/dist/createNewUtils.d.ts.map +1 -1
  23. package/dist/createNewUtils.js +4 -4
  24. package/dist/createNewUtils.js.map +1 -1
  25. package/dist/epochTracker.d.ts +3 -3
  26. package/dist/epochTracker.d.ts.map +1 -1
  27. package/dist/epochTracker.js +4 -4
  28. package/dist/epochTracker.js.map +1 -1
  29. package/dist/fetch.js.map +1 -1
  30. package/dist/fetchSnapshot.d.ts +2 -2
  31. package/dist/fetchSnapshot.d.ts.map +1 -1
  32. package/dist/fetchSnapshot.js +5 -5
  33. package/dist/fetchSnapshot.js.map +1 -1
  34. package/dist/getFileLink.d.ts +1 -1
  35. package/dist/getFileLink.d.ts.map +1 -1
  36. package/dist/getFileLink.js +1 -1
  37. package/dist/getFileLink.js.map +1 -1
  38. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts +1 -1
  39. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -1
  40. package/dist/localOdspDriver/localOdspDeltaStorageService.js +1 -1
  41. package/dist/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
  42. package/dist/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  43. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  44. package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
  45. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +1 -1
  46. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  47. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +1 -1
  48. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  49. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  50. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  51. package/dist/localOdspDriver/localOdspDocumentStorageManager.js +2 -2
  52. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  53. package/dist/odspCache.d.ts +1 -1
  54. package/dist/odspCache.d.ts.map +1 -1
  55. package/dist/odspCache.js.map +1 -1
  56. package/dist/odspDelayLoadedDeltaStream.d.ts +4 -4
  57. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  58. package/dist/odspDelayLoadedDeltaStream.js +11 -6
  59. package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
  60. package/dist/odspDeltaStorageService.d.ts +3 -3
  61. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  62. package/dist/odspDeltaStorageService.js +3 -3
  63. package/dist/odspDeltaStorageService.js.map +1 -1
  64. package/dist/odspDocumentDeltaConnection.d.ts +5 -4
  65. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  66. package/dist/odspDocumentDeltaConnection.js +3 -5
  67. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  68. package/dist/odspDocumentService.d.ts +4 -4
  69. package/dist/odspDocumentService.d.ts.map +1 -1
  70. package/dist/odspDocumentService.js +2 -2
  71. package/dist/odspDocumentService.js.map +1 -1
  72. package/dist/odspDocumentServiceFactory.d.ts +1 -1
  73. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  74. package/dist/odspDocumentServiceFactory.js +1 -1
  75. package/dist/odspDocumentServiceFactory.js.map +1 -1
  76. package/dist/odspDocumentServiceFactoryCore.d.ts +2 -2
  77. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  78. package/dist/odspDocumentServiceFactoryCore.js +2 -2
  79. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  80. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  81. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  82. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  83. package/dist/odspDocumentStorageManager.d.ts +4 -4
  84. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  85. package/dist/odspDocumentStorageManager.js +3 -3
  86. package/dist/odspDocumentStorageManager.js.map +1 -1
  87. package/dist/odspDocumentStorageServiceBase.d.ts +1 -1
  88. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  89. package/dist/odspDocumentStorageServiceBase.js.map +1 -1
  90. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  91. package/dist/odspDriverUrlResolver.js +3 -3
  92. package/dist/odspDriverUrlResolver.js.map +1 -1
  93. package/dist/odspDriverUrlResolverForShareLink.d.ts +1 -1
  94. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  95. package/dist/odspDriverUrlResolverForShareLink.js +2 -2
  96. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  97. package/dist/odspError.d.ts.map +1 -1
  98. package/dist/odspError.js +1 -1
  99. package/dist/odspError.js.map +1 -1
  100. package/dist/odspFluidFileLink.d.ts.map +1 -1
  101. package/dist/odspFluidFileLink.js.map +1 -1
  102. package/dist/odspPublicUtils.js.map +1 -1
  103. package/dist/odspSnapshotParser.d.ts.map +1 -1
  104. package/dist/odspSnapshotParser.js.map +1 -1
  105. package/dist/odspSummaryUploadManager.d.ts +1 -1
  106. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  107. package/dist/odspSummaryUploadManager.js +1 -1
  108. package/dist/odspSummaryUploadManager.js.map +1 -1
  109. package/dist/odspUtils.d.ts +2 -2
  110. package/dist/odspUtils.d.ts.map +1 -1
  111. package/dist/odspUtils.js +2 -2
  112. package/dist/odspUtils.js.map +1 -1
  113. package/dist/opsCaching.d.ts.map +1 -1
  114. package/dist/opsCaching.js.map +1 -1
  115. package/dist/packageVersion.d.ts +1 -1
  116. package/dist/packageVersion.js +1 -1
  117. package/dist/packageVersion.js.map +1 -1
  118. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  119. package/dist/prefetchLatestSnapshot.js +1 -1
  120. package/dist/prefetchLatestSnapshot.js.map +1 -1
  121. package/dist/retryErrorsStorageAdapter.d.ts +2 -2
  122. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  123. package/dist/retryErrorsStorageAdapter.js.map +1 -1
  124. package/dist/retryUtils.d.ts.map +1 -1
  125. package/dist/retryUtils.js.map +1 -1
  126. package/dist/vroom.d.ts +2 -2
  127. package/dist/vroom.d.ts.map +1 -1
  128. package/dist/vroom.js +2 -2
  129. package/dist/vroom.js.map +1 -1
  130. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  131. package/dist/zipItDataRepresentationUtils.js +1 -1
  132. package/dist/zipItDataRepresentationUtils.js.map +1 -1
  133. package/lib/WriteBufferUtils.d.ts.map +1 -1
  134. package/lib/WriteBufferUtils.js +1 -1
  135. package/lib/WriteBufferUtils.js.map +1 -1
  136. package/lib/compactSnapshotParser.d.ts +1 -1
  137. package/lib/compactSnapshotParser.d.ts.map +1 -1
  138. package/lib/compactSnapshotParser.js +1 -1
  139. package/lib/compactSnapshotParser.js.map +1 -1
  140. package/lib/compactSnapshotWriter.d.ts.map +1 -1
  141. package/lib/compactSnapshotWriter.js +2 -2
  142. package/lib/compactSnapshotWriter.js.map +1 -1
  143. package/lib/contracts.d.ts +2 -2
  144. package/lib/contracts.d.ts.map +1 -1
  145. package/lib/contracts.js.map +1 -1
  146. package/lib/createFile.d.ts +2 -2
  147. package/lib/createFile.d.ts.map +1 -1
  148. package/lib/createFile.js +7 -7
  149. package/lib/createFile.js.map +1 -1
  150. package/lib/createNewContainerOnExistingFile.d.ts +2 -2
  151. package/lib/createNewContainerOnExistingFile.d.ts.map +1 -1
  152. package/lib/createNewContainerOnExistingFile.js +4 -4
  153. package/lib/createNewContainerOnExistingFile.js.map +1 -1
  154. package/lib/createNewUtils.d.ts +2 -2
  155. package/lib/createNewUtils.d.ts.map +1 -1
  156. package/lib/createNewUtils.js +5 -5
  157. package/lib/createNewUtils.js.map +1 -1
  158. package/lib/epochTracker.d.ts +3 -3
  159. package/lib/epochTracker.d.ts.map +1 -1
  160. package/lib/epochTracker.js +6 -6
  161. package/lib/epochTracker.js.map +1 -1
  162. package/lib/fetch.js.map +1 -1
  163. package/lib/fetchSnapshot.d.ts +2 -2
  164. package/lib/fetchSnapshot.d.ts.map +1 -1
  165. package/lib/fetchSnapshot.js +6 -6
  166. package/lib/fetchSnapshot.js.map +1 -1
  167. package/lib/getFileLink.d.ts +1 -1
  168. package/lib/getFileLink.d.ts.map +1 -1
  169. package/lib/getFileLink.js +1 -1
  170. package/lib/getFileLink.js.map +1 -1
  171. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts +1 -1
  172. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -1
  173. package/lib/localOdspDriver/localOdspDeltaStorageService.js +1 -1
  174. package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
  175. package/lib/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  176. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  177. package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -1
  178. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts +1 -1
  179. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  180. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js +1 -1
  181. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  182. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  183. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  184. package/lib/localOdspDriver/localOdspDocumentStorageManager.js +2 -2
  185. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  186. package/lib/odspCache.d.ts +1 -1
  187. package/lib/odspCache.d.ts.map +1 -1
  188. package/lib/odspCache.js.map +1 -1
  189. package/lib/odspDelayLoadedDeltaStream.d.ts +4 -4
  190. package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  191. package/lib/odspDelayLoadedDeltaStream.js +11 -6
  192. package/lib/odspDelayLoadedDeltaStream.js.map +1 -1
  193. package/lib/odspDeltaStorageService.d.ts +3 -3
  194. package/lib/odspDeltaStorageService.d.ts.map +1 -1
  195. package/lib/odspDeltaStorageService.js +3 -3
  196. package/lib/odspDeltaStorageService.js.map +1 -1
  197. package/lib/odspDocumentDeltaConnection.d.ts +5 -4
  198. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
  199. package/lib/odspDocumentDeltaConnection.js +4 -6
  200. package/lib/odspDocumentDeltaConnection.js.map +1 -1
  201. package/lib/odspDocumentService.d.ts +4 -4
  202. package/lib/odspDocumentService.d.ts.map +1 -1
  203. package/lib/odspDocumentService.js +2 -2
  204. package/lib/odspDocumentService.js.map +1 -1
  205. package/lib/odspDocumentServiceFactory.d.ts +1 -1
  206. package/lib/odspDocumentServiceFactory.d.ts.map +1 -1
  207. package/lib/odspDocumentServiceFactory.js +1 -1
  208. package/lib/odspDocumentServiceFactory.js.map +1 -1
  209. package/lib/odspDocumentServiceFactoryCore.d.ts +2 -2
  210. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  211. package/lib/odspDocumentServiceFactoryCore.js +4 -4
  212. package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
  213. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  214. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  215. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  216. package/lib/odspDocumentStorageManager.d.ts +4 -4
  217. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  218. package/lib/odspDocumentStorageManager.js +4 -4
  219. package/lib/odspDocumentStorageManager.js.map +1 -1
  220. package/lib/odspDocumentStorageServiceBase.d.ts +1 -1
  221. package/lib/odspDocumentStorageServiceBase.d.ts.map +1 -1
  222. package/lib/odspDocumentStorageServiceBase.js.map +1 -1
  223. package/lib/odspDriverUrlResolver.d.ts.map +1 -1
  224. package/lib/odspDriverUrlResolver.js +3 -3
  225. package/lib/odspDriverUrlResolver.js.map +1 -1
  226. package/lib/odspDriverUrlResolverForShareLink.d.ts +1 -1
  227. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  228. package/lib/odspDriverUrlResolverForShareLink.js +3 -3
  229. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  230. package/lib/odspError.d.ts.map +1 -1
  231. package/lib/odspError.js +1 -1
  232. package/lib/odspError.js.map +1 -1
  233. package/lib/odspFluidFileLink.d.ts.map +1 -1
  234. package/lib/odspFluidFileLink.js +1 -1
  235. package/lib/odspFluidFileLink.js.map +1 -1
  236. package/lib/odspPublicUtils.js +1 -1
  237. package/lib/odspPublicUtils.js.map +1 -1
  238. package/lib/odspSnapshotParser.d.ts.map +1 -1
  239. package/lib/odspSnapshotParser.js.map +1 -1
  240. package/lib/odspSummaryUploadManager.d.ts +1 -1
  241. package/lib/odspSummaryUploadManager.d.ts.map +1 -1
  242. package/lib/odspSummaryUploadManager.js +2 -2
  243. package/lib/odspSummaryUploadManager.js.map +1 -1
  244. package/lib/odspUtils.d.ts +2 -2
  245. package/lib/odspUtils.d.ts.map +1 -1
  246. package/lib/odspUtils.js +3 -3
  247. package/lib/odspUtils.js.map +1 -1
  248. package/lib/opsCaching.d.ts.map +1 -1
  249. package/lib/opsCaching.js.map +1 -1
  250. package/lib/packageVersion.d.ts +1 -1
  251. package/lib/packageVersion.js +1 -1
  252. package/lib/packageVersion.js.map +1 -1
  253. package/lib/prefetchLatestSnapshot.d.ts.map +1 -1
  254. package/lib/prefetchLatestSnapshot.js +2 -2
  255. package/lib/prefetchLatestSnapshot.js.map +1 -1
  256. package/lib/retryErrorsStorageAdapter.d.ts +2 -2
  257. package/lib/retryErrorsStorageAdapter.d.ts.map +1 -1
  258. package/lib/retryErrorsStorageAdapter.js.map +1 -1
  259. package/lib/retryUtils.d.ts.map +1 -1
  260. package/lib/retryUtils.js.map +1 -1
  261. package/lib/test/createNewUtilsTests.spec.js +3 -3
  262. package/lib/test/createNewUtilsTests.spec.js.map +1 -1
  263. package/lib/test/deltaStorageService.spec.js +2 -2
  264. package/lib/test/deltaStorageService.spec.js.map +1 -1
  265. package/lib/test/epochTests.spec.js +2 -2
  266. package/lib/test/epochTests.spec.js.map +1 -1
  267. package/lib/test/epochTestsWithRedemption.spec.js +2 -2
  268. package/lib/test/epochTestsWithRedemption.spec.js.map +1 -1
  269. package/lib/test/fetchSnapshot.spec.js +8 -8
  270. package/lib/test/fetchSnapshot.spec.js.map +1 -1
  271. package/lib/test/getFileLink.spec.js +1 -1
  272. package/lib/test/getFileLink.spec.js.map +1 -1
  273. package/lib/test/getVersions.spec.js +6 -6
  274. package/lib/test/getVersions.spec.js.map +1 -1
  275. package/lib/test/joinSessionCacheTests.spec.js +117 -1
  276. package/lib/test/joinSessionCacheTests.spec.js.map +1 -1
  277. package/lib/test/joinSessionPeriodicCall.spec.js +3 -3
  278. package/lib/test/joinSessionPeriodicCall.spec.js.map +1 -1
  279. package/lib/test/localOdspDriver.spec.js +2 -2
  280. package/lib/test/localOdspDriver.spec.js.map +1 -1
  281. package/lib/test/mockFetch.js +1 -1
  282. package/lib/test/mockFetch.js.map +1 -1
  283. package/lib/test/odspCreateContainer.spec.js +7 -7
  284. package/lib/test/odspCreateContainer.spec.js.map +1 -1
  285. package/lib/test/odspDriverResolverTest.spec.js +2 -2
  286. package/lib/test/odspDriverResolverTest.spec.js.map +1 -1
  287. package/lib/test/odspDriverUrlResolverForShareLink.spec.js +4 -4
  288. package/lib/test/odspDriverUrlResolverForShareLink.spec.js.map +1 -1
  289. package/lib/test/odspError.spec.js +2 -2
  290. package/lib/test/odspError.spec.js.map +1 -1
  291. package/lib/test/opsCaching.spec.js +1 -1
  292. package/lib/test/opsCaching.spec.js.map +1 -1
  293. package/lib/test/prefetchSnapshotTests.spec.js +8 -8
  294. package/lib/test/prefetchSnapshotTests.spec.js.map +1 -1
  295. package/lib/test/snapshotFormatTests.spec.js.map +1 -1
  296. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js +4 -4
  297. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js.map +1 -1
  298. package/lib/test/socketTests/socketMock.js +6 -2
  299. package/lib/test/socketTests/socketMock.js.map +1 -1
  300. package/lib/test/socketTests/socketTests.spec.js +4 -4
  301. package/lib/test/socketTests/socketTests.spec.js.map +1 -1
  302. package/lib/test/tokenFetch.spec.js +1 -1
  303. package/lib/test/tokenFetch.spec.js.map +1 -1
  304. package/lib/test/zipItDataRepresentationTests.spec.js +1 -1
  305. package/lib/test/zipItDataRepresentationTests.spec.js.map +1 -1
  306. package/lib/vroom.d.ts +2 -2
  307. package/lib/vroom.d.ts.map +1 -1
  308. package/lib/vroom.js +2 -2
  309. package/lib/vroom.js.map +1 -1
  310. package/lib/zipItDataRepresentationUtils.d.ts.map +1 -1
  311. package/lib/zipItDataRepresentationUtils.js +1 -1
  312. package/lib/zipItDataRepresentationUtils.js.map +1 -1
  313. package/package.json +19 -16
  314. package/src/WriteBufferUtils.ts +2 -2
  315. package/src/compactSnapshotParser.ts +6 -6
  316. package/src/compactSnapshotWriter.ts +4 -4
  317. package/src/contracts.ts +2 -2
  318. package/src/createFile.ts +18 -18
  319. package/src/createNewContainerOnExistingFile.ts +10 -10
  320. package/src/createNewUtils.ts +13 -13
  321. package/src/epochTracker.ts +21 -21
  322. package/src/fetch.ts +1 -1
  323. package/src/fetchSnapshot.ts +24 -24
  324. package/src/getFileLink.ts +1 -1
  325. package/src/localOdspDriver/localOdspDeltaStorageService.ts +2 -2
  326. package/src/localOdspDriver/localOdspDocumentService.ts +1 -1
  327. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +2 -2
  328. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +3 -3
  329. package/src/odspCache.ts +4 -4
  330. package/src/odspDelayLoadedDeltaStream.ts +26 -22
  331. package/src/odspDeltaStorageService.ts +6 -6
  332. package/src/odspDocumentDeltaConnection.ts +17 -14
  333. package/src/odspDocumentService.ts +15 -15
  334. package/src/odspDocumentServiceFactory.ts +3 -3
  335. package/src/odspDocumentServiceFactoryCore.ts +14 -14
  336. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +2 -2
  337. package/src/odspDocumentStorageManager.ts +22 -22
  338. package/src/odspDocumentStorageServiceBase.ts +4 -4
  339. package/src/odspDriverUrlResolver.ts +4 -4
  340. package/src/odspDriverUrlResolverForShareLink.ts +8 -8
  341. package/src/odspError.ts +2 -2
  342. package/src/odspFluidFileLink.ts +1 -1
  343. package/src/odspPublicUtils.ts +1 -1
  344. package/src/odspSnapshotParser.ts +1 -1
  345. package/src/odspSummaryUploadManager.ts +4 -4
  346. package/src/odspUtils.ts +25 -25
  347. package/src/opsCaching.ts +1 -1
  348. package/src/packageVersion.ts +1 -1
  349. package/src/prefetchLatestSnapshot.ts +12 -12
  350. package/src/retryErrorsStorageAdapter.ts +2 -2
  351. package/src/retryUtils.ts +1 -1
  352. package/src/vroom.ts +6 -6
  353. package/src/zipItDataRepresentationUtils.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"odspCreateContainer.spec.js","sourceRoot":"","sources":["../../src/test/odspCreateContainer.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IDocumentService } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { MockLogger, isFluidError } from \"@fluidframework/telemetry-utils\";\nimport { ISummaryTree, SummaryType } from \"@fluidframework/protocol-definitions\";\nimport { OdspErrorTypes, IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { OdspDocumentServiceFactory } from \"../odspDocumentServiceFactory.js\";\nimport { getOdspResolvedUrl } from \"../odspUtils.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { LocalPersistentCache } from \"../odspCache.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { mockFetchOk, mockFetchMultiple, okResponse } from \"./mockFetch.js\";\n\ndescribe(\"Odsp Create Container Test\", () => {\n\tconst siteUrl = \"https://www.localhost.xxx\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst logger = new MockLogger();\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tconst itemId = \"fakeItemId\";\n\tconst expectedResponse = {\n\t\tcontext: \"http://sp.devinstall/_api/v2.1/$metadata#\",\n\t\tsequenceNumber: 1,\n\t\tsha: \"shaxxshaxx\",\n\t\titemUrl: `http://fake.microsoft.com/_api/v2.1/drives/${driveId}/items/${itemId}`,\n\t\tdriveId,\n\t\titemId,\n\t\tid: \"fakeSummaryHandle\",\n\t};\n\n\tconst odspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\tasync (_options) => \"token\",\n\t\tasync (_options) => \"token\",\n\t\tnew LocalPersistentCache(2000),\n\t\t{ snapshotOptions: { timeout: 2000 } },\n\t);\n\n\tconst createSummary = (putAppTree: boolean, putProtocolTree: boolean): ISummaryTree => {\n\t\tconst summary: ISummaryTree = {\n\t\t\ttype: SummaryType.Tree,\n\t\t\ttree: {},\n\t\t};\n\t\tif (putAppTree) {\n\t\t\tsummary.tree[\".app\"] = {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {},\n\t\t\t};\n\t\t}\n\t\tif (putProtocolTree) {\n\t\t\tsummary.tree[\".protocol\"] = {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\t\t\tcontent: JSON.stringify({\n\t\t\t\t\t\t\tbranch: \"\",\n\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn summary;\n\t};\n\n\tconst createService = async (\n\t\tsummary: ISummaryTree,\n\t\tresolved: IOdspResolvedUrl,\n\t): Promise<IDocumentService> =>\n\t\todspDocumentServiceFactory.createContainer(summary, resolved, logger);\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\tafterEach(() => {\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Check Document Service Successfully\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst docID = await getHashedDocumentId(driveId, itemId);\n\t\tconst summary = createSummary(true, true);\n\t\tconst docService = await mockFetchOk(\n\t\t\tasync () => odspDocumentServiceFactory.createContainer(summary, resolved, logger),\n\t\t\texpectedResponse,\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tconst finalResolverUrl = getOdspResolvedUrl(docService.resolvedUrl);\n\t\tassert.strictEqual(finalResolverUrl.driveId, driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(finalResolverUrl.itemId, itemId, \"ItemId should match\");\n\t\tassert.strictEqual(finalResolverUrl.siteUrl, siteUrl, \"SiteUrl should match\");\n\t\tassert.strictEqual(finalResolverUrl.hashedDocumentId, docID, \"DocId should match\");\n\n\t\tconst url = `https://placeholder/placeholder/${docID}/`;\n\t\tconst snapshotUrl = `${siteUrl}/_api/v2.1/drives/${driveId}/items/${itemId}/opStream/snapshots`;\n\t\tassert.strictEqual(finalResolverUrl.url, url, \"Url should match\");\n\t\tassert.strictEqual(\n\t\t\tfinalResolverUrl.endpoints.snapshotStorageUrl,\n\t\t\tsnapshotUrl,\n\t\t\t\"Snapshot url should match\",\n\t\t);\n\t});\n\n\tit(\"No App Summary\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(false, true);\n\t\tawait assert.rejects(\n\t\t\tcreateService(summary, resolved),\n\t\t\t\"Doc service should not be created because there was no app summary\",\n\t\t);\n\t});\n\n\tit(\"No protocol Summary\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(true, false);\n\t\tawait assert.rejects(\n\t\t\tcreateService(summary, resolved),\n\t\t\t\"Doc service should not be created because there was no protocol summary\",\n\t\t);\n\t});\n\n\tit(\"No item id in response from server\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(true, true);\n\n\t\ttry {\n\t\t\tawait mockFetchMultiple(\n\t\t\t\tasync () => createService(summary, resolved),\n\t\t\t\t[\n\t\t\t\t\t// Due to retry logic in getWithRetryForTokenRefresh() for OdspErrorTypes.incorrectServerResponse\n\t\t\t\t\t// Need to mock two calls\n\t\t\t\t\tasync (): Promise<object> => okResponse({}, {}),\n\t\t\t\t\tasync (): Promise<object> => okResponse({}, {}),\n\t\t\t\t],\n\t\t\t);\n\t\t} catch (error: unknown) {\n\t\t\tassert(isFluidError(error), \"Error should be IFluidError\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tassert.strictEqual((error as any).statusCode, undefined, \"Wrong error code\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.errorType,\n\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\"Error type should be correct\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"ODSP CreateFile call returned no item ID\",\n\t\t\t\t\"Message should be correct\",\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"odspCreateContainer.spec.js","sourceRoot":"","sources":["../../src/test/odspCreateContainer.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IDocumentService } from \"@fluidframework/driver-definitions\";\nimport { IOdspResolvedUrl, OdspErrorTypes } from \"@fluidframework/odsp-driver-definitions\";\nimport { ISummaryTree, SummaryType } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger, isFluidError } from \"@fluidframework/telemetry-utils\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { LocalPersistentCache } from \"../odspCache.js\";\nimport { OdspDocumentServiceFactory } from \"../odspDocumentServiceFactory.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { getOdspResolvedUrl } from \"../odspUtils.js\";\nimport { mockFetchMultiple, mockFetchOk, okResponse } from \"./mockFetch.js\";\n\ndescribe(\"Odsp Create Container Test\", () => {\n\tconst siteUrl = \"https://www.localhost.xxx\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst logger = new MockLogger();\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tconst itemId = \"fakeItemId\";\n\tconst expectedResponse = {\n\t\tcontext: \"http://sp.devinstall/_api/v2.1/$metadata#\",\n\t\tsequenceNumber: 1,\n\t\tsha: \"shaxxshaxx\",\n\t\titemUrl: `http://fake.microsoft.com/_api/v2.1/drives/${driveId}/items/${itemId}`,\n\t\tdriveId,\n\t\titemId,\n\t\tid: \"fakeSummaryHandle\",\n\t};\n\n\tconst odspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\tasync (_options) => \"token\",\n\t\tasync (_options) => \"token\",\n\t\tnew LocalPersistentCache(2000),\n\t\t{ snapshotOptions: { timeout: 2000 } },\n\t);\n\n\tconst createSummary = (putAppTree: boolean, putProtocolTree: boolean): ISummaryTree => {\n\t\tconst summary: ISummaryTree = {\n\t\t\ttype: SummaryType.Tree,\n\t\t\ttree: {},\n\t\t};\n\t\tif (putAppTree) {\n\t\t\tsummary.tree[\".app\"] = {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {},\n\t\t\t};\n\t\t}\n\t\tif (putProtocolTree) {\n\t\t\tsummary.tree[\".protocol\"] = {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\t\t\tcontent: JSON.stringify({\n\t\t\t\t\t\t\tbranch: \"\",\n\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn summary;\n\t};\n\n\tconst createService = async (\n\t\tsummary: ISummaryTree,\n\t\tresolved: IOdspResolvedUrl,\n\t): Promise<IDocumentService> =>\n\t\todspDocumentServiceFactory.createContainer(summary, resolved, logger);\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\tafterEach(() => {\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Check Document Service Successfully\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst docID = await getHashedDocumentId(driveId, itemId);\n\t\tconst summary = createSummary(true, true);\n\t\tconst docService = await mockFetchOk(\n\t\t\tasync () => odspDocumentServiceFactory.createContainer(summary, resolved, logger),\n\t\t\texpectedResponse,\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tconst finalResolverUrl = getOdspResolvedUrl(docService.resolvedUrl);\n\t\tassert.strictEqual(finalResolverUrl.driveId, driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(finalResolverUrl.itemId, itemId, \"ItemId should match\");\n\t\tassert.strictEqual(finalResolverUrl.siteUrl, siteUrl, \"SiteUrl should match\");\n\t\tassert.strictEqual(finalResolverUrl.hashedDocumentId, docID, \"DocId should match\");\n\n\t\tconst url = `https://placeholder/placeholder/${docID}/`;\n\t\tconst snapshotUrl = `${siteUrl}/_api/v2.1/drives/${driveId}/items/${itemId}/opStream/snapshots`;\n\t\tassert.strictEqual(finalResolverUrl.url, url, \"Url should match\");\n\t\tassert.strictEqual(\n\t\t\tfinalResolverUrl.endpoints.snapshotStorageUrl,\n\t\t\tsnapshotUrl,\n\t\t\t\"Snapshot url should match\",\n\t\t);\n\t});\n\n\tit(\"No App Summary\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(false, true);\n\t\tawait assert.rejects(\n\t\t\tcreateService(summary, resolved),\n\t\t\t\"Doc service should not be created because there was no app summary\",\n\t\t);\n\t});\n\n\tit(\"No protocol Summary\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(true, false);\n\t\tawait assert.rejects(\n\t\t\tcreateService(summary, resolved),\n\t\t\t\"Doc service should not be created because there was no protocol summary\",\n\t\t);\n\t});\n\n\tit(\"No item id in response from server\", async () => {\n\t\tconst resolved = await resolver.resolve(request);\n\t\tconst summary = createSummary(true, true);\n\n\t\ttry {\n\t\t\tawait mockFetchMultiple(\n\t\t\t\tasync () => createService(summary, resolved),\n\t\t\t\t[\n\t\t\t\t\t// Due to retry logic in getWithRetryForTokenRefresh() for OdspErrorTypes.incorrectServerResponse\n\t\t\t\t\t// Need to mock two calls\n\t\t\t\t\tasync (): Promise<object> => okResponse({}, {}),\n\t\t\t\t\tasync (): Promise<object> => okResponse({}, {}),\n\t\t\t\t],\n\t\t\t);\n\t\t} catch (error: unknown) {\n\t\t\tassert(isFluidError(error), \"Error should be IFluidError\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tassert.strictEqual((error as any).statusCode, undefined, \"Wrong error code\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.errorType,\n\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\"Error type should be correct\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"ODSP CreateFile call returned no item ID\",\n\t\t\t\t\"Message should be correct\",\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
@@ -4,10 +4,10 @@
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
6
  import { DriverHeader } from "@fluidframework/driver-definitions";
7
- import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
8
- import { getHashedDocumentId } from "../odspPublicUtils.js";
9
7
  import { createOdspCreateContainerRequest } from "../createOdspCreateContainerRequest.js";
10
8
  import { createOdspUrl } from "../createOdspUrl.js";
9
+ import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
10
+ import { getHashedDocumentId } from "../odspPublicUtils.js";
11
11
  describe("Odsp Driver Resolver", () => {
12
12
  const siteUrl = "https://localhost";
13
13
  const driveId = "driveId";
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverResolverTest.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverResolverTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\n\ndescribe(\"Odsp Driver Resolver\", () => {\n\tconst siteUrl = \"https://localhost\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst packageName = \"packageName\";\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\n\tit(\"Can create new request\", async () => {\n\t\tassert.strictEqual(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\trequest.headers?.[DriverHeader.createNew].fileName,\n\t\t\tfileName,\n\t\t\t\"Request should contain fileName\",\n\t\t);\n\t\tconst url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(\n\t\t\tfilePath,\n\t\t)}`;\n\t\tassert.strictEqual(request.url, url, \"Request url should match\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), filePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with a data store\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst expected: IOdspResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tsnapshotStorageUrl: \"\",\n\t\t\t\tattachmentGETStorageUrl: \"\",\n\t\t\t\tattachmentPOSTStorageUrl: \"\",\n\t\t\t\tdeltaStorageUrl: \"\",\n\t\t\t},\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\todspResolvedUrl: true,\n\t\t\tid: \"odspCreateNew\",\n\t\t\turl: \"https://https://localhost?driveId=driveId&path=path&version=null\",\n\t\t\tsiteUrl: \"https://localhost\",\n\t\t\thashedDocumentId: \"\",\n\t\t\tdriveId: \"driveId\",\n\t\t\titemId: \"\",\n\t\t\tfileName: \"fileName\",\n\t\t\tfileVersion: undefined,\n\t\t\tsummarizer: false,\n\t\t\tcodeHint: { containerPackageName: undefined },\n\t\t\tshareLinkInfo: undefined,\n\t\t\tisClpCompliantApp: undefined,\n\t\t};\n\t\tassert.deepStrictEqual(resolvedUrl, expected);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should add codeHint if request contains containerPackageName\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"containerPackageName should match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with a string in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst codeDetails = {\n\t\t\tpackage: packageName,\n\t\t};\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl\", async () => {\n\t\tconst resolvedUrl1 = await resolver.resolve({\n\t\t\turl: createOdspUrl({\n\t\t\t\tdriveId,\n\t\t\t\titemId: \"itemId\",\n\t\t\t\tsiteUrl,\n\t\t\t\tdataStorePath: \"datastore\",\n\t\t\t\tfileVersion: \"0.1\",\n\t\t\t\tappName: \"app\",\n\t\t\t\tcontainerPackageName: packageName,\n\t\t\t}),\n\t\t});\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl1, \"\");\n\n\t\tconst resolvedUrl2 = await resolver.resolve({ url: response });\n\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\"datastore\",\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl2.itemId, \"itemId\", \"Item id should be absent\");\n\t});\n\n\tit(\"Should resolve url given container package info\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\", {\n\t\t\tname: packageName,\n\t\t});\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a IFluidPackage in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst fluidPackage = {\n\t\t\tname: packageName,\n\t\t\tfluid: {},\n\t\t};\n\t\tconst codeDetails = { package: fluidPackage };\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a codeHint in the resolved url\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with empty file path\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"\";\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tundefined,\n\t\t\t\"Container Package Name should be undefined\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), testFilePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with non-empty file path and item id\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t\theaders: { createNew: { fileName: `${fileName}` } },\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +\n\t\t\t`&version=null`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing 3 data object ids\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/data3\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing ending slashes\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2//\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with special characters\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/!@$\";\n\t\tconst itemId = \"item!@$\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"resolves urls with datastore path in url path\", async () => {\n\t\tconst absoluteUrl = \"https://localhost/datastore?driveId=driveId&itemId=&path=/\";\n\t\tconst resolvedUrl = await resolver.resolve({ url: absoluteUrl });\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.url,\n\t\t\t\"https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with file version\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item\";\n\t\tconst fileVersion = \"285.0\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl.fileVersion, fileVersion, \"FileVersion should be equal\");\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"odspDriverResolverTest.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverResolverTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC;IACpC,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAG,UAAU,CAAC;IAC5B,MAAM,WAAW,GAAG,aAAa,CAAC;IAClC,IAAI,QAA+B,CAAC;IACpC,IAAI,OAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACf,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACvC,OAAO,GAAG,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,CAAC,WAAW;QACjB,sEAAsE;QACtE,OAAO,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,EAClD,QAAQ,EACR,iCAAiC,CACjC,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,OAAO,YAAY,kBAAkB,CAAC,OAAO,CAAC,SAAS,kBAAkB,CACvF,QAAQ,CACR,EAAE,CAAC;QACJ,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,8BAA8B,CAC9B,CAAC;QAEF,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAqB;YAClC,SAAS,EAAE;gBACV,kBAAkB,EAAE,EAAE;gBACtB,uBAAuB,EAAE,EAAE;gBAC3B,wBAAwB,EAAE,EAAE;gBAC5B,eAAe,EAAE,EAAE;aACnB;YACD,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,IAAI;YACrB,EAAE,EAAE,eAAe;YACnB,GAAG,EAAE,kEAAkE;YACvE,OAAO,EAAE,mBAAmB;YAC5B,gBAAgB,EAAE,EAAE;YACpB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE;YAC7C,aAAa,EAAE,SAAS;YACxB,iBAAiB,EAAE,SAAS;SAC5B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE1E,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,UAAU,GAAG,OAAO,CAAC;QAC3B,UAAU,CAAC,GAAG,IAAI,yBAAyB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpD,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,EAC1C,WAAW,EACX,mCAAmC,CACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG;YACnB,OAAO,EAAE,WAAW;SACpB,CAAC;QACF,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAC7C,WAAW,EACX,YAAY;QACZ,qGAAqG;QACrG,WAAkB,CAClB,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACxC,WAAW,EACX,mCAAmC,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YAC3C,GAAG,EAAE,aAAa,CAAC;gBAClB,OAAO;gBACP,MAAM,EAAE,QAAQ;gBAChB,OAAO;gBACP,aAAa,EAAE,WAAW;gBAC1B,WAAW,EAAE,KAAK;gBAClB,OAAO,EAAE,KAAK;gBACd,oBAAoB,EAAE,WAAW;aACjC,CAAC;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEjE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,aAAa,EAC1B,WAAW,EACX,+BAA+B,CAC/B,CAAC;QACF,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,QAAQ,EAAE,oBAAoB,EAC3C,WAAW,EACX,+BAA+B,CAC/B,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE;YACzE,IAAI,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACxC,WAAW,EACX,mCAAmC,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG;YACpB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,EAAE;SACT,CAAC;QACF,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC9C,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAC7C,WAAW,EACX,YAAY;QACZ,qGAAqG;QACrG,WAAkB,CAClB,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACxC,WAAW,EACX,mCAAmC,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,UAAU,GAAG,OAAO,CAAC;QAC3B,UAAU,CAAC,GAAG,IAAI,yBAAyB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE1E,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CACjB,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACxC,WAAW,EACX,mCAAmC,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACxD,UAAU;QACV,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,OAAO,GAAG,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAErF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,8BAA8B,CAC9B,CAAC;QACF,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,EAC1C,SAAS,EACT,4CAA4C,CAC5C,CAAC;QAEF,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,UAAU;QACV,MAAM,YAAY,GAAG,OAAO,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC;QACvB,MAAM,WAAW,GAAa;YAC7B,GAAG,EAAE,GAAG,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,EAAE;YAC1E,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE;SACnD,CAAC;QAEF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,8BAA8B,CAC9B,CAAC;QAEF,MAAM,mBAAmB,GACxB,WAAW,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,EAAE;YAC7E,eAAe,CAAC;QACjB,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC/E,UAAU;QACV,MAAM,YAAY,GAAG,mBAAmB,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC;QACvB,MAAM,WAAW,GAAa;YAC7B,GAAG,EAAE,GAAG,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,EAAE;SAC1E,CAAC;QAEF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,gBAAgB,EAC5B,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAC1C,0BAA0B,CAC1B,CAAC;QACF,MAAM,CAAC,cAAc,CACpB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,gCAAgC,CAChC,CAAC;QAEF,MAAM,mBAAmB,GACxB,mCAAmC,WAAW,CAAC,gBAAgB,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,UAAU;QACV,MAAM,YAAY,GAAG,eAAe,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC;QACvB,MAAM,WAAW,GAAa;YAC7B,GAAG,EAAE,GAAG,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,EAAE;SAC1E,CAAC;QAEF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,gBAAgB,EAC5B,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAC1C,0BAA0B,CAC1B,CAAC;QACF,MAAM,CAAC,cAAc,CACpB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,gCAAgC,CAChC,CAAC;QAEF,MAAM,mBAAmB,GACxB,mCAAmC,WAAW,CAAC,gBAAgB,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC3D,UAAU;QACV,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,CAAC;QACzB,MAAM,WAAW,GAAa;YAC7B,GAAG,EAAE,GAAG,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,EAAE;SAC1E,CAAC;QAEF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,gBAAgB,EAC5B,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAC1C,0BAA0B,CAC1B,CAAC;QACF,MAAM,CAAC,cAAc,CACpB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,gCAAgC,CAChC,CAAC;QAEF,MAAM,mBAAmB,GACxB,mCAAmC,WAAW,CAAC,gBAAgB,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,WAAW,GAAG,4DAA4D,CAAC;QACjF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAEjE,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,GAAG,EACf,iFAAiF,CACjF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,UAAU;QACV,MAAM,YAAY,GAAG,OAAO,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC;QACtB,MAAM,WAAW,GAAG,OAAO,CAAC;QAC5B,MAAM,WAAW,GAAa;YAC7B,GAAG,EAAE,GAAG,OAAO,YAAY,OAAO,SAAS,YAAY,WAAW,MAAM,gBAAgB,WAAW,EAAE;SACrG,CAAC;QAEF,MAAM;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CACjB,WAAW,CAAC,gBAAgB,EAC5B,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAC1C,0BAA0B,CAC1B,CAAC;QACF,MAAM,CAAC,cAAc,CACpB,WAAW,CAAC,SAAS,CAAC,kBAAkB,EACxC,EAAE,EACF,gCAAgC,CAChC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,6BAA6B,CAAC,CAAC;QAExF,MAAM,mBAAmB,GACxB,mCAAmC,WAAW,CAAC,gBAAgB,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\n\ndescribe(\"Odsp Driver Resolver\", () => {\n\tconst siteUrl = \"https://localhost\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst packageName = \"packageName\";\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\n\tit(\"Can create new request\", async () => {\n\t\tassert.strictEqual(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\trequest.headers?.[DriverHeader.createNew].fileName,\n\t\t\tfileName,\n\t\t\t\"Request should contain fileName\",\n\t\t);\n\t\tconst url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(\n\t\t\tfilePath,\n\t\t)}`;\n\t\tassert.strictEqual(request.url, url, \"Request url should match\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), filePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with a data store\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst expected: IOdspResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tsnapshotStorageUrl: \"\",\n\t\t\t\tattachmentGETStorageUrl: \"\",\n\t\t\t\tattachmentPOSTStorageUrl: \"\",\n\t\t\t\tdeltaStorageUrl: \"\",\n\t\t\t},\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\todspResolvedUrl: true,\n\t\t\tid: \"odspCreateNew\",\n\t\t\turl: \"https://https://localhost?driveId=driveId&path=path&version=null\",\n\t\t\tsiteUrl: \"https://localhost\",\n\t\t\thashedDocumentId: \"\",\n\t\t\tdriveId: \"driveId\",\n\t\t\titemId: \"\",\n\t\t\tfileName: \"fileName\",\n\t\t\tfileVersion: undefined,\n\t\t\tsummarizer: false,\n\t\t\tcodeHint: { containerPackageName: undefined },\n\t\t\tshareLinkInfo: undefined,\n\t\t\tisClpCompliantApp: undefined,\n\t\t};\n\t\tassert.deepStrictEqual(resolvedUrl, expected);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should add codeHint if request contains containerPackageName\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"containerPackageName should match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with a string in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst codeDetails = {\n\t\t\tpackage: packageName,\n\t\t};\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl\", async () => {\n\t\tconst resolvedUrl1 = await resolver.resolve({\n\t\t\turl: createOdspUrl({\n\t\t\t\tdriveId,\n\t\t\t\titemId: \"itemId\",\n\t\t\t\tsiteUrl,\n\t\t\t\tdataStorePath: \"datastore\",\n\t\t\t\tfileVersion: \"0.1\",\n\t\t\t\tappName: \"app\",\n\t\t\t\tcontainerPackageName: packageName,\n\t\t\t}),\n\t\t});\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl1, \"\");\n\n\t\tconst resolvedUrl2 = await resolver.resolve({ url: response });\n\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\"datastore\",\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl2.itemId, \"itemId\", \"Item id should be absent\");\n\t});\n\n\tit(\"Should resolve url given container package info\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\", {\n\t\t\tname: packageName,\n\t\t});\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a IFluidPackage in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst fluidPackage = {\n\t\t\tname: packageName,\n\t\t\tfluid: {},\n\t\t};\n\t\tconst codeDetails = { package: fluidPackage };\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a codeHint in the resolved url\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with empty file path\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"\";\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tundefined,\n\t\t\t\"Container Package Name should be undefined\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), testFilePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with non-empty file path and item id\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t\theaders: { createNew: { fileName: `${fileName}` } },\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +\n\t\t\t`&version=null`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing 3 data object ids\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/data3\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing ending slashes\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2//\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with special characters\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/!@$\";\n\t\tconst itemId = \"item!@$\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"resolves urls with datastore path in url path\", async () => {\n\t\tconst absoluteUrl = \"https://localhost/datastore?driveId=driveId&itemId=&path=/\";\n\t\tconst resolvedUrl = await resolver.resolve({ url: absoluteUrl });\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.url,\n\t\t\t\"https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with file version\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item\";\n\t\tconst fileVersion = \"285.0\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl.fileVersion, fileVersion, \"FileVersion should be equal\");\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n});\n"]}
@@ -5,13 +5,13 @@
5
5
  /* eslint-disable @typescript-eslint/dot-notation */
6
6
  import { strict as assert } from "node:assert";
7
7
  import { stub } from "sinon";
8
- import { OdspDriverUrlResolverForShareLink } from "../odspDriverUrlResolverForShareLink.js";
9
- import { getHashedDocumentId } from "../odspPublicUtils.js";
8
+ import { SharingLinkHeader } from "../contractsPublic.js";
9
+ import { createOdspCreateContainerRequest } from "../createOdspCreateContainerRequest.js";
10
10
  import { createOdspUrl } from "../createOdspUrl.js";
11
11
  import * as fileLinkImport from "../getFileLink.js";
12
+ import { OdspDriverUrlResolverForShareLink } from "../odspDriverUrlResolverForShareLink.js";
12
13
  import { getLocatorFromOdspUrl, locatorQueryParamName, storeLocatorInOdspUrl, } from "../odspFluidFileLink.js";
13
- import { SharingLinkHeader } from "../contractsPublic.js";
14
- import { createOdspCreateContainerRequest } from "../createOdspCreateContainerRequest.js";
14
+ import { getHashedDocumentId } from "../odspPublicUtils.js";
15
15
  describe("Tests for OdspDriverUrlResolverForShareLink resolver", () => {
16
16
  const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
17
17
  const driveId = "driveId";
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverUrlResolverForShareLink.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverUrlResolverForShareLink.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/dot-notation */\n\nimport { strict as assert } from \"node:assert\";\nimport { stub } from \"sinon\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolverForShareLink } from \"../odspDriverUrlResolverForShareLink.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport * as fileLinkImport from \"../getFileLink.js\";\nimport {\n\tgetLocatorFromOdspUrl,\n\tlocatorQueryParamName,\n\tstoreLocatorInOdspUrl,\n} from \"../odspFluidFileLink.js\";\nimport { SharingLinkHeader } from \"../contractsPublic.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\n\ndescribe(\"Tests for OdspDriverUrlResolverForShareLink resolver\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"fileId\";\n\tconst dataStorePath = \"dataStorePath\";\n\tconst fileName = \"fileName\";\n\tconst fileVersion = \"173.0\";\n\tconst contextObject = { w: \"id1\", i: \"id2\" };\n\tconst contextStringified = JSON.stringify(contextObject);\n\tconst sharelink = \"https://microsoft.sharepoint-df.com/site/SHARELINK\";\n\tconst urlsWithNavParams = [\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&v=173.0\n\t\t{\n\t\t\thasVersion: true,\n\t\t\thasContext: false,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZ2PTE3My4w\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1\n\t\t{\n\t\t\thasVersion: false,\n\t\t\thasContext: false,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=cz0lMkZzaXRlVXJsJmQ9ZHJpdmVJZCZmPWZpbGVJZCZjPWRhdGFTdG9yZVBhdGgmZmx1aWQ9MQ%3D%3D\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&v=173.0&c=%7B%22w%22%3A%22id1%22%2C%22i%22%3A%22id2%22%7D\n\t\t{\n\t\t\thasVersion: true,\n\t\t\thasContext: true,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZ2PTE3My4wJmM9JTdCJTIydyUyMiUzQSUyMmlkMSUyMiUyQyUyMmklMjIlM0ElMjJpZDIlMjIlN0Q%3D\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&c=%7B%22w%22%3A%22id1%22%2C%22i%22%3A%22id2%22%7D\n\t\t{\n\t\t\thasVersion: false,\n\t\t\thasContext: true,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZjPSU3QiUyMnclMjIlM0ElMjJpZDElMjIlMkMlMjJpJTIyJTNBJTIyaWQyJTIyJTdE\",\n\t\t},\n\t];\n\tlet urlResolverWithShareLinkFetcher: OdspDriverUrlResolverForShareLink;\n\tlet urlResolverWithoutShareLinkFetcher: OdspDriverUrlResolverForShareLink;\n\tconst mockResolvedUrl = {\n\t\tsiteUrl,\n\t\tdriveId,\n\t\titemId,\n\t\todspResolvedUrl: true,\n\t} as unknown as IOdspResolvedUrl;\n\n\tbeforeEach(() => {\n\t\turlResolverWithShareLinkFetcher = new OdspDriverUrlResolverForShareLink({\n\t\t\ttokenFetcher: async (): Promise<string> => \"SharingLinkToken\",\n\t\t\tidentityType: \"Enterprise\",\n\t\t});\n\t\turlResolverWithoutShareLinkFetcher = new OdspDriverUrlResolverForShareLink();\n\t});\n\n\tasync function mockGetFileLink<T>(\n\t\tresponse: Promise<string>,\n\t\tcallback: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst getFileLinkStub = stub(fileLinkImport, \"getFileLink\");\n\t\tgetFileLinkStub.returns(response);\n\t\ttry {\n\t\t\treturn await callback();\n\t\t} finally {\n\t\t\tgetFileLinkStub.restore();\n\t\t}\n\t}\n\tfor (const urlWithNav of urlsWithNavParams) {\n\t\tit(`resolve - Should resolve nav link correctly, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\t\tconst resolvedUrl = await resolver.resolve({ url: urlWithNav.url });\n\t\t\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl.fileVersion,\n\t\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\t\"Doc id should be equal\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tresolvedUrl.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t\t});\n\n\t\tit(`resolve - Should resolve odsp driver url correctly, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\t\tconst resolvedUrl1 = await resolver.resolve({ url: urlWithNav.url });\n\t\t\t\tconst url: string = createOdspUrl({ ...resolvedUrl1, dataStorePath });\n\t\t\t\tconst resolvedUrl2 = await resolver.resolve({ url });\n\t\t\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl2.itemId, itemId, \"Item id should be equal\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl2.fileVersion,\n\t\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl2.hashedDocumentId,\n\t\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\t\"Doc id should be equal\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tresolvedUrl2.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t\t});\n\n\t\tit(`resolve - Check conversion in either direction, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: urlWithNav.url });\n\t\t\t});\n\t\t\tconst absoluteUrl = await urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tresolvedUrl,\n\t\t\t\tdataStorePath,\n\t\t\t);\n\t\t\tconst actualNavParam = new URLSearchParams(absoluteUrl).get(\"nav\");\n\t\t\tconst expectedNavParam = new URLSearchParams(sharelink).get(\"nav\");\n\t\t\tassert(actualNavParam !== undefined, \"Nav param should be defined!!\");\n\t\t\tassert.strictEqual(expectedNavParam, actualNavParam, \"Nav param should match\");\n\t\t});\n\n\t\tit(`getAbsoluteUrl - Should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst resolvedUrl1 = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: urlWithNav.url });\n\t\t\t});\n\t\t\tconst absoluteUrl = await urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tresolvedUrl1,\n\t\t\t\t\"\",\n\t\t\t);\n\t\t\tconst actualNavParam = new URLSearchParams(absoluteUrl).get(\"nav\");\n\t\t\tconst expectedNavParam = new URLSearchParams(sharelink).get(\"nav\");\n\t\t\tassert(actualNavParam !== undefined, \"Nav param should be defined!!\");\n\t\t\tassert.strictEqual(expectedNavParam, actualNavParam, \"Nav param should match\");\n\n\t\t\t// Then resolve again.\n\t\t\tconst resolvedUrl2 = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: absoluteUrl });\n\t\t\t});\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\tdataStorePath,\n\t\t\t\t\"dataStorePath should be preserved\",\n\t\t\t);\n\t\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl2.itemId, itemId, \"Item id should be equal\");\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.fileVersion,\n\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.hashedDocumentId,\n\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\"Doc id should be equal\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tresolvedUrl2.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t);\n\t\t});\n\t}\n\n\tit(\"resolve - Should generate sharelink and set it in shareLinkMap if using resolver with TokenFetcher\", async () => {\n\t\tconst url: string = createOdspUrl({ siteUrl, driveId, itemId, dataStorePath });\n\t\tawait mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url });\n\t\t});\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\treturn assert.strictEqual(actualShareLink, sharelink, \"Sharing link should be equal!!\");\n\t});\n\n\tit(\"resolve - Should not generate sharelink if using resolver without TokenFetcher\", async () => {\n\t\tconst url: string = createOdspUrl({ siteUrl, driveId, itemId, dataStorePath });\n\t\tawait mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithoutShareLinkFetcher.resolve({ url });\n\t\t});\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithoutShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\treturn assert.strictEqual(actualShareLink, undefined, \"Sharing link should be undefined\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should generate sharelink if none was generated on resolve\", async () => {\n\t\tconst absoluteUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.getAbsoluteUrl(mockResolvedUrl, dataStorePath);\n\t\t});\n\n\t\tassert(absoluteUrl !== undefined, \"Absolute url should be defined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert.strictEqual(actualShareLink, sharelink, \"Sharing link should be equal!!\");\n\n\t\tconst url = new URL(sharelink);\n\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\tassert.strictEqual(absoluteUrl, url.toString(), \"Absolute url should be equal!!\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should throw if getShareLink throws and clear the promise from shareLinkMap\", async () => {\n\t\tlet success = true;\n\t\tconst absoluteUrl = await mockGetFileLink(\n\t\t\tPromise.reject(new Error(\"No Sharelink\")),\n\t\t\tasync () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\t\tmockResolvedUrl,\n\t\t\t\t\tdataStorePath,\n\t\t\t\t);\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert.strictEqual(error.message, \"No Sharelink\", \"Error should be as expected.\");\n\t\t\tsuccess = false;\n\t\t});\n\n\t\tassert(absoluteUrl === undefined, \"Absolute url should be undefined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert(actualShareLink === undefined, \"Sharing link should be undefined!!\");\n\t\tassert.strictEqual(success, false, \"Error should be as expected!!\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should throw if using resolver without TokenFetcher\", async () => {\n\t\tlet success = true;\n\t\tconst absoluteUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithoutShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tmockResolvedUrl,\n\t\t\t\tdataStorePath,\n\t\t\t);\n\t\t}).catch(() => {\n\t\t\tsuccess = false;\n\t\t});\n\n\t\tassert(absoluteUrl === undefined, \"Absolute url should be undefined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert(actualShareLink === undefined, \"Sharing link should be undefined!!\");\n\t\tassert.strictEqual(success, false, \"Error should be thrown!!\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\tconst request: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tsiteUrl,\n\t\t\t\tdriveId,\n\t\t\t\tdataStorePath,\n\t\t\t\tfileName,\n\t\t\t);\n\t\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\t\"\",\n\t\t\t\t\"Snapshot url should be empty\",\n\t\t\t);\n\n\t\t\tconst [, queryString] = request.url.split(\"?\");\n\t\t\tconst searchParams = new URLSearchParams(queryString);\n\t\t\tassert.strictEqual(\n\t\t\t\tsearchParams.get(\"path\"),\n\t\t\t\tdataStorePath,\n\t\t\t\t\"dataStorePath should match\",\n\t\t\t);\n\t\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t\t};\n\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t});\n\n\tit(\"Sharing link should be set when isSharingLinkToRedeem header is set\", async () => {\n\t\tconst url = new URL(sharelink);\n\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({\n\t\t\t\turl: url.toString(),\n\t\t\t\theaders: { [SharingLinkHeader.isSharingLinkToRedeem]: true },\n\t\t\t});\n\t\t});\n\t\tassert(\n\t\t\tresolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,\n\t\t\t\"Sharing link should be set in resolved url\",\n\t\t);\n\t});\n\n\tit(\"Encode and decode nav param\", async () => {\n\t\tconst encodedUrl = new URL(sharelink);\n\t\tstoreLocatorInOdspUrl(encodedUrl, {\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t\titemId,\n\t\t\tdataStorePath,\n\t\t\tcontext: contextStringified,\n\t\t});\n\n\t\tconst locator = getLocatorFromOdspUrl(encodedUrl);\n\t\tassert.strictEqual(locator?.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(locator?.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(locator?.dataStorePath, dataStorePath, \"DataStore path should be equal\");\n\t\tassert.strictEqual(locator?.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(locator?.context, contextStringified, \"Context should be equal\");\n\t\tconst parsedContext = JSON.parse(locator?.context) as Record<\n\t\t\tstring | number | symbol,\n\t\t\tunknown\n\t\t>;\n\t\tassert.deepStrictEqual(parsedContext, contextObject, \"Context should be de-serializable\");\n\t});\n\n\tit(\"Check nav param removal for share link\", async () => {\n\t\tconst customShareLink = `${sharelink}?query1=q1`;\n\t\tconst url = new URL(customShareLink);\n\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({\n\t\t\t\turl: url.toString(),\n\t\t\t\theaders: { [SharingLinkHeader.isSharingLinkToRedeem]: true },\n\t\t\t});\n\t\t});\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\tcustomShareLink,\n\t\t\t\"Nav param should not exist on sharelink\",\n\t\t);\n\t});\n\n\tit(\"appendLocatorParams - Appends the correct nav param\", async () => {\n\t\tconst testQueryParam = { name: \"query1\", value: \"q1\" };\n\t\tconst customShareLink = `${sharelink}?${testQueryParam.name}=${testQueryParam.value}`;\n\t\tconst testDataStorePath = \"/testpath\";\n\t\tconst appName = \"AppName1\";\n\t\tconst contextVal = \"Context1\";\n\t\tconst testFileVersion = \"123\";\n\t\tconst containerName = \"containerA\";\n\t\tconst urlResolverForShareLink = new OdspDriverUrlResolverForShareLink(\n\t\t\tundefined /* tokenFetcher */,\n\t\t\tundefined /* logger */,\n\t\t\tappName /* appName */,\n\t\t\tasync (_resolvedUrl, _dataStorePath) => contextVal /* context */,\n\t\t);\n\t\tconst resolvedUrl = {\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t\titemId,\n\t\t\todspResolvedUrl: true,\n\t\t\tfileVersion: testFileVersion,\n\t\t\tcodeHint: { containerPackageName: containerName },\n\t\t} as unknown as IOdspResolvedUrl;\n\n\t\tconst resultUrl = new URL(\n\t\t\tawait urlResolverForShareLink.appendLocatorParams(\n\t\t\t\tcustomShareLink,\n\t\t\t\tresolvedUrl,\n\t\t\t\ttestDataStorePath,\n\t\t\t),\n\t\t);\n\n\t\tconst testQueryParamValue = resultUrl.searchParams.get(testQueryParam.name);\n\t\tassert.strictEqual(\n\t\t\ttestQueryParamValue,\n\t\t\ttestQueryParam.value,\n\t\t\t\"original url's query params should be preserved\",\n\t\t);\n\n\t\tconst locatorParamValue = resultUrl.searchParams.get(locatorQueryParamName);\n\t\tassert(locatorParamValue != null, \"locator parameter should exist is the resulting url\");\n\n\t\tconst decodedLocatorParam = getLocatorFromOdspUrl(resultUrl);\n\t\tassert.strictEqual(decodedLocatorParam?.driveId, driveId, \"driveId should be equal\");\n\t\tassert.strictEqual(decodedLocatorParam?.itemId, itemId, \"itemId should be equal\");\n\t\tassert.strictEqual(decodedLocatorParam?.siteUrl, siteUrl, \"siteUrl should be equal\");\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.containerPackageName,\n\t\t\tcontainerName,\n\t\t\t\"containerPackageName should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.appName,\n\t\t\tappName,\n\t\t\t\"appName should be as provided to the OdspDriverUrlResolverForShareLink constructor\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.dataStorePath,\n\t\t\ttestDataStorePath,\n\t\t\t\"dataStore path should be as provided to the appendLocatorParams\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.fileVersion,\n\t\t\ttestFileVersion,\n\t\t\t\"fileVersion should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.context,\n\t\t\tcontextVal,\n\t\t\t\"context value should be as provided to the OdspDriverUrlResolverForShareLink constructor\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"odspDriverUrlResolverForShareLink.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverUrlResolverForShareLink.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/dot-notation */\n\nimport { strict as assert } from \"node:assert\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { stub } from \"sinon\";\nimport { SharingLinkHeader } from \"../contractsPublic.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport * as fileLinkImport from \"../getFileLink.js\";\nimport { OdspDriverUrlResolverForShareLink } from \"../odspDriverUrlResolverForShareLink.js\";\nimport {\n\tgetLocatorFromOdspUrl,\n\tlocatorQueryParamName,\n\tstoreLocatorInOdspUrl,\n} from \"../odspFluidFileLink.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\n\ndescribe(\"Tests for OdspDriverUrlResolverForShareLink resolver\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"fileId\";\n\tconst dataStorePath = \"dataStorePath\";\n\tconst fileName = \"fileName\";\n\tconst fileVersion = \"173.0\";\n\tconst contextObject = { w: \"id1\", i: \"id2\" };\n\tconst contextStringified = JSON.stringify(contextObject);\n\tconst sharelink = \"https://microsoft.sharepoint-df.com/site/SHARELINK\";\n\tconst urlsWithNavParams = [\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&v=173.0\n\t\t{\n\t\t\thasVersion: true,\n\t\t\thasContext: false,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZ2PTE3My4w\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1\n\t\t{\n\t\t\thasVersion: false,\n\t\t\thasContext: false,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=cz0lMkZzaXRlVXJsJmQ9ZHJpdmVJZCZmPWZpbGVJZCZjPWRhdGFTdG9yZVBhdGgmZmx1aWQ9MQ%3D%3D\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&v=173.0&c=%7B%22w%22%3A%22id1%22%2C%22i%22%3A%22id2%22%7D\n\t\t{\n\t\t\thasVersion: true,\n\t\t\thasContext: true,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZ2PTE3My4wJmM9JTdCJTIydyUyMiUzQSUyMmlkMSUyMiUyQyUyMmklMjIlM0ElMjJpZDIlMjIlN0Q%3D\",\n\t\t},\n\t\t// Base64 encoded and then URI encoded string: d=driveId&f=fileId&c=dataStorePath&s=siteUrl&fluid=1&c=%7B%22w%22%3A%22id1%22%2C%22i%22%3A%22id2%22%7D\n\t\t{\n\t\t\thasVersion: false,\n\t\t\thasContext: true,\n\t\t\turl: \"https://microsoft.sharepoint-df.com/test?nav=ZD1kcml2ZUlkJmY9ZmlsZUlkJmM9ZGF0YVN0b3JlUGF0aCZzPXNpdGVVcmwmZmx1aWQ9MSZjPSU3QiUyMnclMjIlM0ElMjJpZDElMjIlMkMlMjJpJTIyJTNBJTIyaWQyJTIyJTdE\",\n\t\t},\n\t];\n\tlet urlResolverWithShareLinkFetcher: OdspDriverUrlResolverForShareLink;\n\tlet urlResolverWithoutShareLinkFetcher: OdspDriverUrlResolverForShareLink;\n\tconst mockResolvedUrl = {\n\t\tsiteUrl,\n\t\tdriveId,\n\t\titemId,\n\t\todspResolvedUrl: true,\n\t} as unknown as IOdspResolvedUrl;\n\n\tbeforeEach(() => {\n\t\turlResolverWithShareLinkFetcher = new OdspDriverUrlResolverForShareLink({\n\t\t\ttokenFetcher: async (): Promise<string> => \"SharingLinkToken\",\n\t\t\tidentityType: \"Enterprise\",\n\t\t});\n\t\turlResolverWithoutShareLinkFetcher = new OdspDriverUrlResolverForShareLink();\n\t});\n\n\tasync function mockGetFileLink<T>(\n\t\tresponse: Promise<string>,\n\t\tcallback: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst getFileLinkStub = stub(fileLinkImport, \"getFileLink\");\n\t\tgetFileLinkStub.returns(response);\n\t\ttry {\n\t\t\treturn await callback();\n\t\t} finally {\n\t\t\tgetFileLinkStub.restore();\n\t\t}\n\t}\n\tfor (const urlWithNav of urlsWithNavParams) {\n\t\tit(`resolve - Should resolve nav link correctly, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\t\tconst resolvedUrl = await resolver.resolve({ url: urlWithNav.url });\n\t\t\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl.fileVersion,\n\t\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\t\"Doc id should be equal\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tresolvedUrl.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t\t});\n\n\t\tit(`resolve - Should resolve odsp driver url correctly, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\t\tconst resolvedUrl1 = await resolver.resolve({ url: urlWithNav.url });\n\t\t\t\tconst url: string = createOdspUrl({ ...resolvedUrl1, dataStorePath });\n\t\t\t\tconst resolvedUrl2 = await resolver.resolve({ url });\n\t\t\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\t\tassert.strictEqual(resolvedUrl2.itemId, itemId, \"Item id should be equal\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl2.fileVersion,\n\t\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tresolvedUrl2.hashedDocumentId,\n\t\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\t\"Doc id should be equal\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tresolvedUrl2.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t\t});\n\n\t\tit(`resolve - Check conversion in either direction, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: urlWithNav.url });\n\t\t\t});\n\t\t\tconst absoluteUrl = await urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tresolvedUrl,\n\t\t\t\tdataStorePath,\n\t\t\t);\n\t\t\tconst actualNavParam = new URLSearchParams(absoluteUrl).get(\"nav\");\n\t\t\tconst expectedNavParam = new URLSearchParams(sharelink).get(\"nav\");\n\t\t\tassert(actualNavParam !== undefined, \"Nav param should be defined!!\");\n\t\t\tassert.strictEqual(expectedNavParam, actualNavParam, \"Nav param should match\");\n\t\t});\n\n\t\tit(`getAbsoluteUrl - Should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl, hasVersion: ${urlWithNav.hasVersion}, hasContext: ${urlWithNav.hasContext}`, async () => {\n\t\t\tconst resolvedUrl1 = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: urlWithNav.url });\n\t\t\t});\n\t\t\tconst absoluteUrl = await urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tresolvedUrl1,\n\t\t\t\t\"\",\n\t\t\t);\n\t\t\tconst actualNavParam = new URLSearchParams(absoluteUrl).get(\"nav\");\n\t\t\tconst expectedNavParam = new URLSearchParams(sharelink).get(\"nav\");\n\t\t\tassert(actualNavParam !== undefined, \"Nav param should be defined!!\");\n\t\t\tassert.strictEqual(expectedNavParam, actualNavParam, \"Nav param should match\");\n\n\t\t\t// Then resolve again.\n\t\t\tconst resolvedUrl2 = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url: absoluteUrl });\n\t\t\t});\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\tdataStorePath,\n\t\t\t\t\"dataStorePath should be preserved\",\n\t\t\t);\n\t\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl2.itemId, itemId, \"Item id should be equal\");\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.fileVersion,\n\t\t\t\turlWithNav.hasVersion ? fileVersion : undefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl2.hashedDocumentId,\n\t\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\t\"Doc id should be equal\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tresolvedUrl2.endpoints.snapshotStorageUrl !== undefined,\n\t\t\t\t\"Snapshot url should not be empty\",\n\t\t\t);\n\t\t});\n\t}\n\n\tit(\"resolve - Should generate sharelink and set it in shareLinkMap if using resolver with TokenFetcher\", async () => {\n\t\tconst url: string = createOdspUrl({ siteUrl, driveId, itemId, dataStorePath });\n\t\tawait mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({ url });\n\t\t});\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\treturn assert.strictEqual(actualShareLink, sharelink, \"Sharing link should be equal!!\");\n\t});\n\n\tit(\"resolve - Should not generate sharelink if using resolver without TokenFetcher\", async () => {\n\t\tconst url: string = createOdspUrl({ siteUrl, driveId, itemId, dataStorePath });\n\t\tawait mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithoutShareLinkFetcher.resolve({ url });\n\t\t});\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithoutShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\treturn assert.strictEqual(actualShareLink, undefined, \"Sharing link should be undefined\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should generate sharelink if none was generated on resolve\", async () => {\n\t\tconst absoluteUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.getAbsoluteUrl(mockResolvedUrl, dataStorePath);\n\t\t});\n\n\t\tassert(absoluteUrl !== undefined, \"Absolute url should be defined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert.strictEqual(actualShareLink, sharelink, \"Sharing link should be equal!!\");\n\n\t\tconst url = new URL(sharelink);\n\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\tassert.strictEqual(absoluteUrl, url.toString(), \"Absolute url should be equal!!\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should throw if getShareLink throws and clear the promise from shareLinkMap\", async () => {\n\t\tlet success = true;\n\t\tconst absoluteUrl = await mockGetFileLink(\n\t\t\tPromise.reject(new Error(\"No Sharelink\")),\n\t\t\tasync () => {\n\t\t\t\treturn urlResolverWithShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\t\tmockResolvedUrl,\n\t\t\t\t\tdataStorePath,\n\t\t\t\t);\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert.strictEqual(error.message, \"No Sharelink\", \"Error should be as expected.\");\n\t\t\tsuccess = false;\n\t\t});\n\n\t\tassert(absoluteUrl === undefined, \"Absolute url should be undefined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert(actualShareLink === undefined, \"Sharing link should be undefined!!\");\n\t\tassert.strictEqual(success, false, \"Error should be as expected!!\");\n\t});\n\n\tit(\"getAbsoluteUrl - Should throw if using resolver without TokenFetcher\", async () => {\n\t\tlet success = true;\n\t\tconst absoluteUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithoutShareLinkFetcher.getAbsoluteUrl(\n\t\t\t\tmockResolvedUrl,\n\t\t\t\tdataStorePath,\n\t\t\t);\n\t\t}).catch(() => {\n\t\t\tsuccess = false;\n\t\t});\n\n\t\tassert(absoluteUrl === undefined, \"Absolute url should be undefined!!\");\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\tconst actualShareLink = await urlResolverWithShareLinkFetcher[\"sharingLinkCache\"].get(\n\t\t\t`${siteUrl},${driveId},${itemId}`,\n\t\t);\n\t\tassert(actualShareLink === undefined, \"Sharing link should be undefined!!\");\n\t\tassert.strictEqual(success, false, \"Error should be thrown!!\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst runTest = async (resolver: OdspDriverUrlResolverForShareLink): Promise<void> => {\n\t\t\tconst request: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tsiteUrl,\n\t\t\t\tdriveId,\n\t\t\t\tdataStorePath,\n\t\t\t\tfileName,\n\t\t\t);\n\t\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\t\tassert.strictEqual(\n\t\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\t\"\",\n\t\t\t\t\"Snapshot url should be empty\",\n\t\t\t);\n\n\t\t\tconst [, queryString] = request.url.split(\"?\");\n\t\t\tconst searchParams = new URLSearchParams(queryString);\n\t\t\tassert.strictEqual(\n\t\t\t\tsearchParams.get(\"path\"),\n\t\t\t\tdataStorePath,\n\t\t\t\t\"dataStorePath should match\",\n\t\t\t);\n\t\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t\t};\n\t\tawait runTest(urlResolverWithShareLinkFetcher);\n\t\tawait runTest(urlResolverWithoutShareLinkFetcher);\n\t});\n\n\tit(\"Sharing link should be set when isSharingLinkToRedeem header is set\", async () => {\n\t\tconst url = new URL(sharelink);\n\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({\n\t\t\t\turl: url.toString(),\n\t\t\t\theaders: { [SharingLinkHeader.isSharingLinkToRedeem]: true },\n\t\t\t});\n\t\t});\n\t\tassert(\n\t\t\tresolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,\n\t\t\t\"Sharing link should be set in resolved url\",\n\t\t);\n\t});\n\n\tit(\"Encode and decode nav param\", async () => {\n\t\tconst encodedUrl = new URL(sharelink);\n\t\tstoreLocatorInOdspUrl(encodedUrl, {\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t\titemId,\n\t\t\tdataStorePath,\n\t\t\tcontext: contextStringified,\n\t\t});\n\n\t\tconst locator = getLocatorFromOdspUrl(encodedUrl);\n\t\tassert.strictEqual(locator?.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(locator?.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(locator?.dataStorePath, dataStorePath, \"DataStore path should be equal\");\n\t\tassert.strictEqual(locator?.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(locator?.context, contextStringified, \"Context should be equal\");\n\t\tconst parsedContext = JSON.parse(locator?.context) as Record<\n\t\t\tstring | number | symbol,\n\t\t\tunknown\n\t\t>;\n\t\tassert.deepStrictEqual(parsedContext, contextObject, \"Context should be de-serializable\");\n\t});\n\n\tit(\"Check nav param removal for share link\", async () => {\n\t\tconst customShareLink = `${sharelink}?query1=q1`;\n\t\tconst url = new URL(customShareLink);\n\t\tstoreLocatorInOdspUrl(url, { siteUrl, driveId, itemId, dataStorePath });\n\t\tconst resolvedUrl = await mockGetFileLink(Promise.resolve(sharelink), async () => {\n\t\t\treturn urlResolverWithShareLinkFetcher.resolve({\n\t\t\t\turl: url.toString(),\n\t\t\t\theaders: { [SharingLinkHeader.isSharingLinkToRedeem]: true },\n\t\t\t});\n\t\t});\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\tcustomShareLink,\n\t\t\t\"Nav param should not exist on sharelink\",\n\t\t);\n\t});\n\n\tit(\"appendLocatorParams - Appends the correct nav param\", async () => {\n\t\tconst testQueryParam = { name: \"query1\", value: \"q1\" };\n\t\tconst customShareLink = `${sharelink}?${testQueryParam.name}=${testQueryParam.value}`;\n\t\tconst testDataStorePath = \"/testpath\";\n\t\tconst appName = \"AppName1\";\n\t\tconst contextVal = \"Context1\";\n\t\tconst testFileVersion = \"123\";\n\t\tconst containerName = \"containerA\";\n\t\tconst urlResolverForShareLink = new OdspDriverUrlResolverForShareLink(\n\t\t\tundefined /* tokenFetcher */,\n\t\t\tundefined /* logger */,\n\t\t\tappName /* appName */,\n\t\t\tasync (_resolvedUrl, _dataStorePath) => contextVal /* context */,\n\t\t);\n\t\tconst resolvedUrl = {\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t\titemId,\n\t\t\todspResolvedUrl: true,\n\t\t\tfileVersion: testFileVersion,\n\t\t\tcodeHint: { containerPackageName: containerName },\n\t\t} as unknown as IOdspResolvedUrl;\n\n\t\tconst resultUrl = new URL(\n\t\t\tawait urlResolverForShareLink.appendLocatorParams(\n\t\t\t\tcustomShareLink,\n\t\t\t\tresolvedUrl,\n\t\t\t\ttestDataStorePath,\n\t\t\t),\n\t\t);\n\n\t\tconst testQueryParamValue = resultUrl.searchParams.get(testQueryParam.name);\n\t\tassert.strictEqual(\n\t\t\ttestQueryParamValue,\n\t\t\ttestQueryParam.value,\n\t\t\t\"original url's query params should be preserved\",\n\t\t);\n\n\t\tconst locatorParamValue = resultUrl.searchParams.get(locatorQueryParamName);\n\t\tassert(locatorParamValue != null, \"locator parameter should exist is the resulting url\");\n\n\t\tconst decodedLocatorParam = getLocatorFromOdspUrl(resultUrl);\n\t\tassert.strictEqual(decodedLocatorParam?.driveId, driveId, \"driveId should be equal\");\n\t\tassert.strictEqual(decodedLocatorParam?.itemId, itemId, \"itemId should be equal\");\n\t\tassert.strictEqual(decodedLocatorParam?.siteUrl, siteUrl, \"siteUrl should be equal\");\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.containerPackageName,\n\t\t\tcontainerName,\n\t\t\t\"containerPackageName should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.appName,\n\t\t\tappName,\n\t\t\t\"appName should be as provided to the OdspDriverUrlResolverForShareLink constructor\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.dataStorePath,\n\t\t\ttestDataStorePath,\n\t\t\t\"dataStore path should be as provided to the appendLocatorParams\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.fileVersion,\n\t\t\ttestFileVersion,\n\t\t\t\"fileVersion should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tdecodedLocatorParam?.context,\n\t\t\tcontextVal,\n\t\t\t\"context value should be as provided to the OdspDriverUrlResolverForShareLink constructor\",\n\t\t);\n\t});\n});\n"]}
@@ -3,11 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { createOdspNetworkError, throwOdspNetworkError, } from "@fluidframework/odsp-doclib-utils/internal";
7
6
  import { NonRetryableError } from "@fluidframework/driver-utils";
7
+ import { createOdspNetworkError, throwOdspNetworkError, } from "@fluidframework/odsp-doclib-utils/internal";
8
8
  import { OdspErrorTypes } from "@fluidframework/odsp-driver-definitions";
9
- import { fetchAndParseAsJSONHelper, getWithRetryForTokenRefresh } from "../odspUtils.js";
10
9
  import { errorObjectFromSocketError } from "../odspError.js";
10
+ import { fetchAndParseAsJSONHelper, getWithRetryForTokenRefresh } from "../odspUtils.js";
11
11
  import { pkgVersion } from "../packageVersion.js";
12
12
  import { mockFetchError } from "./mockFetch.js";
13
13
  describe("Odsp Error", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"odspError.spec.js","sourceRoot":"","sources":["../../src/test/odspError.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport {\n\tcreateOdspNetworkError,\n\tthrowOdspNetworkError,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport { NonRetryableError, type AuthorizationError } from \"@fluidframework/driver-utils\";\nimport { OdspError, OdspErrorTypes } from \"@fluidframework/odsp-driver-definitions\";\nimport { IAuthorizationError, IGenericNetworkError } from \"@fluidframework/driver-definitions\";\nimport { IThrottlingWarning } from \"@fluidframework/core-interfaces\";\nimport { IFluidErrorBase } from \"@fluidframework/telemetry-utils\";\nimport { IOdspSocketError } from \"../contracts.js\";\nimport { fetchAndParseAsJSONHelper, getWithRetryForTokenRefresh } from \"../odspUtils.js\";\nimport { errorObjectFromSocketError } from \"../odspError.js\";\nimport { pkgVersion } from \"../packageVersion.js\";\nimport { mockFetchError } from \"./mockFetch.js\";\n\ndescribe(\"Odsp Error\", () => {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponse = {\n\t\t// Implements only part of Response.headers\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\t/**\n\t * Checks if the input is an {@link IGenericNetworkError}.\n\t */\n\tfunction isIGenericNetworkError(input: unknown): input is IGenericNetworkError {\n\t\treturn (\n\t\t\t(input as Partial<IGenericNetworkError>)?.errorType ===\n\t\t\tOdspErrorTypes.genericNetworkError\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the input is an {@link IThrottlingWarning}.\n\t */\n\tfunction isIThrottlingWarning(input: unknown): input is IThrottlingWarning {\n\t\treturn (input as Partial<IThrottlingWarning>)?.errorType === OdspErrorTypes.throttlingError;\n\t}\n\n\t/**\n\t * Checks if the input is an {@link IThrottlingWarning}.\n\t */\n\tfunction isIAuthorizationError(input: unknown): input is IAuthorizationError {\n\t\treturn (\n\t\t\t(input as Partial<IAuthorizationError>)?.errorType === OdspErrorTypes.authorizationError\n\t\t);\n\t}\n\n\tfunction createOdspNetworkErrorWithResponse(\n\t\terrorMessage: string,\n\t\tstatusCode: number,\n\t\tresponse?: Response,\n\t\tresponseText?: string,\n\t): IFluidErrorBase & OdspError {\n\t\ttry {\n\t\t\tthrowOdspNetworkError(errorMessage, statusCode, response ?? testResponse, responseText);\n\t\t\tassert.fail(\"Not reached - throwOdspNetworkError should have thrown\");\n\t\t} catch (error) {\n\t\t\treturn error as IFluidErrorBase & OdspError;\n\t\t}\n\t}\n\n\tit(\"throwOdspNetworkError first-class properties\", async () => {\n\t\tconst networkError = createOdspNetworkErrorWithResponse(\"some message\", 400);\n\t\tif (networkError.errorType !== OdspErrorTypes.genericNetworkError) {\n\t\t\tassert.fail(\"networkError should be a genericNetworkError\");\n\t\t}\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"some message\"),\n\t\t\t\"message should contain original message\",\n\t\t);\n\t\tassert(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(networkError as any).responseType === \"default\",\n\t\t\t\"message should contain Response.type\",\n\t\t);\n\t\tassert.equal(false, networkError.canRetry, \"canRetry should be false\");\n\t});\n\n\tit(\"throwOdspNetworkError sprequestguid exists\", async () => {\n\t\tconst error1 = createOdspNetworkErrorWithResponse(\"some message\", 400);\n\t\tconst errorBag = { ...error1.getTelemetryProperties() };\n\t\tassert.equal(\"xxx-xxx\", errorBag.sprequestguid, \"sprequestguid should be 'xxx-xxx'\");\n\t});\n\n\tit(\"throwOdspNetworkError sprequestguid undefined\", async () => {\n\t\tconst error1 = createOdspNetworkError(\"some message\", 400);\n\t\tconst errorBag = { ...error1.getTelemetryProperties() };\n\t\tassert.equal(undefined, errorBag.sprequestguid, \"sprequestguid should not be defined\");\n\t});\n\n\tit(\"errorObjectFromSocketError no retryAfter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"disconnect\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"disconnect\"),\n\t\t\t\"error message should include handler name\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t});\n\n\tit(\"errorObjectFromSocketError with retryFilter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"error\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(networkError.message.includes(\"error\"), \"error message should include handler name\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t});\n\n\tit(\"errorObjectFromSocketError with inner errors\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t\terror: {\n\t\t\t\tcode: \"notAllowed\",\n\t\t\t\tinnerError: {\n\t\t\t\t\tcode: \"ipBlocked\",\n\t\t\t\t\tinnerError: {\n\t\t\t\t\t\tcode: \"SurelyBlocked\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmessage: \"Blocking due to policy\",\n\t\t\t},\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"error\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(networkError.message.includes(\"error\"), \"error message should include handler name\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t\tassert.equal(\n\t\t\tnetworkError.getTelemetryProperties().innerMostErrorCode,\n\t\t\t\"SurelyBlocked\",\n\t\t\t\"Innermost error code should be correct\",\n\t\t);\n\t\tassert.equal(networkError.facetCodes?.length, 3, \"3 facet codes should be there\");\n\t});\n\n\tit(\"errorObjectFromSocketError with retryAfter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 429,\n\t\t\tretryAfter: 10,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"handler\");\n\t\tassert(isIThrottlingWarning(networkError), \"networkError should be a throttlingError\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"handler\"),\n\t\t\t\"error message should include handler name\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.retryAfterSeconds, 10);\n\t});\n\n\tit(\"Access Denied retries\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowOdspNetworkError(\"some error\", 401, testResponse);\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with new token\");\n\t});\n\n\tit(\"fetch incorrect response retries\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"some message\",\n\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t{ driverVersion: pkgVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with new token\");\n\t});\n\n\tit(\"404 errors - no retries\", async () => {\n\t\tconst res = getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowOdspNetworkError(\"some error\", 404, testResponse);\n\t\t\t}\n\t\t});\n\t\tawait assert.rejects(res, \"Other errors should not result in retries!\");\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponseWithInsufficientClaims = {\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\tif (name === \"www-authenticate\") {\n\t\t\t\t\treturn 'Bearer realm=\"6c482541-f706-4168-9e58-8e35a9992f58\",client_id=\"00000003-0000-0ff1-ce00-000000000000\",trusted_issuers=\"00000001-0000-0000-c000-000000000000@*,D3776938-3DBA-481F-A652-4BEDFCAB7CD8@*,https://sts.windows.net/*/,00000003-0000-0ff1-ce00-000000000000@90140122-8516-11e1-8eff-49304924019b\",authorization_uri=\"https://login.windows.net/common/oauth2/authorize\",error=\"insufficient_claims\",claims=\"eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTU5Nzk1OTA5MCJ9fX0=\"';\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\tfunction throwAuthorizationErrorWithInsufficientClaims(errorMessage: string): void {\n\t\tthrowOdspNetworkError(errorMessage, 401, testResponseWithInsufficientClaims);\n\t}\n\n\tit(\"Authorization error with insufficient claims first-class properties\", async () => {\n\t\ttry {\n\t\t\tthrowAuthorizationErrorWithInsufficientClaims(\"TestMessage\");\n\t\t} catch (error: unknown) {\n\t\t\tassert(isIAuthorizationError(error), \"error should be a IAuthorizationError\");\n\t\t\tassert(\n\t\t\t\terror.message.includes(\"TestMessage\"),\n\t\t\t\t\"message should contain original message\",\n\t\t\t);\n\t\t\tassert.equal((error as AuthorizationError).canRetry, false, \"canRetry should be false\");\n\t\t\tassert.equal(\n\t\t\t\t(error as AuthorizationError).claims,\n\t\t\t\t'{\"access_token\":{\"nbf\":{\"essential\":true, \"value\":\"1597959090\"}}}',\n\t\t\t\t\"claims should be extracted from response\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"Authorization error with insufficient claims results in retry with claims passed in options\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (\n\t\t\t\toptions.refresh &&\n\t\t\t\toptions.claims ===\n\t\t\t\t\t'{\"access_token\":{\"nbf\":{\"essential\":true, \"value\":\"1597959090\"}}}'\n\t\t\t) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowAuthorizationErrorWithInsufficientClaims(\"some error\");\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with claims\");\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponseWithRealm = {\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\tif (name === \"www-authenticate\") {\n\t\t\t\t\treturn 'Bearer realm=\"6c482541-f706-4168-9e58-8e35a9992f58\",client_id=\"00000003-0000-0ff1-ce00-000000000000\",trusted_issuers=\"00000001-0000-0000-c000-000000000000@*,D3776938-3DBA-481F-A652-4BEDFCAB7CD8@*,https://sts.windows.net/*/,00000003-0000-0ff1-ce00-000000000000@90140122-8516-11e1-8eff-49304924019b\",authorization_uri=\"https://login.windows.net/common/oauth2/authorize\"';\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\tfunction throwAuthorizationErrorWithRealm(errorMessage: string): void {\n\t\tthrowOdspNetworkError(errorMessage, 401, testResponseWithRealm);\n\t}\n\n\tit(\"Authorization error with realm first-class properties\", async () => {\n\t\ttry {\n\t\t\tthrowAuthorizationErrorWithRealm(\"TestMessage\");\n\t\t} catch (error: unknown) {\n\t\t\tassert(isIAuthorizationError(error), \"error should be a IAuthorizationError\");\n\t\t\tassert(\n\t\t\t\terror.message.includes(\"TestMessage\"),\n\t\t\t\t\"message should contain original message\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\t(error as AuthorizationError).canRetry,\n\t\t\t\tfalse,\n\t\t\t\t\"canRetry should be false\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\t(error as AuthorizationError).tenantId,\n\t\t\t\t\"6c482541-f706-4168-9e58-8e35a9992f58\",\n\t\t\t\t\"realm should be extracted from response\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"Authorization error with realm results in retry and realm passed as tenant id\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh && options.tenantId === \"6c482541-f706-4168-9e58-8e35a9992f58\") {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowAuthorizationErrorWithRealm(\"some error\");\n\t\t\t}\n\t\t});\n\t\tassert.strictEqual(res, 1, \"did not successfully retried with realm passed as tenantId\");\n\t});\n\n\tit(\"Check Epoch Mismatch error props\", async () => {\n\t\tconst error = createOdspNetworkErrorWithResponse(\"epochMismatch\", 409);\n\t\tassert.strictEqual(\n\t\t\terror.errorType,\n\t\t\tOdspErrorTypes.fileOverwrittenInStorage,\n\t\t\t\"Error type should be fileOverwrittenInStorage\",\n\t\t);\n\t\tconst errorBag = { ...error.getTelemetryProperties() };\n\t\tassert.strictEqual(\n\t\t\terrorBag.errorType,\n\t\t\tOdspErrorTypes.fileOverwrittenInStorage,\n\t\t\t\"Error type should exist in prop bag\",\n\t\t);\n\t});\n\n\tit(\"Check odsp domain move error\", async () => {\n\t\tconst redirectLocation = \"www.fake.com\";\n\t\tconst responseText = {\n\t\t\terror: {\n\t\t\t\t\"@error.redirectLocation\": redirectLocation,\n\t\t\t\t\"code\": \"itemNotFound\",\n\t\t\t\t\"message\": \"The site has been moved to a new location.\",\n\t\t\t\t\"innerError\": {},\n\t\t\t},\n\t\t};\n\t\tconst error = createOdspNetworkErrorWithResponse(\n\t\t\t\"The site has been moved to a new location.\",\n\t\t\t404,\n\t\t\tundefined,\n\t\t\tJSON.stringify(responseText),\n\t\t);\n\t\tassert.strictEqual(\n\t\t\terror.errorType,\n\t\t\tOdspErrorTypes.fileNotFoundOrAccessDeniedError,\n\t\t\t\"Error type should be fileNotFoundOrAccessDeniedError\",\n\t\t);\n\t\tassert.strictEqual(error.redirectLocation, redirectLocation, \"Site location should match\");\n\t\tassert.strictEqual(\n\t\t\t(error as IGenericNetworkError).statusCode,\n\t\t\t404,\n\t\t\t\"Status code should match\",\n\t\t);\n\t});\n\n\tit(\"Sharepoint url should be redacted in the error\", async () => {\n\t\ttry {\n\t\t\tawait mockFetchError(\n\t\t\t\tasync () =>\n\t\t\t\t\tfetchAndParseAsJSONHelper(\"https://microsoft.sharepoint-df.com/siteUrl\", {}),\n\t\t\t\tnew Error(\n\t\t\t\t\t\"Request to https://6c482541-f706-4168-9e58-8e35a9992f58.sharepoint.com failed\",\n\t\t\t\t),\n\t\t\t);\n\t\t\tassert.fail(\"Fetch should throw an error\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\tassert(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(error.message as string).includes(\"REDACTED_URL\"),\n\t\t\t\t\"sharepoint url should get redacted\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"url should be redacted in the error\", async () => {\n\t\ttry {\n\t\t\tawait mockFetchError(\n\t\t\t\tasync () =>\n\t\t\t\t\tfetchAndParseAsJSONHelper(\"https://microsoft.sharepoint-df.com/siteUrl\", {}),\n\t\t\t\tnew Error(\"Request to http://f706-4168-9e58-8e35a9992f58.COM failed\"),\n\t\t\t);\n\t\t\tassert.fail(\"Fetch should throw an error\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert((error.message as string).includes(\"REDACTED_URL\"), \"url should get redacted\");\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"odspError.spec.js","sourceRoot":"","sources":["../../src/test/odspError.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IThrottlingWarning } from \"@fluidframework/core-interfaces\";\nimport { IAuthorizationError, IGenericNetworkError } from \"@fluidframework/driver-definitions\";\nimport { type AuthorizationError, NonRetryableError } from \"@fluidframework/driver-utils\";\nimport {\n\tcreateOdspNetworkError,\n\tthrowOdspNetworkError,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport { OdspError, OdspErrorTypes } from \"@fluidframework/odsp-driver-definitions\";\nimport { IFluidErrorBase } from \"@fluidframework/telemetry-utils\";\nimport { IOdspSocketError } from \"../contracts.js\";\nimport { errorObjectFromSocketError } from \"../odspError.js\";\nimport { fetchAndParseAsJSONHelper, getWithRetryForTokenRefresh } from \"../odspUtils.js\";\nimport { pkgVersion } from \"../packageVersion.js\";\nimport { mockFetchError } from \"./mockFetch.js\";\n\ndescribe(\"Odsp Error\", () => {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponse = {\n\t\t// Implements only part of Response.headers\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\t/**\n\t * Checks if the input is an {@link IGenericNetworkError}.\n\t */\n\tfunction isIGenericNetworkError(input: unknown): input is IGenericNetworkError {\n\t\treturn (\n\t\t\t(input as Partial<IGenericNetworkError>)?.errorType ===\n\t\t\tOdspErrorTypes.genericNetworkError\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the input is an {@link IThrottlingWarning}.\n\t */\n\tfunction isIThrottlingWarning(input: unknown): input is IThrottlingWarning {\n\t\treturn (input as Partial<IThrottlingWarning>)?.errorType === OdspErrorTypes.throttlingError;\n\t}\n\n\t/**\n\t * Checks if the input is an {@link IThrottlingWarning}.\n\t */\n\tfunction isIAuthorizationError(input: unknown): input is IAuthorizationError {\n\t\treturn (\n\t\t\t(input as Partial<IAuthorizationError>)?.errorType === OdspErrorTypes.authorizationError\n\t\t);\n\t}\n\n\tfunction createOdspNetworkErrorWithResponse(\n\t\terrorMessage: string,\n\t\tstatusCode: number,\n\t\tresponse?: Response,\n\t\tresponseText?: string,\n\t): IFluidErrorBase & OdspError {\n\t\ttry {\n\t\t\tthrowOdspNetworkError(errorMessage, statusCode, response ?? testResponse, responseText);\n\t\t\tassert.fail(\"Not reached - throwOdspNetworkError should have thrown\");\n\t\t} catch (error) {\n\t\t\treturn error as IFluidErrorBase & OdspError;\n\t\t}\n\t}\n\n\tit(\"throwOdspNetworkError first-class properties\", async () => {\n\t\tconst networkError = createOdspNetworkErrorWithResponse(\"some message\", 400);\n\t\tif (networkError.errorType !== OdspErrorTypes.genericNetworkError) {\n\t\t\tassert.fail(\"networkError should be a genericNetworkError\");\n\t\t}\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"some message\"),\n\t\t\t\"message should contain original message\",\n\t\t);\n\t\tassert(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(networkError as any).responseType === \"default\",\n\t\t\t\"message should contain Response.type\",\n\t\t);\n\t\tassert.equal(false, networkError.canRetry, \"canRetry should be false\");\n\t});\n\n\tit(\"throwOdspNetworkError sprequestguid exists\", async () => {\n\t\tconst error1 = createOdspNetworkErrorWithResponse(\"some message\", 400);\n\t\tconst errorBag = { ...error1.getTelemetryProperties() };\n\t\tassert.equal(\"xxx-xxx\", errorBag.sprequestguid, \"sprequestguid should be 'xxx-xxx'\");\n\t});\n\n\tit(\"throwOdspNetworkError sprequestguid undefined\", async () => {\n\t\tconst error1 = createOdspNetworkError(\"some message\", 400);\n\t\tconst errorBag = { ...error1.getTelemetryProperties() };\n\t\tassert.equal(undefined, errorBag.sprequestguid, \"sprequestguid should not be defined\");\n\t});\n\n\tit(\"errorObjectFromSocketError no retryAfter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"disconnect\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"disconnect\"),\n\t\t\t\"error message should include handler name\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t});\n\n\tit(\"errorObjectFromSocketError with retryFilter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"error\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(networkError.message.includes(\"error\"), \"error message should include handler name\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t});\n\n\tit(\"errorObjectFromSocketError with inner errors\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 400,\n\t\t\terror: {\n\t\t\t\tcode: \"notAllowed\",\n\t\t\t\tinnerError: {\n\t\t\t\t\tcode: \"ipBlocked\",\n\t\t\t\t\tinnerError: {\n\t\t\t\t\t\tcode: \"SurelyBlocked\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmessage: \"Blocking due to policy\",\n\t\t\t},\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"error\");\n\t\tassert(\n\t\t\tisIGenericNetworkError(networkError),\n\t\t\t\"networkError should be a genericNetworkError\",\n\t\t);\n\t\tassert(networkError.message.includes(\"error\"), \"error message should include handler name\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.canRetry, false);\n\t\tassert.equal(networkError.statusCode, 400);\n\t\tassert.equal(\n\t\t\tnetworkError.getTelemetryProperties().innerMostErrorCode,\n\t\t\t\"SurelyBlocked\",\n\t\t\t\"Innermost error code should be correct\",\n\t\t);\n\t\tassert.equal(networkError.facetCodes?.length, 3, \"3 facet codes should be there\");\n\t});\n\n\tit(\"errorObjectFromSocketError with retryAfter\", async () => {\n\t\tconst socketError: IOdspSocketError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\tcode: 429,\n\t\t\tretryAfter: 10,\n\t\t};\n\t\tconst networkError = errorObjectFromSocketError(socketError, \"handler\");\n\t\tassert(isIThrottlingWarning(networkError), \"networkError should be a throttlingError\");\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"handler\"),\n\t\t\t\"error message should include handler name\",\n\t\t);\n\t\tassert(\n\t\t\tnetworkError.message.includes(\"testMessage\"),\n\t\t\t\"error message should include socket error message\",\n\t\t);\n\t\tassert.equal(networkError.retryAfterSeconds, 10);\n\t});\n\n\tit(\"Access Denied retries\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowOdspNetworkError(\"some error\", 401, testResponse);\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with new token\");\n\t});\n\n\tit(\"fetch incorrect response retries\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"some message\",\n\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t{ driverVersion: pkgVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with new token\");\n\t});\n\n\tit(\"404 errors - no retries\", async () => {\n\t\tconst res = getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowOdspNetworkError(\"some error\", 404, testResponse);\n\t\t\t}\n\t\t});\n\t\tawait assert.rejects(res, \"Other errors should not result in retries!\");\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponseWithInsufficientClaims = {\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\tif (name === \"www-authenticate\") {\n\t\t\t\t\treturn 'Bearer realm=\"6c482541-f706-4168-9e58-8e35a9992f58\",client_id=\"00000003-0000-0ff1-ce00-000000000000\",trusted_issuers=\"00000001-0000-0000-c000-000000000000@*,D3776938-3DBA-481F-A652-4BEDFCAB7CD8@*,https://sts.windows.net/*/,00000003-0000-0ff1-ce00-000000000000@90140122-8516-11e1-8eff-49304924019b\",authorization_uri=\"https://login.windows.net/common/oauth2/authorize\",error=\"insufficient_claims\",claims=\"eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTU5Nzk1OTA5MCJ9fX0=\"';\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\tfunction throwAuthorizationErrorWithInsufficientClaims(errorMessage: string): void {\n\t\tthrowOdspNetworkError(errorMessage, 401, testResponseWithInsufficientClaims);\n\t}\n\n\tit(\"Authorization error with insufficient claims first-class properties\", async () => {\n\t\ttry {\n\t\t\tthrowAuthorizationErrorWithInsufficientClaims(\"TestMessage\");\n\t\t} catch (error: unknown) {\n\t\t\tassert(isIAuthorizationError(error), \"error should be a IAuthorizationError\");\n\t\t\tassert(\n\t\t\t\terror.message.includes(\"TestMessage\"),\n\t\t\t\t\"message should contain original message\",\n\t\t\t);\n\t\t\tassert.equal((error as AuthorizationError).canRetry, false, \"canRetry should be false\");\n\t\t\tassert.equal(\n\t\t\t\t(error as AuthorizationError).claims,\n\t\t\t\t'{\"access_token\":{\"nbf\":{\"essential\":true, \"value\":\"1597959090\"}}}',\n\t\t\t\t\"claims should be extracted from response\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"Authorization error with insufficient claims results in retry with claims passed in options\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (\n\t\t\t\toptions.refresh &&\n\t\t\t\toptions.claims ===\n\t\t\t\t\t'{\"access_token\":{\"nbf\":{\"essential\":true, \"value\":\"1597959090\"}}}'\n\t\t\t) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowAuthorizationErrorWithInsufficientClaims(\"some error\");\n\t\t\t}\n\t\t});\n\t\tassert.equal(res, 1, \"did not successfully retried with claims\");\n\t});\n\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst testResponseWithRealm = {\n\t\tstatusText: \"testStatusText\",\n\t\ttype: \"default\",\n\t\theaders: {\n\t\t\tget(name: string): string | null {\n\t\t\t\tif (name === \"sprequestguid\") {\n\t\t\t\t\treturn \"xxx-xxx\";\n\t\t\t\t}\n\t\t\t\tif (name === \"www-authenticate\") {\n\t\t\t\t\treturn 'Bearer realm=\"6c482541-f706-4168-9e58-8e35a9992f58\",client_id=\"00000003-0000-0ff1-ce00-000000000000\",trusted_issuers=\"00000001-0000-0000-c000-000000000000@*,D3776938-3DBA-481F-A652-4BEDFCAB7CD8@*,https://sts.windows.net/*/,00000003-0000-0ff1-ce00-000000000000@90140122-8516-11e1-8eff-49304924019b\",authorization_uri=\"https://login.windows.net/common/oauth2/authorize\"';\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t} as Response;\n\n\tfunction throwAuthorizationErrorWithRealm(errorMessage: string): void {\n\t\tthrowOdspNetworkError(errorMessage, 401, testResponseWithRealm);\n\t}\n\n\tit(\"Authorization error with realm first-class properties\", async () => {\n\t\ttry {\n\t\t\tthrowAuthorizationErrorWithRealm(\"TestMessage\");\n\t\t} catch (error: unknown) {\n\t\t\tassert(isIAuthorizationError(error), \"error should be a IAuthorizationError\");\n\t\t\tassert(\n\t\t\t\terror.message.includes(\"TestMessage\"),\n\t\t\t\t\"message should contain original message\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\t(error as AuthorizationError).canRetry,\n\t\t\t\tfalse,\n\t\t\t\t\"canRetry should be false\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\t(error as AuthorizationError).tenantId,\n\t\t\t\t\"6c482541-f706-4168-9e58-8e35a9992f58\",\n\t\t\t\t\"realm should be extracted from response\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"Authorization error with realm results in retry and realm passed as tenant id\", async () => {\n\t\tconst res = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tif (options.refresh && options.tenantId === \"6c482541-f706-4168-9e58-8e35a9992f58\") {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthrowAuthorizationErrorWithRealm(\"some error\");\n\t\t\t}\n\t\t});\n\t\tassert.strictEqual(res, 1, \"did not successfully retried with realm passed as tenantId\");\n\t});\n\n\tit(\"Check Epoch Mismatch error props\", async () => {\n\t\tconst error = createOdspNetworkErrorWithResponse(\"epochMismatch\", 409);\n\t\tassert.strictEqual(\n\t\t\terror.errorType,\n\t\t\tOdspErrorTypes.fileOverwrittenInStorage,\n\t\t\t\"Error type should be fileOverwrittenInStorage\",\n\t\t);\n\t\tconst errorBag = { ...error.getTelemetryProperties() };\n\t\tassert.strictEqual(\n\t\t\terrorBag.errorType,\n\t\t\tOdspErrorTypes.fileOverwrittenInStorage,\n\t\t\t\"Error type should exist in prop bag\",\n\t\t);\n\t});\n\n\tit(\"Check odsp domain move error\", async () => {\n\t\tconst redirectLocation = \"www.fake.com\";\n\t\tconst responseText = {\n\t\t\terror: {\n\t\t\t\t\"@error.redirectLocation\": redirectLocation,\n\t\t\t\t\"code\": \"itemNotFound\",\n\t\t\t\t\"message\": \"The site has been moved to a new location.\",\n\t\t\t\t\"innerError\": {},\n\t\t\t},\n\t\t};\n\t\tconst error = createOdspNetworkErrorWithResponse(\n\t\t\t\"The site has been moved to a new location.\",\n\t\t\t404,\n\t\t\tundefined,\n\t\t\tJSON.stringify(responseText),\n\t\t);\n\t\tassert.strictEqual(\n\t\t\terror.errorType,\n\t\t\tOdspErrorTypes.fileNotFoundOrAccessDeniedError,\n\t\t\t\"Error type should be fileNotFoundOrAccessDeniedError\",\n\t\t);\n\t\tassert.strictEqual(error.redirectLocation, redirectLocation, \"Site location should match\");\n\t\tassert.strictEqual(\n\t\t\t(error as IGenericNetworkError).statusCode,\n\t\t\t404,\n\t\t\t\"Status code should match\",\n\t\t);\n\t});\n\n\tit(\"Sharepoint url should be redacted in the error\", async () => {\n\t\ttry {\n\t\t\tawait mockFetchError(\n\t\t\t\tasync () =>\n\t\t\t\t\tfetchAndParseAsJSONHelper(\"https://microsoft.sharepoint-df.com/siteUrl\", {}),\n\t\t\t\tnew Error(\n\t\t\t\t\t\"Request to https://6c482541-f706-4168-9e58-8e35a9992f58.sharepoint.com failed\",\n\t\t\t\t),\n\t\t\t);\n\t\t\tassert.fail(\"Fetch should throw an error\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\tassert(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(error.message as string).includes(\"REDACTED_URL\"),\n\t\t\t\t\"sharepoint url should get redacted\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"url should be redacted in the error\", async () => {\n\t\ttry {\n\t\t\tawait mockFetchError(\n\t\t\t\tasync () =>\n\t\t\t\t\tfetchAndParseAsJSONHelper(\"https://microsoft.sharepoint-df.com/siteUrl\", {}),\n\t\t\t\tnew Error(\"Request to http://f706-4168-9e58-8e35a9992f58.COM failed\"),\n\t\t\t);\n\t\t\tassert.fail(\"Fetch should throw an error\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert((error.message as string).includes(\"REDACTED_URL\"), \"url should get redacted\");\n\t\t}\n\t});\n});\n"]}
@@ -3,8 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { MockLogger } from "@fluidframework/telemetry-utils";
7
6
  import { delay } from "@fluidframework/core-utils";
7
+ import { MockLogger } from "@fluidframework/telemetry-utils";
8
8
  import { OdspDeltaStorageWithCache } from "../odspDeltaStorageService.js";
9
9
  import { OpsCache } from "../opsCaching.js";
10
10
  class MockCache {