@fluidframework/container-runtime 2.0.0-internal.3.1.0 → 2.0.0-internal.3.2.1

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 (351) hide show
  1. package/dist/blobManager.d.ts +6 -0
  2. package/dist/blobManager.d.ts.map +1 -1
  3. package/dist/blobManager.js +31 -6
  4. package/dist/blobManager.js.map +1 -1
  5. package/dist/containerRuntime.d.ts +17 -15
  6. package/dist/containerRuntime.d.ts.map +1 -1
  7. package/dist/containerRuntime.js +158 -121
  8. package/dist/containerRuntime.js.map +1 -1
  9. package/dist/dataStoreContext.d.ts +21 -12
  10. package/dist/dataStoreContext.d.ts.map +1 -1
  11. package/dist/dataStoreContext.js +76 -50
  12. package/dist/dataStoreContext.js.map +1 -1
  13. package/dist/dataStores.d.ts +9 -10
  14. package/dist/dataStores.d.ts.map +1 -1
  15. package/dist/dataStores.js +42 -49
  16. package/dist/dataStores.js.map +1 -1
  17. package/dist/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
  18. package/dist/gc/garbageCollection.d.ts.map +1 -0
  19. package/dist/{garbageCollection.js → gc/garbageCollection.js} +77 -353
  20. package/dist/gc/garbageCollection.js.map +1 -0
  21. package/dist/gc/gcDefinitions.d.ts +189 -0
  22. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  23. package/dist/{garbageCollectionConstants.js → gc/gcDefinitions.js} +24 -2
  24. package/dist/gc/gcDefinitions.js.map +1 -0
  25. package/{lib/garbageCollectionHelpers.d.ts → dist/gc/gcHelpers.d.ts} +5 -1
  26. package/dist/gc/gcHelpers.d.ts.map +1 -0
  27. package/dist/{garbageCollectionHelpers.js → gc/gcHelpers.js} +27 -7
  28. package/dist/gc/gcHelpers.js.map +1 -0
  29. package/dist/gc/gcSummaryStateTracker.d.ts +86 -0
  30. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  31. package/dist/gc/gcSummaryStateTracker.js +246 -0
  32. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  33. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  34. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
  35. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  36. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  37. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  38. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  39. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  40. package/dist/gc/index.d.ts +11 -0
  41. package/dist/gc/index.d.ts.map +1 -0
  42. package/dist/gc/index.js +40 -0
  43. package/dist/gc/index.js.map +1 -0
  44. package/dist/index.d.ts +2 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -9
  47. package/dist/index.js.map +1 -1
  48. package/dist/opLifecycle/batchManager.d.ts +2 -13
  49. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  50. package/dist/opLifecycle/batchManager.js +7 -36
  51. package/dist/opLifecycle/batchManager.js.map +1 -1
  52. package/dist/opLifecycle/definitions.d.ts +4 -0
  53. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  54. package/dist/opLifecycle/definitions.js.map +1 -1
  55. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  56. package/dist/opLifecycle/opCompressor.js +1 -0
  57. package/dist/opLifecycle/opCompressor.js.map +1 -1
  58. package/dist/opLifecycle/opSplitter.d.ts +1 -1
  59. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  60. package/dist/opLifecycle/opSplitter.js +20 -12
  61. package/dist/opLifecycle/opSplitter.js.map +1 -1
  62. package/dist/opLifecycle/outbox.d.ts +19 -3
  63. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  64. package/dist/opLifecycle/outbox.js +59 -28
  65. package/dist/opLifecycle/outbox.js.map +1 -1
  66. package/dist/packageVersion.d.ts +1 -1
  67. package/dist/packageVersion.js +1 -1
  68. package/dist/packageVersion.js.map +1 -1
  69. package/dist/pendingStateManager.d.ts +1 -2
  70. package/dist/pendingStateManager.d.ts.map +1 -1
  71. package/dist/pendingStateManager.js +14 -9
  72. package/dist/pendingStateManager.js.map +1 -1
  73. package/dist/summary/index.d.ts +17 -0
  74. package/dist/summary/index.d.ts.map +1 -0
  75. package/dist/summary/index.js +47 -0
  76. package/dist/summary/index.js.map +1 -0
  77. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  78. package/dist/summary/orderedClientElection.js.map +1 -0
  79. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  80. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  81. package/{lib → dist/summary}/runningSummarizer.d.ts +19 -18
  82. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  83. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +158 -56
  84. package/dist/summary/runningSummarizer.js.map +1 -0
  85. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
  86. package/dist/summary/summarizer.d.ts.map +1 -0
  87. package/dist/{summarizer.js → summary/summarizer.js} +1 -61
  88. package/dist/summary/summarizer.js.map +1 -0
  89. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  90. package/dist/summary/summarizerClientElection.js.map +1 -0
  91. package/dist/summary/summarizerHandle.d.ts.map +1 -0
  92. package/dist/summary/summarizerHandle.js.map +1 -0
  93. package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  94. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  95. package/dist/summary/summarizerHeuristics.js.map +1 -0
  96. package/{lib → dist/summary}/summarizerTypes.d.ts +1 -1
  97. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  98. package/dist/summary/summarizerTypes.js.map +1 -0
  99. package/dist/summary/summaryCollection.d.ts.map +1 -0
  100. package/dist/summary/summaryCollection.js.map +1 -0
  101. package/{lib → dist/summary}/summaryFormat.d.ts +1 -43
  102. package/dist/summary/summaryFormat.d.ts.map +1 -0
  103. package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
  104. package/dist/summary/summaryFormat.js.map +1 -0
  105. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  106. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
  107. package/dist/summary/summaryGenerator.js.map +1 -0
  108. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  109. package/dist/summary/summaryManager.d.ts.map +1 -0
  110. package/dist/summary/summaryManager.js.map +1 -0
  111. package/lib/blobManager.d.ts +6 -0
  112. package/lib/blobManager.d.ts.map +1 -1
  113. package/lib/blobManager.js +28 -3
  114. package/lib/blobManager.js.map +1 -1
  115. package/lib/containerRuntime.d.ts +17 -15
  116. package/lib/containerRuntime.d.ts.map +1 -1
  117. package/lib/containerRuntime.js +127 -90
  118. package/lib/containerRuntime.js.map +1 -1
  119. package/lib/dataStoreContext.d.ts +21 -12
  120. package/lib/dataStoreContext.d.ts.map +1 -1
  121. package/lib/dataStoreContext.js +64 -38
  122. package/lib/dataStoreContext.js.map +1 -1
  123. package/lib/dataStores.d.ts +9 -10
  124. package/lib/dataStores.d.ts.map +1 -1
  125. package/lib/dataStores.js +33 -40
  126. package/lib/dataStores.js.map +1 -1
  127. package/lib/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
  128. package/lib/gc/garbageCollection.d.ts.map +1 -0
  129. package/lib/{garbageCollection.js → gc/garbageCollection.js} +44 -319
  130. package/lib/gc/garbageCollection.js.map +1 -0
  131. package/lib/gc/gcDefinitions.d.ts +189 -0
  132. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  133. package/lib/{garbageCollectionConstants.js → gc/gcDefinitions.js} +23 -1
  134. package/lib/gc/gcDefinitions.js.map +1 -0
  135. package/{dist/garbageCollectionHelpers.d.ts → lib/gc/gcHelpers.d.ts} +5 -1
  136. package/lib/gc/gcHelpers.d.ts.map +1 -0
  137. package/lib/{garbageCollectionHelpers.js → gc/gcHelpers.js} +20 -2
  138. package/lib/gc/gcHelpers.js.map +1 -0
  139. package/lib/gc/gcSummaryStateTracker.d.ts +86 -0
  140. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  141. package/lib/gc/gcSummaryStateTracker.js +242 -0
  142. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  143. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  144. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
  145. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  146. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  147. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  148. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  149. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  150. package/lib/gc/index.d.ts +11 -0
  151. package/lib/gc/index.d.ts.map +1 -0
  152. package/lib/gc/index.js +11 -0
  153. package/lib/gc/index.js.map +1 -0
  154. package/lib/index.d.ts +2 -5
  155. package/lib/index.d.ts.map +1 -1
  156. package/lib/index.js +1 -4
  157. package/lib/index.js.map +1 -1
  158. package/lib/opLifecycle/batchManager.d.ts +2 -13
  159. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  160. package/lib/opLifecycle/batchManager.js +7 -36
  161. package/lib/opLifecycle/batchManager.js.map +1 -1
  162. package/lib/opLifecycle/definitions.d.ts +4 -0
  163. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  164. package/lib/opLifecycle/definitions.js.map +1 -1
  165. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  166. package/lib/opLifecycle/opCompressor.js +1 -0
  167. package/lib/opLifecycle/opCompressor.js.map +1 -1
  168. package/lib/opLifecycle/opSplitter.d.ts +1 -1
  169. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  170. package/lib/opLifecycle/opSplitter.js +20 -12
  171. package/lib/opLifecycle/opSplitter.js.map +1 -1
  172. package/lib/opLifecycle/outbox.d.ts +19 -3
  173. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  174. package/lib/opLifecycle/outbox.js +60 -29
  175. package/lib/opLifecycle/outbox.js.map +1 -1
  176. package/lib/packageVersion.d.ts +1 -1
  177. package/lib/packageVersion.js +1 -1
  178. package/lib/packageVersion.js.map +1 -1
  179. package/lib/pendingStateManager.d.ts +1 -2
  180. package/lib/pendingStateManager.d.ts.map +1 -1
  181. package/lib/pendingStateManager.js +14 -9
  182. package/lib/pendingStateManager.js.map +1 -1
  183. package/lib/summary/index.d.ts +17 -0
  184. package/lib/summary/index.d.ts.map +1 -0
  185. package/lib/summary/index.js +16 -0
  186. package/lib/summary/index.js.map +1 -0
  187. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  188. package/lib/summary/orderedClientElection.js.map +1 -0
  189. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  190. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  191. package/{dist → lib/summary}/runningSummarizer.d.ts +19 -18
  192. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  193. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +159 -57
  194. package/lib/summary/runningSummarizer.js.map +1 -0
  195. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
  196. package/lib/summary/summarizer.d.ts.map +1 -0
  197. package/lib/{summarizer.js → summary/summarizer.js} +3 -63
  198. package/lib/summary/summarizer.js.map +1 -0
  199. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  200. package/lib/summary/summarizerClientElection.js.map +1 -0
  201. package/lib/summary/summarizerHandle.d.ts.map +1 -0
  202. package/lib/summary/summarizerHandle.js.map +1 -0
  203. package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  204. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  205. package/lib/summary/summarizerHeuristics.js.map +1 -0
  206. package/{dist → lib/summary}/summarizerTypes.d.ts +1 -1
  207. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  208. package/lib/summary/summarizerTypes.js.map +1 -0
  209. package/lib/summary/summaryCollection.d.ts.map +1 -0
  210. package/lib/summary/summaryCollection.js.map +1 -0
  211. package/{dist → lib/summary}/summaryFormat.d.ts +1 -43
  212. package/lib/summary/summaryFormat.d.ts.map +1 -0
  213. package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
  214. package/lib/summary/summaryFormat.js.map +1 -0
  215. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  216. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
  217. package/lib/summary/summaryGenerator.js.map +1 -0
  218. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  219. package/lib/summary/summaryManager.d.ts.map +1 -0
  220. package/lib/summary/summaryManager.js.map +1 -0
  221. package/package.json +125 -122
  222. package/src/blobManager.ts +33 -3
  223. package/src/containerRuntime.ts +178 -106
  224. package/src/dataStoreContext.ts +90 -49
  225. package/src/dataStores.ts +44 -51
  226. package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
  227. package/src/{garbageCollection.ts → gc/garbageCollection.ts} +90 -560
  228. package/src/gc/gcDefinitions.ts +244 -0
  229. package/src/{garbageCollectionHelpers.ts → gc/gcHelpers.ts} +26 -1
  230. package/src/gc/gcSummaryStateTracker.ts +339 -0
  231. package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
  232. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  233. package/src/gc/index.ts +40 -0
  234. package/src/index.ts +10 -14
  235. package/src/opLifecycle/batchManager.ts +7 -54
  236. package/src/opLifecycle/definitions.ts +4 -0
  237. package/src/opLifecycle/opCompressor.ts +1 -0
  238. package/src/opLifecycle/opSplitter.ts +33 -14
  239. package/src/opLifecycle/outbox.ts +84 -38
  240. package/src/packageVersion.ts +1 -1
  241. package/src/pendingStateManager.ts +26 -14
  242. package/src/summary/index.ts +99 -0
  243. package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +279 -139
  244. package/src/{summarizer.ts → summary/summarizer.ts} +5 -76
  245. package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +1 -1
  246. package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +1 -1
  247. package/src/{summaryFormat.ts → summary/summaryFormat.ts} +1 -53
  248. package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +9 -9
  249. package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
  250. package/dist/garbageCollection.d.ts.map +0 -1
  251. package/dist/garbageCollection.js.map +0 -1
  252. package/dist/garbageCollectionConstants.d.ts +0 -26
  253. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  254. package/dist/garbageCollectionConstants.js.map +0 -1
  255. package/dist/garbageCollectionHelpers.d.ts.map +0 -1
  256. package/dist/garbageCollectionHelpers.js.map +0 -1
  257. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  258. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  259. package/dist/orderedClientElection.d.ts.map +0 -1
  260. package/dist/orderedClientElection.js.map +0 -1
  261. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  262. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  263. package/dist/runningSummarizer.d.ts.map +0 -1
  264. package/dist/runningSummarizer.js.map +0 -1
  265. package/dist/summarizer.d.ts.map +0 -1
  266. package/dist/summarizer.js.map +0 -1
  267. package/dist/summarizerClientElection.d.ts.map +0 -1
  268. package/dist/summarizerClientElection.js.map +0 -1
  269. package/dist/summarizerHandle.d.ts.map +0 -1
  270. package/dist/summarizerHandle.js.map +0 -1
  271. package/dist/summarizerHeuristics.d.ts.map +0 -1
  272. package/dist/summarizerHeuristics.js.map +0 -1
  273. package/dist/summarizerTypes.d.ts.map +0 -1
  274. package/dist/summarizerTypes.js.map +0 -1
  275. package/dist/summaryCollection.d.ts.map +0 -1
  276. package/dist/summaryCollection.js.map +0 -1
  277. package/dist/summaryFormat.d.ts.map +0 -1
  278. package/dist/summaryFormat.js.map +0 -1
  279. package/dist/summaryGenerator.d.ts.map +0 -1
  280. package/dist/summaryGenerator.js.map +0 -1
  281. package/dist/summaryManager.d.ts.map +0 -1
  282. package/dist/summaryManager.js.map +0 -1
  283. package/lib/garbageCollection.d.ts.map +0 -1
  284. package/lib/garbageCollection.js.map +0 -1
  285. package/lib/garbageCollectionConstants.d.ts +0 -26
  286. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  287. package/lib/garbageCollectionConstants.js.map +0 -1
  288. package/lib/garbageCollectionHelpers.d.ts.map +0 -1
  289. package/lib/garbageCollectionHelpers.js.map +0 -1
  290. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  291. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  292. package/lib/orderedClientElection.d.ts.map +0 -1
  293. package/lib/orderedClientElection.js.map +0 -1
  294. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  295. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  296. package/lib/runningSummarizer.d.ts.map +0 -1
  297. package/lib/runningSummarizer.js.map +0 -1
  298. package/lib/summarizer.d.ts.map +0 -1
  299. package/lib/summarizer.js.map +0 -1
  300. package/lib/summarizerClientElection.d.ts.map +0 -1
  301. package/lib/summarizerClientElection.js.map +0 -1
  302. package/lib/summarizerHandle.d.ts.map +0 -1
  303. package/lib/summarizerHandle.js.map +0 -1
  304. package/lib/summarizerHeuristics.d.ts.map +0 -1
  305. package/lib/summarizerHeuristics.js.map +0 -1
  306. package/lib/summarizerTypes.d.ts.map +0 -1
  307. package/lib/summarizerTypes.js.map +0 -1
  308. package/lib/summaryCollection.d.ts.map +0 -1
  309. package/lib/summaryCollection.js.map +0 -1
  310. package/lib/summaryFormat.d.ts.map +0 -1
  311. package/lib/summaryFormat.js.map +0 -1
  312. package/lib/summaryGenerator.d.ts.map +0 -1
  313. package/lib/summaryGenerator.js.map +0 -1
  314. package/lib/summaryManager.d.ts.map +0 -1
  315. package/lib/summaryManager.js.map +0 -1
  316. package/src/garbageCollectionConstants.ts +0 -44
  317. /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  318. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  319. /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  320. /package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  321. /package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  322. /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  323. /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  324. /package/dist/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  325. /package/dist/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  326. /package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
  327. /package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  328. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  329. /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  330. /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  331. /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
  332. /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  333. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  334. /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  335. /package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  336. /package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  337. /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  338. /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  339. /package/lib/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  340. /package/lib/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  341. /package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
  342. /package/lib/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  343. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  344. /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  345. /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  346. /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
  347. /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
  348. /package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +0 -0
  349. /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
  350. /package/src/{summarizerHandle.ts → summary/summarizerHandle.ts} +0 -0
  351. /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
