@fluidframework/container-runtime 2.0.0-internal.6.1.1 → 2.0.0-internal.6.3.0

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 (477) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +4 -3
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +5 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +4 -21
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +119 -185
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +13 -12
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +99 -16
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +380 -242
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.d.ts.map +1 -1
  19. package/dist/dataStore.js +4 -5
  20. package/dist/dataStore.js.map +1 -1
  21. package/dist/dataStoreContext.d.ts +2 -1
  22. package/dist/dataStoreContext.d.ts.map +1 -1
  23. package/dist/dataStoreContext.js +40 -41
  24. package/dist/dataStoreContext.js.map +1 -1
  25. package/dist/dataStoreContexts.d.ts +1 -2
  26. package/dist/dataStoreContexts.d.ts.map +1 -1
  27. package/dist/dataStoreContexts.js +7 -8
  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.map +1 -1
  32. package/dist/dataStores.js +23 -25
  33. package/dist/dataStores.js.map +1 -1
  34. package/dist/deltaManagerProxyBase.d.ts +1 -1
  35. package/dist/deltaManagerProxyBase.js +2 -2
  36. package/dist/deltaManagerProxyBase.js.map +1 -1
  37. package/dist/deltaScheduler.js +6 -6
  38. package/dist/deltaScheduler.js.map +1 -1
  39. package/dist/error.d.ts +14 -0
  40. package/dist/error.d.ts.map +1 -0
  41. package/dist/error.js +21 -0
  42. package/dist/error.js.map +1 -0
  43. package/dist/gc/garbageCollection.d.ts +4 -6
  44. package/dist/gc/garbageCollection.d.ts.map +1 -1
  45. package/dist/gc/garbageCollection.js +26 -25
  46. package/dist/gc/garbageCollection.js.map +1 -1
  47. package/dist/gc/gcConfigs.d.ts.map +1 -1
  48. package/dist/gc/gcConfigs.js +5 -3
  49. package/dist/gc/gcConfigs.js.map +1 -1
  50. package/dist/gc/gcDefinitions.d.ts +4 -2
  51. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  52. package/dist/gc/gcDefinitions.js.map +1 -1
  53. package/dist/gc/gcHelpers.js +7 -7
  54. package/dist/gc/gcHelpers.js.map +1 -1
  55. package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
  56. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  57. package/dist/gc/gcSummaryStateTracker.js +15 -52
  58. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  59. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  60. package/dist/gc/gcTelemetry.js +2 -0
  61. package/dist/gc/gcTelemetry.js.map +1 -1
  62. package/dist/gc/gcUnreferencedStateTracker.js +4 -4
  63. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  64. package/dist/gc/index.d.ts +1 -1
  65. package/dist/gc/index.d.ts.map +1 -1
  66. package/dist/gc/index.js +1 -2
  67. package/dist/gc/index.js.map +1 -1
  68. package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
  69. package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  70. package/dist/id-compressor/appendOnlySortedMap.js +26 -68
  71. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  72. package/dist/id-compressor/finalSpace.d.ts +29 -0
  73. package/dist/id-compressor/finalSpace.d.ts.map +1 -0
  74. package/dist/id-compressor/finalSpace.js +62 -0
  75. package/dist/id-compressor/finalSpace.js.map +1 -0
  76. package/dist/id-compressor/idCompressor.d.ts +25 -250
  77. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  78. package/dist/id-compressor/idCompressor.js +387 -1150
  79. package/dist/id-compressor/idCompressor.js.map +1 -1
  80. package/dist/id-compressor/identifiers.d.ts +32 -0
  81. package/dist/id-compressor/identifiers.d.ts.map +1 -0
  82. package/dist/id-compressor/identifiers.js +15 -0
  83. package/dist/id-compressor/identifiers.js.map +1 -0
  84. package/dist/id-compressor/index.d.ts +5 -6
  85. package/dist/id-compressor/index.d.ts.map +1 -1
  86. package/dist/id-compressor/index.js +20 -26
  87. package/dist/id-compressor/index.js.map +1 -1
  88. package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
  89. package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
  90. package/dist/id-compressor/persistanceUtilities.js +43 -0
  91. package/dist/id-compressor/persistanceUtilities.js.map +1 -0
  92. package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  93. package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  94. package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
  95. package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  96. package/dist/id-compressor/sessions.d.ts +115 -0
  97. package/dist/id-compressor/sessions.d.ts.map +1 -0
  98. package/dist/id-compressor/sessions.js +305 -0
  99. package/dist/id-compressor/sessions.js.map +1 -0
  100. package/dist/id-compressor/utilities.d.ts +49 -0
  101. package/dist/id-compressor/utilities.d.ts.map +1 -0
  102. package/dist/id-compressor/utilities.js +166 -0
  103. package/dist/id-compressor/utilities.js.map +1 -0
  104. package/dist/index.d.ts +3 -3
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +6 -4
  107. package/dist/index.js.map +1 -1
  108. package/dist/opLifecycle/opCompressor.js +5 -5
  109. package/dist/opLifecycle/opCompressor.js.map +1 -1
  110. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  111. package/dist/opLifecycle/opDecompressor.js +11 -10
  112. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  113. package/dist/opLifecycle/opGroupingManager.js +3 -3
  114. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  115. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  116. package/dist/opLifecycle/opSplitter.js +14 -15
  117. package/dist/opLifecycle/opSplitter.js.map +1 -1
  118. package/dist/opLifecycle/outbox.d.ts +1 -0
  119. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  120. package/dist/opLifecycle/outbox.js +16 -17
  121. package/dist/opLifecycle/outbox.js.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  123. package/dist/opLifecycle/remoteMessageProcessor.js +11 -5
  124. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  125. package/dist/packageVersion.d.ts +1 -1
  126. package/dist/packageVersion.js +1 -1
  127. package/dist/packageVersion.js.map +1 -1
  128. package/dist/pendingStateManager.d.ts +12 -5
  129. package/dist/pendingStateManager.d.ts.map +1 -1
  130. package/dist/pendingStateManager.js +36 -23
  131. package/dist/pendingStateManager.js.map +1 -1
  132. package/dist/scheduleManager.d.ts.map +1 -1
  133. package/dist/scheduleManager.js +23 -23
  134. package/dist/scheduleManager.js.map +1 -1
  135. package/dist/summary/index.d.ts +3 -3
  136. package/dist/summary/index.d.ts.map +1 -1
  137. package/dist/summary/index.js +2 -1
  138. package/dist/summary/index.js.map +1 -1
  139. package/dist/summary/orderedClientElection.d.ts +2 -3
  140. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  141. package/dist/summary/orderedClientElection.js +8 -8
  142. package/dist/summary/orderedClientElection.js.map +1 -1
  143. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  144. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  145. package/dist/summary/runningSummarizer.d.ts +27 -4
  146. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  147. package/dist/summary/runningSummarizer.js +246 -74
  148. package/dist/summary/runningSummarizer.js.map +1 -1
  149. package/dist/summary/summarizer.d.ts +6 -5
  150. package/dist/summary/summarizer.d.ts.map +1 -1
  151. package/dist/summary/summarizer.js +73 -69
  152. package/dist/summary/summarizer.js.map +1 -1
  153. package/dist/summary/summarizerClientElection.d.ts +2 -2
  154. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  155. package/dist/summary/summarizerClientElection.js +2 -2
  156. package/dist/summary/summarizerClientElection.js.map +1 -1
  157. package/dist/summary/summarizerHeuristics.js +2 -2
  158. package/dist/summary/summarizerHeuristics.js.map +1 -1
  159. package/dist/summary/summarizerNode/index.d.ts +1 -1
  160. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  161. package/dist/summary/summarizerNode/index.js.map +1 -1
  162. package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -14
  163. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  164. package/dist/summary/summarizerNode/summarizerNode.js +32 -109
  165. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  166. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  167. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  168. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  169. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
  170. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +5 -88
  172. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  173. package/dist/summary/summarizerTypes.d.ts +38 -25
  174. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  175. package/dist/summary/summarizerTypes.js.map +1 -1
  176. package/dist/summary/summaryCollection.d.ts +2 -3
  177. package/dist/summary/summaryCollection.d.ts.map +1 -1
  178. package/dist/summary/summaryCollection.js +9 -8
  179. package/dist/summary/summaryCollection.js.map +1 -1
  180. package/dist/summary/summaryFormat.js +2 -2
  181. package/dist/summary/summaryFormat.js.map +1 -1
  182. package/dist/summary/summaryGenerator.d.ts +10 -4
  183. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  184. package/dist/summary/summaryGenerator.js +52 -48
  185. package/dist/summary/summaryGenerator.js.map +1 -1
  186. package/dist/summary/summaryManager.d.ts +7 -6
  187. package/dist/summary/summaryManager.d.ts.map +1 -1
  188. package/dist/summary/summaryManager.js +30 -22
  189. package/dist/summary/summaryManager.js.map +1 -1
  190. package/lib/batchTracker.d.ts +1 -1
  191. package/lib/batchTracker.d.ts.map +1 -1
  192. package/lib/batchTracker.js +3 -2
  193. package/lib/batchTracker.js.map +1 -1
  194. package/lib/blobManager.d.ts +4 -21
  195. package/lib/blobManager.d.ts.map +1 -1
  196. package/lib/blobManager.js +91 -157
  197. package/lib/blobManager.js.map +1 -1
  198. package/lib/connectionTelemetry.d.ts.map +1 -1
  199. package/lib/connectionTelemetry.js +2 -1
  200. package/lib/connectionTelemetry.js.map +1 -1
  201. package/lib/containerRuntime.d.ts +99 -16
  202. package/lib/containerRuntime.d.ts.map +1 -1
  203. package/lib/containerRuntime.js +332 -192
  204. package/lib/containerRuntime.js.map +1 -1
  205. package/lib/dataStore.d.ts.map +1 -1
  206. package/lib/dataStore.js +2 -3
  207. package/lib/dataStore.js.map +1 -1
  208. package/lib/dataStoreContext.d.ts +2 -1
  209. package/lib/dataStoreContext.d.ts.map +1 -1
  210. package/lib/dataStoreContext.js +3 -4
  211. package/lib/dataStoreContext.js.map +1 -1
  212. package/lib/dataStoreContexts.d.ts +1 -2
  213. package/lib/dataStoreContexts.d.ts.map +1 -1
  214. package/lib/dataStoreContexts.js +1 -2
  215. package/lib/dataStoreContexts.js.map +1 -1
  216. package/lib/dataStoreRegistry.js +1 -1
  217. package/lib/dataStoreRegistry.js.map +1 -1
  218. package/lib/dataStores.d.ts.map +1 -1
  219. package/lib/dataStores.js +2 -4
  220. package/lib/dataStores.js.map +1 -1
  221. package/lib/deltaManagerProxyBase.d.ts +1 -1
  222. package/lib/deltaManagerProxyBase.js +1 -1
  223. package/lib/deltaManagerProxyBase.js.map +1 -1
  224. package/lib/deltaScheduler.js +1 -1
  225. package/lib/deltaScheduler.js.map +1 -1
  226. package/lib/error.d.ts +14 -0
  227. package/lib/error.d.ts.map +1 -0
  228. package/lib/error.js +17 -0
  229. package/lib/error.js.map +1 -0
  230. package/lib/gc/garbageCollection.d.ts +4 -6
  231. package/lib/gc/garbageCollection.d.ts.map +1 -1
  232. package/lib/gc/garbageCollection.js +26 -25
  233. package/lib/gc/garbageCollection.js.map +1 -1
  234. package/lib/gc/gcConfigs.d.ts.map +1 -1
  235. package/lib/gc/gcConfigs.js +3 -1
  236. package/lib/gc/gcConfigs.js.map +1 -1
  237. package/lib/gc/gcDefinitions.d.ts +4 -2
  238. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  239. package/lib/gc/gcDefinitions.js.map +1 -1
  240. package/lib/gc/gcHelpers.js +1 -1
  241. package/lib/gc/gcHelpers.js.map +1 -1
  242. package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
  243. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  244. package/lib/gc/gcSummaryStateTracker.js +16 -53
  245. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  246. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  247. package/lib/gc/gcTelemetry.js +2 -0
  248. package/lib/gc/gcTelemetry.js.map +1 -1
  249. package/lib/gc/gcUnreferencedStateTracker.js +1 -1
  250. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  251. package/lib/gc/index.d.ts +1 -1
  252. package/lib/gc/index.d.ts.map +1 -1
  253. package/lib/gc/index.js +1 -1
  254. package/lib/gc/index.js.map +1 -1
  255. package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
  256. package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  257. package/lib/id-compressor/appendOnlySortedMap.js +25 -66
  258. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  259. package/lib/id-compressor/finalSpace.d.ts +29 -0
  260. package/lib/id-compressor/finalSpace.d.ts.map +1 -0
  261. package/lib/id-compressor/finalSpace.js +58 -0
  262. package/lib/id-compressor/finalSpace.js.map +1 -0
  263. package/lib/id-compressor/idCompressor.d.ts +25 -250
  264. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  265. package/lib/id-compressor/idCompressor.js +382 -1139
  266. package/lib/id-compressor/idCompressor.js.map +1 -1
  267. package/lib/id-compressor/identifiers.d.ts +32 -0
  268. package/lib/id-compressor/identifiers.d.ts.map +1 -0
  269. package/lib/id-compressor/identifiers.js +11 -0
  270. package/lib/id-compressor/identifiers.js.map +1 -0
  271. package/lib/id-compressor/index.d.ts +5 -6
  272. package/lib/id-compressor/index.d.ts.map +1 -1
  273. package/lib/id-compressor/index.js +5 -6
  274. package/lib/id-compressor/index.js.map +1 -1
  275. package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
  276. package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
  277. package/lib/id-compressor/persistanceUtilities.js +34 -0
  278. package/lib/id-compressor/persistanceUtilities.js.map +1 -0
  279. package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  280. package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  281. package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
  282. package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  283. package/lib/id-compressor/sessions.d.ts +115 -0
  284. package/lib/id-compressor/sessions.d.ts.map +1 -0
  285. package/lib/id-compressor/sessions.js +290 -0
  286. package/lib/id-compressor/sessions.js.map +1 -0
  287. package/lib/id-compressor/utilities.d.ts +49 -0
  288. package/lib/id-compressor/utilities.d.ts.map +1 -0
  289. package/lib/id-compressor/utilities.js +148 -0
  290. package/lib/id-compressor/utilities.js.map +1 -0
  291. package/lib/index.d.ts +3 -3
  292. package/lib/index.d.ts.map +1 -1
  293. package/lib/index.js +2 -2
  294. package/lib/index.js.map +1 -1
  295. package/lib/opLifecycle/opCompressor.js +3 -3
  296. package/lib/opLifecycle/opCompressor.js.map +1 -1
  297. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  298. package/lib/opLifecycle/opDecompressor.js +2 -1
  299. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  300. package/lib/opLifecycle/opGroupingManager.js +1 -1
  301. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  302. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  303. package/lib/opLifecycle/opSplitter.js +2 -3
  304. package/lib/opLifecycle/opSplitter.js.map +1 -1
  305. package/lib/opLifecycle/outbox.d.ts +1 -0
  306. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  307. package/lib/opLifecycle/outbox.js +7 -8
  308. package/lib/opLifecycle/outbox.js.map +1 -1
  309. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  310. package/lib/opLifecycle/remoteMessageProcessor.js +12 -6
  311. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  312. package/lib/packageVersion.d.ts +1 -1
  313. package/lib/packageVersion.js +1 -1
  314. package/lib/packageVersion.js.map +1 -1
  315. package/lib/pendingStateManager.d.ts +12 -5
  316. package/lib/pendingStateManager.d.ts.map +1 -1
  317. package/lib/pendingStateManager.js +21 -8
  318. package/lib/pendingStateManager.js.map +1 -1
  319. package/lib/scheduleManager.d.ts.map +1 -1
  320. package/lib/scheduleManager.js +3 -3
  321. package/lib/scheduleManager.js.map +1 -1
  322. package/lib/summary/index.d.ts +3 -3
  323. package/lib/summary/index.d.ts.map +1 -1
  324. package/lib/summary/index.js +1 -1
  325. package/lib/summary/index.js.map +1 -1
  326. package/lib/summary/orderedClientElection.d.ts +2 -3
  327. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  328. package/lib/summary/orderedClientElection.js +3 -3
  329. package/lib/summary/orderedClientElection.js.map +1 -1
  330. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  331. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  332. package/lib/summary/runningSummarizer.d.ts +27 -4
  333. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  334. package/lib/summary/runningSummarizer.js +240 -68
  335. package/lib/summary/runningSummarizer.js.map +1 -1
  336. package/lib/summary/summarizer.d.ts +6 -5
  337. package/lib/summary/summarizer.d.ts.map +1 -1
  338. package/lib/summary/summarizer.js +69 -65
  339. package/lib/summary/summarizer.js.map +1 -1
  340. package/lib/summary/summarizerClientElection.d.ts +2 -2
  341. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  342. package/lib/summary/summarizerClientElection.js +1 -1
  343. package/lib/summary/summarizerClientElection.js.map +1 -1
  344. package/lib/summary/summarizerHeuristics.js +1 -1
  345. package/lib/summary/summarizerHeuristics.js.map +1 -1
  346. package/lib/summary/summarizerNode/index.d.ts +1 -1
  347. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  348. package/lib/summary/summarizerNode/index.js.map +1 -1
  349. package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -14
  350. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  351. package/lib/summary/summarizerNode/summarizerNode.js +16 -93
  352. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  353. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  354. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  355. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  356. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
  357. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  358. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -86
  359. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  360. package/lib/summary/summarizerTypes.d.ts +38 -25
  361. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  362. package/lib/summary/summarizerTypes.js.map +1 -1
  363. package/lib/summary/summaryCollection.d.ts +2 -3
  364. package/lib/summary/summaryCollection.d.ts.map +1 -1
  365. package/lib/summary/summaryCollection.js +2 -1
  366. package/lib/summary/summaryCollection.js.map +1 -1
  367. package/lib/summary/summaryFormat.js +1 -1
  368. package/lib/summary/summaryFormat.js.map +1 -1
  369. package/lib/summary/summaryGenerator.d.ts +10 -4
  370. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  371. package/lib/summary/summaryGenerator.js +46 -42
  372. package/lib/summary/summaryGenerator.js.map +1 -1
  373. package/lib/summary/summaryManager.d.ts +7 -6
  374. package/lib/summary/summaryManager.d.ts.map +1 -1
  375. package/lib/summary/summaryManager.js +26 -18
  376. package/lib/summary/summaryManager.js.map +1 -1
  377. package/package.json +30 -29
  378. package/src/batchTracker.ts +3 -2
  379. package/src/blobManager.ts +105 -185
  380. package/src/connectionTelemetry.ts +2 -1
  381. package/src/containerRuntime.ts +481 -267
  382. package/src/dataStore.ts +2 -3
  383. package/src/dataStoreContext.ts +5 -8
  384. package/src/dataStoreContexts.ts +2 -4
  385. package/src/dataStoreRegistry.ts +1 -1
  386. package/src/dataStores.ts +4 -7
  387. package/src/deltaManagerProxyBase.ts +1 -1
  388. package/src/deltaScheduler.ts +1 -1
  389. package/src/error.ts +18 -0
  390. package/src/gc/garbageCollection.ts +39 -41
  391. package/src/gc/gcConfigs.ts +4 -2
  392. package/src/gc/gcDefinitions.ts +4 -6
  393. package/src/gc/gcHelpers.ts +1 -1
  394. package/src/gc/gcSummaryStateTracker.ts +19 -65
  395. package/src/gc/gcTelemetry.ts +2 -0
  396. package/src/gc/gcUnreferencedStateTracker.ts +1 -1
  397. package/src/gc/index.ts +0 -1
  398. package/src/id-compressor/appendOnlySortedMap.ts +26 -87
  399. package/src/id-compressor/finalSpace.ts +67 -0
  400. package/src/id-compressor/idCompressor.ts +456 -1681
  401. package/src/id-compressor/identifiers.ts +42 -0
  402. package/src/id-compressor/index.ts +11 -20
  403. package/src/id-compressor/persistanceUtilities.ts +58 -0
  404. package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
  405. package/src/id-compressor/sessions.ts +405 -0
  406. package/src/id-compressor/utilities.ts +187 -0
  407. package/src/index.ts +7 -1
  408. package/src/opLifecycle/opCompressor.ts +3 -3
  409. package/src/opLifecycle/opDecompressor.ts +2 -1
  410. package/src/opLifecycle/opGroupingManager.ts +1 -1
  411. package/src/opLifecycle/opSplitter.ts +4 -4
  412. package/src/opLifecycle/outbox.ts +14 -11
  413. package/src/opLifecycle/remoteMessageProcessor.ts +19 -6
  414. package/src/packageVersion.ts +1 -1
  415. package/src/pendingStateManager.ts +50 -29
  416. package/src/scheduleManager.ts +6 -4
  417. package/src/summary/index.ts +4 -3
  418. package/src/summary/orderedClientElection.ts +8 -5
  419. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  420. package/src/summary/runningSummarizer.ts +273 -97
  421. package/src/summary/summarizer.ts +23 -12
  422. package/src/summary/summarizerClientElection.ts +2 -2
  423. package/src/summary/summarizerHeuristics.ts +1 -1
  424. package/src/summary/summarizerNode/index.ts +1 -2
  425. package/src/summary/summarizerNode/summarizerNode.ts +23 -145
  426. package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
  427. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +3 -123
  428. package/src/summary/summarizerTypes.ts +40 -25
  429. package/src/summary/summaryCollection.ts +3 -3
  430. package/src/summary/summaryFormat.ts +1 -1
  431. package/src/summary/summaryGenerator.ts +52 -55
  432. package/src/summary/summaryManager.ts +36 -13
  433. package/dist/id-compressor/idRange.d.ts +0 -11
  434. package/dist/id-compressor/idRange.d.ts.map +0 -1
  435. package/dist/id-compressor/idRange.js +0 -29
  436. package/dist/id-compressor/idRange.js.map +0 -1
  437. package/dist/id-compressor/numericUuid.d.ts +0 -59
  438. package/dist/id-compressor/numericUuid.d.ts.map +0 -1
  439. package/dist/id-compressor/numericUuid.js +0 -325
  440. package/dist/id-compressor/numericUuid.js.map +0 -1
  441. package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
  442. package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  443. package/dist/id-compressor/sessionIdNormalizer.js +0 -483
  444. package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
  445. package/dist/id-compressor/utils.d.ts +0 -57
  446. package/dist/id-compressor/utils.d.ts.map +0 -1
  447. package/dist/id-compressor/utils.js +0 -90
  448. package/dist/id-compressor/utils.js.map +0 -1
  449. package/dist/id-compressor/uuidUtilities.d.ts +0 -28
  450. package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
  451. package/dist/id-compressor/uuidUtilities.js +0 -104
  452. package/dist/id-compressor/uuidUtilities.js.map +0 -1
  453. package/lib/id-compressor/idRange.d.ts +0 -11
  454. package/lib/id-compressor/idRange.d.ts.map +0 -1
  455. package/lib/id-compressor/idRange.js +0 -25
  456. package/lib/id-compressor/idRange.js.map +0 -1
  457. package/lib/id-compressor/numericUuid.d.ts +0 -59
  458. package/lib/id-compressor/numericUuid.d.ts.map +0 -1
  459. package/lib/id-compressor/numericUuid.js +0 -315
  460. package/lib/id-compressor/numericUuid.js.map +0 -1
  461. package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
  462. package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  463. package/lib/id-compressor/sessionIdNormalizer.js +0 -479
  464. package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
  465. package/lib/id-compressor/utils.d.ts +0 -57
  466. package/lib/id-compressor/utils.d.ts.map +0 -1
  467. package/lib/id-compressor/utils.js +0 -79
  468. package/lib/id-compressor/utils.js.map +0 -1
  469. package/lib/id-compressor/uuidUtilities.d.ts +0 -28
  470. package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
  471. package/lib/id-compressor/uuidUtilities.js +0 -96
  472. package/lib/id-compressor/uuidUtilities.js.map +0 -1
  473. package/src/id-compressor/idRange.ts +0 -35
  474. package/src/id-compressor/numericUuid.ts +0 -383
  475. package/src/id-compressor/sessionIdNormalizer.ts +0 -609
  476. package/src/id-compressor/utils.ts +0 -114
  477. package/src/id-compressor/uuidUtilities.ts +0 -120
