@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606

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 (456) hide show
  1. package/api-report/container-runtime.api.md +78 -25
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +2 -2
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +3 -3
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +3 -3
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +5 -5
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +44 -11
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +3 -3
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +205 -11
  19. package/dist/container-runtime-beta.d.ts +16 -2
  20. package/dist/container-runtime-public.d.ts +16 -2
  21. package/dist/container-runtime-untrimmed.d.ts +205 -24
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +32 -26
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +213 -119
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +2 -2
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +4 -4
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +18 -18
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts.map +1 -1
  39. package/dist/dataStoreRegistry.js.map +1 -1
  40. package/dist/deltaScheduler.d.ts +1 -1
  41. package/dist/deltaScheduler.d.ts.map +1 -1
  42. package/dist/deltaScheduler.js +1 -1
  43. package/dist/deltaScheduler.js.map +1 -1
  44. package/dist/gc/garbageCollection.d.ts +1 -1
  45. package/dist/gc/garbageCollection.d.ts.map +1 -1
  46. package/dist/gc/garbageCollection.js +1 -1
  47. package/dist/gc/garbageCollection.js.map +1 -1
  48. package/dist/gc/gcConfigs.d.ts +1 -1
  49. package/dist/gc/gcConfigs.d.ts.map +1 -1
  50. package/dist/gc/gcConfigs.js.map +1 -1
  51. package/dist/gc/gcDefinitions.d.ts +1 -1
  52. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  53. package/dist/gc/gcDefinitions.js.map +1 -1
  54. package/dist/gc/gcHelpers.d.ts.map +1 -1
  55. package/dist/gc/gcHelpers.js.map +1 -1
  56. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  57. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  58. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  59. package/dist/gc/gcTelemetry.d.ts +1 -1
  60. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  61. package/dist/gc/gcTelemetry.js.map +1 -1
  62. package/dist/index.d.ts +2 -2
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +4 -2
  65. package/dist/index.js.map +1 -1
  66. package/dist/messageTypes.d.ts +11 -5
  67. package/dist/messageTypes.d.ts.map +1 -1
  68. package/dist/messageTypes.js +4 -0
  69. package/dist/messageTypes.js.map +1 -1
  70. package/dist/opLifecycle/definitions.d.ts +1 -19
  71. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  72. package/dist/opLifecycle/definitions.js.map +1 -1
  73. package/dist/opLifecycle/index.d.ts +3 -3
  74. package/dist/opLifecycle/index.d.ts.map +1 -1
  75. package/dist/opLifecycle/index.js +3 -1
  76. package/dist/opLifecycle/index.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  78. package/dist/opLifecycle/opCompressor.js +2 -3
  79. package/dist/opLifecycle/opCompressor.js.map +1 -1
  80. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  81. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.js +60 -61
  83. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  84. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  85. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  86. package/dist/opLifecycle/opGroupingManager.js +9 -11
  87. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  88. package/dist/opLifecycle/opSplitter.d.ts +11 -3
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +48 -38
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  93. package/dist/opLifecycle/outbox.js +7 -12
  94. package/dist/opLifecycle/outbox.js.map +1 -1
  95. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  97. package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
  98. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  99. package/dist/packageVersion.d.ts +1 -1
  100. package/dist/packageVersion.js +1 -1
  101. package/dist/packageVersion.js.map +1 -1
  102. package/dist/pendingStateManager.d.ts +1 -1
  103. package/dist/pendingStateManager.d.ts.map +1 -1
  104. package/dist/pendingStateManager.js.map +1 -1
  105. package/dist/scheduleManager.d.ts +1 -1
  106. package/dist/scheduleManager.d.ts.map +1 -1
  107. package/dist/scheduleManager.js +2 -2
  108. package/dist/scheduleManager.js.map +1 -1
  109. package/dist/summary/documentSchema.d.ts +178 -0
  110. package/dist/summary/documentSchema.d.ts.map +1 -0
  111. package/dist/summary/documentSchema.js +345 -0
  112. package/dist/summary/documentSchema.js.map +1 -0
  113. package/dist/summary/index.d.ts +2 -1
  114. package/dist/summary/index.d.ts.map +1 -1
  115. package/dist/summary/index.js +4 -1
  116. package/dist/summary/index.js.map +1 -1
  117. package/dist/summary/orderedClientElection.d.ts +2 -2
  118. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  119. package/dist/summary/orderedClientElection.js +3 -2
  120. package/dist/summary/orderedClientElection.js.map +1 -1
  121. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  122. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  123. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  124. package/dist/summary/runningSummarizer.d.ts +2 -2
  125. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  126. package/dist/summary/runningSummarizer.js +2 -2
  127. package/dist/summary/runningSummarizer.js.map +1 -1
  128. package/dist/summary/summarizer.d.ts +2 -2
  129. package/dist/summary/summarizer.d.ts.map +1 -1
  130. package/dist/summary/summarizer.js +2 -2
  131. package/dist/summary/summarizer.js.map +1 -1
  132. package/dist/summary/summarizerClientElection.d.ts +2 -2
  133. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  134. package/dist/summary/summarizerClientElection.js.map +1 -1
  135. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  136. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  137. package/dist/summary/summarizerHeuristics.js.map +1 -1
  138. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
  139. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  140. package/dist/summary/summarizerNode/summarizerNode.js +3 -3
  141. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  142. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  143. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  145. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  146. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  149. package/dist/summary/summarizerTypes.d.ts +3 -3
  150. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  151. package/dist/summary/summarizerTypes.js.map +1 -1
  152. package/dist/summary/summaryCollection.d.ts +2 -2
  153. package/dist/summary/summaryCollection.d.ts.map +1 -1
  154. package/dist/summary/summaryCollection.js +1 -1
  155. package/dist/summary/summaryCollection.js.map +1 -1
  156. package/dist/summary/summaryFormat.d.ts +5 -16
  157. package/dist/summary/summaryFormat.d.ts.map +1 -1
  158. package/dist/summary/summaryFormat.js.map +1 -1
  159. package/dist/summary/summaryGenerator.d.ts +2 -2
  160. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  161. package/dist/summary/summaryGenerator.js +2 -2
  162. package/dist/summary/summaryGenerator.js.map +1 -1
  163. package/dist/summary/summaryManager.d.ts +1 -1
  164. package/dist/summary/summaryManager.d.ts.map +1 -1
  165. package/dist/summary/summaryManager.js +2 -2
  166. package/dist/summary/summaryManager.js.map +1 -1
  167. package/lib/batchTracker.d.ts +1 -1
  168. package/lib/batchTracker.d.ts.map +1 -1
  169. package/lib/batchTracker.js +2 -2
  170. package/lib/batchTracker.js.map +1 -1
  171. package/lib/blobManager.d.ts +3 -3
  172. package/lib/blobManager.d.ts.map +1 -1
  173. package/lib/blobManager.js +5 -5
  174. package/lib/blobManager.js.map +1 -1
  175. package/lib/channelCollection.d.ts +5 -5
  176. package/lib/channelCollection.d.ts.map +1 -1
  177. package/lib/channelCollection.js +46 -13
  178. package/lib/channelCollection.js.map +1 -1
  179. package/lib/connectionTelemetry.d.ts +2 -2
  180. package/lib/connectionTelemetry.d.ts.map +1 -1
  181. package/lib/connectionTelemetry.js +3 -3
  182. package/lib/connectionTelemetry.js.map +1 -1
  183. package/lib/container-runtime-alpha.d.ts +205 -11
  184. package/lib/container-runtime-beta.d.ts +16 -2
  185. package/lib/container-runtime-public.d.ts +16 -2
  186. package/lib/container-runtime-untrimmed.d.ts +205 -24
  187. package/lib/containerHandleContext.d.ts.map +1 -1
  188. package/lib/containerHandleContext.js.map +1 -1
  189. package/lib/containerRuntime.d.ts +32 -26
  190. package/lib/containerRuntime.d.ts.map +1 -1
  191. package/lib/containerRuntime.js +175 -81
  192. package/lib/containerRuntime.js.map +1 -1
  193. package/lib/dataStore.d.ts +1 -1
  194. package/lib/dataStore.d.ts.map +1 -1
  195. package/lib/dataStore.js +2 -2
  196. package/lib/dataStore.js.map +1 -1
  197. package/lib/dataStoreContext.d.ts +4 -4
  198. package/lib/dataStoreContext.d.ts.map +1 -1
  199. package/lib/dataStoreContext.js +3 -3
  200. package/lib/dataStoreContext.js.map +1 -1
  201. package/lib/dataStoreContexts.d.ts.map +1 -1
  202. package/lib/dataStoreContexts.js.map +1 -1
  203. package/lib/dataStoreRegistry.d.ts.map +1 -1
  204. package/lib/dataStoreRegistry.js.map +1 -1
  205. package/lib/deltaScheduler.d.ts +1 -1
  206. package/lib/deltaScheduler.d.ts.map +1 -1
  207. package/lib/deltaScheduler.js +1 -1
  208. package/lib/deltaScheduler.js.map +1 -1
  209. package/lib/gc/garbageCollection.d.ts +1 -1
  210. package/lib/gc/garbageCollection.d.ts.map +1 -1
  211. package/lib/gc/garbageCollection.js +3 -3
  212. package/lib/gc/garbageCollection.js.map +1 -1
  213. package/lib/gc/gcConfigs.d.ts +1 -1
  214. package/lib/gc/gcConfigs.d.ts.map +1 -1
  215. package/lib/gc/gcConfigs.js +1 -1
  216. package/lib/gc/gcConfigs.js.map +1 -1
  217. package/lib/gc/gcDefinitions.d.ts +1 -1
  218. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  219. package/lib/gc/gcDefinitions.js.map +1 -1
  220. package/lib/gc/gcHelpers.d.ts.map +1 -1
  221. package/lib/gc/gcHelpers.js.map +1 -1
  222. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  223. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  224. package/lib/gc/gcSummaryStateTracker.js +1 -1
  225. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  226. package/lib/gc/gcTelemetry.d.ts +1 -1
  227. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  228. package/lib/gc/gcTelemetry.js +1 -1
  229. package/lib/gc/gcTelemetry.js.map +1 -1
  230. package/lib/index.d.ts +2 -2
  231. package/lib/index.d.ts.map +1 -1
  232. package/lib/index.js +2 -2
  233. package/lib/index.js.map +1 -1
  234. package/lib/messageTypes.d.ts +11 -5
  235. package/lib/messageTypes.d.ts.map +1 -1
  236. package/lib/messageTypes.js +4 -0
  237. package/lib/messageTypes.js.map +1 -1
  238. package/lib/opLifecycle/definitions.d.ts +1 -19
  239. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  240. package/lib/opLifecycle/definitions.js.map +1 -1
  241. package/lib/opLifecycle/index.d.ts +3 -3
  242. package/lib/opLifecycle/index.d.ts.map +1 -1
  243. package/lib/opLifecycle/index.js +2 -2
  244. package/lib/opLifecycle/index.js.map +1 -1
  245. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  246. package/lib/opLifecycle/opCompressor.js +2 -3
  247. package/lib/opLifecycle/opCompressor.js.map +1 -1
  248. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  249. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  250. package/lib/opLifecycle/opDecompressor.js +60 -61
  251. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  252. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  253. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  254. package/lib/opLifecycle/opGroupingManager.js +7 -10
  255. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  256. package/lib/opLifecycle/opSplitter.d.ts +11 -3
  257. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  258. package/lib/opLifecycle/opSplitter.js +46 -37
  259. package/lib/opLifecycle/opSplitter.js.map +1 -1
  260. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  261. package/lib/opLifecycle/outbox.js +7 -12
  262. package/lib/opLifecycle/outbox.js.map +1 -1
  263. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  264. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  265. package/lib/opLifecycle/remoteMessageProcessor.js +36 -35
  266. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  267. package/lib/packageVersion.d.ts +1 -1
  268. package/lib/packageVersion.js +1 -1
  269. package/lib/packageVersion.js.map +1 -1
  270. package/lib/pendingStateManager.d.ts +1 -1
  271. package/lib/pendingStateManager.d.ts.map +1 -1
  272. package/lib/pendingStateManager.js.map +1 -1
  273. package/lib/scheduleManager.d.ts +1 -1
  274. package/lib/scheduleManager.d.ts.map +1 -1
  275. package/lib/scheduleManager.js +2 -2
  276. package/lib/scheduleManager.js.map +1 -1
  277. package/lib/summary/documentSchema.d.ts +178 -0
  278. package/lib/summary/documentSchema.d.ts.map +1 -0
  279. package/lib/summary/documentSchema.js +341 -0
  280. package/lib/summary/documentSchema.js.map +1 -0
  281. package/lib/summary/index.d.ts +2 -1
  282. package/lib/summary/index.d.ts.map +1 -1
  283. package/lib/summary/index.js +1 -0
  284. package/lib/summary/index.js.map +1 -1
  285. package/lib/summary/orderedClientElection.d.ts +2 -2
  286. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  287. package/lib/summary/orderedClientElection.js +3 -2
  288. package/lib/summary/orderedClientElection.js.map +1 -1
  289. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  290. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  291. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  292. package/lib/summary/runningSummarizer.d.ts +2 -2
  293. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  294. package/lib/summary/runningSummarizer.js +3 -3
  295. package/lib/summary/runningSummarizer.js.map +1 -1
  296. package/lib/summary/summarizer.d.ts +2 -2
  297. package/lib/summary/summarizer.d.ts.map +1 -1
  298. package/lib/summary/summarizer.js +3 -3
  299. package/lib/summary/summarizer.js.map +1 -1
  300. package/lib/summary/summarizerClientElection.d.ts +2 -2
  301. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  302. package/lib/summary/summarizerClientElection.js.map +1 -1
  303. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  304. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  305. package/lib/summary/summarizerHeuristics.js.map +1 -1
  306. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
  307. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  308. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  309. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  310. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  311. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  312. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  313. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  314. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  315. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  316. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  317. package/lib/summary/summarizerTypes.d.ts +3 -3
  318. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  319. package/lib/summary/summarizerTypes.js.map +1 -1
  320. package/lib/summary/summaryCollection.d.ts +2 -2
  321. package/lib/summary/summaryCollection.d.ts.map +1 -1
  322. package/lib/summary/summaryCollection.js +1 -1
  323. package/lib/summary/summaryCollection.js.map +1 -1
  324. package/lib/summary/summaryFormat.d.ts +5 -16
  325. package/lib/summary/summaryFormat.d.ts.map +1 -1
  326. package/lib/summary/summaryFormat.js +1 -1
  327. package/lib/summary/summaryFormat.js.map +1 -1
  328. package/lib/summary/summaryGenerator.d.ts +2 -2
  329. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  330. package/lib/summary/summaryGenerator.js +3 -3
  331. package/lib/summary/summaryGenerator.js.map +1 -1
  332. package/lib/summary/summaryManager.d.ts +1 -1
  333. package/lib/summary/summaryManager.d.ts.map +1 -1
  334. package/lib/summary/summaryManager.js +2 -2
  335. package/lib/summary/summaryManager.js.map +1 -1
  336. package/lib/test/blobManager.spec.js +3 -3
  337. package/lib/test/blobManager.spec.js.map +1 -1
  338. package/lib/test/containerRuntime.spec.js +6 -4
  339. package/lib/test/containerRuntime.spec.js.map +1 -1
  340. package/lib/test/dataStoreContext.spec.js +4 -4
  341. package/lib/test/dataStoreContext.spec.js.map +1 -1
  342. package/lib/test/dataStoreCreation.spec.js +1 -1
  343. package/lib/test/dataStoreCreation.spec.js.map +1 -1
  344. package/lib/test/dataStoreRegistry.spec.js.map +1 -1
  345. package/lib/test/documentSchema.spec.js +282 -0
  346. package/lib/test/documentSchema.spec.js.map +1 -0
  347. package/lib/test/fuzz/fuzzUtils.js +11 -7
  348. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  349. package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
  350. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
  351. package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
  352. package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
  353. package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
  354. package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
  355. package/lib/test/gc/garbageCollection.spec.js +5 -5
  356. package/lib/test/gc/garbageCollection.spec.js.map +1 -1
  357. package/lib/test/gc/gcConfigs.spec.js +2 -2
  358. package/lib/test/gc/gcConfigs.spec.js.map +1 -1
  359. package/lib/test/gc/gcHelpers.spec.js.map +1 -1
  360. package/lib/test/gc/gcStats.spec.js +2 -2
  361. package/lib/test/gc/gcStats.spec.js.map +1 -1
  362. package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
  363. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
  364. package/lib/test/gc/gcTelemetry.spec.js +3 -3
  365. package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
  366. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
  367. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
  368. package/lib/test/getPendingBlobs.spec.js +1 -1
  369. package/lib/test/getPendingBlobs.spec.js.map +1 -1
  370. package/lib/test/hardwareStats.spec.js +1 -1
  371. package/lib/test/hardwareStats.spec.js.map +1 -1
  372. package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
  373. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
  374. package/lib/test/opLifecycle/batchManager.spec.js +1 -1
  375. package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
  376. package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
  377. package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
  378. package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
  379. package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
  380. package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
  381. package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
  382. package/lib/test/opLifecycle/outbox.spec.js +118 -10
  383. package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
  384. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
  385. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
  386. package/lib/test/pendingStateManager.spec.js +1 -1
  387. package/lib/test/pendingStateManager.spec.js.map +1 -1
  388. package/lib/test/scheduleManager.spec.js +1 -1
  389. package/lib/test/scheduleManager.spec.js.map +1 -1
  390. package/lib/test/summarizerNode.spec.js +1 -1
  391. package/lib/test/summarizerNode.spec.js.map +1 -1
  392. package/lib/test/summarizerNodeWithGc.spec.js +1 -1
  393. package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
  394. package/lib/test/summary/runningSummarizer.spec.js +4 -4
  395. package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
  396. package/lib/test/summary/summarizer.spec.js.map +1 -1
  397. package/lib/test/summary/summarizerClientElection.spec.js +2 -2
  398. package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
  399. package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
  400. package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
  401. package/lib/test/summary/summaryCollection.spec.js +1 -1
  402. package/lib/test/summary/summaryCollection.spec.js.map +1 -1
  403. package/lib/test/summary/summaryManager.spec.js +3 -3
  404. package/lib/test/summary/summaryManager.spec.js.map +1 -1
  405. package/lib/test/throttler.spec.js +1 -1
  406. package/lib/test/throttler.spec.js.map +1 -1
  407. package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
  408. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
  409. package/package.json +35 -21
  410. package/src/batchTracker.ts +3 -3
  411. package/src/blobManager.ts +15 -15
  412. package/src/channelCollection.ts +75 -35
  413. package/src/connectionTelemetry.ts +10 -10
  414. package/src/containerHandleContext.ts +1 -1
  415. package/src/containerRuntime.ts +352 -197
  416. package/src/dataStore.ts +2 -2
  417. package/src/dataStoreContext.ts +19 -19
  418. package/src/dataStoreContexts.ts +2 -2
  419. package/src/dataStoreRegistry.ts +1 -1
  420. package/src/deltaScheduler.ts +1 -1
  421. package/src/gc/garbageCollection.ts +12 -12
  422. package/src/gc/gcConfigs.ts +11 -11
  423. package/src/gc/gcDefinitions.ts +2 -2
  424. package/src/gc/gcHelpers.ts +2 -2
  425. package/src/gc/gcSummaryStateTracker.ts +4 -4
  426. package/src/gc/gcTelemetry.ts +6 -6
  427. package/src/index.ts +8 -1
  428. package/src/messageTypes.ts +18 -5
  429. package/src/opLifecycle/README.md +89 -0
  430. package/src/opLifecycle/definitions.ts +1 -20
  431. package/src/opLifecycle/index.ts +3 -9
  432. package/src/opLifecycle/opCompressor.ts +4 -5
  433. package/src/opLifecycle/opDecompressor.ts +83 -100
  434. package/src/opLifecycle/opGroupingManager.ts +9 -12
  435. package/src/opLifecycle/opSplitter.ts +73 -47
  436. package/src/opLifecycle/outbox.ts +13 -31
  437. package/src/opLifecycle/remoteMessageProcessor.ts +41 -59
  438. package/src/packageVersion.ts +1 -1
  439. package/src/pendingStateManager.ts +2 -2
  440. package/src/scheduleManager.ts +7 -7
  441. package/src/summary/documentSchema.ts +553 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +6 -5
  444. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  445. package/src/summary/runningSummarizer.ts +19 -19
  446. package/src/summary/summarizer.ts +14 -14
  447. package/src/summary/summarizerClientElection.ts +2 -2
  448. package/src/summary/summarizerHeuristics.ts +2 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +15 -15
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
  452. package/src/summary/summarizerTypes.ts +3 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +8 -19
  455. package/src/summary/summaryGenerator.ts +10 -10
  456. package/src/summary/summaryManager.ts +4 -4