@@ -68,13 +68,13 @@ import {
68
68
  } from "@fluidframework/protocol-definitions";
69
69
  import {
70
70
  FlushMode,
71
+ FlushModeExperimental,
71
72
  gcTreeKey,
72
73
  InboundAttachMessage,
73
74
  IFluidDataStoreContextDetached,
74
75
  IFluidDataStoreRegistry,
75
76
  IFluidDataStoreChannel,
76
77
  IGarbageCollectionData,
77
- IGarbageCollectionDetailsBase,
78
78
  IEnvelope,
79
79
  IInboundSignalMessage,
80
80
  ISignalEnvelope,
@@ -99,7 +99,6 @@ import {
99
99
  create404Response,
100
100
  exceptionToResponse,
101
101
  requestFluidObject,
102
- responseToException,
103
102
  seqFromTree,
104
103
  calculateStats,
105
104
  TelemetryContext,
@@ -109,8 +108,6 @@ import { GCDataBuilder, trimLeadingAndTrailingSlashes } from "@fluidframework/ga
109
108
  import { v4 as uuid } from "uuid";
110
109
  import { ContainerFluidHandleContext } from "./containerHandleContext";
111
110
  import { FluidDataStoreRegistry } from "./dataStoreRegistry";
112
- import { Summarizer } from "./summarizer";
113
- import { SummaryManager } from "./summaryManager";
114
111
  import { ReportOpPerfTelemetry, IPerfSignalReport } from "./connectionTelemetry";
115
112
  import { IPendingLocalState, PendingStateManager } from "./pendingStateManager";
116
113
  import { pkgVersion } from "./packageVersion";
@@ -126,16 +123,15 @@ import {
126
123
  ICreateContainerMetadata,
127
124
  ISummaryMetadataMessage,
128
125
  metadataBlobName,
126
+ Summarizer,
127
+ SummaryManager,
129
128
  wrapSummaryInChannelsTree,
130
- } from "./summaryFormat";
131
- import { SummaryCollection } from "./summaryCollection";
132
- import {
129
+ SummaryCollection,
133
130
  ISerializedElection,
134
131
  OrderedClientCollection,
135
132
  OrderedClientElection,
136
- } from "./orderedClientElection";
137
- import { SummarizerClientElection, summarizerClientType } from "./summarizerClientElection";
138
- import {
133
+ SummarizerClientElection,
134
+ summarizerClientType,
139
135
  SubmitSummaryResult,
140
136
  IConnectableRuntime,
141
137
  IGeneratedSummaryStats,
@@ -144,16 +140,18 @@ import {
144
140
  ISummarizerInternalsProvider,
145
141
  ISummarizerRuntime,
146
142
  IRefreshSummaryAckOptions,
147
- } from "./summarizerTypes";
143
+ RunWhileConnectedCoordinator,
144
+ } from "./summary";
148
145
  import { formExponentialFn, Throttler } from "./throttler";
149
- import { RunWhileConnectedCoordinator } from "./runWhileConnectedCoordinator";
150
146
  import {
151
147
  GarbageCollector,
152
148
  GCNodeType,
149
+ gcTombstoneGenerationOptionName,
153
150
  IGarbageCollectionRuntime,
154
151
  IGarbageCollector,
155
152
  IGCStats,
156
- } from "./garbageCollection";
153
+ shouldAllowGcTombstoneEnforcement,
154
+ } from "./gc";
157
155
  import { channelToDataStore, IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
158
156
  import { BindBatchTracker } from "./batchTracker";
159
157
  import {
@@ -170,8 +168,6 @@ import {
170
168
  OpSplitter,
171
169
  RemoteMessageProcessor,
172
170
  } from "./opLifecycle";
173
- import { shouldAllowGcTombstoneEnforcement } from "./garbageCollectionHelpers";
174
- import { gcTombstoneGenerationOptionName } from "./garbageCollectionConstants";
175
171
 
176
172
  export enum ContainerMessageType {
177
173
  // An op to be delivered to store
@@ -471,11 +467,6 @@ export interface IRootSummaryTreeWithStats extends ISummaryTreeWithStats {
471
467
  export enum RuntimeHeaders {
472
468
  /** True to wait for a data store to be created and loaded before returning it. */
473
469
  wait = "wait",
474
- /**
475
- * True if the request is from an external app. Used for GC to handle scenarios where a data store
476
- * is deleted and requested via an external app.
477
- */
478
- externalRequest = "externalRequest",
479
470
  /** True if the request is coming from an IFluidHandle. */
480
471
  viaHandle = "viaHandle",
481
472
  }
@@ -491,7 +482,6 @@ export const TombstoneResponseHeaderKey = "isTombstoned";
491
482
  */
492
483
  export interface RuntimeHeaderData {
493
484
  wait?: boolean;
494
- externalRequest?: boolean;
495
485
  viaHandle?: boolean;
496
486
  allowTombstone?: boolean;
497
487
  }
@@ -499,7 +489,6 @@ export interface RuntimeHeaderData {
499
489
  /** Default values for Runtime Headers */
500
490
  export const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {
501
491
  wait: true,
502
- externalRequest: false,
503
492
  viaHandle: false,
504
493
  allowTombstone: false,
505
494
  };
@@ -908,7 +897,7 @@ export class ContainerRuntime
908
897
 
909
898
  private _orderSequentiallyCalls: number = 0;
910
899
  private readonly _flushMode: FlushMode;
911
- private flushMicroTaskExists = false;
900
+ private flushTaskExists = false;
912
901
 
913
902
  private _connected: boolean;
914
903
 
@@ -967,6 +956,7 @@ export class ContainerRuntime
967
956
  private dirtyContainer: boolean;
968
957
  private emitDirtyDocumentEvent = true;
969
958
  private readonly enableOpReentryCheck: boolean;
959
+ private readonly disableAttachReorder: boolean | undefined;
970
960
 
971
961
  private readonly defaultTelemetrySignalSampleCount = 100;
972
962
  private _perfSignalData: IPerfSignalReport = {
@@ -1110,12 +1100,16 @@ export class ContainerRuntime
1110
1100
  }),
1111
1101
  });
1112
1102
 
1103
+ this.disableAttachReorder = this.mc.config.getBoolean(
1104
+ "Fluid.ContainerRuntime.disableAttachOpReorder",
1105
+ );
1106
+ const disableChunking = this.mc.config.getBoolean(
1107
+ "Fluid.ContainerRuntime.DisableCompressionChunking",
1108
+ );
1113
1109
  const opSplitter = new OpSplitter(
1114
1110
  chunks,
1115
1111
  this.context.submitBatchFn,
1116
- this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompressionChunking") === true
1117
- ? Number.POSITIVE_INFINITY
1118
- : runtimeOptions.chunkSizeInBytes,
1112
+ disableChunking === true ? Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes,
1119
1113
  runtimeOptions.maxBatchSizeInBytes,
1120
1114
  this.mc.logger,
1121
1115
  );
@@ -1127,10 +1121,13 @@ export class ContainerRuntime
1127
1121
  this.validateSummaryHeuristicConfiguration(this.summaryConfiguration);
1128
1122
  }
1129
1123
 
1124
+ const disableOpReentryCheck = this.mc.config.getBoolean(
1125
+ "Fluid.ContainerRuntime.DisableOpReentryCheck",
1126
+ );
1130
1127
  this.enableOpReentryCheck =
1131
1128
  runtimeOptions.enableOpReentryCheck === true &&
1132
1129
  // Allow for a break-glass config to override the options
1133
- this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableOpReentryCheck") !== true;
1130
+ disableOpReentryCheck !== true;
1134
1131
 
1135
1132
  this.summariesDisabled = this.isSummariesDisabled();
1136
1133
  this.heuristicsDisabled = this.isHeuristicsDisabled();
@@ -1141,7 +1138,16 @@ export class ContainerRuntime
1141
1138
  this.mc.config.getNumber(maxConsecutiveReconnectsKey) ??
1142
1139
  this.defaultMaxConsecutiveReconnects;
1143
1140
 
1144
- this._flushMode = runtimeOptions.flushMode;
1141
+ if (
1142
+ runtimeOptions.flushMode === (FlushModeExperimental.Async as unknown as FlushMode) &&
1143
+ context.supportedFeatures?.get("referenceSequenceNumbers") !== true
1144
+ ) {
1145
+ // The loader does not support reference sequence numbers, falling back on FlushMode.TurnBased
1146
+ this.mc.logger.sendErrorEvent({ eventName: "FlushModeFallback" });
1147
+ this._flushMode = FlushMode.TurnBased;
1148
+ } else {
1149
+ this._flushMode = runtimeOptions.flushMode;
1150
+ }
1145
1151
 
1146
1152
  const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;
1147
1153
  const baseSnapshot: ISnapshotTree | undefined =
@@ -1212,7 +1218,6 @@ export class ContainerRuntime
1212
1218
  (
1213
1219
  summarizeInternal: SummarizeInternalFn,
1214
1220
  getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
1215
- getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,
1216
1221
  ) =>
1217
1222
  this.summarizerNode.createChild(
1218
1223
  summarizeInternal,
@@ -1220,11 +1225,9 @@ export class ContainerRuntime
1220
1225
  createParam,
1221
1226
  undefined,
1222
1227
  getGCDataFn,
1223
- getBaseGCDetailsFn,
1224
1228
  ),
1225
1229
  (id: string) => this.summarizerNode.deleteChild(id),
1226
1230
  this.mc.logger,
1227
- async () => this.garbageCollector.getBaseGCDetails(),
1228
1231
  (path: string, timestampMs: number, packagePath?: readonly string[]) =>
1229
1232
  this.garbageCollector.nodeUpdated(path, "Changed", timestampMs, packagePath),
1230
1233
  (path: string) => this.garbageCollector.isNodeDeleted(path),
@@ -1272,14 +1275,20 @@ export class ContainerRuntime
1272
1275
  pendingRuntimeState?.pending,
1273
1276
  );
1274
1277
 
1278
+ const disableCompression = this.mc.config.getBoolean(
1279
+ "Fluid.ContainerRuntime.DisableCompression",
1280
+ );
1275
1281
  const compressionOptions =
1276
- this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompression") === true
1282
+ disableCompression === true
1277
1283
  ? {
1278
1284
  minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
1279
1285
  compressionAlgorithm: CompressionAlgorithms.lz4,
1280
1286
  }
1281
1287
  : runtimeOptions.compressionOptions;
1282
1288
 
1289
+ const disablePartialFlush = this.mc.config.getBoolean(
1290
+ "Fluid.ContainerRuntime.DisablePartialFlush",
1291
+ );
1283
1292
  this.outbox = new Outbox({
1284
1293
  shouldSend: () => this.canSendOps(),
1285
1294
  pendingStateManager: this.pendingStateManager,
@@ -1289,7 +1298,7 @@ export class ContainerRuntime
1289
1298
  config: {
1290
1299
  compressionOptions,
1291
1300
  maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,
1292
- enableOpReentryCheck: this.enableOpReentryCheck,
1301
+ disablePartialFlush: disablePartialFlush === true,
1293
1302
  },
1294
1303
  logger: this.mc.logger,
1295
1304
  });
@@ -1426,6 +1435,14 @@ export class ContainerRuntime
1426
1435
  summaryFormatVersion: metadata?.summaryFormatVersion,
1427
1436
  disableIsolatedChannels: metadata?.disableIsolatedChannels,
1428
1437
  gcVersion: metadata?.gcFeature,
1438
+ options: JSON.stringify(runtimeOptions),
1439
+ featureGates: JSON.stringify({
1440
+ disableCompression,
1441
+ disableOpReentryCheck,
1442
+ disableChunking,
1443
+ disableAttachReorder: this.disableAttachReorder,
1444
+ disablePartialFlush,
1445
+ }),
1429
1446
  });