@@ -17,21 +17,17 @@ import {
17
17
  responseToException,
18
18
  SummaryTreeBuilder,
19
19
  } from "@fluidframework/runtime-utils";
20
- import {
21
- assert,
22
- bufferToString,
23
- Deferred,
24
- stringToBuffer,
25
- TypedEventEmitter,
26
- } from "@fluidframework/common-utils";
20
+ import { assert, Deferred } from "@fluidframework/core-utils";
21
+ import { bufferToString, stringToBuffer, TypedEventEmitter } from "@fluid-internal/client-utils";
27
22
  import {
28
23
  IContainerRuntime,
29
24
  IContainerRuntimeEvents,
30
25
  } from "@fluidframework/container-runtime-definitions";
31
26
  import { AttachState, ICriticalContainerError } from "@fluidframework/container-definitions";
32
27
  import {
33
- LoggingError,
34
28
  createChildMonitoringContext,
29
+ GenericError,
30
+ LoggingError,
35
31
  MonitoringContext,
36
32
  PerformanceEvent,
37
33
  } from "@fluidframework/telemetry-utils";
@@ -40,7 +36,7 @@ import {
40
36
  ISummaryTreeWithStats,
41
37
  ITelemetryContext,
42
38
  } from "@fluidframework/runtime-definitions";
