@fluidframework/driver-utils 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (392) hide show
  1. package/.eslintrc.js +17 -7
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +141 -0
  4. package/README.md +68 -1
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/driver-utils.api.md +401 -0
  9. package/dist/adapters/compression/compressionTypes.cjs +20 -0
  10. package/dist/adapters/compression/compressionTypes.cjs.map +1 -0
  11. package/dist/adapters/compression/compressionTypes.d.ts +23 -0
  12. package/dist/adapters/compression/compressionTypes.d.ts.map +1 -0
  13. package/dist/adapters/compression/documentServiceCompressionAdapter.cjs +23 -0
  14. package/dist/adapters/compression/documentServiceCompressionAdapter.cjs.map +1 -0
  15. package/dist/adapters/compression/documentServiceCompressionAdapter.d.ts +13 -0
  16. package/dist/adapters/compression/documentServiceCompressionAdapter.d.ts.map +1 -0
  17. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.cjs +31 -0
  18. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.cjs.map +1 -0
  19. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts +16 -0
  20. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts.map +1 -0
  21. package/dist/adapters/compression/index.cjs +15 -0
  22. package/dist/adapters/compression/index.cjs.map +1 -0
  23. package/dist/adapters/compression/index.d.ts +8 -0
  24. package/dist/adapters/compression/index.d.ts.map +1 -0
  25. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.cjs +370 -0
  26. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.cjs.map +1 -0
  27. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts +165 -0
  28. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -0
  29. package/dist/adapters/compression/summaryblob/index.cjs +11 -0
  30. package/dist/adapters/compression/summaryblob/index.cjs.map +1 -0
  31. package/dist/adapters/compression/summaryblob/index.d.ts +6 -0
  32. package/dist/adapters/compression/summaryblob/index.d.ts.map +1 -0
  33. package/dist/adapters/index.cjs +14 -0
  34. package/dist/adapters/index.cjs.map +1 -0
  35. package/dist/adapters/index.d.ts +7 -0
  36. package/dist/adapters/index.d.ts.map +1 -0
  37. package/dist/adapters/predefinedAdapters.cjs +52 -0
  38. package/dist/adapters/predefinedAdapters.cjs.map +1 -0
  39. package/dist/adapters/predefinedAdapters.d.ts +21 -0
  40. package/dist/adapters/predefinedAdapters.d.ts.map +1 -0
  41. package/dist/blob.cjs +65 -0
  42. package/dist/blob.cjs.map +1 -0
  43. package/dist/blob.d.ts +56 -0
  44. package/dist/blob.d.ts.map +1 -0
  45. package/dist/{buildSnapshotTree.js → buildSnapshotTree.cjs} +7 -5
  46. package/dist/buildSnapshotTree.cjs.map +1 -0
  47. package/dist/buildSnapshotTree.d.ts +1 -0
  48. package/dist/buildSnapshotTree.d.ts.map +1 -1
  49. package/dist/documentServiceFactoryProxy.cjs +27 -0
  50. package/dist/documentServiceFactoryProxy.cjs.map +1 -0
  51. package/dist/documentServiceFactoryProxy.d.ts +19 -0
  52. package/dist/documentServiceFactoryProxy.d.ts.map +1 -0
  53. package/dist/documentServiceProxy.cjs +36 -0
  54. package/dist/documentServiceProxy.cjs.map +1 -0
  55. package/dist/documentServiceProxy.d.ts +21 -0
  56. package/dist/documentServiceProxy.d.ts.map +1 -0
  57. package/dist/{documentStorageServiceProxy.js → documentStorageServiceProxy.cjs} +10 -8
  58. package/dist/documentStorageServiceProxy.cjs.map +1 -0
  59. package/dist/documentStorageServiceProxy.d.ts +5 -2
  60. package/dist/documentStorageServiceProxy.d.ts.map +1 -1
  61. package/dist/driver-utils-alpha.d.ts +163 -0
  62. package/dist/driver-utils-beta.d.ts +178 -0
  63. package/dist/driver-utils-public.d.ts +178 -0
  64. package/dist/driver-utils-untrimmed.d.ts +590 -0
  65. package/dist/{error.js → error.cjs} +10 -3
  66. package/dist/error.cjs.map +1 -0
  67. package/dist/error.d.ts +8 -3
  68. package/dist/error.d.ts.map +1 -1
  69. package/dist/index.cjs +69 -0
  70. package/dist/index.cjs.map +1 -0
  71. package/dist/index.d.ts +16 -21
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/{insecureUrlResolver.js → insecureUrlResolver.cjs} +10 -11
  74. package/dist/insecureUrlResolver.cjs.map +1 -0
  75. package/dist/insecureUrlResolver.d.ts +1 -0
  76. package/dist/insecureUrlResolver.d.ts.map +1 -1
  77. package/dist/messageRecognition.cjs +38 -0
  78. package/dist/messageRecognition.cjs.map +1 -0
  79. package/dist/messageRecognition.d.ts +16 -26
  80. package/dist/messageRecognition.d.ts.map +1 -1
  81. package/dist/{network.js → network.cjs} +86 -24
  82. package/dist/network.cjs.map +1 -0
  83. package/dist/network.d.ts +69 -20
  84. package/dist/network.d.ts.map +1 -1
  85. package/dist/networkUtils.cjs +29 -0
  86. package/dist/networkUtils.cjs.map +1 -0
  87. package/dist/networkUtils.d.ts +4 -10
  88. package/dist/networkUtils.d.ts.map +1 -1
  89. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  90. package/dist/packageVersion.cjs.map +1 -0
  91. package/dist/packageVersion.d.ts +1 -1
  92. package/dist/packageVersion.d.ts.map +1 -1
  93. package/dist/{parallelRequests.js → parallelRequests.cjs} +146 -74
  94. package/dist/parallelRequests.cjs.map +1 -0
  95. package/dist/parallelRequests.d.ts +19 -6
  96. package/dist/parallelRequests.d.ts.map +1 -1
  97. package/dist/{prefetchDocumentStorageService.js → prefetchDocumentStorageService.cjs} +7 -4
  98. package/dist/prefetchDocumentStorageService.cjs.map +1 -0
  99. package/dist/prefetchDocumentStorageService.d.ts +4 -2
  100. package/dist/prefetchDocumentStorageService.d.ts.map +1 -1
  101. package/dist/{rateLimiter.js → rateLimiter.cjs} +6 -3
  102. package/dist/rateLimiter.cjs.map +1 -0
  103. package/dist/rateLimiter.d.ts +3 -0
  104. package/dist/rateLimiter.d.ts.map +1 -1
  105. package/dist/readAndParse.cjs +28 -0
  106. package/dist/readAndParse.cjs.map +1 -0
  107. package/dist/readAndParse.d.ts +10 -4
  108. package/dist/readAndParse.d.ts.map +1 -1
  109. package/dist/runWithRetry.cjs +108 -0
  110. package/dist/runWithRetry.cjs.map +1 -0
  111. package/dist/runWithRetry.d.ts +26 -7
  112. package/dist/runWithRetry.d.ts.map +1 -1
  113. package/dist/{summaryForCreateNew.js → summaryForCreateNew.cjs} +20 -19
  114. package/dist/summaryForCreateNew.cjs.map +1 -0
  115. package/dist/summaryForCreateNew.d.ts +17 -4
  116. package/dist/summaryForCreateNew.d.ts.map +1 -1
  117. package/dist/{treeConversions.js → treeConversions.cjs} +16 -18
  118. package/dist/treeConversions.cjs.map +1 -0
  119. package/dist/treeConversions.d.ts +1 -0
  120. package/dist/treeConversions.d.ts.map +1 -1
  121. package/dist/tsdoc-metadata.json +11 -0
  122. package/lib/adapters/compression/compressionTypes.d.mts +23 -0
  123. package/lib/adapters/compression/compressionTypes.d.mts.map +1 -0
  124. package/lib/adapters/compression/compressionTypes.mjs +17 -0
  125. package/lib/adapters/compression/compressionTypes.mjs.map +1 -0
  126. package/lib/adapters/compression/documentServiceCompressionAdapter.d.mts +13 -0
  127. package/lib/adapters/compression/documentServiceCompressionAdapter.d.mts.map +1 -0
  128. package/lib/adapters/compression/documentServiceCompressionAdapter.mjs +19 -0
  129. package/lib/adapters/compression/documentServiceCompressionAdapter.mjs.map +1 -0
  130. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.d.mts +16 -0
  131. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.d.mts.map +1 -0
  132. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.mjs +27 -0
  133. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.mjs.map +1 -0
  134. package/lib/adapters/compression/index.d.mts +8 -0
  135. package/lib/adapters/compression/index.d.mts.map +1 -0
  136. package/lib/adapters/compression/index.mjs +8 -0
  137. package/lib/adapters/compression/index.mjs.map +1 -0
  138. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.mts +165 -0
  139. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.mts.map +1 -0
  140. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.mjs +366 -0
  141. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.mjs.map +1 -0
  142. package/lib/adapters/compression/summaryblob/index.d.mts +6 -0
  143. package/lib/adapters/compression/summaryblob/index.d.mts.map +1 -0
  144. package/lib/adapters/compression/summaryblob/index.mjs +6 -0
  145. package/lib/adapters/compression/summaryblob/index.mjs.map +1 -0
  146. package/lib/adapters/index.d.mts +7 -0
  147. package/lib/adapters/index.d.mts.map +1 -0
  148. package/lib/adapters/index.mjs +7 -0
  149. package/lib/adapters/index.mjs.map +1 -0
  150. package/lib/adapters/predefinedAdapters.d.mts +21 -0
  151. package/lib/adapters/predefinedAdapters.d.mts.map +1 -0
  152. package/lib/adapters/predefinedAdapters.mjs +47 -0
  153. package/lib/adapters/predefinedAdapters.mjs.map +1 -0
  154. package/lib/blob.d.mts +56 -0
  155. package/lib/blob.d.mts.map +1 -0
  156. package/lib/blob.mjs +59 -0
  157. package/lib/blob.mjs.map +1 -0
  158. package/lib/{buildSnapshotTree.d.ts → buildSnapshotTree.d.mts} +2 -1
  159. package/lib/buildSnapshotTree.d.mts.map +1 -0
  160. package/lib/{buildSnapshotTree.js → buildSnapshotTree.mjs} +6 -4
  161. package/lib/buildSnapshotTree.mjs.map +1 -0
  162. package/lib/documentServiceFactoryProxy.d.mts +19 -0
  163. package/lib/documentServiceFactoryProxy.d.mts.map +1 -0
  164. package/lib/documentServiceFactoryProxy.mjs +23 -0
  165. package/lib/documentServiceFactoryProxy.mjs.map +1 -0
  166. package/lib/documentServiceProxy.d.mts +21 -0
  167. package/lib/documentServiceProxy.d.mts.map +1 -0
  168. package/lib/documentServiceProxy.mjs +32 -0
  169. package/lib/documentServiceProxy.mjs.map +1 -0
  170. package/lib/{documentStorageServiceProxy.d.ts → documentStorageServiceProxy.d.mts} +6 -3
  171. package/lib/documentStorageServiceProxy.d.mts.map +1 -0
  172. package/lib/{documentStorageServiceProxy.js → documentStorageServiceProxy.mjs} +10 -8
  173. package/lib/documentStorageServiceProxy.mjs.map +1 -0
  174. package/lib/driver-utils-alpha.d.mts +163 -0
  175. package/lib/driver-utils-beta.d.mts +178 -0
  176. package/lib/driver-utils-public.d.mts +178 -0
  177. package/lib/driver-utils-untrimmed.d.mts +590 -0
  178. package/lib/error.d.mts +16 -0
  179. package/lib/error.d.mts.map +1 -0
  180. package/lib/error.mjs +19 -0
  181. package/lib/error.mjs.map +1 -0
  182. package/lib/index.d.mts +21 -0
  183. package/lib/index.d.mts.map +1 -0
  184. package/lib/index.mjs +21 -0
  185. package/lib/index.mjs.map +1 -0
  186. package/lib/{insecureUrlResolver.d.ts → insecureUrlResolver.d.mts} +2 -1
  187. package/lib/insecureUrlResolver.d.mts.map +1 -0
  188. package/lib/{insecureUrlResolver.js → insecureUrlResolver.mjs} +10 -11
  189. package/lib/insecureUrlResolver.mjs.map +1 -0
  190. package/lib/messageRecognition.d.mts +24 -0
  191. package/lib/messageRecognition.d.mts.map +1 -0
  192. package/lib/messageRecognition.mjs +29 -0
  193. package/lib/messageRecognition.mjs.map +1 -0
  194. package/lib/{network.d.ts → network.d.mts} +70 -21
  195. package/lib/network.d.mts.map +1 -0
  196. package/lib/{network.js → network.mjs} +85 -23
  197. package/lib/network.mjs.map +1 -0
  198. package/lib/networkUtils.d.mts +11 -0
  199. package/lib/networkUtils.d.mts.map +1 -0
  200. package/lib/networkUtils.mjs +25 -0
  201. package/lib/networkUtils.mjs.map +1 -0
  202. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  203. package/lib/packageVersion.d.mts.map +1 -0
  204. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  205. package/lib/packageVersion.mjs.map +1 -0
  206. package/lib/{parallelRequests.d.ts → parallelRequests.d.mts} +20 -7
  207. package/lib/parallelRequests.d.mts.map +1 -0
  208. package/lib/{parallelRequests.js → parallelRequests.mjs} +119 -52
  209. package/lib/parallelRequests.mjs.map +1 -0
  210. package/lib/{prefetchDocumentStorageService.d.ts → prefetchDocumentStorageService.d.mts} +6 -8
  211. package/lib/prefetchDocumentStorageService.d.mts.map +1 -0
  212. package/lib/{prefetchDocumentStorageService.js → prefetchDocumentStorageService.mjs} +7 -8
  213. package/lib/prefetchDocumentStorageService.mjs.map +1 -0
  214. package/lib/{rateLimiter.d.ts → rateLimiter.d.mts} +4 -1
  215. package/lib/rateLimiter.d.mts.map +1 -0
  216. package/lib/{rateLimiter.js → rateLimiter.mjs} +5 -2
  217. package/lib/rateLimiter.mjs.map +1 -0
  218. package/lib/readAndParse.d.mts +20 -0
  219. package/lib/readAndParse.d.mts.map +1 -0
  220. package/lib/readAndParse.mjs +24 -0
  221. package/lib/readAndParse.mjs.map +1 -0
  222. package/lib/{runWithRetry.d.ts → runWithRetry.d.mts} +27 -8
  223. package/lib/runWithRetry.d.mts.map +1 -0
  224. package/lib/runWithRetry.mjs +103 -0
  225. package/lib/runWithRetry.mjs.map +1 -0
  226. package/lib/{summaryForCreateNew.d.ts → summaryForCreateNew.d.mts} +18 -5
  227. package/lib/summaryForCreateNew.d.mts.map +1 -0
  228. package/lib/{summaryForCreateNew.js → summaryForCreateNew.mjs} +18 -17
  229. package/lib/summaryForCreateNew.mjs.map +1 -0
  230. package/lib/{treeConversions.d.ts → treeConversions.d.mts} +2 -1
  231. package/lib/treeConversions.d.mts.map +1 -0
  232. package/lib/{treeConversions.js → treeConversions.mjs} +12 -14
  233. package/lib/treeConversions.mjs.map +1 -0
  234. package/package.json +86 -64
  235. package/prettier.config.cjs +8 -0
  236. package/src/adapters/compression/compressionTypes.ts +25 -0
  237. package/src/adapters/compression/documentServiceCompressionAdapter.ts +28 -0
  238. package/src/adapters/compression/documentServiceFactoryCompressionAdapter.ts +54 -0
  239. package/src/adapters/compression/index.ts +12 -0
  240. package/src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts +451 -0
  241. package/src/adapters/compression/summaryblob/index.ts +9 -0
  242. package/src/adapters/index.ts +13 -0
  243. package/src/adapters/predefinedAdapters.ts +74 -0
  244. package/src/blob.ts +77 -0
  245. package/src/buildSnapshotTree.ts +58 -53
  246. package/src/documentServiceFactoryProxy.ts +47 -0
  247. package/src/documentServiceProxy.ts +46 -0
  248. package/src/documentStorageServiceProxy.ts +52 -37
  249. package/src/error.ts +13 -8
  250. package/src/index.ts +51 -21
  251. package/src/insecureUrlResolver.ts +125 -120
  252. package/src/messageRecognition.ts +24 -53
  253. package/src/network.ts +189 -111
  254. package/src/networkUtils.ts +24 -49
  255. package/src/packageVersion.ts +1 -1
  256. package/src/parallelRequests.ts +630 -519
  257. package/src/prefetchDocumentStorageService.ts +79 -74
  258. package/src/rateLimiter.ts +33 -30
  259. package/src/readAndParse.ts +18 -9
  260. package/src/runWithRetry.ts +145 -85
  261. package/src/summaryForCreateNew.ts +48 -29
  262. package/src/treeConversions.ts +49 -70
  263. package/tsc-multi.test.json +4 -0
  264. package/tsconfig.json +10 -12
  265. package/dist/blobAggregationStorage.d.ts +0 -43
  266. package/dist/blobAggregationStorage.d.ts.map +0 -1
  267. package/dist/blobAggregationStorage.js +0 -318
  268. package/dist/blobAggregationStorage.js.map +0 -1
  269. package/dist/blobCacheStorageService.d.ts +0 -16
  270. package/dist/blobCacheStorageService.d.ts.map +0 -1
  271. package/dist/blobCacheStorageService.js +0 -29
  272. package/dist/blobCacheStorageService.js.map +0 -1
  273. package/dist/buildSnapshotTree.js.map +0 -1
  274. package/dist/documentStorageServiceProxy.js.map +0 -1
  275. package/dist/emptyDocumentDeltaStorageService.d.ts +0 -13
  276. package/dist/emptyDocumentDeltaStorageService.d.ts.map +0 -1
  277. package/dist/emptyDocumentDeltaStorageService.js +0 -20
  278. package/dist/emptyDocumentDeltaStorageService.js.map +0 -1
  279. package/dist/error.js.map +0 -1
  280. package/dist/fluidResolvedUrl.d.ts +0 -8
  281. package/dist/fluidResolvedUrl.d.ts.map +0 -1
  282. package/dist/fluidResolvedUrl.js +0 -16
  283. package/dist/fluidResolvedUrl.js.map +0 -1
  284. package/dist/index.js +0 -38
  285. package/dist/index.js.map +0 -1
  286. package/dist/insecureUrlResolver.js.map +0 -1
  287. package/dist/messageRecognition.js +0 -73
  288. package/dist/messageRecognition.js.map +0 -1
  289. package/dist/multiDocumentServiceFactory.d.ts +0 -16
  290. package/dist/multiDocumentServiceFactory.d.ts.map +0 -1
  291. package/dist/multiDocumentServiceFactory.js +0 -63
  292. package/dist/multiDocumentServiceFactory.js.map +0 -1
  293. package/dist/multiUrlResolver.d.ts +0 -20
  294. package/dist/multiUrlResolver.d.ts.map +0 -1
  295. package/dist/multiUrlResolver.js +0 -45
  296. package/dist/multiUrlResolver.js.map +0 -1
  297. package/dist/network.js.map +0 -1
  298. package/dist/networkUtils.js +0 -59
  299. package/dist/networkUtils.js.map +0 -1
  300. package/dist/packageVersion.js.map +0 -1
  301. package/dist/parallelRequests.js.map +0 -1
  302. package/dist/prefetchDocumentStorageService.js.map +0 -1
  303. package/dist/rateLimiter.js.map +0 -1
  304. package/dist/readAndParse.js +0 -22
  305. package/dist/readAndParse.js.map +0 -1
  306. package/dist/runWithRetry.js +0 -69
  307. package/dist/runWithRetry.js.map +0 -1
  308. package/dist/summaryForCreateNew.js.map +0 -1
  309. package/dist/treeConversions.js.map +0 -1
  310. package/dist/treeUtils.d.ts +0 -51
  311. package/dist/treeUtils.d.ts.map +0 -1
  312. package/dist/treeUtils.js +0 -85
  313. package/dist/treeUtils.js.map +0 -1
  314. package/lib/blobAggregationStorage.d.ts +0 -43
  315. package/lib/blobAggregationStorage.d.ts.map +0 -1
  316. package/lib/blobAggregationStorage.js +0 -313
  317. package/lib/blobAggregationStorage.js.map +0 -1
  318. package/lib/blobCacheStorageService.d.ts +0 -16
  319. package/lib/blobCacheStorageService.d.ts.map +0 -1
  320. package/lib/blobCacheStorageService.js +0 -25
  321. package/lib/blobCacheStorageService.js.map +0 -1
  322. package/lib/buildSnapshotTree.d.ts.map +0 -1
  323. package/lib/buildSnapshotTree.js.map +0 -1
  324. package/lib/documentStorageServiceProxy.d.ts.map +0 -1
  325. package/lib/documentStorageServiceProxy.js.map +0 -1
  326. package/lib/emptyDocumentDeltaStorageService.d.ts +0 -13
  327. package/lib/emptyDocumentDeltaStorageService.d.ts.map +0 -1
  328. package/lib/emptyDocumentDeltaStorageService.js +0 -16
  329. package/lib/emptyDocumentDeltaStorageService.js.map +0 -1
  330. package/lib/error.d.ts +0 -11
  331. package/lib/error.d.ts.map +0 -1
  332. package/lib/error.js +0 -13
  333. package/lib/error.js.map +0 -1
  334. package/lib/fluidResolvedUrl.d.ts +0 -8
  335. package/lib/fluidResolvedUrl.d.ts.map +0 -1
  336. package/lib/fluidResolvedUrl.js +0 -11
  337. package/lib/fluidResolvedUrl.js.map +0 -1
  338. package/lib/index.d.ts +0 -26
  339. package/lib/index.d.ts.map +0 -1
  340. package/lib/index.js +0 -26
  341. package/lib/index.js.map +0 -1
  342. package/lib/insecureUrlResolver.d.ts.map +0 -1
  343. package/lib/insecureUrlResolver.js.map +0 -1
  344. package/lib/messageRecognition.d.ts +0 -38
  345. package/lib/messageRecognition.d.ts.map +0 -1
  346. package/lib/messageRecognition.js +0 -67
  347. package/lib/messageRecognition.js.map +0 -1
  348. package/lib/multiDocumentServiceFactory.d.ts +0 -16
  349. package/lib/multiDocumentServiceFactory.d.ts.map +0 -1
  350. package/lib/multiDocumentServiceFactory.js +0 -59
  351. package/lib/multiDocumentServiceFactory.js.map +0 -1
  352. package/lib/multiUrlResolver.d.ts +0 -20
  353. package/lib/multiUrlResolver.d.ts.map +0 -1
  354. package/lib/multiUrlResolver.js +0 -40
  355. package/lib/multiUrlResolver.js.map +0 -1
  356. package/lib/network.d.ts.map +0 -1
  357. package/lib/network.js.map +0 -1
  358. package/lib/networkUtils.d.ts +0 -17
  359. package/lib/networkUtils.d.ts.map +0 -1
  360. package/lib/networkUtils.js +0 -54
  361. package/lib/networkUtils.js.map +0 -1
  362. package/lib/packageVersion.d.ts.map +0 -1
  363. package/lib/packageVersion.js.map +0 -1
  364. package/lib/parallelRequests.d.ts.map +0 -1
  365. package/lib/parallelRequests.js.map +0 -1
  366. package/lib/prefetchDocumentStorageService.d.ts.map +0 -1
  367. package/lib/prefetchDocumentStorageService.js.map +0 -1
  368. package/lib/rateLimiter.d.ts.map +0 -1
  369. package/lib/rateLimiter.js.map +0 -1
  370. package/lib/readAndParse.d.ts +0 -14
  371. package/lib/readAndParse.d.ts.map +0 -1
  372. package/lib/readAndParse.js +0 -18
  373. package/lib/readAndParse.js.map +0 -1
  374. package/lib/runWithRetry.d.ts.map +0 -1
  375. package/lib/runWithRetry.js +0 -65
  376. package/lib/runWithRetry.js.map +0 -1
  377. package/lib/summaryForCreateNew.d.ts.map +0 -1
  378. package/lib/summaryForCreateNew.js.map +0 -1
  379. package/lib/treeConversions.d.ts.map +0 -1
  380. package/lib/treeConversions.js.map +0 -1
  381. package/lib/treeUtils.d.ts +0 -51
  382. package/lib/treeUtils.d.ts.map +0 -1
  383. package/lib/treeUtils.js +0 -80
  384. package/lib/treeUtils.js.map +0 -1
  385. package/src/blobAggregationStorage.ts +0 -374
  386. package/src/blobCacheStorageService.ts +0 -32
  387. package/src/emptyDocumentDeltaStorageService.ts +0 -24
  388. package/src/fluidResolvedUrl.ts +0 -15
  389. package/src/multiDocumentServiceFactory.ts +0 -80
  390. package/src/multiUrlResolver.ts +0 -51
  391. package/src/treeUtils.ts +0 -111
  392. package/tsconfig.esnext.json +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageVersion.mjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,8BAA8B,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/driver-utils\";\nexport const pkgVersion = \"2.0.0-dev-rc.1.0.0.225277\";\n"]}
