@fluidframework/container-runtime 2.23.0 → 2.31.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 (317) hide show
  1. package/CHANGELOG.md +593 -537
  2. package/api-report/container-runtime.legacy.alpha.api.md +0 -246
  3. package/dist/blobManager/blobManager.d.ts +11 -9
  4. package/dist/blobManager/blobManager.d.ts.map +1 -1
  5. package/dist/blobManager/blobManager.js +38 -39
  6. package/dist/blobManager/blobManager.js.map +1 -1
  7. package/dist/blobManager/blobManagerSnapSum.d.ts +2 -4
  8. package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  9. package/dist/blobManager/blobManagerSnapSum.js +6 -6
  10. package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
  11. package/dist/channelCollection.d.ts +1 -7
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +2 -27
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +0 -43
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +40 -145
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +149 -364
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStoreContext.d.ts +6 -14
  23. package/dist/dataStoreContext.d.ts.map +1 -1
  24. package/dist/dataStoreContext.js +14 -26
  25. package/dist/dataStoreContext.js.map +1 -1
  26. package/dist/gc/garbageCollection.d.ts.map +1 -1
  27. package/dist/gc/garbageCollection.js +2 -20
  28. package/dist/gc/garbageCollection.js.map +1 -1
  29. package/dist/gc/gcConfigs.d.ts.map +1 -1
  30. package/dist/gc/gcConfigs.js +0 -2
  31. package/dist/gc/gcConfigs.js.map +1 -1
  32. package/dist/gc/gcDefinitions.d.ts +8 -24
  33. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  34. package/dist/gc/gcDefinitions.js +1 -3
  35. package/dist/gc/gcDefinitions.js.map +1 -1
  36. package/dist/gc/gcHelpers.d.ts.map +1 -1
  37. package/dist/gc/gcHelpers.js +1 -4
  38. package/dist/gc/gcHelpers.js.map +1 -1
  39. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  40. package/dist/gc/gcSummaryStateTracker.js +0 -1
  41. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  42. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  43. package/dist/gc/gcTelemetry.js +6 -18
  44. package/dist/gc/gcTelemetry.js.map +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -2
  48. package/dist/index.js.map +1 -1
  49. package/dist/legacy.d.ts +0 -29
  50. package/dist/messageTypes.d.ts.map +1 -1
  51. package/dist/messageTypes.js.map +1 -1
  52. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  53. package/dist/opLifecycle/batchManager.js +16 -5
  54. package/dist/opLifecycle/batchManager.js.map +1 -1
  55. package/dist/opLifecycle/outbox.d.ts +12 -3
  56. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  57. package/dist/opLifecycle/outbox.js +41 -21
  58. package/dist/opLifecycle/outbox.js.map +1 -1
  59. package/dist/packageVersion.d.ts +1 -1
  60. package/dist/packageVersion.js +1 -1
  61. package/dist/packageVersion.js.map +1 -1
  62. package/dist/pendingStateManager.d.ts +1 -0
  63. package/dist/pendingStateManager.d.ts.map +1 -1
  64. package/dist/pendingStateManager.js +12 -2
  65. package/dist/pendingStateManager.js.map +1 -1
  66. package/dist/runCounter.d.ts +11 -0
  67. package/dist/runCounter.d.ts.map +1 -0
  68. package/dist/runCounter.js +43 -0
  69. package/dist/runCounter.js.map +1 -0
  70. package/dist/runtimeLayerCompatState.d.ts +51 -0
  71. package/dist/runtimeLayerCompatState.d.ts.map +1 -0
  72. package/dist/runtimeLayerCompatState.js +123 -0
  73. package/dist/runtimeLayerCompatState.js.map +1 -0
  74. package/dist/signalTelemetryProcessing.d.ts +33 -0
  75. package/dist/signalTelemetryProcessing.d.ts.map +1 -0
  76. package/dist/signalTelemetryProcessing.js +149 -0
  77. package/dist/signalTelemetryProcessing.js.map +1 -0
  78. package/dist/summary/documentSchema.d.ts +7 -31
  79. package/dist/summary/documentSchema.d.ts.map +1 -1
  80. package/dist/summary/documentSchema.js +2 -18
  81. package/dist/summary/documentSchema.js.map +1 -1
  82. package/dist/summary/index.d.ts +2 -1
  83. package/dist/summary/index.d.ts.map +1 -1
  84. package/dist/summary/index.js +7 -1
  85. package/dist/summary/index.js.map +1 -1
  86. package/dist/summary/orderedClientElection.d.ts +1 -3
  87. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  88. package/dist/summary/orderedClientElection.js.map +1 -1
  89. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -3
  90. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  91. package/dist/summary/runWhileConnectedCoordinator.js +2 -7
  92. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  93. package/dist/summary/runningSummarizer.d.ts +1 -2
  94. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  95. package/dist/summary/runningSummarizer.js +4 -23
  96. package/dist/summary/runningSummarizer.js.map +1 -1
  97. package/dist/summary/summarizer.d.ts +2 -5
  98. package/dist/summary/summarizer.d.ts.map +1 -1
  99. package/dist/summary/summarizer.js +3 -11
  100. package/dist/summary/summarizer.js.map +1 -1
  101. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  102. package/dist/summary/summarizerClientElection.js +0 -1
  103. package/dist/summary/summarizerClientElection.js.map +1 -1
  104. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  105. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  106. package/dist/summary/summarizerHeuristics.js.map +1 -1
  107. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
  108. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  109. package/dist/summary/summarizerNode/summarizerNode.js +4 -4
  110. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  111. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -18
  112. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  113. package/dist/summary/summarizerNode/summarizerNodeUtils.js +0 -27
  114. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  115. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  116. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  117. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -2
  118. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  119. package/dist/summary/summarizerTypes.d.ts +109 -22
  120. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  121. package/dist/summary/summarizerTypes.js.map +1 -1
  122. package/dist/summary/summaryFormat.d.ts +3 -9
  123. package/dist/summary/summaryFormat.d.ts.map +1 -1
  124. package/dist/summary/summaryFormat.js.map +1 -1
  125. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  126. package/dist/summary/summaryGenerator.js +3 -9
  127. package/dist/summary/summaryGenerator.js.map +1 -1
  128. package/dist/summary/summaryHelpers.d.ts +19 -0
  129. package/dist/summary/summaryHelpers.d.ts.map +1 -0
  130. package/dist/summary/summaryHelpers.js +90 -0
  131. package/dist/summary/summaryHelpers.js.map +1 -0
  132. package/dist/summary/summaryManager.d.ts.map +1 -1
  133. package/dist/summary/summaryManager.js +0 -2
  134. package/dist/summary/summaryManager.js.map +1 -1
  135. package/lib/blobManager/blobManager.d.ts +11 -9
  136. package/lib/blobManager/blobManager.d.ts.map +1 -1
  137. package/lib/blobManager/blobManager.js +37 -37
  138. package/lib/blobManager/blobManager.js.map +1 -1
  139. package/lib/blobManager/blobManagerSnapSum.d.ts +2 -4
  140. package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  141. package/lib/blobManager/blobManagerSnapSum.js +6 -6
  142. package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
  143. package/lib/channelCollection.d.ts +1 -7
  144. package/lib/channelCollection.d.ts.map +1 -1
  145. package/lib/channelCollection.js +3 -30
  146. package/lib/channelCollection.js.map +1 -1
  147. package/lib/connectionTelemetry.d.ts +0 -43
  148. package/lib/connectionTelemetry.d.ts.map +1 -1
  149. package/lib/connectionTelemetry.js.map +1 -1
  150. package/lib/containerRuntime.d.ts +40 -145
  151. package/lib/containerRuntime.d.ts.map +1 -1
  152. package/lib/containerRuntime.js +151 -372
  153. package/lib/containerRuntime.js.map +1 -1
  154. package/lib/dataStoreContext.d.ts +6 -14
  155. package/lib/dataStoreContext.d.ts.map +1 -1
  156. package/lib/dataStoreContext.js +14 -26
  157. package/lib/dataStoreContext.js.map +1 -1
  158. package/lib/gc/garbageCollection.d.ts.map +1 -1
  159. package/lib/gc/garbageCollection.js +3 -23
  160. package/lib/gc/garbageCollection.js.map +1 -1
  161. package/lib/gc/gcConfigs.d.ts.map +1 -1
  162. package/lib/gc/gcConfigs.js +0 -2
  163. package/lib/gc/gcConfigs.js.map +1 -1
  164. package/lib/gc/gcDefinitions.d.ts +8 -24
  165. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  166. package/lib/gc/gcDefinitions.js +1 -3
  167. package/lib/gc/gcDefinitions.js.map +1 -1
  168. package/lib/gc/gcHelpers.d.ts.map +1 -1
  169. package/lib/gc/gcHelpers.js +1 -4
  170. package/lib/gc/gcHelpers.js.map +1 -1
  171. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  172. package/lib/gc/gcSummaryStateTracker.js +0 -1
  173. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  174. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  175. package/lib/gc/gcTelemetry.js +7 -21
  176. package/lib/gc/gcTelemetry.js.map +1 -1
  177. package/lib/index.d.ts +2 -2
  178. package/lib/index.d.ts.map +1 -1
  179. package/lib/index.js +2 -2
  180. package/lib/index.js.map +1 -1
  181. package/lib/legacy.d.ts +0 -29
  182. package/lib/messageTypes.d.ts.map +1 -1
  183. package/lib/messageTypes.js.map +1 -1
  184. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  185. package/lib/opLifecycle/batchManager.js +16 -5
  186. package/lib/opLifecycle/batchManager.js.map +1 -1
  187. package/lib/opLifecycle/outbox.d.ts +12 -3
  188. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  189. package/lib/opLifecycle/outbox.js +43 -23
  190. package/lib/opLifecycle/outbox.js.map +1 -1
  191. package/lib/packageVersion.d.ts +1 -1
  192. package/lib/packageVersion.js +1 -1
  193. package/lib/packageVersion.js.map +1 -1
  194. package/lib/pendingStateManager.d.ts +1 -0
  195. package/lib/pendingStateManager.d.ts.map +1 -1
  196. package/lib/pendingStateManager.js +12 -2
  197. package/lib/pendingStateManager.js.map +1 -1
  198. package/lib/runCounter.d.ts +11 -0
  199. package/lib/runCounter.d.ts.map +1 -0
  200. package/lib/runCounter.js +39 -0
  201. package/lib/runCounter.js.map +1 -0
  202. package/lib/runtimeLayerCompatState.d.ts +51 -0
  203. package/lib/runtimeLayerCompatState.d.ts.map +1 -0
  204. package/lib/runtimeLayerCompatState.js +118 -0
  205. package/lib/runtimeLayerCompatState.js.map +1 -0
  206. package/lib/signalTelemetryProcessing.d.ts +33 -0
  207. package/lib/signalTelemetryProcessing.d.ts.map +1 -0
  208. package/lib/signalTelemetryProcessing.js +145 -0
  209. package/lib/signalTelemetryProcessing.js.map +1 -0
  210. package/lib/summary/documentSchema.d.ts +7 -31
  211. package/lib/summary/documentSchema.d.ts.map +1 -1
  212. package/lib/summary/documentSchema.js +2 -18
  213. package/lib/summary/documentSchema.js.map +1 -1
  214. package/lib/summary/index.d.ts +2 -1
  215. package/lib/summary/index.d.ts.map +1 -1
  216. package/lib/summary/index.js +1 -0
  217. package/lib/summary/index.js.map +1 -1
  218. package/lib/summary/orderedClientElection.d.ts +1 -3
  219. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  220. package/lib/summary/orderedClientElection.js.map +1 -1
  221. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -3
  222. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  223. package/lib/summary/runWhileConnectedCoordinator.js +2 -7
  224. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  225. package/lib/summary/runningSummarizer.d.ts +1 -2
  226. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  227. package/lib/summary/runningSummarizer.js +4 -23
  228. package/lib/summary/runningSummarizer.js.map +1 -1
  229. package/lib/summary/summarizer.d.ts +2 -5
  230. package/lib/summary/summarizer.d.ts.map +1 -1
  231. package/lib/summary/summarizer.js +3 -11
  232. package/lib/summary/summarizer.js.map +1 -1
  233. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  234. package/lib/summary/summarizerClientElection.js +0 -1
  235. package/lib/summary/summarizerClientElection.js.map +1 -1
  236. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  237. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  238. package/lib/summary/summarizerHeuristics.js.map +1 -1
  239. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
  240. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  241. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  242. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  243. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -18
  244. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  245. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -25
  246. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  247. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  248. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  249. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -2
  250. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  251. package/lib/summary/summarizerTypes.d.ts +109 -22
  252. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  253. package/lib/summary/summarizerTypes.js.map +1 -1
  254. package/lib/summary/summaryFormat.d.ts +3 -9
  255. package/lib/summary/summaryFormat.d.ts.map +1 -1
  256. package/lib/summary/summaryFormat.js.map +1 -1
  257. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  258. package/lib/summary/summaryGenerator.js +3 -9
  259. package/lib/summary/summaryGenerator.js.map +1 -1
  260. package/lib/summary/summaryHelpers.d.ts +19 -0
  261. package/lib/summary/summaryHelpers.d.ts.map +1 -0
  262. package/lib/summary/summaryHelpers.js +84 -0
  263. package/lib/summary/summaryHelpers.js.map +1 -0
  264. package/lib/summary/summaryManager.d.ts.map +1 -1
  265. package/lib/summary/summaryManager.js +0 -2
  266. package/lib/summary/summaryManager.js.map +1 -1
  267. package/lib/tsdoc-metadata.json +1 -1
  268. package/package.json +20 -23
  269. package/src/blobManager/blobManager.ts +70 -62
  270. package/src/blobManager/blobManagerSnapSum.ts +7 -9
  271. package/src/channelCollection.ts +4 -32
  272. package/src/connectionTelemetry.ts +0 -51
  273. package/src/containerRuntime.ts +259 -622
  274. package/src/dataStoreContext.ts +24 -33
  275. package/src/gc/{garbageCollection.md → README.md} +17 -19
  276. package/src/gc/garbageCollection.ts +9 -26
  277. package/src/gc/gcConfigs.ts +3 -6
  278. package/src/gc/gcDefinitions.ts +10 -28
  279. package/src/gc/gcHelpers.ts +0 -5
  280. package/src/gc/gcSummaryStateTracker.ts +1 -2
  281. package/src/gc/gcTelemetry.ts +8 -15
  282. package/src/index.ts +6 -6
  283. package/src/messageTypes.ts +0 -2
  284. package/src/opLifecycle/batchManager.ts +20 -6
  285. package/src/opLifecycle/outbox.ts +64 -24
  286. package/src/packageVersion.ts +1 -1
  287. package/src/pendingStateManager.ts +18 -2
  288. package/src/runCounter.ts +25 -0
  289. package/src/runtimeLayerCompatState.ts +143 -0
  290. package/src/signalTelemetryProcessing.ts +233 -0
  291. package/src/summary/documentSchema.ts +7 -38
  292. package/src/summary/index.ts +12 -0
  293. package/src/summary/orderedClientElection.ts +1 -3
  294. package/src/summary/runWhileConnectedCoordinator.ts +3 -8
  295. package/src/summary/runningSummarizer.ts +12 -20
  296. package/src/summary/summarizer.ts +6 -18
  297. package/src/summary/summarizerClientElection.ts +0 -2
  298. package/src/summary/summarizerHeuristics.ts +1 -2
  299. package/src/summary/summarizerNode/summarizerNode.ts +6 -5
  300. package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -27
  301. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +2 -3
  302. package/src/summary/summarizerTypes.ts +119 -23
  303. package/src/summary/summaryFormat.ts +4 -13
  304. package/src/summary/summaryGenerator.ts +1 -8
  305. package/src/summary/summaryHelpers.ts +118 -0
  306. package/src/summary/summaryManager.ts +0 -2
  307. package/tsconfig.json +1 -0
  308. package/dist/layerCompatState.d.ts +0 -19
  309. package/dist/layerCompatState.d.ts.map +0 -1
  310. package/dist/layerCompatState.js +0 -64
  311. package/dist/layerCompatState.js.map +0 -1
  312. package/lib/layerCompatState.d.ts +0 -19
  313. package/lib/layerCompatState.d.ts.map +0 -1
  314. package/lib/layerCompatState.js +0 -60
  315. package/lib/layerCompatState.js.map +0 -1
  316. package/prettier.config.cjs +0 -8
  317. package/src/layerCompatState.ts +0 -75
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.defaultRuntimeHeaderData = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey = exports.DefaultSummaryConfiguration = exports.isSummariesDisabled = void 0;
7
+ exports.createNewSignalEnvelope = exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.defaultRuntimeHeaderData = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey = void 0;
8
8
  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");