43
- import { GenericError } from "@fluidframework/container-utils";
39
+
44
40
  import { ContainerRuntime, TombstoneResponseHeaderKey } from "./containerRuntime";
45
41
  import { sendGCUnexpectedUsageEvent, sweepAttachmentBlobsKey, throwOnTombstoneLoadKey } from "./gc";
46
42
  import { Throttler, formExponentialFn, IThrottler } from "./throttler";
@@ -122,20 +118,12 @@ export type IBlobManagerRuntime = Pick<
122
118
  Pick<ContainerRuntime, "gcTombstoneEnforcementAllowed"> &
123
119
  TypedEventEmitter<IContainerRuntimeEvents>;
124
120
 
125
- // Note that while offline we "submit" an op before uploading the blob, but we always
126
- // expect blobs to be uploaded before we actually see the op round-trip
127
- export enum PendingBlobStatus {
128
- OnlinePendingUpload,
129
- OnlinePendingOp,
130
- OfflinePendingUpload,
131
- OfflinePendingOp,
132
- }
133
-
134
121
  type ICreateBlobResponseWithTTL = ICreateBlobResponse & Partial<Record<"minTTLInSeconds", number>>;
135
122
 
136
123
  interface PendingBlob {
137
124
  blob: ArrayBufferLike;
138
- status: PendingBlobStatus;
125
+ uploading?: boolean;
126
+ opsent?: boolean;
139
127
  storageId?: string;
140
128
  handleP: Deferred<BlobHandle>;
141
129
  uploadP?: Promise<ICreateBlobResponse | void>;
@@ -144,7 +132,6 @@ interface PendingBlob {
144
132
  attached?: boolean;
145
133
  acked?: boolean;
146
134
  abortSignal?: AbortSignal;
147
- opsent?: boolean;
148
135
  }
149
136
 
150
137
  export interface IPendingBlobs {
@@ -177,9 +164,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
177
164
  private readonly redirectTable: Map<string, string | undefined>;
178
165
 
179
166
  /**
180
- * Blobs which have not been uploaded or for which we have not yet seen a BlobAttach op round-trip.
181
- * Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
182
- * we must save it. This is true for both the online and offline flow.
167
+ * Blobs which we have not yet seen a BlobAttach op round-trip and not yet attached to a DDS.
183
168
  */
184
169
  private readonly pendingBlobs: Map<string, PendingBlob> = new Map();
185
170
 
@@ -245,8 +230,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
245
230
  this.runtime.gcTombstoneEnforcementAllowed &&
246
231
  this.runtime.clientDetails.type !== summarizerClientType;
247
232
 
248
- this.runtime.on("disconnected", () => this.onDisconnected());
249
-
250
233
  this.redirectTable = this.load(snapshot);
251
234
 
252
235
  // Begin uploading stashed blobs from previous container instance
@@ -261,7 +244,8 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
261
244
  if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
262
245
  this.pendingBlobs.set(localId, {
263
246
  blob,
264
- status: PendingBlobStatus.OfflinePendingOp,
247
+ uploading: false,
248
+ opsent: true,
265
249
  handleP: new Deferred(),
266
250
  storageId,
267
251
  uploadP: undefined,
@@ -275,11 +259,12 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
275
259
  }
276
260
  this.pendingBlobs.set(localId, {
277
261
  blob,
278
- status: PendingBlobStatus.OfflinePendingUpload,
262
+ uploading: true,
279
263
  handleP: new Deferred(),
280
264
  uploadP: this.uploadBlob(localId, blob),
281
265
  attached,
282
266
  acked,
267
+ opsent: true,
283
268
  });
284
269
  });
285
270
 
@@ -289,13 +274,11 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
289
274
  pendingEntry !== undefined,
290
275
  0x725 /* Must have pending blob entry for upcoming op */,
291
276
  );