1430
1447
 
1431
1448
  ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);
@@ -1467,6 +1484,9 @@ export class ContainerRuntime
1467
1484
  this.removeAllListeners();
1468
1485
  }
1469
1486
 
1487
+ /**
1488
+ * @deprecated 2.0.0-internal.3.2.0 ContainerRuntime is not an IFluidTokenProvider. Token providers should be accessed using normal provider patterns.
1489
+ */
1470
1490
  public get IFluidTokenProvider() {
1471
1491
  if (this.options?.intelligence) {
1472
1492
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -1565,29 +1585,6 @@ export class ContainerRuntime
1565
1585
  await this.dataStores.waitIfPendingAlias(id);
1566
1586
  const internalId = this.internalId(id);
1567
1587
  const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);
1568
-
1569
- /**
1570
- * If GC should run and this an external app request with "externalRequest" header, we need to return
1571
- * an error if the data store being requested is marked as unreferenced as per the data store's base
1572
- * GC data.
1573
- *
1574
- * This is a workaround to handle scenarios where a data store shared with an external app is deleted
1575
- * and marked as unreferenced by GC. Returning an error will fail to load the data store for the app.
1576
- */
1577
- if (
1578
- request.headers?.[RuntimeHeaders.externalRequest] &&
1579
- this.garbageCollector.shouldRunGC
1580
- ) {
1581
- // The data store is referenced if used routes in the base summary has a route to self.
1582
- // Older documents may not have used routes in the summary. They are considered referenced.
1583
- const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;
1584
- if (
1585
- !(usedRoutes === undefined || usedRoutes.includes("") || usedRoutes.includes("/"))
1586
- ) {
1587
- throw responseToException(create404Response(request), request);
1588
- }
1589
- }
1590
-
1591
1588
  const dataStoreChannel = await dataStoreContext.realize();
1592
1589
 
1593
1590
  // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
@@ -1965,9 +1962,11 @@ export class ContainerRuntime
1965
1962
  clientSignalSequenceNumber: envelope.clientSignalSequenceNumber,
1966
1963
  });
