@fluidframework/tree 2.100.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.
Files changed (203) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/api-report/tree.alpha.api.md +3 -1
  3. package/api-report/tree.beta.api.md +3 -1
  4. package/api-report/tree.legacy.beta.api.md +3 -1
  5. package/dist/core/change-family/changeFamily.d.ts +23 -0
  6. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  7. package/dist/core/change-family/changeFamily.js.map +1 -1
  8. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
  9. package/dist/core/tree/detachedFieldIndexCodecV1.js +2 -0
  10. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
  11. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
  12. package/dist/core/tree/detachedFieldIndexCodecV2.js +2 -0
  13. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
  14. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -4
  15. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  16. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +30 -3
  17. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  18. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +27 -0
  19. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  20. package/dist/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  21. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  22. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +9 -1
  23. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  24. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +6 -1
  25. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  26. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -1
  27. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js +9 -1
  28. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -1
  29. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +3 -3
  30. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  31. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +8 -8
  32. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  33. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +2 -14
  34. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  35. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -17
  36. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  37. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  38. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +4 -0
  39. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  40. package/dist/packageVersion.d.ts +1 -1
  41. package/dist/packageVersion.js +1 -1
  42. package/dist/packageVersion.js.map +1 -1
  43. package/dist/shared-tree/independentView.d.ts.map +1 -1
  44. package/dist/shared-tree/independentView.js +2 -0
  45. package/dist/shared-tree/independentView.js.map +1 -1
  46. package/dist/shared-tree/sharedTree.d.ts +35 -1
  47. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  48. package/dist/shared-tree/sharedTree.js +6 -0
  49. package/dist/shared-tree/sharedTree.js.map +1 -1
  50. package/dist/shared-tree/sharedTreeChangeCodecs.js +1 -0
  51. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  52. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  53. package/dist/shared-tree/treeAlpha.js +2 -0
  54. package/dist/shared-tree/treeAlpha.js.map +1 -1
  55. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  56. package/dist/shared-tree/treeCheckout.js +2 -0
  57. package/dist/shared-tree/treeCheckout.js.map +1 -1
  58. package/dist/shared-tree-core/editManagerCodecs.d.ts +3 -0
  59. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  60. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  61. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +14 -0
  62. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  63. package/dist/shared-tree-core/editManagerCodecsCommons.js +14 -0
  64. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  65. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts +3 -0
  66. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  67. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  68. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +3 -0
  69. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  70. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  71. package/dist/shared-tree-core/editManagerSummarizer.d.ts +9 -1
  72. package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  73. package/dist/shared-tree-core/editManagerSummarizer.js +20 -5
  74. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  75. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  76. package/dist/shared-tree-core/messageCodecV1ToV4.js +4 -0
  77. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  78. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  79. package/dist/shared-tree-core/messageCodecVSharedBranches.js +4 -0
  80. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  81. package/dist/shared-tree-core/sharedTreeCore.d.ts +4 -0
  82. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  83. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  84. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  85. package/dist/simple-tree/api/schemaFactory.d.ts +3 -3
  86. package/dist/simple-tree/api/schemaFactory.js +3 -3
  87. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  88. package/dist/tableSchema.d.ts.map +1 -1
  89. package/dist/tableSchema.js +102 -20
  90. package/dist/tableSchema.js.map +1 -1
  91. package/lib/core/change-family/changeFamily.d.ts +23 -0
  92. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  93. package/lib/core/change-family/changeFamily.js.map +1 -1
  94. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
  95. package/lib/core/tree/detachedFieldIndexCodecV1.js +2 -0
  96. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
  97. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
  98. package/lib/core/tree/detachedFieldIndexCodecV2.js +2 -0
  99. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
  100. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -4
  101. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  102. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +30 -3
  103. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  104. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +27 -0
  105. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  106. package/lib/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  107. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  108. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +9 -1
  109. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  110. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +6 -1
  111. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  112. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -1
  113. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js +9 -1
  114. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -1
  115. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +3 -3
  116. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  117. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +8 -8
  118. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  119. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +2 -14
  120. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  121. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -17
  122. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  123. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  124. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +4 -0
  125. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  126. package/lib/packageVersion.d.ts +1 -1
  127. package/lib/packageVersion.js +1 -1
  128. package/lib/packageVersion.js.map +1 -1
  129. package/lib/shared-tree/independentView.d.ts.map +1 -1
  130. package/lib/shared-tree/independentView.js +2 -0
  131. package/lib/shared-tree/independentView.js.map +1 -1
  132. package/lib/shared-tree/sharedTree.d.ts +35 -1
  133. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  134. package/lib/shared-tree/sharedTree.js +6 -0
  135. package/lib/shared-tree/sharedTree.js.map +1 -1
  136. package/lib/shared-tree/sharedTreeChangeCodecs.js +1 -0
  137. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  138. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  139. package/lib/shared-tree/treeAlpha.js +2 -0
  140. package/lib/shared-tree/treeAlpha.js.map +1 -1
  141. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  142. package/lib/shared-tree/treeCheckout.js +2 -0
  143. package/lib/shared-tree/treeCheckout.js.map +1 -1
  144. package/lib/shared-tree-core/editManagerCodecs.d.ts +3 -0
  145. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  146. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  147. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +14 -0
  148. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  149. package/lib/shared-tree-core/editManagerCodecsCommons.js +14 -0
  150. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  151. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts +3 -0
  152. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  153. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  154. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +3 -0
  155. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  156. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  157. package/lib/shared-tree-core/editManagerSummarizer.d.ts +9 -1
  158. package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  159. package/lib/shared-tree-core/editManagerSummarizer.js +20 -5
  160. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  161. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  162. package/lib/shared-tree-core/messageCodecV1ToV4.js +4 -0
  163. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  164. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  165. package/lib/shared-tree-core/messageCodecVSharedBranches.js +4 -0
  166. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  167. package/lib/shared-tree-core/sharedTreeCore.d.ts +4 -0
  168. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  169. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  170. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  171. package/lib/simple-tree/api/schemaFactory.d.ts +3 -3
  172. package/lib/simple-tree/api/schemaFactory.js +3 -3
  173. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  174. package/lib/tableSchema.d.ts.map +1 -1
  175. package/lib/tableSchema.js +103 -21
  176. package/lib/tableSchema.js.map +1 -1
  177. package/package.json +22 -22
  178. package/src/core/change-family/changeFamily.ts +25 -0
  179. package/src/core/tree/detachedFieldIndexCodecV1.ts +2 -0
  180. package/src/core/tree/detachedFieldIndexCodecV2.ts +2 -0
  181. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +59 -10
  182. package/src/feature-libraries/chunked-forest/codec/codecs.ts +32 -0
  183. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +6 -1
  184. package/src/feature-libraries/chunked-forest/codec/nodeEncoder.ts +9 -1
  185. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -1
  186. package/src/feature-libraries/modular-schema/genericFieldKindFormat.ts +3 -21
  187. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +4 -0
  188. package/src/packageVersion.ts +1 -1
  189. package/src/shared-tree/independentView.ts +2 -0
  190. package/src/shared-tree/sharedTree.ts +41 -1
  191. package/src/shared-tree/sharedTreeChangeCodecs.ts +1 -0
  192. package/src/shared-tree/treeAlpha.ts +2 -0
  193. package/src/shared-tree/treeCheckout.ts +2 -0
  194. package/src/shared-tree-core/editManagerCodecs.ts +3 -0
  195. package/src/shared-tree-core/editManagerCodecsCommons.ts +29 -0
  196. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +3 -0
  197. package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +3 -0
  198. package/src/shared-tree-core/editManagerSummarizer.ts +17 -5
  199. package/src/shared-tree-core/messageCodecV1ToV4.ts +4 -0
  200. package/src/shared-tree-core/messageCodecVSharedBranches.ts +5 -1
  201. package/src/shared-tree-core/sharedTreeCore.ts +8 -1
  202. package/src/simple-tree/api/schemaFactory.ts +3 -3
  203. package/src/tableSchema.ts +134 -35
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @fluidframework/tree
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
+
3
30
  ## 2.100.0
4
31
 
5
32
  ### Minor Changes
@@ -1247,7 +1247,9 @@ export interface SharedTreeOptions extends SharedTreeOptionsBeta, Partial<CodecW
1247
1247
  }
1248
1248
 
1249
1249
  // @beta @input
1250
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
1250
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
1251
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
1252
+ }
1251
1253
 
1252
1254
  // @alpha @sealed