@@ -1,4 +1,5 @@
1
- import { ITelemetryLogger, ITelemetryProperties } from "@fluidframework/common-definitions";
1
+ import { ITelemetryProperties } from "@fluidframework/core-interfaces";
2
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
2
3
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
3
4
  import { IDeltasFetchResult, IStream, IStreamResult } from "@fluidframework/driver-definitions";
4
5
  /**
@@ -7,11 +8,12 @@ import { IDeltasFetchResult, IStream, IStreamResult } from "@fluidframework/driv
7
8
  * data in the right order. Take a look at UT for examples.
8
9
  * @param concurrency - level of concurrency
9
10
  * @param from - starting point of fetching data (inclusive)
10
- * @param to - ending point of fetching data. exclusive, or undefined if unknown
11
+ * @param to - ending point of fetching data. exclusive, or undefined if unknown
11
12
  * @param payloadSize - batch size
12
13
  * @param logger - logger to use
13
14
  * @param requestCallback - callback to request batches
14
- * @returns - Queue that can be used to retrieve data
15
+ * @returns Queue that can be used to retrieve data
16
+ * @internal
15
17
  */
16
18
  export declare class ParallelRequests<T> {
17
19
  private to;
@@ -29,7 +31,7 @@ export declare class ParallelRequests<T> {
29
31
  private readonly knewTo;
30
32
  private get working();
31
33
  get canceled(): boolean;
32
- constructor(from: number, to: number | undefined, payloadSize: number, logger: ITelemetryLogger, requestCallback: (request: number, from: number, to: number, strongTo: boolean, props: ITelemetryProperties) => Promise<{
34
+ constructor(from: number, to: number | undefined, payloadSize: number, logger: ITelemetryLoggerExt, requestCallback: (request: number, from: number, to: number, strongTo: boolean, props: ITelemetryProperties) => Promise<{
33
35
  partial: boolean;
34
36
  cancel: boolean;
35
37
  payload: T[];
@@ -46,6 +48,7 @@ export declare class ParallelRequests<T> {
46
48
  /**
47
49
  * Helper queue class to allow async push / pull
48
50
  * It's essentially a pipe allowing multiple writers, and single reader
51
+ * @internal
49
52
  */
50
53
  export declare class Queue<T> implements IStream<T> {
51
54
  private readonly queue;
@@ -67,10 +70,20 @@ export declare class Queue<T> implements IStream<T> {
67
70
  * @param logger - Logger to log progress and errors
68
71
  * @param signal - Cancelation signal
69
72
  * @param scenarioName - Reason for fetching ops
70
- * @returns - Messages fetched
73
+ * @returns Messages fetched
74
+ * @internal
75
+ */
76
+ export declare function requestOps(get: (from: number, to: number, telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>, concurrency: number, fromTotal: number, toTotal: number | undefined, payloadSize: number, logger: ITelemetryLoggerExt, signal?: AbortSignal, scenarioName?: string): IStream<ISequencedDocumentMessage[]>;
77
+ /**
78
+ * @internal
71
79
  */
72
- export declare function requestOps(get: (from: number, to: number, telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>, concurrency: number, fromTotal: number, toTotal: number | undefined, payloadSize: number, logger: ITelemetryLogger, signal?: AbortSignal, scenarioName?: string): IStream<ISequencedDocumentMessage[]>;
73
80
  export declare const emptyMessageStream: IStream<ISequencedDocumentMessage[]>;
81
+ /**
82
+ * @internal
83
+ */
74
84
  export declare function streamFromMessages(messagesArg: Promise<ISequencedDocumentMessage[]>): IStream<ISequencedDocumentMessage[]>;
85
+ /**
86
+ * @internal
87
+ */
75
88
  export declare function streamObserver<T>(stream: IStream<T>, handler: (value: IStreamResult<T>) => void): IStream<T>;
76
- //# sourceMappingURL=parallelRequests.d.ts.map
89
+ //# sourceMappingURL=parallelRequests.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallelRequests.d.mts","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,32 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { assert, Deferred, performance } from "@fluidframework/common-utils";
1
+ import { performance } from "@fluid-internal/client-utils";
2
+ import { assert, Deferred } from "@fluidframework/core-utils";
6
3
  import { PerformanceEvent } from "@fluidframework/telemetry-utils";
7
- import { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from "./network";
8
- import { waitForConnectedState, logNetworkFailure } from "./networkUtils";
9
- // For now, this package is versioned and released in unison with the specific drivers
10
- import { pkgVersion as driverVersion } from "./packageVersion";
11
- const MaxFetchDelayInMs = 10000;
12
- const MissingFetchDelayInMs = 100;
4
+ import { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from "./network.mjs";
5
+ import { logNetworkFailure } from "./networkUtils.mjs";
6
+ import { pkgVersion as driverVersion } from "./packageVersion.mjs";
7
+ import { calculateMaxWaitTime } from "./runWithRetry.mjs";
8
+ // We double this value in first try in when we calculate time to wait for in "calculateMaxWaitTime" function.
9
+ const MissingFetchDelayInMs = 50;
13
10
  /**
14
11
  * Helper class to organize parallel fetching of data
15
12
  * It can be used to concurrently do many requests, while consuming
16
13
  * data in the right order. Take a look at UT for examples.
17
14
  * @param concurrency - level of concurrency
18
15
  * @param from - starting point of fetching data (inclusive)
19
- * @param to - ending point of fetching data. exclusive, or undefined if unknown
16
+ * @param to - ending point of fetching data. exclusive, or undefined if unknown
20
17
  * @param payloadSize - batch size
21
18
  * @param logger - logger to use
22
19
  * @param requestCallback - callback to request batches
23
- * @returns - Queue that can be used to retrieve data
20
+ * @returns Queue that can be used to retrieve data
21
+ * @internal
24
22
  */
25
23
  export class ParallelRequests {
24
+ get working() {
25
+ return this.workingState === "working";
26
+ }
27
+ get canceled() {
28
+ return this.workingState === "canceled";
29
+ }
26
30
  constructor(from, to, payloadSize, logger, requestCallback, responseCallback) {
27
31
  this.to = to;
28
32
  this.payloadSize = payloadSize;
@@ -36,10 +40,8 @@ export class ParallelRequests {
36
40
  this.requests = 0;
37
41
  this.latestRequested = from;
38
42
  this.nextToDeliver = from;
39
- this.knewTo = (to !== undefined);
43
+ this.knewTo = to !== undefined;
40
44
  }
41
- get working() { return this.workingState === "working"; }
42
- get canceled() { return this.workingState === "canceled"; }
43
45
  cancel() {
44
46
  if (this.working) {
45
47
  this.workingState = "canceled";
@@ -173,7 +175,7 @@ export class ParallelRequests {
173
175
  if (this.working) {
174
176
  const fromOrig = from;
175
177
  const length = payload.length;
176
- let fullChunk = (requestedLength <= length); // we can possible get more than we asked.
178
+ let fullChunk = requestedLength <= length; // we can possible get more than we asked.
177
179
  if (length !== 0) {
178
180
  // We can get more than we asked for!
179
181
  // This can screw up logic in dispatch!
@@ -231,9 +233,10 @@ export class ParallelRequests {
231
233
  if (to === this.latestRequested) {
232
234
  // we can go after full chunk at the end if we received partial chunk, or more than asked
233
235
  // Also if we got more than we asked to, we can actually use those ops!
234
- if (payload.length !== 0) {
235
- this.results.set(from, payload);
236
- from += payload.length;
236
+ while (payload.length !== 0) {
237
+ const data = payload.splice(0, requestedLength);
238
+ this.results.set(from, data);
239
+ from += data.length;
237
240
  }
238
241
  this.latestRequested = from;
239
242
  fullChunk = true;
@@ -255,6 +258,7 @@ export class ParallelRequests {
255
258
  /**
256
259
  * Helper queue class to allow async push / pull
257
260
  * It's essentially a pipe allowing multiple writers, and single reader
261
+ * @internal
258
262
  */
259
263
  export class Queue {
260
264
  constructor() {
@@ -294,6 +298,18 @@ export class Queue {
294
298
  return this.deferred.promise;
295
299
  }
296
300
  }
301
+ const waitForOnline = async () => {
302
+ // Only wait if we have a strong signal that we're offline - otherwise assume we're online.
303
+ if (globalThis.navigator?.onLine === false && globalThis.addEventListener !== undefined) {
304
+ return new Promise((resolve) => {
305
+ const resolveAndRemoveListener = () => {
306
+ resolve();
307
+ globalThis.removeEventListener("online", resolveAndRemoveListener);
308
+ };
309
+ globalThis.addEventListener("online", resolveAndRemoveListener);
310
+ });
311
+ }
312
+ };
297
313
  /**
298
314
  * Retrieve single batch of ops
299
315
  * @param request - request index
@@ -305,30 +321,38 @@ export class Queue {
305
321
  * @param logger - logger object to use to log progress & errors
306
322
  * @param signal - cancelation signal
307
323
  * @param scenarioName - reason for fetching ops
308
- * @returns - an object with resulting ops and cancellation / partial result flags
324
+ * @returns An object with resulting ops and cancellation / partial result flags
309
325
  */
310
326
  async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioName) {
311
327
  let lastSuccessTime;
328
+ let totalRetryAfterTime = 0;
329
+ let telemetryEvent;
312
330
  let retry = 0;
313
- const deltas = [];
314
331
  const nothing = { partial: false, cancel: true, payload: [] };
315
- while ((signal === null || signal === void 0 ? void 0 : signal.aborted) !== true) {
332
+ let waitStartTime = 0;
333
+ let waitTime = MissingFetchDelayInMs;
334
+ while (signal?.aborted !== true) {
316
335
  retry++;
317
- let delay = Math.min(MaxFetchDelayInMs, MissingFetchDelayInMs * Math.pow(2, retry));
336
+ let lastError;
318
337
  const startTime = performance.now();
319
338
  try {
320
- // Issue async request for deltas - limit the number fetched to MaxBatchDeltas
321
- const deltasP = get(Object.assign(Object.assign({}, props), { retry }));
322
- const { messages, partialResult } = await deltasP;
323
- deltas.push(...messages);
324
- const deltasRetrievedLast = messages.length;
325
- if (deltasRetrievedLast !== 0 || !strongTo) {
326
- return { payload: deltas, cancel: false, partial: partialResult };
339
+ // Issue async request for deltas
340
+ const { messages, partialResult } = await get({ ...props, retry } /* telemetry props */);
341
+ // If we got messages back, return them. Return regardless of whether we got messages back if we didn't
342
+ // specify a "to", since we don't have an expectation of how many to receive.
343
+ if (messages.length !== 0 || !strongTo) {
344
+ // Report this event if we waited to fetch ops due to being offline or throttling.
345
+ telemetryEvent?.end({
346
+ duration: totalRetryAfterTime,
347
+ ...props,
348
+ reason: scenarioName,
349
+ });
350
+ return { payload: messages, cancel: false, partial: partialResult };
327
351
  }
328
- // Storage does not have ops we need.
329
- // Attempt to fetch more deltas. If we didn't receive any in the previous call we up our retry
330
- // count since something prevented us from seeing those deltas
352
+ // Otherwise, the storage gave us back an empty set of ops but we were expecting a non-empty set.
331
353
  if (lastSuccessTime === undefined) {
354
+ // Take timestamp of the first time server responded successfully, even though it wasn't with the ops we asked for.
355
+ // If we keep getting empty responses we'll eventually fail out below.
332
356
  lastSuccessTime = performance.now();
333
357
  }
334
358
  else if (performance.now() - lastSuccessTime > 30000) {
@@ -338,25 +362,48 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioNa
338
362
  // current as it can't get ops.
339
363
  throw createGenericNetworkError(
340
364
  // pre-0.58 error message: failedToRetrieveOpsFromStorage:TooManyRetries
341
- "Failed to retrieve ops from storage (Too Many Retries)", { canRetry: false }, Object.assign({ retry,
342
- driverVersion }, props));
365
+ "Failed to retrieve ops from storage (Too Many Retries)", { canRetry: false }, {
366
+ retry,
367
+ driverVersion,
368
+ ...props,
369
+ });
343
370
  }
344
371
  }
345
372
  catch (error) {
373
+ lastError = error;
346
374
  const canRetry = canRetryOnError(error);
347
- lastSuccessTime = undefined;
348
375
  const retryAfter = getRetryDelayFromError(error);
349
376
  // This will log to error table only if the error is non-retryable
350
- logNetworkFailure(logger, Object.assign(Object.assign({ eventName: "GetDeltas_Error" }, props), { retry, duration: performance.now() - startTime, retryAfter, reason: scenarioName }), error);
377
+ logNetworkFailure(logger, {
378
+ eventName: "GetDeltas_Error",
379
+ ...props,
380
+ retry,
381
+ duration: performance.now() - startTime,
382
+ retryAfter,
383
+ reason: scenarioName,
384
+ }, error);
351
385
  if (!canRetry) {
352
386
  // It's game over scenario.
353
387
  throw error;
354
388
  }
355
- if (retryAfter !== undefined && retryAfter >= 0) {
356
- delay = retryAfter;
357
- }
358
389
  }
359
- await waitForConnectedState(delay);
390
+ if (telemetryEvent === undefined) {
391
+ waitStartTime = performance.now();
392
+ telemetryEvent = PerformanceEvent.start(logger, {
393
+ eventName: "GetDeltasWaitTime",
394
+ });
395
+ }
396
+ waitTime = calculateMaxWaitTime(waitTime, lastError);
397
+ // If we get here something has gone wrong - either got an unexpected empty set of messages back or a real error.
398
+ // Either way we will wait a little bit before retrying.
399
+ await new Promise((resolve) => {
400
+ setTimeout(resolve, waitTime);
401
+ });
402
+ // If we believe we're offline, we assume there's no point in trying until we at least think we're online.
403
+ // NOTE: This isn't strictly true for drivers that don't require network (e.g. local driver). Really this logic
404
+ // should probably live in the driver.
405
+ await waitForOnline();
406
+ totalRetryAfterTime += performance.now() - waitStartTime;
360
407
  }
361
408
  return nothing;
362
409
  }
@@ -370,7 +417,8 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioNa
370
417
  * @param logger - Logger to log progress and errors
371
418
  * @param signal - Cancelation signal
372
419
  * @param scenarioName - Reason for fetching ops
373
- * @returns - Messages fetched
420
+ * @returns Messages fetched
421
+ * @internal
374
422
  */
375
423
  export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, logger, signal, scenarioName) {
376
424
  let requests = 0;
@@ -381,10 +429,14 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
381
429
  fromTotal,
382
430
  toTotal,
383
431
  };
384
- const telemetryEvent = PerformanceEvent.start(logger, Object.assign(Object.assign({ eventName: "GetDeltas" }, propsTotal), { reason: scenarioName }));
432
+ const telemetryEvent = PerformanceEvent.start(logger, {
433
+ eventName: "GetDeltas",
434
+ ...propsTotal,
435
+ reason: scenarioName,
436
+ });
385
437
  const manager = new ParallelRequests(fromTotal, toTotal, payloadSize, logger, async (request, from, to, strongTo, propsPerRequest) => {
386
438
  requests++;
387
- return getSingleOpBatch(async (propsAll) => get(from, to, propsAll), Object.assign(Object.assign({ request, from, to }, propsTotal), propsPerRequest), strongTo, logger, signal, scenarioName);
439
+ return getSingleOpBatch(async (propsAll) => get(from, to, propsAll), { request, from, to, ...propsTotal, ...propsPerRequest }, strongTo, logger, signal, scenarioName);
388
440
  }, (deltas) => {
389
441
  // Assert continuing and right start.
390
442
  if (lastFetch === undefined) {
@@ -402,26 +454,30 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
402
454
  // waits (up to 10 seconds) and fetches (can take infinite amount of time).
403
455
  // While every such case should be improved and take into account signal (and thus cancel immediately),
404
456
  // it is beneficial to have catch-all
405
- const listener = (event) => { manager.cancel(); };
457
+ const listener = (event) => {
458
+ manager.cancel();
459
+ };
406
460
  if (signal !== undefined) {
407
461
  signal.addEventListener("abort", listener);
408
462
  }
409
- manager.run(concurrency)
463
+ manager
464
+ .run(concurrency)
410
465
  .finally(() => {
411
466
  if (signal !== undefined) {
412
467
  signal.removeEventListener("abort", listener);
413
468
  }
414
- }).then(() => {
469
+ })
470
+ .then(() => {
415
471
  const props = {
416
472
  lastFetch,
417
473
  length,
418
474
  requests,
419
475
  };
420
476
  if (manager.canceled) {
421
- telemetryEvent.cancel(Object.assign(Object.assign({}, props), { error: "ops request cancelled by client" }));
477
+ telemetryEvent.cancel({ ...props, error: "ops request cancelled by client" });
422
478
  }
423
479
  else {
424
- assert(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1, 0x270 /* "All requested ops fetched" */);
480
+ assert(toTotal === undefined || (lastFetch !== undefined && lastFetch >= toTotal - 1), 0x270 /* "All requested ops fetched" */);
425
481
  telemetryEvent.end(props);
426
482
  }
427
483
  queue.pushDone();
@@ -436,9 +492,17 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
436
492
  });
437
493
  return queue;
438
494
  }
495
+ /**
496
+ * @internal
497
+ */
439
498
  export const emptyMessageStream = {
440
- read: async () => { return { done: true }; },
499
+ read: async () => {
500
+ return { done: true };
501
+ },
441
502
  };
503
+ /**
504
+ * @internal
505
+ */
442
506
  export function streamFromMessages(messagesArg) {
443
507
  let messages = messagesArg;
444
508
  return {
@@ -452,6 +516,9 @@ export function streamFromMessages(messagesArg) {
452
516
  },
453
517
  };
454
518
  }
519
+ /**
520
+ * @internal
521
+ */
455
522
  export function streamObserver(stream, handler) {
456
523
  return {
457
524
  read: async () => {
@@ -461,4 +528,4 @@ export function streamObserver(stream, handler) {
461
528
  },
462
529
  };
463
530
  }
464
- //# sourceMappingURL=parallelRequests.js.map
531
+ //# sourceMappingURL=parallelRequests.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallelRequests.mjs","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"OAIO,EAAE,WAAW,EAAE,MAAM,8BAA8B;OAEnD,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B;OACtD,EAAuB,gBAAgB,EAAE,MAAM,iCAAiC;OAGhF,EAAE,sBAAsB,EAAE,eAAe,EAAE,yBAAyB,EAAE;OACtE,EAAE,iBAAiB,EAAE;OAErB,EAAE,UAAU,IAAI,aAAa,EAAE;OAC/B,EAAE,oBAAoB,EAAE;AAE/B,8GAA8G;AAC9G,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAIjC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,gBAAgB;IAU5B,IAAY,OAAO;QAClB,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC;IACxC,CAAC;IACD,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC;IACzC,CAAC;IAED,YACC,IAAY,EACJ,EAAsB,EACb,WAAmB,EACnB,MAA2B,EAC3B,eAMgD,EAChD,gBAAwC;QAVjD,OAAE,GAAF,EAAE,CAAoB;QACb,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAqB;QAC3B,oBAAe,GAAf,eAAe,CAMiC;QAChD,qBAAgB,GAAhB,gBAAgB,CAAwB;QA1BzC,YAAO,GAAG,IAAI,GAAG,EAAe,CAAC;QAC1C,iBAAY,GAAiB,SAAS,CAAC;QACvC,qBAAgB,GAAG,CAAC,CAAC;QACZ,aAAQ,GAAG,IAAI,QAAQ,EAAQ,CAAC;QACzC,aAAQ,GAAG,CAAC,CAAC;QAwBpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;IAChC,CAAC;IAEM,MAAM;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SACxB;IACF,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,WAAmB;QACnC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAE7E,IAAI,CAAC,GAAG,WAAW,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE;YACb,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,UAAU,EAAE,CAAC;SAClB;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,uDAAuD;QACxE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC9B,CAAC;IAEO,IAAI;QACX,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpF,MAAM,CACL,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,EAAE,EAC7B,KAAK,CAAC,+CAA+C,CACrD,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SACxB;IACF,CAAC;IAEO,IAAI,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC5B;IACF,CAAC;IAEO,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,EAAE;gBACxB,MAAM;aACN;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CACL,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAChC,KAAK,CAAC,yDAAyD,CAC/D,CAAC;YACF,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,4FAA4F;QAC5F,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE;gBAChC,wFAAwF;gBACxF,mFAAmF;gBACnF,MAAM,CACL,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EACvB,KAAK,CAAC,yDAAyD,CAC/D,CAAC;gBACF,IAAI,CAAC,IAAI,EAAE,CAAC;aACZ;iBAAM,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,EAAE,EAAE;gBAClE,6DAA6D;gBAC7D,4EAA4E;gBAC5E,MAAM,CACL,CAAC,IAAI,CAAC,MAAM,EACZ,KAAK,CAAC,uEAAuE,CAC7E,CAAC;gBACF,IAAI,CAAC,IAAI,EAAE,CAAC;aACZ;SACD;IACF,CAAC;IAEO,YAAY;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO,SAAS,CAAC;SACjB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;QAClC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;YAC1B,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;gBACpB,OAAO,SAAS,CAAC;aACjB;SACD;QAED,uBAAuB;QACvB,sDAAsD;QACtD,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC;QAEzC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SAC/D;QAED,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAElF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3C,CAAC;IAEO,UAAU;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE;YACxB,OAAO;SACP;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,KAAa;QAC1D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAElF,IAAI,IAAI,GAAG,OAAO,CAAC;QACnB,IAAI,EAAE,GAAG,KAAK,CAAC;QAEf,0BAA0B;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,OAAO,EAAE;YACpB,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;YAClC,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAE1E,8DAA8D;YAC9D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;gBAC1B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC3E,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,0CAA0C,CAAC,CAAC;aACxE;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CACnC,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,EAAE,EACF,IAAI,CAAC,EAAE,KAAK,SAAS,EACrB,EAAE,CACF,CAAC;YAEF,mCAAmC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;YAEnD,IAAI,MAAM,EAAE;gBACX,IAAI,CAAC,MAAM,EAAE,CAAC;aACd;YAED,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;gBAC7C,yEAAyE;gBACzE,uFAAuF;gBACvF,6EAA6E;gBAC7E,wFAAwF;gBACxF,iEAAiE;gBACjE,0DAA0D;gBAC1D,MAAM,CACL,CAAC,IAAI,CAAC,MAAM,EACZ,KAAK,CAAC,oEAAoE,CAC1E,CAAC;gBACF,6EAA6E;gBAC7E,kFAAkF;gBAClF,mFAAmF;gBACnF,8BAA8B;gBAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBAC1B,SAAS,EAAE,2BAA2B;wBACtC,IAAI;wBACJ,EAAE;wBACF,GAAG,EAAE,IAAI,CAAC,EAAE;wBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;qBACtB,CAAC,CAAC;iBACH;gBAED,MAAM;aACN;YAED,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,IAAI,SAAS,GAAG,eAAe,IAAI,MAAM,CAAC,CAAC,0CAA0C;gBAErF,IAAI,MAAM,KAAK,CAAC,EAAE;oBACjB,qCAAqC;oBACrC,uCAAuC;oBACvC,yFAAyF;oBACzF,0FAA0F;oBAC1F,4EAA4E;oBAC5E,IAAI,eAAe,GAAG,MAAM,EAAE;wBAC7B,wFAAwF;wBACxF,kDAAkD;wBAClD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;4BAC9B,SAAS,EAAE,uBAAuB;4BAClC,IAAI;4BACJ,EAAE;4BACF,MAAM;yBACN,CAAC,CAAC;qBACH;oBACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;oBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC7B,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;iBACpB;qBAAM;oBACN,yFAAyF;oBACzF,8FAA8F;oBAC9F,2FAA2F;oBAC3F,0BAA0B;oBAC1B,8EAA8E;oBAC9E,iFAAiF;oBACjF,gGAAgG;oBAChG,qEAAqE;oBACrE,4CAA4C;oBAC5C,MAAM,CACL,CAAC,OAAO,EACR,KAAK,CAAC,8DAA8D,CACpE,CAAC;oBACF,MAAM,CACL,CAAC,IAAI,CAAC,MAAM,EACZ,KAAK,CAAC,6EAA6E,CACnF,CAAC;iBACF;gBAED,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;oBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;wBACjB,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;4BAC5C,UAAU;4BACV,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;yBACf;wBACD,MAAM;qBACN;oBACD,oDAAoD;oBACpD,8EAA8E;oBAC9E,4DAA4D;oBAC5D,iFAAiF;oBACjF,6FAA6F;oBAC7F,2DAA2D;oBAC3D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;wBAChC,SAAS,EAAE,0BAA0B;wBACrC,IAAI,EAAE,QAAQ;wBACd,EAAE;wBACF,MAAM;qBACN,CAAC,CAAC;iBACH;gBAED,IAAI,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE;oBAChC,yFAAyF;oBACzF,uEAAuE;oBACvE,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;wBAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;wBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC7B,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;qBACpB;oBAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC5B,SAAS,GAAG,IAAI,CAAC;iBACjB;gBAED,IAAI,SAAS,EAAE;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClC,IAAI,KAAK,KAAK,SAAS,EAAE;wBACxB,MAAM;qBACN;oBACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAClB,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;iBACd;aACD;SACD;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,KAAK;IAAlB;QACkB,UAAK,GAAgC,EAAE,CAAC;QAEjD,SAAI,GAAG,KAAK,CAAC;IAqCtB,CAAC;IAnCO,SAAS,CAAC,KAAQ;QACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAEM,SAAS,CAAC,KAAU;QAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,QAAQ;QACd,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAES,QAAQ,CAAC,KAAgC;QAClD,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC1B;aAAM;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvB;IACF,CAAC;IAEM,KAAK,CAAC,IAAI;QAChB,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE;YACxB,OAAO,KAAK,CAAC;SACb;QACD,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAoB,CAAC;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC9B,CAAC;CACD;AAED,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IAC/C,2FAA2F;IAC3F,IAAI,UAAU,CAAC,SAAS,EAAE,MAAM,KAAK,KAAK,IAAI,UAAU,CAAC,gBAAgB,KAAK,SAAS,EAAE;QACxF,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,wBAAwB,GAAG,GAAG,EAAE;gBACrC,OAAO,EAAE,CAAC;gBACV,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;YACpE,CAAC,CAAC;YACF,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,gBAAgB,CAC9B,GAA0E,EAC1E,KAA2B,EAC3B,QAAiB,EACjB,MAA2B,EAC3B,MAAoB,EACpB,YAAqB;IAErB,IAAI,eAAmC,CAAC;IACxC,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,cAA4C,CAAC;IACjD,IAAI,KAAK,GAAW,CAAC,CAAC;IACtB,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9D,IAAI,aAAa,GAAW,CAAC,CAAC;IAC9B,IAAI,QAAQ,GAAG,qBAAqB,CAAC;IAErC,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,SAAkB,CAAC;QACvB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI;YACH,iCAAiC;YACjC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,GAAG,CAC5C,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,qBAAqB,CACzC,CAAC;YAEF,wGAAwG;YACxG,6EAA6E;YAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACvC,kFAAkF;gBAClF,cAAc,EAAE,GAAG,CAAC;oBACnB,QAAQ,EAAE,mBAAmB;oBAC7B,GAAG,KAAK;oBACR,MAAM,EAAE,YAAY;iBACpB,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;aACpE;YAED,iGAAiG;YAEjG,IAAI,eAAe,KAAK,SAAS,EAAE;gBAClC,mHAAmH;gBACnH,sEAAsE;gBACtE,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;aACpC;iBAAM,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,KAAK,EAAE;gBACvD,8FAA8F;gBAC9F,mGAAmG;gBACnG,8FAA8F;gBAC9F,+BAA+B;gBAC/B,MAAM,yBAAyB;gBAC9B,wEAAwE;gBACxE,wDAAwD,EACxD,EAAE,QAAQ,EAAE,KAAK,EAAE,EACnB;oBACC,KAAK;oBACL,aAAa;oBACb,GAAG,KAAK;iBACR,CACD,CAAC;aACF;SACD;QAAC,OAAO,KAAK,EAAE;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAEjD,kEAAkE;YAClE,iBAAiB,CAChB,MAAM,EACN;gBACC,SAAS,EAAE,iBAAiB;gBAC5B,GAAG,KAAK;gBACR,KAAK;gBACL,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;gBACvC,UAAU;gBACV,MAAM,EAAE,YAAY;aACpB,EACD,KAAK,CACL,CAAC;YAEF,IAAI,CAAC,QAAQ,EAAE;gBACd,2BAA2B;gBAC3B,MAAM,KAAK,CAAC;aACZ;SACD;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YACjC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAClC,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC/C,SAAS,EAAE,mBAAmB;aAC9B,CAAC,CAAC;SACH;QAED,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAErD,iHAAiH;QACjH,wDAAwD;QACxD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,0GAA0G;QAC1G,gHAAgH;QAChH,sCAAsC;QACtC,MAAM,aAAa,EAAE,CAAC;QACtB,mBAAmB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;KACzD;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CACzB,GAIgC,EAChC,WAAmB,EACnB,SAAiB,EACjB,OAA2B,EAC3B,WAAmB,EACnB,MAA2B,EAC3B,MAAoB,EACpB,YAAqB;IAErB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAA6B,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,IAAI,KAAK,EAA+B,CAAC;IAEvD,MAAM,UAAU,GAAyB;QACxC,SAAS;QACT,OAAO;KACP,CAAC;IAEF,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE;QACrD,SAAS,EAAE,WAAW;QACtB,GAAG,UAAU;QACb,MAAM,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,gBAAgB,CACnC,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,KAAK,EACJ,OAAe,EACf,IAAY,EACZ,EAAU,EACV,QAAiB,EACjB,eAAqC,EACpC,EAAE;QACH,QAAQ,EAAE,CAAC;QACX,OAAO,gBAAgB,CACtB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,EAC3C,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,eAAe,EAAE,EACxD,QAAQ,EACR,MAAM,EACN,MAAM,EACN,YAAY,CACZ,CAAC;IACH,CAAC,EACD,CAAC,MAAmC,EAAE,EAAE;QACvC,qCAAqC;QACrC,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC1E;aAAM;YACN,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC9E;QACD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;QACrD,MAAM,CACL,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAC1D,KAAK,CAAC,oCAAoC,CAC1C,CAAC;QACF,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QACxB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACD,CAAC;IAEF,uFAAuF;IACvF,2EAA2E;IAC3E,uGAAuG;IACvG,qCAAqC;IACrC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAE,EAAE;QACjC,OAAO,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC,CAAC;IACF,IAAI,MAAM,KAAK,SAAS,EAAE;QACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KAC3C;IAED,OAAO;SACL,GAAG,CAAC,WAAW,CAAC;SAChB,OAAO,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,SAAS,EAAE;YACzB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;SAC9C;IACF,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,EAAE;QACV,MAAM,KAAK,GAAG;YACb,SAAS;YACT,MAAM;YACN,QAAQ;SACR,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,EAAE;YACrB,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;SAC9E;aAAM;YACN,MAAM,CACL,OAAO,KAAK,SAAS,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,EAC9E,KAAK,CAAC,iCAAiC,CACvC,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC1B;QACD,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAChB,cAAc,CAAC,MAAM,CACpB;YACC,SAAS;YACT,MAAM;YACN,QAAQ;SACR,EACD,KAAK,CACL,CAAC;QACF,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEJ,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACvE,IAAI,EAAE,KAAK,IAAI,EAAE;QAChB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvB,CAAC;CACD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CACjC,WAAiD;IAEjD,IAAI,QAAQ,GAAqD,WAAW,CAAC;IAC7E,OAAO;QACN,IAAI,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;YAC7B,QAAQ,GAAG,SAAS,CAAC;YACrB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrE,CAAC;KACD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC7B,MAAkB,EAClB,OAA0C;IAE1C,OAAO;QACN,IAAI,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,KAAK,CAAC;QACd,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { ITelemetryProperties } from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred } from \"@fluidframework/core-utils\";\nimport { ITelemetryLoggerExt, PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IDeltasFetchResult, IStream, IStreamResult } from \"@fluidframework/driver-definitions\";\nimport { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from \"./network\";\nimport { logNetworkFailure } from \"./networkUtils\";\n// For now, this package is versioned and released in unison with the specific drivers\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\nimport { calculateMaxWaitTime } from \"./runWithRetry\";\n\n// We double this value in first try in when we calculate time to wait for in \"calculateMaxWaitTime\" function.\nconst MissingFetchDelayInMs = 50;\n\ntype WorkingState = \"working\" | \"done\" | \"canceled\";\n\n/**\n * Helper class to organize parallel fetching of data\n * It can be used to concurrently do many requests, while consuming\n * data in the right order. Take a look at UT for examples.\n * @param concurrency - level of concurrency\n * @param from - starting point of fetching data (inclusive)\n * @param to - ending point of fetching data. exclusive, or undefined if unknown\n * @param payloadSize - batch size\n * @param logger - logger to use\n * @param requestCallback - callback to request batches\n * @returns Queue that can be used to retrieve data\n * @internal\n */\nexport class ParallelRequests<T> {\n\tprivate latestRequested: number;\n\tprivate nextToDeliver: number;\n\tprivate readonly results = new Map<number, T[]>();\n\tprivate workingState: WorkingState = \"working\";\n\tprivate requestsInFlight = 0;\n\tprivate readonly endEvent = new Deferred<void>();\n\tprivate requests = 0;\n\tprivate readonly knewTo: boolean;\n\n\tprivate get working() {\n\t\treturn this.workingState === \"working\";\n\t}\n\tpublic get canceled() {\n\t\treturn this.workingState === \"canceled\";\n\t}\n\n\tconstructor(\n\t\tfrom: number,\n\t\tprivate to: number | undefined,\n\t\tprivate readonly payloadSize: number,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly requestCallback: (\n\t\t\trequest: number,\n\t\t\tfrom: number,\n\t\t\tto: number,\n\t\t\tstrongTo: boolean,\n\t\t\tprops: ITelemetryProperties,\n\t\t) => Promise<{ partial: boolean; cancel: boolean; payload: T[] }>,\n\t\tprivate readonly responseCallback: (payload: T[]) => void,\n\t) {\n\t\tthis.latestRequested = from;\n\t\tthis.nextToDeliver = from;\n\t\tthis.knewTo = to !== undefined;\n\t}\n\n\tpublic cancel() {\n\t\tif (this.working) {\n\t\t\tthis.workingState = \"canceled\";\n\t\t\tthis.endEvent.resolve();\n\t\t}\n\t}\n\n\tpublic async run(concurrency: number) {\n\t\tassert(concurrency > 0, 0x102 /* \"invalid level of concurrency\" */);\n\t\tassert(this.working, 0x103 /* \"trying to parallel run while not working\" */);\n\n\t\tlet c = concurrency;\n\t\twhile (c > 0) {\n\t\t\tc--;\n\t\t\tthis.addRequest();\n\t\t}\n\t\tthis.dispatch(); // will recalculate and trigger this.endEvent if needed\n\t\treturn this.endEvent.promise;\n\t}\n\n\tprivate done() {\n\t\t// We should satisfy request fully.\n\t\tassert(this.to !== undefined, 0x104 /* \"undefined end point for parallel fetch\" */);\n\t\tassert(\n\t\t\tthis.nextToDeliver >= this.to,\n\t\t\t0x105 /* \"unexpected end point for parallel fetch\" */,\n\t\t);\n\t\tif (this.working) {\n\t\t\tthis.workingState = \"done\";\n\t\t\tthis.endEvent.resolve();\n\t\t}\n\t}\n\n\tprivate fail(error) {\n\t\tif (this.working) {\n\t\t\tthis.workingState = \"done\";\n\t\t\tthis.endEvent.reject(error);\n\t\t}\n\t}\n\n\tprivate dispatch() {\n\t\twhile (this.working) {\n\t\t\tconst value = this.results.get(this.nextToDeliver);\n\t\t\tif (value === undefined) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.results.delete(this.nextToDeliver);\n\t\t\tassert(\n\t\t\t\tvalue.length <= this.payloadSize,\n\t\t\t\t0x1d9 /* \"addRequestCore() should break into smaller chunks\" */,\n\t\t\t);\n\t\t\tthis.nextToDeliver += value.length;\n\t\t\tthis.responseCallback(value);\n\t\t}\n\n\t\t// Account for cancellation - state might be not in consistent state on cancelling operation\n\t\tif (this.working) {\n\t\t\tif (this.requestsInFlight === 0) {\n\t\t\t\t// we should have dispatched everything, no matter whether we knew about the end or not.\n\t\t\t\t// see comment in addRequestCore() around throwing away chunk if it's above this.to\n\t\t\t\tassert(\n\t\t\t\t\tthis.results.size === 0,\n\t\t\t\t\t0x107 /* \"ending dispatch with remaining results to be sent\" */,\n\t\t\t\t);\n\t\t\t\tthis.done();\n\t\t\t} else if (this.to !== undefined && this.nextToDeliver >= this.to) {\n\t\t\t\t// Learned about the end and dispatched all the ops up to it.\n\t\t\t\t// Ignore all the in-flight requests above boundary - unblock caller sooner.\n\t\t\t\tassert(\n\t\t\t\t\t!this.knewTo,\n\t\t\t\t\t0x108 /* \"ending results dispatch but knew in advance about more requests\" */,\n\t\t\t\t);\n\t\t\t\tthis.done();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getNextChunk() {\n\t\tif (!this.working) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst from = this.latestRequested;\n\t\tif (this.to !== undefined) {\n\t\t\tif (this.to <= from) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\t// this.latestRequested\n\t\t// inclusive on the right side! Exclusive on the left.\n\t\tthis.latestRequested += this.payloadSize;\n\n\t\tif (this.to !== undefined) {\n\t\t\tthis.latestRequested = Math.min(this.to, this.latestRequested);\n\t\t}\n\n\t\tassert(from < this.latestRequested, 0x109 /* \"unexpected next chunk position\" */);\n\n\t\treturn { from, to: this.latestRequested };\n\t}\n\n\tprivate addRequest() {\n\t\tconst chunk = this.getNextChunk();\n\t\tif (chunk === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.addRequestCore(chunk.from, chunk.to).catch(this.fail.bind(this));\n\t}\n\n\tprivate async addRequestCore(fromArg: number, toArg: number) {\n\t\tassert(this.working, 0x10a /* \"cannot add parallel request while not working\" */);\n\n\t\tlet from = fromArg;\n\t\tlet to = toArg;\n\n\t\t// to & from are exclusive\n\t\tthis.requestsInFlight++;\n\t\twhile (this.working) {\n\t\t\tconst requestedLength = to - from;\n\t\t\tassert(requestedLength > 0, 0x10b /* \"invalid parallel request range\" */);\n\n\t\t\t// We should not be wasting time asking for something useless.\n\t\t\tif (this.to !== undefined) {\n\t\t\t\tassert(from < this.to, 0x10c /* \"invalid parallel request start point\" */);\n\t\t\t\tassert(to <= this.to, 0x10d /* \"invalid parallel request end point\" */);\n\t\t\t}\n\n\t\t\tthis.requests++;\n\n\t\t\tconst promise = this.requestCallback(\n\t\t\t\tthis.requests,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\tthis.to !== undefined,\n\t\t\t\t{},\n\t\t\t);\n\n\t\t\t// dispatch any prior received data\n\t\t\tthis.dispatch();\n\n\t\t\tconst { payload, cancel, partial } = await promise;\n\n\t\t\tif (cancel) {\n\t\t\t\tthis.cancel();\n\t\t\t}\n\n\t\t\tif (this.to !== undefined && from >= this.to) {\n\t\t\t\t// while we were waiting for response, we learned on what is the boundary\n\t\t\t\t// We can get here (with actual result!) if situation changed while this request was in\n\t\t\t\t// flight, i.e. the end was extended over what we learn in some other request\n\t\t\t\t// While it's useful not to throw this result, this is very corner cases and makes logic\n\t\t\t\t// (including consistency checks) much harder to write correctly.\n\t\t\t\t// So for now, we are throwing this result out the window.\n\t\t\t\tassert(\n\t\t\t\t\t!this.knewTo,\n\t\t\t\t\t0x10e /* \"should not throw result if we knew about boundary in advance\" */,\n\t\t\t\t);\n\t\t\t\t// Learn how often it happens and if it's too wasteful to throw these chunks.\n\t\t\t\t// If it pops into our view a lot, we would need to reconsider how we approach it.\n\t\t\t\t// Note that this is not visible to user other than potentially not hitting 100% of\n\t\t\t\t// what we can in perf domain.\n\t\t\t\tif (payload.length !== 0) {\n\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"ParallelRequests_GotExtra\",\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tto,\n\t\t\t\t\t\tend: this.to,\n\t\t\t\t\t\tlength: payload.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (this.working) {\n\t\t\t\tconst fromOrig = from;\n\t\t\t\tconst length = payload.length;\n\t\t\t\tlet fullChunk = requestedLength <= length; // we can possible get more than we asked.\n\n\t\t\t\tif (length !== 0) {\n\t\t\t\t\t// We can get more than we asked for!\n\t\t\t\t\t// This can screw up logic in dispatch!\n\t\t\t\t\t// So push only batch size, and keep the rest for later - if conditions are favorable, we\n\t\t\t\t\t// will be able to use it. If not (parallel request overlapping these ops), it's easier to\n\t\t\t\t\t// discard them and wait for another (overlapping) request to come in later.\n\t\t\t\t\tif (requestedLength < length) {\n\t\t\t\t\t\t// This is error in a sense that it's not expected and likely points bug in other layer.\n\t\t\t\t\t\t// This layer copes with this situation just fine.\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"ParallelRequests_Over\",\n\t\t\t\t\t\t\tfrom,\n\t\t\t\t\t\t\tto,\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst data = payload.splice(0, requestedLength);\n\t\t\t\t\tthis.results.set(from, data);\n\t\t\t\t\tfrom += data.length;\n\t\t\t\t} else {\n\t\t\t\t\t// 1. empty (partial) chunks should not be returned by various caching / adapter layers -\n\t\t\t\t\t// they should fall back to next layer. This might be important invariant to hold to ensure\n\t\t\t\t\t// that we are less likely have bugs where such layer would keep returning empty partial\n\t\t\t\t\t// result on each call.\n\t\t\t\t\t// 2. Current invariant is that callback does retries until it gets something,\n\t\t\t\t\t// with the goal of failing if zero data is retrieved in given amount of time.\n\t\t\t\t\t// This is very specific property of storage / ops, so this logic is not here, but given only\n\t\t\t\t\t// one user of this class, we assert that to catch issues earlier.\n\t\t\t\t\t// These invariant can be relaxed if needed.\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!partial,\n\t\t\t\t\t\t0x10f /* \"empty/partial chunks should not be returned by caching\" */,\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!this.knewTo,\n\t\t\t\t\t\t0x110 /* \"callback should retry until valid fetch before it learns new boundary\" */,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!partial && !fullChunk) {\n\t\t\t\t\tif (!this.knewTo) {\n\t\t\t\t\t\tif (this.to === undefined || this.to > from) {\n\t\t\t\t\t\t\t// The END\n\t\t\t\t\t\t\tthis.to = from;\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\t// We know that there are more items to be retrieved\n\t\t\t\t\t// Can we get partial chunk? Ideally storage indicates that's not a full chunk\n\t\t\t\t\t// Note that it's possible that not all ops hit storage yet.\n\t\t\t\t\t// We will come back to request more, and if we can't get any more ops soon, it's\n\t\t\t\t\t// catastrophic failure (see comment above on responsibility of callback to return something)\n\t\t\t\t\t// This layer will just keep trying until it gets full set.\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"ParallelRequests_Partial\",\n\t\t\t\t\t\tfrom: fromOrig,\n\t\t\t\t\t\tto,\n\t\t\t\t\t\tlength,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (to === this.latestRequested) {\n\t\t\t\t\t// we can go after full chunk at the end if we received partial chunk, or more than asked\n\t\t\t\t\t// Also if we got more than we asked to, we can actually use those ops!\n\t\t\t\t\twhile (payload.length !== 0) {\n\t\t\t\t\t\tconst data = payload.splice(0, requestedLength);\n\t\t\t\t\t\tthis.results.set(from, data);\n\t\t\t\t\t\tfrom += data.length;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.latestRequested = from;\n\t\t\t\t\tfullChunk = true;\n\t\t\t\t}\n\n\t\t\t\tif (fullChunk) {\n\t\t\t\t\tconst chunk = this.getNextChunk();\n\t\t\t\t\tif (chunk === undefined) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tfrom = chunk.from;\n\t\t\t\t\tto = chunk.to;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.requestsInFlight--;\n\t\tthis.dispatch();\n\t}\n}\n\n/**\n * Helper queue class to allow async push / pull\n * It's essentially a pipe allowing multiple writers, and single reader\n * @internal\n */\nexport class Queue<T> implements IStream<T> {\n\tprivate readonly queue: Promise<IStreamResult<T>>[] = [];\n\tprivate deferred: Deferred<IStreamResult<T>> | undefined;\n\tprivate done = false;\n\n\tpublic pushValue(value: T) {\n\t\tthis.pushCore(Promise.resolve({ done: false, value }));\n\t}\n\n\tpublic pushError(error: any) {\n\t\tthis.pushCore(Promise.reject(error));\n\t\tthis.done = true;\n\t}\n\n\tpublic pushDone() {\n\t\tthis.pushCore(Promise.resolve({ done: true }));\n\t\tthis.done = true;\n\t}\n\n\tprotected pushCore(value: Promise<IStreamResult<T>>) {\n\t\tassert(!this.done, 0x112 /* \"cannot push onto queue if done\" */);\n\t\tif (this.deferred) {\n\t\t\tassert(this.queue.length === 0, 0x113 /* \"deferred queue should be empty\" */);\n\t\t\tthis.deferred.resolve(value);\n\t\t\tthis.deferred = undefined;\n\t\t} else {\n\t\t\tthis.queue.push(value);\n\t\t}\n\t}\n\n\tpublic async read(): Promise<IStreamResult<T>> {\n\t\tassert(this.deferred === undefined, 0x114 /* \"cannot pop if deferred\" */);\n\t\tconst value = this.queue.shift();\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t\tassert(!this.done, 0x115 /* \"queue should not be done during pop\" */);\n\t\tthis.deferred = new Deferred<IStreamResult<T>>();\n\t\treturn this.deferred.promise;\n\t}\n}\n\nconst waitForOnline = async (): Promise<void> => {\n\t// Only wait if we have a strong signal that we're offline - otherwise assume we're online.\n\tif (globalThis.navigator?.onLine === false && globalThis.addEventListener !== undefined) {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tconst resolveAndRemoveListener = () => {\n\t\t\t\tresolve();\n\t\t\t\tglobalThis.removeEventListener(\"online\", resolveAndRemoveListener);\n\t\t\t};\n\t\t\tglobalThis.addEventListener(\"online\", resolveAndRemoveListener);\n\t\t});\n\t}\n};\n\n/**\n * Retrieve single batch of ops\n * @param request - request index\n * @param from - inclusive boundary\n * @param to - exclusive boundary\n * @param telemetryEvent - telemetry event used to track consecutive batch of requests\n * @param strongTo - tells if ops in range from...to have to be there and have to be retrieved.\n * If false, returning less ops would mean we reached end of file.\n * @param logger - logger object to use to log progress & errors\n * @param signal - cancelation signal\n * @param scenarioName - reason for fetching ops\n * @returns An object with resulting ops and cancellation / partial result flags\n */\nasync function getSingleOpBatch(\n\tget: (telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>,\n\tprops: ITelemetryProperties,\n\tstrongTo: boolean,\n\tlogger: ITelemetryLoggerExt,\n\tsignal?: AbortSignal,\n\tscenarioName?: string,\n): Promise<{ partial: boolean; cancel: boolean; payload: ISequencedDocumentMessage[] }> {\n\tlet lastSuccessTime: number | undefined;\n\tlet totalRetryAfterTime = 0;\n\tlet telemetryEvent: PerformanceEvent | undefined;\n\tlet retry: number = 0;\n\tconst nothing = { partial: false, cancel: true, payload: [] };\n\tlet waitStartTime: number = 0;\n\tlet waitTime = MissingFetchDelayInMs;\n\n\twhile (signal?.aborted !== true) {\n\t\tretry++;\n\t\tlet lastError: unknown;\n\t\tconst startTime = performance.now();\n\n\t\ttry {\n\t\t\t// Issue async request for deltas\n\t\t\tconst { messages, partialResult } = await get(\n\t\t\t\t{ ...props, retry } /* telemetry props */,\n\t\t\t);\n\n\t\t\t// If we got messages back, return them. Return regardless of whether we got messages back if we didn't\n\t\t\t// specify a \"to\", since we don't have an expectation of how many to receive.\n\t\t\tif (messages.length !== 0 || !strongTo) {\n\t\t\t\t// Report this event if we waited to fetch ops due to being offline or throttling.\n\t\t\t\ttelemetryEvent?.end({\n\t\t\t\t\tduration: totalRetryAfterTime,\n\t\t\t\t\t...props,\n\t\t\t\t\treason: scenarioName,\n\t\t\t\t});\n\t\t\t\treturn { payload: messages, cancel: false, partial: partialResult };\n\t\t\t}\n\n\t\t\t// Otherwise, the storage gave us back an empty set of ops but we were expecting a non-empty set.\n\n\t\t\tif (lastSuccessTime === undefined) {\n\t\t\t\t// Take timestamp of the first time server responded successfully, even though it wasn't with the ops we asked for.\n\t\t\t\t// If we keep getting empty responses we'll eventually fail out below.\n\t\t\t\tlastSuccessTime = performance.now();\n\t\t\t} else if (performance.now() - lastSuccessTime > 30000) {\n\t\t\t\t// If we are connected and receiving proper responses from server, but can't get any ops back,\n\t\t\t\t// then give up after some time. This likely indicates the issue with ordering service not flushing\n\t\t\t\t// ops to storage quick enough, and possibly waiting for summaries, while summarizer can't get\n\t\t\t\t// current as it can't get ops.\n\t\t\t\tthrow createGenericNetworkError(\n\t\t\t\t\t// pre-0.58 error message: failedToRetrieveOpsFromStorage:TooManyRetries\n\t\t\t\t\t\"Failed to retrieve ops from storage (Too Many Retries)\",\n\t\t\t\t\t{ canRetry: false },\n\t\t\t\t\t{\n\t\t\t\t\t\tretry,\n\t\t\t\t\t\tdriverVersion,\n\t\t\t\t\t\t...props,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlastError = error;\n\t\t\tconst canRetry = canRetryOnError(error);\n\n\t\t\tconst retryAfter = getRetryDelayFromError(error);\n\n\t\t\t// This will log to error table only if the error is non-retryable\n\t\t\tlogNetworkFailure(\n\t\t\t\tlogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"GetDeltas_Error\",\n\t\t\t\t\t...props,\n\t\t\t\t\tretry,\n\t\t\t\t\tduration: performance.now() - startTime,\n\t\t\t\t\tretryAfter,\n\t\t\t\t\treason: scenarioName,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\n\t\t\tif (!canRetry) {\n\t\t\t\t// It's game over scenario.\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tif (telemetryEvent === undefined) {\n\t\t\twaitStartTime = performance.now();\n\t\t\ttelemetryEvent = PerformanceEvent.start(logger, {\n\t\t\t\teventName: \"GetDeltasWaitTime\",\n\t\t\t});\n\t\t}\n\n\t\twaitTime = calculateMaxWaitTime(waitTime, lastError);\n\n\t\t// If we get here something has gone wrong - either got an unexpected empty set of messages back or a real error.\n\t\t// Either way we will wait a little bit before retrying.\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tsetTimeout(resolve, waitTime);\n\t\t});\n\n\t\t// If we believe we're offline, we assume there's no point in trying until we at least think we're online.\n\t\t// NOTE: This isn't strictly true for drivers that don't require network (e.g. local driver). Really this logic\n\t\t// should probably live in the driver.\n\t\tawait waitForOnline();\n\t\ttotalRetryAfterTime += performance.now() - waitStartTime;\n\t}\n\n\treturn nothing;\n}\n\n/**\n * Request ops from storage\n * @param get - Getter callback to get individual batches\n * @param concurrency - Number of concurrent requests to make\n * @param fromTotal - starting sequence number to fetch (inclusive)\n * @param toTotal - max (exclusive) sequence number to fetch\n * @param payloadSize - Payload size\n * @param logger - Logger to log progress and errors\n * @param signal - Cancelation signal\n * @param scenarioName - Reason for fetching ops\n * @returns Messages fetched\n * @internal\n */\nexport function requestOps(\n\tget: (\n\t\tfrom: number,\n\t\tto: number,\n\t\ttelemetryProps: ITelemetryProperties,\n\t) => Promise<IDeltasFetchResult>,\n\tconcurrency: number,\n\tfromTotal: number,\n\ttoTotal: number | undefined,\n\tpayloadSize: number,\n\tlogger: ITelemetryLoggerExt,\n\tsignal?: AbortSignal,\n\tscenarioName?: string,\n): IStream<ISequencedDocumentMessage[]> {\n\tlet requests = 0;\n\tlet lastFetch: number | undefined;\n\tlet length = 0;\n\tconst queue = new Queue<ISequencedDocumentMessage[]>();\n\n\tconst propsTotal: ITelemetryProperties = {\n\t\tfromTotal,\n\t\ttoTotal,\n\t};\n\n\tconst telemetryEvent = PerformanceEvent.start(logger, {\n\t\teventName: \"GetDeltas\",\n\t\t...propsTotal,\n\t\treason: scenarioName,\n\t});\n\n\tconst manager = new ParallelRequests<ISequencedDocumentMessage>(\n\t\tfromTotal,\n\t\ttoTotal,\n\t\tpayloadSize,\n\t\tlogger,\n\t\tasync (\n\t\t\trequest: number,\n\t\t\tfrom: number,\n\t\t\tto: number,\n\t\t\tstrongTo: boolean,\n\t\t\tpropsPerRequest: ITelemetryProperties,\n\t\t) => {\n\t\t\trequests++;\n\t\t\treturn getSingleOpBatch(\n\t\t\t\tasync (propsAll) => get(from, to, propsAll),\n\t\t\t\t{ request, from, to, ...propsTotal, ...propsPerRequest },\n\t\t\t\tstrongTo,\n\t\t\t\tlogger,\n\t\t\t\tsignal,\n\t\t\t\tscenarioName,\n\t\t\t);\n\t\t},\n\t\t(deltas: ISequencedDocumentMessage[]) => {\n\t\t\t// Assert continuing and right start.\n\t\t\tif (lastFetch === undefined) {\n\t\t\t\tassert(deltas[0].sequenceNumber === fromTotal, 0x26d /* \"wrong start\" */);\n\t\t\t} else {\n\t\t\t\tassert(deltas[0].sequenceNumber === lastFetch + 1, 0x26e /* \"wrong start\" */);\n\t\t\t}\n\t\t\tlastFetch = deltas[deltas.length - 1].sequenceNumber;\n\t\t\tassert(\n\t\t\t\tlastFetch - deltas[0].sequenceNumber + 1 === deltas.length,\n\t\t\t\t0x26f /* \"continuous and no duplicates\" */,\n\t\t\t);\n\t\t\tlength += deltas.length;\n\t\t\tqueue.pushValue(deltas);\n\t\t},\n\t);\n\n\t// Implement faster cancellation. getSingleOpBatch() checks signal, but only in between\n\t// waits (up to 10 seconds) and fetches (can take infinite amount of time).\n\t// While every such case should be improved and take into account signal (and thus cancel immediately),\n\t// it is beneficial to have catch-all\n\tconst listener = (event: Event) => {\n\t\tmanager.cancel();\n\t};\n\tif (signal !== undefined) {\n\t\tsignal.addEventListener(\"abort\", listener);\n\t}\n\n\tmanager\n\t\t.run(concurrency)\n\t\t.finally(() => {\n\t\t\tif (signal !== undefined) {\n\t\t\t\tsignal.removeEventListener(\"abort\", listener);\n\t\t\t}\n\t\t})\n\t\t.then(() => {\n\t\t\tconst props = {\n\t\t\t\tlastFetch,\n\t\t\t\tlength,\n\t\t\t\trequests,\n\t\t\t};\n\t\t\tif (manager.canceled) {\n\t\t\t\ttelemetryEvent.cancel({ ...props, error: \"ops request cancelled by client\" });\n\t\t\t} else {\n\t\t\t\tassert(\n\t\t\t\t\ttoTotal === undefined || (lastFetch !== undefined && lastFetch >= toTotal - 1),\n\t\t\t\t\t0x270 /* \"All requested ops fetched\" */,\n\t\t\t\t);\n\t\t\t\ttelemetryEvent.end(props);\n\t\t\t}\n\t\t\tqueue.pushDone();\n\t\t})\n\t\t.catch((error) => {\n\t\t\ttelemetryEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\tlastFetch,\n\t\t\t\t\tlength,\n\t\t\t\t\trequests,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\t\t\tqueue.pushError(error);\n\t\t});\n\n\treturn queue;\n}\n\n/**\n * @internal\n */\nexport const emptyMessageStream: IStream<ISequencedDocumentMessage[]> = {\n\tread: async () => {\n\t\treturn { done: true };\n\t},\n};\n\n/**\n * @internal\n */\nexport function streamFromMessages(\n\tmessagesArg: Promise<ISequencedDocumentMessage[]>,\n): IStream<ISequencedDocumentMessage[]> {\n\tlet messages: Promise<ISequencedDocumentMessage[]> | undefined = messagesArg;\n\treturn {\n\t\tread: async () => {\n\t\t\tif (messages === undefined) {\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t\tconst value = await messages;\n\t\t\tmessages = undefined;\n\t\t\treturn value.length === 0 ? { done: true } : { done: false, value };\n\t\t},\n\t};\n}\n\n/**\n * @internal\n */\nexport function streamObserver<T>(\n\tstream: IStream<T>,\n\thandler: (value: IStreamResult<T>) => void,\n): IStream<T> {\n\treturn {\n\t\tread: async () => {\n\t\t\tconst value = await stream.read();\n\t\t\thandler(value);\n\t\t\treturn value;\n\t\t},\n\t};\n}\n"]}
@@ -1,17 +1,15 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
1
  import { LoaderCachingPolicy } from "@fluidframework/driver-definitions";
6
2
  import { ISnapshotTree, IVersion } from "@fluidframework/protocol-definitions";
7
- import { DocumentStorageServiceProxy } from "./documentStorageServiceProxy";
3
+ import { DocumentStorageServiceProxy } from "./documentStorageServiceProxy.mjs";
4
+ /**
5
+ * @internal
6
+ */
8
7
  export declare class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {
9
8
  private readonly prefetchCache;
10
9
  private prefetchEnabled;
11
10
  get policies(): {
12
11
  caching: LoaderCachingPolicy;
13
- minBlobSize?: number | undefined;
14
- maximumCacheDurationMs?: number | undefined;
12
+ maximumCacheDurationMs?: 432000000 | undefined;
15
13
  } | undefined;
16
14
  getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null>;
17
15
  readBlob(blobId: string): Promise<ArrayBufferLike>;
@@ -20,4 +18,4 @@ export declare class PrefetchDocumentStorageService extends DocumentStorageServi
20
18
  private prefetchTree;
21
19
  private prefetchTreeCore;
22
20
  }
23
- //# sourceMappingURL=prefetchDocumentStorageService.d.ts.map
21
+ //# sourceMappingURL=prefetchDocumentStorageService.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetchDocumentStorageService.d.mts","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.ts"],"names":[],"mappings":"OAIO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC;OACjE,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,sCAAsC;OACvE,EAAE,2BAA2B,EAAE;AAGtC;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,2BAA2B;IAE9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;IAC7E,OAAO,CAAC,eAAe,CAAQ;IAE/B,IAAW,QAAQ;;;kBAKlB;IAEY,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAclE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAGxD,YAAY;YAKL,UAAU;IAqBxB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,gBAAgB;CAmBxB"}
@@ -1,10 +1,9 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
1
  import { LoaderCachingPolicy } from "@fluidframework/driver-definitions";
6
- import { DocumentStorageServiceProxy } from "./documentStorageServiceProxy";
7
- import { canRetryOnError } from "./network";
2
+ import { DocumentStorageServiceProxy } from "./documentStorageServiceProxy.mjs";
3
+ import { canRetryOnError } from "./network.mjs";
4
+ /**
5
+ * @internal
6
+ */
8
7
  export class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {
9
8
  constructor() {
10
9
  super(...arguments);
@@ -15,7 +14,7 @@ export class PrefetchDocumentStorageService extends DocumentStorageServiceProxy
15
14
  get policies() {
16
15
  const policies = this.internalStorageService.policies;
17
16
  if (policies) {
18
- return Object.assign(Object.assign({}, policies), { caching: LoaderCachingPolicy.NoCaching });
17
+ return { ...policies, caching: LoaderCachingPolicy.NoCaching };
19
18
  }
20
19
  }
21
20
  async getSnapshotTree(version) {
@@ -83,4 +82,4 @@ export class PrefetchDocumentStorageService extends DocumentStorageServiceProxy
83
82
  }
84
83
  }
85
84
  }
86
- //# sourceMappingURL=prefetchDocumentStorageService.js.map
85
+ //# sourceMappingURL=prefetchDocumentStorageService.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetchDocumentStorageService.mjs","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.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 */\nimport { LoaderCachingPolicy } from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree, IVersion } from \"@fluidframework/protocol-definitions\";\nimport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nimport { canRetryOnError } from \"./network\";\n\n/**\n * @internal\n */\nexport class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {\n\t// BlobId -> blob prefetchCache cache\n\tprivate readonly prefetchCache = new Map<string, Promise<ArrayBufferLike>>();\n\tprivate prefetchEnabled = true;\n\n\tpublic get policies() {\n\t\tconst policies = this.internalStorageService.policies;\n\t\tif (policies) {\n\t\t\treturn { ...policies, caching: LoaderCachingPolicy.NoCaching };\n\t\t}\n\t}\n\n\tpublic async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n\t\tconst p = this.internalStorageService.getSnapshotTree(version);\n\t\tif (this.prefetchEnabled) {\n\t\t\t// We don't care if the prefetch succeeds\n\t\t\tvoid p.then((tree: ISnapshotTree | null | undefined) => {\n\t\t\t\tif (tree === null || tree === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.prefetchTree(tree);\n\t\t\t});\n\t\t}\n\t\treturn p;\n\t}\n\n\tpublic async readBlob(blobId: string): Promise<ArrayBufferLike> {\n\t\treturn this.cachedRead(blobId);\n\t}\n\tpublic stopPrefetch() {\n\t\tthis.prefetchEnabled = false;\n\t\tthis.prefetchCache.clear();\n\t}\n\n\tprivate async cachedRead(blobId: string): Promise<ArrayBufferLike> {\n\t\tif (this.prefetchEnabled) {\n\t\t\tconst prefetchedBlobP = this.prefetchCache.get(blobId);\n\t\t\tif (prefetchedBlobP !== undefined) {\n\t\t\t\treturn prefetchedBlobP;\n\t\t\t}\n\t\t\tconst prefetchedBlobPFromStorage = this.internalStorageService.readBlob(blobId);\n\t\t\tthis.prefetchCache.set(\n\t\t\t\tblobId,\n\t\t\t\tprefetchedBlobPFromStorage.catch((error) => {\n\t\t\t\t\tif (canRetryOnError(error)) {\n\t\t\t\t\t\tthis.prefetchCache.delete(blobId);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn prefetchedBlobPFromStorage;\n\t\t}\n\t\treturn this.internalStorageService.readBlob(blobId);\n\t}\n\n\tprivate prefetchTree(tree: ISnapshotTree) {\n\t\tconst secondary: string[] = [];\n\t\tthis.prefetchTreeCore(tree, secondary);\n\n\t\tfor (const blob of secondary) {\n\t\t\t// We don't care if the prefetch succeeds\n\t\t\tvoid this.cachedRead(blob);\n\t\t}\n\t}\n\n\tprivate prefetchTreeCore(tree: ISnapshotTree, secondary: string[]) {\n\t\tfor (const blobKey of Object.keys(tree.blobs)) {\n\t\t\tconst blob = tree.blobs[blobKey];\n\t\t\tif (blobKey.startsWith(\".\") || blobKey === \"header\" || blobKey.startsWith(\"quorum\")) {\n\t\t\t\tif (blob !== null) {\n\t\t\t\t\t// We don't care if the prefetch succeeds\n\t\t\t\t\tvoid this.cachedRead(blob);\n\t\t\t\t}\n\t\t\t} else if (!blobKey.startsWith(\"deltas\")) {\n\t\t\t\tif (blob !== null) {\n\t\t\t\t\tsecondary.push(blob);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const subTree of Object.keys(tree.trees)) {\n\t\t\tthis.prefetchTreeCore(tree.trees[subTree], secondary);\n\t\t}\n\t}\n}\n"]}
@@ -2,6 +2,9 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /**
6
+ * @alpha
7
+ */
5
8
  export declare class RateLimiter {
6
9
  private maxRequests;
7
10
  private readonly tasks;
@@ -11,4 +14,4 @@ export declare class RateLimiter {
11
14
  protected acquire(): Promise<void>;
12
15
  schedule<T>(work: () => Promise<T>): Promise<T>;
13
16
  }
14
- //# sourceMappingURL=rateLimiter.d.ts.map
17
+ //# sourceMappingURL=rateLimiter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimiter.d.mts","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,qBAAa,WAAW;IAEX,OAAO,CAAC,WAAW;IAD/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;gBACxB,WAAW,EAAE,MAAM;IAIvC,IAAW,eAAe,IAAI,MAAM,CAEnC;IAID,SAAS,CAAC,QAAQ,CAAC,OAAO,aAMxB;cAEc,OAAO;IAWV,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;CAI/C"}
@@ -2,7 +2,10 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { assert } from "@fluidframework/common-utils";
5
+ import { assert } from "@fluidframework/core-utils";
6
+ /**
7
+ * @alpha
8
+ */
6
9
  export class RateLimiter {
7
10
  constructor(maxRequests) {
8
11
  this.maxRequests = maxRequests;
@@ -35,4 +38,4 @@ export class RateLimiter {
35
38
  return work().finally(this.release);
36
39
  }
37
40
  }
38
- //# sourceMappingURL=rateLimiter.js.map
41
+ //# sourceMappingURL=rateLimiter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimiter.mjs","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,MAAM,EAAE,MAAM,4BAA4B;AAEnD;;GAEG;AACH,MAAM,OAAO,WAAW;IAEvB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QADtB,UAAK,GAAmB,EAAE,CAAC;QAS5C,8CAA8C;QAC9C,0EAA0E;QACvD,YAAO,GAAG,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,EAAE;gBACvB,OAAO,IAAI,EAAE,CAAC;aACd;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC,CAAC;QAfD,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1F,CAAC;IAED,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAYS,KAAK,CAAC,OAAO;QACtB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;SACP;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,IAAsB;QAC9C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\n\n/**\n * @alpha\n */\nexport class RateLimiter {\n\tprivate readonly tasks: (() => void)[] = [];\n\tconstructor(private maxRequests: number) {\n\t\tassert(maxRequests > 0, 0x0ae /* \"Tried to create rate limiter with 0 max requests!\" */);\n\t}\n\n\tpublic get waitQueueLength(): number {\n\t\treturn this.tasks.length;\n\t}\n\n\t// Run when one of the tasks finished running.\n\t// Release next task if we have one, or allow more tasks to run in future.\n\tprotected readonly release = () => {\n\t\tconst task = this.tasks.shift();\n\t\tif (task !== undefined) {\n\t\t\treturn task();\n\t\t}\n\t\tthis.maxRequests++;\n\t};\n\n\tprotected async acquire() {\n\t\tif (this.maxRequests > 0) {\n\t\t\tthis.maxRequests--;\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.tasks.push(resolve);\n\t\t});\n\t}\n\n\tpublic async schedule<T>(work: () => Promise<T>) {\n\t\tawait this.acquire();\n\t\treturn work().finally(this.release);\n\t}\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IDocumentStorageService } from "@fluidframework/driver-definitions";
6
+ /**
7
+ * Read a blob from {@link @fluidframework/driver-definitions#IDocumentStorageService} and
8
+ * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse | JSON.parse}
9
+ * it into object of type `T`.
10
+ *
11
+ * @param storage - The `DocumentStorageService` to read from.
12
+ * @param id - The ID of the blob to read and parse.
13
+ *
14
+ * @typeParam T - Output type matching JSON format of inpyt blob data.
15
+ *
16
+ * @returns The object that we decoded and parsed via `JSON.parse`.
17
+ * @internal
18
+ */
19
+ export declare function readAndParse<T>(storage: Pick<IDocumentStorageService, "readBlob">, id: string): Promise<T>;
20
+ //# sourceMappingURL=readAndParse.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAndParse.d.mts","sourceRoot":"","sources":["../src/readAndParse.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAGI,EAAE,uBAAuB,EAAE,MAAM,oCAAoC;AAE5E;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,CAAC,EACnC,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,EAClD,EAAE,EAAE,MAAM,GACR,OAAO,CAAC,CAAC,CAAC,CAIZ"}