@fluidframework/fluid-static 2.0.0-internal.1.0.0.82693 → 2.0.0-internal.1.1.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/.mocharc.js ADDED
@@ -0,0 +1,12 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const getFluidTestMochaConfig = require('@fluidframework/mocha-test-setup/mocharc-common');
9
+
10
+ const packageDir = __dirname;
11
+ const config = getFluidTestMochaConfig(packageDir);
12
+ module.exports = config;
@@ -1 +1 @@
1
- {"version":3,"file":"rootDataObject.d.ts","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,2BAA2B,EAC3B,UAAU,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EACH,eAAe,EAEf,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EAEvB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,cAAc,EAAE,yBAAyB,CAAC;CAC7C;AAED;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC;IAAE,YAAY,EAAE,mBAAmB,CAAC;CAAE,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D,OAAO,KAAK,iBAAiB,GAM5B;IAED;;;;;OAKG;cACa,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;IAgBhE;;;;;OAKG;cACa,cAAc;IAc9B;;;OAGG;IACH,IAAW,cAAc,IAAI,oBAAoB,CAKhD;IAED;;;OAGG;IACU,MAAM,CAAC,CAAC,SAAS,cAAc,EACxC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC;YASC,gBAAgB;IAO9B,OAAO,CAAC,kBAAkB;CAO7B;AAID;;;GAGG;AACH,qBAAa,iCAAkC,SAAQ,2BAA2B;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEnC;IAEH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,MAAM,EAAE,eAAe;IAenC;;OAEG;cACa,8BAA8B,CAAC,OAAO,EAAE,iBAAiB;CAO5E"}
1
+ {"version":3,"file":"rootDataObject.d.ts","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,2BAA2B,EAC3B,UAAU,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EACH,eAAe,EAEf,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EAEvB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,cAAc,EAAE,yBAAyB,CAAC;CAC7C;AAED;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC;IAAE,YAAY,EAAE,mBAAmB,CAAC;CAAE,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D,OAAO,KAAK,iBAAiB,GAM5B;IAED;;;;;OAKG;cACa,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;IAgBhE;;;;;OAKG;cACa,cAAc;IAc9B;;;OAGG;IACH,IAAW,cAAc,IAAI,oBAAoB,CAKhD;IAED;;;OAGG;IACU,MAAM,CAAC,CAAC,SAAS,cAAc,EACxC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC;YASC,gBAAgB;IAO9B,OAAO,CAAC,kBAAkB;CAO7B;AAID;;;GAGG;AACH,qBAAa,iCAAkC,SAAQ,2BAA2B;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEnC;IAEH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,MAAM,EAAE,eAAe;IAsBnC;;OAEG;cACa,8BAA8B,CAAC,OAAO,EAAE,iBAAiB;CAO5E"}
@@ -6,6 +6,7 @@ exports.DOProviderContainerRuntimeFactory = exports.RootDataObject = void 0;
6
6
  * Licensed under the MIT License.
7
7
  */
8
8
  const aqueduct_1 = require("@fluidframework/aqueduct");
9
+ const runtime_definitions_1 = require("@fluidframework/runtime-definitions");
9
10
  const runtime_utils_1 = require("@fluidframework/runtime-utils");
10
11
  const utils_1 = require("./utils");
