@fluidframework/container-runtime 2.13.0 → 2.21.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 (489) hide show
  1. package/.eslintrc.cjs +71 -5
  2. package/CHANGELOG.md +84 -0
  3. package/api-report/container-runtime.legacy.alpha.api.md +38 -232
  4. package/dist/batchTracker.d.ts +1 -2
  5. package/dist/batchTracker.d.ts.map +1 -1
  6. package/dist/batchTracker.js +1 -1
  7. package/dist/batchTracker.js.map +1 -1
  8. package/dist/blobManager/blobManager.d.ts +5 -1
  9. package/dist/blobManager/blobManager.d.ts.map +1 -1
  10. package/dist/blobManager/blobManager.js +30 -13
  11. package/dist/blobManager/blobManager.js.map +1 -1
  12. package/dist/blobManager/blobManagerSnapSum.d.ts +1 -0
  13. package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  14. package/dist/blobManager/blobManagerSnapSum.js +7 -5
  15. package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
  16. package/dist/channelCollection.d.ts +23 -12
  17. package/dist/channelCollection.d.ts.map +1 -1
  18. package/dist/channelCollection.js +85 -53
  19. package/dist/channelCollection.js.map +1 -1
  20. package/dist/connectionTelemetry.d.ts +2 -2
  21. package/dist/connectionTelemetry.d.ts.map +1 -1
  22. package/dist/connectionTelemetry.js +10 -6
  23. package/dist/connectionTelemetry.js.map +1 -1
  24. package/dist/containerHandleContext.d.ts +1 -1
  25. package/dist/containerHandleContext.d.ts.map +1 -1
  26. package/dist/containerHandleContext.js.map +1 -1
  27. package/dist/containerRuntime.d.ts +87 -94
  28. package/dist/containerRuntime.d.ts.map +1 -1
  29. package/dist/containerRuntime.js +312 -226
  30. package/dist/containerRuntime.js.map +1 -1
  31. package/dist/dataStore.d.ts +7 -3
  32. package/dist/dataStore.d.ts.map +1 -1
  33. package/dist/dataStore.js +8 -4
  34. package/dist/dataStore.js.map +1 -1
  35. package/dist/dataStoreContext.d.ts +41 -25
  36. package/dist/dataStoreContext.d.ts.map +1 -1
  37. package/dist/dataStoreContext.js +47 -29
  38. package/dist/dataStoreContext.js.map +1 -1
  39. package/dist/dataStoreContexts.d.ts +6 -2
  40. package/dist/dataStoreContexts.d.ts.map +1 -1
  41. package/dist/dataStoreContexts.js +7 -2
  42. package/dist/dataStoreContexts.js.map +1 -1
  43. package/dist/dataStoreRegistry.d.ts +1 -1
  44. package/dist/dataStoreRegistry.d.ts.map +1 -1
  45. package/dist/dataStoreRegistry.js.map +1 -1
  46. package/dist/deltaManagerProxies.d.ts +1 -17
  47. package/dist/deltaManagerProxies.d.ts.map +1 -1
  48. package/dist/deltaManagerProxies.js.map +1 -1
  49. package/dist/deltaScheduler.d.ts +9 -6
  50. package/dist/deltaScheduler.d.ts.map +1 -1
  51. package/dist/deltaScheduler.js +95 -89
  52. package/dist/deltaScheduler.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +21 -7
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +48 -19
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +11 -0
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +5 -2
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +218 -70
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js +40 -13
  64. package/dist/gc/gcDefinitions.js.map +1 -1
  65. package/dist/gc/gcHelpers.d.ts +6 -2
  66. package/dist/gc/gcHelpers.d.ts.map +1 -1
  67. package/dist/gc/gcHelpers.js +14 -7
  68. package/dist/gc/gcHelpers.js.map +1 -1
  69. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  70. package/dist/gc/gcSummaryDefinitions.d.ts +18 -6
  71. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
  72. package/dist/gc/gcSummaryDefinitions.js.map +1 -1
  73. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  74. package/dist/gc/gcSummaryStateTracker.js +2 -1
  75. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  76. package/dist/gc/gcTelemetry.d.ts +33 -11
  77. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  78. package/dist/gc/gcTelemetry.js +35 -17
  79. package/dist/gc/gcTelemetry.js.map +1 -1
  80. package/dist/gc/gcUnreferencedStateTracker.d.ts +42 -13
  81. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  82. package/dist/gc/gcUnreferencedStateTracker.js +27 -9
  83. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  84. package/dist/gc/index.d.ts +1 -0
  85. package/dist/gc/index.d.ts.map +1 -1
  86. package/dist/gc/index.js +3 -1
  87. package/dist/gc/index.js.map +1 -1
  88. package/dist/inboundBatchAggregator.d.ts +34 -0
  89. package/dist/inboundBatchAggregator.d.ts.map +1 -0
  90. package/dist/inboundBatchAggregator.js +185 -0
  91. package/dist/inboundBatchAggregator.js.map +1 -0
  92. package/dist/index.d.ts +1 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/layerCompatState.d.ts +19 -0
  96. package/dist/layerCompatState.d.ts.map +1 -0
  97. package/dist/layerCompatState.js +64 -0
  98. package/dist/layerCompatState.js.map +1 -0
  99. package/dist/legacy.d.ts +0 -4
  100. package/dist/messageTypes.d.ts +14 -5
  101. package/dist/messageTypes.d.ts.map +1 -1
  102. package/dist/messageTypes.js.map +1 -1
  103. package/dist/metadata.d.ts +12 -4
  104. package/dist/metadata.d.ts.map +1 -1
  105. package/dist/metadata.js +6 -2
  106. package/dist/metadata.js.map +1 -1
  107. package/dist/opLifecycle/batchManager.d.ts +9 -3
  108. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  109. package/dist/opLifecycle/batchManager.js +3 -1
  110. package/dist/opLifecycle/batchManager.js.map +1 -1
  111. package/dist/opLifecycle/duplicateBatchDetector.d.ts +9 -3
  112. package/dist/opLifecycle/duplicateBatchDetector.d.ts.map +1 -1
  113. package/dist/opLifecycle/duplicateBatchDetector.js +11 -5
  114. package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
  115. package/dist/opLifecycle/opCompressor.d.ts +3 -2
  116. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  117. package/dist/opLifecycle/opCompressor.js +13 -19
  118. package/dist/opLifecycle/opCompressor.js.map +1 -1
  119. package/dist/opLifecycle/opDecompressor.d.ts +6 -1
  120. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  121. package/dist/opLifecycle/opDecompressor.js +16 -8
  122. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  123. package/dist/opLifecycle/opGroupingManager.d.ts +1 -2
  124. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  125. package/dist/opLifecycle/opGroupingManager.js +9 -6
  126. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  127. package/dist/opLifecycle/opSplitter.d.ts +13 -10
  128. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  129. package/dist/opLifecycle/opSplitter.js +16 -11
  130. package/dist/opLifecycle/opSplitter.js.map +1 -1
  131. package/dist/opLifecycle/outbox.d.ts +4 -4
  132. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  133. package/dist/opLifecycle/outbox.js +17 -16
  134. package/dist/opLifecycle/outbox.js.map +1 -1
  135. package/dist/opLifecycle/remoteMessageProcessor.d.ts +9 -3
  136. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  137. package/dist/opLifecycle/remoteMessageProcessor.js +3 -1
  138. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  139. package/dist/package.json +2 -1
  140. package/dist/packageVersion.d.ts +1 -1
  141. package/dist/packageVersion.js +1 -1
  142. package/dist/packageVersion.js.map +1 -1
  143. package/dist/pendingStateManager.d.ts +22 -11
  144. package/dist/pendingStateManager.d.ts.map +1 -1
  145. package/dist/pendingStateManager.js +24 -15
  146. package/dist/pendingStateManager.js.map +1 -1
  147. package/dist/summary/documentSchema.d.ts +7 -0
  148. package/dist/summary/documentSchema.d.ts.map +1 -1
  149. package/dist/summary/documentSchema.js +8 -4
  150. package/dist/summary/documentSchema.js.map +1 -1
  151. package/dist/summary/index.d.ts +1 -1
  152. package/dist/summary/index.d.ts.map +1 -1
  153. package/dist/summary/index.js.map +1 -1
  154. package/dist/summary/orderedClientElection.d.ts +94 -31
  155. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  156. package/dist/summary/orderedClientElection.js +28 -16
  157. package/dist/summary/orderedClientElection.js.map +1 -1
  158. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -0
  159. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  160. package/dist/summary/runWhileConnectedCoordinator.js +7 -2
  161. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  162. package/dist/summary/runningSummarizer.d.ts +17 -6
  163. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  164. package/dist/summary/runningSummarizer.js +48 -19
  165. package/dist/summary/runningSummarizer.js.map +1 -1
  166. package/dist/summary/summarizer.d.ts +10 -5
  167. package/dist/summary/summarizer.d.ts.map +1 -1
  168. package/dist/summary/summarizer.js +26 -11
  169. package/dist/summary/summarizer.js.map +1 -1
  170. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  171. package/dist/summary/summarizerClientElection.js +1 -0
  172. package/dist/summary/summarizerClientElection.js.map +1 -1
  173. package/dist/summary/summarizerHeuristics.d.ts +6 -2
  174. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  175. package/dist/summary/summarizerHeuristics.js +13 -5
  176. package/dist/summary/summarizerHeuristics.js.map +1 -1
  177. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  178. package/dist/summary/summarizerNode/index.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNode.d.ts +24 -8
  180. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNode.js +45 -36
  182. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  183. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +48 -16
  184. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  185. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -1
  186. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  187. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +13 -5
  188. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  189. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -7
  190. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  191. package/dist/summary/summarizerTypes.d.ts +253 -135
  192. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  193. package/dist/summary/summarizerTypes.js.map +1 -1
  194. package/dist/summary/summaryCollection.d.ts +3 -4
  195. package/dist/summary/summaryCollection.d.ts.map +1 -1
  196. package/dist/summary/summaryCollection.js +10 -8
  197. package/dist/summary/summaryCollection.js.map +1 -1
  198. package/dist/summary/summaryFormat.d.ts +28 -9
  199. package/dist/summary/summaryFormat.d.ts.map +1 -1
  200. package/dist/summary/summaryFormat.js +3 -2
  201. package/dist/summary/summaryFormat.js.map +1 -1
  202. package/dist/summary/summaryGenerator.d.ts +9 -3
  203. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  204. package/dist/summary/summaryGenerator.js +22 -9
  205. package/dist/summary/summaryGenerator.js.map +1 -1
  206. package/dist/summary/summaryManager.d.ts +8 -4
  207. package/dist/summary/summaryManager.d.ts.map +1 -1
  208. package/dist/summary/summaryManager.js +20 -9
  209. package/dist/summary/summaryManager.js.map +1 -1
  210. package/dist/throttler.d.ts +26 -10
  211. package/dist/throttler.d.ts.map +1 -1
  212. package/dist/throttler.js +12 -4
  213. package/dist/throttler.js.map +1 -1
  214. package/lib/batchTracker.d.ts +1 -2
  215. package/lib/batchTracker.d.ts.map +1 -1
  216. package/lib/batchTracker.js +2 -2
  217. package/lib/batchTracker.js.map +1 -1
  218. package/lib/blobManager/blobManager.d.ts +5 -1
  219. package/lib/blobManager/blobManager.d.ts.map +1 -1
  220. package/lib/blobManager/blobManager.js +30 -13
  221. package/lib/blobManager/blobManager.js.map +1 -1
  222. package/lib/blobManager/blobManagerSnapSum.d.ts +1 -0
  223. package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  224. package/lib/blobManager/blobManagerSnapSum.js +7 -5
  225. package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
  226. package/lib/channelCollection.d.ts +23 -12
  227. package/lib/channelCollection.d.ts.map +1 -1
  228. package/lib/channelCollection.js +88 -54
  229. package/lib/channelCollection.js.map +1 -1
  230. package/lib/connectionTelemetry.d.ts +2 -2
  231. package/lib/connectionTelemetry.d.ts.map +1 -1
  232. package/lib/connectionTelemetry.js +11 -7
  233. package/lib/connectionTelemetry.js.map +1 -1
  234. package/lib/containerHandleContext.d.ts +1 -1
  235. package/lib/containerHandleContext.d.ts.map +1 -1
  236. package/lib/containerHandleContext.js.map +1 -1
  237. package/lib/containerRuntime.d.ts +87 -94
  238. package/lib/containerRuntime.d.ts.map +1 -1
  239. package/lib/containerRuntime.js +319 -228
  240. package/lib/containerRuntime.js.map +1 -1
  241. package/lib/dataStore.d.ts +7 -3
  242. package/lib/dataStore.d.ts.map +1 -1
  243. package/lib/dataStore.js +8 -4
  244. package/lib/dataStore.js.map +1 -1
  245. package/lib/dataStoreContext.d.ts +41 -25
  246. package/lib/dataStoreContext.d.ts.map +1 -1
  247. package/lib/dataStoreContext.js +47 -29
  248. package/lib/dataStoreContext.js.map +1 -1
  249. package/lib/dataStoreContexts.d.ts +6 -2
  250. package/lib/dataStoreContexts.d.ts.map +1 -1
  251. package/lib/dataStoreContexts.js +7 -2
  252. package/lib/dataStoreContexts.js.map +1 -1
  253. package/lib/dataStoreRegistry.d.ts +1 -1
  254. package/lib/dataStoreRegistry.d.ts.map +1 -1
  255. package/lib/dataStoreRegistry.js.map +1 -1
  256. package/lib/deltaManagerProxies.d.ts +1 -17
  257. package/lib/deltaManagerProxies.d.ts.map +1 -1
  258. package/lib/deltaManagerProxies.js.map +1 -1
  259. package/lib/deltaScheduler.d.ts +9 -6
  260. package/lib/deltaScheduler.d.ts.map +1 -1
  261. package/lib/deltaScheduler.js +96 -90
  262. package/lib/deltaScheduler.js.map +1 -1
  263. package/lib/gc/garbageCollection.d.ts +21 -7
  264. package/lib/gc/garbageCollection.d.ts.map +1 -1
  265. package/lib/gc/garbageCollection.js +51 -20
  266. package/lib/gc/garbageCollection.js.map +1 -1
  267. package/lib/gc/gcConfigs.d.ts +11 -0
  268. package/lib/gc/gcConfigs.d.ts.map +1 -1
  269. package/lib/gc/gcConfigs.js +4 -2
  270. package/lib/gc/gcConfigs.js.map +1 -1
  271. package/lib/gc/gcDefinitions.d.ts +218 -70
  272. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  273. package/lib/gc/gcDefinitions.js +40 -13
  274. package/lib/gc/gcDefinitions.js.map +1 -1
  275. package/lib/gc/gcHelpers.d.ts +6 -2
  276. package/lib/gc/gcHelpers.d.ts.map +1 -1
  277. package/lib/gc/gcHelpers.js +14 -7
  278. package/lib/gc/gcHelpers.js.map +1 -1
  279. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  280. package/lib/gc/gcSummaryDefinitions.d.ts +18 -6
  281. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
  282. package/lib/gc/gcSummaryDefinitions.js.map +1 -1
  283. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  284. package/lib/gc/gcSummaryStateTracker.js +2 -1
  285. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  286. package/lib/gc/gcTelemetry.d.ts +33 -11
  287. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  288. package/lib/gc/gcTelemetry.js +38 -18
  289. package/lib/gc/gcTelemetry.js.map +1 -1
  290. package/lib/gc/gcUnreferencedStateTracker.d.ts +42 -13
  291. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  292. package/lib/gc/gcUnreferencedStateTracker.js +27 -9
  293. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  294. package/lib/gc/index.d.ts +1 -0
  295. package/lib/gc/index.d.ts.map +1 -1
  296. package/lib/gc/index.js +1 -0
  297. package/lib/gc/index.js.map +1 -1
  298. package/lib/inboundBatchAggregator.d.ts +34 -0
  299. package/lib/inboundBatchAggregator.d.ts.map +1 -0
  300. package/lib/inboundBatchAggregator.js +181 -0
  301. package/lib/inboundBatchAggregator.js.map +1 -0
  302. package/lib/index.d.ts +1 -1
  303. package/lib/index.d.ts.map +1 -1
  304. package/lib/index.js.map +1 -1
  305. package/lib/layerCompatState.d.ts +19 -0
  306. package/lib/layerCompatState.d.ts.map +1 -0
  307. package/lib/layerCompatState.js +60 -0
  308. package/lib/layerCompatState.js.map +1 -0
  309. package/lib/legacy.d.ts +0 -4
  310. package/lib/messageTypes.d.ts +14 -5
  311. package/lib/messageTypes.d.ts.map +1 -1
  312. package/lib/messageTypes.js.map +1 -1
  313. package/lib/metadata.d.ts +12 -4
  314. package/lib/metadata.d.ts.map +1 -1
  315. package/lib/metadata.js +6 -2
  316. package/lib/metadata.js.map +1 -1
  317. package/lib/opLifecycle/batchManager.d.ts +9 -3
  318. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  319. package/lib/opLifecycle/batchManager.js +3 -1
  320. package/lib/opLifecycle/batchManager.js.map +1 -1
  321. package/lib/opLifecycle/duplicateBatchDetector.d.ts +9 -3
  322. package/lib/opLifecycle/duplicateBatchDetector.d.ts.map +1 -1
  323. package/lib/opLifecycle/duplicateBatchDetector.js +11 -5
  324. package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
  325. package/lib/opLifecycle/opCompressor.d.ts +3 -2
  326. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  327. package/lib/opLifecycle/opCompressor.js +14 -20
  328. package/lib/opLifecycle/opCompressor.js.map +1 -1
  329. package/lib/opLifecycle/opDecompressor.d.ts +6 -1
  330. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  331. package/lib/opLifecycle/opDecompressor.js +17 -9
  332. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  333. package/lib/opLifecycle/opGroupingManager.d.ts +1 -2
  334. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  335. package/lib/opLifecycle/opGroupingManager.js +10 -7
  336. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  337. package/lib/opLifecycle/opSplitter.d.ts +13 -10
  338. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  339. package/lib/opLifecycle/opSplitter.js +16 -11
  340. package/lib/opLifecycle/opSplitter.js.map +1 -1
  341. package/lib/opLifecycle/outbox.d.ts +4 -4
  342. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  343. package/lib/opLifecycle/outbox.js +17 -16
  344. package/lib/opLifecycle/outbox.js.map +1 -1
  345. package/lib/opLifecycle/remoteMessageProcessor.d.ts +9 -3
  346. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  347. package/lib/opLifecycle/remoteMessageProcessor.js +3 -1
  348. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  349. package/lib/packageVersion.d.ts +1 -1
  350. package/lib/packageVersion.js +1 -1
  351. package/lib/packageVersion.js.map +1 -1
  352. package/lib/pendingStateManager.d.ts +22 -11
  353. package/lib/pendingStateManager.d.ts.map +1 -1
  354. package/lib/pendingStateManager.js +25 -16
  355. package/lib/pendingStateManager.js.map +1 -1
  356. package/lib/summary/documentSchema.d.ts +7 -0
  357. package/lib/summary/documentSchema.d.ts.map +1 -1
  358. package/lib/summary/documentSchema.js +8 -4
  359. package/lib/summary/documentSchema.js.map +1 -1
  360. package/lib/summary/index.d.ts +1 -1
  361. package/lib/summary/index.d.ts.map +1 -1
  362. package/lib/summary/index.js.map +1 -1
  363. package/lib/summary/orderedClientElection.d.ts +94 -31
  364. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  365. package/lib/summary/orderedClientElection.js +28 -16
  366. package/lib/summary/orderedClientElection.js.map +1 -1
  367. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -0
  368. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  369. package/lib/summary/runWhileConnectedCoordinator.js +7 -2
  370. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  371. package/lib/summary/runningSummarizer.d.ts +17 -6
  372. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  373. package/lib/summary/runningSummarizer.js +48 -19
  374. package/lib/summary/runningSummarizer.js.map +1 -1
  375. package/lib/summary/summarizer.d.ts +10 -5
  376. package/lib/summary/summarizer.d.ts.map +1 -1
  377. package/lib/summary/summarizer.js +26 -11
  378. package/lib/summary/summarizer.js.map +1 -1
  379. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  380. package/lib/summary/summarizerClientElection.js +1 -0
  381. package/lib/summary/summarizerClientElection.js.map +1 -1
  382. package/lib/summary/summarizerHeuristics.d.ts +6 -2
  383. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  384. package/lib/summary/summarizerHeuristics.js +13 -5
  385. package/lib/summary/summarizerHeuristics.js.map +1 -1
  386. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  387. package/lib/summary/summarizerNode/index.js.map +1 -1
  388. package/lib/summary/summarizerNode/summarizerNode.d.ts +24 -8
  389. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  390. package/lib/summary/summarizerNode/summarizerNode.js +45 -36
  391. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  392. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +48 -16
  393. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  394. package/lib/summary/summarizerNode/summarizerNodeUtils.js +3 -1
  395. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  396. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +13 -5
  397. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  398. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +15 -7
  399. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  400. package/lib/summary/summarizerTypes.d.ts +253 -135
  401. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  402. package/lib/summary/summarizerTypes.js.map +1 -1
  403. package/lib/summary/summaryCollection.d.ts +3 -4
  404. package/lib/summary/summaryCollection.d.ts.map +1 -1
  405. package/lib/summary/summaryCollection.js +10 -8
  406. package/lib/summary/summaryCollection.js.map +1 -1
  407. package/lib/summary/summaryFormat.d.ts +28 -9
  408. package/lib/summary/summaryFormat.d.ts.map +1 -1
  409. package/lib/summary/summaryFormat.js +2 -2
  410. package/lib/summary/summaryFormat.js.map +1 -1
  411. package/lib/summary/summaryGenerator.d.ts +9 -3
  412. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  413. package/lib/summary/summaryGenerator.js +22 -9
  414. package/lib/summary/summaryGenerator.js.map +1 -1
  415. package/lib/summary/summaryManager.d.ts +8 -4
  416. package/lib/summary/summaryManager.d.ts.map +1 -1
  417. package/lib/summary/summaryManager.js +20 -9
  418. package/lib/summary/summaryManager.js.map +1 -1
  419. package/lib/throttler.d.ts +26 -10
  420. package/lib/throttler.d.ts.map +1 -1
  421. package/lib/throttler.js +12 -4
  422. package/lib/throttler.js.map +1 -1
  423. package/package.json +22 -31
  424. package/src/batchTracker.ts +34 -36
  425. package/src/blobManager/blobManager.ts +54 -33
  426. package/src/blobManager/blobManagerSnapSum.ts +10 -10
  427. package/src/channelCollection.ts +108 -82
  428. package/src/connectionTelemetry.ts +43 -19
  429. package/src/containerHandleContext.ts +2 -2
  430. package/src/containerRuntime.ts +492 -364
  431. package/src/dataStore.ts +17 -9
  432. package/src/dataStoreContext.ts +94 -73
  433. package/src/dataStoreContexts.ts +17 -12
  434. package/src/dataStoreRegistry.ts +1 -1
  435. package/src/deltaManagerProxies.ts +5 -5
  436. package/src/deltaScheduler.ts +24 -18
  437. package/src/gc/garbageCollection.ts +89 -40
  438. package/src/gc/gcConfigs.ts +13 -5
  439. package/src/gc/gcDefinitions.ts +224 -70
  440. package/src/gc/gcHelpers.ts +22 -11
  441. package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
  442. package/src/gc/gcSummaryDefinitions.ts +18 -6
  443. package/src/gc/gcSummaryStateTracker.ts +7 -3
  444. package/src/gc/gcTelemetry.ts +73 -30
  445. package/src/gc/gcUnreferencedStateTracker.ts +40 -16
  446. package/src/gc/index.ts +1 -0
  447. package/src/{scheduleManager.ts → inboundBatchAggregator.ts} +55 -122
  448. package/src/index.ts +0 -3
  449. package/src/layerCompatState.ts +75 -0
  450. package/src/messageTypes.ts +16 -5
  451. package/src/metadata.ts +12 -4
  452. package/src/opLifecycle/README.md +43 -34
  453. package/src/opLifecycle/batchManager.ts +12 -6
  454. package/src/opLifecycle/duplicateBatchDetector.ts +12 -6
  455. package/src/opLifecycle/opCompressor.ts +22 -25
  456. package/src/opLifecycle/opDecompressor.ts +23 -11
  457. package/src/opLifecycle/opGroupingManager.ts +16 -11
  458. package/src/opLifecycle/opSplitter.ts +24 -18
  459. package/src/opLifecycle/outbox.ts +35 -33
  460. package/src/opLifecycle/remoteMessageProcessor.ts +13 -5
  461. package/src/packageVersion.ts +1 -1
  462. package/src/pendingStateManager.ts +49 -26
  463. package/src/summary/documentSchema.ts +41 -22
  464. package/src/summary/index.ts +0 -3
  465. package/src/summary/orderedClientElection.ts +114 -49
  466. package/src/summary/runWhileConnectedCoordinator.ts +12 -3
  467. package/src/summary/runningSummarizer.ts +79 -36
  468. package/src/summary/summarizer.ts +51 -25
  469. package/src/summary/summarizerClientElection.ts +4 -2
  470. package/src/summary/summarizerHeuristics.ts +23 -12
  471. package/src/summary/summarizerNode/index.ts +1 -0
  472. package/src/summary/summarizerNode/summarizerNode.ts +54 -43
  473. package/src/summary/summarizerNode/summarizerNodeUtils.ts +48 -16
  474. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +25 -15
  475. package/src/summary/summarizerTypes.ts +253 -139
  476. package/src/summary/summaryCollection.ts +41 -31
  477. package/src/summary/summaryFormat.ts +34 -13
  478. package/src/summary/summaryGenerator.ts +39 -18
  479. package/src/summary/summaryManager.ts +36 -24
  480. package/src/throttler.ts +23 -11
  481. package/container-runtime.test-files.tar +0 -0
  482. package/dist/scheduleManager.d.ts +0 -28
  483. package/dist/scheduleManager.d.ts.map +0 -1
  484. package/dist/scheduleManager.js +0 -233
  485. package/dist/scheduleManager.js.map +0 -1
  486. package/lib/scheduleManager.d.ts +0 -28
  487. package/lib/scheduleManager.d.ts.map +0 -1
  488. package/lib/scheduleManager.js +0 -229
  489. package/lib/scheduleManager.js.map +0 -1
