fluid-framework 2.93.0 → 2.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # fluid-framework
2
2
 
3
+ ## 2.101.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode to recover documents with corrupted identifiers ([#27281](https://github.com/microsoft/FluidFramework/pull/27281)) [d9205ddcd6a](https://github.com/microsoft/FluidFramework/commit/d9205ddcd6a9f0ec11d5422b38e30a6a91a9258c)
8
+
9
+ A SharedTree bug can result in corrupted documents due to their attach summary compressing identifier-field values in a way that cannot be uncompressed.
10
+ This bug manifested as remote clients processing the op throwing an error with the message "Unknown op space ID.".
11
+
12
+ This change adds an option (`healUnresolvableIdentifiersOnDecode`) to `configuredSharedTreeBetaLegacy` which will allow documents affected by this bug to load again when enabled.
13
+ Enabling this option carries some risk, see documentation on the interface itself for more details.
14
+
15
+ #### Who is affected
16
+
17
+ Only SharedTrees attached to a container that was already attached can be impacted.
18
+ Furthermore, this bug only occurs when the attached tree contains [`identifier`](https://fluidframework.com/docs/api/tree/schemafactory-class#identifier-property) fields which contain implicitly generated default values.
19
+
20
+ - Fix a SharedTree document corruption bug ([#27292](https://github.com/microsoft/FluidFramework/pull/27292)) [6f4cdcb7a0a](https://github.com/microsoft/FluidFramework/commit/6f4cdcb7a0a76ba215a361c7b3a12943750fe286)
21
+
22
+ A SharedTree bug which could corrupt documents when attaching them to containers has been fixed.
23
+ See `healUnresolvableIdentifiersOnDecode` on `configuredSharedTreeBetaLegacy` for a potential mitigation path for documents that were already corrupted by this bug.
24
+
25
+ #### Who is affected
26
+
27
+ Only SharedTrees attached to a container that was already attached can be impacted.
28
+ Furthermore, this bug only occurs when the attached tree contains [`identifier`](https://fluidframework.com/docs/api/tree/schemafactory-class#identifier-property) fields which contain implicitly generated default values.
29
+
30
+ ## 2.100.0
31
+
32
+ ### Minor Changes
33
+
34
+ - Node 22 is now the minimum supported Node.js version ([#27116](https://github.com/microsoft/FluidFramework/pull/27116)) [e8214d29663](https://github.com/microsoft/FluidFramework/commit/e8214d29663f5ee98d737daed82506a25d8de8d0)
35
+
36
+ All Fluid Framework client packages now require Node.js 22 or later. This aligns with the standing Node upgrade policy as Node 20 reaches end-of-life on April 30, 2026.
37
+
3
38
  ## 2.93.0
4
39
 
5
40
  ### Minor Changes
@@ -1555,6 +1555,8 @@ export class SchemaFactoryAlpha<out TScope extends string | undefined = string |
1555
1555
  scopedFactoryAlpha<const T extends TName, TNameInner extends number | string = string>(name: T): SchemaFactoryAlpha<ScopedSchemaName<TScope, T>, TNameInner>;
1556
1556
  readonly stagedOptional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "stagedOptionalUpgrade" | "defaultProvider"> | undefined) => FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1557
1557
  static readonly stagedOptional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "stagedOptionalUpgrade" | "defaultProvider"> | undefined) => FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1558
+ readonly stagedOptionalRecursive: <const T extends System_Unsafe.ImplicitAllowedTypesUnsafe, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "stagedOptionalUpgrade" | "defaultProvider"> | undefined) => FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1559
+ static readonly stagedOptionalRecursive: <const T extends System_Unsafe.ImplicitAllowedTypesUnsafe, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "stagedOptionalUpgrade" | "defaultProvider"> | undefined) => FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1558
1560
  readonly withDefault: <Kind extends FieldKind, Types extends ImplicitAllowedTypes, TCustomMetadata = unknown>(fieldSchema: FieldSchema<Kind, Types, TCustomMetadata>, defaultValue: NodeProvider<ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true>>) => FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldPropsAlpha<TCustomMetadata> & {
1559
1561
  defaultProvider: DefaultProvider;
1560
1562
  }>;
@@ -1613,6 +1615,7 @@ export interface SchemaStatics {
1613
1615
  // @alpha @sealed @system
1614
1616
  export interface SchemaStaticsAlpha {
1615
1617
  readonly stagedOptional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider" | "stagedOptionalUpgrade">) => FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1618
+ readonly stagedOptionalRecursive: <const T extends System_Unsafe.ImplicitAllowedTypesUnsafe, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider" | "stagedOptionalUpgrade">) => FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata, FieldPropsAlpha<TCustomMetadata>>;
1616
1619
  readonly withDefault: <Kind extends FieldKind, Types extends ImplicitAllowedTypes, TCustomMetadata = unknown>(fieldSchema: FieldSchema<Kind, Types, TCustomMetadata>, defaultValue: NodeProvider<InsertableTreeFieldFromImplicitField<FieldSchema<Kind, Types>>>) => FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldPropsAlpha<TCustomMetadata> & {
1617
1620
  defaultProvider: DefaultProvider;
1618
1621
  }>;
@@ -1664,7 +1667,9 @@ export interface SharedTreeOptions extends SharedTreeOptionsBeta, Partial<CodecW
1664
1667
  }
1665
1668
 
1666
1669
  // @beta @input
1667
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
1670
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
1671
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
1672
+ }
1668
1673
 
1669
1674
  // @alpha @sealed
1670
1675
  export interface SimpleAllowedTypeAttributes<out Type extends SchemaType = SchemaType> {
@@ -1008,7 +1008,9 @@ export interface SharedObjectKind<out TSharedObject = unknown> extends ErasedTyp
1008
1008
  export const SharedTree: SharedObjectKind<ITree>;
1009
1009
 
1010
1010
  // @beta @input
1011
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
1011
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
1012
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
1013
+ }
1012
1014
 
1013
1015
  // @public @sealed @system
1014
1016
  export interface SimpleNodeSchemaBase<out TNodeKind extends NodeKind, out TCustomMetadata = unknown> {
@@ -1372,7 +1372,9 @@ export type SharedStringSegment = TextSegment | Marker;
1372
1372
  export const SharedTree: SharedObjectKind<ITree>;
1373
1373
 
1374
1374
  // @beta @input
1375
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
1375
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
1376
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
1377
+ }
1376
1378
 
1377
1379
  export { Side }
1378
1380
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluid-framework",
3
- "version": "2.93.0",
3
+ "version": "2.101.0",
4
4
  "description": "The main entry point into Fluid Framework public packages",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -57,24 +57,24 @@
57
57
  "main": "lib/index.js",
58
58
  "types": "lib/public.d.ts",
59
59
  "dependencies": {
60
- "@fluidframework/container-definitions": "~2.93.0",
61
- "@fluidframework/container-loader": "~2.93.0",
62
- "@fluidframework/core-interfaces": "~2.93.0",
63
- "@fluidframework/core-utils": "~2.93.0",
64
- "@fluidframework/driver-definitions": "~2.93.0",
65
- "@fluidframework/fluid-static": "~2.93.0",
66
- "@fluidframework/map": "~2.93.0",
67
- "@fluidframework/runtime-utils": "~2.93.0",
68
- "@fluidframework/sequence": "~2.93.0",
69
- "@fluidframework/shared-object-base": "~2.93.0",
70
- "@fluidframework/tree": "~2.93.0"
60
+ "@fluidframework/container-definitions": "~2.101.0",
61
+ "@fluidframework/container-loader": "~2.101.0",
62
+ "@fluidframework/core-interfaces": "~2.101.0",
63
+ "@fluidframework/core-utils": "~2.101.0",
64
+ "@fluidframework/driver-definitions": "~2.101.0",
65
+ "@fluidframework/fluid-static": "~2.101.0",
66
+ "@fluidframework/map": "~2.101.0",
67
+ "@fluidframework/runtime-utils": "~2.101.0",
68
+ "@fluidframework/sequence": "~2.101.0",
69
+ "@fluidframework/shared-object-base": "~2.101.0",
70
+ "@fluidframework/tree": "~2.101.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@arethetypeswrong/cli": "^0.18.2",
74
74
  "@biomejs/biome": "~2.4.5",
75
- "@fluid-tools/build-cli": "^0.64.0",
75
+ "@fluid-tools/build-cli": "^0.65.0",
76
76
  "@fluidframework/build-common": "^2.0.3",
77
- "@fluidframework/build-tools": "^0.64.0",
77
+ "@fluidframework/build-tools": "^0.65.0",
78
78
  "@fluidframework/eslint-config-fluid": "^9.0.0",
79
79
  "@microsoft/api-extractor": "7.58.1",
80
80
  "@types/node": "~22.19.17",