@fluidframework/container-runtime 2.0.0-internal.3.0.5 → 2.0.0-internal.3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.eslintrc.js +19 -19
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +2 -1
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +9 -2
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +80 -33
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +11 -9
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerHandleContext.d.ts.map +1 -1
  15. package/dist/containerHandleContext.js +3 -1
  16. package/dist/containerHandleContext.js.map +1 -1
  17. package/dist/containerRuntime.d.ts +11 -1
  18. package/dist/containerRuntime.d.ts.map +1 -1
  19. package/dist/containerRuntime.js +116 -72
  20. package/dist/containerRuntime.js.map +1 -1
  21. package/dist/dataStore.d.ts.map +1 -1
  22. package/dist/dataStore.js +11 -9
  23. package/dist/dataStore.js.map +1 -1
  24. package/dist/dataStoreContext.d.ts +18 -13
  25. package/dist/dataStoreContext.d.ts.map +1 -1
  26. package/dist/dataStoreContext.js +68 -55
  27. package/dist/dataStoreContext.js.map +1 -1
  28. package/dist/dataStoreContexts.d.ts.map +1 -1
  29. package/dist/dataStoreContexts.js +7 -3
  30. package/dist/dataStoreContexts.js.map +1 -1
  31. package/dist/dataStoreRegistry.d.ts.map +1 -1
  32. package/dist/dataStoreRegistry.js +3 -1
  33. package/dist/dataStoreRegistry.js.map +1 -1
  34. package/dist/dataStores.d.ts +26 -1
  35. package/dist/dataStores.d.ts.map +1 -1
  36. package/dist/dataStores.js +103 -18
  37. package/dist/dataStores.js.map +1 -1
  38. package/dist/deltaScheduler.d.ts.map +1 -1
  39. package/dist/deltaScheduler.js +8 -3
  40. package/dist/deltaScheduler.js.map +1 -1
  41. package/dist/garbageCollection.d.ts +33 -14
  42. package/dist/garbageCollection.d.ts.map +1 -1
  43. package/dist/garbageCollection.js +178 -92
  44. package/dist/garbageCollection.js.map +1 -1
  45. package/dist/garbageCollectionConstants.d.ts +1 -0
  46. package/dist/garbageCollectionConstants.d.ts.map +1 -1
  47. package/dist/garbageCollectionConstants.js +4 -1
  48. package/dist/garbageCollectionConstants.js.map +1 -1
  49. package/dist/garbageCollectionHelpers.d.ts +26 -0
  50. package/dist/garbageCollectionHelpers.d.ts.map +1 -0
  51. package/dist/garbageCollectionHelpers.js +45 -0
  52. package/dist/garbageCollectionHelpers.js.map +1 -0
  53. package/dist/gcSweepReadyUsageDetection.d.ts +5 -5
  54. package/dist/gcSweepReadyUsageDetection.d.ts.map +1 -1
  55. package/dist/gcSweepReadyUsageDetection.js +14 -10
  56. package/dist/gcSweepReadyUsageDetection.js.map +1 -1
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/opLifecycle/batchManager.d.ts +5 -5
  61. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  62. package/dist/opLifecycle/batchManager.js +19 -12
  63. package/dist/opLifecycle/batchManager.js.map +1 -1
  64. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  65. package/dist/opLifecycle/definitions.js.map +1 -1
  66. package/dist/opLifecycle/index.d.ts.map +1 -1
  67. package/dist/opLifecycle/index.js.map +1 -1
  68. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  69. package/dist/opLifecycle/opCompressor.js.map +1 -1
  70. package/dist/opLifecycle/opDecompressor.d.ts +0 -4
  71. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  72. package/dist/opLifecycle/opDecompressor.js +7 -43
  73. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  74. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  75. package/dist/opLifecycle/opSplitter.js +4 -1
  76. package/dist/opLifecycle/opSplitter.js.map +1 -1
  77. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  78. package/dist/opLifecycle/outbox.js +20 -19
  79. package/dist/opLifecycle/outbox.js.map +1 -1
  80. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  81. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  82. package/dist/opProperties.d.ts.map +1 -1
  83. package/dist/opProperties.js +1 -3
  84. package/dist/opProperties.js.map +1 -1
  85. package/dist/orderedClientElection.d.ts.map +1 -1
  86. package/dist/orderedClientElection.js +10 -4
  87. package/dist/orderedClientElection.js.map +1 -1
  88. package/dist/packageVersion.d.ts +1 -1
  89. package/dist/packageVersion.js +1 -1
  90. package/dist/packageVersion.js.map +1 -1
  91. package/dist/pendingStateManager.d.ts +7 -0
  92. package/dist/pendingStateManager.d.ts.map +1 -1
  93. package/dist/pendingStateManager.js +7 -4
  94. package/dist/pendingStateManager.js.map +1 -1
  95. package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
  96. package/dist/runWhileConnectedCoordinator.js.map +1 -1
  97. package/dist/runningSummarizer.d.ts.map +1 -1
  98. package/dist/runningSummarizer.js +34 -21
  99. package/dist/runningSummarizer.js.map +1 -1
  100. package/dist/scheduleManager.d.ts.map +1 -1
  101. package/dist/scheduleManager.js +3 -2
  102. package/dist/scheduleManager.js.map +1 -1
  103. package/dist/serializedSnapshotStorage.d.ts +2 -2
  104. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  105. package/dist/serializedSnapshotStorage.js +5 -3
  106. package/dist/serializedSnapshotStorage.js.map +1 -1
  107. package/dist/summarizer.d.ts +2 -2
  108. package/dist/summarizer.d.ts.map +1 -1
  109. package/dist/summarizer.js +37 -17
  110. package/dist/summarizer.js.map +1 -1
  111. package/dist/summarizerClientElection.d.ts.map +1 -1
  112. package/dist/summarizerClientElection.js.map +1 -1
  113. package/dist/summarizerHandle.d.ts.map +1 -1
  114. package/dist/summarizerHandle.js.map +1 -1
  115. package/dist/summarizerHeuristics.d.ts.map +1 -1
  116. package/dist/summarizerHeuristics.js +6 -9
  117. package/dist/summarizerHeuristics.js.map +1 -1
  118. package/dist/summarizerTypes.d.ts +21 -21
  119. package/dist/summarizerTypes.d.ts.map +1 -1
  120. package/dist/summarizerTypes.js.map +1 -1
  121. package/dist/summaryCollection.d.ts.map +1 -1
  122. package/dist/summaryCollection.js +18 -8
  123. package/dist/summaryCollection.js.map +1 -1
  124. package/dist/summaryFormat.d.ts +5 -2
  125. package/dist/summaryFormat.d.ts.map +1 -1
  126. package/dist/summaryFormat.js +18 -10
  127. package/dist/summaryFormat.js.map +1 -1
  128. package/dist/summaryGenerator.d.ts.map +1 -1
  129. package/dist/summaryGenerator.js +35 -16
  130. package/dist/summaryGenerator.js.map +1 -1
  131. package/dist/summaryManager.d.ts.map +1 -1
  132. package/dist/summaryManager.js +21 -9
  133. package/dist/summaryManager.js.map +1 -1
  134. package/dist/throttler.d.ts +2 -2
  135. package/dist/throttler.d.ts.map +1 -1
  136. package/dist/throttler.js +4 -4
  137. package/dist/throttler.js.map +1 -1
  138. package/garbageCollection.md +15 -2
  139. package/lib/batchTracker.d.ts.map +1 -1
  140. package/lib/batchTracker.js +2 -1
  141. package/lib/batchTracker.js.map +1 -1
  142. package/lib/blobManager.d.ts +9 -2
  143. package/lib/blobManager.d.ts.map +1 -1
  144. package/lib/blobManager.js +82 -35
  145. package/lib/blobManager.js.map +1 -1
  146. package/lib/connectionTelemetry.d.ts.map +1 -1
  147. package/lib/connectionTelemetry.js +11 -9
  148. package/lib/connectionTelemetry.js.map +1 -1
  149. package/lib/containerHandleContext.d.ts.map +1 -1
  150. package/lib/containerHandleContext.js +3 -1
  151. package/lib/containerHandleContext.js.map +1 -1
  152. package/lib/containerRuntime.d.ts +11 -1
  153. package/lib/containerRuntime.d.ts.map +1 -1
  154. package/lib/containerRuntime.js +122 -78
  155. package/lib/containerRuntime.js.map +1 -1
  156. package/lib/dataStore.d.ts.map +1 -1
  157. package/lib/dataStore.js +11 -9
  158. package/lib/dataStore.js.map +1 -1
  159. package/lib/dataStoreContext.d.ts +18 -13
  160. package/lib/dataStoreContext.d.ts.map +1 -1
  161. package/lib/dataStoreContext.js +71 -58
  162. package/lib/dataStoreContext.js.map +1 -1
  163. package/lib/dataStoreContexts.d.ts.map +1 -1
  164. package/lib/dataStoreContexts.js +7 -3
  165. package/lib/dataStoreContexts.js.map +1 -1
  166. package/lib/dataStoreRegistry.d.ts.map +1 -1
  167. package/lib/dataStoreRegistry.js +3 -1
  168. package/lib/dataStoreRegistry.js.map +1 -1
  169. package/lib/dataStores.d.ts +26 -1
  170. package/lib/dataStores.d.ts.map +1 -1
  171. package/lib/dataStores.js +109 -24
  172. package/lib/dataStores.js.map +1 -1
  173. package/lib/deltaScheduler.d.ts.map +1 -1
  174. package/lib/deltaScheduler.js +9 -4
  175. package/lib/deltaScheduler.js.map +1 -1
  176. package/lib/garbageCollection.d.ts +33 -14
  177. package/lib/garbageCollection.d.ts.map +1 -1
  178. package/lib/garbageCollection.js +180 -94
  179. package/lib/garbageCollection.js.map +1 -1
  180. package/lib/garbageCollectionConstants.d.ts +1 -0
  181. package/lib/garbageCollectionConstants.d.ts.map +1 -1
  182. package/lib/garbageCollectionConstants.js +3 -0
  183. package/lib/garbageCollectionConstants.js.map +1 -1
  184. package/lib/garbageCollectionHelpers.d.ts +26 -0
  185. package/lib/garbageCollectionHelpers.d.ts.map +1 -0
  186. package/lib/garbageCollectionHelpers.js +40 -0
  187. package/lib/garbageCollectionHelpers.js.map +1 -0
  188. package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
  189. package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
  190. package/lib/gcSweepReadyUsageDetection.js +14 -10
  191. package/lib/gcSweepReadyUsageDetection.js.map +1 -1
  192. package/lib/index.d.ts +2 -2
  193. package/lib/index.d.ts.map +1 -1
  194. package/lib/index.js +1 -1
  195. package/lib/index.js.map +1 -1
  196. package/lib/opLifecycle/batchManager.d.ts +5 -5
  197. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  198. package/lib/opLifecycle/batchManager.js +19 -12
  199. package/lib/opLifecycle/batchManager.js.map +1 -1
  200. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  201. package/lib/opLifecycle/definitions.js.map +1 -1
  202. package/lib/opLifecycle/index.d.ts.map +1 -1
  203. package/lib/opLifecycle/index.js.map +1 -1
  204. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  205. package/lib/opLifecycle/opCompressor.js.map +1 -1
  206. package/lib/opLifecycle/opDecompressor.d.ts +0 -4
  207. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  208. package/lib/opLifecycle/opDecompressor.js +7 -43
  209. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  210. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  211. package/lib/opLifecycle/opSplitter.js +5 -2
  212. package/lib/opLifecycle/opSplitter.js.map +1 -1
  213. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  214. package/lib/opLifecycle/outbox.js +20 -19
  215. package/lib/opLifecycle/outbox.js.map +1 -1
  216. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  217. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  218. package/lib/opProperties.d.ts.map +1 -1
  219. package/lib/opProperties.js +1 -3
  220. package/lib/opProperties.js.map +1 -1
  221. package/lib/orderedClientElection.d.ts.map +1 -1
  222. package/lib/orderedClientElection.js +10 -4
  223. package/lib/orderedClientElection.js.map +1 -1
  224. package/lib/packageVersion.d.ts +1 -1
  225. package/lib/packageVersion.js +1 -1
  226. package/lib/packageVersion.js.map +1 -1
  227. package/lib/pendingStateManager.d.ts +7 -0
  228. package/lib/pendingStateManager.d.ts.map +1 -1
  229. package/lib/pendingStateManager.js +7 -4
  230. package/lib/pendingStateManager.js.map +1 -1
  231. package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
  232. package/lib/runWhileConnectedCoordinator.js.map +1 -1
  233. package/lib/runningSummarizer.d.ts.map +1 -1
  234. package/lib/runningSummarizer.js +35 -22
  235. package/lib/runningSummarizer.js.map +1 -1
  236. package/lib/scheduleManager.d.ts.map +1 -1
  237. package/lib/scheduleManager.js +3 -2
  238. package/lib/scheduleManager.js.map +1 -1
  239. package/lib/serializedSnapshotStorage.d.ts +2 -2
  240. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  241. package/lib/serializedSnapshotStorage.js +5 -3
  242. package/lib/serializedSnapshotStorage.js.map +1 -1
  243. package/lib/summarizer.d.ts +2 -2
  244. package/lib/summarizer.d.ts.map +1 -1
  245. package/lib/summarizer.js +37 -17
  246. package/lib/summarizer.js.map +1 -1
  247. package/lib/summarizerClientElection.d.ts.map +1 -1
  248. package/lib/summarizerClientElection.js.map +1 -1
  249. package/lib/summarizerHandle.d.ts.map +1 -1
  250. package/lib/summarizerHandle.js.map +1 -1
  251. package/lib/summarizerHeuristics.d.ts.map +1 -1
  252. package/lib/summarizerHeuristics.js +6 -9
  253. package/lib/summarizerHeuristics.js.map +1 -1
  254. package/lib/summarizerTypes.d.ts +21 -21
  255. package/lib/summarizerTypes.d.ts.map +1 -1
  256. package/lib/summarizerTypes.js.map +1 -1
  257. package/lib/summaryCollection.d.ts.map +1 -1
  258. package/lib/summaryCollection.js +18 -8
  259. package/lib/summaryCollection.js.map +1 -1
  260. package/lib/summaryFormat.d.ts +5 -2
  261. package/lib/summaryFormat.d.ts.map +1 -1
  262. package/lib/summaryFormat.js +20 -12
  263. package/lib/summaryFormat.js.map +1 -1
  264. package/lib/summaryGenerator.d.ts.map +1 -1
  265. package/lib/summaryGenerator.js +35 -16
  266. package/lib/summaryGenerator.js.map +1 -1
  267. package/lib/summaryManager.d.ts.map +1 -1
  268. package/lib/summaryManager.js +21 -9
  269. package/lib/summaryManager.js.map +1 -1
  270. package/lib/throttler.d.ts +2 -2
  271. package/lib/throttler.d.ts.map +1 -1
  272. package/lib/throttler.js +4 -4
  273. package/lib/throttler.js.map +1 -1
  274. package/package.json +121 -115
  275. package/prettier.config.cjs +1 -1
  276. package/src/batchTracker.ts +54 -49
  277. package/src/blobManager.ts +793 -672
  278. package/src/connectionTelemetry.ts +280 -249
  279. package/src/containerHandleContext.ts +27 -29
  280. package/src/containerRuntime.ts +3168 -2988
  281. package/src/dataStore.ts +172 -159
  282. package/src/dataStoreContext.ts +1098 -1055
  283. package/src/dataStoreContexts.ts +178 -161
  284. package/src/dataStoreRegistry.ts +25 -20
  285. package/src/dataStores.ts +884 -728
  286. package/src/deltaScheduler.ts +158 -150
  287. package/src/garbageCollection.ts +1860 -1688
  288. package/src/garbageCollectionConstants.ts +3 -0
  289. package/src/garbageCollectionHelpers.ts +61 -0
  290. package/src/gcSweepReadyUsageDetection.ts +89 -83
  291. package/src/index.ts +67 -66
  292. package/src/opLifecycle/README.md +152 -0
  293. package/src/opLifecycle/batchManager.ts +145 -141
  294. package/src/opLifecycle/definitions.ts +29 -29
  295. package/src/opLifecycle/index.ts +5 -5
  296. package/src/opLifecycle/opCompressor.ts +54 -53
  297. package/src/opLifecycle/opDecompressor.ts +100 -128
  298. package/src/opLifecycle/opSplitter.ts +214 -188
  299. package/src/opLifecycle/outbox.ts +204 -195
  300. package/src/opLifecycle/remoteMessageProcessor.ts +62 -62
  301. package/src/opProperties.ts +11 -9
  302. package/src/orderedClientElection.ts +489 -457
  303. package/src/packageVersion.ts +1 -1
  304. package/src/pendingStateManager.ts +384 -338
  305. package/src/runWhileConnectedCoordinator.ts +78 -71
  306. package/src/runningSummarizer.ts +619 -581
  307. package/src/scheduleManager.ts +299 -269
  308. package/src/serializedSnapshotStorage.ts +126 -112
  309. package/src/summarizer.ts +417 -381
  310. package/src/summarizerClientElection.ts +107 -100
  311. package/src/summarizerHandle.ts +11 -9
  312. package/src/summarizerHeuristics.ts +183 -186
  313. package/src/summarizerTypes.ts +344 -330
  314. package/src/summaryCollection.ts +378 -349
  315. package/src/summaryFormat.ts +165 -143
  316. package/src/summaryGenerator.ts +465 -410
  317. package/src/summaryManager.ts +377 -348
  318. package/src/throttler.ts +131 -122
  319. package/tsconfig.esnext.json +6 -6
  320. package/tsconfig.json +9 -13
  321. package/dist/garbageCollectionTombstoneUtils.d.ts +0 -14
  322. package/dist/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  323. package/dist/garbageCollectionTombstoneUtils.js +0 -23
  324. package/dist/garbageCollectionTombstoneUtils.js.map +0 -1
  325. package/lib/garbageCollectionTombstoneUtils.d.ts +0 -14
  326. package/lib/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  327. package/lib/garbageCollectionTombstoneUtils.js +0 -19
  328. package/lib/garbageCollectionTombstoneUtils.js.map +0 -1
  329. package/src/garbageCollectionTombstoneUtils.ts +0 -28