1253
1255
  export interface SimpleAllowedTypeAttributes<out Type extends SchemaType = SchemaType> {
@@ -597,7 +597,9 @@ export class SchemaUpgrade {
597
597
  type ScopedSchemaName<TScope extends string | undefined, TName extends number | string> = TScope extends undefined ? `${TName}` : `${TScope}.${TName}`;
598
598
 
599
599
  // @beta @input
600
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
600
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
601
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
602
+ }
601
603
 
602
604
  // @public @sealed @system
603
605
  export interface SimpleNodeSchemaBase<out TNodeKind extends NodeKind, out TCustomMetadata = unknown> {
@@ -609,7 +609,9 @@ export const SharedTreeAttributes: IChannelAttributes;
609
609
  export const SharedTreeFactoryType = "https://graph.microsoft.com/types/tree";
610
610
 
611
611
  // @beta @input
612
- export type SharedTreeOptionsBeta = ForestOptions & Partial<CodecWriteOptionsBeta>;
612
+ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWriteOptionsBeta> {
613
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
614
+ }
613
615
 
614
616
  // @public @sealed @system
615
617
  export interface SimpleNodeSchemaBase<out TNodeKind extends NodeKind, out TCustomMetadata = unknown> {
@@ -17,6 +17,29 @@ export interface ChangeEncodingContext {
17
17
  readonly revision: RevisionTag | undefined;
18
18
  readonly idCompressor: IIdCompressor;
19
19
  readonly schema?: SchemaAndPolicy;
20
+ /**
21
+ * `true` when this context is encoding to or decoding from a summary blob.
22
+ * `false` when this context is for an op (or any other non-summary path,
23
+ * including utility encoders that aren't tied to persistence).
24
+ *
25
+ * @remarks
26
+ * Used to gate decode-time recovery behavior — for example, healing of
27
+ * unresolvable identifier IDs — that should only run when loading a
28
+ * (possibly broken) attach-summary blob, never when applying ops.
29
+ */
30
+ readonly isSummary: boolean;
31
+ /**
32
+ * If `true`, identifier values that the local id-compressor cannot resolve
33
+ * during decode are healed into deterministic stable UUIDs instead of
34
+ * throwing. See {@link FieldBatchEncodingContext.healUnresolvableIdentifiersOnDecode}.
35
+ * Only takes effect when `isSummary` is also `true`.
36
+ */
37
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
38
+ /**
39
+ * The SharedTree's shared-object id, used as input to the deterministic
40
+ * UUID derivation when {@link healUnresolvableIdentifiersOnDecode} triggers.
41
+ */
42
+ readonly sharedObjectId?: string;
20
43
  }
21
44
  export type ChangeFamilyCodec<TChange> = IJsonCodec<TChange, JsonCompatibleReadOnly, JsonCompatibleReadOnly, ChangeEncodingContext>;
22
45
  export interface ChangeFamilyEditor {
@@ -1 +1 @@
1
- {"version":3,"file":"changeFamily.d.ts","sourceRoot":"","sources":["../../../src/core/change-family/changeFamily.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,kBAAkB,EAAE,OAAO;IACxE,WAAW,CACV,eAAe,EAAE,MAAM,WAAW,EAClC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,GACrD,OAAO,CAAC;IAEX,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI,UAAU,CAClD,OAAO,EACP,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,CACrB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC;;;;;;;OAOG;IACH,gBAAgB,IAAI,IAAI,CAAC;IAEzB;;;;;;;OAOG;IACH,eAAe,IAAI,IAAI,CAAC;CACxB"}
1
+ {"version":3,"file":"changeFamily.d.ts","sourceRoot":"","sources":["../../../src/core/change-family/changeFamily.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,kBAAkB,EAAE,OAAO;IACxE,WAAW,CACV,eAAe,EAAE,MAAM,WAAW,EAClC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,GACrD,OAAO,CAAC;IAEX,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,mCAAmC,CAAC,EAAE,OAAO,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI,UAAU,CAClD,OAAO,EACP,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,CACrB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC;;;;;;;OAOG;IACH,gBAAgB,IAAI,IAAI,CAAC;IAEzB;;;;;;;OAOG;IACH,eAAe,IAAI,IAAI,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"changeFamily.js","sourceRoot":"","sources":["../../../src/core/change-family/changeFamily.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IIdCompressor, SessionId } from \"@fluidframework/id-compressor\";\n\nimport type { ICodecFamily, IJsonCodec } from \"../../codec/index.js\";\nimport type { SchemaAndPolicy } from \"../../core/index.js\";\nimport type { JsonCompatibleReadOnly } from \"../../util/index.js\";\nimport type { ChangeRebaser, RevisionTag, TaggedChange } from \"../rebase/index.js\";\n\nexport interface ChangeFamily<TEditor extends ChangeFamilyEditor, TChange> {\n\tbuildEditor(\n\t\tmintRevisionTag: () => RevisionTag,\n\t\tchangeReceiver: (change: TaggedChange<TChange>) => void,\n\t): TEditor;\n\n\treadonly rebaser: ChangeRebaser<TChange>;\n\treadonly codecs: ICodecFamily<TChange, ChangeEncodingContext>;\n}\n\nexport interface ChangeEncodingContext {\n\treadonly originatorId: SessionId;\n\treadonly revision: RevisionTag | undefined;\n\treadonly idCompressor: IIdCompressor;\n\treadonly schema?: SchemaAndPolicy;\n}\n\nexport type ChangeFamilyCodec<TChange> = IJsonCodec<\n\tTChange,\n\tJsonCompatibleReadOnly,\n\tJsonCompatibleReadOnly,\n\tChangeEncodingContext\n>;\n\nexport interface ChangeFamilyEditor {\n\t/**\n\t * Must be called when a new transaction starts.\n\t *\n\t * Note: transactions are an optional feature. It is valid to make edits outside of a transaction.\n\t *\n\t * For each call to this function, a matching call to `exitTransaction` must be made at a later time.\n\t * Can be called repeatedly to indicate the start of nesting transactions.\n\t */\n\tenterTransaction(): void;\n\n\t/**\n\t * Must be called when a transaction ends.\n\t *\n\t * Note: transactions are an optional feature. It is valid to make edits outside of a transaction.\n\t *\n\t * For each call to this function, a matching call to `enterTransaction` must be made at an earlier time.\n\t * Can be called repeatedly to indicate the end of nesting transactions.\n\t */\n\texitTransaction(): void;\n}\n"]}
1
+ {"version":3,"file":"changeFamily.js","sourceRoot":"","sources":["../../../src/core/change-family/changeFamily.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IIdCompressor, SessionId } from \"@fluidframework/id-compressor\";\n\nimport type { ICodecFamily, IJsonCodec } from \"../../codec/index.js\";\nimport type { SchemaAndPolicy } from \"../../core/index.js\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Referenced by doc comments\nimport type { FieldBatchEncodingContext } from \"../../feature-libraries/index.js\";\nimport type { JsonCompatibleReadOnly } from \"../../util/index.js\";\nimport type { ChangeRebaser, RevisionTag, TaggedChange } from \"../rebase/index.js\";\n\nexport interface ChangeFamily<TEditor extends ChangeFamilyEditor, TChange> {\n\tbuildEditor(\n\t\tmintRevisionTag: () => RevisionTag,\n\t\tchangeReceiver: (change: TaggedChange<TChange>) => void,\n\t): TEditor;\n\n\treadonly rebaser: ChangeRebaser<TChange>;\n\treadonly codecs: ICodecFamily<TChange, ChangeEncodingContext>;\n}\n\nexport interface ChangeEncodingContext {\n\treadonly originatorId: SessionId;\n\treadonly revision: RevisionTag | undefined;\n\treadonly idCompressor: IIdCompressor;\n\treadonly schema?: SchemaAndPolicy;\n\t/**\n\t * `true` when this context is encoding to or decoding from a summary blob.\n\t * `false` when this context is for an op (or any other non-summary path,\n\t * including utility encoders that aren't tied to persistence).\n\t *\n\t * @remarks\n\t * Used to gate decode-time recovery behavior — for example, healing of\n\t * unresolvable identifier IDs — that should only run when loading a\n\t * (possibly broken) attach-summary blob, never when applying ops.\n\t */\n\treadonly isSummary: boolean;\n\t/**\n\t * If `true`, identifier values that the local id-compressor cannot resolve\n\t * during decode are healed into deterministic stable UUIDs instead of\n\t * throwing. See {@link FieldBatchEncodingContext.healUnresolvableIdentifiersOnDecode}.\n\t * Only takes effect when `isSummary` is also `true`.\n\t */\n\treadonly healUnresolvableIdentifiersOnDecode?: boolean;\n\t/**\n\t * The SharedTree's shared-object id, used as input to the deterministic\n\t * UUID derivation when {@link healUnresolvableIdentifiersOnDecode} triggers.\n\t */\n\treadonly sharedObjectId?: string;\n}\n\nexport type ChangeFamilyCodec<TChange> = IJsonCodec<\n\tTChange,\n\tJsonCompatibleReadOnly,\n\tJsonCompatibleReadOnly,\n\tChangeEncodingContext\n>;\n\nexport interface ChangeFamilyEditor {\n\t/**\n\t * Must be called when a new transaction starts.\n\t *\n\t * Note: transactions are an optional feature. It is valid to make edits outside of a transaction.\n\t *\n\t * For each call to this function, a matching call to `exitTransaction` must be made at a later time.\n\t * Can be called repeatedly to indicate the start of nesting transactions.\n\t */\n\tenterTransaction(): void;\n\n\t/**\n\t * Must be called when a transaction ends.\n\t *\n\t * Note: transactions are an optional feature. It is valid to make edits outside of a transaction.\n\t *\n\t * For each call to this function, a matching call to `enterTransaction` must be made at an earlier time.\n\t * Can be called repeatedly to indicate the end of nesting transactions.\n\t */\n\texitTransaction(): void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"detachedFieldIndexCodecV1.d.ts","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAEN,KAAK,gBAAgB,EAGrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,wBAAwB,EAAS,MAAM,8BAA8B,CAAC;AAgDpF,wBAAgB,8BAA8B,CAC7C,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,aAAa,GACzB,cAAc,CAAC,wBAAwB,CAAC,CAO1C"}
1
+ {"version":3,"file":"detachedFieldIndexCodecV1.d.ts","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAEN,KAAK,gBAAgB,EAGrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,wBAAwB,EAAS,MAAM,8BAA8B,CAAC;AAkDpF,wBAAgB,8BAA8B,CAC7C,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,aAAa,GACzB,cAAc,CAAC,wBAAwB,CAAC,CAO1C"}
@@ -44,6 +44,8 @@ class MajorCodec {
44
44
  originatorId: this.revisionTagCodec.localSessionId,
45
45
  idCompressor: this.idCompressor,
46
46
  revision: undefined,
47
+ // DetachedFieldIndex codecs are only used by the summarizer.
48
+ isSummary: true,
47
49
  });
48
50
  }
49
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"detachedFieldIndexCodecV1.js","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV1.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAI7D,kDAA4C;AAC5C,iDAK4B;AAE5B,yFAA+F;AAC/F,2FAAsF;AAGtF,MAAM,UAAU;IACf,YACkB,gBAAkC,EAClC,YAA2B;QAD3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAe;IAC1C,CAAC;IAEG,MAAM,CAAC,KAAY;QACzB,IAAA,iBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C;;;;;;;;;;;;;;;;WAgBG;QACH,IAAA,iBAAM,EACL,EAAE,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,EACxB,KAAK,CAAC,kEAAkE,CACxE,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;IAEM,MAAM,CAAC,KAAyB;QACtC,IAAA,iBAAM,EACL,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,EAC9B,KAAK,CAAC,kEAAkE,CACxE,CAAC;QACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1C,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc;YAClD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,SAAS;SACnB,CAAC,CAAC;IACJ,CAAC;CACD;AAED,SAAgB,8BAA8B,CAC7C,gBAAkC,EAClC,YAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO,IAAA,4EAAyC,EAC/C,UAAU,EACV,IAAA,gBAAK,EAAC,mEAA+B,CAAC,EAAE,CAAC,EACzC,4BAAiB,CACjB,CAAC;AACH,CAAC;AAVD,wEAUC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport type { CodecAndSchema, IJsonCodec } from \"../../codec/index.js\";\nimport { brand } from \"../../util/index.js\";\nimport {\n\ttype EncodedRevisionTag,\n\ttype RevisionTagCodec,\n\ttype RevisionTag,\n\tRevisionTagSchema,\n} from \"../rebase/index.js\";\n\nimport { makeDetachedFieldIndexCodecFromMajorCodec } from \"./detachedFieldIndexCodecCommon.js\";\nimport { DetachedFieldIndexFormatVersion } from \"./detachedFieldIndexFormatCommon.js\";\nimport type { DetachedFieldSummaryData, Major } from \"./detachedFieldIndexTypes.js\";\n\nclass MajorCodec implements IJsonCodec<Major, EncodedRevisionTag> {\n\tpublic constructor(\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t) {}\n\n\tpublic encode(major: Major): EncodedRevisionTag {\n\t\tassert(major !== undefined, 0x88e /* Unexpected undefined revision */);\n\t\tconst id = this.revisionTagCodec.encode(major);\n\t\t/**\n\t\t * Preface: this codec is only used at summarization time (not for ops).\n\t\t * Note that the decode path must provide a session id in which to interpret the revision tag.\n\t\t * The revision associated with a detached root generally comes from the session which detaches that subtree,\n\t\t * which isn't generally the local session (nor is it available at decode time with the layering of the tree\n\t\t * package), despite decode using the local session id.\n\t\t *\n\t\t * This is made OK by enforcing that all ids on encode/decode are non-local, since local ids won't be interpretable\n\t\t * at decode time.\n\t\t * This assert is valid because the revision for an acked edit will have already been finalized, and a revision\n\t\t * for a local-only edit will be finalizable at summarization time (local edits can only occur on a summarizing client\n\t\t * if they're created while detached, and local ids made while detached are finalized before generating the attach summary).\n\t\t *\n\t\t * WARNING: the above is true when the whole container transitions from detached to attached,\n\t\t * but not when the container is already attached and it's just the shared-tree that is attaching.\n\t\t * The assert below will fail in such a scenario. This is addressed in the v2 codec.\n\t\t */\n\t\tassert(\n\t\t\tid === \"root\" || id >= 0,\n\t\t\t0x88f /* Expected final id on encode of detached field index revision */,\n\t\t);\n\t\treturn id;\n\t}\n\n\tpublic decode(major: EncodedRevisionTag): RevisionTag {\n\t\tassert(\n\t\t\tmajor === \"root\" || major >= 0,\n\t\t\t0x890 /* Expected final id on decode of detached field index revision */,\n\t\t);\n\t\treturn this.revisionTagCodec.decode(major, {\n\t\t\toriginatorId: this.revisionTagCodec.localSessionId,\n\t\t\tidCompressor: this.idCompressor,\n\t\t\trevision: undefined,\n\t\t});\n\t}\n}\n\nexport function makeDetachedNodeToFieldCodecV1(\n\trevisionTagCodec: RevisionTagCodec,\n\tidCompressor: IIdCompressor,\n): CodecAndSchema<DetachedFieldSummaryData> {\n\tconst majorCodec = new MajorCodec(revisionTagCodec, idCompressor);\n\treturn makeDetachedFieldIndexCodecFromMajorCodec(\n\t\tmajorCodec,\n\t\tbrand(DetachedFieldIndexFormatVersion.v1),\n\t\tRevisionTagSchema,\n\t);\n}\n"]}
1
+ {"version":3,"file":"detachedFieldIndexCodecV1.js","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV1.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAI7D,kDAA4C;AAC5C,iDAK4B;AAE5B,yFAA+F;AAC/F,2FAAsF;AAGtF,MAAM,UAAU;IACf,YACkB,gBAAkC,EAClC,YAA2B;QAD3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAe;IAC1C,CAAC;IAEG,MAAM,CAAC,KAAY;QACzB,IAAA,iBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C;;;;;;;;;;;;;;;;WAgBG;QACH,IAAA,iBAAM,EACL,EAAE,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,EACxB,KAAK,CAAC,kEAAkE,CACxE,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;IAEM,MAAM,CAAC,KAAyB;QACtC,IAAA,iBAAM,EACL,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,EAC9B,KAAK,CAAC,kEAAkE,CACxE,CAAC;QACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1C,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc;YAClD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,SAAS;YACnB,6DAA6D;YAC7D,SAAS,EAAE,IAAI;SACf,CAAC,CAAC;IACJ,CAAC;CACD;AAED,SAAgB,8BAA8B,CAC7C,gBAAkC,EAClC,YAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO,IAAA,4EAAyC,EAC/C,UAAU,EACV,IAAA,gBAAK,EAAC,mEAA+B,CAAC,EAAE,CAAC,EACzC,4BAAiB,CACjB,CAAC;AACH,CAAC;AAVD,wEAUC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport type { CodecAndSchema, IJsonCodec } from \"../../codec/index.js\";\nimport { brand } from \"../../util/index.js\";\nimport {\n\ttype EncodedRevisionTag,\n\ttype RevisionTagCodec,\n\ttype RevisionTag,\n\tRevisionTagSchema,\n} from \"../rebase/index.js\";\n\nimport { makeDetachedFieldIndexCodecFromMajorCodec } from \"./detachedFieldIndexCodecCommon.js\";\nimport { DetachedFieldIndexFormatVersion } from \"./detachedFieldIndexFormatCommon.js\";\nimport type { DetachedFieldSummaryData, Major } from \"./detachedFieldIndexTypes.js\";\n\nclass MajorCodec implements IJsonCodec<Major, EncodedRevisionTag> {\n\tpublic constructor(\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t) {}\n\n\tpublic encode(major: Major): EncodedRevisionTag {\n\t\tassert(major !== undefined, 0x88e /* Unexpected undefined revision */);\n\t\tconst id = this.revisionTagCodec.encode(major);\n\t\t/**\n\t\t * Preface: this codec is only used at summarization time (not for ops).\n\t\t * Note that the decode path must provide a session id in which to interpret the revision tag.\n\t\t * The revision associated with a detached root generally comes from the session which detaches that subtree,\n\t\t * which isn't generally the local session (nor is it available at decode time with the layering of the tree\n\t\t * package), despite decode using the local session id.\n\t\t *\n\t\t * This is made OK by enforcing that all ids on encode/decode are non-local, since local ids won't be interpretable\n\t\t * at decode time.\n\t\t * This assert is valid because the revision for an acked edit will have already been finalized, and a revision\n\t\t * for a local-only edit will be finalizable at summarization time (local edits can only occur on a summarizing client\n\t\t * if they're created while detached, and local ids made while detached are finalized before generating the attach summary).\n\t\t *\n\t\t * WARNING: the above is true when the whole container transitions from detached to attached,\n\t\t * but not when the container is already attached and it's just the shared-tree that is attaching.\n\t\t * The assert below will fail in such a scenario. This is addressed in the v2 codec.\n\t\t */\n\t\tassert(\n\t\t\tid === \"root\" || id >= 0,\n\t\t\t0x88f /* Expected final id on encode of detached field index revision */,\n\t\t);\n\t\treturn id;\n\t}\n\n\tpublic decode(major: EncodedRevisionTag): RevisionTag {\n\t\tassert(\n\t\t\tmajor === \"root\" || major >= 0,\n\t\t\t0x890 /* Expected final id on decode of detached field index revision */,\n\t\t);\n\t\treturn this.revisionTagCodec.decode(major, {\n\t\t\toriginatorId: this.revisionTagCodec.localSessionId,\n\t\t\tidCompressor: this.idCompressor,\n\t\t\trevision: undefined,\n\t\t\t// DetachedFieldIndex codecs are only used by the summarizer.\n\t\t\tisSummary: true,\n\t\t});\n\t}\n}\n\nexport function makeDetachedNodeToFieldCodecV1(\n\trevisionTagCodec: RevisionTagCodec,\n\tidCompressor: IIdCompressor,\n): CodecAndSchema<DetachedFieldSummaryData> {\n\tconst majorCodec = new MajorCodec(revisionTagCodec, idCompressor);\n\treturn makeDetachedFieldIndexCodecFromMajorCodec(\n\t\tmajorCodec,\n\t\tbrand(DetachedFieldIndexFormatVersion.v1),\n\t\tRevisionTagSchema,\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"detachedFieldIndexCodecV2.d.ts","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,+BAA+B,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAsB,gBAAgB,EAAe,MAAM,oBAAoB,CAAC;AAK5F,OAAO,KAAK,EAAE,wBAAwB,EAAS,MAAM,8BAA8B,CAAC;AAwCpF,wBAAgB,8BAA8B,CAC7C,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,aAAa,GACzB,cAAc,CAAC,wBAAwB,CAAC,CAO1C"}
1
+ {"version":3,"file":"detachedFieldIndexCodecV2.d.ts","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,+BAA+B,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAsB,gBAAgB,EAAe,MAAM,oBAAoB,CAAC;AAK5F,OAAO,KAAK,EAAE,wBAAwB,EAAS,MAAM,8BAA8B,CAAC;AA0CpF,wBAAgB,8BAA8B,CAC7C,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,aAAa,GACzB,cAAc,CAAC,wBAAwB,CAAC,CAO1C"}
@@ -38,6 +38,8 @@ class MajorCodec {
38
38
  originatorId: this.revisionTagCodec.localSessionId,
39
39
  idCompressor: this.idCompressor,
40
40
  revision: undefined,
41
+ // DetachedFieldIndex codecs are only used by the summarizer.
42
+ isSummary: true,
41
43
  });
42
44
  }
43
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"detachedFieldIndexCodecV2.js","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV2.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,qEAAoE;AAKpE,yFAA+F;AAC/F,2FAAsF;AACtF,mFAA2E;AAG3E,MAAM,UAAU;IACf,YACkB,gBAAkC,EAClC,YAA2B;QAD3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAe;IAC1C,CAAC;IAEG,MAAM,CAAC,KAAY;QACzB,IAAA,iBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/C,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7B;;;eAGG;YACH,IAAA,iBAAM,EAAC,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAEM,MAAM,CAAC,KAAoC;QACjD,IAAA,iBAAM,EACL,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAA,qBAAU,EAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAClF,KAAK,CAAC,mDAAmD,CACzD,CAAC;QACF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAA,qBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1C,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc;YAClD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,SAAS;SACnB,CAAC,CAAC;IACJ,CAAC;CACD;AAED,SAAgB,8BAA8B,CAC7C,gBAAkC,EAClC,YAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO,IAAA,4EAAyC,EAC/C,UAAU,EACV,mEAA+B,CAAC,EAAE,EAClC,wDAAwB,CACxB,CAAC;AACH,CAAC;AAVD,wEAUC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor, StableId } from \"@fluidframework/id-compressor\";\nimport { isStableId } from \"@fluidframework/id-compressor/internal\";\n\nimport type { CodecAndSchema, IJsonCodec } from \"../../codec/index.js\";\nimport type { EncodedRevisionTag, RevisionTagCodec, RevisionTag } from \"../rebase/index.js\";\n\nimport { makeDetachedFieldIndexCodecFromMajorCodec } from \"./detachedFieldIndexCodecCommon.js\";\nimport { DetachedFieldIndexFormatVersion } from \"./detachedFieldIndexFormatCommon.js\";\nimport { StableOrFinalRevisionTag } from \"./detachedFieldIndexFormatV2.js\";\nimport type { DetachedFieldSummaryData, Major } from \"./detachedFieldIndexTypes.js\";\n\nclass MajorCodec implements IJsonCodec<Major> {\n\tpublic constructor(\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t) {}\n\n\tpublic encode(major: Major): EncodedRevisionTag | StableId {\n\t\tassert(major !== undefined, 0xbfb /* Unexpected undefined revision */);\n\t\tconst id = this.revisionTagCodec.encode(major);\n\n\t\tif (id !== \"root\" && id < 0) {\n\t\t\t/**\n\t\t\t * This code path handles the case where the major revision is not finalized.\n\t\t\t * This can happen the SharedTree is being attached to an already attached container.\n\t\t\t */\n\t\t\tassert(major !== \"root\", 0xbfc /* Major revision cannot be 'root' */);\n\t\t\tconst long = this.idCompressor.decompress(major);\n\t\t\treturn long;\n\t\t}\n\t\treturn id;\n\t}\n\n\tpublic decode(major: EncodedRevisionTag | StableId): RevisionTag {\n\t\tassert(\n\t\t\tmajor === \"root\" || (typeof major === \"string\" && isStableId(major)) || major >= 0,\n\t\t\t0xbfd /* Expected root, stable, or final compressed id */,\n\t\t);\n\t\tif (typeof major === \"string\" && isStableId(major)) {\n\t\t\treturn this.idCompressor.recompress(major);\n\t\t}\n\t\treturn this.revisionTagCodec.decode(major, {\n\t\t\toriginatorId: this.revisionTagCodec.localSessionId,\n\t\t\tidCompressor: this.idCompressor,\n\t\t\trevision: undefined,\n\t\t});\n\t}\n}\n\nexport function makeDetachedNodeToFieldCodecV2(\n\trevisionTagCodec: RevisionTagCodec,\n\tidCompressor: IIdCompressor,\n): CodecAndSchema<DetachedFieldSummaryData> {\n\tconst majorCodec = new MajorCodec(revisionTagCodec, idCompressor);\n\treturn makeDetachedFieldIndexCodecFromMajorCodec(\n\t\tmajorCodec,\n\t\tDetachedFieldIndexFormatVersion.v2,\n\t\tStableOrFinalRevisionTag,\n\t);\n}\n"]}
1
+ {"version":3,"file":"detachedFieldIndexCodecV2.js","sourceRoot":"","sources":["../../../src/core/tree/detachedFieldIndexCodecV2.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,qEAAoE;AAKpE,yFAA+F;AAC/F,2FAAsF;AACtF,mFAA2E;AAG3E,MAAM,UAAU;IACf,YACkB,gBAAkC,EAClC,YAA2B;QAD3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAe;IAC1C,CAAC;IAEG,MAAM,CAAC,KAAY;QACzB,IAAA,iBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/C,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7B;;;eAGG;YACH,IAAA,iBAAM,EAAC,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAEM,MAAM,CAAC,KAAoC;QACjD,IAAA,iBAAM,EACL,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAA,qBAAU,EAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAClF,KAAK,CAAC,mDAAmD,CACzD,CAAC;QACF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAA,qBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1C,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc;YAClD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,SAAS;YACnB,6DAA6D;YAC7D,SAAS,EAAE,IAAI;SACf,CAAC,CAAC;IACJ,CAAC;CACD;AAED,SAAgB,8BAA8B,CAC7C,gBAAkC,EAClC,YAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO,IAAA,4EAAyC,EAC/C,UAAU,EACV,mEAA+B,CAAC,EAAE,EAClC,wDAAwB,CACxB,CAAC;AACH,CAAC;AAVD,wEAUC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor, StableId } from \"@fluidframework/id-compressor\";\nimport { isStableId } from \"@fluidframework/id-compressor/internal\";\n\nimport type { CodecAndSchema, IJsonCodec } from \"../../codec/index.js\";\nimport type { EncodedRevisionTag, RevisionTagCodec, RevisionTag } from \"../rebase/index.js\";\n\nimport { makeDetachedFieldIndexCodecFromMajorCodec } from \"./detachedFieldIndexCodecCommon.js\";\nimport { DetachedFieldIndexFormatVersion } from \"./detachedFieldIndexFormatCommon.js\";\nimport { StableOrFinalRevisionTag } from \"./detachedFieldIndexFormatV2.js\";\nimport type { DetachedFieldSummaryData, Major } from \"./detachedFieldIndexTypes.js\";\n\nclass MajorCodec implements IJsonCodec<Major> {\n\tpublic constructor(\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t) {}\n\n\tpublic encode(major: Major): EncodedRevisionTag | StableId {\n\t\tassert(major !== undefined, 0xbfb /* Unexpected undefined revision */);\n\t\tconst id = this.revisionTagCodec.encode(major);\n\n\t\tif (id !== \"root\" && id < 0) {\n\t\t\t/**\n\t\t\t * This code path handles the case where the major revision is not finalized.\n\t\t\t * This can happen the SharedTree is being attached to an already attached container.\n\t\t\t */\n\t\t\tassert(major !== \"root\", 0xbfc /* Major revision cannot be 'root' */);\n\t\t\tconst long = this.idCompressor.decompress(major);\n\t\t\treturn long;\n\t\t}\n\t\treturn id;\n\t}\n\n\tpublic decode(major: EncodedRevisionTag | StableId): RevisionTag {\n\t\tassert(\n\t\t\tmajor === \"root\" || (typeof major === \"string\" && isStableId(major)) || major >= 0,\n\t\t\t0xbfd /* Expected root, stable, or final compressed id */,\n\t\t);\n\t\tif (typeof major === \"string\" && isStableId(major)) {\n\t\t\treturn this.idCompressor.recompress(major);\n\t\t}\n\t\treturn this.revisionTagCodec.decode(major, {\n\t\t\toriginatorId: this.revisionTagCodec.localSessionId,\n\t\t\tidCompressor: this.idCompressor,\n\t\t\trevision: undefined,\n\t\t\t// DetachedFieldIndex codecs are only used by the summarizer.\n\t\t\tisSummary: true,\n\t\t});\n\t}\n}\n\nexport function makeDetachedNodeToFieldCodecV2(\n\trevisionTagCodec: RevisionTagCodec,\n\tidCompressor: IIdCompressor,\n): CodecAndSchema<DetachedFieldSummaryData> {\n\tconst majorCodec = new MajorCodec(revisionTagCodec, idCompressor);\n\treturn makeDetachedFieldIndexCodecFromMajorCodec(\n\t\tmajorCodec,\n\t\tDetachedFieldIndexFormatVersion.v2,\n\t\tStableOrFinalRevisionTag,\n\t);\n}\n"]}
@@ -14,14 +14,23 @@ export interface IdDecodingContext {
14
14
  * The creator of any local Ids to be decoded.
15
15
  */
16
16
  originatorId: SessionId;
17
+ /**
18
+ * {@inheritdoc FieldBatchEncodingContext.isSummary}
19
+ */
20
+ isSummary: boolean;
21
+ /**
22
+ * See {@link FieldBatchEncodingContext.healUnresolvableIdentifiersOnDecode}.
23
+ */
24
+ healUnresolvableIdentifiersOnDecode?: boolean;
25
+ /**
26
+ * See {@link FieldBatchEncodingContext.sharedObjectId}.
27
+ */
28
+ sharedObjectId?: string;
17
29
  }