@@ -20,7 +20,7 @@ export class FluidDataStoreRegistry implements IFluidDataStoreRegistry {
20
20
  FluidDataStoreRegistryEntry | Promise<FluidDataStoreRegistryEntry>
21
21
  >;
22
22
 
23
- public get IFluidDataStoreRegistry() {
23
+ public get IFluidDataStoreRegistry(): IFluidDataStoreRegistry {
24
24
  return this;
25
25
  }
26
26
 
@@ -59,11 +59,11 @@ export abstract class BaseDeltaManagerProxy
59
59
  return this.deltaManager.lastSequenceNumber;
60
60
  }
61
61
 
62
- public get lastMessage() {
62
+ public get lastMessage(): ISequencedDocumentMessage | undefined {
63
63
  return this.deltaManager.lastMessage;
64
64
  }
65
65
 
66
- public get lastKnownSeqNumber() {
66
+ public get lastKnownSeqNumber(): number {
67
67
  return this.deltaManager.lastKnownSeqNumber;
68
68
  }
69
69
 
@@ -71,7 +71,7 @@ export abstract class BaseDeltaManagerProxy
71
71
  return this.deltaManager.initialSequenceNumber;
72
72
  }
73
73
 
74
- public get hasCheckpointSequenceNumber() {
74
+ public get hasCheckpointSequenceNumber(): boolean {
75
75
  return this.deltaManager.hasCheckpointSequenceNumber;
76
76
  }
77
77
 
@@ -132,7 +132,7 @@ export abstract class BaseDeltaManagerProxy
132
132
  return this.deltaManager.flush();
133
133
  }
134
134
 
135
- private readonly onPrepareSend = (messageBuffer: any[]): void => {
135
+ private readonly onPrepareSend = (messageBuffer: unknown[]): void => {
136
136
  this.emit("prepareSend", messageBuffer);
137
137
  };
138
138
  private readonly onSubmitOp = (message: IDocumentMessage): void => {
@@ -218,7 +218,7 @@ export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
218
218
  return this.deltaManager.minimumSequenceNumber;
219
219
  }
220
220
 
221
- public get lastMessage() {
221
+ public get lastMessage(): ISequencedDocumentMessage | undefined {
222
222
  if (this.deltaManager.lastMessage === undefined) {
223
223
  return this.deltaManager.lastMessage;
224
224
  }
@@ -3,9 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { performance } from "@fluid-internal/client-utils";
6
+ import { performanceNow, type TypedEventEmitter } from "@fluid-internal/client-utils";
7
7
  import { IDeltaManagerFull } from "@fluidframework/container-definitions/internal";
8
8
  import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
+ import type { IContainerRuntimeBaseEvents } from "@fluidframework/runtime-definitions/internal";
9
10
  import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils/internal";
10
11
 
11
12
  /**
@@ -22,7 +23,6 @@ import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils
22
23
  * processed, the time and number of turns it took to process the ops.
23
24
  */
24
25
  export class DeltaScheduler {
25
- private readonly deltaManager: IDeltaManagerFull;
26
26
  // The time for processing ops in a single turn.
27
27
  public static readonly processingTime = 50;
28
28
 
@@ -50,18 +50,24 @@ export class DeltaScheduler {
50
50
  | undefined;
51
51
 
52
52
  constructor(
53
- deltaManager: IDeltaManagerFull,
53
+ private readonly deltaManager: IDeltaManagerFull,
54
+ private readonly runtimeEventsEmitter: TypedEventEmitter<IContainerRuntimeBaseEvents>,
54
55
  private readonly logger: ITelemetryLoggerExt,
55
56
  ) {
56
- this.deltaManager = deltaManager;
57
- this.deltaManager.inbound.on("idle", () => {
58
- this.inboundQueueIdle();
59
- });
57
+ this.deltaManager.inbound.on("idle", this.inboundQueueIdle);
58
+ runtimeEventsEmitter.on("batchBegin", this.batchBegin);
59
+ runtimeEventsEmitter.on("batchEnd", this.batchEnd);
60
60
  }
61
61
 
62
- public batchBegin(message: ISequencedDocumentMessage) {
62
+ public dispose(): void {
63
+ this.deltaManager.inbound.off("idle", this.inboundQueueIdle);
64
+ this.runtimeEventsEmitter.off("batchBegin", this.batchBegin);
65
+ this.runtimeEventsEmitter.off("batchEnd", this.batchEnd);
66
+ }
67
+
68
+ private readonly batchBegin = (message: ISequencedDocumentMessage): void => {
63
69
  if (!this.processingStartTime) {
64
- this.processingStartTime = performance.now();
70
+ this.processingStartTime = performanceNow();
65
71
  }
66
72
  if (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {
67
73
  // Every 500th time we are scheduling the inbound queue, we log telemetry for the
@@ -73,12 +79,12 @@ export class DeltaScheduler {
73
79
  numberOfBatchesProcessed: 0,
74
80
  firstSequenceNumber: message.sequenceNumber,
75
81
  lastSequenceNumber: message.sequenceNumber,
76
- startTime: performance.now(),
82
+ startTime: performanceNow(),
77
83
  };
78
84
  }
79
- }
85
+ };
80
86
 
81
- public batchEnd(message: ISequencedDocumentMessage) {
87
+ private readonly batchEnd = (error: unknown, message: ISequencedDocumentMessage): void => {
82
88
  if (this.schedulingLog) {
83
89
  this.schedulingLog.numberOfBatchesProcessed++;
84
90
  this.schedulingLog.lastSequenceNumber = message.sequenceNumber;
@@ -86,7 +92,7 @@ export class DeltaScheduler {
86
92
  }
87
93
 
88
94
  if (this.shouldRunScheduler()) {
89
- const currentTime = performance.now();
95
+ const currentTime = performanceNow();
90
96
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
91
97
  const elapsedTime = currentTime - this.processingStartTime!;
92
98
  if (elapsedTime > this.currentAllowedProcessingTimeForTurn) {
@@ -120,7 +126,7 @@ export class DeltaScheduler {
120
126
  processingTime: formatTick(this.schedulingLog.totalProcessingTime),
121
127
  numberOfTurns: this.schedulingLog.numberOfTurns,
122
128
  batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
123
- timeToResume: formatTick(performance.now() - currentTime),
129
+ timeToResume: formatTick(performanceNow() - currentTime),
124
130
  });
125
131
  }
126
132
  this.deltaManager.inbound.resume();
@@ -129,13 +135,13 @@ export class DeltaScheduler {
129
135
  this.processingStartTime = undefined;
130
136
  }
131
137
  }
132
- }
138
+ };
133
139
 
134
- private inboundQueueIdle() {
140
+ private readonly inboundQueueIdle = (): void => {
135
141
  if (this.schedulingLog) {
136
142
  // Add the time taken for processing the final ops to the total processing time in the
137
143
  // telemetry log object.
138
- const currentTime = performance.now();
144
+ const currentTime = performanceNow();
139
145
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
140
146
  this.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;
141
147
 
@@ -161,7 +167,7 @@ export class DeltaScheduler {
161
167
  // Reset the processing times.
162
168
  this.processingStartTime = undefined;
163
169
  this.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
164
- }
170
+ };
165
171
 
166
172
  /**
167
173
  * This function tells whether we should run the scheduler.
@@ -5,7 +5,6 @@
5
5
 
6
6
  import { IRequest } from "@fluidframework/core-interfaces";
7
7
  import { assert, LazyPromise, Timer } from "@fluidframework/core-utils/internal";
8
- import type { ISnapshotTree } from "@fluidframework/driver-definitions/internal";
9
8
  import {
10
9
  IGarbageCollectionDetailsBase,
11
10
  ISummarizeResult,
@@ -35,17 +34,22 @@ import { IRefreshSummaryResult } from "../summary/index.js";
35
34
 
36
35
  import { generateGCConfigs } from "./gcConfigs.js";
37
36
  import {
37
+ // eslint-disable-next-line import/no-deprecated
38
38
  GCNodeType,
39
39
  GarbageCollectionMessage,
40
40
  GarbageCollectionMessageType,
41
+ // eslint-disable-next-line import/no-deprecated
41
42
  IGCMetadata,
42
43
  IGCResult,
44
+ // eslint-disable-next-line import/no-deprecated
43
45
  IGCStats,
44
46
  IGarbageCollectionRuntime,
45
47
  IGarbageCollector,
46
48
  IGarbageCollectorConfigs,
47
49
  IGarbageCollectorCreateParams,
50
+ // eslint-disable-next-line import/no-deprecated
48
51
  IMarkPhaseStats,
52
+ // eslint-disable-next-line import/no-deprecated
49
53
  ISweepPhaseStats,
50
54
  UnreferencedState,
51
55
  type IGCNodeUpdatedProps,
@@ -142,16 +146,22 @@ export class GarbageCollector implements IGarbageCollector {
142
146
  private readonly summaryStateTracker: GCSummaryStateTracker;
143
147
  private readonly telemetryTracker: GCTelemetryTracker;
144
148
 
145
- /** For a given node path, returns the node's package path. */
149
+ /**
150
+ * For a given node path, returns the node's package path.
151
+ */
146
152
  private readonly getNodePackagePath: (
147
153
  nodePath: string,
148
154
  ) => Promise<readonly string[] | undefined>;
149
- /** Returns the timestamp of the last summary generated for this container. */
155
+ /**
156
+ * Returns the timestamp of the last summary generated for this container.
157
+ */
150
158
  private readonly getLastSummaryTimestampMs: () => number | undefined;
151
159
 
152
160
  private readonly submitMessage: (message: ContainerRuntimeGCMessage) => void;
153
161
 
154
- /** Returns the count of data stores whose GC state updated since the last summary. */
162
+ /**
163
+ * Returns the count of data stores whose GC state updated since the last summary.
164
+ */
155
165
  public get updatedDSCountSinceLastSummary(): number {
156
166
  return this.summaryStateTracker.updatedDSCountSinceLastSummary;
157
167
  }
@@ -227,7 +237,7 @@ export class GarbageCollector implements IGarbageCollector {
227
237
 
228
238
  try {
229
239
  // For newer documents, GC data should be present in the GC tree in the root of the snapshot.
230
- const gcSnapshotTree: ISnapshotTree | undefined = baseSnapshot.trees[gcTreeKey];
240
+ const gcSnapshotTree = baseSnapshot.trees[gcTreeKey];
231
241
  if (gcSnapshotTree === undefined) {
232
242
  // back-compat - Older documents get their gc data reset for simplicity as there are few of them
233
243
  // incremental gc summary will not work with older gc data as well
@@ -300,7 +310,7 @@ export class GarbageCollector implements IGarbageCollector {
300
310
  ),
301
311
  );
302
312
  }
303
- gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
313
+ gcNodes[nodeId] = [...nodeData.outboundRoutes];
304
314
  }
305
315
  this.gcDataFromLastRun = { gcNodes };
306
316
  });
@@ -319,7 +329,7 @@ export class GarbageCollector implements IGarbageCollector {
319
329
 
320
330
  const gcNodes: { [id: string]: string[] } = {};
321
331
  for (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {
322
- gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
332
+ gcNodes[nodeId] = [...nodeData.outboundRoutes];
323
333
  }
324
334
  // Run GC on the nodes in the base summary to get the routes used in each node in the container.
325
335
  // This is an optimization for space (vs performance) wherein we don't need to store the used routes of
@@ -339,9 +349,13 @@ export class GarbageCollector implements IGarbageCollector {
339
349
  });
340
350
  }
341
351
 
342
- /** API for ensuring the correct auto-recovery mitigations */
352
+ /**
353
+ * API for ensuring the correct auto-recovery mitigations
354
+ */
355
+ // TODO: consider hoisting this to an outer scope as an optimization
356
+ // eslint-disable-next-line unicorn/consistent-function-scoping
343
357
  private readonly autoRecovery = (() => {
344
- // This uses a hidden state machine for forcing fullGC as part of autorecovery,
358
+ // This uses a hidden state machine for forcing fullGC as part of auto-recovery,
345
359
  // to regenerate the GC data for each node.
346
360
  //
347
361
  // Once fullGC has been requested, we need to wait until GC has run and the summary has been acked before clearing the state.
@@ -403,7 +417,7 @@ export class GarbageCollector implements IGarbageCollector {
403
417
  // Initialize the tombstone state from the snapshot. Also, notify the runtime of tombstone routes.
404
418
  if (baseSnapshotData.tombstones !== undefined) {
405
419
  // Create a copy since we are writing from a source we don't control
406
- this.tombstones = Array.from(baseSnapshotData.tombstones);
420
+ this.tombstones = [...baseSnapshotData.tombstones];
407
421
  this.runtime.updateTombstonedRoutes(this.tombstones);
408
422
  }
409
423
 
@@ -414,7 +428,7 @@ export class GarbageCollector implements IGarbageCollector {
414
428
  * Initialize the GC state if not already initialized. If GC state is already initialized, update the unreferenced
415
429
  * state tracking as per the current reference timestamp.
416
430
  */
417
- private async initializeOrUpdateGCState() {
431
+ private async initializeOrUpdateGCState(): Promise<void> {
418
432
  const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
419
433
  if (currentReferenceTimestampMs === undefined) {
420
434
  return;
@@ -428,14 +442,14 @@ export class GarbageCollector implements IGarbageCollector {
428
442
  },
429
443
  async (event) => {
430
444
  // If the GC state hasn't been initialized yet, initialize it and return.
431
- if (!initialized) {
432
- await this.initializeGCStateFromBaseSnapshotP;
433
- } else {
445
+ if (initialized) {
434
446
  // If the GC state has been initialized, update the tracking of unreferenced nodes as per the current
435
447
  // reference timestamp.
436
448
  for (const [, nodeStateTracker] of this.unreferencedNodesState) {
437
449
  nodeStateTracker.updateTracking(currentReferenceTimestampMs);
438
450
  }
451
+ } else {
452
+ await this.initializeGCStateFromBaseSnapshotP;
439
453
  }
440
454
  event.end({
441
455
  details: { initialized, unrefNodeCount: this.unreferencedNodesState.size },
@@ -488,14 +502,21 @@ export class GarbageCollector implements IGarbageCollector {
488
502
  */
489
503
  public async collectGarbage(
490
504
  options: {
491
- /** Logger to use for logging GC events */
505
+ /**
506
+ * Logger to use for logging GC events
507
+ */
492
508
  logger?: ITelemetryLoggerExt;
493
- /** True to run GC sweep phase after the mark phase */
509
+ /**
510
+ * True to run GC sweep phase after the mark phase
511
+ */
494
512
  runSweep?: boolean;
495
- /** True to generate full GC data */
513
+ /**
514
+ * True to generate full GC data
515
+ */
496
516
  fullGC?: boolean;
497
517
  },
498
518
  telemetryContext?: ITelemetryContext,
519
+ // eslint-disable-next-line import/no-deprecated
499
520
  ): Promise<IGCStats | undefined> {
500
521
  const fullGC =
501
522
  options.fullGC ?? (this.configs.runFullGC === true || this.autoRecovery.useFullGC());
@@ -535,11 +556,15 @@ export class GarbageCollector implements IGarbageCollector {
535
556
  logger,
536
557
  { eventName: "GarbageCollection" },
537
558
  async (event) => {
538
- /** Pre-GC steps */
559
+ // #region Pre-GC steps
560
+
539
561
  // Ensure that state has been initialized from the base snapshot data.
540
562
  await this.initializeGCStateFromBaseSnapshotP;
541
563
 
542
- /** GC step */
564
+ // #endregion
565
+
566
+ // #region GC step
567
+
543
568
  const gcStats = await this.runGC(fullGC, currentReferenceTimestampMs, logger);
544
569
  event.end({
545
570
  ...gcStats,
@@ -550,7 +575,10 @@ export class GarbageCollector implements IGarbageCollector {
550
575
  },
551
576
  });
552
577
 
553
- /** Post-GC steps */
578
+ // #endregion
579
+
580
+ // #region Post-GC steps
581
+
554
582
  // Log pending unreferenced events such as a node being used after inactive. This is done after GC runs and
555
583
  // updates its state so that we don't send false positives based on intermediate state. For example, we may get
556
584
  // reference to an unreferenced node from another unreferenced node which means the node wasn't revived.
@@ -561,6 +589,8 @@ export class GarbageCollector implements IGarbageCollector {
561
589
  this.newReferencesSinceLastRun.clear();
562
590
  this.completedRuns++;
563
591
 
592
+ // #endregion
593
+
564
594
  return gcStats;
565
595
  },
566
596
  { end: true, cancel: "error" },
@@ -584,6 +614,7 @@ export class GarbageCollector implements IGarbageCollector {
584
614
  fullGC: boolean,
585
615
  currentReferenceTimestampMs: number,
586
616
  logger: ITelemetryLoggerExt,
617
+ // eslint-disable-next-line import/no-deprecated
587
618
  ): Promise<IGCStats> {
588
619
  // 1. Generate / analyze the runtime's reference graph.
589
620
  // Get the reference graph (gcData) and run GC algorithm to get referenced / unreferenced nodes.
@@ -700,7 +731,7 @@ export class GarbageCollector implements IGarbageCollector {
700
731
  gcResult: IGCResult,
701
732
  tombstoneReadyNodes: Set<string>,
702
733
  sweepReadyNodes: Set<string>,
703
- ) {
734
+ ): void {
704
735
  /**
705
736
  * Under "Test Mode", unreferenced nodes are immediately deleted without waiting for them to be sweep-ready.
706
737
  *
@@ -739,6 +770,7 @@ export class GarbageCollector implements IGarbageCollector {
739
770
  // local state when processing the op.
740
771
  const sweepReadyDSAndBlobs = nodesToDelete.filter((nodeId) => {
741
772
  const nodeType = this.runtime.getNodeType(nodeId);
773
+ // eslint-disable-next-line import/no-deprecated
742
774
  return nodeType === GCNodeType.DataStore || nodeType === GCNodeType.Blob;
743
775
  });
744
776
  const contents: GarbageCollectionMessage = {
@@ -816,16 +848,14 @@ export class GarbageCollector implements IGarbageCollector {
816
848
  */
817
849
  const gcDataSuperSet = concatGarbageCollectionData(previousGCData, currentGCData);
818
850
  const newOutboundRoutesSinceLastRun: string[] = [];
819
- this.newReferencesSinceLastRun.forEach(
820
- (outboundRoutes: string[], sourceNodeId: string) => {
821
- if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
822
- gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
823
- } else {
824
- gcDataSuperSet.gcNodes[sourceNodeId].push(...outboundRoutes);
825
- }
826
- newOutboundRoutesSinceLastRun.push(...outboundRoutes);
827
- },
828
- );
851
+ for (const [sourceNodeId, outboundRoutes] of this.newReferencesSinceLastRun) {
852
+ if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
853
+ gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
854
+ } else {
855
+ gcDataSuperSet.gcNodes[sourceNodeId].push(...outboundRoutes);
856
+ }
857
+ newOutboundRoutesSinceLastRun.push(...outboundRoutes);
858
+ }
829
859
 
830
860
  /**
831
861
  * Run GC on the above reference graph starting with root and all new outbound routes. This will generate a
@@ -872,6 +902,7 @@ export class GarbageCollector implements IGarbageCollector {
872
902
  );
873
903
  }
874
904
 
905
+ // eslint-disable-next-line import/no-deprecated
875
906
  public getMetadata(): IGCMetadata {
876
907
  return {
877
908
  /**
@@ -904,7 +935,7 @@ export class GarbageCollector implements IGarbageCollector {
904
935
  messageContents: GarbageCollectionMessage[],
905
936
  messageTimestampMs: number,
906
937
  local: boolean,
907
- ) {
938
+ ): void {
908
939
  for (const gcMessage of messageContents) {
909
940
  const gcMessageType = gcMessage.type;
910
941
  switch (gcMessageType) {
@@ -928,11 +959,12 @@ export class GarbageCollector implements IGarbageCollector {
928
959
  this.autoRecovery.requestFullGCOnNextRun();
929
960
  break;
930
961
  }
931
- default:
962
+ default: {
932
963
  throw DataProcessingError.create(
933
964
  `Garbage collection message of unknown type ${gcMessageType}`,
934
965
  "processMessage",
935
966
  );
967
+ }
936
968
  }
937
969
  }
938
970
  }
@@ -946,14 +978,14 @@ export class GarbageCollector implements IGarbageCollector {
946
978
  *
947
979
  * @param sweepReadyNodeIds - The ids of nodes that are ready to be deleted.
948
980
  */
949
- private deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]) {
981
+ private deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]): void {
950
982
  // Use a set for lookup because its much faster than array or map.
951
983
  const sweepReadyNodesSet: Set<string> = new Set(sweepReadyNodeIds);
952
984
 
953
985
  // The ids in the sweep-ready nodes do not contain DDS node ids. This is an optimization to reduce the size
954
986
  // of the GC op. Since GC applies to data store only, all its DDSes are deleted along with it. So, get the
955
987
  // DDS nodes ID from the unreferenced nodes state.
956
- const allSweepReadyNodeIds = Array.from(sweepReadyNodeIds);
988
+ const allSweepReadyNodeIds = [...sweepReadyNodeIds];
957
989
  for (const [id] of this.unreferencedNodesState) {
958
990
  // Ignore data store nodes since they would already be in the list.
959
991
  const pathParts = id.split("/");
@@ -992,7 +1024,7 @@ export class GarbageCollector implements IGarbageCollector {
992
1024
  request,
993
1025
  headerData,
994
1026
  additionalProps,
995
- }: IGCNodeUpdatedProps) {
1027
+ }: IGCNodeUpdatedProps): void {
996
1028
  // If there is no reference timestamp to work with, no ops have been processed after creation. If so, skip
997
1029
  // logging as nothing interesting would have happened worth logging.
998
1030
  if (!this.shouldRunGC || timestampMs === undefined) {
@@ -1002,7 +1034,7 @@ export class GarbageCollector implements IGarbageCollector {
1002
1034
  // trackedId will be either DataStore or Blob ID (not sub-DataStore ID, since some of those are unrecognized by GC)
1003
1035
  const trackedId = node.path;
1004
1036
  const isTombstoned = this.tombstones.includes(trackedId);
1005
- const fullPath = request !== undefined ? urlToGCNodePath(request.url) : trackedId;
1037
+ const fullPath = request === undefined ? trackedId : urlToGCNodePath(request.url);
1006
1038
 
1007
1039
  // This will log if appropriate
1008
1040
  this.telemetryTracker.nodeUsed(trackedId, {
@@ -1033,6 +1065,7 @@ export class GarbageCollector implements IGarbageCollector {
1033
1065
  // Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking
1034
1066
  const loadedBlobOrDataStore =
1035
1067
  reason === "Loaded" &&
1068
+ // eslint-disable-next-line import/no-deprecated
1036
1069
  (nodeType === GCNodeType.Blob || nodeType === GCNodeType.DataStore);
1037
1070
  if (!loadedBlobOrDataStore) {
1038
1071
  return;
@@ -1063,7 +1096,7 @@ export class GarbageCollector implements IGarbageCollector {
1063
1096
  * Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
1064
1097
  * before running GC next.
1065
1098
  */
1066
- private triggerAutoRecovery(nodePath: string) {
1099
+ private triggerAutoRecovery(nodePath: string): void {
1067
1100
  // If sweep isn't enabled, auto-recovery isn't needed since its purpose is to prevent this object from being
1068
1101
  // deleted. It also would end up sending a GC op which can break clients running FF version 1.x.
1069
1102
  if (!this.configs.sweepEnabled) {
@@ -1094,7 +1127,7 @@ export class GarbageCollector implements IGarbageCollector {
1094
1127
  toNodePath: string,
1095
1128
  timestampMs: number,
1096
1129
  autorecovery?: true,
1097
- ) {
1130
+ ): void {
1098
1131
  if (!this.shouldRunGC) {
1099
1132
  return;
1100
1133
  }
@@ -1160,7 +1193,9 @@ export class GarbageCollector implements IGarbageCollector {
1160
1193
  * @param gcResult - The result of the current GC run.
1161
1194
  * @returns the stats of the mark phase run.
1162
1195
  */
1196
+ // eslint-disable-next-line import/no-deprecated
1163
1197
  private getMarkPhaseStats(gcResult: IGCResult): IMarkPhaseStats {
1198
+ // eslint-disable-next-line import/no-deprecated
1164
1199
  const markPhaseStats: IMarkPhaseStats = {
1165
1200
  nodeCount: 0,
1166
1201
  dataStoreCount: 0,
@@ -1173,7 +1208,7 @@ export class GarbageCollector implements IGarbageCollector {
1173
1208
  updatedAttachmentBlobCount: 0,
1174
1209
  };
1175
1210
 
1176
- const updateNodeStats = (nodeId: string, isReferenced: boolean) => {
1211
+ const updateNodeStats = (nodeId: string, isReferenced: boolean): void => {
1177
1212
  markPhaseStats.nodeCount++;
1178
1213
  // If there is no previous GC data, every node's state is generated and is considered as updated.
1179
1214
  // Otherwise, find out if any node went from referenced to unreferenced or vice-versa.
@@ -1187,6 +1222,7 @@ export class GarbageCollector implements IGarbageCollector {
1187
1222
  markPhaseStats.unrefNodeCount++;
1188
1223
  }
1189
1224
 
1225
+ // eslint-disable-next-line import/no-deprecated
1190
1226
  if (this.runtime.getNodeType(nodeId) === GCNodeType.DataStore) {
1191
1227
  markPhaseStats.dataStoreCount++;
1192
1228
  if (stateUpdated) {
@@ -1196,6 +1232,7 @@ export class GarbageCollector implements IGarbageCollector {
1196
1232
  markPhaseStats.unrefDataStoreCount++;
1197
1233
  }
1198
1234
  }
1235
+ // eslint-disable-next-line import/no-deprecated
1199
1236
  if (this.runtime.getNodeType(nodeId) === GCNodeType.Blob) {
1200
1237
  markPhaseStats.attachmentBlobCount++;
1201
1238
  if (stateUpdated) {
@@ -1229,10 +1266,13 @@ export class GarbageCollector implements IGarbageCollector {
1229
1266
  private getSweepPhaseStats(
1230
1267
  deletedNodes: Set<string>,
1231
1268
  sweepReadyNodes: Set<string>,
1269
+ // eslint-disable-next-line import/no-deprecated
1232
1270
  markPhaseStats: IMarkPhaseStats,
1271
+ // eslint-disable-next-line import/no-deprecated
1233
1272
  ): ISweepPhaseStats {
1234
1273
  // Initialize the life time node counts to the mark phase node counts. If sweep is not enabled,
1235
1274
  // these will be the life time node count for this container.
1275
+ // eslint-disable-next-line import/no-deprecated
1236
1276
  const sweepPhaseStats: ISweepPhaseStats = {
1237
1277
  lifetimeNodeCount: markPhaseStats.nodeCount,
1238
1278
  lifetimeDataStoreCount: markPhaseStats.dataStoreCount,
@@ -1244,25 +1284,32 @@ export class GarbageCollector implements IGarbageCollector {
1244
1284
 
1245
1285
  // The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should
1246
1286
  // be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
1287
+ // eslint-disable-next-line import/no-deprecated, unicorn/consistent-function-scoping
1247
1288
  const getDeletedNodeType = (nodeId: string): GCNodeType => {
1248
1289
  const pathParts = nodeId.split("/");
1249
1290
  if (pathParts[1] === blobManagerBasePath) {
1291
+ // eslint-disable-next-line import/no-deprecated
1250
1292
  return GCNodeType.Blob;
1251
1293
  }
1252
1294
  if (pathParts.length === 2) {
1295
+ // eslint-disable-next-line import/no-deprecated
1253
1296
  return GCNodeType.DataStore;
1254
1297
  }
1255
1298
  if (pathParts.length === 3) {
1299
+ // eslint-disable-next-line import/no-deprecated
1256
1300
  return GCNodeType.SubDataStore;
1257
1301
  }
1302
+ // eslint-disable-next-line import/no-deprecated
1258
1303
  return GCNodeType.Other;
1259
1304
  };
1260
1305
 
1261
1306
  for (const nodeId of deletedNodes) {
1262
1307
  sweepPhaseStats.deletedNodeCount++;
1263
1308
  const nodeType = getDeletedNodeType(nodeId);
1309
+ // eslint-disable-next-line import/no-deprecated
1264
1310
  if (nodeType === GCNodeType.DataStore) {
1265
1311
  sweepPhaseStats.deletedDataStoreCount++;
1312
+ // eslint-disable-next-line import/no-deprecated
1266
1313
  } else if (nodeType === GCNodeType.Blob) {
1267
1314
  sweepPhaseStats.deletedAttachmentBlobCount++;
1268
1315
  }
@@ -1283,8 +1330,10 @@ export class GarbageCollector implements IGarbageCollector {
1283
1330
  for (const nodeId of sweepReadyNodes) {
1284
1331
  sweepPhaseStats.deletedNodeCount++;
1285
1332
  const nodeType = this.runtime.getNodeType(nodeId);
1333
+ // eslint-disable-next-line import/no-deprecated
1286
1334
  if (nodeType === GCNodeType.DataStore) {
1287
1335
  sweepPhaseStats.deletedDataStoreCount++;
1336
+ // eslint-disable-next-line import/no-deprecated
1288
1337
  } else if (nodeType === GCNodeType.Blob) {
1289
1338
  sweepPhaseStats.deletedAttachmentBlobCount++;
1290
1339
  }
@@ -9,10 +9,13 @@ import {
9
9
  validatePrecondition,
10
10
  } from "@fluidframework/telemetry-utils/internal";
11
11
 
12
+ // eslint-disable-next-line import/no-deprecated
12
13
  import { IContainerRuntimeMetadata } from "../summary/index.js";
13
14
 
14
15
  import {
16
+ // eslint-disable-next-line import/no-deprecated
15
17
  GCFeatureMatrix,
18
+ // eslint-disable-next-line import/no-deprecated
16
19
  GCVersion,
17
20
  IGCMetadata_Deprecated,
18
21
  IGCRuntimeOptions,
@@ -42,6 +45,7 @@ export function generateGCConfigs(
42
45
  mc: MonitoringContext,
43
46
  createParams: {
44
47
  gcOptions: IGCRuntimeOptions;
48
+ // eslint-disable-next-line import/no-deprecated
45
49
  metadata: IContainerRuntimeMetadata | undefined;
46
50
  existing: boolean;
47
51
  isSummarizerClient: boolean;
@@ -50,7 +54,9 @@ export function generateGCConfigs(
50
54
  let gcAllowed: boolean = true;
51
55
  let sessionExpiryTimeoutMs: number | undefined;
52
56
  let tombstoneTimeoutMs: number | undefined;
57
+ // eslint-disable-next-line import/no-deprecated
53
58
  let persistedGcFeatureMatrix: GCFeatureMatrix | undefined;
59
+ // eslint-disable-next-line import/no-deprecated
54
60
  let gcVersionInBaseSnapshot: GCVersion | undefined;
55
61
 
56
62
  /**
@@ -87,7 +93,7 @@ export function generateGCConfigs(
87
93
  tombstoneTimeoutMs =
88
94
  testOverrideTombstoneTimeoutMs ?? computeTombstoneTimeout(sessionExpiryTimeoutMs);
89
95
 
90
- const gcGeneration = createParams.gcOptions?.[gcGenerationOptionName];
96
+ const gcGeneration = createParams.gcOptions[gcGenerationOptionName] as number;
91
97
  if (gcGeneration !== undefined) {
92
98
  persistedGcFeatureMatrix = { gcGeneration };
93
99
  }
@@ -98,7 +104,9 @@ export function generateGCConfigs(
98
104
  // Note that if no generation option is provided, Sweep is allowed for any document.
99
105
  const sweepAllowed = shouldAllowGcSweep(
100
106
  persistedGcFeatureMatrix ?? {} /* featureMatrix */,
101
- createParams.gcOptions[gcGenerationOptionName] /* currentGeneration */,
107
+ createParams.gcOptions[gcGenerationOptionName] as
108
+ | number
109
+ | undefined /* currentGeneration */,
102
110
  );
103
111
 
104
112
  /**
@@ -116,9 +124,9 @@ export function generateGCConfigs(
116
124
  : sweepAllowed && createParams.gcOptions.enableGCSweep === true;
117
125
 
118
126
  // Override inactive timeout if test config or gc options to override it is set.
119
- const inactiveTimeoutMs =
127
+ const inactiveTimeoutMs: number =
120
128
  mc.config.getNumber("Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs") ??
121
- createParams.gcOptions.inactiveTimeoutMs ??
129
+ (createParams.gcOptions.inactiveTimeoutMs as number) ??
122
130
  defaultInactiveTimeoutMs;
123
131
 
124
132
  // Inactive timeout must be greater than tombstone timeout since a node goes from active -> inactive -> sweep ready.
@@ -169,7 +177,7 @@ export function generateGCConfigs(
169
177
  *
170
178
  * If there is no Session Expiry timeout, GC can never guarantee an object won't be revived, so return undefined.
171
179
  */
172
- function computeTombstoneTimeout(
180
+ export function computeTombstoneTimeout(
173
181
  sessionExpiryTimeoutMs: number | undefined,
174
182
  ): number | undefined {
175
183
  const bufferMs = oneDayMs;