@fluidframework/container-runtime 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +5 -5
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +54 -0
- package/README.md +45 -0
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/container-runtime.api.md +68 -30
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +223 -0
- package/dist/channelCollection.d.ts.map +1 -0
- package/dist/{dataStores.js → channelCollection.js} +399 -83
- package/dist/channelCollection.js.map +1 -0
- package/dist/connectionTelemetry.d.ts +11 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +42 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +98 -40
- package/dist/container-runtime-beta.d.ts +27 -9
- package/dist/container-runtime-public.d.ts +27 -9
- package/dist/container-runtime-untrimmed.d.ts +123 -40
- package/dist/containerHandleContext.d.ts +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +79 -55
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +541 -411
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +2 -3
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +12 -11
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +71 -30
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +182 -141
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +29 -4
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +91 -5
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +22 -5
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +134 -75
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +21 -21
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +29 -6
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +5 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +2 -2
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +12 -5
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +18 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +7 -7
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +20 -20
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts +6 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +22 -11
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +8 -8
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +40 -38
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +8 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -40
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +4 -4
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +2 -2
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +8 -8
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +18 -18
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +4 -4
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +3 -3
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +1 -10
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +5 -5
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +7 -7
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +20 -12
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -4
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +2 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -10
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -2
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +5 -5
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +12 -12
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +43 -43
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.js +8 -8
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +11 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +114 -81
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +4 -4
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +6 -6
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +3 -3
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +3 -3
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js +4 -4
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +17 -7
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +45 -57
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +10 -19
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +1 -21
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +5 -6
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +16 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +10 -21
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +15 -2
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +6 -5
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +10 -1
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +5 -6
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +4 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{batchTracker.d.mts → batchTracker.d.ts} +2 -3
- package/lib/batchTracker.d.ts.map +1 -0
- package/lib/{batchTracker.mjs → batchTracker.js} +1 -1
- package/lib/batchTracker.js.map +1 -0
- package/lib/{blobManager.d.mts → blobManager.d.ts} +1 -1
- package/lib/blobManager.d.ts.map +1 -0
- package/lib/{blobManager.mjs → blobManager.js} +1 -1
- package/lib/blobManager.js.map +1 -0
- package/lib/channelCollection.d.ts +223 -0
- package/lib/channelCollection.d.ts.map +1 -0
- package/lib/{dataStores.mjs → channelCollection.js} +384 -71
- package/lib/channelCollection.js.map +1 -0
- package/lib/{connectionTelemetry.d.mts → connectionTelemetry.d.ts} +12 -2
- package/lib/connectionTelemetry.d.ts.map +1 -0
- package/lib/{connectionTelemetry.mjs → connectionTelemetry.js} +43 -5
- package/lib/connectionTelemetry.js.map +1 -0
- package/lib/{container-runtime-alpha.d.mts → container-runtime-alpha.d.ts} +98 -40
- package/lib/{container-runtime-public.d.mts → container-runtime-beta.d.ts} +27 -9
- package/lib/{container-runtime-beta.d.mts → container-runtime-public.d.ts} +27 -9
- package/lib/{container-runtime-untrimmed.d.mts → container-runtime-untrimmed.d.ts} +123 -40
- package/lib/{containerHandleContext.d.mts → containerHandleContext.d.ts} +2 -2
- package/lib/containerHandleContext.d.ts.map +1 -0
- package/lib/{containerHandleContext.mjs → containerHandleContext.js} +1 -1
- package/lib/containerHandleContext.js.map +1 -0
- package/lib/{containerRuntime.d.mts → containerRuntime.d.ts} +84 -56
- package/lib/containerRuntime.d.ts.map +1 -0
- package/lib/{containerRuntime.mjs → containerRuntime.js} +460 -332
- package/lib/containerRuntime.js.map +1 -0
- package/lib/{dataStore.d.mts → dataStore.d.ts} +3 -4
- package/lib/dataStore.d.ts.map +1 -0
- package/lib/{dataStore.mjs → dataStore.js} +13 -12
- package/lib/dataStore.js.map +1 -0
- package/lib/{dataStoreContext.d.mts → dataStoreContext.d.ts} +72 -31
- package/lib/dataStoreContext.d.ts.map +1 -0
- package/lib/{dataStoreContext.mjs → dataStoreContext.js} +174 -133
- package/lib/dataStoreContext.js.map +1 -0
- package/lib/{dataStoreContexts.d.mts → dataStoreContexts.d.ts} +2 -2
- package/lib/dataStoreContexts.d.ts.map +1 -0
- package/lib/{dataStoreContexts.mjs → dataStoreContexts.js} +1 -1
- package/lib/dataStoreContexts.js.map +1 -0
- package/lib/{dataStoreRegistry.d.mts → dataStoreRegistry.d.ts} +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -0
- package/lib/{dataStoreRegistry.mjs → dataStoreRegistry.js} +5 -1
- package/lib/dataStoreRegistry.js.map +1 -0
- package/{dist/deltaManagerProxyBase.d.ts → lib/deltaManagerSummarizerProxy.d.ts} +16 -7
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.js +124 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -0
- package/lib/{deltaScheduler.d.mts → deltaScheduler.d.ts} +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -0
- package/lib/{deltaScheduler.mjs → deltaScheduler.js} +1 -1
- package/lib/deltaScheduler.js.map +1 -0
- package/lib/{error.d.mts → error.d.ts} +1 -1
- package/lib/error.d.ts.map +1 -0
- package/lib/{error.mjs → error.js} +1 -1
- package/lib/error.js.map +1 -0
- package/lib/gc/{garbageCollection.d.mts → garbageCollection.d.ts} +23 -6
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/gc/{garbageCollection.mjs → garbageCollection.js} +103 -44
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/{gcConfigs.d.mts → gcConfigs.d.ts} +3 -3
- package/lib/gc/gcConfigs.d.ts.map +1 -0
- package/lib/gc/{gcConfigs.mjs → gcConfigs.js} +3 -3
- package/lib/gc/gcConfigs.js.map +1 -0
- package/lib/gc/{gcDefinitions.d.mts → gcDefinitions.d.ts} +30 -7
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcDefinitions.mjs → gcDefinitions.js} +5 -1
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/{gcHelpers.d.mts → gcHelpers.d.ts} +3 -3
- package/lib/gc/{gcHelpers.d.mts.map → gcHelpers.d.ts.map} +1 -1
- package/lib/gc/{gcHelpers.mjs → gcHelpers.js} +1 -1
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.d.mts → gcReferenceGraphAlgorithm.d.ts} +2 -2
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.mjs → gcReferenceGraphAlgorithm.js} +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.d.mts → gcSummaryDefinitions.d.ts} +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.mjs → gcSummaryDefinitions.js} +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.d.mts → gcSummaryStateTracker.d.ts} +13 -6
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.mjs → gcSummaryStateTracker.js} +17 -5
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/lib/gc/{gcTelemetry.d.mts → gcTelemetry.d.ts} +8 -8
- package/lib/gc/gcTelemetry.d.ts.map +1 -0
- package/lib/gc/{gcTelemetry.mjs → gcTelemetry.js} +5 -5
- package/lib/gc/gcTelemetry.js.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.d.mts → gcUnreferencedStateTracker.d.ts} +7 -2
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.mjs → gcUnreferencedStateTracker.js} +12 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/{index.d.mts → index.d.ts} +9 -9
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/{index.mjs → index.js} +8 -8
- package/lib/gc/index.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +9 -21
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -0
- package/lib/{messageTypes.d.mts → messageTypes.d.ts} +5 -5
- package/lib/messageTypes.d.ts.map +1 -0
- package/lib/{messageTypes.mjs → messageTypes.js} +1 -1
- package/lib/messageTypes.js.map +1 -0
- package/lib/{metadata.d.mts → metadata.d.ts} +1 -1
- package/lib/metadata.d.ts.map +1 -0
- package/lib/{metadata.mjs → metadata.js} +1 -1
- package/lib/metadata.js.map +1 -0
- package/lib/opLifecycle/{batchManager.d.mts → batchManager.d.ts} +3 -3
- package/lib/opLifecycle/batchManager.d.ts.map +1 -0
- package/lib/opLifecycle/{batchManager.mjs → batchManager.js} +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -0
- package/lib/opLifecycle/{definitions.d.mts → definitions.d.ts} +3 -3
- package/lib/opLifecycle/definitions.d.ts.map +1 -0
- package/lib/opLifecycle/{definitions.mjs → definitions.js} +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -0
- package/lib/opLifecycle/index.d.ts +13 -0
- package/lib/opLifecycle/index.d.ts.map +1 -0
- package/lib/opLifecycle/index.js +12 -0
- package/lib/opLifecycle/index.js.map +1 -0
- package/lib/opLifecycle/{opCompressor.d.mts → opCompressor.d.ts} +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opCompressor.mjs → opCompressor.js} +3 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -0
- package/lib/opLifecycle/{opDecompressor.d.mts → opDecompressor.d.ts} +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opDecompressor.mjs → opDecompressor.js} +2 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.d.mts → opGroupingManager.d.ts} +2 -2
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.mjs → opGroupingManager.js} +2 -11
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/{opSplitter.d.mts → opSplitter.d.ts} +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -0
- package/lib/opLifecycle/{opSplitter.mjs → opSplitter.js} +3 -3
- package/lib/opLifecycle/opSplitter.js.map +1 -0
- package/lib/opLifecycle/{outbox.d.mts → outbox.d.ts} +8 -8
- package/lib/opLifecycle/outbox.d.ts.map +1 -0
- package/lib/opLifecycle/{outbox.mjs → outbox.js} +12 -4
- package/lib/opLifecycle/outbox.js.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.d.mts → remoteMessageProcessor.d.ts} +5 -5
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.mjs → remoteMessageProcessor.js} +2 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -0
- package/lib/{opProperties.d.mts → opProperties.d.ts} +1 -1
- package/lib/opProperties.d.ts.map +1 -0
- package/lib/{opProperties.mjs → opProperties.js} +1 -1
- package/lib/opProperties.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{pendingStateManager.d.mts → pendingStateManager.d.ts} +3 -2
- package/lib/pendingStateManager.d.ts.map +1 -0
- package/lib/{pendingStateManager.mjs → pendingStateManager.js} +18 -10
- package/lib/pendingStateManager.js.map +1 -0
- package/lib/{scheduleManager.d.mts → scheduleManager.d.ts} +6 -3
- package/lib/scheduleManager.d.ts.map +1 -0
- package/lib/{scheduleManager.mjs → scheduleManager.js} +3 -3
- package/lib/scheduleManager.js.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.d.mts → storageServiceWithAttachBlobs.d.ts} +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.mjs → storageServiceWithAttachBlobs.js} +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -0
- package/lib/summary/{index.d.mts → index.d.ts} +13 -13
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/{index.mjs → index.js} +12 -12
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/{orderedClientElection.d.mts → orderedClientElection.d.ts} +5 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/summary/{orderedClientElection.mjs → orderedClientElection.js} +2 -2
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.d.mts → runWhileConnectedCoordinator.d.ts} +2 -2
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.mjs → runWhileConnectedCoordinator.js} +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/lib/summary/{runningSummarizer.d.mts → runningSummarizer.d.ts} +12 -11
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/summary/{runningSummarizer.mjs → runningSummarizer.js} +108 -75
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/summary/{summarizer.d.mts → summarizer.d.ts} +5 -5
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/summary/{summarizer.mjs → summarizer.js} +4 -4
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/{summarizerClientElection.d.mts → summarizerClientElection.d.ts} +3 -3
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/{summarizerClientElection.mjs → summarizerClientElection.js} +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/summary/{summarizerHeuristics.d.mts → summarizerHeuristics.d.ts} +4 -4
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/summary/{summarizerHeuristics.mjs → summarizerHeuristics.js} +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summarizerNode/{index.d.mts → index.d.ts} +4 -4
- package/lib/summary/summarizerNode/index.d.ts.map +1 -0
- package/lib/summary/summarizerNode/index.js +7 -0
- package/lib/summary/summarizerNode/index.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.d.mts → summarizerNode.d.ts} +18 -8
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.mjs → summarizerNode.js} +41 -53
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.d.mts → summarizerNodeUtils.d.ts} +11 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.mjs → summarizerNodeUtils.js} +1 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.d.mts → summarizerNodeWithGc.d.ts} +6 -7
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.mjs → summarizerNodeWithGc.js} +12 -12
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/lib/summary/{summarizerTypes.d.mts → summarizerTypes.d.ts} +11 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/{summarizerTypes.mjs → summarizerTypes.js} +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/{summaryCollection.d.mts → summaryCollection.d.ts} +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/summary/{summaryCollection.mjs → summaryCollection.js} +1 -1
- package/lib/summary/summaryCollection.js.map +1 -0
- package/lib/summary/{summaryFormat.d.mts → summaryFormat.d.ts} +16 -3
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/summary/{summaryFormat.mjs → summaryFormat.js} +1 -1
- package/lib/summary/summaryFormat.js.map +1 -0
- package/lib/summary/{summaryGenerator.d.mts → summaryGenerator.d.ts} +7 -6
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/summary/{summaryGenerator.mjs → summaryGenerator.js} +11 -2
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/summary/{summaryManager.d.mts → summaryManager.d.ts} +6 -7
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/summary/{summaryManager.mjs → summaryManager.js} +4 -5
- package/lib/summary/summaryManager.js.map +1 -0
- package/lib/test/batchTracker.spec.js +88 -0
- package/lib/test/batchTracker.spec.js.map +1 -0
- package/lib/test/blobManager.spec.js +835 -0
- package/lib/test/blobManager.spec.js.map +1 -0
- package/lib/test/channelCollection.spec.js +141 -0
- package/lib/test/channelCollection.spec.js.map +1 -0
- package/lib/test/containerRuntime.spec.js +1748 -0
- package/lib/test/containerRuntime.spec.js.map +1 -0
- package/lib/test/dataStoreContext.spec.js +801 -0
- package/lib/test/dataStoreContext.spec.js.map +1 -0
- package/lib/test/dataStoreCreation.spec.js +312 -0
- package/lib/test/dataStoreCreation.spec.js.map +1 -0
- package/lib/test/dataStoreRegistry.spec.js +26 -0
- package/lib/test/dataStoreRegistry.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +66 -0
- package/lib/test/fuzz/fuzzUtils.js.map +1 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js +31 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js +162 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js +106 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -0
- package/lib/test/gc/garbageCollection.spec.js +1465 -0
- package/lib/test/gc/garbageCollection.spec.js.map +1 -0
- package/lib/test/gc/gcConfigs.spec.js +690 -0
- package/lib/test/gc/gcConfigs.spec.js.map +1 -0
- package/lib/test/gc/gcHelpers.spec.js +110 -0
- package/lib/test/gc/gcHelpers.spec.js.map +1 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +68 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +1 -0
- package/lib/test/gc/gcStats.spec.js +391 -0
- package/lib/test/gc/gcStats.spec.js.map +1 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js +228 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -0
- package/lib/test/gc/gcTelemetry.spec.js +530 -0
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -0
- package/lib/test/gc/gcUnitTestHelpers.js +29 -0
- package/lib/test/gc/gcUnitTestHelpers.js.map +1 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +192 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -0
- package/lib/test/getPendingBlobs.spec.js +193 -0
- package/lib/test/getPendingBlobs.spec.js.map +1 -0
- package/lib/test/hardwareStats.spec.js +93 -0
- package/lib/test/hardwareStats.spec.js.map +1 -0
- package/lib/test/index.js +6 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +225 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/batchManager.spec.js +189 -0
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/opCompressor.spec.js +74 -0
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js +218 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opSplitter.spec.js +272 -0
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -0
- package/lib/test/opLifecycle/outbox.spec.js +675 -0
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +196 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -0
- package/lib/test/pendingStateManager.spec.js +329 -0
- package/lib/test/pendingStateManager.spec.js.map +1 -0
- package/lib/test/scheduleManager.spec.js +270 -0
- package/lib/test/scheduleManager.spec.js.map +1 -0
- package/lib/test/summarizerNode.spec.js +326 -0
- package/lib/test/summarizerNode.spec.js.map +1 -0
- package/lib/test/summarizerNodeWithGc.spec.js +318 -0
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -0
- package/lib/test/summary/orderedClientElection.spec.js +535 -0
- package/lib/test/summary/orderedClientElection.spec.js.map +1 -0
- package/lib/test/summary/runningSummarizer.spec.js +1349 -0
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizer.spec.js +29 -0
- package/lib/test/summary/summarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizerClientElection.spec.js +436 -0
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -0
- package/lib/test/summary/summarizerHeuristics.spec.js +289 -0
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -0
- package/lib/test/summary/summaryCollection.spec.js +200 -0
- package/lib/test/summary/summaryCollection.spec.js.map +1 -0
- package/lib/test/summary/summaryManager.spec.js +430 -0
- package/lib/test/summary/summaryManager.spec.js.map +1 -0
- package/lib/test/summary/testQuorumClients.js +34 -0
- package/lib/test/summary/testQuorumClients.js.map +1 -0
- package/lib/test/throttler.spec.js +175 -0
- package/lib/test/throttler.spec.js.map +1 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +180 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -0
- package/lib/{throttler.d.mts → throttler.d.ts} +1 -1
- package/lib/throttler.d.ts.map +1 -0
- package/lib/{throttler.mjs → throttler.js} +1 -1
- package/lib/throttler.js.map +1 -0
- package/package.json +99 -88
- package/src/batchTracker.ts +1 -1
- package/src/blobManager.ts +1 -1
- package/src/{dataStores.ts → channelCollection.ts} +520 -84
- package/src/connectionTelemetry.ts +42 -3
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +661 -464
- package/src/dataStore.ts +13 -15
- package/src/dataStoreContext.ts +257 -184
- package/src/dataStoreContexts.ts +1 -1
- package/src/deltaManagerSummarizerProxy.ts +132 -7
- package/src/gc/garbageCollection.ts +121 -46
- package/src/gc/gcConfigs.ts +3 -3
- package/src/gc/gcDefinitions.ts +30 -7
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +19 -7
- package/src/gc/gcTelemetry.ts +10 -9
- package/src/gc/gcUnreferencedStateTracker.ts +12 -1
- package/src/gc/index.ts +10 -8
- package/src/index.ts +16 -27
- package/src/messageTypes.ts +4 -4
- package/src/opLifecycle/README.md +2 -4
- package/src/opLifecycle/batchManager.ts +2 -2
- package/src/opLifecycle/definitions.ts +2 -2
- package/src/opLifecycle/index.ts +8 -8
- package/src/opLifecycle/opCompressor.ts +3 -3
- package/src/opLifecycle/opDecompressor.ts +3 -3
- package/src/opLifecycle/opGroupingManager.ts +3 -12
- package/src/opLifecycle/opSplitter.ts +3 -3
- package/src/opLifecycle/outbox.ts +29 -9
- package/src/opLifecycle/remoteMessageProcessor.ts +4 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +19 -13
- package/src/scheduleManager.ts +4 -4
- package/src/summary/index.ts +13 -12
- package/src/summary/orderedClientElection.ts +1 -1
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +141 -93
- package/src/summary/summarizer.ts +7 -7
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +3 -3
- package/src/summary/summarizerNode/index.ts +6 -3
- package/src/summary/summarizerNode/summarizerNode.ts +54 -69
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +16 -34
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -17
- package/src/summary/summarizerTypes.ts +12 -24
- package/src/summary/summaryFormat.ts +16 -2
- package/src/summary/summaryGenerator.ts +16 -4
- package/src/summary/summaryManager.ts +6 -7
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/dist/dataStores.d.ts +0 -149
- package/dist/dataStores.d.ts.map +0 -1
- package/dist/dataStores.js.map +0 -1
- package/dist/deltaManagerProxyBase.d.ts.map +0 -1
- package/dist/deltaManagerProxyBase.js +0 -77
- package/dist/deltaManagerProxyBase.js.map +0 -1
- package/lib/batchTracker.d.mts.map +0 -1
- package/lib/batchTracker.mjs.map +0 -1
- package/lib/blobManager.d.mts.map +0 -1
- package/lib/blobManager.mjs.map +0 -1
- package/lib/connectionTelemetry.d.mts.map +0 -1
- package/lib/connectionTelemetry.mjs.map +0 -1
- package/lib/containerHandleContext.d.mts.map +0 -1
- package/lib/containerHandleContext.mjs.map +0 -1
- package/lib/containerRuntime.d.mts.map +0 -1
- package/lib/containerRuntime.mjs.map +0 -1
- package/lib/dataStore.d.mts.map +0 -1
- package/lib/dataStore.mjs.map +0 -1
- package/lib/dataStoreContext.d.mts.map +0 -1
- package/lib/dataStoreContext.mjs.map +0 -1
- package/lib/dataStoreContexts.d.mts.map +0 -1
- package/lib/dataStoreContexts.mjs.map +0 -1
- package/lib/dataStoreRegistry.d.mts.map +0 -1
- package/lib/dataStoreRegistry.mjs.map +0 -1
- package/lib/dataStores.d.mts +0 -149
- package/lib/dataStores.d.mts.map +0 -1
- package/lib/dataStores.mjs.map +0 -1
- package/lib/deltaManagerProxyBase.d.mts +0 -35
- package/lib/deltaManagerProxyBase.d.mts.map +0 -1
- package/lib/deltaManagerProxyBase.mjs +0 -73
- package/lib/deltaManagerProxyBase.mjs.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.mts +0 -19
- package/lib/deltaManagerSummarizerProxy.d.mts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.mjs +0 -38
- package/lib/deltaManagerSummarizerProxy.mjs.map +0 -1
- package/lib/deltaScheduler.d.mts.map +0 -1
- package/lib/deltaScheduler.mjs.map +0 -1
- package/lib/error.d.mts.map +0 -1
- package/lib/error.mjs.map +0 -1
- package/lib/gc/garbageCollection.d.mts.map +0 -1
- package/lib/gc/garbageCollection.mjs.map +0 -1
- package/lib/gc/gcConfigs.d.mts.map +0 -1
- package/lib/gc/gcConfigs.mjs.map +0 -1
- package/lib/gc/gcDefinitions.d.mts.map +0 -1
- package/lib/gc/gcDefinitions.mjs.map +0 -1
- package/lib/gc/gcHelpers.mjs.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +0 -1
- package/lib/gc/gcSummaryDefinitions.d.mts.map +0 -1
- package/lib/gc/gcSummaryDefinitions.mjs.map +0 -1
- package/lib/gc/gcSummaryStateTracker.d.mts.map +0 -1
- package/lib/gc/gcSummaryStateTracker.mjs.map +0 -1
- package/lib/gc/gcTelemetry.d.mts.map +0 -1
- package/lib/gc/gcTelemetry.mjs.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.d.mts.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.mjs.map +0 -1
- package/lib/gc/index.d.mts.map +0 -1
- package/lib/gc/index.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs +0 -24
- package/lib/index.mjs.map +0 -1
- package/lib/messageTypes.d.mts.map +0 -1
- package/lib/messageTypes.mjs.map +0 -1
- package/lib/metadata.d.mts.map +0 -1
- package/lib/metadata.mjs.map +0 -1
- package/lib/opLifecycle/batchManager.d.mts.map +0 -1
- package/lib/opLifecycle/batchManager.mjs.map +0 -1
- package/lib/opLifecycle/definitions.d.mts.map +0 -1
- package/lib/opLifecycle/definitions.mjs.map +0 -1
- package/lib/opLifecycle/index.d.mts +0 -13
- package/lib/opLifecycle/index.d.mts.map +0 -1
- package/lib/opLifecycle/index.mjs +0 -12
- package/lib/opLifecycle/index.mjs.map +0 -1
- package/lib/opLifecycle/opCompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opCompressor.mjs.map +0 -1
- package/lib/opLifecycle/opDecompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opDecompressor.mjs.map +0 -1
- package/lib/opLifecycle/opGroupingManager.d.mts.map +0 -1
- package/lib/opLifecycle/opGroupingManager.mjs.map +0 -1
- package/lib/opLifecycle/opSplitter.d.mts.map +0 -1
- package/lib/opLifecycle/opSplitter.mjs.map +0 -1
- package/lib/opLifecycle/outbox.d.mts.map +0 -1
- package/lib/opLifecycle/outbox.mjs.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.mjs.map +0 -1
- package/lib/opProperties.d.mts.map +0 -1
- package/lib/opProperties.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/pendingStateManager.d.mts.map +0 -1
- package/lib/pendingStateManager.mjs.map +0 -1
- package/lib/scheduleManager.d.mts.map +0 -1
- package/lib/scheduleManager.mjs.map +0 -1
- package/lib/storageServiceWithAttachBlobs.d.mts.map +0 -1
- package/lib/storageServiceWithAttachBlobs.mjs.map +0 -1
- package/lib/summary/index.d.mts.map +0 -1
- package/lib/summary/index.mjs.map +0 -1
- package/lib/summary/orderedClientElection.d.mts.map +0 -1
- package/lib/summary/orderedClientElection.mjs.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.d.mts.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.mjs.map +0 -1
- package/lib/summary/runningSummarizer.d.mts.map +0 -1
- package/lib/summary/runningSummarizer.mjs.map +0 -1
- package/lib/summary/summarizer.d.mts.map +0 -1
- package/lib/summary/summarizer.mjs.map +0 -1
- package/lib/summary/summarizerClientElection.d.mts.map +0 -1
- package/lib/summary/summarizerClientElection.mjs.map +0 -1
- package/lib/summary/summarizerHeuristics.d.mts.map +0 -1
- package/lib/summary/summarizerHeuristics.mjs.map +0 -1
- package/lib/summary/summarizerNode/index.d.mts.map +0 -1
- package/lib/summary/summarizerNode/index.mjs +0 -7
- package/lib/summary/summarizerNode/index.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +0 -1
- package/lib/summary/summarizerTypes.d.mts.map +0 -1
- package/lib/summary/summarizerTypes.mjs.map +0 -1
- package/lib/summary/summaryCollection.d.mts.map +0 -1
- package/lib/summary/summaryCollection.mjs.map +0 -1
- package/lib/summary/summaryFormat.d.mts.map +0 -1
- package/lib/summary/summaryFormat.mjs.map +0 -1
- package/lib/summary/summaryGenerator.d.mts.map +0 -1
- package/lib/summary/summaryGenerator.mjs.map +0 -1
- package/lib/summary/summaryManager.d.mts.map +0 -1
- package/lib/summary/summaryManager.mjs.map +0 -1
- package/lib/throttler.d.mts.map +0 -1
- package/lib/throttler.mjs.map +0 -1
- package/src/deltaManagerProxyBase.ts +0 -111
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.mjs","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n\tITelemetryBaseLogger,\n\tITelemetryGenericEvent,\n\tFluidObject,\n\tIFluidHandle,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n\tIProvideFluidHandleContext,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tIAudience,\n\tIBatchMessage,\n\tIContainerContext,\n\tIDeltaManager,\n\tIRuntime,\n\tICriticalContainerError,\n\tAttachState,\n\tILoaderOptions,\n\tILoader,\n\tLoaderHeader,\n\tIGetPendingLocalStateProps,\n} from \"@fluidframework/container-definitions\";\nimport {\n\tIContainerRuntime,\n\tIContainerRuntimeEvents,\n} from \"@fluidframework/container-runtime-definitions\";\nimport { assert, delay, LazyPromise } from \"@fluidframework/core-utils\";\nimport { Trace, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tcreateChildLogger,\n\tcreateChildMonitoringContext,\n\tDataCorruptionError,\n\tDataProcessingError,\n\tGenericError,\n\traiseConnectedEvent,\n\tPerformanceEvent,\n\t// eslint-disable-next-line import/no-deprecated\n\tTaggedLoggerAdapter,\n\tMonitoringContext,\n\twrapError,\n\tITelemetryLoggerExt,\n\tUsageError,\n\tLoggingError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tDriverHeader,\n\tFetchSource,\n\tIDocumentStorageService,\n\tISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n\tIClientDetails,\n\tIDocumentMessage,\n\tIQuorumClients,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n\tISnapshotTree,\n\tISummaryContent,\n\tISummaryTree,\n\tMessageType,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tFlushMode,\n\tFlushModeExperimental,\n\tgcTreeKey,\n\tInboundAttachMessage,\n\tIFluidDataStoreContextDetached,\n\tIFluidDataStoreRegistry,\n\tIFluidDataStoreChannel,\n\tIGarbageCollectionData,\n\tIEnvelope,\n\tIInboundSignalMessage,\n\tISignalEnvelope,\n\tNamedFluidDataStoreRegistryEntries,\n\tISummaryTreeWithStats,\n\tISummarizeInternalResult,\n\tCreateChildSummarizerNodeParam,\n\tSummarizeInternalFn,\n\tchannelsTreeName,\n\tIDataStore,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport type {\n\tSerializedIdCompressorWithNoSession,\n\tIIdCompressor,\n\tIIdCompressorCore,\n\tIdCreationRange,\n\tSerializedIdCompressorWithOngoingSession,\n} from \"@fluidframework/id-compressor\";\nimport {\n\taddBlobToSummary,\n\taddSummarizeResultToSummary,\n\taddTreeToSummary,\n\tRequestParser,\n\tcreate404Response,\n\texceptionToResponse,\n\tGCDataBuilder,\n\tseqFromTree,\n\tcalculateStats,\n\tTelemetryContext,\n\tReadAndParseBlob,\n\tresponseToException,\n} from \"@fluidframework/runtime-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { ContainerFluidHandleContext } from \"./containerHandleContext\";\nimport { FluidDataStoreRegistry } from \"./dataStoreRegistry\";\nimport { ReportOpPerfTelemetry, IPerfSignalReport } from \"./connectionTelemetry\";\nimport {\n\tIPendingBatchMessage,\n\tIPendingLocalState,\n\tPendingStateManager,\n} from \"./pendingStateManager\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from \"./blobManager\";\nimport { DataStores, getSummaryForDatastores } from \"./dataStores\";\nimport {\n\taliasBlobName,\n\tblobsTreeName,\n\tchunksBlobName,\n\tcreateRootSummarizerNodeWithGC,\n\telectedSummarizerBlobName,\n\textractSummaryMetadataMessage,\n\tIContainerRuntimeMetadata,\n\tICreateContainerMetadata,\n\tidCompressorBlobName,\n\tIRootSummarizerNodeWithGC,\n\tISummaryMetadataMessage,\n\tmetadataBlobName,\n\tSummarizer,\n\tSummaryManager,\n\twrapSummaryInChannelsTree,\n\tSummaryCollection,\n\tISerializedElection,\n\tOrderedClientCollection,\n\tOrderedClientElection,\n\tSummarizerClientElection,\n\tsummarizerClientType,\n\tSubmitSummaryResult,\n\tIConnectableRuntime,\n\tIGeneratedSummaryStats,\n\tISubmitSummaryOptions,\n\tISummarizerInternalsProvider,\n\tISummarizerRuntime,\n\tIRefreshSummaryAckOptions,\n\tRunWhileConnectedCoordinator,\n\tIGenerateSummaryTreeResult,\n\tRetriableSummaryError,\n\tIOnDemandSummarizeOptions,\n\tISummarizeResults,\n\tIEnqueueSummarizeOptions,\n\tEnqueueSummarizeResult,\n\tISummarizerEvents,\n\tIBaseSummarizeResult,\n\tISummarizer,\n} from \"./summary\";\nimport { formExponentialFn, Throttler } from \"./throttler\";\nimport {\n\tGarbageCollector,\n\tGCNodeType,\n\tgcGenerationOptionName,\n\tIGarbageCollector,\n\tIGCRuntimeOptions,\n\tIGCStats,\n\ttrimLeadingAndTrailingSlashes,\n} from \"./gc\";\nimport { channelToDataStore, IDataStoreAliasMessage, isDataStoreAliasMessage } from \"./dataStore\";\nimport { BindBatchTracker } from \"./batchTracker\";\nimport { ScheduleManager } from \"./scheduleManager\";\nimport {\n\tBatchMessage,\n\tIBatch,\n\tIBatchCheckpoint,\n\tOpCompressor,\n\tOpDecompressor,\n\tOutbox,\n\tOpSplitter,\n\tRemoteMessageProcessor,\n\tOpGroupingManager,\n\tgetLongStack,\n} from \"./opLifecycle\";\nimport { DeltaManagerSummarizerProxy } from \"./deltaManagerSummarizerProxy\";\nimport { IBatchMetadata, IIdAllocationMetadata } from \"./metadata\";\nimport {\n\tContainerMessageType,\n\ttype InboundSequencedContainerRuntimeMessage,\n\ttype InboundSequencedContainerRuntimeMessageOrSystemMessage,\n\ttype ContainerRuntimeIdAllocationMessage,\n\ttype LocalContainerRuntimeMessage,\n\ttype OutboundContainerRuntimeMessage,\n\ttype UnknownContainerRuntimeMessage,\n\tContainerRuntimeGCMessage,\n} from \"./messageTypes\";\n\n/**\n * Utility to implement compat behaviors given an unknown message type\n * The parameters are typed to support compile-time enforcement of handling all known types/behaviors\n *\n * @param _unknownContainerRuntimeMessageType - Typed as something unexpected, to ensure all known types have been\n * handled before calling this function (e.g. in a switch statement).\n * @param compatBehavior - Typed redundantly with CompatModeBehavior to ensure handling is added when updating that type\n */\nfunction compatBehaviorAllowsMessageType(\n\t_unknownContainerRuntimeMessageType: UnknownContainerRuntimeMessage[\"type\"],\n\tcompatBehavior: \"Ignore\" | \"FailToProcess\" | undefined,\n): boolean {\n\t// undefined defaults to same behavior as \"FailToProcess\"\n\treturn compatBehavior === \"Ignore\";\n}\n\n/**\n * @alpha\n */\nexport interface ISummaryBaseConfiguration {\n\t/**\n\t * Delay before first attempt to spawn summarizing container.\n\t */\n\tinitialSummarizerDelayMs: number;\n\n\t/**\n\t * Defines the maximum allowed time to wait for a pending summary ack.\n\t * The maximum amount of time client will wait for a summarize is the minimum of\n\t * maxSummarizeAckWaitTime (currently 3 * 60 * 1000) and maxAckWaitTime.\n\t */\n\tmaxAckWaitTime: number;\n\t/**\n\t * Defines the maximum number of Ops in between Summaries that can be\n\t * allowed before forcibly electing a new summarizer client.\n\t */\n\tmaxOpsSinceLastSummary: number;\n}\n\n/**\n * @alpha\n */\nexport interface ISummaryConfigurationHeuristics extends ISummaryBaseConfiguration {\n\tstate: \"enabled\";\n\t/**\n\t * Defines the maximum allowed time, since the last received Ack, before running the summary\n\t * with reason maxTime.\n\t * For example, say we receive ops one by one just before the idle time is triggered.\n\t * In this case, we still want to run a summary since it's been a while since the last summary.\n\t */\n\tmaxTime: number;\n\t/**\n\t * Defines the maximum number of Ops, since the last received Ack, that can be allowed\n\t * before running the summary with reason maxOps.\n\t */\n\tmaxOps: number;\n\t/**\n\t * Defines the minimum number of Ops, since the last received Ack, that can be allowed\n\t * before running the last summary.\n\t */\n\tminOpsForLastSummaryAttempt: number;\n\t/**\n\t * Defines the lower boundary for the allowed time in between summarizations.\n\t * Pairs with maxIdleTime to form a range.\n\t * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n\t * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n\t * linearly depending on the number of ops we receive.\n\t */\n\tminIdleTime: number;\n\t/**\n\t * Defines the upper boundary for the allowed time in between summarizations.\n\t * Pairs with minIdleTime to form a range.\n\t * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n\t * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n\t * linearly depending on the number of ops we receive.\n\t */\n\tmaxIdleTime: number;\n\t/**\n\t * Runtime op weight to use in heuristic summarizing.\n\t * This number is a multiplier on the number of runtime ops we process when running summarize heuristics.\n\t * For example: (multiplier) * (number of runtime ops) = weighted number of runtime ops\n\t */\n\truntimeOpWeight: number;\n\t/**\n\t * Non-runtime op weight to use in heuristic summarizing\n\t * This number is a multiplier on the number of non-runtime ops we process when running summarize heuristics.\n\t * For example: (multiplier) * (number of non-runtime ops) = weighted number of non-runtime ops\n\t */\n\tnonRuntimeOpWeight: number;\n\n\t/**\n\t * Number of ops since last summary needed before a non-runtime op can trigger running summary heuristics.\n\t *\n\t * Note: Any runtime ops sent before the threshold is reached will trigger heuristics normally.\n\t * This threshold ONLY applies to non-runtime ops triggering summaries.\n\t *\n\t * For example: Say the threshold is 20. Sending 19 non-runtime ops will not trigger any heuristic checks.\n\t * Sending the 20th non-runtime op will trigger the heuristic checks for summarizing.\n\t */\n\tnonRuntimeHeuristicThreshold?: number;\n}\n\n/**\n * @alpha\n */\nexport interface ISummaryConfigurationDisableSummarizer {\n\tstate: \"disabled\";\n}\n\n/**\n * @alpha\n */\nexport interface ISummaryConfigurationDisableHeuristics extends ISummaryBaseConfiguration {\n\tstate: \"disableHeuristics\";\n}\n\n/**\n * @alpha\n */\nexport type ISummaryConfiguration =\n\t| ISummaryConfigurationDisableSummarizer\n\t| ISummaryConfigurationDisableHeuristics\n\t| ISummaryConfigurationHeuristics;\n\n/**\n * @alpha\n */\nexport const DefaultSummaryConfiguration: ISummaryConfiguration = {\n\tstate: \"enabled\",\n\n\tminIdleTime: 0,\n\n\tmaxIdleTime: 30 * 1000, // 30 secs.\n\n\tmaxTime: 60 * 1000, // 1 min.\n\n\tmaxOps: 100, // Summarize if 100 weighted ops received since last snapshot.\n\n\tminOpsForLastSummaryAttempt: 10,\n\n\tmaxAckWaitTime: 3 * 60 * 1000, // 3 mins.\n\n\tmaxOpsSinceLastSummary: 7000,\n\n\tinitialSummarizerDelayMs: 5 * 1000, // 5 secs.\n\n\tnonRuntimeOpWeight: 0.1,\n\n\truntimeOpWeight: 1.0,\n\n\tnonRuntimeHeuristicThreshold: 20,\n};\n\n/**\n * @alpha\n */\nexport interface ISummaryRuntimeOptions {\n\t/** Override summary configurations set by the server. */\n\tsummaryConfigOverrides?: ISummaryConfiguration;\n\n\t/**\n\t * Delay before first attempt to spawn summarizing container.\n\t *\n\t * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n\t * {@link ISummaryBaseConfiguration.initialSummarizerDelayMs} instead.\n\t */\n\tinitialSummarizerDelayMs?: number;\n}\n\n/**\n * Options for op compression.\n * @alpha\n */\nexport interface ICompressionRuntimeOptions {\n\t/**\n\t * The value the batch's content size must exceed for the batch to be compressed.\n\t * By default the value is 600 * 1024 = 614400 bytes. If the value is set to `Infinity`, compression will be disabled.\n\t */\n\treadonly minimumBatchSizeInBytes: number;\n\n\t/**\n\t * The compression algorithm that will be used to compress the op.\n\t * By default the value is `lz4` which is the only compression algorithm currently supported.\n\t */\n\treadonly compressionAlgorithm: CompressionAlgorithms;\n}\n\n/**\n * Options for container runtime.\n * @alpha\n */\nexport interface IContainerRuntimeOptions {\n\treadonly summaryOptions?: ISummaryRuntimeOptions;\n\treadonly gcOptions?: IGCRuntimeOptions;\n\t/**\n\t * Affects the behavior while loading the runtime when the data verification check which\n\t * compares the DeltaManager sequence number (obtained from protocol in summary) to the\n\t * runtime sequence number (obtained from runtime metadata in summary) finds a mismatch.\n\t * 1. \"close\" (default) will close the container with an assertion.\n\t * 2. \"log\" will log an error event to telemetry, but still continue to load.\n\t * 3. \"bypass\" will skip the check entirely. This is not recommended.\n\t */\n\treadonly loadSequenceNumberVerification?: \"close\" | \"log\" | \"bypass\";\n\t/**\n\t * Sets the flush mode for the runtime. In Immediate flush mode the runtime will immediately\n\t * send all operations to the driver layer, while in TurnBased the operations will be buffered\n\t * and then sent them as a single batch at the end of the turn.\n\t * By default, flush mode is TurnBased.\n\t */\n\treadonly flushMode?: FlushMode;\n\t/**\n\t * Enables the runtime to compress ops. See {@link ICompressionRuntimeOptions}.\n\t */\n\treadonly compressionOptions?: ICompressionRuntimeOptions;\n\t/**\n\t * If specified, when in FlushMode.TurnBased, if the size of the ops between JS turns exceeds this value,\n\t * an error will be thrown and the container will close.\n\t *\n\t * If unspecified, the limit is 950 * 1024.\n\t *\n\t * 'Infinity' will disable any limit.\n\t *\n\t * @experimental This config should be driven by the connection with the service and will be moved in the future.\n\t */\n\treadonly maxBatchSizeInBytes?: number;\n\t/**\n\t * If the op payload needs to be chunked in order to work around the maximum size of the batch, this value represents\n\t * how large the individual chunks will be. This is only supported when compression is enabled. If after compression, the\n\t * batch content size exceeds this value, it will be chunked into smaller ops of this exact size.\n\t *\n\t * This value is a trade-off between having many small chunks vs fewer larger chunks and by default, the runtime is configured to use\n\t * 200 * 1024 = 204800 bytes. This default value ensures that no compressed payload's content is able to exceed {@link IContainerRuntimeOptions.maxBatchSizeInBytes}\n\t * regardless of the overhead of an individual op.\n\t *\n\t * Any value of `chunkSizeInBytes` exceeding {@link IContainerRuntimeOptions.maxBatchSizeInBytes} will disable this feature, therefore if a compressed batch's content\n\t * size exceeds {@link IContainerRuntimeOptions.maxBatchSizeInBytes} after compression, the container will close with an instance of `GenericError` with\n\t * the `BatchTooLarge` message.\n\t */\n\treadonly chunkSizeInBytes?: number;\n\n\t/**\n\t * Enable the IdCompressor in the runtime.\n\t * @experimental Not ready for use.\n\t */\n\treadonly enableRuntimeIdCompressor?: boolean;\n\n\t/**\n\t * If enabled, the runtime will block all attempts to send an op inside the\n\t * {@link ContainerRuntime#ensureNoDataModelChanges} callback. The callback is used by\n\t * {@link @fluidframework/shared-object-base#SharedObjectCore} for event handlers so enabling this\n\t * will disallow modifying DDSes while handling DDS events.\n\t *\n\t * By default, the feature is disabled. If enabled from options, the `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t * can be used to disable it at runtime.\n\t */\n\treadonly enableOpReentryCheck?: boolean;\n\t/**\n\t * If enabled, the runtime will group messages within a batch into a single\n\t * message to be sent to the service.\n\t * The grouping an ungrouping of such messages is handled by the \"OpGroupingManager\".\n\t *\n\t * By default, the feature is disabled. If enabled from options, the `Fluid.ContainerRuntime.DisableGroupedBatching`\n\t * flag can be used to disable it at runtime.\n\t *\n\t * @experimental Not ready for use.\n\t */\n\treadonly enableGroupedBatching?: boolean;\n}\n\n/**\n * Accepted header keys for requests coming to the runtime.\n * @internal\n */\nexport enum RuntimeHeaders {\n\t/** True to wait for a data store to be created and loaded before returning it. */\n\twait = \"wait\",\n\t/** True if the request is coming from an IFluidHandle. */\n\tviaHandle = \"viaHandle\",\n}\n\n/** True if a tombstoned object should be returned without erroring\n * @alpha\n */\nexport const AllowTombstoneRequestHeaderKey = \"allowTombstone\"; // Belongs in the enum above, but avoiding the breaking change\n/**\n * [IRRELEVANT IF throwOnInactiveLoad OPTION NOT SET] True if an inactive object should be returned without erroring\n * @internal\n */\nexport const AllowInactiveRequestHeaderKey = \"allowInactive\"; // Belongs in the enum above, but avoiding the breaking change\n\n/**\n * Tombstone error responses will have this header set to true\n * @alpha\n */\nexport const TombstoneResponseHeaderKey = \"isTombstoned\";\n/**\n * Inactive error responses will have this header set to true\n * @alpha\n */\nexport const InactiveResponseHeaderKey = \"isInactive\";\n\n/**\n * The full set of parsed header data that may be found on Runtime requests\n */\nexport interface RuntimeHeaderData {\n\twait?: boolean;\n\tviaHandle?: boolean;\n\tallowTombstone?: boolean;\n\tallowInactive?: boolean;\n}\n\n/** Default values for Runtime Headers */\nexport const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {\n\twait: true,\n\tviaHandle: false,\n\tallowTombstone: false,\n\tallowInactive: false,\n};\n\n/**\n * Available compression algorithms for op compression.\n * @alpha\n */\nexport enum CompressionAlgorithms {\n\tlz4 = \"lz4\",\n}\n\n/**\n * @deprecated\n * Untagged logger is unsupported going forward. There are old loaders with old ContainerContexts that only\n * have the untagged logger, so to accommodate that scenario the below interface is used. It can be removed once\n * its usage is removed from TaggedLoggerAdapter fallback.\n */\ninterface OldContainerContextWithLogger extends Omit<IContainerContext, \"taggedLogger\"> {\n\tlogger: ITelemetryBaseLogger;\n\ttaggedLogger: undefined;\n}\n\n/**\n * State saved when the container closes, to be given back to a newly\n * instantiated runtime in a new instance of the container, so it can load to the\n * same state\n */\nexport interface IPendingRuntimeState {\n\t/**\n\t * Pending ops from PendingStateManager\n\t */\n\tpending?: IPendingLocalState;\n\t/**\n\t * Pending blobs from BlobManager\n\t */\n\tpendingAttachmentBlobs?: IPendingBlobs;\n\t/**\n\t * Pending idCompressor state\n\t */\n\tpendingIdCompressorState?: SerializedIdCompressorWithOngoingSession;\n}\n\nconst maxConsecutiveReconnectsKey = \"Fluid.ContainerRuntime.MaxConsecutiveReconnects\";\n\nconst defaultFlushMode = FlushMode.TurnBased;\n\n// The actual limit is 1Mb (socket.io and Kafka limits)\n// We can't estimate it fully, as we\n// - do not know what properties relay service will add\n// - we do not stringify final op, thus we do not know how much escaping will be added.\nconst defaultMaxBatchSizeInBytes = 700 * 1024;\n\nconst defaultCompressionConfig = {\n\t// Batches with content size exceeding this value will be compressed\n\tminimumBatchSizeInBytes: 614400,\n\tcompressionAlgorithm: CompressionAlgorithms.lz4,\n};\n\nconst defaultChunkSizeInBytes = 204800;\n\n/** The default time to wait for pending ops to be processed during summarization */\nexport const defaultPendingOpsWaitTimeoutMs = 1000;\n/** The default time to delay a summarization retry attempt when there are pending ops */\nexport const defaultPendingOpsRetryDelayMs = 1000;\n\n/**\n * Instead of refreshing from latest because we do not have 100% confidence in the state\n * of the current system, we should close the summarizer and let it recover.\n * This delay's goal is to prevent tight restart loops\n */\nconst defaultCloseSummarizerDelayMs = 5000; // 5 seconds\n\n/**\n * @deprecated use ContainerRuntimeMessageType instead\n * @internal\n */\nexport enum RuntimeMessage {\n\tFluidDataStoreOp = \"component\",\n\tAttach = \"attach\",\n\tChunkedOp = \"chunkedOp\",\n\tBlobAttach = \"blobAttach\",\n\tRejoin = \"rejoin\",\n\tAlias = \"alias\",\n\tOperation = \"op\",\n}\n\n/**\n * @deprecated please use version in driver-utils\n * @internal\n */\nexport function isRuntimeMessage(message: ISequencedDocumentMessage): boolean {\n\treturn (Object.values(RuntimeMessage) as string[]).includes(message.type);\n}\n\n/**\n * Legacy ID for the built-in AgentScheduler. To minimize disruption while removing it, retaining this as a\n * special-case for document dirty state. Ultimately we should have no special-cases from the\n * ContainerRuntime's perspective.\n * @internal\n */\nexport const agentSchedulerId = \"_scheduler\";\n\n// safely check navigator and get the hardware spec value\nexport function getDeviceSpec() {\n\ttry {\n\t\tif (typeof navigator === \"object\" && navigator !== null) {\n\t\t\treturn {\n\t\t\t\tdeviceMemory: (navigator as any).deviceMemory,\n\t\t\t\thardwareConcurrency: navigator.hardwareConcurrency,\n\t\t\t};\n\t\t}\n\t} catch {}\n\treturn {};\n}\n\n/**\n * Older loader doesn't have a submitBatchFn member, this is the older way of submitting a batch.\n * Rather than exposing the submitFn (now deprecated) and IDeltaManager (dangerous to hand out) to the Outbox,\n * we can provide a partially-applied function to keep those items private to the ContainerRuntime.\n */\nexport const makeLegacySendBatchFn =\n\t(\n\t\tsubmitFn: (type: MessageType, contents: any, batch: boolean, appData?: any) => number,\n\t\tdeltaManager: Pick<IDeltaManager<unknown, unknown>, \"flush\">,\n\t) =>\n\t(batch: IBatch) => {\n\t\tfor (const message of batch.content) {\n\t\t\tsubmitFn(\n\t\t\t\tMessageType.Operation,\n\t\t\t\t// For back-compat (submitFn only works on deserialized content)\n\t\t\t\tmessage.contents === undefined ? undefined : JSON.parse(message.contents),\n\t\t\t\ttrue, // batch\n\t\t\t\tmessage.metadata,\n\t\t\t);\n\t\t}\n\n\t\tdeltaManager.flush();\n\t};\n\n/** Helper type for type constraints passed through several functions.\n * message - The unpacked message. Likely a TypedContainerRuntimeMessage, but could also be a system op\n * modernRuntimeMessage - Does this appear like a current TypedContainerRuntimeMessage?\n * local - Did this client send the op?\n */\ntype MessageWithContext =\n\t| {\n\t\t\tmessage: InboundSequencedContainerRuntimeMessage;\n\t\t\tmodernRuntimeMessage: true;\n\t\t\tlocal: boolean;\n\t }\n\t| {\n\t\t\tmessage: InboundSequencedContainerRuntimeMessageOrSystemMessage;\n\t\t\tmodernRuntimeMessage: false;\n\t\t\tlocal: boolean;\n\t };\n\nconst summarizerRequestUrl = \"_summarizer\";\n\n/**\n * Create and retrieve the summmarizer\n */\nasync function createSummarizer(loader: ILoader, url: string): Promise<ISummarizer> {\n\tconst request: IRequest = {\n\t\theaders: {\n\t\t\t[LoaderHeader.cache]: false,\n\t\t\t[LoaderHeader.clientDetails]: {\n\t\t\t\tcapabilities: { interactive: false },\n\t\t\t\ttype: summarizerClientType,\n\t\t\t},\n\t\t\t[DriverHeader.summarizingClient]: true,\n\t\t\t[LoaderHeader.reconnect]: false,\n\t\t},\n\t\turl,\n\t};\n\n\tconst resolvedContainer = await loader.resolve(request);\n\tlet fluidObject: FluidObject<ISummarizer> | undefined;\n\n\t// Older containers may not have the \"getEntryPoint\" API\n\t// ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0\n\tif (resolvedContainer.getEntryPoint !== undefined) {\n\t\tfluidObject = await resolvedContainer.getEntryPoint();\n\t} else {\n\t\tconst response = await (resolvedContainer as any).request({\n\t\t\turl: `/${summarizerRequestUrl}`,\n\t\t});\n\t\tif (response.status !== 200 || response.mimeType !== \"fluid/object\") {\n\t\t\tthrow responseToException(response, request);\n\t\t}\n\t\tfluidObject = response.value;\n\t}\n\n\tif (fluidObject?.ISummarizer === undefined) {\n\t\tthrow new UsageError(\"Fluid object does not implement ISummarizer\");\n\t}\n\treturn fluidObject.ISummarizer;\n}\n\n/**\n * Represents the runtime of the container. Contains helper functions/state of the container.\n * It will define the store level mappings.\n * @alpha\n */\nexport class ContainerRuntime\n\textends TypedEventEmitter<IContainerRuntimeEvents & ISummarizerEvents>\n\timplements\n\t\tIContainerRuntime,\n\t\tIRuntime,\n\t\tISummarizerRuntime,\n\t\tISummarizerInternalsProvider,\n\t\tIProvideFluidHandleContext\n{\n\t/**\n\t * Load the stores from a snapshot and returns the runtime.\n\t * @param params - An object housing the runtime properties:\n\t * - context - Context of the container.\n\t * - registryEntries - Mapping from data store types to their corresponding factories.\n\t * - existing - Pass 'true' if loading from an existing snapshot.\n\t * - requestHandler - (optional) Request handler for the request() method of the container runtime.\n\t * Only relevant for back-compat while we remove the request() method and move fully to entryPoint as the main pattern.\n\t * - runtimeOptions - Additional options to be passed to the runtime\n\t * - containerScope - runtime services provided with context\n\t * - containerRuntimeCtor - Constructor to use to create the ContainerRuntime instance.\n\t * This allows mixin classes to leverage this method to define their own async initializer.\n\t * - provideEntryPoint - Promise that resolves to an object which will act as entryPoint for the Container.\n\t * This object should provide all the functionality that the Container is expected to provide to the loader layer.\n\t */\n\tpublic static async loadRuntime(params: {\n\t\tcontext: IContainerContext;\n\t\tregistryEntries: NamedFluidDataStoreRegistryEntries;\n\t\texisting: boolean;\n\t\truntimeOptions?: IContainerRuntimeOptions;\n\t\tcontainerScope?: FluidObject;\n\t\tcontainerRuntimeCtor?: typeof ContainerRuntime;\n\t\t/** @deprecated Will be removed once Loader LTS version is \"2.0.0-internal.7.0.0\". Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md */\n\t\trequestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>;\n\t\tprovideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>;\n\t}): Promise<ContainerRuntime> {\n\t\tconst {\n\t\t\tcontext,\n\t\t\tregistryEntries,\n\t\t\texisting,\n\t\t\trequestHandler,\n\t\t\tprovideEntryPoint,\n\t\t\truntimeOptions = {},\n\t\t\tcontainerScope = {},\n\t\t\tcontainerRuntimeCtor = ContainerRuntime,\n\t\t} = params;\n\n\t\t// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:\n\t\t// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45\n\t\tconst backCompatContext: IContainerContext | OldContainerContextWithLogger = context;\n\t\tconst passLogger =\n\t\t\tbackCompatContext.taggedLogger ??\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\tnew TaggedLoggerAdapter((backCompatContext as OldContainerContextWithLogger).logger);\n\t\tconst logger = createChildLogger({\n\t\t\tlogger: passLogger,\n\t\t\tproperties: {\n\t\t\t\tall: {\n\t\t\t\t\truntimeVersion: pkgVersion,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst {\n\t\t\tsummaryOptions = {},\n\t\t\tgcOptions = {},\n\t\t\tloadSequenceNumberVerification = \"close\",\n\t\t\tflushMode = defaultFlushMode,\n\t\t\tcompressionOptions = defaultCompressionConfig,\n\t\t\tmaxBatchSizeInBytes = defaultMaxBatchSizeInBytes,\n\t\t\tenableRuntimeIdCompressor = false,\n\t\t\tchunkSizeInBytes = defaultChunkSizeInBytes,\n\t\t\tenableOpReentryCheck = false,\n\t\t\tenableGroupedBatching = false,\n\t\t} = runtimeOptions;\n\n\t\tconst registry = new FluidDataStoreRegistry(registryEntries);\n\n\t\tconst tryFetchBlob = async <T>(blobName: string): Promise<T | undefined> => {\n\t\t\tconst blobId = context.baseSnapshot?.blobs[blobName];\n\t\t\tif (context.baseSnapshot && blobId) {\n\t\t\t\t// IContainerContext storage api return type still has undefined in 0.39 package version.\n\t\t\t\t// So once we release 0.40 container-defn package we can remove this check.\n\t\t\t\tassert(\n\t\t\t\t\tcontext.storage !== undefined,\n\t\t\t\t\t0x1f5 /* \"Attached state should have storage\" */,\n\t\t\t\t);\n\t\t\t\treturn readAndParse<T>(context.storage, blobId);\n\t\t\t}\n\t\t};\n\n\t\tconst [chunks, metadata, electedSummarizerData, aliases, serializedIdCompressor] =\n\t\t\tawait Promise.all([\n\t\t\t\ttryFetchBlob<[string, string[]][]>(chunksBlobName),\n\t\t\t\ttryFetchBlob<IContainerRuntimeMetadata>(metadataBlobName),\n\t\t\t\ttryFetchBlob<ISerializedElection>(electedSummarizerBlobName),\n\t\t\t\ttryFetchBlob<[string, string][]>(aliasBlobName),\n\t\t\t\ttryFetchBlob<SerializedIdCompressorWithNoSession>(idCompressorBlobName),\n\t\t\t]);\n\n\t\t// read snapshot blobs needed for BlobManager to load\n\t\tconst blobManagerSnapshot = await BlobManager.load(\n\t\t\tcontext.baseSnapshot?.trees[blobsTreeName],\n\t\t\tasync (id) => {\n\t\t\t\t// IContainerContext storage api return type still has undefined in 0.39 package version.\n\t\t\t\t// So once we release 0.40 container-defn package we can remove this check.\n\t\t\t\tassert(\n\t\t\t\t\tcontext.storage !== undefined,\n\t\t\t\t\t0x256 /* \"storage undefined in attached container\" */,\n\t\t\t\t);\n\t\t\t\treturn readAndParse(context.storage, id);\n\t\t\t},\n\t\t);\n\n\t\t// Verify summary runtime sequence number matches protocol sequence number.\n\t\tconst runtimeSequenceNumber = metadata?.message?.sequenceNumber;\n\t\t// When we load with pending state, we reuse an old snapshot so we don't expect these numbers to match\n\t\tif (!context.pendingLocalState && runtimeSequenceNumber !== undefined) {\n\t\t\tconst protocolSequenceNumber = context.deltaManager.initialSequenceNumber;\n\t\t\t// Unless bypass is explicitly set, then take action when sequence numbers mismatch.\n\t\t\tif (\n\t\t\t\tloadSequenceNumberVerification !== \"bypass\" &&\n\t\t\t\truntimeSequenceNumber !== protocolSequenceNumber\n\t\t\t) {\n\t\t\t\t// \"Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber\"\n\t\t\t\tconst error = new DataCorruptionError(\n\t\t\t\t\t// pre-0.58 error message: SummaryMetadataMismatch\n\t\t\t\t\t\"Summary metadata mismatch\",\n\t\t\t\t\t{ runtimeVersion: pkgVersion, runtimeSequenceNumber, protocolSequenceNumber },\n\t\t\t\t);\n\n\t\t\t\tif (loadSequenceNumberVerification === \"log\") {\n\t\t\t\t\tlogger.sendErrorEvent({ eventName: \"SequenceNumberMismatch\" }, error);\n\t\t\t\t} else {\n\t\t\t\t\tcontext.closeFn(error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst idCompressorEnabled =\n\t\t\tmetadata?.idCompressorEnabled ?? runtimeOptions.enableRuntimeIdCompressor ?? false;\n\t\tlet idCompressor: (IIdCompressor & IIdCompressorCore) | undefined;\n\t\tif (idCompressorEnabled) {\n\t\t\tconst { createIdCompressor, deserializeIdCompressor, createSessionId } = await import(\n\t\t\t\t\"@fluidframework/id-compressor\"\n\t\t\t);\n\n\t\t\tconst pendingLocalState = context.pendingLocalState as IPendingRuntimeState;\n\n\t\t\tif (pendingLocalState?.pendingIdCompressorState !== undefined) {\n\t\t\t\tidCompressor = deserializeIdCompressor(pendingLocalState.pendingIdCompressorState);\n\t\t\t} else if (serializedIdCompressor !== undefined) {\n\t\t\t\tidCompressor = deserializeIdCompressor(serializedIdCompressor, createSessionId());\n\t\t\t} else {\n\t\t\t\tidCompressor = createIdCompressor(logger);\n\t\t\t}\n\t\t}\n\n\t\tconst runtime = new containerRuntimeCtor(\n\t\t\tcontext,\n\t\t\tregistry,\n\t\t\tmetadata,\n\t\t\telectedSummarizerData,\n\t\t\tchunks ?? [],\n\t\t\taliases ?? [],\n\t\t\t{\n\t\t\t\tsummaryOptions,\n\t\t\t\tgcOptions,\n\t\t\t\tloadSequenceNumberVerification,\n\t\t\t\tflushMode,\n\t\t\t\tcompressionOptions,\n\t\t\t\tmaxBatchSizeInBytes,\n\t\t\t\tchunkSizeInBytes,\n\t\t\t\tenableRuntimeIdCompressor,\n\t\t\t\tenableOpReentryCheck,\n\t\t\t\tenableGroupedBatching,\n\t\t\t},\n\t\t\tcontainerScope,\n\t\t\tlogger,\n\t\t\texisting,\n\t\t\tblobManagerSnapshot,\n\t\t\tcontext.storage,\n\t\t\tidCompressor,\n\t\t\tprovideEntryPoint,\n\t\t\trequestHandler,\n\t\t\tundefined, // summaryConfiguration\n\t\t);\n\n\t\t// Apply stashed ops with a reference sequence number equal to the sequence number of the snapshot,\n\t\t// or zero. This must be done before Container replays saved ops.\n\t\tawait runtime.pendingStateManager.applyStashedOpsAt(runtimeSequenceNumber ?? 0);\n\n\t\t// Initialize the base state of the runtime before it's returned.\n\t\tawait runtime.initializeBaseState();\n\n\t\treturn runtime;\n\t}\n\n\tpublic readonly options: ILoaderOptions;\n\tprivate imminentClosure: boolean = false;\n\n\tprivate readonly _getClientId: () => string | undefined;\n\tpublic get clientId(): string | undefined {\n\t\treturn this._getClientId();\n\t}\n\n\tpublic readonly clientDetails: IClientDetails;\n\n\tpublic get storage(): IDocumentStorageService {\n\t\treturn this._storage;\n\t}\n\n\tprivate readonly submitFn: (\n\t\ttype: MessageType,\n\t\tcontents: any,\n\t\tbatch: boolean,\n\t\tappData?: any,\n\t) => number;\n\t/**\n\t * Although current IContainerContext guarantees submitBatchFn, it is not available on older loaders.\n\t */\n\tprivate readonly submitBatchFn:\n\t\t| ((batch: IBatchMessage[], referenceSequenceNumber?: number) => number)\n\t\t| undefined;\n\tprivate readonly submitSummaryFn: (\n\t\tsummaryOp: ISummaryContent,\n\t\treferenceSequenceNumber?: number,\n\t) => number;\n\tprivate readonly submitSignalFn: (content: any, targetClientId?: string) => void;\n\tpublic readonly disposeFn: (error?: ICriticalContainerError) => void;\n\tpublic readonly closeFn: (error?: ICriticalContainerError) => void;\n\n\tpublic get flushMode(): FlushMode {\n\t\treturn this._flushMode;\n\t}\n\n\tpublic get scope(): FluidObject {\n\t\treturn this.containerScope;\n\t}\n\n\tpublic get IFluidDataStoreRegistry(): IFluidDataStoreRegistry {\n\t\treturn this.registry;\n\t}\n\n\tprivate readonly _getAttachState: () => AttachState;\n\tpublic get attachState(): AttachState {\n\t\treturn this._getAttachState();\n\t}\n\n\tpublic idCompressor: (IIdCompressor & IIdCompressorCore) | undefined;\n\n\tpublic get IFluidHandleContext(): IFluidHandleContext {\n\t\treturn this.handleContext;\n\t}\n\tprivate readonly handleContext: ContainerFluidHandleContext;\n\n\t/**\n\t * This is a proxy to the delta manager provided by the container context (innerDeltaManager). It restricts certain\n\t * accesses such as sets \"read-only\" mode for the summarizer client. This is the default delta manager that should\n\t * be used unless the innerDeltaManager is required.\n\t */\n\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t/**\n\t * The delta manager provided by the container context. By default, using the default delta manager (proxy)\n\t * should be sufficient. This should be used only if necessary. For example, for validating and propagating connected\n\t * events which requires access to the actual real only info, this is needed.\n\t */\n\tprivate readonly innerDeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\n\t// internal logger for ContainerRuntime. Use this.logger for stores, summaries, etc.\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate readonly summarizerClientElection?: SummarizerClientElection;\n\t/**\n\t * summaryManager will only be created if this client is permitted to spawn a summarizing client\n\t * It is created only by interactive client, i.e. summarizer client, as well as non-interactive bots\n\t * do not create it (see SummarizerClientElection.clientDetailsPermitElection() for details)\n\t */\n\tprivate readonly summaryManager?: SummaryManager;\n\tprivate readonly summaryCollection: SummaryCollection;\n\n\tprivate readonly summarizerNode: IRootSummarizerNodeWithGC;\n\n\tprivate readonly maxConsecutiveReconnects: number;\n\tprivate readonly defaultMaxConsecutiveReconnects = 7;\n\n\tprivate _orderSequentiallyCalls: number = 0;\n\tprivate readonly _flushMode: FlushMode;\n\tprivate flushTaskExists = false;\n\n\tprivate _connected: boolean;\n\n\tprivate consecutiveReconnects = 0;\n\n\t/**\n\t * Used to delay transition to \"connected\" state while we upload\n\t * attachment blobs that were added while disconnected\n\t */\n\tprivate delayConnectClientId?: string;\n\n\tprivate ensureNoDataModelChangesCalls = 0;\n\n\t/**\n\t * Tracks the number of detected reentrant ops to report,\n\t * in order to self-throttle the telemetry events.\n\t *\n\t * This should be removed as part of ADO:2322\n\t */\n\tprivate opReentryCallsToReport = 5;\n\n\t/**\n\t * Invokes the given callback and expects that no ops are submitted\n\t * until execution finishes. If an op is submitted, an error will be raised.\n\t *\n\t * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t *\n\t * @param callback - the callback to be invoked\n\t */\n\tpublic ensureNoDataModelChanges<T>(callback: () => T): T {\n\t\tthis.ensureNoDataModelChangesCalls++;\n\t\ttry {\n\t\t\treturn callback();\n\t\t} finally {\n\t\t\tthis.ensureNoDataModelChangesCalls--;\n\t\t}\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn this._connected;\n\t}\n\n\t/** clientId of parent (non-summarizing) container that owns summarizer container */\n\tpublic get summarizerClientId(): string | undefined {\n\t\treturn this.summarizerClientElection?.electedClientId;\n\t}\n\n\tprivate _disposed = false;\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate dirtyContainer: boolean;\n\tprivate emitDirtyDocumentEvent = true;\n\tprivate readonly enableOpReentryCheck: boolean;\n\tprivate readonly disableAttachReorder: boolean | undefined;\n\tprivate readonly closeSummarizerDelayMs: number;\n\t/**\n\t * If true, summary generated is validate before uploading it to the server. With single commit summaries,\n\t * summaries will be accepted once uploaded, so they should be validated before upload. However, this can\n\t * currently be controlled via a feature flag as its a new functionality.\n\t */\n\tprivate readonly validateSummaryBeforeUpload: boolean;\n\n\tprivate readonly defaultTelemetrySignalSampleCount = 100;\n\tprivate readonly _perfSignalData: IPerfSignalReport = {\n\t\tsignalsLost: 0,\n\t\tsignalSequenceNumber: 0,\n\t\tsignalTimestamp: 0,\n\t\ttrackingSignalSequenceNumber: undefined,\n\t};\n\n\t/**\n\t * Summarizer is responsible for coordinating when to send generate and send summaries.\n\t * It is the main entry point for summary work.\n\t * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n\t */\n\tprivate readonly _summarizer?: Summarizer;\n\tprivate readonly scheduleManager: ScheduleManager;\n\tprivate readonly blobManager: BlobManager;\n\tprivate readonly pendingStateManager: PendingStateManager;\n\tprivate readonly outbox: Outbox;\n\tprivate readonly garbageCollector: IGarbageCollector;\n\n\tprivate readonly dataStores: DataStores;\n\tprivate readonly remoteMessageProcessor: RemoteMessageProcessor;\n\n\t/** The last message processed at the time of the last summary. */\n\tprivate messageAtLastSummary: ISummaryMetadataMessage | undefined;\n\n\tprivate get summarizer(): Summarizer {\n\t\tassert(this._summarizer !== undefined, 0x257 /* \"This is not summarizing container\" */);\n\t\treturn this._summarizer;\n\t}\n\n\tprivate readonly summariesDisabled: boolean;\n\tprivate isSummariesDisabled(): boolean {\n\t\treturn this.summaryConfiguration.state === \"disabled\";\n\t}\n\n\tprivate readonly heuristicsDisabled: boolean;\n\tprivate isHeuristicsDisabled(): boolean {\n\t\treturn this.summaryConfiguration.state === \"disableHeuristics\";\n\t}\n\n\tprivate readonly maxOpsSinceLastSummary: number;\n\tprivate getMaxOpsSinceLastSummary(): number {\n\t\treturn this.summaryConfiguration.state !== \"disabled\"\n\t\t\t? this.summaryConfiguration.maxOpsSinceLastSummary\n\t\t\t: 0;\n\t}\n\n\tprivate readonly initialSummarizerDelayMs: number;\n\tprivate getInitialSummarizerDelayMs(): number {\n\t\t// back-compat: initialSummarizerDelayMs was moved from ISummaryRuntimeOptions\n\t\t// to ISummaryConfiguration in 0.60.\n\t\tif (this.runtimeOptions.summaryOptions.initialSummarizerDelayMs !== undefined) {\n\t\t\treturn this.runtimeOptions.summaryOptions.initialSummarizerDelayMs;\n\t\t}\n\t\treturn this.summaryConfiguration.state !== \"disabled\"\n\t\t\t? this.summaryConfiguration.initialSummarizerDelayMs\n\t\t\t: 0;\n\t}\n\n\tprivate readonly createContainerMetadata: ICreateContainerMetadata;\n\t/**\n\t * The summary number of the next summary that will be generated for this container. This is incremented every time\n\t * a summary is generated.\n\t */\n\tprivate nextSummaryNumber: number;\n\n\t/** If false, loading or using a Tombstoned object should merely log, not fail */\n\tpublic get gcTombstoneEnforcementAllowed(): boolean {\n\t\treturn this.garbageCollector.tombstoneEnforcementAllowed;\n\t}\n\n\t/** If true, throw an error when a tombstone data store is used. */\n\tpublic get gcThrowOnTombstoneUsage(): boolean {\n\t\treturn this.garbageCollector.throwOnTombstoneUsage;\n\t}\n\n\t/**\n\t * GUID to identify a document in telemetry\n\t * ! Note: should not be used for anything other than telemetry and is not considered a stable GUID\n\t */\n\tprivate readonly telemetryDocumentId: string;\n\n\t/**\n\t * If true, the runtime has access to an IdCompressor\n\t */\n\tprivate readonly idCompressorEnabled: boolean;\n\n\t/**\n\t * Whether this client is the summarizer client itself (type is summarizerClientType)\n\t */\n\tprivate readonly isSummarizerClient: boolean;\n\n\t/**\n\t * The id of the version used to initially load this runtime, or undefined if it's newly created.\n\t */\n\tprivate readonly loadedFromVersionId: string | undefined;\n\n\t/***/\n\tprotected constructor(\n\t\tcontext: IContainerContext,\n\t\tprivate readonly registry: IFluidDataStoreRegistry,\n\t\tmetadata: IContainerRuntimeMetadata | undefined,\n\t\telectedSummarizerData: ISerializedElection | undefined,\n\t\tchunks: [string, string[]][],\n\t\tdataStoreAliasMap: [string, string][],\n\t\tprivate readonly runtimeOptions: Readonly<Required<IContainerRuntimeOptions>>,\n\t\tprivate readonly containerScope: FluidObject,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\texisting: boolean,\n\t\tblobManagerSnapshot: IBlobManagerLoadInfo,\n\t\tprivate readonly _storage: IDocumentStorageService,\n\t\tidCompressor: (IIdCompressor & IIdCompressorCore) | undefined,\n\t\tprovideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,\n\t\tprivate readonly requestHandler?: (\n\t\t\trequest: IRequest,\n\t\t\truntime: IContainerRuntime,\n\t\t) => Promise<IResponse>,\n\t\tprivate readonly summaryConfiguration: ISummaryConfiguration = {\n\t\t\t// the defaults\n\t\t\t...DefaultSummaryConfiguration,\n\t\t\t// the runtime configuration overrides\n\t\t\t...runtimeOptions.summaryOptions?.summaryConfigOverrides,\n\t\t},\n\t) {\n\t\tsuper();\n\n\t\tconst {\n\t\t\toptions,\n\t\t\tclientDetails,\n\t\t\tconnected,\n\t\t\tbaseSnapshot,\n\t\t\tsubmitFn,\n\t\t\tsubmitBatchFn,\n\t\t\tsubmitSummaryFn,\n\t\t\tsubmitSignalFn,\n\t\t\tdisposeFn,\n\t\t\tcloseFn,\n\t\t\tdeltaManager,\n\t\t\tquorum,\n\t\t\taudience,\n\t\t\tloader,\n\t\t\tpendingLocalState,\n\t\t\tsupportedFeatures,\n\t\t} = context;\n\n\t\tthis.innerDeltaManager = deltaManager;\n\t\tthis.deltaManager = new DeltaManagerSummarizerProxy(this.innerDeltaManager);\n\n\t\t// Here we could wrap/intercept on these functions to block/modify outgoing messages if needed.\n\t\t// This makes ContainerRuntime the final gatekeeper for outgoing messages.\n\t\tthis.submitFn = submitFn;\n\t\tthis.submitBatchFn = submitBatchFn;\n\t\tthis.submitSummaryFn = submitSummaryFn;\n\t\tthis.submitSignalFn = submitSignalFn;\n\n\t\tthis.options = options;\n\t\tthis.clientDetails = clientDetails;\n\t\tthis.isSummarizerClient = this.clientDetails.type === summarizerClientType;\n\t\tthis.loadedFromVersionId = context.getLoadedFromVersion()?.id;\n\t\tthis._getClientId = () => context.clientId;\n\t\tthis._getAttachState = () => context.attachState;\n\t\tthis.getAbsoluteUrl = async (relativeUrl: string) => {\n\t\t\tif (context.getAbsoluteUrl === undefined) {\n\t\t\t\tthrow new Error(\"Driver does not implement getAbsoluteUrl\");\n\t\t\t}\n\t\t\tif (this.attachState !== AttachState.Attached) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn context.getAbsoluteUrl(relativeUrl);\n\t\t};\n\t\t// TODO: Consider that the Container could just listen to these events itself, or even more appropriately maybe the\n\t\t// customer should observe dirty state on the runtime (the owner of dirty state) directly, rather than on the IContainer.\n\t\tthis.on(\"dirty\", () => context.updateDirtyContainerState(true));\n\t\tthis.on(\"saved\", () => context.updateDirtyContainerState(false));\n\n\t\t// In old loaders without dispose functionality, closeFn is equivalent but will also switch container to readonly mode\n\t\tthis.disposeFn = disposeFn ?? closeFn;\n\t\t// In cases of summarizer, we want to dispose instead since consumer doesn't interact with this container\n\t\tthis.closeFn = this.isSummarizerClient ? this.disposeFn : closeFn;\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: this.logger,\n\t\t\tnamespace: \"ContainerRuntime\",\n\t\t});\n\n\t\tlet loadSummaryNumber: number;\n\t\t// Get the container creation metadata. For new container, we initialize these. For existing containers,\n\t\t// get the values from the metadata blob.\n\t\tif (existing) {\n\t\t\tthis.createContainerMetadata = {\n\t\t\t\tcreateContainerRuntimeVersion: metadata?.createContainerRuntimeVersion,\n\t\t\t\tcreateContainerTimestamp: metadata?.createContainerTimestamp,\n\t\t\t};\n\t\t\t// summaryNumber was renamed from summaryCount. For older docs that haven't been opened for a long time,\n\t\t\t// the count is reset to 0.\n\t\t\tloadSummaryNumber = metadata?.summaryNumber ?? 0;\n\n\t\t\t// Enabling the IdCompressor is a one-way operation and we only want to\n\t\t\t// allow new containers to turn it on\n\t\t\tthis.idCompressorEnabled = metadata?.idCompressorEnabled ?? false;\n\t\t} else {\n\t\t\tthis.createContainerMetadata = {\n\t\t\t\tcreateContainerRuntimeVersion: pkgVersion,\n\t\t\t\tcreateContainerTimestamp: Date.now(),\n\t\t\t};\n\t\t\tloadSummaryNumber = 0;\n\n\t\t\tthis.idCompressorEnabled =\n\t\t\t\tthis.mc.config.getBoolean(\"Fluid.ContainerRuntime.IdCompressorEnabled\") ??\n\t\t\t\tidCompressor !== undefined;\n\t\t}\n\t\tthis.nextSummaryNumber = loadSummaryNumber + 1;\n\n\t\tthis.messageAtLastSummary = metadata?.message;\n\n\t\t// Note that we only need to pull the *initial* connected state from the context.\n\t\t// Later updates come through calls to setConnectionState.\n\t\tthis._connected = connected;\n\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName: \"GCFeatureMatrix\",\n\t\t\tmetadataValue: JSON.stringify(metadata?.gcFeatureMatrix),\n\t\t\tinputs: JSON.stringify({\n\t\t\t\tgcOptions_gcGeneration: this.runtimeOptions.gcOptions[gcGenerationOptionName],\n\t\t\t}),\n\t\t});\n\n\t\tthis.telemetryDocumentId = metadata?.telemetryDocumentId ?? uuid();\n\n\t\tthis.disableAttachReorder = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.disableAttachOpReorder\",\n\t\t);\n\t\tconst disableChunking = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.CompressionChunkingDisabled\",\n\t\t);\n\n\t\tconst opGroupingManager = new OpGroupingManager(\n\t\t\t{\n\t\t\t\tgroupedBatchingEnabled: this.groupedBatchingEnabled,\n\t\t\t\topCountThreshold:\n\t\t\t\t\tthis.mc.config.getNumber(\"Fluid.ContainerRuntime.GroupedBatchingOpCount\") ?? 2,\n\t\t\t\treentrantBatchGroupingEnabled:\n\t\t\t\t\tthis.mc.config.getBoolean(\"Fluid.ContainerRuntime.GroupedBatchingReentrancy\") ??\n\t\t\t\t\ttrue,\n\t\t\t},\n\t\t\tthis.mc.logger,\n\t\t);\n\n\t\tconst opSplitter = new OpSplitter(\n\t\t\tchunks,\n\t\t\tthis.submitBatchFn,\n\t\t\tdisableChunking === true ? Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes,\n\t\t\truntimeOptions.maxBatchSizeInBytes,\n\t\t\tthis.mc.logger,\n\t\t);\n\n\t\tthis.remoteMessageProcessor = new RemoteMessageProcessor(\n\t\t\topSplitter,\n\t\t\tnew OpDecompressor(this.mc.logger),\n\t\t\topGroupingManager,\n\t\t);\n\n\t\tthis.handleContext = new ContainerFluidHandleContext(\"\", this);\n\n\t\tif (this.summaryConfiguration.state === \"enabled\") {\n\t\t\tthis.validateSummaryHeuristicConfiguration(this.summaryConfiguration);\n\t\t}\n\n\t\tconst disableOpReentryCheck = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.DisableOpReentryCheck\",\n\t\t);\n\t\tthis.enableOpReentryCheck =\n\t\t\truntimeOptions.enableOpReentryCheck === true &&\n\t\t\t// Allow for a break-glass config to override the options\n\t\t\tdisableOpReentryCheck !== true;\n\n\t\tthis.summariesDisabled = this.isSummariesDisabled();\n\t\tthis.heuristicsDisabled = this.isHeuristicsDisabled();\n\t\tthis.maxOpsSinceLastSummary = this.getMaxOpsSinceLastSummary();\n\t\tthis.initialSummarizerDelayMs = this.getInitialSummarizerDelayMs();\n\n\t\tif (this.idCompressorEnabled) {\n\t\t\tthis.idCompressor = idCompressor;\n\t\t}\n\n\t\tthis.maxConsecutiveReconnects =\n\t\t\tthis.mc.config.getNumber(maxConsecutiveReconnectsKey) ??\n\t\t\tthis.defaultMaxConsecutiveReconnects;\n\n\t\tif (\n\t\t\truntimeOptions.flushMode === (FlushModeExperimental.Async as unknown as FlushMode) &&\n\t\t\tsupportedFeatures?.get(\"referenceSequenceNumbers\") !== true\n\t\t) {\n\t\t\t// The loader does not support reference sequence numbers, falling back on FlushMode.TurnBased\n\t\t\tthis.mc.logger.sendErrorEvent({ eventName: \"FlushModeFallback\" });\n\t\t\tthis._flushMode = FlushMode.TurnBased;\n\t\t} else {\n\t\t\tthis._flushMode = runtimeOptions.flushMode;\n\t\t}\n\n\t\tconst pendingRuntimeState = pendingLocalState as IPendingRuntimeState | undefined;\n\n\t\tconst maxSnapshotCacheDurationMs = this._storage?.policies?.maximumCacheDurationMs;\n\t\tif (\n\t\t\tmaxSnapshotCacheDurationMs !== undefined &&\n\t\t\tmaxSnapshotCacheDurationMs > 5 * 24 * 60 * 60 * 1000\n\t\t) {\n\t\t\t// This is a runtime enforcement of what's already explicit in the policy's type itself,\n\t\t\t// which dictates the value is either undefined or exactly 5 days in ms.\n\t\t\t// As long as the actual value is less than 5 days, the assumptions GC makes here are valid.\n\t\t\tthrow new UsageError(\"Driver's maximumCacheDurationMs policy cannot exceed 5 days\");\n\t\t}\n\n\t\tthis.garbageCollector = GarbageCollector.create({\n\t\t\truntime: this,\n\t\t\tgcOptions: this.runtimeOptions.gcOptions,\n\t\t\tbaseSnapshot,\n\t\t\tbaseLogger: this.mc.logger,\n\t\t\texisting,\n\t\t\tmetadata,\n\t\t\tcreateContainerMetadata: this.createContainerMetadata,\n\t\t\tisSummarizerClient: this.isSummarizerClient,\n\t\t\tgetNodePackagePath: async (nodePath: string) => this.getGCNodePackagePath(nodePath),\n\t\t\tgetLastSummaryTimestampMs: () => this.messageAtLastSummary?.timestamp,\n\t\t\treadAndParseBlob: async <T>(id: string) => readAndParse<T>(this.storage, id),\n\t\t\tsubmitMessage: (message: ContainerRuntimeGCMessage) => this.submit(message),\n\t\t});\n\n\t\tconst loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;\n\t\tthis.summarizerNode = createRootSummarizerNodeWithGC(\n\t\t\tcreateChildLogger({ logger: this.logger, namespace: \"SummarizerNode\" }),\n\t\t\t// Summarize function to call when summarize is called. Summarizer node always tracks summary state.\n\t\t\tasync (fullTree: boolean, trackState: boolean, telemetryContext?: ITelemetryContext) =>\n\t\t\t\tthis.summarizeInternal(fullTree, trackState, telemetryContext),\n\t\t\t// Latest change sequence number, no changes since summary applied yet\n\t\t\tloadedFromSequenceNumber,\n\t\t\t// Summary reference sequence number, undefined if no summary yet\n\t\t\tbaseSnapshot !== undefined ? loadedFromSequenceNumber : undefined,\n\t\t\t{\n\t\t\t\t// Must set to false to prevent sending summary handle which would be pointing to\n\t\t\t\t// a summary with an older protocol state.\n\t\t\t\tcanReuseHandle: false,\n\t\t\t\t// Must set to true to throw on any data stores failure that was too severe to be handled.\n\t\t\t\t// We also are not decoding the base summaries at the root.\n\t\t\t\tthrowOnFailure: true,\n\t\t\t\t// If GC should not run, let the summarizer node know so that it does not track GC state.\n\t\t\t\tgcDisabled: !this.garbageCollector.shouldRunGC,\n\t\t\t},\n\t\t\t// Function to get GC data if needed. This will always be called by the root summarizer node to get GC data.\n\t\t\tasync (fullGC?: boolean) => this.getGCDataInternal(fullGC),\n\t\t\t// Function to get the GC details from the base snapshot we loaded from.\n\t\t\tasync () => this.garbageCollector.getBaseGCDetails(),\n\t\t);\n\n\t\tif (baseSnapshot) {\n\t\t\tthis.summarizerNode.updateBaseSummaryState(baseSnapshot);\n\t\t}\n\n\t\tthis.dataStores = new DataStores(\n\t\t\tgetSummaryForDatastores(baseSnapshot, metadata),\n\t\t\tthis,\n\t\t\t(attachMsg) => this.submit({ type: ContainerMessageType.Attach, contents: attachMsg }),\n\t\t\t(id: string, createParam: CreateChildSummarizerNodeParam) =>\n\t\t\t\t(\n\t\t\t\t\tsummarizeInternal: SummarizeInternalFn,\n\t\t\t\t\tgetGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,\n\t\t\t\t) =>\n\t\t\t\t\tthis.summarizerNode.createChild(\n\t\t\t\t\t\tsummarizeInternal,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcreateParam,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tgetGCDataFn,\n\t\t\t\t\t),\n\t\t\t(id: string) => this.summarizerNode.deleteChild(id),\n\t\t\tthis.mc.logger,\n\t\t\t(path: string, timestampMs: number, packagePath?: readonly string[]) =>\n\t\t\t\tthis.garbageCollector.nodeUpdated(path, \"Changed\", timestampMs, packagePath),\n\t\t\t(path: string) => this.garbageCollector.isNodeDeleted(path),\n\t\t\tnew Map<string, string>(dataStoreAliasMap),\n\t\t);\n\n\t\tthis.blobManager = new BlobManager(\n\t\t\tthis.handleContext,\n\t\t\tblobManagerSnapshot,\n\t\t\t() => this.storage,\n\t\t\t(localId: string, blobId?: string) => {\n\t\t\t\tif (!this.disposed) {\n\t\t\t\t\tthis.submit(\n\t\t\t\t\t\t{ type: ContainerMessageType.BlobAttach, contents: undefined },\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlocalId,\n\t\t\t\t\t\t\tblobId,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\t(blobPath: string) => this.garbageCollector.nodeUpdated(blobPath, \"Loaded\"),\n\t\t\t(blobPath: string) => this.garbageCollector.isNodeDeleted(blobPath),\n\t\t\tthis,\n\t\t\tpendingRuntimeState?.pendingAttachmentBlobs,\n\t\t\t(error?: ICriticalContainerError) => this.closeFn(error),\n\t\t);\n\n\t\tthis.scheduleManager = new ScheduleManager(\n\t\t\tthis.innerDeltaManager,\n\t\t\tthis,\n\t\t\t() => this.clientId,\n\t\t\tcreateChildLogger({ logger: this.logger, namespace: \"ScheduleManager\" }),\n\t\t);\n\n\t\tthis.pendingStateManager = new PendingStateManager(\n\t\t\t{\n\t\t\t\tapplyStashedOp: this.applyStashedOp.bind(this),\n\t\t\t\tclientId: () => this.clientId,\n\t\t\t\tclose: this.closeFn,\n\t\t\t\tconnected: () => this.connected,\n\t\t\t\treSubmit: this.reSubmit.bind(this),\n\t\t\t\treSubmitBatch: this.reSubmitBatch.bind(this),\n\t\t\t\tisActiveConnection: () => this.innerDeltaManager.active,\n\t\t\t},\n\t\t\tpendingRuntimeState?.pending,\n\t\t\tthis.logger,\n\t\t);\n\n\t\tconst disableCompression = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.CompressionDisabled\",\n\t\t);\n\t\tconst compressionOptions =\n\t\t\tdisableCompression === true\n\t\t\t\t? {\n\t\t\t\t\t\tminimumBatchSizeInBytes: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\tcompressionAlgorithm: CompressionAlgorithms.lz4,\n\t\t\t\t }\n\t\t\t\t: runtimeOptions.compressionOptions;\n\n\t\tconst disablePartialFlush = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.DisablePartialFlush\",\n\t\t);\n\n\t\tconst legacySendBatchFn = makeLegacySendBatchFn(this.submitFn, this.innerDeltaManager);\n\n\t\tthis.outbox = new Outbox({\n\t\t\tshouldSend: () => this.canSendOps(),\n\t\t\tpendingStateManager: this.pendingStateManager,\n\t\t\tsubmitBatchFn: this.submitBatchFn,\n\t\t\tlegacySendBatchFn,\n\t\t\tcompressor: new OpCompressor(this.mc.logger),\n\t\t\tsplitter: opSplitter,\n\t\t\tconfig: {\n\t\t\t\tcompressionOptions,\n\t\t\t\tmaxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,\n\t\t\t\tdisablePartialFlush: disablePartialFlush === true,\n\t\t\t},\n\t\t\tlogger: this.mc.logger,\n\t\t\tgroupingManager: opGroupingManager,\n\t\t\tgetCurrentSequenceNumbers: () => ({\n\t\t\t\treferenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\t\tclientSequenceNumber: this._processedClientSequenceNumber,\n\t\t\t}),\n\t\t\treSubmit: this.reSubmit.bind(this),\n\t\t\topReentrancy: () => this.ensureNoDataModelChangesCalls > 0,\n\t\t\tcloseContainer: this.closeFn,\n\t\t});\n\n\t\tthis._quorum = quorum;\n\t\tthis._quorum.on(\"removeMember\", (clientId: string) => {\n\t\t\tthis.remoteMessageProcessor.clearPartialMessagesFor(clientId);\n\t\t});\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis._audience = audience!;\n\n\t\tconst closeSummarizerDelayOverride = this.mc.config.getNumber(\n\t\t\t\"Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs\",\n\t\t);\n\t\tthis.closeSummarizerDelayMs = closeSummarizerDelayOverride ?? defaultCloseSummarizerDelayMs;\n\t\tthis.validateSummaryBeforeUpload =\n\t\t\tthis.mc.config.getBoolean(\"Fluid.Summarizer.ValidateSummaryBeforeUpload\") ?? false;\n\n\t\tthis.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);\n\n\t\tthis.dirtyContainer =\n\t\t\tthis.attachState !== AttachState.Attached || this.hasPendingMessages();\n\t\tcontext.updateDirtyContainerState(this.dirtyContainer);\n\n\t\tif (this.summariesDisabled) {\n\t\t\tthis.mc.logger.sendTelemetryEvent({ eventName: \"SummariesDisabled\" });\n\t\t} else {\n\t\t\tconst orderedClientLogger = createChildLogger({\n\t\t\t\tlogger: this.logger,\n\t\t\t\tnamespace: \"OrderedClientElection\",\n\t\t\t});\n\t\t\tconst orderedClientCollection = new OrderedClientCollection(\n\t\t\t\torderedClientLogger,\n\t\t\t\tthis.innerDeltaManager,\n\t\t\t\tthis._quorum,\n\t\t\t);\n\t\t\tconst orderedClientElectionForSummarizer = new OrderedClientElection(\n\t\t\t\torderedClientLogger,\n\t\t\t\torderedClientCollection,\n\t\t\t\telectedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber,\n\t\t\t\tSummarizerClientElection.isClientEligible,\n\t\t\t);\n\n\t\t\tthis.summarizerClientElection = new SummarizerClientElection(\n\t\t\t\torderedClientLogger,\n\t\t\t\tthis.summaryCollection,\n\t\t\t\torderedClientElectionForSummarizer,\n\t\t\t\tthis.maxOpsSinceLastSummary,\n\t\t\t);\n\n\t\t\tif (this.isSummarizerClient) {\n\t\t\t\tthis._summarizer = new Summarizer(\n\t\t\t\t\tthis /* ISummarizerRuntime */,\n\t\t\t\t\t() => this.summaryConfiguration,\n\t\t\t\t\tthis /* ISummarizerInternalsProvider */,\n\t\t\t\t\tthis.handleContext,\n\t\t\t\t\tthis.summaryCollection,\n\t\t\t\t\tasync (runtime: IConnectableRuntime) =>\n\t\t\t\t\t\tRunWhileConnectedCoordinator.create(\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t// Summarization runs in summarizer client and needs access to the real (non-proxy) active\n\t\t\t\t\t\t\t// information. The proxy delta manager would always return false for summarizer client.\n\t\t\t\t\t\t\t() => this.innerDeltaManager.active,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t} else if (SummarizerClientElection.clientDetailsPermitElection(this.clientDetails)) {\n\t\t\t\t// Only create a SummaryManager and SummarizerClientElection\n\t\t\t\t// if summaries are enabled and we are not the summarizer client.\n\t\t\t\tconst defaultAction = () => {\n\t\t\t\t\tif (this.summaryCollection.opsSinceLastAck > this.maxOpsSinceLastSummary) {\n\t\t\t\t\t\tthis.mc.logger.sendTelemetryEvent({ eventName: \"SummaryStatus:Behind\" });\n\t\t\t\t\t\t// unregister default to no log on every op after falling behind\n\t\t\t\t\t\t// and register summary ack handler to re-register this handler\n\t\t\t\t\t\t// after successful summary\n\t\t\t\t\t\tthis.summaryCollection.once(MessageType.SummaryAck, () => {\n\t\t\t\t\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\t\teventName: \"SummaryStatus:CaughtUp\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// we've caught up, so re-register the default action to monitor for\n\t\t\t\t\t\t\t// falling behind, and unregister ourself\n\t\t\t\t\t\t\tthis.summaryCollection.on(\"default\", defaultAction);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.summaryCollection.off(\"default\", defaultAction);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tthis.summaryCollection.on(\"default\", defaultAction);\n\n\t\t\t\t// Create the SummaryManager and mark the initial state\n\t\t\t\tthis.summaryManager = new SummaryManager(\n\t\t\t\t\tthis.summarizerClientElection,\n\t\t\t\t\tthis, // IConnectedState\n\t\t\t\t\tthis.summaryCollection,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.formCreateSummarizerFn(loader),\n\t\t\t\t\tnew Throttler(\n\t\t\t\t\t\t60 * 1000, // 60 sec delay window\n\t\t\t\t\t\t30 * 1000, // 30 sec max delay\n\t\t\t\t\t\t// throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)\n\t\t\t\t\t\tformExponentialFn({ coefficient: 20, initialDelay: 0 }),\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tinitialDelayMs: this.initialSummarizerDelayMs,\n\t\t\t\t\t},\n\t\t\t\t\tthis.heuristicsDisabled,\n\t\t\t\t);\n\t\t\t\tthis.summaryManager.on(\"summarize\", (eventProps) => {\n\t\t\t\t\tthis.emit(\"summarize\", eventProps);\n\t\t\t\t});\n\t\t\t\tthis.summaryManager.start();\n\t\t\t}\n\t\t}\n\n\t\t// logging hardware telemetry\n\t\tlogger.sendTelemetryEvent({\n\t\t\teventName: \"DeviceSpec\",\n\t\t\t...getDeviceSpec(),\n\t\t});\n\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName: \"ContainerLoadStats\",\n\t\t\t...this.createContainerMetadata,\n\t\t\t...this.dataStores.containerLoadStats,\n\t\t\tsummaryNumber: loadSummaryNumber,\n\t\t\tsummaryFormatVersion: metadata?.summaryFormatVersion,\n\t\t\tdisableIsolatedChannels: metadata?.disableIsolatedChannels,\n\t\t\tgcVersion: metadata?.gcFeature,\n\t\t\toptions: JSON.stringify(runtimeOptions),\n\t\t\tfeatureGates: JSON.stringify({\n\t\t\t\tdisableCompression,\n\t\t\t\tdisableOpReentryCheck,\n\t\t\t\tdisableChunking,\n\t\t\t\tdisableAttachReorder: this.disableAttachReorder,\n\t\t\t\tdisablePartialFlush,\n\t\t\t\tidCompressorEnabled: this.idCompressorEnabled,\n\t\t\t\tcloseSummarizerDelayOverride,\n\t\t\t}),\n\t\t\ttelemetryDocumentId: this.telemetryDocumentId,\n\t\t\tgroupedBatchingEnabled: this.groupedBatchingEnabled,\n\t\t});\n\n\t\tReportOpPerfTelemetry(this.clientId, this.deltaManager, this.logger);\n\t\tBindBatchTracker(this, this.logger);\n\n\t\tthis.entryPoint = new LazyPromise(async () => {\n\t\t\tif (this.isSummarizerClient) {\n\t\t\t\tassert(\n\t\t\t\t\tthis._summarizer !== undefined,\n\t\t\t\t\t0x5bf /* Summarizer object is undefined in a summarizer client */,\n\t\t\t\t);\n\t\t\t\treturn this._summarizer;\n\t\t\t}\n\t\t\treturn provideEntryPoint(this);\n\t\t});\n\t}\n\n\t/**\n\t * Initializes the state from the base snapshot this container runtime loaded from.\n\t */\n\tprivate async initializeBaseState(): Promise<void> {\n\t\tawait this.garbageCollector.initializeBaseState();\n\t}\n\n\tpublic dispose(error?: Error): void {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\n\t\tthis.mc.logger.sendTelemetryEvent(\n\t\t\t{\n\t\t\t\teventName: \"ContainerRuntimeDisposed\",\n\t\t\t\tisDirty: this.isDirty,\n\t\t\t\tlastSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\t\tattachState: this.attachState,\n\t\t\t},\n\t\t\terror,\n\t\t);\n\n\t\tif (this.summaryManager !== undefined) {\n\t\t\tthis.summaryManager.dispose();\n\t\t}\n\t\tthis.garbageCollector.dispose();\n\t\tthis._summarizer?.dispose();\n\t\tthis.dataStores.dispose();\n\t\tthis.pendingStateManager.dispose();\n\t\tthis.emit(\"dispose\");\n\t\tthis.removeAllListeners();\n\t}\n\n\t/**\n\t * Notifies this object about the request made to the container.\n\t * @param request - Request made to the handler.\n\t * @deprecated Will be removed in future major release. This method needs to stay private until LTS version of Loader moves to \"2.0.0-internal.7.0.0\".\n\t */\n\t// @ts-expect-error expected to be used by LTS Loaders and Containers\n\tprivate async request(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tconst id = parser.pathParts[0];\n\n\t\t\tif (id === summarizerRequestUrl && parser.pathParts.length === 1) {\n\t\t\t\tif (this._summarizer !== undefined) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmimeType: \"fluid/object\",\n\t\t\t\t\t\tvalue: this.summarizer,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn create404Response(request);\n\t\t\t}\n\t\t\tif (this.requestHandler !== undefined) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/return-await -- Adding an await here causes test failures\n\t\t\t\treturn this.requestHandler(parser, this);\n\t\t\t}\n\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\t/**\n\t * Resolves URI representing handle\n\t * @param request - Request made to the handler.\n\t */\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst requestParser = RequestParser.create(request);\n\t\t\tconst id = requestParser.pathParts[0];\n\n\t\t\tif (id === \"_channels\") {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/return-await -- Adding an await here causes test failures\n\t\t\t\treturn this.resolveHandle(requestParser.createSubRequest(1));\n\t\t\t}\n\n\t\t\tif (id === BlobManager.basePath && requestParser.isLeaf(2)) {\n\t\t\t\tconst blob = await this.blobManager.getBlob(requestParser.pathParts[1]);\n\t\t\t\treturn blob\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmimeType: \"fluid/object\",\n\t\t\t\t\t\t\tvalue: blob,\n\t\t\t\t\t }\n\t\t\t\t\t: create404Response(request);\n\t\t\t} else if (requestParser.pathParts.length > 0) {\n\t\t\t\t// Differentiate between requesting the dataStore directly, or one of its children\n\t\t\t\tconst requestForChild = !requestParser.isLeaf(1);\n\t\t\t\tconst dataStore = await this.getDataStoreFromRequest(id, request, requestForChild);\n\n\t\t\t\tconst subRequest = requestParser.createSubRequest(1);\n\t\t\t\t// We always expect createSubRequest to include a leading slash, but asserting here to protect against\n\t\t\t\t// unintentionally modifying the url if that changes.\n\t\t\t\tassert(\n\t\t\t\t\tsubRequest.url.startsWith(\"/\"),\n\t\t\t\t\t0x126 /* \"Expected createSubRequest url to include a leading slash\" */,\n\t\t\t\t);\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/return-await -- Adding an await here causes test failures\n\t\t\t\treturn dataStore.request(subRequest);\n\t\t\t}\n\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/container-definitions#IRuntime.getEntryPoint}\n\t */\n\tpublic async getEntryPoint(): Promise<FluidObject> {\n\t\treturn this.entryPoint;\n\t}\n\tprivate readonly entryPoint: LazyPromise<FluidObject>;\n\n\tprivate internalId(maybeAlias: string): string {\n\t\treturn this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;\n\t}\n\n\tprivate async getDataStoreFromRequest(\n\t\tid: string,\n\t\trequest: IRequest,\n\t\trequestForChild: boolean,\n\t): Promise<IFluidDataStoreChannel> {\n\t\tconst headerData: RuntimeHeaderData = {};\n\t\tif (typeof request.headers?.[RuntimeHeaders.wait] === \"boolean\") {\n\t\t\theaderData.wait = request.headers[RuntimeHeaders.wait];\n\t\t}\n\t\tif (typeof request.headers?.[RuntimeHeaders.viaHandle] === \"boolean\") {\n\t\t\theaderData.viaHandle = request.headers[RuntimeHeaders.viaHandle];\n\t\t}\n\t\tif (typeof request.headers?.[AllowTombstoneRequestHeaderKey] === \"boolean\") {\n\t\t\theaderData.allowTombstone = request.headers[AllowTombstoneRequestHeaderKey];\n\t\t}\n\t\tif (typeof request.headers?.[AllowInactiveRequestHeaderKey] === \"boolean\") {\n\t\t\theaderData.allowInactive = request.headers[AllowInactiveRequestHeaderKey];\n\t\t}\n\n\t\t// We allow Tombstone requests for sub-DataStore objects\n\t\tif (requestForChild) {\n\t\t\theaderData.allowTombstone = true;\n\t\t}\n\n\t\tawait this.dataStores.waitIfPendingAlias(id);\n\t\tconst internalId = this.internalId(id);\n\t\tconst dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);\n\n\t\t// Remove query params, leading and trailing slashes from the url. This is done to make sure the format is\n\t\t// the same as GC nodes id.\n\t\tconst urlWithoutQuery = trimLeadingAndTrailingSlashes(request.url.split(\"?\")[0]);\n\t\t// Get the initial snapshot details which contain the data store package path.\n\t\tconst details = await dataStoreContext.getInitialSnapshotDetails();\n\n\t\t// Note that this will throw if the data store is inactive or tombstoned and throwing on incorrect usage\n\t\t// is configured.\n\t\tthis.garbageCollector.nodeUpdated(\n\t\t\t`/${urlWithoutQuery}`,\n\t\t\t\"Loaded\",\n\t\t\tundefined /* timestampMs */,\n\t\t\tdetails.pkg,\n\t\t\trequest,\n\t\t\theaderData,\n\t\t);\n\t\treturn dataStoreContext.realize();\n\t}\n\n\t/** Adds the container's metadata to the given summary tree. */\n\tprivate addMetadataToSummary(summaryTree: ISummaryTreeWithStats) {\n\t\tconst metadata: IContainerRuntimeMetadata = {\n\t\t\t...this.createContainerMetadata,\n\t\t\t// Increment the summary number for the next summary that will be generated.\n\t\t\tsummaryNumber: this.nextSummaryNumber++,\n\t\t\tsummaryFormatVersion: 1,\n\t\t\t...this.garbageCollector.getMetadata(),\n\t\t\t// The last message processed at the time of summary. If there are no new messages, use the message from the\n\t\t\t// last summary.\n\t\t\tmessage:\n\t\t\t\textractSummaryMetadataMessage(this.deltaManager.lastMessage) ??\n\t\t\t\tthis.messageAtLastSummary,\n\t\t\ttelemetryDocumentId: this.telemetryDocumentId,\n\t\t\tidCompressorEnabled: this.idCompressorEnabled ? true : undefined,\n\t\t};\n\t\taddBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(metadata));\n\t}\n\n\tprotected addContainerStateToSummary(\n\t\tsummaryTree: ISummaryTreeWithStats,\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t) {\n\t\tthis.addMetadataToSummary(summaryTree);\n\n\t\tif (this.idCompressorEnabled) {\n\t\t\tassert(\n\t\t\t\tthis.idCompressor !== undefined,\n\t\t\t\t0x67a /* IdCompressor should be defined if enabled */,\n\t\t\t);\n\t\t\tconst idCompressorState = JSON.stringify(this.idCompressor.serialize(false));\n\t\t\taddBlobToSummary(summaryTree, idCompressorBlobName, idCompressorState);\n\t\t}\n\n\t\tif (this.remoteMessageProcessor.partialMessages.size > 0) {\n\t\t\tconst content = JSON.stringify([...this.remoteMessageProcessor.partialMessages]);\n\t\t\taddBlobToSummary(summaryTree, chunksBlobName, content);\n\t\t}\n\n\t\tconst dataStoreAliases = this.dataStores.aliases;\n\t\tif (dataStoreAliases.size > 0) {\n\t\t\taddBlobToSummary(summaryTree, aliasBlobName, JSON.stringify([...dataStoreAliases]));\n\t\t}\n\n\t\tif (this.summarizerClientElection) {\n\t\t\tconst electedSummarizerContent = JSON.stringify(\n\t\t\t\tthis.summarizerClientElection?.serialize(),\n\t\t\t);\n\t\t\taddBlobToSummary(summaryTree, electedSummarizerBlobName, electedSummarizerContent);\n\t\t}\n\n\t\tconst blobManagerSummary = this.blobManager.summarize();\n\t\t// Some storage (like git) doesn't allow empty tree, so we can omit it.\n\t\t// and the blob manager can handle the tree not existing when loading\n\t\tif (Object.keys(blobManagerSummary.summary.tree).length > 0) {\n\t\t\taddTreeToSummary(summaryTree, blobsTreeName, blobManagerSummary);\n\t\t}\n\n\t\tconst gcSummary = this.garbageCollector.summarize(fullTree, trackState, telemetryContext);\n\t\tif (gcSummary !== undefined) {\n\t\t\taddSummarizeResultToSummary(summaryTree, gcTreeKey, gcSummary);\n\t\t}\n\t}\n\n\t// Track how many times the container tries to reconnect with pending messages.\n\t// This happens when the connection state is changed and we reset the counter\n\t// when we are able to process a local op or when there are no pending messages.\n\t// If this counter reaches a max, it's a good indicator that the container\n\t// is not making progress and it is stuck in a retry loop.\n\tprivate shouldContinueReconnecting(): boolean {\n\t\tif (this.maxConsecutiveReconnects <= 0) {\n\t\t\t// Feature disabled, we never stop reconnecting\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!this.hasPendingMessages()) {\n\t\t\t// If there are no pending messages, we can always reconnect\n\t\t\tthis.resetReconnectCount();\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this.consecutiveReconnects === Math.floor(this.maxConsecutiveReconnects / 2)) {\n\t\t\t// If we're halfway through the max reconnects, send an event in order\n\t\t\t// to better identify false positives, if any. If the rate of this event\n\t\t\t// matches Container Close count below, we can safely cut down\n\t\t\t// maxConsecutiveReconnects to half.\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"ReconnectsWithNoProgress\",\n\t\t\t\tattempts: this.consecutiveReconnects,\n\t\t\t\tpendingMessages: this.pendingMessagesCount,\n\t\t\t});\n\t\t}\n\n\t\treturn this.consecutiveReconnects < this.maxConsecutiveReconnects;\n\t}\n\n\tprivate resetReconnectCount(message?: ISequencedDocumentMessage) {\n\t\t// Chunked ops don't count towards making progress as they are sent\n\t\t// in their own batches before the originating batch is sent.\n\t\t// Therefore, receiving them while attempting to send the originating batch\n\t\t// does not mean that the container is making any progress.\n\t\tif (message?.type !== ContainerMessageType.ChunkedOp) {\n\t\t\tthis.consecutiveReconnects = 0;\n\t\t}\n\t}\n\n\tprivate replayPendingStates() {\n\t\t// We need to be able to send ops to replay states\n\t\tif (!this.canSendOps()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We need to temporary clear the dirty flags and disable\n\t\t// dirty state change events to detect whether replaying ops\n\t\t// has any effect.\n\n\t\t// Save the old state, reset to false, disable event emit\n\t\tconst oldState = this.dirtyContainer;\n\t\tthis.dirtyContainer = false;\n\n\t\tassert(this.emitDirtyDocumentEvent, 0x127 /* \"dirty document event not set on replay\" */);\n\t\tthis.emitDirtyDocumentEvent = false;\n\t\tlet newState: boolean;\n\n\t\ttry {\n\t\t\t// replay the ops\n\t\t\tthis.pendingStateManager.replayPendingStates();\n\t\t} finally {\n\t\t\t// Save the new start and restore the old state, re-enable event emit\n\t\t\tnewState = this.dirtyContainer;\n\t\t\tthis.dirtyContainer = oldState;\n\t\t\tthis.emitDirtyDocumentEvent = true;\n\t\t}\n\n\t\t// Officially transition from the old state to the new state.\n\t\tthis.updateDocumentDirtyState(newState);\n\t}\n\n\t/**\n\t * Parse an op's type and actual content from given serialized content\n\t * ! Note: this format needs to be in-line with what is set in the \"ContainerRuntime.submit(...)\" method\n\t */\n\t// TODO: markfields: confirm Local- versus Outbound- ContainerRuntimeMessage typing\n\tprivate parseLocalOpContent(serializedContents?: string): LocalContainerRuntimeMessage {\n\t\tassert(serializedContents !== undefined, 0x6d5 /* content must be defined */);\n\t\tconst message: LocalContainerRuntimeMessage = JSON.parse(serializedContents);\n\t\tassert(message.type !== undefined, 0x6d6 /* incorrect op content format */);\n\t\treturn message;\n\t}\n\n\tprivate async applyStashedOp(serializedOpContent: string): Promise<unknown> {\n\t\t// Need to parse from string for back-compat\n\t\tconst opContents = this.parseLocalOpContent(serializedOpContent);\n\t\tswitch (opContents.type) {\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\t\treturn this.dataStores.applyStashedOp(opContents.contents);\n\t\t\tcase ContainerMessageType.Attach:\n\t\t\t\treturn this.dataStores.applyStashedAttachOp(opContents.contents);\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\t\tassert(\n\t\t\t\t\tthis.idCompressor !== undefined,\n\t\t\t\t\t0x67b /* IdCompressor should be defined if enabled */,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.BlobAttach:\n\t\t\t\treturn;\n\t\t\tcase ContainerMessageType.ChunkedOp:\n\t\t\t\tthrow new Error(\"chunkedOp not expected here\");\n\t\t\tcase ContainerMessageType.Rejoin:\n\t\t\t\tthrow new Error(\"rejoin not expected here\");\n\t\t\tcase ContainerMessageType.GC:\n\t\t\t\t// GC op is only sent in summarizer which should never have stashed ops.\n\t\t\t\tthrow new LoggingError(\"GC op not expected to be stashed in summarizer\");\n\t\t\tdefault: {\n\t\t\t\t// This should be extremely rare for stashed ops.\n\t\t\t\t// It would require a newer runtime stashing ops and then an older one applying them,\n\t\t\t\t// e.g. if an app rolled back its container version\n\t\t\t\tconst compatBehavior = opContents.compatDetails?.behavior;\n\t\t\t\tif (!compatBehaviorAllowsMessageType(opContents.type, compatBehavior)) {\n\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\"Stashed runtime message of unknown type\",\n\t\t\t\t\t\t\"applyStashedOp\",\n\t\t\t\t\t\tundefined /* sequencedMessage */,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmessageDetails: JSON.stringify({\n\t\t\t\t\t\t\t\ttype: opContents.type,\n\t\t\t\t\t\t\t\tcompatBehavior,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.closeFn(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tif (connected === false && this.delayConnectClientId !== undefined) {\n\t\t\tthis.delayConnectClientId = undefined;\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"UnsuccessfulConnectedTransition\",\n\t\t\t});\n\t\t\t// Don't propagate \"disconnected\" event because we didn't propagate the previous \"connected\" event\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are stashed blobs in the pending state, we need to delay\n\t\t// propagation of the \"connected\" event until we have uploaded them to\n\t\t// ensure we don't submit ops referencing a blob that has not been uploaded\n\t\tconst connecting = connected && !this._connected;\n\t\tif (connecting && this.blobManager.hasPendingStashedBlobs()) {\n\t\t\tassert(\n\t\t\t\t!this.delayConnectClientId,\n\t\t\t\t0x791 /* Connect event delay must be canceled before subsequent connect event */,\n\t\t\t);\n\t\t\tassert(!!clientId, 0x792 /* Must have clientId when connecting */);\n\t\t\tthis.delayConnectClientId = clientId;\n\t\t\tthis.blobManager.processStashedChanges().then(\n\t\t\t\t() => {\n\t\t\t\t\t// make sure we didn't reconnect before the promise resolved\n\t\t\t\t\tif (this.delayConnectClientId === clientId && !this.disposed) {\n\t\t\t\t\t\tthis.delayConnectClientId = undefined;\n\t\t\t\t\t\tthis.setConnectionStateCore(connected, clientId);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t(error) => this.closeFn(error),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setConnectionStateCore(connected, clientId);\n\t}\n\n\tprivate setConnectionStateCore(connected: boolean, clientId?: string) {\n\t\tassert(\n\t\t\t!this.delayConnectClientId,\n\t\t\t0x394 /* connect event delay must be cleared before propagating connect event */,\n\t\t);\n\t\tthis.verifyNotClosed();\n\n\t\t// There might be no change of state due to Container calling this API after loading runtime.\n\t\tconst changeOfState = this._connected !== connected;\n\t\tconst reconnection = changeOfState && !connected;\n\n\t\t// We need to flush the ops currently collected by Outbox to preserve original order.\n\t\t// This flush NEEDS to happen before we set the ContainerRuntime to \"connected\".\n\t\t// We want these ops to get to the PendingStateManager without sending to service and have them return to the Outbox upon calling \"replayPendingStates\".\n\t\tif (changeOfState && connected) {\n\t\t\tthis.flush();\n\t\t}\n\n\t\tthis._connected = connected;\n\n\t\tif (!connected) {\n\t\t\tthis._perfSignalData.signalsLost = 0;\n\t\t\tthis._perfSignalData.signalTimestamp = 0;\n\t\t\tthis._perfSignalData.trackingSignalSequenceNumber = undefined;\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.attachState === AttachState.Attached,\n\t\t\t\t0x3cd /* Connection is possible only if container exists in storage */,\n\t\t\t);\n\t\t}\n\n\t\t// Fail while disconnected\n\t\tif (reconnection) {\n\t\t\tthis.consecutiveReconnects++;\n\n\t\t\tif (!this.shouldContinueReconnecting()) {\n\t\t\t\tthis.closeFn(\n\t\t\t\t\tDataProcessingError.create(\n\t\t\t\t\t\t\"Runtime detected too many reconnects with no progress syncing local ops.\",\n\t\t\t\t\t\t\"setConnectionState\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdataLoss: 1,\n\t\t\t\t\t\t\tattempts: this.consecutiveReconnects,\n\t\t\t\t\t\t\tpendingMessages: this.pendingMessagesCount,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (changeOfState) {\n\t\t\tthis.replayPendingStates();\n\t\t}\n\n\t\tthis.dataStores.setConnectionState(connected, clientId);\n\t\tthis.garbageCollector.setConnectionState(connected, clientId);\n\n\t\traiseConnectedEvent(this.mc.logger, this, connected, clientId);\n\t}\n\n\tpublic async notifyOpReplay(message: ISequencedDocumentMessage) {\n\t\tawait this.pendingStateManager.applyStashedOpsAt(message.sequenceNumber);\n\t}\n\n\tpublic process(messageArg: ISequencedDocumentMessage, local: boolean) {\n\t\tthis.verifyNotClosed();\n\n\t\t// Whether or not the message appears to be a runtime message from an up-to-date client.\n\t\t// It may be a legacy runtime message (ie already unpacked and ContainerMessageType)\n\t\t// or something different, like a system message.\n\t\tconst modernRuntimeMessage = messageArg.type === MessageType.Operation;\n\n\t\t// Do shallow copy of message, as the processing flow will modify it.\n\t\t// There might be multiple container instances receiving the same message.\n\t\t// We do not need to make a deep copy. Each layer will just replace message.contents itself,\n\t\t// but will not modify the contents object (likely it will replace it on the message).\n\t\tconst messageCopy = { ...messageArg };\n\t\tfor (const message of this.remoteMessageProcessor.process(messageCopy)) {\n\t\t\tif (modernRuntimeMessage) {\n\t\t\t\tthis.processCore({\n\t\t\t\t\t// Cast it since we expect it to be this based on modernRuntimeMessage computation above.\n\t\t\t\t\t// There is nothing really ensuring that anytime original message.type is Operation that\n\t\t\t\t\t// the result messages will be so. In the end modern bool being true only directs to\n\t\t\t\t\t// throw error if ultimately unrecognized without compat details saying otherwise.\n\t\t\t\t\tmessage: message as InboundSequencedContainerRuntimeMessage,\n\t\t\t\t\tlocal,\n\t\t\t\t\tmodernRuntimeMessage,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Unrecognized message will be ignored.\n\t\t\t\tthis.processCore({ message, local, modernRuntimeMessage });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _processedClientSequenceNumber: number | undefined;\n\n\t/**\n\t * Direct the message to the correct subsystem for processing, and implement other side effects\n\t */\n\tprivate processCore(messageWithContext: MessageWithContext) {\n\t\tconst { message, local } = messageWithContext;\n\t\t// Surround the actual processing of the operation with messages to the schedule manager indicating\n\t\t// the beginning and end. This allows it to emit appropriate events and/or pause the processing of new\n\t\t// messages once a batch has been fully processed.\n\t\tthis.scheduleManager.beforeOpProcessing(message);\n\n\t\tthis._processedClientSequenceNumber = message.clientSequenceNumber;\n\n\t\ttry {\n\t\t\tlet localOpMetadata: unknown;\n\t\t\tif (\n\t\t\t\tlocal &&\n\t\t\t\tmessageWithContext.modernRuntimeMessage &&\n\t\t\t\tmessage.type !== ContainerMessageType.ChunkedOp\n\t\t\t) {\n\t\t\t\tlocalOpMetadata = this.pendingStateManager.processPendingLocalMessage(\n\t\t\t\t\tmessageWithContext.message,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If there are no more pending messages after processing a local message,\n\t\t\t// the document is no longer dirty.\n\t\t\tif (!this.hasPendingMessages()) {\n\t\t\t\tthis.updateDocumentDirtyState(false);\n\t\t\t}\n\n\t\t\tthis.validateAndProcessRuntimeMessage(messageWithContext, localOpMetadata);\n\n\t\t\tthis.emit(\"op\", message, messageWithContext.modernRuntimeMessage);\n\n\t\t\tthis.scheduleManager.afterOpProcessing(undefined, message);\n\n\t\t\tif (local) {\n\t\t\t\t// If we have processed a local op, this means that the container is\n\t\t\t\t// making progress and we can reset the counter for how many times\n\t\t\t\t// we have consecutively replayed the pending states\n\t\t\t\tthis.resetReconnectCount(message);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.scheduleManager.afterOpProcessing(e, message);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t/**\n\t * Assuming the given message is also a TypedContainerRuntimeMessage,\n\t * checks its type and dispatches the message to the appropriate handler in the runtime.\n\t * Throws a DataProcessingError if the message looks like but doesn't conform to a known TypedContainerRuntimeMessage type.\n\t */\n\tprivate validateAndProcessRuntimeMessage(\n\t\tmessageWithContext: MessageWithContext,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\t// TODO: destructure message and modernRuntimeMessage once using typescript 5.2.2+\n\t\tconst { local } = messageWithContext;\n\t\tswitch (messageWithContext.message.type) {\n\t\t\tcase ContainerMessageType.Attach:\n\t\t\t\tthis.dataStores.processAttachMessage(messageWithContext.message, local);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\t\tthis.dataStores.processAliasMessage(\n\t\t\t\t\tmessageWithContext.message,\n\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t\tlocal,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\t\tthis.dataStores.processFluidDataStoreOp(\n\t\t\t\t\tmessageWithContext.message,\n\t\t\t\t\tlocal,\n\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t\t(from, to) => this.garbageCollector.addedOutboundReference(from, to),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.BlobAttach:\n\t\t\t\tthis.blobManager.processBlobAttachOp(messageWithContext.message, local);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\t\tassert(\n\t\t\t\t\tthis.idCompressor !== undefined,\n\t\t\t\t\t0x67c /* IdCompressor should be defined if enabled */,\n\t\t\t\t);\n\n\t\t\t\t// Don't re-finalize the range if we're processing a \"savedOp\" in\n\t\t\t\t// stashed ops flow. The compressor is stashed with these ops already processed.\n\t\t\t\tif (\n\t\t\t\t\t(messageWithContext.message.metadata as IIdAllocationMetadata)?.savedOp !== true\n\t\t\t\t) {\n\t\t\t\t\tthis.idCompressor.finalizeCreationRange(messageWithContext.message.contents);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.GC:\n\t\t\t\tthis.garbageCollector.processMessage(messageWithContext.message, local);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.ChunkedOp:\n\t\t\tcase ContainerMessageType.Rejoin:\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\t// If we didn't necessarily expect a runtime message type, then no worries - just return\n\t\t\t\t// e.g. this case applies to system ops, or legacy ops that would have fallen into the above cases anyway.\n\t\t\t\tif (!messageWithContext.modernRuntimeMessage) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst compatBehavior = messageWithContext.message.compatDetails?.behavior;\n\t\t\t\tif (\n\t\t\t\t\t!compatBehaviorAllowsMessageType(\n\t\t\t\t\t\tmessageWithContext.message.type,\n\t\t\t\t\t\tcompatBehavior,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst { message } = messageWithContext;\n\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t// Former assert 0x3ce\n\t\t\t\t\t\t\"Runtime message of unknown type\",\n\t\t\t\t\t\t\"OpProcessing\",\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlocal,\n\t\t\t\t\t\t\tmessageDetails: JSON.stringify({\n\t\t\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\t\t\tcontentType: typeof message.contents,\n\t\t\t\t\t\t\t\tcompatBehavior,\n\t\t\t\t\t\t\t\tbatch: (message.metadata as IBatchMetadata | undefined)?.batch,\n\t\t\t\t\t\t\t\tcompression: message.compression,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.closeFn(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Emits the Signal event and update the perf signal data.\n\t * @param clientSignalSequenceNumber - is the client signal sequence number to be uploaded.\n\t */\n\tprivate sendSignalTelemetryEvent(clientSignalSequenceNumber: number) {\n\t\tconst duration = Date.now() - this._perfSignalData.signalTimestamp;\n\t\tthis.mc.logger.sendPerformanceEvent({\n\t\t\teventName: \"SignalLatency\",\n\t\t\tduration,\n\t\t\tsignalsLost: this._perfSignalData.signalsLost,\n\t\t});\n\n\t\tthis._perfSignalData.signalsLost = 0;\n\t\tthis._perfSignalData.signalTimestamp = 0;\n\t}\n\n\tpublic processSignal(message: ISignalMessage, local: boolean) {\n\t\tconst envelope = message.content as ISignalEnvelope;\n\t\tconst transformed: IInboundSignalMessage = {\n\t\t\tclientId: message.clientId,\n\t\t\tcontent: envelope.contents.content,\n\t\t\ttype: envelope.contents.type,\n\t\t};\n\n\t\t// Only collect signal telemetry for messages sent by the current client.\n\t\tif (message.clientId === this.clientId && this.connected) {\n\t\t\t// Check to see if the signal was lost.\n\t\t\tif (\n\t\t\t\tthis._perfSignalData.trackingSignalSequenceNumber !== undefined &&\n\t\t\t\tenvelope.clientSignalSequenceNumber >\n\t\t\t\t\tthis._perfSignalData.trackingSignalSequenceNumber\n\t\t\t) {\n\t\t\t\tthis._perfSignalData.signalsLost++;\n\t\t\t\tthis._perfSignalData.trackingSignalSequenceNumber = undefined;\n\t\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\t\teventName: \"SignalLost\",\n\t\t\t\t\ttype: envelope.contents.type,\n\t\t\t\t\tsignalsLost: this._perfSignalData.signalsLost,\n\t\t\t\t\ttrackingSequenceNumber: this._perfSignalData.trackingSignalSequenceNumber,\n\t\t\t\t\tclientSignalSequenceNumber: envelope.clientSignalSequenceNumber,\n\t\t\t\t});\n\t\t\t} else if (\n\t\t\t\tenvelope.clientSignalSequenceNumber ===\n\t\t\t\tthis._perfSignalData.trackingSignalSequenceNumber\n\t\t\t) {\n\t\t\t\t// only logging for the first connection and the trackingSignalSequenceNUmber.\n\t\t\t\tif (this.consecutiveReconnects === 0) {\n\t\t\t\t\tthis.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);\n\t\t\t\t}\n\t\t\t\tthis._perfSignalData.trackingSignalSequenceNumber = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif (envelope.address === undefined) {\n\t\t\t// No address indicates a container signal message.\n\t\t\tthis.emit(\"signal\", transformed, local);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dataStores.processSignal(envelope.address, transformed, local);\n\t}\n\n\t/**\n\t * Flush the pending ops manually.\n\t * This method is expected to be called at the end of a batch.\n\t */\n\tprivate flush(): void {\n\t\tassert(\n\t\t\tthis._orderSequentiallyCalls === 0,\n\t\t\t0x24c /* \"Cannot call `flush()` from `orderSequentially`'s callback\" */,\n\t\t);\n\n\t\tthis.outbox.flush();\n\t\tassert(this.outbox.isEmpty, 0x3cf /* reentrancy */);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/runtime-definitions#IContainerRuntimeBase.orderSequentially}\n\t */\n\tpublic orderSequentially<T>(callback: () => T): T {\n\t\tlet checkpoint: IBatchCheckpoint | undefined;\n\t\tlet result: T;\n\t\tif (this.mc.config.getBoolean(\"Fluid.ContainerRuntime.EnableRollback\")) {\n\t\t\t// Note: we are not touching this.pendingAttachBatch here, for two reasons:\n\t\t\t// 1. It would not help, as we flush attach ops as they become available.\n\t\t\t// 2. There is no way to undo process of data store creation.\n\t\t\tcheckpoint = this.outbox.checkpoint().mainBatch;\n\t\t}\n\t\ttry {\n\t\t\tthis._orderSequentiallyCalls++;\n\t\t\tresult = callback();\n\t\t} catch (error) {\n\t\t\tif (checkpoint) {\n\t\t\t\t// This will throw and close the container if rollback fails\n\t\t\t\ttry {\n\t\t\t\t\tcheckpoint.rollback((message: BatchMessage) =>\n\t\t\t\t\t\tthis.rollback(message.contents, message.localOpMetadata),\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst error2 = wrapError(err, (message) => {\n\t\t\t\t\t\treturn DataProcessingError.create(\n\t\t\t\t\t\t\t`RollbackError: ${message}`,\n\t\t\t\t\t\t\t\"checkpointRollback\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t) as DataProcessingError;\n\t\t\t\t\t});\n\t\t\t\t\tthis.closeFn(error2);\n\t\t\t\t\tthrow error2;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.closeFn(\n\t\t\t\t\twrapError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\t(errorMessage) =>\n\t\t\t\t\t\t\tnew GenericError(\n\t\t\t\t\t\t\t\t`orderSequentially callback exception: ${errorMessage}`,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\torderSequentiallyCalls: this._orderSequentiallyCalls,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow error; // throw the original error for the consumer of the runtime\n\t\t} finally {\n\t\t\tthis._orderSequentiallyCalls--;\n\t\t}\n\n\t\t// We don't flush on TurnBased since we expect all messages in the same JS turn to be part of the same batch\n\t\tif (this.flushMode !== FlushMode.TurnBased && this._orderSequentiallyCalls === 0) {\n\t\t\tthis.flush();\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Returns the aliased data store's entryPoint, given the alias.\n\t * @param alias - The alias for the data store.\n\t * @returns The data store's entry point ({@link @fluidframework/core-interfaces#IFluidHandle}) if it exists and is aliased.\n\t * Returns undefined if no data store has been assigned the given alias.\n\t */\n\tpublic async getAliasedDataStoreEntryPoint(\n\t\talias: string,\n\t): Promise<IFluidHandle<FluidObject> | undefined> {\n\t\tawait this.dataStores.waitIfPendingAlias(alias);\n\t\tconst internalId = this.internalId(alias);\n\t\tconst context = await this.dataStores.getDataStoreIfAvailable(internalId, { wait: false });\n\t\t// If the data store is not available or not an alias, return undefined.\n\t\tif (context === undefined || !(await context.isRoot())) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst channel = await context.realize();\n\t\tif (channel.entryPoint === undefined) {\n\t\t\tthrow new UsageError(\n\t\t\t\t\"entryPoint must be defined on data store runtime for using getAliasedDataStoreEntryPoint\",\n\t\t\t);\n\t\t}\n\t\tthis.garbageCollector.nodeUpdated(\n\t\t\t`/${internalId}`,\n\t\t\t\"Loaded\",\n\t\t\tundefined /* timestampMs */,\n\t\t\tcontext.packagePath,\n\t\t);\n\t\treturn channel.entryPoint;\n\t}\n\n\tpublic createDetachedRootDataStore(\n\t\tpkg: Readonly<string[]>,\n\t\trootDataStoreId: string,\n\t): IFluidDataStoreContextDetached {\n\t\tif (rootDataStoreId.includes(\"/\")) {\n\t\t\tthrow new UsageError(`Id cannot contain slashes: '${rootDataStoreId}'`);\n\t\t}\n\t\treturn this.dataStores.createDetachedDataStoreCore(pkg, true, rootDataStoreId);\n\t}\n\n\tpublic createDetachedDataStore(pkg: Readonly<string[]>): IFluidDataStoreContextDetached {\n\t\treturn this.dataStores.createDetachedDataStoreCore(pkg, false);\n\t}\n\n\tpublic async createDataStore(pkg: string | string[]): Promise<IDataStore> {\n\t\tconst id = uuid();\n\t\treturn channelToDataStore(\n\t\t\tawait this.dataStores\n\t\t\t\t._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id)\n\t\t\t\t.realize(),\n\t\t\tid,\n\t\t\tthis,\n\t\t\tthis.dataStores,\n\t\t\tthis.mc.logger,\n\t\t);\n\t}\n\n\t/**\n\t * @deprecated 0.16 Issue #1537, #3631\n\t */\n\tpublic async _createDataStoreWithProps(\n\t\tpkg: string | string[],\n\t\tprops?: any,\n\t\tid = uuid(),\n\t): Promise<IDataStore> {\n\t\treturn channelToDataStore(\n\t\t\tawait this.dataStores\n\t\t\t\t._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, props)\n\t\t\t\t.realize(),\n\t\t\tid,\n\t\t\tthis,\n\t\t\tthis.dataStores,\n\t\t\tthis.mc.logger,\n\t\t);\n\t}\n\n\tprivate canSendOps() {\n\t\t// Note that the real (non-proxy) delta manager is needed here to get the readonly info. This is because\n\t\t// container runtime's ability to send ops depend on the actual readonly state of the delta manager.\n\t\treturn (\n\t\t\tthis.connected && !this.innerDeltaManager.readOnlyInfo.readonly && !this.imminentClosure\n\t\t);\n\t}\n\n\t/**\n\t * Are we in the middle of batching ops together?\n\t */\n\tprivate currentlyBatching() {\n\t\treturn this.flushMode !== FlushMode.Immediate || this._orderSequentiallyCalls !== 0;\n\t}\n\n\tprivate readonly _quorum: IQuorumClients;\n\tpublic getQuorum(): IQuorumClients {\n\t\treturn this._quorum;\n\t}\n\n\tprivate readonly _audience: IAudience;\n\tpublic getAudience(): IAudience {\n\t\treturn this._audience;\n\t}\n\n\t/**\n\t * Returns true of container is dirty, i.e. there are some pending local changes that\n\t * either were not sent out to delta stream or were not yet acknowledged.\n\t */\n\tpublic get isDirty(): boolean {\n\t\treturn this.dirtyContainer;\n\t}\n\n\tprivate isContainerMessageDirtyable({ type, contents }: OutboundContainerRuntimeMessage) {\n\t\t// Certain container runtime messages should not mark the container dirty such as the old built-in\n\t\t// AgentScheduler and Garbage collector messages.\n\t\tswitch (type) {\n\t\t\tcase ContainerMessageType.Attach: {\n\t\t\t\tconst attachMessage = contents as InboundAttachMessage;\n\t\t\t\tif (attachMessage.id === agentSchedulerId) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.FluidDataStoreOp: {\n\t\t\t\tconst envelope = contents;\n\t\t\t\tif (envelope.address === agentSchedulerId) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.GC: {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate createNewSignalEnvelope(\n\t\taddress: string | undefined,\n\t\ttype: string,\n\t\tcontent: any,\n\t): ISignalEnvelope {\n\t\tconst newSequenceNumber = ++this._perfSignalData.signalSequenceNumber;\n\t\tconst newEnvelope: ISignalEnvelope = {\n\t\t\taddress,\n\t\t\tclientSignalSequenceNumber: newSequenceNumber,\n\t\t\tcontents: { type, content },\n\t\t};\n\n\t\t// We should not track any signals in case we already have a tracking number.\n\t\tif (\n\t\t\tnewSequenceNumber % this.defaultTelemetrySignalSampleCount === 1 &&\n\t\t\tthis._perfSignalData.trackingSignalSequenceNumber === undefined\n\t\t) {\n\t\t\tthis._perfSignalData.signalTimestamp = Date.now();\n\t\t\tthis._perfSignalData.trackingSignalSequenceNumber = newSequenceNumber;\n\t\t}\n\n\t\treturn newEnvelope;\n\t}\n\n\t/**\n\t * Submits the signal to be sent to other clients.\n\t * @param type - Type of the signal.\n\t * @param content - Content of the signal.\n\t * @param targetClientId - When specified, the signal is only sent to the provided client id.\n\t */\n\tpublic submitSignal(type: string, content: any, targetClientId?: string) {\n\t\tthis.verifyNotClosed();\n\t\tconst envelope = this.createNewSignalEnvelope(undefined /* address */, type, content);\n\t\treturn this.submitSignalFn(envelope, targetClientId);\n\t}\n\n\t/**\n\t * Submits the signal to be sent to other clients.\n\t * @param type - Type of the signal.\n\t * @param content - Content of the signal.\n\t * @param targetClientId - When specified, the signal is only sent to the provided client id.\n\t */\n\tpublic submitDataStoreSignal(\n\t\taddress: string,\n\t\ttype: string,\n\t\tcontent: any,\n\t\ttargetClientId?: string,\n\t) {\n\t\tconst envelope = this.createNewSignalEnvelope(address, type, content);\n\t\treturn this.submitSignalFn(envelope, targetClientId);\n\t}\n\n\tpublic setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n\t\tif (attachState === AttachState.Attaching) {\n\t\t\tassert(\n\t\t\t\tthis.attachState === AttachState.Attaching,\n\t\t\t\t0x12d /* \"Container Context should already be in attaching state\" */,\n\t\t\t);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.attachState === AttachState.Attached,\n\t\t\t\t0x12e /* \"Container Context should already be in attached state\" */,\n\t\t\t);\n\t\t\tthis.emit(\"attached\");\n\t\t}\n\n\t\tif (attachState === AttachState.Attached && !this.hasPendingMessages()) {\n\t\t\tthis.updateDocumentDirtyState(false);\n\t\t}\n\t\tthis.dataStores.setAttachState(attachState);\n\t}\n\n\t/**\n\t * Create a summary. Used when attaching or serializing a detached container.\n\t *\n\t * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n\t * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n\t * new storage IDs so requests can be redirected.\n\t * @param telemetryContext - summary data passed through the layers for telemetry purposes\n\t */\n\tpublic createSummary(\n\t\tblobRedirectTable?: Map<string, string>,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): ISummaryTree {\n\t\tif (blobRedirectTable) {\n\t\t\tthis.blobManager.setRedirectTable(blobRedirectTable);\n\t\t}\n\n\t\t// We can finalize any allocated IDs since we're the only client\n\t\tconst idRange = this.idCompressor?.takeNextCreationRange();\n\t\tif (idRange !== undefined) {\n\t\t\tthis.idCompressor?.finalizeCreationRange(idRange);\n\t\t}\n\n\t\tconst summarizeResult = this.dataStores.createSummary(telemetryContext);\n\t\t// Wrap data store summaries in .channels subtree.\n\t\twrapSummaryInChannelsTree(summarizeResult);\n\n\t\tthis.addContainerStateToSummary(\n\t\t\tsummarizeResult,\n\t\t\ttrue /* fullTree */,\n\t\t\tfalse /* trackState */,\n\t\t\ttelemetryContext,\n\t\t);\n\t\treturn summarizeResult.summary;\n\t}\n\n\tpublic readonly getAbsoluteUrl: (relativeUrl: string) => Promise<string | undefined>;\n\n\tprivate async summarizeInternal(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummarizeInternalResult> {\n\t\tconst summarizeResult = await this.dataStores.summarize(\n\t\t\tfullTree,\n\t\t\ttrackState,\n\t\t\ttelemetryContext,\n\t\t);\n\n\t\t// Wrap data store summaries in .channels subtree.\n\t\twrapSummaryInChannelsTree(summarizeResult);\n\t\tconst pathPartsForChildren = [channelsTreeName];\n\n\t\tthis.addContainerStateToSummary(summarizeResult, fullTree, trackState, telemetryContext);\n\t\treturn {\n\t\t\t...summarizeResult,\n\t\t\tid: \"\",\n\t\t\tpathPartsForChildren,\n\t\t};\n\t}\n\n\t/**\n\t * Returns a summary of the runtime at the current sequence number.\n\t */\n\tpublic async summarize(options: {\n\t\t/** True to generate the full tree with no handle reuse optimizations; defaults to false */\n\t\tfullTree?: boolean;\n\t\t/** True to track the state for this summary in the SummarizerNodes; defaults to true */\n\t\ttrackState?: boolean;\n\t\t/** Logger to use for correlated summary events */\n\t\tsummaryLogger?: ITelemetryLoggerExt;\n\t\t/** True to run garbage collection before summarizing; defaults to true */\n\t\trunGC?: boolean;\n\t\t/** True to generate full GC data */\n\t\tfullGC?: boolean;\n\t\t/** True to run GC sweep phase after the mark phase */\n\t\trunSweep?: boolean;\n\t}): Promise<ISummaryTreeWithStats> {\n\t\tthis.verifyNotClosed();\n\n\t\tconst {\n\t\t\tfullTree = false,\n\t\t\ttrackState = true,\n\t\t\tsummaryLogger = this.mc.logger,\n\t\t\trunGC = this.garbageCollector.shouldRunGC,\n\t\t\trunSweep,\n\t\t\tfullGC,\n\t\t} = options;\n\n\t\tconst telemetryContext = new TelemetryContext();\n\t\t// Add the options that are used to generate this summary to the telemetry context.\n\t\ttelemetryContext.setMultiple(\"fluid_Summarize\", \"Options\", {\n\t\t\tfullTree,\n\t\t\ttrackState,\n\t\t\trunGC,\n\t\t\tfullGC,\n\t\t\trunSweep,\n\t\t});\n\n\t\ttry {\n\t\t\tif (runGC) {\n\t\t\t\tawait this.collectGarbage(\n\t\t\t\t\t{ logger: summaryLogger, runSweep, fullGC },\n\t\t\t\t\ttelemetryContext,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst { stats, summary } = await this.summarizerNode.summarize(\n\t\t\t\tfullTree,\n\t\t\t\ttrackState,\n\t\t\t\ttelemetryContext,\n\t\t\t);\n\n\t\t\tassert(\n\t\t\t\tsummary.type === SummaryType.Tree,\n\t\t\t\t0x12f /* \"Container Runtime's summarize should always return a tree\" */,\n\t\t\t);\n\n\t\t\treturn { stats, summary };\n\t\t} finally {\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"SummarizeTelemetry\",\n\t\t\t\tdetails: telemetryContext.serialize(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify\n\t * the garbage collector of references detected since the last GC run. Most references are notified immediately\n\t * but there can be some for which async operation is required (such as detecting new root data stores).\n\t * @see IGarbageCollectionRuntime.updateStateBeforeGC\n\t */\n\tpublic async updateStateBeforeGC() {\n\t\treturn this.dataStores.updateStateBeforeGC();\n\t}\n\n\tprivate async getGCDataInternal(fullGC?: boolean): Promise<IGarbageCollectionData> {\n\t\treturn this.dataStores.getGCData(fullGC);\n\t}\n\n\t/**\n\t * Generates and returns the GC data for this container.\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t * @see IGarbageCollectionRuntime.getGCData\n\t */\n\tpublic async getGCData(fullGC?: boolean): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\tconst dsGCData = await this.summarizerNode.getGCData(fullGC);\n\t\tbuilder.addNodes(dsGCData.gcNodes);\n\n\t\tconst blobsGCData = this.blobManager.getGCData(fullGC);\n\t\tbuilder.addNodes(blobsGCData.gcNodes);\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this container's nodes of routes that are used in it.\n\t * @param usedRoutes - The routes that are used in all nodes in this Container.\n\t * @see IGarbageCollectionRuntime.updateUsedRoutes\n\t */\n\tpublic updateUsedRoutes(usedRoutes: readonly string[]) {\n\t\t// Update our summarizer node's used routes. Updating used routes in summarizer node before\n\t\t// summarizing is required and asserted by the the summarizer node. We are the root and are\n\t\t// always referenced, so the used routes is only self-route (empty string).\n\t\tthis.summarizerNode.updateUsedRoutes([\"\"]);\n\n\t\tconst { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(usedRoutes);\n\t\tthis.dataStores.updateUsedRoutes(dataStoreRoutes);\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are unused.\n\t * @param unusedRoutes - Data store and attachment blob routes that are unused in this Container.\n\t */\n\tpublic updateUnusedRoutes(unusedRoutes: readonly string[]) {\n\t\tconst { blobManagerRoutes, dataStoreRoutes } =\n\t\t\tthis.getDataStoreAndBlobManagerRoutes(unusedRoutes);\n\t\tthis.blobManager.updateUnusedRoutes(blobManagerRoutes);\n\t\tthis.dataStores.updateUnusedRoutes(dataStoreRoutes);\n\t}\n\n\t/**\n\t * @deprecated Replaced by deleteSweepReadyNodes.\n\t */\n\tpublic deleteUnusedNodes(unusedRoutes: readonly string[]): string[] {\n\t\tthrow new Error(\"deleteUnusedRoutes should not be called\");\n\t}\n\n\t/**\n\t * After GC has run and identified nodes that are sweep ready, this is called to delete the sweep ready nodes.\n\t * @param sweepReadyRoutes - The routes of nodes that are sweep ready and should be deleted.\n\t * @returns The routes of nodes that were deleted.\n\t */\n\tpublic deleteSweepReadyNodes(sweepReadyRoutes: readonly string[]): readonly string[] {\n\t\tconst { dataStoreRoutes, blobManagerRoutes } =\n\t\t\tthis.getDataStoreAndBlobManagerRoutes(sweepReadyRoutes);\n\n\t\tconst deletedRoutes = this.dataStores.deleteSweepReadyNodes(dataStoreRoutes);\n\t\treturn deletedRoutes.concat(this.blobManager.deleteSweepReadyNodes(blobManagerRoutes));\n\t}\n\n\t/**\n\t * This is called to update objects that are tombstones.\n\t *\n\t * A Tombstoned object has been unreferenced long enough that GC knows it won't be referenced again.\n\t * Tombstoned objects are eventually deleted by GC.\n\t *\n\t * @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.\n\t */\n\tpublic updateTombstonedRoutes(tombstonedRoutes: readonly string[]) {\n\t\tconst { blobManagerRoutes, dataStoreRoutes } =\n\t\t\tthis.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);\n\t\tthis.blobManager.updateTombstonedRoutes(blobManagerRoutes);\n\t\tthis.dataStores.updateTombstonedRoutes(dataStoreRoutes);\n\t}\n\n\t/**\n\t * Returns a server generated referenced timestamp to be used to track unreferenced nodes by GC.\n\t */\n\tpublic getCurrentReferenceTimestampMs(): number | undefined {\n\t\t// Use the timestamp of the last message seen by this client as that is server generated. If no messages have\n\t\t// been processed, use the timestamp of the message from the last summary.\n\t\treturn this.deltaManager.lastMessage?.timestamp ?? this.messageAtLastSummary?.timestamp;\n\t}\n\n\t/**\n\t * Returns the type of the GC node. Currently, there are nodes that belong to the root (\"/\"), data stores or\n\t * blob manager.\n\t */\n\tpublic getNodeType(nodePath: string): GCNodeType {\n\t\tif (this.isBlobPath(nodePath)) {\n\t\t\treturn GCNodeType.Blob;\n\t\t}\n\t\treturn this.dataStores.getGCNodeType(nodePath) ?? GCNodeType.Other;\n\t}\n\n\t/**\n\t * Called by GC to retrieve the package path of the node with the given path. The node should belong to a\n\t * data store or an attachment blob.\n\t */\n\tpublic async getGCNodePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n\t\tswitch (this.getNodeType(nodePath)) {\n\t\t\tcase GCNodeType.Blob:\n\t\t\t\treturn [BlobManager.basePath];\n\t\t\tcase GCNodeType.DataStore:\n\t\t\tcase GCNodeType.SubDataStore:\n\t\t\t\treturn this.dataStores.getDataStorePackagePath(nodePath);\n\t\t\tdefault:\n\t\t\t\tassert(false, 0x2de /* \"Package path requested for unsupported node type.\" */);\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether a given path is for attachment blobs that are in the format - \"/BlobManager.basePath/...\".\n\t */\n\tprivate isBlobPath(path: string): boolean {\n\t\tconst pathParts = path.split(\"/\");\n\t\tif (pathParts.length < 2 || pathParts[1] !== BlobManager.basePath) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * From a given list of routes, separate and return routes that belong to blob manager and data stores.\n\t * @param routes - A list of routes that can belong to data stores or blob manager.\n\t * @returns Two route lists - One that contains routes for blob manager and another one that contains routes\n\t * for data stores.\n\t */\n\tprivate getDataStoreAndBlobManagerRoutes(routes: readonly string[]) {\n\t\tconst blobManagerRoutes: string[] = [];\n\t\tconst dataStoreRoutes: string[] = [];\n\t\tfor (const route of routes) {\n\t\t\tif (this.isBlobPath(route)) {\n\t\t\t\tblobManagerRoutes.push(route);\n\t\t\t} else {\n\t\t\t\tdataStoreRoutes.push(route);\n\t\t\t}\n\t\t}\n\t\treturn { blobManagerRoutes, dataStoreRoutes };\n\t}\n\n\t/**\n\t * Runs garbage collection and updates the reference / used state of the nodes in the container.\n\t * @returns the statistics of the garbage collection run; undefined if GC did not run.\n\t */\n\tpublic async collectGarbage(\n\t\toptions: {\n\t\t\t/** Logger to use for logging GC events */\n\t\t\tlogger?: ITelemetryLoggerExt;\n\t\t\t/** True to run GC sweep phase after the mark phase */\n\t\t\trunSweep?: boolean;\n\t\t\t/** True to generate full GC data */\n\t\t\tfullGC?: boolean;\n\t\t},\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<IGCStats | undefined> {\n\t\treturn this.garbageCollector.collectGarbage(options, telemetryContext);\n\t}\n\n\t/**\n\t * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n\t * all references added in the system.\n\t * @param srcHandle - The handle of the node that added the reference.\n\t * @param outboundHandle - The handle of the outbound node that is referenced.\n\t */\n\tpublic addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n\t\tthis.garbageCollector.addedOutboundReference(\n\t\t\tsrcHandle.absolutePath,\n\t\t\toutboundHandle.absolutePath,\n\t\t);\n\t}\n\n\t/**\n\t * Generates the summary tree, uploads it to storage, and then submits the summarize op.\n\t * This is intended to be called by the summarizer, since it is the implementation of\n\t * ISummarizerInternalsProvider.submitSummary.\n\t * It takes care of state management at the container level, including pausing inbound\n\t * op processing, updating SummarizerNode state tracking, and garbage collection.\n\t * @param options - options controlling how the summary is generated or submitted\n\t */\n\tpublic async submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult> {\n\t\tconst { fullTree = false, finalAttempt = false, refreshLatestAck, summaryLogger } = options;\n\t\t// The summary number for this summary. This will be updated during the summary process, so get it now and\n\t\t// use it for all events logged during this summary.\n\t\tconst summaryNumber = this.nextSummaryNumber;\n\t\tconst summaryNumberLogger = createChildLogger({\n\t\t\tlogger: summaryLogger,\n\t\t\tproperties: {\n\t\t\t\tall: { summaryNumber },\n\t\t\t},\n\t\t});\n\n\t\tassert(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);\n\n\t\t// We close the summarizer and download a new snapshot and reload the container\n\t\tlet latestSnapshotVersionId: string | undefined;\n\t\tif (refreshLatestAck === true) {\n\t\t\treturn this.prefetchLatestSummaryThenClose(\n\t\t\t\tcreateChildLogger({\n\t\t\t\t\tlogger: summaryNumberLogger,\n\t\t\t\t\tproperties: { all: { safeSummary: true } },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent\n\t\t// and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not\n\t\t// saved within the timeout, check if it should be failed or can continue.\n\t\tif (this.validateSummaryBeforeUpload && this.isDirty) {\n\t\t\tconst countBefore = this.pendingMessagesCount;\n\t\t\t// The timeout for waiting for pending ops can be overridden via configurations.\n\t\t\tconst pendingOpsTimeout =\n\t\t\t\tthis.mc.config.getNumber(\"Fluid.Summarizer.waitForPendingOpsTimeoutMs\") ??\n\t\t\t\tdefaultPendingOpsWaitTimeoutMs;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst timeoutId = setTimeout(() => resolve(), pendingOpsTimeout);\n\t\t\t\tthis.once(\"saved\", () => {\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tthis.once(\"dispose\", () => {\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\treject(new Error(\"Runtime is disposed while summarizing\"));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Log that there are pending ops while summarizing. This will help us gather data on how often this\n\t\t\t// happens, whether we attempted to wait for these ops to be acked and what was the result.\n\t\t\tsummaryNumberLogger.sendTelemetryEvent({\n\t\t\t\teventName: \"PendingOpsWhileSummarizing\",\n\t\t\t\tsaved: !this.isDirty,\n\t\t\t\ttimeout: pendingOpsTimeout,\n\t\t\t\tcountBefore,\n\t\t\t\tcountAfter: this.pendingMessagesCount,\n\t\t\t});\n\n\t\t\t// There could still be pending ops. Check if summary should fail or continue.\n\t\t\tconst pendingMessagesFailResult = await this.shouldFailSummaryOnPendingOps(\n\t\t\t\tsummaryNumberLogger,\n\t\t\t\tthis.deltaManager.lastSequenceNumber,\n\t\t\t\tthis.deltaManager.minimumSequenceNumber,\n\t\t\t\tfinalAttempt,\n\t\t\t\ttrue /* beforeSummaryGeneration */,\n\t\t\t);\n\t\t\tif (pendingMessagesFailResult !== undefined) {\n\t\t\t\treturn pendingMessagesFailResult;\n\t\t\t}\n\t\t}\n\n\t\tconst shouldPauseInboundSignal =\n\t\t\tthis.mc.config.getBoolean(\n\t\t\t\t\"Fluid.ContainerRuntime.SubmitSummary.disableInboundSignalPause\",\n\t\t\t) !== true;\n\n\t\tlet summaryRefSeqNum: number | undefined;\n\n\t\ttry {\n\t\t\tawait this.deltaManager.inbound.pause();\n\t\t\tif (shouldPauseInboundSignal) {\n\t\t\t\tawait this.deltaManager.inboundSignal.pause();\n\t\t\t}\n\n\t\t\tsummaryRefSeqNum = this.deltaManager.lastSequenceNumber;\n\t\t\tconst minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;\n\t\t\tconst message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;\n\t\t\tconst lastAck = this.summaryCollection.latestAck;\n\n\t\t\tthis.summarizerNode.startSummary(summaryRefSeqNum, summaryNumberLogger);\n\n\t\t\t// Helper function to check whether we should still continue between each async step.\n\t\t\tconst checkContinue = (): { continue: true } | { continue: false; error: string } => {\n\t\t\t\t// Do not check for loss of connectivity directly! Instead leave it up to\n\t\t\t\t// RunWhileConnectedCoordinator to control policy in a single place.\n\t\t\t\t// This will allow easier change of design if we chose to. For example, we may chose to allow\n\t\t\t\t// summarizer to reconnect in the future.\n\t\t\t\t// Also checking for cancellation is a must as summary process may be abandoned for other reasons,\n\t\t\t\t// like loss of connectivity for main (interactive) client.\n\t\t\t\tif (options.cancellationToken.cancelled) {\n\t\t\t\t\treturn { continue: false, error: \"disconnected\" };\n\t\t\t\t}\n\t\t\t\t// That said, we rely on submitSystemMessage() that today only works in connected state.\n\t\t\t\t// So if we fail here, it either means that RunWhileConnectedCoordinator does not work correctly,\n\t\t\t\t// OR that design changed and we need to remove this check and fix submitSystemMessage.\n\t\t\t\tassert(this.connected, 0x258 /* \"connected\" */);\n\n\t\t\t\t// Ensure that lastSequenceNumber has not changed after pausing.\n\t\t\t\t// We need the summary op's reference sequence number to match our summary sequence number,\n\t\t\t\t// otherwise we'll get the wrong sequence number stamped on the summary's .protocol attributes.\n\t\t\t\tif (this.deltaManager.lastSequenceNumber !== summaryRefSeqNum) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontinue: false,\n\t\t\t\t\t\terror: `lastSequenceNumber changed before uploading to storage. ${this.deltaManager.lastSequenceNumber} !== ${summaryRefSeqNum}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tassert(\n\t\t\t\t\tsummaryRefSeqNum === this.deltaManager.lastMessage?.sequenceNumber,\n\t\t\t\t\t0x395 /* it's one and the same thing */,\n\t\t\t\t);\n\n\t\t\t\tif (lastAck !== this.summaryCollection.latestAck) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontinue: false,\n\t\t\t\t\t\terror: `Last summary changed while summarizing. ${this.summaryCollection.latestAck} !== ${lastAck}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { continue: true };\n\t\t\t};\n\n\t\t\tlet continueResult = checkContinue();\n\t\t\tif (!continueResult.continue) {\n\t\t\t\treturn {\n\t\t\t\t\tstage: \"base\",\n\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\terror: continueResult.error,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst trace = Trace.start();\n\t\t\tlet summarizeResult: ISummaryTreeWithStats;\n\t\t\t// If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced\n\t\t\t// state of all the nodes.\n\t\t\tconst forcedFullTree = this.garbageCollector.summaryStateNeedsReset;\n\t\t\ttry {\n\t\t\t\tsummarizeResult = await this.summarize({\n\t\t\t\t\tfullTree: fullTree || forcedFullTree,\n\t\t\t\t\ttrackState: true,\n\t\t\t\t\tsummaryLogger: summaryNumberLogger,\n\t\t\t\t\trunGC: this.garbageCollector.shouldRunGC,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstage: \"base\",\n\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\terror,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If validateSummaryBeforeUpload is true, validate that the summary generated is correct before uploading.\n\t\t\tif (this.validateSummaryBeforeUpload) {\n\t\t\t\t// Validate that the summaries generated by summarize nodes is correct.\n\t\t\t\tconst validateResult = this.summarizerNode.validateSummary();\n\t\t\t\tif (!validateResult.success) {\n\t\t\t\t\tconst { success, ...loggingProps } = validateResult;\n\t\t\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\t\tvalidateResult.reason,\n\t\t\t\t\t\tvalidateResult.retryAfterSeconds,\n\t\t\t\t\t\t{ ...loggingProps },\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstage: \"base\",\n\t\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\t\terror,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst pendingMessagesFailResult = await this.shouldFailSummaryOnPendingOps(\n\t\t\t\t\tsummaryNumberLogger,\n\t\t\t\t\tsummaryRefSeqNum,\n\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\tfinalAttempt,\n\t\t\t\t\tfalse /* beforeSummaryGeneration */,\n\t\t\t\t);\n\t\t\t\tif (pendingMessagesFailResult !== undefined) {\n\t\t\t\t\treturn pendingMessagesFailResult;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { summary: summaryTree, stats: partialStats } = summarizeResult;\n\n\t\t\t// Now that we have generated the summary, update the message at last summary to the last message processed.\n\t\t\tthis.messageAtLastSummary = this.deltaManager.lastMessage;\n\n\t\t\t// Counting dataStores and handles\n\t\t\t// Because handles are unchanged dataStores in the current logic,\n\t\t\t// summarized dataStore count is total dataStore count minus handle count\n\t\t\tconst dataStoreTree = summaryTree.tree[channelsTreeName];\n\n\t\t\tassert(dataStoreTree.type === SummaryType.Tree, 0x1fc /* \"summary is not a tree\" */);\n\t\t\tconst handleCount = Object.values(dataStoreTree.tree).filter(\n\t\t\t\t(value) => value.type === SummaryType.Handle,\n\t\t\t).length;\n\t\t\tconst gcSummaryTreeStats = summaryTree.tree[gcTreeKey]\n\t\t\t\t? calculateStats(summaryTree.tree[gcTreeKey])\n\t\t\t\t: undefined;\n\n\t\t\tconst summaryStats: IGeneratedSummaryStats = {\n\t\t\t\tdataStoreCount: this.dataStores.size,\n\t\t\t\tsummarizedDataStoreCount: this.dataStores.size - handleCount,\n\t\t\t\tgcStateUpdatedDataStoreCount: this.garbageCollector.updatedDSCountSinceLastSummary,\n\t\t\t\tgcBlobNodeCount: gcSummaryTreeStats?.blobNodeCount,\n\t\t\t\tgcTotalBlobsSize: gcSummaryTreeStats?.totalBlobSize,\n\t\t\t\tsummaryNumber,\n\t\t\t\t...partialStats,\n\t\t\t};\n\t\t\tconst generateSummaryData: Omit<IGenerateSummaryTreeResult, \"stage\" | \"error\"> = {\n\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t\tsummaryTree,\n\t\t\t\tsummaryStats,\n\t\t\t\tgenerateDuration: trace.trace().duration,\n\t\t\t\tforcedFullTree,\n\t\t\t} as const;\n\n\t\t\tcontinueResult = checkContinue();\n\t\t\tif (!continueResult.continue) {\n\t\t\t\treturn { stage: \"generate\", ...generateSummaryData, error: continueResult.error };\n\t\t\t}\n\n\t\t\t// It may happen that the lastAck it not correct due to missing summaryAck in case of single commit\n\t\t\t// summary. So if the previous summarizer closes just after submitting the summary and before\n\t\t\t// submitting the summaryOp then we can't rely on summaryAck. So in case we have\n\t\t\t// latestSnapshotVersionId from storage and it does not match with the lastAck ackHandle, then use\n\t\t\t// the one fetched from storage as parent as that is the latest.\n\t\t\tlet summaryContext: ISummaryContext;\n\t\t\tif (\n\t\t\t\tlastAck?.summaryAck.contents.handle !== latestSnapshotVersionId &&\n\t\t\t\tlatestSnapshotVersionId !== undefined\n\t\t\t) {\n\t\t\t\tsummaryContext = {\n\t\t\t\t\tproposalHandle: undefined,\n\t\t\t\t\tackHandle: latestSnapshotVersionId,\n\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t};\n\t\t\t} else if (lastAck === undefined) {\n\t\t\t\tsummaryContext = {\n\t\t\t\t\tproposalHandle: undefined,\n\t\t\t\t\tackHandle: this.loadedFromVersionId,\n\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tsummaryContext = {\n\t\t\t\t\tproposalHandle: lastAck.summaryOp.contents.handle,\n\t\t\t\t\tackHandle: lastAck.summaryAck.contents.handle,\n\t\t\t\t\treferenceSequenceNumber: summaryRefSeqNum,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet handle: string;\n\t\t\ttry {\n\t\t\t\thandle = await this.storage.uploadSummaryWithContext(\n\t\t\t\t\tsummarizeResult.summary,\n\t\t\t\t\tsummaryContext,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\treturn { stage: \"generate\", ...generateSummaryData, error };\n\t\t\t}\n\n\t\t\tconst parent = summaryContext.ackHandle;\n\t\t\tconst summaryMessage: ISummaryContent = {\n\t\t\t\thandle,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\thead: parent!,\n\t\t\t\tmessage,\n\t\t\t\tparents: parent ? [parent] : [],\n\t\t\t};\n\t\t\tconst uploadData = {\n\t\t\t\t...generateSummaryData,\n\t\t\t\thandle,\n\t\t\t\tuploadDuration: trace.trace().duration,\n\t\t\t} as const;\n\n\t\t\tcontinueResult = checkContinue();\n\t\t\tif (!continueResult.continue) {\n\t\t\t\treturn { stage: \"upload\", ...uploadData, error: continueResult.error };\n\t\t\t}\n\n\t\t\tlet clientSequenceNumber: number;\n\t\t\ttry {\n\t\t\t\tclientSequenceNumber = this.submitSummaryMessage(summaryMessage, summaryRefSeqNum);\n\t\t\t} catch (error) {\n\t\t\t\treturn { stage: \"upload\", ...uploadData, error };\n\t\t\t}\n\n\t\t\tconst submitData = {\n\t\t\t\tstage: \"submit\",\n\t\t\t\t...uploadData,\n\t\t\t\tclientSequenceNumber,\n\t\t\t\tsubmitOpDuration: trace.trace().duration,\n\t\t\t} as const;\n\n\t\t\ttry {\n\t\t\t\t// If validateSummaryBeforeUpload is false, the summary should be validated in this step.\n\t\t\t\tthis.summarizerNode.completeSummary(\n\t\t\t\t\thandle,\n\t\t\t\t\t!this.validateSummaryBeforeUpload /* validate */,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\treturn { stage: \"upload\", ...uploadData, error };\n\t\t\t}\n\t\t\treturn submitData;\n\t\t} finally {\n\t\t\t// Cleanup wip summary in case of failure\n\t\t\tthis.summarizerNode.clearSummary();\n\n\t\t\t// ! This needs to happen before we resume inbound queues to ensure heuristics are tracked correctly\n\t\t\tthis._summarizer?.recordSummaryAttempt?.(summaryRefSeqNum);\n\n\t\t\t// Restart the delta manager\n\t\t\tthis.deltaManager.inbound.resume();\n\t\t\tif (shouldPauseInboundSignal) {\n\t\t\t\tthis.deltaManager.inboundSignal.resume();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This helper is called during summarization. If the container is dirty, it will return a failed summarize result\n\t * (IBaseSummarizeResult) unless this is the final summarize attempt and SkipFailingIncorrectSummary option is set.\n\t * @param logger - The logger to be used for sending telemetry.\n\t * @param referenceSequenceNumber - The reference sequence number of the summary attempt.\n\t * @param minimumSequenceNumber - The minimum sequence number of the summary attempt.\n\t * @param finalAttempt - Whether this is the final summary attempt.\n\t * @param beforeSummaryGeneration - Whether this is called before summary generation or after.\n\t * @returns failed summarize result (IBaseSummarizeResult) if summary should be failed, undefined otherwise.\n\t */\n\tprivate async shouldFailSummaryOnPendingOps(\n\t\tlogger: ITelemetryLoggerExt,\n\t\treferenceSequenceNumber: number,\n\t\tminimumSequenceNumber: number,\n\t\tfinalAttempt: boolean,\n\t\tbeforeSummaryGeneration: boolean,\n\t): Promise<IBaseSummarizeResult | undefined> {\n\t\tif (!this.isDirty) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If \"SkipFailingIncorrectSummary\" option is true, don't fail the summary in the last attempt.\n\t\t// This is a fallback to make progress in documents where there are consistently pending ops in\n\t\t// the summarizer.\n\t\tif (\n\t\t\tfinalAttempt &&\n\t\t\tthis.mc.config.getBoolean(\"Fluid.Summarizer.SkipFailingIncorrectSummary\")\n\t\t) {\n\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\"Pending ops during summarization\",\n\t\t\t\t\"submitSummary\",\n\t\t\t\tundefined,\n\t\t\t\t{ pendingMessages: this.pendingMessagesCount },\n\t\t\t);\n\t\t\tlogger.sendErrorEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: \"SkipFailingIncorrectSummary\",\n\t\t\t\t\treferenceSequenceNumber,\n\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\tbeforeGenerate: beforeSummaryGeneration,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\t\t} else {\n\t\t\t// The retry delay when there are pending ops can be overridden via config so that we can adjust it\n\t\t\t// based on telemetry while we decide on a stable number.\n\t\t\tconst retryDelayMs =\n\t\t\t\tthis.mc.config.getNumber(\"Fluid.Summarizer.PendingOpsRetryDelayMs\") ??\n\t\t\t\tdefaultPendingOpsRetryDelayMs;\n\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\"PendingOpsWhileSummarizing\",\n\t\t\t\tretryDelayMs / 1000,\n\t\t\t\t{\n\t\t\t\t\tcount: this.pendingMessagesCount,\n\t\t\t\t\tbeforeGenerate: beforeSummaryGeneration,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstage: \"base\",\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t\terror,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate get pendingMessagesCount(): number {\n\t\treturn this.pendingStateManager.pendingMessagesCount + this.outbox.messageCount;\n\t}\n\n\tprivate hasPendingMessages() {\n\t\treturn this.pendingMessagesCount !== 0;\n\t}\n\n\tprivate updateDocumentDirtyState(dirty: boolean) {\n\t\tif (this.attachState !== AttachState.Attached) {\n\t\t\tassert(dirty, 0x3d2 /* Non-attached container is dirty */);\n\t\t} else {\n\t\t\t// Other way is not true = see this.isContainerMessageDirtyable()\n\t\t\tassert(\n\t\t\t\t!dirty || this.hasPendingMessages(),\n\t\t\t\t0x3d3 /* if doc is dirty, there has to be pending ops */,\n\t\t\t);\n\t\t}\n\n\t\tif (this.dirtyContainer === dirty) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dirtyContainer = dirty;\n\t\tif (this.emitDirtyDocumentEvent) {\n\t\t\tthis.emit(dirty ? \"dirty\" : \"saved\");\n\t\t}\n\t}\n\n\tpublic submitDataStoreOp(\n\t\tid: string,\n\t\tcontents: any,\n\t\tlocalOpMetadata: unknown = undefined,\n\t): void {\n\t\tconst envelope: IEnvelope = {\n\t\t\taddress: id,\n\t\t\tcontents,\n\t\t};\n\t\tthis.submit(\n\t\t\t{ type: ContainerMessageType.FluidDataStoreOp, contents: envelope },\n\t\t\tlocalOpMetadata,\n\t\t);\n\t}\n\n\tpublic submitDataStoreAliasOp(contents: any, localOpMetadata: unknown): void {\n\t\tconst aliasMessage = contents as IDataStoreAliasMessage;\n\t\tif (!isDataStoreAliasMessage(aliasMessage)) {\n\t\t\tthrow new UsageError(\"malformedDataStoreAliasMessage\");\n\t\t}\n\n\t\tthis.submit({ type: ContainerMessageType.Alias, contents }, localOpMetadata);\n\t}\n\n\tpublic async uploadBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tthis.verifyNotClosed();\n\t\treturn this.blobManager.createBlob(blob, signal);\n\t}\n\n\tprivate maybeSubmitIdAllocationOp(type: ContainerMessageType) {\n\t\tif (type !== ContainerMessageType.IdAllocation) {\n\t\t\tlet idAllocationBatchMessage: BatchMessage | undefined;\n\t\t\tlet idRange: IdCreationRange | undefined;\n\t\t\tif (this.idCompressorEnabled) {\n\t\t\t\tassert(\n\t\t\t\t\tthis.idCompressor !== undefined,\n\t\t\t\t\t0x67d /* IdCompressor should be defined if enabled */,\n\t\t\t\t);\n\t\t\t\tidRange = this.idCompressor.takeNextCreationRange();\n\t\t\t\t// Don't include the idRange if there weren't any Ids allocated\n\t\t\t\tidRange = idRange?.ids !== undefined ? idRange : undefined;\n\t\t\t}\n\n\t\t\tif (idRange !== undefined) {\n\t\t\t\tconst idAllocationMessage: ContainerRuntimeIdAllocationMessage = {\n\t\t\t\t\ttype: ContainerMessageType.IdAllocation,\n\t\t\t\t\tcontents: idRange,\n\t\t\t\t};\n\t\t\t\tidAllocationBatchMessage = {\n\t\t\t\t\tcontents: JSON.stringify(idAllocationMessage),\n\t\t\t\t\treferenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\t\t\tmetadata: undefined,\n\t\t\t\t\tlocalOpMetadata: undefined,\n\t\t\t\t\ttype: ContainerMessageType.IdAllocation,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (idAllocationBatchMessage !== undefined) {\n\t\t\t\tthis.outbox.submitIdAllocation(idAllocationBatchMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate submit(\n\t\tcontainerRuntimeMessage: OutboundContainerRuntimeMessage,\n\t\tlocalOpMetadata: unknown = undefined,\n\t\tmetadata: Record<string, unknown> | undefined = undefined,\n\t): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.verifyCanSubmitOps();\n\n\t\t// There should be no ops in detached container state!\n\t\tassert(\n\t\t\tthis.attachState !== AttachState.Detached,\n\t\t\t0x132 /* \"sending ops in detached container\" */,\n\t\t);\n\n\t\tconst serializedContent = JSON.stringify(containerRuntimeMessage);\n\n\t\t// Note that the real (non-proxy) delta manager is used here to get the readonly info. This is because\n\t\t// container runtime's ability to submit ops depend on the actual readonly state of the delta manager.\n\t\tif (this.innerDeltaManager.readOnlyInfo.readonly) {\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"SubmitOpInReadonly\",\n\t\t\t\tconnected: this.connected,\n\t\t\t});\n\t\t}\n\n\t\tconst type = containerRuntimeMessage.type;\n\t\tconst message: BatchMessage = {\n\t\t\tcontents: serializedContent,\n\t\t\ttype,\n\t\t\tmetadata,\n\t\t\tlocalOpMetadata,\n\t\t\treferenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\ttry {\n\t\t\t// Submit an IdAllocation op if any Ids have been generated since\n\t\t\t// the last op was submitted. Don't submit another if it's an IdAllocation\n\t\t\t// op as that means we're in resubmission flow and we don't want to send\n\t\t\t// IdRanges out of order.\n\t\t\tthis.maybeSubmitIdAllocationOp(type);\n\n\t\t\t// If this is attach message for new data store, and we are in a batch, send this op out of order\n\t\t\t// Is it safe:\n\t\t\t// Yes, this should be safe reordering. Newly created data stores are not visible through API surface.\n\t\t\t// They become visible only when aliased, or handle to some sub-element of newly created datastore\n\t\t\t// is stored in some DDS, i.e. only after some other op.\n\t\t\t// Why:\n\t\t\t// Attach ops are large, and expensive to process. Plus there are scenarios where a lot of new data\n\t\t\t// stores are created, causing issues like relay service throttling (too many ops) and catastrophic\n\t\t\t// failure (batch is too large). Pushing them earlier and outside of main batch should alleviate\n\t\t\t// these issues.\n\t\t\t// Cons:\n\t\t\t// 1. With large batches, relay service may throttle clients. Clients may disconnect while throttled.\n\t\t\t// This change creates new possibility of a lot of newly created data stores never being referenced\n\t\t\t// because client died before it had a change to submit the rest of the ops. This will create more\n\t\t\t// garbage that needs to be collected leveraging GC (Garbage Collection) feature.\n\t\t\t// 2. Sending ops out of order means they are excluded from rollback functionality. This is not an issue\n\t\t\t// today as rollback can't undo creation of data store. To some extent not sending them is a bigger\n\t\t\t// issue than sending.\n\t\t\t// Please note that this does not change file format, so it can be disabled in the future if this\n\t\t\t// optimization no longer makes sense (for example, batch compression may make it less appealing).\n\t\t\tif (\n\t\t\t\tthis.currentlyBatching() &&\n\t\t\t\ttype === ContainerMessageType.Attach &&\n\t\t\t\tthis.disableAttachReorder !== true\n\t\t\t) {\n\t\t\t\tthis.outbox.submitAttach(message);\n\t\t\t} else if (type === ContainerMessageType.BlobAttach) {\n\t\t\t\t// BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)\n\t\t\t\tthis.outbox.submitBlobAttach(message);\n\t\t\t} else {\n\t\t\t\tthis.outbox.submit(message);\n\t\t\t}\n\n\t\t\tif (!this.currentlyBatching()) {\n\t\t\t\tthis.flush();\n\t\t\t} else {\n\t\t\t\tthis.scheduleFlush();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.closeFn(error as GenericError);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.isContainerMessageDirtyable(containerRuntimeMessage)) {\n\t\t\tthis.updateDocumentDirtyState(true);\n\t\t}\n\t}\n\n\tprivate scheduleFlush() {\n\t\tif (this.flushTaskExists) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushTaskExists = true;\n\t\tconst flush = () => {\n\t\t\tthis.flushTaskExists = false;\n\t\t\ttry {\n\t\t\t\tthis.flush();\n\t\t\t} catch (error) {\n\t\t\t\tthis.closeFn(error as GenericError);\n\t\t\t}\n\t\t};\n\n\t\tswitch (this.flushMode) {\n\t\t\tcase FlushMode.TurnBased:\n\t\t\t\t// When in TurnBased flush mode the runtime will buffer operations in the current turn and send them as a single\n\t\t\t\t// batch at the end of the turn\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tPromise.resolve().then(flush);\n\t\t\t\tbreak;\n\n\t\t\t// FlushModeExperimental is experimental and not exposed directly in the runtime APIs\n\t\t\tcase FlushModeExperimental.Async as unknown as FlushMode:\n\t\t\t\t// When in Async flush mode, the runtime will accumulate all operations across JS turns and send them as a single\n\t\t\t\t// batch when all micro-tasks are complete.\n\t\t\t\t// Compared to TurnBased, this flush mode will capture more ops into the same batch.\n\t\t\t\tsetTimeout(flush, 0);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tassert(\n\t\t\t\t\tthis._orderSequentiallyCalls > 0,\n\t\t\t\t\t0x587 /* Unreachable unless running under orderSequentially */,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate submitSummaryMessage(contents: ISummaryContent, referenceSequenceNumber: number) {\n\t\tthis.verifyNotClosed();\n\t\tassert(\n\t\t\tthis.connected,\n\t\t\t0x133 /* \"Container disconnected when trying to submit system message\" */,\n\t\t);\n\n\t\t// System message should not be sent in the middle of the batch.\n\t\tassert(this.outbox.isEmpty, 0x3d4 /* System op in the middle of a batch */);\n\n\t\t// back-compat: ADO #1385: Make this call unconditional in the future\n\t\treturn this.submitSummaryFn !== undefined\n\t\t\t? this.submitSummaryFn(contents, referenceSequenceNumber)\n\t\t\t: this.submitFn(MessageType.Summarize, contents, false);\n\t}\n\n\t/**\n\t * Throw an error if the runtime is closed. Methods that are expected to potentially\n\t * be called after dispose due to asynchrony should not call this.\n\t */\n\tprivate verifyNotClosed() {\n\t\tif (this._disposed) {\n\t\t\tthrow new Error(\"Runtime is closed\");\n\t\t}\n\t}\n\n\tprivate verifyCanSubmitOps() {\n\t\tif (this.ensureNoDataModelChangesCalls > 0) {\n\t\t\tconst errorMessage =\n\t\t\t\t\"Op was submitted from within a `ensureNoDataModelChanges` callback\";\n\t\t\tif (this.opReentryCallsToReport > 0) {\n\t\t\t\tthis.mc.logger.sendTelemetryEvent(\n\t\t\t\t\t{ eventName: \"OpReentry\" },\n\t\t\t\t\t// We need to capture the call stack in order to inspect the source of this usage pattern\n\t\t\t\t\tgetLongStack(() => new UsageError(errorMessage)),\n\t\t\t\t);\n\t\t\t\tthis.opReentryCallsToReport--;\n\t\t\t}\n\n\t\t\t// Creating ops while processing ops can lead\n\t\t\t// to undefined behavior and events observed in the wrong order.\n\t\t\t// For example, we have two callbacks registered for a DDS, A and B.\n\t\t\t// Then if on change #1 callback A creates change #2, the invocation flow will be:\n\t\t\t//\n\t\t\t// A because of #1\n\t\t\t// A because of #2\n\t\t\t// B because of #2\n\t\t\t// B because of #1\n\t\t\t//\n\t\t\t// The runtime must enforce op coherence by not allowing ops to be submitted\n\t\t\t// while ops are being processed.\n\t\t\tif (this.enableOpReentryCheck) {\n\t\t\t\tthrow new UsageError(errorMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate reSubmitBatch(batch: IPendingBatchMessage[]) {\n\t\tthis.orderSequentially(() => {\n\t\t\tfor (const message of batch) {\n\t\t\t\tthis.reSubmit(message);\n\t\t\t}\n\t\t});\n\t\tthis.flush();\n\t}\n\n\tprivate reSubmit(message: IPendingBatchMessage) {\n\t\t// Need to parse from string for back-compat\n\t\tconst containerRuntimeMessage = this.parseLocalOpContent(message.content);\n\t\tthis.reSubmitCore(containerRuntimeMessage, message.localOpMetadata, message.opMetadata);\n\t}\n\n\t/**\n\t * Finds the right store and asks it to resubmit the message. This typically happens when we\n\t * reconnect and there are pending messages.\n\t * ! Note: successfully resubmitting an op that has been successfully sequenced is not possible due to checks in the ConnectionStateHandler (Loader layer)\n\t * @param message - The original LocalContainerRuntimeMessage.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tprivate reSubmitCore(\n\t\tmessage: LocalContainerRuntimeMessage,\n\t\tlocalOpMetadata: unknown,\n\t\topMetadata: Record<string, unknown> | undefined,\n\t) {\n\t\tswitch (message.type) {\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\t\t// For Operations, call resubmitDataStoreOp which will find the right store\n\t\t\t\t// and trigger resubmission on it.\n\t\t\t\tthis.dataStores.resubmitDataStoreOp(message.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.Attach:\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.IdAllocation: {\n\t\t\t\tthis.submit(message, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.ChunkedOp:\n\t\t\t\tthrow new Error(`chunkedOp not expected here`);\n\t\t\tcase ContainerMessageType.BlobAttach:\n\t\t\t\tthis.blobManager.reSubmit(opMetadata);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.Rejoin:\n\t\t\t\tthis.submit(message);\n\t\t\t\tbreak;\n\t\t\tcase ContainerMessageType.GC:\n\t\t\t\t// GC op is only sent in summarizer which should never reconnect.\n\t\t\t\tthrow new LoggingError(\"GC op not expected to be resubmitted in summarizer\");\n\t\t\tdefault: {\n\t\t\t\t// This case should be very rare - it would imply an op was stashed from a\n\t\t\t\t// future version of runtime code and now is being applied on an older version\n\t\t\t\tconst compatBehavior = message.compatDetails?.behavior;\n\t\t\t\tif (compatBehaviorAllowsMessageType(message.type, compatBehavior)) {\n\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"resubmitUnrecognizedMessageTypeAllowed\",\n\t\t\t\t\t\tmessageDetails: { type: message.type, compatBehavior },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\"Resubmitting runtime message of unknown type\",\n\t\t\t\t\t\t\"reSubmitCore\",\n\t\t\t\t\t\tundefined /* sequencedMessage */,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmessageDetails: JSON.stringify({\n\t\t\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\t\t\tcompatBehavior,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.closeFn(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rollback(content: string | undefined, localOpMetadata: unknown) {\n\t\t// Need to parse from string for back-compat\n\t\tconst { type, contents } = this.parseLocalOpContent(content);\n\t\tswitch (type) {\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\t\t// For operations, call rollbackDataStoreOp which will find the right store\n\t\t\t\t// and trigger rollback on it.\n\t\t\t\tthis.dataStores.rollbackDataStoreOp(contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Don't check message.compatDetails because this is for rolling back a local op so the type will be known\n\t\t\t\tthrow new Error(`Can't rollback ${type}`);\n\t\t}\n\t}\n\n\t/** Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck */\n\tpublic async refreshLatestSummaryAck(options: IRefreshSummaryAckOptions) {\n\t\tconst { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;\n\t\t// proposalHandle is always passed from RunningSummarizer.\n\t\tassert(proposalHandle !== undefined, 0x766 /* proposalHandle should be available */);\n\t\tconst readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n\t\tconst result = await this.summarizerNode.refreshLatestSummary(\n\t\t\tproposalHandle,\n\t\t\tsummaryRefSeq,\n\t\t);\n\n\t\t/**\n\t\t * When refreshing a summary ack, this check indicates a new ack of a summary that is newer than the\n\t\t * current summary that is tracked, but this summarizer runtime did not produce/track that summary. Thus\n\t\t * it needs to refresh its state. Today refresh is done by fetching the latest snapshot to update the cache\n\t\t * and then close as the current main client is likely to be re-elected as the parent summarizer again.\n\t\t */\n\t\tif (!result.isSummaryTracked && result.isSummaryNewer) {\n\t\t\tconst fetchResult = await this.fetchLatestSnapshotFromStorage(\n\t\t\t\tsummaryLogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"RefreshLatestSummaryAckFetch\",\n\t\t\t\t\tackHandle,\n\t\t\t\t\ttargetSequenceNumber: summaryRefSeq,\n\t\t\t\t},\n\t\t\t\treadAndParseBlob,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * If the fetched snapshot is older than the one for which the ack was received, close the container.\n\t\t\t * This should never happen because an ack should be sent after the latest summary is updated in the server.\n\t\t\t * However, there are couple of scenarios where it's possible:\n\t\t\t * 1. A file was modified externally resulting in modifying the snapshot's sequence number. This can lead to\n\t\t\t * the document being unusable and we should not proceed.\n\t\t\t * 2. The server DB failed after the ack was sent which may delete the corresponding snapshot. Ideally, in\n\t\t\t * such cases, the file will be rolled back along with the ack and we will eventually reach a consistent\n\t\t\t * state.\n\t\t\t */\n\t\t\tif (fetchResult.latestSnapshotRefSeq < summaryRefSeq) {\n\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\"Fetched snapshot is older than the received ack\",\n\t\t\t\t\t\"RefreshLatestSummaryAck\",\n\t\t\t\t\tundefined /* sequencedMessage */,\n\t\t\t\t\t{\n\t\t\t\t\t\tackHandle,\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t\tfetchedSnapshotRefSeq: fetchResult.latestSnapshotRefSeq,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.disposeFn(error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tawait this.closeStaleSummarizer(\"RefreshLatestSummaryAckFetch\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Notify the garbage collector so it can update its latest summary state.\n\t\tawait this.garbageCollector.refreshLatestSummary(result);\n\t}\n\n\t/**\n\t * Fetches the latest snapshot from storage to refresh the cache as a performance optimization and closes the\n\t * summarizer to reload from new state.\n\t * @param summaryLogger - logger to use when fetching snapshot from storage\n\t * @returns a generic summarization error\n\t */\n\tprivate async prefetchLatestSummaryThenClose(\n\t\tsummaryLogger: ITelemetryLoggerExt,\n\t): Promise<IBaseSummarizeResult> {\n\t\tconst readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n\n\t\t// This is a performance optimization as the same parent is likely to be elected again, and would use its\n\t\t// cache to fetch the snapshot instead of the network.\n\t\tawait this.fetchLatestSnapshotFromStorage(\n\t\t\tsummaryLogger,\n\t\t\t{\n\t\t\t\teventName: \"RefreshLatestSummaryFromServerFetch\",\n\t\t\t},\n\t\t\treadAndParseBlob,\n\t\t);\n\n\t\tawait this.closeStaleSummarizer(\"RefreshLatestSummaryFromServerFetch\");\n\n\t\treturn {\n\t\t\tstage: \"base\",\n\t\t\terror: \"summary state stale - Unsupported option 'refreshLatestAck'\",\n\t\t\treferenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\tminimumSequenceNumber: this.deltaManager.minimumSequenceNumber,\n\t\t};\n\t}\n\n\tprivate async closeStaleSummarizer(codePath: string): Promise<void> {\n\t\t// Delay before restarting summarizer to prevent the summarizer from restarting too frequently.\n\t\tawait delay(this.closeSummarizerDelayMs);\n\t\tthis._summarizer?.stop(\"latestSummaryStateStale\");\n\t\tthis.disposeFn();\n\t}\n\n\t/**\n\t * Downloads the latest snapshot from storage.\n\t * By default, it also closes the container after downloading the snapshot. However, this may be\n\t * overridden via options.\n\t */\n\tprivate async fetchLatestSnapshotFromStorage(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\treadAndParseBlob: ReadAndParseBlob,\n\t): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\tevent,\n\t\t\tasync (perfEvent: {\n\t\t\t\tend: (arg0: {\n\t\t\t\t\tgetVersionDuration?: number | undefined;\n\t\t\t\t\tgetSnapshotDuration?: number | undefined;\n\t\t\t\t\tsnapshotRefSeq?: number | undefined;\n\t\t\t\t\tsnapshotVersion?: string | undefined;\n\t\t\t\t}) => void;\n\t\t\t}) => {\n\t\t\t\tconst stats: {\n\t\t\t\t\tgetVersionDuration?: number;\n\t\t\t\t\tgetSnapshotDuration?: number;\n\t\t\t\t\tsnapshotRefSeq?: number;\n\t\t\t\t\tsnapshotVersion?: string;\n\t\t\t\t} = {};\n\t\t\t\tconst trace = Trace.start();\n\n\t\t\t\tconst versions = await this.storage.getVersions(\n\t\t\t\t\tnull,\n\t\t\t\t\t1,\n\t\t\t\t\t\"prefetchLatestSummaryBeforeClose\",\n\t\t\t\t\tFetchSource.noCache,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\t!!versions && !!versions[0],\n\t\t\t\t\t0x137 /* \"Failed to get version from storage\" */,\n\t\t\t\t);\n\t\t\t\tstats.getVersionDuration = trace.trace().duration;\n\n\t\t\t\tconst maybeSnapshot = await this.storage.getSnapshotTree(versions[0]);\n\t\t\t\tassert(!!maybeSnapshot, 0x138 /* \"Failed to get snapshot from storage\" */);\n\t\t\t\tstats.getSnapshotDuration = trace.trace().duration;\n\t\t\t\tconst latestSnapshotRefSeq = await seqFromTree(maybeSnapshot, readAndParseBlob);\n\t\t\t\tstats.snapshotRefSeq = latestSnapshotRefSeq;\n\t\t\t\tstats.snapshotVersion = versions[0].id;\n\n\t\t\t\tperfEvent.end(stats);\n\t\t\t\treturn {\n\t\t\t\t\tsnapshotTree: maybeSnapshot,\n\t\t\t\t\tversionId: versions[0].id,\n\t\t\t\t\tlatestSnapshotRefSeq,\n\t\t\t\t};\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic async getPendingLocalState(props?: IGetPendingLocalStateProps): Promise<unknown> {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tthis.mc.logger,\n\t\t\t{\n\t\t\t\teventName: \"getPendingLocalState\",\n\t\t\t\tnotifyImminentClosure: props?.notifyImminentClosure,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tthis.verifyNotClosed();\n\t\t\t\t// in case imminentClosure is set to true by future code, we don't\n\t\t\t\t// try to change its value\n\t\t\t\tif (!this.imminentClosure) {\n\t\t\t\t\tthis.imminentClosure = props?.notifyImminentClosure ?? this.imminentClosure;\n\t\t\t\t}\n\t\t\t\tconst stopBlobAttachingSignal = props?.stopBlobAttachingSignal;\n\t\t\t\tif (this._orderSequentiallyCalls !== 0) {\n\t\t\t\t\tthrow new UsageError(\"can't get state during orderSequentially\");\n\t\t\t\t}\n\t\t\t\t// Flush pending batch.\n\t\t\t\t// getPendingLocalState() is only exposed through Container.closeAndGetPendingLocalState(), so it's safe\n\t\t\t\t// to close current batch.\n\t\t\t\tthis.flush();\n\t\t\t\tconst pendingAttachmentBlobs = this.imminentClosure\n\t\t\t\t\t? await this.blobManager.attachAndGetPendingBlobs(stopBlobAttachingSignal)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst pending = this.pendingStateManager.getLocalState();\n\t\t\t\tif (!pendingAttachmentBlobs && !this.hasPendingMessages()) {\n\t\t\t\t\treturn; // no pending state to save\n\t\t\t\t}\n\n\t\t\t\tconst pendingIdCompressorState = this.idCompressor?.serialize(true);\n\n\t\t\t\tconst pendingState: IPendingRuntimeState = {\n\t\t\t\t\tpending,\n\t\t\t\t\tpendingAttachmentBlobs,\n\t\t\t\t\tpendingIdCompressorState,\n\t\t\t\t};\n\t\t\t\tevent.end({\n\t\t\t\t\tattachmentBlobsSize: Object.keys(pendingAttachmentBlobs ?? {}).length,\n\t\t\t\t\tpendingOpsSize: pending?.pendingStates.length,\n\t\t\t\t});\n\t\t\t\treturn pendingState;\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic summarizeOnDemand(options: IOnDemandSummarizeOptions): ISummarizeResults {\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn this.summarizer.summarizeOnDemand(options);\n\t\t} else if (this.summaryManager !== undefined) {\n\t\t\treturn this.summaryManager.summarizeOnDemand(options);\n\t\t} else {\n\t\t\t// If we're not the summarizer, and we don't have a summaryManager, we expect that\n\t\t\t// disableSummaries is turned on. We are throwing instead of returning a failure here,\n\t\t\t// because it is a misuse of the API rather than an expected failure.\n\t\t\tthrow new UsageError(`Can't summarize, disableSummaries: ${this.summariesDisabled}`);\n\t\t}\n\t}\n\n\tpublic enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult {\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn this.summarizer.enqueueSummarize(options);\n\t\t} else if (this.summaryManager !== undefined) {\n\t\t\treturn this.summaryManager.enqueueSummarize(options);\n\t\t} else {\n\t\t\t// If we're not the summarizer, and we don't have a summaryManager, we expect that\n\t\t\t// generateSummaries is turned off. We are throwing instead of returning a failure here,\n\t\t\t// because it is a misuse of the API rather than an expected failure.\n\t\t\tthrow new UsageError(`Can't summarize, disableSummaries: ${this.summariesDisabled}`);\n\t\t}\n\t}\n\n\t/**\n\t * Forms a function that will create and retrieve a Summarizer.\n\t */\n\tprivate formCreateSummarizerFn(loader: ILoader) {\n\t\treturn async () => {\n\t\t\treturn createSummarizer(loader, `/${summarizerRequestUrl}`);\n\t\t};\n\t}\n\n\tprivate validateSummaryHeuristicConfiguration(configuration: ISummaryConfigurationHeuristics) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const prop in configuration) {\n\t\t\tif (typeof configuration[prop] === \"number\" && configuration[prop] < 0) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t`Summary heuristic configuration property \"${prop}\" cannot be less than 0`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (configuration.minIdleTime > configuration.maxIdleTime) {\n\t\t\tthrow new UsageError(\n\t\t\t\t`\"minIdleTime\" [${configuration.minIdleTime}] cannot be greater than \"maxIdleTime\" [${configuration.maxIdleTime}]`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate get groupedBatchingEnabled(): boolean {\n\t\tconst killSwitch = this.mc.config.getBoolean(\n\t\t\t\"Fluid.ContainerRuntime.DisableGroupedBatching\",\n\t\t);\n\t\treturn killSwitch !== true && this.runtimeOptions.enableGroupedBatching;\n\t}\n}\n"]}
|
package/lib/dataStore.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataStore.d.mts","sourceRoot":"","sources":["../src/dataStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,mBAAmB,EAAgC,MAAM,iCAAiC;OAI5F,EAEN,UAAU,EACV,sBAAsB,EACtB,MAAM,qCAAqC;OACrC,EAAE,gBAAgB,EAAE;OACpB,EAAE,UAAU,EAAE;AAErB;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,+BACP,GAAG,yDAM/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0BACP,sBAAsB,cACjC,MAAM,WACT,gBAAgB,cACb,UAAU,UACd,mBAAmB,KACzB,UAA2F,CAAC"}
|
package/lib/dataStore.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataStore.mjs","sourceRoot":"","sources":["../src/dataStore.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLoggerExt, TelemetryDataTag, UsageError } from \"@fluidframework/telemetry-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { FluidObject, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tAliasResult,\n\tIDataStore,\n\tIFluidDataStoreChannel,\n} from \"@fluidframework/runtime-definitions\";\nimport { ContainerRuntime } from \"./containerRuntime\";\nimport { DataStores } from \"./dataStores\";\n\n/**\n * Interface for an op to be used for assigning an\n * alias to a datastore\n */\nexport interface IDataStoreAliasMessage {\n\t/** The internal id of the datastore */\n\treadonly internalId: string;\n\t/** The alias name to be assigned to the datastore */\n\treadonly alias: string;\n}\n\n/**\n * Type guard that returns true if the given alias message is actually an instance of\n * a class which implements {@link IDataStoreAliasMessage}\n * @param maybeDataStoreAliasMessage - message object to be validated\n * @returns True if the {@link IDataStoreAliasMessage} is fully implemented, false otherwise\n */\nexport const isDataStoreAliasMessage = (\n\tmaybeDataStoreAliasMessage: any,\n): maybeDataStoreAliasMessage is IDataStoreAliasMessage => {\n\treturn (\n\t\ttypeof maybeDataStoreAliasMessage?.internalId === \"string\" &&\n\t\ttypeof maybeDataStoreAliasMessage?.alias === \"string\"\n\t);\n};\n\nexport const channelToDataStore = (\n\tfluidDataStoreChannel: IFluidDataStoreChannel,\n\tinternalId: string,\n\truntime: ContainerRuntime,\n\tdatastores: DataStores,\n\tlogger: ITelemetryLoggerExt,\n): IDataStore => new DataStore(fluidDataStoreChannel, internalId, runtime, datastores, logger);\n\nenum AliasState {\n\tAliased = \"Aliased\",\n\tAliasing = \"Aliasing\",\n\tNone = \"None\",\n}\n\nclass DataStore implements IDataStore {\n\tprivate aliasState: AliasState = AliasState.None;\n\tprivate alias: string | undefined;\n\tprivate readonly pendingAliases: Map<string, Promise<AliasResult>>;\n\tprivate aliasResult: Promise<AliasResult> | undefined;\n\n\t/**\n\t * {@inheritDoc @fluidframework/runtime-definitions#IDataStore.trySetAlias}\n\t */\n\tasync trySetAlias(alias: string): Promise<AliasResult> {\n\t\tif (alias.includes(\"/\")) {\n\t\t\tthrow new UsageError(`The alias cannot contain slashes: '${alias}'`);\n\t\t}\n\n\t\tswitch (this.aliasState) {\n\t\t\t// If we're already aliasing, check if it's for the same value and return\n\t\t\t// the stored promise, otherwise return 'AlreadyAliased'\n\t\t\tcase AliasState.Aliasing:\n\t\t\t\tassert(\n\t\t\t\t\tthis.aliasResult !== undefined,\n\t\t\t\t\t0x316 /* There should be a cached promise of in-progress aliasing */,\n\t\t\t\t);\n\t\t\t\tawait this.aliasResult;\n\t\t\t\treturn this.alias === alias ? \"Success\" : \"AlreadyAliased\";\n\n\t\t\t// If this datastore is already aliased, return true only if this\n\t\t\t// is a repeated call for the same alias\n\t\t\tcase AliasState.Aliased:\n\t\t\t\treturn this.alias === alias ? \"Success\" : \"AlreadyAliased\";\n\n\t\t\tcase AliasState.None: {\n\t\t\t\tconst existingAlias = this.pendingAliases.get(alias);\n\t\t\t\tif (existingAlias !== undefined) {\n\t\t\t\t\t// There is already another datastore which will be aliased\n\t\t\t\t\t// to the same name\n\t\t\t\t\treturn \"Conflict\";\n\t\t\t\t}\n\n\t\t\t\t// There is no current or past alias operation for this datastore,\n\t\t\t\t// or for this alias, so it is safe to continue execution\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tunreachableCase(this.aliasState);\n\t\t}\n\n\t\tthis.aliasState = AliasState.Aliasing;\n\t\tthis.aliasResult = this.trySetAliasInternal(alias);\n\t\tthis.pendingAliases.set(alias, this.aliasResult);\n\t\treturn this.aliasResult;\n\t}\n\n\tasync trySetAliasInternal(alias: string): Promise<AliasResult> {\n\t\tconst message: IDataStoreAliasMessage = {\n\t\t\tinternalId: this.internalId,\n\t\t\talias,\n\t\t};\n\n\t\tthis.fluidDataStoreChannel.makeVisibleAndAttachGraph();\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst localResult = this.datastores.processAliasMessageCore(message);\n\t\t\t// Explicitly lock-out future attempts of aliasing,\n\t\t\t// regardless of result\n\t\t\tthis.aliasState = AliasState.Aliased;\n\t\t\treturn localResult ? \"Success\" : \"Conflict\";\n\t\t}\n\n\t\tconst aliased = await this.ackBasedPromise<boolean>((resolve) => {\n\t\t\tthis.runtime.submitDataStoreAliasOp(message, resolve);\n\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"AliasingException\",\n\t\t\t\t\t\talias: {\n\t\t\t\t\t\t\tvalue: alias,\n\t\t\t\t\t\t\ttag: TelemetryDataTag.UserData,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinternalId: {\n\t\t\t\t\t\t\tvalue: this.internalId,\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.pendingAliases.delete(alias);\n\t\t\t});\n\n\t\tif (!aliased) {\n\t\t\tthis.aliasState = AliasState.None;\n\t\t\tthis.aliasResult = undefined;\n\t\t\treturn \"Conflict\";\n\t\t}\n\n\t\tthis.alias = alias;\n\t\tthis.aliasState = AliasState.Aliased;\n\t\treturn \"Success\";\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/runtime-definitions#IDataStore.entryPoint}\n\t */\n\tget entryPoint(): IFluidHandle<FluidObject> {\n\t\treturn this.fluidDataStoreChannel.entryPoint;\n\t}\n\n\tconstructor(\n\t\tprivate readonly fluidDataStoreChannel: IFluidDataStoreChannel,\n\t\tprivate readonly internalId: string,\n\t\tprivate readonly runtime: ContainerRuntime,\n\t\tprivate readonly datastores: DataStores,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.pendingAliases = datastores.pendingAliases;\n\t}\n\n\tprivate async ackBasedPromise<T>(\n\t\texecutor: (\n\t\t\tresolve: (value: T | PromiseLike<T>) => void,\n\t\t\treject: (reason?: any) => void,\n\t\t) => void,\n\t): Promise<T> {\n\t\tlet rejectBecauseDispose: () => void;\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\trejectBecauseDispose = () =>\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\"ContainerRuntime disposed while this ack-based Promise was pending\"),\n\t\t\t\t);\n\n\t\t\tif (this.runtime.disposed) {\n\t\t\t\trejectBecauseDispose();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.runtime.on(\"dispose\", rejectBecauseDispose);\n\t\t\texecutor(resolve, reject);\n\t\t}).finally(() => {\n\t\t\tthis.runtime.off(\"dispose\", rejectBecauseDispose);\n\t\t});\n\t}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataStoreContext.d.mts","sourceRoot":"","sources":["../src/dataStoreContext.ts"],"names":[],"mappings":"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"}
|