@fluidframework/test-utils 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +4 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +34 -0
- package/README.md +1 -1
- package/api-extractor-cjs.json +8 -0
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/test-utils.api.md +27 -9
- package/dist/DriverWrappers.d.ts +3 -0
- package/dist/DriverWrappers.d.ts.map +1 -1
- package/dist/DriverWrappers.js +3 -0
- package/dist/DriverWrappers.js.map +1 -1
- package/dist/TestConfigs.d.ts +14 -1
- package/dist/TestConfigs.d.ts.map +1 -1
- package/dist/TestConfigs.js +14 -3
- package/dist/TestConfigs.js.map +1 -1
- package/dist/TestSummaryUtils.d.ts +7 -2
- package/dist/TestSummaryUtils.d.ts.map +1 -1
- package/dist/TestSummaryUtils.js +39 -14
- package/dist/TestSummaryUtils.js.map +1 -1
- package/dist/containerUtils.d.ts +1 -1
- package/dist/containerUtils.d.ts.map +1 -1
- package/dist/containerUtils.js +2 -2
- package/dist/containerUtils.js.map +1 -1
- package/dist/debug.js +2 -2
- package/dist/debug.js.map +1 -1
- package/dist/index.d.ts +14 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -43
- package/dist/index.js.map +1 -1
- package/dist/loaderContainerTracker.d.ts +1 -1
- package/dist/loaderContainerTracker.d.ts.map +1 -1
- package/dist/loaderContainerTracker.js +11 -11
- package/dist/loaderContainerTracker.js.map +1 -1
- package/dist/localLoader.d.ts +1 -1
- package/dist/localLoader.d.ts.map +1 -1
- package/dist/localLoader.js +2 -2
- package/dist/localLoader.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/test-utils-alpha.d.ts +7 -3
- package/dist/test-utils-beta.d.ts +9 -3
- package/dist/test-utils-public.d.ts +9 -3
- package/dist/test-utils-untrimmed.d.ts +59 -14
- package/dist/testContainerRuntimeFactory.d.ts.map +1 -1
- package/dist/testContainerRuntimeFactory.js +9 -2
- package/dist/testContainerRuntimeFactory.js.map +1 -1
- package/dist/testFluidObject.d.ts +1 -1
- package/dist/testFluidObject.d.ts.map +1 -1
- package/dist/testFluidObject.js.map +1 -1
- package/dist/testObjectProvider.d.ts +34 -11
- package/dist/testObjectProvider.d.ts.map +1 -1
- package/dist/testObjectProvider.js +71 -38
- package/dist/testObjectProvider.js.map +1 -1
- package/dist/timeoutUtils.d.ts.map +1 -1
- package/dist/timeoutUtils.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/DriverWrappers.d.ts +35 -0
- package/lib/DriverWrappers.d.ts.map +1 -0
- package/lib/DriverWrappers.js +54 -0
- package/lib/DriverWrappers.js.map +1 -0
- package/lib/TestConfigs.d.ts +23 -0
- package/lib/TestConfigs.d.ts.map +1 -0
- package/lib/TestConfigs.js +24 -0
- package/lib/TestConfigs.js.map +1 -0
- package/lib/TestSummaryUtils.d.ts +66 -0
- package/lib/TestSummaryUtils.d.ts.map +1 -0
- package/lib/TestSummaryUtils.js +153 -0
- package/lib/TestSummaryUtils.js.map +1 -0
- package/lib/containerUtils.d.ts +46 -0
- package/lib/containerUtils.d.ts.map +1 -0
- package/lib/containerUtils.js +79 -0
- package/lib/containerUtils.js.map +1 -0
- package/lib/debug.d.ts +7 -0
- package/lib/debug.d.ts.map +1 -0
- package/lib/debug.js +9 -0
- package/lib/debug.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces.d.ts +25 -0
- package/lib/interfaces.d.ts.map +1 -0
- package/lib/interfaces.js +6 -0
- package/lib/interfaces.js.map +1 -0
- package/lib/loaderContainerTracker.d.ts +144 -0
- package/lib/loaderContainerTracker.d.ts.map +1 -0
- package/lib/loaderContainerTracker.js +631 -0
- package/lib/loaderContainerTracker.js.map +1 -0
- package/lib/localCodeLoader.d.ts +31 -0
- package/lib/localCodeLoader.d.ts.map +1 -0
- package/lib/localCodeLoader.js +73 -0
- package/lib/localCodeLoader.js.map +1 -0
- package/lib/localLoader.d.ts +26 -0
- package/lib/localLoader.d.ts.map +1 -0
- package/lib/localLoader.js +37 -0
- package/lib/localLoader.js.map +1 -0
- package/lib/packageVersion.d.ts +9 -0
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/packageVersion.js +9 -0
- package/lib/packageVersion.js.map +1 -0
- package/lib/retry.d.ts +18 -0
- package/lib/retry.d.ts.map +1 -0
- package/lib/retry.js +37 -0
- package/lib/retry.js.map +1 -0
- package/lib/test/timeoutUtils.spec.js +165 -0
- package/lib/test/timeoutUtils.spec.js.map +1 -0
- package/lib/test/types/validateTestUtilsPrevious.generated.js +90 -0
- package/lib/test/types/validateTestUtilsPrevious.generated.js.map +1 -0
- package/lib/test-utils-alpha.d.ts +309 -0
- package/lib/test-utils-beta.d.ts +208 -0
- package/lib/test-utils-public.d.ts +208 -0
- package/lib/test-utils-untrimmed.d.ts +1046 -0
- package/lib/testContainerRuntimeFactory.d.ts +46 -0
- package/lib/testContainerRuntimeFactory.d.ts.map +1 -0
- package/lib/testContainerRuntimeFactory.js +113 -0
- package/lib/testContainerRuntimeFactory.js.map +1 -0
- package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts +23 -0
- package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts.map +1 -0
- package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js +28 -0
- package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js.map +1 -0
- package/lib/testFluidObject.d.ts +92 -0
- package/lib/testFluidObject.d.ts.map +1 -0
- package/lib/testFluidObject.js +159 -0
- package/lib/testFluidObject.js.map +1 -0
- package/lib/testObjectProvider.d.ts +435 -0
- package/lib/testObjectProvider.d.ts.map +1 -0
- package/lib/testObjectProvider.js +636 -0
- package/lib/testObjectProvider.js.map +1 -0
- package/lib/timeoutUtils.d.ts +60 -0
- package/lib/timeoutUtils.d.ts.map +1 -0
- package/lib/timeoutUtils.js +164 -0
- package/lib/timeoutUtils.js.map +1 -0
- package/package.json +105 -38
- package/src/DriverWrappers.ts +3 -0
- package/src/TestConfigs.ts +25 -3
- package/src/TestSummaryUtils.ts +36 -12
- package/src/containerUtils.ts +1 -1
- package/src/debug.ts +1 -1
- package/src/index.ts +19 -14
- package/src/loaderContainerTracker.ts +5 -5
- package/src/localLoader.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/testContainerRuntimeFactory.ts +12 -2
- package/src/testFluidObject.ts +1 -1
- package/src/testObjectProvider.ts +99 -34
- package/src/timeoutUtils.ts +1 -0
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +3 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IContainerContext, IRuntime } from "@fluidframework/container-definitions";
|
|
6
|
+
import { ContainerRuntime, IContainerRuntimeOptions } from "@fluidframework/container-runtime";
|
|
7
|
+
import { IContainerRuntime } from "@fluidframework/container-runtime-definitions";
|
|
8
|
+
import { RuntimeRequestHandler } from "@fluidframework/request-handler";
|
|
9
|
+
import { IFluidDataStoreFactory } from "@fluidframework/runtime-definitions";
|
|
10
|
+
/**
|
|
11
|
+
* Create a container runtime factory class that allows you to set runtime options
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare const createTestContainerRuntimeFactory: (containerRuntimeCtor: typeof ContainerRuntime) => {
|
|
15
|
+
new (type: string, dataStoreFactory: IFluidDataStoreFactory, runtimeOptions?: IContainerRuntimeOptions, requestHandlers?: RuntimeRequestHandler[]): {
|
|
16
|
+
type: string;
|
|
17
|
+
dataStoreFactory: IFluidDataStoreFactory;
|
|
18
|
+
runtimeOptions: IContainerRuntimeOptions;
|
|
19
|
+
requestHandlers: RuntimeRequestHandler[];
|
|
20
|
+
instantiateFirstTime(runtime: ContainerRuntime): Promise<void>;
|
|
21
|
+
instantiateFromExisting(runtime: ContainerRuntime): Promise<void>;
|
|
22
|
+
preInitialize(context: IContainerContext, existing: boolean): Promise<IRuntime & IContainerRuntime>;
|
|
23
|
+
readonly IRuntimeFactory: any;
|
|
24
|
+
instantiateRuntime(context: IContainerContext, existing: boolean): Promise<IRuntime>;
|
|
25
|
+
hasInitialized(_runtime: IContainerRuntime): Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A container runtime factory that allows you to set runtime options
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export declare const TestContainerRuntimeFactory: {
|
|
33
|
+
new (type: string, dataStoreFactory: IFluidDataStoreFactory, runtimeOptions?: IContainerRuntimeOptions, requestHandlers?: RuntimeRequestHandler[]): {
|
|
34
|
+
type: string;
|
|
35
|
+
dataStoreFactory: IFluidDataStoreFactory;
|
|
36
|
+
runtimeOptions: IContainerRuntimeOptions;
|
|
37
|
+
requestHandlers: RuntimeRequestHandler[];
|
|
38
|
+
instantiateFirstTime(runtime: ContainerRuntime): Promise<void>;
|
|
39
|
+
instantiateFromExisting(runtime: ContainerRuntime): Promise<void>;
|
|
40
|
+
preInitialize(context: IContainerContext, existing: boolean): Promise<IRuntime & IContainerRuntime>;
|
|
41
|
+
readonly IRuntimeFactory: any;
|
|
42
|
+
instantiateRuntime(context: IContainerContext, existing: boolean): Promise<IRuntime>;
|
|
43
|
+
hasInitialized(_runtime: IContainerRuntime): Promise<void>;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=testContainerRuntimeFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContainerRuntimeFactory.d.ts","sourceRoot":"","sources":["../src/testContainerRuntimeFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EAExB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAQlF,OAAO,EAA8B,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EACN,sBAAsB,EAEtB,MAAM,qCAAqC,CAAC;AAmC7C;;;GAGG;AACH,eAAO,MAAM,iCAAiC,yBACvB,uBAAuB;eAI9B,MAAM,oBACM,sBAAsB,mBACxB,wBAAwB,oBAUvB,qBAAqB,EAAE;cAZlC,MAAM;0BACM,sBAAsB;wBACxB,wBAAwB;yBAUvB,qBAAqB,EAAE;sCAKL,gBAAgB,GAAG,QAAQ,IAAI,CAAC;yCAkB7B,gBAAgB,GAAG,QAAQ,IAAI,CAAC;+BAiBpE,iBAAiB,YAChB,OAAO,GACf,QAAQ,QAAQ,GAAG,iBAAiB,CAAC;;;;;CAwDzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B;eApHxB,MAAM,oBACM,sBAAsB,mBACxB,wBAAwB,oBAUvB,qBAAqB,EAAE;cAZlC,MAAM;0BACM,sBAAsB;wBACxB,wBAAwB;yBAUvB,qBAAqB,EAAE;sCAKL,gBAAgB,GAAG,QAAQ,IAAI,CAAC;yCAkB7B,gBAAgB,GAAG,QAAQ,IAAI,CAAC;+BAiBpE,iBAAiB,YAChB,OAAO,GACf,QAAQ,QAAQ,GAAG,iBAAiB,CAAC;;;;;CA8DoD,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { assert } from "@fluidframework/core-utils";
|
|
6
|
+
import { ContainerRuntime, DefaultSummaryConfiguration, } from "@fluidframework/container-runtime";
|
|
7
|
+
// eslint-disable-next-line import/no-deprecated
|
|
8
|
+
import { buildRuntimeRequestHandler } from "@fluidframework/request-handler";
|
|
9
|
+
import { RequestParser, RuntimeFactoryHelper } from "@fluidframework/runtime-utils";
|
|
10
|
+
const backCompat_DefaultRouteRequestHandler = (defaultRootId) => {
|
|
11
|
+
return async (request, runtime) => {
|
|
12
|
+
const parser = RequestParser.create(request);
|
|
13
|
+
if (parser.pathParts.length === 0) {
|
|
14
|
+
return runtime.IFluidHandleContext.resolveHandle({
|
|
15
|
+
url: `/${defaultRootId}${parser.query}`,
|
|
16
|
+
headers: request.headers,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return undefined; // continue search
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Create a container runtime factory class that allows you to set runtime options
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export const createTestContainerRuntimeFactory = (containerRuntimeCtor) => {
|
|
27
|
+
return class extends RuntimeFactoryHelper {
|
|
28
|
+
constructor(type, dataStoreFactory, runtimeOptions = {
|
|
29
|
+
summaryOptions: {
|
|
30
|
+
summaryConfigOverrides: {
|
|
31
|
+
...DefaultSummaryConfiguration,
|
|
32
|
+
...{
|
|
33
|
+
initialSummarizerDelayMs: 0,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
}, requestHandlers = []) {
|
|
38
|
+
super();
|
|
39
|
+
this.type = type;
|
|
40
|
+
this.dataStoreFactory = dataStoreFactory;
|
|
41
|
+
this.runtimeOptions = runtimeOptions;
|
|
42
|
+
this.requestHandlers = requestHandlers;
|
|
43
|
+
}
|
|
44
|
+
async instantiateFirstTime(runtime) {
|
|
45
|
+
// Back-compat - old code does not return IDataStore for rootContext.attachRuntime() call!
|
|
46
|
+
// Thus need to leverage old API createDetachedRootDataStore() that is gone in latest releases.
|
|
47
|
+
const rootContext = "createDetachedRootDataStore" in runtime
|
|
48
|
+
? runtime.createDetachedRootDataStore([this.type], "default")
|
|
49
|
+
: runtime.createDetachedDataStore([this.type], "default");
|
|
50
|
+
const rootRuntime = await this.dataStoreFactory.instantiateDataStore(rootContext,
|
|
51
|
+
/* existing */ false);
|
|
52
|
+
const dataStore = await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);
|
|
53
|
+
const result = await dataStore?.trySetAlias("default");
|
|
54
|
+
assert(result === "Success" || result === undefined, "success");
|
|
55
|
+
}
|
|
56
|
+
async instantiateFromExisting(runtime) {
|
|
57
|
+
// Validate we can load root data stores.
|
|
58
|
+
// We should be able to load any data store that was created in initializeFirstTime!
|
|
59
|
+
// Note: We use the deprecated `getRootDataStore` from v1.X here to allow for cross-major version compat
|
|
60
|
+
// testing. Can be removed when we no longer support v1.X.
|
|
61
|
+
await (runtime.getAliasedDataStoreEntryPoint?.("default") ??
|
|
62
|
+
runtime.getRootDataStore("default"));
|
|
63
|
+
}
|
|
64
|
+
async preInitialize(context, existing) {
|
|
65
|
+
if (containerRuntimeCtor.loadRuntime === undefined) {
|
|
66
|
+
// Note: We use the deprecated `load` from v1.X here to allow for cross-major version compat testing.
|
|
67
|
+
// Can be removed when we no longer support v1.X.
|
|
68
|
+
return containerRuntimeCtor.load(context, [
|
|
69
|
+
["default", Promise.resolve(this.dataStoreFactory)],
|
|
70
|
+
[this.type, Promise.resolve(this.dataStoreFactory)],
|
|
71
|
+
], buildRuntimeRequestHandler(backCompat_DefaultRouteRequestHandler("default"), ...this.requestHandlers), this.runtimeOptions, context.scope, existing);
|
|
72
|
+
}
|
|
73
|
+
const provideEntryPoint = async (runtime) => {
|
|
74
|
+
const entryPoint = await runtime.getAliasedDataStoreEntryPoint("default");
|
|
75
|
+
if (entryPoint === undefined) {
|
|
76
|
+
throw new Error("default dataStore must exist");
|
|
77
|
+
}
|
|
78
|
+
return entryPoint.get();
|
|
79
|
+
};
|
|
80
|
+
const getDefaultObject = async (request, runtime) => {
|
|
81
|
+
const parser = RequestParser.create(request);
|
|
82
|
+
if (parser.pathParts.length === 0) {
|
|
83
|
+
// This cast is safe as ContainerRuntime.loadRuntime is called below
|
|
84
|
+
return runtime.resolveHandle({
|
|
85
|
+
url: `/default${parser.query}`,
|
|
86
|
+
headers: request.headers,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return undefined; // continue search
|
|
90
|
+
};
|
|
91
|
+
return containerRuntimeCtor.loadRuntime({
|
|
92
|
+
context,
|
|
93
|
+
registryEntries: [
|
|
94
|
+
["default", Promise.resolve(this.dataStoreFactory)],
|
|
95
|
+
[this.type, Promise.resolve(this.dataStoreFactory)],
|
|
96
|
+
],
|
|
97
|
+
requestHandler: buildRuntimeRequestHandler(getDefaultObject, ...this.requestHandlers),
|
|
98
|
+
provideEntryPoint,
|
|
99
|
+
// ! This prop is needed for back-compat. Can be removed in 2.0.0-internal.8.0.0
|
|
100
|
+
initializeEntryPoint: provideEntryPoint,
|
|
101
|
+
runtimeOptions: this.runtimeOptions,
|
|
102
|
+
containerScope: context.scope,
|
|
103
|
+
existing,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* A container runtime factory that allows you to set runtime options
|
|
110
|
+
* @internal
|
|
111
|
+
*/
|
|
112
|
+
export const TestContainerRuntimeFactory = createTestContainerRuntimeFactory(ContainerRuntime);
|
|
113
|
+
//# sourceMappingURL=testContainerRuntimeFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContainerRuntimeFactory.js","sourceRoot":"","sources":["../src/testContainerRuntimeFactory.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 { assert } from \"@fluidframework/core-utils\";\nimport { IContainerContext, IRuntime } from \"@fluidframework/container-definitions\";\nimport {\n\tContainerRuntime,\n\tIContainerRuntimeOptions,\n\tDefaultSummaryConfiguration,\n} from \"@fluidframework/container-runtime\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport {\n\tFluidObject,\n\tIFluidHandleContext,\n\tIRequest,\n\tIResponse,\n} from \"@fluidframework/core-interfaces\";\n// eslint-disable-next-line import/no-deprecated\nimport { buildRuntimeRequestHandler, RuntimeRequestHandler } from \"@fluidframework/request-handler\";\nimport {\n\tIFluidDataStoreFactory,\n\tNamedFluidDataStoreRegistryEntries,\n} from \"@fluidframework/runtime-definitions\";\nimport { RequestParser, RuntimeFactoryHelper } from \"@fluidframework/runtime-utils\";\n\ninterface backCompat_IFluidRouter {\n\tIFluidRouter?: backCompat_IFluidRouter;\n\trequest(request: IRequest): Promise<IResponse>;\n}\n\nconst backCompat_DefaultRouteRequestHandler = (defaultRootId: string) => {\n\treturn async (request: IRequest, runtime: IContainerRuntime) => {\n\t\tconst parser = RequestParser.create(request);\n\t\tif (parser.pathParts.length === 0) {\n\t\t\treturn (\n\t\t\t\truntime as any as Required<FluidObject<IFluidHandleContext>>\n\t\t\t).IFluidHandleContext.resolveHandle({\n\t\t\t\turl: `/${defaultRootId}${parser.query}`,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined; // continue search\n\t};\n};\n\ninterface backCompat_ContainerRuntime {\n\tload(\n\t\tcontext: IContainerContext,\n\t\tregistryEntries: NamedFluidDataStoreRegistryEntries,\n\t\trequestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>,\n\t\truntimeOptions?: IContainerRuntimeOptions,\n\t\tcontainerScope?: FluidObject,\n\t\texisting?: boolean,\n\t\tcontainerRuntimeCtor?: typeof ContainerRuntime,\n\t): Promise<ContainerRuntime>;\n}\n\n/**\n * Create a container runtime factory class that allows you to set runtime options\n * @internal\n */\nexport const createTestContainerRuntimeFactory = (\n\tcontainerRuntimeCtor: typeof ContainerRuntime,\n) => {\n\treturn class extends RuntimeFactoryHelper {\n\t\tconstructor(\n\t\t\tpublic type: string,\n\t\t\tpublic dataStoreFactory: IFluidDataStoreFactory,\n\t\t\tpublic runtimeOptions: IContainerRuntimeOptions = {\n\t\t\t\tsummaryOptions: {\n\t\t\t\t\tsummaryConfigOverrides: {\n\t\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t\t...{\n\t\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpublic requestHandlers: RuntimeRequestHandler[] = [],\n\t\t) {\n\t\t\tsuper();\n\t\t}\n\n\t\tpublic async instantiateFirstTime(runtime: ContainerRuntime): Promise<void> {\n\t\t\t// Back-compat - old code does not return IDataStore for rootContext.attachRuntime() call!\n\t\t\t// Thus need to leverage old API createDetachedRootDataStore() that is gone in latest releases.\n\t\t\tconst rootContext =\n\t\t\t\t\"createDetachedRootDataStore\" in runtime\n\t\t\t\t\t? (runtime as any).createDetachedRootDataStore([this.type], \"default\")\n\t\t\t\t\t: runtime.createDetachedDataStore([this.type], \"default\");\n\n\t\t\tconst rootRuntime = await this.dataStoreFactory.instantiateDataStore(\n\t\t\t\trootContext,\n\t\t\t\t/* existing */ false,\n\t\t\t);\n\t\t\tconst dataStore = await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);\n\n\t\t\tconst result = await dataStore?.trySetAlias(\"default\");\n\t\t\tassert(result === \"Success\" || result === undefined, \"success\");\n\t\t}\n\n\t\tpublic async instantiateFromExisting(runtime: ContainerRuntime): Promise<void> {\n\t\t\t// Validate we can load root data stores.\n\t\t\t// We should be able to load any data store that was created in initializeFirstTime!\n\t\t\t// Note: We use the deprecated `getRootDataStore` from v1.X here to allow for cross-major version compat\n\t\t\t// testing. Can be removed when we no longer support v1.X.\n\t\t\tawait (runtime.getAliasedDataStoreEntryPoint?.(\"default\") ??\n\t\t\t\t(\n\t\t\t\t\truntime as any as {\n\t\t\t\t\t\tgetRootDataStore(\n\t\t\t\t\t\t\tid: string,\n\t\t\t\t\t\t\twait?: boolean,\n\t\t\t\t\t\t): Promise<backCompat_IFluidRouter>;\n\t\t\t\t\t}\n\t\t\t\t).getRootDataStore(\"default\"));\n\t\t}\n\n\t\tasync preInitialize(\n\t\t\tcontext: IContainerContext,\n\t\t\texisting: boolean,\n\t\t): Promise<IRuntime & IContainerRuntime> {\n\t\t\tif (containerRuntimeCtor.loadRuntime === undefined) {\n\t\t\t\t// Note: We use the deprecated `load` from v1.X here to allow for cross-major version compat testing.\n\t\t\t\t// Can be removed when we no longer support v1.X.\n\t\t\t\treturn (containerRuntimeCtor as any as backCompat_ContainerRuntime).load(\n\t\t\t\t\tcontext,\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"default\", Promise.resolve(this.dataStoreFactory)],\n\t\t\t\t\t\t[this.type, Promise.resolve(this.dataStoreFactory)],\n\t\t\t\t\t],\n\t\t\t\t\tbuildRuntimeRequestHandler(\n\t\t\t\t\t\tbackCompat_DefaultRouteRequestHandler(\"default\"),\n\t\t\t\t\t\t...this.requestHandlers,\n\t\t\t\t\t),\n\t\t\t\t\tthis.runtimeOptions,\n\t\t\t\t\tcontext.scope,\n\t\t\t\t\texisting,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst provideEntryPoint = async (runtime: IContainerRuntime) => {\n\t\t\t\tconst entryPoint = await runtime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tif (entryPoint === undefined) {\n\t\t\t\t\tthrow new Error(\"default dataStore must exist\");\n\t\t\t\t}\n\t\t\t\treturn entryPoint.get();\n\t\t\t};\n\t\t\tconst getDefaultObject = async (request: IRequest, runtime: IContainerRuntime) => {\n\t\t\t\tconst parser = RequestParser.create(request);\n\t\t\t\tif (parser.pathParts.length === 0) {\n\t\t\t\t\t// This cast is safe as ContainerRuntime.loadRuntime is called below\n\t\t\t\t\treturn (runtime as ContainerRuntime).resolveHandle({\n\t\t\t\t\t\turl: `/default${parser.query}`,\n\t\t\t\t\t\theaders: request.headers,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn undefined; // continue search\n\t\t\t};\n\t\t\treturn containerRuntimeCtor.loadRuntime({\n\t\t\t\tcontext,\n\t\t\t\tregistryEntries: [\n\t\t\t\t\t[\"default\", Promise.resolve(this.dataStoreFactory)],\n\t\t\t\t\t[this.type, Promise.resolve(this.dataStoreFactory)],\n\t\t\t\t],\n\t\t\t\trequestHandler: buildRuntimeRequestHandler(\n\t\t\t\t\tgetDefaultObject,\n\t\t\t\t\t...this.requestHandlers,\n\t\t\t\t),\n\t\t\t\tprovideEntryPoint,\n\t\t\t\t// ! This prop is needed for back-compat. Can be removed in 2.0.0-internal.8.0.0\n\t\t\t\tinitializeEntryPoint: provideEntryPoint,\n\t\t\t\truntimeOptions: this.runtimeOptions,\n\t\t\t\tcontainerScope: context.scope,\n\t\t\t\texisting,\n\t\t\t} as any);\n\t\t}\n\t};\n};\n\n/**\n * A container runtime factory that allows you to set runtime options\n * @internal\n */\nexport const TestContainerRuntimeFactory = createTestContainerRuntimeFactory(ContainerRuntime);\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerRuntimeFactoryWithDefaultDataStore } from "@fluidframework/aqueduct";
|
|
6
|
+
import { IContainerRuntimeOptions } from "@fluidframework/container-runtime";
|
|
7
|
+
import { IContainerRuntime } from "@fluidframework/container-runtime-definitions";
|
|
8
|
+
import { FluidObject } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { RuntimeRequestHandler } from "@fluidframework/request-handler";
|
|
10
|
+
import { IFluidDataStoreFactory, NamedFluidDataStoreRegistryEntries } from "@fluidframework/runtime-definitions";
|
|
11
|
+
/**
|
|
12
|
+
* ! Note: This function is purely needed for back-compat as the constructor argument structure was changed
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare const createContainerRuntimeFactoryWithDefaultDataStore: (Base: typeof ContainerRuntimeFactoryWithDefaultDataStore | undefined, ctorArgs: {
|
|
16
|
+
defaultFactory: IFluidDataStoreFactory;
|
|
17
|
+
registryEntries: NamedFluidDataStoreRegistryEntries;
|
|
18
|
+
dependencyContainer?: any;
|
|
19
|
+
requestHandlers?: RuntimeRequestHandler[] | undefined;
|
|
20
|
+
runtimeOptions?: IContainerRuntimeOptions | undefined;
|
|
21
|
+
provideEntryPoint?: ((runtime: IContainerRuntime) => Promise<FluidObject>) | undefined;
|
|
22
|
+
}) => ContainerRuntimeFactoryWithDefaultDataStore;
|
|
23
|
+
//# sourceMappingURL=testContainerRuntimeFactoryWithDefaultDataStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContainerRuntimeFactoryWithDefaultDataStore.d.ts","sourceRoot":"","sources":["../src/testContainerRuntimeFactoryWithDefaultDataStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2CAA2C,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EACN,sBAAsB,EACtB,kCAAkC,EAClC,MAAM,qCAAqC,CAAC;AAU7C;;;GAGG;AACH,eAAO,MAAM,iDAAiD;oBAG5C,sBAAsB;;0BAEhB,GAAG;;;mCAGK,iBAAiB,KAAK,QAAQ,WAAW,CAAC;MAEvE,2CAuBF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerRuntimeFactoryWithDefaultDataStore } from "@fluidframework/aqueduct";
|
|
6
|
+
const getDefaultFluidObject = async (runtime) => {
|
|
7
|
+
const entryPoint = await runtime.getAliasedDataStoreEntryPoint("default");
|
|
8
|
+
if (entryPoint === undefined) {
|
|
9
|
+
throw new Error("default dataStore must exist");
|
|
10
|
+
}
|
|
11
|
+
return entryPoint.get();
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* ! Note: This function is purely needed for back-compat as the constructor argument structure was changed
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export const createContainerRuntimeFactoryWithDefaultDataStore = (Base = ContainerRuntimeFactoryWithDefaultDataStore, ctorArgs) => {
|
|
18
|
+
try {
|
|
19
|
+
return new Base(ctorArgs);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
// IMPORTANT: The constructor argument structure changed, so this is needed for dynamically using older ContainerRuntimeFactoryWithDefaultDataStore's
|
|
23
|
+
const { defaultFactory, registryEntries, dependencyContainer, requestHandlers, runtimeOptions, provideEntryPoint, } = ctorArgs;
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
25
|
+
return new Base(defaultFactory, registryEntries, dependencyContainer, requestHandlers, runtimeOptions, provideEntryPoint ?? getDefaultFluidObject);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=testContainerRuntimeFactoryWithDefaultDataStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testContainerRuntimeFactoryWithDefaultDataStore.js","sourceRoot":"","sources":["../src/testContainerRuntimeFactoryWithDefaultDataStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2CAA2C,EAAE,MAAM,0BAA0B,CAAC;AAUvF,MAAM,qBAAqB,GAAG,KAAK,EAAE,OAA0B,EAAE,EAAE;IAClE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC;IAC1E,IAAI,UAAU,KAAK,SAAS,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KAChD;IACD,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iDAAiD,GAAG,CAChE,OAA2D,2CAA2C,EACtG,QAOC,EAC6C,EAAE;IAChD,IAAI;QACH,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC1B;IAAC,OAAO,GAAG,EAAE;QACb,qJAAqJ;QACrJ,MAAM,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,GACjB,GAAG,QAAQ,CAAC;QACb,+DAA+D;QAC/D,OAAO,IAAK,IAAY,CACvB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,IAAI,qBAAqB,CAC1C,CAAC;KACF;AACF,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ContainerRuntimeFactoryWithDefaultDataStore } from \"@fluidframework/aqueduct\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { FluidObject } from \"@fluidframework/core-interfaces\";\nimport { RuntimeRequestHandler } from \"@fluidframework/request-handler\";\nimport {\n\tIFluidDataStoreFactory,\n\tNamedFluidDataStoreRegistryEntries,\n} from \"@fluidframework/runtime-definitions\";\n\nconst getDefaultFluidObject = async (runtime: IContainerRuntime) => {\n\tconst entryPoint = await runtime.getAliasedDataStoreEntryPoint(\"default\");\n\tif (entryPoint === undefined) {\n\t\tthrow new Error(\"default dataStore must exist\");\n\t}\n\treturn entryPoint.get();\n};\n\n/**\n * ! Note: This function is purely needed for back-compat as the constructor argument structure was changed\n * @internal\n */\nexport const createContainerRuntimeFactoryWithDefaultDataStore = (\n\tBase: typeof ContainerRuntimeFactoryWithDefaultDataStore = ContainerRuntimeFactoryWithDefaultDataStore,\n\tctorArgs: {\n\t\tdefaultFactory: IFluidDataStoreFactory;\n\t\tregistryEntries: NamedFluidDataStoreRegistryEntries;\n\t\tdependencyContainer?: any;\n\t\trequestHandlers?: RuntimeRequestHandler[];\n\t\truntimeOptions?: IContainerRuntimeOptions;\n\t\tprovideEntryPoint?: (runtime: IContainerRuntime) => Promise<FluidObject>;\n\t},\n): ContainerRuntimeFactoryWithDefaultDataStore => {\n\ttry {\n\t\treturn new Base(ctorArgs);\n\t} catch (err) {\n\t\t// IMPORTANT: The constructor argument structure changed, so this is needed for dynamically using older ContainerRuntimeFactoryWithDefaultDataStore's\n\t\tconst {\n\t\t\tdefaultFactory,\n\t\t\tregistryEntries,\n\t\t\tdependencyContainer,\n\t\t\trequestHandlers,\n\t\t\truntimeOptions,\n\t\t\tprovideEntryPoint,\n\t\t} = ctorArgs;\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn new (Base as any)(\n\t\t\tdefaultFactory,\n\t\t\tregistryEntries,\n\t\t\tdependencyContainer,\n\t\t\trequestHandlers,\n\t\t\truntimeOptions,\n\t\t\tprovideEntryPoint ?? getDefaultFluidObject,\n\t\t);\n\t}\n};\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IRequest, IResponse, IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
|
+
import { FluidDataStoreRuntime } from "@fluidframework/datastore";
|
|
7
|
+
import { ISharedMap } from "@fluidframework/map";
|
|
8
|
+
import { IFluidDataStoreContext, IFluidDataStoreFactory, IFluidDataStoreChannel } from "@fluidframework/runtime-definitions";
|
|
9
|
+
import { IFluidDataStoreRuntime, IChannelFactory } from "@fluidframework/datastore-definitions";
|
|
10
|
+
import { ITestFluidObject } from "./interfaces.js";
|
|
11
|
+
/**
|
|
12
|
+
* A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.
|
|
13
|
+
* The shared objects can be retrieved by passing the key of the entry to getSharedObject.
|
|
14
|
+
* It exposes the IFluidDataStoreContext and IFluidDataStoreRuntime.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare class TestFluidObject implements ITestFluidObject {
|
|
18
|
+
readonly runtime: IFluidDataStoreRuntime;
|
|
19
|
+
readonly channel: IFluidDataStoreChannel;
|
|
20
|
+
readonly context: IFluidDataStoreContext;
|
|
21
|
+
private readonly factoryEntriesMap;
|
|
22
|
+
get ITestFluidObject(): this;
|
|
23
|
+
get IFluidLoadable(): this;
|
|
24
|
+
get handle(): IFluidHandle<this>;
|
|
25
|
+
root: ISharedMap;
|
|
26
|
+
private readonly innerHandle;
|
|
27
|
+
private initializeP;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new TestFluidObject.
|
|
30
|
+
* @param runtime - The data store runtime.
|
|
31
|
+
* @param context - The data store context.
|
|
32
|
+
* @param factoryEntries - A list of id to IChannelFactory mapping. For each item in the list,
|
|
33
|
+
* a shared object is created which can be retrieved by calling getSharedObject() with the id;
|
|
34
|
+
*/
|
|
35
|
+
constructor(runtime: IFluidDataStoreRuntime, channel: IFluidDataStoreChannel, context: IFluidDataStoreContext, factoryEntriesMap: Map<string, IChannelFactory>);
|
|
36
|
+
/**
|
|
37
|
+
* Retrieves a shared object with the given id.
|
|
38
|
+
* @param id - The id of the shared object to retrieve.
|
|
39
|
+
*/
|
|
40
|
+
getSharedObject<T = any>(id: string): Promise<T>;
|
|
41
|
+
request(request: IRequest): Promise<IResponse>;
|
|
42
|
+
initialize(existing: boolean): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export type ChannelFactoryRegistry = Iterable<[string | undefined, IChannelFactory]>;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a factory for a TestFluidObject with the given object factory entries. It creates a data store runtime
|
|
50
|
+
* with the object factories in the entry list. All the entries with an id other than undefined are passed to the
|
|
51
|
+
* Fluid object so that it can create a shared object for each.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
*
|
|
55
|
+
* The following will create a Fluid object that creates and loads a SharedString and SharedDirectory.
|
|
56
|
+
* It will add SparseMatrix to the data store's factory so that it can be created later.
|
|
57
|
+
*
|
|
58
|
+
* ```typescript
|
|
59
|
+
* new TestFluidObjectFactory([
|
|
60
|
+
* [ "sharedString", SharedString.getFactory() ],
|
|
61
|
+
* [ "sharedDirectory", SharedDirectory.getFactory() ],
|
|
62
|
+
* [ undefined, SparseMatrix.getFactory() ],
|
|
63
|
+
* ]);
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* The SharedString and SharedDirectory can be retrieved via getSharedObject() on the TestFluidObject as follows:
|
|
67
|
+
*
|
|
68
|
+
* ```typescript
|
|
69
|
+
* sharedString = testFluidObject.getSharedObject<SharedString>("sharedString");
|
|
70
|
+
* sharedDir = testFluidObject.getSharedObject<SharedDirectory>("sharedDirectory");
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @privateRemarks Beware that using this class generally forfeits some compatibility coverage
|
|
74
|
+
* `describeCompat` aims to provide:
|
|
75
|
+
* `SharedMap`s always reference the current version of SharedMap.
|
|
76
|
+
* AB#4670 tracks improving this situation.
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
export declare class TestFluidObjectFactory implements IFluidDataStoreFactory {
|
|
80
|
+
private readonly factoryEntries;
|
|
81
|
+
readonly type: string;
|
|
82
|
+
get IFluidDataStoreFactory(): this;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a new TestFluidObjectFactory.
|
|
85
|
+
* @param factoryEntries - A list of id to IChannelFactory mapping. It creates a data store runtime with each
|
|
86
|
+
* IChannelFactory. Entries with string ids are passed to the Fluid object so that it can create a shared object
|
|
87
|
+
* for it.
|
|
88
|
+
*/
|
|
89
|
+
constructor(factoryEntries: ChannelFactoryRegistry, type?: string);
|
|
90
|
+
instantiateDataStore(context: IFluidDataStoreContext, existing: boolean): Promise<FluidDataStoreRuntime>;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=testFluidObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testFluidObject.d.ts","sourceRoot":"","sources":["../src/testFluidObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAEN,qBAAqB,EAErB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAa,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAGhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;aAyBtC,OAAO,EAAE,sBAAsB;aAC/B,OAAO,EAAE,sBAAsB;aAC/B,OAAO,EAAE,sBAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IA3BnC,IAAW,gBAAgB,SAE1B;IAED,IAAW,cAAc,SAExB;IAED,IAAW,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAEtC;IAEM,IAAI,EAAG,UAAU,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,WAAW,CAA4B;IAE/C;;;;;;OAMG;gBAEc,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC9B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAKjE;;;OAGG;IACU,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAehD,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAM9C,UAAU,CAAC,QAAQ,EAAE,OAAO;CA2BzC;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,sBAAuB,YAAW,sBAAsB;IAYnE,OAAO,CAAC,QAAQ,CAAC,cAAc;aACf,IAAI;IAZrB,IAAW,sBAAsB,SAEhC;IAED;;;;;OAKG;gBAEe,cAAc,EAAE,sBAAsB,EACvC,IAAI,SAA2B;IAGnC,oBAAoB,CAChC,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC;CAmDjC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { FluidObjectHandle, mixinRequestHandler, } from "@fluidframework/datastore";
|
|
6
|
+
import { SharedMap } from "@fluidframework/map";
|
|
7
|
+
import { assert } from "@fluidframework/core-utils";
|
|
8
|
+
import { create404Response } from "@fluidframework/runtime-utils";
|
|
9
|
+
/**
|
|
10
|
+
* A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.
|
|
11
|
+
* The shared objects can be retrieved by passing the key of the entry to getSharedObject.
|
|
12
|
+
* It exposes the IFluidDataStoreContext and IFluidDataStoreRuntime.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export class TestFluidObject {
|
|
16
|
+
get ITestFluidObject() {
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
get IFluidLoadable() {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
get handle() {
|
|
23
|
+
return this.innerHandle;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new TestFluidObject.
|
|
27
|
+
* @param runtime - The data store runtime.
|
|
28
|
+
* @param context - The data store context.
|
|
29
|
+
* @param factoryEntries - A list of id to IChannelFactory mapping. For each item in the list,
|
|
30
|
+
* a shared object is created which can be retrieved by calling getSharedObject() with the id;
|
|
31
|
+
*/
|
|
32
|
+
constructor(runtime, channel, context, factoryEntriesMap) {
|
|
33
|
+
this.runtime = runtime;
|
|
34
|
+
this.channel = channel;
|
|
35
|
+
this.context = context;
|
|
36
|
+
this.factoryEntriesMap = factoryEntriesMap;
|
|
37
|
+
this.innerHandle = new FluidObjectHandle(this, "", runtime.objectsRoutingContext);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Retrieves a shared object with the given id.
|
|
41
|
+
* @param id - The id of the shared object to retrieve.
|
|
42
|
+
*/
|
|
43
|
+
async getSharedObject(id) {
|
|
44
|
+
if (this.factoryEntriesMap === undefined) {
|
|
45
|
+
throw new Error("Shared objects were not provided during creation.");
|
|
46
|
+
}
|
|
47
|
+
for (const key of this.factoryEntriesMap.keys()) {
|
|
48
|
+
if (key === id) {
|
|
49
|
+
const handle = this.root.get(id);
|
|
50
|
+
return handle?.get();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`Shared object with id ${id} not found.`);
|
|
54
|
+
}
|
|
55
|
+
async request(request) {
|
|
56
|
+
return request.url === "" || request.url === "/" || request.url.startsWith("/?")
|
|
57
|
+
? { mimeType: "fluid/object", status: 200, value: this }
|
|
58
|
+
: create404Response(request);
|
|
59
|
+
}
|
|
60
|
+
async initialize(existing) {
|
|
61
|
+
const doInitialization = async () => {
|
|
62
|
+
if (!existing) {
|
|
63
|
+
this.root = SharedMap.create(this.runtime, "root");
|
|
64
|
+
this.factoryEntriesMap.forEach((sharedObjectFactory, key) => {
|
|
65
|
+
const sharedObject = this.runtime.createChannel(key, sharedObjectFactory.type);
|
|
66
|
+
this.root.set(key, sharedObject.handle);
|
|
67
|
+
});
|
|
68
|
+
this.root.bindToContext();
|
|
69
|
+
}
|
|
70
|
+
this.root = (await this.runtime.getChannel("root"));
|
|
71
|
+
};
|
|
72
|
+
if (this.initializeP === undefined) {
|
|
73
|
+
this.initializeP = doInitialization();
|
|
74
|
+
}
|
|
75
|
+
return this.initializeP;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Creates a factory for a TestFluidObject with the given object factory entries. It creates a data store runtime
|
|
80
|
+
* with the object factories in the entry list. All the entries with an id other than undefined are passed to the
|
|
81
|
+
* Fluid object so that it can create a shared object for each.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
*
|
|
85
|
+
* The following will create a Fluid object that creates and loads a SharedString and SharedDirectory.
|
|
86
|
+
* It will add SparseMatrix to the data store's factory so that it can be created later.
|
|
87
|
+
*
|
|
88
|
+
* ```typescript
|
|
89
|
+
* new TestFluidObjectFactory([
|
|
90
|
+
* [ "sharedString", SharedString.getFactory() ],
|
|
91
|
+
* [ "sharedDirectory", SharedDirectory.getFactory() ],
|
|
92
|
+
* [ undefined, SparseMatrix.getFactory() ],
|
|
93
|
+
* ]);
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* The SharedString and SharedDirectory can be retrieved via getSharedObject() on the TestFluidObject as follows:
|
|
97
|
+
*
|
|
98
|
+
* ```typescript
|
|
99
|
+
* sharedString = testFluidObject.getSharedObject<SharedString>("sharedString");
|
|
100
|
+
* sharedDir = testFluidObject.getSharedObject<SharedDirectory>("sharedDirectory");
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @privateRemarks Beware that using this class generally forfeits some compatibility coverage
|
|
104
|
+
* `describeCompat` aims to provide:
|
|
105
|
+
* `SharedMap`s always reference the current version of SharedMap.
|
|
106
|
+
* AB#4670 tracks improving this situation.
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
export class TestFluidObjectFactory {
|
|
110
|
+
get IFluidDataStoreFactory() {
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Creates a new TestFluidObjectFactory.
|
|
115
|
+
* @param factoryEntries - A list of id to IChannelFactory mapping. It creates a data store runtime with each
|
|
116
|
+
* IChannelFactory. Entries with string ids are passed to the Fluid object so that it can create a shared object
|
|
117
|
+
* for it.
|
|
118
|
+
*/
|
|
119
|
+
constructor(factoryEntries, type = "TestFluidObjectFactory") {
|
|
120
|
+
this.factoryEntries = factoryEntries;
|
|
121
|
+
this.type = type;
|
|
122
|
+
}
|
|
123
|
+
async instantiateDataStore(context, existing) {
|
|
124
|
+
const dataTypes = new Map();
|
|
125
|
+
// Add SharedMap's factory which will be used to create the root map.
|
|
126
|
+
const sharedMapFactory = SharedMap.getFactory();
|
|
127
|
+
dataTypes.set(sharedMapFactory.type, sharedMapFactory);
|
|
128
|
+
// Add the object factories to the list to be sent to data store runtime.
|
|
129
|
+
for (const [, factory] of this.factoryEntries) {
|
|
130
|
+
dataTypes.set(factory.type, factory);
|
|
131
|
+
}
|
|
132
|
+
// Create a map from the factory entries with entries that don't have the id as undefined. This will be
|
|
133
|
+
// passed to the Fluid object.
|
|
134
|
+
const factoryEntriesMapForObject = new Map();
|
|
135
|
+
for (const [id, factory] of this.factoryEntries) {
|
|
136
|
+
if (id !== undefined) {
|
|
137
|
+
factoryEntriesMapForObject.set(id, factory);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const runtimeClass = mixinRequestHandler(async (request, rt) => {
|
|
141
|
+
// The provideEntryPoint callback below always returns FluidDataStoreRuntime, so this cast is safe
|
|
142
|
+
const dataObject = (await rt.entryPoint.get());
|
|
143
|
+
assert(dataObject.request !== undefined, "entryPoint should have been initialized by now");
|
|
144
|
+
return dataObject.request(request);
|
|
145
|
+
});
|
|
146
|
+
const runtime = new runtimeClass(context, dataTypes, existing, async () => {
|
|
147
|
+
await instance.initialize(true);
|
|
148
|
+
return instance;
|
|
149
|
+
});
|
|
150
|
+
const instance = new TestFluidObject(runtime, // runtime
|
|
151
|
+
runtime, // channel
|
|
152
|
+
context, factoryEntriesMapForObject);
|
|
153
|
+
if (!existing) {
|
|
154
|
+
await instance.initialize(false);
|
|
155
|
+
}
|
|
156
|
+
return runtime;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=testFluidObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testFluidObject.js","sourceRoot":"","sources":["../src/testFluidObject.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 { IRequest, IResponse, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tFluidObjectHandle,\n\tFluidDataStoreRuntime,\n\tmixinRequestHandler,\n} from \"@fluidframework/datastore\";\nimport { SharedMap, ISharedMap } from \"@fluidframework/map\";\nimport {\n\tIFluidDataStoreContext,\n\tIFluidDataStoreFactory,\n\tIFluidDataStoreChannel,\n} from \"@fluidframework/runtime-definitions\";\nimport { IFluidDataStoreRuntime, IChannelFactory } from \"@fluidframework/datastore-definitions\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { create404Response } from \"@fluidframework/runtime-utils\";\nimport { ITestFluidObject } from \"./interfaces.js\";\n\n/**\n * A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.\n * The shared objects can be retrieved by passing the key of the entry to getSharedObject.\n * It exposes the IFluidDataStoreContext and IFluidDataStoreRuntime.\n * @internal\n */\nexport class TestFluidObject implements ITestFluidObject {\n\tpublic get ITestFluidObject() {\n\t\treturn this;\n\t}\n\n\tpublic get IFluidLoadable() {\n\t\treturn this;\n\t}\n\n\tpublic get handle(): IFluidHandle<this> {\n\t\treturn this.innerHandle;\n\t}\n\n\tpublic root!: ISharedMap;\n\tprivate readonly innerHandle: IFluidHandle<this>;\n\tprivate initializeP: Promise<void> | undefined;\n\n\t/**\n\t * Creates a new TestFluidObject.\n\t * @param runtime - The data store runtime.\n\t * @param context - The data store context.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. For each item in the list,\n\t * a shared object is created which can be retrieved by calling getSharedObject() with the id;\n\t */\n\tconstructor(\n\t\tpublic readonly runtime: IFluidDataStoreRuntime,\n\t\tpublic readonly channel: IFluidDataStoreChannel,\n\t\tpublic readonly context: IFluidDataStoreContext,\n\t\tprivate readonly factoryEntriesMap: Map<string, IChannelFactory>,\n\t) {\n\t\tthis.innerHandle = new FluidObjectHandle(this, \"\", runtime.objectsRoutingContext);\n\t}\n\n\t/**\n\t * Retrieves a shared object with the given id.\n\t * @param id - The id of the shared object to retrieve.\n\t */\n\tpublic async getSharedObject<T = any>(id: string): Promise<T> {\n\t\tif (this.factoryEntriesMap === undefined) {\n\t\t\tthrow new Error(\"Shared objects were not provided during creation.\");\n\t\t}\n\n\t\tfor (const key of this.factoryEntriesMap.keys()) {\n\t\t\tif (key === id) {\n\t\t\t\tconst handle = this.root.get<IFluidHandle>(id);\n\t\t\t\treturn handle?.get() as unknown as T;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`Shared object with id ${id} not found.`);\n\t}\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\treturn request.url === \"\" || request.url === \"/\" || request.url.startsWith(\"/?\")\n\t\t\t? { mimeType: \"fluid/object\", status: 200, value: this }\n\t\t\t: create404Response(request);\n\t}\n\n\tpublic async initialize(existing: boolean) {\n\t\tconst doInitialization = async () => {\n\t\t\tif (!existing) {\n\t\t\t\tthis.root = SharedMap.create(this.runtime, \"root\");\n\n\t\t\t\tthis.factoryEntriesMap.forEach(\n\t\t\t\t\t(sharedObjectFactory: IChannelFactory, key: string) => {\n\t\t\t\t\t\tconst sharedObject = this.runtime.createChannel(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tsharedObjectFactory.type,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.root.set(key, sharedObject.handle);\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tthis.root.bindToContext();\n\t\t\t}\n\n\t\t\tthis.root = (await this.runtime.getChannel(\"root\")) as ISharedMap;\n\t\t};\n\n\t\tif (this.initializeP === undefined) {\n\t\t\tthis.initializeP = doInitialization();\n\t\t}\n\n\t\treturn this.initializeP;\n\t}\n}\n\n/**\n * @internal\n */\nexport type ChannelFactoryRegistry = Iterable<[string | undefined, IChannelFactory]>;\n\n/**\n * Creates a factory for a TestFluidObject with the given object factory entries. It creates a data store runtime\n * with the object factories in the entry list. All the entries with an id other than undefined are passed to the\n * Fluid object so that it can create a shared object for each.\n *\n * @example\n *\n * The following will create a Fluid object that creates and loads a SharedString and SharedDirectory.\n * It will add SparseMatrix to the data store's factory so that it can be created later.\n *\n * ```typescript\n * new TestFluidObjectFactory([\n * [ \"sharedString\", SharedString.getFactory() ],\n * [ \"sharedDirectory\", SharedDirectory.getFactory() ],\n * [ undefined, SparseMatrix.getFactory() ],\n * ]);\n * ```\n *\n * The SharedString and SharedDirectory can be retrieved via getSharedObject() on the TestFluidObject as follows:\n *\n * ```typescript\n * sharedString = testFluidObject.getSharedObject<SharedString>(\"sharedString\");\n * sharedDir = testFluidObject.getSharedObject<SharedDirectory>(\"sharedDirectory\");\n * ```\n *\n * @privateRemarks Beware that using this class generally forfeits some compatibility coverage\n * `describeCompat` aims to provide:\n * `SharedMap`s always reference the current version of SharedMap.\n * AB#4670 tracks improving this situation.\n * @internal\n */\nexport class TestFluidObjectFactory implements IFluidDataStoreFactory {\n\tpublic get IFluidDataStoreFactory() {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a new TestFluidObjectFactory.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. It creates a data store runtime with each\n\t * IChannelFactory. Entries with string ids are passed to the Fluid object so that it can create a shared object\n\t * for it.\n\t */\n\tconstructor(\n\t\tprivate readonly factoryEntries: ChannelFactoryRegistry,\n\t\tpublic readonly type = \"TestFluidObjectFactory\",\n\t) {}\n\n\tpublic async instantiateDataStore(\n\t\tcontext: IFluidDataStoreContext,\n\t\texisting: boolean,\n\t): Promise<FluidDataStoreRuntime> {\n\t\tconst dataTypes = new Map<string, IChannelFactory>();\n\n\t\t// Add SharedMap's factory which will be used to create the root map.\n\t\tconst sharedMapFactory = SharedMap.getFactory();\n\t\tdataTypes.set(sharedMapFactory.type, sharedMapFactory);\n\n\t\t// Add the object factories to the list to be sent to data store runtime.\n\t\tfor (const [, factory] of this.factoryEntries) {\n\t\t\tdataTypes.set(factory.type, factory);\n\t\t}\n\n\t\t// Create a map from the factory entries with entries that don't have the id as undefined. This will be\n\t\t// passed to the Fluid object.\n\t\tconst factoryEntriesMapForObject = new Map<string, IChannelFactory>();\n\t\tfor (const [id, factory] of this.factoryEntries) {\n\t\t\tif (id !== undefined) {\n\t\t\t\tfactoryEntriesMapForObject.set(id, factory);\n\t\t\t}\n\t\t}\n\n\t\tconst runtimeClass = mixinRequestHandler(\n\t\t\tasync (request: IRequest, rt: FluidDataStoreRuntime) => {\n\t\t\t\t// The provideEntryPoint callback below always returns FluidDataStoreRuntime, so this cast is safe\n\t\t\t\tconst dataObject = (await rt.entryPoint.get()) as FluidDataStoreRuntime;\n\t\t\t\tassert(\n\t\t\t\t\tdataObject.request !== undefined,\n\t\t\t\t\t\"entryPoint should have been initialized by now\",\n\t\t\t\t);\n\t\t\t\treturn dataObject.request(request);\n\t\t\t},\n\t\t);\n\n\t\tconst runtime = new runtimeClass(context, dataTypes, existing, async () => {\n\t\t\tawait instance.initialize(true);\n\t\t\treturn instance;\n\t\t});\n\n\t\tconst instance: TestFluidObject = new TestFluidObject(\n\t\t\truntime, // runtime\n\t\t\truntime, // channel\n\t\t\tcontext,\n\t\t\tfactoryEntriesMapForObject,\n\t\t);\n\n\t\tif (!existing) {\n\t\t\tawait instance.initialize(false);\n\t\t}\n\n\t\treturn runtime;\n\t}\n}\n"]}
|