@@ -3,53 +3,34 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { Trace, TypedEventEmitter } from "@fluid-internal/client-utils";
6
7
  import {
7
- ITelemetryBaseLogger,
8
- FluidObject,
9
- IFluidHandle,
10
- IFluidHandleContext,
11
- IRequest,
12
- IResponse,
13
- IProvideFluidHandleContext,
14
- ISignalEnvelope,
15
- } from "@fluidframework/core-interfaces";
16
- import {
8
+ AttachState,
17
9
  IAudience,
18
10
  IBatchMessage,
19
11
  IContainerContext,
20
- IDeltaManager,
21
- IRuntime,
22
12
  ICriticalContainerError,
23
- AttachState,
13
+ IDeltaManager,
14
+ IGetPendingLocalStateProps,
24
15
  ILoader,
16
+ IRuntime,
25
17
  LoaderHeader,
26
- IGetPendingLocalStateProps,
27
18
  } from "@fluidframework/container-definitions";
28
19
  import {
29
20
  IContainerRuntime,
30
21
  IContainerRuntimeEvents,
31
22
  } from "@fluidframework/container-runtime-definitions";
32
- import { assert, Deferred, delay, LazyPromise, PromiseCache } from "@fluidframework/core-utils";
33
- import { Trace, TypedEventEmitter } from "@fluid-internal/client-utils";
34
23
  import {
35
- createChildLogger,
36
- createChildMonitoringContext,
37
- DataCorruptionError,
38
- DataProcessingError,
39
- GenericError,
40
- raiseConnectedEvent,
41
- PerformanceEvent,
42
- TaggedLoggerAdapter,
43
- MonitoringContext,
44
- wrapError,
45
- ITelemetryLoggerExt,
46
- UsageError,
47
- LoggingError,
48
- createSampledLogger,
49
- IEventSampler,
50
- type ITelemetryGenericEventExt,
51
- loggerToMonitoringContext,
52
- } from "@fluidframework/telemetry-utils";
24
+ FluidObject,
25
+ IFluidHandle,
26
+ IFluidHandleContext,
27
+ IProvideFluidHandleContext,
28
+ IRequest,
29
+ IResponse,
30
+ ISignalEnvelope,
31
+ ITelemetryBaseLogger,
32
+ } from "@fluidframework/core-interfaces";
33
+ import { assert, Deferred, LazyPromise, PromiseCache, delay } from "@fluidframework/core-utils";
53
34
  import {
54
35
  DriverHeader,
55
36
  FetchSource,
@@ -57,6 +38,13 @@ import {
57
38
  type ISnapshot,
58
39
  } from "@fluidframework/driver-definitions";
59
40
  import { readAndParse } from "@fluidframework/driver-utils";
41
+ import type {
42
+ IIdCompressor,
43
+ IIdCompressorCore,
44
+ IdCreationRange,
45
+ SerializedIdCompressorWithNoSession,
46
+ SerializedIdCompressorWithOngoingSession,
47
+ } from "@fluidframework/id-compressor";
60
48
  import {
61
49
  IClientDetails,
62
50
  IDocumentMessage,
@@ -70,134 +58,150 @@ import {
70
58
  SummaryType,
71
59
  } from "@fluidframework/protocol-definitions";
72
60
  import {
61
+ CreateChildSummarizerNodeParam,
73
62
  FlushMode,
74
63
  FlushModeExperimental,
75
- gcTreeKey,
76
- InboundAttachMessage,
64
+ IDataStore,
65
+ IEnvelope,
77
66
  IFluidDataStoreContextDetached,
78
67
  IFluidDataStoreRegistry,
79
68
  IGarbageCollectionData,
80
69
  IInboundSignalMessage,
81
- NamedFluidDataStoreRegistryEntries,
82
- ISummaryTreeWithStats,
83
70
  ISummarizeInternalResult,
84
- CreateChildSummarizerNodeParam,
71
+ ISummaryTreeWithStats,
72
+ ITelemetryContext,
73
+ InboundAttachMessage,
74
+ NamedFluidDataStoreRegistryEntries,
85
75
  SummarizeInternalFn,
86
76
  channelsTreeName,
87
- IDataStore,
88
- ITelemetryContext,
89
- IEnvelope,
77
+ gcTreeKey,
90
78
  } from "@fluidframework/runtime-definitions";
91
- import type {
92
- SerializedIdCompressorWithNoSession,
93
- IIdCompressor,
94
- IIdCompressorCore,
95
- SerializedIdCompressorWithOngoingSession,
96
- IdCreationRange,
97
- } from "@fluidframework/id-compressor";
98
79
  import {
80
+ GCDataBuilder,
81
+ ReadAndParseBlob,
82
+ RequestParser,
83
+ TelemetryContext,
99
84
  addBlobToSummary,
100
85
  addSummarizeResultToSummary,
101
- RequestParser,
86
+ calculateStats,
102
87
  create404Response,
103
88
  exceptionToResponse,
104
- GCDataBuilder,
105
- seqFromTree,
106
- calculateStats,
107
- TelemetryContext,
108
- ReadAndParseBlob,
109
89
  responseToException,
90
+ seqFromTree,
110
91
  } from "@fluidframework/runtime-utils";
111
- import { v4 as uuid } from "uuid";
112
- import { ContainerFluidHandleContext } from "./containerHandleContext.js";
113
- import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
114
- import { ReportOpPerfTelemetry, IPerfSignalReport } from "./connectionTelemetry.js";
115
92
  import {
116
- IPendingBatchMessage,
117
- IPendingLocalState,
118
- PendingStateManager,
119
- } from "./pendingStateManager.js";
120
- import { pkgVersion } from "./packageVersion.js";
93
+ DataCorruptionError,
94
+ DataProcessingError,
95
+ GenericError,
96
+ IEventSampler,
97
+ type ITelemetryGenericEventExt,
98
+ ITelemetryLoggerExt,
99
+ LoggingError,
100
+ MonitoringContext,
101
+ PerformanceEvent,
102
+ TaggedLoggerAdapter,
103
+ UsageError,
104
+ createChildLogger,
105
+ createChildMonitoringContext,
106
+ createSampledLogger,
107
+ loggerToMonitoringContext,
108
+ raiseConnectedEvent,
109
+ wrapError,
110
+ } from "@fluidframework/telemetry-utils";
111
+ import { v4 as uuid } from "uuid";
112
+ import { BindBatchTracker } from "./batchTracker.js";
121
113
  import { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from "./blobManager.js";
122
114
  import { ChannelCollection, getSummaryForDatastores, wrapContext } from "./channelCollection.js";
115
+ import { IPerfSignalReport, ReportOpPerfTelemetry } from "./connectionTelemetry.js";
116
+ import { ContainerFluidHandleContext } from "./containerHandleContext.js";
117
+ import { channelToDataStore } from "./dataStore.js";
118
+ import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
119
+ import { DeltaManagerSummarizerProxy } from "./deltaManagerSummarizerProxy.js";
123
120
  import {
124
- aliasBlobName,
125
- blobsTreeName,
126
- chunksBlobName,
127
- createRootSummarizerNodeWithGC,
128
- electedSummarizerBlobName,
129
- extractSummaryMetadataMessage,
130
- IContainerRuntimeMetadata,
131
- ICreateContainerMetadata,
132
- idCompressorBlobName,
133
- IRootSummarizerNodeWithGC,
134
- ISummaryMetadataMessage,
135
- metadataBlobName,
136
- Summarizer,
137
- SummaryManager,
138
- wrapSummaryInChannelsTree,
139
- SummaryCollection,
140
- ISerializedElection,
141
- OrderedClientCollection,
142
- OrderedClientElection,
143
- SummarizerClientElection,
144
- summarizerClientType,
145
- SubmitSummaryResult,
146
- IConnectableRuntime,
147
- IGeneratedSummaryStats,
148
- ISubmitSummaryOptions,
149
- ISummarizerInternalsProvider,
150
- ISummarizerRuntime,
151
- IRefreshSummaryAckOptions,
152
- RunWhileConnectedCoordinator,
153
- IGenerateSummaryTreeResult,
154
- RetriableSummaryError,
155
- IOnDemandSummarizeOptions,
156
- ISummarizeResults,
157
- IEnqueueSummarizeOptions,
158
- EnqueueSummarizeResult,
159
- ISummarizerEvents,
160
- IBaseSummarizeResult,
161
- ISummarizer,
162
- rootHasIsolatedChannels,
163
- IdCompressorMode,
164
- } from "./summary/index.js";
165
- import { formExponentialFn, Throttler } from "./throttler.js";
166
- import {
167
- GarbageCollector,
168
121
  GCNodeType,
169
- gcGenerationOptionName,
170
- IGarbageCollector,
122
+ GarbageCollector,
171
123
  IGCRuntimeOptions,
172
124
  IGCStats,
125
+ IGarbageCollector,
126
+ gcGenerationOptionName,
173
127
  } from "./gc/index.js";
174
- import { channelToDataStore } from "./dataStore.js";
175
- import { BindBatchTracker } from "./batchTracker.js";
176
- import { ScheduleManager } from "./scheduleManager.js";
128
+ import {
129
+ ContainerMessageType,
130
+ type ContainerRuntimeDocumentSchemaMessage,
131
+ ContainerRuntimeGCMessage,
132
+ type ContainerRuntimeIdAllocationMessage,
133
+ type InboundSequencedContainerRuntimeMessage,
134
+ type InboundSequencedContainerRuntimeMessageOrSystemMessage,
135
+ type LocalContainerRuntimeMessage,
136
+ type OutboundContainerRuntimeMessage,
137
+ type UnknownContainerRuntimeMessage,
138
+ } from "./messageTypes.js";
139
+ import { IBatchMetadata, IIdAllocationMetadata } from "./metadata.js";
177
140
  import {
178
141
  BatchMessage,
179
142
  IBatch,
180
143
  IBatchCheckpoint,
181
144
  OpCompressor,
182
145
  OpDecompressor,
183
- Outbox,
146
+ OpGroupingManager,
184
147
  OpSplitter,
148
+ Outbox,
185
149
  RemoteMessageProcessor,
186
- OpGroupingManager,
187
150
  getLongStack,
188
151
  } from "./opLifecycle/index.js";
189
- import { DeltaManagerSummarizerProxy } from "./deltaManagerSummarizerProxy.js";
190
- import { IBatchMetadata, IIdAllocationMetadata } from "./metadata.js";
152
+ import { pkgVersion } from "./packageVersion.js";
191
153
  import {
192
- ContainerMessageType,
193
- type InboundSequencedContainerRuntimeMessage,
194
- type InboundSequencedContainerRuntimeMessageOrSystemMessage,
195
- type ContainerRuntimeIdAllocationMessage,
196
- type LocalContainerRuntimeMessage,
197
- type OutboundContainerRuntimeMessage,
198
- type UnknownContainerRuntimeMessage,
199
- ContainerRuntimeGCMessage,
200
- } from "./messageTypes.js";
154
+ IPendingBatchMessage,
155
+ IPendingLocalState,
156
+ PendingStateManager,
157
+ } from "./pendingStateManager.js";
158
+ import { ScheduleManager } from "./scheduleManager.js";
159
+ import {
160
+ DocumentsSchemaController,
161
+ EnqueueSummarizeResult,
162
+ IBaseSummarizeResult,
163
+ IConnectableRuntime,
164
+ IContainerRuntimeMetadata,
165
+ ICreateContainerMetadata,
166
+ IDocumentSchemaChangeMessage,
167
+ type IDocumentSchemaCurrent,
168
+ IEnqueueSummarizeOptions,
169
+ IGenerateSummaryTreeResult,
170
+ IGeneratedSummaryStats,
171
+ IOnDemandSummarizeOptions,
172
+ IRefreshSummaryAckOptions,
173
+ IRootSummarizerNodeWithGC,
174
+ ISerializedElection,
175
+ ISubmitSummaryOptions,
176
+ ISummarizeResults,
177
+ ISummarizer,
178
+ ISummarizerEvents,
179
+ ISummarizerInternalsProvider,
180
+ ISummarizerRuntime,
181
+ ISummaryMetadataMessage,
182
+ IdCompressorMode,
183
+ OrderedClientCollection,
184
+ OrderedClientElection,
185
+ RetriableSummaryError,
186
+ RunWhileConnectedCoordinator,
187
+ SubmitSummaryResult,
188
+ Summarizer,
189
+ SummarizerClientElection,
190
+ SummaryCollection,
191
+ SummaryManager,
192
+ aliasBlobName,
193
+ blobsTreeName,
194
+ chunksBlobName,
195
+ createRootSummarizerNodeWithGC,
196
+ electedSummarizerBlobName,
197
+ extractSummaryMetadataMessage,
198
+ idCompressorBlobName,
199
+ metadataBlobName,
200
+ rootHasIsolatedChannels,
201
+ summarizerClientType,
202
+ wrapSummaryInChannelsTree,
203
+ } from "./summary/index.js";
204
+ import { Throttler, formExponentialFn } from "./throttler.js";
201
205
 
202
206
  /**
203
207
  * Utility to implement compat behaviors given an unknown message type
@@ -416,7 +420,7 @@ export interface IContainerRuntimeOptions {
416
420
  * If specified, when in FlushMode.TurnBased, if the size of the ops between JS turns exceeds this value,
417
421
  * an error will be thrown and the container will close.
418
422
  *
419
- * If unspecified, the limit is 950 * 1024.
423
+ * If unspecified, the limit is 700Kb.
420
424
  *
421
425
  * 'Infinity' will disable any limit.
422
426
  *
@@ -465,6 +469,15 @@ export interface IContainerRuntimeOptions {
465
469
  * @experimental Not ready for use.
466
470
  */
467
471
  readonly enableGroupedBatching?: boolean;
472
+
473
+ /**
474
+ * When this property is set to true, it requires runtime to control is document schema properly through ops
475
+ * The benefit of this mode is that clients who do not understand schema will fail in predictable way, with predictable message,
476
+ * and will not attempt to limp along, which could cause data corruptions and crashes in random places.
477
+ * When this property is not set (or set to false), runtime operates in legacy mode, where new features (modifying document schema)
478
+ * are engaged as they become available, without giving legacy clients any chance to fail predictably.
479
+ */
480
+ readonly explicitSchemaControl?: boolean;
468
481
  }