11
12
  /**
@@ -108,7 +109,10 @@ class DOProviderContainerRuntimeFactory extends aqueduct_1.BaseContainerRuntimeF
108
109
  constructor(schema) {
109
110
  const [registryEntries, sharedObjects] = (0, utils_1.parseDataObjectsFromSharedObjects)(schema);
110
111
  const rootDataObjectFactory = new aqueduct_1.DataObjectFactory("rootDO", RootDataObject, sharedObjects, {}, registryEntries);
111
- super([rootDataObjectFactory.registryEntry], undefined, [(0, aqueduct_1.defaultRouteRequestHandler)(rootDataStoreId)]);
112
+ super([rootDataObjectFactory.registryEntry], undefined, [(0, aqueduct_1.defaultRouteRequestHandler)(rootDataStoreId)],
113
+ // temporary workaround to disable message batching until the message batch size issue is resolved
114
+ // resolution progress is tracked by the Feature 465 work item in AzDO
115
+ { flushMode: runtime_definitions_1.FlushMode.Immediate });
112
116
  this.rootDataObjectFactory = rootDataObjectFactory;
113
117
  this.initialObjects = schema.initialObjects;
114
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rootDataObject.js","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n BaseContainerRuntimeFactory,\n DataObject,\n DataObjectFactory,\n defaultRouteRequestHandler,\n} from \"@fluidframework/aqueduct\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n LoadableObjectClassRecord,\n LoadableObjectRecord,\n SharedObjectClass,\n} from \"./types\";\nimport { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects } from \"./utils\";\n\n/**\n * Input props for {@link RootDataObject.initializingFirstTime}\n */\nexport interface RootDataObjectProps {\n /**\n * Initial object structure with which the {@link RootDataObject} will be first-time initialized.\n * See {@link RootDataObject.initializingFirstTime}\n */\n initialObjects: LoadableObjectClassRecord;\n}\n\n/**\n * The entry-point/root collaborative object of the Fluid Container.\n * This class abstracts the dynamic code required to build a Fluid Container into a static representation\n * for end customers.\n */\nexport class RootDataObject extends DataObject<{ InitialState: RootDataObjectProps; }> {\n private readonly initialObjectsDirKey = \"initial-objects-key\";\n private readonly _initialObjects: LoadableObjectRecord = {};\n\n private get initialObjectsDir() {\n const dir = this.root.getSubDirectory(this.initialObjectsDirKey);\n if (dir === undefined) {\n throw new Error(\"InitialObjects sub-directory was not initialized\");\n }\n return dir;\n }\n\n /**\n * The first time this object is initialized, creates each object identified in\n * {@link RootDataObjectProps.initialObjects} and stores them as unique values in the root directory.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.initializingFirstTime}\n */\n protected async initializingFirstTime(props: RootDataObjectProps) {\n this.root.createSubDirectory(this.initialObjectsDirKey);\n\n // Create initial objects provided by the developer\n const initialObjectsP: Promise<void>[] = [];\n Object.entries(props.initialObjects).forEach(([id, objectClass]) => {\n const createObject = async () => {\n const obj = await this.create(objectClass);\n this.initialObjectsDir.set(id, obj.handle);\n };\n initialObjectsP.push(createObject());\n });\n\n await Promise.all(initialObjectsP);\n }\n\n /**\n * Every time an instance is initialized, loads all of the initial objects in the root directory so they can be\n * accessed immediately.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.hasInitialized}\n */\n protected async hasInitialized() {\n // We will always load the initial objects so they are available to the developer\n const loadInitialObjectsP: Promise<void>[] = [];\n for (const [key, value] of Array.from(this.initialObjectsDir.entries())) {\n const loadDir = async () => {\n const obj = await value.get();\n Object.assign(this._initialObjects, { [key]: obj });\n };\n loadInitialObjectsP.push(loadDir());\n }\n\n await Promise.all(loadInitialObjectsP);\n }\n\n /**\n * Provides a record of the initial objects defined on creation.\n * See {@link RootDataObject.initializingFirstTime}\n */\n public get initialObjects(): LoadableObjectRecord {\n if (Object.keys(this._initialObjects).length === 0) {\n throw new Error(\"Initial Objects were not correctly initialized\");\n }\n return this._initialObjects;\n }\n\n /**\n * Dynamically creates a new detached collaborative object (DDS/DataObject).\n * @param objectClass - Type of the collaborative object to be created.\n */\n public async create<T extends IFluidLoadable>(\n objectClass: LoadableObjectClass<T>,\n ): Promise<T> {\n if (isDataObjectClass(objectClass)) {\n return this.createDataObject<T>(objectClass);\n } else if (isSharedObjectClass(objectClass)) {\n return this.createSharedObject<T>(objectClass);\n }\n throw new Error(\"Could not create new Fluid object because an unknown object was passed\");\n }\n\n private async createDataObject<T extends IFluidLoadable>(dataObjectClass: DataObjectClass<T>): Promise<T> {\n const factory = dataObjectClass.factory;\n const packagePath = [...this.context.packagePath, factory.type];\n const router = await this.context.containerRuntime.createDataStore(packagePath);\n return requestFluidObject<T>(router, \"/\");\n }\n\n private createSharedObject<T extends IFluidLoadable>(\n sharedObjectClass: SharedObjectClass<T>,\n ): T {\n const factory = sharedObjectClass.getFactory();\n const obj = this.runtime.createChannel(undefined, factory.type);\n return obj as unknown as T;\n }\n}\n\nconst rootDataStoreId = \"rootDOId\";\n\n/**\n * Container code that provides a single {@link RootDataObject}. This data object is\n * dynamically customized (registry and initial objects) based on the schema provided to the container runtime factory.\n */\nexport class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {\n private readonly rootDataObjectFactory: DataObjectFactory<RootDataObject, {\n InitialState: RootDataObjectProps;\n }>;\n\n private readonly initialObjects: LoadableObjectClassRecord;\n\n constructor(schema: ContainerSchema) {\n const [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);\n const rootDataObjectFactory =\n new DataObjectFactory(\n \"rootDO\",\n RootDataObject,\n sharedObjects,\n {},\n registryEntries,\n );\n super([rootDataObjectFactory.registryEntry], undefined, [defaultRouteRequestHandler(rootDataStoreId)]);\n this.rootDataObjectFactory = rootDataObjectFactory;\n this.initialObjects = schema.initialObjects;\n }\n\n /**\n * {@inheritDoc @fluidframework/aqueduct#BaseContainerRuntimeFactory.containerInitializingFirstTime}\n */\n protected async containerInitializingFirstTime(runtime: IContainerRuntime) {\n // The first time we create the container we create the RootDataObject\n await this.rootDataObjectFactory.createRootInstance(\n rootDataStoreId,\n runtime,\n { initialObjects: this.initialObjects });\n }\n}\n"]}
1
+ {"version":3,"file":"rootDataObject.js","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n BaseContainerRuntimeFactory,\n DataObject,\n DataObjectFactory,\n defaultRouteRequestHandler,\n} from \"@fluidframework/aqueduct\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n LoadableObjectClassRecord,\n LoadableObjectRecord,\n SharedObjectClass,\n} from \"./types\";\nimport { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects } from \"./utils\";\n\n/**\n * Input props for {@link RootDataObject.initializingFirstTime}\n */\nexport interface RootDataObjectProps {\n /**\n * Initial object structure with which the {@link RootDataObject} will be first-time initialized.\n * See {@link RootDataObject.initializingFirstTime}\n */\n initialObjects: LoadableObjectClassRecord;\n}\n\n/**\n * The entry-point/root collaborative object of the Fluid Container.\n * This class abstracts the dynamic code required to build a Fluid Container into a static representation\n * for end customers.\n */\nexport class RootDataObject extends DataObject<{ InitialState: RootDataObjectProps; }> {\n private readonly initialObjectsDirKey = \"initial-objects-key\";\n private readonly _initialObjects: LoadableObjectRecord = {};\n\n private get initialObjectsDir() {\n const dir = this.root.getSubDirectory(this.initialObjectsDirKey);\n if (dir === undefined) {\n throw new Error(\"InitialObjects sub-directory was not initialized\");\n }\n return dir;\n }\n\n /**\n * The first time this object is initialized, creates each object identified in\n * {@link RootDataObjectProps.initialObjects} and stores them as unique values in the root directory.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.initializingFirstTime}\n */\n protected async initializingFirstTime(props: RootDataObjectProps) {\n this.root.createSubDirectory(this.initialObjectsDirKey);\n\n // Create initial objects provided by the developer\n const initialObjectsP: Promise<void>[] = [];\n Object.entries(props.initialObjects).forEach(([id, objectClass]) => {\n const createObject = async () => {\n const obj = await this.create(objectClass);\n this.initialObjectsDir.set(id, obj.handle);\n };\n initialObjectsP.push(createObject());\n });\n\n await Promise.all(initialObjectsP);\n }\n\n /**\n * Every time an instance is initialized, loads all of the initial objects in the root directory so they can be\n * accessed immediately.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.hasInitialized}\n */\n protected async hasInitialized() {\n // We will always load the initial objects so they are available to the developer\n const loadInitialObjectsP: Promise<void>[] = [];\n for (const [key, value] of Array.from(this.initialObjectsDir.entries())) {\n const loadDir = async () => {\n const obj = await value.get();\n Object.assign(this._initialObjects, { [key]: obj });\n };\n loadInitialObjectsP.push(loadDir());\n }\n\n await Promise.all(loadInitialObjectsP);\n }\n\n /**\n * Provides a record of the initial objects defined on creation.\n * See {@link RootDataObject.initializingFirstTime}\n */\n public get initialObjects(): LoadableObjectRecord {\n if (Object.keys(this._initialObjects).length === 0) {\n throw new Error(\"Initial Objects were not correctly initialized\");\n }\n return this._initialObjects;\n }\n\n /**\n * Dynamically creates a new detached collaborative object (DDS/DataObject).\n * @param objectClass - Type of the collaborative object to be created.\n */\n public async create<T extends IFluidLoadable>(\n objectClass: LoadableObjectClass<T>,\n ): Promise<T> {\n if (isDataObjectClass(objectClass)) {\n return this.createDataObject<T>(objectClass);\n } else if (isSharedObjectClass(objectClass)) {\n return this.createSharedObject<T>(objectClass);\n }\n throw new Error(\"Could not create new Fluid object because an unknown object was passed\");\n }\n\n private async createDataObject<T extends IFluidLoadable>(dataObjectClass: DataObjectClass<T>): Promise<T> {\n const factory = dataObjectClass.factory;\n const packagePath = [...this.context.packagePath, factory.type];\n const router = await this.context.containerRuntime.createDataStore(packagePath);\n return requestFluidObject<T>(router, \"/\");\n }\n\n private createSharedObject<T extends IFluidLoadable>(\n sharedObjectClass: SharedObjectClass<T>,\n ): T {\n const factory = sharedObjectClass.getFactory();\n const obj = this.runtime.createChannel(undefined, factory.type);\n return obj as unknown as T;\n }\n}\n\nconst rootDataStoreId = \"rootDOId\";\n\n/**\n * Container code that provides a single {@link RootDataObject}. This data object is\n * dynamically customized (registry and initial objects) based on the schema provided to the container runtime factory.\n */\nexport class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {\n private readonly rootDataObjectFactory: DataObjectFactory<RootDataObject, {\n InitialState: RootDataObjectProps;\n }>;\n\n private readonly initialObjects: LoadableObjectClassRecord;\n\n constructor(schema: ContainerSchema) {\n const [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);\n const rootDataObjectFactory =\n new DataObjectFactory(\n \"rootDO\",\n RootDataObject,\n sharedObjects,\n {},\n registryEntries,\n );\n super(\n [rootDataObjectFactory.registryEntry],\n undefined,\n [defaultRouteRequestHandler(rootDataStoreId)],\n // temporary workaround to disable message batching until the message batch size issue is resolved\n // resolution progress is tracked by the Feature 465 work item in AzDO\n { flushMode: FlushMode.Immediate },\n );\n this.rootDataObjectFactory = rootDataObjectFactory;\n this.initialObjects = schema.initialObjects;\n }\n\n /**\n * {@inheritDoc @fluidframework/aqueduct#BaseContainerRuntimeFactory.containerInitializingFirstTime}\n */\n protected async containerInitializingFirstTime(runtime: IContainerRuntime) {\n // The first time we create the container we create the RootDataObject\n await this.rootDataObjectFactory.createRootInstance(\n rootDataStoreId,\n runtime,\n { initialObjects: this.initialObjects });\n }\n}\n"]}
package/dist/utils.d.ts CHANGED
@@ -18,8 +18,5 @@ export declare const isSharedObjectClass: (obj: any) => obj is SharedObjectClass
18
18
  * of both SharedObject or DataObject. This function seperates the two and returns a registery