18
30
  /**
19
31
  * Decode `chunk` into a TreeChunk.
20
32
  */
21
- export declare function decode(chunk: EncodedFieldBatchV1OrV2, idDecodingContext: {
22
- idCompressor: IIdCompressor;
23
- originatorId: SessionId;
24
- }, incrementalDecoder?: IncrementalDecoder): TreeChunk[];
33
+ export declare function decode(chunk: EncodedFieldBatchV1OrV2, idDecodingContext: IdDecodingContext, incrementalDecoder?: IncrementalDecoder): TreeChunk[];
25
34
  /**
26
35
  * Decode a node's value from `stream` using its shape.
27
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chunkDecoding.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/chunkDecoding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACX,aAAa,EAEb,SAAS,EACT,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAGX,KAAK,EACL,SAAS,EACT,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,YAAY,EAOjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,cAAc,EAGd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAGtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IACjC,YAAY,EAAE,aAAa,CAAC;IAC5B;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC;CACxB;AACD;;GAEG;AACH,wBAAgB,MAAM,CACrB,KAAK,EAAE,uBAAuB,EAC9B,iBAAiB,EAAE;IAAE,YAAY,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,SAAS,CAAA;CAAE,EAC3E,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,SAAS,EAAE,CAOb;AA2BD;;GAEG;AACH,wBAAgB,SAAS,CACxB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,iBAAiB,EACxB,iBAAiB,EAAE,iBAAiB,GAClC,KAAK,CAgCP;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAyB/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,CAa7D;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,uBAAuB;IAC3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CA0BjF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,uBAAuB;IAC3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CASjF;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc,CAAC,mBAAmB,CAAC;IACzE,MAAM,CAAC,CAAC,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CA2B1E;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,YAMxB,CAAC;AAyBF;;GAEG;AACH,qBAAa,WAAY,YAAW,YAAY;IAI9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAE3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,cAAc,CAAC,uBAAuB,CAAC;IAW3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CAmCjF"}
1
+ {"version":3,"file":"chunkDecoding.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/chunkDecoding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACX,aAAa,EAEb,SAAS,EACT,MAAM,+BAA+B,CAAC;AAIvC,OAAO,KAAK,EAGX,KAAK,EACL,SAAS,EACT,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,YAAY,EAOjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,cAAc,EAGd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAA6B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAGtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IACjC,YAAY,EAAE,aAAa,CAAC;IAC5B;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC;IACxB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,mCAAmC,CAAC,EAAE,OAAO,CAAC;IAC9C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;GAEG;AACH,wBAAgB,MAAM,CACrB,KAAK,EAAE,uBAAuB,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,SAAS,EAAE,CAOb;AA2BD;;GAEG;AACH,wBAAgB,SAAS,CACxB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,iBAAiB,EACxB,iBAAiB,EAAE,iBAAiB,GAClC,KAAK,CA4DP;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAyB/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,CAa7D;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,uBAAuB;IAC3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CA0BjF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,uBAAuB;IAC3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CASjF;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc,CAAC,mBAAmB,CAAC;IACzE,MAAM,CAAC,CAAC,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CA2B1E;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,YAMxB,CAAC;AAyBF;;GAEG;AACH,qBAAa,WAAY,YAAW,YAAY;IAI9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAE3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,cAAc,CAAC,uBAAuB,CAAC;IAW3D,MAAM,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;CAmCjF"}
@@ -6,6 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.NodeDecoder = exports.anyDecoder = exports.IncrementalChunkDecoder = exports.InlineArrayDecoder = exports.NestedArrayDecoder = exports.aggregateChunks = exports.deaggregateChunks = exports.readValue = exports.decode = void 0;
8
8
  const internal_1 = require("@fluidframework/core-utils/internal");
9
+ const uuid_1 = require("uuid");
9
10
  const index_js_1 = require("../../../codec/index.js");
10
11
  const index_js_2 = require("../../../util/index.js");
11
12
  const basicChunk_js_1 = require("../basicChunk.js");
@@ -14,6 +15,11 @@ const sequenceChunk_js_1 = require("../sequenceChunk.js");
14
15
  const chunkCodecUtilities_js_1 = require("./chunkCodecUtilities.js");
15
16
  const chunkDecodingGeneric_js_1 = require("./chunkDecodingGeneric.js");
16
17
  const index_js_3 = require("./format/index.js");
18
+ /**
19
+ * Random v4 UUID generated as a namespace for the "heal an unresolvable identifier into a stable UUID"
20
+ * path in {@link readValue}. This scheme requires consensus across all clients to function.
21
+ */
22
+ const healingNamespace = "f8a89df3-6882-400f-b913-4c1f6f0157bd";
17
23
  /**
18
24
  * Decode `chunk` into a TreeChunk.
19
25
  */