469
482
 
470
483
  /**
@@ -505,6 +518,12 @@ export enum CompressionAlgorithms {
505
518
  lz4 = "lz4",
506
519
  }
507
520
 
521
+ /** @alpha */
522
+ export const disabledCompressionConfig: ICompressionRuntimeOptions = {
523
+ minimumBatchSizeInBytes: Infinity,
524
+ compressionAlgorithm: CompressionAlgorithms.lz4,
525
+ };
526
+
508
527
  /**
509
528
  * @deprecated
510
529
  * Untagged logger is unsupported going forward. There are old loaders with old ContainerContexts that only
@@ -571,26 +590,12 @@ export const defaultPendingOpsRetryDelayMs = 1000;
571
590
  */
572
591
  const defaultCloseSummarizerDelayMs = 5000; // 5 seconds
573
592
 
574
- /**
575
- * @deprecated use ContainerRuntimeMessageType instead
576
- * @internal
577
- */
578
- export enum RuntimeMessage {
579
- FluidDataStoreOp = "component",
580
- Attach = "attach",
581
- ChunkedOp = "chunkedOp",
582
- BlobAttach = "blobAttach",
583
- Rejoin = "rejoin",
584
- Alias = "alias",
585
- Operation = "op",
586
- }
587
-
588
593
  /**
589
594
  * @deprecated please use version in driver-utils
590
595
  * @internal
591
596
  */
