Notes on breaking and otherwise interesting changes go here. They will be reviewed and published along with each release. Published changelogs may be found on the docs site at fluidframework.com.
There are a few steps you can take to write a good change note and avoid needing to followup for clarification.
- Provide a concise title. It should make clear what the topic of the change is.
- Ensure the affected packages are named or clearly identifiable within the body.
- Provide guidance on how the change should be consumed if applicable, such as by specifying replacement APIs.
- Consider providing code examples as part of guidance for non-trivial changes.
- Move IntervalType from merge-tree to sequence package
- Remove logger property from IContainerContext
- Set raiseContainerWarning property as optional parameter on IContainerContext
- Consolidate fluidErrorCode and message on FF Errors
Move the type from the merge-tree package where it isn't used to the sequence package where it is used
- import { IntervalType } from "@fluidframework/merge-tree";
+ import { IntervalType } from "@fluidframework/sequence";The logger property in IContainerContext became an optional parameter in release 0.56. This property has now been removed. The taggedLogger property is now set as a required parameter in IContainerContext interface.
raiseContainerWarning is set as an optional parameter on IContainerContext interface and would be removed from IContainerContext interface and ContainerContext class in the next release. Please see [#Remove-raiseContainerWarning-property] for more details.
Errors raised by the Fluid Framework will no longer contain the property fluidErrorCode.
This was present in many error constructors, and exposed in the type IFluidErrorBase, but has now been removed.
Previously, the fluidErrorCode value (a pascaleCased term) was often used as the error message itself.
Now all error messages can be expected to be easily-read sentences,
sometimes followed by a colon and an inner error message when applicable.
- IFluidConfiguration removed
- Driver error constructors' signatures have changed
- IFluidObject removed from IFluidDataStoreContext scope
- The behavior of containers' isDirty flag has changed
- Removed PureDataObject.requestFluidObject_UNSAFE
- Modified PureDataObject.getFluidObjectFromDirectory
- Remove IFluidObject from Aqueduct
- Removing snapshot API from IRuntime
- Remove Unused IFluidObject Augmentations
- Duplicate extractLogSafeErrorProperties removed
- Code proposal rejection removed
- ContainerRuntime.createDataStore return type changed
- Root datastore creation may throw an exception in case of name conflicts
The IFluidConfiguration interface and related properties were deprecated in 0.55, and have now been removed. This includes the configuration member of IContainerContext and ContainerContext.
All error classes defined in @fluidframework/driver-utils now require the props parameter in their constructors,
and props must include the property driverVersion: string | undefined (via type DriverErrorTelemetryProps).
Same for helper functions that return new error objects.
Additionally, createGenericNetworkError's signature was refactored to combine canRetry and retryAfterMs into a single
required parameter retryInfo.
IFluidObject is deprecated and being replaced with FluidObject. IFluidObject is now removed from IFluidDataStoreContext's scope:
- readonly scope: IFluidObject & FluidObject;
+ readonly scope: FluidObject;Additionally, the following deprecated fields have been removed from IFluidObject:
- IFluidDataStoreFactory
- IFluidDataStoreRegistry
Use FluidObject instead.
Container is now considered dirty if it's not attached or it is attached but has pending ops. Check https://fluidframework.com/docs/build/containers/#isdirty for further details.
The requestFluidObject_UNSAFE is removed from the PureDataObject. If you still need to fallback on URIs, use handleFromLegacyUri. We are making this change to encourage retreiving shared objects via handles only.
Going forward, getFluidObjectFromDirectory will not return FluidObject if you have have used to store uri string for a given key. If you still need to fallback on URIs, use handleFromLegacyUri. Also, getFluidObjectFromDirectory now expects callback that is only returning IFluidHandle or undefined. Returnig uri/id (string) is not supported as we want to encourage retreiving shared objects via handles only.
IFluidObject is deprecated. In this release we have removed all IFluidObject from the aqueduct package. This impacts the following public apis:
- getDefaultObjectFromContainer
- getObjectWithIdFromContainer
- getObjectFromContainer
- PureDataObject.getFluidObjectFromDirectory
- ContainerServiceRegistryEntries
- SingletonContainerServiceFactory.getService
In general the impact of these changes should be transparent. If you see compile errors related to Fluid object provider types with the above apis, you should transition those usages to FluidObject which is the replacement for the deprecated IFluidObject.
Snapshot API has been removed from IRuntime. Replay tools and snapshot tests are now using summarize API.
The following deprecated provider properties are no longer exposed off of IFluidObject
- IFluidMountableView
- IAgentScheduler
- IContainerRuntime
- ISummarizer
The interfaces that correspond to the above properties continue to exist, and can use directly, or with the IFluidObject replacement FluidObject
The helper function extractLogSafeErrorProperties existed in both telemetry-utils and common-utils packages.
The copy in common-utils was out of date and unused in this repo, and has now been removed.
Rejection functionality has been removed from Quorum. As a result, the "codeDetailsProposed" event on IContainer now provides an ISequencedProposal rather than an IPendingProposal.
ContainerRuntime.createDataStore will now return an an IDataStore instead of an IFluidRouter. This change does not break the interface contract, as the former inherits the latter, however the concrete object will be a DataStore instance, which does not inherit IFluidDataStoreChannel as before.
When creating root datastores using ContainerRuntime.createRootDataStore or ContainerRuntime._createDataStoreWithProps, in case of a name conflict (when attempting to create a root datastore with a name which already exists in the document), an exception of type GenericError may be thrown from the function.
MessageType.Saveand code that handled it was removed- Removed
IOdspResolvedUrl.sharingLinkToRedeem - Removed url from ICreateBlobResponse
readonlyremoved fromIDeltaManager,DeltaManager, andDeltaManagerProxy(Synthesize-Decoupled-from-IFluidObject-and-Deprecations-Removed)- codeDetails removed from Container
- wait() methods removed from map and directory
- Removed containerPath from DriverPreCheckInfo
- Removed SharedObject.is
- Removed IContainerContext.id
- Remove raiseContainerWarning property
- Set logger property as optional parameter in IContainerContext
The Save operation type was deprecated and has now been removed. This removes MessageType.Save from protocol-definitions, save;${string}: ${string} from SummarizeReason in the container-runtime package, and MessageFactory.createSave() from and server-test-utils.
The sharingLinkToRedeem property is removed from the IOdspResolvedUrl interface. The property can be accesed from IOdspResolvedUrl.shareLinkInfo instead.
The unused url property of ICreateBlobResponse in @fluidframework/protocol-definitions has been removed
The readonly property was deprecated and has now been removed from IDeltaManager from container-definitions. Additionally, readonly has been removed from the implementations in DeltaManager and DeltaManagerProxy from container-loader. To replace its functionality, use readOnlyInfo.readonly instead.
DependencyContainer now takes a generic argument, as it is no longer directly couple to IFluidObject. The ideal pattern here would be directly pass the provider or FluidObject interfaces you will register. As a short term solution you could also pass IFluidObject, but IFluidObject is deprecated, so will need to be removed if used here. Examples:
// the old way
const dc = new DependencyContainer();
dc.register(IFluidHTMLView, MockLoadable());
// FluidObject option
const dc = new DependencyContainer<FluidObject<IFluidHTMLView>>();
dc.register(IFluidHTMLView, MockLoadable());
// Provider option
const dc = new DependencyContainer<IProvideFluidHTMLView>();
dc.register(IFluidHTMLView, MockLoadable());
// Short term IFluidObject option
const dc = new DependencyContainer<IFluidObject>();
dc.register(IFluidHTMLView, MockLoadable());The following members have been removed from IFluidDependencySynthesizer:
- registeredTypes - unused and no longer supported.
hascan replace most possible usages - register - create new DependencyContainer and add existing as parent
- unregister - create new DependencyContainer and add existing as parent
- getProvider - use
hasandsynthesizeto check or get provider respectively
The following types have been removed or changed. These changes should only affect direct usages which should be rare. Existing synthesizer api usage is backwards compatible:
- FluidObjectKey - removed as IFluidObject is deprecated
- NonNullableFluidObject - removed as IFluidObject is deprecated. use typescripts NonNullable instead
- AsyncRequiredFluidObjectProvider - Takes FluidObject types rather than keys
- AsyncOptionalFluidObjectProvider - Takes FluidObject types rather than keys
- AsyncFluidObjectProvider - Takes FluidObject types rather than keys
- FluidObjectProvider - Takes FluidObject types rather than keys
- ProviderEntry - no longer used
- DependencyContainerRegistry - no longer used
In release 0.53, the codeDetails member was removed from IContainer. It is now also removed from Container. To inspect the code details of a container, instead use the getSpecifiedCodeDetails() and getLoadedCodeDetails() methods.
The wait() methods on ISharedMap and IDirectory were deprecated in 0.55 and have now been removed. See the deprecation notice for migration advice if you currently use these APIs.
The containerPath property of DriverPreCheckInfo was deprecated and has now been removed. To replace its functionality, use Loader.request().
The is method is removed from SharedObject. This was being used to detect SharedObjects stored inside other SharedObjects (and then binding them), which should not be happening anymore. Instead, use handles to SharedObjects.
The id property of IContainerContext was deprecated and now removed. The id property of ContainerContext was deprecated and now removed. id should not be exposed at
runtime level anymore. Instead, get from container's resolvedURL if necessary.
The raiseContainerWarning property is removed from the following interfaces in release 0.56:
IContainerRuntimeIFluidDataStoreContextIFluidDataStoreRuntime
This property was also deprecated in IContainerContext and will be removed in a future release. Application developers should generate their own telemetry/logging events.
The logger property from IContainerContext is now optional. It will be removed completely in a future release. Use taggedLogger instead. Loggers passed to ContainerContext will need to support tagged events.
SharedObjectsummary and GC API changesIChannel.summarizesplit into sync and asyncIFluidSerializermoved to shared-object-base- Removed
IFluidSerializerfromIFluidDataStoreRuntime IFluidConfigurationdeprecated andIFluidConfigurationmember removed fromContainerRuntimewait()methods deprecated on map and directory- Remove Legacy Data Object and Factories
- Removed
innerRequestHandler - Aqueduct and IFluidDependencySynthesizer changes
The getQuorum() method on IContainer and the quorum member of IContainerContext return an IQuorumClients rather than an IQuorum. See the prior breaking change notice announcing this change for recommendations on migration.
SharedObject.snapshotCore is renamed to summarizeCore and returns ISummaryTreeWithStats. Use
SummaryTreeBuilder to create a summary instead of ITree.
SharedObject.getGCDataCore is renamed to processGCDataCore and a SummarySerializer is passed as a parameter. The method should run the serializer over the handles as before and does not need to return anything. The caller will extract the GC data from the serializer.
IChannel now has two summarization methods instead of a single synchronous summarize. getAttachSummary is synchronous to prevent channel modifications during summarization, summarize is asynchronous.
IFluidSerializer has moved packages from core-interfaces to shared-object-base. replaceHandles method is renamed to encode. decode method is now required. IFluidSerializer in core-interfaces is now deprecated and will be removed in a future release.
IFluidSerializer in IFluidDataStoreRuntime was deprecated in version 0.53 and is now removed.
The IFluidConfiguration interface from @fluidframework/core-interfaces has been deprecated and will be removed in an upcoming release. This will include removal of the configuration member of the IContainerContext from @fluidframework/container-definitions and ContainerContext from @fluidframework/container-loader at that time. To inspect whether the document is in readonly state, you should instead query container.readOnlyInfo.readonly.
The IFluidConfiguration member of ContainerRuntime from @fluidframework/container-runtime has also been removed.
The wait() methods on ISharedMap and IDirectory have been deprecated and will be removed in an upcoming release. To wait for a change to a key, you can replicate this functionality with a helper function that listens to the change events.
const directoryWait = async <T = any>(directory: IDirectory, key: string): Promise<T> => {
const maybeValue = directory.get<T>(key);
if (maybeValue !== undefined) {
return maybeValue;
}
return new Promise((resolve) => {
const handler = (changed: IValueChanged) => {
if (changed.key === key) {
directory.off("containedValueChanged", handler);
const value = directory.get<T>(changed.key);
if (value === undefined) {
throw new Error("Unexpected containedValueChanged result");
}
resolve(value);
}
};
directory.on("containedValueChanged", handler);
});
};
const foo = await directoryWait<Foo>(this.root, fooKey);
const mapWait = async <T = any>(map: ISharedMap, key: string): Promise<T> => {
const maybeValue = map.get<T>(key);
if (maybeValue !== undefined) {
return maybeValue;
}
return new Promise((resolve) => {
const handler = (changed: IValueChanged) => {
if (changed.key === key) {
map.off("valueChanged", handler);
const value = map.get<T>(changed.key);
if (value === undefined) {
throw new Error("Unexpected valueChanged result");
}
resolve(value);
}
};
map.on("valueChanged", handler);
});
};
const bar = await mapWait<Bar>(someSharedMap, barKey);As-written above, these promises will silently remain pending forever if the key is never set (similar to current wait() functionality). For production use, consider adding timeouts, telemetry, or other failure flow support to detect and handle failure cases appropriately.
In order to ease migration to the new Aqueduct Data Object and Data Object Factory generic arguments we added legacy versions of those classes in version 0.53.
In this release we remove those legacy classes: LegacyDataObject, LegacyPureDataObject, LegacyDataObjectFactory, and LegacyPureDataObjectFactory
It is recommend you migrate to the new generic arguments before consuming this release. Details are here: 0.53: Generic Argument Changes to DataObjects and Factories
innerRequestHandler is removed from @fluidframework/request-handlers package, and its usage is removed from BaseContainerRuntimeFactory and ContainerRuntimeFactoryWithDefaultDataStore. If you are using these container runtime factories, attempting to access internal data stores via request() will result in 404 responses.
If you rely on request() access to internal root data stores, you can add rootDataStoreRequestHandler to your list of request handlers on the runtime factory.
It is not recommended to provide request() access to non-root data stores, but if you currently rely on this functionality you can add a custom request handler that calls runtime.IFluidHandleContext.resolveHandle(request) just like innerRequestHandler used to do.
The type DependencyContainerRegistry is now deprecated and no longer used. In it's place the DependencyContainer class should be used instead.
The following classes in Aqueduct have been changed to no longer take DependencyContainerRegistry and to use DependencyContainer instead: BaseContainerRuntimeFactory, and ContainerRuntimeFactoryWithDefaultDataStore
In both cases, the third parameter to the constructor has been changed from providerEntries: DependencyContainerRegistry = [] to dependencyContainer?: IFluidDependencySynthesizer. If you were previously passing an emptry array, [] you should now pass undefined. If you were passing in something besides an empty array, you will instead create new DependencyContainer and register your types, and then pass that, rather than the type directly:
+const dependencyContainer = new DependencyContainer();
+dependencyContainer.register(IFluidUserInformation,async (dc) => userInfoFactory(dc));
export const fluidExport = new ContainerRuntimeFactoryWithDefaultDataStore(
Pond.getFactory(),
new Map([
Pond.getFactory().registryEntry,
]),
- [
- {
- type: IFluidUserInformation,
- provider: async (dc) => userInfoFactory(dc),
- },
- ]);
+ dependencyContainer);- Removed
readAndParseFromBlobsfromdriver-utils - Loader now returns
IContainerinstead ofContainer getQuorum()returnsIQuorumClientsfrom within the containerSharedNumberSequenceandSharedObjectSequencedeprecatedIContainerinterface updated to complete 0.53 changes
The readAndParseFromBlobs function from driver-utils was deprecated in 0.44, and has now been removed from the driver-utils package.
The following public API functions on Loader, from "@fluidframework/container-loader" package, now return IContainer:
createDetachedContainerrehydrateDetachedContainerFromSnapshotresolve
All of the required functionality from a Container instance should be available on IContainer. If the function or property you require is not available, please file an issue on GitHub describing which function and what you are planning on using it for. They can still be used by casting the returned object to Container, i.e. const container = await loader.resolve(request) as Container;, however, this should be avoided whenever possible and the IContainer API should be used instead.
The getQuorum() method on IContainerRuntimeBase, IFluidDataStoreContext, and IFluidDataStoreRuntime now returns an IQuorumClients rather than an IQuorum. IQuorumClients retains the ability to inspect the clients connected to the collaboration session, but removes the ability to access the quorum proposals. It is not recommended to access the quorum proposals directly.
A future change will similarly convert calls to getQuorum() on IContainer and IContainerContext to return an IQuorumClients. If you need to access the code details on the IContainer, you should use the getSpecifiedCodeDetails() API instead. If you are currently accessing the code details on the IContainerContext, a temporary getSpecifiedCodeDetails() method is exposed there as well to aid in migration. However, accessing the code details from the container context is not recommended and this migratory API will be removed in an upcoming release. It is instead recommended to only inspect code details in the code loader while loading code, or on IContainer as part of code upgrade scenarios (i.e. when calling IContainer's proposeCodeDetails()). Other uses are not supported.
The SharedNumberSequence and SharedObjectSequence have been deprecated and are not recommended for use. To discuss future plans to support scenarios involving sequences of objects, please see Github issue 8526.
Additionally, useSyncedArray() from @fluid-experimental/react has been removed, as it depended on the SharedObjectArray.
The breaking changes introduced in IContainer interface updated to expose actively used Container public APIs have now been completed in 0.54. The following additions to the IContainer interface are no longer optional but rather mandatory:
connectionStateconnectedaudiencereadOnlyInfo
The following "alpha" APIs are still optional:
setAutoReconnect()(alpha)resume()(alpha)clientId(alpha)forceReadonly()(alpha)
The deprecated codeDetails API, which was marked as optional on the last release, has now been removed.
IContainerinterface updated to expose actively usedContainerpublic APIs- Remove
getLegacyInterval()anddelete()from sequence dds - readOnly and readOnlyPermissions removed from Container
- Generic Argument Changes to DataObjects and Factories
- Remove
loaderproperty fromMockFluidDataStoreContextclass - maxMessageSize removed from IConnectionDetails and IDocumentDeltaConnection
- Remove
IntervalCollection.getView()from sequence dds - Moved
ICodeDetailsLoaderandIFluidModuleWithDetailsinterface to@fluidframework/container-definitions - Removed
errorMessageproperty fromISummaryNackinterface - ISequencedDocumentMessage arg removed from SharedMap and SharedDirectory events
- Moved
@fluidframework/core-interface#fluidPackage.tsto@fluidframework/container-definition#fluidPackage.ts - Deprecated
IFluidSerializerinIFluidDataStoreRuntime - Errors thrown to DDS event handlers
In order to have the IContainer interface be the active developer surface that is used when interacting with a Container instance, it has been updated to expose the APIs that are necessary for currently used behavior. The motivation here is to move away from using the Container class when only its type is required, and to use the IContainer interface instead.
The following values have been added (NOTE: some of these are marked with an @alpha tag and may be replaced in the future with a breaking change as the IContainer interface is finalized):
connectionStateconnectedsetAutoReconnect()(alpha)resume()(alpha)audienceclientId(alpha)readOnlyInfoforceReadonly()(alpha)
Additionally, codeDetails which was already deprecated before is now marked as optional and ready for removal after the next release.
getLegacyInterval() was only being used by the deprecated IntervalCollection.delete(). The alternative to IntervalCollection.delete() is IntervalCollection.removeIntervalById().
The readOnly and readOnlyPermissions properties from Container in container-loader was deprecated in 0.35, and has now been removed. To replace its functionality, use readOnlyInfo by accessing readOnlyInfo.readonly and readOnlyInfo.permissions respectively.
DataObject and PureDataObject used to take 3 generic type parameters. This has been collasped to a single generic argument. This new format takes the same types, but allows for easier exclusion or inclusion of specific types, while also being more readable.
In general the existing data object generic parameters map to the new generic parameter as follow:
DataObject<O,S,E> maps to DataObject<{OptionalProviders: O, InitialState: S, Events: E}>
We would frequently see default values for generic paramaters, in order to set a following parameter. This is no longer necessary. If you see a generic parameter with a type of {}, undefined, object, unknown, any, IEvent, or IFluidObject is not needed, and can now be excluded.
Here are some examples:
DataObject<{}, any, IEvent>becomesDataObjectDataObject<IFluidUserInformation>becomesDataObject<{OptionalProviders: IFluidUserInformation}>DataObject<{}, RootDataObjectProps>becomesDataObject<{InitialState: RootDataObjectProps}>DataObject<object, undefined, IClickerEvents>becomesDataObject<{Events: IClickerEvents}>
Very similar changes have been made to DataObjectFactory and PureDataObjectFactory. Rather than 4 generic arguments it is reduced to 2. The first is still the same, and is the DataObject, the second is the same type the DataObject itself takes. However, this detail should not be important, as will this change has come improved type inference, so it should no longer be necessary to set any generic arguments on the factory.
here are some examples:
new DataObjectFactory<SpacesStorage, undefined, undefined, IEvent>becomesnew DataObjectFactoryDataObjectFactory<MockComponentFooProvider, object, undefined>becomesDataObjectFactory<MockComponentFooProvider>
Above I've used DataObject, and DataObjectFactory however the same changes apply to PureDataObject and PureDataObjectFactory.
To ease transition we've also added LegacyDataObject, LegacyPureDataObject, LegacyDataObjectFactory, and LegacyPureDataObjectFactory. These types have the same generic parameters as the types before this change, and can be used as a drop in replacement, but please move away from these types asap, as they will be removed in a following release.
The loader property from MockFluidDataStoreContext class was deprecated in release 0.37 and is now removed. Refer the following deprecation warning: Loader in data stores deprecated
The maxMessageSize property from IConnectionDetails and IDocumentDeltaConnection was deprecated in 0.51, and has now been removed from the container-definitions and driver-definitions packages respectively. To replace its functionality, use serviceConfiguration.maxMessageSize.
The IntervalCollection.getView() was removed. If you were calling this API, you should instead refer to the IntervalCollection itself directly in places where you were using the view.
Moved ICodeDetailsLoader and IFluidModuleWithDetails interface to @fluidframework/container-definitions
The ICodeDetailsLoader and IFluidModuleWithDetails interface are deprecated in @fluidframework/container-loader and moved to @fluidframework/container-definitions. The ICodeDetailsLoader interface should be imported from @fluidframework/container-definition package. The ICodeDetailsLoader and IFluidModuleWithDetails from @fluidframework/container-loader will be removed from @fluidframework/container-loader in further releases.
The errorMessage property from the ISummaryNack interface was deprecated in 0.43, and has now been removed from the protocol-definitions package. To replace its functionality, use the message property.
The ISequencedDocumentMessage argument in events emitted from SharedMap and SharedDirectory (the "valueChanged" and "clear" events) has been removed. It is not recommended to access the protocol layer directly. Note that if you were leveraging the this argument of these events, you will need to update your event listeners due to the arity change.
Moved @fluidframework/core-interface#fluidPackage.ts to @fluidframework/container-definition#fluidPackage.ts
Moved the following interfaces and const from @fluidframework/core-interface to @fluidframework/container-definitions:
IFluidPackageEnvironmentIFluidPackageisFluidPackageIFluidCodeDetailsConfigIFluidCodeDetailsConfigIFluidCodeDetailsIFluidCodeDetailsComparerIProvideFluidCodeDetailsComparerIFluidCodeDetailsComparer
They are deprecated from @fluidframework/core-interface and would be removed in future release. Please import them from @fluidframework/container-definitions.
IFluidSerializer should only be used by DDSs to serialize data and they should use the one created by SharedObject.
Before this release, exceptions thrown from DDS event handlers resulted in Fluid Framework reporting non-error telemetry event and moving forward as if nothing happened. Starting with this release, such exceptions will result in critical error, i.e. container will be closed with such error and hosting app will be notified via Container's "closed" event. This will either happen immediately (if exception was thrown while processing remote op), or on later usage (if exception was thrown on local change). DDS will go into "broken" state and will keep throwing error on amy attempt to make local changes. This process is supposed to be a catch-call case for cases where listeners did not do due diligence or have no better way to handle their errors. If possible, it's recommended for DDS event listeners to not throw exceptions, but rather handle them appropriately without involving DDS itself. The purpose of this change to ensure that data model stays always synchronized with data projection that event listeners are building. If event listener is not able to fully / correctly process change event, that likely means data synchronization is broken and it's not safe to continue (and potentially, corrupt document).
- chaincodePackage removed from Container
OdspDocumentInfotype replaced withOdspFluidDataStoreLocatorinterface- close() removed from IDocumentDeltaConnection
- Replace
createCreateNewRequestfunction withcreateOdspCreateContainerRequestfunction - Deprecate IFluidObject and introduce FluidObject
The chaincodePackage property on Container was deprecated in 0.28, and has now been removed. Two new APIs have been added to replace its functionality, getSpecifiedCodeDetails() and getLoadedCodeDetails(). Use getSpecifiedCodeDetails() to get the code details currently specified for the Container, or getLoadedCodeDetails() to get the code details that were used to load the Container.
The OdspDocumentInfo type is removed from odsp-driver package. It is removed from packages\drivers\odsp-driver\src\contractsPublic.ts and replaced with OdspFluidDataStoreLocator interface as parameter in OdspDriverUrlResolverForShareLink.createDocumentUrl(). If there are any instances of OdspDocumentInfo type used, it can be simply replaced with OdspFluidDataStoreLocator interface.
The createCreateNewRequest() is removed and replaced with createOdspCreateContainerRequest() in the odsp-driver package. If any instances of createCreateNewRequest() are used, replace them with createOdspCreateContainerRequest() by importing it from @fluidframework/odsp-driver package.
This release deprecates the interface IFluidObject and introduces the utility type FluidObject. The primary reason for this change is that the module augmentation used by IFluidObject creates excessive type coupling where a small breaking change in any type exposed off IFluidObject can lead to type error in all usages of IFluidObject.
On investigation we also found that the uber type IFluidObject wasn't genenerally necessary, as consumers generally only used a small number of specific types that they knew in advance.
Given these points, we've introduced FluidObject. FluidObject is a utility type that is used in both its generic and non-generic forms.
The non-generic FluidObject is returned or taken in cases where the specific functionally isn't known, or is different based on scenario. You'll see this usage for things like scope and the request pattern.
The non-generic FluidObject is a hint that the generic form of FluidObject should be used to inspect it. For example
const provider: FluidObject<IFluidHTMLView> = requestFluidObject(container, "/");
if(provider.IFluidHTMLView !== undefined){
provider.IFluidHTMLView.render(div)
}If you want to inspect for multiple interfaces via FluidObject, you can use an intersection:
const provider: FluidObject<IFluidHTMLView & IFluidMountableView> = requestFluidObject(container, "/");Please begin reducing the usage of IFluidObject and moving to FluidObject. If you find any cases that FluidObject doesn't support please file an issue.
maxMessageSizeproperty has been deprecated from IConnectionDetails and IDocumentDeltaConnection- _createDataStoreWithProps and IFluidDataStoreChannel
- Deprecated
Loader._createis removed - Stop exporting internal class
CollabWindowTracker - base-host package removed
- Registers removed from sequence and merge-tree
- Token fetch errors have proper errorType
maxMessageSize is redundant and will be removed soon. Please use the serviceConfiguration.maxMessageSize property instead.
ContainerRuntime._createDataStoreWithProps() is made consistent with the rest of API (same API on IContainerRuntimeBase interface, all other create methods to create data store) and returns now only IFluidRouter. IFluidDataStoreChannel is internal communication mechanism between ContainerRuntime and data stores and should be used only for this purpose, by data store authors. It is not a public interface that should be exposed by data stores. While casting IFluidRouter objects returned by various data store creation APIs to IFluidDataStoreChannel would continue to work in this release, this is not supported and will be taken away in next releases due to upcoming work in GC & named component creation space.
Removing API Loader._create from @fluidframework/container-loader, which was an interim replacement of the Loader constructor API change in version 0.28.
Use the Loader constructor with the ILoaderProps instead.
CollabWindowTracker is an internal implementation for @fluidframework/container-loader and should never been exported.
The @fluidframework/base-host package has been removed. See the quick-start guide for recommended hosting practices.
If you were using the UpgradeManager utility from this package, external access to Quorum proposals is planned to be deprecated and so this is no longer recommended. To upgrade code, instead use the Container API proposeCodeDetails.
The @fluidframework/sequence and @fluidframework/merge-tree packages provided cut/copy/paste functionalities that built on a register concept. These functionalities were never fully implemented and have been removed.
If the tokenFetcher provided by the host thrown an error, this error will be propagated through the code with errorType "fetchTokenError". Previously, the errorType was either empty, or recently and incorrectly, "dataProcessingError".
- OpProcessingController removed
- Expose isDirty flag in the FluidContainer
- get-container API changed
- SharedCell serialization
- Expose saved and dirty events in FluidContainer
- Deprecated bindToContext in IFluidDataStoreChannel
OpProcessingController has been deprecated for very long time. It's being removed in this release. Please use LoaderContainerTracker instead (see microsoft#7784 as an example of changes required) If you can't make this transition, you can always copy implementation of LoaderContainerTracker to your repo and maintain it. That said, it has bugs and tests using it are easily broken but subtle changes in reconnection logic, as evident from PRs #7753, #7393)
The isDirty flag is exposed onto the FluidContainer. The property is already exposed on the Container and it is just piped up to the FluidContainer.
The signature of methods getTinyliciousContainer and getFRSContainer exported from the get-container package has been changed to accomodate the new container create flow. Both methods now return a tuple of the container instance and container ID associated with it. The documentId parameter is ignored when a new container is requested. Client applications need to use the ID returned by the API.
The get-container API is widely used in multiple sample applications across the repository. All samples were refactored to reflect the change in the API. External samples consuming these methods should be updated accordingly.
SharedCell serialization format has changed. Values stored from previous versions will be broken.
The saved and dirty container events are exposed onto the FluidContainer. The events are emitted on the Container already.
bindToContext in IFluidDataStoreChannel has been deprecated. This should not be used to explicitly bind data stores. Root data stores will automatically be bound to container. Non-root data stores will be bound when their handles are stored in an already bound DDS.
- Deprecated dirty document events and property removed from ContainerRuntime
- Removed deltaManager.ts from @fluidframework/container-loader export
- Container class protected function resumeInternal made private
- url removed from ICreateBlobResponsee
- encoding type change
The isDocumentDirty() method, "dirtyDocument" and "savedDocument" events that were deprecated in 0.35 have now been removed. For more information on replacements, see DirtyDocument events and property.
The DeltaManager class, the IConnectionArgs interface, the IDeltaManagerInternalEvents interface, and the ReconnectedMode enum have been removed from @fluidframework/container-loader package exports. Instead of DeltaManager, IDeltaManager should be used where appropriate.
The protected function resumeInternal under the class Container has been made private.
The unused url property of ICreateBlobResponse in @fluidframework/protocol-definitions has been removed
The encoding property of IBlob in @fluidframework/protocol-definitions has changed type from string to "utf-8" | "base64" to match the only supported values.
- client-api package removed
- SignalManager removed from fluid-framework export
- MockLogger removed from @fluidframework/test-runtime-utils
The @fluid-internal/client-api package was deprecated in 0.20 and has now been removed. Usage of this package should be replaced with direct usage of the Loader, FluidDataStoreRuntime, ContainerRuntime, and other supported functionality.
The SignalManager and Signaler classes have been removed from the @fluid-framework/fluid-static and fluid-framework package exports and moved to the @fluid-experimental/data-objects package. This is because of its experimental state and the intentional omission of experimental features from fluid-framework. Users should instead import the classes from the @fluid-experimental/data-objects package.
MockLogger is only used internally, so it's removed from @fluidframework/test-runtime-utils.
- Property removed from IFluidDataStoreContext
- Changes to IFluidDataStoreFactory
- FlushMode enum values renamed
- name removed from ContainerSchema
- Anonymous return types for container calls in client packages
- createContainer and getContainer response objects properties renamed
- tinylicious and azure clients createContainer now detached
- container id is returned from new attach() and not exposed on the container
- AzureClient initialization as a singular config
- the
existingproperty fromIFluidDataStoreContext(andFluidDataStoreContext) has been removed.
- The
existingparameter from theinstantiateDataStorefunction is now mandatory to differentiate creating vs loading.
FlushMode enum values from @fluidframework/runtime-definitions have ben renamed as following:
FlushMode.ManualtoFlushMode.TurnBasedFlushMode.AutomatictoFlushMode.Immediate
The name property on the ContainerSchema was used for multi-container scenarios but has not materialized to be a useful schema property. The feedback has been negative to neutral so it is being removed before it becomes formalized. Support for multi-container scenarios, if any is required, will be addressed as a future change.
createContainer and getContainer in @fluidframework/azure-client and @fluidframework/tinylicious-client will no longer return typed objects but instead will return an anonymous type. This provide the flexibility that comes with tuple deconstruction with the strong typing of property names.
// `@fluidframework/azure-client`
createContainer(containerSchema: ContainerSchema): Promise<{
container: FluidContainer;
services: AzureContainerServices;
}>;
getContainer(id: string, containerSchema: ContainerSchema): Promise<{
container: FluidContainer;
services: AzureContainerServices;
}>;
// `@fluidframework/tinylicious-client`
createContainer(containerSchema: ContainerSchema): Promise<{
container: FluidContainer;
services: TinyliciousContainerServices;
}>;
getContainer(id: string, containerSchema: ContainerSchema): Promise<{
container: FluidContainer;
services: TinyliciousContainerServices;
}>;For all *-client packages createContainer and getContainer would return an object with fluidContainer and containerServices. These have been renamed to the following for brevity.
- fluidContainer => container
- containerServices => services
// old
const { fluidContainer, containerServices } = client.getContainer(...);
// new
const { container, services } = client.getContainer(...);Creating a new container now requires and explicit attach step. All changes made in between container creation, and attaching, will be persisted as part of creation and guaranteed to always be available to users. This allows developers to initialize initialObjects with state before the container is connected to the service. It also enables draft creation modes.
// old
const { fluidContainer } = client.createContainer(...);
// new
const { container } = client.createContainer(...);
const id = container.attach();Because we now have an explicit attach flow, the container id is part of that flow as well. The id is returned from the attach() call.
// old
const { fluidContainer } = client.createContainer(...);
const containerId = fluidContainer.id;
// new
const { container } = client.createContainer(...);
const containerId = container.attach();AzureClient now takes a singular config instead of multiple parameters. This enables easier scaling of config properties as we introduce new functionality.
// old
const connectionConfig = {...};
const logger = new MyLogger();
const client = new AzureClient(connectionConfig, logger);
// new
const config = {
connection: {...},
logger: new MyLogger(...)
}
const client = new AzureClient(config);- @fluid-experimental/fluid-framework package name changed
- FrsClient has been renamed to AzureClient and moved out of experimental state
- documentId removed from IFluidDataStoreRuntime and IFluidDataStoreContext
- @fluid-experimental/tinylicious-client package name changed
- @fluid-experimental/fluid-static package name changed
- TinyliciousClient and AzureClient container API changed
The @fluid-experimental/fluid-framework package has been renamed to now be fluid-framework. The scope has been removed.
The @fluid-experimental/frs-client package for connecting with the Azure Fluid Relay service has been renamed to now be @fluidframework/azure-client. This also comes with the following name changes for the exported classes and interfaces from the package:
FrsClient->AzureClientFrsAudience->AzureAudienceIFrsAudience->IAzureAudienceFrsMember->AzureMemberFrsConnectionConfig->AzureConnectionConfigFrsContainerConfig->AzureContainerConfigFrsResources->AzureResourcesFrsAzFunctionTokenProvider->AzureFunctionTokenProviderFrsUrlResolver->AzureUrlResolver
documentIdproperty is removed from IFluidDataStoreRuntime and IFluidDataStoreContext. It is a document level concept and is no longer exposed from data store level.
The @fluid-experimental/tinylicious-client package has been renamed to now be @fluidframework/tinylicious-client.
The @fluid-experimental/fluid-static package has been renamed to now be @fluidframework/fluid-static.
Tinylicious and Azure client API changed to comply with the new container creation flow. From now on,
the new container ID will be generated by the framework. In addition to that, the AzureContainerConfig
parameter's got decommissioned and the logger's moved to the client's constructor.
// Create a client using connection settings and an optional logger
const client = new AzureClient(connectionConfig, logger);
// Create a new container
const { fluidContainer, containerServices } = await client.createContainer(containerSchema);
// Retrieve the new container ID
const containerId = fluidContainer.id;
// Access the existing container
const { fluidContainer, containerServices }= await client.getContainer(containerId, containerSchema);- Changes to local testing in insecure environments and associated bundle size increase
- Property removed from IFluidDataStoreRuntime
- Changes to client-api Document
- Changes to PureDataObject
- Changes to DataObject
- Changes to PureDataObjectFactory
- webpack-fluid-loader package name changed
- Loggers without tag support now deprecated in ContainerContext
- Creating new containers with Container.load is no longer supported
- getHashedDocumentId is now async
Previously the @fluidframework/common-utils package exposed a setInsecureContextHashFn function so users could set an override when testing locally in insecure environments because the crypto.subtle library is not available. This is now done automatically as a fallback and the function is removed. The fallback exists as a dynamic import of our equivalent Node platform implementation, and will show as a chunk named "FluidFramework-HashFallback" and be up to ~25KB parsed in size. It will not be served when running normally in a modern browser.
- the
existingproperty fromIFluidDataStoreRuntime(andFluidDataStoreRuntime) has been removed. There is no need for this property in the class, as the flag can be supplied as a parameter toFluidDataStoreRuntime.loador to the constructor ofFluidDataStoreRuntime. TheIFluidDataStoreFactory.instantiateDataStorefunction has anexistingparameter which can be supplied to theFluidDataStoreRuntimewhen the latter is created.
- The
existingproperty from theDocumentclass in@fluid-internal/client-apihas been removed. It can be assumed that the property would have always beentrue.
- The
initializeInternaland thefinishInitializationfunctions have a mandatoryexistingparameter to differentiate creating vs loading.
- The
initializeInternalfunction has a mandatoryexistingparameter to differentiate creating vs loading.
- The
createDataObjectinPureDataObjectFactoryhas a mandatoryexistingparameter to differentiate creating vs loading.
The webpack-fluid-loader utility was previously available from a package named @fluidframework/webpack-fluid-loader. However, since it is a tool and should not be used in production, it is now available under the tools scope @fluid-tools/webpack-fluid-loader.
The logger property of ContainerContext has been marked deprecated. Loggers passed to ContainerContext will need to support tagged events.
- See Creating new containers with Container.load has been deprecated
- The
createOnLoadflag to insideIContainerLoadOptionshas been removed. LegacyCreateOnLoadEnvironmentKeyfrom@fluidframework/container-loaderhas been removed.
@fluidframework/odsp-driver's getHashedDocumentId function is now async to take advantage of shared hashing functionality. It drops its dependency on the sha.js package as a result, which contributed ~37KB to the parsed size of the odsp-driver bundle.
- Property removed from ContainerRuntime class
- attach() should only be called once
- Loader access in data stores is removed
- the
existingproperty fromContainerRuntimehas been removed. Inspecting this property in order to decide whether or not to perform initialization operations should be replaced with extending theRuntimeFactoryHelperabstract class from@fluidframework/runtime-utilsand overridinginstantiateFirstTimeandinstantiateFromExisting. Alternatively, any class implementingIRuntimeFactorycan supply anexistingparameter to theinstantiateRuntimemethod.
Container.attach() will now throw if called more than once. Once called, it is responsible for retrying on retriable errors or closing the container on non-retriable errors.
Following the deprecation warning Loader in data stores deprecated, the associated APIs have now been removed. In addition to the original deprecation notes, users will automatically have an ILoader available on the container scope object as the ILoader property if the container was created through a Loader.
- TinyliciousClient and FrsClient are no longer static
- Routerlicious Driver DeltaStorageService constructor changed
- addGlobalAgentSchedulerAndLeaderElection removed
- Property removed from the Container class
- Creating new containers with Container.load has been deprecated
- Changes to client-api
TinyliciousClient and FrsClient global static properties are removed. Instead, object instantiation is now required.
- the
existingproperty fromContainerhas been removed. The caller should differentiate on how the container has been created (Container.loadvsContainer.createDetached). See also Creating new containers with Container.load has been deprecated.
DeltaStorageService from @fluidframework/routerlicious-driver now takes a RestWrapper as the second constructor parameter, rather than a TokenProvider.
In 0.38, the IContainerRuntimeOptions option addGlobalAgentSchedulerAndLeaderElection was added (on by default), which could be explicitly disabled to remove the built-in AgentScheduler and leader election functionality. This flag was turned off by default in 0.40. In 0.43 the flag (and the functionality it enabled) has been removed.
See AgentScheduler-related deprecations for more information on this deprecation and back-compat support, as well as recommendations on how to migrate away from the built-in.
Container.loadwith inexistent files will fail instead of creating a new container. Going forward, please useContainer.createDetachedfor this scenario.- To enable the legacy scenario, set the
createOnLoadflag to true insideIContainerLoadOptions.Loader.requestandLoader.resolvewill enable the legacy scenario if theIClientDetails.environmentproperty insideIRequest.headerscontains the stringenable-legacy-create-on-load(seeLegacyCreateOnLoadEnvironmentKeyfrom@fluidframework/container-loader).
- The
loadfunction fromdocument.tswill fail the container does not exist. Going forward, please use thecreatefunction to handle this scenario.
- Package renames
- IContainerRuntime property removed
- IContainerRuntimeEvents changes
- Removed IParsedUrl interface, parseUrl, getSnapshotTreeFromSerializedContainer and convertProtocolAndAppSummaryToSnapshotTree api from export
We have renamed some packages to better reflect their status. See the npm package scopes page in the wiki for more information about the npm scopes.
@fluidframework/react-inputsis renamed to@fluid-experimental/react-inputs@fluidframework/reactis renamed to@fluid-experimental/react
fluidDataStoreInstantiatedhas been removed from the interface and will no longer be emitted by theContainerRuntime.
- the
existingproperty fromIContainerRuntimehas been removed.
Removed IParsedUrl interface, parseUrl, getSnapshotTreeFromSerializedContainer and convertProtocolAndAppSummaryToSnapshotTree api from export
These interface and apis are not supposed to be used outside the package. So stop exposing them.
- Package renames
- LoaderHeader.version could not be null
- Leadership API surface removed
- IContainerContext and Container storage API return type changed
We have renamed some packages to better reflect their status. See the npm package scopes page in the wiki for more information about the npm scopes.
@fluidframework/last-edited-experimentalis renamed to@fluid-experimental/last-edited
LoaderHeader.version in ILoader can not be null as we always load from existing snapshot in container.load();
In 0.38, the leadership API surface was deprecated, and in 0.40 it was turned off by default. In 0.41 it has now been removed. If you still require leadership functionality, you can use a TaskSubscription in combination with an AgentScheduler.
See AgentScheduler-related deprecations for more information on how to use TaskSubscription to migrate away from leadership election.
IContainerContext and Container now will always have storage even in Detached mode, so its return type has changed and undefined is removed.
- AgentScheduler removed by default
- ITelemetryProperties may be tagged for privacy purposes
- IContainerRuntimeDirtyable removed
- Most RouterliciousDocumentServiceFactory params removed
In 0.38, the IContainerRuntimeOptions option addGlobalAgentSchedulerAndLeaderElection was added (on by default), which could be explicitly disabled to remove the built-in AgentScheduler and leader election functionality. This flag has now been turned off by default. If you still depend on this functionality, you can re-enable it by setting the flag to true, though this option will be removed in a future release.
See AgentScheduler-related deprecations for more information on this deprecation and back-compat support, as well as recommendations on how to migrate away from the built-in.
Telemetry properties on logs can (but are not yet required to) now be tagged. This is not a breaking change in 0.40, but users are strongly encouraged to add support for tags (see UPCOMING.md for more details).
[edit]
This actually was a breaking change in 0.40, in that the type of the event parameter of ITelemetryBaseLogger.send changed to
a more inclusive type which needs to be accounted for in implementations. However, in releases 0.40 through 0.44,
no tagged events are sent to any ITelemetryBaseLogger by the Fluid Framework. We are preparing to do so
soon, and will include an entry in BREAKING.md when we do.
The IContainerRuntimeDirtyable interface and isMessageDirtyable() method were deprecated in release 0.38. They have now been removed in 0.40. Please refer to the breaking change notice in 0.38 for instructions on migrating away from use of this interface.
The RouterliciousDocumentServiceFactory constructor no longer accepts the following params: useDocumentService2, disableCache, historianApi, gitCache, and credentials. Please open an issue if these flags/params were important to your project so that they can be re-incorporated into the upcoming IRouterliciousDriverPolicies param.
- connect event removed from Container
- LoaderHeader.pause
- ODSP driver definitions
- ITelemetryLogger Remove redundant methods
- fileOverwrittenInStorage
- absolutePath use in IFluidHandle is deprecated
The "connect" event would previously fire on the Container after connect_document_success was received from the server (which likely happens before the client's own join message is processed). This event does not represent a safe-to-use state, and has been removed. To detect when the Container is fully connected, the "connected" event should be used instead.
LoaderHeader.pause has been removed. instead of
[LoaderHeader.pause]: trueuse
[LoaderHeader.loadMode]: { deltaConnection: "none" }A lot of definitions have been moved from @fluidframework/odsp-driver to @fluidframework/odsp-driver-definitions. This change is required in preparation for driver to be dynamically loaded by host. This new package contains all the dependencies of ODSP driver factory (like HostStoragePolicy, IPersistedCache, TokenFetcher) as well as outputs (OdspErrorType). @fluidframework/odsp-driver will continue to have defintions for non-factory functionality (like URI resolver, helper functionality to deal with sharing links, URI parsing, etc.)
Remove deprecated shipAssert debugAssert logException logGenericError in favor of sendErrorEvent as they provide the same behavior and semantics as sendErrorEventand in general are relatively unused. These methods were deprecated in 0.36.
Please use DriverErrorType.fileOverwrittenInStorage instead of OdspErrorType.epochVersionMismatch
Rather than retrieving the absolute path, ostensibly to be stored, one should instead store the handle itself. To load, first retrieve the handle and then call get on it to get the actual object. Note that it is assumed that the container is responsible both for mapping an external URI to an internal object and for requesting resolved objects with any remaining tail of the external URI. For example, if a container has some map that maps /a --> <some handle>, then a request like request(/a/b/c) should flow like request(/a/b/c) --> <some handle> --> <object> --> request(/b/c).
- IPersistedCache changes
- ODSP Driver Type Unification
- ODSP Driver url resolver for share link parameter consolidation
- AgentScheduler-related deprecations
- Removed containerUrl from IContainerLoadOptions and IContainerConfig
IPersistedCache implementation no longer needs to implement updateUsage() method (removed form interface). Same goes for sequence number / maxOpCount arguments. put() changed from fire-and-forget to promise, with intention of returning write errors back to caller. Driver could use this information to stop recording any data about given file if driver needs to follow all-or-nothing strategy in regards to info about a file. Please note that format of data stored by driver changed. It will ignore cache entries recorded by previous versions of driver.
This change reuses existing contracts to reduce redundancy improve consistency.
The breaking portion of this change does rename some parameters to some helper functions, but the change are purely mechanical. In most cases you will likely find you are pulling properties off an object individually to pass them as params, whereas now you can just pass the object itself.
// before:
createOdspUrl(
siteUrl,
driveId,
fileId,
"/",
containerPackageName,
);
fetchJoinSession(
driveId,
itemId,
siteUrl,
...
)
getFileLink(
getToken,
something.driveId,
something.itemId,
something.siteUrl,
...
)
// After:
createOdspUrl({
siteUrl,
driveId,
itemId: fileId,
dataStorePath: "/",
containerPackageName,
});
fetchJoinSession(
{driveId, itemId, siteUrl},
...
);
getFileLink(
getToken,
something,
...
)OdspDriverUrlResolverForShareLink constructor signature has been changed to simplify instance creation in case resolver is not supposed to generate share link. Instead of separately specifying constructor parameters that are used to fetch share link there will be single parameter in shape of object that consolidates all properties that are necessary to get share link.
// before:
new OdspDriverUrlResolverForShareLink(
tokenFetcher,
identityType,
logger,
appName,
);
// After:
new OdspDriverUrlResolverForShareLink(
{ tokenFetcher, identityType },
logger,
appName,
);AgentScheduler is currently a built-in part of ContainerRuntime, but will be removed in an upcoming release. Correspondingly, the API surface of ContainerRuntime that relates to or relies on the AgentScheduler is deprecated.
A .leader property and "leader"/"notleader" events are currently exposed on the ContainerRuntime, FluidDataStoreContext, and FluidDataStoreRuntime. These are deprecated and will be removed in an upcoming release.
A TaskSubscription has been added to the @fluidframework/agent-scheduler package which can be used in conjunction with an AgentScheduler to get equivalent API surface:
const leadershipTaskSubscription = new TaskSubscription(agentScheduler, "leader");
if (leadershipTaskSubscription.haveTask()) {
// client is the leader
}
leadershipTaskSubscription.on("gotTask", () => {
// client just became leader
});
leadershipTaskSubscription.on("lostTask", () => {
// client is no longer leader
});The AgentScheduler can be one of your choosing, or the built-in AgentScheduler can be retrieved for this purpose using ContainerRuntime.getRootDataStore() (however, as noted above this will be removed in an upcoming release):
const agentScheduler = await requestFluidObject<IAgentScheduler>(
await containerRuntime.getRootDataStore("_scheduler"),
"",
);The IContainerRuntimeDirtyable interface provides the isMessageDirtyable() method, for use with last-edited functionality. This is only used to differentiate messages for the built-in AgentScheduler. With the deprecation of the AgentScheduler, this interface and method are no longer necessary and so are deprecated and will be removed in an upcoming release. From the ContainerRuntime's perspective all messages are considered dirtyable with this change.
If you continue to use the built-in AgentScheduler and want to replicate this filtering in your last-edited behavior, you can use the following in your shouldDiscardMessage() check:
import { ContainerMessageType } from "@fluidframework/container-runtime";
import { IEnvelope, InboundAttachMessage } from "@fluidframework/runtime-definitions";
// In shouldDiscardMessage()...
if (type === ContainerMessageType.Attach) {
const attachMessage = contents as InboundAttachMessage;
if (attachMessage.id === "_scheduler") {
return true;
}
} else if (type === ContainerMessageType.FluidDataStoreOp) {
const envelope = contents as IEnvelope;
if (envelope.address === "_scheduler") {
return true;
}
}
// Otherwise, proceed with other discard logic...Finally, the automatic addition to the registry and creation of the AgentScheduler with ID _scheduler is deprecated and will also be removed in an upcoming release. To prepare for this, you can proactively opt-out of the built-in by turning off the IContainerRuntimeOptions option addGlobalAgentSchedulerAndLeaderElection in your calls to Container.load or in the constructor of your BaseContainerRuntimeFactory or ContainerRuntimeFactoryWithDefaultDataStore.
For backwards compat with documents created prior to this change, you'll need to ensure the AgentSchedulerFactory.registryEntry is present in the container registry. You can add it explicitly in your calls to Container.load or in the constructor of your BaseContainerRuntimeFactory or ContainerRuntimeFactoryWithDefaultDataStore. The examples below show how to opt-out of the built-in while maintaining backward-compat with documents that were created with a built-in AgentScheduler.
const runtime = await ContainerRuntime.load(
context,
[
// Any other registry entries...
AgentSchedulerFactory.registryEntry,
],
requestHandler,
// Opt-out of adding the AgentScheduler
{ addGlobalAgentSchedulerAndLeaderElection: false },
scope);const SomeContainerRuntimeFactory = new ContainerRuntimeFactoryWithDefaultDataStore(
DefaultFactory,
new Map([
// Any other registry entries...
AgentSchedulerFactory.registryEntry,
]),
providerEntries,
requestHandlers,
// Opt-out of adding the AgentScheduler
{ addGlobalAgentSchedulerAndLeaderElection: false },
);If you use AgentScheduler functionality, it is recommended to instantiate this as a normal (non-root) data store (probably on your root data object). But if you are not yet ready to migrate away from the root data store, you can instantiate it yourself on new containers (you should do this while the container is still detached):
if (!context.existing) {
await runtime.createRootDataStore(AgentSchedulerFactory.type, "_scheduler");
}The option will be turned off by default in an upcoming release before being turned off permanently, so it is recommended to make these updates proactively.
Removed containerUrl from IContainerLoadOptions and IContainerConfig. This is no longer needed to route request.
- OpProcessingController marked for deprecation
- Loader in data stores deprecated
- TelemetryLogger Properties Format
- IContainerRuntimeOptions Format Change
- AgentScheduler moves and renames
OpProcessingController is marked for deprecation and we be removed in 0.38.
LoaderContainerTracker is the replacement with better tracking. The API differs from OpProcessingController in the following ways:
- Loader is added for tracking and any Container created/loaded will be automatically tracked
- The op control APIs accept Container instead of DeltaManager
The loader property on the IContainerRuntime, IFluidDataStoreRuntime, and IFluidDataStoreContext interfaces is now deprecated and will be removed in an upcoming release. Data store objects will no longer have access to an ILoader by default. To replicate the same behavior, existing users can make the ILoader used to create a Container available on the scope property of these interfaces instead by setting the provideScopeLoader ILoaderOptions flag when creating the loader.
const loader = new Loader({
urlResolver,
documentServiceFactory,
codeLoader,
options: { provideScopeLoader: true },
});const loader: ILoader | undefined = this.context.scope.ILoader;The TelemetryLogger's properties format has been updated to support error only properties. This includes: ChildLogger, MultiSinkLogger,DebugLogger.
The previous format was just a property bag:
ChildLogger.create(logger, undefined, { someProperty: uuid() });
Whereas now it has nested property bags for error categories including all and error:
ChildLogger.create(logger, undefined, {all:{ someProperty: uuid() }});
The runtime options passed into ContainerRuntime have been subdivided into nested objects, because all of them fall under two categories currently:
summaryOptions- contains all summary/summarizer related optionsgenerateSummariesinitialSummarizerDelayMssummaryConfigOverridesdisableIsolatedChannels
gcOptions- contains all Garbage Collection related optionsdisableGCgcAllowed(new)runFullGC
For a few versions we will keep supporting the old format, but the typings have already been updated.
IAgentScheduler and IProvideAgentScheduler have been moved to the @fluidframework/agent-scheduler package, and taskSchedulerId has been renamed to agentSchedulerId.
- Some
ILoaderAPIs moved toIHostLoader - TaskManager removed
- ContainerRuntime registerTasks removed
- getRootDataStore
- Share link generation no longer exposed externally
- ITelemetryLogger redundant method deprecation
The createDetachedContainer and rehydrateDetachedContainerFromSnapshot APIs are removed from the ILoader interface, and have been moved to the new IHostLoader interface. The Loader class now implements IHostLoader instead, and consumers who need these methods should operate on an IHostLoader instead of an ILoader, such as by creating a Loader.
The TaskManager has been removed, as well as methods to access it (e.g. the .taskManager member on DataObject). The AgentScheduler should be used instead for the time being and can be accessed via a request on the ContainerRuntime (e.g. await this.context.containerRuntime.request({ url: "/_scheduler" })), though we expect this will also be deprecated and removed in a future release when an alternative is made available (see #4413).
The registerTasks method has been removed from ContainerRuntime. The AgentScheduler should be used instead for task scheduling.
IContainerRuntime.getRootDataStore() used to have a backdoor allowing accessing any store, including non-root stores. This back door is removed - you can only access root data stores using this API.
Share link generation implementation has been refactored to remove options for generating share links of various kinds. Method for generating share link is no longer exported. ShareLinkTokenFetchOptions has been removed and OdspDriverUrlResolverForShareLink constructor has been changed to accept tokenFetcher parameter which will pass OdspResourceTokenFetchOptions instead of ShareLin kTokenFetchOptions.
Deprecate shipAssert debugAssert logException logGenericError in favor of sendErrorEvent as they provide the same behavior and semantics as sendErrorEventand in general are relatively unused.
- Removed some api implementations from odsp driver
- get-tinylicious-container and get-session-storage-container moved
- Moved parseAuthErrorClaims from @fluidframework/odsp-driver to @fluidframework/odsp-doclib-utils
- Refactored token fetcher types in odsp-driver
- DeltaManager
readonlyandreadOnlyPermissionsproperties deprecated - DirtyDocument events and property
- Removed
createDocumentServiceandcreateDocumentService2from r11s driver
Removed authorizedFetchWithRetry, AuthorizedRequestTokenPolicy, AuthorizedFetchProps, asyncWithCache, asyncWithRetry,
fetchWithRetry implementation from odspdriver.
The functionality from the packages @fluidframework/get-tinylicious-container and @fluidframework/get-session-storage-container has been moved to the package @fluid-experimental/get-container.
Moved parseAuthErrorClaims from @fluidframework/odsp-driver to @fluidframework/odsp-doclib-utils
Streamlined interfaces and types used to facilitate access tokens needed by odsp-driver to call ODSP implementation of Fluid services. Added support for passing siteUrl when fetching token that is used to establish co-authoring session for Fluid content stored in ODSP file which is hosted in external tenant. This token is used by ODSP ordering service implementation (aka ODSP Push service).
DeltaManager.readonly/Container.readonly and DeltaManager.readOnlyPermissions/Container.readOnlyPermissions have been deprecated. Please use DeltaManager.readOnlyInfo/Container.readOnlyInfo instead, which exposes the same information.
The following 3 names have been deprecated - please use new names: "dirtyDocument" event -> "dirty" event "savedDocument" event -> "saved" event isDocumentDirty property -> isDirty property
Removed the deprecated methods createDocumentService and createDocumentService2. Please use DocumentServiceFactory.createDocumentService instead.
writeBlob() and BlobHandle have been removed from aqueduct. Please use FluidDataStoreRuntime.uploadBlob() or ContainerRuntime.uploadBlob() instead.
Connected / disconnected listeners are called on registration. Please see Connectivity events section of Loader readme.md for more details
- Normalizing enum ContainerErrorType
- Map and Directory typing changes from enabling strictNullCheck
- MergeTree's ReferencePosition.getTileLabels and ReferencePosition.getRangeLabels() return undefined if it doesn't exist
- Containers from Loader.request() are now cached by default
In an effort to clarify error categorization, a name and value in this enumeration were changed.
Typescript compile options strictNullCheck is enabled for the @fluidframework/map package. Some of the API signature is updated to include possibility of undefined and null, which can cause new typescript compile error when upgrading. Existing code may need to update to handle the possiblity of undefined or `null.
This includes LocalReference and Marker. getTileLabels and getRangeLabels methods will return undefined instead of creating an empty if the properties for tile labels and range labels is not set.
Some loader request header options that previously prevented caching (pause: true and reconnect: false) no longer do. Callers must now explicitly spcify cache: false in the request header to prevent caching of the returned container. Containers are evicted from the cache in their closed event, and closed containers that are requested are not cached.
- Node version 12.17 required
- getAttachSnapshot removed IFluidDataStoreChannel
- resolveDataStore replaced
Due to changes in server packages and introduction of AsyncLocalStorage module which requires Node version 12.17 or above, you will need to update Node version to 12.17 or above.
getAttachSnapshot() has been removed from IFluidDataStoreChannel. It is replaced by getAttachSummary().
The resolveDataStore method manually exported by the ODSP resolver has been replaced with checkUrl() from the same package.
- Branching removed
- removeAllEntriesForDocId api name and signature change
- snapshot removed from IChannel and ISharedObject
The branching feature has been removed. This includes all related members, methods, etc. such as parentBranch, branchId, branch(), etc.
removeAllEntriesForDocId api renamed to removeEntries. Now it takes IFileEntry as argument instead of just docId.
snapshot has been removed from IChannel and ISharedObject. It is replaced by summarize which should be used to get a summary of the channel / shared object.
- OdspDriverUrlResolver2 renamed to OdspDriverUrlResolverForShareLink
- removeAllEntriesForDocId api in host storage changed
- IContainerRuntimeBase.IProvideFluidDataStoreRegistry
- _createDataStoreWithProps returns IFluidRouter
- FluidDataStoreRuntime.registerRequestHandler deprecated
- snapshot removed from IFluidDataStoreRuntime
- getAttachSnapshot deprecated in IFluidDataStoreChannel
OdspDriverUrlResolver2 renamed to OdspDriverUrlResolverForShareLink
removeAllEntriesForDocId api in host storage is now an async api.
IProvideFluidDataStoreRegistry implementation moved from IContainerRuntimeBase to IContainerRuntime. Data stores and objects should not have access to global state in container.
IProvideFluidDataStoreRegistry is removed from IFluidDataStoreChannel - it has not been implemented there for a while (it moved to context).
IContainerRuntimeBase._createDataStoreWithProps returns IFluidRouter instead of IFluidDataStoreChannel. This is done to be consistent with other APIs create data stores, and ensure we do not return internal interfaces. This likely to expose areas where IFluidDataStoreChannel.bindToContext() was called manually on data store. Such usage should be re-evaluate - lifetime management should be left up to runtime, storage of any handle form data store in attached DDS will result in automatic attachment of data store (and all of its objects) to container. If absolutely needed, and only for staging, casting can be done to implement old behavior.
Please use mixinRequestHandler() as a way to create custom data store runtime factory/object and append request handling to existing implementation.
snapshot has been removed from IFluidDataStoreRuntime.
getAttachSnapshot() has been deprecated in IFluidDataStoreChannel. It is replaced by getAttachSummary().
- FileName should contain extension for ODSP driver create new path
- ODSP Driver IPersistedCache changes
- IFluidPackage Changes
- DataObject changes
- RequestParser
- IFluidLodable.url is removed
- Loader Constructor Changes
- Moving DriverHeader and merge with CreateNewHeader
- ODSP status codes moved from odsp-driver to odsp-doclib-utils
Now the ODSP driver expects file extension in the file name while creating a new detached container.
Added api removeAllEntriesForDocId which allows removal of all entries for a given document id. Also the schema for entries stored inside odsp IPersistedCache has changed.
It now stores/expect values as IPersistedCacheValueWithEpoch. So host needs to clear its cached entries in this version.
- Moving IFluidPackage and IFluidCodeDetails from "@fluidframework/container-definitions" to '@fluidframework/core-interfaces'
- Remove npm specific IPackage interface
- Simplify the IFluidPackage by removing browser and npm specific properties
- Add new interface IFluidBrowserPackage, and isFluidBrowserPackage which defines browser specific properties
- Added resolveFluidPackageEnvironment helper for resolving a package environment
DataObject are now always created when Data Store is created. Full initialization for existing objects (in file) continues to happen to be on demand, i.e. when request() is processed. Full DataObject initialization does happen for newly created (detached) DataObjects. The impact of that change is that all changed objects would get loaded by summarizer container, but would not get initialized. Before this change, summarizer would not be loading any DataObjects. This change
- Ensures that initial summary generated for when data store attaches to container has fully initialized object, with all DDSs created. Before this change this initial snapshot was empty in most cases.
- Allows DataObjects to modify FluidDataStoreRuntime behavior before it gets registered and used by the rest of the system, including setting various hooks.
But it also puts more constraints on DataObject - its constructor should be light and not do any expensive work (all such work should be done in corresponding initialize methods), or access any data store runtime functionality that requires fully initialized runtime (like loading DDSs will not work in this state)
RequestParser's ctor is made protected. Please replace this code
const a = new RequestParser(request);
with this one:
const a = RequestParser.create(request);
url property is removed. If you need a path to an object (in a container), you can use IFluidLoadable.handle.absolutePath instead.
The loader constructor has changed to now take a props object, rather than a series of paramaters. This should make it easier to construct loaders as the optional services can be easily excluded.
Before:
const loader = new Loader(
urlResolver,
documentServiceFactory,
codeLoader,
{ blockUpdateMarkers: true },
{},
new Map()
);After:
const loader = new Loader({
urlResolver,
documentServiceFactory,
codeLoader,
});if for some reason this change causes you problems, we've added a deprecated Loader._create method that has the same parameters as the previous constructor which can be used in the interim.
Compile time only API breaking change between runtime and driver. Only impacts driver implementer. No back-compat or mix version impact.
DriverHeader is a driver concept, so move from core-interface to driver-definitions. CreateNewHeader is also a kind of driver header, merged it into DriverHeader.
Error/status codes like offlineFetchFailureStatusCode which used to be imported like import { offlineFetchFailureStatusCode } from '@fluidframework/@odsp-driver'; have been moved to odspErrorUtils.ts in odsp-doclib-utils.
Local Web host is removed. Users who are using the local web host can use examples/utils/get-session-storage-container which provides the same functionality with the detached container flow.
- External Component Loader and IComponentDefaultFactoryName removed
- MockFluidDataStoreRuntime api rename
- Local Web Host API change
- Container runtime event changes
- Component is removed from telemetry event names
- IComponentContextLegacy is removed
IContainerRuntimeBase._createDataStoreWithProps() is removed- _createDataStore() APIs are removed
- createDataStoreWithRealizationFn() APIs are removed
- getDataStore() APIs is removed
- Package Renames
- IComponent and IComponent Interfaces Removed
- @fluidframework/odsp-utils - Minor renames and signature changes
- LastEditedTrackerComponent renamed to LastEditedTrackerDataObject
- ComponentProvider renamed to FluidObjectProvider in @fluidframework/synthesize
The @fluidframework/external-component-loader package has been removed from the repo. In addition to this, the IFluidExportDefaultFactoryName and the corresponding IProvideFluidExportDefaultFactoryName interfaces have also been dropped.
Runtime Test Utils's MockFluidDataStoreRuntime now has "requestDataStore" instead of "requestComponent"
The renderDefaultComponent function has been updated to be renderDefaultFluidObject
Container runtime now emits the event "fluidDataStoreInstantiated" instead of "componentInstantiated"
The following telemetry event names have been updated to drop references to the term component:
ComponentRuntimeDisposeError -> ChannelDisposeError ComponentContextDisposeError -> FluidDataStoreContextDisposeError SignalComponentNotFound -> SignalFluidDataStoreNotFound
Deprecated in 0.18, removed.
Note: This change has been reverted for 0.25 and will be pushed to a later release.
IContainerRuntimeBase._createDataStoreWithProps() has been removed. Please use IContainerRuntimeBase.createDataStore() (returns IFluidRouter).
If you need to pass props to data store, either use request() route to pass initial props directly, or to query Fluid object to interact with it (pass props / call methods to configure object).
IFluidDataStoreContext._createDataStore() & IContainerRuntimeBase._createDataStore() are removed
Please switch to using one of the following APIs:
IContainerRuntime.createRootDataStore()- data store created that way is automatically bound to container. It will immediately be visible to remote clients (when/if container is attached). Such data stores are never garbage collected. Note that this API is onIContainerRuntimeinterface, which is not directly accessible to data stores. The intention is that only container owners are creating roots.IContainerRuntimeBase.createDataStore()- creates data store that is not bound to container. In order for this store to be bound to container (and thus be observable on remote clients), ensure that handle to it (or any of its objects / DDS) is stored into any other DDS that is already bound to container. In other words, newly created data store has to be reachable (there has to be a path) from some root data store in container. If, in future, such data store becomes unreachable from one of the roots, it will be garbage collected (implementation pending).
Removed from IFluidDataStoreContext & IContainerRuntime. Consider using (Pure)DataObject(Factory) for your objects - they support passing initial args. Otherwise consider implementing similar flow of exposing interface from your Fluid object that is used to initialize object after creation.
IContainerRuntime.getDataStore() is removed. Only IContainerRuntime.getRootDataStore() is available to retrieve root data stores.
For couple versions we will allow retrieving non-root data stores using this API, but this functionality is temporary and will be removed soon.
You can use handleFromLegacyUri() for creating handles from container-internal URIs (i.e., in format /${dataStoreId}) and resolving those containers to get to non-root data stores. Please note that this functionality is strictly added for legacy files! In future, not using handles to refer to content (and storing handles in DDSes) will result in such data stores not being reachable from roots, and thus garbage collected (deleted) from file.
As a follow up to the changes in 0.24 we are updating a number of package names
@fluidframework/component-core-interfacesis renamed to@fluidframework/core-interfaces@fluidframework/component-runtime-definitionsis renamed to@fluidframework/datastore-definitions@fluidframework/component-runtimeis renamed to@fluidframework/datastore@fluidframework/webpack-component-loaderis renamed to@fluidframework/webpack-fluid-loader
In 0.24 IComponent and IComponent interfaces were deprecated, they are being removed in this build. Please move to IFluidObject and IFluidObject interfaces.
To support additional authentication scenarios, the signature and/or name of a few auth-related functions was modified.
It is renamed to LastEditedTrackerDataObject
In the package @fluidframework/synthesize, these types are renamed:
ComponentKey -> FluidObjectKey ComponentSymbolProvider -> FluidObjectProvider AsyncRequiredcomponentProvider -> AsyncRequiredFluidObjectProvider AsyncOptionalComponentProvider -> AsyncOptionalFluidObjectProvider AsyncComponentProvider -> AsyncFluidObjectProvider NonNullableComponent -> NonNullableFluidObject
This release only contains renames. There are no functional changes in this release. You should ensure you have integrated and validated up to release 0.23 before integrating this release.
This is a followup to the forward compat added in release 0.22: Forward Compat For Loader IComponent Interfaces
You should ensure all container and components hosts are running at least 0.22 before integrating this release.
The below json describes all the renames done in this release. If you have a large typescript code base, we have automation that may help. Please contact us if that is the case.
All renames are 1-1, and global case senstive and whole word find replace for all should be safe. For IComponent Interfaces, both the type and property name were re-named.
{
"dataStore": {
"types": {
"IComponentRuntimeChannel": "IFluidDataStoreChannel",
"IComponentAttributes": "IFluidDataStoretAttributes",
"IComponentContext": "IFluidDataStoreContext",
"ComponentContext": "FluidDataStoreContext",
"LocalComponentContext": "LocalFluidDataStoreContext",
"RemotedComponentContext": "RemotedFluidDataStoreContext ",
"IComponentRuntime": "IFluidDataStoreRuntime",
"ComponentRuntime": "FluidDataStoreRuntime",
"MockComponentRuntime": "MockFluidDataStoreRuntime"
},
"methods": {
"createComponent": "_createDataStore",
"createComponentContext": "createDataStoreContext",
"createComponentWithProps": "createDataStoreWithProps",
"_createComponentWithProps": "_createDataStoreWithProps",
"createComponentWithRealizationFn": "createDataStoreWithRealizationFn",
"getComponentRuntime": "getDataStore",
"notifyComponentInstantiated": "notifyDataStoreInstantiated"
}
},
"aquaduct": {
"IComponentInterfaces": {
"IProvideComponentDefaultFactoryName": "IProvideFluidExportDefaultFactoryName",
"IComponentDefaultFactoryName": "IFluidExportDefaultFactoryName"
},
"types": {
"SharedComponentFactory": "PureDataObjectFactory",
"SharedComponent": "PureDataObject",
"PrimedComponentFactory": "DataObjectFactory",
"PrimedComponent": "DataObject",
"ContainerRuntimeFactoryWithDefaultComponent": "ContainerRuntimeFactoryWithDefaultDataStore",
"defaultComponentRuntimeRequestHandler": "defaultRouteRequestHandler"
},
"methods": {
"getComponent": "requestFluidObject",
"asComponent": "asFluidObject",
"createAndAttachComponent": "createAndAttachDataStore",
"getComponentFromDirectory": "getFluidObjectFromDirectory",
"getComponent_UNSAFE": "requestFluidObject_UNSAFE",
"componentInitializingFirstTime": "initializingFirstTime",
"componentInitializingFromExisting": "initializingFromExisting",
"componentHasInitialized": "hasInitialized"
}
},
"fluidObject": {
"IComponentInterfaces": {
"IProvideComponentRouter": "IProvideFluidRouter",
"IComponentRouter": "IFluidRouter",
"IProvideComponentLoadable": "IProvideFluidLoadable",
"IComponentLoadable": "IFluidLoadable",
"IProvideComponentHandle": "IProvideFluidHandle",
"IComponentHandle": "IFluidHandle",
"IProvideComponentHandleContext": "IProvideFluidHandleContext",
"IComponentHandleContext": "IFluidHandleContext",
"IProvideComponentSerializer": "IProvideFluidSerializer",
"IComponentSerializer": "IFluidSerializer",
"IProvideComponentRunnable": "IProvideFluidRunnable",
"IComponentRunnable": "IFluidRunnable",
"IProvideComponentConfiguration": "IProvideFluidConfiguration",
"IComponentConfiguration": "IFluidConfiguration",
"IProvideComponentHTMLView": "IProvideFluidHTMLView",
"IComponentHTMLView": "IFluidHTMLView",
"IComponentHTMLOptions": "IFluidHTMLOptions",
"IProvideComponentMountableView": "IProvideFluidMountableView",
"IComponentMountableViewClass": "IFluidMountableViewClass",
"IComponentMountableView": "IFluidMountableView",
"IProvideComponentLastEditedTracker": "IProvideFluidLastEditedTracker",
"IComponentLastEditedTracker": "IFluidLastEditedTracker",
"IProvideComponentRegistry": "IProvideFluidDataStoreRegistry",
"IComponentRegistry": "IFluidDataStoreRegistry",
"IProvideComponentFactory": "IProvideFluidDataStoreFactory",
"IComponentFactory": "IFluidDataStoreFactory",
"IProvideComponentCollection": "IProvideFluidObjectCollection",
"IComponentCollection": "IFluidObjectCollection",
"IProvideComponentDependencySynthesizer": "IProvideFluidDependencySynthesizer",
"IComponentDependencySynthesizer": "IFluidDependencySynthesizer",
"IProvideComponentTokenProvider": "IProvideFluidTokenProvider",
"IComponentTokenProvider": "IFluidTokenProvider"
},
"types": {
"IComponent": "IFluidObject",
"fluid/component": "fluid/object",
"SharedObjectComponentHandle": "SharedObjectHandle",
"RemoteComponentHandle": "RemoteFluidObjectHandle",
"ComponentHandle": "FluidObjectHandle",
"ComponentSerializer": "FluidSerializer",
"ComponentHandleContext": "FluidHandleContext",
"ComponentRegistryEntry": "FluidDataStoreRegistryEntry",
"NamedComponentRegistryEntry": "NamedFluidDataStoreRegistryEntry",
"NamedComponentRegistryEntries": "NamedFluidDataStoreRegistryEntries",
"ComponentRegistry": "FluidDataStoreRegistry",
"ContainerRuntimeComponentRegistry": "ContainerRuntimeDataStoreRegistry"
},
"methods": {
"instantiateComponent": "instantiateDataStore"
}
}
}- Removed
collaboratingevent on IComponentRuntime - ISharedObjectFactory rename
- LocalSessionStorageDbFactory moved to @fluidframework/local-driver
Component Runtime no longer fires the collaborating event on attaching. Now it fires attaching event.
ISharedObjectFactory renamed to IChannelFactory and moved from @fluidframework/shared-object-base to @fluidframework/datastore-definitions
Previously, LocalSessionStorageDbFactory was part of the @fluidframework/webpack-component-loader package. It has been moved to the @fluidframework/local-driver package.
- Deprecated
pathfromIComponentHandleContext - Dynamically loaded components compiled against older versions of runtime
- ContainerRuntime.load Request Handler Changes
- IComponentHTMLVisual removed
- IComponentReactViewable deprecated
- Forward Compat For Loader IComponent Interfaces
- Add Undefined to getAbsoluteUrl return type
- Renamed TestDeltaStorageService, TestDocumentDeltaConnection, TestDocumentService, TestDocumentServiceFactory and TestResolver
- DocumentDeltaEventManager has been renamed and moved to "@fluidframework/test-utils"
isAttachedreplaced withattachStateproperty
Deprecated the path field from the interface IComponentHandleContext. This means that IComponentHandle will not have this going forward as well.
Added an absolutePath field to IComponentHandleContext which is the absolute path to reach it from the container runtime.
Components that were compiled against Fluid Framework <= 0.19.x releases will fail to load. A bunch of APIs has been deprecated in 0.20 & 0.21 and back compat support is being removed in 0.22. Some of the key APIs are:
- IComponentRuntime.attach
- ContainerContext.isAttached
- ContainerContext.isLocal Such components needs to be compiled against >= 0.21 runtime and can be used in container that is built using >= 0.21 runtime as well.
ContainerRuntime.load no longer accepts an array of RuntimeRequestHandlers. It has been changed to a single function parameter with a compatible signature:
requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>
To continue to use RuntimeRequestHandlers you can used the RuntimeRequestHandlerBuilder in the package @fluidframework/request-handler
example:
const builder = new RuntimeRequestHandlerBuilder();
builder.pushHandler(...this.requestHandlers);
builder.pushHandler(defaultRouteRequestHandler("defaultComponent"));
builder.pushHandler(innerRequestHandler());
const runtime = await ContainerRuntime.load(
context,
this.registryEntries,
async (req, rt) => builder.handleRequest(req, rt),
undefined,
scope
);Additionally the class RequestParser has been moved to the @fluidframework/runtime-utils package
This will allow consumers of our ContainerRuntime to substitute other routing frameworks more easily.
The IComponentHTMLVisual interface was deprecated in 0.21, and is now removed in 0.22. To support multiview scenarios, consider split view/model patterns like those demonstrated in the multiview sample.
The IComponentReactViewable interface is deprecated and will be removed in an upcoming release. For multiview scenarios, instead use a pattern like the one demonstrated in the sample in /components/experimental/multiview. This sample demonstrates how to create multiple views for a component.
As part of the Fluid Data Library (FDL) and Fluid Component Library (FCL) split we will be renaming a significant number of out interfaces. Some of these interfaces are used across the loader -> runtime boundary. For these interfaces we have introduced the newly renamed interfaces in this release. This will allow Host's to implment forward compatbitiy for these interfaces, so they are not broken when the implementations themselves are renamed.
IComponentLastEditedTrackerwill becomeIFluidLastEditedTrackerIComponentHTMLViewwill becomeIFluidHTMLViewIComponentMountableViewClasswill becomeIFluidMountableViewClassIComponentLoadablewill becomeIFluidLoadableIComponentRunnablewill becomeIFluidRunnableIComponentConfigurationwill becomeIFluidConfigurationIComponentRouterwill becomeIFluidRouterIComponentHandleContextwill becomeIFluidHandleContextIComponentHandlewill becomeIFluidHandleIComponentSerializerwill becomeIFluidSerializerIComponentTokenProviderwill becomeIFluidTokenProvider
IComponent will also become IFluidObject, and the mime type for for requests will change from fluid/component to fluid/object
To ensure forward compatability when accessing the above interfaces outside the context of a container e.g. from the host, you should use the nullish coalesing operator (??).
For example
if (response.status !== 200 ||
!(
response.mimeType === "fluid/component" ||
response.mimeType === "fluid/object"
)) {
return undefined;
}
const fluidObject = response.value as IComponent & IFluidObject;
return fluidObject.IComponentHTMLView ?? fluidObject.IFluidHTMLView.getAbsoluteUrl on the container runtime and component context now returns string | undefined. undefined will be returned if the container or component is not attached. You can determine if a component is attached and get its url with the below snippit:
import { waitForAttach } from "@fluidframework/aqueduct";
protected async hasInitialized() {
waitForAttach(this.runtime)
.then(async () => {
const url = await this.context.getAbsoluteUrl(this.url);
this._absoluteUrl = url;
this.emit("stateChanged");
})
.catch(console.error);
}Renamed TestDeltaStorageService, TestDocumentDeltaConnection, TestDocumentService, TestDocumentServiceFactory and TestResolver
Renamed the following in "@fluidframework/local-driver" since these are used beyond testing:
TestDeltaStorageService->LocalDeltaStorageServiceTestDocumentDeltaConnection->LocalDocumentDeltaConnectionTestDocumentService->LocalDocumentServiceTestDocumentServiceFactory->LocalDocumentServiceFactoryTestResolver->LocalResolver
DocumentDeltaEventManager has moved to "@fluidframework/test-utils" and renamed to OpProcessingController.
The registerDocuments method has been renamed to addDeltaManagers and should be called with a list of delta managers. Similarly, all the other methods have been updated to be called with delta managers.
So, the usage has now changed to pass in the deltaManager from the object that was passed earlier. For example:
// Old usage
containerDeltaEventManager = new DocumentDeltaEventManager(
deltaConnectionServer
);
containerDeltaEventManager.registerDocuments(
component1.runtime,
component2.runtime
);
// New usage
opProcessingController = new OpProcessingController(deltaConnectionServer);
opProcessingController.addDeltaManagers(
component1.runtime.deltaManager,
component2.runtime.deltaManager
);isAttached is replaced with attachState property on IContainerContext, IContainerRuntime and IComponentContext.
isAttached returned true when the entity was either attaching or attached to the storage.
So if attachState is AttachState.Attaching or AttachState.Attached then isAttached would have returned true.
Attaching is introduced in regards to Detached container where there is a time where state is neither AttachState.Detached nor AttachState.Attached.
- Removed
@fluidframework/local-test-utils - IComponentHTMLVisual deprecated
- createValueType removed from SharedMap and SharedDirectory
- Sequence snapshot format change
- isLocal api removed
- register/attach api renames on handles, components and dds
- Error handling changes
Removed this package so classes like TestHost are no longer supported. Please contact us if there were dependencies on this or if any assistance in required to get rid of it.
The IComponentHTMLVisual interface is deprecated and will be removed in an upcoming release. For multiview scenarios, instead use a pattern like the one demonstrated in the sample in /components/experimental/multiview. This sample demonstrates how to create multiple views for a component.
The createValueType() method on SharedMap and SharedDirectory was deprecated in 0.20, and is now removed in 0.21. If Counter functionality is required, the @fluidframework/counter DDS can be used for counter functionality.
isLocal api is removed from the repo. It is now replaced with isAttached which tells that the entity is attached or getting attached to storage. So its meaning is opposite to isLocal.
Register on dds and attach on data store runtime is renamed to bindToContext(). attach on handles is renamed to attachGraph().
ErrorType enum has been broken into 3 distinct enums / layers:
- ContainerErrorType - errors & warnings raised at loader level
- OdspErrorType and R11sErrorType - errors raised by ODSP and R11S drivers.
- Runtime errors, like
"summarizingError","dataCorruptionError". This class of errors it not pre-determined and depends on type of container loaded.
ICriticalContainerError.errorType is now a string, not enum, as loader has no visibility into full set of errors that can be potentially raised. Hosting application may package different drivers and open different types of containers, thus making errors list raised at container level dynamic.
Due to a change in the sequence's snapshot format clients running a version less than 0.19 will not be able to load snapshots generated in 0.21. This will affect all sequence types includes shared string, and sparse matrix. If you need to support pre-0.19 clients please contact us for mitigations.
- Value types deprecated on SharedMap and SharedDirectory
- rename @fluidframework/aqueduct-react to @fluidframework/react-inputs
The Counter value type and createValueType() method on SharedMap and SharedDirectory are now deprecated and will be removed in an upcoming release. Instead, the @fluidframework/counter DDS can be used for counter functionality.
aqueduct-react is actually just a react library and renamed it to reflect such.
- Container's "error" event
- IUrlResolver change from requestUrl to getAbsoluteUrl
- Package rename from
@microsoft/fluid-*to@fluidframework/*
Package with the prefix "@microsoft/fluid-" is renamed to "@fluidframework/" to take advanage a separate namespace for Fluid Framework SDK packages.
"error" event is gone. All critical errors are raised on "closed" event via optiona error object. "warning" event is added to expose warnings. Currently it contains summarizer errors and throttling errors.
As we continue to refine our API around detached containers, and component urls, we've renamed IUrlResolver from requestUrl to getAbsoluteUrl
- App Id removed as a parameter to OdspDocumentServiceFactory
- ConsensusRegisterCollection now supports storing handles
- Summarizing errors on parent container
- [OdspDocumentServiceFactory no longer requires a logger] (#OdspDocumentServiceFactory-no-longer-requires-a-logger)
@microsoft/fluid-odsp-driver no longer requires consumers to pass in an app id as an input. Consumers should simply remove this parameter from the OdspDocumentServiceFactory/OdspDocumentServiceFactoryWithCodeSplit constructor.
ConsensusRegisterCollection will properly serialize/deserialize handles added as values.
The parent container of the summarizing container will now raise "error" events related to summarization problems. These will be of type ISummarizingError and will have a description indicating either a problem creating the summarizing container, a problem generating a summary, or a nack or ack wait timeout from the server.
The logger will be passed in on createDocumentService or createContainer, no need to pass in one on construction of OdspDocumentServiceFactory.
For older versions' breaking changes, go here