@@ -27,11 +27,13 @@ const deltaManagerProxies_js_1 = require("./deltaManagerProxies.js");
27
27
  const deltaScheduler_js_1 = require("./deltaScheduler.js");
28
28
  const index_js_2 = require("./gc/index.js");
29
29
  const inboundBatchAggregator_js_1 = require("./inboundBatchAggregator.js");
30
- const layerCompatState_js_1 = require("./layerCompatState.js");
31
30
  const messageTypes_js_1 = require("./messageTypes.js");
32
31
  const index_js_3 = require("./opLifecycle/index.js");
33
32
  const packageVersion_js_1 = require("./packageVersion.js");
34
33
  const pendingStateManager_js_1 = require("./pendingStateManager.js");
34
+ const runCounter_js_1 = require("./runCounter.js");
35
+ const runtimeLayerCompatState_js_1 = require("./runtimeLayerCompatState.js");
36
+ const signalTelemetryProcessing_js_1 = require("./signalTelemetryProcessing.js");
35
37
  const index_js_4 = require("./summary/index.js");
36
38
  const throttler_js_1 = require("./throttler.js");
37
39
  /**
@@ -53,33 +55,9 @@ function getUnknownMessageTypeError(unknownContainerRuntimeMessageType, codePath
53
55
  },
54
56
  });
55
57
  }
56
- function isSummariesDisabled(config) {
57
- return config.state === "disabled";
58
- }
59
- exports.isSummariesDisabled = isSummariesDisabled;
60
- /**
61
- * @legacy
62
- * @alpha
63
- */
64
- exports.DefaultSummaryConfiguration = {
65
- state: "enabled",
66
- minIdleTime: 0,
67
- maxIdleTime: 30 * 1000, // 30 secs.
68
- maxTime: 60 * 1000, // 1 min.
69
- maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.
70
- minOpsForLastSummaryAttempt: 10,
71
- maxAckWaitTime: 3 * 60 * 1000, // 3 mins.
72
- maxOpsSinceLastSummary: 7000,
73
- initialSummarizerDelayMs: 5 * 1000, // 5 secs.
74
- nonRuntimeOpWeight: 0.1,
75
- runtimeOpWeight: 1,
76
- nonRuntimeHeuristicThreshold: 20,
77
- };
78
58
  /**
79
59
  * Error responses when requesting a deleted object will have this header set to true
80
- * @legacy
81
- * @alpha
82
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
60
+ * @internal
83
61
  */