@@ -60,10 +66,31 @@ function readValue(stream, shape, idDecodingContext) {
60
66
  // This case is a special case handling the decoding of identifier fields.
61
67
  const streamValue = (0, chunkCodecUtilities_js_1.readStream)(stream);
62
68
  (0, internal_1.assert)(typeof streamValue === "number" || typeof streamValue === "string", 0x997 /* identifier must be string or number. */);
69
+ if (typeof streamValue === "string") {
70
+ return streamValue;
71
+ }
63
72
  const idCompressor = idDecodingContext.idCompressor;
64
- return typeof streamValue === "number"
65
- ? idCompressor.decompress(idCompressor.normalizeToSessionSpace(streamValue, idDecodingContext.originatorId))
66
- : streamValue;
73
+ // OpSpaceCompressedIds are negative, and require a session-id to compute their value.
74
+ // Due to a bug, we have some special casing for them (see below).
75
+ // TODO: isFinalId should probably be exported from id-compressor and that could be used to do the narrowing here.
76
+ if (idDecodingContext.isSummary === true && streamValue < 0) {
77
+ if (idDecodingContext.healUnresolvableIdentifiersOnDecode === true &&
78
+ idDecodingContext.sharedObjectId !== undefined) {
79
+ // Documents written before the encode-side fix for non-finalized identifier
80
+ // values can persist negative op-space IDs that are no
81
+ // longer resolvable once the originating session's local state has been stripped.
82
+ // When loading such a summary with the heal-on-decode option on, synthesize a deterministic
83
+ // stable UUID so all readers of the same blob agree on the resulting value.
84
+ //
85
+ // The heal path is intentionally restricted to summary loads — an
86
+ // unresolvable ID encountered while applying an op should still surface as
87
+ // an error, since it indicates a real bug rather than a recoverable state.
88
+ return (0, uuid_1.v5)(`${idDecodingContext.sharedObjectId}|${streamValue}`, healingNamespace);
89
+ }
90
+ // See `SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode` for details on this error.
91
+ throw new Error("Summary could not be loaded due incorrectly encoded identifier. See SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode for mitigation.");
92
+ }
93
+ return idCompressor.decompress(idCompressor.normalizeToSessionSpace(streamValue, idDecodingContext.originatorId));
67
94
  }