592
597
  export function isRuntimeMessage(message: ISequencedDocumentMessage): boolean {
593
- return (Object.values(RuntimeMessage) as string[]).includes(message.type);
598
+ return (Object.values(ContainerMessageType) as string[]).includes(message.type);
594
599
  }
595
600
 
596
601
  /**
@@ -697,6 +702,18 @@ async function createSummarizer(loader: ILoader, url: string): Promise<ISummariz
697
702
  return fluidObject.ISummarizer;
698
703
  }
699
704
 
705
+ /**
706
+ * Extract last message from the snapshot metadata.
707
+ * Uses legacy property if not using explicit schema control, otherwise uses the new property.
708
+ * This allows new runtime to make documents not openable for old runtimes, one explicit document schema control is enabled.
709
+ * Please see addMetadataToSummary() as well
710
+ */
711
+ function lastMessageFromMetadata(metadata: IContainerRuntimeMetadata | undefined) {
712
+ return metadata?.documentSchema?.runtime?.explicitSchemaControl
713
+ ? metadata?.lastMessage
714
+ : metadata?.message;
715
+ }
716
+
700
717
  /**
701
718
  * Represents the runtime of the container. Contains helper functions/state of the container.
702
719
  * It will define the store level mappings.
@@ -743,7 +760,7 @@ export class ContainerRuntime
743
760
  existing,
744
761
  requestHandler,
745
762
  provideEntryPoint,
746
- runtimeOptions = {},
763
+ runtimeOptions = {} satisfies IContainerRuntimeOptions,
747
764
  containerScope = {},
748
765
  containerRuntimeCtor = ContainerRuntime,
749
766
  } = params;
@@ -772,10 +789,11 @@ export class ContainerRuntime
772
789
  flushMode = defaultFlushMode,
773
790
  compressionOptions = defaultCompressionConfig,
774
791
  maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,
775
- enableRuntimeIdCompressor = "off",
792
+ enableRuntimeIdCompressor,
776
793
  chunkSizeInBytes = defaultChunkSizeInBytes,
777
794
  enableOpReentryCheck = false,
778
795
  enableGroupedBatching = false,
796
+ explicitSchemaControl = false,
779
797
  } = runtimeOptions;
780
798
 
781
799
  const registry = new FluidDataStoreRegistry(registryEntries);
@@ -816,8 +834,10 @@ export class ContainerRuntime
816
834
  },
817
835
  );
818
836
 
837
+ const messageAtLastSummary = lastMessageFromMetadata(metadata);
838
+
819
839
  // Verify summary runtime sequence number matches protocol sequence number.
820
- const runtimeSequenceNumber = metadata?.message?.sequenceNumber;
840
+ const runtimeSequenceNumber = messageAtLastSummary?.sequenceNumber;
821
841
  // When we load with pending state, we reuse an old snapshot so we don't expect these numbers to match
822
842
  if (!context.pendingLocalState && runtimeSequenceNumber !== undefined) {
823
843
  const protocolSequenceNumber = context.deltaManager.initialSequenceNumber;
@@ -826,6 +846,13 @@ export class ContainerRuntime
826
846
  loadSequenceNumberVerification !== "bypass" &&
827
847
  runtimeSequenceNumber !== protocolSequenceNumber
828
848
  ) {
849
+ // Message to OCEs:
850
+ // You can hit this error with runtimeSequenceNumber === -1 in < 2.0 RC3 builds.
851
+ // This would indicate that explicit schema control is enabled in current (2.0 RC3+) builds and it
852
+ // results in addMetadataToSummary() creating a poison pill for older runtimes in the form of a -1 sequence number.
853
+ // Older runtimes do not understand new schema, and thus could corrupt document if they proceed, thus we are using
854
+ // this poison pill to prevent them from proceeding.
855
+
829
856
  // "Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber"
830
857
  const error = new DataCorruptionError(
831
858
  // pre-0.58 error message: SummaryMetadataMismatch
@@ -842,7 +869,7 @@ export class ContainerRuntime
842
869
  }
843
870
 
844
871
  // Enabling the IdCompressor is a one-way operation and we only want to
845
- // allow new containers to turn it on
872
+ // allow new containers to turn it on.
846
873
  let idCompressorMode: IdCompressorMode;
847
874
  if (existing) {
848
875
  // This setting has to be sticky for correctness:
@@ -851,19 +878,19 @@ export class ContainerRuntime
851
878
  // 2) if it's ON, then all sessions should load compressor right away
852
879
  // 3) Same logic applies for "delayed" mode
853
880
  // Maybe in the future we will need to enabled (and figure how to do it safely) "delayed" -> "on" change.
854
- // We could do "off" -> "on" transtition too, if all clients start loading compressor (but not using it initially) and do so for a while -
855
- // this will allow clients to eventually to disregard "off" setting (when it's safe so) and start using compressor in future sessions.
881
+ // We could do "off" -> "on" transition too, if all clients start loading compressor (but not using it initially) and
882
+ // do so for a while - this will allow clients to eventually to disregard "off" setting (when it's safe so) and start
883
+ // using compressor in future sessions.
856
884
  // Everyting is possible, but it needs to be designed and executed carefully, when such need arises.
857
- idCompressorMode = metadata?.idCompressorMode ?? "off";
885
+ idCompressorMode = metadata?.documentSchema?.runtime
886
+ ?.idCompressorMode as IdCompressorMode;
858
887
  } else {
859
- // FG overwrite
860
- const enabled = mc.config.getBoolean("Fluid.ContainerRuntime.IdCompressorEnabled");
861
- switch (enabled) {
888
+ switch (mc.config.getBoolean("Fluid.ContainerRuntime.IdCompressorEnabled")) {
862
889
  case true:
863
890
  idCompressorMode = "on";
864
891
  break;
865
892
  case false:
866
- idCompressorMode = "off";
893
+ idCompressorMode = undefined;
867
894
  break;
868
895
  default:
869
896
  idCompressorMode = enableRuntimeIdCompressor;
@@ -908,6 +935,38 @@ export class ContainerRuntime
908
935
  }
909
936
  };
910
937
 
938
+ const disableGroupedBatching = mc.config.getBoolean(
939
+ "Fluid.ContainerRuntime.DisableGroupedBatching",
940
+ );
941
+ const disableCompression = mc.config.getBoolean(
942
+ "Fluid.ContainerRuntime.CompressionDisabled",
943
+ );
944
+ const compressionLz4 =
945
+ disableCompression !== true &&
946
+ compressionOptions.minimumBatchSizeInBytes !== Infinity &&
947
+ compressionOptions.compressionAlgorithm === "lz4";
948
+
949
+ const opGroupingEnabled = disableGroupedBatching !== true && enableGroupedBatching;
950
+
951
+ const documentSchemaController = new DocumentsSchemaController(
952
+ existing,
953
+ metadata?.documentSchema,
954
+ {
955
+ explicitSchemaControl,
956
+ compressionLz4,
957
+ idCompressorMode,
958
+ opGroupingEnabled,
959
+ },
960
+ (schema) => {
961
+ runtime.onSchemaChange(schema);
962
+ },
963
+ );
964
+
965
+ const featureGatesForTelemetry: Record<string, boolean | number | undefined> = {
966
+ disableGroupedBatching,
967
+ disableCompression,
968
+ };
969
+
911
970
  const runtime = new containerRuntimeCtor(
912
971
  context,
913
972
  registry,
@@ -923,9 +982,11 @@ export class ContainerRuntime
923
982
  compressionOptions,
924
983
  maxBatchSizeInBytes,
925
984
  chunkSizeInBytes,
926
- enableRuntimeIdCompressor,
985
+ // Requires<> drops undefined from IdCompressorType
986
+ enableRuntimeIdCompressor: enableRuntimeIdCompressor as "on" | "delayed",
927
987
  enableOpReentryCheck,
928
988
  enableGroupedBatching,
989
+ explicitSchemaControl,
929
990
  },
930
991
  containerScope,
931
992
  logger,
@@ -933,7 +994,8 @@ export class ContainerRuntime
933
994
  blobManagerSnapshot,
934
995
  context.storage,
935
996
  createIdCompressorFn,
936
- idCompressorMode,
997
+ documentSchemaController,
998
+ featureGatesForTelemetry,
937
999
  provideEntryPoint,
938
1000
  requestHandler,
939
1001
  undefined, // summaryConfiguration
@@ -983,7 +1045,7 @@ export class ContainerRuntime
983
1045
  summaryOp: ISummaryContent,
984
1046
  referenceSequenceNumber?: number,
985
1047
  ) => number;
986
- private readonly submitSignalFn: (content: any, targetClientId?: string) => void;
1048
+ private readonly submitSignalFn: (content: ISignalEnvelope, targetClientId?: string) => void;
987
1049
  public readonly disposeFn: (error?: ICriticalContainerError) => void;
988
1050
  public readonly closeFn: (error?: ICriticalContainerError) => void;
989
1051
 
@@ -1004,6 +1066,10 @@ export class ContainerRuntime
1004
1066
  return this._getAttachState();
1005
1067
  }
1006
1068
 
1069
+ public get documentSchema() {
1070
+ return this.documentsSchemaController.sessionSchema.runtime;
1071
+ }
1072
+
1007
1073
  private _idCompressor: (IIdCompressor & IIdCompressorCore) | undefined;
1008
1074
 
1009
1075
  // We accumulate Id compressor Ops while Id compressor is not loaded yet (only for "delayed" mode)
@@ -1016,6 +1082,9 @@ export class ContainerRuntime
1016
1082
  // In such case we have to process all ops, including those marked with saveOp === true.
1017
1083
  private readonly skipSavedCompressorOps: boolean;
1018
1084
 
1085
+ public get idCompressorMode() {
1086
+ return this.documentSchema.idCompressorMode;
1087
+ }
1019
1088
  /**
1020
1089
  * See IContainerRuntimeBase.idCompressor() for details.
1021
1090
  */