292
- pendingEntry.opsent = true;
293
277
  if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
294
278
  const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
295
279
  const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
296
280
  this.mc.logger.sendTelemetryEvent({
297
281
  eventName: "sendBlobAttach",
298
- entryStatus: pendingEntry.status,
299
282
  secondsSinceUpload,
300
283
  minTTLInSeconds: pendingEntry.minTTLInSeconds,
301
284
  expired,
@@ -309,27 +292,17 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
309
292
  {
310
293
  localId,
311
294
  blobId,
312
- entryStatus: pendingEntry.status,
313
295
  secondsSinceUpload,
314
296
  },
315
297
  ),
316
298
  );
317
299
  }
318
300
  }
301
+ pendingEntry.opsent = true;
319
302
  return sendBlobAttachOp(localId, blobId);
320
303
  };
321
304
  }
322
305
 
323
- private get pendingOfflineUploads() {
324
- return Array.from(this.pendingBlobs.values()).filter(
325
- (e) => e.status === PendingBlobStatus.OfflinePendingUpload,
326
- );
327
- }
328
-
329
- public get hasPendingOfflineUploads(): boolean {
330
- return this.pendingOfflineUploads.length > 0;
331
- }
332
-
333
306
  public get allBlobsAttached(): boolean {
334
307
  for (const [, entry] of this.pendingBlobs) {
335
308
  if (entry.attached === false) {
@@ -349,20 +322,21 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
349
322
  private createAbortError(pending?: PendingBlob) {
350
323
  return new LoggingError("uploadBlob aborted", {
351
324
  acked: pending?.acked,
352
- status: pending?.status,
353
325
  uploadTime: pending?.uploadTime,
354
326
  });
355
327
  }
356
328
  /**
357
329
  * Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
358
330
  */
359
- public async onConnected() {
331
+ public async processStashedChanges() {
360
332
  this.retryThrottler.cancel();
361
- const pendingUploads = this.pendingOfflineUploads.map(async (e) => e.uploadP);
333
+ const pendingUploads = Array.from(this.pendingBlobs.values())
334
+ .filter((e) => e.uploading === true)
335
+ .map(async (e) => e.uploadP);
362
336
  await PerformanceEvent.timedExecAsync(
363
337
  this.mc.logger,
364
338
  {
365
- eventName: "BlobUploadOnConnected",
339
+ eventName: "BlobUploadProcessStashedChanges",
366
340
  count: pendingUploads.length,
367
341
  },
368
342
  async () => Promise.all(pendingUploads),
@@ -370,42 +344,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
370
344
  );
371
345
  }
372
346
 
373
- /**
374
- * Transition online blobs waiting for BlobAttach op round-trip since we will not see the op until we are connected
375
- * again
376
- */
377
- private onDisconnected() {
378
- for (const [localId, entry] of this.pendingBlobs) {
379
- if (entry.status === PendingBlobStatus.OnlinePendingOp) {
380
- // This will submit another BlobAttach op for this blob. This is necessary because the one we sent
381
- // already didn't have the local ID.
382
- this.transitionToOffline(localId);
383
- }
384
- }
385
- }
386
-
387
- private async shutdownPendingBlobs(): Promise<void> {
388
- for (const [localId, entry] of this.pendingBlobs) {
389
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
390
- this.sendBlobAttachOp(localId, entry.storageId);
391
- entry.status = PendingBlobStatus.OfflinePendingUpload;
392
- entry.handleP.resolve(this.getBlobHandle(localId));
393
- } else if (entry.status === PendingBlobStatus.OnlinePendingOp) {
394
- entry.status = PendingBlobStatus.OfflinePendingOp;
395
- entry.handleP.resolve(this.getBlobHandle(localId));
396
- }
397
- }
398
- return new Promise<void>((resolve) => {
399
- if (this.allBlobsAttached) {
400
- resolve();
401
- } else {
402
- this.once("allBlobsAttached", () => {
403
- resolve();
404
- });
405
- }
406
- });
407
- }
408
-
409
347
  /**
410
348
  * Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
411
349
  * detached or there are no (non-pending) attachment blobs in the document
@@ -471,10 +409,8 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
471
409
  const callback = pending
472
410
  ? () => {
473
411
  pending.attached = true;
412
+ this.emit("blobAttached", pending);
474
413
  this.deletePendingBlobMaybe(id);
475
- if (this.allBlobsAttached) {
476
- this.emit("allBlobsAttached");
477
- }
478
414
  }
479
415
  : undefined;
480
416
  return new BlobHandle(
@@ -521,7 +457,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
521
457
  const localId = uuid();
522
458
  const pendingEntry: PendingBlob = {
523
459
  blob,
524
- status: PendingBlobStatus.OnlinePendingUpload,
460
+ uploading: true,
525
461
  handleP: new Deferred(),
526
462
  uploadP: this.uploadBlob(localId, blob),
527
463
  attached: false,
@@ -589,50 +525,37 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
589
525
  return;
590
526
  }
591
527
  assert(
592
- entry.status === PendingBlobStatus.OnlinePendingUpload ||
593
- entry.status === PendingBlobStatus.OfflinePendingUpload,
528
+ entry.uploading === true,
594
529
  0x386 /* Must have pending blob entry for uploaded blob */,
595
530
  );
596
531
  entry.storageId = response.id;
597
532
  entry.uploadTime = Date.now();
598
533
  entry.minTTLInSeconds = response.minTTLInSeconds;
599
- if (this.runtime.connected) {
600
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
601
- // Send a blob attach op. This serves two purposes:
602
- // 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
603
- // until its storage ID is added to the next summary.
604
- // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
605
- // blob from the server via the storage ID.
606
- this.sendBlobAttachOp(localId, response.id);
607
- if (this.storageIds.has(response.id)) {
608
- // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
609
- // an existing blob, we don't have to wait for the op to be ack'd since this step has already
610
- // happened before and so, the server won't delete it.
611
- this.setRedirection(localId, response.id);
612
- entry.handleP.resolve(this.getBlobHandle(localId));
613
- this.deletePendingBlobMaybe(localId);
614
- } else {
615
- // If there is already an op for this storage ID, append the local ID to the list. Once any op for
616
- // this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
617
- // blob alive in storage.
618
- this.opsInFlight.set(
619
- response.id,
620
- (this.opsInFlight.get(response.id) ?? []).concat(localId),
621
- );
622
- entry.status = PendingBlobStatus.OnlinePendingOp;
623
- }
624
- } else if (entry.status === PendingBlobStatus.OfflinePendingUpload) {
625
- // We already submitted a BlobAttach op for this blob when it was transitioned to offline flow
626
- entry.status = PendingBlobStatus.OfflinePendingOp;
627
- }
534
+ // Send a blob attach op. This serves two purposes:
535
+ // 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
536
+ // until its storage ID is added to the next summary.
537
+ // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
538
+ // blob from the server via the storage ID.
539
+ if (!entry.opsent) {
540
+ this.sendBlobAttachOp(localId, response.id);
541
+ }
542
+ if (this.storageIds.has(response.id)) {
543
+ // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
544
+ // an existing blob, we don't have to wait for the op to be ack'd since this step has already
545
+ // happened before and so, the server won't delete it.
546
+ this.setRedirection(localId, response.id);
547
+ entry.handleP.resolve(this.getBlobHandle(localId));
548
+ this.deletePendingBlobMaybe(localId);
628
549
  } else {
629
- // connected to storage but not ordering service?
630
- this.mc.logger.sendTelemetryEvent({ eventName: "BlobUploadSuccessWhileDisconnected" });
631
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
632
- this.transitionToOffline(localId);
633
- }
634
- entry.status = PendingBlobStatus.OfflinePendingOp;
550
+ // If there is already an op for this storage ID, append the local ID to the list. Once any op for
551
+ // this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
552
+ // blob alive in storage.
553
+ this.opsInFlight.set(
554
+ response.id,
555
+ (this.opsInFlight.get(response.id) ?? []).concat(localId),
556
+ );
635
557
  }
558
+
636
559
  return response;
637
560
  }
