@fluidframework/datastore 2.0.0-internal.6.3.2 → 2.0.0-internal.6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/dataStoreRuntime.d.ts +0 -3
- package/dist/dataStoreRuntime.d.ts.map +1 -1
- package/dist/dataStoreRuntime.js +10 -7
- package/dist/dataStoreRuntime.js.map +1 -1
- package/lib/dataStoreRuntime.d.ts +0 -3
- package/lib/dataStoreRuntime.d.ts.map +1 -1
- package/lib/dataStoreRuntime.js +10 -7
- package/lib/dataStoreRuntime.js.map +1 -1
- package/package.json +15 -16
- package/src/dataStoreRuntime.ts +11 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @fluidframework/datastore
|
|
2
2
|
|
|
3
|
+
## 2.0.0-internal.6.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Some stack traces are improved ([#17380](https://github.com/microsoft/FluidFramework/issues/17380)) [34f2808ee9](https://github.com/microsoft/FluidFramework/commits/34f2808ee9764aef21b990f8b48860d9e3ce27a5)
|
|
8
|
+
|
|
9
|
+
Some stack traces have been improved and might now include frames for async functions that weren't previously included.
|
|
10
|
+
|
|
3
11
|
## 2.0.0-internal.6.3.0
|
|
4
12
|
|
|
5
13
|
Dependency updates only.
|
|
@@ -97,9 +97,6 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
|
|
|
97
97
|
constructor(dataStoreContext: IFluidDataStoreContext, sharedObjectRegistry: ISharedObjectRegistry, existing: boolean, initializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>);
|
|
98
98
|
dispose(): void;
|
|
99
99
|
resolveHandle(request: IRequest): Promise<IResponse>;
|
|
100
|
-
/**
|
|
101
|
-
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
102
|
-
*/
|
|
103
100
|
request(request: IRequest): Promise<IResponse>;
|
|
104
101
|
getChannel(id: string): Promise<IChannel>;
|
|
105
102
|
createChannel(id: string | undefined, type: string): IChannel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/dataStoreRuntime.js
CHANGED
|
@@ -215,15 +215,12 @@ class FluidDataStoreRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
215
215
|
async resolveHandle(request) {
|
|
216
216
|
return this.request(request);
|
|
217
217
|
}
|
|
218
|
-
/**
|
|
219
|
-
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
220
|
-
*/
|
|
221
218
|
async request(request) {
|
|
222
219
|
try {
|
|
223
220
|
const parser = runtime_utils_1.RequestParser.create(request);
|
|
224
221
|
const id = parser.pathParts[0];
|
|
225
222
|
if (id === "_channels" || id === "_custom") {
|
|
226
|
-
return this.request(parser.createSubRequest(1));
|
|
223
|
+
return await this.request(parser.createSubRequest(1));
|
|
227
224
|
}
|
|
228
225
|
// Check for a data type reference first
|
|
229
226
|
const context = this.contexts.get(id);
|
|
@@ -801,9 +798,15 @@ const mixinSummaryHandler = (handler, Base = FluidDataStoreRuntime) => class Run
|
|
|
801
798
|
}
|
|
802
799
|
async summarize(...args) {
|
|
803
800
|
const summary = await super.summarize(...args);
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
801
|
+
try {
|
|
802
|
+
const content = await handler(this);
|
|
803
|
+
if (content !== undefined) {
|
|
804
|
+
this.addBlob(summary, content.path, content.content);
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
catch (e) {
|
|
808
|
+
// Any error coming from app-provided handler should be marked as DataProcessingError
|
|
809
|
+
throw telemetry_utils_1.DataProcessingError.wrapIfUnrecognized(e, "mixinSummaryHandler");
|
|
807
810
|
}
|
|
808
811
|
return summary;
|
|
809
812
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataStoreRuntime.js","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataProcessingError,\n\tITelemetryLoggerExt,\n\tgenerateStack,\n\tLoggingError,\n\tMonitoringContext,\n\traiseConnectedEvent,\n\tcreateChildMonitoringContext,\n\ttagCodeArtifacts,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tFluidObject,\n\tIFluidHandle,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred, LazyPromise, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIAudience,\n\tIDeltaManager,\n\tAttachState,\n\tILoaderOptions,\n} from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISummaryBlob,\n\tISummaryTree,\n\tIQuorumClients,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreChannel,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tISummaryTreeWithStats,\n\tVisibilityState,\n\tITelemetryContext,\n\tIIdCompressor,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertSummaryTreeToITree,\n\tgenerateHandleContextPath,\n\tRequestParser,\n\tSummaryTreeBuilder,\n\tcreate404Response,\n\tcreateResponseError,\n\texceptionToResponse,\n\tGCDataBuilder,\n\trequestFluidObject,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tIChannel,\n\tIFluidDataStoreRuntime,\n\tIFluidDataStoreRuntimeEvents,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IChannelContext, summarizeChannel } from \"./channelContext\";\nimport {\n\tLocalChannelContext,\n\tLocalChannelContextBase,\n\tRehydratedLocalChannelContext,\n} from \"./localChannelContext\";\nimport { RemoteChannelContext } from \"./remoteChannelContext\";\nimport { FluidObjectHandle } from \"./fluidHandle\";\n\nexport enum DataStoreMessageType {\n\t// Creates a new channel\n\tAttach = \"attach\",\n\tChannelOp = \"op\",\n}\n\nexport interface ISharedObjectRegistry {\n\t// TODO consider making this async. A consequence is that either the creation of a distributed data type\n\t// is async or we need a new API to split the synchronous vs. asynchronous creation.\n\tget(name: string): IChannelFactory | undefined;\n}\n\n/**\n * Base data store class\n */\nexport class FluidDataStoreRuntime\n\textends TypedEventEmitter<IFluidDataStoreRuntimeEvents>\n\timplements IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext\n{\n\t/**\n\t * @deprecated - Instantiate the class using its constructor instead.\n\t *\n\t * Loads the data store runtime\n\t * @param context - The data store context\n\t * @param sharedObjectRegistry - The registry of shared objects used by this data store\n\t * @param existing - If loading from an existing file.\n\t */\n\tpublic static load(\n\t\tcontext: IFluidDataStoreContext,\n\t\tsharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t): FluidDataStoreRuntime {\n\t\treturn new FluidDataStoreRuntime(\n\t\t\tcontext,\n\t\t\tsharedObjectRegistry,\n\t\t\texisting,\n\t\t\tasync (dataStoreRuntime) => requestFluidObject(dataStoreRuntime, \"/\"),\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IFluidDataStoreRuntime.entryPoint}\n\t */\n\tpublic readonly entryPoint?: IFluidHandle<FluidObject>;\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic get IFluidRouter() {\n\t\treturn this;\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn this.dataStoreContext.connected;\n\t}\n\n\tpublic get clientId(): string | undefined {\n\t\treturn this.dataStoreContext.clientId;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.dataStoreContext.clientDetails;\n\t}\n\n\tpublic get isAttached(): boolean {\n\t\treturn this.attachState !== AttachState.Detached;\n\t}\n\n\tpublic get attachState(): AttachState {\n\t\treturn this._attachState;\n\t}\n\n\tpublic get absolutePath(): string {\n\t\treturn generateHandleContextPath(this.id, this.routeContext);\n\t}\n\n\tpublic get routeContext(): IFluidHandleContext {\n\t\treturn this.dataStoreContext.IFluidHandleContext;\n\t}\n\n\tpublic get idCompressor(): IIdCompressor | undefined {\n\t\treturn this.dataStoreContext.idCompressor;\n\t}\n\n\tpublic get IFluidHandleContext() {\n\t\treturn this;\n\t}\n\n\tpublic get rootRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get channelsRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get objectsRoutingContext() {\n\t\treturn this;\n\t}\n\n\tprivate _disposed = false;\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate readonly contexts = new Map<string, IChannelContext>();\n\tprivate readonly pendingAttach = new Set<string>();\n\n\tprivate readonly deferredAttached = new Deferred<void>();\n\tprivate readonly localChannelContextQueue = new Map<string, LocalChannelContextBase>();\n\tprivate readonly notBoundedChannelContextSet = new Set<string>();\n\tprivate _attachState: AttachState;\n\tpublic visibilityState: VisibilityState;\n\t// A list of handles that are bound when the data store is not visible. We have to make them visible when the data\n\t// store becomes visible.\n\tprivate readonly pendingHandlesToMakeVisible: Set<IFluidHandle> = new Set();\n\n\tpublic readonly id: string;\n\tpublic readonly options: ILoaderOptions;\n\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\tprivate readonly quorum: IQuorumClients;\n\tprivate readonly audience: IAudience;\n\tprivate readonly mc: MonitoringContext;\n\tpublic get logger(): ITelemetryLoggerExt {\n\t\treturn this.mc.logger;\n\t}\n\n\t/**\n\t * If the summarizer makes local changes, a telemetry event is logged. This has the potential to be very noisy.\n\t * So, adding a count of how many telemetry events are logged per data store context. This can be\n\t * controlled via feature flags.\n\t */\n\tprivate localChangesTelemetryCount: number;\n\n\t/**\n\t * Invokes the given callback and expects that no ops are submitted\n\t * until execution finishes. If an op is submitted, an error will be raised.\n\t *\n\t * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t *\n\t * @param callback - the callback to be invoked\n\t */\n\tpublic ensureNoDataModelChanges<T>(callback: () => T): T {\n\t\t// back-compat ADO:2309\n\t\treturn this.dataStoreContext.ensureNoDataModelChanges === undefined\n\t\t\t? callback()\n\t\t\t: this.dataStoreContext.ensureNoDataModelChanges(callback);\n\t}\n\n\t/**\n\t * Create an instance of a DataStore runtime.\n\t *\n\t * @param dataStoreContext - Context object for the runtime.\n\t * @param sharedObjectRegistry - The registry of shared objects that this data store will be able to instantiate.\n\t * @param existing - Pass 'true' if loading this datastore from an existing file; pass 'false' otherwise.\n\t * @param initializeEntryPoint - Function to initialize the entryPoint object for the data store runtime. The\n\t * handle to this data store runtime will point to the object returned by this function. If this function is not\n\t * provided, the handle will be left undefined. This is here so we can start making handles a first-class citizen\n\t * and the primary way of interacting with some Fluid objects, and should be used if possible.\n\t */\n\tpublic constructor(\n\t\tprivate readonly dataStoreContext: IFluidDataStoreContext,\n\t\tprivate readonly sharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t\tinitializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>,\n\t) {\n\t\tsuper();\n\n\t\tassert(\n\t\t\t!dataStoreContext.id.includes(\"/\"),\n\t\t\t0x30e /* Id cannot contain slashes. DataStoreContext should have validated this. */,\n\t\t);\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: dataStoreContext.logger,\n\t\t\tnamespace: \"FluidDataStoreRuntime\",\n\t\t\tproperties: {\n\t\t\t\tall: { dataStoreId: uuid() },\n\t\t\t},\n\t\t});\n\n\t\tthis.id = dataStoreContext.id;\n\t\tthis.options = dataStoreContext.options;\n\t\tthis.deltaManager = dataStoreContext.deltaManager;\n\t\tthis.quorum = dataStoreContext.getQuorum();\n\t\tthis.audience = dataStoreContext.getAudience();\n\n\t\tconst tree = dataStoreContext.baseSnapshot;\n\n\t\t// Must always receive the data store type inside of the attributes\n\t\tif (tree?.trees !== undefined) {\n\t\t\tObject.keys(tree.trees).forEach((path) => {\n\t\t\t\t// Issue #4414\n\t\t\t\tif (path === \"_search\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet channelContext: RemoteChannelContext | RehydratedLocalChannelContext;\n\t\t\t\t// If already exists on storage, then create a remote channel. However, if it is case of rehydrating a\n\t\t\t\t// container from snapshot where we load detached container from a snapshot, isLocalDataStore would be\n\t\t\t\t// true. In this case create a RehydratedLocalChannelContext.\n\t\t\t\tif (dataStoreContext.isLocalDataStore) {\n\t\t\t\t\tchannelContext = new RehydratedLocalChannelContext(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tthis.dataStoreContext,\n\t\t\t\t\t\tthis.dataStoreContext.storage,\n\t\t\t\t\t\tthis.logger,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t);\n\t\t\t\t\t// This is the case of rehydrating a detached container from snapshot. Now due to delay loading of\n\t\t\t\t\t// data store, if the data store is loaded after the container is attached, then we missed making\n\t\t\t\t\t// the channel visible. So do it now. Otherwise, add it to local channel context queue, so\n\t\t\t\t\t// that it can be make it visible later with the data store.\n\t\t\t\t\tif (dataStoreContext.attachState !== AttachState.Detached) {\n\t\t\t\t\t\tchannelContext.makeVisible();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.localChannelContextQueue.set(path, channelContext);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchannelContext = new RemoteChannelContext(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tdataStoreContext,\n\t\t\t\t\t\tdataStoreContext.storage,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tundefined /* extraBlobs */,\n\t\t\t\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(path, {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.contexts.set(path, channelContext);\n\t\t\t});\n\t\t}\n\n\t\tif (initializeEntryPoint) {\n\t\t\tconst promise = new LazyPromise(async () => initializeEntryPoint(this));\n\t\t\tthis.entryPoint = new FluidObjectHandle<FluidObject>(\n\t\t\t\tpromise,\n\t\t\t\t\"\",\n\t\t\t\tthis.objectsRoutingContext,\n\t\t\t);\n\t\t}\n\n\t\tthis.attachListener();\n\t\tthis._attachState = dataStoreContext.attachState;\n\n\t\t/**\n\t\t * If existing flag is false, this is a new data store and is not visible. The existing flag can be true in two\n\t\t * conditions:\n\t\t *\n\t\t * 1. It's a local data store that is created when a detached container is rehydrated. In this case, the data\n\t\t * store is locally visible because the snapshot it is loaded from contains locally visible data stores only.\n\t\t *\n\t\t * 2. It's a remote data store that is created when an attached container is loaded is loaded from snapshot or\n\t\t * when an attach op comes in. In both these cases, the data store is already globally visible.\n\t\t */\n\t\tif (existing) {\n\t\t\tthis.visibilityState =\n\t\t\t\tdataStoreContext.attachState === AttachState.Detached\n\t\t\t\t\t? VisibilityState.LocallyVisible\n\t\t\t\t\t: VisibilityState.GloballyVisible;\n\t\t} else {\n\t\t\tthis.visibilityState = VisibilityState.NotVisible;\n\t\t}\n\n\t\t// If it's existing we know it has been attached.\n\t\tif (existing) {\n\t\t\tthis.deferredAttached.resolve();\n\t\t}\n\n\t\t// By default, a data store can log maximum 10 local changes telemetry in summarizer.\n\t\tthis.localChangesTelemetryCount =\n\t\t\tthis.mc.config.getNumber(\"Fluid.Telemetry.LocalChangesTelemetryCount\") ?? 10;\n\t}\n\n\tpublic dispose(): void {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\n\t\tthis.emit(\"dispose\");\n\t\tthis.removeAllListeners();\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\treturn this.request(request);\n\t}\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tconst id = parser.pathParts[0];\n\n\t\t\tif (id === \"_channels\" || id === \"_custom\") {\n\t\t\t\treturn this.request(parser.createSubRequest(1));\n\t\t\t}\n\n\t\t\t// Check for a data type reference first\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tif (context !== undefined && parser.isLeaf(1)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst channel = await context.getChannel();\n\n\t\t\t\t\treturn { mimeType: \"fluid/object\", status: 200, value: channel };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t\t{ eventName: \"GetChannelFailedInRequest\" },\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn createResponseError(500, `Failed to get Channel: ${error}`, request);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise defer to an attached request handler\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\tpublic async getChannel(id: string): Promise<IChannel> {\n\t\tthis.verifyNotClosed();\n\n\t\tconst context = this.contexts.get(id);\n\t\tif (context === undefined) {\n\t\t\tthrow new LoggingError(\"Channel does not exist\");\n\t\t}\n\n\t\treturn context.getChannel();\n\t}\n\n\tpublic createChannel(id: string = uuid(), type: string): IChannel {\n\t\tif (id.includes(\"/\")) {\n\t\t\tthrow new UsageError(`Id cannot contain slashes: ${id}`);\n\t\t}\n\n\t\tthis.verifyNotClosed();\n\n\t\tassert(!this.contexts.has(id), 0x179 /* \"createChannel() with existing ID\" */);\n\t\tthis.notBoundedChannelContextSet.add(id);\n\t\tconst context = new LocalChannelContext(\n\t\t\tid,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\ttype,\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\tthis.logger,\n\t\t\t(content, localOpMetadata) => this.submitChannelOp(id, content, localOpMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t);\n\t\tthis.contexts.set(id, context);\n\n\t\t// Channels (DDS) should not be created in summarizer client.\n\t\tthis.identifyLocalChangeInSummarizer(\"DDSCreatedInSummarizer\", id, type);\n\n\t\treturn context.channel;\n\t}\n\n\t/**\n\t * Binds a channel with the runtime. If the runtime is attached we will attach the channel right away.\n\t * If the runtime is not attached we will defer the attach until the runtime attaches.\n\t * @param channel - channel to be registered.\n\t */\n\tpublic bindChannel(channel: IChannel): void {\n\t\tassert(\n\t\t\tthis.notBoundedChannelContextSet.has(channel.id),\n\t\t\t0x17b /* \"Channel to be bound should be in not bounded set\" */,\n\t\t);\n\t\tthis.notBoundedChannelContextSet.delete(channel.id);\n\t\t// If our data store is attached, then attach the channel.\n\t\tif (this.isAttached) {\n\t\t\tthis.attachChannel(channel);\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * If this channel is already waiting to be made visible, do nothing. This can happen during attachGraph() when\n\t\t * a channel's graph is attached. It calls bindToContext on the shared object which will end up back here.\n\t\t */\n\t\tif (this.pendingHandlesToMakeVisible.has(channel.handle)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bind(channel.handle);\n\n\t\t// If our data store is local then add the channel to the queue\n\t\tif (!this.localChannelContextQueue.has(channel.id)) {\n\t\t\tthis.localChannelContextQueue.set(\n\t\t\t\tchannel.id,\n\t\t\t\tthis.contexts.get(channel.id) as LocalChannelContextBase,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * This function is called when a data store becomes root. It does the following:\n\t *\n\t * 1. Marks the data store locally visible in the container.\n\t *\n\t * 2. Attaches the graph of all the handles bound to it.\n\t *\n\t * 3. Calls into the data store context to mark it visible in the container too. If the container is globally\n\t * visible, it will mark us globally visible. Otherwise, it will mark us globally visible when it becomes\n\t * globally visible.\n\t */\n\tpublic makeVisibleAndAttachGraph() {\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\treturn;\n\t\t}\n\t\tthis.visibilityState = VisibilityState.LocallyVisible;\n\n\t\tthis.pendingHandlesToMakeVisible.forEach((handle) => {\n\t\t\thandle.attachGraph();\n\t\t});\n\t\tthis.pendingHandlesToMakeVisible.clear();\n\t\tthis.dataStoreContext.makeLocallyVisible();\n\t}\n\n\t/**\n\t * This function is called when a handle to this data store is added to a visible DDS.\n\t */\n\tpublic attachGraph() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\t/**\n\t * @deprecated - Not necessary if consumers add a new dataStore to the container by storing its handle.\n\t * Binds this runtime to the container\n\t * This includes the following:\n\t * 1. Sending an Attach op that includes all existing state\n\t * 2. Attaching the graph if the data store becomes attached.\n\t */\n\tpublic bindToContext() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\t// If visible, attach the incoming handle's graph. Else, this will be done when we become visible.\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\thandle.attachGraph();\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingHandlesToMakeVisible.add(handle);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tthis.verifyNotClosed();\n\n\t\tfor (const [, object] of this.contexts) {\n\t\t\tobject.setConnectionState(connected, clientId);\n\t\t}\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n\n\tpublic getQuorum(): IQuorumClients {\n\t\treturn this.quorum;\n\t}\n\n\tpublic getAudience(): IAudience {\n\t\treturn this.audience;\n\t}\n\n\tpublic async uploadBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tthis.verifyNotClosed();\n\n\t\treturn this.dataStoreContext.uploadBlob(blob, signal);\n\t}\n\n\tprivate createRemoteChannelContext(\n\t\tattachMessage: IAttachMessage,\n\t\tsummarizerNodeParams: CreateChildSummarizerNodeParam,\n\t) {\n\t\tconst flatBlobs = new Map<string, ArrayBufferLike>();\n\t\tconst snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n\n\t\treturn new RemoteChannelContext(\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\t(content, localContentMetadata) =>\n\t\t\t\tthis.submitChannelOp(attachMessage.id, content, localContentMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\tattachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\tflatBlobs,\n\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(\n\t\t\t\tattachMessage.id,\n\t\t\t\tsummarizerNodeParams,\n\t\t\t),\n\t\t\tattachMessage.type,\n\t\t);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tswitch (message.type) {\n\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\tconst attachMessage = message.contents as IAttachMessage;\n\t\t\t\t\tconst id = attachMessage.id;\n\n\t\t\t\t\t// If a non-local operation then go and create the object\n\t\t\t\t\t// Otherwise mark it as officially attached.\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tthis.pendingAttach.delete(id),\n\t\t\t\t\t\t\t0x17c /* \"Unexpected attach (local) channel OP\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassert(!this.contexts.has(id), 0x17d /* \"Unexpected attach channel OP\" */);\n\n\t\t\t\t\t\tconst summarizerNodeParams = {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\t\tsnapshot: attachMessage.snapshot,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst remoteChannelContext = this.createRemoteChannelContext(\n\t\t\t\t\t\t\tattachMessage,\n\t\t\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.contexts.set(id, remoteChannelContext);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tthis.processChannelOp(message, local, localOpMetadata);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tthis.emit(\"op\", message);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"fluidDataStoreRuntimeFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic processSignal(message: IInboundSignalMessage, local: boolean) {\n\t\tthis.emit(\"signal\", message, local);\n\t}\n\n\tprivate isChannelAttached(id: string): boolean {\n\t\treturn (\n\t\t\t// Added in createChannel\n\t\t\t// Removed when bindChannel is called\n\t\t\t!this.notBoundedChannelContextSet.has(id) &&\n\t\t\t// Added in bindChannel only if this is not attached yet\n\t\t\t// Removed when this is attached by calling attachGraph\n\t\t\t!this.localChannelContextQueue.has(id) &&\n\t\t\t// Added in attachChannel called by bindChannel\n\t\t\t// Removed when attach op is broadcast\n\t\t\t!this.pendingAttach.has(id)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Currently, all contexts in this channel are considered\n\t * referenced and are hence outbound. This will change when we have root and non-root channel contexts.\n\t * The only root contexts will be considered as referenced.\n\t */\n\tprivate getOutboundRoutes(): string[] {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId] of this.contexts) {\n\t\t\toutboundRoutes.push(`${this.absolutePath}/${contextId}`);\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Updates the GC nodes of this channel. It does the following:\n\t * - Adds a back route to self to all its child GC nodes.\n\t * - Adds a node for this channel.\n\t * @param builder - The builder that contains the GC nodes for this channel's children.\n\t */\n\tprivate updateGCNodes(builder: GCDataBuilder) {\n\t\t// Add a back route to self in each child's GC nodes. If any child is referenced, then its parent should\n\t\t// be considered referenced as well.\n\t\tbuilder.addRouteToAllNodes(this.absolutePath);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", this.getOutboundRoutes());\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. This includes a list of GC nodes that represent this channel\n\t * including any of its child channel contexts. Each node has a set of outbound routes to other GC nodes in the\n\t * document. It does the following:\n\t *\n\t * 1. Calls into each child context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each channel context and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\t// Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n\t\t\t\t\t// graph so any references they might have won't be connected as well.\n\t\t\t\t\treturn this.isChannelAttached(contextId);\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\tthis.updateGCNodes(builder);\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this channel of routes that are used in it. It calls the child contexts to\n\t * update their used routes.\n\t * @param usedRoutes - The routes that are used in all contexts in this channel.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: string[]) {\n\t\t// Get a map of channel ids to routes used in it.\n\t\tconst usedContextRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedContextRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x17e /* \"Used route does not belong to any known context\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each context. Used routes is empty for unused context.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedContextRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n\t * all references added in the system.\n\t * @param srcHandle - The handle of the node that added the reference.\n\t * @param outboundHandle - The handle of the outbound node that is referenced.\n\t */\n\tprivate addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n\t\tthis.dataStoreContext.addedGCOutboundReference?.(srcHandle, outboundHandle);\n\t}\n\n\t/**\n\t * Returns a summary at the current sequence number.\n\t * @param fullTree - true to bypass optimizations and force a full summary tree\n\t * @param trackState - This tells whether we should track state from this summary.\n\t * @param telemetryContext - summary data passed through the layers for telemetry purposes\n\t */\n\tpublic async summarize(\n\t\tfullTree: boolean = false,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each data store and ask it to summarize\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\tconst isAttached = this.isChannelAttached(contextId);\n\t\t\t\t\t// We are not expecting local dds! Summary may not capture local state.\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisAttached,\n\t\t\t\t\t\t0x17f /* \"Not expecting detached channels during summarize\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// If the object is registered - and we have received the sequenced op creating the object\n\t\t\t\t\t// (i.e. it has a base mapping) - then we go ahead and summarize\n\t\t\t\t\treturn isAttached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\t/**\n\t\t * back-compat 0.59.1000 - getAttachSummary() is called when making a data store globally visible (previously\n\t\t * attaching state). Ideally, attachGraph() should have already be called making it locally visible. However,\n\t\t * before visibility state was added, this may not have been the case and getAttachSummary() could be called:\n\t\t *\n\t\t * 1. Before attaching the data store - When a detached container is attached.\n\t\t *\n\t\t * 2. After attaching the data store - When a data store is created and bound in an attached container.\n\t\t *\n\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t */\n\t\tthis.attachGraph();\n\n\t\t// This assert cannot be added now due to back-compat. To be uncommented when the following issue is fixed -\n\t\t// https://github.com/microsoft/FluidFramework/issues/9688.\n\t\t//\n\t\t// assert(this.visibilityState === VisibilityState.LocallyVisible,\n\t\t// \"The data store should be locally visible when generating attach summary\",\n\t\t// );\n\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Craft the .attributes file for each shared object\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tif (!(context instanceof LocalChannelContextBase)) {\n\t\t\t\tthrow new LoggingError(\"Should only be called with local channel handles\");\n\t\t\t}\n\n\t\t\tif (!this.notBoundedChannelContextSet.has(contextId)) {\n\t\t\t\tlet summaryTree: ISummaryTreeWithStats;\n\t\t\t\tif (context.isLoaded) {\n\t\t\t\t\tconst contextSummary = context.getAttachSummary(telemetryContext);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcontextSummary.summary.type === SummaryType.Tree,\n\t\t\t\t\t\t0x180 /* \"getAttachSummary should always return a tree\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = { stats: contextSummary.stats, summary: contextSummary.summary };\n\t\t\t\t} else {\n\t\t\t\t\t// If this channel is not yet loaded, then there should be no changes in the snapshot from which\n\t\t\t\t\t// it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!this.dataStoreContext.baseSnapshot,\n\t\t\t\t\t\t0x181 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\tthis.dataStoreContext.baseSnapshot.trees[contextId],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsummaryBuilder.addWithStats(contextId, summaryTree);\n\t\t\t}\n\t\t}\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic submitMessage(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.submit(type, content, localOpMetadata);\n\t}\n\n\tpublic submitSignal(type: string, content: any) {\n\t\tthis.verifyNotClosed();\n\t\treturn this.dataStoreContext.submitSignal(type, content);\n\t}\n\n\t/**\n\t * Will return when the data store is attached.\n\t */\n\tpublic async waitAttached(): Promise<void> {\n\t\treturn this.deferredAttached.promise;\n\t}\n\n\t/**\n\t * Attach channel should only be called after the data store has been attached\n\t */\n\tprivate attachChannel(channel: IChannel): void {\n\t\tthis.verifyNotClosed();\n\t\t// If this handle is already attached no need to attach again.\n\t\tif (channel.handle.isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.handle.attachGraph();\n\n\t\tassert(this.isAttached, 0x182 /* \"Data store should be attached to attach the channel.\" */);\n\t\tassert(\n\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t0x2d0 /* \"Data store should be globally visible to attach channels.\" */,\n\t\t);\n\n\t\tconst summarizeResult = summarizeChannel(\n\t\t\tchannel,\n\t\t\ttrue /* fullTree */,\n\t\t\tfalse /* trackState */,\n\t\t);\n\t\t// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.\n\t\tconst snapshot = convertSummaryTreeToITree(summarizeResult.summary);\n\n\t\tconst message: IAttachMessage = {\n\t\t\tid: channel.id,\n\t\t\tsnapshot,\n\t\t\ttype: channel.attributes.type,\n\t\t};\n\t\tthis.pendingAttach.add(channel.id);\n\t\tthis.submit(DataStoreMessageType.Attach, message);\n\n\t\tconst context = this.contexts.get(channel.id) as LocalChannelContextBase;\n\t\tcontext.makeVisible();\n\t}\n\n\tprivate submitChannelOp(address: string, contents: any, localOpMetadata: unknown) {\n\t\tconst envelope: IEnvelope = { address, contents };\n\t\tthis.submit(DataStoreMessageType.ChannelOp, envelope, localOpMetadata);\n\t}\n\n\tprivate submit(\n\t\ttype: DataStoreMessageType,\n\t\tcontent: any,\n\t\tlocalOpMetadata: unknown = undefined,\n\t): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.submitMessage(type, content, localOpMetadata);\n\t}\n\n\t/**\n\t * For messages of type MessageType.Operation, finds the right channel and asks it to resubmit the message.\n\t * For all other messages, just submit it again.\n\t * This typically happens when we reconnect and there are unacked messages.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic reSubmit(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x183 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.reSubmit(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.Attach:\n\t\t\t\t// For Attach messages, just submit them again.\n\t\t\t\tthis.submit(type, content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\t/**\n\t * Revert a local op.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic rollback?(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x2ed /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.rollback(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new LoggingError(`Can't rollback ${type} message`);\n\t\t}\n\t}\n\n\tpublic async applyStashedOp(content: any): Promise<unknown> {\n\t\tconst type = content?.type as DataStoreMessageType;\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\tconst attachMessage = content.content as IAttachMessage;\n\t\t\t\t// local means this node will throw if summarized; this is fine because only interactive clients will have stashed ops\n\t\t\t\tconst summarizerNodeParams: CreateChildSummarizerNodeParam = {\n\t\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t\t};\n\t\t\t\tconst context = this.createRemoteChannelContext(\n\t\t\t\t\tattachMessage,\n\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t);\n\t\t\t\tthis.pendingAttach.add(attachMessage.id);\n\t\t\t\tthis.contexts.set(attachMessage.id, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\tconst envelope = content.content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x184 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tawait channelContext.getChannel();\n\t\t\t\treturn channelContext.applyStashedOp(envelope.contents);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\tprivate setChannelDirty(address: string): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.setChannelDirty(address);\n\t}\n\n\tprivate processChannelOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tthis.verifyNotClosed();\n\n\t\tconst envelope = message.contents as IEnvelope;\n\n\t\tconst transformed: ISequencedDocumentMessage = {\n\t\t\t...message,\n\t\t\tcontents: envelope.contents,\n\t\t};\n\n\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\tassert(!!channelContext, 0x185 /* \"Channel not found\" */);\n\t\tchannelContext.processOp(transformed, local, localOpMetadata);\n\n\t\treturn channelContext;\n\t}\n\n\tprivate attachListener() {\n\t\tthis.setMaxListeners(Number.MAX_SAFE_INTEGER);\n\t\tthis.dataStoreContext.once(\"attaching\", () => {\n\t\t\t/**\n\t\t\t * back-compat 0.59.1000 - Ideally, attachGraph() should have already been called making the data store\n\t\t\t * locally visible. However, before visibility state was added, this may not have been the case and data\n\t\t\t * store can move to \"attaching\" state in 2 scenarios:\n\t\t\t * 1) Before attachGraph() is called - When a data store is created and bound in an attached container.\n\t\t\t * 2) After attachGraph() is called - When a detached container is attached.\n\t\t\t *\n\t\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t\t */\n\t\t\tthis.attachGraph();\n\n\t\t\tthis._attachState = AttachState.Attaching;\n\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.LocallyVisible,\n\t\t\t\t0x2d1 /* \"Data store should be locally visible before it can become globally visible.\" */,\n\t\t\t);\n\n\t\t\t// Mark the data store globally visible and make its child channels visible as well.\n\t\t\tthis.visibilityState = VisibilityState.GloballyVisible;\n\t\t\tthis.localChannelContextQueue.forEach((channel) => {\n\t\t\t\tchannel.makeVisible();\n\t\t\t});\n\t\t\tthis.localChannelContextQueue.clear();\n\n\t\t\t// This promise resolution will be moved to attached event once we fix the scheduler.\n\t\t\tthis.deferredAttached.resolve();\n\t\t\tthis.emit(\"attaching\");\n\t\t});\n\t\tthis.dataStoreContext.once(\"attached\", () => {\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t\t0x2d2 /* \"Data store should be globally visible when its attached.\" */,\n\t\t\t);\n\t\t\tthis._attachState = AttachState.Attached;\n\t\t\tthis.emit(\"attached\");\n\t\t});\n\t}\n\n\tprivate verifyNotClosed() {\n\t\tif (this._disposed) {\n\t\t\tthrow new LoggingError(\"Runtime is closed\");\n\t\t}\n\t}\n\n\t/**\n\t * Summarizer client should not have local changes. These changes can become part of the summary and can break\n\t * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas\n\t * other clients that are up-to-date till seq# 100 may not have them yet.\n\t */\n\tprivate identifyLocalChangeInSummarizer(\n\t\teventName: string,\n\t\tchannelId: string,\n\t\tchannelType: string,\n\t) {\n\t\tif (this.clientDetails.type !== \"summarizer\" || this.localChangesTelemetryCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Log a telemetry if there are local changes in the summarizer. This will give us data on how often\n\t\t// this is happening and which data stores do this. The eventual goal is to disallow local changes\n\t\t// in the summarizer and the data will help us plan this.\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName,\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType,\n\t\t\t\tchannelId,\n\t\t\t\tfluidDataStoreId: this.id,\n\t\t\t\tfluidDataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n\t\t\t}),\n\t\t\tstack: generateStack(),\n\t\t});\n\t\tthis.localChangesTelemetryCount--;\n\t}\n}\n\n/**\n * Mixin class that adds request handler to FluidDataStoreRuntime\n * Request handler is only called when data store can't resolve request, i.e. for custom requests.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n * @param requestHandler - request handler to mix in\n */\nexport const mixinRequestHandler = (\n\trequestHandler: (request: IRequest, runtime: FluidDataStoreRuntime) => Promise<IResponse>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithRequestHandler extends Base {\n\t\tpublic async request(request: IRequest) {\n\t\t\tconst response = await super.request(request);\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn requestHandler(request, this);\n\t\t\t}\n\t\t\treturn response;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n\n/**\n * Mixin class that adds await for DataObject to finish initialization before we proceed to summary.\n * @param handler - handler that returns info about blob to be added to summary.\n * Or undefined not to add anything to summary.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n */\nexport const mixinSummaryHandler = (\n\thandler: (\n\t\truntime: FluidDataStoreRuntime,\n\t) => Promise<{ path: string[]; content: string } | undefined>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithSummarizerHandler extends Base {\n\t\tprivate addBlob(summary: ISummaryTreeWithStats, path: string[], content: string) {\n\t\t\tconst firstName = path.shift();\n\t\t\tif (firstName === undefined) {\n\t\t\t\tthrow new LoggingError(\"Path can't be empty\");\n\t\t\t}\n\n\t\t\tlet blob: ISummaryTree | ISummaryBlob = {\n\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tsummary.stats.blobNodeCount++;\n\t\t\tsummary.stats.totalBlobSize += content.length;\n\n\t\t\tfor (const name of path.reverse()) {\n\t\t\t\tblob = {\n\t\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\t\ttree: { [name]: blob },\n\t\t\t\t};\n\t\t\t\tsummary.stats.treeNodeCount++;\n\t\t\t}\n\t\t\tsummary.summary.tree[firstName] = blob;\n\t\t}\n\n\t\tasync summarize(...args: any[]) {\n\t\t\tconst summary = await super.summarize(...args);\n\t\t\tconst content = await handler(this);\n\t\t\tif (content !== undefined) {\n\t\t\t\tthis.addBlob(summary, content.path, content.content);\n\t\t\t}\n\t\t\treturn summary;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n"]}
|
|
1
|
+
{"version":3,"file":"dataStoreRuntime.js","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAiE;AACjE,qEAUyC;AAQzC,2DAA4F;AAC5F,iFAK+C;AAC/C,+DAAiE;AACjE,+EAQ8C;AAC9C,6EAa6C;AAC7C,iEAYuC;AAOvC,+BAAkC;AAClC,qDAAqE;AACrE,+DAI+B;AAC/B,iEAA8D;AAC9D,+CAAkD;AAElD,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC/B,wBAAwB;IACxB,yCAAiB,CAAA;IACjB,wCAAgB,CAAA;AACjB,CAAC,EAJW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAI/B;AAQD;;GAEG;AACH,MAAa,qBACZ,SAAQ,gCAA+C;IAmIvD;;;;;;;;;;OAUG;IACH,YACkB,gBAAwC,EACxC,oBAA2C,EAC5D,QAAiB,EACjB,oBAAgF;QAEhF,KAAK,EAAE,CAAC;QALS,qBAAgB,GAAhB,gBAAgB,CAAwB;QACxC,yBAAoB,GAApB,oBAAoB,CAAuB;QA9DrD,cAAS,GAAG,KAAK,CAAC;QAKT,aAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC9C,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,qBAAgB,GAAG,IAAI,qBAAQ,EAAQ,CAAC;QACxC,6BAAwB,GAAG,IAAI,GAAG,EAAmC,CAAC;QACtE,gCAA2B,GAAG,IAAI,GAAG,EAAU,CAAC;QAGjE,kHAAkH;QAClH,yBAAyB;QACR,gCAA2B,GAAsB,IAAI,GAAG,EAAE,CAAC;QAqD3E,IAAA,mBAAM,EACL,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAClC,KAAK,CAAC,6EAA6E,CACnF,CAAC;QAEF,IAAI,CAAC,EAAE,GAAG,IAAA,8CAA4B,EAAC;YACtC,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,SAAS,EAAE,uBAAuB;YAClC,UAAU,EAAE;gBACX,GAAG,EAAE,EAAE,WAAW,EAAE,IAAA,SAAI,GAAE,EAAE;aAC5B;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAE/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC;QAE3C,mEAAmE;QACnE,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxC,cAAc;gBACd,IAAI,IAAI,KAAK,SAAS,EAAE;oBACvB,OAAO;iBACP;gBAED,IAAI,cAAoE,CAAC;gBACzE,sGAAsG;gBACtG,sGAAsG;gBACtG,6DAA6D;gBAC7D,IAAI,gBAAgB,CAAC,gBAAgB,EAAE;oBACtC,cAAc,GAAG,IAAI,mDAA6B,CACjD,IAAI,EACJ,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,IAAI,CAAC,MAAM,EACX,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EACrD,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAChB,CAAC;oBACF,kGAAkG;oBAClG,iGAAiG;oBACjG,0FAA0F;oBAC1F,4DAA4D;oBAC5D,IAAI,gBAAgB,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,EAAE;wBAC1D,cAAc,CAAC,WAAW,EAAE,CAAC;qBAC7B;yBAAM;wBACN,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;qBACxD;iBACD;qBAAM;oBACN,cAAc,GAAG,IAAI,2CAAoB,CACxC,IAAI,EACJ,gBAAgB,EAChB,gBAAgB,CAAC,OAAO,EACxB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EACrD,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAChB,IAAI,CAAC,oBAAoB,EACzB,SAAS,CAAC,gBAAgB,EAC1B,IAAI,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,IAAI,EAAE;wBAC1D,IAAI,EAAE,gDAA0B,CAAC,WAAW;qBAC5C,CAAC,CACF,CAAC;iBACF;gBAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;SACH;QAED,IAAI,oBAAoB,EAAE;YACzB,MAAM,OAAO,GAAG,IAAI,wBAAW,CAAC,KAAK,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,IAAI,+BAAiB,CACtC,OAAO,EACP,EAAE,EACF,IAAI,CAAC,qBAAqB,CAC1B,CAAC;SACF;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC;QAEjD;;;;;;;;;WASG;QACH,IAAI,QAAQ,EAAE;YACb,IAAI,CAAC,eAAe;gBACnB,gBAAgB,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ;oBACpD,CAAC,CAAC,qCAAe,CAAC,cAAc;oBAChC,CAAC,CAAC,qCAAe,CAAC,eAAe,CAAC;SACpC;aAAM;YACN,IAAI,CAAC,eAAe,GAAG,qCAAe,CAAC,UAAU,CAAC;SAClD;QAED,iDAAiD;QACjD,IAAI,QAAQ,EAAE;YACb,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;SAChC;QAED,qFAAqF;QACrF,IAAI,CAAC,0BAA0B;YAC9B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,4CAA4C,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IA3QD;;;;;;;OAOG;IACI,MAAM,CAAC,IAAI,CACjB,OAA+B,EAC/B,oBAA2C,EAC3C,QAAiB;QAEjB,OAAO,IAAI,qBAAqB,CAC/B,OAAO,EACP,oBAAoB,EACpB,QAAQ,EACR,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC,IAAA,kCAAkB,EAAC,gBAAgB,EAAE,GAAG,CAAC,CACrE,CAAC;IACH,CAAC;IAOD;;OAEG;IACH,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACxC,CAAC;IAED,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,CAAC;IAClD,CAAC;IAED,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAA,yCAAyB,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;IAClD,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,IAAW,mBAAmB;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAW,kBAAkB;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAW,sBAAsB;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAW,qBAAqB;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAGD,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAoBD,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;IASD;;;;;;;OAOG;IACI,wBAAwB,CAAI,QAAiB;QACnD,uBAAuB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,KAAK,SAAS;YAClE,CAAC,CAAC,QAAQ,EAAE;YACZ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IA+IM,OAAO;QACb,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO;SACP;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAiB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,IAAI;YACH,MAAM,MAAM,GAAG,6BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,SAAS,EAAE;gBAC3C,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;aACtD;YAED,wCAAwC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC9C,IAAI;oBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;oBAE3C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;iBACjE;gBAAC,OAAO,KAAK,EAAE;oBACf,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAC5B,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAC1C,KAAK,CACL,CAAC;oBAEF,OAAO,IAAA,mCAAmB,EAAC,GAAG,EAAE,0BAA0B,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;iBAC5E;aACD;YAED,iDAAiD;YACjD,OAAO,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC;SAClC;QAAC,OAAO,KAAK,EAAE;YACf,OAAO,IAAA,mCAAmB,EAAC,KAAK,CAAC,CAAC;SAClC;IACF,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,EAAU;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,8BAAY,CAAC,wBAAwB,CAAC,CAAC;SACjD;QAED,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,KAAa,IAAA,SAAI,GAAE,EAAE,IAAY;QACrD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,IAAI,4BAAU,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;SACzD;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAA,mBAAM,EAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/E,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,yCAAmB,CACtC,EAAE,EACF,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,IAAI,CAAC,MAAM,EACX,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,EAChF,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,CACzD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAE/B,6DAA6D;QAC7D,IAAI,CAAC,+BAA+B,CAAC,wBAAwB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzE,OAAO,OAAO,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,OAAiB;QACnC,IAAA,mBAAM,EACL,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAChD,KAAK,CAAC,wDAAwD,CAC9D,CAAC;QACF,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,0DAA0D;QAC1D,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO;SACP;QAED;;;WAGG;QACH,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzD,OAAO;SACP;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1B,+DAA+D;QAC/D,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACnD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAChC,OAAO,CAAC,EAAE,EACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAA4B,CACxD,CAAC;SACF;IACF,CAAC;IAED;;;;;;;;;;OAUG;IACI,yBAAyB;QAC/B,IAAI,IAAI,CAAC,eAAe,KAAK,qCAAe,CAAC,UAAU,EAAE;YACxD,OAAO;SACP;QACD,IAAI,CAAC,eAAe,GAAG,qCAAe,CAAC,cAAc,CAAC;QAEtD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACnD,MAAM,CAAC,WAAW,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,WAAW;QACjB,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACI,aAAa;QACnB,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAEM,IAAI,CAAC,MAAoB;QAC/B,kGAAkG;QAClG,IAAI,IAAI,CAAC,eAAe,KAAK,qCAAe,CAAC,UAAU,EAAE;YACxD,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;SACP;QACD,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEM,kBAAkB,CAAC,SAAkB,EAAE,QAAiB;QAC9D,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACvC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;SAC/C;QAED,IAAA,qCAAmB,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,UAAU,CACtB,IAAqB,EACrB,MAAoB;QAEpB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAEO,0BAA0B,CACjC,aAA6B,EAC7B,oBAAoD;QAEpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,MAAM,YAAY,GAAG,IAAA,gCAAiB,EAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElF,OAAO,IAAI,2CAAoB,CAC9B,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,CACjC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,EACtE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,aAAa,CAAC,EAAE,EAChB,YAAY,EACZ,IAAI,CAAC,oBAAoB,EACzB,SAAS,EACT,IAAI,CAAC,gBAAgB,CAAC,8BAA8B,CACnD,aAAa,CAAC,EAAE,EAChB,oBAAoB,CACpB,EACD,aAAa,CAAC,IAAI,CAClB,CAAC;IACH,CAAC;IAEM,OAAO,CAAC,OAAkC,EAAE,KAAc,EAAE,eAAwB;QAC1F,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI;YACH,sFAAsF;YACtF,QAAQ,OAAO,CAAC,IAAI,EAAE;gBACrB,KAAK,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBACjC,MAAM,aAAa,GAAG,OAAO,CAAC,QAA0B,CAAC;oBACzD,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;oBAE5B,yDAAyD;oBACzD,4CAA4C;oBAC5C,IAAI,KAAK,EAAE;wBACV,IAAA,mBAAM,EACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAC7B,KAAK,CAAC,4CAA4C,CAClD,CAAC;qBACF;yBAAM;wBACN,IAAA,mBAAM,EAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;wBAE3E,MAAM,oBAAoB,GAAG;4BAC5B,IAAI,EAAE,gDAA0B,CAAC,UAAU;4BAC3C,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,QAAQ,EAAE,aAAa,CAAC,QAAQ;yBAChC,CAAC;wBAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,CAC3D,aAAa,EACb,oBAAoB,CACpB,CAAC;wBACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;qBAC5C;oBACD,MAAM;iBACN;gBAED,KAAK,oBAAoB,CAAC,SAAS;oBAClC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;oBACvD,MAAM;gBACP,QAAQ;aACR;YAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACzB;QAAC,OAAO,KAAK,EAAE;YACf,MAAM,qCAAmB,CAAC,kBAAkB,CAC3C,KAAK,EACL,6CAA6C,EAC7C,OAAO,CACP,CAAC;SACF;IACF,CAAC;IAEM,aAAa,CAAC,OAA8B,EAAE,KAAc;QAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,iBAAiB,CAAC,EAAU;QACnC,OAAO;QACN,yBAAyB;QACzB,qCAAqC;QACrC,CAAC,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,wDAAwD;YACxD,uDAAuD;YACvD,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,+CAA+C;YAC/C,sCAAsC;YACtC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAC3B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,iBAAiB;QACxB,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACxC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC,CAAC;SACzD;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,OAAsB;QAC3C,wGAAwG;QACxG,oCAAoC;QACpC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9C,8DAA8D;QAC9D,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,SAAS,CAAC,SAAkB,KAAK;QAC7C,MAAM,OAAO,GAAG,IAAI,6BAAa,EAAE,CAAC;QACpC,2DAA2D;QAC3D,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,kGAAkG;YAClG,sEAAsE;YACtE,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC,CAAC;aACD,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;YACnC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtD,wGAAwG;YACxG,6EAA6E;YAC7E,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,UAAoB;QAC3C,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,IAAA,0CAA0B,EAAC,UAAU,CAAC,CAAC;QAEjE,2CAA2C;QAC3C,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,iBAAiB,EAAE;YACrC,IAAA,mBAAM,EACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EACrB,KAAK,CAAC,uDAAuD,CAC7D,CAAC;SACF;QAED,mFAAmF;QACnF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SACjE;IACF,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAAC,SAAuB,EAAE,cAA4B;QACrF,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,SAAS,CACrB,WAAoB,KAAK,EACzB,aAAsB,IAAI,EAC1B,gBAAoC;QAEpC,MAAM,cAAc,GAAG,IAAI,kCAAkB,EAAE,CAAC;QAEhD,uDAAuD;QACvD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACrD,uEAAuE;YACvE,IAAA,mBAAM,EACL,UAAU,EACV,KAAK,CAAC,wDAAwD,CAC9D,CAAC;YACF,0FAA0F;YAC1F,gEAAgE;YAChE,OAAO,UAAU,CAAC;QACnB,CAAC,CAAC;aACD,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;YACnC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,CAC7C,QAAQ,EACR,UAAU,EACV,gBAAgB,CAChB,CAAC;YACF,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACxD,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,cAAc,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAEM,gBAAgB,CAAC,gBAAoC;QAC3D;;;;;;;;;;WAUG;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,4GAA4G;QAC5G,2DAA2D;QAC3D,EAAE;QACF,kEAAkE;QAClE,8EAA8E;QAC9E,KAAK;QAEL,MAAM,cAAc,GAAG,IAAI,kCAAkB,EAAE,CAAC;QAEhD,oDAAoD;QACpD,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,IAAI,CAAC,CAAC,OAAO,YAAY,6CAAuB,CAAC,EAAE;gBAClD,MAAM,IAAI,8BAAY,CAAC,kDAAkD,CAAC,CAAC;aAC3E;YAED,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBACrD,IAAI,WAAkC,CAAC;gBACvC,IAAI,OAAO,CAAC,QAAQ,EAAE;oBACrB,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;oBAClE,IAAA,mBAAM,EACL,cAAc,CAAC,OAAO,CAAC,IAAI,KAAK,kCAAW,CAAC,IAAI,EAChD,KAAK,CAAC,oDAAoD,CAC1D,CAAC;oBACF,WAAW,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC;iBAC/E;qBAAM;oBACN,gGAAgG;oBAChG,iFAAiF;oBACjF,IAAA,mBAAM,EACL,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EACpC,KAAK,CAAC,+EAA+E,CACrF,CAAC;oBACF,WAAW,GAAG,IAAA,gDAAgC,EAC7C,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CACnD,CAAC;iBACF;gBACD,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;aACpD;SACD;QAED,OAAO,cAAc,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,IAA0B,EAAE,OAAY,EAAE,eAAwB;QACtF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC;IAEM,YAAY,CAAC,IAAY,EAAE,OAAY;QAC7C,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAiB;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,8DAA8D;QAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;YAC9B,OAAO;SACP;QAED,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE7B,IAAA,mBAAM,EAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5F,IAAA,mBAAM,EACL,IAAI,CAAC,eAAe,KAAK,qCAAe,CAAC,eAAe,EACxD,KAAK,CAAC,iEAAiE,CACvE,CAAC;QAEF,MAAM,eAAe,GAAG,IAAA,iCAAgB,EACvC,OAAO,EACP,IAAI,CAAC,cAAc,EACnB,KAAK,CAAC,gBAAgB,CACtB,CAAC;QACF,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,IAAA,yCAAyB,EAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAmB;YAC/B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;SAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAA4B,CAAC;QACzE,OAAO,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,QAAa,EAAE,eAAwB;QAC/E,MAAM,QAAQ,GAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACxE,CAAC;IAEO,MAAM,CACb,IAA0B,EAC1B,OAAY,EACZ,kBAA2B,SAAS;QAEpC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;OAMG;IACI,QAAQ,CAAC,IAA0B,EAAE,OAAY,EAAE,eAAwB;QACjF,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,OAAoB,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAA,mBAAM,EACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC5D,MAAM;aACN;YACD,KAAK,oBAAoB,CAAC,MAAM;gBAC/B,+CAA+C;gBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;gBAC5C,MAAM;YACP;gBACC,IAAA,4BAAe,EAAC,IAAI,CAAC,CAAC;SACvB;IACF,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAE,IAA0B,EAAE,OAAY,EAAE,eAAwB;QAClF,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,OAAoB,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAA,mBAAM,EACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC5D,MAAM;aACN;YACD;gBACC,MAAM,IAAI,8BAAY,CAAC,kBAAkB,IAAI,UAAU,CAAC,CAAC;SAC1D;IACF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,OAAY;QACvC,MAAM,IAAI,GAAG,OAAO,EAAE,IAA4B,CAAC;QACnD,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAyB,CAAC;gBACxD,sHAAsH;gBACtH,MAAM,oBAAoB,GAAmC;oBAC5D,IAAI,EAAE,gDAA0B,CAAC,KAAK;iBACtC,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAC9C,aAAa,EACb,oBAAoB,CACpB,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC7C,OAAO;aACP;YACD,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAoB,CAAC;gBAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAA,mBAAM,EACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;gBAClC,OAAO,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACxD;YACD;gBACC,IAAA,4BAAe,EAAC,IAAI,CAAC,CAAC;SACvB;IACF,CAAC;IAEO,eAAe,CAAC,OAAe;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAEO,gBAAgB,CACvB,OAAkC,EAClC,KAAc,EACd,eAAwB;QAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAqB,CAAC;QAE/C,MAAM,WAAW,GAA8B;YAC9C,GAAG,OAAO;YACV,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC3B,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAA,mBAAM,EAAC,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAE9D,OAAO,cAAc,CAAC;IACvB,CAAC;IAEO,cAAc;QACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5C;;;;;;;;eAQG;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,IAAI,CAAC,YAAY,GAAG,mCAAW,CAAC,SAAS,CAAC;YAE1C,IAAA,mBAAM,EACL,IAAI,CAAC,eAAe,KAAK,qCAAe,CAAC,cAAc,EACvD,KAAK,CAAC,mFAAmF,CACzF,CAAC;YAEF,oFAAoF;YACpF,IAAI,CAAC,eAAe,GAAG,qCAAe,CAAC,eAAe,CAAC;YACvD,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjD,OAAO,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;YAEtC,qFAAqF;YACrF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAC3C,IAAA,mBAAM,EACL,IAAI,CAAC,eAAe,KAAK,qCAAe,CAAC,eAAe,EACxD,KAAK,CAAC,gEAAgE,CACtE,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,mCAAW,CAAC,QAAQ,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,eAAe;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,8BAAY,CAAC,mBAAmB,CAAC,CAAC;SAC5C;IACF,CAAC;IAED;;;;OAIG;IACK,+BAA+B,CACtC,SAAiB,EACjB,SAAiB,EACjB,WAAmB;QAEnB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,0BAA0B,IAAI,CAAC,EAAE;YACrF,OAAO;SACP;QAED,oGAAoG;QACpG,kGAAkG;QAClG,yDAAyD;QACzD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC;YACjC,SAAS;YACT,GAAG,IAAA,kCAAgB,EAAC;gBACnB,WAAW;gBACX,SAAS;gBACT,gBAAgB,EAAE,IAAI,CAAC,EAAE;gBACzB,yBAAyB,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;aACtE,CAAC;YACF,KAAK,EAAE,IAAA,+BAAa,GAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACnC,CAAC;CACD;AAjgCD,sDAigCC;AAED;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,CAClC,cAAyF,EACzF,OAAqC,qBAAqB,EACzD,EAAE,CACH,MAAM,yBAA0B,SAAQ,IAAI;IACpC,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC5B,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACrC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;CAC+B,CAAC;AAZtB,QAAA,mBAAmB,uBAYG;AAEnC;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,CAClC,OAE6D,EAC7D,OAAqC,qBAAqB,EACzD,EAAE,CACH,MAAM,4BAA6B,SAAQ,IAAI;IACtC,OAAO,CAAC,OAA8B,EAAE,IAAc,EAAE,OAAe;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,MAAM,IAAI,8BAAY,CAAC,qBAAqB,CAAC,CAAC;SAC9C;QAED,IAAI,IAAI,GAAgC;YACvC,IAAI,EAAE,kCAAW,CAAC,IAAI;YACtB,OAAO;SACP,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,GAAG;gBACN,IAAI,EAAE,kCAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;aACtB,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;SAC9B;QACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAG,IAAW;QAC7B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE/C,IAAI;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,KAAK,SAAS,EAAE;gBAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;aACrD;SACD;QAAC,OAAO,CAAC,EAAE;YACX,qFAAqF;YACrF,MAAM,qCAAmB,CAAC,kBAAkB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;SACvE;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CAC+B,CAAC;AA7CtB,QAAA,mBAAmB,uBA6CG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataProcessingError,\n\tITelemetryLoggerExt,\n\tgenerateStack,\n\tLoggingError,\n\tMonitoringContext,\n\traiseConnectedEvent,\n\tcreateChildMonitoringContext,\n\ttagCodeArtifacts,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tFluidObject,\n\tIFluidHandle,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred, LazyPromise, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIAudience,\n\tIDeltaManager,\n\tAttachState,\n\tILoaderOptions,\n} from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISummaryBlob,\n\tISummaryTree,\n\tIQuorumClients,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreChannel,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tISummaryTreeWithStats,\n\tVisibilityState,\n\tITelemetryContext,\n\tIIdCompressor,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertSummaryTreeToITree,\n\tgenerateHandleContextPath,\n\tRequestParser,\n\tSummaryTreeBuilder,\n\tcreate404Response,\n\tcreateResponseError,\n\texceptionToResponse,\n\tGCDataBuilder,\n\trequestFluidObject,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tIChannel,\n\tIFluidDataStoreRuntime,\n\tIFluidDataStoreRuntimeEvents,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IChannelContext, summarizeChannel } from \"./channelContext\";\nimport {\n\tLocalChannelContext,\n\tLocalChannelContextBase,\n\tRehydratedLocalChannelContext,\n} from \"./localChannelContext\";\nimport { RemoteChannelContext } from \"./remoteChannelContext\";\nimport { FluidObjectHandle } from \"./fluidHandle\";\n\nexport enum DataStoreMessageType {\n\t// Creates a new channel\n\tAttach = \"attach\",\n\tChannelOp = \"op\",\n}\n\nexport interface ISharedObjectRegistry {\n\t// TODO consider making this async. A consequence is that either the creation of a distributed data type\n\t// is async or we need a new API to split the synchronous vs. asynchronous creation.\n\tget(name: string): IChannelFactory | undefined;\n}\n\n/**\n * Base data store class\n */\nexport class FluidDataStoreRuntime\n\textends TypedEventEmitter<IFluidDataStoreRuntimeEvents>\n\timplements IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext\n{\n\t/**\n\t * @deprecated - Instantiate the class using its constructor instead.\n\t *\n\t * Loads the data store runtime\n\t * @param context - The data store context\n\t * @param sharedObjectRegistry - The registry of shared objects used by this data store\n\t * @param existing - If loading from an existing file.\n\t */\n\tpublic static load(\n\t\tcontext: IFluidDataStoreContext,\n\t\tsharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t): FluidDataStoreRuntime {\n\t\treturn new FluidDataStoreRuntime(\n\t\t\tcontext,\n\t\t\tsharedObjectRegistry,\n\t\t\texisting,\n\t\t\tasync (dataStoreRuntime) => requestFluidObject(dataStoreRuntime, \"/\"),\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IFluidDataStoreRuntime.entryPoint}\n\t */\n\tpublic readonly entryPoint?: IFluidHandle<FluidObject>;\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic get IFluidRouter() {\n\t\treturn this;\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn this.dataStoreContext.connected;\n\t}\n\n\tpublic get clientId(): string | undefined {\n\t\treturn this.dataStoreContext.clientId;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.dataStoreContext.clientDetails;\n\t}\n\n\tpublic get isAttached(): boolean {\n\t\treturn this.attachState !== AttachState.Detached;\n\t}\n\n\tpublic get attachState(): AttachState {\n\t\treturn this._attachState;\n\t}\n\n\tpublic get absolutePath(): string {\n\t\treturn generateHandleContextPath(this.id, this.routeContext);\n\t}\n\n\tpublic get routeContext(): IFluidHandleContext {\n\t\treturn this.dataStoreContext.IFluidHandleContext;\n\t}\n\n\tpublic get idCompressor(): IIdCompressor | undefined {\n\t\treturn this.dataStoreContext.idCompressor;\n\t}\n\n\tpublic get IFluidHandleContext() {\n\t\treturn this;\n\t}\n\n\tpublic get rootRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get channelsRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get objectsRoutingContext() {\n\t\treturn this;\n\t}\n\n\tprivate _disposed = false;\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate readonly contexts = new Map<string, IChannelContext>();\n\tprivate readonly pendingAttach = new Set<string>();\n\n\tprivate readonly deferredAttached = new Deferred<void>();\n\tprivate readonly localChannelContextQueue = new Map<string, LocalChannelContextBase>();\n\tprivate readonly notBoundedChannelContextSet = new Set<string>();\n\tprivate _attachState: AttachState;\n\tpublic visibilityState: VisibilityState;\n\t// A list of handles that are bound when the data store is not visible. We have to make them visible when the data\n\t// store becomes visible.\n\tprivate readonly pendingHandlesToMakeVisible: Set<IFluidHandle> = new Set();\n\n\tpublic readonly id: string;\n\tpublic readonly options: ILoaderOptions;\n\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\tprivate readonly quorum: IQuorumClients;\n\tprivate readonly audience: IAudience;\n\tprivate readonly mc: MonitoringContext;\n\tpublic get logger(): ITelemetryLoggerExt {\n\t\treturn this.mc.logger;\n\t}\n\n\t/**\n\t * If the summarizer makes local changes, a telemetry event is logged. This has the potential to be very noisy.\n\t * So, adding a count of how many telemetry events are logged per data store context. This can be\n\t * controlled via feature flags.\n\t */\n\tprivate localChangesTelemetryCount: number;\n\n\t/**\n\t * Invokes the given callback and expects that no ops are submitted\n\t * until execution finishes. If an op is submitted, an error will be raised.\n\t *\n\t * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t *\n\t * @param callback - the callback to be invoked\n\t */\n\tpublic ensureNoDataModelChanges<T>(callback: () => T): T {\n\t\t// back-compat ADO:2309\n\t\treturn this.dataStoreContext.ensureNoDataModelChanges === undefined\n\t\t\t? callback()\n\t\t\t: this.dataStoreContext.ensureNoDataModelChanges(callback);\n\t}\n\n\t/**\n\t * Create an instance of a DataStore runtime.\n\t *\n\t * @param dataStoreContext - Context object for the runtime.\n\t * @param sharedObjectRegistry - The registry of shared objects that this data store will be able to instantiate.\n\t * @param existing - Pass 'true' if loading this datastore from an existing file; pass 'false' otherwise.\n\t * @param initializeEntryPoint - Function to initialize the entryPoint object for the data store runtime. The\n\t * handle to this data store runtime will point to the object returned by this function. If this function is not\n\t * provided, the handle will be left undefined. This is here so we can start making handles a first-class citizen\n\t * and the primary way of interacting with some Fluid objects, and should be used if possible.\n\t */\n\tpublic constructor(\n\t\tprivate readonly dataStoreContext: IFluidDataStoreContext,\n\t\tprivate readonly sharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t\tinitializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>,\n\t) {\n\t\tsuper();\n\n\t\tassert(\n\t\t\t!dataStoreContext.id.includes(\"/\"),\n\t\t\t0x30e /* Id cannot contain slashes. DataStoreContext should have validated this. */,\n\t\t);\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: dataStoreContext.logger,\n\t\t\tnamespace: \"FluidDataStoreRuntime\",\n\t\t\tproperties: {\n\t\t\t\tall: { dataStoreId: uuid() },\n\t\t\t},\n\t\t});\n\n\t\tthis.id = dataStoreContext.id;\n\t\tthis.options = dataStoreContext.options;\n\t\tthis.deltaManager = dataStoreContext.deltaManager;\n\t\tthis.quorum = dataStoreContext.getQuorum();\n\t\tthis.audience = dataStoreContext.getAudience();\n\n\t\tconst tree = dataStoreContext.baseSnapshot;\n\n\t\t// Must always receive the data store type inside of the attributes\n\t\tif (tree?.trees !== undefined) {\n\t\t\tObject.keys(tree.trees).forEach((path) => {\n\t\t\t\t// Issue #4414\n\t\t\t\tif (path === \"_search\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet channelContext: RemoteChannelContext | RehydratedLocalChannelContext;\n\t\t\t\t// If already exists on storage, then create a remote channel. However, if it is case of rehydrating a\n\t\t\t\t// container from snapshot where we load detached container from a snapshot, isLocalDataStore would be\n\t\t\t\t// true. In this case create a RehydratedLocalChannelContext.\n\t\t\t\tif (dataStoreContext.isLocalDataStore) {\n\t\t\t\t\tchannelContext = new RehydratedLocalChannelContext(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tthis.dataStoreContext,\n\t\t\t\t\t\tthis.dataStoreContext.storage,\n\t\t\t\t\t\tthis.logger,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t);\n\t\t\t\t\t// This is the case of rehydrating a detached container from snapshot. Now due to delay loading of\n\t\t\t\t\t// data store, if the data store is loaded after the container is attached, then we missed making\n\t\t\t\t\t// the channel visible. So do it now. Otherwise, add it to local channel context queue, so\n\t\t\t\t\t// that it can be make it visible later with the data store.\n\t\t\t\t\tif (dataStoreContext.attachState !== AttachState.Detached) {\n\t\t\t\t\t\tchannelContext.makeVisible();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.localChannelContextQueue.set(path, channelContext);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchannelContext = new RemoteChannelContext(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tdataStoreContext,\n\t\t\t\t\t\tdataStoreContext.storage,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tundefined /* extraBlobs */,\n\t\t\t\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(path, {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.contexts.set(path, channelContext);\n\t\t\t});\n\t\t}\n\n\t\tif (initializeEntryPoint) {\n\t\t\tconst promise = new LazyPromise(async () => initializeEntryPoint(this));\n\t\t\tthis.entryPoint = new FluidObjectHandle<FluidObject>(\n\t\t\t\tpromise,\n\t\t\t\t\"\",\n\t\t\t\tthis.objectsRoutingContext,\n\t\t\t);\n\t\t}\n\n\t\tthis.attachListener();\n\t\tthis._attachState = dataStoreContext.attachState;\n\n\t\t/**\n\t\t * If existing flag is false, this is a new data store and is not visible. The existing flag can be true in two\n\t\t * conditions:\n\t\t *\n\t\t * 1. It's a local data store that is created when a detached container is rehydrated. In this case, the data\n\t\t * store is locally visible because the snapshot it is loaded from contains locally visible data stores only.\n\t\t *\n\t\t * 2. It's a remote data store that is created when an attached container is loaded is loaded from snapshot or\n\t\t * when an attach op comes in. In both these cases, the data store is already globally visible.\n\t\t */\n\t\tif (existing) {\n\t\t\tthis.visibilityState =\n\t\t\t\tdataStoreContext.attachState === AttachState.Detached\n\t\t\t\t\t? VisibilityState.LocallyVisible\n\t\t\t\t\t: VisibilityState.GloballyVisible;\n\t\t} else {\n\t\t\tthis.visibilityState = VisibilityState.NotVisible;\n\t\t}\n\n\t\t// If it's existing we know it has been attached.\n\t\tif (existing) {\n\t\t\tthis.deferredAttached.resolve();\n\t\t}\n\n\t\t// By default, a data store can log maximum 10 local changes telemetry in summarizer.\n\t\tthis.localChangesTelemetryCount =\n\t\t\tthis.mc.config.getNumber(\"Fluid.Telemetry.LocalChangesTelemetryCount\") ?? 10;\n\t}\n\n\tpublic dispose(): void {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\n\t\tthis.emit(\"dispose\");\n\t\tthis.removeAllListeners();\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\treturn this.request(request);\n\t}\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tconst id = parser.pathParts[0];\n\n\t\t\tif (id === \"_channels\" || id === \"_custom\") {\n\t\t\t\treturn await this.request(parser.createSubRequest(1));\n\t\t\t}\n\n\t\t\t// Check for a data type reference first\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tif (context !== undefined && parser.isLeaf(1)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst channel = await context.getChannel();\n\n\t\t\t\t\treturn { mimeType: \"fluid/object\", status: 200, value: channel };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t\t{ eventName: \"GetChannelFailedInRequest\" },\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn createResponseError(500, `Failed to get Channel: ${error}`, request);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise defer to an attached request handler\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\tpublic async getChannel(id: string): Promise<IChannel> {\n\t\tthis.verifyNotClosed();\n\n\t\tconst context = this.contexts.get(id);\n\t\tif (context === undefined) {\n\t\t\tthrow new LoggingError(\"Channel does not exist\");\n\t\t}\n\n\t\treturn context.getChannel();\n\t}\n\n\tpublic createChannel(id: string = uuid(), type: string): IChannel {\n\t\tif (id.includes(\"/\")) {\n\t\t\tthrow new UsageError(`Id cannot contain slashes: ${id}`);\n\t\t}\n\n\t\tthis.verifyNotClosed();\n\n\t\tassert(!this.contexts.has(id), 0x179 /* \"createChannel() with existing ID\" */);\n\t\tthis.notBoundedChannelContextSet.add(id);\n\t\tconst context = new LocalChannelContext(\n\t\t\tid,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\ttype,\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\tthis.logger,\n\t\t\t(content, localOpMetadata) => this.submitChannelOp(id, content, localOpMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t);\n\t\tthis.contexts.set(id, context);\n\n\t\t// Channels (DDS) should not be created in summarizer client.\n\t\tthis.identifyLocalChangeInSummarizer(\"DDSCreatedInSummarizer\", id, type);\n\n\t\treturn context.channel;\n\t}\n\n\t/**\n\t * Binds a channel with the runtime. If the runtime is attached we will attach the channel right away.\n\t * If the runtime is not attached we will defer the attach until the runtime attaches.\n\t * @param channel - channel to be registered.\n\t */\n\tpublic bindChannel(channel: IChannel): void {\n\t\tassert(\n\t\t\tthis.notBoundedChannelContextSet.has(channel.id),\n\t\t\t0x17b /* \"Channel to be bound should be in not bounded set\" */,\n\t\t);\n\t\tthis.notBoundedChannelContextSet.delete(channel.id);\n\t\t// If our data store is attached, then attach the channel.\n\t\tif (this.isAttached) {\n\t\t\tthis.attachChannel(channel);\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * If this channel is already waiting to be made visible, do nothing. This can happen during attachGraph() when\n\t\t * a channel's graph is attached. It calls bindToContext on the shared object which will end up back here.\n\t\t */\n\t\tif (this.pendingHandlesToMakeVisible.has(channel.handle)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bind(channel.handle);\n\n\t\t// If our data store is local then add the channel to the queue\n\t\tif (!this.localChannelContextQueue.has(channel.id)) {\n\t\t\tthis.localChannelContextQueue.set(\n\t\t\t\tchannel.id,\n\t\t\t\tthis.contexts.get(channel.id) as LocalChannelContextBase,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * This function is called when a data store becomes root. It does the following:\n\t *\n\t * 1. Marks the data store locally visible in the container.\n\t *\n\t * 2. Attaches the graph of all the handles bound to it.\n\t *\n\t * 3. Calls into the data store context to mark it visible in the container too. If the container is globally\n\t * visible, it will mark us globally visible. Otherwise, it will mark us globally visible when it becomes\n\t * globally visible.\n\t */\n\tpublic makeVisibleAndAttachGraph() {\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\treturn;\n\t\t}\n\t\tthis.visibilityState = VisibilityState.LocallyVisible;\n\n\t\tthis.pendingHandlesToMakeVisible.forEach((handle) => {\n\t\t\thandle.attachGraph();\n\t\t});\n\t\tthis.pendingHandlesToMakeVisible.clear();\n\t\tthis.dataStoreContext.makeLocallyVisible();\n\t}\n\n\t/**\n\t * This function is called when a handle to this data store is added to a visible DDS.\n\t */\n\tpublic attachGraph() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\t/**\n\t * @deprecated - Not necessary if consumers add a new dataStore to the container by storing its handle.\n\t * Binds this runtime to the container\n\t * This includes the following:\n\t * 1. Sending an Attach op that includes all existing state\n\t * 2. Attaching the graph if the data store becomes attached.\n\t */\n\tpublic bindToContext() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\t// If visible, attach the incoming handle's graph. Else, this will be done when we become visible.\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\thandle.attachGraph();\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingHandlesToMakeVisible.add(handle);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tthis.verifyNotClosed();\n\n\t\tfor (const [, object] of this.contexts) {\n\t\t\tobject.setConnectionState(connected, clientId);\n\t\t}\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n\n\tpublic getQuorum(): IQuorumClients {\n\t\treturn this.quorum;\n\t}\n\n\tpublic getAudience(): IAudience {\n\t\treturn this.audience;\n\t}\n\n\tpublic async uploadBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tthis.verifyNotClosed();\n\n\t\treturn this.dataStoreContext.uploadBlob(blob, signal);\n\t}\n\n\tprivate createRemoteChannelContext(\n\t\tattachMessage: IAttachMessage,\n\t\tsummarizerNodeParams: CreateChildSummarizerNodeParam,\n\t) {\n\t\tconst flatBlobs = new Map<string, ArrayBufferLike>();\n\t\tconst snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n\n\t\treturn new RemoteChannelContext(\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\t(content, localContentMetadata) =>\n\t\t\t\tthis.submitChannelOp(attachMessage.id, content, localContentMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\tattachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\tflatBlobs,\n\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(\n\t\t\t\tattachMessage.id,\n\t\t\t\tsummarizerNodeParams,\n\t\t\t),\n\t\t\tattachMessage.type,\n\t\t);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tswitch (message.type) {\n\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\tconst attachMessage = message.contents as IAttachMessage;\n\t\t\t\t\tconst id = attachMessage.id;\n\n\t\t\t\t\t// If a non-local operation then go and create the object\n\t\t\t\t\t// Otherwise mark it as officially attached.\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tthis.pendingAttach.delete(id),\n\t\t\t\t\t\t\t0x17c /* \"Unexpected attach (local) channel OP\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassert(!this.contexts.has(id), 0x17d /* \"Unexpected attach channel OP\" */);\n\n\t\t\t\t\t\tconst summarizerNodeParams = {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\t\tsnapshot: attachMessage.snapshot,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst remoteChannelContext = this.createRemoteChannelContext(\n\t\t\t\t\t\t\tattachMessage,\n\t\t\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.contexts.set(id, remoteChannelContext);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tthis.processChannelOp(message, local, localOpMetadata);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tthis.emit(\"op\", message);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"fluidDataStoreRuntimeFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic processSignal(message: IInboundSignalMessage, local: boolean) {\n\t\tthis.emit(\"signal\", message, local);\n\t}\n\n\tprivate isChannelAttached(id: string): boolean {\n\t\treturn (\n\t\t\t// Added in createChannel\n\t\t\t// Removed when bindChannel is called\n\t\t\t!this.notBoundedChannelContextSet.has(id) &&\n\t\t\t// Added in bindChannel only if this is not attached yet\n\t\t\t// Removed when this is attached by calling attachGraph\n\t\t\t!this.localChannelContextQueue.has(id) &&\n\t\t\t// Added in attachChannel called by bindChannel\n\t\t\t// Removed when attach op is broadcast\n\t\t\t!this.pendingAttach.has(id)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Currently, all contexts in this channel are considered\n\t * referenced and are hence outbound. This will change when we have root and non-root channel contexts.\n\t * The only root contexts will be considered as referenced.\n\t */\n\tprivate getOutboundRoutes(): string[] {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId] of this.contexts) {\n\t\t\toutboundRoutes.push(`${this.absolutePath}/${contextId}`);\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Updates the GC nodes of this channel. It does the following:\n\t * - Adds a back route to self to all its child GC nodes.\n\t * - Adds a node for this channel.\n\t * @param builder - The builder that contains the GC nodes for this channel's children.\n\t */\n\tprivate updateGCNodes(builder: GCDataBuilder) {\n\t\t// Add a back route to self in each child's GC nodes. If any child is referenced, then its parent should\n\t\t// be considered referenced as well.\n\t\tbuilder.addRouteToAllNodes(this.absolutePath);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", this.getOutboundRoutes());\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. This includes a list of GC nodes that represent this channel\n\t * including any of its child channel contexts. Each node has a set of outbound routes to other GC nodes in the\n\t * document. It does the following:\n\t *\n\t * 1. Calls into each child context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each channel context and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\t// Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n\t\t\t\t\t// graph so any references they might have won't be connected as well.\n\t\t\t\t\treturn this.isChannelAttached(contextId);\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\tthis.updateGCNodes(builder);\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this channel of routes that are used in it. It calls the child contexts to\n\t * update their used routes.\n\t * @param usedRoutes - The routes that are used in all contexts in this channel.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: string[]) {\n\t\t// Get a map of channel ids to routes used in it.\n\t\tconst usedContextRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedContextRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x17e /* \"Used route does not belong to any known context\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each context. Used routes is empty for unused context.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedContextRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n\t * all references added in the system.\n\t * @param srcHandle - The handle of the node that added the reference.\n\t * @param outboundHandle - The handle of the outbound node that is referenced.\n\t */\n\tprivate addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n\t\tthis.dataStoreContext.addedGCOutboundReference?.(srcHandle, outboundHandle);\n\t}\n\n\t/**\n\t * Returns a summary at the current sequence number.\n\t * @param fullTree - true to bypass optimizations and force a full summary tree\n\t * @param trackState - This tells whether we should track state from this summary.\n\t * @param telemetryContext - summary data passed through the layers for telemetry purposes\n\t */\n\tpublic async summarize(\n\t\tfullTree: boolean = false,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each data store and ask it to summarize\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\tconst isAttached = this.isChannelAttached(contextId);\n\t\t\t\t\t// We are not expecting local dds! Summary may not capture local state.\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisAttached,\n\t\t\t\t\t\t0x17f /* \"Not expecting detached channels during summarize\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// If the object is registered - and we have received the sequenced op creating the object\n\t\t\t\t\t// (i.e. it has a base mapping) - then we go ahead and summarize\n\t\t\t\t\treturn isAttached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\t/**\n\t\t * back-compat 0.59.1000 - getAttachSummary() is called when making a data store globally visible (previously\n\t\t * attaching state). Ideally, attachGraph() should have already be called making it locally visible. However,\n\t\t * before visibility state was added, this may not have been the case and getAttachSummary() could be called:\n\t\t *\n\t\t * 1. Before attaching the data store - When a detached container is attached.\n\t\t *\n\t\t * 2. After attaching the data store - When a data store is created and bound in an attached container.\n\t\t *\n\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t */\n\t\tthis.attachGraph();\n\n\t\t// This assert cannot be added now due to back-compat. To be uncommented when the following issue is fixed -\n\t\t// https://github.com/microsoft/FluidFramework/issues/9688.\n\t\t//\n\t\t// assert(this.visibilityState === VisibilityState.LocallyVisible,\n\t\t// \"The data store should be locally visible when generating attach summary\",\n\t\t// );\n\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Craft the .attributes file for each shared object\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tif (!(context instanceof LocalChannelContextBase)) {\n\t\t\t\tthrow new LoggingError(\"Should only be called with local channel handles\");\n\t\t\t}\n\n\t\t\tif (!this.notBoundedChannelContextSet.has(contextId)) {\n\t\t\t\tlet summaryTree: ISummaryTreeWithStats;\n\t\t\t\tif (context.isLoaded) {\n\t\t\t\t\tconst contextSummary = context.getAttachSummary(telemetryContext);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcontextSummary.summary.type === SummaryType.Tree,\n\t\t\t\t\t\t0x180 /* \"getAttachSummary should always return a tree\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = { stats: contextSummary.stats, summary: contextSummary.summary };\n\t\t\t\t} else {\n\t\t\t\t\t// If this channel is not yet loaded, then there should be no changes in the snapshot from which\n\t\t\t\t\t// it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!this.dataStoreContext.baseSnapshot,\n\t\t\t\t\t\t0x181 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\tthis.dataStoreContext.baseSnapshot.trees[contextId],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsummaryBuilder.addWithStats(contextId, summaryTree);\n\t\t\t}\n\t\t}\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic submitMessage(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.submit(type, content, localOpMetadata);\n\t}\n\n\tpublic submitSignal(type: string, content: any) {\n\t\tthis.verifyNotClosed();\n\t\treturn this.dataStoreContext.submitSignal(type, content);\n\t}\n\n\t/**\n\t * Will return when the data store is attached.\n\t */\n\tpublic async waitAttached(): Promise<void> {\n\t\treturn this.deferredAttached.promise;\n\t}\n\n\t/**\n\t * Attach channel should only be called after the data store has been attached\n\t */\n\tprivate attachChannel(channel: IChannel): void {\n\t\tthis.verifyNotClosed();\n\t\t// If this handle is already attached no need to attach again.\n\t\tif (channel.handle.isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.handle.attachGraph();\n\n\t\tassert(this.isAttached, 0x182 /* \"Data store should be attached to attach the channel.\" */);\n\t\tassert(\n\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t0x2d0 /* \"Data store should be globally visible to attach channels.\" */,\n\t\t);\n\n\t\tconst summarizeResult = summarizeChannel(\n\t\t\tchannel,\n\t\t\ttrue /* fullTree */,\n\t\t\tfalse /* trackState */,\n\t\t);\n\t\t// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.\n\t\tconst snapshot = convertSummaryTreeToITree(summarizeResult.summary);\n\n\t\tconst message: IAttachMessage = {\n\t\t\tid: channel.id,\n\t\t\tsnapshot,\n\t\t\ttype: channel.attributes.type,\n\t\t};\n\t\tthis.pendingAttach.add(channel.id);\n\t\tthis.submit(DataStoreMessageType.Attach, message);\n\n\t\tconst context = this.contexts.get(channel.id) as LocalChannelContextBase;\n\t\tcontext.makeVisible();\n\t}\n\n\tprivate submitChannelOp(address: string, contents: any, localOpMetadata: unknown) {\n\t\tconst envelope: IEnvelope = { address, contents };\n\t\tthis.submit(DataStoreMessageType.ChannelOp, envelope, localOpMetadata);\n\t}\n\n\tprivate submit(\n\t\ttype: DataStoreMessageType,\n\t\tcontent: any,\n\t\tlocalOpMetadata: unknown = undefined,\n\t): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.submitMessage(type, content, localOpMetadata);\n\t}\n\n\t/**\n\t * For messages of type MessageType.Operation, finds the right channel and asks it to resubmit the message.\n\t * For all other messages, just submit it again.\n\t * This typically happens when we reconnect and there are unacked messages.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic reSubmit(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x183 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.reSubmit(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.Attach:\n\t\t\t\t// For Attach messages, just submit them again.\n\t\t\t\tthis.submit(type, content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\t/**\n\t * Revert a local op.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic rollback?(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x2ed /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.rollback(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new LoggingError(`Can't rollback ${type} message`);\n\t\t}\n\t}\n\n\tpublic async applyStashedOp(content: any): Promise<unknown> {\n\t\tconst type = content?.type as DataStoreMessageType;\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\tconst attachMessage = content.content as IAttachMessage;\n\t\t\t\t// local means this node will throw if summarized; this is fine because only interactive clients will have stashed ops\n\t\t\t\tconst summarizerNodeParams: CreateChildSummarizerNodeParam = {\n\t\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t\t};\n\t\t\t\tconst context = this.createRemoteChannelContext(\n\t\t\t\t\tattachMessage,\n\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t);\n\t\t\t\tthis.pendingAttach.add(attachMessage.id);\n\t\t\t\tthis.contexts.set(attachMessage.id, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\tconst envelope = content.content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x184 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tawait channelContext.getChannel();\n\t\t\t\treturn channelContext.applyStashedOp(envelope.contents);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\tprivate setChannelDirty(address: string): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.setChannelDirty(address);\n\t}\n\n\tprivate processChannelOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tthis.verifyNotClosed();\n\n\t\tconst envelope = message.contents as IEnvelope;\n\n\t\tconst transformed: ISequencedDocumentMessage = {\n\t\t\t...message,\n\t\t\tcontents: envelope.contents,\n\t\t};\n\n\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\tassert(!!channelContext, 0x185 /* \"Channel not found\" */);\n\t\tchannelContext.processOp(transformed, local, localOpMetadata);\n\n\t\treturn channelContext;\n\t}\n\n\tprivate attachListener() {\n\t\tthis.setMaxListeners(Number.MAX_SAFE_INTEGER);\n\t\tthis.dataStoreContext.once(\"attaching\", () => {\n\t\t\t/**\n\t\t\t * back-compat 0.59.1000 - Ideally, attachGraph() should have already been called making the data store\n\t\t\t * locally visible. However, before visibility state was added, this may not have been the case and data\n\t\t\t * store can move to \"attaching\" state in 2 scenarios:\n\t\t\t * 1) Before attachGraph() is called - When a data store is created and bound in an attached container.\n\t\t\t * 2) After attachGraph() is called - When a detached container is attached.\n\t\t\t *\n\t\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t\t */\n\t\t\tthis.attachGraph();\n\n\t\t\tthis._attachState = AttachState.Attaching;\n\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.LocallyVisible,\n\t\t\t\t0x2d1 /* \"Data store should be locally visible before it can become globally visible.\" */,\n\t\t\t);\n\n\t\t\t// Mark the data store globally visible and make its child channels visible as well.\n\t\t\tthis.visibilityState = VisibilityState.GloballyVisible;\n\t\t\tthis.localChannelContextQueue.forEach((channel) => {\n\t\t\t\tchannel.makeVisible();\n\t\t\t});\n\t\t\tthis.localChannelContextQueue.clear();\n\n\t\t\t// This promise resolution will be moved to attached event once we fix the scheduler.\n\t\t\tthis.deferredAttached.resolve();\n\t\t\tthis.emit(\"attaching\");\n\t\t});\n\t\tthis.dataStoreContext.once(\"attached\", () => {\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t\t0x2d2 /* \"Data store should be globally visible when its attached.\" */,\n\t\t\t);\n\t\t\tthis._attachState = AttachState.Attached;\n\t\t\tthis.emit(\"attached\");\n\t\t});\n\t}\n\n\tprivate verifyNotClosed() {\n\t\tif (this._disposed) {\n\t\t\tthrow new LoggingError(\"Runtime is closed\");\n\t\t}\n\t}\n\n\t/**\n\t * Summarizer client should not have local changes. These changes can become part of the summary and can break\n\t * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas\n\t * other clients that are up-to-date till seq# 100 may not have them yet.\n\t */\n\tprivate identifyLocalChangeInSummarizer(\n\t\teventName: string,\n\t\tchannelId: string,\n\t\tchannelType: string,\n\t) {\n\t\tif (this.clientDetails.type !== \"summarizer\" || this.localChangesTelemetryCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Log a telemetry if there are local changes in the summarizer. This will give us data on how often\n\t\t// this is happening and which data stores do this. The eventual goal is to disallow local changes\n\t\t// in the summarizer and the data will help us plan this.\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName,\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType,\n\t\t\t\tchannelId,\n\t\t\t\tfluidDataStoreId: this.id,\n\t\t\t\tfluidDataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n\t\t\t}),\n\t\t\tstack: generateStack(),\n\t\t});\n\t\tthis.localChangesTelemetryCount--;\n\t}\n}\n\n/**\n * Mixin class that adds request handler to FluidDataStoreRuntime\n * Request handler is only called when data store can't resolve request, i.e. for custom requests.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n * @param requestHandler - request handler to mix in\n */\nexport const mixinRequestHandler = (\n\trequestHandler: (request: IRequest, runtime: FluidDataStoreRuntime) => Promise<IResponse>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithRequestHandler extends Base {\n\t\tpublic async request(request: IRequest) {\n\t\t\tconst response = await super.request(request);\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn requestHandler(request, this);\n\t\t\t}\n\t\t\treturn response;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n\n/**\n * Mixin class that adds await for DataObject to finish initialization before we proceed to summary.\n * @param handler - handler that returns info about blob to be added to summary.\n * Or undefined not to add anything to summary.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n */\nexport const mixinSummaryHandler = (\n\thandler: (\n\t\truntime: FluidDataStoreRuntime,\n\t) => Promise<{ path: string[]; content: string } | undefined>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithSummarizerHandler extends Base {\n\t\tprivate addBlob(summary: ISummaryTreeWithStats, path: string[], content: string) {\n\t\t\tconst firstName = path.shift();\n\t\t\tif (firstName === undefined) {\n\t\t\t\tthrow new LoggingError(\"Path can't be empty\");\n\t\t\t}\n\n\t\t\tlet blob: ISummaryTree | ISummaryBlob = {\n\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tsummary.stats.blobNodeCount++;\n\t\t\tsummary.stats.totalBlobSize += content.length;\n\n\t\t\tfor (const name of path.reverse()) {\n\t\t\t\tblob = {\n\t\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\t\ttree: { [name]: blob },\n\t\t\t\t};\n\t\t\t\tsummary.stats.treeNodeCount++;\n\t\t\t}\n\t\t\tsummary.summary.tree[firstName] = blob;\n\t\t}\n\n\t\tasync summarize(...args: any[]) {\n\t\t\tconst summary = await super.summarize(...args);\n\n\t\t\ttry {\n\t\t\t\tconst content = await handler(this);\n\t\t\t\tif (content !== undefined) {\n\t\t\t\t\tthis.addBlob(summary, content.path, content.content);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Any error coming from app-provided handler should be marked as DataProcessingError\n\t\t\t\tthrow DataProcessingError.wrapIfUnrecognized(e, \"mixinSummaryHandler\");\n\t\t\t}\n\n\t\t\treturn summary;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n"]}
|
|
@@ -97,9 +97,6 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
|
|
|
97
97
|
constructor(dataStoreContext: IFluidDataStoreContext, sharedObjectRegistry: ISharedObjectRegistry, existing: boolean, initializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>);
|
|
98
98
|
dispose(): void;
|
|
99
99
|
resolveHandle(request: IRequest): Promise<IResponse>;
|
|
100
|
-
/**
|
|
101
|
-
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
102
|
-
*/
|
|
103
100
|
request(request: IRequest): Promise<IResponse>;
|
|
104
101
|
getChannel(id: string): Promise<IChannel>;
|
|
105
102
|
createChannel(id: string | undefined, type: string): IChannel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAEN,mBAAmB,EAQnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACN,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,QAAQ,EACR,SAAS,EACT,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACN,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EAIzB,cAAc,EACd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAKN,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,MAAM,qCAAqC,CAAC;AAc7C,OAAO,EACN,QAAQ,EACR,sBAAsB,EACtB,4BAA4B,EAC5B,eAAe,EACf,MAAM,uCAAuC,CAAC;AAW/C,oBAAY,oBAAoB;IAE/B,MAAM,WAAW;IACjB,SAAS,OAAO;CAChB;AAED,MAAM,WAAW,qBAAqB;IAGrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;CAC/C;AAED;;GAEG;AACH,qBAAa,qBACZ,SAAQ,iBAAiB,CAAC,4BAA4B,CACtD,YAAW,sBAAsB,EAAE,sBAAsB,EAAE,mBAAmB;IA8I7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IA7ItC;;;;;;;OAOG;WACW,IAAI,CACjB,OAAO,EAAE,sBAAsB,EAC/B,oBAAoB,EAAE,qBAAqB,EAC3C,QAAQ,EAAE,OAAO,GACf,qBAAqB;IASxB;;OAEG;IACH,SAAgB,UAAU,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IAEvD;;OAEG;IACH,IAAW,YAAY,SAEtB;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,IAAW,QAAQ,IAAI,MAAM,GAAG,SAAS,CAExC;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,IAAW,WAAW,IAAI,WAAW,CAEpC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,IAAI,mBAAmB,CAE7C;IAED,IAAW,YAAY,IAAI,aAAa,GAAG,SAAS,CAEnD;IAED,IAAW,mBAAmB,SAE7B;IAED,IAAW,kBAAkB,SAE5B;IACD,IAAW,sBAAsB,SAEhC;IACD,IAAW,qBAAqB,SAE/B;IAED,OAAO,CAAC,SAAS,CAAS;IAC1B,IAAW,QAAQ,YAElB;IAED,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA8C;IACvF,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAqB;IACjE,OAAO,CAAC,YAAY,CAAc;IAC3B,eAAe,EAAE,eAAe,CAAC;IAGxC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAgC;IAE5E,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,OAAO,EAAE,cAAc,CAAC;IACxC,SAAgB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;IACzF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,IAAW,MAAM,IAAI,mBAAmB,CAEvC;IAED;;;;OAIG;IACH,OAAO,CAAC,0BAA0B,CAAS;IAE3C;;;;;;;OAOG;IACI,wBAAwB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAOxD;;;;;;;;;;OAUG;gBAEe,gBAAgB,EAAE,sBAAsB,EACxC,oBAAoB,EAAE,qBAAqB,EAC5D,QAAQ,EAAE,OAAO,EACjB,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,CAAC;IA8H1E,OAAO,IAAI,IAAI;IAUT,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAIpD,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAiC9C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAW/C,aAAa,CAAC,EAAE,oBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ;IA8BjE;;;;OAIG;IACI,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IA+B3C;;;;;;;;;;OAUG;IACI,yBAAyB;IAahC;;OAEG;IACI,WAAW;IAIlB;;;;;;OAMG;IACI,aAAa;IAIb,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAShC,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM;IAUxD,SAAS,IAAI,cAAc;IAI3B,WAAW,IAAI,SAAS;IAIlB,UAAU,CACtB,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAMzC,OAAO,CAAC,0BAA0B;IA4B3B,OAAO,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAmDpF,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;IAInE,OAAO,CAAC,iBAAiB;IAczB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;;;;;;;;;;OAcG;IACU,SAAS,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAsBhF;;;;OAIG;IACI,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE;IAkB5C;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAIhC;;;;;OAKG;IACU,SAAS,CACrB,QAAQ,GAAE,OAAe,EACzB,UAAU,GAAE,OAAc,EAC1B,gBAAgB,CAAC,EAAE,iBAAiB,GAClC,OAAO,CAAC,qBAAqB,CAAC;IA8B1B,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,GAAG,qBAAqB;IAwD7E,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAIhF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;IAK9C;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C;;OAEG;IACH,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,MAAM;IASd;;;;;;OAMG;IACI,QAAQ,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAwBlF;;;;OAIG;IACI,QAAQ,CAAC,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAoBtE,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAgC3D,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,cAAc;IA0CtB,OAAO,CAAC,eAAe;IAMvB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;CAwBvC;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,6BACL,QAAQ,WAAW,qBAAqB,KAAK,QAAQ,SAAS,CAAC,SACnF,4BAA4B,iCAUD,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sBAErB,qBAAqB,KAC1B,QAAQ;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,SACvD,4BAA4B,iCAyCD,CAAC"}
|
package/lib/dataStoreRuntime.js
CHANGED
|
@@ -212,15 +212,12 @@ export class FluidDataStoreRuntime extends TypedEventEmitter {
|
|
|
212
212
|
async resolveHandle(request) {
|
|
213
213
|
return this.request(request);
|
|
214
214
|
}
|
|
215
|
-
/**
|
|
216
|
-
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
217
|
-
*/
|
|
218
215
|
async request(request) {
|
|
219
216
|
try {
|
|
220
217
|
const parser = RequestParser.create(request);
|
|
221
218
|
const id = parser.pathParts[0];
|
|
222
219
|
if (id === "_channels" || id === "_custom") {
|
|
223
|
-
return this.request(parser.createSubRequest(1));
|
|
220
|
+
return await this.request(parser.createSubRequest(1));
|
|
224
221
|
}
|
|
225
222
|
// Check for a data type reference first
|
|
226
223
|
const context = this.contexts.get(id);
|
|
@@ -796,9 +793,15 @@ export const mixinSummaryHandler = (handler, Base = FluidDataStoreRuntime) => cl
|
|
|
796
793
|
}
|
|
797
794
|
async summarize(...args) {
|
|
798
795
|
const summary = await super.summarize(...args);
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
796
|
+
try {
|
|
797
|
+
const content = await handler(this);
|
|
798
|
+
if (content !== undefined) {
|
|
799
|
+
this.addBlob(summary, content.path, content.content);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
catch (e) {
|
|
803
|
+
// Any error coming from app-provided handler should be marked as DataProcessingError
|
|
804
|
+
throw DataProcessingError.wrapIfUnrecognized(e, "mixinSummaryHandler");
|
|
802
805
|
}
|
|
803
806
|
return summary;
|
|
804
807
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataStoreRuntime.js","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataProcessingError,\n\tITelemetryLoggerExt,\n\tgenerateStack,\n\tLoggingError,\n\tMonitoringContext,\n\traiseConnectedEvent,\n\tcreateChildMonitoringContext,\n\ttagCodeArtifacts,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tFluidObject,\n\tIFluidHandle,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred, LazyPromise, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIAudience,\n\tIDeltaManager,\n\tAttachState,\n\tILoaderOptions,\n} from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISummaryBlob,\n\tISummaryTree,\n\tIQuorumClients,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreChannel,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tISummaryTreeWithStats,\n\tVisibilityState,\n\tITelemetryContext,\n\tIIdCompressor,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertSummaryTreeToITree,\n\tgenerateHandleContextPath,\n\tRequestParser,\n\tSummaryTreeBuilder,\n\tcreate404Response,\n\tcreateResponseError,\n\texceptionToResponse,\n\tGCDataBuilder,\n\trequestFluidObject,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tIChannel,\n\tIFluidDataStoreRuntime,\n\tIFluidDataStoreRuntimeEvents,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IChannelContext, summarizeChannel } from \"./channelContext\";\nimport {\n\tLocalChannelContext,\n\tLocalChannelContextBase,\n\tRehydratedLocalChannelContext,\n} from \"./localChannelContext\";\nimport { RemoteChannelContext } from \"./remoteChannelContext\";\nimport { FluidObjectHandle } from \"./fluidHandle\";\n\nexport enum DataStoreMessageType {\n\t// Creates a new channel\n\tAttach = \"attach\",\n\tChannelOp = \"op\",\n}\n\nexport interface ISharedObjectRegistry {\n\t// TODO consider making this async. A consequence is that either the creation of a distributed data type\n\t// is async or we need a new API to split the synchronous vs. asynchronous creation.\n\tget(name: string): IChannelFactory | undefined;\n}\n\n/**\n * Base data store class\n */\nexport class FluidDataStoreRuntime\n\textends TypedEventEmitter<IFluidDataStoreRuntimeEvents>\n\timplements IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext\n{\n\t/**\n\t * @deprecated - Instantiate the class using its constructor instead.\n\t *\n\t * Loads the data store runtime\n\t * @param context - The data store context\n\t * @param sharedObjectRegistry - The registry of shared objects used by this data store\n\t * @param existing - If loading from an existing file.\n\t */\n\tpublic static load(\n\t\tcontext: IFluidDataStoreContext,\n\t\tsharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t): FluidDataStoreRuntime {\n\t\treturn new FluidDataStoreRuntime(\n\t\t\tcontext,\n\t\t\tsharedObjectRegistry,\n\t\t\texisting,\n\t\t\tasync (dataStoreRuntime) => requestFluidObject(dataStoreRuntime, \"/\"),\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IFluidDataStoreRuntime.entryPoint}\n\t */\n\tpublic readonly entryPoint?: IFluidHandle<FluidObject>;\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic get IFluidRouter() {\n\t\treturn this;\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn this.dataStoreContext.connected;\n\t}\n\n\tpublic get clientId(): string | undefined {\n\t\treturn this.dataStoreContext.clientId;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.dataStoreContext.clientDetails;\n\t}\n\n\tpublic get isAttached(): boolean {\n\t\treturn this.attachState !== AttachState.Detached;\n\t}\n\n\tpublic get attachState(): AttachState {\n\t\treturn this._attachState;\n\t}\n\n\tpublic get absolutePath(): string {\n\t\treturn generateHandleContextPath(this.id, this.routeContext);\n\t}\n\n\tpublic get routeContext(): IFluidHandleContext {\n\t\treturn this.dataStoreContext.IFluidHandleContext;\n\t}\n\n\tpublic get idCompressor(): IIdCompressor | undefined {\n\t\treturn this.dataStoreContext.idCompressor;\n\t}\n\n\tpublic get IFluidHandleContext() {\n\t\treturn this;\n\t}\n\n\tpublic get rootRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get channelsRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get objectsRoutingContext() {\n\t\treturn this;\n\t}\n\n\tprivate _disposed = false;\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate readonly contexts = new Map<string, IChannelContext>();\n\tprivate readonly pendingAttach = new Set<string>();\n\n\tprivate readonly deferredAttached = new Deferred<void>();\n\tprivate readonly localChannelContextQueue = new Map<string, LocalChannelContextBase>();\n\tprivate readonly notBoundedChannelContextSet = new Set<string>();\n\tprivate _attachState: AttachState;\n\tpublic visibilityState: VisibilityState;\n\t// A list of handles that are bound when the data store is not visible. We have to make them visible when the data\n\t// store becomes visible.\n\tprivate readonly pendingHandlesToMakeVisible: Set<IFluidHandle> = new Set();\n\n\tpublic readonly id: string;\n\tpublic readonly options: ILoaderOptions;\n\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\tprivate readonly quorum: IQuorumClients;\n\tprivate readonly audience: IAudience;\n\tprivate readonly mc: MonitoringContext;\n\tpublic get logger(): ITelemetryLoggerExt {\n\t\treturn this.mc.logger;\n\t}\n\n\t/**\n\t * If the summarizer makes local changes, a telemetry event is logged. This has the potential to be very noisy.\n\t * So, adding a count of how many telemetry events are logged per data store context. This can be\n\t * controlled via feature flags.\n\t */\n\tprivate localChangesTelemetryCount: number;\n\n\t/**\n\t * Invokes the given callback and expects that no ops are submitted\n\t * until execution finishes. If an op is submitted, an error will be raised.\n\t *\n\t * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t *\n\t * @param callback - the callback to be invoked\n\t */\n\tpublic ensureNoDataModelChanges<T>(callback: () => T): T {\n\t\t// back-compat ADO:2309\n\t\treturn this.dataStoreContext.ensureNoDataModelChanges === undefined\n\t\t\t? callback()\n\t\t\t: this.dataStoreContext.ensureNoDataModelChanges(callback);\n\t}\n\n\t/**\n\t * Create an instance of a DataStore runtime.\n\t *\n\t * @param dataStoreContext - Context object for the runtime.\n\t * @param sharedObjectRegistry - The registry of shared objects that this data store will be able to instantiate.\n\t * @param existing - Pass 'true' if loading this datastore from an existing file; pass 'false' otherwise.\n\t * @param initializeEntryPoint - Function to initialize the entryPoint object for the data store runtime. The\n\t * handle to this data store runtime will point to the object returned by this function. If this function is not\n\t * provided, the handle will be left undefined. This is here so we can start making handles a first-class citizen\n\t * and the primary way of interacting with some Fluid objects, and should be used if possible.\n\t */\n\tpublic constructor(\n\t\tprivate readonly dataStoreContext: IFluidDataStoreContext,\n\t\tprivate readonly sharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t\tinitializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>,\n\t) {\n\t\tsuper();\n\n\t\tassert(\n\t\t\t!dataStoreContext.id.includes(\"/\"),\n\t\t\t0x30e /* Id cannot contain slashes. DataStoreContext should have validated this. */,\n\t\t);\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: dataStoreContext.logger,\n\t\t\tnamespace: \"FluidDataStoreRuntime\",\n\t\t\tproperties: {\n\t\t\t\tall: { dataStoreId: uuid() },\n\t\t\t},\n\t\t});\n\n\t\tthis.id = dataStoreContext.id;\n\t\tthis.options = dataStoreContext.options;\n\t\tthis.deltaManager = dataStoreContext.deltaManager;\n\t\tthis.quorum = dataStoreContext.getQuorum();\n\t\tthis.audience = dataStoreContext.getAudience();\n\n\t\tconst tree = dataStoreContext.baseSnapshot;\n\n\t\t// Must always receive the data store type inside of the attributes\n\t\tif (tree?.trees !== undefined) {\n\t\t\tObject.keys(tree.trees).forEach((path) => {\n\t\t\t\t// Issue #4414\n\t\t\t\tif (path === \"_search\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet channelContext: RemoteChannelContext | RehydratedLocalChannelContext;\n\t\t\t\t// If already exists on storage, then create a remote channel. However, if it is case of rehydrating a\n\t\t\t\t// container from snapshot where we load detached container from a snapshot, isLocalDataStore would be\n\t\t\t\t// true. In this case create a RehydratedLocalChannelContext.\n\t\t\t\tif (dataStoreContext.isLocalDataStore) {\n\t\t\t\t\tchannelContext = new RehydratedLocalChannelContext(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tthis.dataStoreContext,\n\t\t\t\t\t\tthis.dataStoreContext.storage,\n\t\t\t\t\t\tthis.logger,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t);\n\t\t\t\t\t// This is the case of rehydrating a detached container from snapshot. Now due to delay loading of\n\t\t\t\t\t// data store, if the data store is loaded after the container is attached, then we missed making\n\t\t\t\t\t// the channel visible. So do it now. Otherwise, add it to local channel context queue, so\n\t\t\t\t\t// that it can be make it visible later with the data store.\n\t\t\t\t\tif (dataStoreContext.attachState !== AttachState.Detached) {\n\t\t\t\t\t\tchannelContext.makeVisible();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.localChannelContextQueue.set(path, channelContext);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchannelContext = new RemoteChannelContext(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tdataStoreContext,\n\t\t\t\t\t\tdataStoreContext.storage,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tundefined /* extraBlobs */,\n\t\t\t\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(path, {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.contexts.set(path, channelContext);\n\t\t\t});\n\t\t}\n\n\t\tif (initializeEntryPoint) {\n\t\t\tconst promise = new LazyPromise(async () => initializeEntryPoint(this));\n\t\t\tthis.entryPoint = new FluidObjectHandle<FluidObject>(\n\t\t\t\tpromise,\n\t\t\t\t\"\",\n\t\t\t\tthis.objectsRoutingContext,\n\t\t\t);\n\t\t}\n\n\t\tthis.attachListener();\n\t\tthis._attachState = dataStoreContext.attachState;\n\n\t\t/**\n\t\t * If existing flag is false, this is a new data store and is not visible. The existing flag can be true in two\n\t\t * conditions:\n\t\t *\n\t\t * 1. It's a local data store that is created when a detached container is rehydrated. In this case, the data\n\t\t * store is locally visible because the snapshot it is loaded from contains locally visible data stores only.\n\t\t *\n\t\t * 2. It's a remote data store that is created when an attached container is loaded is loaded from snapshot or\n\t\t * when an attach op comes in. In both these cases, the data store is already globally visible.\n\t\t */\n\t\tif (existing) {\n\t\t\tthis.visibilityState =\n\t\t\t\tdataStoreContext.attachState === AttachState.Detached\n\t\t\t\t\t? VisibilityState.LocallyVisible\n\t\t\t\t\t: VisibilityState.GloballyVisible;\n\t\t} else {\n\t\t\tthis.visibilityState = VisibilityState.NotVisible;\n\t\t}\n\n\t\t// If it's existing we know it has been attached.\n\t\tif (existing) {\n\t\t\tthis.deferredAttached.resolve();\n\t\t}\n\n\t\t// By default, a data store can log maximum 10 local changes telemetry in summarizer.\n\t\tthis.localChangesTelemetryCount =\n\t\t\tthis.mc.config.getNumber(\"Fluid.Telemetry.LocalChangesTelemetryCount\") ?? 10;\n\t}\n\n\tpublic dispose(): void {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\n\t\tthis.emit(\"dispose\");\n\t\tthis.removeAllListeners();\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\treturn this.request(request);\n\t}\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tconst id = parser.pathParts[0];\n\n\t\t\tif (id === \"_channels\" || id === \"_custom\") {\n\t\t\t\treturn this.request(parser.createSubRequest(1));\n\t\t\t}\n\n\t\t\t// Check for a data type reference first\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tif (context !== undefined && parser.isLeaf(1)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst channel = await context.getChannel();\n\n\t\t\t\t\treturn { mimeType: \"fluid/object\", status: 200, value: channel };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t\t{ eventName: \"GetChannelFailedInRequest\" },\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn createResponseError(500, `Failed to get Channel: ${error}`, request);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise defer to an attached request handler\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\tpublic async getChannel(id: string): Promise<IChannel> {\n\t\tthis.verifyNotClosed();\n\n\t\tconst context = this.contexts.get(id);\n\t\tif (context === undefined) {\n\t\t\tthrow new LoggingError(\"Channel does not exist\");\n\t\t}\n\n\t\treturn context.getChannel();\n\t}\n\n\tpublic createChannel(id: string = uuid(), type: string): IChannel {\n\t\tif (id.includes(\"/\")) {\n\t\t\tthrow new UsageError(`Id cannot contain slashes: ${id}`);\n\t\t}\n\n\t\tthis.verifyNotClosed();\n\n\t\tassert(!this.contexts.has(id), 0x179 /* \"createChannel() with existing ID\" */);\n\t\tthis.notBoundedChannelContextSet.add(id);\n\t\tconst context = new LocalChannelContext(\n\t\t\tid,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\ttype,\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\tthis.logger,\n\t\t\t(content, localOpMetadata) => this.submitChannelOp(id, content, localOpMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t);\n\t\tthis.contexts.set(id, context);\n\n\t\t// Channels (DDS) should not be created in summarizer client.\n\t\tthis.identifyLocalChangeInSummarizer(\"DDSCreatedInSummarizer\", id, type);\n\n\t\treturn context.channel;\n\t}\n\n\t/**\n\t * Binds a channel with the runtime. If the runtime is attached we will attach the channel right away.\n\t * If the runtime is not attached we will defer the attach until the runtime attaches.\n\t * @param channel - channel to be registered.\n\t */\n\tpublic bindChannel(channel: IChannel): void {\n\t\tassert(\n\t\t\tthis.notBoundedChannelContextSet.has(channel.id),\n\t\t\t0x17b /* \"Channel to be bound should be in not bounded set\" */,\n\t\t);\n\t\tthis.notBoundedChannelContextSet.delete(channel.id);\n\t\t// If our data store is attached, then attach the channel.\n\t\tif (this.isAttached) {\n\t\t\tthis.attachChannel(channel);\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * If this channel is already waiting to be made visible, do nothing. This can happen during attachGraph() when\n\t\t * a channel's graph is attached. It calls bindToContext on the shared object which will end up back here.\n\t\t */\n\t\tif (this.pendingHandlesToMakeVisible.has(channel.handle)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bind(channel.handle);\n\n\t\t// If our data store is local then add the channel to the queue\n\t\tif (!this.localChannelContextQueue.has(channel.id)) {\n\t\t\tthis.localChannelContextQueue.set(\n\t\t\t\tchannel.id,\n\t\t\t\tthis.contexts.get(channel.id) as LocalChannelContextBase,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * This function is called when a data store becomes root. It does the following:\n\t *\n\t * 1. Marks the data store locally visible in the container.\n\t *\n\t * 2. Attaches the graph of all the handles bound to it.\n\t *\n\t * 3. Calls into the data store context to mark it visible in the container too. If the container is globally\n\t * visible, it will mark us globally visible. Otherwise, it will mark us globally visible when it becomes\n\t * globally visible.\n\t */\n\tpublic makeVisibleAndAttachGraph() {\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\treturn;\n\t\t}\n\t\tthis.visibilityState = VisibilityState.LocallyVisible;\n\n\t\tthis.pendingHandlesToMakeVisible.forEach((handle) => {\n\t\t\thandle.attachGraph();\n\t\t});\n\t\tthis.pendingHandlesToMakeVisible.clear();\n\t\tthis.dataStoreContext.makeLocallyVisible();\n\t}\n\n\t/**\n\t * This function is called when a handle to this data store is added to a visible DDS.\n\t */\n\tpublic attachGraph() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\t/**\n\t * @deprecated - Not necessary if consumers add a new dataStore to the container by storing its handle.\n\t * Binds this runtime to the container\n\t * This includes the following:\n\t * 1. Sending an Attach op that includes all existing state\n\t * 2. Attaching the graph if the data store becomes attached.\n\t */\n\tpublic bindToContext() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\t// If visible, attach the incoming handle's graph. Else, this will be done when we become visible.\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\thandle.attachGraph();\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingHandlesToMakeVisible.add(handle);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tthis.verifyNotClosed();\n\n\t\tfor (const [, object] of this.contexts) {\n\t\t\tobject.setConnectionState(connected, clientId);\n\t\t}\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n\n\tpublic getQuorum(): IQuorumClients {\n\t\treturn this.quorum;\n\t}\n\n\tpublic getAudience(): IAudience {\n\t\treturn this.audience;\n\t}\n\n\tpublic async uploadBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tthis.verifyNotClosed();\n\n\t\treturn this.dataStoreContext.uploadBlob(blob, signal);\n\t}\n\n\tprivate createRemoteChannelContext(\n\t\tattachMessage: IAttachMessage,\n\t\tsummarizerNodeParams: CreateChildSummarizerNodeParam,\n\t) {\n\t\tconst flatBlobs = new Map<string, ArrayBufferLike>();\n\t\tconst snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n\n\t\treturn new RemoteChannelContext(\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\t(content, localContentMetadata) =>\n\t\t\t\tthis.submitChannelOp(attachMessage.id, content, localContentMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\tattachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\tflatBlobs,\n\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(\n\t\t\t\tattachMessage.id,\n\t\t\t\tsummarizerNodeParams,\n\t\t\t),\n\t\t\tattachMessage.type,\n\t\t);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tswitch (message.type) {\n\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\tconst attachMessage = message.contents as IAttachMessage;\n\t\t\t\t\tconst id = attachMessage.id;\n\n\t\t\t\t\t// If a non-local operation then go and create the object\n\t\t\t\t\t// Otherwise mark it as officially attached.\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tthis.pendingAttach.delete(id),\n\t\t\t\t\t\t\t0x17c /* \"Unexpected attach (local) channel OP\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassert(!this.contexts.has(id), 0x17d /* \"Unexpected attach channel OP\" */);\n\n\t\t\t\t\t\tconst summarizerNodeParams = {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\t\tsnapshot: attachMessage.snapshot,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst remoteChannelContext = this.createRemoteChannelContext(\n\t\t\t\t\t\t\tattachMessage,\n\t\t\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.contexts.set(id, remoteChannelContext);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tthis.processChannelOp(message, local, localOpMetadata);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tthis.emit(\"op\", message);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"fluidDataStoreRuntimeFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic processSignal(message: IInboundSignalMessage, local: boolean) {\n\t\tthis.emit(\"signal\", message, local);\n\t}\n\n\tprivate isChannelAttached(id: string): boolean {\n\t\treturn (\n\t\t\t// Added in createChannel\n\t\t\t// Removed when bindChannel is called\n\t\t\t!this.notBoundedChannelContextSet.has(id) &&\n\t\t\t// Added in bindChannel only if this is not attached yet\n\t\t\t// Removed when this is attached by calling attachGraph\n\t\t\t!this.localChannelContextQueue.has(id) &&\n\t\t\t// Added in attachChannel called by bindChannel\n\t\t\t// Removed when attach op is broadcast\n\t\t\t!this.pendingAttach.has(id)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Currently, all contexts in this channel are considered\n\t * referenced and are hence outbound. This will change when we have root and non-root channel contexts.\n\t * The only root contexts will be considered as referenced.\n\t */\n\tprivate getOutboundRoutes(): string[] {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId] of this.contexts) {\n\t\t\toutboundRoutes.push(`${this.absolutePath}/${contextId}`);\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Updates the GC nodes of this channel. It does the following:\n\t * - Adds a back route to self to all its child GC nodes.\n\t * - Adds a node for this channel.\n\t * @param builder - The builder that contains the GC nodes for this channel's children.\n\t */\n\tprivate updateGCNodes(builder: GCDataBuilder) {\n\t\t// Add a back route to self in each child's GC nodes. If any child is referenced, then its parent should\n\t\t// be considered referenced as well.\n\t\tbuilder.addRouteToAllNodes(this.absolutePath);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", this.getOutboundRoutes());\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. This includes a list of GC nodes that represent this channel\n\t * including any of its child channel contexts. Each node has a set of outbound routes to other GC nodes in the\n\t * document. It does the following:\n\t *\n\t * 1. Calls into each child context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each channel context and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\t// Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n\t\t\t\t\t// graph so any references they might have won't be connected as well.\n\t\t\t\t\treturn this.isChannelAttached(contextId);\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\tthis.updateGCNodes(builder);\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this channel of routes that are used in it. It calls the child contexts to\n\t * update their used routes.\n\t * @param usedRoutes - The routes that are used in all contexts in this channel.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: string[]) {\n\t\t// Get a map of channel ids to routes used in it.\n\t\tconst usedContextRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedContextRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x17e /* \"Used route does not belong to any known context\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each context. Used routes is empty for unused context.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedContextRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n\t * all references added in the system.\n\t * @param srcHandle - The handle of the node that added the reference.\n\t * @param outboundHandle - The handle of the outbound node that is referenced.\n\t */\n\tprivate addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n\t\tthis.dataStoreContext.addedGCOutboundReference?.(srcHandle, outboundHandle);\n\t}\n\n\t/**\n\t * Returns a summary at the current sequence number.\n\t * @param fullTree - true to bypass optimizations and force a full summary tree\n\t * @param trackState - This tells whether we should track state from this summary.\n\t * @param telemetryContext - summary data passed through the layers for telemetry purposes\n\t */\n\tpublic async summarize(\n\t\tfullTree: boolean = false,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each data store and ask it to summarize\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\tconst isAttached = this.isChannelAttached(contextId);\n\t\t\t\t\t// We are not expecting local dds! Summary may not capture local state.\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisAttached,\n\t\t\t\t\t\t0x17f /* \"Not expecting detached channels during summarize\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// If the object is registered - and we have received the sequenced op creating the object\n\t\t\t\t\t// (i.e. it has a base mapping) - then we go ahead and summarize\n\t\t\t\t\treturn isAttached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\t/**\n\t\t * back-compat 0.59.1000 - getAttachSummary() is called when making a data store globally visible (previously\n\t\t * attaching state). Ideally, attachGraph() should have already be called making it locally visible. However,\n\t\t * before visibility state was added, this may not have been the case and getAttachSummary() could be called:\n\t\t *\n\t\t * 1. Before attaching the data store - When a detached container is attached.\n\t\t *\n\t\t * 2. After attaching the data store - When a data store is created and bound in an attached container.\n\t\t *\n\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t */\n\t\tthis.attachGraph();\n\n\t\t// This assert cannot be added now due to back-compat. To be uncommented when the following issue is fixed -\n\t\t// https://github.com/microsoft/FluidFramework/issues/9688.\n\t\t//\n\t\t// assert(this.visibilityState === VisibilityState.LocallyVisible,\n\t\t// \"The data store should be locally visible when generating attach summary\",\n\t\t// );\n\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Craft the .attributes file for each shared object\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tif (!(context instanceof LocalChannelContextBase)) {\n\t\t\t\tthrow new LoggingError(\"Should only be called with local channel handles\");\n\t\t\t}\n\n\t\t\tif (!this.notBoundedChannelContextSet.has(contextId)) {\n\t\t\t\tlet summaryTree: ISummaryTreeWithStats;\n\t\t\t\tif (context.isLoaded) {\n\t\t\t\t\tconst contextSummary = context.getAttachSummary(telemetryContext);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcontextSummary.summary.type === SummaryType.Tree,\n\t\t\t\t\t\t0x180 /* \"getAttachSummary should always return a tree\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = { stats: contextSummary.stats, summary: contextSummary.summary };\n\t\t\t\t} else {\n\t\t\t\t\t// If this channel is not yet loaded, then there should be no changes in the snapshot from which\n\t\t\t\t\t// it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!this.dataStoreContext.baseSnapshot,\n\t\t\t\t\t\t0x181 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\tthis.dataStoreContext.baseSnapshot.trees[contextId],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsummaryBuilder.addWithStats(contextId, summaryTree);\n\t\t\t}\n\t\t}\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic submitMessage(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.submit(type, content, localOpMetadata);\n\t}\n\n\tpublic submitSignal(type: string, content: any) {\n\t\tthis.verifyNotClosed();\n\t\treturn this.dataStoreContext.submitSignal(type, content);\n\t}\n\n\t/**\n\t * Will return when the data store is attached.\n\t */\n\tpublic async waitAttached(): Promise<void> {\n\t\treturn this.deferredAttached.promise;\n\t}\n\n\t/**\n\t * Attach channel should only be called after the data store has been attached\n\t */\n\tprivate attachChannel(channel: IChannel): void {\n\t\tthis.verifyNotClosed();\n\t\t// If this handle is already attached no need to attach again.\n\t\tif (channel.handle.isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.handle.attachGraph();\n\n\t\tassert(this.isAttached, 0x182 /* \"Data store should be attached to attach the channel.\" */);\n\t\tassert(\n\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t0x2d0 /* \"Data store should be globally visible to attach channels.\" */,\n\t\t);\n\n\t\tconst summarizeResult = summarizeChannel(\n\t\t\tchannel,\n\t\t\ttrue /* fullTree */,\n\t\t\tfalse /* trackState */,\n\t\t);\n\t\t// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.\n\t\tconst snapshot = convertSummaryTreeToITree(summarizeResult.summary);\n\n\t\tconst message: IAttachMessage = {\n\t\t\tid: channel.id,\n\t\t\tsnapshot,\n\t\t\ttype: channel.attributes.type,\n\t\t};\n\t\tthis.pendingAttach.add(channel.id);\n\t\tthis.submit(DataStoreMessageType.Attach, message);\n\n\t\tconst context = this.contexts.get(channel.id) as LocalChannelContextBase;\n\t\tcontext.makeVisible();\n\t}\n\n\tprivate submitChannelOp(address: string, contents: any, localOpMetadata: unknown) {\n\t\tconst envelope: IEnvelope = { address, contents };\n\t\tthis.submit(DataStoreMessageType.ChannelOp, envelope, localOpMetadata);\n\t}\n\n\tprivate submit(\n\t\ttype: DataStoreMessageType,\n\t\tcontent: any,\n\t\tlocalOpMetadata: unknown = undefined,\n\t): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.submitMessage(type, content, localOpMetadata);\n\t}\n\n\t/**\n\t * For messages of type MessageType.Operation, finds the right channel and asks it to resubmit the message.\n\t * For all other messages, just submit it again.\n\t * This typically happens when we reconnect and there are unacked messages.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic reSubmit(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x183 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.reSubmit(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.Attach:\n\t\t\t\t// For Attach messages, just submit them again.\n\t\t\t\tthis.submit(type, content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\t/**\n\t * Revert a local op.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic rollback?(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x2ed /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.rollback(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new LoggingError(`Can't rollback ${type} message`);\n\t\t}\n\t}\n\n\tpublic async applyStashedOp(content: any): Promise<unknown> {\n\t\tconst type = content?.type as DataStoreMessageType;\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\tconst attachMessage = content.content as IAttachMessage;\n\t\t\t\t// local means this node will throw if summarized; this is fine because only interactive clients will have stashed ops\n\t\t\t\tconst summarizerNodeParams: CreateChildSummarizerNodeParam = {\n\t\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t\t};\n\t\t\t\tconst context = this.createRemoteChannelContext(\n\t\t\t\t\tattachMessage,\n\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t);\n\t\t\t\tthis.pendingAttach.add(attachMessage.id);\n\t\t\t\tthis.contexts.set(attachMessage.id, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\tconst envelope = content.content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x184 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tawait channelContext.getChannel();\n\t\t\t\treturn channelContext.applyStashedOp(envelope.contents);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\tprivate setChannelDirty(address: string): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.setChannelDirty(address);\n\t}\n\n\tprivate processChannelOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tthis.verifyNotClosed();\n\n\t\tconst envelope = message.contents as IEnvelope;\n\n\t\tconst transformed: ISequencedDocumentMessage = {\n\t\t\t...message,\n\t\t\tcontents: envelope.contents,\n\t\t};\n\n\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\tassert(!!channelContext, 0x185 /* \"Channel not found\" */);\n\t\tchannelContext.processOp(transformed, local, localOpMetadata);\n\n\t\treturn channelContext;\n\t}\n\n\tprivate attachListener() {\n\t\tthis.setMaxListeners(Number.MAX_SAFE_INTEGER);\n\t\tthis.dataStoreContext.once(\"attaching\", () => {\n\t\t\t/**\n\t\t\t * back-compat 0.59.1000 - Ideally, attachGraph() should have already been called making the data store\n\t\t\t * locally visible. However, before visibility state was added, this may not have been the case and data\n\t\t\t * store can move to \"attaching\" state in 2 scenarios:\n\t\t\t * 1) Before attachGraph() is called - When a data store is created and bound in an attached container.\n\t\t\t * 2) After attachGraph() is called - When a detached container is attached.\n\t\t\t *\n\t\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t\t */\n\t\t\tthis.attachGraph();\n\n\t\t\tthis._attachState = AttachState.Attaching;\n\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.LocallyVisible,\n\t\t\t\t0x2d1 /* \"Data store should be locally visible before it can become globally visible.\" */,\n\t\t\t);\n\n\t\t\t// Mark the data store globally visible and make its child channels visible as well.\n\t\t\tthis.visibilityState = VisibilityState.GloballyVisible;\n\t\t\tthis.localChannelContextQueue.forEach((channel) => {\n\t\t\t\tchannel.makeVisible();\n\t\t\t});\n\t\t\tthis.localChannelContextQueue.clear();\n\n\t\t\t// This promise resolution will be moved to attached event once we fix the scheduler.\n\t\t\tthis.deferredAttached.resolve();\n\t\t\tthis.emit(\"attaching\");\n\t\t});\n\t\tthis.dataStoreContext.once(\"attached\", () => {\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t\t0x2d2 /* \"Data store should be globally visible when its attached.\" */,\n\t\t\t);\n\t\t\tthis._attachState = AttachState.Attached;\n\t\t\tthis.emit(\"attached\");\n\t\t});\n\t}\n\n\tprivate verifyNotClosed() {\n\t\tif (this._disposed) {\n\t\t\tthrow new LoggingError(\"Runtime is closed\");\n\t\t}\n\t}\n\n\t/**\n\t * Summarizer client should not have local changes. These changes can become part of the summary and can break\n\t * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas\n\t * other clients that are up-to-date till seq# 100 may not have them yet.\n\t */\n\tprivate identifyLocalChangeInSummarizer(\n\t\teventName: string,\n\t\tchannelId: string,\n\t\tchannelType: string,\n\t) {\n\t\tif (this.clientDetails.type !== \"summarizer\" || this.localChangesTelemetryCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Log a telemetry if there are local changes in the summarizer. This will give us data on how often\n\t\t// this is happening and which data stores do this. The eventual goal is to disallow local changes\n\t\t// in the summarizer and the data will help us plan this.\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName,\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType,\n\t\t\t\tchannelId,\n\t\t\t\tfluidDataStoreId: this.id,\n\t\t\t\tfluidDataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n\t\t\t}),\n\t\t\tstack: generateStack(),\n\t\t});\n\t\tthis.localChangesTelemetryCount--;\n\t}\n}\n\n/**\n * Mixin class that adds request handler to FluidDataStoreRuntime\n * Request handler is only called when data store can't resolve request, i.e. for custom requests.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n * @param requestHandler - request handler to mix in\n */\nexport const mixinRequestHandler = (\n\trequestHandler: (request: IRequest, runtime: FluidDataStoreRuntime) => Promise<IResponse>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithRequestHandler extends Base {\n\t\tpublic async request(request: IRequest) {\n\t\t\tconst response = await super.request(request);\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn requestHandler(request, this);\n\t\t\t}\n\t\t\treturn response;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n\n/**\n * Mixin class that adds await for DataObject to finish initialization before we proceed to summary.\n * @param handler - handler that returns info about blob to be added to summary.\n * Or undefined not to add anything to summary.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n */\nexport const mixinSummaryHandler = (\n\thandler: (\n\t\truntime: FluidDataStoreRuntime,\n\t) => Promise<{ path: string[]; content: string } | undefined>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithSummarizerHandler extends Base {\n\t\tprivate addBlob(summary: ISummaryTreeWithStats, path: string[], content: string) {\n\t\t\tconst firstName = path.shift();\n\t\t\tif (firstName === undefined) {\n\t\t\t\tthrow new LoggingError(\"Path can't be empty\");\n\t\t\t}\n\n\t\t\tlet blob: ISummaryTree | ISummaryBlob = {\n\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tsummary.stats.blobNodeCount++;\n\t\t\tsummary.stats.totalBlobSize += content.length;\n\n\t\t\tfor (const name of path.reverse()) {\n\t\t\t\tblob = {\n\t\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\t\ttree: { [name]: blob },\n\t\t\t\t};\n\t\t\t\tsummary.stats.treeNodeCount++;\n\t\t\t}\n\t\t\tsummary.summary.tree[firstName] = blob;\n\t\t}\n\n\t\tasync summarize(...args: any[]) {\n\t\t\tconst summary = await super.summarize(...args);\n\t\t\tconst content = await handler(this);\n\t\t\tif (content !== undefined) {\n\t\t\t\tthis.addBlob(summary, content.path, content.content);\n\t\t\t}\n\t\t\treturn summary;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n"]}
|
|
1
|
+
{"version":3,"file":"dataStoreRuntime.js","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACN,mBAAmB,EAEnB,aAAa,EACb,YAAY,EAEZ,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,UAAU,GACV,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAGN,WAAW,GAEX,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAIN,WAAW,GAIX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEN,0BAA0B,EAQ1B,eAAe,GAGf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACN,gCAAgC,EAChC,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,0BAA0B,GAC1B,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAmB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAN,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC/B,wBAAwB;IACxB,yCAAiB,CAAA;IACjB,wCAAgB,CAAA;AACjB,CAAC,EAJW,oBAAoB,KAApB,oBAAoB,QAI/B;AAQD;;GAEG;AACH,MAAM,OAAO,qBACZ,SAAQ,iBAA+C;IAmIvD;;;;;;;;;;OAUG;IACH,YACkB,gBAAwC,EACxC,oBAA2C,EAC5D,QAAiB,EACjB,oBAAgF;QAEhF,KAAK,EAAE,CAAC;QALS,qBAAgB,GAAhB,gBAAgB,CAAwB;QACxC,yBAAoB,GAApB,oBAAoB,CAAuB;QA9DrD,cAAS,GAAG,KAAK,CAAC;QAKT,aAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC9C,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,qBAAgB,GAAG,IAAI,QAAQ,EAAQ,CAAC;QACxC,6BAAwB,GAAG,IAAI,GAAG,EAAmC,CAAC;QACtE,gCAA2B,GAAG,IAAI,GAAG,EAAU,CAAC;QAGjE,kHAAkH;QAClH,yBAAyB;QACR,gCAA2B,GAAsB,IAAI,GAAG,EAAE,CAAC;QAqD3E,MAAM,CACL,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAClC,KAAK,CAAC,6EAA6E,CACnF,CAAC;QAEF,IAAI,CAAC,EAAE,GAAG,4BAA4B,CAAC;YACtC,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,SAAS,EAAE,uBAAuB;YAClC,UAAU,EAAE;gBACX,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5B;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAE/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC;QAE3C,mEAAmE;QACnE,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxC,cAAc;gBACd,IAAI,IAAI,KAAK,SAAS,EAAE;oBACvB,OAAO;iBACP;gBAED,IAAI,cAAoE,CAAC;gBACzE,sGAAsG;gBACtG,sGAAsG;gBACtG,6DAA6D;gBAC7D,IAAI,gBAAgB,CAAC,gBAAgB,EAAE;oBACtC,cAAc,GAAG,IAAI,6BAA6B,CACjD,IAAI,EACJ,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,IAAI,CAAC,MAAM,EACX,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EACrD,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAChB,CAAC;oBACF,kGAAkG;oBAClG,iGAAiG;oBACjG,0FAA0F;oBAC1F,4DAA4D;oBAC5D,IAAI,gBAAgB,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ,EAAE;wBAC1D,cAAc,CAAC,WAAW,EAAE,CAAC;qBAC7B;yBAAM;wBACN,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;qBACxD;iBACD;qBAAM;oBACN,cAAc,GAAG,IAAI,oBAAoB,CACxC,IAAI,EACJ,gBAAgB,EAChB,gBAAgB,CAAC,OAAO,EACxB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EACrD,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAChB,IAAI,CAAC,oBAAoB,EACzB,SAAS,CAAC,gBAAgB,EAC1B,IAAI,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,IAAI,EAAE;wBAC1D,IAAI,EAAE,0BAA0B,CAAC,WAAW;qBAC5C,CAAC,CACF,CAAC;iBACF;gBAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;SACH;QAED,IAAI,oBAAoB,EAAE;YACzB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CACtC,OAAO,EACP,EAAE,EACF,IAAI,CAAC,qBAAqB,CAC1B,CAAC;SACF;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC;QAEjD;;;;;;;;;WASG;QACH,IAAI,QAAQ,EAAE;YACb,IAAI,CAAC,eAAe;gBACnB,gBAAgB,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ;oBACpD,CAAC,CAAC,eAAe,CAAC,cAAc;oBAChC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC;SACpC;aAAM;YACN,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,UAAU,CAAC;SAClD;QAED,iDAAiD;QACjD,IAAI,QAAQ,EAAE;YACb,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;SAChC;QAED,qFAAqF;QACrF,IAAI,CAAC,0BAA0B;YAC9B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,4CAA4C,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IA3QD;;;;;;;OAOG;IACI,MAAM,CAAC,IAAI,CACjB,OAA+B,EAC/B,oBAA2C,EAC3C,QAAiB;QAEjB,OAAO,IAAI,qBAAqB,CAC/B,OAAO,EACP,oBAAoB,EACpB,QAAQ,EACR,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,GAAG,CAAC,CACrE,CAAC;IACH,CAAC;IAOD;;OAEG;IACH,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACxC,CAAC;IAED,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ,CAAC;IAClD,CAAC;IAED,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,yBAAyB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;IAClD,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,IAAW,mBAAmB;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAW,kBAAkB;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAW,sBAAsB;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAW,qBAAqB;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAGD,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAoBD,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;IASD;;;;;;;OAOG;IACI,wBAAwB,CAAI,QAAiB;QACnD,uBAAuB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,KAAK,SAAS;YAClE,CAAC,CAAC,QAAQ,EAAE;YACZ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IA+IM,OAAO;QACb,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO;SACP;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAiB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,IAAI;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,SAAS,EAAE;gBAC3C,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;aACtD;YAED,wCAAwC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC9C,IAAI;oBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;oBAE3C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;iBACjE;gBAAC,OAAO,KAAK,EAAE;oBACf,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAC5B,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAC1C,KAAK,CACL,CAAC;oBAEF,OAAO,mBAAmB,CAAC,GAAG,EAAE,0BAA0B,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;iBAC5E;aACD;YAED,iDAAiD;YACjD,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;SAClC;QAAC,OAAO,KAAK,EAAE;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;SAClC;IACF,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,EAAU;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,YAAY,CAAC,wBAAwB,CAAC,CAAC;SACjD;QAED,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,KAAa,IAAI,EAAE,EAAE,IAAY;QACrD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACrB,MAAM,IAAI,UAAU,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;SACzD;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/E,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,mBAAmB,CACtC,EAAE,EACF,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,IAAI,CAAC,MAAM,EACX,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,EAChF,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,CACzD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAE/B,6DAA6D;QAC7D,IAAI,CAAC,+BAA+B,CAAC,wBAAwB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzE,OAAO,OAAO,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,OAAiB;QACnC,MAAM,CACL,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAChD,KAAK,CAAC,wDAAwD,CAC9D,CAAC;QACF,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,0DAA0D;QAC1D,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO;SACP;QAED;;;WAGG;QACH,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzD,OAAO;SACP;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1B,+DAA+D;QAC/D,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACnD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAChC,OAAO,CAAC,EAAE,EACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAA4B,CACxD,CAAC;SACF;IACF,CAAC;IAED;;;;;;;;;;OAUG;IACI,yBAAyB;QAC/B,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;YACxD,OAAO;SACP;QACD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,cAAc,CAAC;QAEtD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACnD,MAAM,CAAC,WAAW,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,WAAW;QACjB,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACI,aAAa;QACnB,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAEM,IAAI,CAAC,MAAoB;QAC/B,kGAAkG;QAClG,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;YACxD,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;SACP;QACD,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEM,kBAAkB,CAAC,SAAkB,EAAE,QAAiB;QAC9D,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACvC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;SAC/C;QAED,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,UAAU,CACtB,IAAqB,EACrB,MAAoB;QAEpB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAEO,0BAA0B,CACjC,aAA6B,EAC7B,oBAAoD;QAEpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,MAAM,YAAY,GAAG,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElF,OAAO,IAAI,oBAAoB,CAC9B,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAC7B,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,CACjC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,EACtE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAClD,CAAC,SAAuB,EAAE,cAA4B,EAAE,EAAE,CACzD,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,EACzD,aAAa,CAAC,EAAE,EAChB,YAAY,EACZ,IAAI,CAAC,oBAAoB,EACzB,SAAS,EACT,IAAI,CAAC,gBAAgB,CAAC,8BAA8B,CACnD,aAAa,CAAC,EAAE,EAChB,oBAAoB,CACpB,EACD,aAAa,CAAC,IAAI,CAClB,CAAC;IACH,CAAC;IAEM,OAAO,CAAC,OAAkC,EAAE,KAAc,EAAE,eAAwB;QAC1F,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI;YACH,sFAAsF;YACtF,QAAQ,OAAO,CAAC,IAAI,EAAE;gBACrB,KAAK,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBACjC,MAAM,aAAa,GAAG,OAAO,CAAC,QAA0B,CAAC;oBACzD,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;oBAE5B,yDAAyD;oBACzD,4CAA4C;oBAC5C,IAAI,KAAK,EAAE;wBACV,MAAM,CACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAC7B,KAAK,CAAC,4CAA4C,CAClD,CAAC;qBACF;yBAAM;wBACN,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;wBAE3E,MAAM,oBAAoB,GAAG;4BAC5B,IAAI,EAAE,0BAA0B,CAAC,UAAU;4BAC3C,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,QAAQ,EAAE,aAAa,CAAC,QAAQ;yBAChC,CAAC;wBAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,CAC3D,aAAa,EACb,oBAAoB,CACpB,CAAC;wBACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;qBAC5C;oBACD,MAAM;iBACN;gBAED,KAAK,oBAAoB,CAAC,SAAS;oBAClC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;oBACvD,MAAM;gBACP,QAAQ;aACR;YAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACzB;QAAC,OAAO,KAAK,EAAE;YACf,MAAM,mBAAmB,CAAC,kBAAkB,CAC3C,KAAK,EACL,6CAA6C,EAC7C,OAAO,CACP,CAAC;SACF;IACF,CAAC;IAEM,aAAa,CAAC,OAA8B,EAAE,KAAc;QAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,iBAAiB,CAAC,EAAU;QACnC,OAAO;QACN,yBAAyB;QACzB,qCAAqC;QACrC,CAAC,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,wDAAwD;YACxD,uDAAuD;YACvD,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,+CAA+C;YAC/C,sCAAsC;YACtC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAC3B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,iBAAiB;QACxB,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACxC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC,CAAC;SACzD;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,OAAsB;QAC3C,wGAAwG;QACxG,oCAAoC;QACpC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9C,8DAA8D;QAC9D,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,SAAS,CAAC,SAAkB,KAAK;QAC7C,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,2DAA2D;QAC3D,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,kGAAkG;YAClG,sEAAsE;YACtE,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC,CAAC;aACD,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;YACnC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtD,wGAAwG;YACxG,6EAA6E;YAC7E,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,UAAoB;QAC3C,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAEjE,2CAA2C;QAC3C,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,iBAAiB,EAAE;YACrC,MAAM,CACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EACrB,KAAK,CAAC,uDAAuD,CAC7D,CAAC;SACF;QAED,mFAAmF;QACnF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SACjE;IACF,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAAC,SAAuB,EAAE,cAA4B;QACrF,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,SAAS,CACrB,WAAoB,KAAK,EACzB,aAAsB,IAAI,EAC1B,gBAAoC;QAEpC,MAAM,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAEhD,uDAAuD;QACvD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACrD,uEAAuE;YACvE,MAAM,CACL,UAAU,EACV,KAAK,CAAC,wDAAwD,CAC9D,CAAC;YACF,0FAA0F;YAC1F,gEAAgE;YAChE,OAAO,UAAU,CAAC;QACnB,CAAC,CAAC;aACD,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;YACnC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,CAC7C,QAAQ,EACR,UAAU,EACV,gBAAgB,CAChB,CAAC;YACF,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACxD,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,cAAc,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAEM,gBAAgB,CAAC,gBAAoC;QAC3D;;;;;;;;;;WAUG;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,4GAA4G;QAC5G,2DAA2D;QAC3D,EAAE;QACF,kEAAkE;QAClE,8EAA8E;QAC9E,KAAK;QAEL,MAAM,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAEhD,oDAAoD;QACpD,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,IAAI,CAAC,CAAC,OAAO,YAAY,uBAAuB,CAAC,EAAE;gBAClD,MAAM,IAAI,YAAY,CAAC,kDAAkD,CAAC,CAAC;aAC3E;YAED,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBACrD,IAAI,WAAkC,CAAC;gBACvC,IAAI,OAAO,CAAC,QAAQ,EAAE;oBACrB,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;oBAClE,MAAM,CACL,cAAc,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAChD,KAAK,CAAC,oDAAoD,CAC1D,CAAC;oBACF,WAAW,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC;iBAC/E;qBAAM;oBACN,gGAAgG;oBAChG,iFAAiF;oBACjF,MAAM,CACL,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EACpC,KAAK,CAAC,+EAA+E,CACrF,CAAC;oBACF,WAAW,GAAG,gCAAgC,CAC7C,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CACnD,CAAC;iBACF;gBACD,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;aACpD;SACD;QAED,OAAO,cAAc,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,IAA0B,EAAE,OAAY,EAAE,eAAwB;QACtF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC;IAEM,YAAY,CAAC,IAAY,EAAE,OAAY;QAC7C,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAiB;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,8DAA8D;QAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;YAC9B,OAAO;SACP;QAED,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE7B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5F,MAAM,CACL,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,eAAe,EACxD,KAAK,CAAC,iEAAiE,CACvE,CAAC;QAEF,MAAM,eAAe,GAAG,gBAAgB,CACvC,OAAO,EACP,IAAI,CAAC,cAAc,EACnB,KAAK,CAAC,gBAAgB,CACtB,CAAC;QACF,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,yBAAyB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAmB;YAC/B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;SAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAA4B,CAAC;QACzE,OAAO,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,QAAa,EAAE,eAAwB;QAC/E,MAAM,QAAQ,GAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACxE,CAAC;IAEO,MAAM,CACb,IAA0B,EAC1B,OAAY,EACZ,kBAA2B,SAAS;QAEpC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;OAMG;IACI,QAAQ,CAAC,IAA0B,EAAE,OAAY,EAAE,eAAwB;QACjF,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,OAAoB,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,MAAM,CACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC5D,MAAM;aACN;YACD,KAAK,oBAAoB,CAAC,MAAM;gBAC/B,+CAA+C;gBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;gBAC5C,MAAM;YACP;gBACC,eAAe,CAAC,IAAI,CAAC,CAAC;SACvB;IACF,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAE,IAA0B,EAAE,OAAY,EAAE,eAAwB;QAClF,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,OAAoB,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,MAAM,CACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC5D,MAAM;aACN;YACD;gBACC,MAAM,IAAI,YAAY,CAAC,kBAAkB,IAAI,UAAU,CAAC,CAAC;SAC1D;IACF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,OAAY;QACvC,MAAM,IAAI,GAAG,OAAO,EAAE,IAA4B,CAAC;QACnD,QAAQ,IAAI,EAAE;YACb,KAAK,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAyB,CAAC;gBACxD,sHAAsH;gBACtH,MAAM,oBAAoB,GAAmC;oBAC5D,IAAI,EAAE,0BAA0B,CAAC,KAAK;iBACtC,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAC9C,aAAa,EACb,oBAAoB,CACpB,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC7C,OAAO;aACP;YACD,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAoB,CAAC;gBAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3D,MAAM,CACL,CAAC,CAAC,cAAc,EAChB,KAAK,CAAC,oDAAoD,CAC1D,CAAC;gBACF,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;gBAClC,OAAO,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACxD;YACD;gBACC,eAAe,CAAC,IAAI,CAAC,CAAC;SACvB;IACF,CAAC;IAEO,eAAe,CAAC,OAAe;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAEO,gBAAgB,CACvB,OAAkC,EAClC,KAAc,EACd,eAAwB;QAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAqB,CAAC;QAE/C,MAAM,WAAW,GAA8B;YAC9C,GAAG,OAAO;YACV,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC3B,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAE9D,OAAO,cAAc,CAAC;IACvB,CAAC;IAEO,cAAc;QACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5C;;;;;;;;eAQG;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC;YAE1C,MAAM,CACL,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,cAAc,EACvD,KAAK,CAAC,mFAAmF,CACzF,CAAC;YAEF,oFAAoF;YACpF,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC;YACvD,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjD,OAAO,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;YAEtC,qFAAqF;YACrF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAC3C,MAAM,CACL,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,eAAe,EACxD,KAAK,CAAC,gEAAgE,CACtE,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,eAAe;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAC;SAC5C;IACF,CAAC;IAED;;;;OAIG;IACK,+BAA+B,CACtC,SAAiB,EACjB,SAAiB,EACjB,WAAmB;QAEnB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,0BAA0B,IAAI,CAAC,EAAE;YACrF,OAAO;SACP;QAED,oGAAoG;QACpG,kGAAkG;QAClG,yDAAyD;QACzD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC;YACjC,SAAS;YACT,GAAG,gBAAgB,CAAC;gBACnB,WAAW;gBACX,SAAS;gBACT,gBAAgB,EAAE,IAAI,CAAC,EAAE;gBACzB,yBAAyB,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;aACtE,CAAC;YACF,KAAK,EAAE,aAAa,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACnC,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAClC,cAAyF,EACzF,OAAqC,qBAAqB,EACzD,EAAE,CACH,MAAM,yBAA0B,SAAQ,IAAI;IACpC,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC5B,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACrC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;CAC+B,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAClC,OAE6D,EAC7D,OAAqC,qBAAqB,EACzD,EAAE,CACH,MAAM,4BAA6B,SAAQ,IAAI;IACtC,OAAO,CAAC,OAA8B,EAAE,IAAc,EAAE,OAAe;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC,CAAC;SAC9C;QAED,IAAI,IAAI,GAAgC;YACvC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,OAAO;SACP,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,GAAG;gBACN,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;aACtB,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;SAC9B;QACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAG,IAAW;QAC7B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE/C,IAAI;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,KAAK,SAAS,EAAE;gBAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;aACrD;SACD;QAAC,OAAO,CAAC,EAAE;YACX,qFAAqF;YACrF,MAAM,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;SACvE;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CAC+B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataProcessingError,\n\tITelemetryLoggerExt,\n\tgenerateStack,\n\tLoggingError,\n\tMonitoringContext,\n\traiseConnectedEvent,\n\tcreateChildMonitoringContext,\n\ttagCodeArtifacts,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tFluidObject,\n\tIFluidHandle,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred, LazyPromise, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIAudience,\n\tIDeltaManager,\n\tAttachState,\n\tILoaderOptions,\n} from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISummaryBlob,\n\tISummaryTree,\n\tIQuorumClients,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreChannel,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tISummaryTreeWithStats,\n\tVisibilityState,\n\tITelemetryContext,\n\tIIdCompressor,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertSummaryTreeToITree,\n\tgenerateHandleContextPath,\n\tRequestParser,\n\tSummaryTreeBuilder,\n\tcreate404Response,\n\tcreateResponseError,\n\texceptionToResponse,\n\tGCDataBuilder,\n\trequestFluidObject,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tIChannel,\n\tIFluidDataStoreRuntime,\n\tIFluidDataStoreRuntimeEvents,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IChannelContext, summarizeChannel } from \"./channelContext\";\nimport {\n\tLocalChannelContext,\n\tLocalChannelContextBase,\n\tRehydratedLocalChannelContext,\n} from \"./localChannelContext\";\nimport { RemoteChannelContext } from \"./remoteChannelContext\";\nimport { FluidObjectHandle } from \"./fluidHandle\";\n\nexport enum DataStoreMessageType {\n\t// Creates a new channel\n\tAttach = \"attach\",\n\tChannelOp = \"op\",\n}\n\nexport interface ISharedObjectRegistry {\n\t// TODO consider making this async. A consequence is that either the creation of a distributed data type\n\t// is async or we need a new API to split the synchronous vs. asynchronous creation.\n\tget(name: string): IChannelFactory | undefined;\n}\n\n/**\n * Base data store class\n */\nexport class FluidDataStoreRuntime\n\textends TypedEventEmitter<IFluidDataStoreRuntimeEvents>\n\timplements IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext\n{\n\t/**\n\t * @deprecated - Instantiate the class using its constructor instead.\n\t *\n\t * Loads the data store runtime\n\t * @param context - The data store context\n\t * @param sharedObjectRegistry - The registry of shared objects used by this data store\n\t * @param existing - If loading from an existing file.\n\t */\n\tpublic static load(\n\t\tcontext: IFluidDataStoreContext,\n\t\tsharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t): FluidDataStoreRuntime {\n\t\treturn new FluidDataStoreRuntime(\n\t\t\tcontext,\n\t\t\tsharedObjectRegistry,\n\t\t\texisting,\n\t\t\tasync (dataStoreRuntime) => requestFluidObject(dataStoreRuntime, \"/\"),\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IFluidDataStoreRuntime.entryPoint}\n\t */\n\tpublic readonly entryPoint?: IFluidHandle<FluidObject>;\n\n\t/**\n\t * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the \"entryPoint\" pattern. Refer to Removing-IFluidRouter.md\n\t */\n\tpublic get IFluidRouter() {\n\t\treturn this;\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn this.dataStoreContext.connected;\n\t}\n\n\tpublic get clientId(): string | undefined {\n\t\treturn this.dataStoreContext.clientId;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.dataStoreContext.clientDetails;\n\t}\n\n\tpublic get isAttached(): boolean {\n\t\treturn this.attachState !== AttachState.Detached;\n\t}\n\n\tpublic get attachState(): AttachState {\n\t\treturn this._attachState;\n\t}\n\n\tpublic get absolutePath(): string {\n\t\treturn generateHandleContextPath(this.id, this.routeContext);\n\t}\n\n\tpublic get routeContext(): IFluidHandleContext {\n\t\treturn this.dataStoreContext.IFluidHandleContext;\n\t}\n\n\tpublic get idCompressor(): IIdCompressor | undefined {\n\t\treturn this.dataStoreContext.idCompressor;\n\t}\n\n\tpublic get IFluidHandleContext() {\n\t\treturn this;\n\t}\n\n\tpublic get rootRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get channelsRoutingContext() {\n\t\treturn this;\n\t}\n\tpublic get objectsRoutingContext() {\n\t\treturn this;\n\t}\n\n\tprivate _disposed = false;\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate readonly contexts = new Map<string, IChannelContext>();\n\tprivate readonly pendingAttach = new Set<string>();\n\n\tprivate readonly deferredAttached = new Deferred<void>();\n\tprivate readonly localChannelContextQueue = new Map<string, LocalChannelContextBase>();\n\tprivate readonly notBoundedChannelContextSet = new Set<string>();\n\tprivate _attachState: AttachState;\n\tpublic visibilityState: VisibilityState;\n\t// A list of handles that are bound when the data store is not visible. We have to make them visible when the data\n\t// store becomes visible.\n\tprivate readonly pendingHandlesToMakeVisible: Set<IFluidHandle> = new Set();\n\n\tpublic readonly id: string;\n\tpublic readonly options: ILoaderOptions;\n\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\tprivate readonly quorum: IQuorumClients;\n\tprivate readonly audience: IAudience;\n\tprivate readonly mc: MonitoringContext;\n\tpublic get logger(): ITelemetryLoggerExt {\n\t\treturn this.mc.logger;\n\t}\n\n\t/**\n\t * If the summarizer makes local changes, a telemetry event is logged. This has the potential to be very noisy.\n\t * So, adding a count of how many telemetry events are logged per data store context. This can be\n\t * controlled via feature flags.\n\t */\n\tprivate localChangesTelemetryCount: number;\n\n\t/**\n\t * Invokes the given callback and expects that no ops are submitted\n\t * until execution finishes. If an op is submitted, an error will be raised.\n\t *\n\t * Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`\n\t *\n\t * @param callback - the callback to be invoked\n\t */\n\tpublic ensureNoDataModelChanges<T>(callback: () => T): T {\n\t\t// back-compat ADO:2309\n\t\treturn this.dataStoreContext.ensureNoDataModelChanges === undefined\n\t\t\t? callback()\n\t\t\t: this.dataStoreContext.ensureNoDataModelChanges(callback);\n\t}\n\n\t/**\n\t * Create an instance of a DataStore runtime.\n\t *\n\t * @param dataStoreContext - Context object for the runtime.\n\t * @param sharedObjectRegistry - The registry of shared objects that this data store will be able to instantiate.\n\t * @param existing - Pass 'true' if loading this datastore from an existing file; pass 'false' otherwise.\n\t * @param initializeEntryPoint - Function to initialize the entryPoint object for the data store runtime. The\n\t * handle to this data store runtime will point to the object returned by this function. If this function is not\n\t * provided, the handle will be left undefined. This is here so we can start making handles a first-class citizen\n\t * and the primary way of interacting with some Fluid objects, and should be used if possible.\n\t */\n\tpublic constructor(\n\t\tprivate readonly dataStoreContext: IFluidDataStoreContext,\n\t\tprivate readonly sharedObjectRegistry: ISharedObjectRegistry,\n\t\texisting: boolean,\n\t\tinitializeEntryPoint?: (runtime: IFluidDataStoreRuntime) => Promise<FluidObject>,\n\t) {\n\t\tsuper();\n\n\t\tassert(\n\t\t\t!dataStoreContext.id.includes(\"/\"),\n\t\t\t0x30e /* Id cannot contain slashes. DataStoreContext should have validated this. */,\n\t\t);\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: dataStoreContext.logger,\n\t\t\tnamespace: \"FluidDataStoreRuntime\",\n\t\t\tproperties: {\n\t\t\t\tall: { dataStoreId: uuid() },\n\t\t\t},\n\t\t});\n\n\t\tthis.id = dataStoreContext.id;\n\t\tthis.options = dataStoreContext.options;\n\t\tthis.deltaManager = dataStoreContext.deltaManager;\n\t\tthis.quorum = dataStoreContext.getQuorum();\n\t\tthis.audience = dataStoreContext.getAudience();\n\n\t\tconst tree = dataStoreContext.baseSnapshot;\n\n\t\t// Must always receive the data store type inside of the attributes\n\t\tif (tree?.trees !== undefined) {\n\t\t\tObject.keys(tree.trees).forEach((path) => {\n\t\t\t\t// Issue #4414\n\t\t\t\tif (path === \"_search\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet channelContext: RemoteChannelContext | RehydratedLocalChannelContext;\n\t\t\t\t// If already exists on storage, then create a remote channel. However, if it is case of rehydrating a\n\t\t\t\t// container from snapshot where we load detached container from a snapshot, isLocalDataStore would be\n\t\t\t\t// true. In this case create a RehydratedLocalChannelContext.\n\t\t\t\tif (dataStoreContext.isLocalDataStore) {\n\t\t\t\t\tchannelContext = new RehydratedLocalChannelContext(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tthis.dataStoreContext,\n\t\t\t\t\t\tthis.dataStoreContext.storage,\n\t\t\t\t\t\tthis.logger,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t);\n\t\t\t\t\t// This is the case of rehydrating a detached container from snapshot. Now due to delay loading of\n\t\t\t\t\t// data store, if the data store is loaded after the container is attached, then we missed making\n\t\t\t\t\t// the channel visible. So do it now. Otherwise, add it to local channel context queue, so\n\t\t\t\t\t// that it can be make it visible later with the data store.\n\t\t\t\t\tif (dataStoreContext.attachState !== AttachState.Detached) {\n\t\t\t\t\t\tchannelContext.makeVisible();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.localChannelContextQueue.set(path, channelContext);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchannelContext = new RemoteChannelContext(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tdataStoreContext,\n\t\t\t\t\t\tdataStoreContext.storage,\n\t\t\t\t\t\t(content, localOpMetadata) =>\n\t\t\t\t\t\t\tthis.submitChannelOp(path, content, localOpMetadata),\n\t\t\t\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\ttree.trees[path],\n\t\t\t\t\t\tthis.sharedObjectRegistry,\n\t\t\t\t\t\tundefined /* extraBlobs */,\n\t\t\t\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(path, {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.contexts.set(path, channelContext);\n\t\t\t});\n\t\t}\n\n\t\tif (initializeEntryPoint) {\n\t\t\tconst promise = new LazyPromise(async () => initializeEntryPoint(this));\n\t\t\tthis.entryPoint = new FluidObjectHandle<FluidObject>(\n\t\t\t\tpromise,\n\t\t\t\t\"\",\n\t\t\t\tthis.objectsRoutingContext,\n\t\t\t);\n\t\t}\n\n\t\tthis.attachListener();\n\t\tthis._attachState = dataStoreContext.attachState;\n\n\t\t/**\n\t\t * If existing flag is false, this is a new data store and is not visible. The existing flag can be true in two\n\t\t * conditions:\n\t\t *\n\t\t * 1. It's a local data store that is created when a detached container is rehydrated. In this case, the data\n\t\t * store is locally visible because the snapshot it is loaded from contains locally visible data stores only.\n\t\t *\n\t\t * 2. It's a remote data store that is created when an attached container is loaded is loaded from snapshot or\n\t\t * when an attach op comes in. In both these cases, the data store is already globally visible.\n\t\t */\n\t\tif (existing) {\n\t\t\tthis.visibilityState =\n\t\t\t\tdataStoreContext.attachState === AttachState.Detached\n\t\t\t\t\t? VisibilityState.LocallyVisible\n\t\t\t\t\t: VisibilityState.GloballyVisible;\n\t\t} else {\n\t\t\tthis.visibilityState = VisibilityState.NotVisible;\n\t\t}\n\n\t\t// If it's existing we know it has been attached.\n\t\tif (existing) {\n\t\t\tthis.deferredAttached.resolve();\n\t\t}\n\n\t\t// By default, a data store can log maximum 10 local changes telemetry in summarizer.\n\t\tthis.localChangesTelemetryCount =\n\t\t\tthis.mc.config.getNumber(\"Fluid.Telemetry.LocalChangesTelemetryCount\") ?? 10;\n\t}\n\n\tpublic dispose(): void {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\n\t\tthis.emit(\"dispose\");\n\t\tthis.removeAllListeners();\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\treturn this.request(request);\n\t}\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\ttry {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tconst id = parser.pathParts[0];\n\n\t\t\tif (id === \"_channels\" || id === \"_custom\") {\n\t\t\t\treturn await this.request(parser.createSubRequest(1));\n\t\t\t}\n\n\t\t\t// Check for a data type reference first\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tif (context !== undefined && parser.isLeaf(1)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst channel = await context.getChannel();\n\n\t\t\t\t\treturn { mimeType: \"fluid/object\", status: 200, value: channel };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t\t{ eventName: \"GetChannelFailedInRequest\" },\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn createResponseError(500, `Failed to get Channel: ${error}`, request);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise defer to an attached request handler\n\t\t\treturn create404Response(request);\n\t\t} catch (error) {\n\t\t\treturn exceptionToResponse(error);\n\t\t}\n\t}\n\n\tpublic async getChannel(id: string): Promise<IChannel> {\n\t\tthis.verifyNotClosed();\n\n\t\tconst context = this.contexts.get(id);\n\t\tif (context === undefined) {\n\t\t\tthrow new LoggingError(\"Channel does not exist\");\n\t\t}\n\n\t\treturn context.getChannel();\n\t}\n\n\tpublic createChannel(id: string = uuid(), type: string): IChannel {\n\t\tif (id.includes(\"/\")) {\n\t\t\tthrow new UsageError(`Id cannot contain slashes: ${id}`);\n\t\t}\n\n\t\tthis.verifyNotClosed();\n\n\t\tassert(!this.contexts.has(id), 0x179 /* \"createChannel() with existing ID\" */);\n\t\tthis.notBoundedChannelContextSet.add(id);\n\t\tconst context = new LocalChannelContext(\n\t\t\tid,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\ttype,\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\tthis.logger,\n\t\t\t(content, localOpMetadata) => this.submitChannelOp(id, content, localOpMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t);\n\t\tthis.contexts.set(id, context);\n\n\t\t// Channels (DDS) should not be created in summarizer client.\n\t\tthis.identifyLocalChangeInSummarizer(\"DDSCreatedInSummarizer\", id, type);\n\n\t\treturn context.channel;\n\t}\n\n\t/**\n\t * Binds a channel with the runtime. If the runtime is attached we will attach the channel right away.\n\t * If the runtime is not attached we will defer the attach until the runtime attaches.\n\t * @param channel - channel to be registered.\n\t */\n\tpublic bindChannel(channel: IChannel): void {\n\t\tassert(\n\t\t\tthis.notBoundedChannelContextSet.has(channel.id),\n\t\t\t0x17b /* \"Channel to be bound should be in not bounded set\" */,\n\t\t);\n\t\tthis.notBoundedChannelContextSet.delete(channel.id);\n\t\t// If our data store is attached, then attach the channel.\n\t\tif (this.isAttached) {\n\t\t\tthis.attachChannel(channel);\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * If this channel is already waiting to be made visible, do nothing. This can happen during attachGraph() when\n\t\t * a channel's graph is attached. It calls bindToContext on the shared object which will end up back here.\n\t\t */\n\t\tif (this.pendingHandlesToMakeVisible.has(channel.handle)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bind(channel.handle);\n\n\t\t// If our data store is local then add the channel to the queue\n\t\tif (!this.localChannelContextQueue.has(channel.id)) {\n\t\t\tthis.localChannelContextQueue.set(\n\t\t\t\tchannel.id,\n\t\t\t\tthis.contexts.get(channel.id) as LocalChannelContextBase,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * This function is called when a data store becomes root. It does the following:\n\t *\n\t * 1. Marks the data store locally visible in the container.\n\t *\n\t * 2. Attaches the graph of all the handles bound to it.\n\t *\n\t * 3. Calls into the data store context to mark it visible in the container too. If the container is globally\n\t * visible, it will mark us globally visible. Otherwise, it will mark us globally visible when it becomes\n\t * globally visible.\n\t */\n\tpublic makeVisibleAndAttachGraph() {\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\treturn;\n\t\t}\n\t\tthis.visibilityState = VisibilityState.LocallyVisible;\n\n\t\tthis.pendingHandlesToMakeVisible.forEach((handle) => {\n\t\t\thandle.attachGraph();\n\t\t});\n\t\tthis.pendingHandlesToMakeVisible.clear();\n\t\tthis.dataStoreContext.makeLocallyVisible();\n\t}\n\n\t/**\n\t * This function is called when a handle to this data store is added to a visible DDS.\n\t */\n\tpublic attachGraph() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\t/**\n\t * @deprecated - Not necessary if consumers add a new dataStore to the container by storing its handle.\n\t * Binds this runtime to the container\n\t * This includes the following:\n\t * 1. Sending an Attach op that includes all existing state\n\t * 2. Attaching the graph if the data store becomes attached.\n\t */\n\tpublic bindToContext() {\n\t\tthis.makeVisibleAndAttachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\t// If visible, attach the incoming handle's graph. Else, this will be done when we become visible.\n\t\tif (this.visibilityState !== VisibilityState.NotVisible) {\n\t\t\thandle.attachGraph();\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingHandlesToMakeVisible.add(handle);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tthis.verifyNotClosed();\n\n\t\tfor (const [, object] of this.contexts) {\n\t\t\tobject.setConnectionState(connected, clientId);\n\t\t}\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n\n\tpublic getQuorum(): IQuorumClients {\n\t\treturn this.quorum;\n\t}\n\n\tpublic getAudience(): IAudience {\n\t\treturn this.audience;\n\t}\n\n\tpublic async uploadBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tthis.verifyNotClosed();\n\n\t\treturn this.dataStoreContext.uploadBlob(blob, signal);\n\t}\n\n\tprivate createRemoteChannelContext(\n\t\tattachMessage: IAttachMessage,\n\t\tsummarizerNodeParams: CreateChildSummarizerNodeParam,\n\t) {\n\t\tconst flatBlobs = new Map<string, ArrayBufferLike>();\n\t\tconst snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n\n\t\treturn new RemoteChannelContext(\n\t\t\tthis,\n\t\t\tthis.dataStoreContext,\n\t\t\tthis.dataStoreContext.storage,\n\t\t\t(content, localContentMetadata) =>\n\t\t\t\tthis.submitChannelOp(attachMessage.id, content, localContentMetadata),\n\t\t\t(address: string) => this.setChannelDirty(address),\n\t\t\t(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>\n\t\t\t\tthis.addedGCOutboundReference(srcHandle, outboundHandle),\n\t\t\tattachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\tthis.sharedObjectRegistry,\n\t\t\tflatBlobs,\n\t\t\tthis.dataStoreContext.getCreateChildSummarizerNodeFn(\n\t\t\t\tattachMessage.id,\n\t\t\t\tsummarizerNodeParams,\n\t\t\t),\n\t\t\tattachMessage.type,\n\t\t);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tswitch (message.type) {\n\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\tconst attachMessage = message.contents as IAttachMessage;\n\t\t\t\t\tconst id = attachMessage.id;\n\n\t\t\t\t\t// If a non-local operation then go and create the object\n\t\t\t\t\t// Otherwise mark it as officially attached.\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tthis.pendingAttach.delete(id),\n\t\t\t\t\t\t\t0x17c /* \"Unexpected attach (local) channel OP\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassert(!this.contexts.has(id), 0x17d /* \"Unexpected attach channel OP\" */);\n\n\t\t\t\t\t\tconst summarizerNodeParams = {\n\t\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\t\tsnapshot: attachMessage.snapshot,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst remoteChannelContext = this.createRemoteChannelContext(\n\t\t\t\t\t\t\tattachMessage,\n\t\t\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.contexts.set(id, remoteChannelContext);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tthis.processChannelOp(message, local, localOpMetadata);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tthis.emit(\"op\", message);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"fluidDataStoreRuntimeFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic processSignal(message: IInboundSignalMessage, local: boolean) {\n\t\tthis.emit(\"signal\", message, local);\n\t}\n\n\tprivate isChannelAttached(id: string): boolean {\n\t\treturn (\n\t\t\t// Added in createChannel\n\t\t\t// Removed when bindChannel is called\n\t\t\t!this.notBoundedChannelContextSet.has(id) &&\n\t\t\t// Added in bindChannel only if this is not attached yet\n\t\t\t// Removed when this is attached by calling attachGraph\n\t\t\t!this.localChannelContextQueue.has(id) &&\n\t\t\t// Added in attachChannel called by bindChannel\n\t\t\t// Removed when attach op is broadcast\n\t\t\t!this.pendingAttach.has(id)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Currently, all contexts in this channel are considered\n\t * referenced and are hence outbound. This will change when we have root and non-root channel contexts.\n\t * The only root contexts will be considered as referenced.\n\t */\n\tprivate getOutboundRoutes(): string[] {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId] of this.contexts) {\n\t\t\toutboundRoutes.push(`${this.absolutePath}/${contextId}`);\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Updates the GC nodes of this channel. It does the following:\n\t * - Adds a back route to self to all its child GC nodes.\n\t * - Adds a node for this channel.\n\t * @param builder - The builder that contains the GC nodes for this channel's children.\n\t */\n\tprivate updateGCNodes(builder: GCDataBuilder) {\n\t\t// Add a back route to self in each child's GC nodes. If any child is referenced, then its parent should\n\t\t// be considered referenced as well.\n\t\tbuilder.addRouteToAllNodes(this.absolutePath);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", this.getOutboundRoutes());\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. This includes a list of GC nodes that represent this channel\n\t * including any of its child channel contexts. Each node has a set of outbound routes to other GC nodes in the\n\t * document. It does the following:\n\t *\n\t * 1. Calls into each child context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each channel context and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\t// Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n\t\t\t\t\t// graph so any references they might have won't be connected as well.\n\t\t\t\t\treturn this.isChannelAttached(contextId);\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\tthis.updateGCNodes(builder);\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this channel of routes that are used in it. It calls the child contexts to\n\t * update their used routes.\n\t * @param usedRoutes - The routes that are used in all contexts in this channel.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: string[]) {\n\t\t// Get a map of channel ids to routes used in it.\n\t\tconst usedContextRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedContextRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x17e /* \"Used route does not belong to any known context\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each context. Used routes is empty for unused context.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedContextRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a new outbound reference is added to another node. This is used by garbage collection to identify\n\t * all references added in the system.\n\t * @param srcHandle - The handle of the node that added the reference.\n\t * @param outboundHandle - The handle of the outbound node that is referenced.\n\t */\n\tprivate addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {\n\t\tthis.dataStoreContext.addedGCOutboundReference?.(srcHandle, outboundHandle);\n\t}\n\n\t/**\n\t * Returns a summary at the current sequence number.\n\t * @param fullTree - true to bypass optimizations and force a full summary tree\n\t * @param trackState - This tells whether we should track state from this summary.\n\t * @param telemetryContext - summary data passed through the layers for telemetry purposes\n\t */\n\tpublic async summarize(\n\t\tfullTree: boolean = false,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each data store and ask it to summarize\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([contextId, _]) => {\n\t\t\t\t\tconst isAttached = this.isChannelAttached(contextId);\n\t\t\t\t\t// We are not expecting local dds! Summary may not capture local state.\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisAttached,\n\t\t\t\t\t\t0x17f /* \"Not expecting detached channels during summarize\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// If the object is registered - and we have received the sequenced op creating the object\n\t\t\t\t\t// (i.e. it has a base mapping) - then we go ahead and summarize\n\t\t\t\t\treturn isAttached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\t/**\n\t\t * back-compat 0.59.1000 - getAttachSummary() is called when making a data store globally visible (previously\n\t\t * attaching state). Ideally, attachGraph() should have already be called making it locally visible. However,\n\t\t * before visibility state was added, this may not have been the case and getAttachSummary() could be called:\n\t\t *\n\t\t * 1. Before attaching the data store - When a detached container is attached.\n\t\t *\n\t\t * 2. After attaching the data store - When a data store is created and bound in an attached container.\n\t\t *\n\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t */\n\t\tthis.attachGraph();\n\n\t\t// This assert cannot be added now due to back-compat. To be uncommented when the following issue is fixed -\n\t\t// https://github.com/microsoft/FluidFramework/issues/9688.\n\t\t//\n\t\t// assert(this.visibilityState === VisibilityState.LocallyVisible,\n\t\t// \"The data store should be locally visible when generating attach summary\",\n\t\t// );\n\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Craft the .attributes file for each shared object\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tif (!(context instanceof LocalChannelContextBase)) {\n\t\t\t\tthrow new LoggingError(\"Should only be called with local channel handles\");\n\t\t\t}\n\n\t\t\tif (!this.notBoundedChannelContextSet.has(contextId)) {\n\t\t\t\tlet summaryTree: ISummaryTreeWithStats;\n\t\t\t\tif (context.isLoaded) {\n\t\t\t\t\tconst contextSummary = context.getAttachSummary(telemetryContext);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcontextSummary.summary.type === SummaryType.Tree,\n\t\t\t\t\t\t0x180 /* \"getAttachSummary should always return a tree\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = { stats: contextSummary.stats, summary: contextSummary.summary };\n\t\t\t\t} else {\n\t\t\t\t\t// If this channel is not yet loaded, then there should be no changes in the snapshot from which\n\t\t\t\t\t// it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!this.dataStoreContext.baseSnapshot,\n\t\t\t\t\t\t0x181 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryTree = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\tthis.dataStoreContext.baseSnapshot.trees[contextId],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsummaryBuilder.addWithStats(contextId, summaryTree);\n\t\t\t}\n\t\t}\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic submitMessage(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.submit(type, content, localOpMetadata);\n\t}\n\n\tpublic submitSignal(type: string, content: any) {\n\t\tthis.verifyNotClosed();\n\t\treturn this.dataStoreContext.submitSignal(type, content);\n\t}\n\n\t/**\n\t * Will return when the data store is attached.\n\t */\n\tpublic async waitAttached(): Promise<void> {\n\t\treturn this.deferredAttached.promise;\n\t}\n\n\t/**\n\t * Attach channel should only be called after the data store has been attached\n\t */\n\tprivate attachChannel(channel: IChannel): void {\n\t\tthis.verifyNotClosed();\n\t\t// If this handle is already attached no need to attach again.\n\t\tif (channel.handle.isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.handle.attachGraph();\n\n\t\tassert(this.isAttached, 0x182 /* \"Data store should be attached to attach the channel.\" */);\n\t\tassert(\n\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t0x2d0 /* \"Data store should be globally visible to attach channels.\" */,\n\t\t);\n\n\t\tconst summarizeResult = summarizeChannel(\n\t\t\tchannel,\n\t\t\ttrue /* fullTree */,\n\t\t\tfalse /* trackState */,\n\t\t);\n\t\t// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.\n\t\tconst snapshot = convertSummaryTreeToITree(summarizeResult.summary);\n\n\t\tconst message: IAttachMessage = {\n\t\t\tid: channel.id,\n\t\t\tsnapshot,\n\t\t\ttype: channel.attributes.type,\n\t\t};\n\t\tthis.pendingAttach.add(channel.id);\n\t\tthis.submit(DataStoreMessageType.Attach, message);\n\n\t\tconst context = this.contexts.get(channel.id) as LocalChannelContextBase;\n\t\tcontext.makeVisible();\n\t}\n\n\tprivate submitChannelOp(address: string, contents: any, localOpMetadata: unknown) {\n\t\tconst envelope: IEnvelope = { address, contents };\n\t\tthis.submit(DataStoreMessageType.ChannelOp, envelope, localOpMetadata);\n\t}\n\n\tprivate submit(\n\t\ttype: DataStoreMessageType,\n\t\tcontent: any,\n\t\tlocalOpMetadata: unknown = undefined,\n\t): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.submitMessage(type, content, localOpMetadata);\n\t}\n\n\t/**\n\t * For messages of type MessageType.Operation, finds the right channel and asks it to resubmit the message.\n\t * For all other messages, just submit it again.\n\t * This typically happens when we reconnect and there are unacked messages.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic reSubmit(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x183 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.reSubmit(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.Attach:\n\t\t\t\t// For Attach messages, just submit them again.\n\t\t\t\tthis.submit(type, content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\t/**\n\t * Revert a local op.\n\t * @param content - The content of the original message.\n\t * @param localOpMetadata - The local metadata associated with the original message.\n\t */\n\tpublic rollback?(type: DataStoreMessageType, content: any, localOpMetadata: unknown) {\n\t\tthis.verifyNotClosed();\n\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\t// For Operations, find the right channel and trigger resubmission on it.\n\t\t\t\tconst envelope = content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x2ed /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tchannelContext.rollback(envelope.contents, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new LoggingError(`Can't rollback ${type} message`);\n\t\t}\n\t}\n\n\tpublic async applyStashedOp(content: any): Promise<unknown> {\n\t\tconst type = content?.type as DataStoreMessageType;\n\t\tswitch (type) {\n\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\tconst attachMessage = content.content as IAttachMessage;\n\t\t\t\t// local means this node will throw if summarized; this is fine because only interactive clients will have stashed ops\n\t\t\t\tconst summarizerNodeParams: CreateChildSummarizerNodeParam = {\n\t\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t\t};\n\t\t\t\tconst context = this.createRemoteChannelContext(\n\t\t\t\t\tattachMessage,\n\t\t\t\t\tsummarizerNodeParams,\n\t\t\t\t);\n\t\t\t\tthis.pendingAttach.add(attachMessage.id);\n\t\t\t\tthis.contexts.set(attachMessage.id, context);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase DataStoreMessageType.ChannelOp: {\n\t\t\t\tconst envelope = content.content as IEnvelope;\n\t\t\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\t\t\tassert(\n\t\t\t\t\t!!channelContext,\n\t\t\t\t\t0x184 /* \"There should be a channel context for the op\" */,\n\t\t\t\t);\n\t\t\t\tawait channelContext.getChannel();\n\t\t\t\treturn channelContext.applyStashedOp(envelope.contents);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(type);\n\t\t}\n\t}\n\n\tprivate setChannelDirty(address: string): void {\n\t\tthis.verifyNotClosed();\n\t\tthis.dataStoreContext.setChannelDirty(address);\n\t}\n\n\tprivate processChannelOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tthis.verifyNotClosed();\n\n\t\tconst envelope = message.contents as IEnvelope;\n\n\t\tconst transformed: ISequencedDocumentMessage = {\n\t\t\t...message,\n\t\t\tcontents: envelope.contents,\n\t\t};\n\n\t\tconst channelContext = this.contexts.get(envelope.address);\n\t\tassert(!!channelContext, 0x185 /* \"Channel not found\" */);\n\t\tchannelContext.processOp(transformed, local, localOpMetadata);\n\n\t\treturn channelContext;\n\t}\n\n\tprivate attachListener() {\n\t\tthis.setMaxListeners(Number.MAX_SAFE_INTEGER);\n\t\tthis.dataStoreContext.once(\"attaching\", () => {\n\t\t\t/**\n\t\t\t * back-compat 0.59.1000 - Ideally, attachGraph() should have already been called making the data store\n\t\t\t * locally visible. However, before visibility state was added, this may not have been the case and data\n\t\t\t * store can move to \"attaching\" state in 2 scenarios:\n\t\t\t * 1) Before attachGraph() is called - When a data store is created and bound in an attached container.\n\t\t\t * 2) After attachGraph() is called - When a detached container is attached.\n\t\t\t *\n\t\t\t * The basic idea is that all local object should become locally visible before they are globally visible.\n\t\t\t */\n\t\t\tthis.attachGraph();\n\n\t\t\tthis._attachState = AttachState.Attaching;\n\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.LocallyVisible,\n\t\t\t\t0x2d1 /* \"Data store should be locally visible before it can become globally visible.\" */,\n\t\t\t);\n\n\t\t\t// Mark the data store globally visible and make its child channels visible as well.\n\t\t\tthis.visibilityState = VisibilityState.GloballyVisible;\n\t\t\tthis.localChannelContextQueue.forEach((channel) => {\n\t\t\t\tchannel.makeVisible();\n\t\t\t});\n\t\t\tthis.localChannelContextQueue.clear();\n\n\t\t\t// This promise resolution will be moved to attached event once we fix the scheduler.\n\t\t\tthis.deferredAttached.resolve();\n\t\t\tthis.emit(\"attaching\");\n\t\t});\n\t\tthis.dataStoreContext.once(\"attached\", () => {\n\t\t\tassert(\n\t\t\t\tthis.visibilityState === VisibilityState.GloballyVisible,\n\t\t\t\t0x2d2 /* \"Data store should be globally visible when its attached.\" */,\n\t\t\t);\n\t\t\tthis._attachState = AttachState.Attached;\n\t\t\tthis.emit(\"attached\");\n\t\t});\n\t}\n\n\tprivate verifyNotClosed() {\n\t\tif (this._disposed) {\n\t\t\tthrow new LoggingError(\"Runtime is closed\");\n\t\t}\n\t}\n\n\t/**\n\t * Summarizer client should not have local changes. These changes can become part of the summary and can break\n\t * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas\n\t * other clients that are up-to-date till seq# 100 may not have them yet.\n\t */\n\tprivate identifyLocalChangeInSummarizer(\n\t\teventName: string,\n\t\tchannelId: string,\n\t\tchannelType: string,\n\t) {\n\t\tif (this.clientDetails.type !== \"summarizer\" || this.localChangesTelemetryCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Log a telemetry if there are local changes in the summarizer. This will give us data on how often\n\t\t// this is happening and which data stores do this. The eventual goal is to disallow local changes\n\t\t// in the summarizer and the data will help us plan this.\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName,\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType,\n\t\t\t\tchannelId,\n\t\t\t\tfluidDataStoreId: this.id,\n\t\t\t\tfluidDataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n\t\t\t}),\n\t\t\tstack: generateStack(),\n\t\t});\n\t\tthis.localChangesTelemetryCount--;\n\t}\n}\n\n/**\n * Mixin class that adds request handler to FluidDataStoreRuntime\n * Request handler is only called when data store can't resolve request, i.e. for custom requests.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n * @param requestHandler - request handler to mix in\n */\nexport const mixinRequestHandler = (\n\trequestHandler: (request: IRequest, runtime: FluidDataStoreRuntime) => Promise<IResponse>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithRequestHandler extends Base {\n\t\tpublic async request(request: IRequest) {\n\t\t\tconst response = await super.request(request);\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn requestHandler(request, this);\n\t\t\t}\n\t\t\treturn response;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n\n/**\n * Mixin class that adds await for DataObject to finish initialization before we proceed to summary.\n * @param handler - handler that returns info about blob to be added to summary.\n * Or undefined not to add anything to summary.\n * @param Base - base class, inherits from FluidDataStoreRuntime\n */\nexport const mixinSummaryHandler = (\n\thandler: (\n\t\truntime: FluidDataStoreRuntime,\n\t) => Promise<{ path: string[]; content: string } | undefined>,\n\tBase: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,\n) =>\n\tclass RuntimeWithSummarizerHandler extends Base {\n\t\tprivate addBlob(summary: ISummaryTreeWithStats, path: string[], content: string) {\n\t\t\tconst firstName = path.shift();\n\t\t\tif (firstName === undefined) {\n\t\t\t\tthrow new LoggingError(\"Path can't be empty\");\n\t\t\t}\n\n\t\t\tlet blob: ISummaryTree | ISummaryBlob = {\n\t\t\t\ttype: SummaryType.Blob,\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tsummary.stats.blobNodeCount++;\n\t\t\tsummary.stats.totalBlobSize += content.length;\n\n\t\t\tfor (const name of path.reverse()) {\n\t\t\t\tblob = {\n\t\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\t\ttree: { [name]: blob },\n\t\t\t\t};\n\t\t\t\tsummary.stats.treeNodeCount++;\n\t\t\t}\n\t\t\tsummary.summary.tree[firstName] = blob;\n\t\t}\n\n\t\tasync summarize(...args: any[]) {\n\t\t\tconst summary = await super.summarize(...args);\n\n\t\t\ttry {\n\t\t\t\tconst content = await handler(this);\n\t\t\t\tif (content !== undefined) {\n\t\t\t\t\tthis.addBlob(summary, content.path, content.content);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Any error coming from app-provided handler should be marked as DataProcessingError\n\t\t\t\tthrow DataProcessingError.wrapIfUnrecognized(e, \"mixinSummaryHandler\");\n\t\t\t}\n\n\t\t\treturn summary;\n\t\t}\n\t} as typeof FluidDataStoreRuntime;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/datastore",
|
|
3
|
-
"version": "2.0.0-internal.6.
|
|
3
|
+
"version": "2.0.0-internal.6.4.0",
|
|
4
4
|
"description": "Fluid data store implementation",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -35,19 +35,18 @@
|
|
|
35
35
|
"temp-directory": "nyc/.nyc_output"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@fluid-internal/client-utils": ">=2.0.0-internal.6.
|
|
39
|
-
"@fluidframework/container-definitions": ">=2.0.0-internal.6.
|
|
40
|
-
"@fluidframework/container-utils": ">=2.0.0-internal.6.
|
|
41
|
-
"@fluidframework/core-interfaces": ">=2.0.0-internal.6.
|
|
42
|
-
"@fluidframework/core-utils": ">=2.0.0-internal.6.
|
|
43
|
-
"@fluidframework/datastore-definitions": ">=2.0.0-internal.6.
|
|
44
|
-
"@fluidframework/driver-definitions": ">=2.0.0-internal.6.
|
|
45
|
-
"@fluidframework/driver-utils": ">=2.0.0-internal.6.
|
|
46
|
-
"@fluidframework/protocol-base": "^1.0.1",
|
|
38
|
+
"@fluid-internal/client-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
39
|
+
"@fluidframework/container-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
40
|
+
"@fluidframework/container-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
41
|
+
"@fluidframework/core-interfaces": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
42
|
+
"@fluidframework/core-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
43
|
+
"@fluidframework/datastore-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
44
|
+
"@fluidframework/driver-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
45
|
+
"@fluidframework/driver-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
47
46
|
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
48
|
-
"@fluidframework/runtime-definitions": ">=2.0.0-internal.6.
|
|
49
|
-
"@fluidframework/runtime-utils": ">=2.0.0-internal.6.
|
|
50
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-internal.6.
|
|
47
|
+
"@fluidframework/runtime-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
48
|
+
"@fluidframework/runtime-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
49
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
51
50
|
"lodash": "^4.17.21",
|
|
52
51
|
"uuid": "^9.0.0"
|
|
53
52
|
},
|
|
@@ -55,10 +54,10 @@
|
|
|
55
54
|
"@fluid-tools/build-cli": "^0.22.0",
|
|
56
55
|
"@fluidframework/build-common": "^2.0.0",
|
|
57
56
|
"@fluidframework/build-tools": "^0.22.0",
|
|
58
|
-
"@fluidframework/datastore-previous": "npm:@fluidframework/datastore@2.0.0-internal.6.3.
|
|
57
|
+
"@fluidframework/datastore-previous": "npm:@fluidframework/datastore@2.0.0-internal.6.3.0",
|
|
59
58
|
"@fluidframework/eslint-config-fluid": "^2.1.0",
|
|
60
|
-
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.6.
|
|
61
|
-
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.6.
|
|
59
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
60
|
+
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
|
|
62
61
|
"@microsoft/api-extractor": "^7.34.4",
|
|
63
62
|
"@types/mocha": "^9.1.1",
|
|
64
63
|
"@types/node": "^16.18.38",
|
package/src/dataStoreRuntime.ts
CHANGED
|
@@ -384,16 +384,13 @@ export class FluidDataStoreRuntime
|
|
|
384
384
|
return this.request(request);
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
/**
|
|
388
|
-
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
389
|
-
*/
|
|
390
387
|
public async request(request: IRequest): Promise<IResponse> {
|
|
391
388
|
try {
|
|
392
389
|
const parser = RequestParser.create(request);
|
|
393
390
|
const id = parser.pathParts[0];
|
|
394
391
|
|
|
395
392
|
if (id === "_channels" || id === "_custom") {
|
|
396
|
-
return this.request(parser.createSubRequest(1));
|
|
393
|
+
return await this.request(parser.createSubRequest(1));
|
|
397
394
|
}
|
|
398
395
|
|
|
399
396
|
// Check for a data type reference first
|
|
@@ -1185,10 +1182,17 @@ export const mixinSummaryHandler = (
|
|
|
1185
1182
|
|
|
1186
1183
|
async summarize(...args: any[]) {
|
|
1187
1184
|
const summary = await super.summarize(...args);
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1185
|
+
|
|
1186
|
+
try {
|
|
1187
|
+
const content = await handler(this);
|
|
1188
|
+
if (content !== undefined) {
|
|
1189
|
+
this.addBlob(summary, content.path, content.content);
|
|
1190
|
+
}
|
|
1191
|
+
} catch (e) {
|
|
1192
|
+
// Any error coming from app-provided handler should be marked as DataProcessingError
|
|
1193
|
+
throw DataProcessingError.wrapIfUnrecognized(e, "mixinSummaryHandler");
|
|
1191
1194
|
}
|
|
1195
|
+
|
|
1192
1196
|
return summary;
|
|
1193
1197
|
}
|
|
1194
1198
|
} as typeof FluidDataStoreRuntime;
|