@@ -1037,7 +1106,7 @@ export class ContainerRuntime
1037
1106
  * True if we have ID compressor loading in-flight (async operation). Useful only for
1038
1107
  * this.idCompressorMode === "delayed" mode
1039
1108
  */
1040
- protected compressorLoadInitiated = false;
1109
+ protected _loadIdCompressor: Promise<void> | undefined;
1041
1110
 
1042
1111
  /**
1043
1112
  * See IContainerRuntimeBase.generateDocumentUniqueId() for details.
@@ -1259,7 +1328,8 @@ export class ContainerRuntime
1259
1328
  blobManagerSnapshot: IBlobManagerLoadInfo,
1260
1329
  private readonly _storage: IDocumentStorageService,
1261
1330
  private readonly createIdCompressor: () => Promise<IIdCompressor & IIdCompressorCore>,
1262
- private readonly idCompressorMode: IdCompressorMode,
1331
+ private readonly documentsSchemaController: DocumentsSchemaController,
1332
+ featureGatesForTelemetry: Record<string, boolean | number | undefined>,
1263
1333
  provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
1264
1334
  private readonly requestHandler?: (
1265
1335
  request: IRequest,
@@ -1293,6 +1363,22 @@ export class ContainerRuntime
1293
1363
  supportedFeatures,
1294
1364
  } = context;
1295
1365
 
1366
+ this.mc = createChildMonitoringContext({
1367
+ logger: this.logger,
1368
+ namespace: "ContainerRuntime",
1369
+ });
1370
+
1371
+ // If we support multiple algorithms in the future, then we would need to manage it here carefully.
1372
+ // We can use runtimeOptions.compressionOptions.compressionAlgorithm, but only if it's in the schema list!
1373
+ // If it's not in the list, then we will need to either use no compression, or fallback to some other (supported by format)
1374
+ // compression.
1375
+ const compressionOptions: ICompressionRuntimeOptions = {
1376
+ minimumBatchSizeInBytes: this.documentSchema.compressionLz4
1377
+ ? runtimeOptions.compressionOptions.minimumBatchSizeInBytes
1378
+ : Number.POSITIVE_INFINITY,
1379
+ compressionAlgorithm: CompressionAlgorithms.lz4,
1380
+ };
1381
+
1296
1382
  this.innerDeltaManager = deltaManager;
1297
1383
  this.deltaManager = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
1298
1384
 
@@ -1330,11 +1416,6 @@ export class ContainerRuntime
1330
1416
  // In cases of summarizer, we want to dispose instead since consumer doesn't interact with this container
1331
1417
  this.closeFn = this.isSummarizerClient ? this.disposeFn : closeFn;
1332
1418
 
1333
- this.mc = createChildMonitoringContext({
1334
- logger: this.logger,
1335
- namespace: "ContainerRuntime",
1336
- });
1337
-
1338
1419
  let loadSummaryNumber: number;
1339
1420
  // Get the container creation metadata. For new container, we initialize these. For existing containers,
1340
1421
  // get the values from the metadata blob.
@@ -1355,7 +1436,7 @@ export class ContainerRuntime
1355
1436
  }
1356
1437
  this.nextSummaryNumber = loadSummaryNumber + 1;
1357
1438
 
1358
- this.messageAtLastSummary = metadata?.message;
1439
+ this.messageAtLastSummary = lastMessageFromMetadata(metadata);
1359
1440
 
1360
1441
  // Note that we only need to pull the *initial* connected state from the context.
1361
1442
  // Later updates come through calls to setConnectionState.
@@ -1583,17 +1664,6 @@ export class ContainerRuntime
1583
1664
  this.logger,
1584
1665
  );
1585
1666
 
1586
- const disableCompression = this.mc.config.getBoolean(
1587
- "Fluid.ContainerRuntime.CompressionDisabled",
1588
- );
1589
- const compressionOptions =
1590
- disableCompression === true
1591
- ? {
1592
- minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
1593
- compressionAlgorithm: CompressionAlgorithms.lz4,
1594
- }
1595
- : runtimeOptions.compressionOptions;
1596
-
1597
1667
  const disablePartialFlush = this.mc.config.getBoolean(
1598
1668
  "Fluid.ContainerRuntime.DisablePartialFlush",
1599
1669
  );
@@ -1747,10 +1817,10 @@ export class ContainerRuntime
1747
1817
  disableIsolatedChannels: metadata?.disableIsolatedChannels,
1748
1818
  gcVersion: metadata?.gcFeature,
1749
1819
  options: JSON.stringify(runtimeOptions),
1750
- idCompressorModeMetadata: metadata?.idCompressorMode,
1820
+ idCompressorModeMetadata: metadata?.documentSchema?.runtime?.idCompressorMode,
1751
1821
  idCompressorMode: this.idCompressorMode,
1752
1822
  featureGates: JSON.stringify({
1753
- disableCompression,
1823
+ ...featureGatesForTelemetry,
1754
1824
  disableOpReentryCheck,
1755
1825
  disableChunking,
1756
1826
  disableAttachReorder: this.disableAttachReorder,
@@ -1780,6 +1850,21 @@ export class ContainerRuntime
1780
1850
  this.skipSavedCompressorOps = pendingRuntimeState?.pendingIdCompressorState !== undefined;
1781
1851
  }
1782
1852
 
1853
+ public onSchemaChange(schema: IDocumentSchemaCurrent) {
1854
+ // Most of the settings will be picked up only by new sessions (i.e. after reload).
1855
+ // We can make it better in the future (i.e. start to use op compression right away), but for simplicity
1856
+ // this is not done.
1857
+ // But ID compressor is special. It's possible, that in future, we will remove "stickiness" of ID compressor setting
1858
+ // and will allow to start using it. If that were to happen, we want to ensure that we do not break eventual consistency
1859
+ // promises. To do so, we need to initialize id compressor right away.
1860
+ // As it's implemented right now (with async initialization), this will only work for "off" -> "delayed" transitions.
1861
+ // Anything else is too risky, and requires ability to initialize ID compressor synchronously!
1862
+ if (schema.runtime.idCompressorMode !== undefined) {
1863
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
1864
+ this.loadIdCompressor();
1865
+ }
1866
+ }
1867
+
1783
1868
  public getCreateChildSummarizerNodeFn(id: string, createParam: CreateChildSummarizerNodeParam) {
1784
1869
  return (
1785
1870
  summarizeInternal: SummarizeInternalFn,
@@ -2062,20 +2147,38 @@ export class ContainerRuntime
2062
2147
 
2063
2148
  /** Adds the container's metadata to the given summary tree. */