638
561
 
@@ -644,9 +567,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
644
567
  return;
645
568
  }
646
569
  if (!this.runtime.connected) {
647
- if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
648
- this.transitionToOffline(localId);
649
- }
650
570
  // we are probably not connected to storage but start another upload request in case we are
651
571
  entry.uploadP = this.retryThrottler
652
572
  .getDelay()
@@ -658,39 +578,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
658
578
  }
659
579
  }
660
580
 
661
- private transitionToOffline(localId: string) {
662
- assert(
663
- !this.runtime.connected,
664
- 0x388 /* Must only transition to offline flow while runtime is disconnected */,
665
- );
666
- const entry = this.pendingBlobs.get(localId);
667
- assert(!!entry, 0x389 /* No pending blob entry */);
668
- assert(
669
- [PendingBlobStatus.OnlinePendingUpload, PendingBlobStatus.OnlinePendingOp].includes(
670
- entry.status,
671
- ),
672
- 0x38a /* Blob must be in online flow to transition to offline flow */,
673
- );
674
-
675
- /**
676
- * If we haven't already submitted a BlobAttach op for this entry, send it before returning the blob handle.
677
- * This will make sure that the BlobAttach op is sequenced prior to any ops referencing the handle. Otherwise,
678
- * an invalid handle could be added to the document.
679
- * storageId may be undefined but since we are not connected we will have a chance to add it when reSubmit()
680
- * is called on reconnection.
681
- */
682
- if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
683
- this.sendBlobAttachOp(localId, entry.storageId);
684
- }
685
-
686
- entry.status =
687
- entry.status === PendingBlobStatus.OnlinePendingUpload
688
- ? PendingBlobStatus.OfflinePendingUpload
689
- : PendingBlobStatus.OfflinePendingOp;
690
-
691
- entry.handleP.resolve(this.getBlobHandle(localId));
692
- }
693
-
694
581
  /**
695
582
  * Resubmit a BlobAttach op. Used to add storage IDs to ops that were
696
583
  * submitted to runtime while disconnected.
@@ -705,8 +592,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
705
592
  if (!blobId) {
706
593
  // We submitted this op while offline. The blob should have been uploaded by now.
707
594
  assert(
708
- pendingEntry?.status === PendingBlobStatus.OfflinePendingOp &&
709
- !!pendingEntry?.storageId,
595
+ pendingEntry?.opsent === true && !!pendingEntry?.storageId,
710
596
  0x38d /* blob must be uploaded before resubmitting BlobAttach op */,