84
62
  exports.DeletedResponseHeaderKey = "wasDeleted";
85
63
  /**
@@ -198,55 +176,13 @@ const makeLegacySendBatchFn = (submitFn, deltaManager) => (batch) => {
198
176
  return clientSequenceNumber;
199
177
  };
200
178
  exports.makeLegacySendBatchFn = makeLegacySendBatchFn;
201
- const summarizerRequestUrl = "_summarizer";
202
- /**
203
- * Create and retrieve the summmarizer
204
- */
205
- async function createSummarizer(loader, url) {
206
- const request = {
207
- headers: {
208
- [internal_1.LoaderHeader.cache]: false,
209
- [internal_1.LoaderHeader.clientDetails]: {
210
- capabilities: { interactive: false },
211
- type: index_js_4.summarizerClientType,
212
- },
213
- [internal_3.DriverHeader.summarizingClient]: true,
214
- [internal_1.LoaderHeader.reconnect]: false,
215
- },
216
- url,
217
- };
218
- const resolvedContainer = await loader.resolve(request);
219
- let fluidObject;
220
- // Older containers may not have the "getEntryPoint" API
221
- // ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0
222
- if (resolvedContainer.getEntryPoint === undefined) {
223
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any
224
- const response = (await resolvedContainer.request({
225
- url: `/${summarizerRequestUrl}`,
226
- }));
227
- if (response.status !== 200 || response.mimeType !== "fluid/object") {
228
- throw (0, internal_6.responseToException)(response, request);
229
- }
230
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
231
- fluidObject = response.value;
232
- }
233
- else {
234
- fluidObject = await resolvedContainer.getEntryPoint();
235
- }
236
- if (fluidObject?.ISummarizer === undefined) {
237
- throw new internal_7.UsageError("Fluid object does not implement ISummarizer");
238
- }
239
- return fluidObject.ISummarizer;
240
- }
241
179
  /**
242
180
  * Extract last message from the snapshot metadata.
243
181
  * Uses legacy property if not using explicit schema control, otherwise uses the new property.
244
182
  * This allows new runtime to make documents not openable for old runtimes, one explicit document schema control is enabled.
245
183
  * Please see addMetadataToSummary() as well
246
184
  */
