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

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 (617) hide show
  1. package/.eslintrc.cjs +18 -3
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +44 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/odsp-driver.api.md +11 -12
  8. package/dist/ReadBufferUtils.d.ts.map +1 -1
  9. package/dist/ReadBufferUtils.js.map +1 -1
  10. package/dist/WriteBufferUtils.d.ts +1 -1
  11. package/dist/WriteBufferUtils.d.ts.map +1 -1
  12. package/dist/WriteBufferUtils.js +12 -12
  13. package/dist/WriteBufferUtils.js.map +1 -1
  14. package/dist/checkUrl.d.ts.map +1 -1
  15. package/dist/checkUrl.js +5 -3
  16. package/dist/checkUrl.js.map +1 -1
  17. package/dist/compactSnapshotParser.d.ts.map +1 -1
  18. package/dist/compactSnapshotParser.js +87 -69
  19. package/dist/compactSnapshotParser.js.map +1 -1
  20. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  21. package/dist/compactSnapshotWriter.js +25 -19
  22. package/dist/compactSnapshotWriter.js.map +1 -1
  23. package/dist/contracts.d.ts +10 -4
  24. package/dist/contracts.d.ts.map +1 -1
  25. package/dist/contracts.js.map +1 -1
  26. package/dist/createFile.d.ts +3 -3
  27. package/dist/createFile.d.ts.map +1 -1
  28. package/dist/createFile.js +30 -27
  29. package/dist/createFile.js.map +1 -1
  30. package/dist/createNewContainerOnExistingFile.d.ts +2 -2
  31. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -1
  32. package/dist/createNewContainerOnExistingFile.js +14 -14
  33. package/dist/createNewContainerOnExistingFile.js.map +1 -1
  34. package/dist/createNewModule.d.ts +2 -2
  35. package/dist/createNewModule.d.ts.map +1 -1
  36. package/dist/createNewModule.js +4 -4
  37. package/dist/createNewModule.js.map +1 -1
  38. package/dist/createNewUtils.d.ts +2 -2
  39. package/dist/createNewUtils.d.ts.map +1 -1
  40. package/dist/createNewUtils.js +12 -8
  41. package/dist/createNewUtils.js.map +1 -1
  42. package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
  43. package/dist/createOdspCreateContainerRequest.js +6 -2
  44. package/dist/createOdspCreateContainerRequest.js.map +1 -1
  45. package/dist/createOdspUrl.d.ts +1 -1
  46. package/dist/createOdspUrl.d.ts.map +1 -1
  47. package/dist/createOdspUrl.js.map +1 -1
  48. package/dist/epochTracker.d.ts +10 -9
  49. package/dist/epochTracker.d.ts.map +1 -1
  50. package/dist/epochTracker.js +66 -43
  51. package/dist/epochTracker.js.map +1 -1
  52. package/dist/fetchSnapshot.d.ts +11 -8
  53. package/dist/fetchSnapshot.d.ts.map +1 -1
  54. package/dist/fetchSnapshot.js +79 -58
  55. package/dist/fetchSnapshot.js.map +1 -1
  56. package/dist/getFileLink.d.ts.map +1 -1
  57. package/dist/getFileLink.js +24 -17
  58. package/dist/getFileLink.js.map +1 -1
  59. package/dist/getQueryString.d.ts.map +1 -1
  60. package/dist/getQueryString.js +6 -0
  61. package/dist/getQueryString.js.map +1 -1
  62. package/dist/index.d.ts +19 -19
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +44 -44
  65. package/dist/index.js.map +1 -1
  66. package/dist/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  67. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  68. package/dist/localOdspDriver/localOdspDocumentService.js +5 -5
  69. package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
  70. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +8 -6
  71. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  72. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +10 -9
  73. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  74. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  75. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  76. package/dist/localOdspDriver/localOdspDocumentStorageManager.js +6 -6
  77. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  78. package/dist/odsp-driver-alpha.d.ts +27 -12
  79. package/dist/odsp-driver-beta.d.ts +1 -2
  80. package/dist/odsp-driver-public.d.ts +1 -2
  81. package/dist/odsp-driver-untrimmed.d.ts +29 -12
  82. package/dist/odspCache.d.ts +3 -3
  83. package/dist/odspCache.d.ts.map +1 -1
  84. package/dist/odspCache.js +3 -4
  85. package/dist/odspCache.js.map +1 -1
  86. package/dist/odspDelayLoadedDeltaStream.d.ts +7 -5
  87. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  88. package/dist/odspDelayLoadedDeltaStream.js +41 -28
  89. package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
  90. package/dist/odspDeltaStorageService.d.ts +7 -7
  91. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  92. package/dist/odspDeltaStorageService.js +5 -5
  93. package/dist/odspDeltaStorageService.js.map +1 -1
  94. package/dist/odspDocumentDeltaConnection.d.ts +1 -1
  95. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  96. package/dist/odspDocumentDeltaConnection.js +41 -23
  97. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  98. package/dist/odspDocumentService.d.ts +6 -4
  99. package/dist/odspDocumentService.d.ts.map +1 -1
  100. package/dist/odspDocumentService.js +19 -16
  101. package/dist/odspDocumentService.js.map +1 -1
  102. package/dist/odspDocumentServiceFactory.d.ts +6 -1
  103. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  104. package/dist/odspDocumentServiceFactory.js +9 -4
  105. package/dist/odspDocumentServiceFactory.js.map +1 -1
  106. package/dist/odspDocumentServiceFactoryCore.d.ts +4 -4
  107. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  108. package/dist/odspDocumentServiceFactoryCore.js +26 -22
  109. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  110. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  111. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  112. package/dist/odspDocumentServiceFactoryWithCodeSplit.js +2 -2
  113. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  114. package/dist/odspDocumentStorageManager.d.ts +15 -9
  115. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  116. package/dist/odspDocumentStorageManager.js +219 -181
  117. package/dist/odspDocumentStorageManager.js.map +1 -1
  118. package/dist/odspDocumentStorageServiceBase.d.ts +2 -4
  119. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  120. package/dist/odspDocumentStorageServiceBase.js +32 -29
  121. package/dist/odspDocumentStorageServiceBase.js.map +1 -1
  122. package/dist/odspDriverUrlResolver.d.ts +5 -1
  123. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  124. package/dist/odspDriverUrlResolver.js +27 -24
  125. package/dist/odspDriverUrlResolver.js.map +1 -1
  126. package/dist/odspDriverUrlResolverForShareLink.d.ts +17 -6
  127. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  128. package/dist/odspDriverUrlResolverForShareLink.js +49 -39
  129. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  130. package/dist/odspError.d.ts +1 -1
  131. package/dist/odspError.d.ts.map +1 -1
  132. package/dist/odspError.js +5 -5
  133. package/dist/odspError.js.map +1 -1
  134. package/dist/odspFluidFileLink.d.ts +1 -1
  135. package/dist/odspFluidFileLink.d.ts.map +1 -1
  136. package/dist/odspFluidFileLink.js +2 -2
  137. package/dist/odspFluidFileLink.js.map +1 -1
  138. package/dist/odspLocationRedirection.js +2 -2
  139. package/dist/odspLocationRedirection.js.map +1 -1
  140. package/dist/odspPublicUtils.d.ts +3 -0
  141. package/dist/odspPublicUtils.d.ts.map +1 -1
  142. package/dist/odspPublicUtils.js +3 -0
  143. package/dist/odspPublicUtils.js.map +1 -1
  144. package/dist/odspSnapshotParser.d.ts +1 -1
  145. package/dist/odspSnapshotParser.d.ts.map +1 -1
  146. package/dist/odspSnapshotParser.js +3 -2
  147. package/dist/odspSnapshotParser.js.map +1 -1
  148. package/dist/odspSummaryUploadManager.d.ts +1 -1
  149. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  150. package/dist/odspSummaryUploadManager.js +9 -6
  151. package/dist/odspSummaryUploadManager.js.map +1 -1
  152. package/dist/odspUrlHelper.d.ts.map +1 -1
  153. package/dist/odspUrlHelper.js +1 -2
  154. package/dist/odspUrlHelper.js.map +1 -1
  155. package/dist/odspUtils.d.ts +19 -7
  156. package/dist/odspUtils.d.ts.map +1 -1
  157. package/dist/odspUtils.js +61 -31
  158. package/dist/odspUtils.js.map +1 -1
  159. package/dist/opsCaching.d.ts +1 -1
  160. package/dist/opsCaching.d.ts.map +1 -1
  161. package/dist/opsCaching.js +2 -1
  162. package/dist/opsCaching.js.map +1 -1
  163. package/dist/package.json +3 -0
  164. package/dist/packageVersion.d.ts +1 -1
  165. package/dist/packageVersion.js +1 -1
  166. package/dist/packageVersion.js.map +1 -1
  167. package/dist/prefetchLatestSnapshot.d.ts +2 -2
  168. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  169. package/dist/prefetchLatestSnapshot.js +17 -12
  170. package/dist/prefetchLatestSnapshot.js.map +1 -1
  171. package/dist/retryErrorsStorageAdapter.d.ts +0 -1
  172. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  173. package/dist/retryErrorsStorageAdapter.js +2 -5
  174. package/dist/retryErrorsStorageAdapter.js.map +1 -1
  175. package/dist/retryUtils.d.ts.map +1 -1
  176. package/dist/retryUtils.js +6 -2
  177. package/dist/retryUtils.js.map +1 -1
  178. package/dist/socketModule.d.ts.map +1 -1
  179. package/dist/socketModule.js +2 -0
  180. package/dist/socketModule.js.map +1 -1
  181. package/dist/tsdoc-metadata.json +1 -1
  182. package/dist/vroom.d.ts +2 -2
  183. package/dist/vroom.d.ts.map +1 -1
  184. package/dist/vroom.js +5 -5
  185. package/dist/vroom.js.map +1 -1
  186. package/dist/zipItDataRepresentationUtils.d.ts +1 -1
  187. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  188. package/dist/zipItDataRepresentationUtils.js +15 -11
  189. package/dist/zipItDataRepresentationUtils.js.map +1 -1
  190. package/lib/{ReadBufferUtils.d.mts → ReadBufferUtils.d.ts} +1 -1
  191. package/lib/ReadBufferUtils.d.ts.map +1 -0
  192. package/lib/{ReadBufferUtils.mjs → ReadBufferUtils.js} +1 -1
  193. package/lib/ReadBufferUtils.js.map +1 -0
  194. package/lib/{WriteBufferUtils.d.mts → WriteBufferUtils.d.ts} +2 -2
  195. package/lib/WriteBufferUtils.d.ts.map +1 -0
  196. package/lib/{WriteBufferUtils.mjs → WriteBufferUtils.js} +2 -2
  197. package/lib/WriteBufferUtils.js.map +1 -0
  198. package/lib/{checkUrl.d.mts → checkUrl.d.ts} +1 -1
  199. package/lib/checkUrl.d.ts.map +1 -0
  200. package/lib/{checkUrl.mjs → checkUrl.js} +5 -3
  201. package/lib/checkUrl.js.map +1 -0
  202. package/lib/{compactSnapshotParser.d.mts → compactSnapshotParser.d.ts} +1 -1
  203. package/lib/compactSnapshotParser.d.ts.map +1 -0
  204. package/lib/{compactSnapshotParser.mjs → compactSnapshotParser.js} +61 -43
  205. package/lib/compactSnapshotParser.js.map +1 -0
  206. package/lib/{compactSnapshotWriter.d.mts → compactSnapshotWriter.d.ts} +1 -1
  207. package/lib/compactSnapshotWriter.d.ts.map +1 -0
  208. package/lib/{compactSnapshotWriter.mjs → compactSnapshotWriter.js} +13 -7
  209. package/lib/compactSnapshotWriter.js.map +1 -0
  210. package/lib/{constants.d.mts → constants.d.ts} +1 -1
  211. package/lib/constants.d.ts.map +1 -0
  212. package/lib/{constants.mjs → constants.js} +1 -1
  213. package/lib/constants.js.map +1 -0
  214. package/lib/{contracts.d.mts → contracts.d.ts} +11 -5
  215. package/lib/contracts.d.ts.map +1 -0
  216. package/lib/{contracts.mjs → contracts.js} +1 -1
  217. package/lib/contracts.js.map +1 -0
  218. package/lib/{contractsPublic.d.mts → contractsPublic.d.ts} +1 -1
  219. package/lib/contractsPublic.d.ts.map +1 -0
  220. package/lib/{contractsPublic.mjs → contractsPublic.js} +1 -1
  221. package/lib/contractsPublic.js.map +1 -0
  222. package/lib/{createFile.d.mts → createFile.d.ts} +4 -4
  223. package/lib/createFile.d.ts.map +1 -0
  224. package/lib/{createFile.mjs → createFile.js} +15 -12
  225. package/lib/createFile.js.map +1 -0
  226. package/lib/{createNewContainerOnExistingFile.d.mts → createNewContainerOnExistingFile.d.ts} +3 -3
  227. package/lib/createNewContainerOnExistingFile.d.ts.map +1 -0
  228. package/lib/{createNewContainerOnExistingFile.mjs → createNewContainerOnExistingFile.js} +7 -7
  229. package/lib/createNewContainerOnExistingFile.js.map +1 -0
  230. package/lib/{createNewModule.mjs → createNewModule.d.ts} +3 -3
  231. package/lib/createNewModule.d.ts.map +1 -0
  232. package/lib/{createNewModule.d.mts → createNewModule.js} +3 -3
  233. package/lib/createNewModule.js.map +1 -0
  234. package/lib/{createNewUtils.d.mts → createNewUtils.d.ts} +3 -3
  235. package/lib/createNewUtils.d.ts.map +1 -0
  236. package/lib/{createNewUtils.mjs → createNewUtils.js} +9 -5
  237. package/lib/createNewUtils.js.map +1 -0
  238. package/lib/{createOdspCreateContainerRequest.d.mts → createOdspCreateContainerRequest.d.ts} +5 -1
  239. package/lib/createOdspCreateContainerRequest.d.ts.map +1 -0
  240. package/lib/{createOdspCreateContainerRequest.mjs → createOdspCreateContainerRequest.js} +6 -2
  241. package/lib/createOdspCreateContainerRequest.js.map +1 -0
  242. package/lib/{createOdspUrl.d.mts → createOdspUrl.d.ts} +2 -2
  243. package/lib/createOdspUrl.d.ts.map +1 -0
  244. package/lib/{createOdspUrl.mjs → createOdspUrl.js} +1 -1
  245. package/lib/createOdspUrl.js.map +1 -0
  246. package/lib/{epochTracker.d.mts → epochTracker.d.ts} +11 -10
  247. package/lib/epochTracker.d.ts.map +1 -0
  248. package/lib/{epochTracker.mjs → epochTracker.js} +56 -33
  249. package/lib/epochTracker.js.map +1 -0
  250. package/lib/{fetch.d.mts → fetch.d.ts} +1 -1
  251. package/lib/fetch.d.ts.map +1 -0
  252. package/lib/{fetch.mjs → fetch.js} +1 -1
  253. package/lib/fetch.js.map +1 -0
  254. package/lib/{fetchSnapshot.d.mts → fetchSnapshot.d.ts} +12 -9
  255. package/lib/fetchSnapshot.d.ts.map +1 -0
  256. package/lib/{fetchSnapshot.mjs → fetchSnapshot.js} +61 -40
  257. package/lib/fetchSnapshot.js.map +1 -0
  258. package/lib/{getFileLink.d.mts → getFileLink.d.ts} +1 -1
  259. package/lib/getFileLink.d.ts.map +1 -0
  260. package/lib/{getFileLink.mjs → getFileLink.js} +14 -7
  261. package/lib/getFileLink.js.map +1 -0
  262. package/lib/{getQueryString.d.mts → getQueryString.d.ts} +5 -1
  263. package/lib/getQueryString.d.ts.map +1 -0
  264. package/lib/{getQueryString.mjs → getQueryString.js} +7 -1
  265. package/lib/getQueryString.js.map +1 -0
  266. package/lib/{getUrlAndHeadersWithAuth.d.mts → getUrlAndHeadersWithAuth.d.ts} +1 -1
  267. package/lib/getUrlAndHeadersWithAuth.d.ts.map +1 -0
  268. package/lib/{getUrlAndHeadersWithAuth.mjs → getUrlAndHeadersWithAuth.js} +1 -1
  269. package/lib/getUrlAndHeadersWithAuth.js.map +1 -0
  270. package/lib/{index.d.mts → index.d.ts} +20 -20
  271. package/lib/index.d.ts.map +1 -0
  272. package/lib/index.js +29 -0
  273. package/lib/index.js.map +1 -0
  274. package/lib/localOdspDriver/{localOdspDeltaStorageService.d.mts → localOdspDeltaStorageService.d.ts} +1 -1
  275. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -0
  276. package/lib/localOdspDriver/{localOdspDeltaStorageService.mjs → localOdspDeltaStorageService.js} +1 -1
  277. package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -0
  278. package/lib/localOdspDriver/{localOdspDocumentService.d.mts → localOdspDocumentService.d.ts} +2 -2
  279. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +1 -0
  280. package/lib/localOdspDriver/{localOdspDocumentService.mjs → localOdspDocumentService.js} +4 -4
  281. package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -0
  282. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.d.mts → localOdspDocumentServiceFactory.d.ts} +9 -7
  283. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -0
  284. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.mjs → localOdspDocumentServiceFactory.js} +9 -8
  285. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -0
  286. package/lib/localOdspDriver/{localOdspDocumentStorageManager.d.mts → localOdspDocumentStorageManager.d.ts} +2 -2
  287. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -0
  288. package/lib/localOdspDriver/{localOdspDocumentStorageManager.mjs → localOdspDocumentStorageManager.js} +4 -4
  289. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -0
  290. package/lib/{odsp-driver-alpha.d.mts → odsp-driver-alpha.d.ts} +27 -12
  291. package/lib/{odsp-driver-public.d.mts → odsp-driver-beta.d.ts} +1 -2
  292. package/lib/{odsp-driver-beta.d.mts → odsp-driver-public.d.ts} +1 -2
  293. package/lib/{odsp-driver-untrimmed.d.mts → odsp-driver-untrimmed.d.ts} +29 -12
  294. package/lib/{odspCache.d.mts → odspCache.d.ts} +8 -4
  295. package/lib/odspCache.d.ts.map +1 -0
  296. package/lib/{odspCache.mjs → odspCache.js} +6 -3
  297. package/lib/odspCache.js.map +1 -0
  298. package/lib/{odspDelayLoadedDeltaStream.d.mts → odspDelayLoadedDeltaStream.d.ts} +8 -6
  299. package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -0
  300. package/lib/{odspDelayLoadedDeltaStream.mjs → odspDelayLoadedDeltaStream.js} +33 -20
  301. package/lib/odspDelayLoadedDeltaStream.js.map +1 -0
  302. package/lib/{odspDeltaStorageService.d.mts → odspDeltaStorageService.d.ts} +8 -8
  303. package/lib/odspDeltaStorageService.d.ts.map +1 -0
  304. package/lib/{odspDeltaStorageService.mjs → odspDeltaStorageService.js} +5 -5
  305. package/lib/odspDeltaStorageService.js.map +1 -0
  306. package/lib/{odspDocumentDeltaConnection.d.mts → odspDocumentDeltaConnection.d.ts} +2 -2
  307. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -0
  308. package/lib/{odspDocumentDeltaConnection.mjs → odspDocumentDeltaConnection.js} +34 -16
  309. package/lib/odspDocumentDeltaConnection.js.map +1 -0
  310. package/lib/{odspDocumentService.d.mts → odspDocumentService.d.ts} +7 -5
  311. package/lib/odspDocumentService.d.ts.map +1 -0
  312. package/lib/{odspDocumentService.mjs → odspDocumentService.js} +16 -11
  313. package/lib/odspDocumentService.js.map +1 -0
  314. package/lib/{odspDocumentServiceFactory.d.mts → odspDocumentServiceFactory.d.ts} +7 -2
  315. package/lib/odspDocumentServiceFactory.d.ts.map +1 -0
  316. package/lib/{odspDocumentServiceFactory.mjs → odspDocumentServiceFactory.js} +9 -3
  317. package/lib/odspDocumentServiceFactory.js.map +1 -0
  318. package/lib/{odspDocumentServiceFactoryCore.d.mts → odspDocumentServiceFactoryCore.d.ts} +5 -5
  319. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -0
  320. package/lib/{odspDocumentServiceFactoryCore.mjs → odspDocumentServiceFactoryCore.js} +23 -17
  321. package/lib/odspDocumentServiceFactoryCore.js.map +1 -0
  322. package/lib/{odspDocumentServiceFactoryWithCodeSplit.d.mts → odspDocumentServiceFactoryWithCodeSplit.d.ts} +2 -2
  323. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -0
  324. package/lib/{odspDocumentServiceFactoryWithCodeSplit.mjs → odspDocumentServiceFactoryWithCodeSplit.js} +2 -2
  325. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -0
  326. package/lib/{odspDocumentStorageManager.d.mts → odspDocumentStorageManager.d.ts} +16 -10
  327. package/lib/odspDocumentStorageManager.d.ts.map +1 -0
  328. package/lib/{odspDocumentStorageManager.mjs → odspDocumentStorageManager.js} +207 -167
  329. package/lib/odspDocumentStorageManager.js.map +1 -0
  330. package/lib/{odspDocumentStorageServiceBase.d.mts → odspDocumentStorageServiceBase.d.ts} +3 -5
  331. package/lib/odspDocumentStorageServiceBase.d.ts.map +1 -0
  332. package/lib/{odspDocumentStorageServiceBase.mjs → odspDocumentStorageServiceBase.js} +32 -29
  333. package/lib/odspDocumentStorageServiceBase.js.map +1 -0
  334. package/lib/{odspDriverUrlResolver.d.mts → odspDriverUrlResolver.d.ts} +6 -2
  335. package/lib/odspDriverUrlResolver.d.ts.map +1 -0
  336. package/lib/{odspDriverUrlResolver.mjs → odspDriverUrlResolver.js} +24 -17
  337. package/lib/odspDriverUrlResolver.js.map +1 -0
  338. package/lib/{odspDriverUrlResolverForShareLink.d.mts → odspDriverUrlResolverForShareLink.d.ts} +18 -7
  339. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -0
  340. package/lib/{odspDriverUrlResolverForShareLink.mjs → odspDriverUrlResolverForShareLink.js} +41 -27
  341. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -0
  342. package/lib/{odspError.d.mts → odspError.d.ts} +2 -2
  343. package/lib/odspError.d.ts.map +1 -0
  344. package/lib/{odspError.mjs → odspError.js} +4 -4
  345. package/lib/odspError.js.map +1 -0
  346. package/lib/{odspFluidFileLink.d.mts → odspFluidFileLink.d.ts} +2 -2
  347. package/lib/odspFluidFileLink.d.ts.map +1 -0
  348. package/lib/{odspFluidFileLink.mjs → odspFluidFileLink.js} +2 -2
  349. package/lib/odspFluidFileLink.js.map +1 -0
  350. package/lib/{odspLocationRedirection.d.mts → odspLocationRedirection.d.ts} +1 -1
  351. package/lib/odspLocationRedirection.d.ts.map +1 -0
  352. package/lib/{odspLocationRedirection.mjs → odspLocationRedirection.js} +2 -2
  353. package/lib/odspLocationRedirection.js.map +1 -0
  354. package/lib/{odspPublicUtils.d.mts → odspPublicUtils.d.ts} +4 -1
  355. package/lib/odspPublicUtils.d.ts.map +1 -0
  356. package/lib/{odspPublicUtils.mjs → odspPublicUtils.js} +4 -1
  357. package/lib/odspPublicUtils.js.map +1 -0
  358. package/lib/{odspSnapshotParser.d.mts → odspSnapshotParser.d.ts} +2 -2
  359. package/lib/odspSnapshotParser.d.ts.map +1 -0
  360. package/lib/{odspSnapshotParser.mjs → odspSnapshotParser.js} +4 -3
  361. package/lib/odspSnapshotParser.js.map +1 -0
  362. package/lib/{odspSummaryUploadManager.d.mts → odspSummaryUploadManager.d.ts} +2 -2
  363. package/lib/odspSummaryUploadManager.d.ts.map +1 -0
  364. package/lib/{odspSummaryUploadManager.mjs → odspSummaryUploadManager.js} +8 -5
  365. package/lib/odspSummaryUploadManager.js.map +1 -0
  366. package/lib/{odspUrlHelper.d.mts → odspUrlHelper.d.ts} +1 -1
  367. package/lib/odspUrlHelper.d.ts.map +1 -0
  368. package/lib/{odspUrlHelper.mjs → odspUrlHelper.js} +2 -3
  369. package/lib/odspUrlHelper.js.map +1 -0
  370. package/lib/{odspUtils.d.mts → odspUtils.d.ts} +20 -8
  371. package/lib/odspUtils.d.ts.map +1 -0
  372. package/lib/{odspUtils.mjs → odspUtils.js} +45 -17
  373. package/lib/odspUtils.js.map +1 -0
  374. package/lib/{opsCaching.d.mts → opsCaching.d.ts} +2 -2
  375. package/lib/opsCaching.d.ts.map +1 -0
  376. package/lib/{opsCaching.mjs → opsCaching.js} +3 -2
  377. package/lib/opsCaching.js.map +1 -0
  378. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  379. package/lib/packageVersion.d.ts.map +1 -0
  380. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  381. package/lib/packageVersion.js.map +1 -0
  382. package/lib/{prefetchLatestSnapshot.d.mts → prefetchLatestSnapshot.d.ts} +3 -3
  383. package/lib/prefetchLatestSnapshot.d.ts.map +1 -0
  384. package/lib/{prefetchLatestSnapshot.mjs → prefetchLatestSnapshot.js} +16 -11
  385. package/lib/prefetchLatestSnapshot.js.map +1 -0
  386. package/lib/{retryErrorsStorageAdapter.d.mts → retryErrorsStorageAdapter.d.ts} +1 -2
  387. package/lib/retryErrorsStorageAdapter.d.ts.map +1 -0
  388. package/lib/{retryErrorsStorageAdapter.mjs → retryErrorsStorageAdapter.js} +2 -5
  389. package/lib/retryErrorsStorageAdapter.js.map +1 -0
  390. package/lib/{retryUtils.d.mts → retryUtils.d.ts} +1 -1
  391. package/lib/retryUtils.d.ts.map +1 -0
  392. package/lib/{retryUtils.mjs → retryUtils.js} +6 -2
  393. package/lib/retryUtils.js.map +1 -0
  394. package/lib/{socketModule.d.mts → socketModule.d.ts} +1 -1
  395. package/lib/socketModule.d.ts.map +1 -0
  396. package/lib/{socketModule.mjs → socketModule.js} +3 -1
  397. package/lib/socketModule.js.map +1 -0
  398. package/lib/test/buildOdspShareLinkReqParams.spec.js +25 -0
  399. package/lib/test/buildOdspShareLinkReqParams.spec.js.map +1 -0
  400. package/lib/test/createNewUtilsTests.spec.js +221 -0
  401. package/lib/test/createNewUtilsTests.spec.js.map +1 -0
  402. package/lib/test/deltaStorageService.spec.js +176 -0
  403. package/lib/test/deltaStorageService.spec.js.map +1 -0
  404. package/lib/test/epochTests.spec.js +340 -0
  405. package/lib/test/epochTests.spec.js.map +1 -0
  406. package/lib/test/epochTestsWithRedemption.spec.js +119 -0
  407. package/lib/test/epochTestsWithRedemption.spec.js.map +1 -0
  408. package/lib/test/fetchSnapshot.spec.js +412 -0
  409. package/lib/test/fetchSnapshot.spec.js.map +1 -0
  410. package/lib/test/getFileLink.spec.js +62 -0
  411. package/lib/test/getFileLink.spec.js.map +1 -0
  412. package/lib/test/getUrlAndHeadersWithAuth.spec.js +66 -0
  413. package/lib/test/getUrlAndHeadersWithAuth.spec.js.map +1 -0
  414. package/lib/test/getVersions.spec.js +284 -0
  415. package/lib/test/getVersions.spec.js.map +1 -0
  416. package/lib/test/joinSessionCacheTests.spec.js +53 -0
  417. package/lib/test/joinSessionCacheTests.spec.js.map +1 -0
  418. package/lib/test/joinSessionPeriodicCall.spec.js +158 -0
  419. package/lib/test/joinSessionPeriodicCall.spec.js.map +1 -0
  420. package/lib/test/jsonSnapshotFormatTests.spec.js +107 -0
  421. package/lib/test/jsonSnapshotFormatTests.spec.js.map +1 -0
  422. package/lib/test/localOdspDriver.spec.js +177 -0
  423. package/lib/test/localOdspDriver.spec.js.map +1 -0
  424. package/lib/test/mockFetch.js +61 -0
  425. package/lib/test/mockFetch.js.map +1 -0
  426. package/lib/test/odspCreateContainer.spec.js +116 -0
  427. package/lib/test/odspCreateContainer.spec.js.map +1 -0
  428. package/lib/test/odspDriverResolverTest.spec.js +289 -0
  429. package/lib/test/odspDriverResolverTest.spec.js.map +1 -0
  430. package/lib/test/odspDriverUrlResolverForShareLink.spec.js +287 -0
  431. package/lib/test/odspDriverUrlResolverForShareLink.spec.js.map +1 -0
  432. package/lib/test/odspError.spec.js +299 -0
  433. package/lib/test/odspError.spec.js.map +1 -0
  434. package/lib/test/opsCaching.spec.js +357 -0
  435. package/lib/test/opsCaching.spec.js.map +1 -0
  436. package/lib/test/prefetchSnapshotTests.spec.js +420 -0
  437. package/lib/test/prefetchSnapshotTests.spec.js.map +1 -0
  438. package/lib/test/snapshotFormatTests.spec.js +218 -0
  439. package/lib/test/snapshotFormatTests.spec.js.map +1 -0
  440. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js +152 -0
  441. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js.map +1 -0
  442. package/lib/test/socketTests/socketMock.js +109 -0
  443. package/lib/test/socketTests/socketMock.js.map +1 -0
  444. package/lib/test/socketTests/socketTests.spec.js +256 -0
  445. package/lib/test/socketTests/socketTests.spec.js.map +1 -0
  446. package/lib/test/tokenFetch.spec.js +39 -0
  447. package/lib/test/tokenFetch.spec.js.map +1 -0
  448. package/lib/test/types/validateOdspDriverPrevious.generated.js +96 -0
  449. package/lib/test/types/validateOdspDriverPrevious.generated.js.map +1 -0
  450. package/lib/test/zipItDataRepresentationTests.spec.js +207 -0
  451. package/lib/test/zipItDataRepresentationTests.spec.js.map +1 -0
  452. package/lib/{vroom.d.mts → vroom.d.ts} +3 -3
  453. package/lib/vroom.d.ts.map +1 -0
  454. package/lib/{vroom.mjs → vroom.js} +4 -4
  455. package/lib/vroom.js.map +1 -0
  456. package/lib/{zipItDataRepresentationUtils.d.mts → zipItDataRepresentationUtils.d.ts} +2 -2
  457. package/lib/zipItDataRepresentationUtils.d.ts.map +1 -0
  458. package/lib/{zipItDataRepresentationUtils.mjs → zipItDataRepresentationUtils.js} +17 -9
  459. package/lib/zipItDataRepresentationUtils.js.map +1 -0
  460. package/package.json +90 -31
  461. package/src/ReadBufferUtils.ts +7 -7
  462. package/src/WriteBufferUtils.ts +13 -9
  463. package/src/checkUrl.ts +4 -2
  464. package/src/compactSnapshotParser.ts +87 -52
  465. package/src/compactSnapshotWriter.ts +19 -12
  466. package/src/contracts.ts +16 -4
  467. package/src/createFile.ts +16 -13
  468. package/src/createNewContainerOnExistingFile.ts +8 -8
  469. package/src/createNewModule.ts +2 -2
  470. package/src/createNewUtils.ts +19 -9
  471. package/src/createOdspCreateContainerRequest.ts +2 -1
  472. package/src/createOdspUrl.ts +1 -1
  473. package/src/epochTracker.ts +90 -55
  474. package/src/fetchSnapshot.ts +104 -47
  475. package/src/getFileLink.ts +21 -13
  476. package/src/getQueryString.ts +3 -0
  477. package/src/index.ts +27 -19
  478. package/src/localOdspDriver/localOdspDocumentService.ts +3 -3
  479. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +12 -11
  480. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +5 -5
  481. package/src/odspCache.ts +13 -9
  482. package/src/odspDelayLoadedDeltaStream.ts +54 -33
  483. package/src/odspDeltaStorageService.ts +17 -16
  484. package/src/odspDocumentDeltaConnection.ts +52 -34
  485. package/src/odspDocumentService.ts +23 -20
  486. package/src/odspDocumentServiceFactory.ts +7 -2
  487. package/src/odspDocumentServiceFactoryCore.ts +25 -18
  488. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +1 -1
  489. package/src/odspDocumentStorageManager.ts +276 -216
  490. package/src/odspDocumentStorageServiceBase.ts +45 -43
  491. package/src/odspDriverUrlResolver.ts +39 -24
  492. package/src/odspDriverUrlResolverForShareLink.ts +51 -31
  493. package/src/odspError.ts +4 -4
  494. package/src/odspFluidFileLink.ts +3 -3
  495. package/src/odspLocationRedirection.ts +1 -1
  496. package/src/odspPublicUtils.ts +3 -0
  497. package/src/odspSnapshotParser.ts +4 -3
  498. package/src/odspSummaryUploadManager.ts +21 -9
  499. package/src/odspUrlHelper.ts +2 -3
  500. package/src/odspUtils.ts +73 -30
  501. package/src/opsCaching.ts +13 -12
  502. package/src/packageVersion.ts +1 -1
  503. package/src/prefetchLatestSnapshot.ts +24 -15
  504. package/src/retryErrorsStorageAdapter.ts +4 -8
  505. package/src/retryUtils.ts +6 -2
  506. package/src/socketModule.ts +2 -0
  507. package/src/vroom.ts +6 -6
  508. package/src/zipItDataRepresentationUtils.ts +63 -35
  509. package/tsconfig.cjs.json +7 -0
  510. package/tsconfig.json +2 -5
  511. package/lib/ReadBufferUtils.d.mts.map +0 -1
  512. package/lib/ReadBufferUtils.mjs.map +0 -1
  513. package/lib/WriteBufferUtils.d.mts.map +0 -1
  514. package/lib/WriteBufferUtils.mjs.map +0 -1
  515. package/lib/checkUrl.d.mts.map +0 -1
  516. package/lib/checkUrl.mjs.map +0 -1
  517. package/lib/compactSnapshotParser.d.mts.map +0 -1
  518. package/lib/compactSnapshotParser.mjs.map +0 -1
  519. package/lib/compactSnapshotWriter.d.mts.map +0 -1
  520. package/lib/compactSnapshotWriter.mjs.map +0 -1
  521. package/lib/constants.d.mts.map +0 -1
  522. package/lib/constants.mjs.map +0 -1
  523. package/lib/contracts.d.mts.map +0 -1
  524. package/lib/contracts.mjs.map +0 -1
  525. package/lib/contractsPublic.d.mts.map +0 -1
  526. package/lib/contractsPublic.mjs.map +0 -1
  527. package/lib/createFile.d.mts.map +0 -1
  528. package/lib/createFile.mjs.map +0 -1
  529. package/lib/createNewContainerOnExistingFile.d.mts.map +0 -1
  530. package/lib/createNewContainerOnExistingFile.mjs.map +0 -1
  531. package/lib/createNewModule.d.mts.map +0 -1
  532. package/lib/createNewModule.mjs.map +0 -1
  533. package/lib/createNewUtils.d.mts.map +0 -1
  534. package/lib/createNewUtils.mjs.map +0 -1
  535. package/lib/createOdspCreateContainerRequest.d.mts.map +0 -1
  536. package/lib/createOdspCreateContainerRequest.mjs.map +0 -1
  537. package/lib/createOdspUrl.d.mts.map +0 -1
  538. package/lib/createOdspUrl.mjs.map +0 -1
  539. package/lib/epochTracker.d.mts.map +0 -1
  540. package/lib/epochTracker.mjs.map +0 -1
  541. package/lib/fetch.d.mts.map +0 -1
  542. package/lib/fetch.mjs.map +0 -1
  543. package/lib/fetchSnapshot.d.mts.map +0 -1
  544. package/lib/fetchSnapshot.mjs.map +0 -1
  545. package/lib/getFileLink.d.mts.map +0 -1
  546. package/lib/getFileLink.mjs.map +0 -1
  547. package/lib/getQueryString.d.mts.map +0 -1
  548. package/lib/getQueryString.mjs.map +0 -1
  549. package/lib/getUrlAndHeadersWithAuth.d.mts.map +0 -1
  550. package/lib/getUrlAndHeadersWithAuth.mjs.map +0 -1
  551. package/lib/index.d.mts.map +0 -1
  552. package/lib/index.mjs +0 -22
  553. package/lib/index.mjs.map +0 -1
  554. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts.map +0 -1
  555. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs.map +0 -1
  556. package/lib/localOdspDriver/localOdspDocumentService.d.mts.map +0 -1
  557. package/lib/localOdspDriver/localOdspDocumentService.mjs.map +0 -1
  558. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.mts.map +0 -1
  559. package/lib/localOdspDriver/localOdspDocumentServiceFactory.mjs.map +0 -1
  560. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.mts.map +0 -1
  561. package/lib/localOdspDriver/localOdspDocumentStorageManager.mjs.map +0 -1
  562. package/lib/odspCache.d.mts.map +0 -1
  563. package/lib/odspCache.mjs.map +0 -1
  564. package/lib/odspDelayLoadedDeltaStream.d.mts.map +0 -1
  565. package/lib/odspDelayLoadedDeltaStream.mjs.map +0 -1
  566. package/lib/odspDeltaStorageService.d.mts.map +0 -1
  567. package/lib/odspDeltaStorageService.mjs.map +0 -1
  568. package/lib/odspDocumentDeltaConnection.d.mts.map +0 -1
  569. package/lib/odspDocumentDeltaConnection.mjs.map +0 -1
  570. package/lib/odspDocumentService.d.mts.map +0 -1
  571. package/lib/odspDocumentService.mjs.map +0 -1
  572. package/lib/odspDocumentServiceFactory.d.mts.map +0 -1
  573. package/lib/odspDocumentServiceFactory.mjs.map +0 -1
  574. package/lib/odspDocumentServiceFactoryCore.d.mts.map +0 -1
  575. package/lib/odspDocumentServiceFactoryCore.mjs.map +0 -1
  576. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.mts.map +0 -1
  577. package/lib/odspDocumentServiceFactoryWithCodeSplit.mjs.map +0 -1
  578. package/lib/odspDocumentStorageManager.d.mts.map +0 -1
  579. package/lib/odspDocumentStorageManager.mjs.map +0 -1
  580. package/lib/odspDocumentStorageServiceBase.d.mts.map +0 -1
  581. package/lib/odspDocumentStorageServiceBase.mjs.map +0 -1
  582. package/lib/odspDriverUrlResolver.d.mts.map +0 -1
  583. package/lib/odspDriverUrlResolver.mjs.map +0 -1
  584. package/lib/odspDriverUrlResolverForShareLink.d.mts.map +0 -1
  585. package/lib/odspDriverUrlResolverForShareLink.mjs.map +0 -1
  586. package/lib/odspError.d.mts.map +0 -1
  587. package/lib/odspError.mjs.map +0 -1
  588. package/lib/odspFluidFileLink.d.mts.map +0 -1
  589. package/lib/odspFluidFileLink.mjs.map +0 -1
  590. package/lib/odspLocationRedirection.d.mts.map +0 -1
  591. package/lib/odspLocationRedirection.mjs.map +0 -1
  592. package/lib/odspPublicUtils.d.mts.map +0 -1
  593. package/lib/odspPublicUtils.mjs.map +0 -1
  594. package/lib/odspSnapshotParser.d.mts.map +0 -1
  595. package/lib/odspSnapshotParser.mjs.map +0 -1
  596. package/lib/odspSummaryUploadManager.d.mts.map +0 -1
  597. package/lib/odspSummaryUploadManager.mjs.map +0 -1
  598. package/lib/odspUrlHelper.d.mts.map +0 -1
  599. package/lib/odspUrlHelper.mjs.map +0 -1
  600. package/lib/odspUtils.d.mts.map +0 -1
  601. package/lib/odspUtils.mjs.map +0 -1
  602. package/lib/opsCaching.d.mts.map +0 -1
  603. package/lib/opsCaching.mjs.map +0 -1
  604. package/lib/packageVersion.d.mts.map +0 -1
  605. package/lib/packageVersion.mjs.map +0 -1
  606. package/lib/prefetchLatestSnapshot.d.mts.map +0 -1
  607. package/lib/prefetchLatestSnapshot.mjs.map +0 -1
  608. package/lib/retryErrorsStorageAdapter.d.mts.map +0 -1
  609. package/lib/retryErrorsStorageAdapter.mjs.map +0 -1
  610. package/lib/retryUtils.d.mts.map +0 -1
  611. package/lib/retryUtils.mjs.map +0 -1
  612. package/lib/socketModule.d.mts.map +0 -1
  613. package/lib/socketModule.mjs.map +0 -1
  614. package/lib/vroom.d.mts.map +0 -1
  615. package/lib/vroom.mjs.map +0 -1
  616. package/lib/zipItDataRepresentationUtils.d.mts.map +0 -1
  617. package/lib/zipItDataRepresentationUtils.mjs.map +0 -1
