@fluidframework/test-utils 0.49.0 → 0.50.0-41540
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/loaderContainerTracker.d.ts.map +1 -1
- package/dist/loaderContainerTracker.js +10 -7
- package/dist/loaderContainerTracker.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/testObjectProvider.d.ts +16 -7
- package/dist/testObjectProvider.d.ts.map +1 -1
- package/dist/testObjectProvider.js +45 -11
- package/dist/testObjectProvider.js.map +1 -1
- package/package.json +20 -19
- package/src/index.ts +0 -1
- package/src/loaderContainerTracker.ts +11 -7
- package/src/packageVersion.ts +1 -1
- package/src/testObjectProvider.ts +67 -18
- package/dist/opProcessingController.d.ts +0 -104
- package/dist/opProcessingController.d.ts.map +0 -1
- package/dist/opProcessingController.js +0 -431
- package/dist/opProcessingController.js.map +0 -1
- package/src/opProcessingController.ts +0 -508
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { IContainer, IHostLoader, ILoaderOptions } from \"@fluidframework/container-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { Container, IDetachedBlobStorage, Loader, waitContainerToCatchUp } from \"@fluidframework/container-loader\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime\";\nimport { IFluidCodeDetails, IRequestHeader } from \"@fluidframework/core-interfaces\";\nimport { IDocumentServiceFactory, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { ITestDriver } from \"@fluidframework/test-driver-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChildLogger, MultiSinkLogger } from \"@fluidframework/telemetry-utils\";\nimport { LoaderContainerTracker } from \"./loaderContainerTracker\";\nimport { fluidEntryPoint, LocalCodeLoader } from \"./localCodeLoader\";\nimport { createAndAttachContainer } from \"./localLoader\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n package: \"defaultTestPackage\",\n config: {},\n};\n\nexport interface IOpProcessingController {\n processIncoming(...containers: IContainer[]): Promise<void>;\n processOutgoing(...containers: IContainer[]): Promise<void>;\n pauseProcessing(...containers: IContainer[]): Promise<void>;\n resumeProcessing(...containers: IContainer[]): void;\n}\n\nexport interface ITestObjectProvider {\n createLoader(\n packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n options?: ITestLoaderOptions,\n detachedBlobStorage?: IDetachedBlobStorage,\n ): IHostLoader;\n createContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions): Promise<IContainer>;\n loadContainer(\n entryPoint: fluidEntryPoint,\n options?: ITestLoaderOptions,\n requestHeader?: IRequestHeader,\n ): Promise<IContainer>;\n\n /**\n * Used to create a test Container. The Loader/ContainerRuntime/DataRuntime might be different versioned.\n * In generateLocalCompatTest(), this Container and its runtime will be arbitrarily-versioned.\n */\n makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage): IHostLoader,\n makeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,\n loadTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,\n\n logger: ITelemetryBaseLogger,\n documentServiceFactory: IDocumentServiceFactory,\n urlResolver: IUrlResolver,\n defaultCodeDetails: IFluidCodeDetails,\n opProcessingController: IOpProcessingController,\n\n ensureSynchronized(): Promise<void>;\n reset(): void,\n\n documentId: string,\n driver: ITestDriver;\n}\n\nexport enum DataObjectFactoryType {\n Primed, // default\n Test,\n}\n\nexport interface ITestContainerConfig {\n // TestFluidDataObject instead of PrimedDataStore\n fluidDataObjectType?: DataObjectFactoryType,\n\n // And array of channel name and DDS factory pair to create on container creation time\n registry?: ChannelFactoryRegistry,\n\n // Container runtime options for the container instance\n runtimeOptions?: IContainerRuntimeOptions,\n}\n\n// new interface to help inject custom loggers to tests\nexport interface ITestLoaderOptions extends ILoaderOptions {\n logger?: ITelemetryBaseLogger;\n}\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n */\nexport class TestObjectProvider {\n private readonly _loaderContainerTracker = new LoaderContainerTracker();\n private _documentServiceFactory: IDocumentServiceFactory | undefined;\n private _urlResolver: IUrlResolver | undefined;\n private _documentId?: string;\n private _logger: ITelemetryBaseLogger | undefined;\n\n /**\n * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optiona; set of channel name\n * and factory for TestFluidObject\n */\n constructor(\n public readonly LoaderConstructor: typeof Loader,\n public readonly driver: ITestDriver,\n private readonly createFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint,\n ) {\n\n }\n\n get logger() {\n if (this._logger === undefined) {\n this._logger = ChildLogger.create(getTestLogger?.(), undefined,\n {\n all: {\n driverType: this.driver.type,\n driverEndpointName: this.driver.endpointName,\n },\n });\n }\n return this._logger;\n }\n\n get documentServiceFactory() {\n if (!this._documentServiceFactory) {\n this._documentServiceFactory = this.driver.createDocumentServiceFactory();\n }\n return this._documentServiceFactory;\n }\n\n get urlResolver() {\n if (!this._urlResolver) {\n this._urlResolver = this.driver.createUrlResolver();\n }\n return this._urlResolver;\n }\n\n get documentId() {\n if (this._documentId === undefined) {\n this._documentId = createDocumentId();\n }\n return this._documentId;\n }\n\n get defaultCodeDetails() {\n return defaultCodeDetails;\n }\n\n get opProcessingController(): IOpProcessingController {\n return this._loaderContainerTracker;\n }\n\n /**\n * Create a loader. Container created/loaded thru this loader will not be automatically added\n * to the OpProcessingController, and will need to be added manually if needed.\n *\n * Only the version of the loader will vary based on compat config. The version of\n * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n *\n * @param packageEntries - list of code details and fluidEntryPoint pairs.\n */\n public createLoader(\n packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n options?: ITestLoaderOptions,\n detachedBlobStorage?: IDetachedBlobStorage,\n ) {\n const multiSinkLogger = new MultiSinkLogger();\n multiSinkLogger.addLogger(this.logger);\n if (options?.logger !== undefined) {\n multiSinkLogger.addLogger(options.logger);\n }\n\n const codeLoader = new LocalCodeLoader(packageEntries);\n const loader = new this.LoaderConstructor({\n urlResolver: this.urlResolver,\n documentServiceFactory: this.documentServiceFactory,\n codeLoader,\n logger: multiSinkLogger,\n options,\n detachedBlobStorage,\n });\n this._loaderContainerTracker.add(loader);\n return loader;\n }\n\n /**\n * Create a container using a default document id and code details.\n * Container created is automatically added to the OpProcessingController to manage op flow\n *\n * Only the version of the loader will vary based on compat config. The version of\n * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n *\n * @param packageEntries - list of code details and fluidEntryPoint pairs.\n */\n public async createContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions) {\n const loader = this.createLoader([[defaultCodeDetails, entryPoint]], options);\n const container = await createAndAttachContainer(\n defaultCodeDetails,\n loader,\n this.driver.createCreateNewRequest(this.documentId),\n );\n return container;\n }\n\n public async loadContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions,\n requestHeader?: IRequestHeader) {\n const loader = this.createLoader([[defaultCodeDetails, entryPoint]], options);\n return loader.resolve({ url: await this.driver.createContainerUrl(this.documentId), headers: requestHeader });\n }\n\n /**\n * Make a test loader. Container created/loaded thru this loader will not be automatically added\n * to the OpProcessingController, and will need to be added manually if needed.\n * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n * @param testContainerConfig - optional configuring the test Container\n */\n public makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage) {\n return this.createLoader(\n [[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n undefined,\n detachedBlobStorage,\n );\n }\n\n /**\n * Make a container using a default document id and code details\n * Container loaded is automatically added to the OpProcessingController to manage op flow\n * @param testContainerConfig - optional configuring the test Container\n */\n public async makeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer> {\n const loader = this.makeTestLoader(testContainerConfig);\n const container =\n await createAndAttachContainer(\n defaultCodeDetails,\n loader,\n this.driver.createCreateNewRequest(this.documentId));\n return container;\n }\n\n /**\n * Load a container using a default document id and code details.\n * Container loaded is automatically added to the OpProcessingController to manage op flow\n * @param testContainerConfig - optional configuring the test Container\n */\n public async loadTestContainer(testContainerConfig?: ITestContainerConfig): Promise<Container> {\n const loader = this.makeTestLoader(testContainerConfig);\n const container = await loader.resolve({ url: await this.driver.createContainerUrl(this.documentId) });\n await waitContainerToCatchUp(container);\n return container;\n }\n\n public reset() {\n this._loaderContainerTracker.reset();\n this._documentServiceFactory = undefined;\n this._urlResolver = undefined;\n this._documentId = undefined;\n this._logger = undefined;\n }\n\n public async ensureSynchronized() {\n return this._loaderContainerTracker.ensureSynchronized();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { IContainer, IHostLoader, ILoaderOptions } from \"@fluidframework/container-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { Container, IDetachedBlobStorage, Loader, waitContainerToCatchUp } from \"@fluidframework/container-loader\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime\";\nimport { IFluidCodeDetails, IRequestHeader } from \"@fluidframework/core-interfaces\";\nimport { IDocumentServiceFactory, IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { ensureFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport { ITestDriver, TestDriverTypes } from \"@fluidframework/test-driver-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChildLogger, MultiSinkLogger } from \"@fluidframework/telemetry-utils\";\nimport { LoaderContainerTracker } from \"./loaderContainerTracker\";\nimport { fluidEntryPoint, LocalCodeLoader } from \"./localCodeLoader\";\nimport { createAndAttachContainer } from \"./localLoader\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n package: \"defaultTestPackage\",\n config: {},\n};\n\nexport interface IOpProcessingController {\n processIncoming(...containers: IContainer[]): Promise<void>;\n processOutgoing(...containers: IContainer[]): Promise<void>;\n pauseProcessing(...containers: IContainer[]): Promise<void>;\n resumeProcessing(...containers: IContainer[]): void;\n}\n\nexport interface ITestObjectProvider {\n createLoader(\n packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n options?: ITestLoaderOptions,\n detachedBlobStorage?: IDetachedBlobStorage,\n ): IHostLoader;\n createContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions): Promise<IContainer>;\n loadContainer(\n entryPoint: fluidEntryPoint,\n options?: ITestLoaderOptions,\n requestHeader?: IRequestHeader,\n ): Promise<IContainer>;\n\n /**\n * Used to create a test Container. The Loader/ContainerRuntime/DataRuntime might be different versioned.\n * In generateLocalCompatTest(), this Container and its runtime will be arbitrarily-versioned.\n */\n makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage): IHostLoader,\n makeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,\n loadTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,\n /**\n *\n * @param url - Resolved container URL\n */\n updateDocumentId(url: IResolvedUrl | undefined): void,\n\n logger: ITelemetryBaseLogger,\n documentServiceFactory: IDocumentServiceFactory,\n urlResolver: IUrlResolver,\n defaultCodeDetails: IFluidCodeDetails,\n opProcessingController: IOpProcessingController,\n\n ensureSynchronized(): Promise<void>;\n reset(): void,\n\n documentId: string,\n driver: ITestDriver;\n}\n\nexport enum DataObjectFactoryType {\n Primed, // default\n Test,\n}\n\nexport interface ITestContainerConfig {\n /** TestFluidDataObject instead of PrimedDataStore */\n fluidDataObjectType?: DataObjectFactoryType,\n\n /** An array of channel name and DDS factory pair to create on container creation time */\n registry?: ChannelFactoryRegistry,\n\n /** Container runtime options for the container instance */\n runtimeOptions?: IContainerRuntimeOptions,\n\n /** Loader options for the loader used to create containers */\n loaderOptions?: ITestLoaderOptions,\n}\n\n// new interface to help inject custom loggers to tests\nexport interface ITestLoaderOptions extends ILoaderOptions {\n logger?: ITelemetryBaseLogger;\n}\n\nexport const createDocumentId = (): string => uuid();\n\ninterface IDocumentIdStrategy {\n get(): string;\n update(resolvedUrl?: IResolvedUrl): void;\n reset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n let documentId = createDocumentId();\n switch (type) {\n case \"odsp\":\n return {\n get: () => documentId,\n update: () => { }, // do not update the document ID in odsp test cases\n reset: () => documentId = createDocumentId(),\n };\n default:\n return {\n get: () => documentId,\n update: (resolvedUrl?: IResolvedUrl) => {\n // Extract the document ID from the resolved container's URL and reset the ID property\n ensureFluidResolvedUrl(resolvedUrl);\n documentId = resolvedUrl.id ?? documentId;\n },\n reset: () => documentId = createDocumentId(),\n };\n }\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n */\nexport class TestObjectProvider {\n private readonly _loaderContainerTracker = new LoaderContainerTracker();\n private _documentServiceFactory: IDocumentServiceFactory | undefined;\n private _urlResolver: IUrlResolver | undefined;\n private _logger: ITelemetryBaseLogger | undefined;\n private readonly _documentIdStrategy: IDocumentIdStrategy;\n\n /**\n * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n * and factory for TestFluidObject\n */\n constructor(\n public readonly LoaderConstructor: typeof Loader,\n public readonly driver: ITestDriver,\n private readonly createFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint,\n ) {\n this._documentIdStrategy = getDocumentIdStrategy(driver.type);\n }\n\n get logger() {\n if (this._logger === undefined) {\n this._logger = ChildLogger.create(getTestLogger?.(), undefined,\n {\n all: {\n driverType: this.driver.type,\n driverEndpointName: this.driver.endpointName,\n driverTenantName: this.driver.tenantName,\n driverUserIndex: this.driver.userIndex,\n },\n });\n }\n return this._logger;\n }\n\n get documentServiceFactory() {\n if (!this._documentServiceFactory) {\n this._documentServiceFactory = this.driver.createDocumentServiceFactory();\n }\n return this._documentServiceFactory;\n }\n\n get urlResolver() {\n if (!this._urlResolver) {\n this._urlResolver = this.driver.createUrlResolver();\n }\n return this._urlResolver;\n }\n\n get documentId() {\n return this._documentIdStrategy.get();\n }\n\n get defaultCodeDetails() {\n return defaultCodeDetails;\n }\n\n get opProcessingController(): IOpProcessingController {\n return this._loaderContainerTracker;\n }\n\n /**\n * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n *\n * Only the version of the loader will vary based on compat config. The version of\n * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n *\n * @param packageEntries - list of code details and fluidEntryPoint pairs.\n */\n public createLoader(\n packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n options?: ITestLoaderOptions,\n detachedBlobStorage?: IDetachedBlobStorage,\n ) {\n const multiSinkLogger = new MultiSinkLogger();\n multiSinkLogger.addLogger(this.logger);\n if (options?.logger !== undefined) {\n multiSinkLogger.addLogger(options.logger);\n }\n\n const codeLoader = new LocalCodeLoader(packageEntries);\n const loader = new this.LoaderConstructor({\n urlResolver: this.urlResolver,\n documentServiceFactory: this.documentServiceFactory,\n codeLoader,\n logger: multiSinkLogger,\n options,\n detachedBlobStorage,\n });\n this._loaderContainerTracker.add(loader);\n return loader;\n }\n\n /**\n * Create a container using a default document id and code details.\n * Container created is automatically added to the OpProcessingController to manage op flow\n *\n * Only the version of the loader will vary based on compat config. The version of\n * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n *\n * @param packageEntries - list of code details and fluidEntryPoint pairs.\n */\n public async createContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions) {\n const loader = this.createLoader([[defaultCodeDetails, entryPoint]], options);\n const container = await createAndAttachContainer(\n defaultCodeDetails,\n loader,\n this.driver.createCreateNewRequest(this.documentId),\n );\n // r11s driver will generate a new ID for the new container.\n // update the document ID with the actual ID of the attached container.\n this._documentIdStrategy.update(container.resolvedUrl);\n return container;\n }\n\n public async loadContainer(entryPoint: fluidEntryPoint, options?: ITestLoaderOptions,\n requestHeader?: IRequestHeader) {\n const loader = this.createLoader([[defaultCodeDetails, entryPoint]], options);\n return loader.resolve({ url: await this.driver.createContainerUrl(this.documentId), headers: requestHeader });\n }\n\n /**\n * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n * @param testContainerConfig - optional configuring the test Container\n */\n public makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage) {\n return this.createLoader(\n [[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n testContainerConfig?.loaderOptions,\n detachedBlobStorage,\n );\n }\n\n /**\n * Make a container using a default document id and code details\n * Container loaded is automatically added to the OpProcessingController to manage op flow\n * @param testContainerConfig - optional configuring the test Container\n */\n public async makeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer> {\n const loader = this.makeTestLoader(testContainerConfig);\n const container =\n await createAndAttachContainer(\n defaultCodeDetails,\n loader,\n this.driver.createCreateNewRequest(this.documentId));\n // r11s driver will generate a new ID for the new container.\n // update the document ID with the actual ID of the attached container.\n this._documentIdStrategy.update(container.resolvedUrl);\n return container;\n }\n\n /**\n * Load a container using a default document id and code details.\n * Container loaded is automatically added to the OpProcessingController to manage op flow\n * @param testContainerConfig - optional configuring the test Container\n */\n public async loadTestContainer(testContainerConfig?: ITestContainerConfig): Promise<Container> {\n const loader = this.makeTestLoader(testContainerConfig);\n const container = await loader.resolve({ url: await this.driver.createContainerUrl(this.documentId) });\n await waitContainerToCatchUp(container);\n return container;\n }\n\n public reset() {\n this._loaderContainerTracker.reset();\n this._documentServiceFactory = undefined;\n this._urlResolver = undefined;\n this._documentIdStrategy.reset();\n this._logger = undefined;\n }\n\n public async ensureSynchronized() {\n return this._loaderContainerTracker.ensureSynchronized();\n }\n\n updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n this._documentIdStrategy.update(resolvedUrl);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/test-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.50.0-41540",
|
|
4
4
|
"description": "Utilities for Fluid tests",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -49,26 +49,27 @@
|
|
|
49
49
|
"temp-directory": "nyc/.nyc_output"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@fluidframework/aqueduct": "
|
|
52
|
+
"@fluidframework/aqueduct": "0.50.0-41540",
|
|
53
53
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
54
|
-
"@fluidframework/container-definitions": "^0.
|
|
55
|
-
"@fluidframework/container-loader": "
|
|
56
|
-
"@fluidframework/container-runtime": "
|
|
57
|
-
"@fluidframework/container-runtime-definitions": "
|
|
58
|
-
"@fluidframework/core-interfaces": "^0.
|
|
59
|
-
"@fluidframework/datastore": "
|
|
60
|
-
"@fluidframework/datastore-definitions": "
|
|
61
|
-
"@fluidframework/driver-definitions": "^0.
|
|
62
|
-
"@fluidframework/
|
|
63
|
-
"@fluidframework/
|
|
54
|
+
"@fluidframework/container-definitions": "^0.41.0-0",
|
|
55
|
+
"@fluidframework/container-loader": "0.50.0-41540",
|
|
56
|
+
"@fluidframework/container-runtime": "0.50.0-41540",
|
|
57
|
+
"@fluidframework/container-runtime-definitions": "0.50.0-41540",
|
|
58
|
+
"@fluidframework/core-interfaces": "^0.40.0-0",
|
|
59
|
+
"@fluidframework/datastore": "0.50.0-41540",
|
|
60
|
+
"@fluidframework/datastore-definitions": "0.50.0-41540",
|
|
61
|
+
"@fluidframework/driver-definitions": "^0.41.0-0",
|
|
62
|
+
"@fluidframework/driver-utils": "0.50.0-41540",
|
|
63
|
+
"@fluidframework/local-driver": "0.50.0-41540",
|
|
64
|
+
"@fluidframework/map": "0.50.0-41540",
|
|
64
65
|
"@fluidframework/protocol-definitions": "^0.1025.0",
|
|
65
|
-
"@fluidframework/request-handler": "
|
|
66
|
-
"@fluidframework/routerlicious-driver": "
|
|
67
|
-
"@fluidframework/runtime-definitions": "
|
|
68
|
-
"@fluidframework/runtime-utils": "
|
|
69
|
-
"@fluidframework/telemetry-utils": "
|
|
70
|
-
"@fluidframework/test-driver-definitions": "
|
|
71
|
-
"@fluidframework/test-runtime-utils": "
|
|
66
|
+
"@fluidframework/request-handler": "0.50.0-41540",
|
|
67
|
+
"@fluidframework/routerlicious-driver": "0.50.0-41540",
|
|
68
|
+
"@fluidframework/runtime-definitions": "0.50.0-41540",
|
|
69
|
+
"@fluidframework/runtime-utils": "0.50.0-41540",
|
|
70
|
+
"@fluidframework/telemetry-utils": "0.50.0-41540",
|
|
71
|
+
"@fluidframework/test-driver-definitions": "0.50.0-41540",
|
|
72
|
+
"@fluidframework/test-runtime-utils": "0.50.0-41540",
|
|
72
73
|
"debug": "^4.1.1",
|
|
73
74
|
"uuid": "^8.3.1"
|
|
74
75
|
},
|
package/src/index.ts
CHANGED
|
@@ -8,7 +8,6 @@ export * from "./testObjectProvider";
|
|
|
8
8
|
export * from "./loaderContainerTracker";
|
|
9
9
|
export * from "./localLoader";
|
|
10
10
|
export * from "./localCodeLoader";
|
|
11
|
-
export * from "./opProcessingController";
|
|
12
11
|
export * from "./testContainerRuntimeFactory";
|
|
13
12
|
export * from "./testFluidObject";
|
|
14
13
|
export * from "./timeoutUtils";
|
|
@@ -91,31 +91,35 @@ export class LoaderContainerTracker implements IOpProcessingController {
|
|
|
91
91
|
for (const msg of messages) {
|
|
92
92
|
if (msg.type === MessageType.NoOp) {
|
|
93
93
|
// Track the NoOp that was sent.
|
|
94
|
-
if (record.
|
|
94
|
+
if (record.trailingNoOps === 0) {
|
|
95
|
+
// record the starting sequence number of the trailing no ops if we haven't been tracking yet.
|
|
95
96
|
record.startTrailingNoOps = msg.clientSequenceNumber;
|
|
96
97
|
}
|
|
97
98
|
record.trailingNoOps++;
|
|
98
99
|
} else {
|
|
99
100
|
// Other ops has been sent. We would like to see those ack'ed, so no more need to track NoOps
|
|
100
|
-
record.startTrailingNoOps = 0;
|
|
101
101
|
record.trailingNoOps = 0;
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
container.deltaManager.inbound.on("push", (message) => {
|
|
107
|
-
// Received the no op back, update the record
|
|
107
|
+
// Received the no op back, update the record if we are tracking
|
|
108
108
|
if (message.type === MessageType.NoOp
|
|
109
109
|
&& message.clientId === (container as Container).clientId
|
|
110
|
-
&&
|
|
111
|
-
record.
|
|
112
|
-
|
|
110
|
+
&& record.trailingNoOps !== 0
|
|
111
|
+
&& record.startTrailingNoOps <= message.clientSequenceNumber
|
|
112
|
+
) {
|
|
113
|
+
// NoOp might have coalesced and skipped ahead some sequence number
|
|
114
|
+
// update the record and skip ahead as well
|
|
115
|
+
const oldStartTrailingNoOps = record.startTrailingNoOps;
|
|
116
|
+
record.startTrailingNoOps = message.clientSequenceNumber + 1;
|
|
117
|
+
record.trailingNoOps -= (record.startTrailingNoOps - oldStartTrailingNoOps);
|
|
113
118
|
}
|
|
114
119
|
});
|
|
115
120
|
|
|
116
121
|
container.on("disconnected", () => {
|
|
117
122
|
// reset on disconnect.
|
|
118
|
-
record.startTrailingNoOps = 0;
|
|
119
123
|
record.trailingNoOps = 0;
|
|
120
124
|
});
|
|
121
125
|
}
|
package/src/packageVersion.ts
CHANGED
|
@@ -8,8 +8,9 @@ import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
|
8
8
|
import { Container, IDetachedBlobStorage, Loader, waitContainerToCatchUp } from "@fluidframework/container-loader";
|
|
9
9
|
import { IContainerRuntimeOptions } from "@fluidframework/container-runtime";
|
|
10
10
|
import { IFluidCodeDetails, IRequestHeader } from "@fluidframework/core-interfaces";
|
|
11
|
-
import { IDocumentServiceFactory, IUrlResolver } from "@fluidframework/driver-definitions";
|
|
12
|
-
import {
|
|
11
|
+
import { IDocumentServiceFactory, IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
|
|
12
|
+
import { ensureFluidResolvedUrl } from "@fluidframework/driver-utils";
|
|
13
|
+
import { ITestDriver, TestDriverTypes } from "@fluidframework/test-driver-definitions";
|
|
13
14
|
import { v4 as uuid } from "uuid";
|
|
14
15
|
import { ChildLogger, MultiSinkLogger } from "@fluidframework/telemetry-utils";
|
|
15
16
|
import { LoaderContainerTracker } from "./loaderContainerTracker";
|
|
@@ -49,6 +50,11 @@ export interface ITestObjectProvider {
|
|
|
49
50
|
makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage): IHostLoader,
|
|
50
51
|
makeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,
|
|
51
52
|
loadTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>,
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
* @param url - Resolved container URL
|
|
56
|
+
*/
|
|
57
|
+
updateDocumentId(url: IResolvedUrl | undefined): void,
|
|
52
58
|
|
|
53
59
|
logger: ITelemetryBaseLogger,
|
|
54
60
|
documentServiceFactory: IDocumentServiceFactory,
|
|
@@ -69,22 +75,58 @@ export enum DataObjectFactoryType {
|
|
|
69
75
|
}
|
|
70
76
|
|
|
71
77
|
export interface ITestContainerConfig {
|
|
72
|
-
|
|
78
|
+
/** TestFluidDataObject instead of PrimedDataStore */
|
|
73
79
|
fluidDataObjectType?: DataObjectFactoryType,
|
|
74
80
|
|
|
75
|
-
|
|
81
|
+
/** An array of channel name and DDS factory pair to create on container creation time */
|
|
76
82
|
registry?: ChannelFactoryRegistry,
|
|
77
83
|
|
|
78
|
-
|
|
84
|
+
/** Container runtime options for the container instance */
|
|
79
85
|
runtimeOptions?: IContainerRuntimeOptions,
|
|
86
|
+
|
|
87
|
+
/** Loader options for the loader used to create containers */
|
|
88
|
+
loaderOptions?: ITestLoaderOptions,
|
|
80
89
|
}
|
|
81
90
|
|
|
82
91
|
// new interface to help inject custom loggers to tests
|
|
83
92
|
export interface ITestLoaderOptions extends ILoaderOptions {
|
|
84
93
|
logger?: ITelemetryBaseLogger;
|
|
85
94
|
}
|
|
95
|
+
|
|
86
96
|
export const createDocumentId = (): string => uuid();
|
|
87
97
|
|
|
98
|
+
interface IDocumentIdStrategy {
|
|
99
|
+
get(): string;
|
|
100
|
+
update(resolvedUrl?: IResolvedUrl): void;
|
|
101
|
+
reset(): void;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Document ID is treated differently by test drivers. The key difference is in generating
|
|
106
|
+
* a new container ID and accessing the container in multi-instance test cases.
|
|
107
|
+
*/
|
|
108
|
+
function getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {
|
|
109
|
+
let documentId = createDocumentId();
|
|
110
|
+
switch (type) {
|
|
111
|
+
case "odsp":
|
|
112
|
+
return {
|
|
113
|
+
get: () => documentId,
|
|
114
|
+
update: () => { }, // do not update the document ID in odsp test cases
|
|
115
|
+
reset: () => documentId = createDocumentId(),
|
|
116
|
+
};
|
|
117
|
+
default:
|
|
118
|
+
return {
|
|
119
|
+
get: () => documentId,
|
|
120
|
+
update: (resolvedUrl?: IResolvedUrl) => {
|
|
121
|
+
// Extract the document ID from the resolved container's URL and reset the ID property
|
|
122
|
+
ensureFluidResolvedUrl(resolvedUrl);
|
|
123
|
+
documentId = resolvedUrl.id ?? documentId;
|
|
124
|
+
},
|
|
125
|
+
reset: () => documentId = createDocumentId(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
88
130
|
/**
|
|
89
131
|
* Shared base class for test object provider. Contain code for loader and container creation and loading
|
|
90
132
|
*/
|
|
@@ -92,12 +134,12 @@ export class TestObjectProvider {
|
|
|
92
134
|
private readonly _loaderContainerTracker = new LoaderContainerTracker();
|
|
93
135
|
private _documentServiceFactory: IDocumentServiceFactory | undefined;
|
|
94
136
|
private _urlResolver: IUrlResolver | undefined;
|
|
95
|
-
private _documentId?: string;
|
|
96
137
|
private _logger: ITelemetryBaseLogger | undefined;
|
|
138
|
+
private readonly _documentIdStrategy: IDocumentIdStrategy;
|
|
97
139
|
|
|
98
140
|
/**
|
|
99
141
|
* Manage objects for loading and creating container, including the driver, loader, and OpProcessingController
|
|
100
|
-
* @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an
|
|
142
|
+
* @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name
|
|
101
143
|
* and factory for TestFluidObject
|
|
102
144
|
*/
|
|
103
145
|
constructor(
|
|
@@ -105,7 +147,7 @@ export class TestObjectProvider {
|
|
|
105
147
|
public readonly driver: ITestDriver,
|
|
106
148
|
private readonly createFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint,
|
|
107
149
|
) {
|
|
108
|
-
|
|
150
|
+
this._documentIdStrategy = getDocumentIdStrategy(driver.type);
|
|
109
151
|
}
|
|
110
152
|
|
|
111
153
|
get logger() {
|
|
@@ -115,6 +157,8 @@ export class TestObjectProvider {
|
|
|
115
157
|
all: {
|
|
116
158
|
driverType: this.driver.type,
|
|
117
159
|
driverEndpointName: this.driver.endpointName,
|
|
160
|
+
driverTenantName: this.driver.tenantName,
|
|
161
|
+
driverUserIndex: this.driver.userIndex,
|
|
118
162
|
},
|
|
119
163
|
});
|
|
120
164
|
}
|
|
@@ -136,10 +180,7 @@ export class TestObjectProvider {
|
|
|
136
180
|
}
|
|
137
181
|
|
|
138
182
|
get documentId() {
|
|
139
|
-
|
|
140
|
-
this._documentId = createDocumentId();
|
|
141
|
-
}
|
|
142
|
-
return this._documentId;
|
|
183
|
+
return this._documentIdStrategy.get();
|
|
143
184
|
}
|
|
144
185
|
|
|
145
186
|
get defaultCodeDetails() {
|
|
@@ -151,8 +192,7 @@ export class TestObjectProvider {
|
|
|
151
192
|
}
|
|
152
193
|
|
|
153
194
|
/**
|
|
154
|
-
* Create a loader.
|
|
155
|
-
* to the OpProcessingController, and will need to be added manually if needed.
|
|
195
|
+
* Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.
|
|
156
196
|
*
|
|
157
197
|
* Only the version of the loader will vary based on compat config. The version of
|
|
158
198
|
* containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.
|
|
@@ -199,6 +239,9 @@ export class TestObjectProvider {
|
|
|
199
239
|
loader,
|
|
200
240
|
this.driver.createCreateNewRequest(this.documentId),
|
|
201
241
|
);
|
|
242
|
+
// r11s driver will generate a new ID for the new container.
|
|
243
|
+
// update the document ID with the actual ID of the attached container.
|
|
244
|
+
this._documentIdStrategy.update(container.resolvedUrl);
|
|
202
245
|
return container;
|
|
203
246
|
}
|
|
204
247
|
|
|
@@ -209,15 +252,14 @@ export class TestObjectProvider {
|
|
|
209
252
|
}
|
|
210
253
|
|
|
211
254
|
/**
|
|
212
|
-
* Make a test loader.
|
|
213
|
-
* to the OpProcessingController, and will need to be added manually if needed.
|
|
255
|
+
* Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.
|
|
214
256
|
* The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run
|
|
215
257
|
* @param testContainerConfig - optional configuring the test Container
|
|
216
258
|
*/
|
|
217
259
|
public makeTestLoader(testContainerConfig?: ITestContainerConfig, detachedBlobStorage?: IDetachedBlobStorage) {
|
|
218
260
|
return this.createLoader(
|
|
219
261
|
[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],
|
|
220
|
-
|
|
262
|
+
testContainerConfig?.loaderOptions,
|
|
221
263
|
detachedBlobStorage,
|
|
222
264
|
);
|
|
223
265
|
}
|
|
@@ -234,6 +276,9 @@ export class TestObjectProvider {
|
|
|
234
276
|
defaultCodeDetails,
|
|
235
277
|
loader,
|
|
236
278
|
this.driver.createCreateNewRequest(this.documentId));
|
|
279
|
+
// r11s driver will generate a new ID for the new container.
|
|
280
|
+
// update the document ID with the actual ID of the attached container.
|
|
281
|
+
this._documentIdStrategy.update(container.resolvedUrl);
|
|
237
282
|
return container;
|
|
238
283
|
}
|
|
239
284
|
|
|
@@ -253,11 +298,15 @@ export class TestObjectProvider {
|
|
|
253
298
|
this._loaderContainerTracker.reset();
|
|
254
299
|
this._documentServiceFactory = undefined;
|
|
255
300
|
this._urlResolver = undefined;
|
|
256
|
-
this.
|
|
301
|
+
this._documentIdStrategy.reset();
|
|
257
302
|
this._logger = undefined;
|
|
258
303
|
}
|
|
259
304
|
|
|
260
305
|
public async ensureSynchronized() {
|
|
261
306
|
return this._loaderContainerTracker.ensureSynchronized();
|
|
262
307
|
}
|
|
308
|
+
|
|
309
|
+
updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {
|
|
310
|
+
this._documentIdStrategy.update(resolvedUrl);
|
|
311
|
+
}
|
|
263
312
|
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
6
|
-
import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
7
|
-
export declare type DeltaManager = IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
|
|
8
|
-
/**
|
|
9
|
-
* @deprecated OpProcessingController has been improved to not need server information and work against other servers.
|
|
10
|
-
* So this is no longer necessary, and allows this and test to be run against different endpoints.
|
|
11
|
-
*/
|
|
12
|
-
export interface IDeltaConnectionServerMonitor {
|
|
13
|
-
hasPendingWork(): Promise<boolean>;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Class with access to the local delta connection server and delta managers that can control op processing.
|
|
17
|
-
*
|
|
18
|
-
* @deprecated Can be removed \>=0.38. Replaced with LoaderContainerTracker
|
|
19
|
-
*/
|
|
20
|
-
export declare class OpProcessingController {
|
|
21
|
-
private readonly deltaConnectionServerMonitor?;
|
|
22
|
-
/**
|
|
23
|
-
* Yields control in the JavaScript event loop.
|
|
24
|
-
*/
|
|
25
|
-
static yield(): Promise<void>;
|
|
26
|
-
private readonly deltaManagerMonitors;
|
|
27
|
-
private isNormalProcessingPaused;
|
|
28
|
-
get isProcessingControlled(): boolean;
|
|
29
|
-
/**
|
|
30
|
-
* @param deltaConnectionServerMonitor - delta connection server monitor to tell whether we have
|
|
31
|
-
* pending work
|
|
32
|
-
*/
|
|
33
|
-
constructor(deltaConnectionServerMonitor?: IDeltaConnectionServerMonitor | undefined);
|
|
34
|
-
/**
|
|
35
|
-
* Add a collection of delta managers by adding them to the local collection.
|
|
36
|
-
* @param deltaManagers - Array of deltaManagers to add
|
|
37
|
-
*/
|
|
38
|
-
addDeltaManagers(...deltaManagers: DeltaManager[]): void;
|
|
39
|
-
/**
|
|
40
|
-
* Processes incoming and outgoing op) of the given delta managers.
|
|
41
|
-
* It validates the delta managers and resumes its inbound and outbound queues. It then keeps yielding
|
|
42
|
-
* the JS event loop until all the ops have been processed by the server and by the delta managers.
|
|
43
|
-
*
|
|
44
|
-
* @param deltaMangers - Array of delta managers whose ops to process. If no delta manager is provided, it
|
|
45
|
-
* processes the ops for all the delta managers in our collection.
|
|
46
|
-
*/
|
|
47
|
-
process(...deltaMangers: DeltaManager[]): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Processes incoming ops of the given delta managers.
|
|
50
|
-
* It validates the delta managers and resumes its inbound queue. It then keeps yielding the JS event loop until
|
|
51
|
-
* all the ops have been processed by the server and by the delta managers.
|
|
52
|
-
*
|
|
53
|
-
* @param deltaMangers - Array of delta managers whose incoming ops to process. If no delta manager is provided, it
|
|
54
|
-
* processes the ops for all the delta managers in our collection.
|
|
55
|
-
*/
|
|
56
|
-
processIncoming(...deltaMangers: DeltaManager[]): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Processes outgoing ops of the given delta managers.
|
|
59
|
-
* It validates the delta managers and resumes its outbound queue. It then keeps yielding the JS event loop until
|
|
60
|
-
* all the ops have been processed by the server and by the delta managers.
|
|
61
|
-
*
|
|
62
|
-
* @param deltaMangers - Array of delta managers whose outgoing ops to process. If no delta manager is provided, it
|
|
63
|
-
* processes the ops for all the delta managers in our collection.
|
|
64
|
-
*/
|
|
65
|
-
processOutgoing(...deltaMangers: DeltaManager[]): Promise<void>;
|
|
66
|
-
/**
|
|
67
|
-
* Pauses the delta processing for controlled testing by pausing the inbound and outbound queues of the delta
|
|
68
|
-
* managers.
|
|
69
|
-
*
|
|
70
|
-
* @param deltaMangers - Array of delta managers whose processing to pause. If no delta manager is provided, it
|
|
71
|
-
* pauses the processing of all the delta managers in our collection.
|
|
72
|
-
*/
|
|
73
|
-
pauseProcessing(...deltaMangers: DeltaManager[]): Promise<void>;
|
|
74
|
-
/**
|
|
75
|
-
* Resumes the delta processing after a pauseProcessing calls by resuming the inbound and outbound queues of
|
|
76
|
-
* the delta managers.
|
|
77
|
-
*
|
|
78
|
-
* @param deltaMangers - Array of delta managers whose processing to resume. If no delta manager is provided, it
|
|
79
|
-
* resumes the processing of all the delta managers in our collection.
|
|
80
|
-
*/
|
|
81
|
-
resumeProcessing(...deltaMangers: DeltaManager[]): void;
|
|
82
|
-
/**
|
|
83
|
-
* Map a list of DeltaManager to its monitor. Throw an error if the delta manager is not in our collection
|
|
84
|
-
* @param deltaMangers - The delta managers to get the monitors for
|
|
85
|
-
*/
|
|
86
|
-
private mapDeltaManagerMonitor;
|
|
87
|
-
/**
|
|
88
|
-
* It keeps yielding the JS event loop until all the ops have been processed by the server and by the passed
|
|
89
|
-
* delta managers.
|
|
90
|
-
* @param monitors - The delta managers should ops have to be processed.
|
|
91
|
-
* @param hasWork - Function that tells if the delta manager has pending work or not.
|
|
92
|
-
*/
|
|
93
|
-
private yieldWhileDeltaManagersHaveWork;
|
|
94
|
-
/**
|
|
95
|
-
* Pauses the inbound and outbound queues of all the delta managers given
|
|
96
|
-
* @param monitors - The delta managers should ops have to be processed.
|
|
97
|
-
*/
|
|
98
|
-
private pauseDeltaManagerQueues;
|
|
99
|
-
/**
|
|
100
|
-
* Pauses the inbound and outbound queues of all the delta managers in our collection.
|
|
101
|
-
*/
|
|
102
|
-
private pauseAllDeltaManagerQueues;
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=opProcessingController.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opProcessingController.d.ts","sourceRoot":"","sources":["../src/opProcessingController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EACH,gBAAgB,EAChB,yBAAyB,EAG5B,MAAM,sCAAsC,CAAC;AAI9C,oBAAY,YAAY,GAAG,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;AAqOtF;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC1C,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAyBZ,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAxBjE;;OAEG;WACiB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgD;IAErF,OAAO,CAAC,wBAAwB,CAAS;IAKzC,IAAW,sBAAsB,IAAI,OAAO,CAE3C;IAED;;;OAGG;gBACiC,4BAA4B,CAAC,2CAA+B;IAEhG;;;OAGG;IACI,gBAAgB,CAAC,GAAG,aAAa,EAAE,YAAY,EAAE;IA6BxD;;;;;;;QAOI;IACS,OAAO,CAAC,GAAG,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpE;;;;;;;OAOG;IACU,eAAe,CAAC,GAAG,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5E;;;;;;;OAOG;IACU,eAAe,CAAC,GAAG,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5E;;;;;;OAMG;IACU,eAAe,CAAC,GAAG,YAAY,EAAE,YAAY,EAAE;IAS5D;;;;;;OAMG;IACI,gBAAgB,CAAC,GAAG,YAAY,EAAE,YAAY,EAAE;IASvD;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;;;OAKG;YACW,+BAA+B;IAwC7C;;;OAGG;YACW,uBAAuB;IAQrC;;OAEG;YACW,0BAA0B;CAG3C"}
|