19
19
  * of DataObject types and an array of SharedObjects.
20
20
  */
21
- export declare const parseDataObjectsFromSharedObjects: (schema: ContainerSchema) => [
22
- NamedFluidDataStoreRegistryEntry[],
23
- IChannelFactory[]
24
- ];
21
+ export declare const parseDataObjectsFromSharedObjects: (schema: ContainerSchema) => [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]];
25
22
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EACH,eAAe,EACf,eAAe,EAEf,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,GAAG,gCAEzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAS,GAAG,kCAE3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,WAAY,eAAe,KACrE;IAAC,gCAAgC,EAAE;IAAE,eAAe,EAAE;CA+BzD,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EACH,eAAe,EACf,eAAe,EAEf,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,GAAG,gCAEzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QACvB,GAAG,kCAGX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,WAClC,eAAe,KACxB,CAAC,gCAAgC,EAAE,EAAE,eAAe,EAAE,CA+BxD,CAAC"}
package/dist/utils.js CHANGED
@@ -25,6 +25,7 @@ exports.isSharedObjectClass = isSharedObjectClass;
25
25
  * of DataObject types and an array of SharedObjects.
26
26
  */
27
27
  const parseDataObjectsFromSharedObjects = (schema) => {
28
+ var _a;
28
29
  const registryEntries = new Set();
29
30
  const sharedObjects = new Set();
30
31
  const tryAddObject = (obj) => {
@@ -32,22 +33,21 @@ const parseDataObjectsFromSharedObjects = (schema) => {
32
33
  sharedObjects.add(obj.getFactory());
33
34
  }
34
35
  else if ((0, exports.isDataObjectClass)(obj)) {
35
- registryEntries.add([obj.factory.type, Promise.resolve(obj.factory)]);
36
+ registryEntries.add([
37
+ obj.factory.type,
38
+ Promise.resolve(obj.factory),
39
+ ]);
36
40
  }
37
41
  else {
38
42
  throw new Error(`Entry is neither a DataObject or a SharedObject`);
39
43
  }
40
44
  };
41
45
  // Add the object types that will be initialized
42
- Object.values(schema.initialObjects).forEach((obj) => {
43
- tryAddObject(obj);
44
- });
45
- // If there are dynamic object types we will add them now
46
- if (schema.dynamicObjectTypes) {
47
- for (const obj of schema.dynamicObjectTypes) {
48
- tryAddObject(obj);
49
- }
50
- }
46
+ const dedupedObjects = new Set([
47
+ ...Object.values(schema.initialObjects),
48
+ ...((_a = schema.dynamicObjectTypes) !== null && _a !== void 0 ? _a : []),
49
+ ]);
50
+ dedupedObjects.forEach(tryAddObject);
51
51
  if (registryEntries.size === 0 && sharedObjects.size === 0) {
52
52
  throw new Error("Container cannot be initialized without any DataTypes");
53
53
  }
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAWH;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAA+B,EAAE;IACvE,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,MAAK,SAAS,CAAC;AACtC,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEF;;GAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,GAAQ,EAAiC,EAAE;IAC3E,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,MAAK,SAAS,CAAC;AACzC,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAEF;;;;GAIG;AACI,MAAM,iCAAiC,GAAG,CAAC,MAAuB,EACb,EAAE;IAC1D,MAAM,eAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;IACzE,MAAM,aAAa,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEtD,MAAM,YAAY,GAAG,CAAC,GAA6B,EAAE,EAAE;QACnD,IAAI,IAAA,2BAAmB,EAAC,GAAG,CAAC,EAAE;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;SACvC;aAAM,IAAI,IAAA,yBAAiB,EAAC,GAAG,CAAC,EAAE;YAC/B,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACzE;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;IAEF,gDAAgD;IAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjD,YAAY,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,MAAM,CAAC,kBAAkB,EAAE;QAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE;YACzC,YAAY,CAAC,GAAG,CAAC,CAAC;SACrB;KACJ;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;QACxD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;KAC5E;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAhCW,QAAA,iCAAiC,qCAgC5C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions\";\nimport { NamedFluidDataStoreRegistryEntry } from \"@fluidframework/runtime-definitions\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n SharedObjectClass,\n} from \"./types\";\n\n/**\n * Runtime check to determine if a class is a DataObject type\n */\nexport const isDataObjectClass = (obj: any): obj is DataObjectClass<any> => {\n return obj?.factory !== undefined;\n};\n\n/**\n * Runtime check to determine if a class is a SharedObject type\n */\nexport const isSharedObjectClass = (obj: any): obj is SharedObjectClass<any> => {\n return obj?.getFactory !== undefined;\n};\n\n/**\n * The ContainerSchema consists of initialObjects and dynamicObjectTypes. These types can be\n * of both SharedObject or DataObject. This function seperates the two and returns a registery\n * of DataObject types and an array of SharedObjects.\n */\nexport const parseDataObjectsFromSharedObjects = (schema: ContainerSchema):\n [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {\n const registryEntries: Set<NamedFluidDataStoreRegistryEntry> = new Set();\n const sharedObjects: Set<IChannelFactory> = new Set();\n\n const tryAddObject = (obj: LoadableObjectClass<any>) => {\n if (isSharedObjectClass(obj)) {\n sharedObjects.add(obj.getFactory());\n } else if (isDataObjectClass(obj)) {\n registryEntries.add([obj.factory.type, Promise.resolve(obj.factory)]);\n } else {\n throw new Error(`Entry is neither a DataObject or a SharedObject`);\n }\n };\n\n // Add the object types that will be initialized\n Object.values(schema.initialObjects).forEach((obj) => {\n tryAddObject(obj);\n });\n\n // If there are dynamic object types we will add them now\n if (schema.dynamicObjectTypes) {\n for (const obj of schema.dynamicObjectTypes) {\n tryAddObject(obj);\n }\n }\n\n if (registryEntries.size === 0 && sharedObjects.size === 0) {\n throw new Error(\"Container cannot be initialized without any DataTypes\");\n }\n\n return [Array.from(registryEntries), Array.from(sharedObjects)];\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAWH;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAA+B,EAAE;IACvE,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,MAAK,SAAS,CAAC;AACtC,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEF;;GAEG;AACI,MAAM,mBAAmB,GAAG,CAC/B,GAAQ,EACqB,EAAE;IAC/B,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,MAAK,SAAS,CAAC;AACzC,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B;AAEF;;;;GAIG;AACI,MAAM,iCAAiC,GAAG,CAC7C,MAAuB,EACgC,EAAE;;IACzD,MAAM,eAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;IACzE,MAAM,aAAa,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEtD,MAAM,YAAY,GAAG,CAAC,GAA6B,EAAE,EAAE;QACnD,IAAI,IAAA,2BAAmB,EAAC,GAAG,CAAC,EAAE;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;SACvC;aAAM,IAAI,IAAA,yBAAiB,EAAC,GAAG,CAAC,EAAE;YAC/B,eAAe,CAAC,GAAG,CAAC;gBAChB,GAAG,CAAC,OAAO,CAAC,IAAI;gBAChB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;aAC/B,CAAC,CAAC;SACN;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;IAEF,gDAAgD;IAChD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC3B,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;QACvC,GAAG,CAAC,MAAA,MAAM,CAAC,kBAAkB,mCAAI,EAAE,CAAC;KACvC,CAAC,CAAC;IACH,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAErC,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;QACxD,MAAM,IAAI,KAAK,CACX,uDAAuD,CAC1D,CAAC;KACL;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAjCW,QAAA,iCAAiC,qCAiC5C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions\";\nimport { NamedFluidDataStoreRegistryEntry } from \"@fluidframework/runtime-definitions\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n SharedObjectClass,\n} from \"./types\";\n\n/**\n * Runtime check to determine if a class is a DataObject type\n */\nexport const isDataObjectClass = (obj: any): obj is DataObjectClass<any> => {\n return obj?.factory !== undefined;\n};\n\n/**\n * Runtime check to determine if a class is a SharedObject type\n */\nexport const isSharedObjectClass = (\n obj: any,\n): obj is SharedObjectClass<any> => {\n return obj?.getFactory !== undefined;\n};\n\n/**\n * The ContainerSchema consists of initialObjects and dynamicObjectTypes. These types can be\n * of both SharedObject or DataObject. This function seperates the two and returns a registery\n * of DataObject types and an array of SharedObjects.\n */\nexport const parseDataObjectsFromSharedObjects = (\n schema: ContainerSchema,\n): [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {\n const registryEntries: Set<NamedFluidDataStoreRegistryEntry> = new Set();\n const sharedObjects: Set<IChannelFactory> = new Set();\n\n const tryAddObject = (obj: LoadableObjectClass<any>) => {\n if (isSharedObjectClass(obj)) {\n sharedObjects.add(obj.getFactory());\n } else if (isDataObjectClass(obj)) {\n registryEntries.add([\n obj.factory.type,\n Promise.resolve(obj.factory),\n ]);\n } else {\n throw new Error(`Entry is neither a DataObject or a SharedObject`);\n }\n };\n\n // Add the object types that will be initialized\n const dedupedObjects = new Set([\n ...Object.values(schema.initialObjects),\n ...(schema.dynamicObjectTypes ?? []),\n ]);\n dedupedObjects.forEach(tryAddObject);\n\n if (registryEntries.size === 0 && sharedObjects.size === 0) {\n throw new Error(\n \"Container cannot be initialized without any DataTypes\",\n );\n }\n\n return [Array.from(registryEntries), Array.from(sharedObjects)];\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rootDataObject.d.ts","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,2BAA2B,EAC3B,UAAU,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EACH,eAAe,EAEf,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EAEvB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,cAAc,EAAE,yBAAyB,CAAC;CAC7C;AAED;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC;IAAE,YAAY,EAAE,mBAAmB,CAAC;CAAE,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D,OAAO,KAAK,iBAAiB,GAM5B;IAED;;;;;OAKG;cACa,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;IAgBhE;;;;;OAKG;cACa,cAAc;IAc9B;;;OAGG;IACH,IAAW,cAAc,IAAI,oBAAoB,CAKhD;IAED;;;OAGG;IACU,MAAM,CAAC,CAAC,SAAS,cAAc,EACxC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC;YASC,gBAAgB;IAO9B,OAAO,CAAC,kBAAkB;CAO7B;AAID;;;GAGG;AACH,qBAAa,iCAAkC,SAAQ,2BAA2B;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEnC;IAEH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,MAAM,EAAE,eAAe;IAenC;;OAEG;cACa,8BAA8B,CAAC,OAAO,EAAE,iBAAiB;CAO5E"}
1
+ {"version":3,"file":"rootDataObject.d.ts","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,2BAA2B,EAC3B,UAAU,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EACH,eAAe,EAEf,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EAEvB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,cAAc,EAAE,yBAAyB,CAAC;CAC7C;AAED;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC;IAAE,YAAY,EAAE,mBAAmB,CAAC;CAAE,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D,OAAO,KAAK,iBAAiB,GAM5B;IAED;;;;;OAKG;cACa,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;IAgBhE;;;;;OAKG;cACa,cAAc;IAc9B;;;OAGG;IACH,IAAW,cAAc,IAAI,oBAAoB,CAKhD;IAED;;;OAGG;IACU,MAAM,CAAC,CAAC,SAAS,cAAc,EACxC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC;YASC,gBAAgB;IAO9B,OAAO,CAAC,kBAAkB;CAO7B;AAID;;;GAGG;AACH,qBAAa,iCAAkC,SAAQ,2BAA2B;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEnC;IAEH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,MAAM,EAAE,eAAe;IAsBnC;;OAEG;cACa,8BAA8B,CAAC,OAAO,EAAE,iBAAiB;CAO5E"}
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { BaseContainerRuntimeFactory, DataObject, DataObjectFactory, defaultRouteRequestHandler, } from "@fluidframework/aqueduct";
6
+ import { FlushMode } from "@fluidframework/runtime-definitions";
6
7
  import { requestFluidObject } from "@fluidframework/runtime-utils";