@@ -1,5 +1,5 @@
1
1
  import { AttachState, LoaderHeader, } from "@fluidframework/container-definitions";
2
- import { assert, Trace, TypedEventEmitter, unreachableCase, } from "@fluidframework/common-utils";
2
+ import { assert, Trace, TypedEventEmitter, unreachableCase } from "@fluidframework/common-utils";
3
3
  import { ChildLogger, raiseConnectedEvent, PerformanceEvent, TaggedLoggerAdapter, loggerToMonitoringContext, wrapError, } from "@fluidframework/telemetry-utils";
4
4
  import { DriverHeader, FetchSource, } from "@fluidframework/driver-definitions";
5
5
  import { readAndParse } from "@fluidframework/driver-utils";
@@ -13,23 +13,25 @@ import { ContainerFluidHandleContext } from "./containerHandleContext";
13
13
  import { FluidDataStoreRegistry } from "./dataStoreRegistry";
14
14
  import { Summarizer } from "./summarizer";
15
15
  import { SummaryManager } from "./summaryManager";
16
- import { ReportOpPerfTelemetry, } from "./connectionTelemetry";
17
- import { PendingStateManager, } from "./pendingStateManager";
16
+ import { ReportOpPerfTelemetry } from "./connectionTelemetry";
17
+ import { PendingStateManager } from "./pendingStateManager";
18
18
  import { pkgVersion } from "./packageVersion";
