github microsoft/FluidFramework client_v2.110.0
Fluid Framework v2.110.0 (minor)

5 hours ago

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 a close() method to flush buffered events.
  • IFileLoggerTelemetryOptions — Configuration for the logger: output format (JSON or CSV), 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!

Don't miss a new FluidFramework release

NewReleases is sending notifications on new releases.