diff --git a/examples/data-objects/vltava/src/components/anchor/anchor.ts b/examples/data-objects/vltava/src/components/anchor/anchor.ts deleted file mode 100644 index 4f03f23ca1ca..000000000000 --- a/examples/data-objects/vltava/src/components/anchor/anchor.ts +++ /dev/null @@ -1,66 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { IFluidHandle } from "@fluidframework/core-interfaces"; -import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct"; -import { - IFluidLastEditedTracker, - IProvideFluidLastEditedTracker, - LastEditedTrackerDataObject, -} from "@fluidframework/last-edited-experimental"; -import { IFluidHTMLView, IProvideFluidHTMLView } from "@fluidframework/view-interfaces"; -import { Vltava } from "../vltava"; - -/** - * Anchor is an default component is responsible for managing creation and the default component - */ -export class Anchor extends DataObject implements IProvideFluidHTMLView, IProvideFluidLastEditedTracker { - private readonly defaultComponentId = "default-component-id"; - private defaultComponentInternal: IFluidHTMLView | undefined; - private readonly lastEditedComponentId = "last-edited-component-id"; - private lastEditedComponent: IFluidLastEditedTracker | undefined; - - private get defaultComponent() { - if (!this.defaultComponentInternal) { - throw new Error("Default Component was not initialized properly"); - } - - return this.defaultComponentInternal; - } - - private static readonly factory = new DataObjectFactory("anchor", Anchor, [], {}); - - public static getFactory() { - return Anchor.factory; - } - - public get IFluidHTMLView() { return this.defaultComponent; } - - public get IFluidLastEditedTracker() { - if (!this.lastEditedComponent) { - throw new Error("LastEditedTrackerDataObject was not initialized properly"); - } - - return this.lastEditedComponent; - } - - protected async initializingFirstTime() { - const defaultComponent = await Vltava.getFactory().createInstance(this.context); - this.root.set(this.defaultComponentId, defaultComponent.handle); - - const lastEditedComponent = await LastEditedTrackerDataObject.getFactory().createInstance(this.context); - this.root.set(this.lastEditedComponentId, lastEditedComponent.handle); - } - - protected async hasInitialized() { - this.defaultComponentInternal = - (await this.root.get(this.defaultComponentId).get()) - .IFluidHTMLView; - - this.lastEditedComponent = - (await this.root.get(this.lastEditedComponentId).get()) - .IFluidLastEditedTracker; - } -} diff --git a/examples/data-objects/vltava/src/fluidObjects/anchor/anchor.ts b/examples/data-objects/vltava/src/fluidObjects/anchor/anchor.ts new file mode 100644 index 000000000000..58ee733d1cb4 --- /dev/null +++ b/examples/data-objects/vltava/src/fluidObjects/anchor/anchor.ts @@ -0,0 +1,66 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { IFluidHandle } from "@fluidframework/core-interfaces"; +import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct"; +import { + IFluidLastEditedTracker, + IProvideFluidLastEditedTracker, + LastEditedTrackerDataObject, +} from "@fluidframework/last-edited-experimental"; +import { IFluidHTMLView, IProvideFluidHTMLView } from "@fluidframework/view-interfaces"; +import { Vltava } from "../vltava"; + +/** + * Anchor is a Data Object responsible for managing creation and the default Fluid Object + */ +export class Anchor extends DataObject implements IProvideFluidHTMLView, IProvideFluidLastEditedTracker { + private readonly defaultFluidObjectId = "default-fluid-object-id"; + private defaultFluidObjectInternal: IFluidHTMLView | undefined; + private readonly lastEditedFluidObjectId = "last-edited-fluid-object-id"; + private lastEditedFluidObject: IFluidLastEditedTracker | undefined; + + private get defaultFluidObject() { + if (!this.defaultFluidObjectInternal) { + throw new Error("Default FluidObject was not initialized properly"); + } + + return this.defaultFluidObjectInternal; + } + + private static readonly factory = new DataObjectFactory("anchor", Anchor, [], {}); + + public static getFactory() { + return Anchor.factory; + } + + public get IFluidHTMLView() { return this.defaultFluidObject; } + + public get IFluidLastEditedTracker() { + if (!this.lastEditedFluidObject) { + throw new Error("LastEditedTrackerDataObject was not initialized properly"); + } + + return this.lastEditedFluidObject; + } + + protected async initializingFirstTime() { + const defaultFluidObject = await Vltava.getFactory().createInstance(this.context); + this.root.set(this.defaultFluidObjectId, defaultFluidObject.handle); + + const lastEditedFluidObject = await LastEditedTrackerDataObject.getFactory().createInstance(this.context); + this.root.set(this.lastEditedFluidObjectId, lastEditedFluidObject.handle); + } + + protected async hasInitialized() { + this.defaultFluidObjectInternal = + (await this.root.get(this.defaultFluidObjectId).get()) + .IFluidHTMLView; + + this.lastEditedFluidObject = + (await this.root.get(this.lastEditedFluidObjectId).get()) + .IFluidLastEditedTracker; + } +} diff --git a/examples/data-objects/vltava/src/components/anchor/index.ts b/examples/data-objects/vltava/src/fluidObjects/anchor/index.ts similarity index 100% rename from examples/data-objects/vltava/src/components/anchor/index.ts rename to examples/data-objects/vltava/src/fluidObjects/anchor/index.ts diff --git a/examples/data-objects/vltava/src/components/index.ts b/examples/data-objects/vltava/src/fluidObjects/index.ts similarity index 100% rename from examples/data-objects/vltava/src/components/index.ts rename to examples/data-objects/vltava/src/fluidObjects/index.ts diff --git a/examples/data-objects/vltava/src/components/library/embeddedComponent.tsx b/examples/data-objects/vltava/src/fluidObjects/library/embeddedFluidObject.tsx similarity index 58% rename from examples/data-objects/vltava/src/components/library/embeddedComponent.tsx rename to examples/data-objects/vltava/src/fluidObjects/library/embeddedFluidObject.tsx index fe768b8a2db4..5993ada47e65 100644 --- a/examples/data-objects/vltava/src/components/library/embeddedComponent.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/library/embeddedFluidObject.tsx @@ -8,23 +8,23 @@ import { IFluidObject } from "@fluidframework/core-interfaces"; import React from "react"; -interface IEmbeddedComponentWrapperProps { +interface IEmbeddedFluidObjectWrapperProps { id: string; requestFluidObject(id: string): Promise; } -interface IEmbeddedComponentWrapperState { +interface IEmbeddedFluidObjectWrapperState { element: JSX.Element; } /** - * This wrapper handles the async-ness of loading a component. + * This wrapper handles the async-ness of loading a Fluid object. * This ideally shouldn't be here but is here for now to unblock me not knowing how to use ReactViewAdapter. */ -export class EmbeddedComponentWrapper - extends React.Component +export class EmbeddedFluidObjectWrapper + extends React.Component { - constructor(props: IEmbeddedComponentWrapperProps) { + constructor(props: IEmbeddedFluidObjectWrapperProps) { super(props); this.state = { element: , @@ -32,9 +32,9 @@ export class EmbeddedComponentWrapper } async componentDidMount() { - const component = await this.props.requestFluidObject(this.props.id); - if (component) { - const element = ; + const fluidObject = await this.props.requestFluidObject(this.props.id); + if (fluidObject) { + const element = ; this.setState({ element }); } } diff --git a/examples/data-objects/vltava/src/components/library/index.ts b/examples/data-objects/vltava/src/fluidObjects/library/index.ts similarity index 72% rename from examples/data-objects/vltava/src/components/library/index.ts rename to examples/data-objects/vltava/src/fluidObjects/library/index.ts index 00a707aeed03..072c143718c0 100644 --- a/examples/data-objects/vltava/src/components/library/index.ts +++ b/examples/data-objects/vltava/src/fluidObjects/library/index.ts @@ -3,4 +3,4 @@ * Licensed under the MIT License. */ -export * from "./embeddedComponent"; +export * from "./embeddedFluidObject"; diff --git a/examples/data-objects/vltava/src/components/tabs/dataModel.ts b/examples/data-objects/vltava/src/fluidObjects/tabs/dataModel.ts similarity index 87% rename from examples/data-objects/vltava/src/components/tabs/dataModel.ts rename to examples/data-objects/vltava/src/fluidObjects/tabs/dataModel.ts index 2a8e65e492ce..90dae1937511 100644 --- a/examples/data-objects/vltava/src/components/tabs/dataModel.ts +++ b/examples/data-objects/vltava/src/fluidObjects/tabs/dataModel.ts @@ -17,7 +17,7 @@ import { import { v4 as uuid } from "uuid"; -import { IComponentInternalRegistry } from "../../interfaces"; +import { IFluidObjectInternalRegistry } from "../../interfaces"; export interface ITabsTypes { type: string; @@ -31,7 +31,7 @@ export interface ITabsModel { } export interface ITabsDataModel extends EventEmitter { - getComponentTab(id: string): Promise; + getFluidObjectTab(id: string): Promise; getTabIds(): string[]; createTab(type: string): Promise; getNewTabTypes(): ITabsTypes[]; @@ -42,7 +42,7 @@ export class TabsDataModel extends EventEmitter implements ITabsDataModel { constructor( public root: ISharedDirectory, - private readonly internalRegistry: IComponentInternalRegistry, + private readonly internalRegistry: IFluidObjectInternalRegistry, private readonly createFluidObject: (pkg: string) => Promise, private readonly getFluidObjectFromDirectory: ( @@ -75,10 +75,10 @@ export class TabsDataModel extends EventEmitter implements ITabsDataModel { public async createTab(type: string): Promise { const newKey = uuid(); - const component = await this.createFluidObject(type); + const fluidObject = await this.createFluidObject(type); this.tabs.set(newKey, { type, - handleOrId: component.handle, + handleOrId: fluidObject.handle, }); this.emit("newTab", true); @@ -90,7 +90,7 @@ export class TabsDataModel extends EventEmitter implements ITabsDataModel { return data?.handleOrId; } - public async getComponentTab(id: string): Promise { + public async getFluidObjectTab(id: string): Promise { this.tabs = this.root.getSubDirectory("tab-ids"); return this.getFluidObjectFromDirectory(id, this.tabs, this.getObjectFromDirectory); } diff --git a/examples/data-objects/vltava/src/components/tabs/index.ts b/examples/data-objects/vltava/src/fluidObjects/tabs/index.ts similarity index 100% rename from examples/data-objects/vltava/src/components/tabs/index.ts rename to examples/data-objects/vltava/src/fluidObjects/tabs/index.ts diff --git a/examples/data-objects/vltava/src/components/tabs/newTabButton.tsx b/examples/data-objects/vltava/src/fluidObjects/tabs/newTabButton.tsx similarity index 84% rename from examples/data-objects/vltava/src/components/tabs/newTabButton.tsx rename to examples/data-objects/vltava/src/fluidObjects/tabs/newTabButton.tsx index a0ef792cd769..59e82a4c20cb 100644 --- a/examples/data-objects/vltava/src/components/tabs/newTabButton.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/tabs/newTabButton.tsx @@ -25,7 +25,7 @@ export interface IButtonExampleProps { disabled?: boolean; checked?: boolean; createTab: (type: string) => void; - components: ITabsTypes[]; + fluidObjects: ITabsTypes[]; } const customSplitButtonStyles: IButtonStyles = { @@ -41,18 +41,18 @@ const customSplitButtonStyles: IButtonStyles = { const addIcon: IIconProps = { iconName: "Add" }; -export const NewTabButton: React.FunctionComponent = +export const NewTabButton: React.FC = (props: IButtonExampleProps) => { const { disabled, checked } = props; const items: IContextualMenuItem[] = []; - props.components.forEach((component) => { + props.fluidObjects.forEach((fluidObject) => { items.push( { - key: component.type, - text: component.friendlyName, - iconProps: { iconName: component.fabricIconName }, + key: fluidObject.type, + text: fluidObject.friendlyName, + iconProps: { iconName: fluidObject.fabricIconName }, onClick: () => { - props.createTab(component.type); + props.createTab(fluidObject.type); }, }, ); diff --git a/examples/data-objects/vltava/src/components/tabs/tabs.tsx b/examples/data-objects/vltava/src/fluidObjects/tabs/tabs.tsx similarity index 87% rename from examples/data-objects/vltava/src/components/tabs/tabs.tsx rename to examples/data-objects/vltava/src/fluidObjects/tabs/tabs.tsx index 979a03fc46bc..e66cbec0ada9 100644 --- a/examples/data-objects/vltava/src/components/tabs/tabs.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/tabs/tabs.tsx @@ -15,13 +15,13 @@ import { TabsView } from "./view"; export const TabsName = "tabs"; -export class TabsComponent extends DataObject implements IFluidHTMLView { +export class TabsFluidObject extends DataObject implements IFluidHTMLView { private dataModelInternal: ITabsDataModel | undefined; - private static readonly factory = new DataObjectFactory(TabsName, TabsComponent, [], {}); + private static readonly factory = new DataObjectFactory(TabsName, TabsFluidObject, [], {}); public static getFactory() { - return TabsComponent.factory; + return TabsFluidObject.factory; } private get dataModel(): ITabsDataModel { @@ -42,7 +42,7 @@ export class TabsComponent extends DataObject implements IFluidHTMLView { protected async hasInitialized() { const registry = await this.context.containerRuntime.IFluidDataStoreRegistry.get(""); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const registryDetails = (registry as IFluidObject).IComponentInternalRegistry!; + const registryDetails = (registry as IFluidObject).IFluidObjectInternalRegistry!; this.dataModelInternal = new TabsDataModel( this.root, diff --git a/examples/data-objects/vltava/src/components/tabs/view.tsx b/examples/data-objects/vltava/src/fluidObjects/tabs/view.tsx similarity index 91% rename from examples/data-objects/vltava/src/components/tabs/view.tsx rename to examples/data-objects/vltava/src/fluidObjects/tabs/view.tsx index 33dde046c0f1..6505f059bb81 100644 --- a/examples/data-objects/vltava/src/components/tabs/view.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/tabs/view.tsx @@ -11,7 +11,7 @@ import { Tab, Tabs, TabList, TabPanel } from "react-tabs"; import React from "react"; -import { EmbeddedComponentWrapper } from "../library"; +import { EmbeddedFluidObjectWrapper } from "../library"; import { ITabsDataModel } from "./dataModel"; import { NewTabButton } from "./newTabButton"; @@ -62,9 +62,9 @@ export class TabsView extends React.Component { ); tabPanel.push( - this.props.dataModel.getComponentTab(compId)} + requestFluidObject={async (compId: string) => this.props.dataModel.getFluidObjectTab(compId)} /> ); }); @@ -79,7 +79,7 @@ export class TabsView extends React.Component {
  • + fluidObjects={this.props.dataModel.getNewTabTypes()} />
  • diff --git a/examples/data-objects/vltava/src/components/vltava/dataModel.ts b/examples/data-objects/vltava/src/fluidObjects/vltava/dataModel.ts similarity index 96% rename from examples/data-objects/vltava/src/components/vltava/dataModel.ts rename to examples/data-objects/vltava/src/fluidObjects/vltava/dataModel.ts index f23771651c10..51813c7b4cce 100644 --- a/examples/data-objects/vltava/src/components/vltava/dataModel.ts +++ b/examples/data-objects/vltava/src/fluidObjects/vltava/dataModel.ts @@ -25,7 +25,7 @@ export interface IVltavaLastEditedState { } export interface IVltavaDataModel extends EventEmitter { - getDefaultComponent(): Promise; + getDefaultFluidObject(): Promise; getTitle(): string; getUsers(): IVltavaUserDetails[]; getLastEditedState(): Promise; @@ -59,8 +59,8 @@ export class VltavaDataModel extends EventEmitter implements IVltavaDataModel { }); } - public async getDefaultComponent(): Promise { - return this.root.get("tabs-component-id").get(); + public async getDefaultFluidObject(): Promise { + return this.root.get("tabs-id").get(); } public getTitle(): string { diff --git a/examples/data-objects/vltava/src/components/vltava/facePile.tsx b/examples/data-objects/vltava/src/fluidObjects/vltava/facePile.tsx similarity index 100% rename from examples/data-objects/vltava/src/components/vltava/facePile.tsx rename to examples/data-objects/vltava/src/fluidObjects/vltava/facePile.tsx diff --git a/examples/data-objects/vltava/src/components/vltava/index.ts b/examples/data-objects/vltava/src/fluidObjects/vltava/index.ts similarity index 100% rename from examples/data-objects/vltava/src/components/vltava/index.ts rename to examples/data-objects/vltava/src/fluidObjects/vltava/index.ts diff --git a/examples/data-objects/vltava/src/components/vltava/lastEditedDisplay.tsx b/examples/data-objects/vltava/src/fluidObjects/vltava/lastEditedDisplay.tsx similarity index 100% rename from examples/data-objects/vltava/src/components/vltava/lastEditedDisplay.tsx rename to examples/data-objects/vltava/src/fluidObjects/vltava/lastEditedDisplay.tsx diff --git a/examples/data-objects/vltava/src/components/vltava/view.tsx b/examples/data-objects/vltava/src/fluidObjects/vltava/view.tsx similarity index 94% rename from examples/data-objects/vltava/src/components/vltava/view.tsx rename to examples/data-objects/vltava/src/fluidObjects/vltava/view.tsx index fd4f9a086b56..6a6be509f482 100644 --- a/examples/data-objects/vltava/src/components/vltava/view.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/vltava/view.tsx @@ -55,9 +55,9 @@ export class VltavaView extends React.Component, + view: , }); } diff --git a/examples/data-objects/vltava/src/components/vltava/vltava.tsx b/examples/data-objects/vltava/src/fluidObjects/vltava/vltava.tsx similarity index 91% rename from examples/data-objects/vltava/src/components/vltava/vltava.tsx rename to examples/data-objects/vltava/src/fluidObjects/vltava/vltava.tsx index 87a33d1989cd..fb0f56514ecd 100644 --- a/examples/data-objects/vltava/src/components/vltava/vltava.tsx +++ b/examples/data-objects/vltava/src/fluidObjects/vltava/vltava.tsx @@ -35,8 +35,8 @@ export class Vltava extends DataObject implements IFluidHTMLView { public get IFluidHTMLView() { return this; } protected async initializingFirstTime() { - const tabsComponent = await this.createFluidObject("tabs"); - this.root.set("tabs-component-id", tabsComponent.handle); + const tabsFluidObject = await this.createFluidObject("tabs"); + this.root.set("tabs-id", tabsFluidObject.handle); } protected async hasInitialized() { diff --git a/examples/data-objects/vltava/src/index.ts b/examples/data-objects/vltava/src/index.ts index 4142ba6040ea..827a8622a2da 100644 --- a/examples/data-objects/vltava/src/index.ts +++ b/examples/data-objects/vltava/src/index.ts @@ -24,61 +24,61 @@ import { requestFluidObject } from "@fluidframework/runtime-utils"; import { Anchor, - TabsComponent, + TabsFluidObject, Vltava, -} from "./components"; +} from "./fluidObjects"; import { - IComponentInternalRegistry, + IFluidObjectInternalRegistry, IInternalRegistryEntry, } from "./interfaces"; -export class InternalRegistry implements IFluidDataStoreRegistry, IComponentInternalRegistry { +export class InternalRegistry implements IFluidDataStoreRegistry, IFluidObjectInternalRegistry { public get IFluidDataStoreRegistry() { return this; } - public get IComponentInternalRegistry() { return this; } + public get IFluidObjectInternalRegistry() { return this; } constructor( - private readonly containerComponentArray: IInternalRegistryEntry[], + private readonly containerFluidObjectArray: IInternalRegistryEntry[], ) { } public async get(name: string): Promise> { - const index = this.containerComponentArray.findIndex( - (containerComponent) => name === containerComponent.type, + const index = this.containerFluidObjectArray.findIndex( + (containerFluidObject) => name === containerFluidObject.type, ); if (index >= 0) { - return this.containerComponentArray[index].factory; + return this.containerFluidObjectArray[index].factory; } return undefined; } public getFromCapability(capability: keyof IFluidObject): IInternalRegistryEntry[] { - return this.containerComponentArray.filter( - (componentDetails) => componentDetails.capabilities.includes(capability)); + return this.containerFluidObjectArray.filter( + (fluidObjectDetails) => fluidObjectDetails.capabilities.includes(capability)); } public hasCapability(type: string, capability: keyof IFluidObject) { - const index = this.containerComponentArray.findIndex( - (containerComponent) => type === containerComponent.type, + const index = this.containerFluidObjectArray.findIndex( + (containerFluidObject) => type === containerFluidObject.type, ); - return index >= 0 && this.containerComponentArray[index].capabilities.includes(capability); + return index >= 0 && this.containerFluidObjectArray[index].capabilities.includes(capability); } } export class VltavaRuntimeFactory extends ContainerRuntimeFactoryWithDefaultDataStore { constructor( - defaultComponentName: string, + defaultFluidObjectName: string, registryEntries: NamedFluidDataStoreRegistryEntries, ) { - super(defaultComponentName, registryEntries); + super(defaultFluidObjectName, registryEntries); } /** * {@inheritDoc BaseContainerRuntimeFactory.containerHasInitialized} */ protected async containerHasInitialized(runtime: IContainerRuntime) { - // Load the last edited tracker component (done by the setup method below). This component provides container - // level tracking of last edit and has to be loaded before any other component. + // Load the last edited tracker fluidObject (done by the setup method below). This fluidObject + // provides container level tracking of last edit and has to be loaded before any other fluidObject. const tracker = await requestFluidObject( await runtime.getRootDataStore(ContainerRuntimeFactoryWithDefaultDataStore.defaultDataStoreId), ""); @@ -88,7 +88,7 @@ export class VltavaRuntimeFactory extends ContainerRuntimeFactoryWithDefaultData } const generateFactory = () => { - const containerComponentsDefinition: IInternalRegistryEntry[] = [ + const containerFluidObjectsDefinition: IInternalRegistryEntry[] = [ { type: Anchor.getFactory().type, factory: Promise.resolve(ClickerInstantiationFactory), @@ -97,8 +97,8 @@ const generateFactory = () => { fabricIconName: "NumberField", }, { - type: TabsComponent.getFactory().type, - factory: Promise.resolve(TabsComponent.getFactory()), + type: TabsFluidObject.getFactory().type, + factory: Promise.resolve(TabsFluidObject.getFactory()), capabilities: ["IFluidHTMLView", "IFluidLoadable"], friendlyName: "Tabs", fabricIconName: "BrowserTab", @@ -126,22 +126,22 @@ const generateFactory = () => { }, ]; - const containerComponents: [string, Promise][] = []; - containerComponentsDefinition.forEach((value) => { - containerComponents.push([value.type, value.factory]); + const containerFluidObjects: [string, Promise][] = []; + containerFluidObjectsDefinition.forEach((value) => { + containerFluidObjects.push([value.type, value.factory]); }); - // TODO: You should be able to specify the default registry instead of just a list of components + // TODO: You should be able to specify the default registry instead of just a list of fluidObjects // and the default registry is already determined Issue:#1138 return new VltavaRuntimeFactory( Anchor.getFactory().type, [ - ...containerComponents, + ...containerFluidObjects, LastEditedTrackerDataObject.getFactory().registryEntry, - // We don't want to include the default wrapper component in our list of available components + // We don't want to include the default wrapper fluidObject in our list of available fluidObjects Anchor.getFactory().registryEntry, Vltava.getFactory().registryEntry, - ["", Promise.resolve(new InternalRegistry(containerComponentsDefinition))], + ["", Promise.resolve(new InternalRegistry(containerFluidObjectsDefinition))], ], ); }; diff --git a/examples/data-objects/vltava/src/interfaces/componentInternalRegistry.ts b/examples/data-objects/vltava/src/interfaces/fluidObjectInternalRegistry.ts similarity index 71% rename from examples/data-objects/vltava/src/interfaces/componentInternalRegistry.ts rename to examples/data-objects/vltava/src/interfaces/fluidObjectInternalRegistry.ts index 28a1497fd268..7b4c2e2f4fe8 100644 --- a/examples/data-objects/vltava/src/interfaces/componentInternalRegistry.ts +++ b/examples/data-objects/vltava/src/interfaces/fluidObjectInternalRegistry.ts @@ -8,19 +8,19 @@ import { IProvideFluidDataStoreFactory } from "@fluidframework/runtime-definitio declare module "@fluidframework/core-interfaces" { // eslint-disable-next-line @typescript-eslint/no-empty-interface - export interface IFluidObject extends Readonly> { } + export interface IFluidObject extends Readonly> { } } -export const IComponentInternalRegistry: keyof IProvideComponentInternalRegistry = "IComponentInternalRegistry"; +export const IFluidObjectInternalRegistry: keyof IProvideFluidObjectInternalRegistry = "IFluidObjectInternalRegistry"; -export interface IProvideComponentInternalRegistry { - readonly IComponentInternalRegistry: IComponentInternalRegistry; +export interface IProvideFluidObjectInternalRegistry { + readonly IFluidObjectInternalRegistry: IFluidObjectInternalRegistry; } /** * Provides functionality to retrieve subsets of an internal registry. */ -export interface IComponentInternalRegistry extends IProvideComponentInternalRegistry { +export interface IFluidObjectInternalRegistry extends IProvideFluidObjectInternalRegistry { getFromCapability(type: keyof (IFluidObject)): IInternalRegistryEntry[]; hasCapability(type: string, capability: keyof (IFluidObject)): boolean; } diff --git a/examples/data-objects/vltava/src/interfaces/index.ts b/examples/data-objects/vltava/src/interfaces/index.ts index 04b7e20d0631..94bb21f58968 100644 --- a/examples/data-objects/vltava/src/interfaces/index.ts +++ b/examples/data-objects/vltava/src/interfaces/index.ts @@ -3,4 +3,4 @@ * Licensed under the MIT License. */ -export * from "./componentInternalRegistry"; +export * from "./fluidObjectInternalRegistry"; diff --git a/examples/data-objects/vltava/tests/matchMaker.spec.ts b/examples/data-objects/vltava/tests/matchMaker.spec.ts deleted file mode 100644 index 40f320ef8ce9..000000000000 --- a/examples/data-objects/vltava/tests/matchMaker.spec.ts +++ /dev/null @@ -1,207 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ -/* eslint-disable @typescript-eslint/consistent-type-assertions */ - -import assert from "assert"; -import { EventEmitter } from "events"; - -import { IFluidObject } from "@fluidframework/core-interfaces"; -import { - IComponentDiscoverableInterfaces, - IComponentDiscoverInterfaces, -} from "@fluidframework/framework-interfaces"; -import { IContainerRuntime } from "@fluidframework/datastore-definitions"; - -import { MatchMaker } from "../src/containerServices"; - -class MockComponentDiscoverProvider extends EventEmitter implements IComponentDiscoverInterfaces { - public get IComponentDiscoverInterfaces() { return this; } - - public constructor( - public readonly interfacesToDiscover: (keyof IFluidObject)[], - ) { - super(); - } - - public notifyComponentsDiscovered(interfaceName: keyof IFluidObject, components: readonly IFluidObject[]) { - this.emit("discovered", interfaceName, components); - } -} - -class MockComponentDiscoverableInterfaces implements IComponentDiscoverableInterfaces { - public get IComponentDiscoverableInterfaces() { return this; } - - // Note these have to exist to hack our way through the type check assert - public get IComponentLoadable() { return this; } - public get IComponentHandle() { return this; } - - public constructor( - public readonly discoverableInterfaces: (keyof IFluidObject)[], - ) {} -} - -class MockComponentDiscoverableAndDiscoverInterfaces - extends MockComponentDiscoverProvider implements IComponentDiscoverableInterfaces -{ - public get IComponentDiscoverableInterfaces() { return this; } - - // Note these have to exist to hack our way through the type check assert - public get IComponentLoadable() { return this; } - - public constructor( - public readonly discoverableInterfaces: (keyof IFluidObject)[], - public readonly interfacesToDiscover: (keyof IFluidObject)[], - ) { - super(interfacesToDiscover); - } -} - -describe("Routerlicious", () => { - describe("Aqueduct", () => { - describe("MatchMaker", () => { - it(`MatchMaker register discoverable after discover`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - const discoverProvider = new MockComponentDiscoverProvider(["IComponentLoadable"]); - let discovered = false; - discoverProvider.on("discovered", () => { - discovered = true; - }); - - matchMaker.registerComponentInterfaces(discoverProvider); - - const discoverableProvider = new MockComponentDiscoverableInterfaces(["IComponentLoadable"]); - matchMaker.registerComponentInterfaces(discoverableProvider); - assert(discovered, "discovered"); - }); - - it(`MatchMaker register discover after discoverable`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableProvider = new MockComponentDiscoverableInterfaces(["IComponentLoadable"]); - matchMaker.registerComponentInterfaces(discoverableProvider); - - const discoverProvider = new MockComponentDiscoverProvider(["IComponentLoadable"]); - let discovered = false; - discoverProvider.on("discovered", (name, components) => { - if (components[0] === discoverableProvider) { - discovered = true; - } - }); - - matchMaker.registerComponentInterfaces(discoverProvider); - - assert(discovered, "discovered"); - }); - - it(`MatchMaker register multiple discoverable`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableProvider1 = new MockComponentDiscoverableInterfaces(["IComponentLoadable"]); - matchMaker.registerComponentInterfaces(discoverableProvider1); - - const discoverableProvider2 = new MockComponentDiscoverableInterfaces(["IComponentLoadable"]); - matchMaker.registerComponentInterfaces(discoverableProvider2); - - const discoverProvider = new MockComponentDiscoverProvider(["IComponentLoadable"]); - let discovered = 0; - discoverProvider.on("discovered", (interfaceName, components: readonly IFluidObject[]) => { - discovered = components.length; - }); - - matchMaker.registerComponentInterfaces(discoverProvider); - - assert(discovered === 2, "discovered"); - }); - - it(`MatchMaker register discover after discoverable multiple interfaces`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableProvider = - new MockComponentDiscoverableInterfaces(["IComponentLoadable", "IComponentHandle"]); - matchMaker.registerComponentInterfaces(discoverableProvider); - - const discoverProvider = new MockComponentDiscoverProvider(["IComponentLoadable", "IComponentHandle"]); - - let discoveredLoadable = false; - let discoveredHandle = false; - discoverProvider.on("discovered", (interfaceName) => { - if (interfaceName === "IComponentLoadable") { - discoveredLoadable = true; - } else if (interfaceName === "IComponentHandle") { - discoveredHandle = true; - } - }); - - matchMaker.registerComponentInterfaces(discoverProvider); - - assert(discoveredLoadable, "discovered IComponentLoadable"); - assert(discoveredHandle, "discovered IComponentHandle"); - }); - - it(`Registering interface without implementing throws`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableProvider = - new MockComponentDiscoverableInterfaces(["IComponentRegistry"]); - - assert.throws(() => matchMaker.registerComponentInterfaces(discoverableProvider), "assert thrown"); - }); - - it(`Can register for both Discover and Discoverable`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableProvider = new MockComponentDiscoverableInterfaces(["IComponentHandle"]); - matchMaker.registerComponentInterfaces(discoverableProvider); - - const discoverableAndDiscoverProvider = - new MockComponentDiscoverableAndDiscoverInterfaces( - ["IComponentLoadable"], // discoverable - ["IComponentHandle"], // discover - ); - - let discovered1 = false; - discoverableAndDiscoverProvider.on("discovered", (name, components) => { - if (name === "IComponentHandle" && components[0] === discoverableProvider) { - discovered1 = true; - } - }); - - matchMaker.registerComponentInterfaces(discoverableAndDiscoverProvider); - - const discoverProvider = new MockComponentDiscoverProvider(["IComponentLoadable"]); - let discovered2 = false; - discoverProvider.on("discovered", (name, components) => { - if (components[0] === discoverableAndDiscoverProvider) { - discovered2 = true; - } - }); - - matchMaker.registerComponentInterfaces(discoverProvider); - - assert(discovered1, "discoverableIComponentHandle"); - assert(discovered2, "discoverableIComponentLoadable"); - }); - - it(`When registering for Discover and Discoverable does not alert discover of itself`, async () => { - const matchMaker = new MatchMaker({} as IContainerRuntime); - - const discoverableAndDiscoverProvider = - new MockComponentDiscoverableAndDiscoverInterfaces( - ["IComponentLoadable"], // discoverable - ["IComponentLoadable"], // discover - ); - - let discovered = false; - discoverableAndDiscoverProvider.on("discovered", (name, components) => { - discovered = true; - }); - - matchMaker.registerComponentInterfaces(discoverableAndDiscoverProvider); - - assert(!discovered, "shouldn't be discovered"); - }); - }); - }); -});