@fluidframework/container-runtime 2.0.0-dev.5.2.0.169897 → 2.0.0-dev.6.4.0.191258

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 (561) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/README.md +4 -3
  3. package/dist/batchTracker.d.ts +3 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +6 -5
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +15 -18
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +212 -171
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +33 -17
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +172 -35
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +722 -425
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.d.ts.map +1 -1
  19. package/dist/dataStore.js +15 -7
  20. package/dist/dataStore.js.map +1 -1
  21. package/dist/dataStoreContext.d.ts +4 -4
  22. package/dist/dataStoreContext.d.ts.map +1 -1
  23. package/dist/dataStoreContext.js +87 -90
  24. package/dist/dataStoreContext.js.map +1 -1
  25. package/dist/dataStoreContexts.d.ts +1 -1
  26. package/dist/dataStoreContexts.d.ts.map +1 -1
  27. package/dist/dataStoreContexts.js +10 -10
  28. package/dist/dataStoreContexts.js.map +1 -1
  29. package/dist/dataStoreRegistry.js +2 -2
  30. package/dist/dataStoreRegistry.js.map +1 -1
  31. package/dist/dataStores.d.ts +23 -7
  32. package/dist/dataStores.d.ts.map +1 -1
  33. package/dist/dataStores.js +125 -82
  34. package/dist/dataStores.js.map +1 -1
  35. package/dist/deltaManagerProxyBase.d.ts +35 -0
  36. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  37. package/dist/deltaManagerProxyBase.js +77 -0
  38. package/dist/deltaManagerProxyBase.js.map +1 -0
  39. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  40. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  41. package/dist/deltaManagerSummarizerProxy.js +4 -2
  42. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +10 -10
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/error.d.ts +14 -0
  47. package/dist/error.d.ts.map +1 -0
  48. package/dist/error.js +21 -0
  49. package/dist/error.js.map +1 -0
  50. package/dist/gc/garbageCollection.d.ts +10 -9
  51. package/dist/gc/garbageCollection.d.ts.map +1 -1
  52. package/dist/gc/garbageCollection.js +65 -56
  53. package/dist/gc/garbageCollection.js.map +1 -1
  54. package/dist/gc/gcConfigs.d.ts.map +1 -1
  55. package/dist/gc/gcConfigs.js +18 -14
  56. package/dist/gc/gcConfigs.js.map +1 -1
  57. package/dist/gc/gcDefinitions.d.ts +17 -5
  58. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  59. package/dist/gc/gcDefinitions.js +14 -15
  60. package/dist/gc/gcDefinitions.js.map +1 -1
  61. package/dist/gc/gcHelpers.d.ts +0 -8
  62. package/dist/gc/gcHelpers.d.ts.map +1 -1
  63. package/dist/gc/gcHelpers.js +11 -24
  64. package/dist/gc/gcHelpers.js.map +1 -1
  65. package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
  66. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  67. package/dist/gc/gcSummaryStateTracker.js +19 -58
  68. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  69. package/dist/gc/gcTelemetry.d.ts +1 -1
  70. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  71. package/dist/gc/gcTelemetry.js +45 -35
  72. package/dist/gc/gcTelemetry.js.map +1 -1
  73. package/dist/gc/gcUnreferencedStateTracker.js +4 -4
  74. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  75. package/dist/gc/index.d.ts +2 -2
  76. package/dist/gc/index.d.ts.map +1 -1
  77. package/dist/gc/index.js +3 -5
  78. package/dist/gc/index.js.map +1 -1
  79. package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
  80. package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  81. package/dist/id-compressor/appendOnlySortedMap.js +26 -68
  82. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  83. package/dist/id-compressor/finalSpace.d.ts +29 -0
  84. package/dist/id-compressor/finalSpace.d.ts.map +1 -0
  85. package/dist/id-compressor/finalSpace.js +62 -0
  86. package/dist/id-compressor/finalSpace.js.map +1 -0
  87. package/dist/id-compressor/idCompressor.d.ts +25 -250
  88. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  89. package/dist/id-compressor/idCompressor.js +390 -1153
  90. package/dist/id-compressor/idCompressor.js.map +1 -1
  91. package/dist/id-compressor/identifiers.d.ts +32 -0
  92. package/dist/id-compressor/identifiers.d.ts.map +1 -0
  93. package/dist/id-compressor/identifiers.js +15 -0
  94. package/dist/id-compressor/identifiers.js.map +1 -0
  95. package/dist/id-compressor/index.d.ts +5 -6
  96. package/dist/id-compressor/index.d.ts.map +1 -1
  97. package/dist/id-compressor/index.js +20 -26
  98. package/dist/id-compressor/index.js.map +1 -1
  99. package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
  100. package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
  101. package/dist/id-compressor/persistanceUtilities.js +43 -0
  102. package/dist/id-compressor/persistanceUtilities.js.map +1 -0
  103. package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  104. package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  105. package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
  106. package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  107. package/dist/id-compressor/sessions.d.ts +115 -0
  108. package/dist/id-compressor/sessions.d.ts.map +1 -0
  109. package/dist/id-compressor/sessions.js +305 -0
  110. package/dist/id-compressor/sessions.js.map +1 -0
  111. package/dist/id-compressor/utilities.d.ts +49 -0
  112. package/dist/id-compressor/utilities.d.ts.map +1 -0
  113. package/dist/id-compressor/utilities.js +166 -0
  114. package/dist/id-compressor/utilities.js.map +1 -0
  115. package/dist/index.d.ts +3 -3
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +6 -4
  118. package/dist/index.js.map +1 -1
  119. package/dist/metadata.d.ts +18 -0
  120. package/dist/metadata.d.ts.map +1 -0
  121. package/dist/metadata.js +7 -0
  122. package/dist/metadata.js.map +1 -0
  123. package/dist/opLifecycle/batchManager.d.ts +2 -1
  124. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  125. package/dist/opLifecycle/batchManager.js +15 -7
  126. package/dist/opLifecycle/batchManager.js.map +1 -1
  127. package/dist/opLifecycle/definitions.d.ts +11 -0
  128. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  129. package/dist/opLifecycle/definitions.js.map +1 -1
  130. package/dist/opLifecycle/index.d.ts +1 -1
  131. package/dist/opLifecycle/index.d.ts.map +1 -1
  132. package/dist/opLifecycle/index.js +2 -1
  133. package/dist/opLifecycle/index.js.map +1 -1
  134. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  135. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  136. package/dist/opLifecycle/opCompressor.js +12 -7
  137. package/dist/opLifecycle/opCompressor.js.map +1 -1
  138. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  139. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  140. package/dist/opLifecycle/opDecompressor.js +30 -21
  141. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  142. package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
  143. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  144. package/dist/opLifecycle/opGroupingManager.js +19 -13
  145. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  146. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  147. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  148. package/dist/opLifecycle/opSplitter.js +24 -19
  149. package/dist/opLifecycle/opSplitter.js.map +1 -1
  150. package/dist/opLifecycle/outbox.d.ts +39 -6
  151. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  152. package/dist/opLifecycle/outbox.js +138 -61
  153. package/dist/opLifecycle/outbox.js.map +1 -1
  154. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  155. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  156. package/dist/opLifecycle/remoteMessageProcessor.js +22 -8
  157. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  158. package/dist/opProperties.js +1 -2
  159. package/dist/opProperties.js.map +1 -1
  160. package/dist/packageVersion.d.ts +1 -1
  161. package/dist/packageVersion.js +1 -1
  162. package/dist/packageVersion.js.map +1 -1
  163. package/dist/pendingStateManager.d.ts +25 -10
  164. package/dist/pendingStateManager.d.ts.map +1 -1
  165. package/dist/pendingStateManager.js +101 -64
  166. package/dist/pendingStateManager.js.map +1 -1
  167. package/dist/scheduleManager.d.ts.map +1 -1
  168. package/dist/scheduleManager.js +43 -33
  169. package/dist/scheduleManager.js.map +1 -1
  170. package/dist/summary/index.d.ts +4 -4
  171. package/dist/summary/index.d.ts.map +1 -1
  172. package/dist/summary/index.js +3 -1
  173. package/dist/summary/index.js.map +1 -1
  174. package/dist/summary/orderedClientElection.d.ts +3 -3
  175. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  176. package/dist/summary/orderedClientElection.js +26 -27
  177. package/dist/summary/orderedClientElection.js.map +1 -1
  178. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  179. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  180. package/dist/summary/runningSummarizer.d.ts +31 -10
  181. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  182. package/dist/summary/runningSummarizer.js +271 -139
  183. package/dist/summary/runningSummarizer.js.map +1 -1
  184. package/dist/summary/summarizer.d.ts +8 -7
  185. package/dist/summary/summarizer.d.ts.map +1 -1
  186. package/dist/summary/summarizer.js +79 -78
  187. package/dist/summary/summarizer.js.map +1 -1
  188. package/dist/summary/summarizerClientElection.d.ts +2 -2
  189. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  190. package/dist/summary/summarizerClientElection.js +7 -11
  191. package/dist/summary/summarizerClientElection.js.map +1 -1
  192. package/dist/summary/summarizerHeuristics.js +10 -14
  193. package/dist/summary/summarizerHeuristics.js.map +1 -1
  194. package/dist/summary/summarizerNode/index.d.ts +1 -1
  195. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  196. package/dist/summary/summarizerNode/index.js.map +1 -1
  197. package/dist/summary/summarizerNode/summarizerNode.d.ts +40 -23
  198. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  199. package/dist/summary/summarizerNode/summarizerNode.js +144 -149
  200. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  201. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
  202. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  203. package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  204. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  205. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
  206. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  207. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +74 -123
  208. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  209. package/dist/summary/summarizerTypes.d.ts +44 -24
  210. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  211. package/dist/summary/summarizerTypes.js.map +1 -1
  212. package/dist/summary/summaryCollection.d.ts +2 -2
  213. package/dist/summary/summaryCollection.d.ts.map +1 -1
  214. package/dist/summary/summaryCollection.js +16 -13
  215. package/dist/summary/summaryCollection.js.map +1 -1
  216. package/dist/summary/summaryFormat.d.ts +4 -0
  217. package/dist/summary/summaryFormat.d.ts.map +1 -1
  218. package/dist/summary/summaryFormat.js +8 -5
  219. package/dist/summary/summaryFormat.js.map +1 -1
  220. package/dist/summary/summaryGenerator.d.ts +21 -6
  221. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  222. package/dist/summary/summaryGenerator.js +117 -54
  223. package/dist/summary/summaryGenerator.js.map +1 -1
  224. package/dist/summary/summaryManager.d.ts +8 -7
  225. package/dist/summary/summaryManager.d.ts.map +1 -1
  226. package/dist/summary/summaryManager.js +38 -28
  227. package/dist/summary/summaryManager.js.map +1 -1
  228. package/lib/batchTracker.d.ts +3 -2
  229. package/lib/batchTracker.d.ts.map +1 -1
  230. package/lib/batchTracker.js +5 -4
  231. package/lib/batchTracker.js.map +1 -1
  232. package/lib/blobManager.d.ts +15 -18
  233. package/lib/blobManager.d.ts.map +1 -1
  234. package/lib/blobManager.js +187 -146
  235. package/lib/blobManager.js.map +1 -1
  236. package/lib/connectionTelemetry.d.ts.map +1 -1
  237. package/lib/connectionTelemetry.js +23 -7
  238. package/lib/connectionTelemetry.js.map +1 -1
  239. package/lib/containerRuntime.d.ts +172 -35
  240. package/lib/containerRuntime.d.ts.map +1 -1
  241. package/lib/containerRuntime.js +678 -380
  242. package/lib/containerRuntime.js.map +1 -1
  243. package/lib/dataStore.d.ts.map +1 -1
  244. package/lib/dataStore.js +13 -5
  245. package/lib/dataStore.js.map +1 -1
  246. package/lib/dataStoreContext.d.ts +4 -4
  247. package/lib/dataStoreContext.d.ts.map +1 -1
  248. package/lib/dataStoreContext.js +49 -52
  249. package/lib/dataStoreContext.js.map +1 -1
  250. package/lib/dataStoreContexts.d.ts +1 -1
  251. package/lib/dataStoreContexts.d.ts.map +1 -1
  252. package/lib/dataStoreContexts.js +3 -3
  253. package/lib/dataStoreContexts.js.map +1 -1
  254. package/lib/dataStoreRegistry.js +1 -1
  255. package/lib/dataStoreRegistry.js.map +1 -1
  256. package/lib/dataStores.d.ts +23 -7
  257. package/lib/dataStores.d.ts.map +1 -1
  258. package/lib/dataStores.js +107 -64
  259. package/lib/dataStores.js.map +1 -1
  260. package/lib/deltaManagerProxyBase.d.ts +35 -0
  261. package/lib/deltaManagerProxyBase.d.ts.map +1 -0
  262. package/lib/deltaManagerProxyBase.js +73 -0
  263. package/lib/deltaManagerProxyBase.js.map +1 -0
  264. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  265. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  266. package/lib/deltaManagerSummarizerProxy.js +3 -1
  267. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  268. package/lib/deltaScheduler.d.ts.map +1 -1
  269. package/lib/deltaScheduler.js +7 -7
  270. package/lib/deltaScheduler.js.map +1 -1
  271. package/lib/error.d.ts +14 -0
  272. package/lib/error.d.ts.map +1 -0
  273. package/lib/error.js +17 -0
  274. package/lib/error.js.map +1 -0
  275. package/lib/gc/garbageCollection.d.ts +10 -9
  276. package/lib/gc/garbageCollection.d.ts.map +1 -1
  277. package/lib/gc/garbageCollection.js +61 -52
  278. package/lib/gc/garbageCollection.js.map +1 -1
  279. package/lib/gc/gcConfigs.d.ts.map +1 -1
  280. package/lib/gc/gcConfigs.js +16 -12
  281. package/lib/gc/gcConfigs.js.map +1 -1
  282. package/lib/gc/gcDefinitions.d.ts +17 -5
  283. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  284. package/lib/gc/gcDefinitions.js +13 -14
  285. package/lib/gc/gcDefinitions.js.map +1 -1
  286. package/lib/gc/gcHelpers.d.ts +0 -8
  287. package/lib/gc/gcHelpers.d.ts.map +1 -1
  288. package/lib/gc/gcHelpers.js +5 -17
  289. package/lib/gc/gcHelpers.js.map +1 -1
  290. package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
  291. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  292. package/lib/gc/gcSummaryStateTracker.js +20 -59
  293. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  294. package/lib/gc/gcTelemetry.d.ts +1 -1
  295. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  296. package/lib/gc/gcTelemetry.js +46 -36
  297. package/lib/gc/gcTelemetry.js.map +1 -1
  298. package/lib/gc/gcUnreferencedStateTracker.js +1 -1
  299. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  300. package/lib/gc/index.d.ts +2 -2
  301. package/lib/gc/index.d.ts.map +1 -1
  302. package/lib/gc/index.js +2 -2
  303. package/lib/gc/index.js.map +1 -1
  304. package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
  305. package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  306. package/lib/id-compressor/appendOnlySortedMap.js +25 -66
  307. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  308. package/lib/id-compressor/finalSpace.d.ts +29 -0
  309. package/lib/id-compressor/finalSpace.d.ts.map +1 -0
  310. package/lib/id-compressor/finalSpace.js +58 -0
  311. package/lib/id-compressor/finalSpace.js.map +1 -0
  312. package/lib/id-compressor/idCompressor.d.ts +25 -250
  313. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  314. package/lib/id-compressor/idCompressor.js +385 -1142
  315. package/lib/id-compressor/idCompressor.js.map +1 -1
  316. package/lib/id-compressor/identifiers.d.ts +32 -0
  317. package/lib/id-compressor/identifiers.d.ts.map +1 -0
  318. package/lib/id-compressor/identifiers.js +11 -0
  319. package/lib/id-compressor/identifiers.js.map +1 -0
  320. package/lib/id-compressor/index.d.ts +5 -6
  321. package/lib/id-compressor/index.d.ts.map +1 -1
  322. package/lib/id-compressor/index.js +5 -6
  323. package/lib/id-compressor/index.js.map +1 -1
  324. package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
  325. package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
  326. package/lib/id-compressor/persistanceUtilities.js +34 -0
  327. package/lib/id-compressor/persistanceUtilities.js.map +1 -0
  328. package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  329. package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  330. package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
  331. package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  332. package/lib/id-compressor/sessions.d.ts +115 -0
  333. package/lib/id-compressor/sessions.d.ts.map +1 -0
  334. package/lib/id-compressor/sessions.js +290 -0
  335. package/lib/id-compressor/sessions.js.map +1 -0
  336. package/lib/id-compressor/utilities.d.ts +49 -0
  337. package/lib/id-compressor/utilities.d.ts.map +1 -0
  338. package/lib/id-compressor/utilities.js +148 -0
  339. package/lib/id-compressor/utilities.js.map +1 -0
  340. package/lib/index.d.ts +3 -3
  341. package/lib/index.d.ts.map +1 -1
  342. package/lib/index.js +2 -2
  343. package/lib/index.js.map +1 -1
  344. package/lib/metadata.d.ts +18 -0
  345. package/lib/metadata.d.ts.map +1 -0
  346. package/lib/metadata.js +6 -0
  347. package/lib/metadata.js.map +1 -0
  348. package/lib/opLifecycle/batchManager.d.ts +2 -1
  349. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  350. package/lib/opLifecycle/batchManager.js +15 -7
  351. package/lib/opLifecycle/batchManager.js.map +1 -1
  352. package/lib/opLifecycle/definitions.d.ts +11 -0
  353. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  354. package/lib/opLifecycle/definitions.js.map +1 -1
  355. package/lib/opLifecycle/index.d.ts +1 -1
  356. package/lib/opLifecycle/index.d.ts.map +1 -1
  357. package/lib/opLifecycle/index.js +1 -1
  358. package/lib/opLifecycle/index.js.map +1 -1
  359. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  360. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  361. package/lib/opLifecycle/opCompressor.js +10 -5
  362. package/lib/opLifecycle/opCompressor.js.map +1 -1
  363. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  364. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  365. package/lib/opLifecycle/opDecompressor.js +22 -13
  366. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  367. package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
  368. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  369. package/lib/opLifecycle/opGroupingManager.js +17 -11
  370. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  371. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  372. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  373. package/lib/opLifecycle/opSplitter.js +15 -10
  374. package/lib/opLifecycle/opSplitter.js.map +1 -1
  375. package/lib/opLifecycle/outbox.d.ts +39 -6
  376. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  377. package/lib/opLifecycle/outbox.js +132 -56
  378. package/lib/opLifecycle/outbox.js.map +1 -1
  379. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  380. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  381. package/lib/opLifecycle/remoteMessageProcessor.js +23 -9
  382. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  383. package/lib/opProperties.js +1 -2
  384. package/lib/opProperties.js.map +1 -1
  385. package/lib/packageVersion.d.ts +1 -1
  386. package/lib/packageVersion.js +1 -1
  387. package/lib/packageVersion.js.map +1 -1
  388. package/lib/pendingStateManager.d.ts +25 -10
  389. package/lib/pendingStateManager.d.ts.map +1 -1
  390. package/lib/pendingStateManager.js +90 -53
  391. package/lib/pendingStateManager.js.map +1 -1
  392. package/lib/scheduleManager.d.ts.map +1 -1
  393. package/lib/scheduleManager.js +25 -15
  394. package/lib/scheduleManager.js.map +1 -1
  395. package/lib/summary/index.d.ts +4 -4
  396. package/lib/summary/index.d.ts.map +1 -1
  397. package/lib/summary/index.js +2 -2
  398. package/lib/summary/index.js.map +1 -1
  399. package/lib/summary/orderedClientElection.d.ts +3 -3
  400. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  401. package/lib/summary/orderedClientElection.js +21 -22
  402. package/lib/summary/orderedClientElection.js.map +1 -1
  403. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  404. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  405. package/lib/summary/runningSummarizer.d.ts +31 -10
  406. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  407. package/lib/summary/runningSummarizer.js +265 -133
  408. package/lib/summary/runningSummarizer.js.map +1 -1
  409. package/lib/summary/summarizer.d.ts +8 -7
  410. package/lib/summary/summarizer.d.ts.map +1 -1
  411. package/lib/summary/summarizer.js +75 -74
  412. package/lib/summary/summarizer.js.map +1 -1
  413. package/lib/summary/summarizerClientElection.d.ts +2 -2
  414. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  415. package/lib/summary/summarizerClientElection.js +6 -10
  416. package/lib/summary/summarizerClientElection.js.map +1 -1
  417. package/lib/summary/summarizerHeuristics.js +9 -13
  418. package/lib/summary/summarizerHeuristics.js.map +1 -1
  419. package/lib/summary/summarizerNode/index.d.ts +1 -1
  420. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  421. package/lib/summary/summarizerNode/index.js.map +1 -1
  422. package/lib/summary/summarizerNode/summarizerNode.d.ts +40 -23
  423. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  424. package/lib/summary/summarizerNode/summarizerNode.js +132 -137
  425. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  426. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
  427. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  428. package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  429. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  430. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
  431. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  432. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +70 -119
  433. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  434. package/lib/summary/summarizerTypes.d.ts +44 -24
  435. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  436. package/lib/summary/summarizerTypes.js.map +1 -1
  437. package/lib/summary/summaryCollection.d.ts +2 -2
  438. package/lib/summary/summaryCollection.d.ts.map +1 -1
  439. package/lib/summary/summaryCollection.js +9 -6
  440. package/lib/summary/summaryCollection.js.map +1 -1
  441. package/lib/summary/summaryFormat.d.ts +4 -0
  442. package/lib/summary/summaryFormat.d.ts.map +1 -1
  443. package/lib/summary/summaryFormat.js +7 -4
  444. package/lib/summary/summaryFormat.js.map +1 -1
  445. package/lib/summary/summaryGenerator.d.ts +21 -6
  446. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  447. package/lib/summary/summaryGenerator.js +109 -47
  448. package/lib/summary/summaryGenerator.js.map +1 -1
  449. package/lib/summary/summaryManager.d.ts +8 -7
  450. package/lib/summary/summaryManager.d.ts.map +1 -1
  451. package/lib/summary/summaryManager.js +35 -25
  452. package/lib/summary/summaryManager.js.map +1 -1
  453. package/package.json +30 -32
  454. package/src/batchTracker.ts +7 -5
  455. package/src/blobManager.ts +235 -172
  456. package/src/connectionTelemetry.ts +19 -5
  457. package/src/containerRuntime.ts +853 -431
  458. package/src/dataStore.ts +12 -4
  459. package/src/dataStoreContext.ts +49 -46
  460. package/src/dataStoreContexts.ts +4 -4
  461. package/src/dataStoreRegistry.ts +1 -1
  462. package/src/dataStores.ts +119 -80
  463. package/src/deltaManagerProxyBase.ts +111 -0
  464. package/src/deltaManagerSummarizerProxy.ts +4 -1
  465. package/src/deltaScheduler.ts +7 -11
  466. package/src/error.ts +18 -0
  467. package/src/gc/garbageCollection.md +53 -5
  468. package/src/gc/garbageCollection.ts +58 -51
  469. package/src/gc/gcConfigs.ts +4 -2
  470. package/src/gc/gcDefinitions.ts +17 -21
  471. package/src/gc/gcEarlyAdoption.md +145 -0
  472. package/src/gc/gcHelpers.ts +1 -12
  473. package/src/gc/gcSummaryStateTracker.ts +19 -65
  474. package/src/gc/gcTelemetry.ts +15 -13
  475. package/src/gc/gcUnreferencedStateTracker.ts +1 -1
  476. package/src/gc/index.ts +2 -4
  477. package/src/id-compressor/appendOnlySortedMap.ts +26 -87
  478. package/src/id-compressor/finalSpace.ts +67 -0
  479. package/src/id-compressor/idCompressor.ts +458 -1682
  480. package/src/id-compressor/identifiers.ts +42 -0
  481. package/src/id-compressor/index.ts +11 -20
  482. package/src/id-compressor/persistanceUtilities.ts +58 -0
  483. package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
  484. package/src/id-compressor/sessions.ts +405 -0
  485. package/src/id-compressor/utilities.ts +187 -0
  486. package/src/index.ts +9 -2
  487. package/src/metadata.ts +19 -0
  488. package/src/opLifecycle/README.md +20 -0
  489. package/src/opLifecycle/batchManager.ts +9 -1
  490. package/src/opLifecycle/definitions.ts +11 -0
  491. package/src/opLifecycle/index.ts +1 -1
  492. package/src/opLifecycle/opCompressor.ts +6 -5
  493. package/src/opLifecycle/opDecompressor.ts +47 -17
  494. package/src/opLifecycle/opGroupingManager.ts +18 -8
  495. package/src/opLifecycle/opSplitter.ts +10 -7
  496. package/src/opLifecycle/outbox.ts +177 -72
  497. package/src/opLifecycle/remoteMessageProcessor.ts +32 -9
  498. package/src/packageVersion.ts +1 -1
  499. package/src/pendingStateManager.ts +123 -78
  500. package/src/scheduleManager.ts +22 -11
  501. package/src/summary/index.ts +7 -4
  502. package/src/summary/orderedClientElection.ts +10 -6
  503. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  504. package/src/summary/runningSummarizer.ts +291 -163
  505. package/src/summary/summarizer.ts +27 -16
  506. package/src/summary/summarizerClientElection.ts +2 -2
  507. package/src/summary/summarizerHeuristics.ts +1 -1
  508. package/src/summary/summarizerNode/index.ts +2 -2
  509. package/src/summary/summarizerNode/summarizerNode.ts +142 -184
  510. package/src/summary/summarizerNode/summarizerNodeUtils.ts +27 -35
  511. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +72 -148
  512. package/src/summary/summarizerTypes.ts +49 -24
  513. package/src/summary/summaryCollection.ts +9 -4
  514. package/src/summary/summaryFormat.ts +9 -2
  515. package/src/summary/summaryGenerator.ts +72 -49
  516. package/src/summary/summaryManager.ts +44 -16
  517. package/dist/id-compressor/idRange.d.ts +0 -11
  518. package/dist/id-compressor/idRange.d.ts.map +0 -1
  519. package/dist/id-compressor/idRange.js +0 -29
  520. package/dist/id-compressor/idRange.js.map +0 -1
  521. package/dist/id-compressor/numericUuid.d.ts +0 -59
  522. package/dist/id-compressor/numericUuid.d.ts.map +0 -1
  523. package/dist/id-compressor/numericUuid.js +0 -325
  524. package/dist/id-compressor/numericUuid.js.map +0 -1
  525. package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
  526. package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  527. package/dist/id-compressor/sessionIdNormalizer.js +0 -488
  528. package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
  529. package/dist/id-compressor/utils.d.ts +0 -57
  530. package/dist/id-compressor/utils.d.ts.map +0 -1
  531. package/dist/id-compressor/utils.js +0 -90
  532. package/dist/id-compressor/utils.js.map +0 -1
  533. package/dist/id-compressor/uuidUtilities.d.ts +0 -30
  534. package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
  535. package/dist/id-compressor/uuidUtilities.js +0 -106
  536. package/dist/id-compressor/uuidUtilities.js.map +0 -1
  537. package/lib/id-compressor/idRange.d.ts +0 -11
  538. package/lib/id-compressor/idRange.d.ts.map +0 -1
  539. package/lib/id-compressor/idRange.js +0 -25
  540. package/lib/id-compressor/idRange.js.map +0 -1
  541. package/lib/id-compressor/numericUuid.d.ts +0 -59
  542. package/lib/id-compressor/numericUuid.d.ts.map +0 -1
  543. package/lib/id-compressor/numericUuid.js +0 -315
  544. package/lib/id-compressor/numericUuid.js.map +0 -1
  545. package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
  546. package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  547. package/lib/id-compressor/sessionIdNormalizer.js +0 -484
  548. package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
  549. package/lib/id-compressor/utils.d.ts +0 -57
  550. package/lib/id-compressor/utils.d.ts.map +0 -1
  551. package/lib/id-compressor/utils.js +0 -79
  552. package/lib/id-compressor/utils.js.map +0 -1
  553. package/lib/id-compressor/uuidUtilities.d.ts +0 -30
  554. package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
  555. package/lib/id-compressor/uuidUtilities.js +0 -98
  556. package/lib/id-compressor/uuidUtilities.js.map +0 -1
  557. package/src/id-compressor/idRange.ts +0 -35
  558. package/src/id-compressor/numericUuid.ts +0 -383
  559. package/src/id-compressor/sessionIdNormalizer.ts +0 -609
  560. package/src/id-compressor/utils.ts +0 -114
  561. package/src/id-compressor/uuidUtilities.ts +0 -123