711
597
  );
712
598
  return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
@@ -750,22 +636,17 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
750
636
  entry !== undefined,
751
637
  0x38f /* local online BlobAttach op with no pending blob entry */,
752
638
  );
753
-
754
- // It's possible we transitioned to offline flow while waiting for this op.
755
- if (entry.status === PendingBlobStatus.OnlinePendingOp) {
756
- this.setRedirection(pendingLocalId, blobId);
757
- entry.acked = true;
758
- entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
759
- this.deletePendingBlobMaybe(pendingLocalId);
760
- }
639
+ this.setRedirection(pendingLocalId, blobId);
640
+ entry.acked = true;
641
+ entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
642
+ this.deletePendingBlobMaybe(pendingLocalId);
761
643
  });
762
644
  this.opsInFlight.delete(blobId);
763
645
  }
764
- // offline flow does not resolve the handle (since it was already resolved)
765
- // but we still need to delete the entry in case is acked and attached.
766
646
  const localEntry = this.pendingBlobs.get(localId);
767
647
  if (localEntry) {
768
648
  localEntry.acked = true;
649
+ localEntry.handleP.resolve(this.getBlobHandle(localId));
769
650
  this.deletePendingBlobMaybe(localId);
770
651
  }
771
652
  }
@@ -1037,22 +918,61 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
1037
918
  }