247
- function lastMessageFromMetadata(
248
- // eslint-disable-next-line import/no-deprecated
249
- metadata) {
185
+ function lastMessageFromMetadata(metadata) {
250
186
  return metadata?.documentSchema?.runtime?.explicitSchemaControl
251
187
  ? metadata?.lastMessage
252
188
  : metadata?.message;
@@ -280,7 +216,6 @@ async function loadContainerRuntime(params) {
280
216
  }
281
217
  exports.loadContainerRuntime = loadContainerRuntime;
282
218
  const defaultMaxConsecutiveReconnects = 7;
283
- const defaultTelemetrySignalSampleCount = 100;
284
219
  /**
285
220
  * Represents the runtime of the container. Contains helper functions/state of the container.
286
221
  * It will define the store level mappings.
@@ -336,15 +271,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
336
271
  const [chunks, recentBatchInfo, metadata, electedSummarizerData, aliases, serializedIdCompressor,] = await Promise.all([
337
272
  tryFetchBlob(index_js_4.chunksBlobName),
338
273
  tryFetchBlob(index_js_4.recentBatchInfoBlobName),
339
- // eslint-disable-next-line import/no-deprecated
340
274
  tryFetchBlob(index_js_4.metadataBlobName),
341
- // eslint-disable-next-line import/no-deprecated
342
275
  tryFetchBlob(index_js_4.electedSummarizerBlobName),
343
276
  tryFetchBlob(index_js_4.aliasBlobName),
344
277
  tryFetchBlob(index_js_4.idCompressorBlobName),
345
278
  ]);
346
279
  // read snapshot blobs needed for BlobManager to load
347
- const blobManagerSnapshot = await (0, index_js_1.loadBlobManagerLoadInfo)(context);
280
+ const blobManagerLoadInfo = await (0, index_js_1.loadBlobManagerLoadInfo)(context);
348
281
  const messageAtLastSummary = lastMessageFromMetadata(metadata);
349
282
  // Verify summary runtime sequence number matches protocol sequence number.
350
283
  const runtimeSequenceNumber = messageAtLastSummary?.sequenceNumber;
@@ -448,7 +381,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
448
381
  };
449
382
  const compressionLz4 = compressionOptions.minimumBatchSizeInBytes !== Number.POSITIVE_INFINITY &&
450
383
  compressionOptions.compressionAlgorithm === "lz4";
451
- // eslint-disable-next-line import/no-deprecated
452
384
  const documentSchemaController = new index_js_4.DocumentsSchemaController(existing, protocolSequenceNumber, metadata?.documentSchema, {
453
385
  explicitSchemaControl,
454
386
  compressionLz4,
@@ -476,7 +408,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
476
408
  enableGroupedBatching,
477
409
  explicitSchemaControl,
478
410
  };
479
- const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing, blobManagerSnapshot, context.storage, createIdCompressorFn, documentSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, undefined, // summaryConfiguration
411
+ const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing, blobManagerLoadInfo, context.storage, createIdCompressorFn, documentSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, undefined, // summaryConfiguration
480
412
  recentBatchInfo);
481
413
  runtime.blobManager.stashedBlobsUploadP.then(() => {
482
414
  // make sure we didn't reconnect before the promise resolved
@@ -560,18 +492,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
560
492
  * Invokes the given callback and expects that no ops are submitted
561
493
  * until execution finishes. If an op is submitted, an error will be raised.
562
494
  *
563
- * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`
564
- *
565
495
  * @param callback - the callback to be invoked
566
496
  */
567
497
  ensureNoDataModelChanges(callback) {
568
- this.ensureNoDataModelChangesCalls++;
569
- try {
570
- return callback();
571
- }
572
- finally {
573
- this.ensureNoDataModelChangesCalls--;
574
- }
498
+ return this.dataModelChangeRunner.run(callback);
575
499
  }
576
500
  get connected() {
577
501
  return this._connected;
@@ -601,27 +525,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
601
525
  get gcThrowOnTombstoneUsage() {
602
526
  return false;
603
527
  }
528
+ /**
529
+ * The compatibility details of the Runtime layer that is exposed to the Loader layer
530
+ * for validating Loader-Runtime compatibility.
531
+ */
604
532
  get ILayerCompatDetails() {
605
- return layerCompatState_js_1.RuntimeCompatDetails;
533
+ return runtimeLayerCompatState_js_1.runtimeCompatDetailsForLoader;
606
534
  }
607
535
  /***/
608
- constructor(context, registry,
609
- // eslint-disable-next-line import/no-deprecated
610
- metadata,
611
- // eslint-disable-next-line import/no-deprecated
612
- electedSummarizerData, chunks, dataStoreAliasMap, baseRuntimeOptions, containerScope,
536
+ constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
613
537
  // Create a custom ITelemetryBaseLogger to output telemetry events.
614
- baseLogger, existing,
615
- // eslint-disable-next-line import/no-deprecated
616
- blobManagerSnapshot, _storage, createIdCompressor,
617
- // eslint-disable-next-line import/no-deprecated
618
- documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
538
+ baseLogger, existing, blobManagerLoadInfo, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
619
539
  // eslint-disable-next-line unicorn/no-object-as-default-parameter
620
540
  summaryConfiguration = {
621
541
  // the defaults
622
- ...exports.DefaultSummaryConfiguration,
542
+ ...index_js_4.DefaultSummaryConfiguration,
623
543
  // the runtime configuration overrides
624
- ...baseRuntimeOptions.summaryOptions?.summaryConfigOverrides,
544
+ ...runtimeOptions.summaryOptions?.summaryConfigOverrides,
625
545
  }, recentBatchInfo) {
626
546
  super();
627
547
  this.registry = registry;
@@ -636,23 +556,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
636
556
  // We accumulate Id compressor Ops while Id compressor is not loaded yet (only for "delayed" mode)
637
557
  // Once it loads, it will process all such ops and we will stop accumulating further ops - ops will be processes as they come in.
638
558
  this.pendingIdCompressorOps = [];
639
- this._orderSequentiallyCalls = 0;
559
+ this.batchRunner = new runCounter_js_1.RunCounter();
640
560
  this.flushTaskExists = false;
641
561
  this.consecutiveReconnects = 0;
642
- this.ensureNoDataModelChangesCalls = 0;
562
+ this.dataModelChangeRunner = new runCounter_js_1.RunCounter();
643
563
  this._disposed = false;
644
564
  this.emitDirtyDocumentEvent = true;
645
- this._signalTracking = {
646
- totalSignalsSentInLatencyWindow: 0,
647
- signalsLost: 0,
648
- signalsOutOfOrder: 0,
649
- signalsSentSinceLastLatencyMeasurement: 0,
650
- broadcastSignalSequenceNumber: 0,
651
- signalTimestamp: 0,
652
- roundTripSignalSequenceNumber: undefined,
653
- trackingSignalSequenceNumber: undefined,
654
- minimumTrackingSignalSequenceNumber: undefined,
655
- };
565
+ this.signalTelemetryManager = new signalTelemetryProcessing_js_1.SignalTelemetryManager();
656
566
  /**
657
567
  * It a cache for holding mapping for loading groupIds with its snapshot from the service. Add expiry policy of 1 minute.
658
568
  * Starting with 1 min and based on recorded usage we can tweak it later on.
@@ -664,13 +574,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
664
574
  const { options, clientDetails, connected, baseSnapshot, submitFn, submitBatchFn, submitSummaryFn, submitSignalFn, disposeFn, closeFn, deltaManager, quorum, audience, loader, pendingLocalState, supportedFeatures, snapshotWithContents, } = context;
665
575
  // In old loaders without dispose functionality, closeFn is equivalent but will also switch container to readonly mode
666
576
  this.disposeFn = disposeFn ?? closeFn;
667
- const maybeLoaderCompatDetails = context;
668
- (0, layerCompatState_js_1.validateLoaderCompatibility)(maybeLoaderCompatDetails.ILayerCompatDetails, this.disposeFn);
669
- // Backfill in defaults for the internal runtimeOptions, since they may not be present on the provided runtimeOptions object
670
- const runtimeOptions = {
671
- flushMode: defaultFlushMode,
672
- ...baseRuntimeOptions,
673
- };
577
+ // Validate that the Loader is compatible with this Runtime.
578
+ const maybeloaderCompatDetailsForRuntime = context;
579
+ (0, runtimeLayerCompatState_js_1.validateLoaderCompatibility)(maybeloaderCompatDetailsForRuntime.ILayerCompatDetails, this.disposeFn);
674
580
  this.mc = (0, internal_7.createChildMonitoringContext)({
675
581
  logger: this.baseLogger,
676
582
  namespace: "ContainerRuntime",
@@ -718,6 +624,22 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
718
624
  // customer should observe dirty state on the runtime (the owner of dirty state) directly, rather than on the IContainer.
719
625
  this.on("dirty", () => context.updateDirtyContainerState(true));
720
626
  this.on("saved", () => context.updateDirtyContainerState(false));
627
+ // Telemetry for when the container is attached and subsequently saved for the first time.
628
+ // These events are useful for investigating the validity of container "saved" eventing upon attach.
629
+ // See this.setAttachState() and this.updateDocumentDirtyState() for more details on "attached" and "saved" events.
630
+ this.once("attached", () => {
631
+ this.mc.logger.sendTelemetryEvent({
632
+ eventName: "Attached",
633
+ details: {
634
+ dirtyContainer: this.dirtyContainer,
635
+ hasPendingMessages: this.hasPendingMessages(),
636
+ },
637
+ });
638
+ });
639
+ this.once("saved", () => this.mc.logger.sendTelemetryEvent({
640
+ eventName: "Saved",
641
+ details: { attachState: this.attachState },
642
+ }));
721
643
  // In cases of summarizer, we want to dispose instead since consumer doesn't interact with this container
722
644
  this.closeFn = isSummarizerClient ? this.disposeFn : closeFn;
723
645
  let loadSummaryNumber;
@@ -782,10 +704,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
782
704
  this._deltaManager = outerDeltaManager;
783
705
  this.handleContext = new containerHandleContext_js_1.ContainerFluidHandleContext("", this);
784
706
  if (summaryConfiguration.state === "enabled") {
785
- this.validateSummaryHeuristicConfiguration(summaryConfiguration);
707
+ (0, index_js_4.validateSummaryHeuristicConfiguration)(summaryConfiguration);
786
708
  }
787
- this.summariesDisabled = isSummariesDisabled(summaryConfiguration);
788
- const { maxOpsSinceLastSummary = 0, initialSummarizerDelayMs = 0 } = isSummariesDisabled(summaryConfiguration)
709
+ this.summariesDisabled = (0, index_js_4.isSummariesDisabled)(summaryConfiguration);
710
+ const { maxOpsSinceLastSummary = 0, initialSummarizerDelayMs = 0 } = (0, index_js_4.isSummariesDisabled)(summaryConfiguration)
789
711
  ? {}
790
712
  : {
791
713
  ...summaryConfiguration,
@@ -799,7 +721,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
799
721
  this.mc.config.getNumber(maxConsecutiveReconnectsKey) ?? defaultMaxConsecutiveReconnects;
800
722
  // If the context has ILayerCompatDetails, it supports referenceSequenceNumbers since that features
801
723
  // predates ILayerCompatDetails.
802
- const referenceSequenceNumbersSupported = maybeLoaderCompatDetails.ILayerCompatDetails === undefined
724
+ const referenceSequenceNumbersSupported = maybeloaderCompatDetailsForRuntime.ILayerCompatDetails === undefined
803
725
  ? supportedFeatures?.get("referenceSequenceNumbers") === true
804
726
  : true;
805
727
  if (runtimeOptions.flushMode === internal_5.FlushModeExperimental.Async &&
@@ -880,9 +802,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
880
802
  // what is the interface of passing signals, we need the
881
803
  // downstream stores to wrap the signal.
882
804
  parentContext.submitSignal = (type, content, targetClientId) => {
805
+ // Future: Can the `content` argument type be IEnvelope?
806
+ // verifyNotClosed is called in FluidDataStoreContext, which is *the* expected caller.
883
807
  const envelope1 = content;
884
- const envelope2 = this.createNewSignalEnvelope(envelope1.address, type, envelope1.contents);
885
- return this.submitEnvelopedSignal(envelope2, targetClientId);
808
+ const envelope2 = createNewSignalEnvelope(envelope1.address, type, envelope1.contents);
809
+ if (targetClientId === undefined) {
810
+ this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope2);
811
+ }
812
+ this.submitSignalFn(envelope2, targetClientId);
886
813
  };
887
814
  let snapshot = (0, channelCollection_js_1.getSummaryForDatastores)(baseSnapshot, metadata);
888
815
  if (snapshot !== undefined && snapshotWithContents !== undefined) {
@@ -897,8 +824,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
897
824
  }), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
898
825
  this.blobManager = new index_js_1.BlobManager({
899
826
  routeContext: this.handleContext,
900
- snapshot: blobManagerSnapshot,
901
- getStorage: () => this.storage,
827
+ blobManagerLoadInfo,
828
+ storage: this.storage,
902
829
  sendBlobAttachOp: (localId, blobId) => {
903
830
  if (!this.disposed) {
904
831
  this.submit({ type: messageTypes_js_1.ContainerMessageType.BlobAttach, contents: undefined }, undefined, {
@@ -918,8 +845,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
918
845
  });
919
846
  this.deltaScheduler = new deltaScheduler_js_1.DeltaScheduler(this.innerDeltaManager, this, (0, internal_7.createChildLogger)({ logger: this.baseLogger, namespace: "DeltaScheduler" }));
920
847
  this.inboundBatchAggregator = new inboundBatchAggregator_js_1.InboundBatchAggregator(this.innerDeltaManager, () => this.clientId, (0, internal_7.createChildLogger)({ logger: this.baseLogger, namespace: "InboundBatchAggregator" }));
921
- const disablePartialFlush = this.mc.config.getBoolean("Fluid.ContainerRuntime.DisablePartialFlush");
922
848
  const legacySendBatchFn = (0, exports.makeLegacySendBatchFn)(submitFn, this.innerDeltaManager);
849
+ this.disableFlushBeforeProcess =
850
+ this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableFlushBeforeProcess") === true;
923
851
  this.outbox = new index_js_3.Outbox({
924
852
  shouldSend: () => this.canSendOps(),
925
853
  pendingStateManager: this.pendingStateManager,
@@ -930,16 +858,18 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
930
858
  config: {
931
859
  compressionOptions,
932
860
  maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,
933
- disablePartialFlush: disablePartialFlush === true,
861
+ // If we disable flush before process, we must be ready to flush partial batches
862
+ flushPartialBatches: this.disableFlushBeforeProcess,
934
863
  },
935
864
  logger: this.mc.logger,
936
865
  groupingManager: opGroupingManager,
937
866
  getCurrentSequenceNumbers: () => ({
867
+ // Note: These sequence numbers only change when DeltaManager processes an incoming op
938
868
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
939
869
  clientSequenceNumber: this._processedClientSequenceNumber,
940
870
  }),
941
871
  reSubmit: this.reSubmit.bind(this),
942
- opReentrancy: () => this.ensureNoDataModelChangesCalls > 0,
872
+ opReentrancy: () => this.dataModelChangeRunner.running,
943
873
  closeContainer: this.closeFn,
944
874
  });
945
875
  this._quorum = quorum;
@@ -986,10 +916,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
986
916
  const orderedClientElectionForSummarizer = new index_js_4.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_4.SummarizerClientElection.isClientEligible, this.mc.config.getBoolean("Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents"));
987
917
  this.summarizerClientElection = new index_js_4.SummarizerClientElection(orderedClientLogger, summaryCollection, orderedClientElectionForSummarizer, maxOpsSinceLastSummary);
988
918
  if (isSummarizerClient) {
989
- // eslint-disable-next-line import/no-deprecated
990
- this._summarizer = new index_js_4.Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection,
991
- // eslint-disable-next-line import/no-deprecated
992
- async (runtime) => index_js_4.RunWhileConnectedCoordinator.create(runtime,
919
+ this._summarizer = new index_js_4.Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection, async (runtime) => index_js_4.RunWhileConnectedCoordinator.create(runtime,
993
920
  // Summarization runs in summarizer client and needs access to the real (non-proxy) active
994
921
  // information. The proxy delta manager would always return false for summarizer client.
995
922
  () => this.innerDeltaManager.active));
@@ -1017,7 +944,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1017
944
  summaryCollection.on("default", defaultAction);
1018
945
  // Create the SummaryManager and mark the initial state
1019
946
  this.summaryManager = new index_js_4.SummaryManager(this.summarizerClientElection, this, // IConnectedState
1020
- summaryCollection, this.baseLogger, this.formCreateSummarizerFn(loader), new throttler_js_1.Throttler(60 * 1000, // 60 sec delay window
947
+ summaryCollection, this.baseLogger, (0, index_js_4.formCreateSummarizerFn)(loader), new throttler_js_1.Throttler(60 * 1000, // 60 sec delay window
1021
948
  30 * 1000, // 30 sec max delay
1022
949
  // throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)
1023
950
  (0, throttler_js_1.formExponentialFn)({ coefficient: 20, initialDelay: 0 })), {
@@ -1052,14 +979,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1052
979
  summaryFormatVersion: metadata?.summaryFormatVersion,
1053
980
  disableIsolatedChannels: metadata?.disableIsolatedChannels,
1054
981
  gcVersion: metadata?.gcFeature,
1055
- options: JSON.stringify(baseRuntimeOptions),
982
+ options: JSON.stringify(runtimeOptions),
1056
983
  idCompressorModeMetadata: metadata?.documentSchema?.runtime?.idCompressorMode,
1057
984
  idCompressorMode: this.sessionSchema.idCompressorMode,
1058
985
  sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
1059
986
  featureGates: JSON.stringify({
1060
987
  ...featureGatesForTelemetry,
1061
- disablePartialFlush,
1062
988
  closeSummarizerDelayOverride,
989
+ disableFlushBeforeProcess: this.disableFlushBeforeProcess,
1063
990
  }),
1064
991
  telemetryDocumentId: this.telemetryDocumentId,
1065
992
  groupedBatchingEnabled: this.groupedBatchingEnabled,
@@ -1077,7 +1004,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1077
1004
  // saved state, i.e. all the ops marked by Loader layer sa savedOp === true.
1078
1005
  this.skipSavedCompressorOps = pendingRuntimeState?.pendingIdCompressorState !== undefined;
1079
1006
  }
1080
- // eslint-disable-next-line import/no-deprecated
1081
1007
  onSchemaChange(schema) {
1082
1008
  this.mc.logger.sendTelemetryEvent({
1083
1009
  eventName: "SchemaChangeAccept",
@@ -1254,7 +1180,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1254
1180
  try {
1255
1181
  const parser = internal_6.RequestParser.create(request);
1256
1182
  const id = parser.pathParts[0];
1257
- if (id === summarizerRequestUrl && parser.pathParts.length === 1) {
1183
+ if (id === index_js_4.summarizerRequestUrl && parser.pathParts.length === 1) {
1258
1184
  if (this._summarizer !== undefined) {
1259
1185
  return {
1260
1186
  status: 200,
@@ -1288,13 +1214,11 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1288
1214
  }
1289
1215
  if (id === index_js_1.blobManagerBasePath && requestParser.isLeaf(2)) {
1290
1216
  const blob = await this.blobManager.getBlob(requestParser.pathParts[1]);
1291
- return blob
1292
- ? {
1293
- status: 200,
1294
- mimeType: "fluid/object",
1295
- value: blob,
1296
- }
1297
- : (0, internal_6.create404Response)(request);
1217
+ return {
1218
+ status: 200,
1219
+ mimeType: "fluid/object",
1220
+ value: blob,
1221
+ };
1298
1222
  }
1299
1223
  else if (requestParser.pathParts.length > 0) {
1300
1224
  return await this.channelCollection.request(request);
@@ -1325,7 +1249,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1325
1249
  const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(this.deltaManager.lastSequenceNumber);
1326
1250
  // Is document schema explicit control on?
1327
1251
  const explicitSchemaControl = documentSchema?.runtime.explicitSchemaControl;
1328
- // eslint-disable-next-line import/no-deprecated
1329
1252
  const metadata = {
1330
1253
  ...this.createContainerMetadata,
1331
1254
  // Increment the summary number for the next summary that will be generated.
@@ -1339,8 +1262,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1339
1262
  // last message's sequence number.
1340
1263
  // See also lastMessageFromMetadata()
1341
1264
  message: explicitSchemaControl
1342
- ? // eslint-disable-next-line import/no-deprecated
1343
- { sequenceNumber: -1 }
1265
+ ? { sequenceNumber: -1 }
1344
1266
  : message,
1345
1267
  lastMessage: explicitSchemaControl ? message : undefined,
1346
1268
  documentSchema,
@@ -1562,14 +1484,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1562
1484
  if (connected) {
1563
1485
  (0, internal_2.assert)(this.attachState === container_definitions_1.AttachState.Attached, 0x3cd /* Connection is possible only if container exists in storage */);
1564
1486
  if (changeOfState) {
1565
- this._signalTracking.signalsLost = 0;
1566
- this._signalTracking.signalsOutOfOrder = 0;
1567
- this._signalTracking.signalTimestamp = 0;
1568
- this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
1569
- this._signalTracking.totalSignalsSentInLatencyWindow = 0;
1570
- this._signalTracking.roundTripSignalSequenceNumber = undefined;
1571
- this._signalTracking.trackingSignalSequenceNumber = undefined;
1572
- this._signalTracking.minimumTrackingSignalSequenceNumber = undefined;
1487
+ this.signalTelemetryManager.resetTracking();
1573
1488
  }
1574
1489
  }
1575
1490
  // Fail while disconnected
@@ -1603,6 +1518,21 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1603
1518
  // spread operator above ensure we make a shallow copy of message, as the processing flow will modify it.
1604
1519
  // There might be multiple container instances receiving the same message.
1605
1520
  this.verifyNotClosed();
1521
+ if (!this.disableFlushBeforeProcess) {
1522
+ // Reference Sequence Number may be about to change, and it must be consistent across a batch, so flush now
1523
+ this.outbox.flush();
1524
+ }
1525
+ this.ensureNoDataModelChanges(() => {
1526
+ this.processInboundMessageOrBatch(messageCopy, local);
1527
+ });
1528
+ }
1529
+ /**
1530
+ * Implementation of core logic for {@link ContainerRuntime.process}, once preconditions are established
1531
+ *
1532
+ * @param messageCopy - Shallow copy of the sequenced message. If it's a virtualized batch, we'll process
1533
+ * all messages in the batch here.
1534
+ */
1535
+ processInboundMessageOrBatch(messageCopy, local) {
1606
1536
  // Whether or not the message appears to be a runtime message from an up-to-date client.
1607
1537
  // It may be a legacy runtime message (ie already unpacked and ContainerMessageType)
1608
1538
  // or something different, like a system message.
@@ -1711,9 +1641,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1711
1641
  try {
1712
1642
  if (!runtimeBatch) {
1713
1643
  for (const { message } of messagesWithMetadata) {
1714
- this.ensureNoDataModelChanges(() => {
1715
- this.observeNonRuntimeMessage(message);
1716
- });
1644
+ this.observeNonRuntimeMessage(message);
1717
1645
  }
1718
1646
  return;
1719
1647
  }
@@ -1733,29 +1661,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1733
1661
  if (!groupedBatch) {
1734
1662
  for (const { message, localOpMetadata } of messagesWithMetadata) {
1735
1663
  updateSequenceNumbers(message);
1736
- this.ensureNoDataModelChanges(() => {
1737
- this.validateAndProcessRuntimeMessages(message, [
1738
- {
1739
- contents: message.contents,
1740
- localOpMetadata,
1741
- clientSequenceNumber: message.clientSequenceNumber,
1742
- },
1743
- ], local, savedOp);
1744
- this.emit("op", message, true /* runtimeMessage */);
1745
- });
1664
+ this.validateAndProcessRuntimeMessages(message, [
1665
+ {
1666
+ contents: message.contents,
1667
+ localOpMetadata,
1668
+ clientSequenceNumber: message.clientSequenceNumber,
1669
+ },
1670
+ ], local, savedOp);
1671
+ this.emit("op", message, true /* runtimeMessage */);
1746
1672
  }
1747
1673
  return;
1748
1674
  }
1749
1675
  let bunchedMessagesContent = [];
1750
1676
  let previousMessage;
1751
1677
  // Process the previous bunch of messages.
1752
- const sendBunchedMessages = () => {
1678
+ const processBunchedMessages = () => {
1753
1679
  (0, internal_2.assert)(previousMessage !== undefined, 0xa67 /* previous message must exist */);
1754
- this.ensureNoDataModelChanges(() => {
1755
- this.validateAndProcessRuntimeMessages(
1756
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1757
- previousMessage, bunchedMessagesContent, local, savedOp);
1758
- });
1680
+ this.validateAndProcessRuntimeMessages(previousMessage, bunchedMessagesContent, local, savedOp);
1759
1681
  bunchedMessagesContent = [];
1760
1682
  };
1761
1683
  /**
@@ -1766,7 +1688,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1766
1688
  for (const { message, localOpMetadata } of messagesWithMetadata) {
1767
1689
  const currentMessage = updateSequenceNumbers(message);
1768
1690
  if (previousMessage && previousMessage.type !== currentMessage.type) {
1769
- sendBunchedMessages();
1691
+ processBunchedMessages();
1770
1692
  }
1771
1693
  previousMessage = currentMessage;
1772
1694
  bunchedMessagesContent.push({
@@ -1776,7 +1698,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1776
1698
  });
1777
1699
  }
1778
1700
  // Process the last bunch of messages.
1779
- sendBunchedMessages();
1701
+ processBunchedMessages();
1780
1702
  // Send the "op" events for the messages now that the ops have been processed.
1781
1703
  for (const { message } of messagesWithMetadata) {
1782
1704
  this.emit("op", message, true /* runtimeMessage */);
@@ -1868,9 +1790,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1868
1790
  break;
1869
1791
  }
1870
1792
  case messageTypes_js_1.ContainerMessageType.DocumentSchemaChange: {
1871
- this.documentsSchemaController.processDocumentSchemaMessages(
1872
- // eslint-disable-next-line import/no-deprecated
1873
- contents, local, message.sequenceNumber);
1793
+ this.documentsSchemaController.processDocumentSchemaMessages(contents, local, message.sequenceNumber);
1874
1794
  break;
1875
1795
  }
1876
1796
  default: {
@@ -1900,90 +1820,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1900
1820
  }
1901
1821
  }
1902
1822
  }
