@fluid-experimental/dds-interceptions
v3.4.0
Published
Distributed Data Structures that support an interception callback
Keywords
Readme
@fluid-experimental/dds-interceptions
This package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.
IMPORTANT: This package is experimental. The APIs can change without notice.
Do not use it as a dependency in production scenarios. We do not guarantee the stability of this package or its APIs.
Using Fluid Framework libraries
For a dependency on a Fluid Framework library's public APIs, we recommend a ^ (caret) version range.
For example, use ^1.3.4.
For a dependency on an unstable API, such as a beta API, we recommend a more restrictive version range.
For example, use a ~ version range.
Installation
Run this command to install the package:
npm i @fluid-experimental/dds-interceptionsAPI Documentation
Read the @fluid-experimental/dds-interceptions API documentation at https://fluidframework.com/docs/apis/dds-interceptions.
Shared String With Interception
It provides createSharedStringWithInterception that accepts a SharedString, the data store context and a callback, and returns a SharedString object:
function createSharedStringWithInterception(
sharedString: SharedString,
context: IFluidDataStoreContext,
propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,
): SharedString;When a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.
For example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.
Shared Map With Interception
It provides createSharedMapWithInterception that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:
function createSharedMapWithInterception(
sharedMap: SharedMap,
context: IFluidDataStoreContext,
setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,
): SharedMap;When set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.
Example: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against "key.attribute". Or, it could use a separate SharedMap to store the user information against the same key.
Shared Directory / Sub Directory With Interception
It provides createdDirectoryWithInterception that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:
function createDirectoryWithInterception<T extends IDirectory>(
baseDirectory: T,
context: IFluidDataStoreContext,
setInterceptionCallback: (
baseDirectory: IDirectory,
subDirectory: IDirectory,
key: string,
value: any,
) => void,
): T;It can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:
- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.
- subDirectory: This is the directory that the set is called on and which calls the callback.
- key: They key that set was called with.
- value: They value that set was called with.
The original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.
Example: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.
Minimum Client Requirements
Fluid Framework client libraries support the platforms in this document. These requirements are intentionally restrictive. Within a major version series, we can relax these requirements, but we cannot make them stricter. For a Long Term Support (LTS) version, we might need to support these platforms for several years.
Other configurations can work, but Fluid Framework does not support them. If an unsupported configuration stops working, we do not classify this as a bug. To request support for a configuration that is not listed, file an issue. The product team will evaluate your request. In the issue, specify the current status of the configuration:
- The configuration works but needs official support.
- The configuration does not work and requires changes.
Supported Runtimes
- Fluid Framework supports Node.js versions 22 and 24 while they receive upstream support.
- Fluid Framework will stop support for version 22 when upstream support ends on 2027-04-30.
- Fluid Framework does not support Node.js with the
--no-experimental-fetchflag.
- Fluid Framework supports modern browsers that support the ES2022 standard library.
Supported Tools
- TypeScript 6.0:
- Fluid Framework supports all
strictoptions. - Set the build targets (
lib,target) toES2022or later. - Enable
strictNullChecks. - Fluid Framework does not support configuration options deprecated in TypeScript 6.0.
- Fluid Framework does not fully support
exactOptionalPropertyTypes. If you enable this option, do not usein,Reflect.has,Object.hasOwn, orObject.prototype.hasOwnPropertyto narrow members of Fluid Framework types. These methods can incorrectly excludeundefinedfrom the possible values.
- Fluid Framework supports all
- webpack 5
- We do not require a specific bundler. Other bundlers that handle ES Modules can work, but we actively test only webpack.
Module Resolution
In TypeScript compilerOptions, use Node16, Node20, NodeNext, or Bundler module resolution.
These settings follow the Node.js v12+ ESM Resolution and Loading algorithm.
Do not use Node10 module resolution.
Module Formats
- ES Modules: Use ES Modules to consume Fluid Framework client packages, including in Node.js.
- CommonJS: Fluid Framework does not officially support CommonJS in version 3.0 or later.
Contribution Guidelines
You can contribute to Fluid Framework in these ways:
- Answer questions in GitHub Discussions.
- Submit bug reports and help verify fixes.
- Review source code changes.
- Contribute bug fixes.
For detailed instructions, read the repo documentation.
This project follows the Microsoft Open Source Code of Conduct. For more information, read the Code of Conduct frequently asked questions. For questions or comments, contact [email protected].
This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services. Use of these trademarks or logos must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.
Help
Read the Fluid Framework documentation for information about Fluid Framework concepts and APIs.
To request information that the documentation does not contain, create an issue.
Trademark
This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.
Use of these trademarks or logos must follow Microsoft's Trademark & Brand Guidelines.
Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.