@@ -0,0 +1,221 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import * as api from "@fluidframework/protocol-definitions";
7
+ import { bufferToString } from "@fluid-internal/client-utils";
8
+ import { SharingLinkRole, SharingLinkScope, } from "@fluidframework/odsp-driver-definitions";
9
+ import { createChildLogger } from "@fluidframework/telemetry-utils";
10
+ import { convertCreateNewSummaryTreeToTreeAndBlobs } from "../createNewUtils.js";
11
+ import { createNewFluidFile } from "../createFile.js";
12
+ import { createNewContainerOnExistingFile } from "../createNewContainerOnExistingFile.js";
13
+ import { EpochTracker } from "../epochTracker.js";
14
+ import { getHashedDocumentId } from "../odspPublicUtils.js";
15
+ import { createCacheSnapshotKey } from "../odspUtils.js";
16
+ import { LocalPersistentCache } from "../odspCache.js";
17
+ import { mockFetchOk } from "./mockFetch.js";
18
+ const createUtLocalCache = () => new LocalPersistentCache();
19
+ describe("Create New Utils Tests", () => {
20
+ const documentAttributes = {
21
+ minimumSequenceNumber: 0,
22
+ sequenceNumber: 0,
23
+ };
24
+ const blobContent = "testing";
25
+ const createSummary = () => {
26
+ const summary = {
27
+ type: api.SummaryType.Tree,
28
+ tree: {},
29
+ };
30
+ summary.tree[".app"] = {
31
+ type: api.SummaryType.Tree,
32
+ tree: {
33
+ attributes: {
34
+ type: api.SummaryType.Blob,
35
+ content: blobContent,
36
+ },
37
+ },
38
+ };
39
+ summary.tree[".protocol"] = {
40
+ type: api.SummaryType.Tree,
41
+ tree: {
42
+ attributes: {
43
+ type: api.SummaryType.Blob,
44
+ content: JSON.stringify(documentAttributes),
45
+ },
46
+ },
47
+ };
48
+ return summary;
49
+ };
50
+ const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
51
+ const driveId = "driveId";
52
+ const itemId = "itemId";
53
+ const resolvedUrl = {
54
+ siteUrl,
55
+ driveId,
56
+ itemId,
57
+ odspResolvedUrl: true,
58
+ };
59
+ const filePath = "path";
60
+ let newFileParams;
61
+ let hashedDocumentId;
62
+ let localCache;
63
+ let fileEntry;
64
+ let epochTracker;
65
+ before(async () => {
66
+ hashedDocumentId = await getHashedDocumentId(driveId, itemId);
67
+ fileEntry = {
68
+ docId: hashedDocumentId,
69
+ resolvedUrl,
70
+ };
71
+ });
72
+ beforeEach(async () => {
73
+ localCache = createUtLocalCache();
74
+ // use null logger here as we expect errors
75
+ epochTracker = new EpochTracker(localCache, {
76
+ docId: hashedDocumentId,
77
+ resolvedUrl,
78
+ }, createChildLogger());
79
+ newFileParams = {
80
+ type: "New",
81
+ driveId,
82
+ siteUrl,
83
+ filePath,
84
+ filename: "filename",
85
+ };
86
+ });
87
+ afterEach(async () => {
88
+ await epochTracker.removeEntries().catch(() => { });
89
+ });
90
+ const test = (snapshot) => {
91
+ const snapshotTree = snapshot.snapshotTree;
92
+ assert.strictEqual(Object.entries(snapshotTree.trees).length, 2, "app and protocol should be there");
93
+ assert.strictEqual(snapshot.blobContents.size, 2, "2 blobs should be there");
94
+ const appTree = snapshotTree.trees[".app"];
95
+ const protocolTree = snapshotTree.trees[".protocol"];
96
+ assert(appTree !== undefined, "App tree should be there");
97
+ assert(protocolTree !== undefined, "Protocol tree should be there");
98
+ const appTreeBlobId = appTree.blobs.attributes;
99
+ const appTreeBlobValBuffer = snapshot.blobContents.get(appTreeBlobId);
100
+ assert(appTreeBlobValBuffer !== undefined, "app blob value should exist");
101
+ const appTreeBlobVal = bufferToString(appTreeBlobValBuffer, "utf8");
102
+ assert(appTreeBlobVal === blobContent, "Blob content should match");
103
+ const docAttributesBlobId = protocolTree.blobs.attributes;
104
+ const docAttributesBuffer = snapshot.blobContents.get(docAttributesBlobId);
105
+ assert(docAttributesBuffer !== undefined, "protocol attributes blob value should exist");
106
+ const docAttributesBlobValue = bufferToString(docAttributesBuffer, "utf8");
107
+ assert(docAttributesBlobValue === JSON.stringify(documentAttributes), "Blob content should match");
108
+ assert(snapshot.ops.length === 0, "No ops should be there");
109
+ assert(snapshot.sequenceNumber === 0, "Seq number should be 0");
110
+ };
111
+ it("Should convert as expected and check contents", async () => {
112
+ const snapshot = convertCreateNewSummaryTreeToTreeAndBlobs(createSummary(), "");
113
+ test(snapshot);
114
+ });
115
+ it("Should cache converted summary during createNewFluidFile", async () => {
116
+ const odspResolvedUrl = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
117
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
118
+ const snapshot = await epochTracker.get(createCacheSnapshotKey(odspResolvedUrl));
119
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
120
+ test(snapshot);
121
+ await epochTracker.removeEntries().catch(() => { });
122
+ });
123
+ it("Should cache converted summary during createNewContainerOnExistingFile", async () => {
124
+ const existingFileParams = {
125
+ type: "Existing",
126
+ itemId: "itemId1",
127
+ siteUrl,
128
+ driveId,
129
+ };
130
+ const odspResolvedUrl = await mockFetchOk(async () => createNewContainerOnExistingFile(async (_options) => "token", existingFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
131
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
132
+ const snapshot = await epochTracker.get(createCacheSnapshotKey(odspResolvedUrl));
133
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
134
+ test(snapshot);
135
+ await epochTracker.removeEntries().catch(() => { });
136
+ });
137
+ it("Should save 'sharing' information received during createNewFluidFile", async () => {
138
+ const createLinkType = {
139
+ scope: SharingLinkScope.users,
140
+ role: SharingLinkRole.edit,
141
+ };
142
+ newFileParams.createLinkType = createLinkType;
143
+ // Test that sharing link is set appropriately when it is received in the response from ODSP
144
+ const mockSharingLinkData = {
145
+ localizedDescription: "Specific users with the link can view",
146
+ iconUrl: "https://mock.icon.url",
147
+ scope: "organization",
148
+ type: "view",
149
+ webUrl: "https://mock.url",
150
+ blocksDownload: false,
151
+ createOnly: false,
152
+ status: "Created",
153
+ createdDateTime: "2022-05-18T02:58:17.0256105Z",
154
+ };
155
+ const mockSharingData = {
156
+ shareId: "c40e6f0a-666e-48bf-9509-066900a73b2b",
157
+ sharingLink: mockSharingLinkData,
158
+ };
159
+ let odspResolvedUrl = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, false /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, undefined /* isClpCompliantApp */, true /* enableSingleRequestForShareLinkWithCreate */), {
160
+ itemId: "mockItemId",
161
+ id: "mockId",
162
+ sharing: mockSharingData,
163
+ sharingLinkErrorReason: undefined,
164
+ }, { "x-fluid-epoch": "epoch1" });
165
+ assert.deepStrictEqual(odspResolvedUrl.shareLinkInfo?.createLink, {
166
+ shareId: mockSharingData.shareId,
167
+ link: {
168
+ role: mockSharingData.sharingLink.type,
169
+ ...mockSharingData.sharingLink,
170
+ },
171
+ error: undefined,
172
+ });
173
+ // Test that error message is set appropriately when it is received in the response from ODSP
174
+ const mockSharingError = {
175
+ error: {
176
+ code: "invalidRequest",
177
+ message: "Invalid request",
178
+ innerError: {
179
+ code: "invalidRequest",
180
+ errorType: "expected",
181
+ message: "The CreateLinkScope 'asdf' is not valid or supported.",
182
+ stackTrace: "Exceptions.InvalidRequestException",
183
+ throwSite: "",
184
+ },
185
+ },
186
+ };
187
+ odspResolvedUrl = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, false /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, undefined /* isClpCompliantApp */, true /* enableSingleRequestForShareLinkWithCreate */), {
188
+ itemId: "mockItemId",
189
+ id: "mockId",
190
+ sharingLinkErrorReason: "mockError",
191
+ sharing: mockSharingError,
192
+ }, { "x-fluid-epoch": "epoch1" });
193
+ assert.deepStrictEqual(odspResolvedUrl.shareLinkInfo?.createLink, {
194
+ shareId: undefined,
195
+ link: undefined,
196
+ error: mockSharingError.error,
197
+ });
198
+ await epochTracker.removeEntries().catch(() => { });
199
+ });
200
+ it("Should set the isClpCompliantApp prop on resolved url if already present when createNewFluidFile", async () => {
201
+ const odspResolvedUrl1 = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, true /* isClpCompliantApp */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
202
+ assert(odspResolvedUrl1.isClpCompliantApp, "isClpCompliantApp should be set");
203
+ const odspResolvedUrl2 = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, undefined /* isClpCompliantApp */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
204
+ assert(!odspResolvedUrl2.isClpCompliantApp, "isClpCompliantApp should be falsy");
205
+ await epochTracker.removeEntries().catch(() => { });
206
+ });
207
+ it("Should set the isClpCompliantApp prop on resolved url if already present when createNewContainerOnExistingFile", async () => {
208
+ const existingFileParams = {
209
+ type: "Existing",
210
+ itemId: "itemId1",
211
+ siteUrl,
212
+ driveId,
213
+ };
214
+ const odspResolvedUrl1 = await mockFetchOk(async () => createNewContainerOnExistingFile(async (_options) => "token", existingFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, true /* isClpCompliantApp */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
215
+ assert(odspResolvedUrl1.isClpCompliantApp, "isClpCompliantApp should be set");
216
+ const odspResolvedUrl2 = await mockFetchOk(async () => createNewFluidFile(async (_options) => "token", newFileParams, createChildLogger(), createSummary(), epochTracker, fileEntry, true /* createNewCaching */, false /* forceAccessTokenViaAuthorizationHeader */, undefined /* isClpCompliantApp */), { itemId: "itemId1", id: "Summary handle" }, { "x-fluid-epoch": "epoch1" });
217
+ assert(!odspResolvedUrl2.isClpCompliantApp, "isClpCompliantApp should be falsy");
218
+ await epochTracker.removeEntries().catch(() => { });
219
+ });
220
+ });
221
+ //# sourceMappingURL=createNewUtilsTests.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNewUtilsTests.spec.js","sourceRoot":"","sources":["../../src/test/createNewUtilsTests.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,GAAG,MAAM,sCAAsC,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAIN,eAAe,EACf,gBAAgB,GAChB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,yCAAyC,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAgB,sBAAsB,EAAqB,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,kBAAkB,GAAG,GAAyB,EAAE,CAAC,IAAI,oBAAoB,EAAE,CAAC;AAElF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,MAAM,kBAAkB,GAA4B;QACnD,qBAAqB,EAAE,CAAC;QACxB,cAAc,EAAE,CAAC;KACjB,CAAC;IACF,MAAM,WAAW,GAAG,SAAS,CAAC;IAC9B,MAAM,aAAa,GAAG,GAAqB,EAAE;QAC5C,MAAM,OAAO,GAAqB;YACjC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;YAC1B,IAAI,EAAE,EAAE;SACR,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;YACtB,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;YAC1B,IAAI,EAAE;gBACL,UAAU,EAAE;oBACX,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;oBAC1B,OAAO,EAAE,WAAW;iBACpB;aACD;SACD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG;YAC3B,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;YAC1B,IAAI,EAAE;gBACL,UAAU,EAAE;oBACX,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;oBAC1B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;iBAC3C;aACD;SACD,CAAC;QACF,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,6CAA6C,CAAC;IAC9D,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,MAAM,WAAW,GAAG;QACnB,OAAO;QACP,OAAO;QACP,MAAM;QACN,eAAe,EAAE,IAAI;KACU,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,IAAI,aAA2B,CAAC;IAChC,IAAI,gBAAwB,CAAC;IAC7B,IAAI,UAAgC,CAAC;IACrC,IAAI,SAAqB,CAAC;IAC1B,IAAI,YAA0B,CAAC;IAE/B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,SAAS,GAAG;YACX,KAAK,EAAE,gBAAgB;YACvB,WAAW;SACX,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,UAAU,GAAG,kBAAkB,EAAE,CAAC;QAClC,2CAA2C;QAC3C,YAAY,GAAG,IAAI,YAAY,CAC9B,UAAU,EACV;YACC,KAAK,EAAE,gBAAgB;YACvB,WAAW;SACX,EACD,iBAAiB,EAAE,CACnB,CAAC;QACF,aAAa,GAAG;YACf,IAAI,EAAE,KAAK;YACX,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ,EAAE,UAAU;SACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,QAAmB,EAAQ,EAAE;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3C,MAAM,CAAC,WAAW,CACjB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,EACzC,CAAC,EACD,kCAAkC,CAClC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAE7E,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,0BAA0B,CAAC,CAAC;QAC1D,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,+BAA+B,CAAC,CAAC;QAEpE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,MAAM,oBAAoB,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACtE,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAC1E,MAAM,cAAc,GAAG,cAAc,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,cAAc,KAAK,WAAW,EAAE,2BAA2B,CAAC,CAAC;QAEpE,MAAM,mBAAmB,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,KAAK,SAAS,EAAE,6CAA6C,CAAC,CAAC;QACzF,MAAM,sBAAsB,GAAG,cAAc,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,CACL,sBAAsB,KAAK,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAC7D,2BAA2B,CAC3B,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,yCAAyC,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,eAAe,GAAG,MAAM,WAAW,CACxC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,CAClD,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,mEAAmE;QACnE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;QACjF,iEAAiE;QACjE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACf,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,kBAAkB,GAAsB;YAC7C,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO;YACP,OAAO;SACP,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,WAAW,CACxC,KAAK,IAAI,EAAE,CACV,gCAAgC,CAC/B,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,kBAAkB,EAClB,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,CAClD,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,mEAAmE;QACnE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;QACjF,iEAAiE;QACjE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACf,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,cAAc,GAAqB;YACxC,KAAK,EAAE,gBAAgB,CAAC,KAAK;YAC7B,IAAI,EAAE,eAAe,CAAC,IAAI;SAC1B,CAAC;QACF,aAAa,CAAC,cAAc,GAAG,cAAc,CAAC;QAE9C,4FAA4F;QAC5F,MAAM,mBAAmB,GAAG;YAC3B,oBAAoB,EAAE,uCAAuC;YAC7D,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,8BAA8B;SAC/C,CAAC;QACF,MAAM,eAAe,GAAG;YACvB,OAAO,EAAE,sCAAsC;YAC/C,WAAW,EAAE,mBAAmB;SAChC,CAAC;QACF,IAAI,eAAe,GAAG,MAAM,WAAW,CACtC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,4CAA4C,EAClD,SAAS,CAAC,uBAAuB,EACjC,IAAI,CAAC,+CAA+C,CACpD,EACF;YACC,MAAM,EAAE,YAAY;YACpB,EAAE,EAAE,QAAQ;YACZ,OAAO,EAAE,eAAe;YACxB,sBAAsB,EAAE,SAAS;SACjC,EACD,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,EAAE;YACjE,OAAO,EAAE,eAAe,CAAC,OAAO;YAChC,IAAI,EAAE;gBACL,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,IAAI;gBACtC,GAAG,eAAe,CAAC,WAAW;aAC9B;YACD,KAAK,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,6FAA6F;QAC7F,MAAM,gBAAgB,GAAG;YACxB,KAAK,EAAE;gBACN,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,iBAAiB;gBAC1B,UAAU,EAAE;oBACX,IAAI,EAAE,gBAAgB;oBACtB,SAAS,EAAE,UAAU;oBACrB,OAAO,EAAE,uDAAuD;oBAChE,UAAU,EAAE,oCAAoC;oBAChD,SAAS,EAAE,EAAE;iBACb;aACD;SACD,CAAC;QACF,eAAe,GAAG,MAAM,WAAW,CAClC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,4CAA4C,EAClD,SAAS,CAAC,uBAAuB,EACjC,IAAI,CAAC,+CAA+C,CACpD,EACF;YACC,MAAM,EAAE,YAAY;YACpB,EAAE,EAAE,QAAQ;YACZ,sBAAsB,EAAE,WAAW;YACnC,OAAO,EAAE,gBAAgB;SACzB,EACD,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,EAAE;YACjE,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,gBAAgB,CAAC,KAAK;SAC7B,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QACjH,MAAM,gBAAgB,GAAG,MAAM,WAAW,CACzC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,EAClD,IAAI,CAAC,uBAAuB,CAC5B,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;QAE9E,MAAM,gBAAgB,GAAG,MAAM,WAAW,CACzC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,EAClD,SAAS,CAAC,uBAAuB,CACjC,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gHAAgH,EAAE,KAAK,IAAI,EAAE;QAC/H,MAAM,kBAAkB,GAAsB;YAC7C,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO;YACP,OAAO;SACP,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CACzC,KAAK,IAAI,EAAE,CACV,gCAAgC,CAC/B,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,kBAAkB,EAClB,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,EAClD,IAAI,CAAC,uBAAuB,CAC5B,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;QAE9E,MAAM,gBAAgB,GAAG,MAAM,WAAW,CACzC,KAAK,IAAI,EAAE,CACV,kBAAkB,CACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EAAE,EACf,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CAAC,4CAA4C,EAClD,SAAS,CAAC,uBAAuB,CACjC,EACF,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAC3C,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC7B,CAAC;QACF,MAAM,CAAC,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,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 { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport * as api from \"@fluidframework/protocol-definitions\";\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport {\n\tIFileEntry,\n\tIOdspResolvedUrl,\n\tISharingLinkKind,\n\tSharingLinkRole,\n\tSharingLinkScope,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { convertCreateNewSummaryTreeToTreeAndBlobs } from \"../createNewUtils.js\";\nimport { createNewFluidFile } from \"../createFile.js\";\nimport { createNewContainerOnExistingFile } from \"../createNewContainerOnExistingFile.js\";\nimport { EpochTracker } from \"../epochTracker.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { INewFileInfo, createCacheSnapshotKey, IExistingFileInfo } from \"../odspUtils.js\";\nimport { LocalPersistentCache } from \"../odspCache.js\";\nimport { mockFetchOk } from \"./mockFetch.js\";\n\nconst createUtLocalCache = (): LocalPersistentCache => new LocalPersistentCache();\n\ndescribe(\"Create New Utils Tests\", () => {\n\tconst documentAttributes: api.IDocumentAttributes = {\n\t\tminimumSequenceNumber: 0,\n\t\tsequenceNumber: 0,\n\t};\n\tconst blobContent = \"testing\";\n\tconst createSummary = (): api.ISummaryTree => {\n\t\tconst summary: api.ISummaryTree = {\n\t\t\ttype: api.SummaryType.Tree,\n\t\t\ttree: {},\n\t\t};\n\n\t\tsummary.tree[\".app\"] = {\n\t\t\ttype: api.SummaryType.Tree,\n\t\t\ttree: {\n\t\t\t\tattributes: {\n\t\t\t\t\ttype: api.SummaryType.Blob,\n\t\t\t\t\tcontent: blobContent,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tsummary.tree[\".protocol\"] = {\n\t\t\ttype: api.SummaryType.Tree,\n\t\t\ttree: {\n\t\t\t\tattributes: {\n\t\t\t\t\ttype: api.SummaryType.Blob,\n\t\t\t\t\tcontent: JSON.stringify(documentAttributes),\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\treturn summary;\n\t};\n\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tconst resolvedUrl = {\n\t\tsiteUrl,\n\t\tdriveId,\n\t\titemId,\n\t\todspResolvedUrl: true,\n\t} as unknown as IOdspResolvedUrl;\n\tconst filePath = \"path\";\n\tlet newFileParams: INewFileInfo;\n\tlet hashedDocumentId: string;\n\tlet localCache: LocalPersistentCache;\n\tlet fileEntry: IFileEntry;\n\tlet epochTracker: EpochTracker;\n\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t\tfileEntry = {\n\t\t\tdocId: hashedDocumentId,\n\t\t\tresolvedUrl,\n\t\t};\n\t});\n\n\tbeforeEach(async () => {\n\t\tlocalCache = createUtLocalCache();\n\t\t// use null logger here as we expect errors\n\t\tepochTracker = new EpochTracker(\n\t\t\tlocalCache,\n\t\t\t{\n\t\t\t\tdocId: hashedDocumentId,\n\t\t\t\tresolvedUrl,\n\t\t\t},\n\t\t\tcreateChildLogger(),\n\t\t);\n\t\tnewFileParams = {\n\t\t\ttype: \"New\",\n\t\t\tdriveId,\n\t\t\tsiteUrl,\n\t\t\tfilePath,\n\t\t\tfilename: \"filename\",\n\t\t};\n\t});\n\n\tafterEach(async () => {\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tconst test = (snapshot: ISnapshot): void => {\n\t\tconst snapshotTree = snapshot.snapshotTree;\n\t\tassert.strictEqual(\n\t\t\tObject.entries(snapshotTree.trees).length,\n\t\t\t2,\n\t\t\t\"app and protocol should be there\",\n\t\t);\n\t\tassert.strictEqual(snapshot.blobContents.size, 2, \"2 blobs should be there\");\n\n\t\tconst appTree = snapshotTree.trees[\".app\"];\n\t\tconst protocolTree = snapshotTree.trees[\".protocol\"];\n\t\tassert(appTree !== undefined, \"App tree should be there\");\n\t\tassert(protocolTree !== undefined, \"Protocol tree should be there\");\n\n\t\tconst appTreeBlobId = appTree.blobs.attributes;\n\t\tconst appTreeBlobValBuffer = snapshot.blobContents.get(appTreeBlobId);\n\t\tassert(appTreeBlobValBuffer !== undefined, \"app blob value should exist\");\n\t\tconst appTreeBlobVal = bufferToString(appTreeBlobValBuffer, \"utf8\");\n\t\tassert(appTreeBlobVal === blobContent, \"Blob content should match\");\n\n\t\tconst docAttributesBlobId = protocolTree.blobs.attributes;\n\t\tconst docAttributesBuffer = snapshot.blobContents.get(docAttributesBlobId);\n\t\tassert(docAttributesBuffer !== undefined, \"protocol attributes blob value should exist\");\n\t\tconst docAttributesBlobValue = bufferToString(docAttributesBuffer, \"utf8\");\n\t\tassert(\n\t\t\tdocAttributesBlobValue === JSON.stringify(documentAttributes),\n\t\t\t\"Blob content should match\",\n\t\t);\n\n\t\tassert(snapshot.ops.length === 0, \"No ops should be there\");\n\t\tassert(snapshot.sequenceNumber === 0, \"Seq number should be 0\");\n\t};\n\n\tit(\"Should convert as expected and check contents\", async () => {\n\t\tconst snapshot = convertCreateNewSummaryTreeToTreeAndBlobs(createSummary(), \"\");\n\t\ttest(snapshot);\n\t});\n\n\tit(\"Should cache converted summary during createNewFluidFile\", async () => {\n\t\tconst odspResolvedUrl = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst snapshot = await epochTracker.get(createCacheSnapshotKey(odspResolvedUrl));\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\ttest(snapshot);\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tit(\"Should cache converted summary during createNewContainerOnExistingFile\", async () => {\n\t\tconst existingFileParams: IExistingFileInfo = {\n\t\t\ttype: \"Existing\",\n\t\t\titemId: \"itemId1\",\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t};\n\t\tconst odspResolvedUrl = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewContainerOnExistingFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\texistingFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst snapshot = await epochTracker.get(createCacheSnapshotKey(odspResolvedUrl));\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\ttest(snapshot);\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tit(\"Should save 'sharing' information received during createNewFluidFile\", async () => {\n\t\tconst createLinkType: ISharingLinkKind = {\n\t\t\tscope: SharingLinkScope.users,\n\t\t\trole: SharingLinkRole.edit,\n\t\t};\n\t\tnewFileParams.createLinkType = createLinkType;\n\n\t\t// Test that sharing link is set appropriately when it is received in the response from ODSP\n\t\tconst mockSharingLinkData = {\n\t\t\tlocalizedDescription: \"Specific users with the link can view\",\n\t\t\ticonUrl: \"https://mock.icon.url\",\n\t\t\tscope: \"organization\",\n\t\t\ttype: \"view\",\n\t\t\twebUrl: \"https://mock.url\",\n\t\t\tblocksDownload: false,\n\t\t\tcreateOnly: false,\n\t\t\tstatus: \"Created\",\n\t\t\tcreatedDateTime: \"2022-05-18T02:58:17.0256105Z\",\n\t\t};\n\t\tconst mockSharingData = {\n\t\t\tshareId: \"c40e6f0a-666e-48bf-9509-066900a73b2b\",\n\t\t\tsharingLink: mockSharingLinkData,\n\t\t};\n\t\tlet odspResolvedUrl = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\tfalse /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\tundefined /* isClpCompliantApp */,\n\t\t\t\t\ttrue /* enableSingleRequestForShareLinkWithCreate */,\n\t\t\t\t),\n\t\t\t{\n\t\t\t\titemId: \"mockItemId\",\n\t\t\t\tid: \"mockId\",\n\t\t\t\tsharing: mockSharingData,\n\t\t\t\tsharingLinkErrorReason: undefined,\n\t\t\t},\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert.deepStrictEqual(odspResolvedUrl.shareLinkInfo?.createLink, {\n\t\t\tshareId: mockSharingData.shareId,\n\t\t\tlink: {\n\t\t\t\trole: mockSharingData.sharingLink.type,\n\t\t\t\t...mockSharingData.sharingLink,\n\t\t\t},\n\t\t\terror: undefined,\n\t\t});\n\n\t\t// Test that error message is set appropriately when it is received in the response from ODSP\n\t\tconst mockSharingError = {\n\t\t\terror: {\n\t\t\t\tcode: \"invalidRequest\",\n\t\t\t\tmessage: \"Invalid request\",\n\t\t\t\tinnerError: {\n\t\t\t\t\tcode: \"invalidRequest\",\n\t\t\t\t\terrorType: \"expected\",\n\t\t\t\t\tmessage: \"The CreateLinkScope 'asdf' is not valid or supported.\",\n\t\t\t\t\tstackTrace: \"Exceptions.InvalidRequestException\",\n\t\t\t\t\tthrowSite: \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\todspResolvedUrl = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\tfalse /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\tundefined /* isClpCompliantApp */,\n\t\t\t\t\ttrue /* enableSingleRequestForShareLinkWithCreate */,\n\t\t\t\t),\n\t\t\t{\n\t\t\t\titemId: \"mockItemId\",\n\t\t\t\tid: \"mockId\",\n\t\t\t\tsharingLinkErrorReason: \"mockError\",\n\t\t\t\tsharing: mockSharingError,\n\t\t\t},\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert.deepStrictEqual(odspResolvedUrl.shareLinkInfo?.createLink, {\n\t\t\tshareId: undefined,\n\t\t\tlink: undefined,\n\t\t\terror: mockSharingError.error,\n\t\t});\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tit(\"Should set the isClpCompliantApp prop on resolved url if already present when createNewFluidFile\", async () => {\n\t\tconst odspResolvedUrl1 = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\ttrue /* isClpCompliantApp */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert(odspResolvedUrl1.isClpCompliantApp, \"isClpCompliantApp should be set\");\n\n\t\tconst odspResolvedUrl2 = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\tundefined /* isClpCompliantApp */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert(!odspResolvedUrl2.isClpCompliantApp, \"isClpCompliantApp should be falsy\");\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tit(\"Should set the isClpCompliantApp prop on resolved url if already present when createNewContainerOnExistingFile\", async () => {\n\t\tconst existingFileParams: IExistingFileInfo = {\n\t\t\ttype: \"Existing\",\n\t\t\titemId: \"itemId1\",\n\t\t\tsiteUrl,\n\t\t\tdriveId,\n\t\t};\n\t\tconst odspResolvedUrl1 = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewContainerOnExistingFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\texistingFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\ttrue /* isClpCompliantApp */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert(odspResolvedUrl1.isClpCompliantApp, \"isClpCompliantApp should be set\");\n\n\t\tconst odspResolvedUrl2 = await mockFetchOk(\n\t\t\tasync () =>\n\t\t\t\tcreateNewFluidFile(\n\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\tnewFileParams,\n\t\t\t\t\tcreateChildLogger(),\n\t\t\t\t\tcreateSummary(),\n\t\t\t\t\tepochTracker,\n\t\t\t\t\tfileEntry,\n\t\t\t\t\ttrue /* createNewCaching */,\n\t\t\t\t\tfalse /* forceAccessTokenViaAuthorizationHeader */,\n\t\t\t\t\tundefined /* isClpCompliantApp */,\n\t\t\t\t),\n\t\t\t{ itemId: \"itemId1\", id: \"Summary handle\" },\n\t\t\t{ \"x-fluid-epoch\": \"epoch1\" },\n\t\t);\n\t\tassert(!odspResolvedUrl2.isClpCompliantApp, \"isClpCompliantApp should be falsy\");\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n});\n"]}
@@ -0,0 +1,176 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import { MockLogger } from "@fluidframework/telemetry-utils";
7
+ import { OdspDeltaStorageService, OdspDeltaStorageWithCache } from "../odspDeltaStorageService.js";
8
+ import { LocalPersistentCache } from "../odspCache.js";
9
+ import { EpochTracker } from "../epochTracker.js";
10
+ import { mockFetchOk } from "./mockFetch.js";
11
+ const createUtLocalCache = () => new LocalPersistentCache(2000);
12
+ const createUtEpochTracker = (fileEntry, logger) => new EpochTracker(createUtLocalCache(), fileEntry, logger);
13
+ describe("DeltaStorageService", () => {
14
+ /*
15
+ * Use fake urls so we don't accidental make real calls that make our tests flakey.
16
+ * Using microsoft.com as the domain so we don't send traffic somewhere hostile on accident.
17
+ */
18
+ const deltaStorageBasePath = "https://fake.microsoft.com";
19
+ const deltaStorageRelativePath = "/drives/testdrive/items/testitem/opStream";
20
+ const testDeltaStorageUrl = `${deltaStorageBasePath}${deltaStorageRelativePath}`;
21
+ const siteUrl = "https://fake.microsoft.com";
22
+ const driveId = "testdrive";
23
+ const itemId = "testitem";
24
+ const resolvedUrl = {
25
+ siteUrl,
26
+ driveId,
27
+ itemId,
28
+ odspResolvedUrl: true,
29
+ };
30
+ const fileEntry = { docId: "docId", resolvedUrl };
31
+ it("Should build the correct sharepoint delta url with auth", async () => {
32
+ const logger = new MockLogger();
33
+ const deltaStorageService = new OdspDeltaStorageService(testDeltaStorageUrl, async (_refresh) => "?access_token=123", createUtEpochTracker(fileEntry, logger), logger.toTelemetryLogger());
34
+ const actualDeltaUrl = deltaStorageService.buildUrl(3, 8);
35
+ const expectedDeltaUrl = `${deltaStorageBasePath}/drives/testdrive/items/testitem/opStream?ump=1&filter=sequenceNumber%20ge%203%20and%20sequenceNumber%20le%207`;
36
+ assert.equal(actualDeltaUrl, expectedDeltaUrl, "The constructed delta url is invalid");
37
+ logger.assertMatchNone([{ category: "error" }]);
38
+ });
39
+ describe("Get Returns Response With Op Envelope", () => {
40
+ const expectedDeltaFeedResponse = {
41
+ value: [
42
+ {
43
+ op: {
44
+ clientId: "present-place",
45
+ clientSequenceNumber: 71,
46
+ contents: null,
47
+ minimumSequenceNumber: 1,
48
+ referenceSequenceNumber: 1,
49
+ sequenceNumber: 1,
50
+ text: "",
51
+ user: {
52
+ id: "Unruffled Bose",
53
+ },
54
+ },
55
+ sequenceNumber: 1,
56
+ },
57
+ {
58
+ op: {
59
+ clientId: "present-place",
60
+ clientSequenceNumber: 71,
61
+ contents: null,
62
+ minimumSequenceNumber: 1,
63
+ referenceSequenceNumber: 1,
64
+ sequenceNumber: 2,
65
+ type: "noop",
66
+ user: {
67
+ id: "Unruffled Bose",
68
+ },
69
+ },
70
+ sequenceNumber: 2,
71
+ },
72
+ ],
73
+ };
74
+ let deltaStorageService;
75
+ const logger = new MockLogger();
76
+ before(() => {
77
+ deltaStorageService = new OdspDeltaStorageService(testDeltaStorageUrl, async (_refresh) => "", createUtEpochTracker(fileEntry, logger), logger.toTelemetryLogger());
78
+ });
79
+ afterEach(() => {
80
+ logger.assertMatchNone([{ category: "error" }]);
81
+ });
82
+ it("Should deserialize the delta feed response correctly", async () => {
83
+ const { messages, partialResult } = await mockFetchOk(async () => deltaStorageService.get(2, 8, {}), expectedDeltaFeedResponse);
84
+ assert(!partialResult, "partialResult === false");
85
+ assert.equal(messages.length, 2, "Deserialized feed response is not of expected length");
86
+ assert.equal(messages[0].sequenceNumber, 1, "First element of feed response has invalid sequence number");
87
+ assert.equal(messages[1].sequenceNumber, 2, "Second element of feed response has invalid sequence number");
88
+ assert.equal(messages[1].type, "noop", "Second element of feed response has invalid op type");
89
+ });
90
+ });
91
+ describe("Get Returns Response With Op Envelope", () => {
92
+ const expectedDeltaFeedResponse = {
93
+ value: [
94
+ {
95
+ clientId: "present-place",
96
+ clientSequenceNumber: 71,
97
+ contents: null,
98
+ minimumSequenceNumber: 1,
99
+ referenceSequenceNumber: 1,
100
+ sequenceNumber: 1,
101
+ text: "",
102
+ user: {
103
+ id: "Unruffled Bose",
104
+ },
105
+ },
106
+ {
107
+ clientId: "present-place",
108
+ clientSequenceNumber: 71,
109
+ contents: null,
110
+ minimumSequenceNumber: 1,
111
+ referenceSequenceNumber: 1,
112
+ sequenceNumber: 2,
113
+ type: "noop",
114
+ user: {
115
+ id: "Unruffled Bose",
116
+ },
117
+ },
118
+ ],
119
+ };
120
+ let deltaStorageService;
121
+ const logger = new MockLogger();
122
+ before(() => {
123
+ deltaStorageService = new OdspDeltaStorageService(testDeltaStorageUrl, async (_refresh) => "", createUtEpochTracker(fileEntry, logger), logger.toTelemetryLogger());
124
+ });
125
+ afterEach(() => {
126
+ logger.assertMatchNone([{ category: "error" }]);
127
+ });
128
+ it("Should deserialize the delta feed response correctly", async () => {
129
+ const { messages, partialResult } = await mockFetchOk(async () => deltaStorageService.get(2, 8, {}), expectedDeltaFeedResponse);
130
+ assert(!partialResult, "partialResult === false");
131
+ assert.equal(messages.length, 2, "Deserialized feed response is not of expected length");
132
+ assert.equal(messages[0].sequenceNumber, 1, "First element of feed response has invalid sequence number");
133
+ assert.equal(messages[1].sequenceNumber, 2, "Second element of feed response has invalid sequence number");
134
+ assert.equal(messages[1].type, "noop", "Second element of feed response has invalid op type");
135
+ });
136
+ });
137
+ describe("DeltaStorageServiceWith Cache Tests", () => {
138
+ const logger = new MockLogger();
139
+ afterEach(() => {
140
+ logger.assertMatchNone([{ category: "error" }]);
141
+ });
142
+ it("FirstCacheMiss should update to first miss op seq number correctly", async () => {
143
+ const deltasFetchResult = { messages: [], partialResult: false };
144
+ let count = 0;
145
+ const getCached = async (from, to) => {
146
+ if (count === 0) {
147
+ count += 1;
148
+ return [
149
+ {
150
+ clientId: "present-place",
151
+ clientSequenceNumber: 71,
152
+ contents: null,
153
+ minimumSequenceNumber: 1,
154
+ referenceSequenceNumber: 1,
155
+ sequenceNumber: from,
156
+ type: "dds",
157
+ timestamp: Date.now(),
158
+ },
159
+ ];
160
+ }
161
+ count += 1;
162
+ assert.fail("Should not reach here");
163
+ };
164
+ const odspDeltaStorageServiceWithCache = new OdspDeltaStorageWithCache([], logger.toTelemetryLogger(), 1000, 1, async (from, to, props, reason) => deltasFetchResult, async (from, to) => getCached(from, to), (from, to) => [], (ops) => { }, () => ({
165
+ isFirstSnapshotFromNetwork: false,
166
+ }));
167
+ const messages = odspDeltaStorageServiceWithCache.fetchMessages(1, undefined);
168
+ const batch1 = await messages.read();
169
+ const batch2 = await messages.read();
170
+ assert(count === 1, "There should be only 1 cache access");
171
+ assert(batch1.done === false, "Firt batch should have returned 1 op");
172
+ assert(batch2.done === true, "No ops should be present in second batch");
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=deltaStorageService.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaStorageService.spec.js","sourceRoot":"","sources":["../../src/test/deltaStorageService.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 type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { IDeltasFetchResult } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { IOdspResolvedUrl, IFileEntry } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDeltaStorageService, OdspDeltaStorageWithCache } from \"../odspDeltaStorageService.js\";\nimport { LocalPersistentCache } from \"../odspCache.js\";\nimport { EpochTracker } from \"../epochTracker.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { mockFetchOk } from \"./mockFetch.js\";\n\nconst createUtLocalCache = (): LocalPersistentCache => new LocalPersistentCache(2000);\nconst createUtEpochTracker = (fileEntry: IFileEntry, logger: ITelemetryBaseLogger): EpochTracker =>\n\tnew EpochTracker(createUtLocalCache(), fileEntry, logger as ITelemetryLoggerExt);\n\ndescribe(\"DeltaStorageService\", () => {\n\t/*\n\t * Use fake urls so we don't accidental make real calls that make our tests flakey.\n\t * Using microsoft.com as the domain so we don't send traffic somewhere hostile on accident.\n\t */\n\tconst deltaStorageBasePath = \"https://fake.microsoft.com\";\n\tconst deltaStorageRelativePath = \"/drives/testdrive/items/testitem/opStream\";\n\tconst testDeltaStorageUrl = `${deltaStorageBasePath}${deltaStorageRelativePath}`;\n\tconst siteUrl = \"https://fake.microsoft.com\";\n\tconst driveId = \"testdrive\";\n\tconst itemId = \"testitem\";\n\tconst resolvedUrl = {\n\t\tsiteUrl,\n\t\tdriveId,\n\t\titemId,\n\t\todspResolvedUrl: true,\n\t} as unknown as IOdspResolvedUrl;\n\tconst fileEntry = { docId: \"docId\", resolvedUrl };\n\n\tit(\"Should build the correct sharepoint delta url with auth\", async () => {\n\t\tconst logger = new MockLogger();\n\t\tconst deltaStorageService = new OdspDeltaStorageService(\n\t\t\ttestDeltaStorageUrl,\n\t\t\tasync (_refresh) => \"?access_token=123\",\n\t\t\tcreateUtEpochTracker(fileEntry, logger),\n\t\t\tlogger.toTelemetryLogger(),\n\t\t);\n\t\tconst actualDeltaUrl = deltaStorageService.buildUrl(3, 8);\n\t\tconst expectedDeltaUrl = `${deltaStorageBasePath}/drives/testdrive/items/testitem/opStream?ump=1&filter=sequenceNumber%20ge%203%20and%20sequenceNumber%20le%207`;\n\t\tassert.equal(actualDeltaUrl, expectedDeltaUrl, \"The constructed delta url is invalid\");\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tdescribe(\"Get Returns Response With Op Envelope\", () => {\n\t\tconst expectedDeltaFeedResponse = {\n\t\t\tvalue: [\n\t\t\t\t{\n\t\t\t\t\top: {\n\t\t\t\t\t\tclientId: \"present-place\",\n\t\t\t\t\t\tclientSequenceNumber: 71,\n\t\t\t\t\t\tcontents: null,\n\t\t\t\t\t\tminimumSequenceNumber: 1,\n\t\t\t\t\t\treferenceSequenceNumber: 1,\n\t\t\t\t\t\tsequenceNumber: 1,\n\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tid: \"Unruffled Bose\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tsequenceNumber: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\top: {\n\t\t\t\t\t\tclientId: \"present-place\",\n\t\t\t\t\t\tclientSequenceNumber: 71,\n\t\t\t\t\t\tcontents: null,\n\t\t\t\t\t\tminimumSequenceNumber: 1,\n\t\t\t\t\t\treferenceSequenceNumber: 1,\n\t\t\t\t\t\tsequenceNumber: 2,\n\t\t\t\t\t\ttype: \"noop\",\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tid: \"Unruffled Bose\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tsequenceNumber: 2,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tlet deltaStorageService: OdspDeltaStorageService;\n\t\tconst logger = new MockLogger();\n\t\tbefore(() => {\n\t\t\tdeltaStorageService = new OdspDeltaStorageService(\n\t\t\t\ttestDeltaStorageUrl,\n\t\t\t\tasync (_refresh) => \"\",\n\t\t\t\tcreateUtEpochTracker(fileEntry, logger),\n\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t\t});\n\n\t\tit(\"Should deserialize the delta feed response correctly\", async () => {\n\t\t\tconst { messages, partialResult } = await mockFetchOk(\n\t\t\t\tasync () => deltaStorageService.get(2, 8, {}),\n\t\t\t\texpectedDeltaFeedResponse,\n\t\t\t);\n\t\t\tassert(!partialResult, \"partialResult === false\");\n\t\t\tassert.equal(\n\t\t\t\tmessages.length,\n\t\t\t\t2,\n\t\t\t\t\"Deserialized feed response is not of expected length\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[0].sequenceNumber,\n\t\t\t\t1,\n\t\t\t\t\"First element of feed response has invalid sequence number\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[1].sequenceNumber,\n\t\t\t\t2,\n\t\t\t\t\"Second element of feed response has invalid sequence number\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[1].type,\n\t\t\t\t\"noop\",\n\t\t\t\t\"Second element of feed response has invalid op type\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Get Returns Response With Op Envelope\", () => {\n\t\tconst expectedDeltaFeedResponse = {\n\t\t\tvalue: [\n\t\t\t\t{\n\t\t\t\t\tclientId: \"present-place\",\n\t\t\t\t\tclientSequenceNumber: 71,\n\t\t\t\t\tcontents: null,\n\t\t\t\t\tminimumSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 1,\n\t\t\t\t\tsequenceNumber: 1,\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: \"Unruffled Bose\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId: \"present-place\",\n\t\t\t\t\tclientSequenceNumber: 71,\n\t\t\t\t\tcontents: null,\n\t\t\t\t\tminimumSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 1,\n\t\t\t\t\tsequenceNumber: 2,\n\t\t\t\t\ttype: \"noop\",\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: \"Unruffled Bose\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tlet deltaStorageService: OdspDeltaStorageService;\n\t\tconst logger = new MockLogger();\n\t\tbefore(() => {\n\t\t\tdeltaStorageService = new OdspDeltaStorageService(\n\t\t\t\ttestDeltaStorageUrl,\n\t\t\t\tasync (_refresh) => \"\",\n\t\t\t\tcreateUtEpochTracker(fileEntry, logger),\n\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t\t});\n\n\t\tit(\"Should deserialize the delta feed response correctly\", async () => {\n\t\t\tconst { messages, partialResult } = await mockFetchOk(\n\t\t\t\tasync () => deltaStorageService.get(2, 8, {}),\n\t\t\t\texpectedDeltaFeedResponse,\n\t\t\t);\n\t\t\tassert(!partialResult, \"partialResult === false\");\n\t\t\tassert.equal(\n\t\t\t\tmessages.length,\n\t\t\t\t2,\n\t\t\t\t\"Deserialized feed response is not of expected length\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[0].sequenceNumber,\n\t\t\t\t1,\n\t\t\t\t\"First element of feed response has invalid sequence number\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[1].sequenceNumber,\n\t\t\t\t2,\n\t\t\t\t\"Second element of feed response has invalid sequence number\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tmessages[1].type,\n\t\t\t\t\"noop\",\n\t\t\t\t\"Second element of feed response has invalid op type\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"DeltaStorageServiceWith Cache Tests\", () => {\n\t\tconst logger = new MockLogger();\n\t\tafterEach(() => {\n\t\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t\t});\n\n\t\tit(\"FirstCacheMiss should update to first miss op seq number correctly\", async () => {\n\t\t\tconst deltasFetchResult: IDeltasFetchResult = { messages: [], partialResult: false };\n\t\t\tlet count = 0;\n\t\t\tconst getCached = async (\n\t\t\t\tfrom: number,\n\t\t\t\tto: number,\n\t\t\t): Promise<ISequencedDocumentMessage[]> => {\n\t\t\t\tif (count === 0) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclientId: \"present-place\",\n\t\t\t\t\t\t\tclientSequenceNumber: 71,\n\t\t\t\t\t\t\tcontents: null,\n\t\t\t\t\t\t\tminimumSequenceNumber: 1,\n\t\t\t\t\t\t\treferenceSequenceNumber: 1,\n\t\t\t\t\t\t\tsequenceNumber: from,\n\t\t\t\t\t\t\ttype: \"dds\",\n\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tcount += 1;\n\t\t\t\tassert.fail(\"Should not reach here\");\n\t\t\t};\n\t\t\tconst odspDeltaStorageServiceWithCache = new OdspDeltaStorageWithCache(\n\t\t\t\t[],\n\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t1000,\n\t\t\t\t1,\n\t\t\t\tasync (from, to, props, reason) => deltasFetchResult,\n\t\t\t\tasync (from, to) => getCached(from, to),\n\t\t\t\t(from, to) => [],\n\t\t\t\t(ops) => {},\n\t\t\t\t() =>\n\t\t\t\t\t({\n\t\t\t\t\t\tisFirstSnapshotFromNetwork: false,\n\t\t\t\t\t}) as unknown as OdspDocumentStorageService,\n\t\t\t);\n\n\t\t\tconst messages = odspDeltaStorageServiceWithCache.fetchMessages(1, undefined);\n\t\t\tconst batch1 = await messages.read();\n\t\t\tconst batch2 = await messages.read();\n\t\t\tassert(count === 1, \"There should be only 1 cache access\");\n\t\t\tassert(batch1.done === false, \"Firt batch should have returned 1 op\");\n\t\t\tassert(batch2.done === true, \"No ops should be present in second batch\");\n\t\t});\n\t});\n});\n"]}