1903
- /**
1904
- * Emits the Signal event and update the perf signal data.
1905
- */
1906
- sendSignalTelemetryEvent() {
1907
- const duration = Date.now() - this._signalTracking.signalTimestamp;
1908
- this.mc.logger.sendPerformanceEvent({
1909
- eventName: "SignalLatency",
1910
- details: {
1911
- duration, // Roundtrip duration of the tracked signal in milliseconds.
1912
- sent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
1913
- lost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
1914
- outOfOrder: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
1915
- reconnectCount: this.consecutiveReconnects, // Container reconnect count.
1916
- },
1917
- });
1918
- this._signalTracking.signalsLost = 0;
1919
- this._signalTracking.signalsOutOfOrder = 0;
1920
- this._signalTracking.signalTimestamp = 0;
1921
- this._signalTracking.totalSignalsSentInLatencyWindow = 0;
1922
- }
1923
- /**
1924
- * Updates signal telemetry including emitting telemetry events.
1925
- */
1926
- processSignalForTelemetry(envelope) {
1927
- const { clientBroadcastSignalSequenceNumber, contents: envelopeContents, address: envelopeAddress, } = envelope;
1928
- if (clientBroadcastSignalSequenceNumber === undefined) {
1929
- return;
1930
- }
1931
- if (this._signalTracking.trackingSignalSequenceNumber === undefined ||
1932
- this._signalTracking.minimumTrackingSignalSequenceNumber === undefined) {
1933
- return;
1934
- }
1935
- if (clientBroadcastSignalSequenceNumber >= this._signalTracking.trackingSignalSequenceNumber) {
1936
- // Calculate the number of signals lost and log the event.
1937
- const signalsLost = clientBroadcastSignalSequenceNumber -
1938
- this._signalTracking.trackingSignalSequenceNumber;
1939
- if (signalsLost > 0) {
1940
- this._signalTracking.signalsLost += signalsLost;
1941
- this.mc.logger.sendErrorEvent({
1942
- eventName: "SignalLost",
1943
- details: {
1944
- signalsLost, // Number of lost signals detected.
1945
- expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1946
- clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
1947
- },
1948
- });
1949
- }
1950
- // Update the tracking signal sequence number to the next expected signal in the sequence.
1951
- this._signalTracking.trackingSignalSequenceNumber =
1952
- clientBroadcastSignalSequenceNumber + 1;
1953
- }
1954
- else if (
1955
- // Check if this is a signal in range of interest.
1956
- clientBroadcastSignalSequenceNumber >=
1957
- this._signalTracking.minimumTrackingSignalSequenceNumber) {
1958
- this._signalTracking.signalsOutOfOrder++;
1959
- const details = {
1960
- expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1961
- clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
1962
- };
1963
- // Only log `contents.type` when address is for container to avoid
1964
- // chance that contents type is customer data.
1965
- if (envelopeAddress === undefined) {
1966
- details.contentsType = envelopeContents.type; // Type of signal that was received out of order.
1967
- }
1968
- this.mc.logger.sendTelemetryEvent({
1969
- eventName: "SignalOutOfOrder",
1970
- details,
1971
- });
1972
- }
1973
- if (this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
1974
- clientBroadcastSignalSequenceNumber >= this._signalTracking.roundTripSignalSequenceNumber) {
1975
- if (clientBroadcastSignalSequenceNumber ===
1976
- this._signalTracking.roundTripSignalSequenceNumber) {
1977
- // Latency tracked signal has been received.
1978
- // We now log the roundtrip duration of the tracked signal.
1979
- // This telemetry event also logs metrics for broadcast signals
1980
- // sent, lost, and out of order.
1981
- // These metrics are reset after logging the telemetry event.
1982
- this.sendSignalTelemetryEvent();
1983
- }
1984
- this._signalTracking.roundTripSignalSequenceNumber = undefined;
1985
- }
1986
- }
1987
1823
  processSignal(message, local) {
1988
1824
  const envelope = message.content;
1989
1825
  const transformed = {
@@ -1994,7 +1830,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1994
1830
  };
1995
1831
  // Only collect signal telemetry for broadcast messages sent by the current client.
1996
1832
  if (message.clientId === this.clientId) {
1997
- this.processSignalForTelemetry(envelope);
1833
+ this.signalTelemetryManager.trackReceivedSignal(envelope, this.mc.logger, this.consecutiveReconnects);
1998
1834
  }
1999
1835
  if (envelope.address === undefined) {
2000
1836
  // No address indicates a container signal message.
@@ -2018,7 +1854,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2018
1854
  * with the given Batch ID, which must be preserved
2019
1855
  */
2020
1856
  flush(resubmittingBatchId) {
2021
- (0, internal_2.assert)(this._orderSequentiallyCalls === 0, 0x24c /* "Cannot call `flush()` from `orderSequentially`'s callback" */);
1857
+ (0, internal_2.assert)(!this.batchRunner.running, 0x24c /* "Cannot call `flush()` while manually accumulating a batch (e.g. under orderSequentially) */);
2022
1858
  this.outbox.flush(resubmittingBatchId);
2023
1859
  (0, internal_2.assert)(this.outbox.isEmpty, 0x3cf /* reentrancy */);
2024
1860
  }
@@ -2027,43 +1863,45 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2027
1863
  */
2028
1864
  orderSequentially(callback) {
2029
1865
  let checkpoint;
2030
- let result;
1866
+ const checkpointDirtyState = this.dirtyContainer;
2031
1867
  if (this.mc.config.getBoolean("Fluid.ContainerRuntime.EnableRollback")) {
2032
1868
  // Note: we are not touching any batches other than mainBatch here, for two reasons:
2033
1869
  // 1. It would not help, as other batches are flushed independently from main batch.
2034
1870
  // 2. There is no way to undo process of data store creation, blob creation, ID compressor ops, or other things tracked by other batches.
2035
1871
  checkpoint = this.outbox.getBatchCheckpoints().mainBatch;
2036
1872
  }
2037
- try {
2038
- this._orderSequentiallyCalls++;
2039
- result = callback();
2040
- }
2041
- catch (error) {
2042
- if (checkpoint) {
2043
- // This will throw and close the container if rollback fails
2044
- try {
2045
- checkpoint.rollback((message) => this.rollback(message.contents, message.localOpMetadata));
1873
+ const result = this.batchRunner.run(() => {
1874
+ try {
1875
+ return callback();
1876
+ }
1877
+ catch (error) {
1878
+ if (checkpoint) {
1879
+ // This will throw and close the container if rollback fails
1880
+ try {
1881
+ checkpoint.rollback((message) => this.rollback(message.contents, message.localOpMetadata));
1882
+ // reset the dirty state after rollback to what it was before to keep it consistent
1883
+ if (this.dirtyContainer !== checkpointDirtyState) {
1884
+ this.updateDocumentDirtyState(checkpointDirtyState);
1885
+ }
1886
+ }
1887
+ catch (error_) {
1888
+ const error2 = (0, internal_7.wrapError)(error_, (message) => {
1889
+ return internal_7.DataProcessingError.create(`RollbackError: ${message}`, "checkpointRollback", undefined);
1890
+ });
1891
+ this.closeFn(error2);
1892
+ throw error2;
1893
+ }
2046
1894
  }
2047
- catch (error_) {
2048
- const error2 = (0, internal_7.wrapError)(error_, (message) => {
2049
- return internal_7.DataProcessingError.create(`RollbackError: ${message}`, "checkpointRollback", undefined);
2050
- });
2051
- this.closeFn(error2);
2052
- throw error2;
1895
+ else {
1896
+ this.closeFn((0, internal_7.wrapError)(error, (errorMessage) => new internal_7.GenericError(`orderSequentially callback exception: ${errorMessage}`, error, {
1897
+ orderSequentiallyCalls: this.batchRunner.runs,
1898
+ })));
2053
1899
  }
1900
+ throw error; // throw the original error for the consumer of the runtime
2054
1901
  }
2055
- else {
2056
- this.closeFn((0, internal_7.wrapError)(error, (errorMessage) => new internal_7.GenericError(`orderSequentially callback exception: ${errorMessage}`, error, {
2057
- orderSequentiallyCalls: this._orderSequentiallyCalls,
2058
- })));
2059
- }
2060
- throw error; // throw the original error for the consumer of the runtime
2061
- }
2062
- finally {
2063
- this._orderSequentiallyCalls--;
2064
- }
1902
+ });
2065
1903
  // We don't flush on TurnBased since we expect all messages in the same JS turn to be part of the same batch
2066
- if (this.flushMode !== internal_5.FlushMode.TurnBased && this._orderSequentiallyCalls === 0) {
1904
+ if (this.flushMode !== internal_5.FlushMode.TurnBased && !this.batchRunner.running) {
2067
1905
  this.flush();
2068
1906
  }
2069
1907
  return result;
@@ -2118,7 +1956,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2118
1956
  * Typically ops are batched and later flushed together, but in some cases we want to flush immediately.
2119
1957
  */
2120
1958
  currentlyBatching() {
2121
- return this.flushMode !== internal_5.FlushMode.Immediate || this._orderSequentiallyCalls !== 0;
1959
+ return this.flushMode !== internal_5.FlushMode.Immediate || this.batchRunner.running;
2122
1960
  }
2123
1961
  getQuorum() {
2124
1962
  return this._quorum;
@@ -2162,43 +2000,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2162
2000
  }
2163
2001
  return true;
2164
2002
  }
2165
- createNewSignalEnvelope(address, type, content) {
2166
- const newEnvelope = {
2167
- address,
2168
- contents: { type, content },
2169
- };
2170
- return newEnvelope;
2171
- }
2172
- submitEnvelopedSignal(envelope, targetClientId) {
2173
- const isBroadcastSignal = targetClientId === undefined;
2174
- if (isBroadcastSignal) {
2175
- const clientBroadcastSignalSequenceNumber = ++this._signalTracking
2176
- .broadcastSignalSequenceNumber;
2177
- // Stamp with the broadcast signal sequence number.
2178
- envelope.clientBroadcastSignalSequenceNumber = clientBroadcastSignalSequenceNumber;
2179
- this._signalTracking.signalsSentSinceLastLatencyMeasurement++;
2180
- if (this._signalTracking.minimumTrackingSignalSequenceNumber === undefined ||
2181
- this._signalTracking.trackingSignalSequenceNumber === undefined) {
2182
- // Signal monitoring window is undefined
2183
- // Initialize tracking to expect the next signal sent by the connected client.
2184
- this._signalTracking.minimumTrackingSignalSequenceNumber =
2185
- clientBroadcastSignalSequenceNumber;
2186
- this._signalTracking.trackingSignalSequenceNumber =
2187
- clientBroadcastSignalSequenceNumber;
2188
- }
2189
- // We should not track the round trip of a new signal in the case we are already tracking one.
2190
- if (clientBroadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1 &&
2191
- this._signalTracking.roundTripSignalSequenceNumber === undefined) {
2192
- this._signalTracking.signalTimestamp = Date.now();
2193
- this._signalTracking.roundTripSignalSequenceNumber =
2194
- clientBroadcastSignalSequenceNumber;
2195
- this._signalTracking.totalSignalsSentInLatencyWindow +=
2196
- this._signalTracking.signalsSentSinceLastLatencyMeasurement;
2197
- this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
2198
- }
2199
- }
2200
- this.submitSignalFn(envelope, targetClientId);
2201
- }
2202
2003
  /**
2203
2004
  * Submits the signal to be sent to other clients.
2204
2005
  * @param type - Type of the signal.
@@ -2213,8 +2014,11 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2213
2014
  */
2214
2015
  submitSignal(type, content, targetClientId) {
2215
2016
  this.verifyNotClosed();
2216
- const envelope = this.createNewSignalEnvelope(undefined /* address */, type, content);
2217
- return this.submitEnvelopedSignal(envelope, targetClientId);
2017
+ const envelope = createNewSignalEnvelope(undefined /* address */, type, content);
2018
+ if (targetClientId === undefined) {
2019
+ this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope);
2020
+ }
2021
+ this.submitSignalFn(envelope, targetClientId);
2218
2022
  }
2219
2023
  setAttachState(attachState) {
2220
2024
  if (attachState === container_definitions_1.AttachState.Attaching) {
@@ -2368,13 +2172,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2368
2172
  * Returns the type of the GC node. Currently, there are nodes that belong to the root ("/"), data stores or
2369
2173
  * blob manager.
2370
2174
  */
2371
- // eslint-disable-next-line import/no-deprecated
2372
2175
  getNodeType(nodePath) {
2373
2176
  if ((0, index_js_1.isBlobPath)(nodePath)) {
2374
- // eslint-disable-next-line import/no-deprecated
2375
2177
  return index_js_2.GCNodeType.Blob;
2376
2178
  }
2377
- // eslint-disable-next-line import/no-deprecated
2378
2179
  return this.channelCollection.getGCNodeType(nodePath) ?? index_js_2.GCNodeType.Other;
2379
2180
  }
2380
2181
  /**
@@ -2388,13 +2189,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2388
2189
  return ["_gcRoot"];
2389
2190
  }
2390
2191
  switch (this.getNodeType(nodePath)) {
2391
- // eslint-disable-next-line import/no-deprecated
2392
2192
  case index_js_2.GCNodeType.Blob: {
2393
2193
  return [index_js_1.blobManagerBasePath];
2394
2194
  }
2395
- // eslint-disable-next-line import/no-deprecated
2396
2195
  case index_js_2.GCNodeType.DataStore:
2397
- // eslint-disable-next-line import/no-deprecated
2398
2196
  case index_js_2.GCNodeType.SubDataStore: {
2399
2197
  return this.channelCollection.getDataStorePackagePath(nodePath);
2400
2198
  }
@@ -2462,7 +2260,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2462
2260
  * op processing, updating SummarizerNode state tracking, and garbage collection.
2463
2261
  * @param options - options controlling how the summary is generated or submitted
2464
2262
  */
2465
- // eslint-disable-next-line import/no-deprecated
2466
2263
  async submitSummary(options) {
2467
2264
  const { cancellationToken, fullTree = false, finalAttempt = false, summaryLogger, latestSummaryRefSeqNum, } = options;
2468
2265
  // The summary number for this summary. This will be updated during the summary process, so get it now and
@@ -2951,7 +2748,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2951
2748
  break;
2952
2749
  }
2953
2750
  default: {
2954
- (0, internal_2.assert)(this._orderSequentiallyCalls > 0, 0x587 /* Unreachable unless running under orderSequentially */);
2751
+ (0, internal_2.assert)(this.batchRunner.running, 0x587 /* Unreachable unless manually accumulating a batch */);
2955
2752
  break;
2956
2753
  }
2957
2754
  }
@@ -2979,7 +2776,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
2979
2776
  * for correlation to detect container forking.
2980
2777
  */
2981
2778
  reSubmitBatch(batch, batchId) {
2982
- this.orderSequentially(() => {
2779
+ this.batchRunner.run(() => {
2983
2780
  for (const message of batch) {
2984
2781
  this.reSubmit(message);
2985
2782
  }
@@ -3064,7 +2861,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
3064
2861
  /**
3065
2862
  * Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck
3066
2863
  */
3067
- // eslint-disable-next-line import/no-deprecated
3068
2864
  async refreshLatestSummaryAck(options) {
3069
2865
  const { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;
3070
2866
  // proposalHandle is always passed from RunningSummarizer.
@@ -3161,8 +2957,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
3161
2957
  }
3162
2958
  getPendingLocalState(props) {
3163
2959
  this.verifyNotClosed();
3164
- if (this._orderSequentiallyCalls !== 0) {
3165
- throw new internal_7.UsageError("can't get state during orderSequentially");
2960
+ if (this.batchRunner.running) {
2961
+ throw new internal_7.UsageError("can't get state while manually accumulating a batch");
3166
2962
  }
3167
2963
  this.imminentClosure ||= props?.notifyImminentClosure ?? false;
3168
2964
  const getSyncState = (pendingAttachmentBlobs) => {
@@ -3223,28 +3019,17 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
3223
3019
  return this.summaryManager.enqueueSummarize(options);
3224
3020
  }
3225
3021
  }
3226
- /**
3227
- * Forms a function that will create and retrieve a Summarizer.
3228
- */
3229
- formCreateSummarizerFn(loader) {
3230
- return async () => {
3231
- return createSummarizer(loader, `/${summarizerRequestUrl}`);
3232
- };
3233
- }
3234
- validateSummaryHeuristicConfiguration(configuration) {
3235
- // eslint-disable-next-line no-restricted-syntax
3236
- for (const prop in configuration) {
3237
- if (typeof configuration[prop] === "number" && configuration[prop] < 0) {
3238
- throw new internal_7.UsageError(`Summary heuristic configuration property "${prop}" cannot be less than 0`);
3239
- }
3240
- }
3241
- if (configuration.minIdleTime > configuration.maxIdleTime) {
3242
- throw new internal_7.UsageError(`"minIdleTime" [${configuration.minIdleTime}] cannot be greater than "maxIdleTime" [${configuration.maxIdleTime}]`);
3243
- }
3244
- }
3245
3022
  get groupedBatchingEnabled() {
3246
3023
  return this.sessionSchema.opGroupingEnabled === true;
3247
3024
  }
3248
3025
  }
3249
3026
  exports.ContainerRuntime = ContainerRuntime;
3027
+ function createNewSignalEnvelope(address, type, content) {
3028
+ const newEnvelope = {
3029
+ address,
3030
+ contents: { type, content },
3031
+ };
3032
+ return newEnvelope;
3033
+ }
3034
+ exports.createNewSignalEnvelope = createNewSignalEnvelope;
3250
3035
  //# sourceMappingURL=containerRuntime.js.map