Library for building distributed, real-time collaborative web applications
MIT License
Bot releases are visible (Hide)
Published by github-actions[bot] 6 months ago
#20789
#20787
#20769
#20762
#20691
#20740
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.3.0.1...client_v2.0.0-rc.3.0.2
Published by github-actions[bot] 6 months ago
#20694
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.2.0.2...client_v2.0.0-rc.2.0.3
Published by github-actions[bot] 6 months ago
#20720
#20699
#20685
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.3.0.0...client_v2.0.0-rc.3.0.1
Published by github-actions[bot] 6 months ago
With this release, we're moving closer to General Availability of Fluid Framework 2.0 later this summer. We've made
major improvements to SharedTree DDS including features like Undo/Redo, Transactions, Events and other schema
improvements. We've also made upgrades to the Fluid DevTool, Telemetry and added support for Ephemeral containers in
Azure Fluid Relay.
Added the ability to listen for changes and track revertible objects on your undo/redo stacks. Revertibles allow you to undo and redo changes even if other changes have been made in remote clients.
Read more about Undo/redo at fluidframework.com
You can group multiple changes such that they are applied atomically, and if they fail, they fail atomically. As a result of grouping changes in a transaction, you also get a single revertible object making it easier to undo and redo.
Read more about Transactions at fluidframework.com
We have updated the Events to make it easier to create granular event listeners for single nodes and better support the undo/redo feature. SharedTree nodes now expose nodeChanged
and treeChanged
events that fire in response to changes in the node, and to changes in the subtree rooted at the node, respectively.
This change was originally made in #20286 (ac1e773960).
Read more about SharedTree Events at fluidframework.com
Schemas are even more powerful now with the added support for recursive types, which allows you to define types that reference nodes of the same type in their subtree.
Users of the beta APIs via SchemaFactoryRecursive
can now find them on SchemaFactory
.
Read more about Recursive Schema at fluidframework.com
Before deploying your application at scale, it is critical to have the holistic telemetry in place to monitor its usage and look for issues and optimizations. To make this easier, we are providing a fluid-telemetry package that comes with Typed telemetry events that you can funnel to your any analytics tool of your choice. If you decide to use Azure App Insights to view this data, we also provide helper packages and dashboard queries to get you started quickly. You can learn more at https://aka.ms/fluid/telemetry.
Fluid Framework packages have been updated to use the package.json "exports" field to define explicit entry points for both TypeScript types and implementation code.
This means that using Fluid Framework packages require the following TypeScript settings in tsconfig.json:
"moduleResolution": "Node16"
with "module": "Node16"
"moduleResolution": "Bundler"
with "module": "ESNext"
We recommend using Node16/Node16 unless absolutely necessary. That will produce transpiled JavaScript that is suitable for use with modern versions of Node.js and Bundlers. See the TypeScript documentation for more information regarding the module and moduleResolution options.
Node10 moduleResolution is not supported; it does not support Fluid Framework's API structuring pattern that is used to distinguish stable APIs from those that are in development.
The code details and package API surface was deprecated in @fluidframework/core-interfaces in 0.53 and has now been removed. Please import them from @fluidframework/container-definitions instead. These include:
SharedDirectory now only exports its factory and the interface type. The actual concrete classes which leak implementation details are no longer exported. Users of the SharedDirectory
type should use ISharedDirectory
.
Most of other internal crufts are also hided within the API surface, such as the encoded format, ILocalValue, ICreateInfo, local op metadata types, etc.
Remove unneeded mutability from some interface members.
Please use SharedTree for new containers. SharedMap is supported for loading preexisting Fluid Framework 1.x containers only.
Fluid Framework 1.x users migrating to Fluid Framework 2.x will need to import SharedMap from the './legacy' import path.
import { SharedMap } from "fluid-framework/legacy";
The static objects used as SharedObjectClass now explicitly implement the new ISharedObjectKind type. SharedObjectClass has been removed as ISharedObjectKind now fills that role. LoadableObjectCtor has been inlined as it only had one use: an external user of it can replace it with (new (...args: any[]) => T)
.
TreeView now is parameterized over the field schema instead of the root field type. This was needed to infer the correct input type when reassigning the root. Code providing an explicit type to TreeView, like TreeView<Foo>
can usually be updated by replacing that with TreeView<typeof Foo>
.
Empty optional fields on object nodes now are now undefined non-enumerable own properties. This improves behavior in cases where they shadow inherited members which no longer have types which differ from the runtime behavior.
None.
Change IDocumentDeltaConnection.submitSignal's content argument type to string which represents actual/known use.
IContainerContext.getSpecifiedCodeDetails() was deprecated in 0.42 and has now been removed.
This change could be ignored, unless you have custom implementations of IFluidDataStoreChannel or listened to IFluidDataStoreContext's "attached" or "attaching" events
IFluidDataStoreContext no longer raises events. Instead, it will call IFluidDataStoreChannel.setAttachState(). If you are implementing data store runtme, please implement setAttachState() API and rely on this flow. If you are not data store developer, and were reaching out to context, then please stop doing it - the only purpose of IFluidDataStoreContext is communication with IFluidDataStoreChannel. Context object should not be exposed by impplementers of IFluidDataStoreChannel. If you are using stock implementations of IFluidDataStoreChannel, you can listen for same events on IFluidDataStoreRuntime instead.
The test-driver-definitions package is intended to aid in testing internal to the FluidFramework repo, and should not be used outside of the repo.
Published by github-actions[bot] 6 months ago
This is a minor release.
Published by github-actions[bot] 6 months ago
This is a minor release.
Published by github-actions[bot] 6 months ago
This is a minor release.
Published by github-actions[bot] 6 months ago
#20468
#20441
#20319
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.2.0.1...client_v2.0.0-rc.2.0.2
Published by github-actions[bot] 7 months ago
#20465
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.1.0.7...client_v2.0.0-rc.1.0.8
Published by github-actions[bot] 7 months ago
#20421
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.1.0.6...client_v2.0.0-rc.1.0.7
Published by github-actions[bot] 7 months ago
This is a minor release.
Published by github-actions[bot] 7 months ago
This is a minor release.
Published by github-actions[bot] 7 months ago
This is a minor release.
Published by github-actions[bot] 7 months ago
This is a minor release.
Published by github-actions[bot] 7 months ago
#20277
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.2.0.0...client_v2.0.0-rc.2.0.1
Published by github-actions[bot] 7 months ago
#20287
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.1.0.5...client_v2.0.0-rc.1.0.6
Published by github-actions[bot] 7 months ago
#20264
#20260
#20211
internalSchema()
#20223
#20094
#19929
#19865
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-rc.1.0.4...client_v2.0.0-rc.1.0.5
Published by github-actions[bot] 7 months ago
#20179
#19928
#19869
#19864
Full Changelog: https://github.com/microsoft/FluidFramework/compare/client_v2.0.0-internal.8.0.7...client_v2.0.0-internal.8.0.8
Published by github-actions[bot] 7 months ago
SharedObject
and SharedObjectCore
are intended for authoring DDSes, and thus are only intended for use within the Fluid Framework client packages. They is no longer publicly exported: any users should fine their own solution or be upstreamed. SharedObject
and SharedObjectCore
are available for now as @alpha
to make this migration less disrupting for any existing users.
The ContainerSchema
type is intended for defining input to these packages. This should make the APIs more tolerant and thus be non-breaking, however its possible for some users of ContainerSchema
to use it in ways where this could be a breaking change: any such users should remove their mutations and/or use a different type.
EventEmitterWithErrorHandling is intended for authoring DDSes, and thus is only intended for use within the Fluid Framework client packages. It is no longer publicly exported: any users should fine their own solution or be upstreamed. EventEmitterWithErrorHandling is available for now as @alpha
to make this migration less disrupting for any existing users.
This was deprecated because PureDataObjectFactory.createRootInstance
has an issue at scale. PureDataObjectFactory.createRootInstance
used the old method of creating PureDataObject
s with names. The issue was that simultaneous creations could happen, and the old api had no good way of dealing with those types of collisions. This version slightly improved it by resolving those collisions by assuming whatever datastore was created with the alias or rootDataStoreId
would just return that datastore. This will work for developers who expect the same type of PureDataObject
to be returned from the createRootInstance
api, but if a potentially different PureDataObject
would be returned, then this api would give you the wrong typing.
For a replacement api see PureDataObjectFactory.createInstanceWithDataStore
.
This was done as a replacement of PureDataObjectFactory.createRootInstance
. This exposes the IDataStore
interface in the form of [PureDataObject, IDataStore]
. IDataStore
provides the opportunity for developers to use the IDataStore.trySetAlias
method. This can return 3 different scenarios Success
, Conflict
, or AlreadyAliased
. These scenarios can allow the developer to handle conflicts as they wish.
The return type of PureDataObjectFactory.instantiateDataStore
was changed from FluidDataStoreRuntime
to
IFluidDataStoreChannel
.
IDeltaManager.inbound
was deprecated because it was not very useful to the customer and there are pieces of functionality that can break the core runtime if used improperly. For example, summarization and processing batches. Do not use the apis on this if possible. Data loss/corruption may occur in these scenarios in which IDeltaManger.inbound.pause()
or IDeltaManager.inbound.resume()
get called.
Deprecated IDeltaManager.outbound
as it was not very useful to the customer and there are pieces of functionality that can break the core runtime if used improperly. For example, generation of batches and chunking. Op batching and chunking can be broken. Data loss/corruption may occur in these scenarios in which IDeltaManger.inbound.pause()
or IDeltaManager.inbound.resume()
get called.
IDeltaManager.inbound.on("op", ...)
are IDeltaManager.on("op", ...)
IDeltaManager.inbound.pause
, IDeltaManager.outbound.pause
for IContainer
disconnect use IContainer.disconnect
.IDeltaManager.inbound.resume
, IDeltaManager.outbound.resume
for IContainer
reconnect use IContainer.connect
.ILoaderOptions has been narrowed to the specific set of supported loader options, and may no longer be used to pass arbitrary key/value pairs through to the runtime.
Added containerMetadata
prop on IContainer interface.
The attach
function on IContainer has been modified such that the container stay open on non-fatal errors. On failure of attach the developer should inspect IContainer.closed to see if the container has been closed. If not closed, the developer can retry calling attach.
The functionality is currently behind a configuration Fluid.Container.RetryOnAttachFailure
which can be set to true
to enable the new functionality.
In the next release we will default to the new behavior, and it will be possible to disable this behavior by setting Fluid.Container.RetryOnAttachFailure
to false
IParsedUrl
previously claimed to accept null
version to indicate that we should not load from a snapshot, but this was internally converted into undefined
(thereby loading from latest snapshot). The typing has been updated to reflect this reality.
serialize
is being changed to align format with similar APIs. There are no changes in external behaviour.
LazyLoadedDataObject and LazyLoadedDataObjectFactory are not recommended for use and have been removed.
get
and serialize
are now deprecatedITelemetryContext is to be used only for instrumentation, not for attempting to read the values already set by other code. This is important because this public interface may soon use FF's should-be internal logging instrumentation types, which we reserve the right to expand (to support richer instrumentation). In that case, we would not be able to do so in a minor release if they're used as an "out" type like the return type for get
.
There is no replacement given in terms of immediate programmatic access to this data. The expected use pattern is something like this:
ITelemetryContext
and passes it aroundserialize
(on the concrete impl, not exposed on the interface any longer) and passes the result to a loggerThis change should be a no-op for consumers, as there were already better static creation/deserialization functions for use and compressor types are generally unused outside the runtime.
SharedCounter.create
now returns ISharedCounter
instead of SharedCounter
.
The deprecated logIfFalse()
function has been removed. Consumers who want to keep using it can reimplement in in their codebase by copying it from a previous version of the @fluidframework/telemetry-utils
package.
The OpStorage class was non-functional, and has been removed.
The ITelemetryProperties
interface was deprecated and has been removed. Use the identical ITelemetryBaseProperties
instead.
The TelemetryEventCategory
type was deprecated and has been removed from @fluidframework/core-interfaces
, since it had moved to @fluidframework/telemetry-utils
in the past.
The TelemetryEventPropertyType
type alias was deprecated and has been removed. Use the identical TelemetryBaseEventPropertyType
instead.
The ITaggedTelemetryPropertyType
interface was deprecated and has been removed. Use Tagged<TelemetryBaseEventPropertyType>
instead.
The Fluid Framework API has been clarified with tags applied to package exports. As we are working toward a clear, safe, and stable API surface, some build settings and imports may need to be adjusted.
Now: Most packages are specifying "exports" - import specifierss like @fluidframework/foo/lib/internals
will become build errors. The fix is to use only public APIs from @fluidframework/foo.
Coming soon: Build resolutions (moduleResolution
in tsconfig compilerOptions) will need to be resolved with Node16, NodeNext, or a bundler that supports resolution of named import/export paths. Internally, some FF packages will use @fluidframework/foo/internal
import paths that allow packages to talk to each other using non-public APIs.
Final stage: APIs that are not tagged @public will be removed from @fluidframework/foo imports.
Previously, IResolvedUrl.url
could use a non-standard protocol like fluid://
, fluid-odsp://
, or fluid-test://
. These have been replaced with https://
to permit standards-compliant URL parsing.
ISnapshotContents
ISnapshotContents
is deprecated. It has been replaced with ISnapshot
.
The repositoryUrl
member of IDocumentStorageService
was unused and always equal to the empty string. It has been removed.
Rename IterableTreeListContent
to IterableTreeArrayContent
, inline TreeMapNodeBase
into TreeMapNode
, rename TreeArrayNode.spread
to TreeArrayNode.spread
and remove create
which was not supposed to be public (use TreeArrayNode.spread
instead).
Error-related enums ContainerErrorType
, DriverErrorType
, OdspErrorType
and RouterliciousErrorType
were previously deprecated and are now removed. There are replacement object-based enumerations of ContainerErrorTypes
, DriverErrorTypes
, OdspErrorTypes
and RouterliciousErrorTypes
. Refer to the release notes of Fluid Framework version 2.0.0-internal.7.0.0 for details on the replacements.
SharedMap and SharedTree now only export their factories and the interface types. The actual concrete classes which leak implementation details are no longer exported. Users of the SharedMap
type should use ISharedMap
. Users of the SharedTree
type should use ISharedTree
.
Previously, ephemeral containers were created by adding an isEphemeralContainer
flag in IRouterliciousDriverPolicies
. Now, it is controlled by a createAsEphemeral
flag on the resolved URL. See https://github.com/microsoft/FluidFramework/pull/19544 for an example of how to set this flag via your URL resolver.
FlushMode.Immediate
is deprecated and will be removed in the next major version. It should not be used. Use FlushMode.TurnBased
instead, which is the default. See https://github.com/microsoft/FluidFramework/tree/main/packages/runtime/container-runtime/src/opLifecycle#how-batching-works for more information
Add TChannel
type parameter (which defaults to IFluidLoadable
) to IChannelFactory
. When left at its default this preserves the old behavior, however packages exporting IChannelFactory
will now reference IFluidLoadable
if not providing a different parameter and thus will implicitly depend on @fluidframework/core-interfaces.
IFluidDataStoreRuntime.logger
is now an ITelemetryBaseLogger
instead of the deprecated ITelemetryLogger
. The sendTelemetryEvent()
, sendErrorEvent()
, or sendPerformanceEvent()
methods were not intended for users of IFluidDataStoreRuntime
. You can keep using the logger's send()
method to generate telemetry.
Remove deprecated method: createNavParam from odsp-driver's odspDriverUrlResolverForShareLink.
Removed the deprecated logic of creating sharing-links with container attach (called SingleRT) which was enabled via enableShareLinkWithCreate flag in HostStoragePolicy. This change removes SharingLinkTypes interface definition, removes other deprecated properties from the odsp-driver's resolvedUrl object and also removes the enableShareLinkWithCreate flag. The newer version of SingleRT feature continues to exist, which can be enabled via enableSingleRequestForShareLinkWithCreate feature flag in HostStoragePolicy.
Added a new method called appendLocatorParams
to odspDriverUrlResolverForShareLink
class which appends locator params to the base URL provided.
This change should be a no-op for consumers, as these types were almost certainly unused and are also available in the standalone package id-compressor (see https://github.com/microsoft/FluidFramework/pull/18749).
The ISignalEnvelope
interface has been moved to the @fluidframework/core-interfaces package.
@fluidframework/data-object-base is now @fluid-experimental/data-object-base, and is not recommended for use in production. Prefer to use the data object classes from @fluidframework/aqueduct.
The deprecated ITelemetryErrorEvent
, ITelemetryGenericEvent
, and ITelemetryPerformanceEvent
interfaces, which represented different kinds of telemetry events, were not intended for consumers of Fluid Framework and have thus been removed. ITelemetryBaseEvent
is the only telemetry event interface that should be used in/by consuming code.
ITelemetryLogger
was not intended for consumers of Fluid Framework and has been removed. Consumers should use the simpler ITelemetryBaseLogger
instead.
The ink package has always been in an experimental state, but this has not been clearly communicated (primarly just through notes in TODO.md). It has now been moved to the @fluid-experimental scope to more clearly indicate its development state.
The view-interfaces package has been removed without replacement. The mountable view interfaces have been moved to the example-utils directory of the FluidFramework repo and may be used as a reference if needed, though this pattern is not recommended.
This package was experimental and has been removed. No replacement is provided, but the patterns from the example packages can be used to instruct binding to a view.
The @fluid-tools/webpack-fluid-loader package is no longer published as it is not a recommended pattern. Please consult fluidframework.com for current example patterns.
The FluidAppOdspUrlResolver class is now incorporated into the @fluidframework/odsp-urlresolver package.
The view-adapters package has been removed without replacement. The MountableView
class has been moved to the example-utils directory of the FluidFramework repo and may be used as a reference if needed, though this pattern is not recommended.
The mocha-test-setup package is intended to aid in testing internal to the FluidFramework repo, and should not be used outside of the repo.
LazyLoadedDataObject
and LazyLoadedDataObjectFactory
have been deprecated and are not recommended for use. For lazy loading of data objects, prefer to defer dereferencing their handles.
The DDS interception pattern was intended to support attribution scenarios but is now in process of being replaced by a different attributor approach. It is not recommended for use.
The @fluidframework/protocol-definitions dependency has been upgraded to v3.2.0.
The following Fluid server dependencies have been updated to the latest version, 4.0.0. See the full changelog.
Published by github-actions[bot] 7 months ago
The acceptable values for the querystrings passed to RestWrapper must be string | number | boolean (previously accepted unknown). Other values cannot be successfully stringified and so should be avoided.
Removed the websocket component of Alfred and stood it as a new microservice, Nexus. When running locally it will run on port 3002. Clients that have discovery enabled and use deltaStreamUrl need no change as they will automatically connect to Nexus. If support for older clients is necessary, an Nginx redirect for Alfred socket requests to be forwarded to Nexus can be used.