68
95
  else {
69
96
  // EncodedCounter case:
@@ -1 +1 @@
1
- {"version":3,"file":"chunkDecoding.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/chunkDecoding.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase, oob } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIIdCompressor,\n\tOpSpaceCompressedId,\n\tSessionId,\n} from \"@fluidframework/id-compressor\";\n\nimport { DiscriminatedUnionDispatcher } from \"../../../codec/index.js\";\nimport type {\n\tFieldKey,\n\tTreeNodeSchemaIdentifier,\n\tValue,\n\tTreeChunk,\n} from \"../../../core/index.js\";\nimport { assertValidIndex, brand } from \"../../../util/index.js\";\nimport { BasicChunk } from \"../basicChunk.js\";\nimport { emptyChunk } from \"../emptyChunk.js\";\nimport { SequenceChunk } from \"../sequenceChunk.js\";\n\nimport {\n\ttype ChunkDecoder,\n\ttype StreamCursor,\n\tgetChecked,\n\treadStream,\n\treadStreamBoolean,\n\treadStreamNumber,\n\treadStreamStream,\n\treadStreamValue,\n} from \"./chunkCodecUtilities.js\";\nimport {\n\tDecoderContext,\n\tdecode as genericDecode,\n\treadStreamIdentifier,\n} from \"./chunkDecodingGeneric.js\";\nimport type { IncrementalDecoder } from \"./codecs.js\";\nimport {\n\ttype EncodedAnyShape,\n\ttype EncodedChunkShapeV1OrV2,\n\ttype EncodedChunkShapeV2,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV2,\n\ttype EncodedIncrementalChunkShape,\n\ttype EncodedInlineArrayShape,\n\ttype EncodedNestedArrayShape,\n\ttype EncodedNodeShape,\n\ttype EncodedValueShape,\n\tSpecialField,\n\tsupportsIncrementalEncoding,\n} from \"./format/index.js\";\n\nexport interface IdDecodingContext {\n\tidCompressor: IIdCompressor;\n\t/**\n\t * The creator of any local Ids to be decoded.\n\t */\n\toriginatorId: SessionId;\n}\n/**\n * Decode `chunk` into a TreeChunk.\n */\nexport function decode(\n\tchunk: EncodedFieldBatchV1OrV2,\n\tidDecodingContext: { idCompressor: IIdCompressor; originatorId: SessionId },\n\tincrementalDecoder?: IncrementalDecoder,\n): TreeChunk[] {\n\treturn genericDecode(\n\t\tdecoderLibrary,\n\t\tnew DecoderContext(chunk.identifiers, chunk.shapes, idDecodingContext, incrementalDecoder),\n\t\tchunk,\n\t\tanyDecoder,\n\t);\n}\n\nconst decoderLibrary = new DiscriminatedUnionDispatcher<\n\tEncodedChunkShapeV1OrV2,\n\t[context: DecoderContext<EncodedChunkShapeV1OrV2>],\n\tChunkDecoder\n>({\n\ta(shape: EncodedNestedArrayShape, context): ChunkDecoder {\n\t\treturn new NestedArrayDecoder(shape);\n\t},\n\tb(shape: EncodedInlineArrayShape, context): ChunkDecoder {\n\t\treturn new InlineArrayDecoder(shape);\n\t},\n\tc(shape: EncodedNodeShape, context): ChunkDecoder {\n\t\treturn new NodeDecoder(shape, context);\n\t},\n\td(shape: EncodedAnyShape): ChunkDecoder {\n\t\treturn anyDecoder;\n\t},\n\te(\n\t\tshape: EncodedIncrementalChunkShape,\n\t\tcontext: DecoderContext<EncodedChunkShapeV2>,\n\t): ChunkDecoder {\n\t\treturn new IncrementalChunkDecoder(context);\n\t},\n});\n\n/**\n * Decode a node's value from `stream` using its shape.\n */\nexport function readValue(\n\tstream: StreamCursor,\n\tshape: EncodedValueShape,\n\tidDecodingContext: IdDecodingContext,\n): Value {\n\tif (shape === undefined) {\n\t\treturn readStreamBoolean(stream) ? readStreamValue(stream) : undefined;\n\t} else {\n\t\tif (shape === true) {\n\t\t\treturn readStreamValue(stream);\n\t\t} else if (shape === false) {\n\t\t\treturn undefined;\n\t\t} else if (Array.isArray(shape)) {\n\t\t\tassert(shape.length === 1, 0x734 /* expected a single constant for value */);\n\t\t\treturn shape[0] as Value;\n\t\t} else if (shape === SpecialField.Identifier) {\n\t\t\t// This case is a special case handling the decoding of identifier fields.\n\t\t\tconst streamValue = readStream(stream);\n\t\t\tassert(\n\t\t\t\ttypeof streamValue === \"number\" || typeof streamValue === \"string\",\n\t\t\t\t0x997 /* identifier must be string or number. */,\n\t\t\t);\n\t\t\tconst idCompressor = idDecodingContext.idCompressor;\n\t\t\treturn typeof streamValue === \"number\"\n\t\t\t\t? idCompressor.decompress(\n\t\t\t\t\t\tidCompressor.normalizeToSessionSpace(\n\t\t\t\t\t\t\tstreamValue as OpSpaceCompressedId,\n\t\t\t\t\t\t\tidDecodingContext.originatorId,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: streamValue;\n\t\t} else {\n\t\t\t// EncodedCounter case:\n\t\t\tunreachableCase(shape, \"decoding values as deltas is not yet supported\");\n\t\t}\n\t}\n}\n\n/**\n * Normalize a {@link TreeChunk} into an array.\n *\n * Unwraps {@link SequenceChunk}s, and wraps other chunks.\n */\nexport function deaggregateChunks(chunk: TreeChunk): TreeChunk[] {\n\tif (chunk === emptyChunk) {\n\t\treturn [];\n\t}\n\t// TODO: when handling of SequenceChunks has better performance (for example in cursors),\n\t// consider keeping SequenceChunks here if they are longer than some threshold.\n\tif (chunk instanceof SequenceChunk) {\n\t\t// Could return [] here, however the logic in this file is designed to never produce an empty SequenceChunk, so its better to throw an error here to detect bugs.\n\t\tassert(chunk.subChunks.length > 0, 0x735 /* Unexpected empty sequence */);\n\t\t// Logic in this file is designed to never produce an unneeded (single item) SequenceChunks, so its better to throw an error here to detect bugs.\n\t\tassert(chunk.subChunks.length > 1, 0x736 /* Unexpected single item sequence */);\n\n\t\tfor (const sub of chunk.subChunks) {\n\t\t\t// The logic in this file is designed to never produce an nested SequenceChunks or emptyChunk, so its better to throw an error here to detect bugs.\n\t\t\tassert(!(sub instanceof SequenceChunk), 0x737 /* unexpected nested sequence */);\n\t\t\tassert(sub !== emptyChunk, 0x738 /* unexpected empty chunk */);\n\n\t\t\tsub.referenceAdded();\n\t\t}\n\n\t\tchunk.referenceRemoved();\n\t\treturn chunk.subChunks;\n\t} else {\n\t\treturn [chunk];\n\t}\n}\n\n/**\n * Normalize a {@link TreeChunk}[] into a single TreeChunk.\n *\n * Avoids creating nested or less than 2 child {@link SequenceChunk}s.\n */\nexport function aggregateChunks(input: TreeChunk[]): TreeChunk {\n\tconst chunks = input.flatMap(deaggregateChunks);\n\tswitch (chunks.length) {\n\t\tcase 0: {\n\t\t\treturn emptyChunk;\n\t\t}\n\t\tcase 1: {\n\t\t\treturn chunks[0] ?? oob();\n\t\t}\n\t\tdefault: {\n\t\t\treturn new SequenceChunk(chunks);\n\t\t}\n\t}\n}\n\n/**\n * Decoder for {@link EncodedNestedArrayShape}s.\n */\nexport class NestedArrayDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly shape: EncodedNestedArrayShape) {}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst decoder = decoders[this.shape] ?? oob();\n\n\t\t// TODO: uniform chunk fast path\n\t\tconst chunks: TreeChunk[] = [];\n\n\t\tconst data = readStream(stream);\n\t\tif (typeof data === \"number\") {\n\t\t\t// This case means that the array contained only 0-sized items, and was thus encoded as the length of the array.\n\t\t\tconst inner = { data: [], offset: 0 };\n\t\t\tfor (let index = 0; index < data; index++) {\n\t\t\t\tchunks.push(decoder.decode(decoders, inner));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tArray.isArray(data),\n\t\t\t\t0x739 /* expected number of array for encoding of nested array */,\n\t\t\t);\n\t\t\tconst inner = { data, offset: 0 };\n\t\t\twhile (inner.offset !== inner.data.length) {\n\t\t\t\tchunks.push(decoder.decode(decoders, inner));\n\t\t\t}\n\t\t}\n\n\t\treturn aggregateChunks(chunks);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedInlineArrayShape}s.\n */\nexport class InlineArrayDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly shape: EncodedInlineArrayShape) {}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst length = this.shape.length;\n\t\tconst decoder = decoders[this.shape.shape] ?? oob();\n\t\tconst chunks: TreeChunk[] = [];\n\t\tfor (let index = 0; index < length; index++) {\n\t\t\tchunks.push(decoder.decode(decoders, stream));\n\t\t}\n\t\treturn aggregateChunks(chunks);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedIncrementalChunkShape}s.\n */\nexport class IncrementalChunkDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly context: DecoderContext<EncodedChunkShapeV2>) {}\n\tpublic decode(_: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tassert(\n\t\t\tthis.context.incrementalDecoder !== undefined,\n\t\t\t0xc27 /* incremental decoder not available for incremental field decoding */,\n\t\t);\n\n\t\tconst chunkDecoder = (batch: EncodedFieldBatchV2): TreeChunk => {\n\t\t\tassert(\n\t\t\t\tsupportsIncrementalEncoding(batch.version),\n\t\t\t\t0xc9f /* Unsupported FieldBatchFormatVersion for incremental chunks; must be v2 or higher */,\n\t\t\t);\n\t\t\tconst context = new DecoderContext(\n\t\t\t\tbatch.identifiers,\n\t\t\t\tbatch.shapes,\n\t\t\t\tthis.context.idDecodingContext,\n\t\t\t\tthis.context.incrementalDecoder,\n\t\t\t);\n\t\t\tconst chunks = genericDecode(decoderLibrary, context, batch, anyDecoder);\n\t\t\treturn aggregateChunks(chunks);\n\t\t};\n\n\t\tconst chunkReferenceId = readStreamNumber(stream);\n\t\treturn this.context.incrementalDecoder.decodeIncrementalChunk(\n\t\t\tbrand(chunkReferenceId),\n\t\t\tchunkDecoder,\n\t\t);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedAnyShape}s.\n */\nexport const anyDecoder: ChunkDecoder = {\n\tdecode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst shapeIndex = readStreamNumber(stream);\n\t\tconst decoder = getChecked(decoders, shapeIndex);\n\t\treturn decoder.decode(decoders, stream);\n\t},\n};\n\n/**\n * Decoder for field.\n */\ntype BasicFieldDecoder = (\n\tdecoders: readonly ChunkDecoder[],\n\tstream: StreamCursor,\n) => [FieldKey, TreeChunk];\n\n/**\n * Get a decoder for fields of a provided (via `shape` and `context`).\n */\nfunction fieldDecoder(\n\tcontext: DecoderContext<EncodedChunkShapeV1OrV2>,\n\tkey: FieldKey,\n\tshape: number,\n): BasicFieldDecoder {\n\tassertValidIndex(shape, context.shapes);\n\treturn (decoders, stream) => {\n\t\tconst decoder = decoders[shape] ?? oob();\n\t\treturn [key, decoder.decode(decoders, stream)];\n\t};\n}\n\n/**\n * Decoder for {@link EncodedNodeShape}s.\n */\nexport class NodeDecoder implements ChunkDecoder {\n\tprivate readonly type?: TreeNodeSchemaIdentifier;\n\tprivate readonly fieldDecoders: readonly BasicFieldDecoder[];\n\tpublic constructor(\n\t\tprivate readonly shape: EncodedNodeShape,\n\t\tprivate readonly context: DecoderContext<EncodedChunkShapeV1OrV2>,\n\t) {\n\t\tthis.type = shape.type === undefined ? undefined : context.identifier(shape.type);\n\n\t\tconst fieldDecoders: BasicFieldDecoder[] = [];\n\t\tfor (const [fieldKey, fieldShape] of shape.fields ?? []) {\n\t\t\tconst key: FieldKey = context.identifier(fieldKey);\n\t\t\tfieldDecoders.push(fieldDecoder(context, key, fieldShape));\n\t\t}\n\t\tthis.fieldDecoders = fieldDecoders;\n\t}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst type: TreeNodeSchemaIdentifier =\n\t\t\tthis.type ?? readStreamIdentifier(stream, this.context);\n\t\t// TODO: Consider typechecking against stored schema in here somewhere.\n\n\t\tconst value = readValue(stream, this.shape.value, this.context.idDecodingContext);\n\t\tconst fields: Map<FieldKey, TreeChunk[]> = new Map();\n\n\t\t// Helper to add fields, but with unneeded array chunks removed.\n\t\tfunction addField(key: FieldKey, data: TreeChunk): void {\n\t\t\t// TODO: when handling of ArrayChunks has better performance (for example in cursors),\n\t\t\t// consider keeping array chunks here if they are longer than some threshold.\n\t\t\tconst chunks = deaggregateChunks(data);\n\n\t\t\tif (chunks.length > 0) {\n\t\t\t\tfields.set(key, chunks);\n\t\t\t}\n\t\t}\n\n\t\tfor (const decoder of this.fieldDecoders) {\n\t\t\tconst [key, content] = decoder(decoders, stream);\n\t\t\taddField(key, content);\n\t\t}\n\n\t\tif (this.shape.extraFields !== undefined) {\n\t\t\tconst decoder = decoders[this.shape.extraFields] ?? oob();\n\t\t\tconst inner = readStreamStream(stream);\n\t\t\twhile (inner.offset !== inner.data.length) {\n\t\t\t\tconst key: FieldKey = readStreamIdentifier(inner, this.context);\n\t\t\t\taddField(key, decoder.decode(decoders, inner));\n\t\t\t}\n\t\t}\n\n\t\treturn new BasicChunk(type, fields, value);\n\t}\n}\n"]}
1
+ {"version":3,"file":"chunkDecoding.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/chunkDecoding.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase, oob } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIIdCompressor,\n\tOpSpaceCompressedId,\n\tSessionId,\n} from \"@fluidframework/id-compressor\";\nimport { v5 as uuidV5 } from \"uuid\";\n\nimport { DiscriminatedUnionDispatcher } from \"../../../codec/index.js\";\nimport type {\n\tFieldKey,\n\tTreeNodeSchemaIdentifier,\n\tValue,\n\tTreeChunk,\n} from \"../../../core/index.js\";\nimport { assertValidIndex, brand } from \"../../../util/index.js\";\nimport { BasicChunk } from \"../basicChunk.js\";\nimport { emptyChunk } from \"../emptyChunk.js\";\nimport { SequenceChunk } from \"../sequenceChunk.js\";\n\nimport {\n\ttype ChunkDecoder,\n\ttype StreamCursor,\n\tgetChecked,\n\treadStream,\n\treadStreamBoolean,\n\treadStreamNumber,\n\treadStreamStream,\n\treadStreamValue,\n} from \"./chunkCodecUtilities.js\";\nimport {\n\tDecoderContext,\n\tdecode as genericDecode,\n\treadStreamIdentifier,\n} from \"./chunkDecodingGeneric.js\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Referenced by doc comments\nimport type { FieldBatchEncodingContext, IncrementalDecoder } from \"./codecs.js\";\nimport {\n\ttype EncodedAnyShape,\n\ttype EncodedChunkShapeV1OrV2,\n\ttype EncodedChunkShapeV2,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV2,\n\ttype EncodedIncrementalChunkShape,\n\ttype EncodedInlineArrayShape,\n\ttype EncodedNestedArrayShape,\n\ttype EncodedNodeShape,\n\ttype EncodedValueShape,\n\tSpecialField,\n\tsupportsIncrementalEncoding,\n} from \"./format/index.js\";\n\nexport interface IdDecodingContext {\n\tidCompressor: IIdCompressor;\n\t/**\n\t * The creator of any local Ids to be decoded.\n\t */\n\toriginatorId: SessionId;\n\t/**\n\t * {@inheritdoc FieldBatchEncodingContext.isSummary}\n\t */\n\tisSummary: boolean;\n\t/**\n\t * See {@link FieldBatchEncodingContext.healUnresolvableIdentifiersOnDecode}.\n\t */\n\thealUnresolvableIdentifiersOnDecode?: boolean;\n\t/**\n\t * See {@link FieldBatchEncodingContext.sharedObjectId}.\n\t */\n\tsharedObjectId?: string;\n}\n\n/**\n * Random v4 UUID generated as a namespace for the \"heal an unresolvable identifier into a stable UUID\"\n * path in {@link readValue}. This scheme requires consensus across all clients to function.\n */\nconst healingNamespace = \"f8a89df3-6882-400f-b913-4c1f6f0157bd\";\n\n/**\n * Decode `chunk` into a TreeChunk.\n */\nexport function decode(\n\tchunk: EncodedFieldBatchV1OrV2,\n\tidDecodingContext: IdDecodingContext,\n\tincrementalDecoder?: IncrementalDecoder,\n): TreeChunk[] {\n\treturn genericDecode(\n\t\tdecoderLibrary,\n\t\tnew DecoderContext(chunk.identifiers, chunk.shapes, idDecodingContext, incrementalDecoder),\n\t\tchunk,\n\t\tanyDecoder,\n\t);\n}\n\nconst decoderLibrary = new DiscriminatedUnionDispatcher<\n\tEncodedChunkShapeV1OrV2,\n\t[context: DecoderContext<EncodedChunkShapeV1OrV2>],\n\tChunkDecoder\n>({\n\ta(shape: EncodedNestedArrayShape, context): ChunkDecoder {\n\t\treturn new NestedArrayDecoder(shape);\n\t},\n\tb(shape: EncodedInlineArrayShape, context): ChunkDecoder {\n\t\treturn new InlineArrayDecoder(shape);\n\t},\n\tc(shape: EncodedNodeShape, context): ChunkDecoder {\n\t\treturn new NodeDecoder(shape, context);\n\t},\n\td(shape: EncodedAnyShape): ChunkDecoder {\n\t\treturn anyDecoder;\n\t},\n\te(\n\t\tshape: EncodedIncrementalChunkShape,\n\t\tcontext: DecoderContext<EncodedChunkShapeV2>,\n\t): ChunkDecoder {\n\t\treturn new IncrementalChunkDecoder(context);\n\t},\n});\n\n/**\n * Decode a node's value from `stream` using its shape.\n */\nexport function readValue(\n\tstream: StreamCursor,\n\tshape: EncodedValueShape,\n\tidDecodingContext: IdDecodingContext,\n): Value {\n\tif (shape === undefined) {\n\t\treturn readStreamBoolean(stream) ? readStreamValue(stream) : undefined;\n\t} else {\n\t\tif (shape === true) {\n\t\t\treturn readStreamValue(stream);\n\t\t} else if (shape === false) {\n\t\t\treturn undefined;\n\t\t} else if (Array.isArray(shape)) {\n\t\t\tassert(shape.length === 1, 0x734 /* expected a single constant for value */);\n\t\t\treturn shape[0] as Value;\n\t\t} else if (shape === SpecialField.Identifier) {\n\t\t\t// This case is a special case handling the decoding of identifier fields.\n\t\t\tconst streamValue = readStream(stream);\n\t\t\tassert(\n\t\t\t\ttypeof streamValue === \"number\" || typeof streamValue === \"string\",\n\t\t\t\t0x997 /* identifier must be string or number. */,\n\t\t\t);\n\t\t\tif (typeof streamValue === \"string\") {\n\t\t\t\treturn streamValue;\n\t\t\t}\n\t\t\tconst idCompressor = idDecodingContext.idCompressor;\n\t\t\t// OpSpaceCompressedIds are negative, and require a session-id to compute their value.\n\t\t\t// Due to a bug, we have some special casing for them (see below).\n\t\t\t// TODO: isFinalId should probably be exported from id-compressor and that could be used to do the narrowing here.\n\t\t\tif (idDecodingContext.isSummary === true && streamValue < 0) {\n\t\t\t\tif (\n\t\t\t\t\tidDecodingContext.healUnresolvableIdentifiersOnDecode === true &&\n\t\t\t\t\tidDecodingContext.sharedObjectId !== undefined\n\t\t\t\t) {\n\t\t\t\t\t// Documents written before the encode-side fix for non-finalized identifier\n\t\t\t\t\t// values can persist negative op-space IDs that are no\n\t\t\t\t\t// longer resolvable once the originating session's local state has been stripped.\n\t\t\t\t\t// When loading such a summary with the heal-on-decode option on, synthesize a deterministic\n\t\t\t\t\t// stable UUID so all readers of the same blob agree on the resulting value.\n\t\t\t\t\t//\n\t\t\t\t\t// The heal path is intentionally restricted to summary loads — an\n\t\t\t\t\t// unresolvable ID encountered while applying an op should still surface as\n\t\t\t\t\t// an error, since it indicates a real bug rather than a recoverable state.\n\t\t\t\t\treturn uuidV5(\n\t\t\t\t\t\t`${idDecodingContext.sharedObjectId}|${streamValue}`,\n\t\t\t\t\t\thealingNamespace,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// See `SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode` for details on this error.\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Summary could not be loaded due incorrectly encoded identifier. See SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode for mitigation.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn idCompressor.decompress(\n\t\t\t\tidCompressor.normalizeToSessionSpace(\n\t\t\t\t\tstreamValue as OpSpaceCompressedId,\n\t\t\t\t\tidDecodingContext.originatorId,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\t// EncodedCounter case:\n\t\t\tunreachableCase(shape, \"decoding values as deltas is not yet supported\");\n\t\t}\n\t}\n}\n\n/**\n * Normalize a {@link TreeChunk} into an array.\n *\n * Unwraps {@link SequenceChunk}s, and wraps other chunks.\n */\nexport function deaggregateChunks(chunk: TreeChunk): TreeChunk[] {\n\tif (chunk === emptyChunk) {\n\t\treturn [];\n\t}\n\t// TODO: when handling of SequenceChunks has better performance (for example in cursors),\n\t// consider keeping SequenceChunks here if they are longer than some threshold.\n\tif (chunk instanceof SequenceChunk) {\n\t\t// Could return [] here, however the logic in this file is designed to never produce an empty SequenceChunk, so its better to throw an error here to detect bugs.\n\t\tassert(chunk.subChunks.length > 0, 0x735 /* Unexpected empty sequence */);\n\t\t// Logic in this file is designed to never produce an unneeded (single item) SequenceChunks, so its better to throw an error here to detect bugs.\n\t\tassert(chunk.subChunks.length > 1, 0x736 /* Unexpected single item sequence */);\n\n\t\tfor (const sub of chunk.subChunks) {\n\t\t\t// The logic in this file is designed to never produce an nested SequenceChunks or emptyChunk, so its better to throw an error here to detect bugs.\n\t\t\tassert(!(sub instanceof SequenceChunk), 0x737 /* unexpected nested sequence */);\n\t\t\tassert(sub !== emptyChunk, 0x738 /* unexpected empty chunk */);\n\n\t\t\tsub.referenceAdded();\n\t\t}\n\n\t\tchunk.referenceRemoved();\n\t\treturn chunk.subChunks;\n\t} else {\n\t\treturn [chunk];\n\t}\n}\n\n/**\n * Normalize a {@link TreeChunk}[] into a single TreeChunk.\n *\n * Avoids creating nested or less than 2 child {@link SequenceChunk}s.\n */\nexport function aggregateChunks(input: TreeChunk[]): TreeChunk {\n\tconst chunks = input.flatMap(deaggregateChunks);\n\tswitch (chunks.length) {\n\t\tcase 0: {\n\t\t\treturn emptyChunk;\n\t\t}\n\t\tcase 1: {\n\t\t\treturn chunks[0] ?? oob();\n\t\t}\n\t\tdefault: {\n\t\t\treturn new SequenceChunk(chunks);\n\t\t}\n\t}\n}\n\n/**\n * Decoder for {@link EncodedNestedArrayShape}s.\n */\nexport class NestedArrayDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly shape: EncodedNestedArrayShape) {}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst decoder = decoders[this.shape] ?? oob();\n\n\t\t// TODO: uniform chunk fast path\n\t\tconst chunks: TreeChunk[] = [];\n\n\t\tconst data = readStream(stream);\n\t\tif (typeof data === \"number\") {\n\t\t\t// This case means that the array contained only 0-sized items, and was thus encoded as the length of the array.\n\t\t\tconst inner = { data: [], offset: 0 };\n\t\t\tfor (let index = 0; index < data; index++) {\n\t\t\t\tchunks.push(decoder.decode(decoders, inner));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tArray.isArray(data),\n\t\t\t\t0x739 /* expected number of array for encoding of nested array */,\n\t\t\t);\n\t\t\tconst inner = { data, offset: 0 };\n\t\t\twhile (inner.offset !== inner.data.length) {\n\t\t\t\tchunks.push(decoder.decode(decoders, inner));\n\t\t\t}\n\t\t}\n\n\t\treturn aggregateChunks(chunks);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedInlineArrayShape}s.\n */\nexport class InlineArrayDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly shape: EncodedInlineArrayShape) {}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst length = this.shape.length;\n\t\tconst decoder = decoders[this.shape.shape] ?? oob();\n\t\tconst chunks: TreeChunk[] = [];\n\t\tfor (let index = 0; index < length; index++) {\n\t\t\tchunks.push(decoder.decode(decoders, stream));\n\t\t}\n\t\treturn aggregateChunks(chunks);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedIncrementalChunkShape}s.\n */\nexport class IncrementalChunkDecoder implements ChunkDecoder {\n\tpublic constructor(private readonly context: DecoderContext<EncodedChunkShapeV2>) {}\n\tpublic decode(_: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tassert(\n\t\t\tthis.context.incrementalDecoder !== undefined,\n\t\t\t0xc27 /* incremental decoder not available for incremental field decoding */,\n\t\t);\n\n\t\tconst chunkDecoder = (batch: EncodedFieldBatchV2): TreeChunk => {\n\t\t\tassert(\n\t\t\t\tsupportsIncrementalEncoding(batch.version),\n\t\t\t\t0xc9f /* Unsupported FieldBatchFormatVersion for incremental chunks; must be v2 or higher */,\n\t\t\t);\n\t\t\tconst context = new DecoderContext(\n\t\t\t\tbatch.identifiers,\n\t\t\t\tbatch.shapes,\n\t\t\t\tthis.context.idDecodingContext,\n\t\t\t\tthis.context.incrementalDecoder,\n\t\t\t);\n\t\t\tconst chunks = genericDecode(decoderLibrary, context, batch, anyDecoder);\n\t\t\treturn aggregateChunks(chunks);\n\t\t};\n\n\t\tconst chunkReferenceId = readStreamNumber(stream);\n\t\treturn this.context.incrementalDecoder.decodeIncrementalChunk(\n\t\t\tbrand(chunkReferenceId),\n\t\t\tchunkDecoder,\n\t\t);\n\t}\n}\n\n/**\n * Decoder for {@link EncodedAnyShape}s.\n */\nexport const anyDecoder: ChunkDecoder = {\n\tdecode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst shapeIndex = readStreamNumber(stream);\n\t\tconst decoder = getChecked(decoders, shapeIndex);\n\t\treturn decoder.decode(decoders, stream);\n\t},\n};\n\n/**\n * Decoder for field.\n */\ntype BasicFieldDecoder = (\n\tdecoders: readonly ChunkDecoder[],\n\tstream: StreamCursor,\n) => [FieldKey, TreeChunk];\n\n/**\n * Get a decoder for fields of a provided (via `shape` and `context`).\n */\nfunction fieldDecoder(\n\tcontext: DecoderContext<EncodedChunkShapeV1OrV2>,\n\tkey: FieldKey,\n\tshape: number,\n): BasicFieldDecoder {\n\tassertValidIndex(shape, context.shapes);\n\treturn (decoders, stream) => {\n\t\tconst decoder = decoders[shape] ?? oob();\n\t\treturn [key, decoder.decode(decoders, stream)];\n\t};\n}\n\n/**\n * Decoder for {@link EncodedNodeShape}s.\n */\nexport class NodeDecoder implements ChunkDecoder {\n\tprivate readonly type?: TreeNodeSchemaIdentifier;\n\tprivate readonly fieldDecoders: readonly BasicFieldDecoder[];\n\tpublic constructor(\n\t\tprivate readonly shape: EncodedNodeShape,\n\t\tprivate readonly context: DecoderContext<EncodedChunkShapeV1OrV2>,\n\t) {\n\t\tthis.type = shape.type === undefined ? undefined : context.identifier(shape.type);\n\n\t\tconst fieldDecoders: BasicFieldDecoder[] = [];\n\t\tfor (const [fieldKey, fieldShape] of shape.fields ?? []) {\n\t\t\tconst key: FieldKey = context.identifier(fieldKey);\n\t\t\tfieldDecoders.push(fieldDecoder(context, key, fieldShape));\n\t\t}\n\t\tthis.fieldDecoders = fieldDecoders;\n\t}\n\tpublic decode(decoders: readonly ChunkDecoder[], stream: StreamCursor): TreeChunk {\n\t\tconst type: TreeNodeSchemaIdentifier =\n\t\t\tthis.type ?? readStreamIdentifier(stream, this.context);\n\t\t// TODO: Consider typechecking against stored schema in here somewhere.\n\n\t\tconst value = readValue(stream, this.shape.value, this.context.idDecodingContext);\n\t\tconst fields: Map<FieldKey, TreeChunk[]> = new Map();\n\n\t\t// Helper to add fields, but with unneeded array chunks removed.\n\t\tfunction addField(key: FieldKey, data: TreeChunk): void {\n\t\t\t// TODO: when handling of ArrayChunks has better performance (for example in cursors),\n\t\t\t// consider keeping array chunks here if they are longer than some threshold.\n\t\t\tconst chunks = deaggregateChunks(data);\n\n\t\t\tif (chunks.length > 0) {\n\t\t\t\tfields.set(key, chunks);\n\t\t\t}\n\t\t}\n\n\t\tfor (const decoder of this.fieldDecoders) {\n\t\t\tconst [key, content] = decoder(decoders, stream);\n\t\t\taddField(key, content);\n\t\t}\n\n\t\tif (this.shape.extraFields !== undefined) {\n\t\t\tconst decoder = decoders[this.shape.extraFields] ?? oob();\n\t\t\tconst inner = readStreamStream(stream);\n\t\t\twhile (inner.offset !== inner.data.length) {\n\t\t\t\tconst key: FieldKey = readStreamIdentifier(inner, this.context);\n\t\t\t\taddField(key, decoder.decode(decoders, inner));\n\t\t\t}\n\t\t}\n\n\t\treturn new BasicChunk(type, fields, value);\n\t}\n}\n"]}
@@ -70,6 +70,33 @@ export interface FieldBatchEncodingContext {
70
70
  * This will be defined if incremental encoding is supported and enabled.
71
71
  */
72
72
  readonly incrementalEncoderDecoder?: IncrementalEncoderDecoder;
73
+ /**
74
+ * `true` when encoding to or decoding from a summary blob. `false` for
75
+ * op-stream encode/decode paths and for utility encoders that are not
76
+ * tied to a persisted document. Healing behavior is gated on this flag.
77
+ */
78
+ readonly isSummary: boolean;
79
+ /**
80
+ * If `true`, when an op-space compressed ID encountered while decoding
81
+ * cannot be resolved by the local id-compressor (e.g. the attach-summary
82
+ * blob's originator session state was stripped), a deterministic stable
83
+ * UUID derived from `sharedObjectId` is returned instead of throwing.
84
+ * @remarks
85
+ * Off by default. Used only to recover documents whose attach summary was
86
+ * written with non-finalized op-space IDs before the encode-side fix
87
+ * shipped. Only takes effect when `isSummary` is also `true`.
88
+ * See {@link SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode}.
89
+ */
90
+ readonly healUnresolvableIdentifiersOnDecode?: boolean;
91
+ /**
92
+ * The SharedTree's shared-object id, used as input to the deterministic
93
+ * UUID derivation when `healUnresolvableIdentifiersOnDecode` triggers. Required
94
+ * for that path; ignored otherwise.
95
+ * @remarks
96
+ * This allows us to ensure that multiple attaches,
97
+ * in the same or different documents, with the same session offsets, get different UUIDs.
98
+ */
99
+ readonly sharedObjectId?: string;
73
100
  }