7
8
  import { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects } from "./utils";
8
9
  /**
@@ -104,7 +105,10 @@ export class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFacto
104
105
  constructor(schema) {
105
106
  const [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);
106
107
  const rootDataObjectFactory = new DataObjectFactory("rootDO", RootDataObject, sharedObjects, {}, registryEntries);
107
- super([rootDataObjectFactory.registryEntry], undefined, [defaultRouteRequestHandler(rootDataStoreId)]);
108
+ super([rootDataObjectFactory.registryEntry], undefined, [defaultRouteRequestHandler(rootDataStoreId)],
109
+ // temporary workaround to disable message batching until the message batch size issue is resolved
110
+ // resolution progress is tracked by the Feature 465 work item in AzDO
111
+ { flushMode: FlushMode.Immediate });
108
112
  this.rootDataObjectFactory = rootDataObjectFactory;
109
113
  this.initialObjects = schema.initialObjects;
110
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rootDataObject.js","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n BaseContainerRuntimeFactory,\n DataObject,\n DataObjectFactory,\n defaultRouteRequestHandler,\n} from \"@fluidframework/aqueduct\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n LoadableObjectClassRecord,\n LoadableObjectRecord,\n SharedObjectClass,\n} from \"./types\";\nimport { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects } from \"./utils\";\n\n/**\n * Input props for {@link RootDataObject.initializingFirstTime}\n */\nexport interface RootDataObjectProps {\n /**\n * Initial object structure with which the {@link RootDataObject} will be first-time initialized.\n * See {@link RootDataObject.initializingFirstTime}\n */\n initialObjects: LoadableObjectClassRecord;\n}\n\n/**\n * The entry-point/root collaborative object of the Fluid Container.\n * This class abstracts the dynamic code required to build a Fluid Container into a static representation\n * for end customers.\n */\nexport class RootDataObject extends DataObject<{ InitialState: RootDataObjectProps; }> {\n private readonly initialObjectsDirKey = \"initial-objects-key\";\n private readonly _initialObjects: LoadableObjectRecord = {};\n\n private get initialObjectsDir() {\n const dir = this.root.getSubDirectory(this.initialObjectsDirKey);\n if (dir === undefined) {\n throw new Error(\"InitialObjects sub-directory was not initialized\");\n }\n return dir;\n }\n\n /**\n * The first time this object is initialized, creates each object identified in\n * {@link RootDataObjectProps.initialObjects} and stores them as unique values in the root directory.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.initializingFirstTime}\n */\n protected async initializingFirstTime(props: RootDataObjectProps) {\n this.root.createSubDirectory(this.initialObjectsDirKey);\n\n // Create initial objects provided by the developer\n const initialObjectsP: Promise<void>[] = [];\n Object.entries(props.initialObjects).forEach(([id, objectClass]) => {\n const createObject = async () => {\n const obj = await this.create(objectClass);\n this.initialObjectsDir.set(id, obj.handle);\n };\n initialObjectsP.push(createObject());\n });\n\n await Promise.all(initialObjectsP);\n }\n\n /**\n * Every time an instance is initialized, loads all of the initial objects in the root directory so they can be\n * accessed immediately.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.hasInitialized}\n */\n protected async hasInitialized() {\n // We will always load the initial objects so they are available to the developer\n const loadInitialObjectsP: Promise<void>[] = [];\n for (const [key, value] of Array.from(this.initialObjectsDir.entries())) {\n const loadDir = async () => {\n const obj = await value.get();\n Object.assign(this._initialObjects, { [key]: obj });\n };\n loadInitialObjectsP.push(loadDir());\n }\n\n await Promise.all(loadInitialObjectsP);\n }\n\n /**\n * Provides a record of the initial objects defined on creation.\n * See {@link RootDataObject.initializingFirstTime}\n */\n public get initialObjects(): LoadableObjectRecord {\n if (Object.keys(this._initialObjects).length === 0) {\n throw new Error(\"Initial Objects were not correctly initialized\");\n }\n return this._initialObjects;\n }\n\n /**\n * Dynamically creates a new detached collaborative object (DDS/DataObject).\n * @param objectClass - Type of the collaborative object to be created.\n */\n public async create<T extends IFluidLoadable>(\n objectClass: LoadableObjectClass<T>,\n ): Promise<T> {\n if (isDataObjectClass(objectClass)) {\n return this.createDataObject<T>(objectClass);\n } else if (isSharedObjectClass(objectClass)) {\n return this.createSharedObject<T>(objectClass);\n }\n throw new Error(\"Could not create new Fluid object because an unknown object was passed\");\n }\n\n private async createDataObject<T extends IFluidLoadable>(dataObjectClass: DataObjectClass<T>): Promise<T> {\n const factory = dataObjectClass.factory;\n const packagePath = [...this.context.packagePath, factory.type];\n const router = await this.context.containerRuntime.createDataStore(packagePath);\n return requestFluidObject<T>(router, \"/\");\n }\n\n private createSharedObject<T extends IFluidLoadable>(\n sharedObjectClass: SharedObjectClass<T>,\n ): T {\n const factory = sharedObjectClass.getFactory();\n const obj = this.runtime.createChannel(undefined, factory.type);\n return obj as unknown as T;\n }\n}\n\nconst rootDataStoreId = \"rootDOId\";\n\n/**\n * Container code that provides a single {@link RootDataObject}. This data object is\n * dynamically customized (registry and initial objects) based on the schema provided to the container runtime factory.\n */\nexport class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {\n private readonly rootDataObjectFactory: DataObjectFactory<RootDataObject, {\n InitialState: RootDataObjectProps;\n }>;\n\n private readonly initialObjects: LoadableObjectClassRecord;\n\n constructor(schema: ContainerSchema) {\n const [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);\n const rootDataObjectFactory =\n new DataObjectFactory(\n \"rootDO\",\n RootDataObject,\n sharedObjects,\n {},\n registryEntries,\n );\n super([rootDataObjectFactory.registryEntry], undefined, [defaultRouteRequestHandler(rootDataStoreId)]);\n this.rootDataObjectFactory = rootDataObjectFactory;\n this.initialObjects = schema.initialObjects;\n }\n\n /**\n * {@inheritDoc @fluidframework/aqueduct#BaseContainerRuntimeFactory.containerInitializingFirstTime}\n */\n protected async containerInitializingFirstTime(runtime: IContainerRuntime) {\n // The first time we create the container we create the RootDataObject\n await this.rootDataObjectFactory.createRootInstance(\n rootDataStoreId,\n runtime,\n { initialObjects: this.initialObjects });\n }\n}\n"]}
1
+ {"version":3,"file":"rootDataObject.js","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n BaseContainerRuntimeFactory,\n DataObject,\n DataObjectFactory,\n defaultRouteRequestHandler,\n} from \"@fluidframework/aqueduct\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n LoadableObjectClassRecord,\n LoadableObjectRecord,\n SharedObjectClass,\n} from \"./types\";\nimport { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects } from \"./utils\";\n\n/**\n * Input props for {@link RootDataObject.initializingFirstTime}\n */\nexport interface RootDataObjectProps {\n /**\n * Initial object structure with which the {@link RootDataObject} will be first-time initialized.\n * See {@link RootDataObject.initializingFirstTime}\n */\n initialObjects: LoadableObjectClassRecord;\n}\n\n/**\n * The entry-point/root collaborative object of the Fluid Container.\n * This class abstracts the dynamic code required to build a Fluid Container into a static representation\n * for end customers.\n */\nexport class RootDataObject extends DataObject<{ InitialState: RootDataObjectProps; }> {\n private readonly initialObjectsDirKey = \"initial-objects-key\";\n private readonly _initialObjects: LoadableObjectRecord = {};\n\n private get initialObjectsDir() {\n const dir = this.root.getSubDirectory(this.initialObjectsDirKey);\n if (dir === undefined) {\n throw new Error(\"InitialObjects sub-directory was not initialized\");\n }\n return dir;\n }\n\n /**\n * The first time this object is initialized, creates each object identified in\n * {@link RootDataObjectProps.initialObjects} and stores them as unique values in the root directory.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.initializingFirstTime}\n */\n protected async initializingFirstTime(props: RootDataObjectProps) {\n this.root.createSubDirectory(this.initialObjectsDirKey);\n\n // Create initial objects provided by the developer\n const initialObjectsP: Promise<void>[] = [];\n Object.entries(props.initialObjects).forEach(([id, objectClass]) => {\n const createObject = async () => {\n const obj = await this.create(objectClass);\n this.initialObjectsDir.set(id, obj.handle);\n };\n initialObjectsP.push(createObject());\n });\n\n await Promise.all(initialObjectsP);\n }\n\n /**\n * Every time an instance is initialized, loads all of the initial objects in the root directory so they can be\n * accessed immediately.\n *\n * See {@link @fluidframework/aqueduct#PureDataObject.hasInitialized}\n */\n protected async hasInitialized() {\n // We will always load the initial objects so they are available to the developer\n const loadInitialObjectsP: Promise<void>[] = [];\n for (const [key, value] of Array.from(this.initialObjectsDir.entries())) {\n const loadDir = async () => {\n const obj = await value.get();\n Object.assign(this._initialObjects, { [key]: obj });\n };\n loadInitialObjectsP.push(loadDir());\n }\n\n await Promise.all(loadInitialObjectsP);\n }\n\n /**\n * Provides a record of the initial objects defined on creation.\n * See {@link RootDataObject.initializingFirstTime}\n */\n public get initialObjects(): LoadableObjectRecord {\n if (Object.keys(this._initialObjects).length === 0) {\n throw new Error(\"Initial Objects were not correctly initialized\");\n }\n return this._initialObjects;\n }\n\n /**\n * Dynamically creates a new detached collaborative object (DDS/DataObject).\n * @param objectClass - Type of the collaborative object to be created.\n */\n public async create<T extends IFluidLoadable>(\n objectClass: LoadableObjectClass<T>,\n ): Promise<T> {\n if (isDataObjectClass(objectClass)) {\n return this.createDataObject<T>(objectClass);\n } else if (isSharedObjectClass(objectClass)) {\n return this.createSharedObject<T>(objectClass);\n }\n throw new Error(\"Could not create new Fluid object because an unknown object was passed\");\n }\n\n private async createDataObject<T extends IFluidLoadable>(dataObjectClass: DataObjectClass<T>): Promise<T> {\n const factory = dataObjectClass.factory;\n const packagePath = [...this.context.packagePath, factory.type];\n const router = await this.context.containerRuntime.createDataStore(packagePath);\n return requestFluidObject<T>(router, \"/\");\n }\n\n private createSharedObject<T extends IFluidLoadable>(\n sharedObjectClass: SharedObjectClass<T>,\n ): T {\n const factory = sharedObjectClass.getFactory();\n const obj = this.runtime.createChannel(undefined, factory.type);\n return obj as unknown as T;\n }\n}\n\nconst rootDataStoreId = \"rootDOId\";\n\n/**\n * Container code that provides a single {@link RootDataObject}. This data object is\n * dynamically customized (registry and initial objects) based on the schema provided to the container runtime factory.\n */\nexport class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {\n private readonly rootDataObjectFactory: DataObjectFactory<RootDataObject, {\n InitialState: RootDataObjectProps;\n }>;\n\n private readonly initialObjects: LoadableObjectClassRecord;\n\n constructor(schema: ContainerSchema) {\n const [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);\n const rootDataObjectFactory =\n new DataObjectFactory(\n \"rootDO\",\n RootDataObject,\n sharedObjects,\n {},\n registryEntries,\n );\n super(\n [rootDataObjectFactory.registryEntry],\n undefined,\n [defaultRouteRequestHandler(rootDataStoreId)],\n // temporary workaround to disable message batching until the message batch size issue is resolved\n // resolution progress is tracked by the Feature 465 work item in AzDO\n { flushMode: FlushMode.Immediate },\n );\n this.rootDataObjectFactory = rootDataObjectFactory;\n this.initialObjects = schema.initialObjects;\n }\n\n /**\n * {@inheritDoc @fluidframework/aqueduct#BaseContainerRuntimeFactory.containerInitializingFirstTime}\n */\n protected async containerInitializingFirstTime(runtime: IContainerRuntime) {\n // The first time we create the container we create the RootDataObject\n await this.rootDataObjectFactory.createRootInstance(\n rootDataStoreId,\n runtime,\n { initialObjects: this.initialObjects });\n }\n}\n"]}
package/lib/utils.d.ts CHANGED
@@ -18,8 +18,5 @@ export declare const isSharedObjectClass: (obj: any) => obj is SharedObjectClass
18
18
  * of both SharedObject or DataObject. This function seperates the two and returns a registery
