@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,218 @@
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 { stringToBuffer } from "@fluid-internal/client-utils";
7
+ import { MockLogger } from "@fluidframework/telemetry-utils";
8
+ import { parseCompactSnapshotResponse } from "../compactSnapshotParser.js";
9
+ import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
10
+ const snapshotTree = {
11
+ id: "SnapshotId",
12
+ blobs: {},
13
+ trees: {
14
+ ".protocol": {
15
+ blobs: {
16
+ attributes: "bARADgIe4qmDjJl2l2zz12IM3",
17
+ quorumMembers: "bARBkx1nses1pHL1vKnmFUfIC",
18
+ quorumProposals: "bARBkx1nses1pHL1vKnmFUfIC",
19
+ },
20
+ trees: {},
21
+ },
22
+ ".app": {
23
+ blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
24
+ trees: {
25
+ ".channels": {
26
+ blobs: {},
27
+ trees: {
28
+ default: {
29
+ blobs: {
30
+ ".component": "bARC6dCXlcrPxQHw3PeROtmKc",
31
+ "gc": "bARDNMoBed+nKrsf04id52iUA",
32
+ },
33
+ trees: {
34
+ ".channels": {
35
+ blobs: {},
36
+ trees: {
37
+ root: { blobs: {}, trees: {} },
38
+ },
39
+ },
40
+ },
41
+ },
42
+ },
43
+ unreferenced: true,
44
+ },
45
+ ".blobs": { blobs: {}, trees: {} },
46
+ },
47
+ unreferenced: true,
48
+ },
49
+ },
50
+ };
51
+ const blobContents = new Map([
52
+ [
53
+ "bARADgIe4qmDjJl2l2zz12IM3",
54
+ stringToBuffer(JSON.stringify({ branch: "", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }), "utf8"),
55
+ ],
56
+ ["bARBkx1nses1pHL1vKnmFUfIC", stringToBuffer(JSON.stringify([]), "utf8")],
57
+ [
58
+ "bARD4RKvW4LL1KmaUKp6hUMSp",
59
+ stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
60
+ ],
61
+ [
62
+ "bARC6dCXlcrPxQHw3PeROtmKc",
63
+ stringToBuffer(JSON.stringify({
64
+ pkg: '["@fluid-example/smde"]',
65
+ summaryFormatVersion: 2,
66
+ isRootDataStore: true,
67
+ }), "utf8"),
68
+ ],
69
+ [
70
+ "bARDNMoBed+nKrsf04id52iUA",
71
+ stringToBuffer(JSON.stringify({
72
+ usedRoutes: [""],
73
+ gcData: {
74
+ gcNodes: {
75
+ "/root": ["/default/01b197a2-0432-413b-b2c9-83a992b804c4", "/default"],
76
+ "/01b197a2-0432-413b-b2c9-83a992b804c4": ["/default"],
77
+ "/": ["/default/root", "/default/01b197a2-0432-413b-b2c9-83a992b804c4"],
78
+ },
79
+ },
80
+ }), "utf8"),
81
+ ],
82
+ ]);
83
+ const ops = [
84
+ {
85
+ clientId: "X",
86
+ clientSequenceNumber: -1,
87
+ contents: null,
88
+ minimumSequenceNumber: 0,
89
+ referenceSequenceNumber: -1,
90
+ sequenceNumber: 1,
91
+ timestamp: 1623883807452,
92
+ type: "join",
93
+ },
94
+ {
95
+ clientId: "Y",
96
+ clientSequenceNumber: -1,
97
+ contents: null,
98
+ minimumSequenceNumber: 0,
99
+ referenceSequenceNumber: -1,
100
+ sequenceNumber: 2,
101
+ timestamp: 1623883811928,
102
+ type: "join",
103
+ },
104
+ ];
105
+ const snapshotTreeWithGroupId = {
106
+ id: "SnapshotId",
107
+ blobs: {},
108
+ trees: {
109
+ ".protocol": {
110
+ blobs: {},
111
+ trees: {},
112
+ },
113
+ ".app": {
114
+ blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
115
+ trees: {
116
+ ".channels": {
117
+ blobs: {},
118
+ trees: {
119
+ default: {
120
+ blobs: {},
121
+ trees: {
122
+ dds: {
123
+ blobs: {},
124
+ trees: {},
125
+ },
126
+ },
127
+ groupId: "G3",
128
+ },
129
+ },
130
+ unreferenced: true,
131
+ groupId: "G2",
132
+ omitted: false,
133
+ },
134
+ ".blobs": { blobs: {}, trees: {} },
135
+ },
136
+ unreferenced: true,
137
+ groupId: "G4",
138
+ },
139
+ },
140
+ };
141
+ const blobContents2 = new Map([
142
+ [
143
+ "bARD4RKvW4LL1KmaUKp6hUMSp",
144
+ stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
145
+ ],
146
+ ]);
147
+ describe("Snapshot Format Conversion Tests", () => {
148
+ it("Conversion test", async () => {
149
+ const snapshotContents = {
150
+ snapshotTree,
151
+ blobContents,
152
+ ops,
153
+ sequenceNumber: 0,
154
+ latestSequenceNumber: 2,
155
+ snapshotFormatV: 1,
156
+ };
157
+ const logger = new MockLogger();
158
+ const compactSnapshot = convertToCompactSnapshot(snapshotContents);
159
+ const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
160
+ assert.deepStrictEqual(result.snapshotTree, snapshotTree, "Tree structure should match");
161
+ assert.deepStrictEqual(result.blobContents, blobContents, "Blobs content should match");
162
+ assert.deepStrictEqual(result.ops, ops, "Ops should match");
163
+ assert(result.sequenceNumber === 0, "Seq number should match");
164
+ assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
165
+ assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
166
+ // Convert to compact snapshot again and then match to previous one.
167
+ const compactSnapshot2 = convertToCompactSnapshot(result);
168
+ assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
169
+ logger.assertMatchNone([{ category: "error" }]);
170
+ });
171
+ it("Conversion test with empty ops", async () => {
172
+ const snapshotContents = {
173
+ snapshotTree,
174
+ blobContents,
175
+ ops: [],
176
+ sequenceNumber: 0,
177
+ latestSequenceNumber: 2,
178
+ snapshotFormatV: 1,
179
+ };
180
+ const logger = new MockLogger();
181
+ const compactSnapshot = convertToCompactSnapshot(snapshotContents);
182
+ const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
183
+ assert.deepStrictEqual(result.snapshotTree, snapshotTree, "Tree structure should match");
184
+ assert.deepStrictEqual(result.blobContents, blobContents, "Blobs content should match");
185
+ assert.deepStrictEqual(result.ops, [], "Ops should match");
186
+ assert(result.sequenceNumber === 0, "Seq number should match");
187
+ assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
188
+ assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
189
+ // Convert to compact snapshot again and then match to previous one.
190
+ const compactSnapshot2 = convertToCompactSnapshot(result);
191
+ assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
192
+ logger.assertMatchNone([{ category: "error" }]);
193
+ });
194
+ it("Conversion test for snapshot with GroupId", async () => {
195
+ const snapshotContents = {
196
+ snapshotTree: snapshotTreeWithGroupId,
197
+ blobContents: blobContents2,
198
+ ops,
199
+ sequenceNumber: 0,
200
+ latestSequenceNumber: 2,
201
+ snapshotFormatV: 1,
202
+ };
203
+ const logger = new MockLogger();
204
+ const compactSnapshot = convertToCompactSnapshot(snapshotContents);
205
+ const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
206
+ assert.deepStrictEqual(result.snapshotTree, snapshotTreeWithGroupId, "Tree structure should match");
207
+ assert.deepStrictEqual(result.blobContents, blobContents2, "Blobs content should match");
208
+ assert.deepStrictEqual(result.ops, ops, "Ops should match");
209
+ assert(result.sequenceNumber === 0, "Seq number should match");
210
+ assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
211
+ assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
212
+ // Convert to compact snapshot again and then match to previous one.
213
+ const compactSnapshot2 = convertToCompactSnapshot(result);
214
+ assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
215
+ logger.assertMatchNone([{ category: "error" }]);
216
+ });
217
+ });
218
+ //# sourceMappingURL=snapshotFormatTests.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotFormatTests.spec.js","sourceRoot":"","sources":["../../src/test/snapshotFormatTests.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,YAAY,GAAkB;IACnC,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE;QACN,WAAW,EAAE;YACZ,KAAK,EAAE;gBACN,UAAU,EAAE,2BAA2B;gBACvC,aAAa,EAAE,2BAA2B;gBAC1C,eAAe,EAAE,2BAA2B;aAC5C;YACD,KAAK,EAAE,EAAE;SACT;QACD,MAAM,EAAE;YACP,KAAK,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACnD,KAAK,EAAE;gBACN,WAAW,EAAE;oBACZ,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE;wBACN,OAAO,EAAE;4BACR,KAAK,EAAE;gCACN,YAAY,EAAE,2BAA2B;gCACzC,IAAI,EAAE,2BAA2B;6BACjC;4BACD,KAAK,EAAE;gCACN,WAAW,EAAE;oCACZ,KAAK,EAAE,EAAE;oCACT,KAAK,EAAE;wCACN,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;qCAC9B;iCACD;6BACD;yBACD;qBACD;oBACD,YAAY,EAAE,IAAI;iBAClB;gBACD,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAClC;YACD,YAAY,EAAE,IAAI;SAClB;KACD;CACD,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAsB;IACjD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EACpF,MAAM,CACN;KACD;IACD,CAAC,2BAA2B,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE;QACC,2BAA2B;QAC3B,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;KACjF;IACD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC;YACd,GAAG,EAAE,yBAAyB;YAC9B,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,IAAI;SACrB,CAAC,EACF,MAAM,CACN;KACD;IACD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC;YACd,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,EAAE;gBACP,OAAO,EAAE;oBACR,OAAO,EAAE,CAAC,+CAA+C,EAAE,UAAU,CAAC;oBACtE,uCAAuC,EAAE,CAAC,UAAU,CAAC;oBACrD,GAAG,EAAE,CAAC,eAAe,EAAE,+CAA+C,CAAC;iBACvE;aACD;SACD,CAAC,EACF,MAAM,CACN;KACD;CACD,CAAC,CAAC;AAEH,MAAM,GAAG,GAAgC;IACxC;QACC,QAAQ,EAAE,GAAG;QACb,oBAAoB,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,IAAI;QACd,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,aAAa;QACxB,IAAI,EAAE,MAAM;KACZ;IACD;QACC,QAAQ,EAAE,GAAG;QACb,oBAAoB,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,IAAI;QACd,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,aAAa;QACxB,IAAI,EAAE,MAAM;KACZ;CACD,CAAC;AAEF,MAAM,uBAAuB,GAAkB;IAC9C,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE;QACN,WAAW,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACT;QACD,MAAM,EAAE;YACP,KAAK,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACnD,KAAK,EAAE;gBACN,WAAW,EAAE;oBACZ,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE;wBACN,OAAO,EAAE;4BACR,KAAK,EAAE,EAAE;4BACT,KAAK,EAAE;gCACN,GAAG,EAAE;oCACJ,KAAK,EAAE,EAAE;oCACT,KAAK,EAAE,EAAE;iCACT;6BACD;4BACD,OAAO,EAAE,IAAI;yBACb;qBACD;oBACD,YAAY,EAAE,IAAI;oBAClB,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,KAAK;iBACd;gBACD,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAClC;YACD,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;SACb;KACD;CACD,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAsB;IAClD;QACC,2BAA2B;QAC3B,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;KACjF;CACD,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,gBAAgB,GAAc;YACnC,YAAY;YACZ,YAAY;YACZ,GAAG;YACH,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC;QACxF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,gBAAgB,GAAc;YACnC,YAAY;YACZ,YAAY;YACZ,GAAG,EAAE,EAAE;YACP,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC;QACxF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,gBAAgB,GAAc;YACnC,YAAY,EAAE,uBAAuB;YACrC,YAAY,EAAE,aAAa;YAC3B,GAAG;YACH,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CACrB,MAAM,CAAC,YAAY,EACnB,uBAAuB,EACvB,6BAA6B,CAC7B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,4BAA4B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,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 { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { parseCompactSnapshotResponse } from \"../compactSnapshotParser.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\n\nconst snapshotTree: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {\n\t\t\t\tattributes: \"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\t\t\tquorumMembers: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t\tquorumProposals: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t\t\t\"gc\": \"bARDNMoBed+nKrsf04id52iUA\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t},\n\t},\n};\n\nconst blobContents = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({ branch: \"\", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\"bARBkx1nses1pHL1vKnmFUfIC\", stringToBuffer(JSON.stringify([]), \"utf8\")],\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n\t[\n\t\t\"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tpkg: '[\"@fluid-example/smde\"]',\n\t\t\t\tsummaryFormatVersion: 2,\n\t\t\t\tisRootDataStore: true,\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\n\t\t\"bARDNMoBed+nKrsf04id52iUA\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tusedRoutes: [\"\"],\n\t\t\t\tgcData: {\n\t\t\t\t\tgcNodes: {\n\t\t\t\t\t\t\"/root\": [\"/default/01b197a2-0432-413b-b2c9-83a992b804c4\", \"/default\"],\n\t\t\t\t\t\t\"/01b197a2-0432-413b-b2c9-83a992b804c4\": [\"/default\"],\n\t\t\t\t\t\t\"/\": [\"/default/root\", \"/default/01b197a2-0432-413b-b2c9-83a992b804c4\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n]);\n\nconst ops: ISequencedDocumentMessage[] = [\n\t{\n\t\tclientId: \"X\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 1,\n\t\ttimestamp: 1623883807452,\n\t\ttype: \"join\",\n\t},\n\t{\n\t\tclientId: \"Y\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 2,\n\t\ttimestamp: 1623883811928,\n\t\ttype: \"join\",\n\t},\n];\n\nconst snapshotTreeWithGroupId: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\tomitted: false,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t\tgroupId: \"G4\",\n\t\t},\n\t},\n};\n\nconst blobContents2 = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n]);\n\ndescribe(\"Snapshot Format Conversion Tests\", () => {\n\tit(\"Conversion test\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test with empty ops\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops: [],\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, [], \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test for snapshot with GroupId\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tblobContents: blobContents2,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(\n\t\t\tresult.snapshotTree,\n\t\t\tsnapshotTreeWithGroupId,\n\t\t\t\"Tree structure should match\",\n\t\t);\n\t\tassert.deepStrictEqual(result.blobContents, blobContents2, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n"]}
@@ -0,0 +1,152 @@
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 { stub, useFakeTimers } from "sinon";
7
+ import { MockLogger } from "@fluidframework/telemetry-utils";
8
+ import { EpochTracker } from "../../epochTracker.js";
9
+ import { LocalPersistentCache } from "../../odspCache.js";
10
+ import { getHashedDocumentId } from "../../odspPublicUtils.js";
11
+ import * as socketModule from "../../socketModule.js";
12
+ import * as joinSession from "../../vroom.js";
13
+ import { OdspDocumentServiceFactory } from "../../odspDocumentServiceFactory.js";
14
+ import { createOdspUrl } from "../../createOdspUrl.js";
15
+ import { OdspDriverUrlResolver } from "../../odspDriverUrlResolver.js";
16
+ import { ClientSocketMock } from "./socketMock.js";
17
+ describe("DeltaConnectionMetadata update tests", () => {
18
+ let clock;
19
+ const client = {
20
+ mode: "write",
21
+ scopes: ["doc:read", "doc:write"],
22
+ details: { capabilities: { interactive: true } },
23
+ permission: [],
24
+ user: { id: "userId" },
25
+ };
26
+ let logger;
27
+ const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
28
+ const driveId = "driveId";
29
+ const itemId = "itemId";
30
+ let epochTracker;
31
+ let localCache;
32
+ let hashedDocumentId;
33
+ let service;
34
+ let socket;
35
+ const resolver = new OdspDriverUrlResolver();
36
+ const joinSessionResponse = {
37
+ deltaStorageUrl: "https://fake/deltaStorageUrl",
38
+ deltaStreamSocketUrl: "https://localhost:3001",
39
+ id: "id",
40
+ tenantId: "tenantId",
41
+ snapshotStorageUrl: "https://fake/snapshotStorageUrl",
42
+ refreshSessionDurationSeconds: 100,
43
+ };
44
+ let odspDocumentServiceFactory;
45
+ // Stash the real setTimeout because sinon fake timers will hijack it.
46
+ const realSetTimeout = setTimeout;
47
+ // function to yield control in the Javascript event loop.
48
+ async function yieldEventLoop() {
49
+ await new Promise((resolve) => {
50
+ realSetTimeout(resolve, 0);
51
+ });
52
+ }
53
+ async function tickClock(tickValue) {
54
+ clock.tick(tickValue);
55
+ // Yield the event loop because the outbound op will be processed asynchronously.
56
+ await yieldEventLoop();
57
+ }
58
+ function addJoinSessionStub(label) {
59
+ joinSessionResponse.sensitivityLabelsInfo = JSON.stringify({
60
+ labels: label,
61
+ timestamp: Date.now(),
62
+ });
63
+ const joinSessionStub = stub(joinSession, "fetchJoinSession").callsFake(async () => joinSessionResponse);
64
+ return joinSessionStub;
65
+ }
66
+ before(async () => {
67
+ hashedDocumentId = await getHashedDocumentId(driveId, itemId);
68
+ });
69
+ beforeEach(async () => {
70
+ clock = useFakeTimers();
71
+ odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", new LocalPersistentCache(2000), { snapshotOptions: { timeout: 2000 } });
72
+ const locator = { driveId, itemId, siteUrl, dataStorePath: "/" };
73
+ const request = createOdspUrl(locator);
74
+ const resolvedUrl = await resolver.resolve({ url: request });
75
+ logger = new MockLogger().toTelemetryLogger();
76
+ epochTracker = new EpochTracker(localCache, {
77
+ docId: hashedDocumentId,
78
+ resolvedUrl,
79
+ }, logger);
80
+ service = (await odspDocumentServiceFactory.createDocumentService(resolvedUrl, logger));
81
+ });
82
+ async function mockSocket(_response, callback) {
83
+ const getSocketCreationStub = stub(socketModule, "SocketIOClientStatic");
84
+ getSocketCreationStub.returns(_response);
85
+ try {
86
+ return await callback();
87
+ }
88
+ finally {
89
+ getSocketCreationStub.restore();
90
+ }
91
+ }
92
+ it("Delta connection metadata should be updated via Fluid signals and join session response", async () => {
93
+ await tickClock(1);
94
+ socket = new ClientSocketMock();
95
+ let eventRaised = false;
96
+ let content;
97
+ const handler = (metadata) => {
98
+ eventRaised = true;
99
+ assert.strictEqual(
100
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
101
+ JSON.parse(metadata.sensitivityLabelsInfo).labels, content.labels, "label via event should match");
102
+ };
103
+ let joinSessionStub = addJoinSessionStub("label1");
104
+ content = { labels: "label1" };
105
+ service.on("metadataUpdate", handler);
106
+ const connection = (await mockSocket(socket, async () => service.connectToDeltaStream(client)));
107
+ assert(eventRaised, "event1 should have been raised");
108
+ service.off("metadataUpdate", handler);
109
+ joinSessionStub.restore();
110
+ assert(!connection.disposed, "connection should not be disposed");
111
+ assert(joinSessionStub.calledOnce, "Should called once on first try");
112
+ await tickClock(1);
113
+ // Now change label through signal and listen as event on service.
114
+ // eslint-disable-next-line require-atomic-updates
115
+ eventRaised = false;
116
+ content = { labels: "label2" };
117
+ const signalContent1 = { labels: "label2", timestamp: Date.now() };
118
+ const signalMessage1 = {
119
+ clientId: null,
120
+ content: JSON.stringify({
121
+ contents: {
122
+ type: "PolicyLabelsUpdate",
123
+ content: signalContent1,
124
+ },
125
+ }),
126
+ };
127
+ service.on("metadataUpdate", handler);
128
+ socket.emit("signal", signalMessage1);
129
+ assert(eventRaised, "event2 should have been raised");
130
+ service.off("metadataUpdate", handler);
131
+ await tickClock(1);
132
+ // Now update through join session response
133
+ // eslint-disable-next-line require-atomic-updates
134
+ eventRaised = false;
135
+ content = { labels: "label3" };
136
+ service.on("metadataUpdate", handler);
137
+ joinSessionStub = addJoinSessionStub("label3");
138
+ await tickClock(70000);
139
+ joinSessionStub.restore();
140
+ assert(eventRaised, "event3 should have been raised");
141
+ service.off("metadataUpdate", handler);
142
+ });
143
+ afterEach(async () => {
144
+ clock.reset();
145
+ socket?.close();
146
+ await epochTracker.removeEntries().catch(() => { });
147
+ });
148
+ afterEach(async () => {
149
+ clock.restore();
150
+ });
151
+ });
152
+ //# sourceMappingURL=deltaConnectionUpdateTests.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaConnectionUpdateTests.spec.js","sourceRoot":"","sources":["../../../src/test/socketTests/deltaConnectionUpdateTests.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 { stub, useFakeTimers, SinonFakeTimers, type SinonStub } from \"sinon\";\nimport { ISocketStorageDiscovery } from \"@fluidframework/odsp-driver-definitions\";\nimport { IClient, ISignalMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { Socket } from \"socket.io-client\";\nimport { EpochTracker } from \"../../epochTracker.js\";\nimport { LocalPersistentCache } from \"../../odspCache.js\";\nimport { getHashedDocumentId } from \"../../odspPublicUtils.js\";\nimport { OdspDocumentDeltaConnection } from \"../../odspDocumentDeltaConnection.js\";\nimport * as socketModule from \"../../socketModule.js\";\nimport * as joinSession from \"../../vroom.js\";\nimport { OdspDocumentService } from \"../../odspDocumentService.js\";\nimport { OdspDocumentServiceFactory } from \"../../odspDocumentServiceFactory.js\";\nimport { OdspFluidDataStoreLocator } from \"../../contractsPublic.js\";\nimport { createOdspUrl } from \"../../createOdspUrl.js\";\nimport { OdspDriverUrlResolver } from \"../../odspDriverUrlResolver.js\";\nimport { ClientSocketMock } from \"./socketMock.js\";\n\ndescribe(\"DeltaConnectionMetadata update tests\", () => {\n\tlet clock: SinonFakeTimers;\n\tconst client: IClient = {\n\t\tmode: \"write\",\n\t\tscopes: [\"doc:read\", \"doc:write\"],\n\t\tdetails: { capabilities: { interactive: true } },\n\t\tpermission: [],\n\t\tuser: { id: \"userId\" },\n\t};\n\n\tlet logger: ITelemetryLoggerExt;\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tlet epochTracker: EpochTracker;\n\tlet localCache: LocalPersistentCache;\n\tlet hashedDocumentId: string;\n\tlet service: OdspDocumentService;\n\tlet socket: ClientSocketMock | undefined;\n\tconst resolver = new OdspDriverUrlResolver();\n\tconst joinSessionResponse: ISocketStorageDiscovery = {\n\t\tdeltaStorageUrl: \"https://fake/deltaStorageUrl\",\n\t\tdeltaStreamSocketUrl: \"https://localhost:3001\",\n\t\tid: \"id\",\n\t\ttenantId: \"tenantId\",\n\t\tsnapshotStorageUrl: \"https://fake/snapshotStorageUrl\",\n\t\trefreshSessionDurationSeconds: 100,\n\t};\n\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\n\t// Stash the real setTimeout because sinon fake timers will hijack it.\n\tconst realSetTimeout = setTimeout;\n\n\t// function to yield control in the Javascript event loop.\n\tasync function yieldEventLoop(): Promise<void> {\n\t\tawait new Promise<void>((resolve) => {\n\t\t\trealSetTimeout(resolve, 0);\n\t\t});\n\t}\n\n\tasync function tickClock(tickValue: number): Promise<void> {\n\t\tclock.tick(tickValue);\n\n\t\t// Yield the event loop because the outbound op will be processed asynchronously.\n\t\tawait yieldEventLoop();\n\t}\n\n\tfunction addJoinSessionStub(label: string): SinonStub {\n\t\tjoinSessionResponse.sensitivityLabelsInfo = JSON.stringify({\n\t\t\tlabels: label,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\tconst joinSessionStub = stub(joinSession, \"fetchJoinSession\").callsFake(\n\t\t\tasync () => joinSessionResponse,\n\t\t);\n\t\treturn joinSessionStub;\n\t}\n\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t});\n\n\tbeforeEach(async () => {\n\t\tclock = useFakeTimers();\n\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (_options) => \"token\",\n\t\t\tasync (_options) => \"token\",\n\t\t\tnew LocalPersistentCache(2000),\n\t\t\t{ snapshotOptions: { timeout: 2000 } },\n\t\t);\n\t\tconst locator: OdspFluidDataStoreLocator = { driveId, itemId, siteUrl, dataStorePath: \"/\" };\n\t\tconst request = createOdspUrl(locator);\n\t\tconst resolvedUrl = await resolver.resolve({ url: request });\n\t\tlogger = new MockLogger().toTelemetryLogger();\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\tlogger,\n\t\t);\n\n\t\tservice = (await odspDocumentServiceFactory.createDocumentService(\n\t\t\tresolvedUrl,\n\t\t\tlogger,\n\t\t)) as OdspDocumentService;\n\t});\n\n\tasync function mockSocket<T>(_response: Socket, callback: () => Promise<T>): Promise<T> {\n\t\tconst getSocketCreationStub = stub(socketModule, \"SocketIOClientStatic\");\n\t\tgetSocketCreationStub.returns(_response);\n\t\ttry {\n\t\t\treturn await callback();\n\t\t} finally {\n\t\t\tgetSocketCreationStub.restore();\n\t\t}\n\t}\n\n\tit(\"Delta connection metadata should be updated via Fluid signals and join session response\", async () => {\n\t\tawait tickClock(1);\n\t\tsocket = new ClientSocketMock();\n\t\tlet eventRaised = false;\n\t\tlet content: Record<string, string>;\n\n\t\tconst handler = (metadata: Record<string, string>): void => {\n\t\t\teventRaised = true;\n\t\t\tassert.strictEqual(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tJSON.parse(metadata.sensitivityLabelsInfo).labels,\n\t\t\t\tcontent.labels,\n\t\t\t\t\"label via event should match\",\n\t\t\t);\n\t\t};\n\n\t\tlet joinSessionStub = addJoinSessionStub(\"label1\");\n\n\t\tcontent = { labels: \"label1\" };\n\t\tservice.on(\"metadataUpdate\", handler);\n\t\tconst connection = (await mockSocket(socket as unknown as Socket, async () =>\n\t\t\tservice.connectToDeltaStream(client),\n\t\t)) as OdspDocumentDeltaConnection;\n\t\tassert(eventRaised, \"event1 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\t\tjoinSessionStub.restore();\n\n\t\tassert(!connection.disposed, \"connection should not be disposed\");\n\n\t\tassert(joinSessionStub.calledOnce, \"Should called once on first try\");\n\n\t\tawait tickClock(1);\n\n\t\t// Now change label through signal and listen as event on service.\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\teventRaised = false;\n\t\tcontent = { labels: \"label2\" };\n\t\tconst signalContent1 = { labels: \"label2\", timestamp: Date.now() };\n\t\tconst signalMessage1: ISignalMessage = {\n\t\t\tclientId: null,\n\t\t\tcontent: JSON.stringify({\n\t\t\t\tcontents: {\n\t\t\t\t\ttype: \"PolicyLabelsUpdate\",\n\t\t\t\t\tcontent: signalContent1,\n\t\t\t\t},\n\t\t\t}),\n\t\t};\n\n\t\tservice.on(\"metadataUpdate\", handler);\n\n\t\tsocket.emit(\"signal\", signalMessage1);\n\t\tassert(eventRaised, \"event2 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\n\t\tawait tickClock(1);\n\n\t\t// Now update through join session response\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\teventRaised = false;\n\t\tcontent = { labels: \"label3\" };\n\t\tservice.on(\"metadataUpdate\", handler);\n\t\tjoinSessionStub = addJoinSessionStub(\"label3\");\n\t\tawait tickClock(70000);\n\t\tjoinSessionStub.restore();\n\t\tassert(eventRaised, \"event3 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\t});\n\n\tafterEach(async () => {\n\t\tclock.reset();\n\t\tsocket?.close();\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tafterEach(async () => {\n\t\tclock.restore();\n\t});\n});\n"]}
@@ -0,0 +1,109 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { v4 as uuid } from "uuid";
6
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ import { createGenericNetworkError } from "@fluidframework/driver-utils";
8
+ import { ScopeType } from "@fluidframework/protocol-definitions";
9
+ import { pkgVersion as driverVersion } from "../../packageVersion.js";
10
+ /**
11
+ * Class to mock the client socket connection. It can intercepts the events made on the socket
12
+ * and then do its custom logic and can also send events to the client back.
13
+ */
14
+ export class ClientSocketMock extends TypedEventEmitter {
15
+ constructor(mockSocketConnectResponse = {
16
+ connect_document: { eventToEmit: "connect_document_success" },
17
+ }) {
18
+ super();
19
+ this.mockSocketConnectResponse = mockSocketConnectResponse;
20
+ this.disconnected = false;
21
+ }
22
+ get connected() {
23
+ return !this.disconnected;
24
+ }
25
+ close() {
26
+ this.disconnect();
27
+ }
28
+ disconnect() {
29
+ this.disconnected = true;
30
+ }
31
+ get io() {
32
+ return {
33
+ reconnection: () => false,
34
+ reconnectionAttempts: () => 0,
35
+ };
36
+ }
37
+ sendDisconnectEvent(reason, details) {
38
+ const error = reason ??
39
+ createGenericNetworkError("TestError", { canRetry: false }, { driverVersion });
40
+ this.emit("disconnect", error, details);
41
+ }
42
+ sendErrorEvent(error) {
43
+ this.emit("error", error ?? createGenericNetworkError("TestError", { canRetry: false }, { driverVersion }));
44
+ }
45
+ sendServerDisconnectEvent(socketError, clientId) {
46
+ if (clientId === undefined) {
47
+ this.disconnect();
48
+ }
49
+ this.emit("server_disconnect", socketError, clientId);
50
+ }
51
+ emit(eventName, ...args) {
52
+ switch (eventName) {
53
+ case "connect_document": {
54
+ const connectMessage = args[0];
55
+ switch (this.mockSocketConnectResponse.connect_document.eventToEmit) {
56
+ case "connect_document_error":
57
+ case "connect_error": {
58
+ const errorToThrow = this.mockSocketConnectResponse.connect_document.errorToThrow ??
59
+ createGenericNetworkError("TestError", { canRetry: false }, { driverVersion });
60
+ this.emit(this.mockSocketConnectResponse.connect_document.eventToEmit, errorToThrow);
61
+ break;
62
+ }
63
+ case "connect_document_success": {
64
+ const iConnected = this.mockSocketConnectResponse
65
+ .connect_document.connectMessage ?? {
66
+ clientId: uuid(),
67
+ existing: true,
68
+ initialClients: [],
69
+ initialMessages: [],
70
+ initialSignals: [],
71
+ maxMessageSize: 1000,
72
+ mode: connectMessage.mode,
73
+ version: connectMessage.versions[0],
74
+ serviceConfiguration: { maxMessageSize: 1000, blockSize: 1000 },
75
+ claims: {
76
+ documentId: connectMessage.id,
77
+ scopes: [
78
+ ScopeType.DocWrite,
79
+ ScopeType.DocRead,
80
+ ScopeType.SummaryWrite,
81
+ ],
82
+ tenantId: connectMessage.tenantId,
83
+ ver: "1.0.0",
84
+ iat: 10,
85
+ exp: 10,
86
+ user: connectMessage.client.user,
87
+ },
88
+ supportedVersions: connectMessage.versions,
89
+ epoch: "testEpoch",
90
+ };
91
+ this.emit("connect_document_success", iConnected);
92
+ break;
93
+ }
94
+ case "connect_timeout": {
95
+ this.emit("connect_timeout");
96
+ break;
97
+ }
98
+ default: // No-op
99
+ }
100
+ return true;
101
+ }
102
+ default: {
103
+ super.emit(eventName, ...args);
104
+ return true;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=socketMock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socketMock.js","sourceRoot":"","sources":["../../../src/test/socketTests/socketMock.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 { v4 as uuid } from \"uuid\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IEvent } from \"@fluidframework/core-interfaces\";\nimport { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport { createGenericNetworkError } from \"@fluidframework/driver-utils\";\nimport { IConnect, IConnected, ScopeType } from \"@fluidframework/protocol-definitions\";\nimport { pkgVersion as driverVersion } from \"../../packageVersion.js\";\nimport { IOdspSocketError } from \"../../contracts.js\";\n\nexport interface SocketMockEvents extends IEvent {\n\t(event: \"disconnect\", listener: (reason?: IAnyDriverError, details?: unknown) => void): void;\n\t(event: \"error\", listener: (error?: IAnyDriverError) => void): void;\n\t(\n\t\tevent: \"server_disconnect\",\n\t\tlistener: (socketError: IOdspSocketError, clientId?: string) => void,\n\t): void;\n}\n\nexport interface IMockSocketConnectResponse {\n\tconnect_document:\n\t\t| {\n\t\t\t\teventToEmit: \"connect_document_success\";\n\t\t\t\tconnectMessage?: IConnected;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_document_error\";\n\t\t\t\terrorToThrow?: IAnyDriverError;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_error\";\n\t\t\t\terrorToThrow?: IAnyDriverError;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_timeout\";\n\t\t };\n}\n\n/**\n * Class to mock the client socket connection. It can intercepts the events made on the socket\n * and then do its custom logic and can also send events to the client back.\n */\nexport class ClientSocketMock extends TypedEventEmitter<SocketMockEvents> {\n\tpublic disconnected = false;\n\tconstructor(\n\t\tprivate readonly mockSocketConnectResponse: IMockSocketConnectResponse = {\n\t\t\tconnect_document: { eventToEmit: \"connect_document_success\" },\n\t\t},\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn !this.disconnected;\n\t}\n\n\tpublic close(): void {\n\t\tthis.disconnect();\n\t}\n\n\tpublic disconnect(): void {\n\t\tthis.disconnected = true;\n\t}\n\n\tpublic get io(): {\n\t\treconnection: () => boolean;\n\t\treconnectionAttempts: () => number;\n\t} {\n\t\treturn {\n\t\t\treconnection: () => false,\n\t\t\treconnectionAttempts: () => 0,\n\t\t};\n\t}\n\n\tpublic sendDisconnectEvent(\n\t\treason?: IAnyDriverError,\n\t\tdetails?: { context: { type?: string; code?: number } },\n\t): void {\n\t\tconst error =\n\t\t\treason ??\n\t\t\tcreateGenericNetworkError(\"TestError\", { canRetry: false }, { driverVersion });\n\t\tthis.emit(\"disconnect\", error, details);\n\t}\n\n\tpublic sendErrorEvent(error?: IAnyDriverError): void {\n\t\tthis.emit(\n\t\t\t\"error\",\n\t\t\terror ?? createGenericNetworkError(\"TestError\", { canRetry: false }, { driverVersion }),\n\t\t);\n\t}\n\n\tpublic sendServerDisconnectEvent(socketError: IOdspSocketError, clientId?: string): void {\n\t\tif (clientId === undefined) {\n\t\t\tthis.disconnect();\n\t\t}\n\t\tthis.emit(\"server_disconnect\", socketError, clientId);\n\t}\n\n\tpublic emit(eventName: string, ...args: unknown[]): boolean {\n\t\tswitch (eventName) {\n\t\t\tcase \"connect_document\": {\n\t\t\t\tconst connectMessage = args[0] as IConnect;\n\t\t\t\tswitch (this.mockSocketConnectResponse.connect_document.eventToEmit) {\n\t\t\t\t\tcase \"connect_document_error\":\n\t\t\t\t\tcase \"connect_error\": {\n\t\t\t\t\t\tconst errorToThrow =\n\t\t\t\t\t\t\tthis.mockSocketConnectResponse.connect_document.errorToThrow ??\n\t\t\t\t\t\t\tcreateGenericNetworkError(\n\t\t\t\t\t\t\t\t\"TestError\",\n\t\t\t\t\t\t\t\t{ canRetry: false },\n\t\t\t\t\t\t\t\t{ driverVersion },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\tthis.mockSocketConnectResponse.connect_document.eventToEmit,\n\t\t\t\t\t\t\terrorToThrow,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"connect_document_success\": {\n\t\t\t\t\t\tconst iConnected: IConnected = this.mockSocketConnectResponse\n\t\t\t\t\t\t\t.connect_document.connectMessage ?? {\n\t\t\t\t\t\t\tclientId: uuid(),\n\t\t\t\t\t\t\texisting: true,\n\t\t\t\t\t\t\tinitialClients: [],\n\t\t\t\t\t\t\tinitialMessages: [],\n\t\t\t\t\t\t\tinitialSignals: [],\n\t\t\t\t\t\t\tmaxMessageSize: 1000,\n\t\t\t\t\t\t\tmode: connectMessage.mode,\n\t\t\t\t\t\t\tversion: connectMessage.versions[0],\n\t\t\t\t\t\t\tserviceConfiguration: { maxMessageSize: 1000, blockSize: 1000 },\n\t\t\t\t\t\t\tclaims: {\n\t\t\t\t\t\t\t\tdocumentId: connectMessage.id,\n\t\t\t\t\t\t\t\tscopes: [\n\t\t\t\t\t\t\t\t\tScopeType.DocWrite,\n\t\t\t\t\t\t\t\t\tScopeType.DocRead,\n\t\t\t\t\t\t\t\t\tScopeType.SummaryWrite,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttenantId: connectMessage.tenantId,\n\t\t\t\t\t\t\t\tver: \"1.0.0\",\n\t\t\t\t\t\t\t\tiat: 10,\n\t\t\t\t\t\t\t\texp: 10,\n\t\t\t\t\t\t\t\tuser: connectMessage.client.user,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsupportedVersions: connectMessage.versions,\n\t\t\t\t\t\t\tepoch: \"testEpoch\",\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.emit(\"connect_document_success\", iConnected);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"connect_timeout\": {\n\t\t\t\t\t\tthis.emit(\"connect_timeout\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: // No-op\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsuper.emit(eventName, ...args);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}