74
101
  /**
75
102
  * @remarks
@@ -1 +1 @@
1
- {"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/codecs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI9E,OAAO,EACN,oCAAoC,EAGpC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EAGpB,KAAK,SAAS,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAEN,mBAAmB,EAInB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAIhF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;AAGxE;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;OAGG;IACH,yBAAyB,EAAE,yBAAyB,CAAC;IACrD;;;;;;;OAOG;IACH,sBAAsB,CACrB,MAAM,EAAE,sBAAsB,EAC9B,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,mBAAmB,GACrD,gBAAgB,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,sBAAsB,CACrB,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,GACvD,SAAS,CAAC;CACb;AACD;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB,EAAE,kBAAkB;CAAG;AAE5F,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CAC/D;AACD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAuF9E;;GAEG;AACH,eAAO,MAAM,sBAAsB,uNAwBlC,CAAC"}
1
+ {"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/codecs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI9E,OAAO,EACN,oCAAoC,EAGpC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EAGpB,KAAK,SAAS,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAEN,mBAAmB,EAInB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAIhF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;AAGxE;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;OAGG;IACH,yBAAyB,EAAE,yBAAyB,CAAC;IACrD;;;;;;;OAOG;IACH,sBAAsB,CACrB,MAAM,EAAE,sBAAsB,EAC9B,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,mBAAmB,GACrD,gBAAgB,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,sBAAsB,CACrB,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,GACvD,SAAS,CAAC;CACb;AACD;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB,EAAE,kBAAkB;CAAG;AAE5F,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,mCAAmC,CAAC,EAAE,OAAO,CAAC;IACvD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AACD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AA4F9E;;GAEG;AACH,eAAO,MAAM,sBAAsB,uNAwBlC,CAAC"}
@@ -44,7 +44,7 @@ function makeFieldBatchCodecForVersion(version, uncompressedEncodeFn, schemaComp
44
44
  encoded = uncompressedEncodeFn(data);
45
45
  }
46
46
  else {
47
- encoded = schemaCompressedEncodeFn(context.schema.schema, context.schema.policy, data, context.idCompressor, incrementalEncoder);
47
+ encoded = schemaCompressedEncodeFn(context.schema.schema, context.schema.policy, data, context.idCompressor, incrementalEncoder, context.isSummary);
48
48
  }
49
49
  break;
50
50
  }
@@ -60,6 +60,9 @@ function makeFieldBatchCodecForVersion(version, uncompressedEncodeFn, schemaComp
60
60
  return (0, chunkDecoding_js_1.decode)(data, {
61
61
  idCompressor: context.idCompressor,
62
62
  originatorId: context.originatorId,
63
+ isSummary: context.isSummary,
64
+ healUnresolvableIdentifiersOnDecode: context.healUnresolvableIdentifiersOnDecode,
65
+ sharedObjectId: context.sharedObjectId,
63
66
  }, context.incrementalEncoderDecoder).map((chunk) => chunk.cursor());
64
67
  },
65
68
  schema: encodedFieldBatchType,
@@ -1 +1 @@
1
- {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/codecs.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor, SessionId } from \"@fluidframework/id-compressor\";\nimport { lowestMinVersionForCollab } from \"@fluidframework/runtime-utils/internal\";\nimport type { TSchema } from \"@sinclair/typebox\";\n\nimport {\n\tClientVersionDispatchingCodecBuilder,\n\ttype CodecAndSchema,\n\tFluidClientVersion,\n} from \"../../../codec/index.js\";\nimport {\n\tCursorLocationType,\n\ttype ITreeCursorSynchronous,\n\ttype SchemaAndPolicy,\n\ttype SchemaPolicy,\n\ttype StoredSchemaCollection,\n\ttype TreeChunk,\n} from \"../../../core/index.js\";\nimport { brandedNumberType, type Brand } from \"../../../util/index.js\";\nimport { TreeCompressionStrategy } from \"../../treeCompressionUtils.js\";\n\nimport { decode } from \"./chunkDecoding.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\tEncodedFieldBatchV1,\n\tEncodedFieldBatchV2,\n\tFieldBatchFormatVersion,\n\tsupportsIncrementalEncoding,\n\ttype EncodedFieldBatchV1OrV2,\n} from \"./format/index.js\";\nimport type { IncrementalEncodingPolicy } from \"./incrementalEncodingPolicy.js\";\nimport { schemaCompressedEncodeV1, schemaCompressedEncodeV2 } from \"./schemaBasedEncode.js\";\nimport { uncompressedEncodeV1, uncompressedEncodeV2 } from \"./uncompressedEncode.js\";\n\n/**\n * Reference ID for a chunk that is incrementally encoded.\n */\nexport type ChunkReferenceId = Brand<number, \"forest.ChunkReferenceId\">;\nconst ChunkReferenceId = brandedNumberType<ChunkReferenceId>({ multipleOf: 1, minimum: 0 });\n\n/**\n * Properties for incremental encoding.\n * Fields that support incremental encoding will encode their chunks separately by calling `encodeIncrementalField`.\n * @remarks\n * This supports features like incremental summarization where the summary from these fields can be re-used if\n * unchanged between summaries.\n * Note that each of these chunks that are incrementally encoded is fully self-describing (contain its own shapes\n * list and identifier table) and does not rely on context from its parent.\n */\nexport interface IncrementalEncoder {\n\t/**\n\t * Returns whether a node / field should be incrementally encoded.\n\t * @remarks See {@link IncrementalEncodingPolicy}.\n\t */\n\tshouldEncodeIncrementally: IncrementalEncodingPolicy;\n\t/**\n\t * Called to encode an incremental field at the cursor.\n\t * The chunks for this field are encoded separately from the main buffer.\n\t * @param cursor - The cursor pointing to the field to encode.\n\t * @param chunkEncoder - A function that encodes the contents of the passed chunk in the field.\n\t * @returns The reference IDs of the encoded chunks in the field.\n\t * This is used to retrieve the encoded chunks later.\n\t */\n\tencodeIncrementalField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tchunkEncoder: (chunk: TreeChunk) => EncodedFieldBatchV2,\n\t): ChunkReferenceId[];\n}\n\n/**\n * Properties for incremental decoding.\n *\n * Fields that had their chunks incrementally encoded will retrieve them by calling `getEncodedIncrementalChunk`.\n * @remarks\n * See {@link IncrementalEncoder} for more details.\n */\nexport interface IncrementalDecoder {\n\t/**\n\t * Called to decode an incremental chunk with the given reference ID.\n\t * @param referenceId - The reference ID of the chunk to decode.\n\t * @param chunkDecoder - A function that decodes the chunk.\n\t * @returns The decoded chunk.\n\t */\n\tdecodeIncrementalChunk(\n\t\treferenceId: ChunkReferenceId,\n\t\tchunkDecoder: (encoded: EncodedFieldBatchV2) => TreeChunk,\n\t): TreeChunk;\n}\n/**\n * Combines the properties of {@link IncrementalEncoder} and {@link IncrementalDecoder}.\n */\nexport interface IncrementalEncoderDecoder extends IncrementalEncoder, IncrementalDecoder {}\n\nexport interface FieldBatchEncodingContext {\n\treadonly encodeType: TreeCompressionStrategy;\n\treadonly idCompressor: IIdCompressor;\n\treadonly originatorId: SessionId;\n\treadonly schema?: SchemaAndPolicy;\n\t/**\n\t * An encoder / decoder for encoding and decoding of incremental fields.\n\t * This will be defined if incremental encoding is supported and enabled.\n\t */\n\treadonly incrementalEncoderDecoder?: IncrementalEncoderDecoder;\n}\n/**\n * @remarks\n * Fields in this batch currently don't have field schema for the root, which limits optimizations.\n */\nexport type FieldBatchCodec = ReturnType<typeof fieldBatchCodecBuilder.build>;\n\n/**\n * Creates the encode/decode functions for a specific FieldBatch format version.\n */\nfunction makeFieldBatchCodecForVersion(\n\tversion: FieldBatchFormatVersion,\n\tuncompressedEncodeFn: (batch: FieldBatch) => EncodedFieldBatchV1OrV2,\n\tschemaCompressedEncodeFn: (\n\t\tschema: StoredSchemaCollection,\n\t\tpolicy: SchemaPolicy,\n\t\tfieldBatch: FieldBatch,\n\t\tidCompressor: IIdCompressor,\n\t\tincrementalEncoder: IncrementalEncoder | undefined,\n\t) => EncodedFieldBatchV1OrV2,\n\tencodedFieldBatchType: TSchema,\n): CodecAndSchema<FieldBatch, FieldBatchEncodingContext> {\n\treturn {\n\t\tencode: (\n\t\t\tdata: FieldBatch,\n\t\t\tcontext: FieldBatchEncodingContext,\n\t\t): EncodedFieldBatchV1OrV2 => {\n\t\t\tfor (const cursor of data) {\n\t\t\t\tassert(\n\t\t\t\t\tcursor.mode === CursorLocationType.Fields,\n\t\t\t\t\t0x8a3 /* FieldBatch expects fields cursors */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet encoded: EncodedFieldBatchV1OrV2;\n\t\t\tlet incrementalEncoder: IncrementalEncoder | undefined;\n\t\t\tswitch (context.encodeType) {\n\t\t\t\tcase TreeCompressionStrategy.Uncompressed: {\n\t\t\t\t\tencoded = uncompressedEncodeFn(data);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TreeCompressionStrategy.CompressedIncremental: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsupportsIncrementalEncoding(version),\n\t\t\t\t\t\t0xca0 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */,\n\t\t\t\t\t);\n\t\t\t\t\t// Incremental encoding is only supported for CompressedIncremental.\n\t\t\t\t\tincrementalEncoder = context.incrementalEncoderDecoder;\n\t\t\t\t}\n\t\t\t\t// fallthrough\n\t\t\t\tcase TreeCompressionStrategy.Compressed: {\n\t\t\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\t\t\tif (context.schema === undefined) {\n\t\t\t\t\t\t// TODO: consider enabling a somewhat compressed but not schema accelerated encode.\n\t\t\t\t\t\tencoded = uncompressedEncodeFn(data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tencoded = schemaCompressedEncodeFn(\n\t\t\t\t\t\t\tcontext.schema.schema,\n\t\t\t\t\t\t\tcontext.schema.policy,\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tcontext.idCompressor,\n\t\t\t\t\t\t\tincrementalEncoder,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(context.encodeType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TODO: consider checking input data was in schema.\n\t\t\treturn encoded;\n\t\t},\n\t\tdecode: (\n\t\t\tdata: EncodedFieldBatchV1OrV2,\n\t\t\tcontext: FieldBatchEncodingContext,\n\t\t): FieldBatch => {\n\t\t\t// TODO: consider checking data is in schema.\n\t\t\treturn decode(\n\t\t\t\tdata,\n\t\t\t\t{\n\t\t\t\t\tidCompressor: context.idCompressor,\n\t\t\t\t\toriginatorId: context.originatorId,\n\t\t\t\t},\n\t\t\t\tcontext.incrementalEncoderDecoder,\n\t\t\t).map((chunk) => chunk.cursor());\n\t\t},\n\t\tschema: encodedFieldBatchType,\n\t};\n}\n\n/**\n * {@link ClientVersionDispatchingCodecBuilder} for field batch codecs.\n */\nexport const fieldBatchCodecBuilder = ClientVersionDispatchingCodecBuilder.build(\n\t\"FieldBatch\",\n\t[\n\t\t{\n\t\t\tminVersionForCollab: lowestMinVersionForCollab,\n\t\t\tformatVersion: FieldBatchFormatVersion.v1,\n\t\t\tcodec: makeFieldBatchCodecForVersion(\n\t\t\t\tFieldBatchFormatVersion.v1,\n\t\t\t\tuncompressedEncodeV1,\n\t\t\t\tschemaCompressedEncodeV1,\n\t\t\t\tEncodedFieldBatchV1,\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tminVersionForCollab: FluidClientVersion.v2_73,\n\t\t\tformatVersion: FieldBatchFormatVersion.v2,\n\t\t\tcodec: makeFieldBatchCodecForVersion(\n\t\t\t\tFieldBatchFormatVersion.v2,\n\t\t\t\tuncompressedEncodeV2,\n\t\t\t\tschemaCompressedEncodeV2,\n\t\t\t\tEncodedFieldBatchV2,\n\t\t\t),\n\t\t},\n\t],\n);\n"]}
1
+ {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/codecs.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA8E;AAE9E,qEAAmF;AAGnF,sDAIiC;AASjC,qDAAuE;AACvE,2EAAwE;AAExE,yDAA4C;AAE5C,gDAM2B;AAE3B,iEAA4F;AAC5F,mEAAqF;AAMrF,MAAM,gBAAgB,GAAG,IAAA,4BAAiB,EAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAmG5F;;GAEG;AACH,SAAS,6BAA6B,CACrC,OAAgC,EAChC,oBAAoE,EACpE,wBAO4B,EAC5B,qBAA8B;IAE9B,OAAO;QACN,MAAM,EAAE,CACP,IAAgB,EAChB,OAAkC,EACR,EAAE;YAC5B,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC3B,IAAA,iBAAM,EACL,MAAM,CAAC,IAAI,sCAA8B,EACzC,KAAK,CAAC,uCAAuC,CAC7C,CAAC;YACH,CAAC;YACD,IAAI,OAAgC,CAAC;YACrC,IAAI,kBAAkD,CAAC;YACvD,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC5B,KAAK,iDAAuB,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC3C,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBACrC,MAAM;gBACP,CAAC;gBACD,KAAK,iDAAuB,CAAC,qBAAqB,CAAC,CAAC,CAAC;oBACpD,IAAA,iBAAM,EACL,IAAA,sCAA2B,EAAC,OAAO,CAAC,EACpC,KAAK,CAAC,wFAAwF,CAC9F,CAAC;oBACF,oEAAoE;oBACpE,kBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC;gBACxD,CAAC;gBACD,cAAc;gBACd,KAAK,iDAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;oBACzC,kDAAkD;oBAClD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAClC,mFAAmF;wBACnF,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBACtC,CAAC;yBAAM,CAAC;wBACP,OAAO,GAAG,wBAAwB,CACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EACrB,IAAI,EACJ,OAAO,CAAC,YAAY,EACpB,kBAAkB,EAClB,OAAO,CAAC,SAAS,CACjB,CAAC;oBACH,CAAC;oBAED,MAAM;gBACP,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACT,IAAA,0BAAe,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;YACF,CAAC;YAED,oDAAoD;YACpD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,CACP,IAA6B,EAC7B,OAAkC,EACrB,EAAE;YACf,6CAA6C;YAC7C,OAAO,IAAA,yBAAM,EACZ,IAAI,EACJ;gBACC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,mCAAmC,EAAE,OAAO,CAAC,mCAAmC;gBAChF,cAAc,EAAE,OAAO,CAAC,cAAc;aACtC,EACD,OAAO,CAAC,yBAAyB,CACjC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,EAAE,qBAAqB;KAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACU,QAAA,sBAAsB,GAAG,+CAAoC,CAAC,KAAK,CAC/E,YAAY,EACZ;IACC;QACC,mBAAmB,EAAE,oCAAyB;QAC9C,aAAa,EAAE,kCAAuB,CAAC,EAAE;QACzC,KAAK,EAAE,6BAA6B,CACnC,kCAAuB,CAAC,EAAE,EAC1B,4CAAoB,EACpB,+CAAwB,EACxB,8BAAmB,CACnB;KACD;IACD;QACC,mBAAmB,EAAE,6BAAkB,CAAC,KAAK;QAC7C,aAAa,EAAE,kCAAuB,CAAC,EAAE;QACzC,KAAK,EAAE,6BAA6B,CACnC,kCAAuB,CAAC,EAAE,EAC1B,4CAAoB,EACpB,+CAAwB,EACxB,8BAAmB,CACnB;KACD;CACD,CACD,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor, SessionId } from \"@fluidframework/id-compressor\";\nimport { lowestMinVersionForCollab } from \"@fluidframework/runtime-utils/internal\";\nimport type { TSchema } from \"@sinclair/typebox\";\n\nimport {\n\tClientVersionDispatchingCodecBuilder,\n\ttype CodecAndSchema,\n\tFluidClientVersion,\n} from \"../../../codec/index.js\";\nimport {\n\tCursorLocationType,\n\ttype ITreeCursorSynchronous,\n\ttype SchemaAndPolicy,\n\ttype SchemaPolicy,\n\ttype StoredSchemaCollection,\n\ttype TreeChunk,\n} from \"../../../core/index.js\";\nimport { brandedNumberType, type Brand } from \"../../../util/index.js\";\nimport { TreeCompressionStrategy } from \"../../treeCompressionUtils.js\";\n\nimport { decode } from \"./chunkDecoding.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\tEncodedFieldBatchV1,\n\tEncodedFieldBatchV2,\n\tFieldBatchFormatVersion,\n\tsupportsIncrementalEncoding,\n\ttype EncodedFieldBatchV1OrV2,\n} from \"./format/index.js\";\nimport type { IncrementalEncodingPolicy } from \"./incrementalEncodingPolicy.js\";\nimport { schemaCompressedEncodeV1, schemaCompressedEncodeV2 } from \"./schemaBasedEncode.js\";\nimport { uncompressedEncodeV1, uncompressedEncodeV2 } from \"./uncompressedEncode.js\";\n\n/**\n * Reference ID for a chunk that is incrementally encoded.\n */\nexport type ChunkReferenceId = Brand<number, \"forest.ChunkReferenceId\">;\nconst ChunkReferenceId = brandedNumberType<ChunkReferenceId>({ multipleOf: 1, minimum: 0 });\n\n/**\n * Properties for incremental encoding.\n * Fields that support incremental encoding will encode their chunks separately by calling `encodeIncrementalField`.\n * @remarks\n * This supports features like incremental summarization where the summary from these fields can be re-used if\n * unchanged between summaries.\n * Note that each of these chunks that are incrementally encoded is fully self-describing (contain its own shapes\n * list and identifier table) and does not rely on context from its parent.\n */\nexport interface IncrementalEncoder {\n\t/**\n\t * Returns whether a node / field should be incrementally encoded.\n\t * @remarks See {@link IncrementalEncodingPolicy}.\n\t */\n\tshouldEncodeIncrementally: IncrementalEncodingPolicy;\n\t/**\n\t * Called to encode an incremental field at the cursor.\n\t * The chunks for this field are encoded separately from the main buffer.\n\t * @param cursor - The cursor pointing to the field to encode.\n\t * @param chunkEncoder - A function that encodes the contents of the passed chunk in the field.\n\t * @returns The reference IDs of the encoded chunks in the field.\n\t * This is used to retrieve the encoded chunks later.\n\t */\n\tencodeIncrementalField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tchunkEncoder: (chunk: TreeChunk) => EncodedFieldBatchV2,\n\t): ChunkReferenceId[];\n}\n\n/**\n * Properties for incremental decoding.\n *\n * Fields that had their chunks incrementally encoded will retrieve them by calling `getEncodedIncrementalChunk`.\n * @remarks\n * See {@link IncrementalEncoder} for more details.\n */\nexport interface IncrementalDecoder {\n\t/**\n\t * Called to decode an incremental chunk with the given reference ID.\n\t * @param referenceId - The reference ID of the chunk to decode.\n\t * @param chunkDecoder - A function that decodes the chunk.\n\t * @returns The decoded chunk.\n\t */\n\tdecodeIncrementalChunk(\n\t\treferenceId: ChunkReferenceId,\n\t\tchunkDecoder: (encoded: EncodedFieldBatchV2) => TreeChunk,\n\t): TreeChunk;\n}\n/**\n * Combines the properties of {@link IncrementalEncoder} and {@link IncrementalDecoder}.\n */\nexport interface IncrementalEncoderDecoder extends IncrementalEncoder, IncrementalDecoder {}\n\nexport interface FieldBatchEncodingContext {\n\treadonly encodeType: TreeCompressionStrategy;\n\treadonly idCompressor: IIdCompressor;\n\treadonly originatorId: SessionId;\n\treadonly schema?: SchemaAndPolicy;\n\t/**\n\t * An encoder / decoder for encoding and decoding of incremental fields.\n\t * This will be defined if incremental encoding is supported and enabled.\n\t */\n\treadonly incrementalEncoderDecoder?: IncrementalEncoderDecoder;\n\t/**\n\t * `true` when encoding to or decoding from a summary blob. `false` for\n\t * op-stream encode/decode paths and for utility encoders that are not\n\t * tied to a persisted document. Healing behavior is gated on this flag.\n\t */\n\treadonly isSummary: boolean;\n\t/**\n\t * If `true`, when an op-space compressed ID encountered while decoding\n\t * cannot be resolved by the local id-compressor (e.g. the attach-summary\n\t * blob's originator session state was stripped), a deterministic stable\n\t * UUID derived from `sharedObjectId` is returned instead of throwing.\n\t * @remarks\n\t * Off by default. Used only to recover documents whose attach summary was\n\t * written with non-finalized op-space IDs before the encode-side fix\n\t * shipped. Only takes effect when `isSummary` is also `true`.\n\t * See {@link SharedTreeOptionsBeta.healUnresolvableIdentifiersOnDecode}.\n\t */\n\treadonly healUnresolvableIdentifiersOnDecode?: boolean;\n\t/**\n\t * The SharedTree's shared-object id, used as input to the deterministic\n\t * UUID derivation when `healUnresolvableIdentifiersOnDecode` triggers. Required\n\t * for that path; ignored otherwise.\n\t * @remarks\n\t * This allows us to ensure that multiple attaches,\n\t * in the same or different documents, with the same session offsets, get different UUIDs.\n\t */\n\treadonly sharedObjectId?: string;\n}\n/**\n * @remarks\n * Fields in this batch currently don't have field schema for the root, which limits optimizations.\n */\nexport type FieldBatchCodec = ReturnType<typeof fieldBatchCodecBuilder.build>;\n\n/**\n * Creates the encode/decode functions for a specific FieldBatch format version.\n */\nfunction makeFieldBatchCodecForVersion(\n\tversion: FieldBatchFormatVersion,\n\tuncompressedEncodeFn: (batch: FieldBatch) => EncodedFieldBatchV1OrV2,\n\tschemaCompressedEncodeFn: (\n\t\tschema: StoredSchemaCollection,\n\t\tpolicy: SchemaPolicy,\n\t\tfieldBatch: FieldBatch,\n\t\tidCompressor: IIdCompressor,\n\t\tincrementalEncoder: IncrementalEncoder | undefined,\n\t\tisSummary: boolean,\n\t) => EncodedFieldBatchV1OrV2,\n\tencodedFieldBatchType: TSchema,\n): CodecAndSchema<FieldBatch, FieldBatchEncodingContext> {\n\treturn {\n\t\tencode: (\n\t\t\tdata: FieldBatch,\n\t\t\tcontext: FieldBatchEncodingContext,\n\t\t): EncodedFieldBatchV1OrV2 => {\n\t\t\tfor (const cursor of data) {\n\t\t\t\tassert(\n\t\t\t\t\tcursor.mode === CursorLocationType.Fields,\n\t\t\t\t\t0x8a3 /* FieldBatch expects fields cursors */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet encoded: EncodedFieldBatchV1OrV2;\n\t\t\tlet incrementalEncoder: IncrementalEncoder | undefined;\n\t\t\tswitch (context.encodeType) {\n\t\t\t\tcase TreeCompressionStrategy.Uncompressed: {\n\t\t\t\t\tencoded = uncompressedEncodeFn(data);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TreeCompressionStrategy.CompressedIncremental: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsupportsIncrementalEncoding(version),\n\t\t\t\t\t\t0xca0 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */,\n\t\t\t\t\t);\n\t\t\t\t\t// Incremental encoding is only supported for CompressedIncremental.\n\t\t\t\t\tincrementalEncoder = context.incrementalEncoderDecoder;\n\t\t\t\t}\n\t\t\t\t// fallthrough\n\t\t\t\tcase TreeCompressionStrategy.Compressed: {\n\t\t\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\t\t\tif (context.schema === undefined) {\n\t\t\t\t\t\t// TODO: consider enabling a somewhat compressed but not schema accelerated encode.\n\t\t\t\t\t\tencoded = uncompressedEncodeFn(data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tencoded = schemaCompressedEncodeFn(\n\t\t\t\t\t\t\tcontext.schema.schema,\n\t\t\t\t\t\t\tcontext.schema.policy,\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tcontext.idCompressor,\n\t\t\t\t\t\t\tincrementalEncoder,\n\t\t\t\t\t\t\tcontext.isSummary,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(context.encodeType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TODO: consider checking input data was in schema.\n\t\t\treturn encoded;\n\t\t},\n\t\tdecode: (\n\t\t\tdata: EncodedFieldBatchV1OrV2,\n\t\t\tcontext: FieldBatchEncodingContext,\n\t\t): FieldBatch => {\n\t\t\t// TODO: consider checking data is in schema.\n\t\t\treturn decode(\n\t\t\t\tdata,\n\t\t\t\t{\n\t\t\t\t\tidCompressor: context.idCompressor,\n\t\t\t\t\toriginatorId: context.originatorId,\n\t\t\t\t\tisSummary: context.isSummary,\n\t\t\t\t\thealUnresolvableIdentifiersOnDecode: context.healUnresolvableIdentifiersOnDecode,\n\t\t\t\t\tsharedObjectId: context.sharedObjectId,\n\t\t\t\t},\n\t\t\t\tcontext.incrementalEncoderDecoder,\n\t\t\t).map((chunk) => chunk.cursor());\n\t\t},\n\t\tschema: encodedFieldBatchType,\n\t};\n}\n\n/**\n * {@link ClientVersionDispatchingCodecBuilder} for field batch codecs.\n */\nexport const fieldBatchCodecBuilder = ClientVersionDispatchingCodecBuilder.build(\n\t\"FieldBatch\",\n\t[\n\t\t{\n\t\t\tminVersionForCollab: lowestMinVersionForCollab,\n\t\t\tformatVersion: FieldBatchFormatVersion.v1,\n\t\t\tcodec: makeFieldBatchCodecForVersion(\n\t\t\t\tFieldBatchFormatVersion.v1,\n\t\t\t\tuncompressedEncodeV1,\n\t\t\t\tschemaCompressedEncodeV1,\n\t\t\t\tEncodedFieldBatchV1,\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tminVersionForCollab: FluidClientVersion.v2_73,\n\t\t\tformatVersion: FieldBatchFormatVersion.v2,\n\t\t\tcodec: makeFieldBatchCodecForVersion(\n\t\t\t\tFieldBatchFormatVersion.v2,\n\t\t\t\tuncompressedEncodeV2,\n\t\t\t\tschemaCompressedEncodeV2,\n\t\t\t\tEncodedFieldBatchV2,\n\t\t\t),\n\t\t},\n\t],\n);\n"]}
@@ -179,6 +179,10 @@ export declare class EncoderContext implements NodeEncodeBuilder, FieldEncodeBui
179
179
  */