2064
2149
  private addMetadataToSummary(summaryTree: ISummaryTreeWithStats) {
2150
+ // The last message processed at the time of summary. If there are no new messages, use the message from the
2151
+ // last summary.
2152
+ const message =
2153
+ extractSummaryMetadataMessage(this.deltaManager.lastMessage) ??
2154
+ this.messageAtLastSummary;
2155
+
2156
+ const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(
2157
+ this.deltaManager.lastSequenceNumber,
2158
+ );
2159
+
2160
+ // Is document schema explicit control on?
2161
+ const explitiSchemaControl = documentSchema?.runtime.explicitSchemaControl;
2162
+
2065
2163
  const metadata: IContainerRuntimeMetadata = {
2066
2164
  ...this.createContainerMetadata,
2067
2165
  // Increment the summary number for the next summary that will be generated.
2068
2166
  summaryNumber: this.nextSummaryNumber++,
2069
2167
  summaryFormatVersion: 1,
2070
2168
  ...this.garbageCollector.getMetadata(),
2071
- // The last message processed at the time of summary. If there are no new messages, use the message from the
2072
- // last summary.
2073
- message:
2074
- extractSummaryMetadataMessage(this.deltaManager.lastMessage) ??
2075
- this.messageAtLastSummary,
2076
2169
  telemetryDocumentId: this.telemetryDocumentId,
2077
- idCompressorMode: this.idCompressorMode,
2170
+ // If explicit document schema control is not on, use legacy way to supply last message (using 'message' property).
2171
+ // Otherwise use new 'lastMessage' property, but also put content into the 'message' property that cases old
2172
+ // runtimes (that preceed document schema control capabilities) to close container on load due to mismatch in
2173
+ // last message's sequence number.
2174
+ // See also lastMessageFromMetadata()
2175
+ message: explitiSchemaControl
2176
+ ? ({ sequenceNumber: -1 } as any as ISummaryMetadataMessage)
2177
+ : message,
2178
+ lastMessage: explitiSchemaControl ? message : undefined,
2179
+ documentSchema,
2078
2180
  };
2181
+
2079
2182
  addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(metadata));