1038
919
  }
1039
920
 
1040
- public async getPendingBlobs(waitBlobsToAttach?: boolean): Promise<IPendingBlobs> {
1041
- if (waitBlobsToAttach) {
1042
- await this.shutdownPendingBlobs();
1043
- }
1044
- const blobs = {};
1045
- for (const [key, entry] of this.pendingBlobs) {
1046
- blobs[key] = {
1047
- blob: bufferToString(entry.blob, "base64"),
1048
- storageId: entry.storageId,
1049
- attached: entry.attached,
1050
- acked: entry.acked,
1051
- minTTLInSeconds: entry.minTTLInSeconds,
1052
- uploadTime: entry.uploadTime,
1053
- };
1054
- }
1055
- return blobs;
921
+ public async getPendingBlobs(waitBlobsToAttach?: boolean): Promise<IPendingBlobs | undefined> {
922
+ return PerformanceEvent.timedExecAsync(
923
+ this.mc.logger,
924
+ { eventName: "GetPendingBlobs" },
925
+ async () => {
926
+ if (this.pendingBlobs.size === 0) {
927
+ return;
928
+ }
929
+ const blobs = {};
930
+ const localBlobs = new Set<PendingBlob>();
931
+ while (localBlobs.size < this.pendingBlobs.size) {
932
+ const attachBlobsP: Promise<void>[] = [];
933
+ for (const [id, entry] of this.pendingBlobs) {
934
+ if (!localBlobs.has(entry)) {
935
+ localBlobs.add(entry);
936
+ if (waitBlobsToAttach) {
937
+ if (!entry.opsent) {
938
+ this.sendBlobAttachOp(id, entry.storageId);
939
+ }
940
+ entry.handleP.resolve(this.getBlobHandle(id));
941
+ attachBlobsP.push(
942
+ new Promise<void>((resolve) => {
943
+ const onBlobAttached = (attachedEntry) => {
944
+ if (attachedEntry === entry) {
945
+ this.off("blobAttached", onBlobAttached);
946
+ resolve();
947
+ }
948
+ };
949
+ if (!entry.attached) {
950
+ this.on("blobAttached", onBlobAttached);
951
+ } else {
952
+ resolve();
953
+ }
954
+ }),
955
+ );
956
+ }
957
+ }
958
+ }
959
+ await Promise.all(attachBlobsP);
960
+ }
961
+ // another for is needed to correctly mark attach state
962
+ // future optimization won't add unattached blobs to the list
963
+ for (const [id, entry] of this.pendingBlobs) {
964
+ blobs[id] = {
965
+ blob: bufferToString(entry.blob, "base64"),
966
+ storageId: entry.storageId,
967
+ attached: entry.attached,
968
+ acked: entry.acked,
969
+ minTTLInSeconds: entry.minTTLInSeconds,
970
+ uploadTime: entry.uploadTime,
971
+ };
972
+ }
973
+ return blobs;
974
+ },
975
+ );
1056
976
  }
1057
977
  }
1058
978
 
@@ -14,7 +14,8 @@ import {
14
14
  ISequencedDocumentMessage,
15
15
  MessageType,
16
16
  } from "@fluidframework/protocol-definitions";
17
- import { assert, performance } from "@fluidframework/common-utils";
17
+ import { assert } from "@fluidframework/core-utils";
18
+ import { performance } from "@fluid-internal/client-utils";
18
19
 
19
20
  /**
20
21
  * We report various latency-related errors when waiting for op roundtrip takes longer than that amout of time.