@@ -7,10 +7,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.BlobManager = exports.BlobHandle = void 0;
8
8
  const uuid_1 = require("uuid");
9
9
  const runtime_utils_1 = require("@fluidframework/runtime-utils");
10
- const common_utils_1 = require("@fluidframework/common-utils");
10
+ const core_utils_1 = require("@fluidframework/core-utils");
11
+ const client_utils_1 = require("@fluid-internal/client-utils");
11
12
  const container_definitions_1 = require("@fluidframework/container-definitions");
12
13
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
13
- const container_utils_1 = require("@fluidframework/container-utils");
14
14
  const containerRuntime_1 = require("./containerRuntime");
15
15
  const gc_1 = require("./gc");
16
16
  const throttler_1 = require("./throttler");
@@ -23,10 +23,11 @@ const summary_1 = require("./summary");
23
23
  * and loads blob.
24
24
  */
25
25
  class BlobHandle {
26
- constructor(path, routeContext, get) {
26
+ constructor(path, routeContext, get, onAttachGraph) {
27
27
  this.path = path;
28
28
  this.routeContext = routeContext;
29
29
  this.get = get;
30
+ this.onAttachGraph = onAttachGraph;
30
31
  this.attached = false;
31
32
  this.absolutePath = (0, runtime_utils_1.generateHandleContextPath)(path, this.routeContext);
32
33
  }
@@ -37,7 +38,10 @@ class BlobHandle {
37
38
  return this.routeContext.isAttached && this.attached;
38
39
  }
39
40
  attachGraph() {
40
- this.attached = true;
41
+ if (!this.attached) {
42
+ this.attached = true;
43
+ this.onAttachGraph?.();
44
+ }
41
45
  }
42
46
  bind(handle) {
43
47
  throw new Error("Cannot bind to blob handle");
@@ -47,7 +51,7 @@ exports.BlobHandle = BlobHandle;
47
51
  class CancellableThrottler {
48
52
  constructor(throttler) {
49
53
  this.throttler = throttler;
50
- this.cancelP = new common_utils_1.Deferred();
54
+ this.cancelP = new core_utils_1.Deferred();
51
55
  }
52
56
  async getDelay() {
53
57
  return Promise.race([
@@ -57,19 +61,10 @@ class CancellableThrottler {
57
61
  }
58
62
  cancel() {
59
63
  this.cancelP.resolve();
60
- this.cancelP = new common_utils_1.Deferred();
64
+ this.cancelP = new core_utils_1.Deferred();
61
65
  }
62
66
  }
63
- // Note that while offline we "submit" an op before uploading the blob, but we always
64
- // expect blobs to be uploaded before we actually see the op round-trip
65
- var PendingBlobStatus;
66
- (function (PendingBlobStatus) {
67
- PendingBlobStatus[PendingBlobStatus["OnlinePendingUpload"] = 0] = "OnlinePendingUpload";
68
- PendingBlobStatus[PendingBlobStatus["OnlinePendingOp"] = 1] = "OnlinePendingOp";
69
- PendingBlobStatus[PendingBlobStatus["OfflinePendingUpload"] = 2] = "OfflinePendingUpload";
70
- PendingBlobStatus[PendingBlobStatus["OfflinePendingOp"] = 3] = "OfflinePendingOp";
71
- })(PendingBlobStatus || (PendingBlobStatus = {}));
72
- class BlobManager extends common_utils_1.TypedEventEmitter {
67
+ class BlobManager extends client_utils_1.TypedEventEmitter {
73
68
  constructor(routeContext, snapshot, getStorage,
74
69
  /**
75
70
  * Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
@@ -96,9 +91,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
96
91
  this.runtime = runtime;
97
92
  this.closeContainer = closeContainer;
98
93
  /**
99
- * Blobs which have not been uploaded or for which we have not yet seen a BlobAttach op round-trip.
100
- * Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
101
- * we must save it. This is true for both the online and offline flow.
94
+ * Blobs which we have not yet seen a BlobAttach op round-trip and not yet attached to a DDS.
102
95
  */
103
96
  this.pendingBlobs = new Map();
104
97
  /**
@@ -116,98 +109,107 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
116
109
  * Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
117
110
  */
118
111
  this.tombstonedBlobs = new Set();
119
- this.mc = (0, telemetry_utils_1.loggerToMonitoringContext)(telemetry_utils_1.ChildLogger.create(this.runtime.logger, "BlobManager"));
112
+ this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
113
+ logger: this.runtime.logger,
114
+ namespace: "BlobManager",
115
+ });
120
116
  // Read the feature flag that tells whether to throw when a tombstone blob is requested.
121
117
  this.throwOnTombstoneLoad =
122
118
  this.mc.config.getBoolean(gc_1.throwOnTombstoneLoadKey) === true &&
123
119
  this.runtime.gcTombstoneEnforcementAllowed &&
124
120
  this.runtime.clientDetails.type !== summary_1.summarizerClientType;
125
- this.runtime.on("disconnected", () => this.onDisconnected());
126
121
  this.redirectTable = this.load(snapshot);
127
122
  // Begin uploading stashed blobs from previous container instance
128
123
  Object.entries(stashedBlobs).forEach(([localId, entry]) => {
129
- const blob = (0, common_utils_1.stringToBuffer)(entry.blob, "base64");
124
+ const blob = (0, client_utils_1.stringToBuffer)(entry.blob, "base64");
125
+ const attached = entry.attached;
126
+ const acked = entry.acked;
127
+ const storageId = entry.storageId; // entry.storageId = response.id
130
128
  if (entry.minTTLInSeconds && entry.uploadTime) {
131
129
  const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
132
130
  // stashed entries with more than half-life in storage will not be reuploaded
133
131
  if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
134
132
  this.pendingBlobs.set(localId, {
135
133
  blob,
136
- status: PendingBlobStatus.OfflinePendingOp,
137
- handleP: new common_utils_1.Deferred(),
134
+ uploading: false,
135
+ opsent: true,
136
+ handleP: new core_utils_1.Deferred(),
137
+ storageId,
138
138
  uploadP: undefined,
139
139
  uploadTime: entry.uploadTime,
140
140
  minTTLInSeconds: entry.minTTLInSeconds,
141
+ attached,
142
+ acked,
141
143
  });
142
144
  return;
143
145
  }
144
146
  }
145
147
  this.pendingBlobs.set(localId, {
146
148
  blob,
147
- status: PendingBlobStatus.OfflinePendingUpload,
148
- handleP: new common_utils_1.Deferred(),
149
+ uploading: true,
150
+ handleP: new core_utils_1.Deferred(),
149
151
  uploadP: this.uploadBlob(localId, blob),
152
+ attached,
153
+ acked,
154
+ opsent: true,
150
155
  });
151
156
  });
152
157
  this.sendBlobAttachOp = (localId, blobId) => {
153
158
  const pendingEntry = this.pendingBlobs.get(localId);
154
- if ((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.uploadTime) && (pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.minTTLInSeconds)) {
159
+ (0, core_utils_1.assert)(pendingEntry !== undefined, 0x725 /* Must have pending blob entry for upcoming op */);
160
+ if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
155
161
  const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
156
162
  const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
157
163
  this.mc.logger.sendTelemetryEvent({
158
164
  eventName: "sendBlobAttach",
159
- entryStatus: pendingEntry.status,
160
165
  secondsSinceUpload,
161
166
  minTTLInSeconds: pendingEntry.minTTLInSeconds,
162
167
  expired,
163
168
  });
164
169
  if (expired) {
165
170
  // we want to avoid submitting ops with broken handles
166
- this.closeContainer(new container_utils_1.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
171
+ this.closeContainer(new telemetry_utils_1.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
167
172
  localId,
168
173
  blobId,
169
- entryStatus: pendingEntry.status,
170
174
  secondsSinceUpload,
171
175
  }));
172
176
  }
173
177
  }
178
+ pendingEntry.opsent = true;
174
179
  return sendBlobAttachOp(localId, blobId);
175
180
  };
176
181
  }
177
- get pendingOfflineUploads() {
178
- return Array.from(this.pendingBlobs.values()).filter((e) => e.status === PendingBlobStatus.OfflinePendingUpload);
179
- }
180
- get hasPendingOfflineUploads() {
181
- return this.pendingOfflineUploads.length > 0;
182
+ get allBlobsAttached() {
183
+ for (const [, entry] of this.pendingBlobs) {
184
+ if (entry.attached === false) {
185
+ return false;
186
+ }
187
+ }
188
+ return true;
182
189
  }
183
190
  get hasPendingBlobs() {
184
191
  return ((this.runtime.attachState !== container_definitions_1.AttachState.Attached && this.redirectTable.size > 0) ||
185
192
  this.pendingBlobs.size > 0);
186
193
  }
194
+ createAbortError(pending) {
195
+ return new telemetry_utils_1.LoggingError("uploadBlob aborted", {
196
+ acked: pending?.acked,
197
+ uploadTime: pending?.uploadTime,
198
+ });
199
+ }
187
200
  /**
188
201
  * Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
189
202
  */
190
- async onConnected() {
203
+ async processStashedChanges() {
191
204
  this.retryThrottler.cancel();
192
- const pendingUploads = this.pendingOfflineUploads.map(async (e) => e.uploadP);
205
+ const pendingUploads = Array.from(this.pendingBlobs.values())
206
+ .filter((e) => e.uploading === true)
207
+ .map(async (e) => e.uploadP);
193
208
  await telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, {
194
- eventName: "BlobUploadOnConnected",
209
+ eventName: "BlobUploadProcessStashedChanges",
195
210
  count: pendingUploads.length,
196
211
  }, async () => Promise.all(pendingUploads), { start: true, end: true });
197
212
  }
198
- /**
199
- * Transition online blobs waiting for BlobAttach op round-trip since we will not see the op until we are connected
200
- * again
201
- */
202
- onDisconnected() {
203
- for (const [localId, entry] of this.pendingBlobs) {
204
- if (entry.status === PendingBlobStatus.OnlinePendingOp) {
205
- // This will submit another BlobAttach op for this blob. This is necessary because the one we sent
206
- // already didn't have the local ID.
207
- this.transitionToOffline(localId);
208
- }
209
- }
210
- }
211
213
  /**
212
214
  * Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
213
215
  * detached or there are no (non-pending) attachment blobs in the document
@@ -218,7 +220,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
218
220
  const undefinedValueInTable = ids.delete(undefined);
219
221
  // For a detached container, entries are inserted into the redirect table with an undefined storage ID.
220
222
  // For an attached container, entries are inserted w/storage ID after the BlobAttach op round-trips.
221
- (0, common_utils_1.assert)(!undefinedValueInTable ||
223
+ (0, core_utils_1.assert)(!undefinedValueInTable ||
222
224
  (this.runtime.attachState === container_definitions_1.AttachState.Detached && ids.size === 0), 0x382 /* 'redirectTable' must contain only undefined while detached / defined values while attached */);
223
225
  return ids;
224
226
  }
@@ -232,14 +234,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
232
234
  }
233
235
  let storageId;
234
236
  if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
235
- (0, common_utils_1.assert)(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
237
+ (0, core_utils_1.assert)(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
236
238
  // Blobs created while the container is detached are stored in IDetachedBlobStorage.
237
239
  // The 'IDocumentStorageService.readBlob()' call below will retrieve these via localId.
238
240
  storageId = blobId;
239
241
  }
240
242
  else {
241
243
  const attachedStorageId = this.redirectTable.get(blobId);
242
- (0, common_utils_1.assert)(!!attachedStorageId, 0x11f /* "requesting unknown blobs" */);
244
+ (0, core_utils_1.assert)(!!attachedStorageId, 0x11f /* "requesting unknown blobs" */);
243
245
  storageId = attachedStorageId;
244
246
  }
245
247
  // Let runtime know that the corresponding GC node was requested.
@@ -249,8 +251,16 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
249
251
  }, { end: true, cancel: "error" });
250
252
  }
