Contents
- 🚨 Breaking Changes
- Deprecated ITelemetryLoggerExt methods and related types removed (#27476)
- getPresence export removed (#27536)
- minVersionForCollabOverride removed from createTreeContainerRuntimeFactory props argument (#27540)
- ITelemetryBaseLogger.minLogLevel may be undefined (#27546)
- OdspFluidDataStoreLocator optional properties may also be explicitly undefined (#27551)
- 🌳 SharedTree DDS Changes
- TableSchema (beta) methods now accept positional arguments (#27545)
- Editing a SharedTree during its change-event callbacks now consistently throws (#27285)
- TreeBranchAlpha.isMissingEditsFrom (#27583)
- 🐛 Bug Fixes
- Forks created on "changed" event are no longer auto-disposed (#27580)
- Legacy API Changes
- Remove deprecated ILoaderOptions.enableOfflineLoad (#27574)
- Other Changes
- New public APIs for loading containers from ODSP snapshots and collecting telemetry (#27182)
🚨 Breaking Changes
Deprecated ITelemetryLoggerExt methods and related types removed (#27476)
Methods on ITelemetryLoggerExt are removed except for send inherited from ITelemetryBaseLogger.
See issue #26910 for complete details.
Change details
Commit: fb992c3
Affected packages:
- @fluidframework/telemetry-utils
⬆️ Table of contents
getPresence export removed (#27536)
Import from fluid-framework instead. See #26397.
Change details
Commit: a3c731f
Affected packages:
- @fluidframework/presence
⬆️ Table of contents
minVersionForCollabOverride removed from createTreeContainerRuntimeFactory props argument (#27540)
Instead specify minVersionForCollaboration property directly. (Deprecated compatibilityMode property should also be removed.) See #27356 and #23289.
Change details
Commit: da469ff
Affected packages:
- @fluidframework/fluid-static
⬆️ Table of contents
ITelemetryBaseLogger.minLogLevel may be undefined (#27546)
Typing for ITelemetryBaseLogger.minLogLevel is updated to reflect that in some implementations minLogLevel is present but evaluates to undefined. When building with excactOptionalPropertyTypes:false as suggested in compatibility requirements, there is no apparent type change. If a type error is experienced, make sure to check for undefined or use ?? LogLevel.info when reading.
Change details
Commit: 6afb933
Affected packages:
- @fluidframework/azure-client
- @fluidframework/core-interfaces
⬆️ Table of contents
OdspFluidDataStoreLocator optional properties may also be explicitly undefined (#27551)
Typing for OdspFluidDataStoreLocator optional properties are updated to reflect that in some implementations those are present but evaluate to undefined. When building with excactOptionalPropertyTypes:false as suggested in compatibility requirements, there is no apparent type change. If a type error is experienced, make sure to check for undefined when reading.
Change details
Commit: 6a323db
Affected packages:
- @fluidframework/odsp-driver
⬆️ Table of contents
🌳 SharedTree DDS Changes
TableSchema (beta) methods now accept positional arguments (#27545)
The insertColumns, insertRows, setCell, and removeCell methods on TableSchema.Table now accept positional arguments in addition to the existing property-bag form. The new overloads remove a layer of object construction at call sites and make the common cases more concise.
The existing property-bag overloads continue to work but are now deprecated. They will be removed in a future release.
Migration
// ...
// Before
table.insertColumns({ columns: [columnA, columnB] });
table.insertColumns({ index: 0, columns: [columnA] });
table.insertRows({ rows: [rowA, rowB] });
table.insertRows({ index: 0, rows: [rowA] });
table.setCell({ key: { column, row }, cell });
table.removeCell({ column, row });
// After
table.insertColumns([columnA, columnB]);
table.insertColumns([columnA], 0);
table.insertRows([rowA, rowB]);
table.insertRows([rowA], 0);
table.setCell(row, column, cell);
table.removeCell(row, column);Change details
Commit: e121ff7
Affected packages:
- @fluidframework/tree
- fluid-framework
⬆️ Table of contents
Editing a SharedTree during its change-event callbacks now consistently throws (#27285)
Editing a SharedTree from inside one of its change-event callbacks has always been forbidden, but some paths were not being caught: edits and the start of a transaction (along with branch operations, reverts, etc.) made while the tree was emitting its post-change notification ran to completion instead of throwing.
Such edits would apply to the tree, trigger further change notifications, and could re-enter the same listener for the resulting commits. This can produce infinite edit loops, redundant work across clients, incorrect attribution, broken undo/redo grouping, and pollution of the outer commit's label data.
This release closes those gaps: both editing the tree and starting a transaction during a change-event callback now throw the same canonical UsageError as the other change-event callbacks:
Editing the tree is forbidden during a change event callback
Running a transaction is forbidden during a change event callback
More generally, edits should not be made in response to changes to the document. See Editing in response to change events for why, and for the recommended alternatives.
Change details
Commit: 255d450
Affected packages:
- @fluidframework/tree
- fluid-framework
⬆️ Table of contents
TreeBranchAlpha.isMissingEditsFrom (#27583)
Adds a new method (isMissingEditsFrom(branch: TreeBranch): boolean) to TreeBranchAlpha. isMissingEditsFrom can be used to determine whether there are edits on the given branch that have not yet been merged into this branch.
Change details
Commit: ef92f1f
Affected packages:
- fluid-framework
- @fluidframework/tree
⬆️ Table of contents
🐛 Bug Fixes
Forks created on "changed" event are no longer auto-disposed (#27580)
The "changed" event is emitted from a TreeBranch when a change is made to the branch. Previously, when this event was fired due to a transaction being committed, it was possible to fork the branch in response to the "changed" event, but such a fork would be automatically disposed immediately after the event callback. This was a bug. Such forks are no longer disposed automatically.
Change details
Commit: ae64be7
Affected packages:
- @fluidframework/tree
- fluid-framework
⬆️ Table of contents
Legacy API Changes
Remove deprecated ILoaderOptions.enableOfflineLoad (#27574)
The enableOfflineLoad property has been removed from ILoaderOptions in @fluidframework/container-definitions. This property was previously marked @deprecated Do not use.
The legacy Fluid.Container.enableOfflineLoad config-provider feature gate has also been removed from @fluidframework/container-loader. Offline load is now unconditionally enabled for interactive clients; it can still be controlled via the Fluid.Container.enableOfflineFull config.
Migration: Remove any usage of enableOfflineLoad from ILoaderOptions objects. No replacement is needed — offline load is on by default.
Change details
Commit: daf022b
Affected packages:
- @fluidframework/container-definitions
- @fluidframework/container-loader
⬆️ Table of contents
Other Changes
New public APIs for loading containers from ODSP snapshots and collecting telemetry (#27182)
Two new functions and their supporting types are now available in @fluidframework/fluid-runner:
createFluidRunnerLogger(filePath, options?) — Creates a file-backed telemetry logger that writes events to disk in JSON (default) or CSV format. Returns a logger (an ITelemetryBaseLogger to send events through) and a fileLogger (an IFileLogger whose close() method must be called when done to flush buffered events).
createFluidRunnerContainerAndExecute(snapshot, converter, logger, ...) — Loads a Fluid container from an ODSP snapshot (JSON string or binary Uint8Array), waits for it to catch up, then runs caller-provided code via an IFluidFileConverter. The container is automatically disposed after execution. Supports an optional timeout and the ability to disable network fetch to ensure fully offline operation.
Typical usage:
const { logger, fileLogger } = createFluidRunnerLogger("./telemetry.json");
const result = await createFluidRunnerContainerAndExecute(
snapshotContent,
myConverter,
logger,
options,
timeout,
);
await fileLogger.close();Supporting types:
IFileLogger— A telemetry logger that writes to a file and exposes aclose()method to flush buffered events.IFileLoggerTelemetryOptions— Configuration for the logger: output format (JSONorCSV), default properties added to every event, and flush batch size.
Change details
Commit: 7291a38
Affected packages:
- @fluidframework/fluid-runner
⬆️ Table of contents
🛠️ Start Building Today!
Please continue to engage with us on GitHub Discussion and Issue pages as you adopt Fluid Framework!