19
19
  * of DataObject types and an array of SharedObjects.
20
20
  */
21
- export declare const parseDataObjectsFromSharedObjects: (schema: ContainerSchema) => [
22
- NamedFluidDataStoreRegistryEntry[],
23
- IChannelFactory[]
24
- ];
21
+ export declare const parseDataObjectsFromSharedObjects: (schema: ContainerSchema) => [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]];
25
22
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EACH,eAAe,EACf,eAAe,EAEf,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,GAAG,gCAEzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAS,GAAG,kCAE3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,WAAY,eAAe,KACrE;IAAC,gCAAgC,EAAE;IAAE,eAAe,EAAE;CA+BzD,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EACH,eAAe,EACf,eAAe,EAEf,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,GAAG,gCAEzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QACvB,GAAG,kCAGX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,WAClC,eAAe,KACxB,CAAC,gCAAgC,EAAE,EAAE,eAAe,EAAE,CA+BxD,CAAC"}
package/lib/utils.js CHANGED
@@ -20,6 +20,7 @@ export const isSharedObjectClass = (obj) => {
20
20
  * of DataObject types and an array of SharedObjects.
21
21
  */
22
22
  export const parseDataObjectsFromSharedObjects = (schema) => {
23
+ var _a;
23
24
  const registryEntries = new Set();
24
25
  const sharedObjects = new Set();
25
26
  const tryAddObject = (obj) => {
@@ -27,22 +28,21 @@ export const parseDataObjectsFromSharedObjects = (schema) => {
27
28
  sharedObjects.add(obj.getFactory());
28
29
  }
29
30
  else if (isDataObjectClass(obj)) {
30
- registryEntries.add([obj.factory.type, Promise.resolve(obj.factory)]);
31
+ registryEntries.add([
32
+ obj.factory.type,
33
+ Promise.resolve(obj.factory),
34
+ ]);
31
35
  }
32
36
  else {
33
37
  throw new Error(`Entry is neither a DataObject or a SharedObject`);
34
38
  }
35
39
  };
36
40
  // Add the object types that will be initialized
37
- Object.values(schema.initialObjects).forEach((obj) => {
38
- tryAddObject(obj);
39
- });
40
- // If there are dynamic object types we will add them now
41
- if (schema.dynamicObjectTypes) {
42
- for (const obj of schema.dynamicObjectTypes) {
43
- tryAddObject(obj);
44
- }
45
- }
41
+ const dedupedObjects = new Set([
42
+ ...Object.values(schema.initialObjects),
43
+ ...((_a = schema.dynamicObjectTypes) !== null && _a !== void 0 ? _a : []),
44
+ ]);
45
+ dedupedObjects.forEach(tryAddObject);
46
46
  if (registryEntries.size === 0 && sharedObjects.size === 0) {
47
47
  throw new Error("Container cannot be initialized without any DataTypes");
48
48
  }
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAA+B,EAAE;IACvE,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,MAAK,SAAS,CAAC;AACtC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAQ,EAAiC,EAAE;IAC3E,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,MAAK,SAAS,CAAC;AACzC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,MAAuB,EACb,EAAE;IAC1D,MAAM,eAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;IACzE,MAAM,aAAa,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEtD,MAAM,YAAY,GAAG,CAAC,GAA6B,EAAE,EAAE;QACnD,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;SACvC;aAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE;YAC/B,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACzE;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;IAEF,gDAAgD;IAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjD,YAAY,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,MAAM,CAAC,kBAAkB,EAAE;QAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE;YACzC,YAAY,CAAC,GAAG,CAAC,CAAC;SACrB;KACJ;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;QACxD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;KAC5E;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions\";\nimport { NamedFluidDataStoreRegistryEntry } from \"@fluidframework/runtime-definitions\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n SharedObjectClass,\n} from \"./types\";\n\n/**\n * Runtime check to determine if a class is a DataObject type\n */\nexport const isDataObjectClass = (obj: any): obj is DataObjectClass<any> => {\n return obj?.factory !== undefined;\n};\n\n/**\n * Runtime check to determine if a class is a SharedObject type\n */\nexport const isSharedObjectClass = (obj: any): obj is SharedObjectClass<any> => {\n return obj?.getFactory !== undefined;\n};\n\n/**\n * The ContainerSchema consists of initialObjects and dynamicObjectTypes. These types can be\n * of both SharedObject or DataObject. This function seperates the two and returns a registery\n * of DataObject types and an array of SharedObjects.\n */\nexport const parseDataObjectsFromSharedObjects = (schema: ContainerSchema):\n [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {\n const registryEntries: Set<NamedFluidDataStoreRegistryEntry> = new Set();\n const sharedObjects: Set<IChannelFactory> = new Set();\n\n const tryAddObject = (obj: LoadableObjectClass<any>) => {\n if (isSharedObjectClass(obj)) {\n sharedObjects.add(obj.getFactory());\n } else if (isDataObjectClass(obj)) {\n registryEntries.add([obj.factory.type, Promise.resolve(obj.factory)]);\n } else {\n throw new Error(`Entry is neither a DataObject or a SharedObject`);\n }\n };\n\n // Add the object types that will be initialized\n Object.values(schema.initialObjects).forEach((obj) => {\n tryAddObject(obj);\n });\n\n // If there are dynamic object types we will add them now\n if (schema.dynamicObjectTypes) {\n for (const obj of schema.dynamicObjectTypes) {\n tryAddObject(obj);\n }\n }\n\n if (registryEntries.size === 0 && sharedObjects.size === 0) {\n throw new Error(\"Container cannot be initialized without any DataTypes\");\n }\n\n return [Array.from(registryEntries), Array.from(sharedObjects)];\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAA+B,EAAE;IACvE,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,MAAK,SAAS,CAAC;AACtC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAC/B,GAAQ,EACqB,EAAE;IAC/B,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,MAAK,SAAS,CAAC;AACzC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC7C,MAAuB,EACgC,EAAE;;IACzD,MAAM,eAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;IACzE,MAAM,aAAa,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEtD,MAAM,YAAY,GAAG,CAAC,GAA6B,EAAE,EAAE;QACnD,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;SACvC;aAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE;YAC/B,eAAe,CAAC,GAAG,CAAC;gBAChB,GAAG,CAAC,OAAO,CAAC,IAAI;gBAChB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;aAC/B,CAAC,CAAC;SACN;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;IAEF,gDAAgD;IAChD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC3B,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;QACvC,GAAG,CAAC,MAAA,MAAM,CAAC,kBAAkB,mCAAI,EAAE,CAAC;KACvC,CAAC,CAAC;IACH,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAErC,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;QACxD,MAAM,IAAI,KAAK,CACX,uDAAuD,CAC1D,CAAC;KACL;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions\";\nimport { NamedFluidDataStoreRegistryEntry } from \"@fluidframework/runtime-definitions\";\nimport {\n ContainerSchema,\n DataObjectClass,\n LoadableObjectClass,\n SharedObjectClass,\n} from \"./types\";\n\n/**\n * Runtime check to determine if a class is a DataObject type\n */\nexport const isDataObjectClass = (obj: any): obj is DataObjectClass<any> => {\n return obj?.factory !== undefined;\n};\n\n/**\n * Runtime check to determine if a class is a SharedObject type\n */\nexport const isSharedObjectClass = (\n obj: any,\n): obj is SharedObjectClass<any> => {\n return obj?.getFactory !== undefined;\n};\n\n/**\n * The ContainerSchema consists of initialObjects and dynamicObjectTypes. These types can be\n * of both SharedObject or DataObject. This function seperates the two and returns a registery\n * of DataObject types and an array of SharedObjects.\n */\nexport const parseDataObjectsFromSharedObjects = (\n schema: ContainerSchema,\n): [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {\n const registryEntries: Set<NamedFluidDataStoreRegistryEntry> = new Set();\n const sharedObjects: Set<IChannelFactory> = new Set();\n\n const tryAddObject = (obj: LoadableObjectClass<any>) => {\n if (isSharedObjectClass(obj)) {\n sharedObjects.add(obj.getFactory());\n } else if (isDataObjectClass(obj)) {\n registryEntries.add([\n obj.factory.type,\n Promise.resolve(obj.factory),\n ]);\n } else {\n throw new Error(`Entry is neither a DataObject or a SharedObject`);\n }\n };\n\n // Add the object types that will be initialized\n const dedupedObjects = new Set([\n ...Object.values(schema.initialObjects),\n ...(schema.dynamicObjectTypes ?? []),\n ]);\n dedupedObjects.forEach(tryAddObject);\n\n if (registryEntries.size === 0 && sharedObjects.size === 0) {\n throw new Error(\n \"Container cannot be initialized without any DataTypes\",\n );\n }\n\n return [Array.from(registryEntries), Array.from(sharedObjects)];\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/fluid-static",
3
- "version": "2.0.0-internal.1.0.0.82693",
3
+ "version": "2.0.0-internal.1.1.0",
4
4
  "description": "A tool to enable consumption of Fluid Data Objects without requiring custom container code.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -29,38 +29,47 @@
29
29
  "eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
30
30
  "lint": "npm run eslint",
31
31
  "lint:fix": "npm run eslint:fix",
32
+ "test": "npm run test:mocha",
33
+ "test:coverage": "nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml",
34
+ "test:mocha": "mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict",
35
+ "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
32
36
  "tsc": "tsc",
33
37
  "tsfmt": "tsfmt --verify",
34
38
  "tsfmt:fix": "tsfmt --replace",
35
39
  "typetests:gen": "fluid-type-validator -g -d ."
36
40
  },
37
41
  "dependencies": {
38
- "@fluidframework/aqueduct": "2.0.0-internal.1.0.0.82693",
42
+ "@fluidframework/aqueduct": "^2.0.0-internal.1.1.0",
39
43
  "@fluidframework/common-definitions": "^0.20.1",
40
- "@fluidframework/common-utils": "^0.32.1",
41
- "@fluidframework/container-definitions": "2.0.0-internal.1.0.0.82693",
42
- "@fluidframework/container-loader": "2.0.0-internal.1.0.0.82693",
43
- "@fluidframework/container-runtime-definitions": "2.0.0-internal.1.0.0.82693",
44
- "@fluidframework/core-interfaces": "2.0.0-internal.1.0.0.82693",
45
- "@fluidframework/datastore-definitions": "2.0.0-internal.1.0.0.82693",
46
- "@fluidframework/protocol-definitions": "^0.1029.1000-0",
47
- "@fluidframework/request-handler": "2.0.0-internal.1.0.0.82693",
48
- "@fluidframework/runtime-definitions": "2.0.0-internal.1.0.0.82693",
49
- "@fluidframework/runtime-utils": "2.0.0-internal.1.0.0.82693"
44
+ "@fluidframework/common-utils": "^1.0.0",
45
+ "@fluidframework/container-definitions": "^2.0.0-internal.1.1.0",
46
+ "@fluidframework/container-loader": "^2.0.0-internal.1.1.0",
47
+ "@fluidframework/container-runtime-definitions": "^2.0.0-internal.1.1.0",
48
+ "@fluidframework/core-interfaces": "^2.0.0-internal.1.1.0",
49
+ "@fluidframework/datastore-definitions": "^2.0.0-internal.1.1.0",
50
+ "@fluidframework/protocol-definitions": "^1.0.0",
51
+ "@fluidframework/request-handler": "^2.0.0-internal.1.1.0",
52
+ "@fluidframework/runtime-definitions": "^2.0.0-internal.1.1.0",
53
+ "@fluidframework/runtime-utils": "^2.0.0-internal.1.1.0"
50
54
  },
51
55
  "devDependencies": {
52
- "@fluid-experimental/get-container": "2.0.0-internal.1.0.0.82693",
56
+ "@fluid-experimental/get-container": "^2.0.0-internal.1.1.0",
53
57
  "@fluidframework/build-common": "^0.24.0",
54
- "@fluidframework/build-tools": "^0.3.0-0",
58
+ "@fluidframework/build-tools": "^0.3.1000",
55
59
  "@fluidframework/eslint-config-fluid": "^0.28.2000",
56
60
  "@fluidframework/fluid-static-previous": "npm:@fluidframework/fluid-static@^1.0.0",
61
+ "@fluidframework/map": "^2.0.0-internal.1.1.0",
62
+ "@fluidframework/mocha-test-setup": "^2.0.0-internal.1.1.0",
63
+ "@fluidframework/sequence": "^2.0.0-internal.1.1.0",
57
64
  "@microsoft/api-extractor": "^7.22.2",
58
65
  "@rushstack/eslint-config": "^2.5.1",
66
+ "@types/mocha": "^9.1.1",
59
67
  "@types/node": "^14.18.0",
60
68
  "concurrently": "^6.2.0",
61
- "copyfiles": "^2.1.0",
69
+ "copyfiles": "^2.4.1",
62
70
  "cross-env": "^7.0.2",
63
71
  "eslint": "~8.6.0",
72
+ "mocha": "^10.0.0",
64
73
  "rimraf": "^2.6.2",
65
74
  "typescript": "~4.5.5",
66
75
  "typescript-formatter": "7.1.0"
@@ -10,6 +10,7 @@ import {
10
10
  } from "@fluidframework/aqueduct";
11
11
  import { IContainerRuntime } from "@fluidframework/container-runtime-definitions";
12
12
  import { IFluidLoadable } from "@fluidframework/core-interfaces";
13
+ import { FlushMode } from "@fluidframework/runtime-definitions";
13
14
  import { requestFluidObject } from "@fluidframework/runtime-utils";
14
15
  import {
15
16
  ContainerSchema,
@@ -156,7 +157,14 @@ export class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFacto
156
157
  {},
157
158
  registryEntries,
158
159
  );
159
- super([rootDataObjectFactory.registryEntry], undefined, [defaultRouteRequestHandler(rootDataStoreId)]);
160
+ super(
161
+ [rootDataObjectFactory.registryEntry],
162
+ undefined,
163
+ [defaultRouteRequestHandler(rootDataStoreId)],
164
+ // temporary workaround to disable message batching until the message batch size issue is resolved
165
+ // resolution progress is tracked by the Feature 465 work item in AzDO
166
+ { flushMode: FlushMode.Immediate },
167
+ );
160
168
  this.rootDataObjectFactory = rootDataObjectFactory;
161
169
  this.initialObjects = schema.initialObjects;
162
170
  }
package/src/utils.ts CHANGED
@@ -22,7 +22,9 @@ export const isDataObjectClass = (obj: any): obj is DataObjectClass<any> => {
22
22
  /**
23
23
  * Runtime check to determine if a class is a SharedObject type
24
24
  */
25
- export const isSharedObjectClass = (obj: any): obj is SharedObjectClass<any> => {
25
+ export const isSharedObjectClass = (
26
+ obj: any,
27
+ ): obj is SharedObjectClass<any> => {
26
28
  return obj?.getFactory !== undefined;
27
29
  };
28
30
 
@@ -31,8 +33,9 @@ export const isSharedObjectClass = (obj: any): obj is SharedObjectClass<any> =>
31
33
  * of both SharedObject or DataObject. This function seperates the two and returns a registery
32
34
  * of DataObject types and an array of SharedObjects.
33
35
  */
34
- export const parseDataObjectsFromSharedObjects = (schema: ContainerSchema):
35
- [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {
36
+ export const parseDataObjectsFromSharedObjects = (
37
+ schema: ContainerSchema,
38
+ ): [NamedFluidDataStoreRegistryEntry[], IChannelFactory[]] => {
36
39
  const registryEntries: Set<NamedFluidDataStoreRegistryEntry> = new Set();
37
40
  const sharedObjects: Set<IChannelFactory> = new Set();
38
41
 
@@ -40,26 +43,26 @@ export const parseDataObjectsFromSharedObjects = (schema: ContainerSchema):
40
43
  if (isSharedObjectClass(obj)) {
41
44
  sharedObjects.add(obj.getFactory());
42
45
  } else if (isDataObjectClass(obj)) {
43
- registryEntries.add([obj.factory.type, Promise.resolve(obj.factory)]);
46
+ registryEntries.add([
47
+ obj.factory.type,
48
+ Promise.resolve(obj.factory),
49
+ ]);
44
50
  } else {
45
51
  throw new Error(`Entry is neither a DataObject or a SharedObject`);
46
52
  }
47
53
  };
48
54
 
49
55
  // Add the object types that will be initialized
50
- Object.values(schema.initialObjects).forEach((obj) => {
51
- tryAddObject(obj);
52
- });
53
-
54
- // If there are dynamic object types we will add them now
55
- if (schema.dynamicObjectTypes) {
56
- for (const obj of schema.dynamicObjectTypes) {
57
- tryAddObject(obj);
58
- }
59
- }
56
+ const dedupedObjects = new Set([
57
+ ...Object.values(schema.initialObjects),
58
+ ...(schema.dynamicObjectTypes ?? []),
59
+ ]);
60
+ dedupedObjects.forEach(tryAddObject);
60
61
 
61
62
  if (registryEntries.size === 0 && sharedObjects.size === 0) {
62
- throw new Error("Container cannot be initialized without any DataTypes");
63
+ throw new Error(
64
+ "Container cannot be initialized without any DataTypes",
65
+ );
63
66
  }
64
67
 
65
68
  return [Array.from(registryEntries), Array.from(sharedObjects)];