251
253
  getBlobHandle(id) {
252
- (0, common_utils_1.assert)(this.redirectTable.has(id) || this.pendingBlobs.has(id), 0x384 /* requesting handle for unknown blob */);
253
- return new BlobHandle(`${BlobManager.basePath}/${id}`, this.routeContext, async () => this.getBlob(id));
254
+ (0, core_utils_1.assert)(this.redirectTable.has(id) || this.pendingBlobs.has(id), 0x384 /* requesting handle for unknown blob */);
255
+ const pending = this.pendingBlobs.get(id);
256
+ const callback = pending
257
+ ? () => {
258
+ pending.attached = true;
259
+ this.emit("blobAttached", pending);
260
+ this.deletePendingBlobMaybe(id);
261
+ }
262
+ : undefined;
263
+ return new BlobHandle(`${BlobManager.basePath}/${id}`, this.routeContext, async () => this.getBlob(id), callback);
254
264
  }
255
265
  async createBlobDetached(blob) {
256
266
  // Blobs created while the container is detached are stored in IDetachedBlobStorage.
@@ -259,7 +269,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
259
269
  this.setRedirection(response.id, undefined);
260
270
  return this.getBlobHandle(response.id);
261
271
  }
262
- async createBlob(blob) {
272
+ async createBlob(blob, signal) {
263
273
  if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
264
274
  return this.createBlobDetached(blob);
265
275
  }
@@ -268,18 +278,33 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
268
278
  this.mc.logger.sendTelemetryEvent({ eventName: "CreateBlobWhileAttaching" });
269
279
  await new Promise((resolve) => this.runtime.once("attached", resolve));
270
280
  }