180
180
  readonly incrementalEncoder: IncrementalEncoder | undefined;
181
181
  readonly version: FieldBatchFormatVersion;
182
+ /**
183
+ * See {@link FieldBatchEncodingContext.isSummary}.
184
+ */
185
+ readonly isSummary: boolean;
182
186
  private readonly nodeEncodersFromSchema;
183
187
  private readonly nestedArrayEncoders;
184
188
  constructor(nodeEncoderFromPolicy: NodeEncoderPolicy, fieldEncoderFromPolicy: FieldEncoderPolicy, fieldShapes: ReadonlyMap<FieldKindIdentifier, FieldKindData>, idCompressor: IIdCompressor,
@@ -187,7 +191,11 @@ export declare class EncoderContext implements NodeEncodeBuilder, FieldEncodeBui
187
191
  * @remarks
188
192
  * See {@link IncrementalEncoder} for more information.
189
193
  */
190
- incrementalEncoder: IncrementalEncoder | undefined, version: FieldBatchFormatVersion);
194
+ incrementalEncoder: IncrementalEncoder | undefined, version: FieldBatchFormatVersion,
195
+ /**
196
+ * See {@link FieldBatchEncodingContext.isSummary}.
197
+ */
198
+ isSummary: boolean);
191
199
  nodeEncoderFromSchema(schemaName: TreeNodeSchemaIdentifier): NodeEncoder;
192
200
  fieldEncoderFromSchema(fieldSchema: TreeFieldStoredSchema): FieldEncoder;
193
201
  nestedArrayEncoder(inner: NodeEncoder): NestedArrayEncoder;
@@ -1 +1 @@
1
- {"version":3,"file":"compressedEncode.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/compressedEncode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compressedEncode.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/compressedEncode.ts"],"names":[],"mappings":"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"}