1967
1964
  } else if (
1965
+ this.consecutiveReconnects === 0 &&
1968
1966
  envelope.clientSignalSequenceNumber ===
1969
- this._perfSignalData.trackingSignalSequenceNumber
1967
+ this._perfSignalData.trackingSignalSequenceNumber
1970
1968
  ) {
1969
+ // only logging for the first connection and the trackingSignalSequenceNUmber.
1971
1970
  this.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);
1972
1971
  this._perfSignalData.trackingSignalSequenceNumber = undefined;
1973
1972
  }
@@ -2115,7 +2114,7 @@ export class ContainerRuntime
2115
2114
  * Are we in the middle of batching ops together?
2116
2115
  */
2117
2116
  private currentlyBatching() {
2118
- return this.flushMode === FlushMode.TurnBased || this._orderSequentiallyCalls !== 0;
2117
+ return this.flushMode !== FlushMode.Immediate || this._orderSequentiallyCalls !== 0;
2119
2118
  }
2120
2119
 
2121
2120
  public getQuorum(): IQuorumClients {
@@ -2302,12 +2301,24 @@ export class ContainerRuntime
2302
2301
  fullGC,
2303
2302
  } = options;
2304
2303
 
2304
+ const telemetryContext = new TelemetryContext();
2305
+ // Add the options that are used to generate this summary to the telemetry context.
2306
+ telemetryContext.setMultiple("fluid_Summarize", "Options", {
2307
+ fullTree,
2308
+ trackState,
2309
+ runGC,
2310
+ fullGC,
2311
+ runSweep,
2312
+ });
2313
+
2305
2314
  let gcStats: IGCStats | undefined;