271
- (0, common_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
281
+ (0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
282
+ if (signal?.aborted) {
283
+ throw this.createAbortError();
284
+ }
272
285
  // Create a local ID for the blob. After uploading it to storage and before returning it, a local ID to
273
286
  // storage ID mapping is created.
274
287
  const localId = (0, uuid_1.v4)();
275
288
  const pendingEntry = {
276
289
  blob,
277
- status: PendingBlobStatus.OnlinePendingUpload,
278
- handleP: new common_utils_1.Deferred(),
290
+ uploading: true,
291
+ handleP: new core_utils_1.Deferred(),
279
292
  uploadP: this.uploadBlob(localId, blob),
293
+ attached: false,
294
+ acked: false,
295
+ abortSignal: signal,
296
+ opsent: false,
280
297
  };
281
298
  this.pendingBlobs.set(localId, pendingEntry);
282
- return pendingEntry.handleP.promise;
299
+ const abortListener = () => {
300
+ if (!pendingEntry.acked) {
301
+ pendingEntry.handleP.reject(this.createAbortError(pendingEntry));
302
+ }
303
+ };
304
+ signal?.addEventListener("abort", abortListener, { once: true });
305
+ return pendingEntry.handleP.promise.finally(() => {
306
+ signal?.removeEventListener("abort", abortListener);
307
+ });
283
308
  }
284
309
  async uploadBlob(localId, blob) {
285
310
  return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "createBlob" }, async () => this.getStorage().createBlob(blob), { end: true, cancel: this.runtime.connected ? "error" : "generic" }).then((response) => this.onUploadResolve(localId, response), async (err) => this.onUploadReject(localId, err));