19
19
  import { BlobManager } from "./blobManager";
20
20
  import { DataStores, getSummaryForDatastores } from "./dataStores";
21
21
  import { aliasBlobName, blobsTreeName, chunksBlobName, electedSummarizerBlobName, extractSummaryMetadataMessage, metadataBlobName, wrapSummaryInChannelsTree, } from "./summaryFormat";
22
22
  import { SummaryCollection } from "./summaryCollection";
23
- import { OrderedClientCollection, OrderedClientElection } from "./orderedClientElection";
23
+ import { OrderedClientCollection, OrderedClientElection, } from "./orderedClientElection";
24
24
  import { SummarizerClientElection, summarizerClientType } from "./summarizerClientElection";
25
25
  import { formExponentialFn, Throttler } from "./throttler";
26
26
  import { RunWhileConnectedCoordinator } from "./runWhileConnectedCoordinator";
27
27
  import { GarbageCollector, GCNodeType, } from "./garbageCollection";
28
- import { channelToDataStore, isDataStoreAliasMessage, } from "./dataStore";
28
+ import { channelToDataStore, isDataStoreAliasMessage } from "./dataStore";
29
29
  import { BindBatchTracker } from "./batchTracker";
30
- import { SerializedSnapshotStorage } from "./serializedSnapshotStorage";
30
+ import { SerializedSnapshotStorage, } from "./serializedSnapshotStorage";
31
31
  import { ScheduleManager } from "./scheduleManager";