2306
2315
  if (runGC) {
2307
- gcStats = await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });
2316
+ gcStats = await this.collectGarbage(
2317
+ { logger: summaryLogger, runSweep, fullGC },
2318
+ telemetryContext,
2319
+ );
2308
2320
  }
2309
2321
 
2310
- const telemetryContext = new TelemetryContext();
2311
2322
  const { stats, summary } = await this.summarizerNode.summarize(
2312
2323
  fullTree,
2313
2324
  trackState,
@@ -2383,18 +2394,23 @@ export class ContainerRuntime
2383
2394
  }
2384
2395
 
2385
2396
  /**
2386
- * This is called to delete objects from the runtime
2387
- * @param unusedRoutes - object routes and sub routes that can be deleted
2388
- * @returns - routes of objects deleted from the runtime
2397
+ * @deprecated - Replaced by deleteSweepReadyNodes.
2389
2398
  */
2390
2399
  public deleteUnusedNodes(unusedRoutes: string[]): string[] {
2391
- const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(unusedRoutes);
2392
- const deletedRoutes: string[] = [];
2400
+ throw new Error("deleteUnusedRoutes should not be called");
2401
+ }
2393
2402
 
2394
- const deletedDataStoreRoutes = this.dataStores.deleteUnusedNodes(dataStoreRoutes);
2395
- deletedRoutes.push(...deletedDataStoreRoutes);
2403
+ /**
2404
+ * After GC has run and identified nodes that are sweep ready, this is called to delete the sweep ready nodes.
2405
+ * @param sweepReadyRoutes - The routes of nodes that are sweep ready and should be deleted.
2406
+ * @returns - The routes of nodes that were deleted.
2407
+ */
2408
+ public deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {
2409
+ const { dataStoreRoutes, blobManagerRoutes } =
2410
+ this.getDataStoreAndBlobManagerRoutes(sweepReadyRoutes);
2396
2411
 
2397
- return deletedRoutes;
2412
+ const deletedRoutes = this.dataStores.deleteSweepReadyNodes(dataStoreRoutes);
2413
+ return deletedRoutes.concat(this.blobManager.deleteSweepReadyNodes(blobManagerRoutes));
2398
2414
  }