@@ -291,69 +316,62 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
291
316
  setRedirection(fromId, toId) {
292
317
  this.redirectTable.set(fromId, toId);
293
318
  }
294
- deleteAndEmitsIfEmpty(id) {
319
+ deletePendingBlobMaybe(id) {
295
320
  if (this.pendingBlobs.has(id)) {
296
- this.pendingBlobs.delete(id);
297
- if (!this.hasPendingBlobs) {
298
- this.emit("noPendingBlobs");
321
+ const entry = this.pendingBlobs.get(id);
322
+ if (entry?.attached && entry?.acked) {
323
+ this.deletePendingBlob(id);
299
324
  }
300
325
  }
301
326
  }
327
+ deletePendingBlob(id) {
328
+ if (this.pendingBlobs.delete(id) && !this.hasPendingBlobs) {
329
+ this.emit("noPendingBlobs");
330
+ }
331
+ }
302
332
  onUploadResolve(localId, response) {
303
- var _a;
304
333
  const entry = this.pendingBlobs.get(localId);
305
- (0, common_utils_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
306
- (0, common_utils_1.assert)(entry.status === PendingBlobStatus.OnlinePendingUpload ||
307
- entry.status === PendingBlobStatus.OfflinePendingUpload, 0x386 /* Must have pending blob entry for uploaded blob */);
334
+ (0, core_utils_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
335
+ if (entry.abortSignal?.aborted === true && !entry.opsent) {
336
+ this.deletePendingBlob(localId);
337
+ return;
338
+ }
339
+ (0, core_utils_1.assert)(entry.uploading === true, 0x386 /* Must have pending blob entry for uploaded blob */);
308
340
  entry.storageId = response.id;
309
341
  entry.uploadTime = Date.now();
310
342
  entry.minTTLInSeconds = response.minTTLInSeconds;
311
- if (this.runtime.connected) {
312
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
313
- // Send a blob attach op. This serves two purposes:
314
- // 1. If its a new blob, i.e., it isn't de-duped, the server will keep the blob alive if it sees this op
315
- // until its storage ID is added to the next summary.
316
- // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
317
- // blob from the server via the storage ID.
318
- this.sendBlobAttachOp(localId, response.id);
319
- if (this.storageIds.has(response.id)) {
320
- // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
321
- // an existing blob, we don't have to wait for the op to be ack'd since this step has already
322
- // happened before and so, the server won't delete it.
323
- this.setRedirection(localId, response.id);
324
- entry.handleP.resolve(this.getBlobHandle(localId));
325
- this.deleteAndEmitsIfEmpty(localId);
326
- }
327
- else {
328
- // If there is already an op for this storage ID, append the local ID to the list. Once any op for
329
- // this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
330
- // blob alive in storage.
331
- this.opsInFlight.set(response.id, ((_a = this.opsInFlight.get(response.id)) !== null && _a !== void 0 ? _a : []).concat(localId));
332
- entry.status = PendingBlobStatus.OnlinePendingOp;
333
- }
334
- }
335
- else if (entry.status === PendingBlobStatus.OfflinePendingUpload) {
336
- // We already submitted a BlobAttach op for this blob when it was transitioned to offline flow
337
- entry.status = PendingBlobStatus.OfflinePendingOp;
338
- }
343
+ // Send a blob attach op. This serves two purposes:
344
+ // 1. If its a new blob, i.e., it isn't de-duped, the server will keep the blob alive if it sees this op
345
+ // until its storage ID is added to the next summary.
346
+ // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
347
+ // blob from the server via the storage ID.
348
+ if (!entry.opsent) {
349
+ this.sendBlobAttachOp(localId, response.id);
350
+ }
351
+ if (this.storageIds.has(response.id)) {
352
+ // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
353
+ // an existing blob, we don't have to wait for the op to be ack'd since this step has already
354
+ // happened before and so, the server won't delete it.
355
+ this.setRedirection(localId, response.id);
356
+ entry.handleP.resolve(this.getBlobHandle(localId));
357
+ this.deletePendingBlobMaybe(localId);
339
358
  }
340
359
  else {
341
- // connected to storage but not ordering service?
342
- this.mc.logger.sendTelemetryEvent({ eventName: "BlobUploadSuccessWhileDisconnected" });
343
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
344
- this.transitionToOffline(localId);
345
- }
346
- entry.status = PendingBlobStatus.OfflinePendingOp;
360
+ // If there is already an op for this storage ID, append the local ID to the list. Once any op for
361
+ // this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
362
+ // blob alive in storage.
363
+ this.opsInFlight.set(response.id, (this.opsInFlight.get(response.id) ?? []).concat(localId));
347
364
  }
348
365
  return response;
349
366
  }
350
367
  async onUploadReject(localId, error) {
351
368
  const entry = this.pendingBlobs.get(localId);
352
- (0, common_utils_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
369
+ (0, core_utils_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
370
+ if (entry.abortSignal?.aborted === true && !entry.opsent) {
371
+ this.deletePendingBlob(localId);
372
+ return;
373
+ }
353
374
  if (!this.runtime.connected) {
354
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
355
- this.transitionToOffline(localId);
356
- }
357
375
  // we are probably not connected to storage but start another upload request in case we are
358
376
  entry.uploadP = this.retryThrottler
359
377
  .getDelay()
@@ -365,50 +383,34 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
365
383
  throw error;
366
384
  }
367
385
  }
368
- transitionToOffline(localId) {
369
- (0, common_utils_1.assert)(!this.runtime.connected, 0x388 /* Must only transition to offline flow while runtime is disconnected */);
370
- const entry = this.pendingBlobs.get(localId);
371
- (0, common_utils_1.assert)(!!entry, 0x389 /* No pending blob entry */);
372
- (0, common_utils_1.assert)([PendingBlobStatus.OnlinePendingUpload, PendingBlobStatus.OnlinePendingOp].includes(entry.status), 0x38a /* Blob must be in online flow to transition to offline flow */);
373
- /**
374
- * If we haven't already submitted a BlobAttach op for this entry, send it before returning the blob handle.
375
- * This will make sure that the BlobAttach op is sequenced prior to any ops referencing the handle. Otherwise,
376
- * an invalid handle could be added to the document.
377
- * storageId may be undefined but since we are not connected we will have a chance to add it when reSubmit()
378
- * is called on reconnection.
379
- */
380
- if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
381
- this.sendBlobAttachOp(localId, entry.storageId);
382
- }
383
- entry.status =
384
- entry.status === PendingBlobStatus.OnlinePendingUpload
385
- ? PendingBlobStatus.OfflinePendingUpload
386
- : PendingBlobStatus.OfflinePendingOp;
387
- entry.handleP.resolve(this.getBlobHandle(localId));
388
- }
389
386
  /**
390
387
  * Resubmit a BlobAttach op. Used to add storage IDs to ops that were
391
388
  * submitted to runtime while disconnected.
392
389
  * @param metadata - op metadata containing storage and/or local IDs
393
390
  */
394
391
  reSubmit(metadata) {
395
- (0, common_utils_1.assert)(!!metadata, 0x38b /* Resubmitted ops must have metadata */);
392
+ (0, core_utils_1.assert)(!!metadata, 0x38b /* Resubmitted ops must have metadata */);
396
393
  const { localId, blobId } = metadata;
397
- (0, common_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
394
+ (0, core_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
398
395
  const pendingEntry = this.pendingBlobs.get(localId);
399
396
  if (!blobId) {
400
397
  // We submitted this op while offline. The blob should have been uploaded by now.
401
- (0, common_utils_1.assert)((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.status) === PendingBlobStatus.OfflinePendingOp &&
402
- !!(pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.storageId), 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
403
- return this.sendBlobAttachOp(localId, pendingEntry.storageId);
398
+ (0, core_utils_1.assert)(pendingEntry?.opsent === true && !!pendingEntry?.storageId, 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
399
+ return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
404
400
  }
405
401
  return this.sendBlobAttachOp(localId, blobId);
406
402
  }
407
403
  processBlobAttachOp(message, local) {
408
- var _a, _b;
409
- const localId = (_a = message.metadata) === null || _a === void 0 ? void 0 : _a.localId;
410
- const blobId = (_b = message.metadata) === null || _b === void 0 ? void 0 : _b.blobId;
411
- (0, common_utils_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
404
+ const localId = message.metadata?.localId;
405
+ const blobId = message.metadata?.blobId;
406
+ if (localId) {
407
+ const pendingEntry = this.pendingBlobs.get(localId);
408
+ if (pendingEntry?.abortSignal?.aborted) {
409
+ this.deletePendingBlob(localId);
410
+ return;
411
+ }
412
+ }
413
+ (0, core_utils_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
412
414
  // Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
413
415
  // requested from the server.
414
416
  // Note: The check for undefined is needed for back-compat when localId was not part of the BlobAttach op that
@@ -419,26 +421,28 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
419
421
  // set identity (id -> id) entry
420
422
  this.setRedirection(blobId, blobId);
421
423
  if (local) {
422
- (0, common_utils_1.assert)(localId !== undefined, 0x50e /* local ID not present in blob attach message */);
424
+ (0, core_utils_1.assert)(localId !== undefined, 0x50e /* local ID not present in blob attach message */);
423
425
  const waitingBlobs = this.opsInFlight.get(blobId);
424
426
  if (waitingBlobs !== undefined) {
425
427
  // For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
426
428
  // This is safe because the server will keep the blob alive and the op containing the local ID to
427
429
  // storage ID is already in flight and any op containing this local ID will be sequenced after that.
428
430
  waitingBlobs.forEach((pendingLocalId) => {
429
- const pendingBlobEntry = this.pendingBlobs.get(pendingLocalId);
430
- (0, common_utils_1.assert)(pendingBlobEntry !== undefined, 0x38f /* local online BlobAttach op with no pending blob entry */);
431
- // It's possible we transitioned to offline flow while waiting for this op.
432
- if (pendingBlobEntry.status === PendingBlobStatus.OnlinePendingOp) {
433
- this.setRedirection(pendingLocalId, blobId);
434
- pendingBlobEntry.handleP.resolve(this.getBlobHandle(pendingLocalId));
435
- this.deleteAndEmitsIfEmpty(pendingLocalId);
436
- }
431
+ const entry = this.pendingBlobs.get(pendingLocalId);
432
+ (0, core_utils_1.assert)(entry !== undefined, 0x38f /* local online BlobAttach op with no pending blob entry */);
433
+ this.setRedirection(pendingLocalId, blobId);
434
+ entry.acked = true;
435
+ entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
436
+ this.deletePendingBlobMaybe(pendingLocalId);
437
437
  });
438
438
  this.opsInFlight.delete(blobId);
439
439
  }
440
- // For blobs that were transitioned to offline flow while waiting for this op, the entry should be deleted.
441
- this.deleteAndEmitsIfEmpty(localId);
440
+ const localEntry = this.pendingBlobs.get(localId);
441
+ if (localEntry) {
442
+ localEntry.acked = true;
443
+ localEntry.handleP.resolve(this.getBlobHandle(localId));
444
+ this.deletePendingBlobMaybe(localId);
445
+ }
442
446
  }
443
447
  }
444
448
  /**
@@ -465,11 +469,10 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
465
469
  * Load a set of previously attached blob IDs and redirect table from a previous snapshot.
466
470
  */
467
471
  load(snapshot) {
468
- var _a, _b, _c;
469
472
  this.mc.logger.sendTelemetryEvent({
470
473
  eventName: "AttachmentBlobsLoaded",
471
- count: (_b = (_a = snapshot.ids) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0,
472
- redirectTable: (_c = snapshot.redirectTable) === null || _c === void 0 ? void 0 : _c.length,
474
+ count: snapshot.ids?.length ?? 0,
475
+ redirectTable: snapshot.redirectTable?.length,
473
476
  });
474
477
  const table = new Map(snapshot.redirectTable);
475
478
  if (snapshot.ids) {
@@ -506,7 +509,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
506
509
  getGCData(fullGC = false) {
507
510
  const gcData = { gcNodes: {} };
508
511
  for (const [localId, storageId] of this.redirectTable) {
509
- (0, common_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
512
+ (0, core_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
510
513
  // Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
511
514
  // id entries have the same key and value, ignore them.
512
515
  // The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
@@ -528,11 +531,11 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
528
531
  * Delete attachment blobs that are sweep ready.
529
532
  * @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
530
533
  * be based off of local ids.
531
- * @returns - The routes of blobs that were deleted.
534
+ * @returns The routes of blobs that were deleted.
532
535
  */
533
536
  deleteSweepReadyNodes(sweepReadyBlobRoutes) {
534
537
  // If sweep for attachment blobs is not enabled, return empty list indicating nothing is deleted.
535
- if (this.mc.config.getBoolean(gc_1.sweepAttachmentBlobsKey) !== true) {
538
+ if (this.mc.config.getBoolean(gc_1.disableAttachmentBlobSweepKey) === true) {
536
539
  return [];
537
540
  }
538
541
  this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
@@ -566,14 +569,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
566
569
  continue;
567
570
  }
568
571
  const storageId = this.redirectTable.get(blobId);
569
- (0, common_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
572
+ (0, core_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
570
573
  maybeUnusedStorageIds.add(storageId);
571
574
  this.redirectTable.delete(blobId);
572
575
  }
573
576
  // Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
574
577
  // the redirect table has a local id -> storage id entry for it.
575
578
  for (const [localId, storageId] of this.redirectTable.entries()) {
576
- (0, common_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
579
+ (0, core_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
577
580
  // For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
578
581
  if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
579
582
  maybeUnusedStorageIds.delete(storageId);
@@ -647,27 +650,65 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
647
650
  }
648
651
  }
649
652
  setRedirectTable(table) {
650
- (0, common_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
651
- (0, common_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
653
+ (0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
654
+ (0, core_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
652
655
  for (const [localId, storageId] of table) {
653
- (0, common_utils_1.assert)(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
656
+ (0, core_utils_1.assert)(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
654
657
  this.setRedirection(localId, storageId);
655
658
  // set identity (id -> id) entry
656
659
  this.setRedirection(storageId, storageId);
657
660
  }
658
661
  }
659
- getPendingBlobs() {
660
- const blobs = {};
661
- for (const [key, entry] of this.pendingBlobs) {
662
- blobs[key] = entry.minTTLInSeconds
663
- ? {
664
- blob: (0, common_utils_1.bufferToString)(entry.blob, "base64"),
665
- uploadTime: entry.uploadTime,
666
- minTTLInSeconds: entry.minTTLInSeconds,
662
+ async getPendingBlobs(waitBlobsToAttach) {
663
+ return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "GetPendingBlobs" }, async () => {
664
+ if (this.pendingBlobs.size === 0) {
665
+ return;
666
+ }
667
+ const blobs = {};
668
+ const localBlobs = new Set();
669
+ while (localBlobs.size < this.pendingBlobs.size) {
670
+ const attachBlobsP = [];
671
+ for (const [id, entry] of this.pendingBlobs) {
672
+ if (!localBlobs.has(entry)) {
673
+ localBlobs.add(entry);
674
+ if (waitBlobsToAttach) {
675
+ if (!entry.opsent) {
676
+ this.sendBlobAttachOp(id, entry.storageId);
677
+ }
678
+ entry.handleP.resolve(this.getBlobHandle(id));
679
+ attachBlobsP.push(new Promise((resolve) => {
680
+ const onBlobAttached = (attachedEntry) => {
681
+ if (attachedEntry === entry) {
682
+ this.off("blobAttached", onBlobAttached);
683
+ resolve();
684
+ }
685
+ };
686
+ if (!entry.attached) {
687
+ this.on("blobAttached", onBlobAttached);
688
+ }
689
+ else {
690
+ resolve();
691
+ }
692
+ }));
693
+ }
694
+ }
667
695
  }
668
- : { blob: (0, common_utils_1.bufferToString)(entry.blob, "base64") };
669
- }
670
- return blobs;
696
+ await Promise.all(attachBlobsP);
697
+ }
698
+ // another for is needed to correctly mark attach state
699
+ // future optimization won't add unattached blobs to the list
700
+ for (const [id, entry] of this.pendingBlobs) {
701
+ blobs[id] = {
702
+ blob: (0, client_utils_1.bufferToString)(entry.blob, "base64"),
703
+ storageId: entry.storageId,
704
+ attached: entry.attached,
705
+ acked: entry.acked,
706
+ minTTLInSeconds: entry.minTTLInSeconds,
707
+ uploadTime: entry.uploadTime,
708
+ };
709
+ }
710
+ return blobs;
711
+ });
671
712
  }
672
713
  }
673
714
  exports.BlobManager = BlobManager;
@@ -686,7 +727,7 @@ function getGCNodePathFromBlobId(blobId) {
686
727
  */
687
728
  function getBlobIdFromGCNodePath(nodePath) {
688
729
  const pathParts = nodePath.split("/");
689
- (0, common_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
730
+ (0, core_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
690
731
  return pathParts[2];
691
732
  }
692
733
  //# sourceMappingURL=blobManager.js.map