@fluidframework/container-loader 0.54.1 → 0.55.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/.eslintrc.js +1 -1
- package/dist/container.d.ts +3 -2
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +43 -38
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +5 -1
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +8 -3
- package/dist/containerContext.js.map +1 -1
- package/dist/loader.d.ts +3 -3
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.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/lib/container.d.ts +3 -2
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +44 -39
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +5 -1
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +8 -3
- package/lib/containerContext.js.map +1 -1
- package/lib/loader.d.ts +3 -3
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.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/package.json +16 -15
- package/src/container.ts +55 -41
- package/src/containerContext.ts +11 -3
- package/src/loader.ts +3 -3
- package/src/packageVersion.ts +1 -1
package/lib/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// eslint-disable-next-line import/no-internal-modules\nimport merge from \"lodash/merge\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n ITelemetryLogger,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n IRequest,\n IResponse,\n IFluidRouter,\n IFluidCodeDetails,\n isFluidCodeDetails,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IConnectionDetails,\n IContainer,\n IContainerEvents,\n IDeltaManager,\n ICriticalContainerError,\n ContainerWarning,\n AttachState,\n IThrottlingWarning,\n IPendingLocalState,\n ReadOnlyInfo,\n IContainerLoadMode,\n} from \"@fluidframework/container-definitions\";\nimport {\n DataCorruptionError,\n extractSafePropertiesFromMessage,\n GenericError,\n UsageError,\n } from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport {\n readAndParse,\n OnlineStatus,\n isOnline,\n ensureFluidResolvedUrl,\n combineAppAndProtocolSummary,\n runWithRetry,\n isFluidResolvedUrl,\n} from \"@fluidframework/driver-utils\";\nimport {\n isSystemMessage,\n ProtocolOpHandler,\n} from \"@fluidframework/protocol-base\";\nimport {\n FileMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n ICommittedProposal,\n IDocumentAttributes,\n IDocumentMessage,\n IProcessMessageResult,\n IQuorum,\n ISequencedClient,\n ISequencedDocumentMessage,\n ISequencedProposal,\n ISignalClient,\n ISignalMessage,\n ISnapshotTree,\n ITree,\n ITreeEntry,\n IVersion,\n MessageType,\n TreeEntry,\n ISummaryTree,\n IPendingProposal,\n SummaryType,\n ISummaryContent,\n IQuorumProposals,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ChildLogger,\n EventEmitterWithErrorHandling,\n PerformanceEvent,\n raiseConnectedEvent,\n TelemetryLogger,\n connectedEventName,\n disconnectedEventName,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport { Audience } from \"./audience\";\nimport { ContainerContext } from \"./containerContext\";\nimport { ReconnectMode, IConnectionManagerFactoryArgs } from \"./contracts\";\nimport { DeltaManager, IConnectionArgs } from \"./deltaManager\";\nimport { DeltaManagerProxy } from \"./deltaManagerProxy\";\nimport { ILoaderOptions, Loader, RelativeLoader } from \"./loader\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { ConnectionStateHandler, ILocalSequencedClient } from \"./connectionStateHandler\";\nimport { RetriableDocumentStorageService } from \"./retriableDocumentStorageService\";\nimport { ProtocolTreeStorageService } from \"./protocolTreeDocumentStorageService\";\nimport { BlobOnlyStorage, ContainerStorageAdapter } from \"./containerStorageAdapter\";\nimport { getSnapshotTreeFromSerializedContainer } from \"./utils\";\nimport { QuorumProxy } from \"./quorum\";\nimport { CollabWindowTracker } from \"./collabWindowTracker\";\nimport { ConnectionManager } from \"./connectionManager\";\n\nconst detachedContainerRefSeqNumber = 0;\n\nconst dirtyContainerEvent = \"dirty\";\nconst savedContainerEvent = \"saved\";\n\nexport interface IContainerLoadOptions {\n /**\n * Disables the Container from reconnecting if false, allows reconnect otherwise.\n */\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n resolvedUrl: IFluidResolvedUrl;\n /**\n * Control which snapshot version to load from. See IParsedUrl for detailed information.\n */\n version: string | undefined;\n /**\n * Loads the Container in paused state if true, unpaused otherwise.\n */\n loadMode?: IContainerLoadMode;\n}\n\nexport interface IContainerConfig {\n resolvedUrl?: IFluidResolvedUrl;\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n}\n\nexport enum ConnectionState {\n /**\n * The document is no longer connected to the delta server\n */\n Disconnected,\n\n /**\n * The document has an inbound connection but is still pending for outbound deltas\n */\n Connecting,\n\n /**\n * The document is fully connected\n */\n Connected,\n}\n\n/**\n * Waits until container connects to delta storage and gets up-to-date\n * Useful when resolving URIs and hitting 404, due to container being loaded from (stale) snapshot and not being\n * up to date. Host may chose to wait in such case and retry resolving URI.\n * Warning: Will wait infinitely for connection to establish if there is no connection.\n * May result in deadlock if Container.setAutoReconnect(false) is called and never switched back to auto-reconnect.\n * @returns true: container is up to date, it processed all the ops that were know at the time of first connection\n * false: storage does not provide indication of how far the client is. Container processed\n * all the ops known to it, but it maybe still behind.\n */\nexport async function waitContainerToCatchUp(container: IContainer) {\n // Make sure we stop waiting if container is closed.\n if (container.closed) {\n throw new Error(\"Container is closed\");\n }\n\n return new Promise<boolean>((resolve, reject) => {\n const deltaManager = container.deltaManager;\n\n container.on(\"closed\", reject);\n\n const waitForOps = () => {\n assert(container.connectionState !== ConnectionState.Disconnected,\n 0x0cd /* \"Container disconnected while waiting for ops!\" */);\n const hasCheckpointSequenceNumber = deltaManager.hasCheckpointSequenceNumber;\n\n const connectionOpSeqNumber = deltaManager.lastKnownSeqNumber;\n assert(deltaManager.lastSequenceNumber <= connectionOpSeqNumber,\n 0x266 /* \"lastKnownSeqNumber should never be below last processed sequence number\" */);\n if (deltaManager.lastSequenceNumber === connectionOpSeqNumber) {\n resolve(hasCheckpointSequenceNumber);\n return;\n }\n const callbackOps = (message: ISequencedDocumentMessage) => {\n if (connectionOpSeqNumber <= message.sequenceNumber) {\n resolve(hasCheckpointSequenceNumber);\n deltaManager.off(\"op\", callbackOps);\n }\n };\n deltaManager.on(\"op\", callbackOps);\n };\n\n // We can leverage DeltaManager's \"connect\" event here and test for ConnectionState.Disconnected\n // But that works only if service provides us checkPointSequenceNumber\n // Our internal testing is based on R11S that does not, but almost all tests connect as \"write\" and\n // use this function to catch up, so leveraging our own join op as a fence/barrier\n if (container.connectionState === ConnectionState.Connected) {\n waitForOps();\n return;\n }\n\n const callback = () => {\n container.off(connectedEventName, callback);\n waitForOps();\n };\n container.on(connectedEventName, callback);\n\n // TODO: Remove null check after next release #8523\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n container.resume!();\n });\n}\n\nconst getCodeProposal =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (quorum: IQuorumProposals) => quorum.get(\"code\") ?? quorum.get(\"code2\");\n\nexport class Container extends EventEmitterWithErrorHandling<IContainerEvents> implements IContainer {\n public static version = \"^0.1.0\";\n\n /**\n * Load an existing container.\n */\n public static async load(\n loader: Loader,\n loadOptions: IContainerLoadOptions,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {\n clientDetailsOverride: loadOptions.clientDetailsOverride,\n resolvedUrl: loadOptions.resolvedUrl,\n canReconnect: loadOptions.canReconnect,\n });\n\n return PerformanceEvent.timedExecAsync(\n container.logger,\n { eventName: \"Load\" },\n async (event) => new Promise<Container>((res, rej) => {\n container._lifecycleState = \"loading\";\n const version = loadOptions.version;\n\n // always load unpaused with pending ops!\n // It is also default mode in general.\n const defaultMode: IContainerLoadMode = { opsBeforeReturn: \"cached\" };\n assert(pendingLocalState === undefined || loadOptions.loadMode === undefined,\n 0x1e1 /* \"pending state requires immediate connection!\" */);\n const mode: IContainerLoadMode = loadOptions.loadMode ?? defaultMode;\n\n const onClosed = (err?: ICriticalContainerError) => {\n rej(err ?? new GenericError(\"containerClosedWithoutErrorDuringLoad\"));\n };\n container.on(\"closed\", onClosed);\n\n container.load(version, mode, pendingLocalState)\n .finally(() => {\n container.removeListener(\"closed\", onClosed);\n })\n .then((props) => {\n event.end({ ...props, ...loadOptions.loadMode });\n res(container);\n },\n (error) => {\n const err = normalizeError(error);\n // Depending where error happens, we can be attempting to connect to web socket\n // and continuously retrying (consider offline mode)\n // Host has no container to close, so it's prudent to do it here\n container.close(err);\n onClosed(err);\n });\n }),\n { start: true, end: true, cancel: \"generic\" },\n );\n }\n\n /**\n * Create a new container in a detached state.\n */\n public static async createDetached(\n loader: Loader,\n codeDetails: IFluidCodeDetails,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n\n return PerformanceEvent.timedExecAsync(\n container.logger,\n { eventName: \"CreateDetached\" },\n async (_event) => {\n container._lifecycleState = \"loading\";\n await container.createDetached(codeDetails);\n return container;\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n /**\n * Create a new container in a detached state that is initialized with a\n * snapshot from a previous detached container.\n */\n public static async rehydrateDetachedFromSnapshot(\n loader: Loader,\n snapshot: string,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n return PerformanceEvent.timedExecAsync(\n container.logger,\n { eventName: \"RehydrateDetachedFromSnapshot\" },\n async (_event) => {\n const deserializedSummary = JSON.parse(snapshot) as ISummaryTree;\n container._lifecycleState = \"loading\";\n await container.rehydrateDetachedFromSnapshot(deserializedSummary);\n return container;\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n public subLogger: TelemetryLogger;\n\n // Tells if container can reconnect on losing fist connection\n // If false, container gets closed on loss of connection.\n private readonly _canReconnect: boolean = true;\n\n private readonly logger: ITelemetryLogger;\n\n private _lifecycleState: \"created\" | \"loading\" | \"loaded\" | \"closing\" | \"closed\" = \"created\";\n\n private get loaded(): boolean {\n return (this._lifecycleState !== \"created\" && this._lifecycleState !== \"loading\");\n }\n\n private set loaded(t: boolean) {\n assert(t, 0x27d /* \"Setting loaded state to false is not supported\" */);\n assert(this._lifecycleState !== \"created\", 0x27e /* \"Must go through loading state before loaded\" */);\n\n // It's conceivable the container could be closed when this is called\n // Only transition states if currently loading\n if (this._lifecycleState === \"loading\") {\n this._lifecycleState = \"loaded\";\n }\n }\n\n public get closed(): boolean {\n return (this._lifecycleState === \"closing\" || this._lifecycleState === \"closed\");\n }\n\n private _attachState = AttachState.Detached;\n\n private readonly _storage: ContainerStorageAdapter;\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n // Active chaincode and associated runtime\n private _storageService: IDocumentStorageService & IDisposable | undefined;\n private get storageService(): IDocumentStorageService {\n if (this._storageService === undefined) {\n throw new Error(\"Attempted to access storageService before it was defined\");\n }\n return this._storageService;\n }\n\n private readonly clientDetailsOverride: IClientDetails | undefined;\n private readonly _deltaManager: DeltaManager<ConnectionManager>;\n private service: IDocumentService | undefined;\n private readonly _audience: Audience;\n\n private _context: ContainerContext | undefined;\n private get context() {\n if (this._context === undefined) {\n throw new Error(\"Attempted to access context before it was defined\");\n }\n return this._context;\n }\n private _protocolHandler: ProtocolOpHandler | undefined;\n private get protocolHandler() {\n if (this._protocolHandler === undefined) {\n throw new Error(\"Attempted to access protocolHandler before it was defined\");\n }\n return this._protocolHandler;\n }\n\n private resumedOpProcessingAfterLoad = false;\n private firstConnection = true;\n private manualReconnectInProgress = false;\n private readonly connectionTransitionTimes: number[] = [];\n private messageCountAfterDisconnection: number = 0;\n private _loadedFromVersion: IVersion | undefined;\n private _resolvedUrl: IFluidResolvedUrl | undefined;\n private attachStarted = false;\n private _dirtyContainer = false;\n\n private lastVisible: number | undefined;\n private readonly connectionStateHandler: ConnectionStateHandler;\n\n private setAutoReconnectTime = performance.now();\n\n private readonly collabWindowTracker = new CollabWindowTracker(\n (type, contents) => this.submitMessage(type, contents),\n () => this.activeConnection(),\n this.loader.services.options?.noopTimeFrequency,\n this.loader.services.options?.noopCountFrequency,\n );\n\n private get connectionMode() { return this._deltaManager.connectionManager.connectionMode; }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public get resolvedUrl(): IResolvedUrl | undefined {\n return this._resolvedUrl;\n }\n\n public get loadedFromVersion(): IVersion | undefined {\n return this._loadedFromVersion;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n return this._deltaManager.readOnlyInfo;\n }\n\n /**\n * Tracks host requiring read-only mode.\n */\n public forceReadonly(readonly: boolean) {\n this._deltaManager.connectionManager.forceReadonly(readonly);\n }\n\n public get id(): string {\n return this._resolvedUrl?.id ?? \"\";\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this._deltaManager;\n }\n\n public get connectionState(): ConnectionState {\n return this.connectionStateHandler.connectionState;\n }\n\n public get connected(): boolean {\n return this.connectionStateHandler.connected;\n }\n\n /**\n * Service configuration details. If running in offline mode will be undefined otherwise will contain service\n * configuration details returned as part of the initial connection.\n */\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this._deltaManager.serviceConfiguration;\n }\n\n /**\n * The server provided id of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get clientId(): string | undefined {\n return this.connectionStateHandler.clientId;\n }\n\n /**\n * The server provided claims of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get scopes(): string[] | undefined {\n return this._deltaManager.connectionManager.scopes;\n }\n\n public get clientDetails(): IClientDetails {\n return this._deltaManager.clientDetails;\n }\n\n /**\n * The current code details for the container's runtime\n * @deprecated use getSpecifiedCodeDetails for the code details currently specified for this container, or\n * getLoadedCodeDetails for the code details that the container's context was loaded with.\n * To be removed after getSpecifiedCodeDetails and getLoadedCodeDetails become ubiquitous.\n */\n public get codeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails ?? this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Get the code details that are currently specified for the container.\n * @returns The current code details if any are specified, undefined if none are specified.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Get the code details that were used to load the container.\n * @returns The code details that were used to load the container if it is loaded, undefined if it is not yet\n * loaded.\n */\n public getLoadedCodeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails;\n }\n\n /**\n * Retrieves the audience associated with the document\n */\n public get audience(): IAudience {\n return this._audience;\n }\n\n /**\n * Returns true if container is dirty.\n * Which means data loss if container is closed at that same moment\n * Most likely that happens when there is no network connection to ordering service\n */\n public get isDirty() {\n return this._dirtyContainer;\n }\n\n private get serviceFactory() {return this.loader.services.documentServiceFactory;}\n private get urlResolver() {return this.loader.services.urlResolver;}\n public get options(): ILoaderOptions { return this.loader.services.options; }\n private get scope() { return this.loader.services.scope;}\n private get codeLoader() { return this.loader.services.codeLoader;}\n\n constructor(\n private readonly loader: Loader,\n config: IContainerConfig,\n ) {\n super((name, error) => {\n this.logger.sendErrorEvent(\n {\n eventName: \"ContainerEventHandlerException\",\n name: typeof name === \"string\" ? name : undefined,\n },\n error);\n });\n this._audience = new Audience();\n\n this.clientDetailsOverride = config.clientDetailsOverride;\n this._resolvedUrl = config.resolvedUrl;\n if (config.canReconnect !== undefined) {\n this._canReconnect = config.canReconnect;\n }\n\n // Create logger for data stores to use\n const type = this.client.details.type;\n const interactive = this.client.details.capabilities.interactive;\n const clientType =\n `${interactive ? \"interactive\" : \"noninteractive\"}${type !== undefined && type !== \"\" ? `/${type}` : \"\"}`;\n // Need to use the property getter for docId because for detached flow we don't have the docId initially.\n // We assign the id later so property getter is used.\n this.subLogger = ChildLogger.create(\n loader.services.subLogger,\n undefined,\n {\n all: {\n clientType, // Differentiating summarizer container from main container\n containerId: uuid(),\n docId: () => this.id,\n containerAttachState: () => this._attachState,\n containerLifecycleState: () => this._lifecycleState,\n containerConnectionState: () => ConnectionState[this.connectionState],\n },\n // we need to be judicious with our logging here to avoid generting too much data\n // all data logged here should be broadly applicable, and not specific to a\n // specific error or class of errors\n error: {\n // load information to associate errors with the specific load point\n dmInitialSeqNumber: () => this._deltaManager?.initialSequenceNumber,\n dmLastKnownSeqNumber: () => this._deltaManager?.lastKnownSeqNumber,\n containerLoadedFromVersionId: () => this.loadedFromVersion?.id,\n containerLoadedFromVersionDate: () => this.loadedFromVersion?.date,\n // message information to associate errors with the specific execution state\n dmLastMsqSeqNumber: () => this.deltaManager?.lastMessage?.sequenceNumber,\n dmLastMsqSeqTimestamp: () => this.deltaManager?.lastMessage?.timestamp,\n dmLastMsqSeqClientId: () => this.deltaManager?.lastMessage?.clientId,\n connectionState: () => ConnectionState[this.connectionState],\n connectionStateDuration:\n () => performance.now() - this.connectionTransitionTimes[this.connectionState],\n },\n });\n\n // Prefix all events in this file with container-loader\n this.logger = ChildLogger.create(this.subLogger, \"Container\");\n\n this.connectionStateHandler = new ConnectionStateHandler(\n {\n protocolHandler: () => this._protocolHandler,\n logConnectionStateChangeTelemetry: (value, oldState, reason) =>\n this.logConnectionStateChangeTelemetry(value, oldState, reason),\n shouldClientJoinWrite: () => this._deltaManager.connectionManager.shouldJoinWrite(),\n maxClientLeaveWaitTime: this.loader.services.options.maxClientLeaveWaitTime,\n logConnectionIssue: (eventName: string) => {\n // We get here when socket does not receive any ops on \"write\" connection, including\n // its own join op. Attempt recovery option.\n this._deltaManager.logConnectionIssue({\n eventName,\n duration: performance.now() - this.connectionTransitionTimes[ConnectionState.Connecting],\n });\n },\n connectionStateChanged: () => {\n if (this.loaded) {\n this.propagateConnectionState();\n }\n },\n },\n this.logger,\n );\n\n this._deltaManager = this.createDeltaManager();\n this._storage = new ContainerStorageAdapter(\n () => {\n if (this.attachState !== AttachState.Attached) {\n if (this.loader.services.detachedBlobStorage !== undefined) {\n return new BlobOnlyStorage(this.loader.services.detachedBlobStorage, this.logger);\n }\n this.logger.sendErrorEvent({\n eventName: \"NoRealStorageInDetachedContainer\",\n });\n throw new Error(\"Real storage calls not allowed in Unattached container\");\n }\n return this.storageService;\n },\n );\n\n const isDomAvailable = typeof document === \"object\" &&\n document !== null &&\n typeof document.addEventListener === \"function\" &&\n document.addEventListener !== null;\n // keep track of last time page was visible for telemetry\n if (isDomAvailable) {\n this.lastVisible = document.hidden ? performance.now() : undefined;\n document.addEventListener(\"visibilitychange\", () => {\n if (document.hidden) {\n this.lastVisible = performance.now();\n } else {\n // settimeout so this will hopefully fire after disconnect event if being hidden caused it\n setTimeout(() => this.lastVisible = undefined, 0);\n }\n });\n }\n\n // We observed that most users of platform do not check Container.connected event on load, causing bugs.\n // As such, we are raising events when new listener pops up.\n // Note that we can raise both \"disconnected\" & \"connect\" events at the same time,\n // if we are in connecting stage.\n this.on(\"newListener\", (event: string, listener: (...args: any[]) => void) => {\n // Fire events on the end of JS turn, giving a chance for caller to be in consistent state.\n Promise.resolve().then(() => {\n switch (event) {\n case dirtyContainerEvent:\n if (this._dirtyContainer) {\n listener();\n }\n break;\n case savedContainerEvent:\n if (!this._dirtyContainer) {\n listener();\n }\n break;\n case connectedEventName:\n if (this.connected) {\n listener(this.clientId);\n }\n break;\n case disconnectedEventName:\n if (!this.connected) {\n listener();\n }\n break;\n default:\n }\n }).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"RaiseConnectedEventError\" }, error);\n });\n });\n }\n\n /**\n * Retrieves the quorum associated with the document\n */\n public getQuorum(): IQuorum {\n return this.protocolHandler.quorum;\n }\n\n public close(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n\n try {\n this._lifecycleState = \"closing\";\n\n // Ensure that we raise all key events even if one of these throws\n try {\n this._deltaManager.close(error);\n\n this._protocolHandler?.close();\n\n this.connectionStateHandler.dispose();\n\n this._context?.dispose(error !== undefined ? new Error(error.message) : undefined);\n\n assert(this.connectionState === ConnectionState.Disconnected,\n 0x0cf /* \"disconnect event was not raised!\" */);\n\n this._storageService?.dispose();\n\n // Notify storage about critical errors. They may be due to disconnect between client & server knowledge\n // about file, like file being overwritten in storage, but client having stale local cache.\n // Driver need to ensure all caches are cleared on critical errors\n this.service?.dispose(error);\n } catch (exception) {\n this.logger.sendErrorEvent({ eventName: \"ContainerCloseException\"}, exception);\n }\n\n this.logger.sendTelemetryEvent(\n {\n eventName: \"ContainerClose\",\n category: error === undefined ? \"generic\" : \"error\",\n },\n error,\n );\n\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n } finally {\n this._lifecycleState = \"closed\";\n }\n }\n\n public closeAndGetPendingLocalState(): string {\n // runtime matches pending ops to successful ones by clientId and client seq num, so we need to close the\n // container at the same time we get pending state, otherwise this container could reconnect and resubmit with\n // a new clientId and a future container using stale pending state without the new clientId would resubmit them\n\n assert(this.attachState === AttachState.Attached, 0x0d1 /* \"Container should be attached before close\" */);\n assert(this.resolvedUrl !== undefined && this.resolvedUrl.type === \"fluid\",\n 0x0d2 /* \"resolved url should be valid Fluid url\" */);\n const pendingState: IPendingLocalState = {\n pendingRuntimeState: this.context.getPendingLocalState(),\n url: this.resolvedUrl.url,\n };\n\n this.close();\n\n return JSON.stringify(pendingState);\n }\n\n public get attachState(): AttachState {\n return this._attachState;\n }\n\n public serialize(): string {\n assert(this.attachState === AttachState.Detached, 0x0d3 /* \"Should only be called in detached container\" */);\n\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n const combinedSummary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n if (this.loader.services.detachedBlobStorage && this.loader.services.detachedBlobStorage.size > 0) {\n combinedSummary.tree[\".hasAttachmentBlobs\"] = { type: SummaryType.Blob, content: \"true\" };\n }\n return JSON.stringify(combinedSummary);\n }\n\n public async attach(request: IRequest): Promise<void> {\n await PerformanceEvent.timedExecAsync(this.logger, { eventName: \"Attach\" }, async () => {\n if (this._lifecycleState !== \"loaded\") {\n throw new UsageError(`containerNotValidForAttach [${this._lifecycleState}]`);\n }\n\n // If container is already attached or attach is in progress, throw an error.\n assert(this._attachState === AttachState.Detached && !this.attachStarted,\n 0x205 /* \"attach() called more than once\" */);\n this.attachStarted = true;\n\n // If attachment blobs were uploaded in detached state we will go through a different attach flow\n const hasAttachmentBlobs = this.loader.services.detachedBlobStorage !== undefined\n && this.loader.services.detachedBlobStorage.size > 0;\n\n try {\n assert(this.deltaManager.inbound.length === 0,\n 0x0d6 /* \"Inbound queue should be empty when attaching\" */);\n\n let summary: ISummaryTree;\n if (!hasAttachmentBlobs) {\n // Get the document state post attach - possibly can just call attach but we need to change the\n // semantics around what the attach means as far as async code goes.\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n // Set the state as attaching as we are starting the process of attaching container.\n // This should be fired after taking the summary because it is the place where we are\n // starting to attach the container to storage.\n // Also, this should only be fired in detached container.\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n }\n\n // Actually go and create the resolved document\n const createNewResolvedUrl = await this.urlResolver.resolve(request);\n ensureFluidResolvedUrl(createNewResolvedUrl);\n if (this.service === undefined) {\n this.service = await runWithRetry(\n async () => this.serviceFactory.createContainer(\n summary,\n createNewResolvedUrl,\n this.subLogger,\n ),\n \"containerAttach\",\n this.logger,\n {}, // progress\n );\n }\n const resolvedUrl = this.service.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n this._resolvedUrl = resolvedUrl;\n await this.connectStorageService();\n\n if (hasAttachmentBlobs) {\n // upload blobs to storage\n assert(!!this.loader.services.detachedBlobStorage, 0x24e /* \"assertion for type narrowing\" */);\n\n // build a table mapping IDs assigned locally to IDs assigned by storage and pass it to runtime to\n // support blob handles that only know about the local IDs\n const redirectTable = new Map<string, string>();\n // if new blobs are added while uploading, upload them too\n while (redirectTable.size < this.loader.services.detachedBlobStorage.size) {\n const newIds = this.loader.services.detachedBlobStorage.getBlobIds().filter(\n (id) => !redirectTable.has(id));\n for (const id of newIds) {\n const blob = await this.loader.services.detachedBlobStorage.readBlob(id);\n const response = await this.storageService.createBlob(blob);\n redirectTable.set(id, response.id);\n }\n }\n\n // take summary and upload\n const appSummary: ISummaryTree = this.context.createSummary(redirectTable);\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n\n await this.storageService.uploadSummaryWithContext(summary, {\n referenceSequenceNumber: 0,\n ackHandle: undefined,\n proposalHandle: undefined,\n });\n }\n\n this._attachState = AttachState.Attached;\n this.emit(\"attached\");\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n if (!this.closed) {\n this.resumeInternal({ fetchOpsFromStorage: false, reason: \"createDetached\" });\n }\n } catch(error) {\n // add resolved URL on error object so that host has the ability to find this document and delete it\n const newError = normalizeError(error);\n const resolvedUrl = this.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n newError.addTelemetryProperties({ resolvedUrl: resolvedUrl.url });\n }\n this.close(newError);\n throw newError;\n }\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(\n this.logger,\n { eventName: \"Request\" },\n async () => this.context.request(path),\n { end: true, cancel: \"error\" },\n );\n }\n\n public async snapshot(tagMessage: string, fullTree: boolean = false): Promise<void> {\n // Only snapshot once a code quorum has been established\n if (!this.protocolHandler.quorum.has(\"code\") && !this.protocolHandler.quorum.has(\"code2\")) {\n this.logger.sendTelemetryEvent({ eventName: \"SkipSnapshot\" });\n return;\n }\n\n // Stop inbound message processing while we complete the snapshot\n try {\n await this.deltaManager.inbound.pause();\n await this.snapshotCore(tagMessage, fullTree);\n } catch (ex) {\n this.logger.sendErrorEvent({ eventName: \"SnapshotExceptionError\" }, ex);\n throw ex;\n } finally {\n this.deltaManager.inbound.resume();\n }\n }\n\n public setAutoReconnect(reconnect: boolean) {\n if (this.closed) {\n throw new Error(\"Attempting to setAutoReconnect() a closed Container\");\n }\n const mode = reconnect ? ReconnectMode.Enabled : ReconnectMode.Disabled;\n const currentMode = this._deltaManager.connectionManager.reconnectMode;\n\n if (currentMode === mode) {\n return;\n }\n\n const now = performance.now();\n const duration = now - this.setAutoReconnectTime;\n this.setAutoReconnectTime = now;\n\n this.logger.sendTelemetryEvent({\n eventName: reconnect ? \"AutoReconnectEnabled\" : \"AutoReconnectDisabled\",\n connectionMode: this.connectionMode,\n connectionState: ConnectionState[this.connectionState],\n duration,\n });\n\n this._deltaManager.connectionManager.setAutoReconnect(mode);\n\n // If container state is not attached and resumed, then don't connect to delta stream. Also don't set the\n // manual reconnection flag to true as we haven't made the initial connection yet.\n if (reconnect && this._attachState === AttachState.Attached && this.resumedOpProcessingAfterLoad) {\n if (this.connectionState === ConnectionState.Disconnected) {\n // Only track this as a manual reconnection if we are truly the ones kicking it off.\n this.manualReconnectInProgress = true;\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream({ reason: \"autoReconnect\" });\n }\n }\n\n public resume() {\n if (!this.closed) {\n // Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().\n // If there is gap, we will learn about it once connected, but the gap should be small (if any),\n // assuming that resume() is called quickly after initial container boot.\n this.resumeInternal({ reason: \"DocumentOpenResume\", fetchOpsFromStorage: false });\n }\n }\n\n private resumeInternal(args: IConnectionArgs) {\n assert(!this.closed, 0x0d9 /* \"Attempting to setAutoReconnect() a closed DeltaManager\" */);\n\n // Resume processing ops\n if (!this.resumedOpProcessingAfterLoad) {\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream(args);\n }\n\n /**\n * Raise non-critical error to host. Calling this API will not close container.\n * For critical errors, please call Container.close(error).\n * @param error - an error to raise\n */\n public raiseContainerWarning(warning: ContainerWarning) {\n // Some \"warning\" events come from outside the container and are logged\n // elsewhere (e.g. summarizing container). We shouldn't log these here.\n if (warning.logged !== true) {\n this.logContainerError(warning);\n }\n this.emit(\"warning\", warning);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.resolvedUrl === undefined) {\n return undefined;\n }\n\n return this.urlResolver.getAbsoluteUrl(\n this.resolvedUrl,\n relativeUrl,\n this._context?.codeDetails);\n }\n\n public async proposeCodeDetails(codeDetails: IFluidCodeDetails) {\n if (!isFluidCodeDetails(codeDetails)) {\n throw new Error(\"Provided codeDetails are not IFluidCodeDetails\");\n }\n\n if (this.codeLoader.IFluidCodeDetailsComparer) {\n const comparision = await this.codeLoader.IFluidCodeDetailsComparer.compare(\n codeDetails,\n this.getCodeDetailsFromQuorum());\n if (comparision !== undefined && comparision <= 0) {\n throw new Error(\"Proposed code details should be greater than the current\");\n }\n }\n\n return this.getQuorum().propose(\"code\", codeDetails)\n .then(()=>true)\n .catch(()=>false);\n }\n\n private async processCodeProposal(): Promise<void> {\n const codeDetails = this.getCodeDetailsFromQuorum();\n\n await Promise.all([\n this.deltaManager.inbound.pause(),\n this.deltaManager.inboundSignal.pause()]);\n\n if ((await this.context.satisfies(codeDetails) === true)) {\n this.deltaManager.inbound.resume();\n this.deltaManager.inboundSignal.resume();\n return;\n }\n\n this.close(new GenericError(\"existingContextDoesNotSatisfyIncomingProposal\"));\n }\n\n private async snapshotCore(tagMessage: string, fullTree: boolean = false) {\n // Snapshots base document state and currently running context\n const root = this.snapshotBase();\n const dataStoreEntries = await this.context.snapshot(tagMessage, fullTree);\n\n // And then combine\n if (dataStoreEntries !== null) {\n root.entries.push(...dataStoreEntries.entries);\n }\n\n // Generate base snapshot message\n const deltaDetails =\n `${this._deltaManager.lastSequenceNumber}:${this._deltaManager.minimumSequenceNumber}`;\n const message = `Commit @${deltaDetails} ${tagMessage}`;\n\n // Pull in the prior version and snapshot tree to store against\n const lastVersion = await this.getVersion(this.id);\n\n const parents = lastVersion !== undefined ? [lastVersion.id] : [];\n\n // Write the full snapshot\n return this.storageService.write(root, parents, message, \"\");\n }\n\n private snapshotBase(): ITree {\n const entries: ITreeEntry[] = [];\n\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n entries.push({\n mode: FileMode.File,\n path: \"quorumMembers\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.members),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumProposals\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.proposals),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumValues\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.values),\n encoding: \"utf-8\",\n },\n });\n\n // Save attributes for the document\n const documentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this._deltaManager.minimumSequenceNumber,\n sequenceNumber: this._deltaManager.lastSequenceNumber,\n term: this._deltaManager.referenceTerm,\n };\n entries.push({\n mode: FileMode.File,\n path: \".attributes\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(documentAttributes),\n encoding: \"utf-8\",\n },\n });\n\n // Output the tree\n const root: ITree = {\n entries,\n };\n\n return root;\n }\n\n private async getVersion(version: string): Promise<IVersion | undefined> {\n const versions = await this.storageService.getVersions(version, 1);\n return versions[0];\n }\n\n private recordConnectStartTime() {\n if (this.connectionTransitionTimes[ConnectionState.Disconnected] === undefined) {\n this.connectionTransitionTimes[ConnectionState.Disconnected] = performance.now();\n }\n }\n\n private connectToDeltaStream(args: IConnectionArgs) {\n this.recordConnectStartTime();\n\n // All agents need \"write\" access, including summarizer.\n if (!this._canReconnect || !this.client.details.capabilities.interactive) {\n args.mode = \"write\";\n }\n\n this._deltaManager.connect(args);\n }\n\n /**\n * Load container.\n *\n * @param specifiedVersion - one of the following\n * - undefined - fetch latest snapshot\n * - otherwise, version sha to load snapshot\n */\n private async load(\n specifiedVersion: string | undefined,\n loadMode: IContainerLoadMode,\n pendingLocalState?: unknown,\n ) {\n if (this._resolvedUrl === undefined) {\n throw new Error(\"Attempting to load without a resolved url\");\n }\n this.service = await this.serviceFactory.createDocumentService(this._resolvedUrl, this.subLogger);\n\n // Ideally we always connect as \"read\" by default.\n // Currently that works with SPO & r11s, because we get \"write\" connection when connecting to non-existing file.\n // We should not rely on it by (one of them will address the issue, but we need to address both)\n // 1) switching create new flow to one where we create file by posting snapshot\n // 2) Fixing quorum workflows (have retry logic)\n // That all said, \"read\" does not work with memorylicious workflows (that opens two simultaneous\n // connections to same file) in two ways:\n // A) creation flow breaks (as one of the clients \"sees\" file as existing, and hits #2 above)\n // B) Once file is created, transition from view-only connection to write does not work - some bugs to be fixed.\n const connectionArgs: IConnectionArgs = { reason: \"DocumentOpen\", mode: \"write\", fetchOpsFromStorage: false };\n\n // Start websocket connection as soon as possible. Note that there is no op handler attached yet, but the\n // DeltaManager is resilient to this and will wait to start processing ops until after it is attached.\n if (loadMode.deltaConnection === undefined) {\n this.connectToDeltaStream(connectionArgs);\n }\n\n await this.connectStorageService();\n this._attachState = AttachState.Attached;\n\n // Fetch specified snapshot.\n const { snapshot, versionId } = await this.fetchSnapshotTree(specifiedVersion);\n assert(snapshot !== undefined, 0x237 /* \"Snapshot should exist\" */);\n\n const attributes = await this.getDocumentAttributes(this.storageService, snapshot);\n\n let opsBeforeReturnP: Promise<void> | undefined;\n\n // Attach op handlers to finish initialization and be able to start processing ops\n // Kick off any ops fetching if required.\n switch (loadMode.opsBeforeReturn) {\n case undefined:\n // Start prefetch, but not set opsBeforeReturnP - boot is not blocked by it!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.attachDeltaManagerOpHandler(attributes, loadMode.deltaConnection !== \"none\" ? \"all\" : \"none\");\n break;\n case \"cached\":\n opsBeforeReturnP = this.attachDeltaManagerOpHandler(attributes, \"cached\");\n break;\n case \"all\":\n opsBeforeReturnP = this.attachDeltaManagerOpHandler(attributes, \"all\");\n break;\n default:\n unreachableCase(loadMode.opsBeforeReturn);\n }\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this.storageService, snapshot);\n\n const codeDetails = this.getCodeDetailsFromQuorum();\n await this.instantiateContext(\n true, // existing\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n\n // Internal context is fully loaded at this point\n this.loaded = true;\n\n // We might have hit some failure that did not manifest itself in exception in this flow,\n // do not start op processing in such case - static version of Container.load() will handle it correctly.\n if (!this.closed) {\n if (opsBeforeReturnP !== undefined) {\n this._deltaManager.inbound.resume();\n\n await opsBeforeReturnP;\n await this._deltaManager.inbound.waitTillProcessingDone();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.inbound.pause();\n }\n\n switch (loadMode.deltaConnection) {\n case undefined:\n this.resume();\n break;\n case \"delayed\":\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n break;\n case \"none\":\n break;\n default:\n unreachableCase(loadMode.deltaConnection);\n }\n }\n\n // Safety net: static version of Container.load() should have learned about it through \"closed\" handler.\n // But if that did not happen for some reason, fail load for sure.\n // Otherwise we can get into situations where container is closed and does not try to connect to ordering\n // service, but caller does not know that (callers do expect container to be not closed on successful path\n // and listen only on \"closed\" event)\n if (this.closed) {\n throw new Error(\"Container was closed while load()\");\n }\n\n return {\n sequenceNumber: attributes.sequenceNumber,\n version: versionId,\n };\n }\n\n private async createDetached(source: IFluidCodeDetails) {\n const attributes: IDocumentAttributes = {\n sequenceNumber: detachedContainerRefSeqNumber,\n term: 1,\n minimumSequenceNumber: 0,\n };\n\n // Seed the base quorum to be an empty list with a code quorum set\n const committedCodeProposal: ICommittedProposal = {\n key: \"code\",\n value: source,\n approvalSequenceNumber: 0,\n commitSequenceNumber: 0,\n sequenceNumber: 0,\n };\n\n const members: [string, ISequencedClient][] = [];\n const proposals: [number, ISequencedProposal, string[]][] = [];\n const values: [string, ICommittedProposal][] = [[\"code\", committedCodeProposal]];\n\n await this.attachDeltaManagerOpHandler(attributes);\n\n // Need to just seed the source data in the code quorum. Quorum itself is empty\n this._protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n // The load context - given we seeded the quorum - will be great\n await this.instantiateContextDetached(\n false, // existing\n );\n\n this.propagateConnectionState();\n\n this.loaded = true;\n }\n\n private async rehydrateDetachedFromSnapshot(detachedContainerSnapshot: ISummaryTree) {\n if (detachedContainerSnapshot.tree[\".hasAttachmentBlobs\"] !== undefined) {\n assert(!!this.loader.services.detachedBlobStorage && this.loader.services.detachedBlobStorage.size > 0,\n 0x250 /* \"serialized container with attachment blobs must be rehydrated with detached blob storage\" */);\n delete detachedContainerSnapshot.tree[\".hasAttachmentBlobs\"];\n }\n\n const snapshotTree = getSnapshotTreeFromSerializedContainer(detachedContainerSnapshot);\n this._storage.loadSnapshotForRehydratingContainer(snapshotTree);\n const attributes = await this.getDocumentAttributes(this._storage, snapshotTree);\n assert(attributes.sequenceNumber === 0, 0x0db /* \"Seq number in detached container should be 0!!\" */);\n await this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this._storage, snapshotTree);\n\n await this.instantiateContextDetached(\n true, // existing\n snapshotTree,\n );\n\n this.loaded = true;\n\n this.propagateConnectionState();\n }\n\n private async connectStorageService(): Promise<void> {\n if (this._storageService !== undefined) {\n return;\n }\n\n assert(this.service !== undefined, 0x1ef /* \"services must be defined\" */);\n const storageService = await this.service.connectToStorage();\n\n this._storageService =\n new RetriableDocumentStorageService(storageService, this.logger);\n\n if(this.options.summarizeProtocolTree === true) {\n this._storageService =\n new ProtocolTreeStorageService(this._storageService, ()=>this.captureProtocolSummary());\n }\n\n // ensure we did not lose that policy in the process of wrapping\n assert(storageService.policies?.minBlobSize === this.storageService.policies?.minBlobSize,\n 0x0e0 /* \"lost minBlobSize policy\" */);\n }\n\n private async getDocumentAttributes(\n storage: IDocumentStorageService,\n tree: ISnapshotTree | undefined,\n ): Promise<IDocumentAttributes> {\n if (tree === undefined) {\n return {\n minimumSequenceNumber: 0,\n sequenceNumber: 0,\n term: 1,\n };\n }\n\n // Backward compatibility: old docs would have \".attributes\" instead of \"attributes\"\n const attributesHash = \".protocol\" in tree.trees\n ? tree.trees[\".protocol\"].blobs.attributes\n : tree.blobs[\".attributes\"];\n\n const attributes = await readAndParse<IDocumentAttributes>(storage, attributesHash);\n\n // Backward compatibility for older summaries with no term\n if (attributes.term === undefined) {\n attributes.term = 1;\n }\n\n return attributes;\n }\n\n private async loadAndInitializeProtocolState(\n attributes: IDocumentAttributes,\n storage: IDocumentStorageService,\n snapshot: ISnapshotTree | undefined,\n ): Promise<ProtocolOpHandler> {\n let members: [string, ISequencedClient][] = [];\n let proposals: [number, ISequencedProposal, string[]][] = [];\n let values: [string, any][] = [];\n\n if (snapshot !== undefined) {\n const baseTree = \".protocol\" in snapshot.trees ? snapshot.trees[\".protocol\"] : snapshot;\n [members, proposals, values] = await Promise.all([\n readAndParse<[string, ISequencedClient][]>(storage, baseTree.blobs.quorumMembers),\n readAndParse<[number, ISequencedProposal, string[]][]>(storage, baseTree.blobs.quorumProposals),\n readAndParse<[string, ICommittedProposal][]>(storage, baseTree.blobs.quorumValues),\n ]);\n }\n\n const protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n return protocolHandler;\n }\n\n private async initializeProtocolState(\n attributes: IDocumentAttributes,\n members: [string, ISequencedClient][],\n proposals: [number, ISequencedProposal, string[]][],\n values: [string, any][],\n ): Promise<ProtocolOpHandler> {\n const protocol = new ProtocolOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term,\n members,\n proposals,\n values,\n (key, value) => this.submitMessage(MessageType.Propose, { key, value }),\n (sequenceNumber) => this.submitMessage(MessageType.Reject, sequenceNumber));\n\n const protocolLogger = ChildLogger.create(this.subLogger, \"ProtocolHandler\");\n\n protocol.quorum.on(\"error\", (error) => {\n protocolLogger.sendErrorEvent(error);\n });\n\n // Track membership changes and update connection state accordingly\n protocol.quorum.on(\"addMember\", (clientId, details) => {\n this.connectionStateHandler.receivedAddMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"removeMember\", (clientId) => {\n this.connectionStateHandler.receivedRemoveMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"addProposal\", (proposal: IPendingProposal) => {\n if (proposal.key === \"code\" || proposal.key === \"code2\") {\n this.emit(\"codeDetailsProposed\", proposal.value, proposal);\n }\n });\n\n protocol.quorum.on(\n \"approveProposal\",\n (sequenceNumber, key, value) => {\n if (key === \"code\" || key === \"code2\") {\n if (!isFluidCodeDetails(value)) {\n this.logger.sendErrorEvent({\n eventName: \"CodeProposalNotIFluidCodeDetails\",\n });\n }\n this.processCodeProposal().catch((error) => {\n this.close(normalizeError(error));\n throw error;\n });\n }\n });\n\n return protocol;\n }\n\n private captureProtocolSummary(): ISummaryTree {\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n\n // Save attributes for the document\n const documentAttributes: IDocumentAttributes = {\n minimumSequenceNumber: this.protocolHandler.minimumSequenceNumber,\n sequenceNumber: this.protocolHandler.sequenceNumber,\n term: this.protocolHandler.term,\n };\n\n const summary: ISummaryTree = {\n tree: {\n attributes: {\n content: JSON.stringify(documentAttributes),\n type: SummaryType.Blob,\n },\n quorumMembers: {\n content: JSON.stringify(quorumSnapshot.members),\n type: SummaryType.Blob,\n },\n quorumProposals: {\n content: JSON.stringify(quorumSnapshot.proposals),\n type: SummaryType.Blob,\n },\n quorumValues: {\n content: JSON.stringify(quorumSnapshot.values),\n type: SummaryType.Blob,\n },\n },\n type: SummaryType.Tree,\n };\n\n return summary;\n }\n\n private getCodeDetailsFromQuorum(): IFluidCodeDetails {\n const quorum = this.protocolHandler.quorum;\n\n const pkg = getCodeProposal(quorum);\n\n return pkg as IFluidCodeDetails;\n }\n\n private get client(): IClient {\n const client: IClient = this.options?.client !== undefined\n ? (this.options.client as IClient)\n : {\n details: {\n capabilities: { interactive: true },\n },\n mode: \"read\", // default reconnection mode on lost connection / connection error\n permission: [],\n scopes: [],\n user: { id: \"\" },\n };\n\n if (this.clientDetailsOverride !== undefined) {\n merge(client.details, this.clientDetailsOverride);\n }\n client.details.environment = [client.details.environment, ` loaderVersion:${pkgVersion}`].join(\";\");\n return client;\n }\n\n /**\n * Returns true if connection is active, i.e. it's \"write\" connection and\n * container runtime was notified about this connection (i.e. we are up-to-date and could send ops).\n * This happens after client received its own joinOp and thus is in the quorum.\n * If it's not true, runtime is not in position to send ops.\n */\n private activeConnection() {\n return this.connectionState === ConnectionState.Connected &&\n this.connectionMode === \"write\";\n }\n\n private createDeltaManager() {\n const serviceProvider = () => this.service;\n const deltaManager = new DeltaManager<ConnectionManager>(\n serviceProvider,\n ChildLogger.create(this.subLogger, \"DeltaManager\"),\n () => this.activeConnection(),\n (props: IConnectionManagerFactoryArgs) => new ConnectionManager(\n serviceProvider,\n this.client,\n this._canReconnect,\n ChildLogger.create(this.subLogger, \"ConnectionManager\"),\n props),\n );\n\n // Disable inbound queues as Container is not ready to accept any ops until we are fully loaded!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inboundSignal.pause();\n\n deltaManager.on(\"connect\", (details: IConnectionDetails, opsBehind?: number) => {\n // Back-compat for new client and old server.\n this._audience.clear();\n\n for (const priorClient of details.initialClients ?? []) {\n this._audience.addMember(priorClient.clientId, priorClient.client);\n }\n\n this.connectionStateHandler.receivedConnectEvent(\n this.connectionMode,\n details,\n );\n });\n\n deltaManager.on(\"disconnect\", (reason: string) => {\n this.manualReconnectInProgress = false;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n this.connectionStateHandler.receivedDisconnectEvent(reason);\n });\n\n deltaManager.on(\"throttled\", (warning: IThrottlingWarning) => {\n this.raiseContainerWarning(warning);\n });\n\n deltaManager.on(\"readonly\", (readonly) => {\n this.emit(\"readonly\", readonly);\n });\n\n deltaManager.on(\"closed\", (error?: ICriticalContainerError) => {\n this.close(error);\n });\n\n return deltaManager;\n }\n\n private async attachDeltaManagerOpHandler(\n attributes: IDocumentAttributes,\n prefetchType?: \"cached\" | \"all\" | \"none\")\n {\n return this._deltaManager.attachOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term ?? 1,\n {\n process: (message) => this.processRemoteMessage(message),\n processSignal: (message) => {\n this.processSignal(message);\n },\n },\n prefetchType);\n }\n\n private logConnectionStateChangeTelemetry(\n value: ConnectionState,\n oldState: ConnectionState,\n reason?: string,\n ) {\n // Log actual event\n const time = performance.now();\n this.connectionTransitionTimes[value] = time;\n const duration = time - this.connectionTransitionTimes[oldState];\n\n let durationFromDisconnected: number | undefined;\n let connectionInitiationReason: string | undefined;\n let autoReconnect: ReconnectMode | undefined;\n let checkpointSequenceNumber: number | undefined;\n let opsBehind: number | undefined;\n if (value === ConnectionState.Disconnected) {\n autoReconnect = this._deltaManager.connectionManager.reconnectMode;\n } else {\n if (value === ConnectionState.Connected) {\n durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];\n durationFromDisconnected = TelemetryLogger.formatTick(durationFromDisconnected);\n } else {\n // This info is of most interest on establishing connection only.\n checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;\n if (this.deltaManager.hasCheckpointSequenceNumber) {\n opsBehind = checkpointSequenceNumber - this.deltaManager.lastSequenceNumber;\n }\n }\n if (this.firstConnection) {\n connectionInitiationReason = \"InitialConnect\";\n } else if (this.manualReconnectInProgress) {\n connectionInitiationReason = \"ManualReconnect\";\n } else {\n connectionInitiationReason = \"AutoReconnect\";\n }\n }\n\n this.logger.sendPerformanceEvent({\n eventName: `ConnectionStateChange_${ConnectionState[value]}`,\n from: ConnectionState[oldState],\n duration,\n durationFromDisconnected,\n reason,\n connectionInitiationReason,\n pendingClientId: this.connectionStateHandler.pendingClientId,\n clientId: this.clientId,\n autoReconnect,\n opsBehind,\n online: OnlineStatus[isOnline()],\n lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined,\n checkpointSequenceNumber,\n ...this._deltaManager.connectionProps,\n });\n\n if (value === ConnectionState.Connected) {\n this.firstConnection = false;\n this.manualReconnectInProgress = false;\n }\n }\n\n private propagateConnectionState() {\n const logOpsOnReconnect: boolean =\n this.connectionState === ConnectionState.Connected &&\n !this.firstConnection &&\n this.connectionMode === \"write\";\n if (logOpsOnReconnect) {\n this.messageCountAfterDisconnection = 0;\n }\n\n const state = this.connectionState === ConnectionState.Connected;\n if (!this.context.disposed) {\n this.context.setConnectionState(state, this.clientId);\n }\n assert(this.protocolHandler !== undefined, 0x0dc /* \"Protocol handler should be set here\" */);\n this.protocolHandler.quorum.setConnectionState(state, this.clientId);\n raiseConnectedEvent(this.logger, this, state, this.clientId);\n\n if (logOpsOnReconnect) {\n this.logger.sendTelemetryEvent(\n { eventName: \"OpsSentOnReconnect\", count: this.messageCountAfterDisconnection });\n }\n }\n\n private submitContainerMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n const outboundMessageType: string = type;\n switch (outboundMessageType) {\n case MessageType.Operation:\n case MessageType.RemoteHelp:\n break;\n case MessageType.Summarize: {\n // github #6451: this is only needed for staging so the server\n // know when the protocol tree is included\n // this can be removed once all clients send\n // protocol tree by default\n const summary = contents as ISummaryContent;\n if(summary.details === undefined) {\n summary.details = {};\n }\n summary.details.includesProtocolTree =\n this.options.summarizeProtocolTree === true;\n break;\n }\n default:\n this.close(new GenericError(\"invalidContainerSubmitOpType\",\n undefined /* error */,\n { messageType: type }));\n return -1;\n }\n return this.submitMessage(type, contents, batch, metadata);\n }\n\n private submitMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n if (this.connectionState !== ConnectionState.Connected) {\n this.logger.sendErrorEvent({ eventName: \"SubmitMessageWithNoConnection\", type });\n return -1;\n }\n\n this.messageCountAfterDisconnection += 1;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n return this._deltaManager.submit(type, contents, batch, metadata);\n }\n\n private processRemoteMessage(message: ISequencedDocumentMessage): IProcessMessageResult {\n // Check and report if we're getting messages from a clientId that we previously\n // flagged as shouldHaveLeft, or from a client that's not in the quorum but should be\n if (message.clientId != null) {\n let errorCode: string | undefined;\n const client: ILocalSequencedClient | undefined =\n this.getQuorum().getMember(message.clientId);\n if (client === undefined && message.type !== MessageType.ClientJoin) {\n errorCode = \"messageClientIdMissingFromQuorum\";\n } else if (client?.shouldHaveLeft === true && message.type !== MessageType.NoOp) {\n errorCode = \"messageClientIdShouldHaveLeft\";\n }\n if (errorCode !== undefined) {\n const error = new DataCorruptionError(\n errorCode,\n extractSafePropertiesFromMessage(message));\n this.close(normalizeError(error));\n }\n }\n\n const local = this.clientId === message.clientId;\n\n // Forward non system messages to the loaded runtime for processing\n if (!isSystemMessage(message)) {\n this.context.process(message, local, undefined);\n }\n\n // Allow the protocol handler to process the message\n const result = this.protocolHandler.processMessage(message, local);\n this.collabWindowTracker.scheduleSequenceNumberUpdate(message, result.immediateNoOp === true);\n\n this.emit(\"op\", message);\n\n return result;\n }\n\n private submitSignal(message: any) {\n this._deltaManager.submitSignal(JSON.stringify(message));\n }\n\n private processSignal(message: ISignalMessage) {\n // No clientId indicates a system signal message.\n if (message.clientId === null) {\n const innerContent = message.content as { content: any; type: string };\n if (innerContent.type === MessageType.ClientJoin) {\n const newClient = innerContent.content as ISignalClient;\n this._audience.addMember(newClient.clientId, newClient.client);\n } else if (innerContent.type === MessageType.ClientLeave) {\n const leftClientId = innerContent.content as string;\n this._audience.removeMember(leftClientId);\n }\n } else {\n const local = this.clientId === message.clientId;\n this.context.processSignal(message, local);\n }\n }\n\n /**\n * Get the most recent snapshot, or a specific version.\n * @param specifiedVersion - The specific version of the snapshot to retrieve\n * @returns The snapshot requested, or the latest snapshot if no version was specified, plus version ID\n */\n private async fetchSnapshotTree(specifiedVersion: string | undefined):\n Promise<{snapshot?: ISnapshotTree; versionId?: string}>\n {\n const version = await this.getVersion(specifiedVersion ?? this.id);\n\n if (version === undefined && specifiedVersion !== undefined) {\n // We should have a defined version to load from if specified version requested\n this.logger.sendErrorEvent({ eventName: \"NoVersionFoundWhenSpecified\", id: specifiedVersion });\n }\n this._loadedFromVersion = version;\n const snapshot = await this.storageService.getSnapshotTree(version) ?? undefined;\n\n if (snapshot === undefined && version !== undefined) {\n this.logger.sendErrorEvent({ eventName: \"getSnapshotTreeFailed\", id: version.id });\n }\n return { snapshot, versionId: version?.id };\n }\n\n private async instantiateContextDetached(\n existing: boolean,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n const codeDetails = this.getCodeDetailsFromQuorum();\n if (codeDetails === undefined) {\n throw new Error(\"pkg should be provided in create flow!!\");\n }\n\n await this.instantiateContext(\n existing,\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n }\n\n private async instantiateContext(\n existing: boolean,\n codeDetails: IFluidCodeDetails,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n assert(this._context?.disposed !== false, 0x0dd /* \"Existing context not disposed\" */);\n // If this assert fires, our state tracking is likely not synchronized between COntainer & runtime.\n if (this._dirtyContainer) {\n this.logger.sendErrorEvent({ eventName: \"DirtyContainerReloadContainer\" });\n }\n\n // The relative loader will proxy requests to '/' to the loader itself assuming no non-cache flags\n // are set. Global requests will still go directly to the loader\n const loader = new RelativeLoader(this, this.loader);\n this._context = await ContainerContext.createOrLoad(\n this,\n this.scope,\n this.codeLoader,\n codeDetails,\n snapshot,\n new DeltaManagerProxy(this._deltaManager),\n new QuorumProxy(this.protocolHandler.quorum),\n loader,\n (warning: ContainerWarning) => this.raiseContainerWarning(warning),\n (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata),\n (message) => this.submitSignal(message),\n (error?: ICriticalContainerError) => this.close(error),\n Container.version,\n (dirty: boolean) => {\n this._dirtyContainer = dirty;\n this.emit(dirty ? dirtyContainerEvent : savedContainerEvent);\n },\n existing,\n pendingLocalState,\n );\n\n this.emit(\"contextChanged\", codeDetails);\n }\n\n // Please avoid calling it directly.\n // raiseContainerWarning() is the right flow for most cases\n private logContainerError(warning: ContainerWarning) {\n this.logger.sendErrorEvent({ eventName: \"ContainerWarning\" }, warning);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// eslint-disable-next-line import/no-internal-modules\nimport merge from \"lodash/merge\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n IRequest,\n IResponse,\n IFluidRouter,\n IFluidCodeDetails,\n isFluidCodeDetails,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IConnectionDetails,\n IContainer,\n IContainerEvents,\n IDeltaManager,\n ICriticalContainerError,\n ContainerWarning,\n AttachState,\n IThrottlingWarning,\n IPendingLocalState,\n ReadOnlyInfo,\n IContainerLoadMode,\n} from \"@fluidframework/container-definitions\";\nimport {\n DataCorruptionError,\n extractSafePropertiesFromMessage,\n GenericError,\n UsageError,\n } from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport {\n readAndParse,\n OnlineStatus,\n isOnline,\n ensureFluidResolvedUrl,\n combineAppAndProtocolSummary,\n runWithRetry,\n isFluidResolvedUrl,\n} from \"@fluidframework/driver-utils\";\nimport {\n isSystemMessage,\n ProtocolOpHandler,\n} from \"@fluidframework/protocol-base\";\nimport {\n FileMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n ICommittedProposal,\n IDocumentAttributes,\n IDocumentMessage,\n IProcessMessageResult,\n IQuorum,\n ISequencedClient,\n ISequencedDocumentMessage,\n ISequencedProposal,\n ISignalClient,\n ISignalMessage,\n ISnapshotTree,\n ITree,\n ITreeEntry,\n IVersion,\n MessageType,\n TreeEntry,\n ISummaryTree,\n IPendingProposal,\n SummaryType,\n ISummaryContent,\n IQuorumProposals,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ChildLogger,\n EventEmitterWithErrorHandling,\n PerformanceEvent,\n raiseConnectedEvent,\n TelemetryLogger,\n connectedEventName,\n disconnectedEventName,\n normalizeError,\n MonitoringContext,\n loggerToMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { Audience } from \"./audience\";\nimport { ContainerContext } from \"./containerContext\";\nimport { ReconnectMode, IConnectionManagerFactoryArgs } from \"./contracts\";\nimport { DeltaManager, IConnectionArgs } from \"./deltaManager\";\nimport { DeltaManagerProxy } from \"./deltaManagerProxy\";\nimport { ILoaderOptions, Loader, RelativeLoader } from \"./loader\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { ConnectionStateHandler, ILocalSequencedClient } from \"./connectionStateHandler\";\nimport { RetriableDocumentStorageService } from \"./retriableDocumentStorageService\";\nimport { ProtocolTreeStorageService } from \"./protocolTreeDocumentStorageService\";\nimport { BlobOnlyStorage, ContainerStorageAdapter } from \"./containerStorageAdapter\";\nimport { getSnapshotTreeFromSerializedContainer } from \"./utils\";\nimport { QuorumProxy } from \"./quorum\";\nimport { CollabWindowTracker } from \"./collabWindowTracker\";\nimport { ConnectionManager } from \"./connectionManager\";\n\nconst detachedContainerRefSeqNumber = 0;\n\nconst dirtyContainerEvent = \"dirty\";\nconst savedContainerEvent = \"saved\";\n\nexport interface IContainerLoadOptions {\n /**\n * Disables the Container from reconnecting if false, allows reconnect otherwise.\n */\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n resolvedUrl: IFluidResolvedUrl;\n /**\n * Control which snapshot version to load from. See IParsedUrl for detailed information.\n */\n version: string | undefined;\n /**\n * Loads the Container in paused state if true, unpaused otherwise.\n */\n loadMode?: IContainerLoadMode;\n}\n\nexport interface IContainerConfig {\n resolvedUrl?: IFluidResolvedUrl;\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n}\n\nexport enum ConnectionState {\n /**\n * The document is no longer connected to the delta server\n */\n Disconnected,\n\n /**\n * The document has an inbound connection but is still pending for outbound deltas\n */\n Connecting,\n\n /**\n * The document is fully connected\n */\n Connected,\n}\n\n/**\n * Waits until container connects to delta storage and gets up-to-date\n * Useful when resolving URIs and hitting 404, due to container being loaded from (stale) snapshot and not being\n * up to date. Host may chose to wait in such case and retry resolving URI.\n * Warning: Will wait infinitely for connection to establish if there is no connection.\n * May result in deadlock if Container.setAutoReconnect(false) is called and never switched back to auto-reconnect.\n * @returns true: container is up to date, it processed all the ops that were know at the time of first connection\n * false: storage does not provide indication of how far the client is. Container processed\n * all the ops known to it, but it maybe still behind.\n */\nexport async function waitContainerToCatchUp(container: IContainer) {\n // Make sure we stop waiting if container is closed.\n if (container.closed) {\n throw new Error(\"Container is closed\");\n }\n\n return new Promise<boolean>((resolve, reject) => {\n const deltaManager = container.deltaManager;\n\n container.on(\"closed\", reject);\n\n const waitForOps = () => {\n assert(container.connectionState !== ConnectionState.Disconnected,\n 0x0cd /* \"Container disconnected while waiting for ops!\" */);\n const hasCheckpointSequenceNumber = deltaManager.hasCheckpointSequenceNumber;\n\n const connectionOpSeqNumber = deltaManager.lastKnownSeqNumber;\n assert(deltaManager.lastSequenceNumber <= connectionOpSeqNumber,\n 0x266 /* \"lastKnownSeqNumber should never be below last processed sequence number\" */);\n if (deltaManager.lastSequenceNumber === connectionOpSeqNumber) {\n resolve(hasCheckpointSequenceNumber);\n return;\n }\n const callbackOps = (message: ISequencedDocumentMessage) => {\n if (connectionOpSeqNumber <= message.sequenceNumber) {\n resolve(hasCheckpointSequenceNumber);\n deltaManager.off(\"op\", callbackOps);\n }\n };\n deltaManager.on(\"op\", callbackOps);\n };\n\n // We can leverage DeltaManager's \"connect\" event here and test for ConnectionState.Disconnected\n // But that works only if service provides us checkPointSequenceNumber\n // Our internal testing is based on R11S that does not, but almost all tests connect as \"write\" and\n // use this function to catch up, so leveraging our own join op as a fence/barrier\n if (container.connectionState === ConnectionState.Connected) {\n waitForOps();\n return;\n }\n\n const callback = () => {\n container.off(connectedEventName, callback);\n waitForOps();\n };\n container.on(connectedEventName, callback);\n\n // TODO: Remove null check after next release #8523\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n container.resume!();\n });\n}\n\nconst getCodeProposal =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (quorum: IQuorumProposals) => quorum.get(\"code\") ?? quorum.get(\"code2\");\n\nexport class Container extends EventEmitterWithErrorHandling<IContainerEvents> implements IContainer {\n public static version = \"^0.1.0\";\n\n /**\n * Load an existing container.\n */\n public static async load(\n loader: Loader,\n loadOptions: IContainerLoadOptions,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {\n clientDetailsOverride: loadOptions.clientDetailsOverride,\n resolvedUrl: loadOptions.resolvedUrl,\n canReconnect: loadOptions.canReconnect,\n });\n\n return PerformanceEvent.timedExecAsync(\n container.mc.logger,\n { eventName: \"Load\" },\n async (event) => new Promise<Container>((resolve, reject) => {\n container._lifecycleState = \"loading\";\n const version = loadOptions.version;\n\n // always load unpaused with pending ops!\n // It is also default mode in general.\n const defaultMode: IContainerLoadMode = { opsBeforeReturn: \"cached\" };\n assert(pendingLocalState === undefined || loadOptions.loadMode === undefined,\n 0x1e1 /* \"pending state requires immediate connection!\" */);\n const mode: IContainerLoadMode = loadOptions.loadMode ?? defaultMode;\n\n const onClosed = (err?: ICriticalContainerError) => {\n reject(err ?? new GenericError(\"containerClosedWithoutErrorDuringLoad\"));\n };\n container.on(\"closed\", onClosed);\n\n container.load(version, mode, pendingLocalState)\n .finally(() => {\n container.removeListener(\"closed\", onClosed);\n })\n .then((props) => {\n event.end({ ...props, ...loadOptions.loadMode });\n resolve(container);\n },\n (error) => {\n const err = normalizeError(error);\n // Depending where error happens, we can be attempting to connect to web socket\n // and continuously retrying (consider offline mode)\n // Host has no container to close, so it's prudent to do it here\n container.close(err);\n onClosed(err);\n });\n }),\n { start: true, end: true, cancel: \"generic\" },\n );\n }\n\n /**\n * Create a new container in a detached state.\n */\n public static async createDetached(\n loader: Loader,\n codeDetails: IFluidCodeDetails,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n\n return PerformanceEvent.timedExecAsync(\n container.mc.logger,\n { eventName: \"CreateDetached\" },\n async (_event) => {\n container._lifecycleState = \"loading\";\n await container.createDetached(codeDetails);\n return container;\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n /**\n * Create a new container in a detached state that is initialized with a\n * snapshot from a previous detached container.\n */\n public static async rehydrateDetachedFromSnapshot(\n loader: Loader,\n snapshot: string,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n return PerformanceEvent.timedExecAsync(\n container.mc.logger,\n { eventName: \"RehydrateDetachedFromSnapshot\" },\n async (_event) => {\n const deserializedSummary = JSON.parse(snapshot) as ISummaryTree;\n container._lifecycleState = \"loading\";\n await container.rehydrateDetachedFromSnapshot(deserializedSummary);\n return container;\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n public subLogger: TelemetryLogger;\n\n // Tells if container can reconnect on losing fist connection\n // If false, container gets closed on loss of connection.\n private readonly _canReconnect: boolean = true;\n\n private readonly mc: MonitoringContext;\n\n private _lifecycleState: \"created\" | \"loading\" | \"loaded\" | \"closing\" | \"closed\" = \"created\";\n\n private get loaded(): boolean {\n return (this._lifecycleState !== \"created\" && this._lifecycleState !== \"loading\");\n }\n\n private set loaded(t: boolean) {\n assert(t, 0x27d /* \"Setting loaded state to false is not supported\" */);\n assert(this._lifecycleState !== \"created\", 0x27e /* \"Must go through loading state before loaded\" */);\n\n // It's conceivable the container could be closed when this is called\n // Only transition states if currently loading\n if (this._lifecycleState === \"loading\") {\n this._lifecycleState = \"loaded\";\n }\n }\n\n public get closed(): boolean {\n return (this._lifecycleState === \"closing\" || this._lifecycleState === \"closed\");\n }\n\n private _attachState = AttachState.Detached;\n\n private readonly _storage: ContainerStorageAdapter;\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n private _storageService: IDocumentStorageService & IDisposable | undefined;\n private get storageService(): IDocumentStorageService {\n if (this._storageService === undefined) {\n throw new Error(\"Attempted to access storageService before it was defined\");\n }\n return this._storageService;\n }\n\n private readonly clientDetailsOverride: IClientDetails | undefined;\n private readonly _deltaManager: DeltaManager<ConnectionManager>;\n private service: IDocumentService | undefined;\n private readonly _audience: Audience;\n\n private _context: ContainerContext | undefined;\n private get context() {\n if (this._context === undefined) {\n throw new Error(\"Attempted to access context before it was defined\");\n }\n return this._context;\n }\n private _protocolHandler: ProtocolOpHandler | undefined;\n private get protocolHandler() {\n if (this._protocolHandler === undefined) {\n throw new Error(\"Attempted to access protocolHandler before it was defined\");\n }\n return this._protocolHandler;\n }\n\n private resumedOpProcessingAfterLoad = false;\n private firstConnection = true;\n private manualReconnectInProgress = false;\n private readonly connectionTransitionTimes: number[] = [];\n private messageCountAfterDisconnection: number = 0;\n private _loadedFromVersion: IVersion | undefined;\n private _resolvedUrl: IFluidResolvedUrl | undefined;\n private attachStarted = false;\n private _dirtyContainer = false;\n\n private lastVisible: number | undefined;\n private readonly visibilityEventHandler: (() => void) | undefined;\n private readonly connectionStateHandler: ConnectionStateHandler;\n\n private setAutoReconnectTime = performance.now();\n\n private readonly collabWindowTracker = new CollabWindowTracker(\n (type, contents) => this.submitMessage(type, contents),\n () => this.activeConnection(),\n this.loader.services.options?.noopTimeFrequency,\n this.loader.services.options?.noopCountFrequency,\n );\n\n private get connectionMode() { return this._deltaManager.connectionManager.connectionMode; }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public get resolvedUrl(): IResolvedUrl | undefined {\n return this._resolvedUrl;\n }\n\n public get loadedFromVersion(): IVersion | undefined {\n return this._loadedFromVersion;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n return this._deltaManager.readOnlyInfo;\n }\n\n /**\n * Tracks host requiring read-only mode.\n */\n public forceReadonly(readonly: boolean) {\n this._deltaManager.connectionManager.forceReadonly(readonly);\n }\n\n public get id(): string {\n return this._resolvedUrl?.id ?? \"\";\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this._deltaManager;\n }\n\n public get connectionState(): ConnectionState {\n return this.connectionStateHandler.connectionState;\n }\n\n public get connected(): boolean {\n return this.connectionStateHandler.connected;\n }\n\n /**\n * Service configuration details. If running in offline mode will be undefined otherwise will contain service\n * configuration details returned as part of the initial connection.\n */\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this._deltaManager.serviceConfiguration;\n }\n\n /**\n * The server provided id of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get clientId(): string | undefined {\n return this.connectionStateHandler.clientId;\n }\n\n /**\n * The server provided claims of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get scopes(): string[] | undefined {\n return this._deltaManager.connectionManager.scopes;\n }\n\n public get clientDetails(): IClientDetails {\n return this._deltaManager.clientDetails;\n }\n\n /**\n * The current code details for the container's runtime\n * @deprecated use getSpecifiedCodeDetails for the code details currently specified for this container, or\n * getLoadedCodeDetails for the code details that the container's context was loaded with.\n * To be removed after getSpecifiedCodeDetails and getLoadedCodeDetails become ubiquitous.\n */\n public get codeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails ?? this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Get the code details that are currently specified for the container.\n * @returns The current code details if any are specified, undefined if none are specified.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Get the code details that were used to load the container.\n * @returns The code details that were used to load the container if it is loaded, undefined if it is not yet\n * loaded.\n */\n public getLoadedCodeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails;\n }\n\n /**\n * Retrieves the audience associated with the document\n */\n public get audience(): IAudience {\n return this._audience;\n }\n\n /**\n * Returns true if container is dirty.\n * Which means data loss if container is closed at that same moment\n * Most likely that happens when there is no network connection to ordering service\n */\n public get isDirty() {\n return this._dirtyContainer;\n }\n\n private get serviceFactory() {return this.loader.services.documentServiceFactory;}\n private get urlResolver() {return this.loader.services.urlResolver;}\n public readonly options: ILoaderOptions;\n private get scope() { return this.loader.services.scope;}\n private get codeLoader() { return this.loader.services.codeLoader;}\n\n constructor(\n private readonly loader: Loader,\n config: IContainerConfig,\n ) {\n super((name, error) => {\n this.mc.logger.sendErrorEvent(\n {\n eventName: \"ContainerEventHandlerException\",\n name: typeof name === \"string\" ? name : undefined,\n },\n error);\n });\n this._audience = new Audience();\n\n this.clientDetailsOverride = config.clientDetailsOverride;\n this._resolvedUrl = config.resolvedUrl;\n if (config.canReconnect !== undefined) {\n this._canReconnect = config.canReconnect;\n }\n\n // Create logger for data stores to use\n const type = this.client.details.type;\n const interactive = this.client.details.capabilities.interactive;\n const clientType =\n `${interactive ? \"interactive\" : \"noninteractive\"}${type !== undefined && type !== \"\" ? `/${type}` : \"\"}`;\n // Need to use the property getter for docId because for detached flow we don't have the docId initially.\n // We assign the id later so property getter is used.\n this.subLogger = ChildLogger.create(\n loader.services.subLogger,\n undefined,\n {\n all: {\n clientType, // Differentiating summarizer container from main container\n containerId: uuid(),\n docId: () => this.id,\n containerAttachState: () => this._attachState,\n containerLifecycleState: () => this._lifecycleState,\n containerConnectionState: () => ConnectionState[this.connectionState],\n },\n // we need to be judicious with our logging here to avoid generating too much data\n // all data logged here should be broadly applicable, and not specific to a\n // specific error or class of errors\n error: {\n // load information to associate errors with the specific load point\n dmInitialSeqNumber: () => this._deltaManager?.initialSequenceNumber,\n dmLastKnownSeqNumber: () => this._deltaManager?.lastKnownSeqNumber,\n containerLoadedFromVersionId: () => this.loadedFromVersion?.id,\n containerLoadedFromVersionDate: () => this.loadedFromVersion?.date,\n // message information to associate errors with the specific execution state\n dmLastMsqSeqNumber: () => this.deltaManager?.lastMessage?.sequenceNumber,\n dmLastMsqSeqTimestamp: () => this.deltaManager?.lastMessage?.timestamp,\n dmLastMsqSeqClientId: () => this.deltaManager?.lastMessage?.clientId,\n connectionStateDuration:\n () => performance.now() - this.connectionTransitionTimes[this.connectionState],\n },\n });\n\n // Prefix all events in this file with container-loader\n this.mc = loggerToMonitoringContext(ChildLogger.create(this.subLogger, \"Container\"));\n\n const summarizeProtocolTree =\n this.mc.config.getBoolean(\"Fluid.Container.summarizeProtocolTree\")\n ?? this.loader.services.options.summarizeProtocolTree;\n\n this.options = {\n ... this.loader.services.options,\n summarizeProtocolTree,\n };\n\n this.connectionStateHandler = new ConnectionStateHandler(\n {\n protocolHandler: () => this._protocolHandler,\n logConnectionStateChangeTelemetry: (value, oldState, reason) =>\n this.logConnectionStateChangeTelemetry(value, oldState, reason),\n shouldClientJoinWrite: () => this._deltaManager.connectionManager.shouldJoinWrite(),\n maxClientLeaveWaitTime: this.loader.services.options.maxClientLeaveWaitTime,\n logConnectionIssue: (eventName: string) => {\n // We get here when socket does not receive any ops on \"write\" connection, including\n // its own join op. Attempt recovery option.\n this._deltaManager.logConnectionIssue({\n eventName,\n duration: performance.now() - this.connectionTransitionTimes[ConnectionState.Connecting],\n });\n },\n connectionStateChanged: () => {\n if (this.loaded) {\n this.propagateConnectionState();\n }\n },\n },\n this.mc.logger,\n );\n\n this._deltaManager = this.createDeltaManager();\n this._storage = new ContainerStorageAdapter(\n () => {\n if (this.attachState !== AttachState.Attached) {\n if (this.loader.services.detachedBlobStorage !== undefined) {\n return new BlobOnlyStorage(this.loader.services.detachedBlobStorage, this.mc.logger);\n }\n this.mc.logger.sendErrorEvent({\n eventName: \"NoRealStorageInDetachedContainer\",\n });\n throw new Error(\"Real storage calls not allowed in Unattached container\");\n }\n return this.storageService;\n },\n );\n\n const isDomAvailable = typeof document === \"object\" &&\n document !== null &&\n typeof document.addEventListener === \"function\" &&\n document.addEventListener !== null;\n // keep track of last time page was visible for telemetry\n if (isDomAvailable) {\n this.lastVisible = document.hidden ? performance.now() : undefined;\n this.visibilityEventHandler = () => {\n if (document.hidden) {\n this.lastVisible = performance.now();\n } else {\n // settimeout so this will hopefully fire after disconnect event if being hidden caused it\n setTimeout(() => this.lastVisible = undefined, 0);\n }\n };\n document.addEventListener(\"visibilitychange\", this.visibilityEventHandler);\n }\n\n // We observed that most users of platform do not check Container.connected event on load, causing bugs.\n // As such, we are raising events when new listener pops up.\n // Note that we can raise both \"disconnected\" & \"connect\" events at the same time,\n // if we are in connecting stage.\n this.on(\"newListener\", (event: string, listener: (...args: any[]) => void) => {\n // Fire events on the end of JS turn, giving a chance for caller to be in consistent state.\n Promise.resolve().then(() => {\n switch (event) {\n case dirtyContainerEvent:\n if (this._dirtyContainer) {\n listener();\n }\n break;\n case savedContainerEvent:\n if (!this._dirtyContainer) {\n listener();\n }\n break;\n case connectedEventName:\n if (this.connected) {\n listener(this.clientId);\n }\n break;\n case disconnectedEventName:\n if (!this.connected) {\n listener();\n }\n break;\n default:\n }\n }).catch((error) => {\n this.mc.logger.sendErrorEvent({ eventName: \"RaiseConnectedEventError\" }, error);\n });\n });\n }\n\n /**\n * Retrieves the quorum associated with the document\n */\n public getQuorum(): IQuorum {\n return this.protocolHandler.quorum;\n }\n\n public close(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n\n try {\n this._lifecycleState = \"closing\";\n\n // Ensure that we raise all key events even if one of these throws\n try {\n this._deltaManager.close(error);\n\n this._protocolHandler?.close();\n\n this.connectionStateHandler.dispose();\n\n this._context?.dispose(error !== undefined ? new Error(error.message) : undefined);\n\n assert(this.connectionState === ConnectionState.Disconnected,\n 0x0cf /* \"disconnect event was not raised!\" */);\n\n this._storageService?.dispose();\n\n // Notify storage about critical errors. They may be due to disconnect between client & server knowledge\n // about file, like file being overwritten in storage, but client having stale local cache.\n // Driver need to ensure all caches are cleared on critical errors\n this.service?.dispose(error);\n } catch (exception) {\n this.mc.logger.sendErrorEvent({ eventName: \"ContainerCloseException\"}, exception);\n }\n\n this.mc.logger.sendTelemetryEvent(\n {\n eventName: \"ContainerClose\",\n category: error === undefined ? \"generic\" : \"error\",\n },\n error,\n );\n\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n if (this.visibilityEventHandler !== undefined) {\n document.removeEventListener(\"visibilitychange\", this.visibilityEventHandler);\n }\n } finally {\n this._lifecycleState = \"closed\";\n }\n }\n\n public closeAndGetPendingLocalState(): string {\n // runtime matches pending ops to successful ones by clientId and client seq num, so we need to close the\n // container at the same time we get pending state, otherwise this container could reconnect and resubmit with\n // a new clientId and a future container using stale pending state without the new clientId would resubmit them\n\n assert(this.attachState === AttachState.Attached, 0x0d1 /* \"Container should be attached before close\" */);\n assert(this.resolvedUrl !== undefined && this.resolvedUrl.type === \"fluid\",\n 0x0d2 /* \"resolved url should be valid Fluid url\" */);\n const pendingState: IPendingLocalState = {\n pendingRuntimeState: this.context.getPendingLocalState(),\n url: this.resolvedUrl.url,\n };\n\n this.close();\n\n return JSON.stringify(pendingState);\n }\n\n public get attachState(): AttachState {\n return this._attachState;\n }\n\n public serialize(): string {\n assert(this.attachState === AttachState.Detached, 0x0d3 /* \"Should only be called in detached container\" */);\n\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n const combinedSummary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n if (this.loader.services.detachedBlobStorage && this.loader.services.detachedBlobStorage.size > 0) {\n combinedSummary.tree[\".hasAttachmentBlobs\"] = { type: SummaryType.Blob, content: \"true\" };\n }\n return JSON.stringify(combinedSummary);\n }\n\n public async attach(request: IRequest): Promise<void> {\n await PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: \"Attach\" }, async () => {\n if (this._lifecycleState !== \"loaded\") {\n throw new UsageError(`containerNotValidForAttach [${this._lifecycleState}]`);\n }\n\n // If container is already attached or attach is in progress, throw an error.\n assert(this._attachState === AttachState.Detached && !this.attachStarted,\n 0x205 /* \"attach() called more than once\" */);\n this.attachStarted = true;\n\n // If attachment blobs were uploaded in detached state we will go through a different attach flow\n const hasAttachmentBlobs = this.loader.services.detachedBlobStorage !== undefined\n && this.loader.services.detachedBlobStorage.size > 0;\n\n try {\n assert(this.deltaManager.inbound.length === 0,\n 0x0d6 /* \"Inbound queue should be empty when attaching\" */);\n\n let summary: ISummaryTree;\n if (!hasAttachmentBlobs) {\n // Get the document state post attach - possibly can just call attach but we need to change the\n // semantics around what the attach means as far as async code goes.\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n // Set the state as attaching as we are starting the process of attaching container.\n // This should be fired after taking the summary because it is the place where we are\n // starting to attach the container to storage.\n // Also, this should only be fired in detached container.\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n }\n\n // Actually go and create the resolved document\n const createNewResolvedUrl = await this.urlResolver.resolve(request);\n ensureFluidResolvedUrl(createNewResolvedUrl);\n if (this.service === undefined) {\n this.service = await runWithRetry(\n async () => this.serviceFactory.createContainer(\n summary,\n createNewResolvedUrl,\n this.subLogger,\n ),\n \"containerAttach\",\n this.mc.logger,\n {}, // progress\n );\n }\n const resolvedUrl = this.service.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n this._resolvedUrl = resolvedUrl;\n await this.connectStorageService();\n\n if (hasAttachmentBlobs) {\n // upload blobs to storage\n assert(!!this.loader.services.detachedBlobStorage, 0x24e /* \"assertion for type narrowing\" */);\n\n // build a table mapping IDs assigned locally to IDs assigned by storage and pass it to runtime to\n // support blob handles that only know about the local IDs\n const redirectTable = new Map<string, string>();\n // if new blobs are added while uploading, upload them too\n while (redirectTable.size < this.loader.services.detachedBlobStorage.size) {\n const newIds = this.loader.services.detachedBlobStorage.getBlobIds().filter(\n (id) => !redirectTable.has(id));\n for (const id of newIds) {\n const blob = await this.loader.services.detachedBlobStorage.readBlob(id);\n const response = await this.storageService.createBlob(blob);\n redirectTable.set(id, response.id);\n }\n }\n\n // take summary and upload\n const appSummary: ISummaryTree = this.context.createSummary(redirectTable);\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n\n await this.storageService.uploadSummaryWithContext(summary, {\n referenceSequenceNumber: 0,\n ackHandle: undefined,\n proposalHandle: undefined,\n });\n }\n\n this._attachState = AttachState.Attached;\n this.emit(\"attached\");\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n if (!this.closed) {\n this.resumeInternal({ fetchOpsFromStorage: false, reason: \"createDetached\" });\n }\n } catch(error) {\n // add resolved URL on error object so that host has the ability to find this document and delete it\n const newError = normalizeError(error);\n const resolvedUrl = this.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n newError.addTelemetryProperties({ resolvedUrl: resolvedUrl.url });\n }\n this.close(newError);\n throw newError;\n }\n },\n { start: true, end: true, cancel: \"generic\" });\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(\n this.mc.logger,\n { eventName: \"Request\" },\n async () => this.context.request(path),\n { end: true, cancel: \"error\" },\n );\n }\n\n public async snapshot(tagMessage: string, fullTree: boolean = false): Promise<void> {\n // Only snapshot once a code quorum has been established\n if (!this.protocolHandler.quorum.has(\"code\") && !this.protocolHandler.quorum.has(\"code2\")) {\n this.mc.logger.sendTelemetryEvent({ eventName: \"SkipSnapshot\" });\n return;\n }\n\n // Stop inbound message processing while we complete the snapshot\n try {\n await this.deltaManager.inbound.pause();\n await this.snapshotCore(tagMessage, fullTree);\n } catch (ex) {\n this.mc.logger.sendErrorEvent({ eventName: \"SnapshotExceptionError\" }, ex);\n throw ex;\n } finally {\n this.deltaManager.inbound.resume();\n }\n }\n\n public setAutoReconnect(reconnect: boolean) {\n if (this.closed) {\n throw new Error(\"Attempting to setAutoReconnect() a closed Container\");\n }\n const mode = reconnect ? ReconnectMode.Enabled : ReconnectMode.Disabled;\n const currentMode = this._deltaManager.connectionManager.reconnectMode;\n\n if (currentMode === mode) {\n return;\n }\n\n const now = performance.now();\n const duration = now - this.setAutoReconnectTime;\n this.setAutoReconnectTime = now;\n\n this.mc.logger.sendTelemetryEvent({\n eventName: reconnect ? \"AutoReconnectEnabled\" : \"AutoReconnectDisabled\",\n connectionMode: this.connectionMode,\n connectionState: ConnectionState[this.connectionState],\n duration,\n });\n\n this._deltaManager.connectionManager.setAutoReconnect(mode);\n\n // If container state is not attached and resumed, then don't connect to delta stream. Also don't set the\n // manual reconnection flag to true as we haven't made the initial connection yet.\n if (reconnect && this._attachState === AttachState.Attached && this.resumedOpProcessingAfterLoad) {\n if (this.connectionState === ConnectionState.Disconnected) {\n // Only track this as a manual reconnection if we are truly the ones kicking it off.\n this.manualReconnectInProgress = true;\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream({ reason: \"autoReconnect\" });\n }\n }\n\n public resume() {\n if (!this.closed) {\n // Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().\n // If there is gap, we will learn about it once connected, but the gap should be small (if any),\n // assuming that resume() is called quickly after initial container boot.\n this.resumeInternal({ reason: \"DocumentOpenResume\", fetchOpsFromStorage: false });\n }\n }\n\n private resumeInternal(args: IConnectionArgs) {\n assert(!this.closed, 0x0d9 /* \"Attempting to setAutoReconnect() a closed DeltaManager\" */);\n\n // Resume processing ops\n if (!this.resumedOpProcessingAfterLoad) {\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream(args);\n }\n\n /**\n * Raise non-critical error to host. Calling this API will not close container.\n * For critical errors, please call Container.close(error).\n * @param error - an error to raise\n */\n public raiseContainerWarning(warning: ContainerWarning) {\n // Some \"warning\" events come from outside the container and are logged\n // elsewhere (e.g. summarizing container). We shouldn't log these here.\n if (warning.logged !== true) {\n this.logContainerError(warning);\n }\n this.emit(\"warning\", warning);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.resolvedUrl === undefined) {\n return undefined;\n }\n\n return this.urlResolver.getAbsoluteUrl(\n this.resolvedUrl,\n relativeUrl,\n this._context?.codeDetails);\n }\n\n public async proposeCodeDetails(codeDetails: IFluidCodeDetails) {\n if (!isFluidCodeDetails(codeDetails)) {\n throw new Error(\"Provided codeDetails are not IFluidCodeDetails\");\n }\n\n if (this.codeLoader.IFluidCodeDetailsComparer) {\n const comparison = await this.codeLoader.IFluidCodeDetailsComparer.compare(\n codeDetails,\n this.getCodeDetailsFromQuorum());\n if (comparison !== undefined && comparison <= 0) {\n throw new Error(\"Proposed code details should be greater than the current\");\n }\n }\n\n return this.protocolHandler.quorum.propose(\"code\", codeDetails)\n .then(()=>true)\n .catch(()=>false);\n }\n\n private async processCodeProposal(): Promise<void> {\n const codeDetails = this.getCodeDetailsFromQuorum();\n\n await Promise.all([\n this.deltaManager.inbound.pause(),\n this.deltaManager.inboundSignal.pause()]);\n\n if ((await this.context.satisfies(codeDetails) === true)) {\n this.deltaManager.inbound.resume();\n this.deltaManager.inboundSignal.resume();\n return;\n }\n\n this.close(new GenericError(\"existingContextDoesNotSatisfyIncomingProposal\"));\n }\n\n private async snapshotCore(tagMessage: string, fullTree: boolean = false) {\n // Snapshots base document state and currently running context\n const root = this.snapshotBase();\n const dataStoreEntries = await this.context.snapshot(tagMessage, fullTree);\n\n // And then combine\n if (dataStoreEntries !== null) {\n root.entries.push(...dataStoreEntries.entries);\n }\n\n // Generate base snapshot message\n const deltaDetails =\n `${this._deltaManager.lastSequenceNumber}:${this._deltaManager.minimumSequenceNumber}`;\n const message = `Commit @${deltaDetails} ${tagMessage}`;\n\n // Pull in the prior version and snapshot tree to store against\n const lastVersion = await this.getVersion(this.id);\n\n const parents = lastVersion !== undefined ? [lastVersion.id] : [];\n\n // Write the full snapshot\n return this.storageService.write(root, parents, message, \"\");\n }\n\n private snapshotBase(): ITree {\n const entries: ITreeEntry[] = [];\n\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n entries.push({\n mode: FileMode.File,\n path: \"quorumMembers\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.members),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumProposals\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.proposals),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumValues\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.values),\n encoding: \"utf-8\",\n },\n });\n\n // Save attributes for the document\n const documentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this._deltaManager.minimumSequenceNumber,\n sequenceNumber: this._deltaManager.lastSequenceNumber,\n term: this._deltaManager.referenceTerm,\n };\n entries.push({\n mode: FileMode.File,\n path: \".attributes\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(documentAttributes),\n encoding: \"utf-8\",\n },\n });\n\n // Output the tree\n const root: ITree = {\n entries,\n };\n\n return root;\n }\n\n private async getVersion(version: string): Promise<IVersion | undefined> {\n const versions = await this.storageService.getVersions(version, 1);\n return versions[0];\n }\n\n private recordConnectStartTime() {\n if (this.connectionTransitionTimes[ConnectionState.Disconnected] === undefined) {\n this.connectionTransitionTimes[ConnectionState.Disconnected] = performance.now();\n }\n }\n\n private connectToDeltaStream(args: IConnectionArgs) {\n this.recordConnectStartTime();\n\n // All agents need \"write\" access, including summarizer.\n if (!this._canReconnect || !this.client.details.capabilities.interactive) {\n args.mode = \"write\";\n }\n\n this._deltaManager.connect(args);\n }\n\n /**\n * Load container.\n *\n * @param specifiedVersion - one of the following\n * - undefined - fetch latest snapshot\n * - otherwise, version sha to load snapshot\n */\n private async load(\n specifiedVersion: string | undefined,\n loadMode: IContainerLoadMode,\n pendingLocalState?: unknown,\n ) {\n if (this._resolvedUrl === undefined) {\n throw new Error(\"Attempting to load without a resolved url\");\n }\n this.service = await this.serviceFactory.createDocumentService(this._resolvedUrl, this.subLogger);\n\n // Ideally we always connect as \"read\" by default.\n // Currently that works with SPO & r11s, because we get \"write\" connection when connecting to non-existing file.\n // We should not rely on it by (one of them will address the issue, but we need to address both)\n // 1) switching create new flow to one where we create file by posting snapshot\n // 2) Fixing quorum workflows (have retry logic)\n // That all said, \"read\" does not work with memorylicious workflows (that opens two simultaneous\n // connections to same file) in two ways:\n // A) creation flow breaks (as one of the clients \"sees\" file as existing, and hits #2 above)\n // B) Once file is created, transition from view-only connection to write does not work - some bugs to be fixed.\n const connectionArgs: IConnectionArgs = { reason: \"DocumentOpen\", mode: \"write\", fetchOpsFromStorage: false };\n\n // Start websocket connection as soon as possible. Note that there is no op handler attached yet, but the\n // DeltaManager is resilient to this and will wait to start processing ops until after it is attached.\n if (loadMode.deltaConnection === undefined) {\n this.connectToDeltaStream(connectionArgs);\n }\n\n await this.connectStorageService();\n this._attachState = AttachState.Attached;\n\n // Fetch specified snapshot.\n const { snapshot, versionId } = await this.fetchSnapshotTree(specifiedVersion);\n assert(snapshot !== undefined, 0x237 /* \"Snapshot should exist\" */);\n\n const attributes = await this.getDocumentAttributes(this.storageService, snapshot);\n\n let opsBeforeReturnP: Promise<void> | undefined;\n\n // Attach op handlers to finish initialization and be able to start processing ops\n // Kick off any ops fetching if required.\n switch (loadMode.opsBeforeReturn) {\n case undefined:\n // Start prefetch, but not set opsBeforeReturnP - boot is not blocked by it!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.attachDeltaManagerOpHandler(attributes, loadMode.deltaConnection !== \"none\" ? \"all\" : \"none\");\n break;\n case \"cached\":\n opsBeforeReturnP = this.attachDeltaManagerOpHandler(attributes, \"cached\");\n break;\n case \"all\":\n opsBeforeReturnP = this.attachDeltaManagerOpHandler(attributes, \"all\");\n break;\n default:\n unreachableCase(loadMode.opsBeforeReturn);\n }\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this.storageService, snapshot);\n\n const codeDetails = this.getCodeDetailsFromQuorum();\n await this.instantiateContext(\n true, // existing\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n\n // Internal context is fully loaded at this point\n this.loaded = true;\n\n // We might have hit some failure that did not manifest itself in exception in this flow,\n // do not start op processing in such case - static version of Container.load() will handle it correctly.\n if (!this.closed) {\n if (opsBeforeReturnP !== undefined) {\n this._deltaManager.inbound.resume();\n\n await opsBeforeReturnP;\n await this._deltaManager.inbound.waitTillProcessingDone();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.inbound.pause();\n }\n\n switch (loadMode.deltaConnection) {\n case undefined:\n this.resume();\n break;\n case \"delayed\":\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n break;\n case \"none\":\n break;\n default:\n unreachableCase(loadMode.deltaConnection);\n }\n }\n\n // Safety net: static version of Container.load() should have learned about it through \"closed\" handler.\n // But if that did not happen for some reason, fail load for sure.\n // Otherwise we can get into situations where container is closed and does not try to connect to ordering\n // service, but caller does not know that (callers do expect container to be not closed on successful path\n // and listen only on \"closed\" event)\n if (this.closed) {\n throw new Error(\"Container was closed while load()\");\n }\n\n return {\n sequenceNumber: attributes.sequenceNumber,\n version: versionId,\n };\n }\n\n private async createDetached(source: IFluidCodeDetails) {\n const attributes: IDocumentAttributes = {\n sequenceNumber: detachedContainerRefSeqNumber,\n term: 1,\n minimumSequenceNumber: 0,\n };\n\n // Seed the base quorum to be an empty list with a code quorum set\n const committedCodeProposal: ICommittedProposal = {\n key: \"code\",\n value: source,\n approvalSequenceNumber: 0,\n commitSequenceNumber: 0,\n sequenceNumber: 0,\n };\n\n const members: [string, ISequencedClient][] = [];\n const proposals: [number, ISequencedProposal, string[]][] = [];\n const values: [string, ICommittedProposal][] = [[\"code\", committedCodeProposal]];\n\n await this.attachDeltaManagerOpHandler(attributes);\n\n // Need to just seed the source data in the code quorum. Quorum itself is empty\n this._protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n // The load context - given we seeded the quorum - will be great\n await this.instantiateContextDetached(\n false, // existing\n );\n\n this.propagateConnectionState();\n\n this.loaded = true;\n }\n\n private async rehydrateDetachedFromSnapshot(detachedContainerSnapshot: ISummaryTree) {\n if (detachedContainerSnapshot.tree[\".hasAttachmentBlobs\"] !== undefined) {\n assert(!!this.loader.services.detachedBlobStorage && this.loader.services.detachedBlobStorage.size > 0,\n 0x250 /* \"serialized container with attachment blobs must be rehydrated with detached blob storage\" */);\n delete detachedContainerSnapshot.tree[\".hasAttachmentBlobs\"];\n }\n\n const snapshotTree = getSnapshotTreeFromSerializedContainer(detachedContainerSnapshot);\n this._storage.loadSnapshotForRehydratingContainer(snapshotTree);\n const attributes = await this.getDocumentAttributes(this._storage, snapshotTree);\n assert(attributes.sequenceNumber === 0, 0x0db /* \"Seq number in detached container should be 0!!\" */);\n await this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this._storage, snapshotTree);\n\n await this.instantiateContextDetached(\n true, // existing\n snapshotTree,\n );\n\n this.loaded = true;\n\n this.propagateConnectionState();\n }\n\n private async connectStorageService(): Promise<void> {\n if (this._storageService !== undefined) {\n return;\n }\n\n assert(this.service !== undefined, 0x1ef /* \"services must be defined\" */);\n const storageService = await this.service.connectToStorage();\n\n this._storageService =\n new RetriableDocumentStorageService(storageService, this.mc.logger);\n\n if(this.options.summarizeProtocolTree === true) {\n this.mc.logger.sendTelemetryEvent({eventName:\"summarizeProtocolTreeEnabled\"});\n this._storageService =\n new ProtocolTreeStorageService(this._storageService, ()=>this.captureProtocolSummary());\n }\n\n // ensure we did not lose that policy in the process of wrapping\n assert(storageService.policies?.minBlobSize === this.storageService.policies?.minBlobSize,\n 0x0e0 /* \"lost minBlobSize policy\" */);\n }\n\n private async getDocumentAttributes(\n storage: IDocumentStorageService,\n tree: ISnapshotTree | undefined,\n ): Promise<IDocumentAttributes> {\n if (tree === undefined) {\n return {\n minimumSequenceNumber: 0,\n sequenceNumber: 0,\n term: 1,\n };\n }\n\n // Backward compatibility: old docs would have \".attributes\" instead of \"attributes\"\n const attributesHash = \".protocol\" in tree.trees\n ? tree.trees[\".protocol\"].blobs.attributes\n : tree.blobs[\".attributes\"];\n\n const attributes = await readAndParse<IDocumentAttributes>(storage, attributesHash);\n\n // Backward compatibility for older summaries with no term\n if (attributes.term === undefined) {\n attributes.term = 1;\n }\n\n return attributes;\n }\n\n private async loadAndInitializeProtocolState(\n attributes: IDocumentAttributes,\n storage: IDocumentStorageService,\n snapshot: ISnapshotTree | undefined,\n ): Promise<ProtocolOpHandler> {\n let members: [string, ISequencedClient][] = [];\n let proposals: [number, ISequencedProposal, string[]][] = [];\n let values: [string, any][] = [];\n\n if (snapshot !== undefined) {\n const baseTree = \".protocol\" in snapshot.trees ? snapshot.trees[\".protocol\"] : snapshot;\n [members, proposals, values] = await Promise.all([\n readAndParse<[string, ISequencedClient][]>(storage, baseTree.blobs.quorumMembers),\n readAndParse<[number, ISequencedProposal, string[]][]>(storage, baseTree.blobs.quorumProposals),\n readAndParse<[string, ICommittedProposal][]>(storage, baseTree.blobs.quorumValues),\n ]);\n }\n\n const protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n return protocolHandler;\n }\n\n private async initializeProtocolState(\n attributes: IDocumentAttributes,\n members: [string, ISequencedClient][],\n proposals: [number, ISequencedProposal, string[]][],\n values: [string, any][],\n ): Promise<ProtocolOpHandler> {\n const protocol = new ProtocolOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term,\n members,\n proposals,\n values,\n (key, value) => this.submitMessage(MessageType.Propose, { key, value }),\n (sequenceNumber) => this.submitMessage(MessageType.Reject, sequenceNumber));\n\n const protocolLogger = ChildLogger.create(this.subLogger, \"ProtocolHandler\");\n\n protocol.quorum.on(\"error\", (error) => {\n protocolLogger.sendErrorEvent(error);\n });\n\n // Track membership changes and update connection state accordingly\n protocol.quorum.on(\"addMember\", (clientId, details) => {\n this.connectionStateHandler.receivedAddMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"removeMember\", (clientId) => {\n this.connectionStateHandler.receivedRemoveMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"addProposal\", (proposal: IPendingProposal) => {\n if (proposal.key === \"code\" || proposal.key === \"code2\") {\n this.emit(\"codeDetailsProposed\", proposal.value, proposal);\n }\n });\n\n protocol.quorum.on(\n \"approveProposal\",\n (sequenceNumber, key, value) => {\n if (key === \"code\" || key === \"code2\") {\n if (!isFluidCodeDetails(value)) {\n this.mc.logger.sendErrorEvent({\n eventName: \"CodeProposalNotIFluidCodeDetails\",\n });\n }\n this.processCodeProposal().catch((error) => {\n this.close(normalizeError(error));\n throw error;\n });\n }\n });\n\n return protocol;\n }\n\n private captureProtocolSummary(): ISummaryTree {\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n\n // Save attributes for the document\n const documentAttributes: IDocumentAttributes = {\n minimumSequenceNumber: this.protocolHandler.minimumSequenceNumber,\n sequenceNumber: this.protocolHandler.sequenceNumber,\n term: this.protocolHandler.term,\n };\n\n const summary: ISummaryTree = {\n tree: {\n attributes: {\n content: JSON.stringify(documentAttributes),\n type: SummaryType.Blob,\n },\n quorumMembers: {\n content: JSON.stringify(quorumSnapshot.members),\n type: SummaryType.Blob,\n },\n quorumProposals: {\n content: JSON.stringify(quorumSnapshot.proposals),\n type: SummaryType.Blob,\n },\n quorumValues: {\n content: JSON.stringify(quorumSnapshot.values),\n type: SummaryType.Blob,\n },\n },\n type: SummaryType.Tree,\n };\n\n return summary;\n }\n\n private getCodeDetailsFromQuorum(): IFluidCodeDetails {\n const quorum = this.protocolHandler.quorum;\n\n const pkg = getCodeProposal(quorum);\n\n return pkg as IFluidCodeDetails;\n }\n\n private get client(): IClient {\n const client: IClient = this.options?.client !== undefined\n ? (this.options.client as IClient)\n : {\n details: {\n capabilities: { interactive: true },\n },\n mode: \"read\", // default reconnection mode on lost connection / connection error\n permission: [],\n scopes: [],\n user: { id: \"\" },\n };\n\n if (this.clientDetailsOverride !== undefined) {\n merge(client.details, this.clientDetailsOverride);\n }\n client.details.environment = [client.details.environment, ` loaderVersion:${pkgVersion}`].join(\";\");\n return client;\n }\n\n /**\n * Returns true if connection is active, i.e. it's \"write\" connection and\n * container runtime was notified about this connection (i.e. we are up-to-date and could send ops).\n * This happens after client received its own joinOp and thus is in the quorum.\n * If it's not true, runtime is not in position to send ops.\n */\n private activeConnection() {\n return this.connectionState === ConnectionState.Connected &&\n this.connectionMode === \"write\";\n }\n\n private createDeltaManager() {\n const serviceProvider = () => this.service;\n const deltaManager = new DeltaManager<ConnectionManager>(\n serviceProvider,\n ChildLogger.create(this.subLogger, \"DeltaManager\"),\n () => this.activeConnection(),\n (props: IConnectionManagerFactoryArgs) => new ConnectionManager(\n serviceProvider,\n this.client,\n this._canReconnect,\n ChildLogger.create(this.subLogger, \"ConnectionManager\"),\n props),\n );\n\n // Disable inbound queues as Container is not ready to accept any ops until we are fully loaded!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inboundSignal.pause();\n\n deltaManager.on(\"connect\", (details: IConnectionDetails, opsBehind?: number) => {\n // Back-compat for new client and old server.\n this._audience.clear();\n\n for (const priorClient of details.initialClients ?? []) {\n this._audience.addMember(priorClient.clientId, priorClient.client);\n }\n\n this.connectionStateHandler.receivedConnectEvent(\n this.connectionMode,\n details,\n );\n });\n\n deltaManager.on(\"disconnect\", (reason: string) => {\n this.manualReconnectInProgress = false;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n this.connectionStateHandler.receivedDisconnectEvent(reason);\n });\n\n deltaManager.on(\"throttled\", (warning: IThrottlingWarning) => {\n this.raiseContainerWarning(warning);\n });\n\n deltaManager.on(\"readonly\", (readonly) => {\n this.emit(\"readonly\", readonly);\n });\n\n deltaManager.on(\"closed\", (error?: ICriticalContainerError) => {\n this.close(error);\n });\n\n return deltaManager;\n }\n\n private async attachDeltaManagerOpHandler(\n attributes: IDocumentAttributes,\n prefetchType?: \"cached\" | \"all\" | \"none\")\n {\n return this._deltaManager.attachOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term ?? 1,\n {\n process: (message) => this.processRemoteMessage(message),\n processSignal: (message) => {\n this.processSignal(message);\n },\n },\n prefetchType);\n }\n\n private logConnectionStateChangeTelemetry(\n value: ConnectionState,\n oldState: ConnectionState,\n reason?: string,\n ) {\n // Log actual event\n const time = performance.now();\n this.connectionTransitionTimes[value] = time;\n const duration = time - this.connectionTransitionTimes[oldState];\n\n let durationFromDisconnected: number | undefined;\n let connectionInitiationReason: string | undefined;\n let autoReconnect: ReconnectMode | undefined;\n let checkpointSequenceNumber: number | undefined;\n let opsBehind: number | undefined;\n if (value === ConnectionState.Disconnected) {\n autoReconnect = this._deltaManager.connectionManager.reconnectMode;\n } else {\n if (value === ConnectionState.Connected) {\n durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];\n durationFromDisconnected = TelemetryLogger.formatTick(durationFromDisconnected);\n } else {\n // This info is of most interest on establishing connection only.\n checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;\n if (this.deltaManager.hasCheckpointSequenceNumber) {\n opsBehind = checkpointSequenceNumber - this.deltaManager.lastSequenceNumber;\n }\n }\n if (this.firstConnection) {\n connectionInitiationReason = \"InitialConnect\";\n } else if (this.manualReconnectInProgress) {\n connectionInitiationReason = \"ManualReconnect\";\n } else {\n connectionInitiationReason = \"AutoReconnect\";\n }\n }\n\n this.mc.logger.sendPerformanceEvent({\n eventName: `ConnectionStateChange_${ConnectionState[value]}`,\n from: ConnectionState[oldState],\n duration,\n durationFromDisconnected,\n reason,\n connectionInitiationReason,\n pendingClientId: this.connectionStateHandler.pendingClientId,\n clientId: this.clientId,\n autoReconnect,\n opsBehind,\n online: OnlineStatus[isOnline()],\n lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined,\n checkpointSequenceNumber,\n ...this._deltaManager.connectionProps,\n });\n\n if (value === ConnectionState.Connected) {\n this.firstConnection = false;\n this.manualReconnectInProgress = false;\n }\n }\n\n private propagateConnectionState() {\n const logOpsOnReconnect: boolean =\n this.connectionState === ConnectionState.Connected &&\n !this.firstConnection &&\n this.connectionMode === \"write\";\n if (logOpsOnReconnect) {\n this.messageCountAfterDisconnection = 0;\n }\n\n const state = this.connectionState === ConnectionState.Connected;\n if (!this.context.disposed) {\n this.context.setConnectionState(state, this.clientId);\n }\n assert(this.protocolHandler !== undefined, 0x0dc /* \"Protocol handler should be set here\" */);\n this.protocolHandler.quorum.setConnectionState(state, this.clientId);\n raiseConnectedEvent(this.mc.logger, this, state, this.clientId);\n\n if (logOpsOnReconnect) {\n this.mc.logger.sendTelemetryEvent(\n { eventName: \"OpsSentOnReconnect\", count: this.messageCountAfterDisconnection });\n }\n }\n\n private submitContainerMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n const outboundMessageType: string = type;\n switch (outboundMessageType) {\n case MessageType.Operation:\n case MessageType.RemoteHelp:\n break;\n case MessageType.Summarize: {\n // github #6451: this is only needed for staging so the server\n // know when the protocol tree is included\n // this can be removed once all clients send\n // protocol tree by default\n const summary = contents as ISummaryContent;\n if(summary.details === undefined) {\n summary.details = {};\n }\n summary.details.includesProtocolTree =\n this.options.summarizeProtocolTree === true;\n break;\n }\n default:\n this.close(new GenericError(\"invalidContainerSubmitOpType\",\n undefined /* error */,\n { messageType: type }));\n return -1;\n }\n return this.submitMessage(type, contents, batch, metadata);\n }\n\n private submitMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n if (this.connectionState !== ConnectionState.Connected) {\n this.mc.logger.sendErrorEvent({ eventName: \"SubmitMessageWithNoConnection\", type });\n return -1;\n }\n\n this.messageCountAfterDisconnection += 1;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n return this._deltaManager.submit(type, contents, batch, metadata);\n }\n\n private processRemoteMessage(message: ISequencedDocumentMessage): IProcessMessageResult {\n // Check and report if we're getting messages from a clientId that we previously\n // flagged as shouldHaveLeft, or from a client that's not in the quorum but should be\n if (message.clientId != null) {\n let errorCode: string | undefined;\n const client: ILocalSequencedClient | undefined =\n this.getQuorum().getMember(message.clientId);\n if (client === undefined && message.type !== MessageType.ClientJoin) {\n errorCode = \"messageClientIdMissingFromQuorum\";\n } else if (client?.shouldHaveLeft === true && message.type !== MessageType.NoOp) {\n errorCode = \"messageClientIdShouldHaveLeft\";\n }\n if (errorCode !== undefined) {\n const error = new DataCorruptionError(\n errorCode,\n extractSafePropertiesFromMessage(message));\n this.close(normalizeError(error));\n }\n }\n\n const local = this.clientId === message.clientId;\n\n // Forward non system messages to the loaded runtime for processing\n if (!isSystemMessage(message)) {\n this.context.process(message, local, undefined);\n }\n\n // Allow the protocol handler to process the message\n const result = this.protocolHandler.processMessage(message, local);\n this.collabWindowTracker.scheduleSequenceNumberUpdate(message, result.immediateNoOp === true);\n\n this.emit(\"op\", message);\n\n return result;\n }\n\n private submitSignal(message: any) {\n this._deltaManager.submitSignal(JSON.stringify(message));\n }\n\n private processSignal(message: ISignalMessage) {\n // No clientId indicates a system signal message.\n if (message.clientId === null) {\n const innerContent = message.content as { content: any; type: string };\n if (innerContent.type === MessageType.ClientJoin) {\n const newClient = innerContent.content as ISignalClient;\n this._audience.addMember(newClient.clientId, newClient.client);\n } else if (innerContent.type === MessageType.ClientLeave) {\n const leftClientId = innerContent.content as string;\n this._audience.removeMember(leftClientId);\n }\n } else {\n const local = this.clientId === message.clientId;\n this.context.processSignal(message, local);\n }\n }\n\n /**\n * Get the most recent snapshot, or a specific version.\n * @param specifiedVersion - The specific version of the snapshot to retrieve\n * @returns The snapshot requested, or the latest snapshot if no version was specified, plus version ID\n */\n private async fetchSnapshotTree(specifiedVersion: string | undefined):\n Promise<{snapshot?: ISnapshotTree; versionId?: string}>\n {\n const version = await this.getVersion(specifiedVersion ?? this.id);\n\n if (version === undefined && specifiedVersion !== undefined) {\n // We should have a defined version to load from if specified version requested\n this.mc.logger.sendErrorEvent({ eventName: \"NoVersionFoundWhenSpecified\", id: specifiedVersion });\n }\n this._loadedFromVersion = version;\n const snapshot = await this.storageService.getSnapshotTree(version) ?? undefined;\n\n if (snapshot === undefined && version !== undefined) {\n this.mc.logger.sendErrorEvent({ eventName: \"getSnapshotTreeFailed\", id: version.id });\n }\n return { snapshot, versionId: version?.id };\n }\n\n private async instantiateContextDetached(\n existing: boolean,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n const codeDetails = this.getCodeDetailsFromQuorum();\n if (codeDetails === undefined) {\n throw new Error(\"pkg should be provided in create flow!!\");\n }\n\n await this.instantiateContext(\n existing,\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n }\n\n private async instantiateContext(\n existing: boolean,\n codeDetails: IFluidCodeDetails,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n assert(this._context?.disposed !== false, 0x0dd /* \"Existing context not disposed\" */);\n // If this assert fires, our state tracking is likely not synchronized between COntainer & runtime.\n if (this._dirtyContainer) {\n this.mc.logger.sendErrorEvent({ eventName: \"DirtyContainerReloadContainer\" });\n }\n\n // The relative loader will proxy requests to '/' to the loader itself assuming no non-cache flags\n // are set. Global requests will still go directly to the loader\n const loader = new RelativeLoader(this, this.loader);\n this._context = await ContainerContext.createOrLoad(\n this,\n this.scope,\n this.codeLoader,\n codeDetails,\n snapshot,\n new DeltaManagerProxy(this._deltaManager),\n new QuorumProxy(this.protocolHandler.quorum),\n loader,\n (warning: ContainerWarning) => this.raiseContainerWarning(warning),\n (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata),\n (message) => this.submitSignal(message),\n (error?: ICriticalContainerError) => this.close(error),\n Container.version,\n (dirty: boolean) => {\n this._dirtyContainer = dirty;\n this.emit(dirty ? dirtyContainerEvent : savedContainerEvent);\n },\n existing,\n pendingLocalState,\n );\n\n this.emit(\"contextChanged\", codeDetails);\n }\n\n // Please avoid calling it directly.\n // raiseContainerWarning() is the right flow for most cases\n private logContainerError(warning: ContainerWarning) {\n this.mc.logger.sendErrorEvent({ eventName: \"ContainerWarning\" }, warning);\n }\n}\n"]}
|