2399
2415
 
2400
2416
  /**
@@ -2478,15 +2494,18 @@ export class ContainerRuntime
2478
2494
  * Runs garbage collection and updates the reference / used state of the nodes in the container.
2479
2495
  * @returns the statistics of the garbage collection run; undefined if GC did not run.
2480
2496
  */
2481
- public async collectGarbage(options: {
2482
- /** Logger to use for logging GC events */
2483
- logger?: ITelemetryLogger;
2484
- /** True to run GC sweep phase after the mark phase */
2485
- runSweep?: boolean;
2486
- /** True to generate full GC data */
2487
- fullGC?: boolean;
2488
- }): Promise<IGCStats | undefined> {
2489
- return this.garbageCollector.collectGarbage(options);
2497
+ public async collectGarbage(
2498
+ options: {
2499
+ /** Logger to use for logging GC events */
2500
+ logger?: ITelemetryLogger;
2501
+ /** True to run GC sweep phase after the mark phase */
2502
+ runSweep?: boolean;
2503
+ /** True to generate full GC data */
2504
+ fullGC?: boolean;
2505
+ },
2506
+ telemetryContext?: ITelemetryContext,
2507
+ ): Promise<IGCStats | undefined> {
2508
+ return this.garbageCollector.collectGarbage(options, telemetryContext);
2490
2509
  }
2491
2510
 
2492
2511
  /**
@@ -2720,7 +2739,7 @@ export class ContainerRuntime
2720
2739
 
2721
2740
  let clientSequenceNumber: number;
2722
2741
  try {
2723
- clientSequenceNumber = this.submitSummaryMessage(summaryMessage);
2742
+ clientSequenceNumber = this.submitSummaryMessage(summaryMessage, summaryRefSeqNum);
2724
2743
  } catch (error) {
2725
2744
  return { stage: "upload", ...uploadData, error };
2726
2745
  }
@@ -2813,8 +2832,7 @@ export class ContainerRuntime
2813
2832
  0x132 /* "sending ops in detached container" */,
2814
2833
  );
