@fluidframework/container-runtime 2.0.0-rc.4.0.5 → 2.0.0-rc.5.0.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 (424) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  3. package/api-extractor/api-extractor-lint-legacy.cjs.json +5 -0
  4. package/api-extractor/api-extractor-lint-legacy.esm.json +5 -0
  5. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  6. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  7. package/api-extractor.json +1 -1
  8. package/api-report/{container-runtime.api.md → container-runtime.alpha.api.md} +33 -516
  9. package/api-report/container-runtime.beta.api.md +73 -0
  10. package/api-report/container-runtime.public.api.md +73 -0
  11. package/biome.jsonc +4 -0
  12. package/container-runtime.test-files.tar +0 -0
  13. package/dist/batchTracker.d.ts.map +1 -1
  14. package/dist/batchTracker.js.map +1 -1
  15. package/dist/blobManager.d.ts +3 -20
  16. package/dist/blobManager.d.ts.map +1 -1
  17. package/dist/blobManager.js +1 -35
  18. package/dist/blobManager.js.map +1 -1
  19. package/dist/channelCollection.d.ts +21 -12
  20. package/dist/channelCollection.d.ts.map +1 -1
  21. package/dist/channelCollection.js +113 -110
  22. package/dist/channelCollection.js.map +1 -1
  23. package/dist/connectionTelemetry.d.ts +1 -1
  24. package/dist/connectionTelemetry.d.ts.map +1 -1
  25. package/dist/connectionTelemetry.js +14 -14
  26. package/dist/connectionTelemetry.js.map +1 -1
  27. package/dist/containerHandleContext.d.ts +2 -1
  28. package/dist/containerHandleContext.d.ts.map +1 -1
  29. package/dist/containerHandleContext.js.map +1 -1
  30. package/dist/containerRuntime.d.ts +17 -34
  31. package/dist/containerRuntime.d.ts.map +1 -1
  32. package/dist/containerRuntime.js +109 -145
  33. package/dist/containerRuntime.js.map +1 -1
  34. package/dist/dataStore.d.ts.map +1 -1
  35. package/dist/dataStore.js.map +1 -1
  36. package/dist/dataStoreContext.d.ts +30 -44
  37. package/dist/dataStoreContext.d.ts.map +1 -1
  38. package/dist/dataStoreContext.js +26 -40
  39. package/dist/dataStoreContext.js.map +1 -1
  40. package/dist/dataStoreContexts.d.ts.map +1 -1
  41. package/dist/dataStoreContexts.js.map +1 -1
  42. package/dist/dataStoreRegistry.js.map +1 -1
  43. package/dist/deltaManagerProxies.d.ts +4 -3
  44. package/dist/deltaManagerProxies.d.ts.map +1 -1
  45. package/dist/deltaManagerProxies.js.map +1 -1
  46. package/dist/deltaScheduler.d.ts +1 -1
  47. package/dist/deltaScheduler.d.ts.map +1 -1
  48. package/dist/deltaScheduler.js +1 -3
  49. package/dist/deltaScheduler.js.map +1 -1
  50. package/dist/gc/garbageCollection.d.ts +5 -5
  51. package/dist/gc/garbageCollection.d.ts.map +1 -1
  52. package/dist/gc/garbageCollection.js +29 -30
  53. package/dist/gc/garbageCollection.js.map +1 -1
  54. package/dist/gc/gcConfigs.d.ts.map +1 -1
  55. package/dist/gc/gcConfigs.js +12 -31
  56. package/dist/gc/gcConfigs.js.map +1 -1
  57. package/dist/gc/gcDefinitions.d.ts +10 -38
  58. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  59. package/dist/gc/gcDefinitions.js +1 -5
  60. package/dist/gc/gcDefinitions.js.map +1 -1
  61. package/dist/gc/gcHelpers.d.ts +2 -3
  62. package/dist/gc/gcHelpers.d.ts.map +1 -1
  63. package/dist/gc/gcHelpers.js.map +1 -1
  64. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  65. package/dist/gc/gcSummaryDefinitions.d.ts +1 -1
  66. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
  67. package/dist/gc/gcSummaryDefinitions.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -35
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +9 -62
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -2
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +3 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  77. package/dist/gc/index.d.ts +1 -1
  78. package/dist/gc/index.d.ts.map +1 -1
  79. package/dist/gc/index.js +1 -3
  80. package/dist/gc/index.js.map +1 -1
  81. package/dist/index.d.ts +2 -2
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/legacy.d.ts +1 -1
  85. package/dist/messageTypes.d.ts +6 -22
  86. package/dist/messageTypes.d.ts.map +1 -1
  87. package/dist/messageTypes.js.map +1 -1
  88. package/dist/opLifecycle/batchManager.js.map +1 -1
  89. package/dist/opLifecycle/definitions.d.ts +2 -2
  90. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  91. package/dist/opLifecycle/definitions.js.map +1 -1
  92. package/dist/opLifecycle/index.d.ts +1 -1
  93. package/dist/opLifecycle/index.d.ts.map +1 -1
  94. package/dist/opLifecycle/index.js.map +1 -1
  95. package/dist/opLifecycle/opCompressor.d.ts +11 -1
  96. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  97. package/dist/opLifecycle/opCompressor.js +13 -2
  98. package/dist/opLifecycle/opCompressor.js.map +1 -1
  99. package/dist/opLifecycle/opDecompressor.d.ts +1 -1
  100. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  101. package/dist/opLifecycle/opDecompressor.js +1 -2
  102. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  103. package/dist/opLifecycle/opGroupingManager.d.ts +10 -3
  104. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  105. package/dist/opLifecycle/opGroupingManager.js +7 -0
  106. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  107. package/dist/opLifecycle/opSplitter.d.ts +4 -2
  108. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  109. package/dist/opLifecycle/opSplitter.js +13 -8
  110. package/dist/opLifecycle/opSplitter.js.map +1 -1
  111. package/dist/opLifecycle/outbox.d.ts +10 -0
  112. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  113. package/dist/opLifecycle/outbox.js +13 -18
  114. package/dist/opLifecycle/outbox.js.map +1 -1
  115. package/dist/opLifecycle/remoteMessageProcessor.d.ts +1 -1
  116. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  117. package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
  118. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  119. package/dist/opProperties.d.ts +1 -1
  120. package/dist/opProperties.d.ts.map +1 -1
  121. package/dist/opProperties.js.map +1 -1
  122. package/dist/packageVersion.d.ts +1 -1
  123. package/dist/packageVersion.js +1 -1
  124. package/dist/packageVersion.js.map +1 -1
  125. package/dist/pendingStateManager.d.ts.map +1 -1
  126. package/dist/pendingStateManager.js +15 -5
  127. package/dist/pendingStateManager.js.map +1 -1
  128. package/dist/scheduleManager.d.ts +1 -1
  129. package/dist/scheduleManager.d.ts.map +1 -1
  130. package/dist/scheduleManager.js.map +1 -1
  131. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  132. package/dist/summary/documentSchema.d.ts.map +1 -1
  133. package/dist/summary/documentSchema.js +2 -3
  134. package/dist/summary/documentSchema.js.map +1 -1
  135. package/dist/summary/index.d.ts +2 -2
  136. package/dist/summary/index.d.ts.map +1 -1
  137. package/dist/summary/index.js.map +1 -1
  138. package/dist/summary/orderedClientElection.d.ts +4 -2
  139. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  140. package/dist/summary/orderedClientElection.js +35 -13
  141. package/dist/summary/orderedClientElection.js.map +1 -1
  142. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  143. package/dist/summary/runningSummarizer.d.ts +1 -6
  144. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  145. package/dist/summary/runningSummarizer.js +23 -110
  146. package/dist/summary/runningSummarizer.js.map +1 -1
  147. package/dist/summary/summarizer.d.ts +1 -1
  148. package/dist/summary/summarizer.d.ts.map +1 -1
  149. package/dist/summary/summarizer.js +4 -1
  150. package/dist/summary/summarizer.js.map +1 -1
  151. package/dist/summary/summarizerClientElection.d.ts +1 -1
  152. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  153. package/dist/summary/summarizerClientElection.js +2 -2
  154. package/dist/summary/summarizerClientElection.js.map +1 -1
  155. package/dist/summary/summarizerHeuristics.js.map +1 -1
  156. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -3
  157. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  158. package/dist/summary/summarizerNode/summarizerNode.js +16 -16
  159. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  160. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  161. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  162. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  163. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -3
  164. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  165. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +5 -2
  166. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  167. package/dist/summary/summarizerTypes.d.ts +17 -29
  168. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  169. package/dist/summary/summarizerTypes.js.map +1 -1
  170. package/dist/summary/summaryCollection.d.ts +1 -1
  171. package/dist/summary/summaryCollection.d.ts.map +1 -1
  172. package/dist/summary/summaryCollection.js +11 -11
  173. package/dist/summary/summaryCollection.js.map +1 -1
  174. package/dist/summary/summaryFormat.d.ts +2 -3
  175. package/dist/summary/summaryFormat.d.ts.map +1 -1
  176. package/dist/summary/summaryFormat.js +2 -2
  177. package/dist/summary/summaryFormat.js.map +1 -1
  178. package/dist/summary/summaryGenerator.d.ts +7 -8
  179. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  180. package/dist/summary/summaryGenerator.js +27 -24
  181. package/dist/summary/summaryGenerator.js.map +1 -1
  182. package/dist/summary/summaryManager.d.ts.map +1 -1
  183. package/dist/summary/summaryManager.js +1 -2
  184. package/dist/summary/summaryManager.js.map +1 -1
  185. package/dist/throttler.d.ts.map +1 -1
  186. package/dist/throttler.js +3 -1
  187. package/dist/throttler.js.map +1 -1
  188. package/lib/batchTracker.d.ts.map +1 -1
  189. package/lib/batchTracker.js +1 -1
  190. package/lib/batchTracker.js.map +1 -1
  191. package/lib/blobManager.d.ts +3 -20
  192. package/lib/blobManager.d.ts.map +1 -1
  193. package/lib/blobManager.js +2 -36
  194. package/lib/blobManager.js.map +1 -1
  195. package/lib/channelCollection.d.ts +21 -12
  196. package/lib/channelCollection.d.ts.map +1 -1
  197. package/lib/channelCollection.js +114 -112
  198. package/lib/channelCollection.js.map +1 -1
  199. package/lib/connectionTelemetry.d.ts +1 -1
  200. package/lib/connectionTelemetry.d.ts.map +1 -1
  201. package/lib/connectionTelemetry.js +2 -2
  202. package/lib/connectionTelemetry.js.map +1 -1
  203. package/lib/containerHandleContext.d.ts +2 -1
  204. package/lib/containerHandleContext.d.ts.map +1 -1
  205. package/lib/containerHandleContext.js.map +1 -1
  206. package/lib/containerRuntime.d.ts +17 -34
  207. package/lib/containerRuntime.d.ts.map +1 -1
  208. package/lib/containerRuntime.js +106 -142
  209. package/lib/containerRuntime.js.map +1 -1
  210. package/lib/dataStore.d.ts.map +1 -1
  211. package/lib/dataStore.js.map +1 -1
  212. package/lib/dataStoreContext.d.ts +30 -44
  213. package/lib/dataStoreContext.d.ts.map +1 -1
  214. package/lib/dataStoreContext.js +29 -43
  215. package/lib/dataStoreContext.js.map +1 -1
  216. package/lib/dataStoreContexts.d.ts.map +1 -1
  217. package/lib/dataStoreContexts.js +1 -1
  218. package/lib/dataStoreContexts.js.map +1 -1
  219. package/lib/dataStoreRegistry.js.map +1 -1
  220. package/lib/deltaManagerProxies.d.ts +4 -3
  221. package/lib/deltaManagerProxies.d.ts.map +1 -1
  222. package/lib/deltaManagerProxies.js.map +1 -1
  223. package/lib/deltaScheduler.d.ts +1 -1
  224. package/lib/deltaScheduler.d.ts.map +1 -1
  225. package/lib/deltaScheduler.js +1 -3
  226. package/lib/deltaScheduler.js.map +1 -1
  227. package/lib/gc/garbageCollection.d.ts +5 -5
  228. package/lib/gc/garbageCollection.d.ts.map +1 -1
  229. package/lib/gc/garbageCollection.js +30 -31
  230. package/lib/gc/garbageCollection.js.map +1 -1
  231. package/lib/gc/gcConfigs.d.ts.map +1 -1
  232. package/lib/gc/gcConfigs.js +13 -32
  233. package/lib/gc/gcConfigs.js.map +1 -1
  234. package/lib/gc/gcDefinitions.d.ts +10 -38
  235. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  236. package/lib/gc/gcDefinitions.js +0 -4
  237. package/lib/gc/gcDefinitions.js.map +1 -1
  238. package/lib/gc/gcHelpers.d.ts +2 -3
  239. package/lib/gc/gcHelpers.d.ts.map +1 -1
  240. package/lib/gc/gcHelpers.js.map +1 -1
  241. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  242. package/lib/gc/gcSummaryDefinitions.d.ts +1 -1
  243. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
  244. package/lib/gc/gcSummaryDefinitions.js.map +1 -1
  245. package/lib/gc/gcSummaryStateTracker.d.ts +2 -35
  246. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  247. package/lib/gc/gcSummaryStateTracker.js +4 -57
  248. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  249. package/lib/gc/gcTelemetry.d.ts +2 -2
  250. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  251. package/lib/gc/gcTelemetry.js +3 -9
  252. package/lib/gc/gcTelemetry.js.map +1 -1
  253. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  254. package/lib/gc/index.d.ts +1 -1
  255. package/lib/gc/index.d.ts.map +1 -1
  256. package/lib/gc/index.js +1 -1
  257. package/lib/gc/index.js.map +1 -1
  258. package/lib/index.d.ts +2 -2
  259. package/lib/index.d.ts.map +1 -1
  260. package/lib/index.js.map +1 -1
  261. package/lib/legacy.d.ts +1 -1
  262. package/lib/messageTypes.d.ts +6 -22
  263. package/lib/messageTypes.d.ts.map +1 -1
  264. package/lib/messageTypes.js.map +1 -1
  265. package/lib/opLifecycle/batchManager.js.map +1 -1
  266. package/lib/opLifecycle/definitions.d.ts +2 -2
  267. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  268. package/lib/opLifecycle/definitions.js.map +1 -1
  269. package/lib/opLifecycle/index.d.ts +1 -1
  270. package/lib/opLifecycle/index.d.ts.map +1 -1
  271. package/lib/opLifecycle/index.js +1 -1
  272. package/lib/opLifecycle/index.js.map +1 -1
  273. package/lib/opLifecycle/opCompressor.d.ts +11 -1
  274. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  275. package/lib/opLifecycle/opCompressor.js +13 -2
  276. package/lib/opLifecycle/opCompressor.js.map +1 -1
  277. package/lib/opLifecycle/opDecompressor.d.ts +1 -1
  278. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  279. package/lib/opLifecycle/opDecompressor.js +1 -2
  280. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  281. package/lib/opLifecycle/opGroupingManager.d.ts +10 -3
  282. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  283. package/lib/opLifecycle/opGroupingManager.js +7 -0
  284. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  285. package/lib/opLifecycle/opSplitter.d.ts +4 -2
  286. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  287. package/lib/opLifecycle/opSplitter.js +13 -8
  288. package/lib/opLifecycle/opSplitter.js.map +1 -1
  289. package/lib/opLifecycle/outbox.d.ts +10 -0
  290. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  291. package/lib/opLifecycle/outbox.js +13 -18
  292. package/lib/opLifecycle/outbox.js.map +1 -1
  293. package/lib/opLifecycle/remoteMessageProcessor.d.ts +1 -1
  294. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  295. package/lib/opLifecycle/remoteMessageProcessor.js +1 -1
  296. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  297. package/lib/opProperties.d.ts +1 -1
  298. package/lib/opProperties.d.ts.map +1 -1
  299. package/lib/opProperties.js.map +1 -1
  300. package/lib/packageVersion.d.ts +1 -1
  301. package/lib/packageVersion.js +1 -1
  302. package/lib/packageVersion.js.map +1 -1
  303. package/lib/pendingStateManager.d.ts.map +1 -1
  304. package/lib/pendingStateManager.js +15 -5
  305. package/lib/pendingStateManager.js.map +1 -1
  306. package/lib/scheduleManager.d.ts +1 -1
  307. package/lib/scheduleManager.d.ts.map +1 -1
  308. package/lib/scheduleManager.js.map +1 -1
  309. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  310. package/lib/summary/documentSchema.d.ts.map +1 -1
  311. package/lib/summary/documentSchema.js +2 -3
  312. package/lib/summary/documentSchema.js.map +1 -1
  313. package/lib/summary/index.d.ts +2 -2
  314. package/lib/summary/index.d.ts.map +1 -1
  315. package/lib/summary/index.js +1 -1
  316. package/lib/summary/index.js.map +1 -1
  317. package/lib/summary/orderedClientElection.d.ts +4 -2
  318. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  319. package/lib/summary/orderedClientElection.js +35 -13
  320. package/lib/summary/orderedClientElection.js.map +1 -1
  321. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  322. package/lib/summary/runningSummarizer.d.ts +1 -6
  323. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  324. package/lib/summary/runningSummarizer.js +22 -109
  325. package/lib/summary/runningSummarizer.js.map +1 -1
  326. package/lib/summary/summarizer.d.ts +1 -1
  327. package/lib/summary/summarizer.d.ts.map +1 -1
  328. package/lib/summary/summarizer.js +4 -1
  329. package/lib/summary/summarizer.js.map +1 -1
  330. package/lib/summary/summarizerClientElection.d.ts +1 -1
  331. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  332. package/lib/summary/summarizerClientElection.js +1 -1
  333. package/lib/summary/summarizerClientElection.js.map +1 -1
  334. package/lib/summary/summarizerHeuristics.js.map +1 -1
  335. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -3
  336. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  337. package/lib/summary/summarizerNode/summarizerNode.js +14 -14
  338. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  339. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  340. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  341. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  342. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -3
  343. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  344. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +5 -2
  345. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  346. package/lib/summary/summarizerTypes.d.ts +17 -29
  347. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  348. package/lib/summary/summarizerTypes.js.map +1 -1
  349. package/lib/summary/summaryCollection.d.ts +1 -1
  350. package/lib/summary/summaryCollection.d.ts.map +1 -1
  351. package/lib/summary/summaryCollection.js +3 -3
  352. package/lib/summary/summaryCollection.js.map +1 -1
  353. package/lib/summary/summaryFormat.d.ts +2 -3
  354. package/lib/summary/summaryFormat.d.ts.map +1 -1
  355. package/lib/summary/summaryFormat.js +2 -2
  356. package/lib/summary/summaryFormat.js.map +1 -1
  357. package/lib/summary/summaryGenerator.d.ts +7 -8
  358. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  359. package/lib/summary/summaryGenerator.js +26 -23
  360. package/lib/summary/summaryGenerator.js.map +1 -1
  361. package/lib/summary/summaryManager.d.ts.map +1 -1
  362. package/lib/summary/summaryManager.js +1 -2
  363. package/lib/summary/summaryManager.js.map +1 -1
  364. package/lib/throttler.d.ts.map +1 -1
  365. package/lib/throttler.js +3 -1
  366. package/lib/throttler.js.map +1 -1
  367. package/lib/tsdoc-metadata.json +1 -1
  368. package/package.json +92 -28
  369. package/src/batchTracker.ts +5 -2
  370. package/src/blobManager.ts +21 -61
  371. package/src/channelCollection.ts +179 -186
  372. package/src/connectionTelemetry.ts +18 -12
  373. package/src/containerHandleContext.ts +2 -1
  374. package/src/containerRuntime.ts +166 -214
  375. package/src/dataStore.ts +2 -1
  376. package/src/dataStoreContext.ts +79 -98
  377. package/src/dataStoreContexts.ts +7 -2
  378. package/src/deltaManagerProxies.ts +15 -6
  379. package/src/deltaScheduler.ts +5 -4
  380. package/src/gc/garbageCollection.md +0 -8
  381. package/src/gc/garbageCollection.ts +66 -57
  382. package/src/gc/gcConfigs.ts +15 -37
  383. package/src/gc/gcDefinitions.ts +20 -39
  384. package/src/gc/gcHelpers.ts +8 -4
  385. package/src/gc/gcSummaryDefinitions.ts +1 -1
  386. package/src/gc/gcSummaryStateTracker.ts +11 -74
  387. package/src/gc/gcTelemetry.ts +4 -11
  388. package/src/gc/index.ts +0 -2
  389. package/src/index.ts +1 -2
  390. package/src/messageTypes.ts +8 -24
  391. package/src/opLifecycle/README.md +120 -160
  392. package/src/opLifecycle/definitions.ts +2 -2
  393. package/src/opLifecycle/index.ts +5 -1
  394. package/src/opLifecycle/opCompressor.ts +13 -2
  395. package/src/opLifecycle/opDecompressor.ts +3 -7
  396. package/src/opLifecycle/opGroupingManager.ts +12 -8
  397. package/src/opLifecycle/opSplitter.ts +22 -11
  398. package/src/opLifecycle/outbox.ts +14 -32
  399. package/src/opLifecycle/remoteMessageProcessor.ts +4 -1
  400. package/src/opProperties.ts +2 -2
  401. package/src/packageVersion.ts +1 -1
  402. package/src/pendingStateManager.ts +20 -7
  403. package/src/scheduleManager.ts +4 -1
  404. package/src/summary/documentSchema.ts +4 -7
  405. package/src/summary/images/appTree.png +0 -0
  406. package/src/summary/images/protocolAndAppTree.png +0 -0
  407. package/src/summary/images/summaryTree.png +0 -0
  408. package/src/summary/index.ts +5 -2
  409. package/src/summary/orderedClientElection.ts +100 -22
  410. package/src/summary/runningSummarizer.ts +54 -124
  411. package/src/summary/summarizer.ts +5 -2
  412. package/src/summary/summarizerClientElection.ts +4 -2
  413. package/src/summary/summarizerNode/summarizerNode.ts +23 -30
  414. package/src/summary/summarizerNode/summarizerNodeUtils.ts +9 -3
  415. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -11
  416. package/src/summary/summarizerTypes.ts +32 -33
  417. package/src/summary/summaryCollection.ts +6 -3
  418. package/src/summary/summaryFormat.ts +18 -10
  419. package/src/summary/summaryFormats.md +160 -0
  420. package/src/summary/summaryGenerator.ts +47 -30
  421. package/src/summary/summaryManager.ts +6 -9
  422. package/src/throttler.ts +3 -1
  423. package/tsconfig.json +2 -0
  424. package/tsdoc.json +4 -0