2080
2183
  }
2081
2184
 
@@ -2211,7 +2314,12 @@ export class ContainerRuntime
2211
2314
  case ContainerMessageType.Alias:
2212
2315
  return this.channelCollection.applyStashedOp(opContents);
2213
2316
  case ContainerMessageType.IdAllocation:
2214
- assert(this.idCompressorMode !== "off", 0x8f1 /* ID compressor should be in use */);
2317
+ assert(
2318
+ this.idCompressorMode !== undefined,
2319
+ 0x8f1 /* ID compressor should be in use */,
2320
+ );
2321
+ return;
2322
+ case ContainerMessageType.DocumentSchemaChange:
2215
2323
  return;
2216
2324
  case ContainerMessageType.BlobAttach:
2217
2325
  return;
@@ -2248,10 +2356,13 @@ export class ContainerRuntime
2248
2356
  }
2249
2357
  }
2250
2358
 
2251
- public setConnectionState(connected: boolean, clientId?: string) {
2252
- if (connected && this.idCompressorMode === "delayed" && !this.compressorLoadInitiated) {
2253
- this.compressorLoadInitiated = true;
2254
- this.createIdCompressor()
2359
+ private async loadIdCompressor() {
2360
+ if (
2361
+ this._idCompressor === undefined &&
2362
+ this.idCompressorMode !== undefined &&
2363
+ this._loadIdCompressor === undefined
2364
+ ) {
2365
+ this._loadIdCompressor = this.createIdCompressor()
2255
2366
  .then((compressor) => {
2256
2367
  this._idCompressor = compressor;
2257
2368
  for (const range of this.pendingIdCompressorOps) {
@@ -2261,8 +2372,17 @@ export class ContainerRuntime
2261
2372
  })
2262
2373
  .catch((error) => {
2263
2374
  this.logger.sendErrorEvent({ eventName: "IdCompressorDelayedLoad" }, error);
2375
+ throw error;
2264
2376
  });
2265
2377
  }
2378
+ return this._loadIdCompressor;
2379
+ }
2380
+
2381
+ public setConnectionState(connected: boolean, clientId?: string) {
2382
+ if (connected && this.idCompressorMode === "delayed") {
2383
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
2384
+ this.loadIdCompressor();
2385
+ }
2266
2386
  if (connected === false && this.delayConnectClientId !== undefined) {
2267
2387
  this.delayConnectClientId = undefined;
2268
2388
  this.mc.logger.sendTelemetryEvent({
@@ -2272,6 +2392,10 @@ export class ContainerRuntime
2272
2392
  return;
2273
2393
  }
2274
2394
 
2395
+ if (!connected) {
2396
+ this.documentsSchemaController.onDisconnect();
2397
+ }
2398
+
2275
2399
  // If there are stashed blobs in the pending state, we need to delay
2276
2400
  // propagation of the "connected" event until we have uploaded them to
2277
2401
  // ensure we don't submit ops referencing a blob that has not been uploaded
@@ -2504,6 +2628,13 @@ export class ContainerRuntime
2504
2628
  assert(false, "should not even get here");
2505
2629
  case ContainerMessageType.Rejoin:
2506
2630
  break;
2631
+ case ContainerMessageType.DocumentSchemaChange:
2632
+ this.documentsSchemaController.processDocumentSchemaOp(
2633
+ messageWithContext.message.contents,
2634
+ messageWithContext.local,
2635
+ messageWithContext.message.sequenceNumber,
2636
+ );
2637
+ break;
2507
2638
  default: {
2508
2639
  // If we didn't necessarily expect a runtime message type, then no worries - just return
2509
2640
  // e.g. this case applies to system ops, or legacy ops that would have fallen into the above cases anyway.
@@ -2823,6 +2954,7 @@ export class ContainerRuntime
2823
2954
  break;
2824
2955
  }
2825
2956
  case ContainerMessageType.IdAllocation:
2957
+ case ContainerMessageType.DocumentSchemaChange:
2826
2958
  case ContainerMessageType.GC: {
2827
2959
  return false;
2828
2960
  }
@@ -2940,6 +3072,9 @@ export class ContainerRuntime
2940
3072
  wrapSummaryInChannelsTree(summarizeResult);
2941
3073
  const pathPartsForChildren = [channelsTreeName];
2942
3074
 
3075
+ // Ensure that ID compressor had a chance to load, if we are using delayed mode.
3076
+ await this.loadIdCompressor();
3077
+
2943
3078
  this.addContainerStateToSummary(summarizeResult, fullTree, trackState, telemetryContext);
2944
3079
  return {
2945
3080
  ...summarizeResult,
@@ -3673,9 +3808,6 @@ export class ContainerRuntime
3673
3808
  const idAllocationBatchMessage: BatchMessage = {
3674
3809
  contents: JSON.stringify(idAllocationMessage),
3675
3810
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
3676
- metadata: undefined,
3677
- localOpMetadata: undefined,
3678
- type: ContainerMessageType.IdAllocation,
3679
3811
  };
3680
3812
  this.outbox.submitIdAllocation(idAllocationBatchMessage);
3681
3813
  }
@@ -3685,7 +3817,7 @@ export class ContainerRuntime
3685
3817
  private submit(
3686
3818
  containerRuntimeMessage: OutboundContainerRuntimeMessage,
3687
3819
  localOpMetadata: unknown = undefined,
3688
- metadata: Record<string, unknown> | undefined = undefined,
3820
+ metadata?: { localId: string; blobId?: string },
3689
3821
  ): void {
3690
3822
  this.verifyNotClosed();
3691
3823
  this.verifyCanSubmitOps();
@@ -3696,6 +3828,12 @@ export class ContainerRuntime
3696
3828
  0x132 /* "sending ops in detached container" */,
3697
3829
  );
3698
3830
 
3831
+ assert(
3832
+ metadata === undefined ||
3833
+ containerRuntimeMessage.type === ContainerMessageType.BlobAttach,
3834
+ "metadata",
3835
+ );
3836
+
3699
3837
  const serializedContent = JSON.stringify(containerRuntimeMessage);
3700
3838
 
3701
3839
  // Note that the real (non-proxy) delta manager is used here to get the readonly info. This is because
@@ -3710,7 +3848,6 @@ export class ContainerRuntime
3710
3848
  const type = containerRuntimeMessage.type;
3711
3849
  const message: BatchMessage = {
3712
3850
  contents: serializedContent,
3713
- type,
3714
3851
  metadata,
3715
3852
  localOpMetadata,
3716
3853
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
@@ -3726,6 +3863,22 @@ export class ContainerRuntime
3726
3863
  } else {
3727
3864
  this.submitIdAllocationOpIfNeeded();
3728
3865
 
3866
+ // Allow document schema controller to send a message if it needs to propose change in document schema.
3867
+ // If it needs to send a message, it will call provided callback with payload of such message and rely
3868
+ // on this callback to do actual sending.
3869
+ this.documentsSchemaController.onMessageSent(
3870
+ (contents: IDocumentSchemaChangeMessage) => {
3871
+ const msg: ContainerRuntimeDocumentSchemaMessage = {
3872
+ type: ContainerMessageType.DocumentSchemaChange,
3873
+ contents,
3874
+ };
3875
+ this.outbox.submit({
3876
+ contents: JSON.stringify(msg),
3877
+ referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
3878
+ });
3879
+ },
3880
+ );
3881
+
3729
3882
  // If this is attach message for new data store, and we are in a batch, send this op out of order
3730
3883
  // Is it safe:
3731
3884
  // Yes, this should be safe reordering. Newly created data stores are not visible through API surface.
@@ -3926,6 +4079,11 @@ export class ContainerRuntime
3926
4079
  case ContainerMessageType.GC:
3927
4080
  this.submit(message);
3928
4081
  break;
4082
+ case ContainerMessageType.DocumentSchemaChange:
4083
+ // There is no need to resend this message. Document schema controller will properly resend it again (if needed)
4084
+ // on a first occasion (any ops sent after reconnect). There is a good chance, though, that it will not want to
4085
+ // send any ops, as some other client already changed schema.
4086
+ break;
3929
4087
  default: {
3930
4088
  // This case should be very rare - it would imply an op was stashed from a
3931
4089
  // future version of runtime code and now is being applied on an older version.
@@ -4215,9 +4373,6 @@ export class ContainerRuntime
4215
4373
  }
4216
4374
 
4217
4375
  private get groupedBatchingEnabled(): boolean {
4218
- const killSwitch = this.mc.config.getBoolean(
4219
- "Fluid.ContainerRuntime.DisableGroupedBatching",
4220
- );
4221
- return killSwitch !== true && this.runtimeOptions.enableGroupedBatching;
4376
+ return this.documentSchema.opGroupingEnabled === true;
4222
4377
  }
4223
4378
  }