32
32
  import { OpCompressor, OpDecompressor, Outbox, OpSplitter, RemoteMessageProcessor, } from "./opLifecycle";
33
+ import { shouldAllowGcTombstoneEnforcement } from "./garbageCollectionHelpers";
34
+ import { gcTombstoneGenerationOptionName } from "./garbageCollectionConstants";
33
35
  export var ContainerMessageType;
34
36
  (function (ContainerMessageType) {
35
37
  // An op to be delivered to store
@@ -134,8 +136,7 @@ export function getDeviceSpec() {
134
136
  };
135
137
  }
136
138
  }
137
- catch (_a) {
138
- }
139
+ catch (_a) { }
139
140
  return {};
140
141
  }
141
142
  /**
@@ -147,7 +148,7 @@ export class ContainerRuntime extends TypedEventEmitter {
147
148
  * @internal
148
149
  */
149
150
  constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope, logger, existing, blobManagerSnapshot, _storage, requestHandler, summaryConfiguration) {
150
- var _a, _b, _c, _d, _e, _f;
151
+ var _a, _b, _c, _d, _e, _f, _g;
151
152
  if (summaryConfiguration === void 0) { summaryConfiguration = Object.assign(Object.assign({}, DefaultSummaryConfiguration), (_a = runtimeOptions.summaryOptions) === null || _a === void 0 ? void 0 : _a.summaryConfigOverrides); }
152
153
  super();
153
154
  this.context = context;
@@ -230,28 +231,39 @@ export class ContainerRuntime extends TypedEventEmitter {
230
231
  this.nextSummaryNumber = loadSummaryNumber + 1;
231
232
  this.messageAtLastSummary = metadata === null || metadata === void 0 ? void 0 : metadata.message;
232
233
  this._connected = this.context.connected;
234
+ this.gcTombstoneEnforcementAllowed = shouldAllowGcTombstoneEnforcement((_c = metadata === null || metadata === void 0 ? void 0 : metadata.gcFeatureMatrix) === null || _c === void 0 ? void 0 : _c.tombstoneGeneration /* persisted */, this.runtimeOptions.gcOptions[gcTombstoneGenerationOptionName] /* current */);
233
235
  this.mc = loggerToMonitoringContext(ChildLogger.create(this.logger, "ContainerRuntime"));
234
- const opSplitter = new OpSplitter(chunks, this.context.submitBatchFn, this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompressionChunking") === true ?
235
- Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes, runtimeOptions.maxBatchSizeInBytes, this.mc.logger);
236
- this.remoteMessageProcessor = new RemoteMessageProcessor(opSplitter, new OpDecompressor(this.mc.logger));
236
+ this.mc.logger.sendTelemetryEvent({
237
+ eventName: "GCFeatureMatrix",
238
+ metadataValue: JSON.stringify(metadata === null || metadata === void 0 ? void 0 : metadata.gcFeatureMatrix),
239
+ inputs: JSON.stringify({
240
+ gcOptions_gcTombstoneGeneration: this.runtimeOptions.gcOptions[gcTombstoneGenerationOptionName],
241
+ }),
242
+ });
243
+ const opSplitter = new OpSplitter(chunks, this.context.submitBatchFn, this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompressionChunking") === true
244
+ ? Number.POSITIVE_INFINITY
245
+ : runtimeOptions.chunkSizeInBytes, runtimeOptions.maxBatchSizeInBytes, this.mc.logger);
246
+ this.remoteMessageProcessor = new RemoteMessageProcessor(opSplitter, new OpDecompressor());
237
247
  this.handleContext = new ContainerFluidHandleContext("", this);
238
248
  if (this.summaryConfiguration.state === "enabled") {
239
249
  this.validateSummaryHeuristicConfiguration(this.summaryConfiguration);
240
250
  }
241
- this.enableOpReentryCheck = runtimeOptions.enableOpReentryCheck === true
242
- // Allow for a break-glass config to override the options
243
- && this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableOpReentryCheck") !== true;
251
+ this.enableOpReentryCheck =
252
+ runtimeOptions.enableOpReentryCheck === true &&
253
+ // Allow for a break-glass config to override the options
254
+ this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableOpReentryCheck") !== true;
244
255
  this.summariesDisabled = this.isSummariesDisabled();
245
256
  this.heuristicsDisabled = this.isHeuristicsDisabled();
246
257
  this.maxOpsSinceLastSummary = this.getMaxOpsSinceLastSummary();
247
258
  this.initialSummarizerDelayMs = this.getInitialSummarizerDelayMs();
248
259
  this.maxConsecutiveReconnects =
249
- (_c = this.mc.config.getNumber(maxConsecutiveReconnectsKey)) !== null && _c !== void 0 ? _c : this.defaultMaxConsecutiveReconnects;
260
+ (_d = this.mc.config.getNumber(maxConsecutiveReconnectsKey)) !== null && _d !== void 0 ? _d : this.defaultMaxConsecutiveReconnects;
250
261
  this._flushMode = runtimeOptions.flushMode;
251
262
  const pendingRuntimeState = context.pendingLocalState;
252
- const baseSnapshot = (_d = pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.baseSnapshot) !== null && _d !== void 0 ? _d : context.baseSnapshot;
253
- const maxSnapshotCacheDurationMs = (_f = (_e = this._storage) === null || _e === void 0 ? void 0 : _e.policies) === null || _f === void 0 ? void 0 : _f.maximumCacheDurationMs;
254
- if (maxSnapshotCacheDurationMs !== undefined && maxSnapshotCacheDurationMs > 5 * 24 * 60 * 60 * 1000) {
263
+ const baseSnapshot = (_e = pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.baseSnapshot) !== null && _e !== void 0 ? _e : context.baseSnapshot;
264
+ const maxSnapshotCacheDurationMs = (_g = (_f = this._storage) === null || _f === void 0 ? void 0 : _f.policies) === null || _g === void 0 ? void 0 : _g.maximumCacheDurationMs;
265
+ if (maxSnapshotCacheDurationMs !== undefined &&
266
+ maxSnapshotCacheDurationMs > 5 * 24 * 60 * 60 * 1000) {
255
267
  // This is a runtime enforcement of what's already explicit in the policy's type itself,
256
268
  // which dictates the value is either undefined or exactly 5 days in ms.
257
269
  // As long as the actual value is less than 5 days, the assumptions GC makes here are valid.
@@ -296,12 +308,15 @@ export class ContainerRuntime extends TypedEventEmitter {
296
308
  if (baseSnapshot) {
297
309
  this.summarizerNode.updateBaseSummaryState(baseSnapshot);
298
310
  }
299
- this.dataStores = new DataStores(getSummaryForDatastores(baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getBaseGCDetails(), (path, timestampMs, packagePath) => this.garbageCollector.nodeUpdated(path, "Changed", timestampMs, packagePath), new Map(dataStoreAliasMap));
311
+ this.dataStores = new DataStores(getSummaryForDatastores(baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getBaseGCDetails(), (path, timestampMs, packagePath) => this.garbageCollector.nodeUpdated(path, "Changed", timestampMs, packagePath), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap));
300
312
  this.blobManager = new BlobManager(this.handleContext, blobManagerSnapshot, () => this.storage, (localId, blobId) => {
301
313
  if (!this.disposed) {
302
- this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { localId, blobId });
314
+ this.submit(ContainerMessageType.BlobAttach, undefined, undefined, {
315
+ localId,
316
+ blobId,
317
+ });
303
318
  }
304
- }, (blobPath) => this.garbageCollector.nodeUpdated(blobPath, "Loaded"), (fromPath, toPath) => this.garbageCollector.addedOutboundReference(fromPath, toPath), this, pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.pendingAttachmentBlobs, () => this.getCurrentReferenceTimestampMs());
319
+ }, (blobPath) => this.garbageCollector.nodeUpdated(blobPath, "Loaded"), (fromPath, toPath) => this.garbageCollector.addedOutboundReference(fromPath, toPath), (blobPath) => this.garbageCollector.isNodeDeleted(blobPath), this, pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.pendingAttachmentBlobs, () => this.getCurrentReferenceTimestampMs());
305
320
  this.scheduleManager = new ScheduleManager(context.deltaManager, this, () => this.clientId, ChildLogger.create(this.logger, "ScheduleManager"));
306
321
  this.pendingStateManager = new PendingStateManager({
307
322
  applyStashedOp: this.applyStashedOp.bind(this),
@@ -312,11 +327,12 @@ export class ContainerRuntime extends TypedEventEmitter {
312
327
  rollback: this.rollback.bind(this),
313
328
  orderSequentially: this.orderSequentially.bind(this),
314
329
  }, pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.pending);
315
- const compressionOptions = this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompression") === true ?
316
- {
330
+ const compressionOptions = this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableCompression") === true
331
+ ? {
317
332
  minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
318
- compressionAlgorithm: CompressionAlgorithms.lz4
319
- } : runtimeOptions.compressionOptions;
333
+ compressionAlgorithm: CompressionAlgorithms.lz4,
334
+ }
335
+ : runtimeOptions.compressionOptions;
320
336
  this.outbox = new Outbox({
321
337
  shouldSend: () => this.canSendOps(),
322
338
  pendingStateManager: this.pendingStateManager,
@@ -334,8 +350,9 @@ export class ContainerRuntime extends TypedEventEmitter {
334
350
  this.remoteMessageProcessor.clearPartialMessagesFor(clientId);
335
351
  });
336
352
  this.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);
337
- this.dirtyContainer = this.context.attachState !== AttachState.Attached
338
- || this.pendingStateManager.hasPendingMessages();
353
+ this.dirtyContainer =
354
+ this.context.attachState !== AttachState.Attached ||
355
+ this.pendingStateManager.hasPendingMessages();
339
356
  this.context.updateDirtyContainerState(this.dirtyContainer);
340
357
  if (this.summariesDisabled) {
341
358
  this.mc.logger.sendTelemetryEvent({ eventName: "SummariesDisabled" });
@@ -403,8 +420,12 @@ export class ContainerRuntime extends TypedEventEmitter {
403
420
  ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);
404
421
  BindBatchTracker(this, this.logger);
405
422
  }
406
- get IContainerRuntime() { return this; }
407
- get IFluidRouter() { return this; }
423
+ get IContainerRuntime() {
424
+ return this;
425
+ }
426
+ get IFluidRouter() {
427
+ return this;
428
+ }
408
429
  /**
409
430
  * @deprecated - use loadRuntime instead.
410
431
  * Load the stores from a snapshot and returns the runtime.
@@ -445,7 +466,7 @@ export class ContainerRuntime extends TypedEventEmitter {
445
466
  */
446
467
  static async loadRuntime(params) {
447
468
  var _a, _b, _c, _d;
448
- const { context, registryEntries, existing, requestHandler, runtimeOptions = {}, containerScope = {}, containerRuntimeCtor = ContainerRuntime } = params;
469
+ const { context, registryEntries, existing, requestHandler, runtimeOptions = {}, containerScope = {}, containerRuntimeCtor = ContainerRuntime, } = params;
449
470
  // If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
450
471
  // back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
451
472
  const backCompatContext = context;
@@ -457,13 +478,15 @@ export class ContainerRuntime extends TypedEventEmitter {
457
478
  });
458
479
  const { summaryOptions = {}, gcOptions = {}, loadSequenceNumberVerification = "close", flushMode = defaultFlushMode, enableOfflineLoad = false, compressionOptions = {
459
480
  minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
460
- compressionAlgorithm: CompressionAlgorithms.lz4
481
+ compressionAlgorithm: CompressionAlgorithms.lz4,
461
482
  }, maxBatchSizeInBytes = defaultMaxBatchSizeInBytes, chunkSizeInBytes = Number.POSITIVE_INFINITY, enableOpReentryCheck = false, } = runtimeOptions;
462
483
  const pendingRuntimeState = context.pendingLocalState;
463
484
  const baseSnapshot = (_b = pendingRuntimeState === null || pendingRuntimeState === void 0 ? void 0 : pendingRuntimeState.baseSnapshot) !== null && _b !== void 0 ? _b : context.baseSnapshot;
464
- const storage = !pendingRuntimeState ?
465
- context.storage :
466
- new SerializedSnapshotStorage(() => { return context.storage; }, pendingRuntimeState.snapshotBlobs);
485
+ const storage = !pendingRuntimeState
486
+ ? context.storage
487
+ : new SerializedSnapshotStorage(() => {
488
+ return context.storage;
489
+ }, pendingRuntimeState.snapshotBlobs);
467
490
  const registry = new FluidDataStoreRegistry(registryEntries);
468
491
  const tryFetchBlob = async (blobName) => {
469
492
  const blobId = baseSnapshot === null || baseSnapshot === void 0 ? void 0 : baseSnapshot.blobs[blobName];
@@ -494,7 +517,8 @@ export class ContainerRuntime extends TypedEventEmitter {
494
517
  if (!pendingRuntimeState && runtimeSequenceNumber !== undefined) {
495
518
  const protocolSequenceNumber = context.deltaManager.initialSequenceNumber;
496
519
  // Unless bypass is explicitly set, then take action when sequence numbers mismatch.
497
- if (loadSequenceNumberVerification !== "bypass" && runtimeSequenceNumber !== protocolSequenceNumber) {
520
+ if (loadSequenceNumberVerification !== "bypass" &&
521
+ runtimeSequenceNumber !== protocolSequenceNumber) {
498
522
  // "Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber"
499
523
  const error = new DataCorruptionError(
500
524
  // pre-0.58 error message: SummaryMetadataMismatch
@@ -601,7 +625,9 @@ export class ContainerRuntime extends TypedEventEmitter {
601
625
  var _a;
602
626
  return (_a = this.summarizerClientElection) === null || _a === void 0 ? void 0 : _a.electedClientId;
603
627
  }
604
- get disposed() { return this._disposed; }
628
+ get disposed() {
629
+ return this._disposed;
630
+ }
605
631
  get summarizer() {
606
632
  assert(this._summarizer !== undefined, 0x257 /* "This is not summarizing container" */);
607
633
  return this._summarizer;
@@ -711,7 +737,8 @@ export class ContainerRuntime extends TypedEventEmitter {
711
737
  status: 200,
712
738
  mimeType: "fluid/object",
713
739
  value: blob,
714
- } : create404Response(request);
740
+ }
741
+ : create404Response(request);
715
742
  }
716
743
  else if (requestParser.pathParts.length > 0) {
717
744
  const dataStore = await this.getDataStoreFromRequest(id, request);
@@ -754,7 +781,8 @@ export class ContainerRuntime extends TypedEventEmitter {
754
781
  * This is a workaround to handle scenarios where a data store shared with an external app is deleted
755
782
  * and marked as unreferenced by GC. Returning an error will fail to load the data store for the app.
756
783
  */
757
- if (((_d = request.headers) === null || _d === void 0 ? void 0 : _d[RuntimeHeaders.externalRequest]) && this.garbageCollector.shouldRunGC) {
784
+ if (((_d = request.headers) === null || _d === void 0 ? void 0 : _d[RuntimeHeaders.externalRequest]) &&
785
+ this.garbageCollector.shouldRunGC) {
758
786
  // The data store is referenced if used routes in the base summary has a route to self.
759
787
  // Older documents may not have used routes in the summary. They are considered referenced.
760
788
  const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;
@@ -928,7 +956,7 @@ export class ContainerRuntime extends TypedEventEmitter {
928
956
  if (reconnection) {
929
957
  this.consecutiveReconnects++;
930
958
  if (!this.shouldContinueReconnecting()) {
931
- this.closeFn(DataProcessingError.create("Runtime detected too many reconnects with no progress syncing local ops. Batch of ops is likely too large (over 1Mb)", "setConnectionState", undefined, {
959
+ this.closeFn(DataProcessingError.create("Runtime detected too many reconnects with no progress syncing local ops.", "setConnectionState", undefined, {
932
960
  dataLoss: 1,
933
961
  attempts: this.consecutiveReconnects,
934
962
  pendingMessages: this.pendingStateManager.pendingMessagesCount,
@@ -944,7 +972,7 @@ export class ContainerRuntime extends TypedEventEmitter {
944
972
  raiseConnectedEvent(this.mc.logger, this, connected, clientId);
945
973
  }
946
974
  process(messageArg, local) {
947
- var _a, _b;
975
+ var _a;
948
976
  this.verifyNotClosed();
949
977
  if ((_a = this.mc.config.getBoolean("enableOfflineLoad")) !== null && _a !== void 0 ? _a : this.runtimeOptions.enableOfflineLoad) {
950
978
  this.savedOps.push(messageArg);
@@ -988,19 +1016,7 @@ export class ContainerRuntime extends TypedEventEmitter {
988
1016
  case ContainerMessageType.Rejoin:
989
1017
  break;
990
1018
  default:
991
- if (runtimeMessage) {
992
- const error = DataProcessingError.create(
993
- // Former assert 0x3ce
994
- "Runtime message of unknown type", "OpProcessing", message, {
995
- local,
996
- type: message.type,
997
- contentType: typeof message.contents,
998
- batch: (_b = message.metadata) === null || _b === void 0 ? void 0 : _b.batch,
999
- compression: message.compression,
1000
- });
1001
- this.closeFn(error);
1002
- throw error;
1003
- }
1019
+ assert(!runtimeMessage, 0x3ce /* Runtime message of unknown type */);
1004
1020
  }
1005
1021
  // For back-compat, notify only about runtime messages for now.
1006
1022
  if (runtimeMessage) {
@@ -1047,7 +1063,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1047
1063
  if (message.clientId === this.clientId && this.connected) {
1048
1064
  // Check to see if the signal was lost.
1049
1065
  if (this._perfSignalData.trackingSignalSequenceNumber !== undefined &&
1050
- envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber) {
1066
+ envelope.clientSignalSequenceNumber >
1067
+ this._perfSignalData.trackingSignalSequenceNumber) {
1051
1068
  this._perfSignalData.signalsLost++;
1052
1069
  this._perfSignalData.trackingSignalSequenceNumber = undefined;
1053
1070
  this.logger.sendErrorEvent({
@@ -1058,7 +1075,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1058
1075
  clientSignalSequenceNumber: envelope.clientSignalSequenceNumber,
1059
1076
  });
1060
1077
  }
1061
- else if (envelope.clientSignalSequenceNumber === this._perfSignalData.trackingSignalSequenceNumber) {
1078
+ else if (envelope.clientSignalSequenceNumber ===
1079
+ this._perfSignalData.trackingSignalSequenceNumber) {
1062
1080
  this.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);
1063
1081
  this._perfSignalData.trackingSignalSequenceNumber = undefined;
1064
1082
  }
@@ -1145,7 +1163,9 @@ export class ContainerRuntime extends TypedEventEmitter {
1145
1163
  return this.dataStores.createDetachedDataStoreCore(pkg, false);
1146
1164
  }
1147
1165
  async _createDataStoreWithProps(pkg, props, id = uuid()) {
1148
- const fluidDataStore = await this.dataStores._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, props).realize();
1166
+ const fluidDataStore = await this.dataStores
1167
+ ._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, props)
1168
+ .realize();
1149
1169
  return channelToDataStore(fluidDataStore, id, this, this.dataStores, this.mc.logger);
1150
1170
  }
1151
1171
  async _createDataStore(pkg, id = uuid(), props) {
@@ -1276,21 +1296,16 @@ export class ContainerRuntime extends TypedEventEmitter {
1276
1296
  async summarize(options) {
1277
1297
  this.verifyNotClosed();
1278
1298
  const { fullTree = false, trackState = true, summaryLogger = this.mc.logger, runGC = this.garbageCollector.shouldRunGC, runSweep, fullGC, } = options;
1279
- const telemetryContext = new TelemetryContext();
1280
- // Add the options that are used to generate this summary to the telemetry context.
1281
- telemetryContext.setAll("fluid_Summarize", "Options", {
1282
- fullTree,
1283
- trackState,
1284
- runGC,
1285
- fullGC,
1286
- runSweep,
1287
- });
1288
1299
  let gcStats;
1289
1300
  if (runGC) {
1290
- gcStats = await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC }, telemetryContext);
1301
+ gcStats = await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });
1291
1302
  }
1303
+ const telemetryContext = new TelemetryContext();
1292
1304
  const { stats, summary } = await this.summarizerNode.summarize(fullTree, trackState, telemetryContext);
1293
- this.logger.sendTelemetryEvent({ eventName: "SummarizeTelemetry", details: telemetryContext.serialize() });
1305
+ this.logger.sendTelemetryEvent({
1306
+ eventName: "SummarizeTelemetry",
1307
+ details: telemetryContext.serialize(),
1308
+ });
1294
1309
  assert(summary.type === SummaryType.Tree, 0x12f /* "Container Runtime's summarize should always return a tree" */);
1295
1310
  return { stats, summary, gcStats };
1296
1311
  }
@@ -1341,6 +1356,18 @@ export class ContainerRuntime extends TypedEventEmitter {
1341
1356
  this.blobManager.updateUnusedRoutes(blobManagerRoutes);
1342
1357
  this.dataStores.updateUnusedRoutes(dataStoreRoutes);
1343
1358
  }
1359
+ /**
1360
+ * This is called to delete objects from the runtime
1361
+ * @param unusedRoutes - object routes and sub routes that can be deleted
1362
+ * @returns - routes of objects deleted from the runtime
1363
+ */
1364
+ deleteUnusedNodes(unusedRoutes) {
1365
+ const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(unusedRoutes);
1366
+ const deletedRoutes = [];
1367
+ const deletedDataStoreRoutes = this.dataStores.deleteUnusedNodes(dataStoreRoutes);
1368
+ deletedRoutes.push(...deletedDataStoreRoutes);
1369
+ return deletedRoutes;
1370
+ }
1344
1371
  /**
1345
1372
  * This is called to update objects that are tombstones.
1346
1373
  * @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.
@@ -1418,8 +1445,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1418
1445
  * Runs garbage collection and updates the reference / used state of the nodes in the container.
1419
1446
  * @returns the statistics of the garbage collection run; undefined if GC did not run.
1420
1447
  */
1421
- async collectGarbage(options, telemetryContext) {
1422
- return this.garbageCollector.collectGarbage(options, telemetryContext);
1448
+ async collectGarbage(options) {
1449
+ return this.garbageCollector.collectGarbage(options);
1423
1450
  }
1424
1451
  /**
1425
1452
  * Called when a new outbound reference is added to another node. This is used by garbage collection to identify
@@ -1456,8 +1483,12 @@ export class ContainerRuntime extends TypedEventEmitter {
1456
1483
  // We might need to catch up to the latest summary's reference sequence number before pausing.
1457
1484
  await this.waitForDeltaManagerToCatchup(latestSnapshotRefSeq, summaryNumberLogger);
1458
1485
  }
1486
+ const shouldPauseInboundSignal = this.mc.config.getBoolean("Fluid.ContainerRuntime.SubmitSummary.disableInboundSignalPause") !== true;
1459
1487
  try {
1460
1488
  await this.deltaManager.inbound.pause();
1489
+ if (shouldPauseInboundSignal) {
1490
+ await this.deltaManager.inboundSignal.pause();
1491
+ }
1461
1492
  const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;
1462
1493
  const minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;
1463
1494
  const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;
@@ -1558,8 +1589,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1558
1589
  // latestSnapshotVersionId from storage and it does not match with the lastAck ackHandle, then use
1559
1590
  // the one fetched from storage as parent as that is the latest.
1560
1591
  let summaryContext;
1561
- if ((lastAck === null || lastAck === void 0 ? void 0 : lastAck.summaryAck.contents.handle) !== latestSnapshotVersionId
1562
- && latestSnapshotVersionId !== undefined) {
1592
+ if ((lastAck === null || lastAck === void 0 ? void 0 : lastAck.summaryAck.contents.handle) !== latestSnapshotVersionId &&
1593
+ latestSnapshotVersionId !== undefined) {
1563
1594
  summaryContext = {
1564
1595
  proposalHandle: undefined,
1565
1596
  ackHandle: latestSnapshotVersionId,
@@ -1616,6 +1647,9 @@ export class ContainerRuntime extends TypedEventEmitter {
1616
1647
  this.summarizerNode.clearSummary();
1617
1648
  // Restart the delta manager
1618
1649
  this.deltaManager.inbound.resume();
1650
+ if (shouldPauseInboundSignal) {
1651
+ this.deltaManager.inboundSignal.resume();
1652
+ }
1619
1653
  }
1620
1654
  }
1621
1655
  hasPendingMessages() {
@@ -1664,7 +1698,10 @@ export class ContainerRuntime extends TypedEventEmitter {
1664
1698
  const deserializedContent = { type, contents };
1665
1699
  const serializedContent = JSON.stringify(deserializedContent);
1666
1700
  if (this.deltaManager.readOnlyInfo.readonly) {
1667
- this.logger.sendTelemetryEvent({ eventName: "SubmitOpInReadonly", connected: this.connected });
1701
+ this.logger.sendTelemetryEvent({
1702
+ eventName: "SubmitOpInReadonly",
1703
+ connected: this.connected,
1704
+ });
1668
1705
  }
1669
1706
  const message = {
1670
1707
  contents: serializedContent,
@@ -1694,7 +1731,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1694
1731
  // issue than sending.
1695
1732
  // Please note that this does not change file format, so it can be disabled in the future if this
1696
1733
  // optimization no longer makes sense (for example, batch compression may make it less appealing).
1697
- if (this.currentlyBatching() && type === ContainerMessageType.Attach &&
1734
+ if (this.currentlyBatching() &&
1735
+ type === ContainerMessageType.Attach &&
1698
1736
  this.mc.config.getBoolean("Fluid.ContainerRuntime.disableAttachOpReorder") !== true) {
1699
1737
  this.outbox.submitAttach(message);
1700
1738
  }
@@ -1707,10 +1745,14 @@ export class ContainerRuntime extends TypedEventEmitter {
1707
1745
  else if (!this.flushMicroTaskExists) {
1708
1746
  this.flushMicroTaskExists = true;
1709
1747
  // Queue a microtask to detect the end of the turn and force a flush.
1710
- Promise.resolve().then(() => {
1748
+ Promise.resolve()
1749
+ .then(() => {
1711
1750
  this.flushMicroTaskExists = false;
1712
1751
  this.flush();
1713
- }).catch((error) => { this.closeFn(error); });
1752
+ })
1753
+ .catch((error) => {
1754
+ this.closeFn(error);
1755
+ });
1714
1756
  }
1715
1757
  }
1716
1758
  catch (error) {
@@ -1905,13 +1947,15 @@ export class ContainerRuntime extends TypedEventEmitter {
1905
1947
  notifyAttaching(snapshot) {
1906
1948
  var _a;
1907
1949
  if ((_a = this.mc.config.getBoolean("enableOfflineLoad")) !== null && _a !== void 0 ? _a : this.runtimeOptions.enableOfflineLoad) {
1908
- this.baseSnapshotBlobs = SerializedSnapshotStorage.serializeTreeWithBlobContents(snapshot);
1950
+ this.baseSnapshotBlobs =
1951
+ SerializedSnapshotStorage.serializeTreeWithBlobContents(snapshot);
1909
1952
  }
1910
1953
  }
1911
1954
  async initializeBaseSnapshotBlobs() {
1912
1955
  var _a;
1913
1956
  if (!((_a = this.mc.config.getBoolean("enableOfflineLoad")) !== null && _a !== void 0 ? _a : this.runtimeOptions.enableOfflineLoad) ||
1914
- this.attachState !== AttachState.Attached || this.context.pendingLocalState) {
1957
+ this.attachState !== AttachState.Attached ||
1958
+ this.context.pendingLocalState) {
1915
1959
  return;
1916
1960
  }
1917
1961
  assert(!!this.context.baseSnapshot, 0x2e5 /* "Must have a base snapshot" */);