@@ -9,9 +9,9 @@ const client_utils_1 = require("@fluid-internal/client-utils");
9
9
  const container_definitions_1 = require("@fluidframework/container-definitions");
10
10
  const internal_1 = require("@fluidframework/container-definitions/internal");
11
11
  const internal_2 = require("@fluidframework/core-utils/internal");
12
+ const driver_definitions_1 = require("@fluidframework/driver-definitions");
12
13
  const internal_3 = require("@fluidframework/driver-definitions/internal");
13
14
  const internal_4 = require("@fluidframework/driver-utils/internal");
14
- const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
15
15
  const internal_5 = require("@fluidframework/runtime-definitions/internal");
16
16
  const internal_6 = require("@fluidframework/runtime-utils/internal");
17
17
  const internal_7 = require("@fluidframework/telemetry-utils/internal");
@@ -50,13 +50,13 @@ function compatBehaviorAllowsMessageType(_unknownContainerRuntimeMessageType, co
50
50
  exports.DefaultSummaryConfiguration = {
51
51
  state: "enabled",
52
52
  minIdleTime: 0,
53
- maxIdleTime: 30 * 1000,
54
- maxTime: 60 * 1000,
55
- maxOps: 100,
53
+ maxIdleTime: 30 * 1000, // 30 secs.
54
+ maxTime: 60 * 1000, // 1 min.
55
+ maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.
56
56
  minOpsForLastSummaryAttempt: 10,
57
- maxAckWaitTime: 3 * 60 * 1000,
57
+ maxAckWaitTime: 3 * 60 * 1000, // 3 mins.
58
58
  maxOpsSinceLastSummary: 7000,
59
- initialSummarizerDelayMs: 5 * 1000,
59
+ initialSummarizerDelayMs: 5 * 1000, // 5 secs.
60
60
  nonRuntimeOpWeight: 0.1,
61
61
  runtimeOpWeight: 1.0,
62
62
  nonRuntimeHeuristicThreshold: 20,
@@ -155,7 +155,7 @@ exports.getDeviceSpec = getDeviceSpec;
155
155
  */
156
156
  const makeLegacySendBatchFn = (submitFn, deltaManager) => (batch) => {
157
157
  for (const message of batch.content) {
158
- submitFn(protocol_definitions_1.MessageType.Operation,
158
+ submitFn(internal_3.MessageType.Operation,
159
159
  // For back-compat (submitFn only works on deserialized content)
160
160
  message.contents === undefined ? undefined : JSON.parse(message.contents), true, // batch
161
161
  message.metadata);
@@ -532,7 +532,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
532
532
  return this.garbageCollector.throwOnTombstoneUsage;
533
533
  }
534
534
  /***/
535
- constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope, logger, existing, blobManagerSnapshot, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, summaryConfiguration = {
535
+ constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
536
+ // Create a custom ITelemetryBaseLogger to output telemetry events.
537
+ baseLogger, existing, blobManagerSnapshot, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, summaryConfiguration = {
536
538
  // the defaults
537
539
  ...exports.DefaultSummaryConfiguration,
538
540
  // the runtime configuration overrides
@@ -543,7 +545,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
543
545
  this.metadata = metadata;
544
546
  this.runtimeOptions = runtimeOptions;
545
547
  this.containerScope = containerScope;
546
- this.logger = logger;
548
+ this.baseLogger = baseLogger;
547
549
  this._storage = _storage;
548
550
  this.createIdCompressor = createIdCompressor;
549
551
  this.documentsSchemaController = documentsSchemaController;
@@ -575,6 +577,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
575
577
  expiry: { policy: "absolute", durationMs: 60000 },
576
578
  });
577
579
  const { options, clientDetails, connected, baseSnapshot, submitFn, submitBatchFn, submitSummaryFn, submitSignalFn, disposeFn, closeFn, deltaManager, quorum, audience, loader, pendingLocalState, supportedFeatures, snapshotWithContents, } = context;
580
+ this.logger = (0, internal_7.createChildLogger)({ logger: this.baseLogger });
578
581
  this.mc = (0, internal_7.createChildMonitoringContext)({
579
582
  logger: this.logger,
580
583
  namespace: "ContainerRuntime",
@@ -770,7 +773,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
770
773
  snapshotTree: snapshot,
771
774
  };
772
775
  }
773
- this.channelCollection = new channelCollection_js_1.ChannelCollection(snapshot, parentContext, this.mc.logger, (props) => this.garbageCollector.nodeUpdated(props), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
776
+ this.channelCollection = new channelCollection_js_1.ChannelCollection(snapshot, parentContext, this.mc.logger, (props) => this.garbageCollector.nodeUpdated({
777
+ ...props,
778
+ timestampMs: props.timestampMs ?? this.getCurrentReferenceTimestampMs(),
779
+ }), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
774
780
  this.blobManager = new blobManager_js_1.BlobManager({
775
781
  routeContext: this.handleContext,
776
782
  snapshot: blobManagerSnapshot,
@@ -786,6 +792,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
786
792
  blobRequested: (blobPath) => this.garbageCollector.nodeUpdated({
787
793
  node: { type: "Blob", path: blobPath },
788
794
  reason: "Loaded",
795
+ timestampMs: this.getCurrentReferenceTimestampMs(),
789
796
  }),
790
797
  isBlobDeleted: (blobPath) => this.garbageCollector.isNodeDeleted(blobPath),
791
798
  runtime: this,
@@ -843,7 +850,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
843
850
  });
844
851
  }
845
852
  const closeSummarizerDelayOverride = this.mc.config.getNumber("Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs");
846
- this.closeSummarizerDelayMs = closeSummarizerDelayOverride ?? defaultCloseSummarizerDelayMs;
853
+ this.closeSummarizerDelayMs =
854
+ closeSummarizerDelayOverride ?? defaultCloseSummarizerDelayMs;
847
855
  this.summaryCollection = new index_js_3.SummaryCollection(this.deltaManager, this.logger);
848
856
  this.dirtyContainer =
849
857
  this.attachState !== container_definitions_1.AttachState.Attached || this.hasPendingMessages();
@@ -857,7 +865,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
857
865
  namespace: "OrderedClientElection",
858
866
  });
859
867
  const orderedClientCollection = new index_js_3.OrderedClientCollection(orderedClientLogger, this.innerDeltaManager, this._quorum);
860
- const orderedClientElectionForSummarizer = new index_js_3.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_3.SummarizerClientElection.isClientEligible);
868
+ const orderedClientElectionForSummarizer = new index_js_3.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_3.SummarizerClientElection.isClientEligible, this.mc.config.getBoolean("Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents"));
861
869
  this.summarizerClientElection = new index_js_3.SummarizerClientElection(orderedClientLogger, this.summaryCollection, orderedClientElectionForSummarizer, this.maxOpsSinceLastSummary);
862
870
  if (this.isSummarizerClient) {
863
871
  this._summarizer = new index_js_3.Summarizer(this /* ISummarizerRuntime */, () => this.summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, this.summaryCollection, async (runtime) => index_js_3.RunWhileConnectedCoordinator.create(runtime,
@@ -874,7 +882,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
874
882
  // unregister default to no log on every op after falling behind
875
883
  // and register summary ack handler to re-register this handler
876
884
  // after successful summary
877
- this.summaryCollection.once(protocol_definitions_1.MessageType.SummaryAck, () => {
885
+ this.summaryCollection.once(internal_3.MessageType.SummaryAck, () => {
878
886
  this.mc.logger.sendTelemetryEvent({
879
887
  eventName: "SummaryStatus:CaughtUp",
880
888
  });
@@ -901,7 +909,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
901
909
  }
902
910
  }
903
911
  // logging hardware telemetry
904
- logger.sendTelemetryEvent({
912
+ this.logger.sendTelemetryEvent({
905
913
  eventName: "DeviceSpec",
906
914
  ...getDeviceSpec(),
907
915
  });
@@ -1064,7 +1072,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1064
1072
  const props = {
1065
1073
  eventName: "GroupIdSnapshotCatchup",
1066
1074
  loadingGroupIds: sortedLoadingGroupIds.join(","),
1067
- targetSequenceNumber: snapshotSeqNumber,
1075
+ targetSequenceNumber: snapshotSeqNumber, // This is so we reuse some columns in telemetry
1068
1076
  sequenceNumber: this.deltaManager.lastSequenceNumber, // This is so we reuse some columns in telemetry
1069
1077
  };
1070
1078
  const event = internal_7.PerformanceEvent.start(this.mc.logger, {
@@ -1182,7 +1190,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1182
1190
  this.messageAtLastSummary;
1183
1191
  const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(this.deltaManager.lastSequenceNumber);
1184
1192
  // Is document schema explicit control on?
1185
- const explitiSchemaControl = documentSchema?.runtime.explicitSchemaControl;
1193
+ const explicitSchemaControl = documentSchema?.runtime.explicitSchemaControl;
1186
1194
  const metadata = {
1187
1195
  ...this.createContainerMetadata,
1188
1196
  // Increment the summary number for the next summary that will be generated.
@@ -1195,10 +1203,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1195
1203
  // runtimes (that preceed document schema control capabilities) to close container on load due to mismatch in
1196
1204
  // last message's sequence number.
1197
1205
  // See also lastMessageFromMetadata()
1198
- message: explitiSchemaControl
1206
+ message: explicitSchemaControl
1199
1207
  ? { sequenceNumber: -1 }
1200
1208
  : message,
1201
- lastMessage: explitiSchemaControl ? message : undefined,
1209
+ lastMessage: explicitSchemaControl ? message : undefined,
1202
1210
  documentSchema,
1203
1211
  };
1204
1212
  (0, internal_6.addBlobToSummary)(summaryTree, index_js_3.metadataBlobName, JSON.stringify(metadata));
@@ -1453,7 +1461,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1453
1461
  // Whether or not the message appears to be a runtime message from an up-to-date client.
1454
1462
  // It may be a legacy runtime message (ie already unpacked and ContainerMessageType)
1455
1463
  // or something different, like a system message.
1456
- const modernRuntimeMessage = messageArg.type === protocol_definitions_1.MessageType.Operation;
1464
+ const modernRuntimeMessage = messageArg.type === internal_3.MessageType.Operation;
1457
1465
  // Do shallow copy of message, as the processing flow will modify it.
1458
1466
  // There might be multiple container instances receiving the same message.
1459
1467
  // We do not need to make a deep copy. Each layer will just replace message.contents itself,
@@ -1541,7 +1549,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1541
1549
  case messageTypes_js_1.ContainerMessageType.Attach:
1542
1550
  case messageTypes_js_1.ContainerMessageType.Alias:
1543
1551
  case messageTypes_js_1.ContainerMessageType.FluidDataStoreOp:
1544
- this.channelCollection.process(messageWithContext.message, local, localOpMetadata, (from, to) => this.garbageCollector.addedOutboundReference(from, to));
1552
+ this.channelCollection.process(messageWithContext.message, local, localOpMetadata);
1545
1553
  break;
1546
1554
  case messageTypes_js_1.ContainerMessageType.BlobAttach:
1547
1555
  this.blobManager.processBlobAttachOp(messageWithContext.message, local);
@@ -1566,7 +1574,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1566
1574
  }
1567
1575
  break;
1568
1576
  case messageTypes_js_1.ContainerMessageType.GC:
1569
- this.garbageCollector.processMessage(messageWithContext.message, local);
1577
+ this.garbageCollector.processMessage(messageWithContext.message, messageWithContext.message.timestamp, local);
1570
1578
  break;
1571
1579
  case messageTypes_js_1.ContainerMessageType.ChunkedOp:
1572
1580
  // From observability POV, we should not exppse the rest of the system (including "op" events on object) to these messages.
@@ -1629,8 +1637,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1629
1637
  if (message.clientId === this.clientId && this.connected) {
1630
1638
  // Check to see if the signal was lost.
1631
1639
  if (this._perfSignalData.trackingSignalSequenceNumber !== undefined &&
1632
- envelope.clientSignalSequenceNumber >
1633
- this._perfSignalData.trackingSignalSequenceNumber) {
1640
+ envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber) {
1634
1641
  this._perfSignalData.signalsLost++;
1635
1642
  this._perfSignalData.trackingSignalSequenceNumber = undefined;
1636
1643
  this.mc.logger.sendErrorEvent({
@@ -1750,6 +1757,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1750
1757
  node: { type: "DataStore", path: `/${internalId}` },
1751
1758
  reason: "Loaded",
1752
1759
  packagePath: context.packagePath,
1760
+ timestampMs: this.getCurrentReferenceTimestampMs(),
1753
1761
  });
1754
1762
  return channel.entryPoint;
1755
1763
  }
@@ -1917,25 +1925,16 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1917
1925
  await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC }, telemetryContext);
1918
1926
  }
1919
1927
  const { stats, summary } = await this.summarizerNode.summarize(fullTree, trackState, telemetryContext);
1920
- (0, internal_2.assert)(summary.type === protocol_definitions_1.SummaryType.Tree, 0x12f /* "Container Runtime's summarize should always return a tree" */);
1928
+ (0, internal_2.assert)(summary.type === driver_definitions_1.SummaryType.Tree, 0x12f /* "Container Runtime's summarize should always return a tree" */);
1921
1929
  return { stats, summary };
1922
1930
  }
1923
1931
  finally {
1924
- this.mc.logger.sendTelemetryEvent({
1932
+ summaryLogger.sendTelemetryEvent({
1925
1933
  eventName: "SummarizeTelemetry",
1926
1934
  details: telemetryContext.serialize(),
1927
1935
  });
1928
1936
  }
1929
1937
  }
1930
- /**
1931
- * Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify
1932
- * the garbage collector of references detected since the last GC run. Most references are notified immediately
1933
- * but there can be some for which async operation is required (such as detecting new root data stores).
1934
- * @see IGarbageCollectionRuntime.updateStateBeforeGC
1935
- */
1936
- async updateStateBeforeGC() {
1937
- return this.channelCollection.updateStateBeforeGC();
1938
- }
1939
1938
  async getGCDataInternal(fullGC) {
1940
1939
  return this.channelCollection.getGCData(fullGC);
1941
1940
  }
@@ -1984,8 +1983,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1984
1983
  * @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.
1985
1984
  */
1986
1985
  updateTombstonedRoutes(tombstonedRoutes) {
1987
- const { blobManagerRoutes, dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);
1988
- this.blobManager.updateTombstonedRoutes(blobManagerRoutes);
1986
+ const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);
1989
1987
  this.channelCollection.updateTombstonedRoutes(dataStoreRoutes);
1990
1988
  }
1991
1989
  /**
@@ -2063,13 +2061,29 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2063
2061
  return this.garbageCollector.collectGarbage(options, telemetryContext);
2064
2062
  }
2065
2063
  /**
2066
- * Called when a new outbound reference is added to another node. This is used by garbage collection to identify
2064
+ * Called when a new outbound route is added to another node. This is used by garbage collection to identify
2067
2065
  * all references added in the system.
2068
- * @param srcHandle - The handle of the node that added the reference.
2069
- * @param outboundHandle - The handle of the outbound node that is referenced.
2066
+ * @param fromPath - The absolute path of the node that added the reference.
2067
+ * @param toPath - The absolute path of the outbound node that is referenced.
2068
+ * @param messageTimestampMs - The timestamp of the message that added the reference.
2070
2069
  */
2071
- addedGCOutboundReference(srcHandle, outboundHandle) {
2072
- this.garbageCollector.addedOutboundReference(srcHandle.absolutePath, outboundHandle.absolutePath);
2070
+ addedGCOutboundRoute(fromPath, toPath, messageTimestampMs) {
2071
+ // This is always called when processing an op so messageTimestampMs should exist. Due to back-compat
2072
+ // across the data store runtime / container runtime boundary, this may be undefined and if so, get
2073
+ // the timestamp from the last processed message which should exist.
2074
+ // If a timestamp doesn't exist, log so we can learn about these cases and return.
2075
+ const timestampMs = messageTimestampMs ?? this.getCurrentReferenceTimestampMs();
2076
+ if (timestampMs === undefined) {
2077
+ this.mc.logger.sendTelemetryEvent({
2078
+ eventName: "NoTimestampInGCOutboundRoute",
2079
+ ...(0, internal_7.tagCodeArtifacts)({
2080
+ id: toPath,
2081
+ fromId: fromPath,
2082
+ }),
2083
+ });
2084
+ return;
2085
+ }
2086
+ this.garbageCollector.addedOutboundReference(fromPath, toPath, timestampMs);
2073
2087
  }
2074
2088
  /**
2075
2089
  * Generates the summary tree, uploads it to storage, and then submits the summarize op.
@@ -2080,7 +2094,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2080
2094
  * @param options - options controlling how the summary is generated or submitted
2081
2095
  */
2082
2096
  async submitSummary(options) {
2083
- const { fullTree = false, finalAttempt = false, refreshLatestAck, summaryLogger, latestSummaryRefSeqNum, } = options;
2097
+ const { fullTree = false, finalAttempt = false, summaryLogger, latestSummaryRefSeqNum, } = options;
2084
2098
  // The summary number for this summary. This will be updated during the summary process, so get it now and
2085
2099
  // use it for all events logged during this summary.
2086
2100
  const summaryNumber = this.nextSummaryNumber;
@@ -2095,13 +2109,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2095
2109
  },
2096
2110
  });
2097
2111
  (0, internal_2.assert)(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);
2098
- // We close the summarizer and download a new snapshot and reload the container
2099
- if (refreshLatestAck === true) {
2100
- return this.prefetchLatestSummaryThenClose((0, internal_7.createChildLogger)({
2101
- logger: summaryNumberLogger,
2102
- properties: { all: { safeSummary: true } },
2103
- }));
2104
- }
2105
2112
  // If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent
2106
2113
  // and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not
2107
2114
  // saved within the timeout, check if it should be failed or can continue.
@@ -2156,8 +2163,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2156
2163
  * Generally the validate sequence number comes from the running summarizer and the node sequence number comes from the
2157
2164
  * summarizer nodes.
2158
2165
  */
2159
- if (startSummaryResult.invalidNodes > 0 ||
2160
- startSummaryResult.mismatchNumbers.size > 0) {
2166
+ if (startSummaryResult.invalidNodes > 0 || startSummaryResult.mismatchNumbers.size > 0) {
2161
2167
  summaryLogger.sendTelemetryEvent({
2162
2168
  eventName: "LatestSummaryRefSeqNumMismatch",
2163
2169
  details: {
@@ -2170,7 +2176,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2170
2176
  stage: "base",
2171
2177
  referenceSequenceNumber: summaryRefSeqNum,
2172
2178
  minimumSequenceNumber,
2173
- error: new internal_7.LoggingError(`Summarizer node state inconsistent with summarizer state.`),
2179
+ error: new index_js_3.RetriableSummaryError(`Summarizer node state inconsistent with summarizer state.`),
2174
2180
  };
2175
2181
  }
2176
2182
  }
@@ -2213,17 +2219,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2213
2219
  stage: "base",
2214
2220
  referenceSequenceNumber: summaryRefSeqNum,
2215
2221
  minimumSequenceNumber,
2216
- error: new internal_7.LoggingError(continueResult.error),
2222
+ error: new index_js_3.RetriableSummaryError(continueResult.error),
2217
2223
  };
2218
2224
  }
2219
2225
  const trace = client_utils_1.Trace.start();
2220
2226
  let summarizeResult;
2221
- // If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced
2222
- // state of all the nodes.
2223
- const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;
2224
2227
  try {
2225
2228
  summarizeResult = await this.summarize({
2226
- fullTree: fullTree || forcedFullTree,
2229
+ fullTree,
2227
2230
  trackState: true,
2228
2231
  summaryLogger: summaryNumberLogger,
2229
2232
  runGC: this.garbageCollector.shouldRunGC,
@@ -2234,7 +2237,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2234
2237
  stage: "base",
2235
2238
  referenceSequenceNumber: summaryRefSeqNum,
2236
2239
  minimumSequenceNumber,
2237
- error: (0, internal_7.wrapError)(error, (msg) => new internal_7.LoggingError(msg)),
2240
+ error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
2238
2241
  };
2239
2242
  }
2240
2243
  // Validate that the summary generated by summarizer nodes is correct before uploading.
@@ -2262,8 +2265,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2262
2265
  // Because handles are unchanged dataStores in the current logic,
2263
2266
  // summarized dataStore count is total dataStore count minus handle count
2264
2267
  const dataStoreTree = summaryTree.tree[internal_5.channelsTreeName];
2265
- (0, internal_2.assert)(dataStoreTree.type === protocol_definitions_1.SummaryType.Tree, 0x1fc /* "summary is not a tree" */);
2266
- const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type === protocol_definitions_1.SummaryType.Handle).length;
2268
+ (0, internal_2.assert)(dataStoreTree.type === driver_definitions_1.SummaryType.Tree, 0x1fc /* "summary is not a tree" */);
2269
+ const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type === driver_definitions_1.SummaryType.Handle).length;
2267
2270
  const gcSummaryTreeStats = summaryTree.tree[internal_5.gcTreeKey]
2268
2271
  ? (0, internal_6.calculateStats)(summaryTree.tree[internal_5.gcTreeKey])
2269
2272
  : undefined;
@@ -2282,14 +2285,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2282
2285
  summaryTree,
2283
2286
  summaryStats,
2284
2287
  generateDuration: trace.trace().duration,
2285
- forcedFullTree,
2286
2288
  };
2287
2289
  continueResult = checkContinue();
2288
2290
  if (!continueResult.continue) {
2289
2291
  return {
2290
2292
  stage: "generate",
2291
2293
  ...generateSummaryData,
2292
- error: new internal_7.LoggingError(continueResult.error),
2294
+ error: new index_js_3.RetriableSummaryError(continueResult.error),
2293
2295
  };
2294
2296
  }
2295
2297
  const summaryContext = lastAck === undefined
@@ -2311,7 +2313,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2311
2313
  return {
2312
2314
  stage: "generate",
2313
2315
  ...generateSummaryData,
2314
- error: (0, internal_7.wrapError)(error, (msg) => new internal_7.LoggingError(msg)),
2316
+ error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
2315
2317
  };
2316
2318
  }
2317
2319
  const parent = summaryContext.ackHandle;
@@ -2332,7 +2334,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2332
2334
  return {
2333
2335
  stage: "upload",
2334
2336
  ...uploadData,
2335
- error: new internal_7.LoggingError(continueResult.error),
2337
+ error: new index_js_3.RetriableSummaryError(continueResult.error),
2336
2338
  };
2337
2339
  }
2338
2340
  let clientSequenceNumber;
@@ -2343,7 +2345,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2343
2345
  return {
2344
2346
  stage: "upload",
2345
2347
  ...uploadData,
2346
- error: (0, internal_7.wrapError)(error, (msg) => new internal_7.LoggingError(msg)),
2348
+ error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
2347
2349
  };
2348
2350
  }