2815
2834
 
2816
- const deserializedContent: ContainerRuntimeMessage = { type, contents };
2817
- const serializedContent = JSON.stringify(deserializedContent);
2835
+ const serializedContent = JSON.stringify({ type, contents });
2818
2836
 
2819
2837
  if (this.deltaManager.readOnlyInfo.readonly) {
2820
2838
  this.logger.sendTelemetryEvent({
@@ -2825,7 +2843,7 @@ export class ContainerRuntime
2825
2843
 
2826
2844
  const message: BatchMessage = {
2827
2845
  contents: serializedContent,
2828
- deserializedContent,
2846
+ deserializedContent: JSON.parse(serializedContent), // Deep copy in case caller changes reference object
2829
2847
  metadata,
2830
2848
  localOpMetadata,
2831
2849
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
@@ -2855,7 +2873,7 @@ export class ContainerRuntime
2855
2873
  if (
2856
2874
  this.currentlyBatching() &&
2857
2875
  type === ContainerMessageType.Attach &&
2858
- this.mc.config.getBoolean("Fluid.ContainerRuntime.disableAttachOpReorder") !== true
2876
+ this.disableAttachReorder !== true
2859
2877
  ) {
2860
2878
  this.outbox.submitAttach(message);
2861
2879
  } else {
@@ -2864,17 +2882,8 @@ export class ContainerRuntime
2864
2882
 
2865
2883
  if (!this.currentlyBatching()) {
2866
2884
  this.flush();
2867
- } else if (!this.flushMicroTaskExists) {
2868
- this.flushMicroTaskExists = true;
2869
- // Queue a microtask to detect the end of the turn and force a flush.
2870
- Promise.resolve()
2871
- .then(() => {
2872
- this.flushMicroTaskExists = false;
2873
- this.flush();
2874
- })
2875
- .catch((error) => {
2876
- this.closeFn(error as GenericError);
2877
- });
2885
+ } else {
2886
+ this.scheduleFlush();
2878
2887
  }
2879
2888
  } catch (error) {
2880
2889
  this.closeFn(error as GenericError);
@@ -2886,7 +2895,47 @@ export class ContainerRuntime
2886
2895
  }
2887
2896
  }
2888
2897
 
2889
- private submitSummaryMessage(contents: ISummaryContent) {
2898
+ private scheduleFlush() {
2899
+ if (this.flushTaskExists) {
2900
+ return;
2901
+ }
2902
+
2903
+ this.flushTaskExists = true;
2904
+ const flush = () => {
2905
+ this.flushTaskExists = false;
2906
+ try {
2907
+ this.flush();
2908
+ } catch (error) {
2909
+ this.closeFn(error as GenericError);
2910
+ }
2911
+ };
2912
+
2913
+ switch (this.flushMode) {
2914
+ case FlushMode.TurnBased:
2915
+ // When in TurnBased flush mode the runtime will buffer operations in the current turn and send them as a single
2916
+ // batch at the end of the turn
2917
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
2918
+ Promise.resolve().then(flush);
2919
+ break;
2920
+
2921
+ // FlushModeExperimental is experimental and not exposed directly in the runtime APIs
2922
+ case FlushModeExperimental.Async as unknown as FlushMode:
2923
+ // When in Async flush mode, the runtime will accumulate all operations across JS turns and send them as a single
2924
+ // batch when all micro-tasks are complete.
2925
+ // Compared to TurnBased, this flush mode will capture more ops into the same batch.
2926
+ setTimeout(flush, 0);
2927
+ break;
2928
+
2929
+ default:
2930
+ assert(
2931
+ this._orderSequentiallyCalls > 0,
2932
+ 0x587 /* Unreachable unless running under orderSequentially */,
2933
+ );
2934
+ break;
2935
+ }
2936
+ }
2937
+
2938
+ private submitSummaryMessage(contents: ISummaryContent, referenceSequenceNumber: number) {
2890
2939
  this.verifyNotClosed();
2891
2940
  assert(
2892
2941
  this.connected,
@@ -2898,7 +2947,7 @@ export class ContainerRuntime
2898
2947
 
2899
2948
  // back-compat: ADO #1385: Make this call unconditional in the future
2900
2949
  return this.context.submitSummaryFn !== undefined
2901
- ? this.context.submitSummaryFn(contents)
2950
+ ? this.context.submitSummaryFn(contents, referenceSequenceNumber)
2902
2951
  : this.context.submitFn(MessageType.Summarize, contents, false);
2903
2952
  }
2904
2953
 
@@ -3018,7 +3067,7 @@ export class ContainerRuntime
3018
3067
  // It should only be done by the summarizerNode, if required.
3019
3068
  // When fetching from storage we will always get the latest version and do not use the ackHandle.
3020
3069
  const fetchLatestSnapshot: () => Promise<IFetchSnapshotResult> = async () => {
3021
- const fetchResult = await this.fetchLatestSnapshotFromStorage(
3070
+ let fetchResult = await this.fetchLatestSnapshotFromStorage(
3022
3071
  summaryLogger,
3023
3072
  {
3024
3073
  eventName: "RefreshLatestSummaryAckFetch",
@@ -3039,18 +3088,32 @@ export class ContainerRuntime
3039
3088
  * state.
3040
3089
  */
3041
3090
  if (fetchResult.latestSnapshotRefSeq < summaryRefSeq) {
3042
- const error = DataProcessingError.create(
3043
- "Fetched snapshot is older than the received ack",
3044
- "RefreshLatestSummaryAck",
3045
- undefined /* sequencedMessage */,
3091
+ /* before failing, let's try to retrieve the latest snapshot for that specific ackHandle */
3092
+ fetchResult = await this.fetchSnapshotFromStorage(
3093
+ summaryLogger,
3046
3094
  {
3095
+ eventName: "RefreshLatestSummaryAckFetch",
3047
3096
  ackHandle,
3048
- summaryRefSeq,
3049
- latestSnapshotRefSeq: fetchResult.latestSnapshotRefSeq,
3097
+ targetSequenceNumber: summaryRefSeq,
3050
3098
  },
3099
+ readAndParseBlob,
3100
+ ackHandle,
3051
3101
  );
3052
- this.closeFn(error);
3053
- throw error;
3102
+
3103
+ if (fetchResult.latestSnapshotRefSeq < summaryRefSeq) {
3104
+ const error = DataProcessingError.create(
3105
+ "Fetched snapshot is older than the received ack",
3106
+ "RefreshLatestSummaryAck",
3107
+ undefined /* sequencedMessage */,
3108
+ {
3109
+ ackHandle,
3110
+ summaryRefSeq,
3111
+ fetchedSnapshotRefSeq: fetchResult.latestSnapshotRefSeq,
3112
+ },
3113
+ );
3114
+ this.closeFn(error);
3115
+ throw error;
3116
+ }
3054
3117
  }
3055
3118
 
3056
3119
  // In case we had to retrieve the latest snapshot and it is different than summaryRefSeq,
@@ -3122,6 +3185,15 @@ export class ContainerRuntime
3122
3185
  logger: ITelemetryLogger,
3123
3186
  event: ITelemetryGenericEvent,
3124
3187
  readAndParseBlob: ReadAndParseBlob,
3188
+ ): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {
3189
+ return this.fetchSnapshotFromStorage(logger, event, readAndParseBlob, null /* latest */);
3190
+ }
3191
+
3192
+ private async fetchSnapshotFromStorage(
3193
+ logger: ITelemetryLogger,
3194
+ event: ITelemetryGenericEvent,
3195
+ readAndParseBlob: ReadAndParseBlob,
3196
+ versionId: string | null,
3125
3197
  ): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {
3126
3198
  return PerformanceEvent.timedExecAsync(
3127
3199
  logger,
@@ -3143,10 +3215,10 @@ export class ContainerRuntime
3143
3215
  const trace = Trace.start();
3144
3216
 
3145
3217
  const versions = await this.storage.getVersions(
3146
- null,
3218
+ versionId,
3147
3219
  1,
3148
3220
  "refreshLatestSummaryAckFromServer",
3149
- FetchSource.noCache,
3221
+ versionId === null ? FetchSource.noCache : undefined,
3150
3222
  );
3151
3223
  assert(
3152
3224
  !!versions && !!versions[0],