@fluidframework/container-runtime 2.0.0-internal.2.4.0 → 2.0.0-internal.3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/containerRuntime.d.ts +45 -42
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +87 -38
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +1 -0
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +7 -2
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +0 -1
- package/dist/opLifecycle/outbox.js.map +1 -1
- 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 +4 -13
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +130 -160
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summarizerClientElection.d.ts +1 -2
- package/dist/summarizerClientElection.d.ts.map +1 -1
- package/dist/summarizerClientElection.js +3 -30
- package/dist/summarizerClientElection.js.map +1 -1
- package/dist/summarizerTypes.d.ts +0 -4
- package/dist/summarizerTypes.d.ts.map +1 -1
- package/dist/summarizerTypes.js.map +1 -1
- package/lib/containerRuntime.d.ts +45 -42
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +87 -38
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +1 -0
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +7 -2
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +0 -1
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +4 -13
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +130 -160
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summarizerClientElection.d.ts +1 -2
- package/lib/summarizerClientElection.d.ts.map +1 -1
- package/lib/summarizerClientElection.js +3 -30
- package/lib/summarizerClientElection.js.map +1 -1
- package/lib/summarizerTypes.d.ts +0 -4
- package/lib/summarizerTypes.d.ts.map +1 -1
- package/lib/summarizerTypes.js.map +1 -1
- package/package.json +34 -16
- package/src/containerRuntime.ts +116 -84
- package/src/dataStoreContext.ts +12 -6
- package/src/opLifecycle/outbox.ts +0 -2
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +146 -187
- package/src/summarizerClientElection.ts +1 -30
- package/src/summarizerTypes.ts +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.js","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 { ITelemetryBaseLogger, ITelemetryGenericEvent, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n FluidObject,\n IFluidHandle,\n IFluidHandleContext,\n IFluidRouter,\n IRequest,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IFluidTokenProvider,\n IContainerContext,\n IDeltaManager,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n LoaderHeader,\n ISnapshotTreeWithBlobContents,\n} from \"@fluidframework/container-definitions\";\nimport {\n IContainerRuntime,\n IContainerRuntimeEvents,\n} from \"@fluidframework/container-runtime-definitions\";\nimport {\n assert,\n Trace,\n TypedEventEmitter,\n unreachableCase,\n} from \"@fluidframework/common-utils\";\nimport {\n ChildLogger,\n raiseConnectedEvent,\n PerformanceEvent,\n TaggedLoggerAdapter,\n MonitoringContext,\n loggerToMonitoringContext,\n wrapError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n DriverHeader,\n FetchSource,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n DataCorruptionError,\n DataProcessingError,\n GenericError,\n UsageError,\n} from \"@fluidframework/container-utils\";\nimport {\n IClientDetails,\n IDocumentMessage,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryContent,\n ISummaryTree,\n MessageType,\n SummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n FlushMode,\n gcTreeKey,\n InboundAttachMessage,\n IFluidDataStoreContextDetached,\n IFluidDataStoreRegistry,\n IFluidDataStoreChannel,\n IGarbageCollectionData,\n IGarbageCollectionDetailsBase,\n IEnvelope,\n IInboundSignalMessage,\n ISignalEnvelope,\n NamedFluidDataStoreRegistryEntries,\n ISummaryTreeWithStats,\n ISummarizeInternalResult,\n CreateChildSummarizerNodeParam,\n SummarizeInternalFn,\n channelsTreeName,\n IAttachMessage,\n IDataStore,\n ITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n addBlobToSummary,\n addSummarizeResultToSummary,\n addTreeToSummary,\n createRootSummarizerNodeWithGC,\n IRootSummarizerNodeWithGC,\n RequestParser,\n create404Response,\n exceptionToResponse,\n requestFluidObject,\n responseToException,\n seqFromTree,\n calculateStats,\n TelemetryContext,\n} from \"@fluidframework/runtime-utils\";\nimport { GCDataBuilder, trimLeadingAndTrailingSlashes } from \"@fluidframework/garbage-collector\";\nimport { v4 as uuid } from \"uuid\";\nimport { ContainerFluidHandleContext } from \"./containerHandleContext\";\nimport { FluidDataStoreRegistry } from \"./dataStoreRegistry\";\nimport { Summarizer } from \"./summarizer\";\nimport { SummaryManager } from \"./summaryManager\";\nimport {\n ReportOpPerfTelemetry,\n IPerfSignalReport,\n} from \"./connectionTelemetry\";\nimport {\n IPendingLocalState,\n PendingStateManager,\n} from \"./pendingStateManager\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from \"./blobManager\";\nimport { DataStores, getSummaryForDatastores } from \"./dataStores\";\nimport {\n aliasBlobName,\n blobsTreeName,\n chunksBlobName,\n electedSummarizerBlobName,\n extractSummaryMetadataMessage,\n IContainerRuntimeMetadata,\n ICreateContainerMetadata,\n ISummaryMetadataMessage,\n metadataBlobName,\n wrapSummaryInChannelsTree,\n} from \"./summaryFormat\";\nimport { SummaryCollection } from \"./summaryCollection\";\nimport { ISerializedElection, OrderedClientCollection, OrderedClientElection } from \"./orderedClientElection\";\nimport { SummarizerClientElection, summarizerClientType } from \"./summarizerClientElection\";\nimport {\n SubmitSummaryResult,\n IConnectableRuntime,\n IGeneratedSummaryStats,\n ISubmitSummaryOptions,\n ISummarizer,\n ISummarizerInternalsProvider,\n ISummarizerOptions,\n ISummarizerRuntime,\n IRefreshSummaryAckOptions,\n} from \"./summarizerTypes\";\nimport { formExponentialFn, Throttler } from \"./throttler\";\nimport { RunWhileConnectedCoordinator } from \"./runWhileConnectedCoordinator\";\nimport {\n GarbageCollector,\n GCNodeType,\n IGarbageCollectionRuntime,\n IGarbageCollector,\n IGCStats,\n} from \"./garbageCollection\";\nimport {\n channelToDataStore,\n IDataStoreAliasMessage,\n isDataStoreAliasMessage,\n} from \"./dataStore\";\nimport { BindBatchTracker } from \"./batchTracker\";\nimport { ISerializedBaseSnapshotBlobs, SerializedSnapshotStorage } from \"./serializedSnapshotStorage\";\nimport { ScheduleManager } from \"./scheduleManager\";\nimport {\n BatchMessage,\n IBatchCheckpoint,\n OpCompressor,\n OpDecompressor,\n Outbox,\n OpSplitter,\n RemoteMessageProcessor,\n} from \"./opLifecycle\";\n\nexport enum ContainerMessageType {\n // An op to be delivered to store\n FluidDataStoreOp = \"component\",\n\n // Creates a new store\n Attach = \"attach\",\n\n // Chunked operation.\n ChunkedOp = \"chunkedOp\",\n\n // Signifies that a blob has been attached and should not be garbage collected by storage\n BlobAttach = \"blobAttach\",\n\n // Ties our new clientId to our old one on reconnect\n Rejoin = \"rejoin\",\n\n // Sets the alias of a root data store\n Alias = \"alias\",\n}\n\nexport interface ContainerRuntimeMessage {\n contents: any;\n type: ContainerMessageType;\n}\n\nexport interface ISummaryBaseConfiguration {\n /**\n * Delay before first attempt to spawn summarizing container.\n */\n initialSummarizerDelayMs: number;\n\n /**\n * @deprecated\n * Flag that will enable changing elected summarizer client after maxOpsSinceLastSummary.\n * This defaults to false (disabled) and must be explicitly set to true to enable.\n */\n summarizerClientElection: boolean;\n\n /**\n * Defines the maximum allowed time to wait for a pending summary ack.\n * The maximum amount of time client will wait for a summarize is the minimum of\n * maxSummarizeAckWaitTime (currently 10 * 60 * 1000) and maxAckWaitTime.\n */\n maxAckWaitTime: number;\n /**\n * Defines the maximum number of Ops in between Summaries that can be\n * allowed before forcibly electing a new summarizer client.\n */\n maxOpsSinceLastSummary: number;\n}\n\nexport interface ISummaryConfigurationHeuristics extends ISummaryBaseConfiguration {\n state: \"enabled\";\n /**\n * Defines the maximum allowed time, since the last received Ack, before running the summary\n * with reason maxTime.\n * For example, say we receive ops one by one just before the idle time is triggered.\n * In this case, we still want to run a summary since it's been a while since the last summary.\n */\n maxTime: number;\n /**\n * Defines the maximum number of Ops, since the last received Ack, that can be allowed\n * before running the summary with reason maxOps.\n */\n maxOps: number;\n /**\n * Defines the minimum number of Ops, since the last received Ack, that can be allowed\n * before running the last summary.\n */\n minOpsForLastSummaryAttempt: number;\n /**\n * Defines the lower boundary for the allowed time in between summarizations.\n * Pairs with maxIdleTime to form a range.\n * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n * linearly depending on the number of ops we receive.\n */\n minIdleTime: number;\n /**\n * Defines the upper boundary for the allowed time in between summarizations.\n * Pairs with minIdleTime to form a range.\n * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n * linearly depending on the number of ops we receive.\n */\n maxIdleTime: number;\n /**\n * Runtime op weight to use in heuristic summarizing.\n * This number is a multiplier on the number of runtime ops we process when running summarize heuristics.\n * For example: (multiplier) * (number of runtime ops) = weighted number of runtime ops\n */\n runtimeOpWeight: number;\n /**\n * Non-runtime op weight to use in heuristic summarizing\n * This number is a multiplier on the number of non-runtime ops we process when running summarize heuristics.\n * For example: (multiplier) * (number of non-runtime ops) = weighted number of non-runtime ops\n */\n nonRuntimeOpWeight: number;\n\n /**\n * Number of ops since last summary needed before a non-runtime op can trigger running summary heuristics.\n *\n * Note: Any runtime ops sent before the threshold is reached will trigger heuristics normally.\n * This threshold ONLY applies to non-runtime ops triggering summaries.\n *\n * For example: Say the threshold is 20. Sending 19 non-runtime ops will not trigger any heuristic checks.\n * Sending the 20th non-runtime op will trigger the heuristic checks for summarizing.\n */\n nonRuntimeHeuristicThreshold?: number;\n}\n\nexport interface ISummaryConfigurationDisableSummarizer {\n state: \"disabled\";\n}\n\nexport interface ISummaryConfigurationDisableHeuristics extends ISummaryBaseConfiguration {\n state: \"disableHeuristics\";\n}\n\nexport type ISummaryConfiguration =\n | ISummaryConfigurationDisableSummarizer\n | ISummaryConfigurationDisableHeuristics\n | ISummaryConfigurationHeuristics;\n\nexport const DefaultSummaryConfiguration: ISummaryConfiguration = {\n state: \"enabled\",\n\n minIdleTime: 0,\n\n maxIdleTime: 30 * 1000, // 30 secs.\n\n maxTime: 60 * 1000, // 1 min.\n\n maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.\n\n minOpsForLastSummaryAttempt: 10,\n\n maxAckWaitTime: 10 * 60 * 1000, // 10 mins.\n\n maxOpsSinceLastSummary: 7000,\n\n initialSummarizerDelayMs: 5 * 1000, // 5 secs.\n\n summarizerClientElection: false,\n\n nonRuntimeOpWeight: 0.1,\n\n runtimeOpWeight: 1.0,\n\n nonRuntimeHeuristicThreshold: 20,\n};\n\nexport interface IGCRuntimeOptions {\n /**\n * Flag that if true, will enable running garbage collection (GC) for a new container.\n *\n * GC has mark phase and sweep phase. In mark phase, unreferenced objects are identified\n * and marked as such in the summary. This option enables the mark phase.\n * In sweep phase, unreferenced objects are eventually deleted from the container if they meet certain conditions.\n * Sweep phase can be enabled via the \"sweepAllowed\" option.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n gcAllowed?: boolean;\n\n /**\n * Flag that if true, enables GC's sweep phase for a new container.\n *\n * This will allow GC to eventually delete unreferenced objects from the container.\n * This flag should only be set to true if \"gcAllowed\" is true.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n sweepAllowed?: boolean;\n\n /**\n * Flag that if true, will disable garbage collection for the session.\n * Can be used to disable running GC on containers where it is allowed via the gcAllowed option.\n */\n disableGC?: boolean;\n\n /**\n * Flag that will bypass optimizations and generate GC data for all nodes irrespective of whether a node\n * changed or not.\n */\n runFullGC?: boolean;\n\n /**\n * Maximum session duration for a new container. If not present, a default value will be used.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n sessionExpiryTimeoutMs?: number;\n\n /**\n * Allows additional GC options to be passed.\n */\n [key: string]: any;\n}\n\nexport interface ISummaryRuntimeOptions {\n\n /** Override summary configurations set by the server. */\n summaryConfigOverrides?: ISummaryConfiguration;\n\n /**\n * Delay before first attempt to spawn summarizing container.\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * {@link ISummaryBaseConfiguration.initialSummarizerDelayMs} instead.\n */\n initialSummarizerDelayMs?: number;\n\n /**\n * Flag that disables summaries if it is set to true.\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * {@link ISummaryConfigurationDisableSummarizer.state} instead.\n */\n disableSummaries?: boolean;\n\n /**\n * @defaultValue 7000 operations (ops)\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * {@link ISummaryBaseConfiguration.maxOpsSinceLastSummary} instead.\n */\n maxOpsSinceLastSummary?: number;\n\n /**\n * Flag that will enable changing elected summarizer client after maxOpsSinceLastSummary.\n *\n * @defaultValue `false` (disabled) and must be explicitly set to true to enable.\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * {@link ISummaryBaseConfiguration.summarizerClientElection} instead.\n */\n summarizerClientElection?: boolean;\n\n /**\n * Options that control the running summarizer behavior.\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * `{@link ISummaryConfiguration.state} = \"DisableHeuristics\"` instead.\n * */\n summarizerOptions?: Readonly<Partial<ISummarizerOptions>>;\n}\n\n/**\n * Options for op compression.\n * @experimental - Not ready for use\n */\nexport interface ICompressionRuntimeOptions {\n /**\n * The minimum size the batch's payload must exceed before the batch's contents will be compressed.\n */\n readonly minimumBatchSizeInBytes: number;\n\n /**\n * The compression algorithm that will be used to compress the op.\n */\n readonly compressionAlgorithm: CompressionAlgorithms;\n}\n\n/**\n * Options for container runtime.\n */\nexport interface IContainerRuntimeOptions {\n readonly summaryOptions?: ISummaryRuntimeOptions;\n readonly gcOptions?: IGCRuntimeOptions;\n /**\n * Affects the behavior while loading the runtime when the data verification check which\n * compares the DeltaManager sequence number (obtained from protocol in summary) to the\n * runtime sequence number (obtained from runtime metadata in summary) finds a mismatch.\n * 1. \"close\" (default) will close the container with an assertion.\n * 2. \"log\" will log an error event to telemetry, but still continue to load.\n * 3. \"bypass\" will skip the check entirely. This is not recommended.\n */\n readonly loadSequenceNumberVerification?: \"close\" | \"log\" | \"bypass\";\n /**\n * Sets the flush mode for the runtime. In Immediate flush mode the runtime will immediately\n * send all operations to the driver layer, while in TurnBased the operations will be buffered\n * and then sent them as a single batch at the end of the turn.\n * By default, flush mode is TurnBased.\n */\n readonly flushMode?: FlushMode;\n /**\n * Save enough runtime state to be able to serialize upon request and load to the same state in a new container.\n */\n readonly enableOfflineLoad?: boolean;\n /**\n * Enables the runtime to compress ops. Compression is disabled when undefined.\n * @experimental Not ready for use.\n */\n readonly compressionOptions?: ICompressionRuntimeOptions;\n /**\n * If specified, when in FlushMode.TurnBased, if the size of the ops between JS turns exceeds this value,\n * an error will be thrown and the container will close.\n *\n * If unspecified, the limit is 950 * 1024.\n *\n * 'Infinity' will disable any limit.\n *\n * @experimental This config should be driven by the connection with the service and will be moved in the future.\n */\n readonly maxBatchSizeInBytes?: number;\n /**\n * If the op payload needs to be chunked in order to work around the maximum size of the batch, this value represents\n * how large the individual chunks will be. This is only supported when compression is enabled.\n *\n * If unspecified, if a batch exceeds `maxBatchSizeInBytes` after compression, the container will close with an instance\n * of `GenericError` with the `BatchTooLarge` message.\n *\n * @experimental Not ready for use.\n */\n readonly chunkSizeInBytes?: number;\n /**\n * If enabled, the runtime will block all attempts to send an op with a different reference sequence number\n * from the previous ops submitted in the same JS turn. This happens when ops are reentrant (an op is created as a\n * response to another op, likely from an event handler).\n *\n * By default, the feature is disabled. If enabled from options, the `Fluid.ContainerRuntime.DisableOpReentryCheck`\n * can be used to disable it at runtime.\n */\n readonly enableOpReentryCheck?: boolean;\n}\n\n/**\n * The summary tree returned by the root node. It adds state relevant to the root of the tree.\n */\nexport interface IRootSummaryTreeWithStats extends ISummaryTreeWithStats {\n /** The garbage collection stats if GC ran, undefined otherwise. */\n gcStats?: IGCStats;\n}\n\n/**\n * Accepted header keys for requests coming to the runtime.\n */\nexport enum RuntimeHeaders {\n /** True to wait for a data store to be created and loaded before returning it. */\n wait = \"wait\",\n /**\n * True if the request is from an external app. Used for GC to handle scenarios where a data store\n * is deleted and requested via an external app.\n */\n externalRequest = \"externalRequest\",\n /** True if the request is coming from an IFluidHandle. */\n viaHandle = \"viaHandle\",\n}\n\n/** True if a tombstoned object should be returned without erroring */\nexport const AllowTombstoneRequestHeaderKey = \"allowTombstone\"; // Belongs in the enum above, but avoiding the breaking change\n\n/** Tombstone error responses will have this header set to true */\nexport const TombstoneResponseHeaderKey = \"isTombstoned\"\n\n/**\n * The full set of parsed header data that may be found on Runtime requests\n */\nexport interface RuntimeHeaderData {\n wait?: boolean;\n externalRequest?: boolean;\n viaHandle?: boolean;\n allowTombstone?: boolean;\n}\n\n/** Default values for Runtime Headers */\nexport const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {\n wait: true,\n externalRequest: false,\n viaHandle: false,\n allowTombstone: false,\n}\n\n/**\n * Available compression algorithms for op compression.\n */\nexport enum CompressionAlgorithms {\n lz4 = \"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 logger: ITelemetryBaseLogger;\n taggedLogger: 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 */\ninterface IPendingRuntimeState {\n /**\n * Pending ops from PendingStateManager\n */\n pending?: IPendingLocalState;\n /**\n * Pending blobs from BlobManager\n */\n pendingAttachmentBlobs?: IPendingBlobs;\n /**\n * A base snapshot at a sequence number prior to the first pending op\n */\n baseSnapshot: ISnapshotTree;\n /**\n * Serialized blobs from the base snapshot. Used to load offline since\n * storage is not available.\n */\n snapshotBlobs: ISerializedBaseSnapshotBlobs;\n /**\n * All runtime ops since base snapshot sequence number up to the latest op\n * seen when the container was closed. Used to apply stashed (saved pending)\n * ops at the same sequence number at which they were made.\n */\n savedOps: ISequencedDocumentMessage[];\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 = 950 * 1024;\n\n/**\n * @deprecated - use ContainerRuntimeMessage instead\n */\nexport enum RuntimeMessage {\n FluidDataStoreOp = \"component\",\n Attach = \"attach\",\n ChunkedOp = \"chunkedOp\",\n BlobAttach = \"blobAttach\",\n Rejoin = \"rejoin\",\n Alias = \"alias\",\n Operation = \"op\",\n}\n\n/**\n * @deprecated - please use version in driver-utils\n */\nexport function isRuntimeMessage(message: ISequencedDocumentMessage): boolean {\n return (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 */\nexport const agentSchedulerId = \"_scheduler\";\n\n// safely check navigator and get the hardware spec value\nexport function getDeviceSpec() {\n try {\n if (typeof navigator === \"object\" && navigator !== null) {\n return {\n deviceMemory: (navigator as any).deviceMemory,\n hardwareConcurrency: navigator.hardwareConcurrency,\n };\n }\n } catch {\n }\n return {};\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 */\nexport class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>\n implements\n IContainerRuntime,\n IGarbageCollectionRuntime,\n IRuntime,\n ISummarizerRuntime,\n ISummarizerInternalsProvider {\n public get IContainerRuntime() { return this; }\n public get IFluidRouter() { return this; }\n\n /**\n * Load the stores from a snapshot and returns the runtime.\n * @param context - Context of the container.\n * @param registryEntries - Mapping to the stores.\n * @param requestHandler - Request handlers for the container runtime\n * @param runtimeOptions - Additional options to be passed to the runtime\n * @param existing - (optional) When loading from an existing snapshot. Precedes context.existing if provided\n * @param containerRuntimeCtor - (optional) Constructor to use to create the ContainerRuntime instance. This\n * allows mixin classes to leverage this method to define their own async initializer.\n */\n public static async load(\n context: IContainerContext,\n registryEntries: NamedFluidDataStoreRegistryEntries,\n requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>,\n runtimeOptions: IContainerRuntimeOptions = {},\n containerScope: FluidObject = context.scope,\n existing?: boolean,\n containerRuntimeCtor: typeof ContainerRuntime = ContainerRuntime\n ): Promise<ContainerRuntime> {\n // If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:\n // back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45\n const backCompatContext: IContainerContext | OldContainerContextWithLogger = context;\n const passLogger = backCompatContext.taggedLogger ??\n new TaggedLoggerAdapter((backCompatContext as OldContainerContextWithLogger).logger);\n const logger = ChildLogger.create(passLogger, undefined, {\n all: {\n runtimeVersion: pkgVersion,\n },\n });\n\n const {\n summaryOptions = {},\n gcOptions = {},\n loadSequenceNumberVerification = \"close\",\n flushMode = defaultFlushMode,\n enableOfflineLoad = false,\n compressionOptions = {\n minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,\n compressionAlgorithm: CompressionAlgorithms.lz4\n },\n maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,\n chunkSizeInBytes = Number.POSITIVE_INFINITY,\n enableOpReentryCheck = false,\n } = runtimeOptions;\n\n const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;\n const baseSnapshot: ISnapshotTree | undefined = pendingRuntimeState?.baseSnapshot ?? context.baseSnapshot;\n const storage = !pendingRuntimeState ?\n context.storage :\n new SerializedSnapshotStorage(() => { return context.storage; }, pendingRuntimeState.snapshotBlobs);\n\n const registry = new FluidDataStoreRegistry(registryEntries);\n\n const tryFetchBlob = async <T>(blobName: string): Promise<T | undefined> => {\n const blobId = baseSnapshot?.blobs[blobName];\n if (baseSnapshot && blobId) {\n // IContainerContext storage api return type still has undefined in 0.39 package version.\n // So once we release 0.40 container-defn package we can remove this check.\n assert(storage !== undefined, 0x1f5 /* \"Attached state should have storage\" */);\n return readAndParse<T>(storage, blobId);\n }\n };\n\n const [chunks, metadata, electedSummarizerData, aliases] = await Promise.all([\n tryFetchBlob<[string, string[]][]>(chunksBlobName),\n tryFetchBlob<IContainerRuntimeMetadata>(metadataBlobName),\n tryFetchBlob<ISerializedElection>(electedSummarizerBlobName),\n tryFetchBlob<[string, string][]>(aliasBlobName),\n ]);\n\n const loadExisting = existing === true || context.existing === true;\n\n // read snapshot blobs needed for BlobManager to load\n const blobManagerSnapshot = await BlobManager.load(\n baseSnapshot?.trees[blobsTreeName],\n async (id) => {\n // IContainerContext storage api return type still has undefined in 0.39 package version.\n // So once we release 0.40 container-defn package we can remove this check.\n assert(storage !== undefined, 0x256 /* \"storage undefined in attached container\" */);\n return readAndParse(storage, id);\n },\n );\n\n // Verify summary runtime sequence number matches protocol sequence number.\n const runtimeSequenceNumber = metadata?.message?.sequenceNumber;\n // When we load with pending state, we reuse an old snapshot so we don't expect these numbers to match\n if (!pendingRuntimeState && runtimeSequenceNumber !== undefined) {\n const protocolSequenceNumber = context.deltaManager.initialSequenceNumber;\n // Unless bypass is explicitly set, then take action when sequence numbers mismatch.\n if (loadSequenceNumberVerification !== \"bypass\" && runtimeSequenceNumber !== protocolSequenceNumber) {\n // \"Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber\"\n const error = new DataCorruptionError(\n // pre-0.58 error message: SummaryMetadataMismatch\n \"Summary metadata mismatch\",\n { runtimeVersion: pkgVersion, runtimeSequenceNumber, protocolSequenceNumber },\n );\n\n if (loadSequenceNumberVerification === \"log\") {\n logger.sendErrorEvent({ eventName: \"SequenceNumberMismatch\" }, error);\n } else {\n // Call both close and dispose as closeFn implementation will no longer dispose runtime in future\n context.closeFn(error);\n context.disposeFn?.(error);\n }\n }\n }\n\n const runtime = new containerRuntimeCtor(\n context,\n registry,\n metadata,\n electedSummarizerData,\n chunks ?? [],\n aliases ?? [],\n {\n summaryOptions,\n gcOptions,\n loadSequenceNumberVerification,\n flushMode,\n enableOfflineLoad,\n compressionOptions,\n maxBatchSizeInBytes,\n chunkSizeInBytes,\n enableOpReentryCheck,\n },\n containerScope,\n logger,\n loadExisting,\n blobManagerSnapshot,\n storage,\n requestHandler,\n );\n\n if (pendingRuntimeState) {\n await runtime.processSavedOps(pendingRuntimeState);\n // delete these once runtime has seen them to save space\n pendingRuntimeState.savedOps = [];\n }\n\n // Initialize the base state of the runtime before it's returned.\n await runtime.initializeBaseState();\n\n return runtime;\n }\n\n public get options(): ILoaderOptions {\n return this.context.options;\n }\n\n public get clientId(): string | undefined {\n return this.context.clientId;\n }\n\n public get clientDetails(): IClientDetails {\n return this.context.clientDetails;\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this.context.deltaManager;\n }\n\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n public get reSubmitFn(): (\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) => void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.reSubmit;\n }\n\n public get disposeFn(): (error?: ICriticalContainerError) => void {\n // In old loaders without dispose functionality, closeFn is equivalent but will also switch container to readonly mode\n return this.context.disposeFn ?? this.context.closeFn;\n }\n\n public get closeFn(): (error?: ICriticalContainerError) => void {\n // Also call disposeFn to retain functionality of runtime being disposed on close\n return (error?: ICriticalContainerError) => {\n this.context.closeFn(error);\n this.context.disposeFn?.(error);\n };\n }\n\n public get flushMode(): FlushMode {\n return this._flushMode;\n }\n\n public get scope(): FluidObject {\n return this.containerScope;\n }\n\n public get IFluidDataStoreRegistry(): IFluidDataStoreRegistry {\n return this.registry;\n }\n\n public get attachState(): AttachState {\n return this.context.attachState;\n }\n\n public get IFluidHandleContext(): IFluidHandleContext {\n return this.handleContext;\n }\n private readonly handleContext: ContainerFluidHandleContext;\n\n // internal logger for ContainerRuntime. Use this.logger for stores, summaries, etc.\n private readonly mc: MonitoringContext;\n\n private readonly summarizerClientElection?: SummarizerClientElection;\n /**\n * summaryManager will only be created if this client is permitted to spawn a summarizing client\n * It is created only by interactive client, i.e. summarizer client, as well as non-interactive bots\n * do not create it (see SummarizerClientElection.clientDetailsPermitElection() for details)\n */\n private readonly summaryManager?: SummaryManager;\n private readonly summaryCollection: SummaryCollection;\n\n private readonly summarizerNode: IRootSummarizerNodeWithGC;\n\n private readonly maxConsecutiveReconnects: number;\n private readonly defaultMaxConsecutiveReconnects = 7;\n\n private _orderSequentiallyCalls: number = 0;\n private readonly _flushMode: FlushMode;\n private flushMicroTaskExists = false;\n\n private _connected: boolean;\n\n private readonly savedOps: ISequencedDocumentMessage[] = [];\n private baseSnapshotBlobs?: ISerializedBaseSnapshotBlobs;\n\n private consecutiveReconnects = 0;\n\n /**\n * Used to delay transition to \"connected\" state while we upload\n * attachment blobs that were added while disconnected\n */\n private delayConnectClientId?: string;\n\n public get connected(): boolean {\n return this._connected;\n }\n\n /** clientId of parent (non-summarizing) container that owns summarizer container */\n public get summarizerClientId(): string | undefined {\n return this.summarizerClientElection?.electedClientId;\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n\n private dirtyContainer: boolean;\n private emitDirtyDocumentEvent = true;\n private readonly enableOpReentryCheck: boolean;\n\n private readonly defaultTelemetrySignalSampleCount = 100;\n private _perfSignalData: IPerfSignalReport = {\n signalsLost: 0,\n signalSequenceNumber: 0,\n signalTimestamp: 0,\n trackingSignalSequenceNumber: undefined,\n };\n\n /**\n * Summarizer is responsible for coordinating when to send generate and send summaries.\n * It is the main entry point for summary work.\n * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n */\n private readonly _summarizer?: Summarizer;\n private readonly scheduleManager: ScheduleManager;\n private readonly blobManager: BlobManager;\n private readonly pendingStateManager: PendingStateManager;\n private readonly outbox: Outbox;\n\n private readonly garbageCollector: IGarbageCollector;\n\n private readonly dataStores: DataStores;\n private readonly remoteMessageProcessor: RemoteMessageProcessor;\n\n /** The last message processed at the time of the last summary. */\n private messageAtLastSummary: ISummaryMetadataMessage | undefined;\n\n private get summarizer(): Summarizer {\n assert(this._summarizer !== undefined, 0x257 /* \"This is not summarizing container\" */);\n return this._summarizer;\n }\n\n private readonly summariesDisabled: boolean;\n private isSummariesDisabled(): boolean {\n // back-compat: disableSummaries was moved from ISummaryRuntimeOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.disableSummaries === true) {\n return true;\n }\n return this.summaryConfiguration.state === \"disabled\";\n }\n\n private readonly heuristicsDisabled: boolean;\n private isHeuristicsDisabled(): boolean {\n // back-compat: disableHeuristics was moved from ISummarizerOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.summarizerOptions?.disableHeuristics === true) {\n return true;\n }\n return this.summaryConfiguration.state === \"disableHeuristics\";\n }\n\n private readonly summarizerClientElectionEnabled: boolean;\n private isSummarizerClientElectionEnabled(): boolean {\n if (this.mc.config.getBoolean(\"Fluid.ContainerRuntime.summarizerClientElection\")) {\n return this.mc.config.getBoolean(\"Fluid.ContainerRuntime.summarizerClientElection\") ?? true;\n }\n // back-compat: summarizerClientElection was moved from ISummaryRuntimeOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.summarizerClientElection === true) {\n return true;\n }\n return this.summaryConfiguration.state !== \"disabled\"\n ? this.summaryConfiguration.summarizerClientElection === true\n : false;\n }\n private readonly maxOpsSinceLastSummary: number;\n private getMaxOpsSinceLastSummary(): number {\n // back-compat: maxOpsSinceLastSummary was moved from ISummaryRuntimeOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.maxOpsSinceLastSummary !== undefined) {\n return this.runtimeOptions.summaryOptions.maxOpsSinceLastSummary;\n }\n return this.summaryConfiguration.state !== \"disabled\"\n ? this.summaryConfiguration.maxOpsSinceLastSummary\n : 0;\n }\n\n private readonly initialSummarizerDelayMs: number;\n private getInitialSummarizerDelayMs(): number {\n // back-compat: initialSummarizerDelayMs was moved from ISummaryRuntimeOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.initialSummarizerDelayMs !== undefined) {\n return this.runtimeOptions.summaryOptions.initialSummarizerDelayMs;\n }\n return this.summaryConfiguration.state !== \"disabled\"\n ? this.summaryConfiguration.initialSummarizerDelayMs\n : 0;\n }\n\n private readonly createContainerMetadata: ICreateContainerMetadata;\n /**\n * The summary number of the next summary that will be generated for this container. This is incremented every time\n * a summary is generated.\n */\n private nextSummaryNumber: number;\n\n /**\n * @internal\n */\n protected constructor(\n private readonly context: IContainerContext,\n private readonly registry: IFluidDataStoreRegistry,\n metadata: IContainerRuntimeMetadata | undefined,\n electedSummarizerData: ISerializedElection | undefined,\n chunks: [string, string[]][],\n dataStoreAliasMap: [string, string][],\n private readonly runtimeOptions: Readonly<Required<IContainerRuntimeOptions>>,\n private readonly containerScope: FluidObject,\n public readonly logger: ITelemetryLogger,\n existing: boolean,\n blobManagerSnapshot: IBlobManagerLoadInfo,\n private readonly _storage: IDocumentStorageService,\n private readonly requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>,\n private readonly summaryConfiguration: ISummaryConfiguration = {\n // the defaults\n ...DefaultSummaryConfiguration,\n // the runtime configuration overrides\n ...runtimeOptions.summaryOptions?.summaryConfigOverrides,\n },\n ) {\n super();\n\n let loadSummaryNumber: number;\n // Get the container creation metadata. For new container, we initialize these. For existing containers,\n // get the values from the metadata blob.\n if (existing) {\n this.createContainerMetadata = {\n createContainerRuntimeVersion: metadata?.createContainerRuntimeVersion,\n createContainerTimestamp: metadata?.createContainerTimestamp,\n };\n // summaryNumber was renamed from summaryCount. For older docs that haven't been opened for a long time,\n // the count is reset to 0.\n loadSummaryNumber = metadata?.summaryNumber ?? 0;\n } else {\n this.createContainerMetadata = {\n createContainerRuntimeVersion: pkgVersion,\n createContainerTimestamp: Date.now(),\n };\n loadSummaryNumber = 0;\n }\n this.nextSummaryNumber = loadSummaryNumber + 1;\n\n this.messageAtLastSummary = metadata?.message;\n\n this._connected = this.context.connected;\n\n this.mc = loggerToMonitoringContext(ChildLogger.create(this.logger, \"ContainerRuntime\"));\n\n const opSplitter = new OpSplitter(\n chunks,\n this.context.submitBatchFn,\n this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableCompressionChunking\") === true ?\n Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes,\n runtimeOptions.maxBatchSizeInBytes,\n this.mc.logger);\n this.remoteMessageProcessor = new RemoteMessageProcessor(opSplitter, new OpDecompressor());\n\n this.handleContext = new ContainerFluidHandleContext(\"\", this);\n\n if (this.summaryConfiguration.state === \"enabled\") {\n this.validateSummaryHeuristicConfiguration(this.summaryConfiguration);\n }\n\n this.enableOpReentryCheck = runtimeOptions.enableOpReentryCheck === true\n // Allow for a break-glass config to override the options\n && this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableOpReentryCheck\") !== true;\n\n this.summariesDisabled = this.isSummariesDisabled();\n this.heuristicsDisabled = this.isHeuristicsDisabled();\n this.summarizerClientElectionEnabled = this.isSummarizerClientElectionEnabled();\n this.maxOpsSinceLastSummary = this.getMaxOpsSinceLastSummary();\n this.initialSummarizerDelayMs = this.getInitialSummarizerDelayMs();\n\n this.maxConsecutiveReconnects =\n this.mc.config.getNumber(maxConsecutiveReconnectsKey) ?? this.defaultMaxConsecutiveReconnects;\n\n this._flushMode = runtimeOptions.flushMode;\n\n const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;\n const baseSnapshot: ISnapshotTree | undefined = pendingRuntimeState?.baseSnapshot ?? context.baseSnapshot;\n\n const maxSnapshotCacheDurationMs = this._storage?.policies?.maximumCacheDurationMs;\n if (maxSnapshotCacheDurationMs !== undefined && maxSnapshotCacheDurationMs > 5 * 24 * 60 * 60 * 1000) {\n // This is a runtime enforcement of what's already explicit in the policy's type itself,\n // which dictates the value is either undefined or exactly 5 days in ms.\n // As long as the actual value is less than 5 days, the assumptions GC makes here are valid.\n throw new UsageError(\"Driver's maximumCacheDurationMs policy cannot exceed 5 days\");\n }\n\n this.garbageCollector = GarbageCollector.create({\n runtime: this,\n gcOptions: this.runtimeOptions.gcOptions,\n baseSnapshot,\n baseLogger: this.mc.logger,\n existing,\n metadata,\n createContainerMetadata: this.createContainerMetadata,\n isSummarizerClient: this.context.clientDetails.type === summarizerClientType,\n getNodePackagePath: async (nodePath: string) => this.getGCNodePackagePath(nodePath),\n getLastSummaryTimestampMs: () => this.messageAtLastSummary?.timestamp,\n readAndParseBlob: async <T>(id: string) => readAndParse<T>(this.storage, id),\n getContainerDiagnosticId: () => this.context.id,\n activeConnection: () => this.deltaManager.active,\n });\n\n const loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;\n this.summarizerNode = createRootSummarizerNodeWithGC(\n ChildLogger.create(this.logger, \"SummarizerNode\"),\n // Summarize function to call when summarize is called. Summarizer node always tracks summary state.\n async (fullTree: boolean, trackState: boolean, telemetryContext?: ITelemetryContext) =>\n this.summarizeInternal(fullTree, trackState, telemetryContext),\n // Latest change sequence number, no changes since summary applied yet\n loadedFromSequenceNumber,\n // Summary reference sequence number, undefined if no summary yet\n baseSnapshot ? loadedFromSequenceNumber : undefined,\n {\n // Must set to false to prevent sending summary handle which would be pointing to\n // a summary with an older protocol state.\n canReuseHandle: false,\n // Must set to true to throw on any data stores failure that was too severe to be handled.\n // We also are not decoding the base summaries at the root.\n throwOnFailure: true,\n // If GC should not run, let the summarizer node know so that it does not track GC state.\n gcDisabled: !this.garbageCollector.shouldRunGC,\n },\n // Function to get GC data if needed. This will always be called by the root summarizer node to get GC data.\n async (fullGC?: boolean) => this.getGCDataInternal(fullGC),\n // Function to get the GC details from the base snapshot we loaded from.\n async () => this.garbageCollector.getBaseGCDetails(),\n );\n\n if (baseSnapshot) {\n this.summarizerNode.updateBaseSummaryState(baseSnapshot);\n }\n\n this.dataStores = new DataStores(\n getSummaryForDatastores(baseSnapshot, metadata),\n this,\n (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg),\n (id: string, createParam: CreateChildSummarizerNodeParam) => (\n summarizeInternal: SummarizeInternalFn,\n getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,\n getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,\n ) => this.summarizerNode.createChild(\n summarizeInternal,\n id,\n createParam,\n undefined,\n getGCDataFn,\n getBaseGCDetailsFn,\n ),\n (id: string) => this.summarizerNode.deleteChild(id),\n this.mc.logger,\n async () => this.garbageCollector.getBaseGCDetails(),\n (path: string, timestampMs: number, packagePath?: readonly string[]) => this.garbageCollector.nodeUpdated(\n path,\n \"Changed\",\n timestampMs,\n packagePath,\n ),\n new Map<string, string>(dataStoreAliasMap),\n );\n\n this.blobManager = new BlobManager(\n this.handleContext,\n blobManagerSnapshot,\n () => this.storage,\n (localId: string, blobId?: string) => {\n if (!this.disposed) {\n this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { localId, blobId });\n }\n },\n (blobPath: string) => this.garbageCollector.nodeUpdated(blobPath, \"Loaded\"),\n (fromPath: string, toPath: string) => this.garbageCollector.addedOutboundReference(fromPath, toPath),\n this,\n pendingRuntimeState?.pendingAttachmentBlobs,\n () => this.getCurrentReferenceTimestampMs(),\n );\n\n this.scheduleManager = new ScheduleManager(\n context.deltaManager,\n this,\n () => this.clientId,\n ChildLogger.create(this.logger, \"ScheduleManager\"),\n );\n\n this.pendingStateManager = new PendingStateManager(\n {\n applyStashedOp: this.applyStashedOp.bind(this),\n clientId: () => this.clientId,\n close: this.closeFn,\n connected: () => this.connected,\n flush: this.flush.bind(this),\n reSubmit: this.reSubmit.bind(this),\n rollback: this.rollback.bind(this),\n orderSequentially: this.orderSequentially.bind(this),\n },\n pendingRuntimeState?.pending);\n\n const compressionOptions = this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableCompression\") === true ?\n {\n minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,\n compressionAlgorithm: CompressionAlgorithms.lz4\n } : runtimeOptions.compressionOptions;\n\n this.outbox = new Outbox({\n shouldSend: () => this.canSendOps(),\n pendingStateManager: this.pendingStateManager,\n containerContext: this.context,\n compressor: new OpCompressor(this.mc.logger),\n splitter: opSplitter,\n config: {\n compressionOptions,\n maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,\n enableOpReentryCheck: this.enableOpReentryCheck,\n },\n logger: this.mc.logger,\n });\n\n this.context.quorum.on(\"removeMember\", (clientId: string) => {\n this.remoteMessageProcessor.clearPartialMessagesFor(clientId);\n });\n\n this.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);\n\n this.dirtyContainer = this.context.attachState !== AttachState.Attached\n || this.pendingStateManager.hasPendingMessages();\n this.context.updateDirtyContainerState(this.dirtyContainer);\n\n if (this.summariesDisabled) {\n this.mc.logger.sendTelemetryEvent({ eventName: \"SummariesDisabled\" });\n } else {\n const orderedClientLogger = ChildLogger.create(this.logger, \"OrderedClientElection\");\n const orderedClientCollection = new OrderedClientCollection(\n orderedClientLogger,\n this.context.deltaManager,\n this.context.quorum,\n );\n const orderedClientElectionForSummarizer = new OrderedClientElection(\n\n orderedClientLogger,\n orderedClientCollection,\n electedSummarizerData ?? this.context.deltaManager.lastSequenceNumber,\n SummarizerClientElection.isClientEligible,\n );\n\n this.summarizerClientElection = new SummarizerClientElection(\n orderedClientLogger,\n this.summaryCollection,\n orderedClientElectionForSummarizer,\n this.maxOpsSinceLastSummary,\n this.summarizerClientElectionEnabled,\n );\n\n if (this.context.clientDetails.type === summarizerClientType) {\n this._summarizer = new Summarizer(\n \"/_summarizer\",\n this /* ISummarizerRuntime */,\n () => this.summaryConfiguration,\n this /* ISummarizerInternalsProvider */,\n this.handleContext,\n this.summaryCollection,\n async (runtime: IConnectableRuntime) => RunWhileConnectedCoordinator.create(runtime),\n );\n } else if (SummarizerClientElection.clientDetailsPermitElection(this.context.clientDetails)) {\n // Only create a SummaryManager and SummarizerClientElection\n // if summaries are enabled and we are not the summarizer client.\n const defaultAction = () => {\n if (this.summaryCollection.opsSinceLastAck > this.maxOpsSinceLastSummary) {\n this.logger.sendTelemetryEvent({ eventName: \"SummaryStatus:Behind\" });\n // unregister default to no log on every op after falling behind\n // and register summary ack handler to re-register this handler\n // after successful summary\n this.summaryCollection.once(MessageType.SummaryAck, () => {\n this.logger.sendTelemetryEvent({ eventName: \"SummaryStatus:CaughtUp\" });\n // we've caught up, so re-register the default action to monitor for\n // falling behind, and unregister ourself\n this.summaryCollection.on(\"default\", defaultAction);\n });\n this.summaryCollection.off(\"default\", defaultAction);\n }\n };\n\n this.summaryCollection.on(\"default\", defaultAction);\n\n // Create the SummaryManager and mark the initial state\n this.summaryManager = new SummaryManager(\n this.summarizerClientElection,\n this, // IConnectedState\n this.summaryCollection,\n this.logger,\n this.formRequestSummarizerFn(this.context.loader),\n new Throttler(\n 60 * 1000, // 60 sec delay window\n 30 * 1000, // 30 sec max delay\n // throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)\n formExponentialFn({ coefficient: 20, initialDelay: 0 }),\n ),\n {\n initialDelayMs: this.initialSummarizerDelayMs,\n },\n this.heuristicsDisabled,\n );\n this.summaryManager.start();\n }\n }\n\n this.deltaManager.on(\"readonly\", (readonly: boolean) => {\n // we accumulate ops while being in read-only state.\n // once user gets write permissions and we have active connection, flush all pending ops.\n assert(readonly === this.deltaManager.readOnlyInfo.readonly,\n 0x124 /* \"inconsistent readonly property/event state\" */);\n\n // We need to be very careful with when we (re)send pending ops, to ensure that we only send ops\n // when we either never send an op, or attempted to send it but we know for sure it was not\n // sequenced by server and will never be sequenced (i.e. was lost)\n // For loss of connection, we wait for our own \"join\" op and use it a a barrier to know all the\n // ops that made it from previous connection, before switching clientId and raising \"connected\" event\n // But with read-only permissions, if we transition between read-only and r/w states while on same\n // connection, then we have no good signal to tell us when it's safe to send ops we accumulated while\n // being in read-only state.\n // For that reason, we support getting to read-only state only when disconnected. This ensures that we\n // can rely on same safety mechanism and resend ops only when we establish new connection.\n // This is applicable for read-only permissions (event is raised before connection is properly registered),\n // but it's an extra requirement for Container.forceReadonly() API\n assert(!readonly || !this.connected, 0x125 /* \"Unsafe to transition to read-only state!\" */);\n\n this.replayPendingStates();\n });\n\n // logging hardware telemetry\n logger.sendTelemetryEvent({\n eventName: \"DeviceSpec\",\n ...getDeviceSpec(),\n });\n\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerLoadStats\",\n ...this.createContainerMetadata,\n ...this.dataStores.containerLoadStats,\n summaryNumber: loadSummaryNumber,\n summaryFormatVersion: metadata?.summaryFormatVersion,\n disableIsolatedChannels: metadata?.disableIsolatedChannels,\n gcVersion: metadata?.gcFeature,\n });\n\n ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);\n BindBatchTracker(this, this.logger);\n }\n\n /**\n * Initializes the state from the base snapshot this container runtime loaded from.\n */\n private async initializeBaseState(): Promise<void> {\n await this.initializeBaseSnapshotBlobs();\n await this.garbageCollector.initializeBaseState();\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerRuntimeDisposed\",\n isDirty: this.isDirty,\n lastSequenceNumber: this.deltaManager.lastSequenceNumber,\n attachState: this.attachState,\n }, error);\n\n if (this.summaryManager !== undefined) {\n this.summaryManager.dispose();\n }\n this.garbageCollector.dispose();\n this._summarizer?.dispose();\n this.dataStores.dispose();\n this.pendingStateManager.dispose();\n this.emit(\"dispose\");\n this.removeAllListeners();\n }\n\n public get IFluidTokenProvider() {\n if (this.options?.intelligence) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n intelligence: this.options.intelligence,\n } as IFluidTokenProvider;\n }\n return undefined;\n }\n\n /**\n * Notifies this object about the request made to the container.\n * @param request - Request made to the handler.\n */\n public async request(request: IRequest): Promise<IResponse> {\n try {\n const parser = RequestParser.create(request);\n const id = parser.pathParts[0];\n\n if (id === \"_summarizer\" && parser.pathParts.length === 1) {\n if (this._summarizer !== undefined) {\n return {\n status: 200,\n mimeType: \"fluid/object\",\n value: this.summarizer,\n };\n }\n return create404Response(request);\n }\n if (this.requestHandler !== undefined) {\n return this.requestHandler(parser, this);\n }\n\n return create404Response(request);\n } catch (error) {\n return exceptionToResponse(error);\n }\n }\n\n /**\n * Resolves URI representing handle\n * @param request - Request made to the handler.\n */\n public async resolveHandle(request: IRequest): Promise<IResponse> {\n try {\n const requestParser = RequestParser.create(request);\n const id = requestParser.pathParts[0];\n\n if (id === \"_channels\") {\n return this.resolveHandle(requestParser.createSubRequest(1));\n }\n\n if (id === BlobManager.basePath && requestParser.isLeaf(2)) {\n const blob = await this.blobManager.getBlob(requestParser.pathParts[1]);\n return blob\n ? {\n status: 200,\n mimeType: \"fluid/object\",\n value: blob,\n } : create404Response(request);\n } else if (requestParser.pathParts.length > 0) {\n const dataStore = await this.getDataStoreFromRequest(id, request);\n const subRequest = requestParser.createSubRequest(1);\n // We always expect createSubRequest to include a leading slash, but asserting here to protect against\n // unintentionally modifying the url if that changes.\n assert(subRequest.url.startsWith(\"/\"),\n 0x126 /* \"Expected createSubRequest url to include a leading slash\" */);\n return dataStore.IFluidRouter.request(subRequest);\n }\n\n return create404Response(request);\n } catch (error) {\n return exceptionToResponse(error);\n }\n }\n\n private internalId(maybeAlias: string): string {\n return this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;\n }\n\n private async getDataStoreFromRequest(id: string, request: IRequest): Promise<IFluidRouter> {\n const headerData: RuntimeHeaderData = {};\n if (typeof request.headers?.[RuntimeHeaders.wait] === \"boolean\") {\n headerData.wait = request.headers[RuntimeHeaders.wait];\n }\n if (typeof request.headers?.[RuntimeHeaders.viaHandle] === \"boolean\") {\n headerData.viaHandle = request.headers[RuntimeHeaders.viaHandle];\n }\n if (typeof request.headers?.[AllowTombstoneRequestHeaderKey] === \"boolean\") {\n headerData.allowTombstone = request.headers[AllowTombstoneRequestHeaderKey];\n }\n\n await this.dataStores.waitIfPendingAlias(id);\n const internalId = this.internalId(id);\n const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);\n\n /**\n * If GC should run and this an external app request with \"externalRequest\" header, we need to return\n * an error if the data store being requested is marked as unreferenced as per the data store's base\n * GC data.\n *\n * This is a workaround to handle scenarios where a data store shared with an external app is deleted\n * and marked as unreferenced by GC. Returning an error will fail to load the data store for the app.\n */\n if (request.headers?.[RuntimeHeaders.externalRequest] && this.garbageCollector.shouldRunGC) {\n // The data store is referenced if used routes in the base summary has a route to self.\n // Older documents may not have used routes in the summary. They are considered referenced.\n const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;\n if (!(usedRoutes === undefined || usedRoutes.includes(\"\") || usedRoutes.includes(\"/\"))) {\n throw responseToException(create404Response(request), request);\n }\n }\n\n const dataStoreChannel = await dataStoreContext.realize();\n\n // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is\n // the same as GC nodes id.\n const urlWithoutQuery = trimLeadingAndTrailingSlashes(request.url.split(\"?\")[0]);\n this.garbageCollector.nodeUpdated(\n `/${urlWithoutQuery}`,\n \"Loaded\",\n undefined /* timestampMs */,\n dataStoreContext.packagePath,\n request?.headers,\n );\n return dataStoreChannel;\n }\n\n /** Adds the container's metadata to the given summary tree. */\n private addMetadataToSummary(summaryTree: ISummaryTreeWithStats) {\n const metadata: IContainerRuntimeMetadata = {\n ...this.createContainerMetadata,\n // Increment the summary number for the next summary that will be generated.\n summaryNumber: this.nextSummaryNumber++,\n summaryFormatVersion: 1,\n ...this.garbageCollector.getMetadata(),\n // The last message processed at the time of summary. If there are no new messages, use the message from the\n // last summary.\n message: extractSummaryMetadataMessage(this.deltaManager.lastMessage) ?? this.messageAtLastSummary,\n };\n addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(metadata));\n }\n\n protected addContainerStateToSummary(\n summaryTree: ISummaryTreeWithStats,\n fullTree: boolean,\n trackState: boolean,\n telemetryContext?: ITelemetryContext,\n ) {\n this.addMetadataToSummary(summaryTree);\n\n if (this.remoteMessageProcessor.partialMessages.size > 0) {\n const content = JSON.stringify([...this.remoteMessageProcessor.partialMessages]);\n addBlobToSummary(summaryTree, chunksBlobName, content);\n }\n\n const dataStoreAliases = this.dataStores.aliases;\n if (dataStoreAliases.size > 0) {\n addBlobToSummary(summaryTree, aliasBlobName, JSON.stringify([...dataStoreAliases]));\n }\n\n if (this.summarizerClientElection) {\n const electedSummarizerContent = JSON.stringify(this.summarizerClientElection?.serialize());\n addBlobToSummary(summaryTree, electedSummarizerBlobName, electedSummarizerContent);\n }\n\n const blobManagerSummary = this.blobManager.summarize();\n // Some storage (like git) doesn't allow empty tree, so we can omit it.\n // and the blob manager can handle the tree not existing when loading\n if (Object.keys(blobManagerSummary.summary.tree).length > 0) {\n addTreeToSummary(summaryTree, blobsTreeName, blobManagerSummary);\n }\n\n const gcSummary = this.garbageCollector.summarize(fullTree, trackState, telemetryContext);\n if (gcSummary !== undefined) {\n addSummarizeResultToSummary(summaryTree, gcTreeKey, gcSummary);\n }\n }\n\n // Track how many times the container tries to reconnect with pending messages.\n // This happens when the connection state is changed and we reset the counter\n // when we are able to process a local op or when there are no pending messages.\n // If this counter reaches a max, it's a good indicator that the container\n // is not making progress and it is stuck in a retry loop.\n private shouldContinueReconnecting(): boolean {\n if (this.maxConsecutiveReconnects <= 0) {\n // Feature disabled, we never stop reconnecting\n return true;\n }\n\n if (!this.hasPendingMessages()) {\n // If there are no pending messages, we can always reconnect\n this.resetReconnectCount();\n return true;\n }\n\n if (this.consecutiveReconnects === Math.floor(this.maxConsecutiveReconnects / 2)) {\n // If we're halfway through the max reconnects, send an event in order\n // to better identify false positives, if any. If the rate of this event\n // matches Container Close count below, we can safely cut down\n // maxConsecutiveReconnects to half.\n this.mc.logger.sendTelemetryEvent({\n eventName: \"ReconnectsWithNoProgress\",\n attempts: this.consecutiveReconnects,\n pendingMessages: this.pendingStateManager.pendingMessagesCount,\n });\n }\n\n return this.consecutiveReconnects < this.maxConsecutiveReconnects;\n }\n\n private resetReconnectCount() {\n this.consecutiveReconnects = 0;\n }\n\n private replayPendingStates() {\n // We need to be able to send ops to replay states\n if (!this.canSendOps()) { return; }\n\n // We need to temporary clear the dirty flags and disable\n // dirty state change events to detect whether replaying ops\n // has any effect.\n\n // Save the old state, reset to false, disable event emit\n const oldState = this.dirtyContainer;\n this.dirtyContainer = false;\n\n assert(this.emitDirtyDocumentEvent, 0x127 /* \"dirty document event not set on replay\" */);\n this.emitDirtyDocumentEvent = false;\n let newState: boolean;\n\n try {\n // replay the ops\n this.pendingStateManager.replayPendingStates();\n } finally {\n // Save the new start and restore the old state, re-enable event emit\n newState = this.dirtyContainer;\n this.dirtyContainer = oldState;\n this.emitDirtyDocumentEvent = true;\n }\n\n // Officially transition from the old state to the new state.\n this.updateDocumentDirtyState(newState);\n }\n\n private async applyStashedOp(type: ContainerMessageType, op: ISequencedDocumentMessage): Promise<unknown> {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n return this.dataStores.applyStashedOp(op);\n case ContainerMessageType.Attach:\n return this.dataStores.applyStashedAttachOp(op as unknown as IAttachMessage);\n case ContainerMessageType.Alias:\n case ContainerMessageType.BlobAttach:\n return;\n case ContainerMessageType.ChunkedOp:\n throw new Error(\"chunkedOp not expected here\");\n case ContainerMessageType.Rejoin:\n throw new Error(\"rejoin not expected here\");\n default:\n unreachableCase(type, `Unknown ContainerMessageType: ${type}`);\n }\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n if (connected === false && this.delayConnectClientId !== undefined) {\n this.delayConnectClientId = undefined;\n this.mc.logger.sendTelemetryEvent({\n eventName: \"UnsuccessfulConnectedTransition\",\n });\n // Don't propagate \"disconnected\" event because we didn't propagate the previous \"connected\" event\n return;\n }\n\n // If attachment blobs were added while disconnected, we need to delay\n // propagation of the \"connected\" event until we have uploaded them to\n // ensure we don't submit ops referencing a blob that has not been uploaded\n const connecting = connected && !this._connected && !this.deltaManager.readOnlyInfo.readonly;\n if (connecting && this.blobManager.hasPendingOfflineUploads) {\n assert(!this.delayConnectClientId,\n 0x392 /* Connect event delay must be canceled before subsequent connect event */);\n assert(!!clientId, 0x393 /* Must have clientId when connecting */);\n this.delayConnectClientId = clientId;\n this.blobManager.onConnected().then(() => {\n // make sure we didn't reconnect before the promise resolved\n if (this.delayConnectClientId === clientId && !this.disposed) {\n this.delayConnectClientId = undefined;\n this.setConnectionStateCore(connected, clientId);\n }\n }, (error) => this.closeFn(error));\n return;\n }\n\n this.setConnectionStateCore(connected, clientId);\n }\n\n private setConnectionStateCore(connected: boolean, clientId?: string) {\n assert(!this.delayConnectClientId,\n 0x394 /* connect event delay must be cleared before propagating connect event */);\n this.verifyNotClosed();\n\n // There might be no change of state due to Container calling this API after loading runtime.\n const changeOfState = this._connected !== connected;\n const reconnection = changeOfState && !connected;\n this._connected = connected;\n\n if (!connected) {\n this._perfSignalData.signalsLost = 0;\n this._perfSignalData.signalTimestamp = 0;\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n } else {\n assert(this.attachState === AttachState.Attached,\n 0x3cd /* Connection is possible only if container exists in storage */);\n }\n\n // Fail while disconnected\n if (reconnection) {\n this.consecutiveReconnects++;\n\n if (!this.shouldContinueReconnecting()) {\n this.closeFn(\n DataProcessingError.create(\n \"Runtime detected too many reconnects with no progress syncing local ops. Batch of ops is likely too large (over 1Mb)\",\n \"setConnectionState\",\n undefined,\n {\n dataLoss: 1,\n attempts: this.consecutiveReconnects,\n pendingMessages: this.pendingStateManager.pendingMessagesCount,\n }));\n return;\n }\n }\n\n if (changeOfState) {\n this.replayPendingStates();\n }\n\n this.dataStores.setConnectionState(connected, clientId);\n this.garbageCollector.setConnectionState(connected, clientId);\n\n raiseConnectedEvent(this.mc.logger, this, connected, clientId);\n }\n\n public process(messageArg: ISequencedDocumentMessage, local: boolean) {\n this.verifyNotClosed();\n\n if (this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) {\n this.savedOps.push(messageArg);\n }\n\n\n // Whether or not the message is actually a runtime message.\n // It may be a legacy runtime message (ie already unpacked and ContainerMessageType)\n // or something different, like a system message.\n const runtimeMessage = messageArg.type === MessageType.Operation;\n\n // Do shallow copy of message, as the processing flow will modify it.\n const messageCopy = { ...messageArg };\n const message = this.remoteMessageProcessor.process(messageCopy);\n\n // Surround the actual processing of the operation with messages to the schedule manager indicating\n // the beginning and end. This allows it to emit appropriate events and/or pause the processing of new\n // messages once a batch has been fully processed.\n this.scheduleManager.beforeOpProcessing(message);\n\n try {\n let localOpMetadata: unknown;\n if (local && runtimeMessage && message.type !== ContainerMessageType.ChunkedOp) {\n localOpMetadata = this.pendingStateManager.processPendingLocalMessage(message);\n }\n\n // If there are no more pending messages after processing a local message,\n // the document is no longer dirty.\n if (!this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n\n const type = message.type as ContainerMessageType;\n switch (type) {\n case ContainerMessageType.Attach:\n this.dataStores.processAttachMessage(message, local);\n break;\n case ContainerMessageType.Alias:\n this.processAliasMessage(message, localOpMetadata, local);\n break;\n case ContainerMessageType.FluidDataStoreOp:\n this.dataStores.processFluidDataStoreOp(message, local, localOpMetadata);\n break;\n case ContainerMessageType.BlobAttach:\n this.blobManager.processBlobAttachOp(message, local);\n break;\n case ContainerMessageType.ChunkedOp:\n case ContainerMessageType.Rejoin:\n break;\n default:\n assert(!runtimeMessage, 0x3ce /* Runtime message of unknown type */);\n }\n\n // For back-compat, notify only about runtime messages for now.\n if (runtimeMessage) {\n this.emit(\"op\", message, runtimeMessage);\n }\n\n this.scheduleManager.afterOpProcessing(undefined, message);\n\n if (local) {\n // If we have processed a local op, this means that the container is\n // making progress and we can reset the counter for how many times\n // we have consecutively replayed the pending states\n this.resetReconnectCount();\n }\n } catch (e) {\n this.scheduleManager.afterOpProcessing(e, message);\n throw e;\n }\n }\n\n private processAliasMessage(\n message: ISequencedDocumentMessage,\n localOpMetadata: unknown,\n local: boolean,\n ) {\n this.dataStores.processAliasMessage(message, localOpMetadata, local);\n }\n\n /**\n * Emits the Signal event and update the perf signal data.\n * @param clientSignalSequenceNumber - is the client signal sequence number to be uploaded.\n */\n private sendSignalTelemetryEvent(clientSignalSequenceNumber: number) {\n const duration = Date.now() - this._perfSignalData.signalTimestamp;\n this.logger.sendPerformanceEvent({\n eventName: \"SignalLatency\",\n duration,\n signalsLost: this._perfSignalData.signalsLost,\n });\n\n this._perfSignalData.signalsLost = 0;\n this._perfSignalData.signalTimestamp = 0;\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n const envelope = message.content as ISignalEnvelope;\n const transformed: IInboundSignalMessage = {\n clientId: message.clientId,\n content: envelope.contents.content,\n type: envelope.contents.type,\n };\n\n // Only collect signal telemetry for messages sent by the current client.\n if (message.clientId === this.clientId && this.connected) {\n // Check to see if the signal was lost.\n if (this._perfSignalData.trackingSignalSequenceNumber !== undefined &&\n envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber) {\n this._perfSignalData.signalsLost++;\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n this.logger.sendErrorEvent({\n eventName: \"SignalLost\",\n type: envelope.contents.type,\n signalsLost: this._perfSignalData.signalsLost,\n trackingSequenceNumber: this._perfSignalData.trackingSignalSequenceNumber,\n clientSignalSequenceNumber: envelope.clientSignalSequenceNumber,\n });\n } else if (envelope.clientSignalSequenceNumber === this._perfSignalData.trackingSignalSequenceNumber) {\n this.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n }\n }\n\n if (envelope.address === undefined) {\n // No address indicates a container signal message.\n this.emit(\"signal\", transformed, local);\n return;\n }\n\n this.dataStores.processSignal(envelope.address, transformed, local);\n }\n\n public async getRootDataStore(id: string, wait = true): Promise<IFluidRouter> {\n return this.getRootDataStoreChannel(id, wait);\n }\n\n private async getRootDataStoreChannel(id: string, wait = true): Promise<IFluidDataStoreChannel> {\n await this.dataStores.waitIfPendingAlias(id);\n const internalId = this.internalId(id);\n const context = await this.dataStores.getDataStore(internalId, { wait });\n assert(await context.isRoot(), 0x12b /* \"did not get root data store\" */);\n return context.realize();\n }\n\n /**\n * Flush the pending ops manually.\n * This method is expected to be called at the end of a batch.\n */\n private flush(): void {\n assert(this._orderSequentiallyCalls === 0,\n 0x24c /* \"Cannot call `flush()` from `orderSequentially`'s callback\" */);\n\n this.outbox.flush();\n assert(this.outbox.isEmpty, 0x3cf /* reentrancy */);\n }\n\n public orderSequentially<T>(callback: () => T): T {\n let checkpoint: IBatchCheckpoint | undefined;\n let result: T;\n if (this.mc.config.getBoolean(\"Fluid.ContainerRuntime.EnableRollback\")) {\n // Note: we are not touching this.pendingAttachBatch here, for two reasons:\n // 1. It would not help, as we flush attach ops as they become available.\n // 2. There is no way to undo process of data store creation.\n checkpoint = this.outbox.checkpoint().mainBatch;\n }\n try {\n this._orderSequentiallyCalls++;\n result = callback();\n } catch (error) {\n if (checkpoint) {\n // This will throw and close the container if rollback fails\n try {\n checkpoint.rollback((message: BatchMessage) =>\n this.rollback(\n message.deserializedContent.type,\n message.deserializedContent.contents,\n message.localOpMetadata));\n } catch (err) {\n const error2 = wrapError(err, (message) => {\n return DataProcessingError.create(\n `RollbackError: ${message}`,\n \"checkpointRollback\",\n undefined) as DataProcessingError;\n });\n this.closeFn(error2);\n throw error2;\n }\n } else {\n // pre-0.58 error message: orderSequentiallyCallbackException\n this.closeFn(new GenericError(\"orderSequentially callback exception\", error));\n }\n throw error; // throw the original error for the consumer of the runtime\n } finally {\n this._orderSequentiallyCalls--;\n }\n\n if (this.flushMode === FlushMode.Immediate && this._orderSequentiallyCalls === 0) {\n this.flush();\n }\n return result;\n }\n\n public async createDataStore(pkg: string | string[]): Promise<IDataStore> {\n const internalId = uuid();\n return channelToDataStore(\n await this._createDataStore(pkg, internalId),\n internalId,\n this,\n this.dataStores,\n this.mc.logger);\n }\n\n public createDetachedRootDataStore(\n pkg: Readonly<string[]>,\n rootDataStoreId: string): IFluidDataStoreContextDetached {\n if (rootDataStoreId.includes(\"/\")) {\n throw new UsageError(`Id cannot contain slashes: '${rootDataStoreId}'`);\n }\n return this.dataStores.createDetachedDataStoreCore(pkg, true, rootDataStoreId);\n }\n\n public createDetachedDataStore(pkg: Readonly<string[]>): IFluidDataStoreContextDetached {\n return this.dataStores.createDetachedDataStoreCore(pkg, false);\n }\n\n public async _createDataStoreWithProps(\n pkg: string | string[],\n props?: any,\n id = uuid(),\n ): Promise<IDataStore> {\n const fluidDataStore = await this.dataStores._createFluidDataStoreContext(\n Array.isArray(pkg) ? pkg : [pkg], id, props).realize();\n return channelToDataStore(fluidDataStore, id, this, this.dataStores, this.mc.logger);\n }\n\n private async _createDataStore(\n pkg: string | string[],\n id = uuid(),\n props?: any,\n ): Promise<IFluidDataStoreChannel> {\n return this.dataStores\n ._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, props)\n .realize();\n }\n\n private canSendOps() {\n return this.connected && !this.deltaManager.readOnlyInfo.readonly;\n }\n\n /**\n * Are we in the middle of batching ops together?\n */\n private currentlyBatching() {\n return this.flushMode === FlushMode.TurnBased || this._orderSequentiallyCalls !== 0;\n }\n\n public getQuorum(): IQuorumClients {\n return this.context.quorum;\n }\n\n public getAudience(): IAudience {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.context.audience!;\n }\n\n /**\n * Returns true of container is dirty, i.e. there are some pending local changes that\n * either were not sent out to delta stream or were not yet acknowledged.\n */\n public get isDirty(): boolean {\n return this.dirtyContainer;\n }\n\n private isContainerMessageDirtyable(type: ContainerMessageType, contents: any) {\n // For legacy purposes, exclude the old built-in AgentScheduler from dirty consideration as a special-case.\n // Ultimately we should have no special-cases from the ContainerRuntime's perspective.\n if (type === ContainerMessageType.Attach) {\n const attachMessage = contents as InboundAttachMessage;\n if (attachMessage.id === agentSchedulerId) {\n return false;\n }\n } else if (type === ContainerMessageType.FluidDataStoreOp) {\n const envelope = contents as IEnvelope;\n if (envelope.address === agentSchedulerId) {\n return false;\n }\n }\n return true;\n }\n\n private createNewSignalEnvelope(address: string | undefined, type: string, content: any): ISignalEnvelope {\n const newSequenceNumber = ++this._perfSignalData.signalSequenceNumber;\n const newEnvelope: ISignalEnvelope = {\n address,\n clientSignalSequenceNumber: newSequenceNumber,\n contents: { type, content },\n };\n\n // We should not track any signals in case we already have a tracking number.\n if (newSequenceNumber % this.defaultTelemetrySignalSampleCount === 1 &&\n this._perfSignalData.trackingSignalSequenceNumber === undefined) {\n this._perfSignalData.signalTimestamp = Date.now();\n this._perfSignalData.trackingSignalSequenceNumber = newSequenceNumber;\n }\n\n return newEnvelope;\n }\n\n /**\n * Submits the signal to be sent to other clients.\n * @param type - Type of the signal.\n * @param content - Content of the signal.\n */\n public submitSignal(type: string, content: any) {\n this.verifyNotClosed();\n const envelope = this.createNewSignalEnvelope(undefined /* address */, type, content);\n return this.context.submitSignalFn(envelope);\n }\n\n public submitDataStoreSignal(address: string, type: string, content: any) {\n const envelope = this.createNewSignalEnvelope(address, type, content);\n return this.context.submitSignalFn(envelope);\n }\n\n public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n if (attachState === AttachState.Attaching) {\n assert(this.attachState === AttachState.Attaching,\n 0x12d /* \"Container Context should already be in attaching state\" */);\n } else {\n assert(this.attachState === AttachState.Attached,\n 0x12e /* \"Container Context should already be in attached state\" */);\n this.emit(\"attached\");\n }\n\n if (attachState === AttachState.Attached && !this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n this.dataStores.setAttachState(attachState);\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n * @param telemetryContext - summary data passed through the layers for telemetry purposes\n */\n public createSummary(blobRedirectTable?: Map<string, string>, telemetryContext?: ITelemetryContext): ISummaryTree {\n if (blobRedirectTable) {\n this.blobManager.setRedirectTable(blobRedirectTable);\n }\n\n const summarizeResult = this.dataStores.createSummary(telemetryContext);\n // Wrap data store summaries in .channels subtree.\n wrapSummaryInChannelsTree(summarizeResult);\n\n this.addContainerStateToSummary(\n summarizeResult,\n true /* fullTree */,\n false /* trackState */,\n telemetryContext,\n );\n return summarizeResult.summary;\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.context.getAbsoluteUrl === undefined) {\n throw new Error(\"Driver does not implement getAbsoluteUrl\");\n }\n if (this.attachState !== AttachState.Attached) {\n return undefined;\n }\n return this.context.getAbsoluteUrl(relativeUrl);\n }\n\n private async summarizeInternal(\n fullTree: boolean,\n trackState: boolean,\n telemetryContext?: ITelemetryContext,\n ): Promise<ISummarizeInternalResult> {\n const summarizeResult = await this.dataStores.summarize(fullTree, trackState, telemetryContext);\n\n // Wrap data store summaries in .channels subtree.\n wrapSummaryInChannelsTree(summarizeResult);\n const pathPartsForChildren = [channelsTreeName];\n\n this.addContainerStateToSummary(summarizeResult, fullTree, trackState, telemetryContext);\n return {\n ...summarizeResult,\n id: \"\",\n pathPartsForChildren,\n };\n }\n\n /**\n * Returns a summary of the runtime at the current sequence number.\n */\n public async summarize(options: {\n /** True to generate the full tree with no handle reuse optimizations; defaults to false */\n fullTree?: boolean;\n /** True to track the state for this summary in the SummarizerNodes; defaults to true */\n trackState?: boolean;\n /** Logger to use for correlated summary events */\n summaryLogger?: ITelemetryLogger;\n /** True to run garbage collection before summarizing; defaults to true */\n runGC?: boolean;\n /** True to generate full GC data */\n fullGC?: boolean;\n /** True to run GC sweep phase after the mark phase */\n runSweep?: boolean;\n }): Promise<IRootSummaryTreeWithStats> {\n this.verifyNotClosed();\n\n const {\n fullTree = false,\n trackState = true,\n summaryLogger = this.mc.logger,\n runGC = this.garbageCollector.shouldRunGC,\n runSweep,\n fullGC,\n } = options;\n\n let gcStats: IGCStats | undefined;\n if (runGC) {\n gcStats = await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });\n }\n\n const telemetryContext = new TelemetryContext();\n const { stats, summary } = await this.summarizerNode.summarize(fullTree, trackState, telemetryContext);\n\n this.logger.sendTelemetryEvent({ eventName: \"SummarizeTelemetry\", details: telemetryContext.serialize() });\n\n assert(summary.type === SummaryType.Tree,\n 0x12f /* \"Container Runtime's summarize should always return a tree\" */);\n\n return { stats, summary, gcStats };\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::updateStateBeforeGC.\n * Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify\n * the garbage collector of references detected since the last GC run. Most references are notified immediately\n * but there can be some for which async operation is required (such as detecting new root data stores).\n */\n public async updateStateBeforeGC() {\n return this.dataStores.updateStateBeforeGC();\n }\n\n private async getGCDataInternal(fullGC?: boolean): Promise<IGarbageCollectionData> {\n return this.dataStores.getGCData(fullGC);\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::getGCData.\n * Generates and returns the GC data for this container.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC?: boolean): Promise<IGarbageCollectionData> {\n const builder = new GCDataBuilder();\n const dsGCData = await this.summarizerNode.getGCData(fullGC);\n builder.addNodes(dsGCData.gcNodes);\n\n const blobsGCData = this.blobManager.getGCData(fullGC);\n builder.addNodes(blobsGCData.gcNodes);\n return builder.getGCData();\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::updateUsedRoutes.\n * After GC has run, called to notify this container's nodes of routes that are used in it.\n * @param usedRoutes - The routes that are used in all nodes in this Container.\n */\n public updateUsedRoutes(usedRoutes: string[]) {\n // Update our summarizer node's used routes. Updating used routes in summarizer node before\n // summarizing is required and asserted by the the summarizer node. We are the root and are\n // always referenced, so the used routes is only self-route (empty string).\n this.summarizerNode.updateUsedRoutes([\"\"]);\n\n const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(usedRoutes);\n this.dataStores.updateUsedRoutes(dataStoreRoutes);\n }\n\n /**\n * This is called to update objects whose routes are unused.\n * @param unusedRoutes - Data store and attachment blob routes that are unused in this Container.\n */\n public updateUnusedRoutes(unusedRoutes: string[]) {\n const { blobManagerRoutes, dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(unusedRoutes);\n this.blobManager.updateUnusedRoutes(blobManagerRoutes);\n this.dataStores.updateUnusedRoutes(dataStoreRoutes);\n }\n\n /**\n * This is called to update objects that are tombstones.\n * @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.\n */\n public updateTombstonedRoutes(tombstonedRoutes: string[]) {\n const { blobManagerRoutes, dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);\n this.blobManager.updateTombstonedRoutes(blobManagerRoutes);\n this.dataStores.updateTombstonedRoutes(dataStoreRoutes);\n }\n\n /**\n * Returns a server generated referenced timestamp to be used to track unreferenced nodes by GC.\n */\n public getCurrentReferenceTimestampMs(): number | undefined {\n // Use the timestamp of the last message seen by this client as that is server generated. If no messages have\n // been processed, use the timestamp of the message from the last summary.\n return this.deltaManager.lastMessage?.timestamp ?? this.messageAtLastSummary?.timestamp;\n }\n\n /**\n * Returns the type of the GC node. Currently, there are nodes that belong to the root (\"/\"), data stores or\n * blob manager.\n */\n public getNodeType(nodePath: string): GCNodeType {\n if (this.isBlobPath(nodePath)) {\n return GCNodeType.Blob;\n }\n return this.dataStores.getGCNodeType(nodePath) ?? GCNodeType.Other;\n }\n\n /**\n * Called by GC to retrieve the package path of the node with the given path. The node should belong to a\n * data store or an attachment blob.\n */\n public async getGCNodePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n switch (this.getNodeType(nodePath)) {\n case GCNodeType.Blob:\n return [BlobManager.basePath];\n case GCNodeType.DataStore:\n case GCNodeType.SubDataStore:\n return this.dataStores.getDataStorePackagePath(nodePath);\n default:\n assert(false, 0x2de /* \"Package path requested for unsupported node type.\" */);\n }\n }\n\n /**\n * Returns whether a given path is for attachment blobs that are in the format - \"/BlobManager.basePath/...\".\n */\n private isBlobPath(path: string): boolean {\n const pathParts = path.split(\"/\");\n if (pathParts.length < 2 || pathParts[1] !== BlobManager.basePath) {\n return false;\n }\n return true;\n }\n\n /**\n * From a given list of routes, separate and return routes that belong to blob manager and data stores.\n * @param routes - A list of routes that can belong to data stores or blob manager.\n * @returns - Two route lists - One that contains routes for blob manager and another one that contains routes\n * for data stores.\n */\n private getDataStoreAndBlobManagerRoutes(routes: string[]) {\n const blobManagerRoutes: string[] = [];\n const dataStoreRoutes: string[] = [];\n for (const route of routes) {\n if (this.isBlobPath(route)) {\n blobManagerRoutes.push(route);\n } else {\n dataStoreRoutes.push(route);\n }\n }\n return { blobManagerRoutes, dataStoreRoutes };\n }\n\n /**\n * Runs garbage collection and updates the reference / used state of the nodes in the container.\n * @returns the statistics of the garbage collection run; undefined if GC did not run.\n */\n public async collectGarbage(\n options: {\n /** Logger to use for logging GC events */\n logger?: ITelemetryLogger;\n /** True to run GC sweep phase after the mark phase */\n runSweep?: boolean;\n /** True to generate full GC data */\n fullGC?: boolean;\n },\n ): Promise<IGCStats | undefined> {\n return this.garbageCollector.collectGarbage(options);\n }\n\n /**\n * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n * all references added in the system.\n * @param srcHandle - The handle of the node that added the reference.\n * @param outboundHandle - The handle of the outbound node that is referenced.\n */\n public addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n this.garbageCollector.addedOutboundReference(srcHandle.absolutePath, outboundHandle.absolutePath);\n }\n\n /**\n * Generates the summary tree, uploads it to storage, and then submits the summarize op.\n * This is intended to be called by the summarizer, since it is the implementation of\n * ISummarizerInternalsProvider.submitSummary.\n * It takes care of state management at the container level, including pausing inbound\n * op processing, updating SummarizerNode state tracking, and garbage collection.\n * @param options - options controlling how the summary is generated or submitted\n */\n public async submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult> {\n const { fullTree, refreshLatestAck, summaryLogger } = options;\n // The summary number for this summary. This will be updated during the summary process, so get it now and\n // use it for all events logged during this summary.\n const summaryNumber = this.nextSummaryNumber;\n const summaryNumberLogger = ChildLogger.create(\n summaryLogger,\n undefined,\n {\n all: { summaryNumber },\n },\n );\n\n assert(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);\n\n let latestSnapshotVersionId: string | undefined;\n if (refreshLatestAck) {\n const latestSnapshotInfo = await this.refreshLatestSummaryAckFromServer(\n ChildLogger.create(summaryNumberLogger, undefined, { all: { safeSummary: true } }));\n const latestSnapshotRefSeq = latestSnapshotInfo.latestSnapshotRefSeq;\n latestSnapshotVersionId = latestSnapshotInfo.latestSnapshotVersionId;\n\n // We might need to catch up to the latest summary's reference sequence number before pausing.\n await this.waitForDeltaManagerToCatchup(latestSnapshotRefSeq,\n summaryNumberLogger);\n }\n\n try {\n await this.deltaManager.inbound.pause();\n\n const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;\n const minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;\n const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;\n const lastAck = this.summaryCollection.latestAck;\n\n this.summarizerNode.startSummary(summaryRefSeqNum, summaryNumberLogger);\n\n // Helper function to check whether we should still continue between each async step.\n const checkContinue = (): { continue: true; } | { continue: false; error: string; } => {\n // Do not check for loss of connectivity directly! Instead leave it up to\n // RunWhileConnectedCoordinator to control policy in a single place.\n // This will allow easier change of design if we chose to. For example, we may chose to allow\n // summarizer to reconnect in the future.\n // Also checking for cancellation is a must as summary process may be abandoned for other reasons,\n // like loss of connectivity for main (interactive) client.\n if (options.cancellationToken.cancelled) {\n return { continue: false, error: \"disconnected\" };\n }\n // That said, we rely on submitSystemMessage() that today only works in connected state.\n // So if we fail here, it either means that RunWhileConnectedCoordinator does not work correctly,\n // OR that design changed and we need to remove this check and fix submitSystemMessage.\n assert(this.connected, 0x258 /* \"connected\" */);\n\n // Ensure that lastSequenceNumber has not changed after pausing.\n // We need the summary op's reference sequence number to match our summary sequence number,\n // otherwise we'll get the wrong sequence number stamped on the summary's .protocol attributes.\n if (this.deltaManager.lastSequenceNumber !== summaryRefSeqNum) {\n return {\n continue: false,\n error: `lastSequenceNumber changed before uploading to storage. ${this.deltaManager.lastSequenceNumber} !== ${summaryRefSeqNum}`,\n };\n }\n assert(summaryRefSeqNum === this.deltaManager.lastMessage?.sequenceNumber,\n 0x395 /* it's one and the same thing */);\n\n if (lastAck !== this.summaryCollection.latestAck) {\n return {\n continue: false,\n error: `Last summary changed while summarizing. ${this.summaryCollection.latestAck} !== ${lastAck}`,\n };\n }\n return { continue: true };\n };\n\n let continueResult = checkContinue();\n if (!continueResult.continue) {\n return {\n stage: \"base\",\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n error: continueResult.error,\n };\n }\n\n const trace = Trace.start();\n let summarizeResult: IRootSummaryTreeWithStats;\n // If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced\n // state of all the nodes.\n const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;\n try {\n summarizeResult = await this.summarize({\n fullTree: fullTree ?? forcedFullTree,\n trackState: true,\n summaryLogger: summaryNumberLogger,\n runGC: this.garbageCollector.shouldRunGC,\n });\n } catch (error) {\n return {\n stage: \"base\",\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n error,\n };\n }\n const { summary: summaryTree, stats: partialStats } = summarizeResult;\n\n // Now that we have generated the summary, update the message at last summary to the last message processed.\n this.messageAtLastSummary = this.deltaManager.lastMessage;\n\n // Counting dataStores and handles\n // Because handles are unchanged dataStores in the current logic,\n // summarized dataStore count is total dataStore count minus handle count\n const dataStoreTree = summaryTree.tree[channelsTreeName];\n\n assert(dataStoreTree.type === SummaryType.Tree, 0x1fc /* \"summary is not a tree\" */);\n const handleCount = Object.values(dataStoreTree.tree).filter(\n (value) => value.type === SummaryType.Handle).length;\n const gcSummaryTreeStats = summaryTree.tree[gcTreeKey]\n ? calculateStats(summaryTree.tree[gcTreeKey])\n : undefined;\n\n const summaryStats: IGeneratedSummaryStats = {\n dataStoreCount: this.dataStores.size,\n summarizedDataStoreCount: this.dataStores.size - handleCount,\n gcStateUpdatedDataStoreCount: summarizeResult.gcStats?.updatedDataStoreCount,\n gcBlobNodeCount: gcSummaryTreeStats?.blobNodeCount,\n gcTotalBlobsSize: gcSummaryTreeStats?.totalBlobSize,\n summaryNumber,\n ...partialStats,\n };\n const generateSummaryData = {\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n summaryTree,\n summaryStats,\n generateDuration: trace.trace().duration,\n forcedFullTree,\n } as const;\n\n continueResult = checkContinue();\n if (!continueResult.continue) {\n return { stage: \"generate\", ...generateSummaryData, error: continueResult.error };\n }\n\n // It may happen that the lastAck it not correct due to missing summaryAck in case of single commit\n // summary. So if the previous summarizer closes just after submitting the summary and before\n // submitting the summaryOp then we can't rely on summaryAck. So in case we have\n // latestSnapshotVersionId from storage and it does not match with the lastAck ackHandle, then use\n // the one fetched from storage as parent as that is the latest.\n let summaryContext: ISummaryContext;\n if (lastAck?.summaryAck.contents.handle !== latestSnapshotVersionId\n && latestSnapshotVersionId !== undefined) {\n summaryContext = {\n proposalHandle: undefined,\n ackHandle: latestSnapshotVersionId,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n } else if (lastAck === undefined) {\n summaryContext = {\n proposalHandle: undefined,\n ackHandle: this.context.getLoadedFromVersion()?.id,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n } else {\n summaryContext = {\n proposalHandle: lastAck.summaryOp.contents.handle,\n ackHandle: lastAck.summaryAck.contents.handle,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n }\n\n let handle: string;\n try {\n handle = await this.storage.uploadSummaryWithContext(summarizeResult.summary, summaryContext);\n } catch (error) {\n return { stage: \"generate\", ...generateSummaryData, error };\n }\n\n const parent = summaryContext.ackHandle;\n const summaryMessage: ISummaryContent = {\n handle,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n head: parent!,\n message,\n parents: parent ? [parent] : [],\n };\n const uploadData = {\n ...generateSummaryData,\n handle,\n uploadDuration: trace.trace().duration,\n } as const;\n\n continueResult = checkContinue();\n if (!continueResult.continue) {\n return { stage: \"upload\", ...uploadData, error: continueResult.error };\n }\n\n let clientSequenceNumber: number;\n try {\n clientSequenceNumber = this.submitSummaryMessage(summaryMessage);\n } catch (error) {\n return { stage: \"upload\", ...uploadData, error };\n }\n\n const submitData = {\n stage: \"submit\",\n ...uploadData,\n clientSequenceNumber,\n submitOpDuration: trace.trace().duration,\n } as const;\n\n this.summarizerNode.completeSummary(handle);\n return submitData;\n } finally {\n // Cleanup wip summary in case of failure\n this.summarizerNode.clearSummary();\n // Restart the delta manager\n this.deltaManager.inbound.resume();\n }\n }\n\n private hasPendingMessages() {\n return this.pendingStateManager.hasPendingMessages() || !this.outbox.isEmpty;\n }\n\n private updateDocumentDirtyState(dirty: boolean) {\n if (this.attachState !== AttachState.Attached) {\n assert(dirty, 0x3d2 /* Non-attached container is dirty */);\n } else {\n // Other way is not true = see this.isContainerMessageDirtyable()\n assert(!dirty || this.hasPendingMessages(),\n 0x3d3 /* if doc is dirty, there has to be pending ops */);\n }\n\n if (this.dirtyContainer === dirty) {\n return;\n }\n\n this.dirtyContainer = dirty;\n if (this.emitDirtyDocumentEvent) {\n this.emit(dirty ? \"dirty\" : \"saved\");\n this.context.updateDirtyContainerState(dirty);\n }\n }\n\n public submitDataStoreOp(\n id: string,\n contents: any,\n localOpMetadata: unknown = undefined): void {\n const envelope: IEnvelope = {\n address: id,\n contents,\n };\n this.submit(ContainerMessageType.FluidDataStoreOp, envelope, localOpMetadata);\n }\n\n public submitDataStoreAliasOp(contents: any, localOpMetadata: unknown): void {\n const aliasMessage = contents as IDataStoreAliasMessage;\n if (!isDataStoreAliasMessage(aliasMessage)) {\n throw new UsageError(\"malformedDataStoreAliasMessage\");\n }\n\n this.submit(ContainerMessageType.Alias, contents, localOpMetadata);\n }\n\n public async uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {\n this.verifyNotClosed();\n return this.blobManager.createBlob(blob);\n }\n\n private submit(\n type: ContainerMessageType,\n contents: any,\n localOpMetadata: unknown = undefined,\n metadata: Record<string, unknown> | undefined = undefined,\n ): void {\n this.verifyNotClosed();\n\n // There should be no ops in detached container state!\n assert(this.attachState !== AttachState.Detached, 0x132 /* \"sending ops in detached container\" */);\n\n const deserializedContent: ContainerRuntimeMessage = { type, contents };\n const serializedContent = JSON.stringify(deserializedContent);\n\n if (this.deltaManager.readOnlyInfo.readonly) {\n this.logger.sendTelemetryEvent({ eventName: \"SubmitOpInReadonly\", connected: this.connected });\n }\n\n const message: BatchMessage = {\n contents: serializedContent,\n deserializedContent,\n metadata,\n localOpMetadata,\n referenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n };\n\n try {\n // If this is attach message for new data store, and we are in a batch, send this op out of order\n // Is it safe:\n // Yes, this should be safe reordering. Newly created data stores are not visible through API surface.\n // They become visible only when aliased, or handle to some sub-element of newly created datastore\n // is stored in some DDS, i.e. only after some other op.\n // Why:\n // Attach ops are large, and expensive to process. Plus there are scenarios where a lot of new data\n // stores are created, causing issues like relay service throttling (too many ops) and catastrophic\n // failure (batch is too large). Pushing them earlier and outside of main batch should alleviate\n // these issues.\n // Cons:\n // 1. With large batches, relay service may throttle clients. Clients may disconnect while throttled.\n // This change creates new possibility of a lot of newly created data stores never being referenced\n // because client died before it had a change to submit the rest of the ops. This will create more\n // garbage that needs to be collected leveraging GC (Garbage Collection) feature.\n // 2. Sending ops out of order means they are excluded from rollback functionality. This is not an issue\n // today as rollback can't undo creation of data store. To some extent not sending them is a bigger\n // issue than sending.\n // Please note that this does not change file format, so it can be disabled in the future if this\n // optimization no longer makes sense (for example, batch compression may make it less appealing).\n if (this.currentlyBatching() && type === ContainerMessageType.Attach &&\n this.mc.config.getBoolean(\"Fluid.ContainerRuntime.disableAttachOpReorder\") !== true) {\n this.outbox.submitAttach(message);\n } else {\n this.outbox.submit(message);\n }\n\n if (!this.currentlyBatching()) {\n this.flush();\n } else if (!this.flushMicroTaskExists) {\n this.flushMicroTaskExists = true;\n // Queue a microtask to detect the end of the turn and force a flush.\n Promise.resolve().then(() => {\n this.flushMicroTaskExists = false;\n this.flush();\n }).catch((error) => { this.closeFn(error as GenericError) });\n }\n } catch (error) {\n this.closeFn(error as GenericError);\n throw error;\n }\n\n if (this.isContainerMessageDirtyable(type, contents)) {\n this.updateDocumentDirtyState(true);\n }\n }\n\n private submitSummaryMessage(contents: ISummaryContent) {\n this.verifyNotClosed();\n assert(this.connected, 0x133 /* \"Container disconnected when trying to submit system message\" */);\n\n // System message should not be sent in the middle of the batch.\n assert(this.outbox.isEmpty, 0x3d4 /* System op in the middle of a batch */);\n\n // back-compat: ADO #1385: Make this call unconditional in the future\n return this.context.submitSummaryFn !== undefined\n ? this.context.submitSummaryFn(contents)\n : this.context.submitFn(\n MessageType.Summarize,\n contents,\n false);\n }\n\n /**\n * Throw an error if the runtime is closed. Methods that are expected to potentially\n * be called after dispose due to asynchrony should not call this.\n */\n private verifyNotClosed() {\n if (this._disposed) {\n throw new Error(\"Runtime is closed\");\n }\n }\n\n /**\n * Finds the right store and asks it to resubmit the message. This typically happens when we\n * reconnect and there are pending messages.\n * @param content - The content of the original message.\n * @param localOpMetadata - The local metadata associated with the original message.\n */\n private reSubmit(\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n // For Operations, call resubmitDataStoreOp which will find the right store\n // and trigger resubmission on it.\n this.dataStores.resubmitDataStoreOp(content, localOpMetadata);\n break;\n case ContainerMessageType.Attach:\n case ContainerMessageType.Alias:\n this.submit(type, content, localOpMetadata);\n break;\n case ContainerMessageType.ChunkedOp:\n throw new Error(`chunkedOp not expected here`);\n case ContainerMessageType.BlobAttach:\n this.blobManager.reSubmit(opMetadata);\n break;\n case ContainerMessageType.Rejoin:\n this.submit(type, content);\n break;\n default:\n unreachableCase(type, `Unknown ContainerMessageType: ${type}`);\n }\n }\n\n private rollback(\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n ) {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n // For operations, call rollbackDataStoreOp which will find the right store\n // and trigger rollback on it.\n this.dataStores.rollbackDataStoreOp(content, localOpMetadata);\n break;\n default:\n throw new Error(`Can't rollback ${type}`);\n }\n }\n\n private async waitForDeltaManagerToCatchup(\n latestSnapshotRefSeq: number,\n summaryLogger: ITelemetryLogger,\n ): Promise<void> {\n if (latestSnapshotRefSeq > this.deltaManager.lastSequenceNumber) {\n // We need to catch up to the latest summary's reference sequence number before proceeding.\n await PerformanceEvent.timedExecAsync(\n summaryLogger,\n {\n eventName: \"WaitingForSeq\",\n lastSequenceNumber: this.deltaManager.lastSequenceNumber,\n targetSequenceNumber: latestSnapshotRefSeq,\n lastKnownSeqNumber: this.deltaManager.lastKnownSeqNumber,\n },\n async () => waitForSeq(this.deltaManager, latestSnapshotRefSeq),\n { start: true, end: true, cancel: \"error\" }, // definitely want start event\n );\n }\n }\n\n /** Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck */\n public async refreshLatestSummaryAck(options: IRefreshSummaryAckOptions) {\n const { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;\n const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n // The call to fetch the snapshot is very expensive and not always needed.\n // It should only be done by the summarizerNode, if required.\n // When fetching from storage we will always get the latest version and do not use the ackHandle.\n const snapshotTreeFetcher = async () => {\n const fetchResult = await this.fetchLatestSnapshotFromStorage(\n summaryLogger,\n {\n eventName: \"RefreshLatestSummaryGetSnapshot\",\n ackHandle,\n summaryRefSeq,\n fetchLatest: true,\n },\n );\n\n const latestSnapshotRefSeq = await seqFromTree(fetchResult.snapshotTree, readAndParseBlob);\n /**\n * If the fetched snapshot is older than the one for which the ack was received, close the container.\n * This should never happen because an ack should be sent after the latest summary is updated in the server.\n * However, there are couple of scenarios where it's possible:\n * 1. A file was modified externally resulting in modifying the snapshot's sequence number. This can lead to\n * the document being unusable and we should not proceed.\n * 2. The server DB failed after the ack was sent which may delete the corresponding snapshot. Ideally, in\n * such cases, the file will be rolled back along with the ack and we will eventually reach a consistent\n * state.\n */\n if (latestSnapshotRefSeq < summaryRefSeq) {\n const error = DataProcessingError.create(\n \"Fetched snapshot is older than the received ack\",\n \"RefreshLatestSummaryAck\",\n undefined /* sequencedMessage */,\n {\n ackHandle,\n summaryRefSeq,\n latestSnapshotRefSeq,\n },\n );\n this.closeFn(error);\n throw error;\n }\n\n summaryLogger.sendTelemetryEvent(\n {\n eventName: \"LatestSummaryRetrieved\",\n ackHandle,\n lastSequenceNumber: latestSnapshotRefSeq,\n targetSequenceNumber: summaryRefSeq,\n });\n\n // In case we had to retrieve the latest snapshot and it is different than summaryRefSeq,\n // wait for the delta manager to catch up before refreshing the latest Summary.\n await this.waitForDeltaManagerToCatchup(latestSnapshotRefSeq,\n summaryLogger);\n\n return fetchResult.snapshotTree;\n };\n\n const result = await this.summarizerNode.refreshLatestSummary(\n proposalHandle,\n summaryRefSeq,\n snapshotTreeFetcher,\n readAndParseBlob,\n summaryLogger,\n );\n\n // Notify the garbage collector so it can update its latest summary state.\n await this.garbageCollector.refreshLatestSummary(\n result,\n proposalHandle,\n summaryRefSeq,\n readAndParseBlob,\n );\n }\n\n /**\n * Fetches the latest snapshot from storage and uses it to refresh SummarizerNode's\n * internal state as it should be considered the latest summary ack.\n * @param summaryLogger - logger to use when fetching snapshot from storage\n * @returns downloaded snapshot's reference sequence number\n */\n private async refreshLatestSummaryAckFromServer(\n summaryLogger: ITelemetryLogger,\n ): Promise<{ latestSnapshotRefSeq: number; latestSnapshotVersionId: string | undefined; }> {\n const { snapshotTree, versionId } = await this.fetchLatestSnapshotFromStorage(\n summaryLogger,\n {\n eventName: \"RefreshLatestSummaryGetSnapshot\",\n fetchLatest: true,\n },\n );\n\n const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n const latestSnapshotRefSeq = await seqFromTree(snapshotTree, readAndParseBlob);\n\n const result = await this.summarizerNode.refreshLatestSummary(\n undefined,\n latestSnapshotRefSeq,\n async () => snapshotTree,\n readAndParseBlob,\n summaryLogger,\n );\n\n // Notify the garbage collector so it can update its latest summary state.\n await this.garbageCollector.refreshLatestSummary(\n result,\n undefined,\n latestSnapshotRefSeq,\n readAndParseBlob,\n )\n\n return { latestSnapshotRefSeq, latestSnapshotVersionId: versionId };\n }\n\n private async fetchLatestSnapshotFromStorage(\n logger: ITelemetryLogger,\n event: ITelemetryGenericEvent,\n ): Promise<{ snapshotTree: ISnapshotTree; versionId: string; }> {\n return PerformanceEvent.timedExecAsync(\n logger, event, async (perfEvent: {\n end: (arg0: {\n getVersionDuration?: number | undefined;\n getSnapshotDuration?: number | undefined;\n }) => void;\n }) => {\n const stats: { getVersionDuration?: number; getSnapshotDuration?: number; } = {};\n const trace = Trace.start();\n\n const versions = await this.storage.getVersions(\n null, 1, \"refreshLatestSummaryAckFromServer\", FetchSource.noCache);\n assert(!!versions && !!versions[0], 0x137 /* \"Failed to get version from storage\" */);\n stats.getVersionDuration = trace.trace().duration;\n\n const maybeSnapshot = await this.storage.getSnapshotTree(versions[0]);\n assert(!!maybeSnapshot, 0x138 /* \"Failed to get snapshot from storage\" */);\n stats.getSnapshotDuration = trace.trace().duration;\n\n perfEvent.end(stats);\n return { snapshotTree: maybeSnapshot, versionId: versions[0].id };\n });\n }\n\n public notifyAttaching(snapshot: ISnapshotTreeWithBlobContents) {\n if (this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) {\n this.baseSnapshotBlobs = SerializedSnapshotStorage.serializeTreeWithBlobContents(snapshot);\n }\n }\n\n private async initializeBaseSnapshotBlobs(): Promise<void> {\n if (!(this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) ||\n this.attachState !== AttachState.Attached || this.context.pendingLocalState) {\n return;\n }\n assert(!!this.context.baseSnapshot, 0x2e5 /* \"Must have a base snapshot\" */);\n this.baseSnapshotBlobs = await SerializedSnapshotStorage.serializeTree(this.context.baseSnapshot, this.storage);\n }\n\n public getPendingLocalState(): unknown {\n if (!(this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad)) {\n throw new UsageError(\"can't get state when offline load disabled\");\n }\n\n // Flush pending batch.\n // getPendingLocalState() is only exposed through Container.closeAndGetPendingLocalState(), so it's safe\n // to close current batch.\n this.flush();\n\n if (this._orderSequentiallyCalls !== 0) {\n throw new UsageError(\"can't get state during orderSequentially\");\n }\n\n const previousPendingState = this.context.pendingLocalState as IPendingRuntimeState | undefined;\n if (previousPendingState) {\n return {\n pending: this.pendingStateManager.getLocalState(),\n pendingAttachmentBlobs: this.blobManager.getPendingBlobs(),\n snapshotBlobs: previousPendingState.snapshotBlobs,\n baseSnapshot: previousPendingState.baseSnapshot,\n savedOps: this.savedOps,\n };\n }\n assert(!!this.context.baseSnapshot, 0x2e6 /* \"Must have a base snapshot\" */);\n assert(!!this.baseSnapshotBlobs, 0x2e7 /* \"Must serialize base snapshot blobs before getting runtime state\" */);\n return {\n pending: this.pendingStateManager.getLocalState(),\n pendingAttachmentBlobs: this.blobManager.getPendingBlobs(),\n snapshotBlobs: this.baseSnapshotBlobs,\n baseSnapshot: this.context.baseSnapshot,\n savedOps: this.savedOps,\n };\n }\n\n public readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = (...args) => {\n if (this.clientDetails.type === summarizerClientType) {\n return this.summarizer.summarizeOnDemand(...args);\n } else if (this.summaryManager !== undefined) {\n return this.summaryManager.summarizeOnDemand(...args);\n } else {\n // If we're not the summarizer, and we don't have a summaryManager, we expect that\n // disableSummaries is turned on. We are throwing instead of returning a failure here,\n // because it is a misuse of the API rather than an expected failure.\n throw new UsageError(\n `Can't summarize, disableSummaries: ${this.summariesDisabled}`,\n );\n }\n };\n\n public readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = (...args) => {\n if (this.clientDetails.type === summarizerClientType) {\n return this.summarizer.enqueueSummarize(...args);\n } else if (this.summaryManager !== undefined) {\n return this.summaryManager.enqueueSummarize(...args);\n } else {\n // If we're not the summarizer, and we don't have a summaryManager, we expect that\n // generateSummaries is turned off. We are throwing instead of returning a failure here,\n // because it is a misuse of the API rather than an expected failure.\n throw new UsageError(\n `Can't summarize, disableSummaries: ${this.summariesDisabled}`,\n );\n }\n };\n\n /**\n * * Forms a function that will request a Summarizer.\n * @param loaderRouter - the loader acting as an IFluidRouter\n * */\n private formRequestSummarizerFn(loaderRouter: IFluidRouter) {\n return async () => {\n const request: IRequest = {\n headers: {\n [LoaderHeader.cache]: false,\n [LoaderHeader.clientDetails]: {\n capabilities: { interactive: false },\n type: summarizerClientType,\n },\n [DriverHeader.summarizingClient]: true,\n [LoaderHeader.reconnect]: false,\n },\n url: \"/_summarizer\",\n };\n\n const fluidObject = await requestFluidObject<FluidObject<ISummarizer>>(loaderRouter, request);\n const summarizer = fluidObject.ISummarizer;\n\n if (!summarizer) {\n throw new UsageError(\"Fluid object does not implement ISummarizer\");\n }\n\n return summarizer;\n };\n }\n\n private async processSavedOps(state: IPendingRuntimeState) {\n for (const op of state.savedOps) {\n this.process(op, false);\n await this.pendingStateManager.applyStashedOpsAt(op.sequenceNumber);\n }\n // we may not have seen every sequence number (because of system ops) so apply everything once we\n // don't have any more saved ops\n await this.pendingStateManager.applyStashedOpsAt();\n\n // If it's not the case, we should take it into account when calculating dirty state.\n assert(this.context.attachState === AttachState.Attached,\n 0x3d5 /* this function is called for attached containers only */);\n if (!this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n }\n\n private validateSummaryHeuristicConfiguration(configuration: ISummaryConfigurationHeuristics) {\n // eslint-disable-next-line no-restricted-syntax\n for (const prop in configuration) {\n if (typeof configuration[prop] === \"number\" && configuration[prop] < 0) {\n throw new UsageError(`Summary heuristic configuration property \"${prop}\" cannot be less than 0`);\n }\n }\n if (configuration.minIdleTime > configuration.maxIdleTime) {\n throw new UsageError(`\"minIdleTime\" [${configuration.minIdleTime}] cannot be greater than \"maxIdleTime\" [${configuration.maxIdleTime}]`);\n }\n }\n}\n\n/**\n * Wait for a specific sequence number. Promise should resolve when we reach that number,\n * or reject if closed.\n */\nconst waitForSeq = async (\n deltaManager: IDeltaManager<Pick<ISequencedDocumentMessage, \"sequenceNumber\">, unknown>,\n targetSeq: number,\n): Promise<void> => new Promise<void>((resolve, reject) => {\n // TODO: remove cast to any when actual event is determined\n deltaManager.on(\"closed\" as any, reject);\n deltaManager.on(\"disposed\" as any, reject);\n\n // If we already reached target sequence number, simply resolve the promise.\n if (deltaManager.lastSequenceNumber >= targetSeq) {\n resolve();\n } else {\n const handleOp = (message: Pick<ISequencedDocumentMessage, \"sequenceNumber\">) => {\n if (message.sequenceNumber >= targetSeq) {\n resolve();\n deltaManager.off(\"op\", handleOp);\n }\n };\n deltaManager.on(\"op\", handleOp);\n }\n});\n"]}
|
|
1
|
+
{"version":3,"file":"containerRuntime.js","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 { ITelemetryBaseLogger, ITelemetryGenericEvent, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n FluidObject,\n IFluidHandle,\n IFluidHandleContext,\n IFluidRouter,\n IRequest,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IFluidTokenProvider,\n IContainerContext,\n IDeltaManager,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n LoaderHeader,\n ISnapshotTreeWithBlobContents,\n} from \"@fluidframework/container-definitions\";\nimport {\n IContainerRuntime,\n IContainerRuntimeEvents,\n} from \"@fluidframework/container-runtime-definitions\";\nimport {\n assert,\n Trace,\n TypedEventEmitter,\n unreachableCase,\n} from \"@fluidframework/common-utils\";\nimport {\n ChildLogger,\n raiseConnectedEvent,\n PerformanceEvent,\n TaggedLoggerAdapter,\n MonitoringContext,\n loggerToMonitoringContext,\n wrapError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n DriverHeader,\n FetchSource,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n DataCorruptionError,\n DataProcessingError,\n GenericError,\n UsageError,\n} from \"@fluidframework/container-utils\";\nimport {\n IClientDetails,\n IDocumentMessage,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryContent,\n ISummaryTree,\n MessageType,\n SummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n FlushMode,\n gcTreeKey,\n InboundAttachMessage,\n IFluidDataStoreContextDetached,\n IFluidDataStoreRegistry,\n IFluidDataStoreChannel,\n IGarbageCollectionData,\n IGarbageCollectionDetailsBase,\n IEnvelope,\n IInboundSignalMessage,\n ISignalEnvelope,\n NamedFluidDataStoreRegistryEntries,\n ISummaryTreeWithStats,\n ISummarizeInternalResult,\n CreateChildSummarizerNodeParam,\n SummarizeInternalFn,\n channelsTreeName,\n IAttachMessage,\n IDataStore,\n ITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n addBlobToSummary,\n addSummarizeResultToSummary,\n addTreeToSummary,\n createRootSummarizerNodeWithGC,\n IRootSummarizerNodeWithGC,\n RequestParser,\n create404Response,\n exceptionToResponse,\n requestFluidObject,\n responseToException,\n seqFromTree,\n calculateStats,\n TelemetryContext,\n} from \"@fluidframework/runtime-utils\";\nimport { GCDataBuilder, trimLeadingAndTrailingSlashes } from \"@fluidframework/garbage-collector\";\nimport { v4 as uuid } from \"uuid\";\nimport { ContainerFluidHandleContext } from \"./containerHandleContext\";\nimport { FluidDataStoreRegistry } from \"./dataStoreRegistry\";\nimport { Summarizer } from \"./summarizer\";\nimport { SummaryManager } from \"./summaryManager\";\nimport {\n ReportOpPerfTelemetry,\n IPerfSignalReport,\n} from \"./connectionTelemetry\";\nimport {\n IPendingLocalState,\n PendingStateManager,\n} from \"./pendingStateManager\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from \"./blobManager\";\nimport { DataStores, getSummaryForDatastores } from \"./dataStores\";\nimport {\n aliasBlobName,\n blobsTreeName,\n chunksBlobName,\n electedSummarizerBlobName,\n extractSummaryMetadataMessage,\n IContainerRuntimeMetadata,\n ICreateContainerMetadata,\n ISummaryMetadataMessage,\n metadataBlobName,\n wrapSummaryInChannelsTree,\n} from \"./summaryFormat\";\nimport { SummaryCollection } from \"./summaryCollection\";\nimport { ISerializedElection, OrderedClientCollection, OrderedClientElection } from \"./orderedClientElection\";\nimport { SummarizerClientElection, summarizerClientType } from \"./summarizerClientElection\";\nimport {\n SubmitSummaryResult,\n IConnectableRuntime,\n IGeneratedSummaryStats,\n ISubmitSummaryOptions,\n ISummarizer,\n ISummarizerInternalsProvider,\n ISummarizerRuntime,\n IRefreshSummaryAckOptions,\n} from \"./summarizerTypes\";\nimport { formExponentialFn, Throttler } from \"./throttler\";\nimport { RunWhileConnectedCoordinator } from \"./runWhileConnectedCoordinator\";\nimport {\n GarbageCollector,\n GCNodeType,\n IGarbageCollectionRuntime,\n IGarbageCollector,\n IGCStats,\n} from \"./garbageCollection\";\nimport {\n channelToDataStore,\n IDataStoreAliasMessage,\n isDataStoreAliasMessage,\n} from \"./dataStore\";\nimport { BindBatchTracker } from \"./batchTracker\";\nimport { ISerializedBaseSnapshotBlobs, SerializedSnapshotStorage } from \"./serializedSnapshotStorage\";\nimport { ScheduleManager } from \"./scheduleManager\";\nimport {\n BatchMessage,\n IBatchCheckpoint,\n OpCompressor,\n OpDecompressor,\n Outbox,\n OpSplitter,\n RemoteMessageProcessor,\n} from \"./opLifecycle\";\n\nexport enum ContainerMessageType {\n // An op to be delivered to store\n FluidDataStoreOp = \"component\",\n\n // Creates a new store\n Attach = \"attach\",\n\n // Chunked operation.\n ChunkedOp = \"chunkedOp\",\n\n // Signifies that a blob has been attached and should not be garbage collected by storage\n BlobAttach = \"blobAttach\",\n\n // Ties our new clientId to our old one on reconnect\n Rejoin = \"rejoin\",\n\n // Sets the alias of a root data store\n Alias = \"alias\",\n}\n\nexport interface ContainerRuntimeMessage {\n contents: any;\n type: ContainerMessageType;\n}\n\nexport interface ISummaryBaseConfiguration {\n /**\n * Delay before first attempt to spawn summarizing container.\n */\n initialSummarizerDelayMs: number;\n\n /**\n * Defines the maximum allowed time to wait for a pending summary ack.\n * The maximum amount of time client will wait for a summarize is the minimum of\n * maxSummarizeAckWaitTime (currently 10 * 60 * 1000) and maxAckWaitTime.\n */\n maxAckWaitTime: number;\n /**\n * Defines the maximum number of Ops in between Summaries that can be\n * allowed before forcibly electing a new summarizer client.\n */\n maxOpsSinceLastSummary: number;\n}\n\nexport interface ISummaryConfigurationHeuristics extends ISummaryBaseConfiguration {\n state: \"enabled\";\n /**\n * Defines the maximum allowed time, since the last received Ack, before running the summary\n * with reason maxTime.\n * For example, say we receive ops one by one just before the idle time is triggered.\n * In this case, we still want to run a summary since it's been a while since the last summary.\n */\n maxTime: number;\n /**\n * Defines the maximum number of Ops, since the last received Ack, that can be allowed\n * before running the summary with reason maxOps.\n */\n maxOps: number;\n /**\n * Defines the minimum number of Ops, since the last received Ack, that can be allowed\n * before running the last summary.\n */\n minOpsForLastSummaryAttempt: number;\n /**\n * Defines the lower boundary for the allowed time in between summarizations.\n * Pairs with maxIdleTime to form a range.\n * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n * linearly depending on the number of ops we receive.\n */\n minIdleTime: number;\n /**\n * Defines the upper boundary for the allowed time in between summarizations.\n * Pairs with minIdleTime to form a range.\n * For example, if we only receive 1 op, we don't want to have the same idle time as say 100 ops.\n * Based on the boundaries we set in minIdleTime and maxIdleTime, the idle time will change\n * linearly depending on the number of ops we receive.\n */\n maxIdleTime: number;\n /**\n * Runtime op weight to use in heuristic summarizing.\n * This number is a multiplier on the number of runtime ops we process when running summarize heuristics.\n * For example: (multiplier) * (number of runtime ops) = weighted number of runtime ops\n */\n runtimeOpWeight: number;\n /**\n * Non-runtime op weight to use in heuristic summarizing\n * This number is a multiplier on the number of non-runtime ops we process when running summarize heuristics.\n * For example: (multiplier) * (number of non-runtime ops) = weighted number of non-runtime ops\n */\n nonRuntimeOpWeight: number;\n\n /**\n * Number of ops since last summary needed before a non-runtime op can trigger running summary heuristics.\n *\n * Note: Any runtime ops sent before the threshold is reached will trigger heuristics normally.\n * This threshold ONLY applies to non-runtime ops triggering summaries.\n *\n * For example: Say the threshold is 20. Sending 19 non-runtime ops will not trigger any heuristic checks.\n * Sending the 20th non-runtime op will trigger the heuristic checks for summarizing.\n */\n nonRuntimeHeuristicThreshold?: number;\n}\n\nexport interface ISummaryConfigurationDisableSummarizer {\n state: \"disabled\";\n}\n\nexport interface ISummaryConfigurationDisableHeuristics extends ISummaryBaseConfiguration {\n state: \"disableHeuristics\";\n}\n\nexport type ISummaryConfiguration =\n | ISummaryConfigurationDisableSummarizer\n | ISummaryConfigurationDisableHeuristics\n | ISummaryConfigurationHeuristics;\n\nexport const DefaultSummaryConfiguration: ISummaryConfiguration = {\n state: \"enabled\",\n\n minIdleTime: 0,\n\n maxIdleTime: 30 * 1000, // 30 secs.\n\n maxTime: 60 * 1000, // 1 min.\n\n maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.\n\n minOpsForLastSummaryAttempt: 10,\n\n maxAckWaitTime: 10 * 60 * 1000, // 10 mins.\n\n maxOpsSinceLastSummary: 7000,\n\n initialSummarizerDelayMs: 5 * 1000, // 5 secs.\n\n nonRuntimeOpWeight: 0.1,\n\n runtimeOpWeight: 1.0,\n\n nonRuntimeHeuristicThreshold: 20,\n};\n\nexport interface IGCRuntimeOptions {\n /**\n * Flag that if true, will enable running garbage collection (GC) for a new container.\n *\n * GC has mark phase and sweep phase. In mark phase, unreferenced objects are identified\n * and marked as such in the summary. This option enables the mark phase.\n * In sweep phase, unreferenced objects are eventually deleted from the container if they meet certain conditions.\n * Sweep phase can be enabled via the \"sweepAllowed\" option.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n gcAllowed?: boolean;\n\n /**\n * Flag that if true, enables GC's sweep phase for a new container.\n *\n * This will allow GC to eventually delete unreferenced objects from the container.\n * This flag should only be set to true if \"gcAllowed\" is true.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n sweepAllowed?: boolean;\n\n /**\n * Flag that if true, will disable garbage collection for the session.\n * Can be used to disable running GC on containers where it is allowed via the gcAllowed option.\n */\n disableGC?: boolean;\n\n /**\n * Flag that will bypass optimizations and generate GC data for all nodes irrespective of whether a node\n * changed or not.\n */\n runFullGC?: boolean;\n\n /**\n * Maximum session duration for a new container. If not present, a default value will be used.\n *\n * Note: This setting is persisted in the container's summary and cannot be changed.\n */\n sessionExpiryTimeoutMs?: number;\n\n /**\n * Allows additional GC options to be passed.\n */\n [key: string]: any;\n}\n\nexport interface ISummaryRuntimeOptions {\n\n /** Override summary configurations set by the server. */\n summaryConfigOverrides?: ISummaryConfiguration;\n\n /**\n * Delay before first attempt to spawn summarizing container.\n *\n * @deprecated Use {@link ISummaryRuntimeOptions.summaryConfigOverrides}'s\n * {@link ISummaryBaseConfiguration.initialSummarizerDelayMs} instead.\n */\n initialSummarizerDelayMs?: number;\n}\n\n/**\n * Options for op compression.\n * @experimental - Not ready for use\n */\nexport interface ICompressionRuntimeOptions {\n /**\n * The minimum size the batch's payload must exceed before the batch's contents will be compressed.\n */\n readonly minimumBatchSizeInBytes: number;\n\n /**\n * The compression algorithm that will be used to compress the op.\n */\n readonly compressionAlgorithm: CompressionAlgorithms;\n}\n\n/**\n * Options for container runtime.\n */\nexport interface IContainerRuntimeOptions {\n readonly summaryOptions?: ISummaryRuntimeOptions;\n readonly gcOptions?: IGCRuntimeOptions;\n /**\n * Affects the behavior while loading the runtime when the data verification check which\n * compares the DeltaManager sequence number (obtained from protocol in summary) to the\n * runtime sequence number (obtained from runtime metadata in summary) finds a mismatch.\n * 1. \"close\" (default) will close the container with an assertion.\n * 2. \"log\" will log an error event to telemetry, but still continue to load.\n * 3. \"bypass\" will skip the check entirely. This is not recommended.\n */\n readonly loadSequenceNumberVerification?: \"close\" | \"log\" | \"bypass\";\n /**\n * Sets the flush mode for the runtime. In Immediate flush mode the runtime will immediately\n * send all operations to the driver layer, while in TurnBased the operations will be buffered\n * and then sent them as a single batch at the end of the turn.\n * By default, flush mode is TurnBased.\n */\n readonly flushMode?: FlushMode;\n /**\n * Save enough runtime state to be able to serialize upon request and load to the same state in a new container.\n */\n readonly enableOfflineLoad?: boolean;\n /**\n * Enables the runtime to compress ops. Compression is disabled when undefined.\n * @experimental Not ready for use.\n */\n readonly compressionOptions?: ICompressionRuntimeOptions;\n /**\n * If specified, when in FlushMode.TurnBased, if the size of the ops between JS turns exceeds this value,\n * an error will be thrown and the container will close.\n *\n * If unspecified, the limit is 950 * 1024.\n *\n * 'Infinity' will disable any limit.\n *\n * @experimental This config should be driven by the connection with the service and will be moved in the future.\n */\n readonly maxBatchSizeInBytes?: number;\n /**\n * If the op payload needs to be chunked in order to work around the maximum size of the batch, this value represents\n * how large the individual chunks will be. This is only supported when compression is enabled.\n *\n * If unspecified, if a batch exceeds `maxBatchSizeInBytes` after compression, the container will close with an instance\n * of `GenericError` with the `BatchTooLarge` message.\n *\n * @experimental Not ready for use.\n */\n readonly chunkSizeInBytes?: number;\n /**\n * If enabled, the runtime will block all attempts to send an op inside the\n * {@link ContainerRuntime#ensureNoDataModelChanges} callback. The callback is used by\n * {@link @fluidframework/shared-object-base#SharedObjectCore} for event handlers so enabling this\n * will disallow modifying DDSes while handling DDS events.\n *\n * By default, the feature is disabled. If enabled from options, the `Fluid.ContainerRuntime.DisableOpReentryCheck`\n * can be used to disable it at runtime.\n */\n readonly enableOpReentryCheck?: boolean;\n}\n\n/**\n * The summary tree returned by the root node. It adds state relevant to the root of the tree.\n */\nexport interface IRootSummaryTreeWithStats extends ISummaryTreeWithStats {\n /** The garbage collection stats if GC ran, undefined otherwise. */\n gcStats?: IGCStats;\n}\n\n/**\n * Accepted header keys for requests coming to the runtime.\n */\nexport enum RuntimeHeaders {\n /** True to wait for a data store to be created and loaded before returning it. */\n wait = \"wait\",\n /**\n * True if the request is from an external app. Used for GC to handle scenarios where a data store\n * is deleted and requested via an external app.\n */\n externalRequest = \"externalRequest\",\n /** True if the request is coming from an IFluidHandle. */\n viaHandle = \"viaHandle\",\n}\n\n/** True if a tombstoned object should be returned without erroring */\nexport const AllowTombstoneRequestHeaderKey = \"allowTombstone\"; // Belongs in the enum above, but avoiding the breaking change\n\n/** Tombstone error responses will have this header set to true */\nexport const TombstoneResponseHeaderKey = \"isTombstoned\"\n\n/**\n * The full set of parsed header data that may be found on Runtime requests\n */\nexport interface RuntimeHeaderData {\n wait?: boolean;\n externalRequest?: boolean;\n viaHandle?: boolean;\n allowTombstone?: boolean;\n}\n\n/** Default values for Runtime Headers */\nexport const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {\n wait: true,\n externalRequest: false,\n viaHandle: false,\n allowTombstone: false,\n}\n\n/**\n * Available compression algorithms for op compression.\n */\nexport enum CompressionAlgorithms {\n lz4 = \"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 logger: ITelemetryBaseLogger;\n taggedLogger: 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 */\ninterface IPendingRuntimeState {\n /**\n * Pending ops from PendingStateManager\n */\n pending?: IPendingLocalState;\n /**\n * Pending blobs from BlobManager\n */\n pendingAttachmentBlobs?: IPendingBlobs;\n /**\n * A base snapshot at a sequence number prior to the first pending op\n */\n baseSnapshot: ISnapshotTree;\n /**\n * Serialized blobs from the base snapshot. Used to load offline since\n * storage is not available.\n */\n snapshotBlobs: ISerializedBaseSnapshotBlobs;\n /**\n * All runtime ops since base snapshot sequence number up to the latest op\n * seen when the container was closed. Used to apply stashed (saved pending)\n * ops at the same sequence number at which they were made.\n */\n savedOps: ISequencedDocumentMessage[];\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 = 950 * 1024;\n\n/**\n * @deprecated - use ContainerRuntimeMessage instead\n */\nexport enum RuntimeMessage {\n FluidDataStoreOp = \"component\",\n Attach = \"attach\",\n ChunkedOp = \"chunkedOp\",\n BlobAttach = \"blobAttach\",\n Rejoin = \"rejoin\",\n Alias = \"alias\",\n Operation = \"op\",\n}\n\n/**\n * @deprecated - please use version in driver-utils\n */\nexport function isRuntimeMessage(message: ISequencedDocumentMessage): boolean {\n return (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 */\nexport const agentSchedulerId = \"_scheduler\";\n\n// safely check navigator and get the hardware spec value\nexport function getDeviceSpec() {\n try {\n if (typeof navigator === \"object\" && navigator !== null) {\n return {\n deviceMemory: (navigator as any).deviceMemory,\n hardwareConcurrency: navigator.hardwareConcurrency,\n };\n }\n } catch {\n }\n return {};\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 */\nexport class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>\n implements\n IContainerRuntime,\n IGarbageCollectionRuntime,\n IRuntime,\n ISummarizerRuntime,\n ISummarizerInternalsProvider {\n public get IContainerRuntime() { return this; }\n public get IFluidRouter() { return this; }\n\n /**\n * @deprecated - use loadRuntime instead.\n * Load the stores from a snapshot and returns the runtime.\n * @param context - Context of the container.\n * @param registryEntries - Mapping to the stores.\n * @param requestHandler - Request handlers for the container runtime\n * @param runtimeOptions - Additional options to be passed to the runtime\n * @param existing - (optional) When loading from an existing snapshot. Precedes context.existing if provided\n * @param containerRuntimeCtor - (optional) Constructor to use to create the ContainerRuntime instance. This\n * allows mixin classes to leverage this method to define their own async initializer.\n */\n public static async load(\n context: IContainerContext,\n registryEntries: NamedFluidDataStoreRegistryEntries,\n requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>,\n runtimeOptions: IContainerRuntimeOptions = {},\n containerScope: FluidObject = context.scope,\n existing?: boolean,\n containerRuntimeCtor: typeof ContainerRuntime = ContainerRuntime\n ): Promise<ContainerRuntime> {\n let existingFlag = true;\n if (!existing) {\n existingFlag = false;\n }\n return this.loadRuntime({\n context,\n registryEntries,\n existing: existingFlag,\n requestHandler,\n runtimeOptions,\n containerScope,\n containerRuntimeCtor,\n });\n }\n\n /**\n * Load the stores from a snapshot and returns the runtime.\n * @param params - An object housing the runtime properties:\n * - context - Context of the container.\n * - registryEntries - Mapping to the stores.\n * - existing - When loading from an existing snapshot\n * - requestHandler - Request handlers for the container runtime\n * - runtimeOptions - Additional options to be passed to the runtime\n * - containerScope - runtime services provided with context\n * - containerRuntimeCtor - Constructor to use to create the ContainerRuntime instance.\n * This allows mixin classes to leverage this method to define their own async initializer.\n */\n public static async loadRuntime(\n params: {\n context: IContainerContext;\n registryEntries: NamedFluidDataStoreRegistryEntries;\n existing: boolean;\n requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>;\n runtimeOptions?: IContainerRuntimeOptions;\n containerScope?: FluidObject;\n containerRuntimeCtor?: typeof ContainerRuntime;\n },\n ): Promise<ContainerRuntime> {\n const {\n context,\n registryEntries,\n existing,\n requestHandler,\n runtimeOptions = {},\n containerScope = {},\n containerRuntimeCtor = ContainerRuntime\n } = params;\n\n // If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:\n // back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45\n const backCompatContext: IContainerContext | OldContainerContextWithLogger = context;\n const passLogger = backCompatContext.taggedLogger ??\n new TaggedLoggerAdapter((backCompatContext as OldContainerContextWithLogger).logger);\n const logger = ChildLogger.create(passLogger, undefined, {\n all: {\n runtimeVersion: pkgVersion,\n },\n });\n\n const {\n summaryOptions = {},\n gcOptions = {},\n loadSequenceNumberVerification = \"close\",\n flushMode = defaultFlushMode,\n enableOfflineLoad = false,\n compressionOptions = {\n minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,\n compressionAlgorithm: CompressionAlgorithms.lz4\n },\n maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,\n chunkSizeInBytes = Number.POSITIVE_INFINITY,\n enableOpReentryCheck = false,\n } = runtimeOptions;\n\n const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;\n const baseSnapshot: ISnapshotTree | undefined = pendingRuntimeState?.baseSnapshot ?? context.baseSnapshot;\n const storage = !pendingRuntimeState ?\n context.storage :\n new SerializedSnapshotStorage(() => { return context.storage; }, pendingRuntimeState.snapshotBlobs);\n\n const registry = new FluidDataStoreRegistry(registryEntries);\n\n const tryFetchBlob = async <T>(blobName: string): Promise<T | undefined> => {\n const blobId = baseSnapshot?.blobs[blobName];\n if (baseSnapshot && blobId) {\n // IContainerContext storage api return type still has undefined in 0.39 package version.\n // So once we release 0.40 container-defn package we can remove this check.\n assert(storage !== undefined, 0x1f5 /* \"Attached state should have storage\" */);\n return readAndParse<T>(storage, blobId);\n }\n };\n\n const [chunks, metadata, electedSummarizerData, aliases] = await Promise.all([\n tryFetchBlob<[string, string[]][]>(chunksBlobName),\n tryFetchBlob<IContainerRuntimeMetadata>(metadataBlobName),\n tryFetchBlob<ISerializedElection>(electedSummarizerBlobName),\n tryFetchBlob<[string, string][]>(aliasBlobName),\n ]);\n\n const loadExisting = existing === true || context.existing === true;\n\n // read snapshot blobs needed for BlobManager to load\n const blobManagerSnapshot = await BlobManager.load(\n baseSnapshot?.trees[blobsTreeName],\n async (id) => {\n // IContainerContext storage api return type still has undefined in 0.39 package version.\n // So once we release 0.40 container-defn package we can remove this check.\n assert(storage !== undefined, 0x256 /* \"storage undefined in attached container\" */);\n return readAndParse(storage, id);\n },\n );\n\n // Verify summary runtime sequence number matches protocol sequence number.\n const runtimeSequenceNumber = metadata?.message?.sequenceNumber;\n // When we load with pending state, we reuse an old snapshot so we don't expect these numbers to match\n if (!pendingRuntimeState && runtimeSequenceNumber !== undefined) {\n const protocolSequenceNumber = context.deltaManager.initialSequenceNumber;\n // Unless bypass is explicitly set, then take action when sequence numbers mismatch.\n if (loadSequenceNumberVerification !== \"bypass\" && runtimeSequenceNumber !== protocolSequenceNumber) {\n // \"Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber\"\n const error = new DataCorruptionError(\n // pre-0.58 error message: SummaryMetadataMismatch\n \"Summary metadata mismatch\",\n { runtimeVersion: pkgVersion, runtimeSequenceNumber, protocolSequenceNumber },\n );\n\n if (loadSequenceNumberVerification === \"log\") {\n logger.sendErrorEvent({ eventName: \"SequenceNumberMismatch\" }, error);\n } else {\n // Call both close and dispose as closeFn implementation will no longer dispose runtime in future\n context.closeFn(error);\n context.disposeFn?.(error);\n }\n }\n }\n\n const runtime = new containerRuntimeCtor(\n context,\n registry,\n metadata,\n electedSummarizerData,\n chunks ?? [],\n aliases ?? [],\n {\n summaryOptions,\n gcOptions,\n loadSequenceNumberVerification,\n flushMode,\n enableOfflineLoad,\n compressionOptions,\n maxBatchSizeInBytes,\n chunkSizeInBytes,\n enableOpReentryCheck,\n },\n containerScope,\n logger,\n loadExisting,\n blobManagerSnapshot,\n storage,\n requestHandler,\n );\n\n if (pendingRuntimeState) {\n await runtime.processSavedOps(pendingRuntimeState);\n // delete these once runtime has seen them to save space\n pendingRuntimeState.savedOps = [];\n }\n\n // Initialize the base state of the runtime before it's returned.\n await runtime.initializeBaseState();\n\n return runtime;\n }\n\n public get options(): ILoaderOptions {\n return this.context.options;\n }\n\n public get clientId(): string | undefined {\n return this.context.clientId;\n }\n\n public get clientDetails(): IClientDetails {\n return this.context.clientDetails;\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this.context.deltaManager;\n }\n\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n public get reSubmitFn(): (\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) => void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.reSubmit;\n }\n\n public get disposeFn(): (error?: ICriticalContainerError) => void {\n // In old loaders without dispose functionality, closeFn is equivalent but will also switch container to readonly mode\n return this.context.disposeFn ?? this.context.closeFn;\n }\n\n public get closeFn(): (error?: ICriticalContainerError) => void {\n // Also call disposeFn to retain functionality of runtime being disposed on close\n return (error?: ICriticalContainerError) => {\n this.context.closeFn(error);\n this.context.disposeFn?.(error);\n };\n }\n\n public get flushMode(): FlushMode {\n return this._flushMode;\n }\n\n public get scope(): FluidObject {\n return this.containerScope;\n }\n\n public get IFluidDataStoreRegistry(): IFluidDataStoreRegistry {\n return this.registry;\n }\n\n public get attachState(): AttachState {\n return this.context.attachState;\n }\n\n public get IFluidHandleContext(): IFluidHandleContext {\n return this.handleContext;\n }\n private readonly handleContext: ContainerFluidHandleContext;\n\n // internal logger for ContainerRuntime. Use this.logger for stores, summaries, etc.\n private readonly mc: MonitoringContext;\n\n private readonly summarizerClientElection?: SummarizerClientElection;\n /**\n * summaryManager will only be created if this client is permitted to spawn a summarizing client\n * It is created only by interactive client, i.e. summarizer client, as well as non-interactive bots\n * do not create it (see SummarizerClientElection.clientDetailsPermitElection() for details)\n */\n private readonly summaryManager?: SummaryManager;\n private readonly summaryCollection: SummaryCollection;\n\n private readonly summarizerNode: IRootSummarizerNodeWithGC;\n\n private readonly maxConsecutiveReconnects: number;\n private readonly defaultMaxConsecutiveReconnects = 7;\n\n private _orderSequentiallyCalls: number = 0;\n private readonly _flushMode: FlushMode;\n private flushMicroTaskExists = false;\n\n private _connected: boolean;\n\n private readonly savedOps: ISequencedDocumentMessage[] = [];\n private baseSnapshotBlobs?: ISerializedBaseSnapshotBlobs;\n\n private consecutiveReconnects = 0;\n\n /**\n * Used to delay transition to \"connected\" state while we upload\n * attachment blobs that were added while disconnected\n */\n private delayConnectClientId?: string;\n\n private ensureNoDataModelChangesCalls = 0;\n\n /**\n * Tracks the number of detected reentrant ops to report,\n * in order to self-throttle the telemetry events.\n *\n * This should be removed as part of ADO:2322\n */\n private opReentryCallsToReport = 5;\n\n /**\n * Invokes the given callback and expects that no ops are submitted\n * until execution finishes. If an op is submitted, an error will be raised.\n *\n * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n *\n * @param callback - the callback to be invoked\n */\n public ensureNoDataModelChanges<T>(callback: () => T): T {\n this.ensureNoDataModelChangesCalls++;\n try {\n return callback();\n } finally {\n this.ensureNoDataModelChangesCalls--;\n }\n }\n\n public get connected(): boolean {\n return this._connected;\n }\n\n /** clientId of parent (non-summarizing) container that owns summarizer container */\n public get summarizerClientId(): string | undefined {\n return this.summarizerClientElection?.electedClientId;\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n\n private dirtyContainer: boolean;\n private emitDirtyDocumentEvent = true;\n private readonly enableOpReentryCheck: boolean;\n\n private readonly defaultTelemetrySignalSampleCount = 100;\n private _perfSignalData: IPerfSignalReport = {\n signalsLost: 0,\n signalSequenceNumber: 0,\n signalTimestamp: 0,\n trackingSignalSequenceNumber: undefined,\n };\n\n /**\n * Summarizer is responsible for coordinating when to send generate and send summaries.\n * It is the main entry point for summary work.\n * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n */\n private readonly _summarizer?: Summarizer;\n private readonly scheduleManager: ScheduleManager;\n private readonly blobManager: BlobManager;\n private readonly pendingStateManager: PendingStateManager;\n private readonly outbox: Outbox;\n\n private readonly garbageCollector: IGarbageCollector;\n\n private readonly dataStores: DataStores;\n private readonly remoteMessageProcessor: RemoteMessageProcessor;\n\n /** The last message processed at the time of the last summary. */\n private messageAtLastSummary: ISummaryMetadataMessage | undefined;\n\n private get summarizer(): Summarizer {\n assert(this._summarizer !== undefined, 0x257 /* \"This is not summarizing container\" */);\n return this._summarizer;\n }\n\n private readonly summariesDisabled: boolean;\n private isSummariesDisabled(): boolean {\n return this.summaryConfiguration.state === \"disabled\";\n }\n\n private readonly heuristicsDisabled: boolean;\n private isHeuristicsDisabled(): boolean {\n return this.summaryConfiguration.state === \"disableHeuristics\";\n }\n\n private readonly maxOpsSinceLastSummary: number;\n private getMaxOpsSinceLastSummary(): number {\n return this.summaryConfiguration.state !== \"disabled\"\n ? this.summaryConfiguration.maxOpsSinceLastSummary\n : 0;\n }\n\n private readonly initialSummarizerDelayMs: number;\n private getInitialSummarizerDelayMs(): number {\n // back-compat: initialSummarizerDelayMs was moved from ISummaryRuntimeOptions\n // to ISummaryConfiguration in 0.60.\n if (this.runtimeOptions.summaryOptions.initialSummarizerDelayMs !== undefined) {\n return this.runtimeOptions.summaryOptions.initialSummarizerDelayMs;\n }\n return this.summaryConfiguration.state !== \"disabled\"\n ? this.summaryConfiguration.initialSummarizerDelayMs\n : 0;\n }\n\n private readonly createContainerMetadata: ICreateContainerMetadata;\n /**\n * The summary number of the next summary that will be generated for this container. This is incremented every time\n * a summary is generated.\n */\n private nextSummaryNumber: number;\n\n /**\n * @internal\n */\n protected constructor(\n private readonly context: IContainerContext,\n private readonly registry: IFluidDataStoreRegistry,\n metadata: IContainerRuntimeMetadata | undefined,\n electedSummarizerData: ISerializedElection | undefined,\n chunks: [string, string[]][],\n dataStoreAliasMap: [string, string][],\n private readonly runtimeOptions: Readonly<Required<IContainerRuntimeOptions>>,\n private readonly containerScope: FluidObject,\n public readonly logger: ITelemetryLogger,\n existing: boolean,\n blobManagerSnapshot: IBlobManagerLoadInfo,\n private readonly _storage: IDocumentStorageService,\n private readonly requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>,\n private readonly summaryConfiguration: ISummaryConfiguration = {\n // the defaults\n ...DefaultSummaryConfiguration,\n // the runtime configuration overrides\n ...runtimeOptions.summaryOptions?.summaryConfigOverrides,\n },\n ) {\n super();\n\n let loadSummaryNumber: number;\n // Get the container creation metadata. For new container, we initialize these. For existing containers,\n // get the values from the metadata blob.\n if (existing) {\n this.createContainerMetadata = {\n createContainerRuntimeVersion: metadata?.createContainerRuntimeVersion,\n createContainerTimestamp: metadata?.createContainerTimestamp,\n };\n // summaryNumber was renamed from summaryCount. For older docs that haven't been opened for a long time,\n // the count is reset to 0.\n loadSummaryNumber = metadata?.summaryNumber ?? 0;\n } else {\n this.createContainerMetadata = {\n createContainerRuntimeVersion: pkgVersion,\n createContainerTimestamp: Date.now(),\n };\n loadSummaryNumber = 0;\n }\n this.nextSummaryNumber = loadSummaryNumber + 1;\n\n this.messageAtLastSummary = metadata?.message;\n\n this._connected = this.context.connected;\n\n this.mc = loggerToMonitoringContext(ChildLogger.create(this.logger, \"ContainerRuntime\"));\n\n const opSplitter = new OpSplitter(\n chunks,\n this.context.submitBatchFn,\n this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableCompressionChunking\") === true ?\n Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes,\n runtimeOptions.maxBatchSizeInBytes,\n this.mc.logger);\n this.remoteMessageProcessor = new RemoteMessageProcessor(opSplitter, new OpDecompressor());\n\n this.handleContext = new ContainerFluidHandleContext(\"\", this);\n\n if (this.summaryConfiguration.state === \"enabled\") {\n this.validateSummaryHeuristicConfiguration(this.summaryConfiguration);\n }\n\n this.enableOpReentryCheck = runtimeOptions.enableOpReentryCheck === true\n // Allow for a break-glass config to override the options\n && this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableOpReentryCheck\") !== true;\n\n this.summariesDisabled = this.isSummariesDisabled();\n this.heuristicsDisabled = this.isHeuristicsDisabled();\n this.maxOpsSinceLastSummary = this.getMaxOpsSinceLastSummary();\n this.initialSummarizerDelayMs = this.getInitialSummarizerDelayMs();\n\n this.maxConsecutiveReconnects =\n this.mc.config.getNumber(maxConsecutiveReconnectsKey) ?? this.defaultMaxConsecutiveReconnects;\n\n this._flushMode = runtimeOptions.flushMode;\n\n const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;\n const baseSnapshot: ISnapshotTree | undefined = pendingRuntimeState?.baseSnapshot ?? context.baseSnapshot;\n\n const maxSnapshotCacheDurationMs = this._storage?.policies?.maximumCacheDurationMs;\n if (maxSnapshotCacheDurationMs !== undefined && maxSnapshotCacheDurationMs > 5 * 24 * 60 * 60 * 1000) {\n // This is a runtime enforcement of what's already explicit in the policy's type itself,\n // which dictates the value is either undefined or exactly 5 days in ms.\n // As long as the actual value is less than 5 days, the assumptions GC makes here are valid.\n throw new UsageError(\"Driver's maximumCacheDurationMs policy cannot exceed 5 days\");\n }\n\n this.garbageCollector = GarbageCollector.create({\n runtime: this,\n gcOptions: this.runtimeOptions.gcOptions,\n baseSnapshot,\n baseLogger: this.mc.logger,\n existing,\n metadata,\n createContainerMetadata: this.createContainerMetadata,\n isSummarizerClient: this.context.clientDetails.type === summarizerClientType,\n getNodePackagePath: async (nodePath: string) => this.getGCNodePackagePath(nodePath),\n getLastSummaryTimestampMs: () => this.messageAtLastSummary?.timestamp,\n readAndParseBlob: async <T>(id: string) => readAndParse<T>(this.storage, id),\n getContainerDiagnosticId: () => this.context.id,\n activeConnection: () => this.deltaManager.active,\n });\n\n const loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;\n this.summarizerNode = createRootSummarizerNodeWithGC(\n ChildLogger.create(this.logger, \"SummarizerNode\"),\n // Summarize function to call when summarize is called. Summarizer node always tracks summary state.\n async (fullTree: boolean, trackState: boolean, telemetryContext?: ITelemetryContext) =>\n this.summarizeInternal(fullTree, trackState, telemetryContext),\n // Latest change sequence number, no changes since summary applied yet\n loadedFromSequenceNumber,\n // Summary reference sequence number, undefined if no summary yet\n baseSnapshot ? loadedFromSequenceNumber : undefined,\n {\n // Must set to false to prevent sending summary handle which would be pointing to\n // a summary with an older protocol state.\n canReuseHandle: false,\n // Must set to true to throw on any data stores failure that was too severe to be handled.\n // We also are not decoding the base summaries at the root.\n throwOnFailure: true,\n // If GC should not run, let the summarizer node know so that it does not track GC state.\n gcDisabled: !this.garbageCollector.shouldRunGC,\n },\n // Function to get GC data if needed. This will always be called by the root summarizer node to get GC data.\n async (fullGC?: boolean) => this.getGCDataInternal(fullGC),\n // Function to get the GC details from the base snapshot we loaded from.\n async () => this.garbageCollector.getBaseGCDetails(),\n );\n\n if (baseSnapshot) {\n this.summarizerNode.updateBaseSummaryState(baseSnapshot);\n }\n\n this.dataStores = new DataStores(\n getSummaryForDatastores(baseSnapshot, metadata),\n this,\n (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg),\n (id: string, createParam: CreateChildSummarizerNodeParam) => (\n summarizeInternal: SummarizeInternalFn,\n getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,\n getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,\n ) => this.summarizerNode.createChild(\n summarizeInternal,\n id,\n createParam,\n undefined,\n getGCDataFn,\n getBaseGCDetailsFn,\n ),\n (id: string) => this.summarizerNode.deleteChild(id),\n this.mc.logger,\n async () => this.garbageCollector.getBaseGCDetails(),\n (path: string, timestampMs: number, packagePath?: readonly string[]) => this.garbageCollector.nodeUpdated(\n path,\n \"Changed\",\n timestampMs,\n packagePath,\n ),\n new Map<string, string>(dataStoreAliasMap),\n );\n\n this.blobManager = new BlobManager(\n this.handleContext,\n blobManagerSnapshot,\n () => this.storage,\n (localId: string, blobId?: string) => {\n if (!this.disposed) {\n this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { localId, blobId });\n }\n },\n (blobPath: string) => this.garbageCollector.nodeUpdated(blobPath, \"Loaded\"),\n (fromPath: string, toPath: string) => this.garbageCollector.addedOutboundReference(fromPath, toPath),\n this,\n pendingRuntimeState?.pendingAttachmentBlobs,\n () => this.getCurrentReferenceTimestampMs(),\n );\n\n this.scheduleManager = new ScheduleManager(\n context.deltaManager,\n this,\n () => this.clientId,\n ChildLogger.create(this.logger, \"ScheduleManager\"),\n );\n\n this.pendingStateManager = new PendingStateManager(\n {\n applyStashedOp: this.applyStashedOp.bind(this),\n clientId: () => this.clientId,\n close: this.closeFn,\n connected: () => this.connected,\n reSubmit: this.reSubmit.bind(this),\n rollback: this.rollback.bind(this),\n orderSequentially: this.orderSequentially.bind(this),\n },\n pendingRuntimeState?.pending);\n\n const compressionOptions = this.mc.config.getBoolean(\"Fluid.ContainerRuntime.DisableCompression\") === true ?\n {\n minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,\n compressionAlgorithm: CompressionAlgorithms.lz4\n } : runtimeOptions.compressionOptions;\n\n this.outbox = new Outbox({\n shouldSend: () => this.canSendOps(),\n pendingStateManager: this.pendingStateManager,\n containerContext: this.context,\n compressor: new OpCompressor(this.mc.logger),\n splitter: opSplitter,\n config: {\n compressionOptions,\n maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,\n enableOpReentryCheck: this.enableOpReentryCheck,\n },\n logger: this.mc.logger,\n });\n\n this.context.quorum.on(\"removeMember\", (clientId: string) => {\n this.remoteMessageProcessor.clearPartialMessagesFor(clientId);\n });\n\n this.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);\n\n this.dirtyContainer = this.context.attachState !== AttachState.Attached\n || this.pendingStateManager.hasPendingMessages();\n this.context.updateDirtyContainerState(this.dirtyContainer);\n\n if (this.summariesDisabled) {\n this.mc.logger.sendTelemetryEvent({ eventName: \"SummariesDisabled\" });\n } else {\n const orderedClientLogger = ChildLogger.create(this.logger, \"OrderedClientElection\");\n const orderedClientCollection = new OrderedClientCollection(\n orderedClientLogger,\n this.context.deltaManager,\n this.context.quorum,\n );\n const orderedClientElectionForSummarizer = new OrderedClientElection(\n\n orderedClientLogger,\n orderedClientCollection,\n electedSummarizerData ?? this.context.deltaManager.lastSequenceNumber,\n SummarizerClientElection.isClientEligible,\n );\n\n this.summarizerClientElection = new SummarizerClientElection(\n orderedClientLogger,\n this.summaryCollection,\n orderedClientElectionForSummarizer,\n this.maxOpsSinceLastSummary,\n );\n\n if (this.context.clientDetails.type === summarizerClientType) {\n this._summarizer = new Summarizer(\n \"/_summarizer\",\n this /* ISummarizerRuntime */,\n () => this.summaryConfiguration,\n this /* ISummarizerInternalsProvider */,\n this.handleContext,\n this.summaryCollection,\n async (runtime: IConnectableRuntime) => RunWhileConnectedCoordinator.create(runtime),\n );\n } else if (SummarizerClientElection.clientDetailsPermitElection(this.context.clientDetails)) {\n // Only create a SummaryManager and SummarizerClientElection\n // if summaries are enabled and we are not the summarizer client.\n const defaultAction = () => {\n if (this.summaryCollection.opsSinceLastAck > this.maxOpsSinceLastSummary) {\n this.logger.sendTelemetryEvent({ eventName: \"SummaryStatus:Behind\" });\n // unregister default to no log on every op after falling behind\n // and register summary ack handler to re-register this handler\n // after successful summary\n this.summaryCollection.once(MessageType.SummaryAck, () => {\n this.logger.sendTelemetryEvent({ eventName: \"SummaryStatus:CaughtUp\" });\n // we've caught up, so re-register the default action to monitor for\n // falling behind, and unregister ourself\n this.summaryCollection.on(\"default\", defaultAction);\n });\n this.summaryCollection.off(\"default\", defaultAction);\n }\n };\n\n this.summaryCollection.on(\"default\", defaultAction);\n\n // Create the SummaryManager and mark the initial state\n this.summaryManager = new SummaryManager(\n this.summarizerClientElection,\n this, // IConnectedState\n this.summaryCollection,\n this.logger,\n this.formRequestSummarizerFn(this.context.loader),\n new Throttler(\n 60 * 1000, // 60 sec delay window\n 30 * 1000, // 30 sec max delay\n // throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)\n formExponentialFn({ coefficient: 20, initialDelay: 0 }),\n ),\n {\n initialDelayMs: this.initialSummarizerDelayMs,\n },\n this.heuristicsDisabled,\n );\n this.summaryManager.start();\n }\n }\n\n this.deltaManager.on(\"readonly\", (readonly: boolean) => {\n // we accumulate ops while being in read-only state.\n // once user gets write permissions and we have active connection, flush all pending ops.\n assert(readonly === this.deltaManager.readOnlyInfo.readonly,\n 0x124 /* \"inconsistent readonly property/event state\" */);\n\n // We need to be very careful with when we (re)send pending ops, to ensure that we only send ops\n // when we either never send an op, or attempted to send it but we know for sure it was not\n // sequenced by server and will never be sequenced (i.e. was lost)\n // For loss of connection, we wait for our own \"join\" op and use it a a barrier to know all the\n // ops that made it from previous connection, before switching clientId and raising \"connected\" event\n // But with read-only permissions, if we transition between read-only and r/w states while on same\n // connection, then we have no good signal to tell us when it's safe to send ops we accumulated while\n // being in read-only state.\n // For that reason, we support getting to read-only state only when disconnected. This ensures that we\n // can rely on same safety mechanism and resend ops only when we establish new connection.\n // This is applicable for read-only permissions (event is raised before connection is properly registered),\n // but it's an extra requirement for Container.forceReadonly() API\n assert(!readonly || !this.connected, 0x125 /* \"Unsafe to transition to read-only state!\" */);\n\n this.replayPendingStates();\n });\n\n // logging hardware telemetry\n logger.sendTelemetryEvent({\n eventName: \"DeviceSpec\",\n ...getDeviceSpec(),\n });\n\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerLoadStats\",\n ...this.createContainerMetadata,\n ...this.dataStores.containerLoadStats,\n summaryNumber: loadSummaryNumber,\n summaryFormatVersion: metadata?.summaryFormatVersion,\n disableIsolatedChannels: metadata?.disableIsolatedChannels,\n gcVersion: metadata?.gcFeature,\n });\n\n ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);\n BindBatchTracker(this, this.logger);\n }\n\n /**\n * Initializes the state from the base snapshot this container runtime loaded from.\n */\n private async initializeBaseState(): Promise<void> {\n await this.initializeBaseSnapshotBlobs();\n await this.garbageCollector.initializeBaseState();\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerRuntimeDisposed\",\n isDirty: this.isDirty,\n lastSequenceNumber: this.deltaManager.lastSequenceNumber,\n attachState: this.attachState,\n }, error);\n\n if (this.summaryManager !== undefined) {\n this.summaryManager.dispose();\n }\n this.garbageCollector.dispose();\n this._summarizer?.dispose();\n this.dataStores.dispose();\n this.pendingStateManager.dispose();\n this.emit(\"dispose\");\n this.removeAllListeners();\n }\n\n public get IFluidTokenProvider() {\n if (this.options?.intelligence) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n intelligence: this.options.intelligence,\n } as IFluidTokenProvider;\n }\n return undefined;\n }\n\n /**\n * Notifies this object about the request made to the container.\n * @param request - Request made to the handler.\n */\n public async request(request: IRequest): Promise<IResponse> {\n try {\n const parser = RequestParser.create(request);\n const id = parser.pathParts[0];\n\n if (id === \"_summarizer\" && parser.pathParts.length === 1) {\n if (this._summarizer !== undefined) {\n return {\n status: 200,\n mimeType: \"fluid/object\",\n value: this.summarizer,\n };\n }\n return create404Response(request);\n }\n if (this.requestHandler !== undefined) {\n return this.requestHandler(parser, this);\n }\n\n return create404Response(request);\n } catch (error) {\n return exceptionToResponse(error);\n }\n }\n\n /**\n * Resolves URI representing handle\n * @param request - Request made to the handler.\n */\n public async resolveHandle(request: IRequest): Promise<IResponse> {\n try {\n const requestParser = RequestParser.create(request);\n const id = requestParser.pathParts[0];\n\n if (id === \"_channels\") {\n return this.resolveHandle(requestParser.createSubRequest(1));\n }\n\n if (id === BlobManager.basePath && requestParser.isLeaf(2)) {\n const blob = await this.blobManager.getBlob(requestParser.pathParts[1]);\n return blob\n ? {\n status: 200,\n mimeType: \"fluid/object\",\n value: blob,\n } : create404Response(request);\n } else if (requestParser.pathParts.length > 0) {\n const dataStore = await this.getDataStoreFromRequest(id, request);\n const subRequest = requestParser.createSubRequest(1);\n // We always expect createSubRequest to include a leading slash, but asserting here to protect against\n // unintentionally modifying the url if that changes.\n assert(subRequest.url.startsWith(\"/\"),\n 0x126 /* \"Expected createSubRequest url to include a leading slash\" */);\n return dataStore.IFluidRouter.request(subRequest);\n }\n\n return create404Response(request);\n } catch (error) {\n return exceptionToResponse(error);\n }\n }\n\n private internalId(maybeAlias: string): string {\n return this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;\n }\n\n private async getDataStoreFromRequest(id: string, request: IRequest): Promise<IFluidRouter> {\n const headerData: RuntimeHeaderData = {};\n if (typeof request.headers?.[RuntimeHeaders.wait] === \"boolean\") {\n headerData.wait = request.headers[RuntimeHeaders.wait];\n }\n if (typeof request.headers?.[RuntimeHeaders.viaHandle] === \"boolean\") {\n headerData.viaHandle = request.headers[RuntimeHeaders.viaHandle];\n }\n if (typeof request.headers?.[AllowTombstoneRequestHeaderKey] === \"boolean\") {\n headerData.allowTombstone = request.headers[AllowTombstoneRequestHeaderKey];\n }\n\n await this.dataStores.waitIfPendingAlias(id);\n const internalId = this.internalId(id);\n const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);\n\n /**\n * If GC should run and this an external app request with \"externalRequest\" header, we need to return\n * an error if the data store being requested is marked as unreferenced as per the data store's base\n * GC data.\n *\n * This is a workaround to handle scenarios where a data store shared with an external app is deleted\n * and marked as unreferenced by GC. Returning an error will fail to load the data store for the app.\n */\n if (request.headers?.[RuntimeHeaders.externalRequest] && this.garbageCollector.shouldRunGC) {\n // The data store is referenced if used routes in the base summary has a route to self.\n // Older documents may not have used routes in the summary. They are considered referenced.\n const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;\n if (!(usedRoutes === undefined || usedRoutes.includes(\"\") || usedRoutes.includes(\"/\"))) {\n throw responseToException(create404Response(request), request);\n }\n }\n\n const dataStoreChannel = await dataStoreContext.realize();\n\n // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is\n // the same as GC nodes id.\n const urlWithoutQuery = trimLeadingAndTrailingSlashes(request.url.split(\"?\")[0]);\n this.garbageCollector.nodeUpdated(\n `/${urlWithoutQuery}`,\n \"Loaded\",\n undefined /* timestampMs */,\n dataStoreContext.packagePath,\n request?.headers,\n );\n return dataStoreChannel;\n }\n\n /** Adds the container's metadata to the given summary tree. */\n private addMetadataToSummary(summaryTree: ISummaryTreeWithStats) {\n const metadata: IContainerRuntimeMetadata = {\n ...this.createContainerMetadata,\n // Increment the summary number for the next summary that will be generated.\n summaryNumber: this.nextSummaryNumber++,\n summaryFormatVersion: 1,\n ...this.garbageCollector.getMetadata(),\n // The last message processed at the time of summary. If there are no new messages, use the message from the\n // last summary.\n message: extractSummaryMetadataMessage(this.deltaManager.lastMessage) ?? this.messageAtLastSummary,\n };\n addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(metadata));\n }\n\n protected addContainerStateToSummary(\n summaryTree: ISummaryTreeWithStats,\n fullTree: boolean,\n trackState: boolean,\n telemetryContext?: ITelemetryContext,\n ) {\n this.addMetadataToSummary(summaryTree);\n\n if (this.remoteMessageProcessor.partialMessages.size > 0) {\n const content = JSON.stringify([...this.remoteMessageProcessor.partialMessages]);\n addBlobToSummary(summaryTree, chunksBlobName, content);\n }\n\n const dataStoreAliases = this.dataStores.aliases;\n if (dataStoreAliases.size > 0) {\n addBlobToSummary(summaryTree, aliasBlobName, JSON.stringify([...dataStoreAliases]));\n }\n\n if (this.summarizerClientElection) {\n const electedSummarizerContent = JSON.stringify(this.summarizerClientElection?.serialize());\n addBlobToSummary(summaryTree, electedSummarizerBlobName, electedSummarizerContent);\n }\n\n const blobManagerSummary = this.blobManager.summarize();\n // Some storage (like git) doesn't allow empty tree, so we can omit it.\n // and the blob manager can handle the tree not existing when loading\n if (Object.keys(blobManagerSummary.summary.tree).length > 0) {\n addTreeToSummary(summaryTree, blobsTreeName, blobManagerSummary);\n }\n\n const gcSummary = this.garbageCollector.summarize(fullTree, trackState, telemetryContext);\n if (gcSummary !== undefined) {\n addSummarizeResultToSummary(summaryTree, gcTreeKey, gcSummary);\n }\n }\n\n // Track how many times the container tries to reconnect with pending messages.\n // This happens when the connection state is changed and we reset the counter\n // when we are able to process a local op or when there are no pending messages.\n // If this counter reaches a max, it's a good indicator that the container\n // is not making progress and it is stuck in a retry loop.\n private shouldContinueReconnecting(): boolean {\n if (this.maxConsecutiveReconnects <= 0) {\n // Feature disabled, we never stop reconnecting\n return true;\n }\n\n if (!this.hasPendingMessages()) {\n // If there are no pending messages, we can always reconnect\n this.resetReconnectCount();\n return true;\n }\n\n if (this.consecutiveReconnects === Math.floor(this.maxConsecutiveReconnects / 2)) {\n // If we're halfway through the max reconnects, send an event in order\n // to better identify false positives, if any. If the rate of this event\n // matches Container Close count below, we can safely cut down\n // maxConsecutiveReconnects to half.\n this.mc.logger.sendTelemetryEvent({\n eventName: \"ReconnectsWithNoProgress\",\n attempts: this.consecutiveReconnects,\n pendingMessages: this.pendingStateManager.pendingMessagesCount,\n });\n }\n\n return this.consecutiveReconnects < this.maxConsecutiveReconnects;\n }\n\n private resetReconnectCount() {\n this.consecutiveReconnects = 0;\n }\n\n private replayPendingStates() {\n // We need to be able to send ops to replay states\n if (!this.canSendOps()) { return; }\n\n // We need to temporary clear the dirty flags and disable\n // dirty state change events to detect whether replaying ops\n // has any effect.\n\n // Save the old state, reset to false, disable event emit\n const oldState = this.dirtyContainer;\n this.dirtyContainer = false;\n\n assert(this.emitDirtyDocumentEvent, 0x127 /* \"dirty document event not set on replay\" */);\n this.emitDirtyDocumentEvent = false;\n let newState: boolean;\n\n try {\n // replay the ops\n this.pendingStateManager.replayPendingStates();\n } finally {\n // Save the new start and restore the old state, re-enable event emit\n newState = this.dirtyContainer;\n this.dirtyContainer = oldState;\n this.emitDirtyDocumentEvent = true;\n }\n\n // Officially transition from the old state to the new state.\n this.updateDocumentDirtyState(newState);\n }\n\n private async applyStashedOp(type: ContainerMessageType, op: ISequencedDocumentMessage): Promise<unknown> {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n return this.dataStores.applyStashedOp(op);\n case ContainerMessageType.Attach:\n return this.dataStores.applyStashedAttachOp(op as unknown as IAttachMessage);\n case ContainerMessageType.Alias:\n case ContainerMessageType.BlobAttach:\n return;\n case ContainerMessageType.ChunkedOp:\n throw new Error(\"chunkedOp not expected here\");\n case ContainerMessageType.Rejoin:\n throw new Error(\"rejoin not expected here\");\n default:\n unreachableCase(type, `Unknown ContainerMessageType: ${type}`);\n }\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n if (connected === false && this.delayConnectClientId !== undefined) {\n this.delayConnectClientId = undefined;\n this.mc.logger.sendTelemetryEvent({\n eventName: \"UnsuccessfulConnectedTransition\",\n });\n // Don't propagate \"disconnected\" event because we didn't propagate the previous \"connected\" event\n return;\n }\n\n // If attachment blobs were added while disconnected, we need to delay\n // propagation of the \"connected\" event until we have uploaded them to\n // ensure we don't submit ops referencing a blob that has not been uploaded\n const connecting = connected && !this._connected && !this.deltaManager.readOnlyInfo.readonly;\n if (connecting && this.blobManager.hasPendingOfflineUploads) {\n assert(!this.delayConnectClientId,\n 0x392 /* Connect event delay must be canceled before subsequent connect event */);\n assert(!!clientId, 0x393 /* Must have clientId when connecting */);\n this.delayConnectClientId = clientId;\n this.blobManager.onConnected().then(() => {\n // make sure we didn't reconnect before the promise resolved\n if (this.delayConnectClientId === clientId && !this.disposed) {\n this.delayConnectClientId = undefined;\n this.setConnectionStateCore(connected, clientId);\n }\n }, (error) => this.closeFn(error));\n return;\n }\n\n this.setConnectionStateCore(connected, clientId);\n }\n\n private setConnectionStateCore(connected: boolean, clientId?: string) {\n assert(!this.delayConnectClientId,\n 0x394 /* connect event delay must be cleared before propagating connect event */);\n this.verifyNotClosed();\n\n // There might be no change of state due to Container calling this API after loading runtime.\n const changeOfState = this._connected !== connected;\n const reconnection = changeOfState && !connected;\n this._connected = connected;\n\n if (!connected) {\n this._perfSignalData.signalsLost = 0;\n this._perfSignalData.signalTimestamp = 0;\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n } else {\n assert(this.attachState === AttachState.Attached,\n 0x3cd /* Connection is possible only if container exists in storage */);\n }\n\n // Fail while disconnected\n if (reconnection) {\n this.consecutiveReconnects++;\n\n if (!this.shouldContinueReconnecting()) {\n this.closeFn(\n DataProcessingError.create(\n \"Runtime detected too many reconnects with no progress syncing local ops. Batch of ops is likely too large (over 1Mb)\",\n \"setConnectionState\",\n undefined,\n {\n dataLoss: 1,\n attempts: this.consecutiveReconnects,\n pendingMessages: this.pendingStateManager.pendingMessagesCount,\n }));\n return;\n }\n }\n\n if (changeOfState) {\n this.replayPendingStates();\n }\n\n this.dataStores.setConnectionState(connected, clientId);\n this.garbageCollector.setConnectionState(connected, clientId);\n\n raiseConnectedEvent(this.mc.logger, this, connected, clientId);\n }\n\n public process(messageArg: ISequencedDocumentMessage, local: boolean) {\n this.verifyNotClosed();\n\n if (this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) {\n this.savedOps.push(messageArg);\n }\n\n\n // Whether or not the message is actually a runtime message.\n // It may be a legacy runtime message (ie already unpacked and ContainerMessageType)\n // or something different, like a system message.\n const runtimeMessage = messageArg.type === MessageType.Operation;\n\n // Do shallow copy of message, as the processing flow will modify it.\n const messageCopy = { ...messageArg };\n const message = this.remoteMessageProcessor.process(messageCopy);\n\n // Surround the actual processing of the operation with messages to the schedule manager indicating\n // the beginning and end. This allows it to emit appropriate events and/or pause the processing of new\n // messages once a batch has been fully processed.\n this.scheduleManager.beforeOpProcessing(message);\n\n try {\n let localOpMetadata: unknown;\n if (local && runtimeMessage && message.type !== ContainerMessageType.ChunkedOp) {\n localOpMetadata = this.pendingStateManager.processPendingLocalMessage(message);\n }\n\n // If there are no more pending messages after processing a local message,\n // the document is no longer dirty.\n if (!this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n\n const type = message.type as ContainerMessageType;\n switch (type) {\n case ContainerMessageType.Attach:\n this.dataStores.processAttachMessage(message, local);\n break;\n case ContainerMessageType.Alias:\n this.processAliasMessage(message, localOpMetadata, local);\n break;\n case ContainerMessageType.FluidDataStoreOp:\n this.dataStores.processFluidDataStoreOp(message, local, localOpMetadata);\n break;\n case ContainerMessageType.BlobAttach:\n this.blobManager.processBlobAttachOp(message, local);\n break;\n case ContainerMessageType.ChunkedOp:\n case ContainerMessageType.Rejoin:\n break;\n default:\n assert(!runtimeMessage, 0x3ce /* Runtime message of unknown type */);\n }\n\n // For back-compat, notify only about runtime messages for now.\n if (runtimeMessage) {\n this.emit(\"op\", message, runtimeMessage);\n }\n\n this.scheduleManager.afterOpProcessing(undefined, message);\n\n if (local) {\n // If we have processed a local op, this means that the container is\n // making progress and we can reset the counter for how many times\n // we have consecutively replayed the pending states\n this.resetReconnectCount();\n }\n } catch (e) {\n this.scheduleManager.afterOpProcessing(e, message);\n throw e;\n }\n }\n\n private processAliasMessage(\n message: ISequencedDocumentMessage,\n localOpMetadata: unknown,\n local: boolean,\n ) {\n this.dataStores.processAliasMessage(message, localOpMetadata, local);\n }\n\n /**\n * Emits the Signal event and update the perf signal data.\n * @param clientSignalSequenceNumber - is the client signal sequence number to be uploaded.\n */\n private sendSignalTelemetryEvent(clientSignalSequenceNumber: number) {\n const duration = Date.now() - this._perfSignalData.signalTimestamp;\n this.logger.sendPerformanceEvent({\n eventName: \"SignalLatency\",\n duration,\n signalsLost: this._perfSignalData.signalsLost,\n });\n\n this._perfSignalData.signalsLost = 0;\n this._perfSignalData.signalTimestamp = 0;\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n const envelope = message.content as ISignalEnvelope;\n const transformed: IInboundSignalMessage = {\n clientId: message.clientId,\n content: envelope.contents.content,\n type: envelope.contents.type,\n };\n\n // Only collect signal telemetry for messages sent by the current client.\n if (message.clientId === this.clientId && this.connected) {\n // Check to see if the signal was lost.\n if (this._perfSignalData.trackingSignalSequenceNumber !== undefined &&\n envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber) {\n this._perfSignalData.signalsLost++;\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n this.logger.sendErrorEvent({\n eventName: \"SignalLost\",\n type: envelope.contents.type,\n signalsLost: this._perfSignalData.signalsLost,\n trackingSequenceNumber: this._perfSignalData.trackingSignalSequenceNumber,\n clientSignalSequenceNumber: envelope.clientSignalSequenceNumber,\n });\n } else if (envelope.clientSignalSequenceNumber === this._perfSignalData.trackingSignalSequenceNumber) {\n this.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);\n this._perfSignalData.trackingSignalSequenceNumber = undefined;\n }\n }\n\n if (envelope.address === undefined) {\n // No address indicates a container signal message.\n this.emit(\"signal\", transformed, local);\n return;\n }\n\n this.dataStores.processSignal(envelope.address, transformed, local);\n }\n\n public async getRootDataStore(id: string, wait = true): Promise<IFluidRouter> {\n return this.getRootDataStoreChannel(id, wait);\n }\n\n private async getRootDataStoreChannel(id: string, wait = true): Promise<IFluidDataStoreChannel> {\n await this.dataStores.waitIfPendingAlias(id);\n const internalId = this.internalId(id);\n const context = await this.dataStores.getDataStore(internalId, { wait });\n assert(await context.isRoot(), 0x12b /* \"did not get root data store\" */);\n return context.realize();\n }\n\n /**\n * Flush the pending ops manually.\n * This method is expected to be called at the end of a batch.\n */\n private flush(): void {\n assert(this._orderSequentiallyCalls === 0,\n 0x24c /* \"Cannot call `flush()` from `orderSequentially`'s callback\" */);\n\n this.outbox.flush();\n assert(this.outbox.isEmpty, 0x3cf /* reentrancy */);\n }\n\n public orderSequentially<T>(callback: () => T): T {\n let checkpoint: IBatchCheckpoint | undefined;\n let result: T;\n if (this.mc.config.getBoolean(\"Fluid.ContainerRuntime.EnableRollback\")) {\n // Note: we are not touching this.pendingAttachBatch here, for two reasons:\n // 1. It would not help, as we flush attach ops as they become available.\n // 2. There is no way to undo process of data store creation.\n checkpoint = this.outbox.checkpoint().mainBatch;\n }\n try {\n this._orderSequentiallyCalls++;\n result = callback();\n } catch (error) {\n if (checkpoint) {\n // This will throw and close the container if rollback fails\n try {\n checkpoint.rollback((message: BatchMessage) =>\n this.rollback(\n message.deserializedContent.type,\n message.deserializedContent.contents,\n message.localOpMetadata));\n } catch (err) {\n const error2 = wrapError(err, (message) => {\n return DataProcessingError.create(\n `RollbackError: ${message}`,\n \"checkpointRollback\",\n undefined) as DataProcessingError;\n });\n this.closeFn(error2);\n throw error2;\n }\n } else {\n // pre-0.58 error message: orderSequentiallyCallbackException\n this.closeFn(new GenericError(\"orderSequentially callback exception\", error));\n }\n throw error; // throw the original error for the consumer of the runtime\n } finally {\n this._orderSequentiallyCalls--;\n }\n\n // We don't flush on TurnBased since we expect all messages in the same JS turn to be part of the same batch\n if (this.flushMode !== FlushMode.TurnBased && this._orderSequentiallyCalls === 0) {\n this.flush();\n }\n return result;\n }\n\n public async createDataStore(pkg: string | string[]): Promise<IDataStore> {\n const internalId = uuid();\n return channelToDataStore(\n await this._createDataStore(pkg, internalId),\n internalId,\n this,\n this.dataStores,\n this.mc.logger);\n }\n\n public createDetachedRootDataStore(\n pkg: Readonly<string[]>,\n rootDataStoreId: string): IFluidDataStoreContextDetached {\n if (rootDataStoreId.includes(\"/\")) {\n throw new UsageError(`Id cannot contain slashes: '${rootDataStoreId}'`);\n }\n return this.dataStores.createDetachedDataStoreCore(pkg, true, rootDataStoreId);\n }\n\n public createDetachedDataStore(pkg: Readonly<string[]>): IFluidDataStoreContextDetached {\n return this.dataStores.createDetachedDataStoreCore(pkg, false);\n }\n\n public async _createDataStoreWithProps(\n pkg: string | string[],\n props?: any,\n id = uuid(),\n ): Promise<IDataStore> {\n const fluidDataStore = await this.dataStores._createFluidDataStoreContext(\n Array.isArray(pkg) ? pkg : [pkg], id, props).realize();\n return channelToDataStore(fluidDataStore, id, this, this.dataStores, this.mc.logger);\n }\n\n private async _createDataStore(\n pkg: string | string[],\n id = uuid(),\n props?: any,\n ): Promise<IFluidDataStoreChannel> {\n return this.dataStores\n ._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, props)\n .realize();\n }\n\n private canSendOps() {\n return this.connected && !this.deltaManager.readOnlyInfo.readonly;\n }\n\n /**\n * Are we in the middle of batching ops together?\n */\n private currentlyBatching() {\n return this.flushMode === FlushMode.TurnBased || this._orderSequentiallyCalls !== 0;\n }\n\n public getQuorum(): IQuorumClients {\n return this.context.quorum;\n }\n\n public getAudience(): IAudience {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.context.audience!;\n }\n\n /**\n * Returns true of container is dirty, i.e. there are some pending local changes that\n * either were not sent out to delta stream or were not yet acknowledged.\n */\n public get isDirty(): boolean {\n return this.dirtyContainer;\n }\n\n private isContainerMessageDirtyable(type: ContainerMessageType, contents: any) {\n // For legacy purposes, exclude the old built-in AgentScheduler from dirty consideration as a special-case.\n // Ultimately we should have no special-cases from the ContainerRuntime's perspective.\n if (type === ContainerMessageType.Attach) {\n const attachMessage = contents as InboundAttachMessage;\n if (attachMessage.id === agentSchedulerId) {\n return false;\n }\n } else if (type === ContainerMessageType.FluidDataStoreOp) {\n const envelope = contents as IEnvelope;\n if (envelope.address === agentSchedulerId) {\n return false;\n }\n }\n return true;\n }\n\n private createNewSignalEnvelope(address: string | undefined, type: string, content: any): ISignalEnvelope {\n const newSequenceNumber = ++this._perfSignalData.signalSequenceNumber;\n const newEnvelope: ISignalEnvelope = {\n address,\n clientSignalSequenceNumber: newSequenceNumber,\n contents: { type, content },\n };\n\n // We should not track any signals in case we already have a tracking number.\n if (newSequenceNumber % this.defaultTelemetrySignalSampleCount === 1 &&\n this._perfSignalData.trackingSignalSequenceNumber === undefined) {\n this._perfSignalData.signalTimestamp = Date.now();\n this._perfSignalData.trackingSignalSequenceNumber = newSequenceNumber;\n }\n\n return newEnvelope;\n }\n\n /**\n * Submits the signal to be sent to other clients.\n * @param type - Type of the signal.\n * @param content - Content of the signal.\n */\n public submitSignal(type: string, content: any) {\n this.verifyNotClosed();\n const envelope = this.createNewSignalEnvelope(undefined /* address */, type, content);\n return this.context.submitSignalFn(envelope);\n }\n\n public submitDataStoreSignal(address: string, type: string, content: any) {\n const envelope = this.createNewSignalEnvelope(address, type, content);\n return this.context.submitSignalFn(envelope);\n }\n\n public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n if (attachState === AttachState.Attaching) {\n assert(this.attachState === AttachState.Attaching,\n 0x12d /* \"Container Context should already be in attaching state\" */);\n } else {\n assert(this.attachState === AttachState.Attached,\n 0x12e /* \"Container Context should already be in attached state\" */);\n this.emit(\"attached\");\n }\n\n if (attachState === AttachState.Attached && !this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n this.dataStores.setAttachState(attachState);\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n * @param telemetryContext - summary data passed through the layers for telemetry purposes\n */\n public createSummary(blobRedirectTable?: Map<string, string>, telemetryContext?: ITelemetryContext): ISummaryTree {\n if (blobRedirectTable) {\n this.blobManager.setRedirectTable(blobRedirectTable);\n }\n\n const summarizeResult = this.dataStores.createSummary(telemetryContext);\n // Wrap data store summaries in .channels subtree.\n wrapSummaryInChannelsTree(summarizeResult);\n\n this.addContainerStateToSummary(\n summarizeResult,\n true /* fullTree */,\n false /* trackState */,\n telemetryContext,\n );\n return summarizeResult.summary;\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.context.getAbsoluteUrl === undefined) {\n throw new Error(\"Driver does not implement getAbsoluteUrl\");\n }\n if (this.attachState !== AttachState.Attached) {\n return undefined;\n }\n return this.context.getAbsoluteUrl(relativeUrl);\n }\n\n private async summarizeInternal(\n fullTree: boolean,\n trackState: boolean,\n telemetryContext?: ITelemetryContext,\n ): Promise<ISummarizeInternalResult> {\n const summarizeResult = await this.dataStores.summarize(fullTree, trackState, telemetryContext);\n\n // Wrap data store summaries in .channels subtree.\n wrapSummaryInChannelsTree(summarizeResult);\n const pathPartsForChildren = [channelsTreeName];\n\n this.addContainerStateToSummary(summarizeResult, fullTree, trackState, telemetryContext);\n return {\n ...summarizeResult,\n id: \"\",\n pathPartsForChildren,\n };\n }\n\n /**\n * Returns a summary of the runtime at the current sequence number.\n */\n public async summarize(options: {\n /** True to generate the full tree with no handle reuse optimizations; defaults to false */\n fullTree?: boolean;\n /** True to track the state for this summary in the SummarizerNodes; defaults to true */\n trackState?: boolean;\n /** Logger to use for correlated summary events */\n summaryLogger?: ITelemetryLogger;\n /** True to run garbage collection before summarizing; defaults to true */\n runGC?: boolean;\n /** True to generate full GC data */\n fullGC?: boolean;\n /** True to run GC sweep phase after the mark phase */\n runSweep?: boolean;\n }): Promise<IRootSummaryTreeWithStats> {\n this.verifyNotClosed();\n\n const {\n fullTree = false,\n trackState = true,\n summaryLogger = this.mc.logger,\n runGC = this.garbageCollector.shouldRunGC,\n runSweep,\n fullGC,\n } = options;\n\n let gcStats: IGCStats | undefined;\n if (runGC) {\n gcStats = await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });\n }\n\n const telemetryContext = new TelemetryContext();\n const { stats, summary } = await this.summarizerNode.summarize(fullTree, trackState, telemetryContext);\n\n this.logger.sendTelemetryEvent({ eventName: \"SummarizeTelemetry\", details: telemetryContext.serialize() });\n\n assert(summary.type === SummaryType.Tree,\n 0x12f /* \"Container Runtime's summarize should always return a tree\" */);\n\n return { stats, summary, gcStats };\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::updateStateBeforeGC.\n * Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify\n * the garbage collector of references detected since the last GC run. Most references are notified immediately\n * but there can be some for which async operation is required (such as detecting new root data stores).\n */\n public async updateStateBeforeGC() {\n return this.dataStores.updateStateBeforeGC();\n }\n\n private async getGCDataInternal(fullGC?: boolean): Promise<IGarbageCollectionData> {\n return this.dataStores.getGCData(fullGC);\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::getGCData.\n * Generates and returns the GC data for this container.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC?: boolean): Promise<IGarbageCollectionData> {\n const builder = new GCDataBuilder();\n const dsGCData = await this.summarizerNode.getGCData(fullGC);\n builder.addNodes(dsGCData.gcNodes);\n\n const blobsGCData = this.blobManager.getGCData(fullGC);\n builder.addNodes(blobsGCData.gcNodes);\n return builder.getGCData();\n }\n\n /**\n * Implementation of IGarbageCollectionRuntime::updateUsedRoutes.\n * After GC has run, called to notify this container's nodes of routes that are used in it.\n * @param usedRoutes - The routes that are used in all nodes in this Container.\n */\n public updateUsedRoutes(usedRoutes: string[]) {\n // Update our summarizer node's used routes. Updating used routes in summarizer node before\n // summarizing is required and asserted by the the summarizer node. We are the root and are\n // always referenced, so the used routes is only self-route (empty string).\n this.summarizerNode.updateUsedRoutes([\"\"]);\n\n const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(usedRoutes);\n this.dataStores.updateUsedRoutes(dataStoreRoutes);\n }\n\n /**\n * This is called to update objects whose routes are unused.\n * @param unusedRoutes - Data store and attachment blob routes that are unused in this Container.\n */\n public updateUnusedRoutes(unusedRoutes: string[]) {\n const { blobManagerRoutes, dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(unusedRoutes);\n this.blobManager.updateUnusedRoutes(blobManagerRoutes);\n this.dataStores.updateUnusedRoutes(dataStoreRoutes);\n }\n\n /**\n * This is called to update objects that are tombstones.\n * @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.\n */\n public updateTombstonedRoutes(tombstonedRoutes: string[]) {\n const { blobManagerRoutes, dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);\n this.blobManager.updateTombstonedRoutes(blobManagerRoutes);\n this.dataStores.updateTombstonedRoutes(dataStoreRoutes);\n }\n\n /**\n * Returns a server generated referenced timestamp to be used to track unreferenced nodes by GC.\n */\n public getCurrentReferenceTimestampMs(): number | undefined {\n // Use the timestamp of the last message seen by this client as that is server generated. If no messages have\n // been processed, use the timestamp of the message from the last summary.\n return this.deltaManager.lastMessage?.timestamp ?? this.messageAtLastSummary?.timestamp;\n }\n\n /**\n * Returns the type of the GC node. Currently, there are nodes that belong to the root (\"/\"), data stores or\n * blob manager.\n */\n public getNodeType(nodePath: string): GCNodeType {\n if (this.isBlobPath(nodePath)) {\n return GCNodeType.Blob;\n }\n return this.dataStores.getGCNodeType(nodePath) ?? GCNodeType.Other;\n }\n\n /**\n * Called by GC to retrieve the package path of the node with the given path. The node should belong to a\n * data store or an attachment blob.\n */\n public async getGCNodePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n switch (this.getNodeType(nodePath)) {\n case GCNodeType.Blob:\n return [BlobManager.basePath];\n case GCNodeType.DataStore:\n case GCNodeType.SubDataStore:\n return this.dataStores.getDataStorePackagePath(nodePath);\n default:\n assert(false, 0x2de /* \"Package path requested for unsupported node type.\" */);\n }\n }\n\n /**\n * Returns whether a given path is for attachment blobs that are in the format - \"/BlobManager.basePath/...\".\n */\n private isBlobPath(path: string): boolean {\n const pathParts = path.split(\"/\");\n if (pathParts.length < 2 || pathParts[1] !== BlobManager.basePath) {\n return false;\n }\n return true;\n }\n\n /**\n * From a given list of routes, separate and return routes that belong to blob manager and data stores.\n * @param routes - A list of routes that can belong to data stores or blob manager.\n * @returns - Two route lists - One that contains routes for blob manager and another one that contains routes\n * for data stores.\n */\n private getDataStoreAndBlobManagerRoutes(routes: string[]) {\n const blobManagerRoutes: string[] = [];\n const dataStoreRoutes: string[] = [];\n for (const route of routes) {\n if (this.isBlobPath(route)) {\n blobManagerRoutes.push(route);\n } else {\n dataStoreRoutes.push(route);\n }\n }\n return { blobManagerRoutes, dataStoreRoutes };\n }\n\n /**\n * Runs garbage collection and updates the reference / used state of the nodes in the container.\n * @returns the statistics of the garbage collection run; undefined if GC did not run.\n */\n public async collectGarbage(\n options: {\n /** Logger to use for logging GC events */\n logger?: ITelemetryLogger;\n /** True to run GC sweep phase after the mark phase */\n runSweep?: boolean;\n /** True to generate full GC data */\n fullGC?: boolean;\n },\n ): Promise<IGCStats | undefined> {\n return this.garbageCollector.collectGarbage(options);\n }\n\n /**\n * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n * all references added in the system.\n * @param srcHandle - The handle of the node that added the reference.\n * @param outboundHandle - The handle of the outbound node that is referenced.\n */\n public addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n this.garbageCollector.addedOutboundReference(srcHandle.absolutePath, outboundHandle.absolutePath);\n }\n\n /**\n * Generates the summary tree, uploads it to storage, and then submits the summarize op.\n * This is intended to be called by the summarizer, since it is the implementation of\n * ISummarizerInternalsProvider.submitSummary.\n * It takes care of state management at the container level, including pausing inbound\n * op processing, updating SummarizerNode state tracking, and garbage collection.\n * @param options - options controlling how the summary is generated or submitted\n */\n public async submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult> {\n const { fullTree, refreshLatestAck, summaryLogger } = options;\n // The summary number for this summary. This will be updated during the summary process, so get it now and\n // use it for all events logged during this summary.\n const summaryNumber = this.nextSummaryNumber;\n const summaryNumberLogger = ChildLogger.create(\n summaryLogger,\n undefined,\n {\n all: { summaryNumber },\n },\n );\n\n assert(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);\n\n let latestSnapshotVersionId: string | undefined;\n if (refreshLatestAck) {\n const latestSnapshotInfo = await this.refreshLatestSummaryAckFromServer(\n ChildLogger.create(summaryNumberLogger, undefined, { all: { safeSummary: true } }));\n const latestSnapshotRefSeq = latestSnapshotInfo.latestSnapshotRefSeq;\n latestSnapshotVersionId = latestSnapshotInfo.latestSnapshotVersionId;\n\n // We might need to catch up to the latest summary's reference sequence number before pausing.\n await this.waitForDeltaManagerToCatchup(latestSnapshotRefSeq,\n summaryNumberLogger);\n }\n\n try {\n await this.deltaManager.inbound.pause();\n\n const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;\n const minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;\n const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;\n const lastAck = this.summaryCollection.latestAck;\n\n this.summarizerNode.startSummary(summaryRefSeqNum, summaryNumberLogger);\n\n // Helper function to check whether we should still continue between each async step.\n const checkContinue = (): { continue: true; } | { continue: false; error: string; } => {\n // Do not check for loss of connectivity directly! Instead leave it up to\n // RunWhileConnectedCoordinator to control policy in a single place.\n // This will allow easier change of design if we chose to. For example, we may chose to allow\n // summarizer to reconnect in the future.\n // Also checking for cancellation is a must as summary process may be abandoned for other reasons,\n // like loss of connectivity for main (interactive) client.\n if (options.cancellationToken.cancelled) {\n return { continue: false, error: \"disconnected\" };\n }\n // That said, we rely on submitSystemMessage() that today only works in connected state.\n // So if we fail here, it either means that RunWhileConnectedCoordinator does not work correctly,\n // OR that design changed and we need to remove this check and fix submitSystemMessage.\n assert(this.connected, 0x258 /* \"connected\" */);\n\n // Ensure that lastSequenceNumber has not changed after pausing.\n // We need the summary op's reference sequence number to match our summary sequence number,\n // otherwise we'll get the wrong sequence number stamped on the summary's .protocol attributes.\n if (this.deltaManager.lastSequenceNumber !== summaryRefSeqNum) {\n return {\n continue: false,\n error: `lastSequenceNumber changed before uploading to storage. ${this.deltaManager.lastSequenceNumber} !== ${summaryRefSeqNum}`,\n };\n }\n assert(summaryRefSeqNum === this.deltaManager.lastMessage?.sequenceNumber,\n 0x395 /* it's one and the same thing */);\n\n if (lastAck !== this.summaryCollection.latestAck) {\n return {\n continue: false,\n error: `Last summary changed while summarizing. ${this.summaryCollection.latestAck} !== ${lastAck}`,\n };\n }\n return { continue: true };\n };\n\n let continueResult = checkContinue();\n if (!continueResult.continue) {\n return {\n stage: \"base\",\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n error: continueResult.error,\n };\n }\n\n const trace = Trace.start();\n let summarizeResult: IRootSummaryTreeWithStats;\n // If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced\n // state of all the nodes.\n const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;\n try {\n summarizeResult = await this.summarize({\n fullTree: fullTree ?? forcedFullTree,\n trackState: true,\n summaryLogger: summaryNumberLogger,\n runGC: this.garbageCollector.shouldRunGC,\n });\n } catch (error) {\n return {\n stage: \"base\",\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n error,\n };\n }\n const { summary: summaryTree, stats: partialStats } = summarizeResult;\n\n // Now that we have generated the summary, update the message at last summary to the last message processed.\n this.messageAtLastSummary = this.deltaManager.lastMessage;\n\n // Counting dataStores and handles\n // Because handles are unchanged dataStores in the current logic,\n // summarized dataStore count is total dataStore count minus handle count\n const dataStoreTree = summaryTree.tree[channelsTreeName];\n\n assert(dataStoreTree.type === SummaryType.Tree, 0x1fc /* \"summary is not a tree\" */);\n const handleCount = Object.values(dataStoreTree.tree).filter(\n (value) => value.type === SummaryType.Handle).length;\n const gcSummaryTreeStats = summaryTree.tree[gcTreeKey]\n ? calculateStats(summaryTree.tree[gcTreeKey])\n : undefined;\n\n const summaryStats: IGeneratedSummaryStats = {\n dataStoreCount: this.dataStores.size,\n summarizedDataStoreCount: this.dataStores.size - handleCount,\n gcStateUpdatedDataStoreCount: summarizeResult.gcStats?.updatedDataStoreCount,\n gcBlobNodeCount: gcSummaryTreeStats?.blobNodeCount,\n gcTotalBlobsSize: gcSummaryTreeStats?.totalBlobSize,\n summaryNumber,\n ...partialStats,\n };\n const generateSummaryData = {\n referenceSequenceNumber: summaryRefSeqNum,\n minimumSequenceNumber,\n summaryTree,\n summaryStats,\n generateDuration: trace.trace().duration,\n forcedFullTree,\n } as const;\n\n continueResult = checkContinue();\n if (!continueResult.continue) {\n return { stage: \"generate\", ...generateSummaryData, error: continueResult.error };\n }\n\n // It may happen that the lastAck it not correct due to missing summaryAck in case of single commit\n // summary. So if the previous summarizer closes just after submitting the summary and before\n // submitting the summaryOp then we can't rely on summaryAck. So in case we have\n // latestSnapshotVersionId from storage and it does not match with the lastAck ackHandle, then use\n // the one fetched from storage as parent as that is the latest.\n let summaryContext: ISummaryContext;\n if (lastAck?.summaryAck.contents.handle !== latestSnapshotVersionId\n && latestSnapshotVersionId !== undefined) {\n summaryContext = {\n proposalHandle: undefined,\n ackHandle: latestSnapshotVersionId,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n } else if (lastAck === undefined) {\n summaryContext = {\n proposalHandle: undefined,\n ackHandle: this.context.getLoadedFromVersion()?.id,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n } else {\n summaryContext = {\n proposalHandle: lastAck.summaryOp.contents.handle,\n ackHandle: lastAck.summaryAck.contents.handle,\n referenceSequenceNumber: summaryRefSeqNum,\n };\n }\n\n let handle: string;\n try {\n handle = await this.storage.uploadSummaryWithContext(summarizeResult.summary, summaryContext);\n } catch (error) {\n return { stage: \"generate\", ...generateSummaryData, error };\n }\n\n const parent = summaryContext.ackHandle;\n const summaryMessage: ISummaryContent = {\n handle,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n head: parent!,\n message,\n parents: parent ? [parent] : [],\n };\n const uploadData = {\n ...generateSummaryData,\n handle,\n uploadDuration: trace.trace().duration,\n } as const;\n\n continueResult = checkContinue();\n if (!continueResult.continue) {\n return { stage: \"upload\", ...uploadData, error: continueResult.error };\n }\n\n let clientSequenceNumber: number;\n try {\n clientSequenceNumber = this.submitSummaryMessage(summaryMessage);\n } catch (error) {\n return { stage: \"upload\", ...uploadData, error };\n }\n\n const submitData = {\n stage: \"submit\",\n ...uploadData,\n clientSequenceNumber,\n submitOpDuration: trace.trace().duration,\n } as const;\n\n this.summarizerNode.completeSummary(handle);\n return submitData;\n } finally {\n // Cleanup wip summary in case of failure\n this.summarizerNode.clearSummary();\n // Restart the delta manager\n this.deltaManager.inbound.resume();\n }\n }\n\n private hasPendingMessages() {\n return this.pendingStateManager.hasPendingMessages() || !this.outbox.isEmpty;\n }\n\n private updateDocumentDirtyState(dirty: boolean) {\n if (this.attachState !== AttachState.Attached) {\n assert(dirty, 0x3d2 /* Non-attached container is dirty */);\n } else {\n // Other way is not true = see this.isContainerMessageDirtyable()\n assert(!dirty || this.hasPendingMessages(),\n 0x3d3 /* if doc is dirty, there has to be pending ops */);\n }\n\n if (this.dirtyContainer === dirty) {\n return;\n }\n\n this.dirtyContainer = dirty;\n if (this.emitDirtyDocumentEvent) {\n this.emit(dirty ? \"dirty\" : \"saved\");\n this.context.updateDirtyContainerState(dirty);\n }\n }\n\n public submitDataStoreOp(\n id: string,\n contents: any,\n localOpMetadata: unknown = undefined): void {\n const envelope: IEnvelope = {\n address: id,\n contents,\n };\n this.submit(ContainerMessageType.FluidDataStoreOp, envelope, localOpMetadata);\n }\n\n public submitDataStoreAliasOp(contents: any, localOpMetadata: unknown): void {\n const aliasMessage = contents as IDataStoreAliasMessage;\n if (!isDataStoreAliasMessage(aliasMessage)) {\n throw new UsageError(\"malformedDataStoreAliasMessage\");\n }\n\n this.submit(ContainerMessageType.Alias, contents, localOpMetadata);\n }\n\n public async uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {\n this.verifyNotClosed();\n return this.blobManager.createBlob(blob);\n }\n\n private submit(\n type: ContainerMessageType,\n contents: any,\n localOpMetadata: unknown = undefined,\n metadata: Record<string, unknown> | undefined = undefined,\n ): void {\n this.verifyNotClosed();\n this.verifyCanSubmitOps();\n\n // There should be no ops in detached container state!\n assert(this.attachState !== AttachState.Detached, 0x132 /* \"sending ops in detached container\" */);\n\n const deserializedContent: ContainerRuntimeMessage = { type, contents };\n const serializedContent = JSON.stringify(deserializedContent);\n\n if (this.deltaManager.readOnlyInfo.readonly) {\n this.logger.sendTelemetryEvent({ eventName: \"SubmitOpInReadonly\", connected: this.connected });\n }\n\n const message: BatchMessage = {\n contents: serializedContent,\n deserializedContent,\n metadata,\n localOpMetadata,\n referenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n };\n\n try {\n // If this is attach message for new data store, and we are in a batch, send this op out of order\n // Is it safe:\n // Yes, this should be safe reordering. Newly created data stores are not visible through API surface.\n // They become visible only when aliased, or handle to some sub-element of newly created datastore\n // is stored in some DDS, i.e. only after some other op.\n // Why:\n // Attach ops are large, and expensive to process. Plus there are scenarios where a lot of new data\n // stores are created, causing issues like relay service throttling (too many ops) and catastrophic\n // failure (batch is too large). Pushing them earlier and outside of main batch should alleviate\n // these issues.\n // Cons:\n // 1. With large batches, relay service may throttle clients. Clients may disconnect while throttled.\n // This change creates new possibility of a lot of newly created data stores never being referenced\n // because client died before it had a change to submit the rest of the ops. This will create more\n // garbage that needs to be collected leveraging GC (Garbage Collection) feature.\n // 2. Sending ops out of order means they are excluded from rollback functionality. This is not an issue\n // today as rollback can't undo creation of data store. To some extent not sending them is a bigger\n // issue than sending.\n // Please note that this does not change file format, so it can be disabled in the future if this\n // optimization no longer makes sense (for example, batch compression may make it less appealing).\n if (this.currentlyBatching() && type === ContainerMessageType.Attach &&\n this.mc.config.getBoolean(\"Fluid.ContainerRuntime.disableAttachOpReorder\") !== true) {\n this.outbox.submitAttach(message);\n } else {\n this.outbox.submit(message);\n }\n\n if (!this.currentlyBatching()) {\n this.flush();\n } else if (!this.flushMicroTaskExists) {\n this.flushMicroTaskExists = true;\n // Queue a microtask to detect the end of the turn and force a flush.\n Promise.resolve().then(() => {\n this.flushMicroTaskExists = false;\n this.flush();\n }).catch((error) => { this.closeFn(error as GenericError) });\n }\n } catch (error) {\n this.closeFn(error as GenericError);\n throw error;\n }\n\n if (this.isContainerMessageDirtyable(type, contents)) {\n this.updateDocumentDirtyState(true);\n }\n }\n\n private submitSummaryMessage(contents: ISummaryContent) {\n this.verifyNotClosed();\n assert(this.connected, 0x133 /* \"Container disconnected when trying to submit system message\" */);\n\n // System message should not be sent in the middle of the batch.\n assert(this.outbox.isEmpty, 0x3d4 /* System op in the middle of a batch */);\n\n // back-compat: ADO #1385: Make this call unconditional in the future\n return this.context.submitSummaryFn !== undefined\n ? this.context.submitSummaryFn(contents)\n : this.context.submitFn(\n MessageType.Summarize,\n contents,\n false);\n }\n\n /**\n * Throw an error if the runtime is closed. Methods that are expected to potentially\n * be called after dispose due to asynchrony should not call this.\n */\n private verifyNotClosed() {\n if (this._disposed) {\n throw new Error(\"Runtime is closed\");\n }\n }\n\n private verifyCanSubmitOps() {\n if (this.ensureNoDataModelChangesCalls > 0) {\n const errorMessage = \"Op was submitted from within a `ensureNoDataModelChanges` callback\";\n if (this.opReentryCallsToReport > 0) {\n this.mc.logger.sendTelemetryEvent(\n { eventName: \"OpReentry\" },\n // We need to capture the call stack in order to inspect the source of this usage pattern\n new UsageError(errorMessage),\n );\n this.opReentryCallsToReport--;\n }\n\n // Creating ops while processing ops can lead\n // to undefined behavior and events observed in the wrong order.\n // For example, we have two callbacks registered for a DDS, A and B.\n // Then if on change #1 callback A creates change #2, the invocation flow will be:\n //\n // A because of #1\n // A because of #2\n // B because of #2\n // B because of #1\n //\n // The runtime must enforce op coherence by not allowing ops to be submitted\n // while ops are being processed.\n if (this.enableOpReentryCheck) {\n throw new UsageError(errorMessage);\n }\n }\n }\n\n /**\n * Finds the right store and asks it to resubmit the message. This typically happens when we\n * reconnect and there are pending messages.\n * @param content - The content of the original message.\n * @param localOpMetadata - The local metadata associated with the original message.\n */\n private reSubmit(\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n // For Operations, call resubmitDataStoreOp which will find the right store\n // and trigger resubmission on it.\n this.dataStores.resubmitDataStoreOp(content, localOpMetadata);\n break;\n case ContainerMessageType.Attach:\n case ContainerMessageType.Alias:\n this.submit(type, content, localOpMetadata);\n break;\n case ContainerMessageType.ChunkedOp:\n throw new Error(`chunkedOp not expected here`);\n case ContainerMessageType.BlobAttach:\n this.blobManager.reSubmit(opMetadata);\n break;\n case ContainerMessageType.Rejoin:\n this.submit(type, content);\n break;\n default:\n unreachableCase(type, `Unknown ContainerMessageType: ${type}`);\n }\n }\n\n private rollback(\n type: ContainerMessageType,\n content: any,\n localOpMetadata: unknown,\n ) {\n switch (type) {\n case ContainerMessageType.FluidDataStoreOp:\n // For operations, call rollbackDataStoreOp which will find the right store\n // and trigger rollback on it.\n this.dataStores.rollbackDataStoreOp(content, localOpMetadata);\n break;\n default:\n throw new Error(`Can't rollback ${type}`);\n }\n }\n\n private async waitForDeltaManagerToCatchup(\n latestSnapshotRefSeq: number,\n summaryLogger: ITelemetryLogger,\n ): Promise<void> {\n if (latestSnapshotRefSeq > this.deltaManager.lastSequenceNumber) {\n // We need to catch up to the latest summary's reference sequence number before proceeding.\n await PerformanceEvent.timedExecAsync(\n summaryLogger,\n {\n eventName: \"WaitingForSeq\",\n lastSequenceNumber: this.deltaManager.lastSequenceNumber,\n targetSequenceNumber: latestSnapshotRefSeq,\n lastKnownSeqNumber: this.deltaManager.lastKnownSeqNumber,\n },\n async () => waitForSeq(this.deltaManager, latestSnapshotRefSeq),\n { start: true, end: true, cancel: \"error\" }, // definitely want start event\n );\n }\n }\n\n /** Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck */\n public async refreshLatestSummaryAck(options: IRefreshSummaryAckOptions) {\n const { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;\n const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n // The call to fetch the snapshot is very expensive and not always needed.\n // It should only be done by the summarizerNode, if required.\n // When fetching from storage we will always get the latest version and do not use the ackHandle.\n const snapshotTreeFetcher = async () => {\n const fetchResult = await this.fetchLatestSnapshotFromStorage(\n summaryLogger,\n {\n eventName: \"RefreshLatestSummaryGetSnapshot\",\n ackHandle,\n summaryRefSeq,\n fetchLatest: true,\n },\n );\n\n const latestSnapshotRefSeq = await seqFromTree(fetchResult.snapshotTree, readAndParseBlob);\n /**\n * If the fetched snapshot is older than the one for which the ack was received, close the container.\n * This should never happen because an ack should be sent after the latest summary is updated in the server.\n * However, there are couple of scenarios where it's possible:\n * 1. A file was modified externally resulting in modifying the snapshot's sequence number. This can lead to\n * the document being unusable and we should not proceed.\n * 2. The server DB failed after the ack was sent which may delete the corresponding snapshot. Ideally, in\n * such cases, the file will be rolled back along with the ack and we will eventually reach a consistent\n * state.\n */\n if (latestSnapshotRefSeq < summaryRefSeq) {\n const error = DataProcessingError.create(\n \"Fetched snapshot is older than the received ack\",\n \"RefreshLatestSummaryAck\",\n undefined /* sequencedMessage */,\n {\n ackHandle,\n summaryRefSeq,\n latestSnapshotRefSeq,\n },\n );\n this.closeFn(error);\n throw error;\n }\n\n summaryLogger.sendTelemetryEvent(\n {\n eventName: \"LatestSummaryRetrieved\",\n ackHandle,\n lastSequenceNumber: latestSnapshotRefSeq,\n targetSequenceNumber: summaryRefSeq,\n });\n\n // In case we had to retrieve the latest snapshot and it is different than summaryRefSeq,\n // wait for the delta manager to catch up before refreshing the latest Summary.\n await this.waitForDeltaManagerToCatchup(latestSnapshotRefSeq,\n summaryLogger);\n\n return fetchResult.snapshotTree;\n };\n\n const result = await this.summarizerNode.refreshLatestSummary(\n proposalHandle,\n summaryRefSeq,\n snapshotTreeFetcher,\n readAndParseBlob,\n summaryLogger,\n );\n\n // Notify the garbage collector so it can update its latest summary state.\n await this.garbageCollector.refreshLatestSummary(\n result,\n proposalHandle,\n summaryRefSeq,\n readAndParseBlob,\n );\n }\n\n /**\n * Fetches the latest snapshot from storage and uses it to refresh SummarizerNode's\n * internal state as it should be considered the latest summary ack.\n * @param summaryLogger - logger to use when fetching snapshot from storage\n * @returns downloaded snapshot's reference sequence number\n */\n private async refreshLatestSummaryAckFromServer(\n summaryLogger: ITelemetryLogger,\n ): Promise<{ latestSnapshotRefSeq: number; latestSnapshotVersionId: string | undefined; }> {\n const { snapshotTree, versionId } = await this.fetchLatestSnapshotFromStorage(\n summaryLogger,\n {\n eventName: \"RefreshLatestSummaryGetSnapshot\",\n fetchLatest: true,\n },\n );\n\n const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);\n const latestSnapshotRefSeq = await seqFromTree(snapshotTree, readAndParseBlob);\n\n const result = await this.summarizerNode.refreshLatestSummary(\n undefined,\n latestSnapshotRefSeq,\n async () => snapshotTree,\n readAndParseBlob,\n summaryLogger,\n );\n\n // Notify the garbage collector so it can update its latest summary state.\n await this.garbageCollector.refreshLatestSummary(\n result,\n undefined,\n latestSnapshotRefSeq,\n readAndParseBlob,\n )\n\n return { latestSnapshotRefSeq, latestSnapshotVersionId: versionId };\n }\n\n private async fetchLatestSnapshotFromStorage(\n logger: ITelemetryLogger,\n event: ITelemetryGenericEvent,\n ): Promise<{ snapshotTree: ISnapshotTree; versionId: string; }> {\n return PerformanceEvent.timedExecAsync(\n logger, event, async (perfEvent: {\n end: (arg0: {\n getVersionDuration?: number | undefined;\n getSnapshotDuration?: number | undefined;\n }) => void;\n }) => {\n const stats: { getVersionDuration?: number; getSnapshotDuration?: number; } = {};\n const trace = Trace.start();\n\n const versions = await this.storage.getVersions(\n null, 1, \"refreshLatestSummaryAckFromServer\", FetchSource.noCache);\n assert(!!versions && !!versions[0], 0x137 /* \"Failed to get version from storage\" */);\n stats.getVersionDuration = trace.trace().duration;\n\n const maybeSnapshot = await this.storage.getSnapshotTree(versions[0]);\n assert(!!maybeSnapshot, 0x138 /* \"Failed to get snapshot from storage\" */);\n stats.getSnapshotDuration = trace.trace().duration;\n\n perfEvent.end(stats);\n return { snapshotTree: maybeSnapshot, versionId: versions[0].id };\n });\n }\n\n public notifyAttaching(snapshot: ISnapshotTreeWithBlobContents) {\n if (this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) {\n this.baseSnapshotBlobs = SerializedSnapshotStorage.serializeTreeWithBlobContents(snapshot);\n }\n }\n\n private async initializeBaseSnapshotBlobs(): Promise<void> {\n if (!(this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad) ||\n this.attachState !== AttachState.Attached || this.context.pendingLocalState) {\n return;\n }\n assert(!!this.context.baseSnapshot, 0x2e5 /* \"Must have a base snapshot\" */);\n this.baseSnapshotBlobs = await SerializedSnapshotStorage.serializeTree(this.context.baseSnapshot, this.storage);\n }\n\n public getPendingLocalState(): unknown {\n if (!(this.mc.config.getBoolean(\"enableOfflineLoad\") ?? this.runtimeOptions.enableOfflineLoad)) {\n throw new UsageError(\"can't get state when offline load disabled\");\n }\n\n if (this._orderSequentiallyCalls !== 0) {\n throw new UsageError(\"can't get state during orderSequentially\");\n }\n // Flush pending batch.\n // getPendingLocalState() is only exposed through Container.closeAndGetPendingLocalState(), so it's safe\n // to close current batch.\n this.flush();\n\n const previousPendingState = this.context.pendingLocalState as IPendingRuntimeState | undefined;\n if (previousPendingState) {\n return {\n pending: this.pendingStateManager.getLocalState(),\n pendingAttachmentBlobs: this.blobManager.getPendingBlobs(),\n snapshotBlobs: previousPendingState.snapshotBlobs,\n baseSnapshot: previousPendingState.baseSnapshot,\n savedOps: this.savedOps,\n };\n }\n assert(!!this.context.baseSnapshot, 0x2e6 /* \"Must have a base snapshot\" */);\n assert(!!this.baseSnapshotBlobs, 0x2e7 /* \"Must serialize base snapshot blobs before getting runtime state\" */);\n return {\n pending: this.pendingStateManager.getLocalState(),\n pendingAttachmentBlobs: this.blobManager.getPendingBlobs(),\n snapshotBlobs: this.baseSnapshotBlobs,\n baseSnapshot: this.context.baseSnapshot,\n savedOps: this.savedOps,\n };\n }\n\n public readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = (...args) => {\n if (this.clientDetails.type === summarizerClientType) {\n return this.summarizer.summarizeOnDemand(...args);\n } else if (this.summaryManager !== undefined) {\n return this.summaryManager.summarizeOnDemand(...args);\n } else {\n // If we're not the summarizer, and we don't have a summaryManager, we expect that\n // disableSummaries is turned on. We are throwing instead of returning a failure here,\n // because it is a misuse of the API rather than an expected failure.\n throw new UsageError(\n `Can't summarize, disableSummaries: ${this.summariesDisabled}`,\n );\n }\n };\n\n public readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = (...args) => {\n if (this.clientDetails.type === summarizerClientType) {\n return this.summarizer.enqueueSummarize(...args);\n } else if (this.summaryManager !== undefined) {\n return this.summaryManager.enqueueSummarize(...args);\n } else {\n // If we're not the summarizer, and we don't have a summaryManager, we expect that\n // generateSummaries is turned off. We are throwing instead of returning a failure here,\n // because it is a misuse of the API rather than an expected failure.\n throw new UsageError(\n `Can't summarize, disableSummaries: ${this.summariesDisabled}`,\n );\n }\n };\n\n /**\n * * Forms a function that will request a Summarizer.\n * @param loaderRouter - the loader acting as an IFluidRouter\n * */\n private formRequestSummarizerFn(loaderRouter: IFluidRouter) {\n return async () => {\n const request: IRequest = {\n headers: {\n [LoaderHeader.cache]: false,\n [LoaderHeader.clientDetails]: {\n capabilities: { interactive: false },\n type: summarizerClientType,\n },\n [DriverHeader.summarizingClient]: true,\n [LoaderHeader.reconnect]: false,\n },\n url: \"/_summarizer\",\n };\n\n const fluidObject = await requestFluidObject<FluidObject<ISummarizer>>(loaderRouter, request);\n const summarizer = fluidObject.ISummarizer;\n\n if (!summarizer) {\n throw new UsageError(\"Fluid object does not implement ISummarizer\");\n }\n\n return summarizer;\n };\n }\n\n private async processSavedOps(state: IPendingRuntimeState) {\n for (const op of state.savedOps) {\n this.process(op, false);\n await this.pendingStateManager.applyStashedOpsAt(op.sequenceNumber);\n }\n // we may not have seen every sequence number (because of system ops) so apply everything once we\n // don't have any more saved ops\n await this.pendingStateManager.applyStashedOpsAt();\n\n // If it's not the case, we should take it into account when calculating dirty state.\n assert(this.context.attachState === AttachState.Attached,\n 0x3d5 /* this function is called for attached containers only */);\n if (!this.hasPendingMessages()) {\n this.updateDocumentDirtyState(false);\n }\n }\n\n private validateSummaryHeuristicConfiguration(configuration: ISummaryConfigurationHeuristics) {\n // eslint-disable-next-line no-restricted-syntax\n for (const prop in configuration) {\n if (typeof configuration[prop] === \"number\" && configuration[prop] < 0) {\n throw new UsageError(`Summary heuristic configuration property \"${prop}\" cannot be less than 0`);\n }\n }\n if (configuration.minIdleTime > configuration.maxIdleTime) {\n throw new UsageError(`\"minIdleTime\" [${configuration.minIdleTime}] cannot be greater than \"maxIdleTime\" [${configuration.maxIdleTime}]`);\n }\n }\n}\n\n/**\n * Wait for a specific sequence number. Promise should resolve when we reach that number,\n * or reject if closed.\n */\nconst waitForSeq = async (\n deltaManager: IDeltaManager<Pick<ISequencedDocumentMessage, \"sequenceNumber\">, unknown>,\n targetSeq: number,\n): Promise<void> => new Promise<void>((resolve, reject) => {\n // TODO: remove cast to any when actual event is determined\n deltaManager.on(\"closed\" as any, reject);\n deltaManager.on(\"disposed\" as any, reject);\n\n // If we already reached target sequence number, simply resolve the promise.\n if (deltaManager.lastSequenceNumber >= targetSeq) {\n resolve();\n } else {\n const handleOp = (message: Pick<ISequencedDocumentMessage, \"sequenceNumber\">) => {\n if (message.sequenceNumber >= targetSeq) {\n resolve();\n deltaManager.off(\"op\", handleOp);\n }\n };\n deltaManager.on(\"op\", handleOp);\n }\n});\n"]}
|