2349
2351
  const submitData = {
@@ -2359,7 +2361,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2359
2361
  return {
2360
2362
  stage: "upload",
2361
2363
  ...uploadData,
2362
- error: (0, internal_7.wrapError)(error, (msg) => new internal_7.LoggingError(msg)),
2364
+ error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
2363
2365
  };
2364
2366
  }
2365
2367
  return submitData;
@@ -2449,13 +2451,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2449
2451
  this.verifyNotClosed();
2450
2452
  return this.blobManager.createBlob(blob, signal);
2451
2453
  }
2452
- submitIdAllocationOpIfNeeded(resubmitOutstandingRanges = false) {
2454
+ submitIdAllocationOpIfNeeded(resubmitOutstandingRanges) {
2453
2455
  if (this._idCompressor) {
2454
2456
  const idRange = resubmitOutstandingRanges
2455
- ? this.idCompressor?.takeUnfinalizedCreationRange()
2457
+ ? this._idCompressor.takeUnfinalizedCreationRange()
2456
2458
  : this._idCompressor.takeNextCreationRange();
2457
2459
  // Don't include the idRange if there weren't any Ids allocated
2458
- if (idRange?.ids !== undefined) {
2460
+ if (idRange.ids !== undefined) {
2459
2461
  const idAllocationMessage = {
2460
2462
  type: messageTypes_js_1.ContainerMessageType.IdAllocation,
2461
2463
  contents: idRange,
@@ -2484,6 +2486,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2484
2486
  });
2485
2487
  }
2486
2488
  const type = containerRuntimeMessage.type;
2489
+ (0, internal_2.assert)(type !== messageTypes_js_1.ContainerMessageType.IdAllocation, 0x9a5 /* IdAllocation should be submitted directly to outbox. */);
2487
2490
  const message = {
2488
2491
  contents: serializedContent,
2489
2492
  metadata,
@@ -2491,44 +2494,35 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2491
2494
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2492
2495
  };
2493
2496
  try {
2494
- // If `message` is an allocation op, then we are in the resubmit path and we must redirect the allocation
2495
- // op into the correct batch to avoid ranges being finalized out of order.
2496
- // Otherwise, submit an IdAllocation op if any IDs have been generated since the last op was submitted, as
2497
- // any of the other op types may contain those IDs and thus depend on the allocation op being sent first.
2498
- if (type === messageTypes_js_1.ContainerMessageType.IdAllocation) {
2499
- this.outbox.submitIdAllocation(message);
2497
+ this.submitIdAllocationOpIfNeeded(false);
2498
+ // Allow document schema controller to send a message if it needs to propose change in document schema.
2499
+ // If it needs to send a message, it will call provided callback with payload of such message and rely
2500
+ // on this callback to do actual sending.
2501
+ const contents = this.documentsSchemaController.maybeSendSchemaMessage();
2502
+ if (contents) {
2503
+ this.logger.sendTelemetryEvent({
2504
+ eventName: "SchemaChangeProposal",
2505
+ refSeq: contents.refSeq,
2506
+ version: contents.version,
2507
+ newRuntimeSchema: JSON.stringify(contents.runtime),
2508
+ sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
2509
+ oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
2510
+ });
2511
+ const msg = {
2512
+ type: messageTypes_js_1.ContainerMessageType.DocumentSchemaChange,
2513
+ contents,
2514
+ };
2515
+ this.outbox.submit({
2516
+ contents: JSON.stringify(msg),
2517
+ referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2518
+ });
2519
+ }
2520
+ if (type === messageTypes_js_1.ContainerMessageType.BlobAttach) {
2521
+ // BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
2522
+ this.outbox.submitBlobAttach(message);
2500
2523
  }
2501
2524
  else {
2502
- this.submitIdAllocationOpIfNeeded();
2503
- // Allow document schema controller to send a message if it needs to propose change in document schema.
2504
- // If it needs to send a message, it will call provided callback with payload of such message and rely
2505
- // on this callback to do actual sending.
2506
- const contents = this.documentsSchemaController.maybeSendSchemaMessage();
2507
- if (contents) {
2508
- this.logger.sendTelemetryEvent({
2509
- eventName: "SchemaChangeProposal",
2510
- refSeq: contents.refSeq,
2511
- version: contents.version,
2512
- newRuntimeSchema: JSON.stringify(contents.runtime),
2513
- sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
2514
- oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
2515
- });
2516
- const msg = {
2517
- type: messageTypes_js_1.ContainerMessageType.DocumentSchemaChange,
2518
- contents,
2519
- };
2520
- this.outbox.submit({
2521
- contents: JSON.stringify(msg),
2522
- referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2523
- });
2524
- }
2525
- if (type === messageTypes_js_1.ContainerMessageType.BlobAttach) {
2526
- // BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
2527
- this.outbox.submitBlobAttach(message);
2528
- }
2529
- else {
2530
- this.outbox.submit(message);
2531
- }
2525
+ this.outbox.submit(message);
2532
2526
  }
2533
2527
  if (!this.currentlyBatching()) {
2534
2528
  this.flush();
@@ -2586,7 +2580,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2586
2580
  // back-compat: ADO #1385: Make this call unconditional in the future
2587
2581
  return this.submitSummaryFn !== undefined
2588
2582
  ? this.submitSummaryFn(contents, referenceSequenceNumber)
2589
- : this.submitFn(protocol_definitions_1.MessageType.Summarize, contents, false);
2583
+ : this.submitFn(internal_3.MessageType.Summarize, contents, false);
2590
2584
  }
2591
2585
  /**
2592
2586
  * Throw an error if the runtime is closed. Methods that are expected to potentially
@@ -2703,51 +2697,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2703
2697
  * and then close as the current main client is likely to be re-elected as the parent summarizer again.
2704
2698
  */
2705
2699
  if (!result.isSummaryTracked && result.isSummaryNewer) {
2706
- await this.fetchLatestSnapshotFromStorage(summaryLogger, {
2700
+ await this.fetchLatestSnapshotAndClose(summaryLogger, {
2707
2701
  eventName: "RefreshLatestSummaryAckFetch",
2708
2702
  ackHandle,
2709
2703
  targetSequenceNumber: summaryRefSeq,
2710
2704
  }, readAndParseBlob);
2711
- await this.closeStaleSummarizer();
2712
2705
  return;
2713
2706
  }
2714
2707
  // Notify the garbage collector so it can update its latest summary state.
2715
2708
  await this.garbageCollector.refreshLatestSummary(result);
2716
2709
  }
2717
2710
  /**
2718
- * Fetches the latest snapshot from storage to refresh the cache as a performance optimization and closes the
2719
- * summarizer to reload from new state.
2720
- * @param summaryLogger - logger to use when fetching snapshot from storage
2721
- * @returns a generic summarization error
2711
+ * Fetches the latest snapshot from storage and closes the container. This is done in cases where
2712
+ * the last known snapshot is older than the latest one. This will ensure that the latest snapshot
2713
+ * is downloaded and we don't end up loading snapshot from cache.
2722
2714
  */
2723
- async prefetchLatestSummaryThenClose(summaryLogger) {
2724
- const readAndParseBlob = async (id) => (0, internal_4.readAndParse)(this.storage, id);
2725
- // This is a performance optimization as the same parent is likely to be elected again, and would use its
2726
- // cache to fetch the snapshot instead of the network.
2727
- await this.fetchLatestSnapshotFromStorage(summaryLogger, {
2728
- eventName: "RefreshLatestSummaryFromServerFetch",
2729
- }, readAndParseBlob);
2730
- await this.closeStaleSummarizer();
2731
- return {
2732
- stage: "base",
2733
- error: new internal_7.LoggingError("summary state stale - Unsupported option 'refreshLatestAck'"),
2734
- referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2735
- minimumSequenceNumber: this.deltaManager.minimumSequenceNumber,
2736
- };
2737
- }
2738
- async closeStaleSummarizer() {
2739
- // Delay before restarting summarizer to prevent the summarizer from restarting too frequently.
2740
- await (0, internal_2.delay)(this.closeSummarizerDelayMs);
2741
- this._summarizer?.stop("latestSummaryStateStale");
2742
- this.disposeFn();
2743
- }
2744
- /**
2745
- * Downloads the latest snapshot from storage.
2746
- * By default, it also closes the container after downloading the snapshot. However, this may be
2747
- * overridden via options.
2748
- */
2749
- async fetchLatestSnapshotFromStorage(logger, event, readAndParseBlob) {
2750
- return internal_7.PerformanceEvent.timedExecAsync(logger, event, async (perfEvent) => {
2715
+ async fetchLatestSnapshotAndClose(logger, event, readAndParseBlob) {
2716
+ await internal_7.PerformanceEvent.timedExecAsync(logger, event, async (perfEvent) => {
2751
2717
  const stats = {};
2752
2718
  const trace = client_utils_1.Trace.start();
2753
2719
  const versions = await this.storage.getVersions(null, 1, "prefetchLatestSummaryBeforeClose", internal_3.FetchSource.noCache);
@@ -2760,12 +2726,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2760
2726
  stats.snapshotRefSeq = latestSnapshotRefSeq;
2761
2727
  stats.snapshotVersion = versions[0].id;
2762
2728
  perfEvent.end(stats);
2763
- return {
2764
- snapshotTree: maybeSnapshot,
2765
- versionId: versions[0].id,
2766
- latestSnapshotRefSeq,
2767
- };
2768
2729
  });
2730
+ await (0, internal_2.delay)(this.closeSummarizerDelayMs);
2731
+ this._summarizer?.stop("latestSummaryStateStale");
2732
+ this.disposeFn();
2769
2733
  }
2770
2734
  getPendingLocalState(props) {
2771
2735
  this.verifyNotClosed();