@fluidframework/tree 2.93.0 → 2.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/INCREMENTAL_SUMMARY.md +89 -0
  3. package/README.md +6 -0
  4. package/api-report/tree.alpha.api.md +6 -1
  5. package/api-report/tree.beta.api.md +3 -1
  6. package/api-report/tree.legacy.beta.api.md +3 -1
  7. package/dist/core/change-family/changeFamily.d.ts +23 -0
  8. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  9. package/dist/core/change-family/changeFamily.js.map +1 -1
  10. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
  11. package/dist/core/tree/detachedFieldIndexCodecV1.js +2 -0
  12. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
  13. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
  14. package/dist/core/tree/detachedFieldIndexCodecV2.js +2 -0
  15. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
  16. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts +25 -1
  17. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  18. package/dist/feature-libraries/chunked-forest/basicChunk.js +71 -18
  19. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  20. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -4
  21. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  22. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +31 -4
  23. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  24. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +27 -0
  25. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  26. package/dist/feature-libraries/chunked-forest/codec/codecs.js +5 -2
  27. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  28. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +10 -2
  29. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  30. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +7 -2
  31. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  32. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +1 -2
  33. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  34. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js +0 -1
  35. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/codec/format/index.d.ts +1 -1
  37. package/dist/feature-libraries/chunked-forest/codec/format/index.d.ts.map +1 -1
  38. package/dist/feature-libraries/chunked-forest/codec/format/index.js +2 -1
  39. package/dist/feature-libraries/chunked-forest/codec/format/index.js.map +1 -1
  40. package/dist/feature-libraries/chunked-forest/codec/format/versions.d.ts +10 -2
  41. package/dist/feature-libraries/chunked-forest/codec/format/versions.d.ts.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/codec/format/versions.js +15 -1
  43. package/dist/feature-libraries/chunked-forest/codec/format/versions.js.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js +9 -1
  46. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -1
  47. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +3 -3
  48. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  49. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +8 -8
  50. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  51. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +6 -1
  52. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  53. package/dist/feature-libraries/chunked-forest/uniformChunk.js +25 -1
  54. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  55. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -0
  56. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  57. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +76 -22
  58. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +2 -14
  60. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  61. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -17
  62. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  63. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  64. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +4 -0
  65. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  66. package/dist/packageVersion.d.ts +1 -1
  67. package/dist/packageVersion.d.ts.map +1 -1
  68. package/dist/packageVersion.js +1 -1
  69. package/dist/packageVersion.js.map +1 -1
  70. package/dist/shared-tree/independentView.d.ts.map +1 -1
  71. package/dist/shared-tree/independentView.js +2 -0
  72. package/dist/shared-tree/independentView.js.map +1 -1
  73. package/dist/shared-tree/sharedTree.d.ts +35 -1
  74. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  75. package/dist/shared-tree/sharedTree.js +6 -0
  76. package/dist/shared-tree/sharedTree.js.map +1 -1
  77. package/dist/shared-tree/sharedTreeChangeCodecs.js +1 -0
  78. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  79. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  80. package/dist/shared-tree/treeAlpha.js +2 -0
  81. package/dist/shared-tree/treeAlpha.js.map +1 -1
  82. package/dist/shared-tree/treeCheckout.d.ts +1 -1
  83. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  84. package/dist/shared-tree/treeCheckout.js +2 -0
  85. package/dist/shared-tree/treeCheckout.js.map +1 -1
  86. package/dist/shared-tree-core/editManagerCodecs.d.ts +3 -0
  87. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  88. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  89. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +14 -0
  90. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  91. package/dist/shared-tree-core/editManagerCodecsCommons.js +14 -0
  92. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  93. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts +3 -0
  94. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  95. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  96. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +3 -0
  97. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  98. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  99. package/dist/shared-tree-core/editManagerSummarizer.d.ts +9 -1
  100. package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  101. package/dist/shared-tree-core/editManagerSummarizer.js +20 -5
  102. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  103. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  104. package/dist/shared-tree-core/messageCodecV1ToV4.js +4 -0
  105. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  106. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  107. package/dist/shared-tree-core/messageCodecVSharedBranches.js +4 -0
  108. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  109. package/dist/shared-tree-core/sharedTreeCore.d.ts +4 -0
  110. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  111. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  112. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  113. package/dist/simple-tree/api/schemaFactory.d.ts +3 -3
  114. package/dist/simple-tree/api/schemaFactory.js +3 -3
  115. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  116. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +17 -1
  117. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  118. package/dist/simple-tree/api/schemaFactoryAlpha.js +9 -0
  119. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  120. package/dist/tableSchema.d.ts.map +1 -1
  121. package/dist/tableSchema.js +102 -20
  122. package/dist/tableSchema.js.map +1 -1
  123. package/docs/user-facing/isolated-declarations.md +147 -0
  124. package/lib/core/change-family/changeFamily.d.ts +23 -0
  125. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  126. package/lib/core/change-family/changeFamily.js.map +1 -1
  127. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
  128. package/lib/core/tree/detachedFieldIndexCodecV1.js +2 -0
  129. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
  130. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
  131. package/lib/core/tree/detachedFieldIndexCodecV2.js +2 -0
  132. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
  133. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts +25 -1
  134. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  135. package/lib/feature-libraries/chunked-forest/basicChunk.js +72 -19
  136. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  137. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -4
  138. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  139. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +32 -5
  140. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  141. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +27 -0
  142. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  143. package/lib/feature-libraries/chunked-forest/codec/codecs.js +6 -3
  144. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  145. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +10 -2
  146. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  147. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +8 -3
  148. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  149. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +1 -2
  150. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  151. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js +0 -1
  152. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  153. package/lib/feature-libraries/chunked-forest/codec/format/index.d.ts +1 -1
  154. package/lib/feature-libraries/chunked-forest/codec/format/index.d.ts.map +1 -1
  155. package/lib/feature-libraries/chunked-forest/codec/format/index.js +1 -1
  156. package/lib/feature-libraries/chunked-forest/codec/format/index.js.map +1 -1
  157. package/lib/feature-libraries/chunked-forest/codec/format/versions.d.ts +10 -2
  158. package/lib/feature-libraries/chunked-forest/codec/format/versions.d.ts.map +1 -1
  159. package/lib/feature-libraries/chunked-forest/codec/format/versions.js +13 -0
  160. package/lib/feature-libraries/chunked-forest/codec/format/versions.js.map +1 -1
  161. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -1
  162. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js +9 -1
  163. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -1
  164. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +3 -3
  165. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  166. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +8 -8
  167. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  168. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +6 -1
  169. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  170. package/lib/feature-libraries/chunked-forest/uniformChunk.js +26 -2
  171. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  172. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -0
  173. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  174. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +76 -22
  175. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  176. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +2 -14
  177. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  178. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -17
  179. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  180. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  181. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +4 -0
  182. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  183. package/lib/packageVersion.d.ts +1 -1
  184. package/lib/packageVersion.d.ts.map +1 -1
  185. package/lib/packageVersion.js +1 -1
  186. package/lib/packageVersion.js.map +1 -1
  187. package/lib/shared-tree/independentView.d.ts.map +1 -1
  188. package/lib/shared-tree/independentView.js +2 -0
  189. package/lib/shared-tree/independentView.js.map +1 -1
  190. package/lib/shared-tree/sharedTree.d.ts +35 -1
  191. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  192. package/lib/shared-tree/sharedTree.js +6 -0
  193. package/lib/shared-tree/sharedTree.js.map +1 -1
  194. package/lib/shared-tree/sharedTreeChangeCodecs.js +1 -0
  195. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  196. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  197. package/lib/shared-tree/treeAlpha.js +2 -0
  198. package/lib/shared-tree/treeAlpha.js.map +1 -1
  199. package/lib/shared-tree/treeCheckout.d.ts +1 -1
  200. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  201. package/lib/shared-tree/treeCheckout.js +2 -0
  202. package/lib/shared-tree/treeCheckout.js.map +1 -1
  203. package/lib/shared-tree-core/editManagerCodecs.d.ts +3 -0
  204. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  205. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  206. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +14 -0
  207. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  208. package/lib/shared-tree-core/editManagerCodecsCommons.js +14 -0
  209. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  210. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts +3 -0
  211. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  212. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  213. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +3 -0
  214. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  215. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  216. package/lib/shared-tree-core/editManagerSummarizer.d.ts +9 -1
  217. package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  218. package/lib/shared-tree-core/editManagerSummarizer.js +20 -5
  219. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  220. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  221. package/lib/shared-tree-core/messageCodecV1ToV4.js +4 -0
  222. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  223. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  224. package/lib/shared-tree-core/messageCodecVSharedBranches.js +4 -0
  225. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  226. package/lib/shared-tree-core/sharedTreeCore.d.ts +4 -0
  227. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  228. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  229. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  230. package/lib/simple-tree/api/schemaFactory.d.ts +3 -3
  231. package/lib/simple-tree/api/schemaFactory.js +3 -3
  232. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  233. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +17 -1
  234. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  235. package/lib/simple-tree/api/schemaFactoryAlpha.js +9 -0
  236. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  237. package/lib/tableSchema.d.ts.map +1 -1
  238. package/lib/tableSchema.js +103 -21
  239. package/lib/tableSchema.js.map +1 -1
  240. package/package.json +24 -24
  241. package/src/core/change-family/changeFamily.ts +25 -0
  242. package/src/core/tree/detachedFieldIndexCodecV1.ts +2 -0
  243. package/src/core/tree/detachedFieldIndexCodecV2.ts +2 -0
  244. package/src/feature-libraries/chunked-forest/basicChunk.ts +76 -20
  245. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +61 -12
  246. package/src/feature-libraries/chunked-forest/codec/codecs.ts +34 -1
  247. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +9 -3
  248. package/src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts +0 -1
  249. package/src/feature-libraries/chunked-forest/codec/format/index.ts +1 -0
  250. package/src/feature-libraries/chunked-forest/codec/format/versions.ts +15 -0
  251. package/src/feature-libraries/chunked-forest/codec/nodeEncoder.ts +9 -1
  252. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -1
  253. package/src/feature-libraries/chunked-forest/uniformChunk.ts +32 -2
  254. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +116 -31
  255. package/src/feature-libraries/modular-schema/genericFieldKindFormat.ts +3 -21
  256. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +4 -0
  257. package/src/packageVersion.ts +1 -1
  258. package/src/shared-tree/independentView.ts +2 -0
  259. package/src/shared-tree/sharedTree.ts +41 -1
  260. package/src/shared-tree/sharedTreeChangeCodecs.ts +1 -0
  261. package/src/shared-tree/treeAlpha.ts +2 -0
  262. package/src/shared-tree/treeCheckout.ts +2 -0
  263. package/src/shared-tree-core/editManagerCodecs.ts +3 -0
  264. package/src/shared-tree-core/editManagerCodecsCommons.ts +29 -0
  265. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +3 -0
  266. package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +3 -0
  267. package/src/shared-tree-core/editManagerSummarizer.ts +17 -5
  268. package/src/shared-tree-core/messageCodecV1ToV4.ts +4 -0
  269. package/src/shared-tree-core/messageCodecVSharedBranches.ts +5 -1
  270. package/src/shared-tree-core/sharedTreeCore.ts +8 -1
  271. package/src/simple-tree/api/schemaFactory.ts +3 -3
  272. package/src/simple-tree/api/schemaFactoryAlpha.ts +34 -3
  273. package/src/tableSchema.ts +134 -35
@@ -250,7 +250,7 @@ exports.IncrementalChunkShape = IncrementalChunkShape;
250
250
  exports.incrementalFieldEncoder = {
251
251
  encodeField(cursor, context, outputBuffer) {
252
252
  (0, internal_1.assert)(context.incrementalEncoder !== undefined, 0xc88 /* incremental encoder must be defined to use incrementalFieldEncoder */);
253
- (0, internal_1.assert)(context.version >= index_js_3.FieldBatchFormatVersion.v2, 0xca1 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */);
253
+ (0, internal_1.assert)((0, index_js_3.supportsIncrementalEncoding)(context.version), 0xca1 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */);
254
254
  const chunkReferenceIds = context.incrementalEncoder.encodeIncrementalField(cursor, (chunk) => compressedEncode([chunk.cursor()], context));
255
255
  outputBuffer.push(chunkReferenceIds);
256
256
  },
@@ -308,13 +308,18 @@ class EncoderContext {
308
308
  * @remarks
309
309
  * See {@link IncrementalEncoder} for more information.
310
310
  */
311
- incrementalEncoder, version) {
311
+ incrementalEncoder, version,
312
+ /**
313
+ * See {@link FieldBatchEncodingContext.isSummary}.
314
+ */
315
+ isSummary) {
312
316
  this.nodeEncoderFromPolicy = nodeEncoderFromPolicy;
313
317
  this.fieldEncoderFromPolicy = fieldEncoderFromPolicy;
314
318
  this.fieldShapes = fieldShapes;
315
319
  this.idCompressor = idCompressor;
316
320
  this.incrementalEncoder = incrementalEncoder;
317
321
  this.version = version;
322
+ this.isSummary = isSummary;
318
323
  this.nodeEncodersFromSchema = new Map();
319
324
  this.nestedArrayEncoders = new Map();
320
325
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compressedEncode.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/compressedEncode.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, fail } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tCursorLocationType,\n\ttype FieldKey,\n\ttype FieldKindData,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype TreeChunk,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype Value,\n\tforEachNode,\n} from \"../../../core/index.js\";\nimport { getOrCreate } from \"../../../util/index.js\";\n\nimport type { Counter, DeduplicationTable } from \"./chunkCodecUtilities.js\";\nimport {\n\ttype BufferFormat as BufferFormatGeneric,\n\tShape as ShapeGeneric,\n\tupdateShapesAndIdentifiersEncoding,\n} from \"./chunkEncodingGeneric.js\";\nimport type { IncrementalEncoder } from \"./codecs.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\ttype EncodedAnyShape,\n\ttype EncodedChunkShapeV1,\n\ttype EncodedChunkShapeV1OrV2,\n\ttype EncodedChunkShapeV2,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedNestedArrayShape,\n\ttype EncodedValueShape,\n\tFieldBatchFormatVersion,\n\tSpecialField,\n} from \"./format/index.js\";\n\n/**\n * Encode data from `FieldBatch` into an `EncodedFieldBatch`.\n *\n * Optimized for encoded size and encoding performance.\n *\n * Most of the compression strategy comes from the policy provided via `context`.\n */\nexport function compressedEncode(\n\tfieldBatch: FieldBatch,\n\tcontext: EncoderContext,\n): EncodedFieldBatchV1OrV2 {\n\tconst batchBuffer: BufferFormat[] = [];\n\n\t// Populate buffer, including shape and identifier references\n\tfor (const cursor of fieldBatch) {\n\t\tconst buffer: BufferFormat = [];\n\t\tanyFieldEncoder.encodeField(cursor, context, buffer);\n\t\tbatchBuffer.push(buffer);\n\t}\n\treturn updateShapesAndIdentifiersEncoding(context.version, batchBuffer);\n}\n\nexport type BufferFormat = BufferFormatGeneric<EncodedChunkShapeV1OrV2>;\nexport type Shape = ShapeGeneric<EncodedChunkShapeV1OrV2>;\n\n/**\n * Like {@link FieldEncoder}, except data will be prefixed with the key.\n */\nexport interface KeyedFieldEncoder {\n\treadonly key: FieldKey;\n\treadonly encoder: FieldEncoder;\n}\n\n/**\n * An encoder with an associated shape.\n */\nexport interface Encoder {\n\t/**\n\t * The shape which describes how the encoded data is laid out.\n\t * Used by decoders to interpret the output of `encodeNode`.\n\t */\n\treadonly shape: Shape;\n}\n\n/**\n * An encoder for a specific shape of node.\n *\n * Can only be used with compatible nodes.\n */\nexport interface NodeEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Nodes mode. Does not move cursor.\n\t */\n\tencodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Like {@link NodeEncoder}, except encodes a run of nodes.\n */\nexport interface NodesEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Nodes mode. Moves cursor however many nodes it encodes.\n\t */\n\tencodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Like {@link NodeEncoder}, except encodes a field.\n */\nexport interface FieldEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Fields mode. Encodes entire field.\n\t */\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Makes a {@link FieldEncoder} which runs `encoder` on every node in the field.\n * This does not encode the number nodes: the user of this may need to encode that elsewhere.\n */\nexport function asFieldEncoder(encoder: NodeEncoder): FieldEncoder {\n\treturn {\n\t\tencodeField(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tforEachNode(cursor, () => encoder.encodeNode(cursor, context, outputBuffer));\n\t\t},\n\t\tshape: encoder.shape,\n\t};\n}\n\n/**\n * Adapt a {@link NodeEncoder} to a {@link NodesEncoder} which invokes `encoder` once.\n */\nexport function asNodesEncoder(encoder: NodeEncoder): NodesEncoder {\n\treturn {\n\t\tencodeNodes(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tencoder.encodeNode(cursor, context, outputBuffer);\n\t\t\tcursor.nextNode();\n\t\t},\n\t\tshape: encoder.shape,\n\t};\n}\n\n/**\n * Encodes a chunk with {@link EncodedAnyShape} by prefixing the data with its shape.\n */\nexport class AnyShape extends ShapeGeneric<EncodedChunkShapeV1OrV2> {\n\tprivate constructor() {\n\t\tsuper();\n\t}\n\tpublic static readonly instance = new AnyShape();\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1 {\n\t\tconst encodedAnyShape: EncodedAnyShape = 0;\n\t\treturn { d: encodedAnyShape };\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {}\n\n\tpublic static encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: FieldEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeField(cursor, context, outputBuffer);\n\t}\n\n\tpublic static encodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: NodeEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeNode(cursor, context, outputBuffer);\n\t}\n\n\tpublic static encodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: NodesEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeNodes(cursor, context, outputBuffer);\n\t}\n}\n\n/**\n * Encodes a single node polymorphically.\n */\nexport const anyNodeEncoder: NodeEncoder = {\n\tencodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// TODO: Fast path uniform chunk content.\n\t\tconst nodeEncoder = context.nodeEncoderFromSchema(cursor.type);\n\t\tAnyShape.encodeNode(cursor, context, outputBuffer, nodeEncoder);\n\t},\n\n\tshape: AnyShape.instance,\n};\n\n/**\n * Encodes a field polymorphically.\n */\nexport const anyFieldEncoder: FieldEncoder = {\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// TODO: Fast path uniform chunks.\n\n\t\tif (cursor.getFieldLength() === 0) {\n\t\t\tconst shape = InlineArrayEncoder.empty;\n\t\t\tAnyShape.encodeField(cursor, context, outputBuffer, shape);\n\t\t} else if (cursor.getFieldLength() === 1) {\n\t\t\t// Fast path chunk of size one size one at least: skip nested array.\n\t\t\tcursor.enterNode(0);\n\t\t\tanyNodeEncoder.encodeNode(cursor, context, outputBuffer);\n\t\t\tcursor.exitNode();\n\t\t} else {\n\t\t\t// TODO: more efficient encoding for common cases.\n\t\t\t// Could try to find more specific shape compatible with all children than `anyNodeEncoder`.\n\n\t\t\tconst shape = context.nestedArrayEncoder(anyNodeEncoder);\n\t\t\tAnyShape.encodeField(cursor, context, outputBuffer, shape);\n\t\t}\n\t},\n\n\tshape: AnyShape.instance,\n};\n\n/**\n * Encodes a chunk using {@link EncodedInlineArrayShape}.\n * @remarks\n * The fact this is also a Shape is an implementation detail of the encoder: that allows the shape it uses to be itself,\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class InlineArrayEncoder\n\textends ShapeGeneric<EncodedChunkShapeV1OrV2>\n\timplements NodesEncoder, FieldEncoder\n{\n\tpublic static readonly empty: InlineArrayEncoder = new InlineArrayEncoder(0, {\n\t\tget shape() {\n\t\t\t// Not actually used, makes count work without adding an additional shape.\n\t\t\treturn InlineArrayEncoder.empty;\n\t\t},\n\t\tencodeNodes(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tfail(0xb4d /* Empty array should not encode any nodes */);\n\t\t},\n\t});\n\n\t/**\n\t * @param length - number of invocations of `inner`.\n\t */\n\tpublic constructor(\n\t\tpublic readonly length: number,\n\t\tpublic readonly inner: NodesEncoder,\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic encodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// Linter is wrong about this loop being for-of compatible.\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let index = 0; index < this.length; index++) {\n\t\t\tthis.inner.encodeNodes(cursor, context, outputBuffer);\n\t\t}\n\t}\n\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// Its possible individual items from this array encode multiple nodes, so don't assume === here.\n\t\tassert(\n\t\t\tcursor.getFieldLength() >= this.length,\n\t\t\t0x73c /* unexpected length for fixed length array */,\n\t\t);\n\t\tcursor.firstNode();\n\t\tthis.encodeNodes(cursor, context, outputBuffer);\n\t\tassert(\n\t\t\tcursor.mode === CursorLocationType.Fields,\n\t\t\t0x73d /* should return to fields mode when finished encoding */,\n\t\t);\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1 {\n\t\treturn {\n\t\t\tb: {\n\t\t\t\tlength: this.length,\n\t\t\t\tshape: shapes.valueToIndex.get(this.inner.shape) ?? fail(0xb4e /* missing shape */),\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {\n\t\tshapeDiscovered(this.inner.shape);\n\t}\n\n\tpublic get shape(): this {\n\t\treturn this;\n\t}\n}\n\n/**\n * Encodes the shape for a nested array as {@link EncodedNestedArrayShape} shape.\n */\nexport class NestedArrayShape extends ShapeGeneric<EncodedChunkShapeV1OrV2> {\n\t/**\n\t * @param innerShape - The shape of each item in this nested array.\n\t */\n\tpublic constructor(public readonly innerShape: Shape) {\n\t\tsuper();\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1OrV2 {\n\t\tconst shape: EncodedNestedArrayShape =\n\t\t\tshapes.valueToIndex.get(this.innerShape) ??\n\t\t\tfail(0xb4f /* index for shape not found in table */);\n\t\treturn {\n\t\t\ta: shape,\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {\n\t\tshapeDiscovered(this.innerShape);\n\t}\n}\n\n/**\n * Encodes a field as a nested array with the {@link EncodedNestedArrayShape} shape.\n * @remarks\n * The fact this is also exposes a Shape is an implementation detail: it allows the shape it uses to be itself\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class NestedArrayEncoder implements FieldEncoder {\n\tpublic constructor(\n\t\tpublic readonly innerEncoder: NodeEncoder,\n\t\tpublic readonly shape: NestedArrayShape = new NestedArrayShape(innerEncoder.shape),\n\t) {}\n\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tconst buffer: BufferFormat = [];\n\t\tlet allNonZeroSize = true;\n\t\tconst length = cursor.getFieldLength();\n\t\tforEachNode(cursor, () => {\n\t\t\tconst before = buffer.length;\n\t\t\tthis.innerEncoder.encodeNode(cursor, context, buffer);\n\t\t\tallNonZeroSize &&= buffer.length - before !== 0;\n\t\t});\n\t\tif (buffer.length === 0) {\n\t\t\t// This relies on the number of inner chunks being the same as the number of nodes.\n\t\t\t// If making inner a `NodesEncoder`, this code will have to be adjusted accordingly.\n\t\t\toutputBuffer.push(length);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tallNonZeroSize,\n\t\t\t\t0x73e /* either all or none of the members of a nested array must be 0 sized, or there is no way the decoder could process the content correctly. */,\n\t\t\t);\n\t\t\toutputBuffer.push(buffer);\n\t\t}\n\t}\n}\n\n/**\n * Encodes the shape for an incremental chunk as {@link EncodedIncrementalChunkShape} shape.\n */\nexport class IncrementalChunkShape extends ShapeGeneric<EncodedChunkShapeV2> {\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV2 {\n\t\treturn {\n\t\t\te: 0 /* EncodedIncrementalChunkShape */,\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {}\n\n\tpublic get shape(): this {\n\t\treturn this;\n\t}\n}\n\n/**\n * Encodes an incremental field whose tree chunks are encoded separately and referenced by their {@link ChunkReferenceId}.\n * The shape of the content of this field is {@link NestedArrayShape}.\n * The inner items of the array have shape {@link IncrementalChunkShape} and are {@link ChunkReferenceId}s\n * of the encoded chunks.\n */\nexport const incrementalFieldEncoder: FieldEncoder = {\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tassert(\n\t\t\tcontext.incrementalEncoder !== undefined,\n\t\t\t0xc88 /* incremental encoder must be defined to use incrementalFieldEncoder */,\n\t\t);\n\t\tassert(\n\t\t\tcontext.version >= FieldBatchFormatVersion.v2,\n\t\t\t0xca1 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */,\n\t\t);\n\n\t\tconst chunkReferenceIds = context.incrementalEncoder.encodeIncrementalField(\n\t\t\tcursor,\n\t\t\t(chunk: TreeChunk) => compressedEncode([chunk.cursor()], context),\n\t\t);\n\t\toutputBuffer.push(chunkReferenceIds);\n\t},\n\n\tshape: new NestedArrayShape(new IncrementalChunkShape() /* innerShape */),\n};\n\n/**\n * Encode `value` with `shape` into `outputBuffer`.\n *\n * Requires that `value` is compatible with `shape`.\n */\nexport function encodeValue(\n\tvalue: Value,\n\tshape: EncodedValueShape,\n\toutputBuffer: BufferFormat,\n): void {\n\tif (shape === undefined) {\n\t\tif (value === undefined) {\n\t\t\toutputBuffer.push(false);\n\t\t} else {\n\t\t\toutputBuffer.push(true, value);\n\t\t}\n\t} else {\n\t\tif (shape === true) {\n\t\t\tassert(value !== undefined, 0x78d /* required value must not be missing */);\n\t\t\toutputBuffer.push(value);\n\t\t} else if (shape === false) {\n\t\t\tassert(value === undefined, 0x73f /* incompatible value shape: expected no value */);\n\t\t} else if (Array.isArray(shape)) {\n\t\t\tassert(shape.length === 1, 0x740 /* expected a single constant for value */);\n\t\t} else if (shape === SpecialField.Identifier) {\n\t\t\t// This case is a special case handling the encoding of identifier fields.\n\t\t\tassert(value !== undefined, 0x998 /* required value must not be missing */);\n\t\t\toutputBuffer.push(value);\n\t\t} else {\n\t\t\t// EncodedCounter case:\n\t\t\tunreachableCase(shape, \"Encoding values as deltas is not yet supported\");\n\t\t}\n\t}\n}\n\n/**\n * Provides common contextual information during encoding, like schema and policy settings.\n * Also, provides a cache to avoid duplicating equivalent shapes during a batch of encode operations.\n * @remarks\n * To avoid Shape duplication, any Shapes used in the encoding should either be:\n * - Singletons defined in a static scope.\n * - Cached in this object for future reuse such that all equivalent Shapes are deduplicated.\n */\nexport class EncoderContext implements NodeEncodeBuilder, FieldEncodeBuilder {\n\tprivate readonly nodeEncodersFromSchema: Map<TreeNodeSchemaIdentifier, NodeEncoder> =\n\t\tnew Map();\n\tprivate readonly nestedArrayEncoders: Map<NodeEncoder, NestedArrayEncoder> = new Map();\n\tpublic constructor(\n\t\tprivate readonly nodeEncoderFromPolicy: NodeEncoderPolicy,\n\t\tprivate readonly fieldEncoderFromPolicy: FieldEncoderPolicy,\n\t\tpublic readonly fieldShapes: ReadonlyMap<FieldKindIdentifier, FieldKindData>,\n\t\tpublic readonly idCompressor: IIdCompressor,\n\t\t/**\n\t\t * To be used to encode incremental chunks, if any.\n\t\t * @remarks\n\t\t * See {@link IncrementalEncoder} for more information.\n\t\t */\n\t\tpublic readonly incrementalEncoder: IncrementalEncoder | undefined,\n\t\tpublic readonly version: FieldBatchFormatVersion,\n\t) {}\n\n\tpublic nodeEncoderFromSchema(schemaName: TreeNodeSchemaIdentifier): NodeEncoder {\n\t\treturn getOrCreate(this.nodeEncodersFromSchema, schemaName, () =>\n\t\t\tthis.nodeEncoderFromPolicy(this, schemaName),\n\t\t);\n\t}\n\n\tpublic fieldEncoderFromSchema(fieldSchema: TreeFieldStoredSchema): FieldEncoder {\n\t\treturn new LazyFieldEncoder(this, fieldSchema, this.fieldEncoderFromPolicy);\n\t}\n\n\tpublic nestedArrayEncoder(inner: NodeEncoder): NestedArrayEncoder {\n\t\treturn getOrCreate(this.nestedArrayEncoders, inner, () => new NestedArrayEncoder(inner));\n\t}\n}\n\nexport interface NodeEncodeBuilder {\n\tnodeEncoderFromSchema(schemaName: TreeNodeSchemaIdentifier): NodeEncoder;\n}\n\nexport interface FieldEncodeBuilder {\n\tfieldEncoderFromSchema(schema: TreeFieldStoredSchema): FieldEncoder;\n}\n\n/**\n * The policy for building a {@link FieldEncoder} for a field.\n */\nexport type FieldEncoderPolicy = (\n\tnodeBuilder: NodeEncodeBuilder,\n\tschema: TreeFieldStoredSchema,\n) => FieldEncoder;\n\n/**\n * The policy for building a {@link NodeEncoder} for a node.\n */\nexport type NodeEncoderPolicy = (\n\tfieldBuilder: FieldEncodeBuilder,\n\tschemaName: TreeNodeSchemaIdentifier,\n) => NodeEncoder;\n\nclass LazyFieldEncoder implements FieldEncoder {\n\tprivate encoderLazy: FieldEncoder | undefined;\n\n\tpublic constructor(\n\t\tpublic readonly nodeBuilder: NodeEncodeBuilder,\n\t\tpublic readonly fieldSchema: TreeFieldStoredSchema,\n\t\tprivate readonly fieldEncoderFromPolicy: FieldEncoderPolicy,\n\t) {}\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tthis.encoder.encodeField(cursor, context, outputBuffer);\n\t}\n\n\tprivate get encoder(): FieldEncoder {\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (this.encoderLazy === undefined) {\n\t\t\tthis.encoderLazy = this.fieldEncoderFromPolicy(this.nodeBuilder, this.fieldSchema);\n\t\t}\n\t\treturn this.encoderLazy;\n\t}\n\n\tpublic get shape(): Shape {\n\t\treturn this.encoder.shape;\n\t}\n}\n"]}
1
+ {"version":3,"file":"compressedEncode.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/compressedEncode.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, fail } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tCursorLocationType,\n\ttype FieldKey,\n\ttype FieldKindData,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype TreeChunk,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype Value,\n\tforEachNode,\n} from \"../../../core/index.js\";\nimport { getOrCreate } from \"../../../util/index.js\";\n\nimport type { Counter, DeduplicationTable } from \"./chunkCodecUtilities.js\";\nimport {\n\ttype BufferFormat as BufferFormatGeneric,\n\tShape as ShapeGeneric,\n\tupdateShapesAndIdentifiersEncoding,\n} from \"./chunkEncodingGeneric.js\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Referenced by doc comments\nimport type { FieldBatchEncodingContext, IncrementalEncoder } from \"./codecs.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\ttype EncodedAnyShape,\n\ttype EncodedChunkShapeV1,\n\ttype EncodedChunkShapeV1OrV2,\n\ttype EncodedChunkShapeV2,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedNestedArrayShape,\n\ttype EncodedValueShape,\n\ttype FieldBatchFormatVersion,\n\tSpecialField,\n\tsupportsIncrementalEncoding,\n} from \"./format/index.js\";\n\n/**\n * Encode data from `FieldBatch` into an `EncodedFieldBatch`.\n *\n * Optimized for encoded size and encoding performance.\n *\n * Most of the compression strategy comes from the policy provided via `context`.\n */\nexport function compressedEncode(\n\tfieldBatch: FieldBatch,\n\tcontext: EncoderContext,\n): EncodedFieldBatchV1OrV2 {\n\tconst batchBuffer: BufferFormat[] = [];\n\n\t// Populate buffer, including shape and identifier references\n\tfor (const cursor of fieldBatch) {\n\t\tconst buffer: BufferFormat = [];\n\t\tanyFieldEncoder.encodeField(cursor, context, buffer);\n\t\tbatchBuffer.push(buffer);\n\t}\n\treturn updateShapesAndIdentifiersEncoding(context.version, batchBuffer);\n}\n\nexport type BufferFormat = BufferFormatGeneric<EncodedChunkShapeV1OrV2>;\nexport type Shape = ShapeGeneric<EncodedChunkShapeV1OrV2>;\n\n/**\n * Like {@link FieldEncoder}, except data will be prefixed with the key.\n */\nexport interface KeyedFieldEncoder {\n\treadonly key: FieldKey;\n\treadonly encoder: FieldEncoder;\n}\n\n/**\n * An encoder with an associated shape.\n */\nexport interface Encoder {\n\t/**\n\t * The shape which describes how the encoded data is laid out.\n\t * Used by decoders to interpret the output of `encodeNode`.\n\t */\n\treadonly shape: Shape;\n}\n\n/**\n * An encoder for a specific shape of node.\n *\n * Can only be used with compatible nodes.\n */\nexport interface NodeEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Nodes mode. Does not move cursor.\n\t */\n\tencodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Like {@link NodeEncoder}, except encodes a run of nodes.\n */\nexport interface NodesEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Nodes mode. Moves cursor however many nodes it encodes.\n\t */\n\tencodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Like {@link NodeEncoder}, except encodes a field.\n */\nexport interface FieldEncoder extends Encoder {\n\t/**\n\t * @param cursor - in Fields mode. Encodes entire field.\n\t */\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void;\n}\n\n/**\n * Makes a {@link FieldEncoder} which runs `encoder` on every node in the field.\n * This does not encode the number nodes: the user of this may need to encode that elsewhere.\n */\nexport function asFieldEncoder(encoder: NodeEncoder): FieldEncoder {\n\treturn {\n\t\tencodeField(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tforEachNode(cursor, () => encoder.encodeNode(cursor, context, outputBuffer));\n\t\t},\n\t\tshape: encoder.shape,\n\t};\n}\n\n/**\n * Adapt a {@link NodeEncoder} to a {@link NodesEncoder} which invokes `encoder` once.\n */\nexport function asNodesEncoder(encoder: NodeEncoder): NodesEncoder {\n\treturn {\n\t\tencodeNodes(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tencoder.encodeNode(cursor, context, outputBuffer);\n\t\t\tcursor.nextNode();\n\t\t},\n\t\tshape: encoder.shape,\n\t};\n}\n\n/**\n * Encodes a chunk with {@link EncodedAnyShape} by prefixing the data with its shape.\n */\nexport class AnyShape extends ShapeGeneric<EncodedChunkShapeV1OrV2> {\n\tprivate constructor() {\n\t\tsuper();\n\t}\n\tpublic static readonly instance = new AnyShape();\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1 {\n\t\tconst encodedAnyShape: EncodedAnyShape = 0;\n\t\treturn { d: encodedAnyShape };\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {}\n\n\tpublic static encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: FieldEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeField(cursor, context, outputBuffer);\n\t}\n\n\tpublic static encodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: NodeEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeNode(cursor, context, outputBuffer);\n\t}\n\n\tpublic static encodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t\tencoder: NodesEncoder,\n\t): void {\n\t\toutputBuffer.push(encoder.shape);\n\t\tencoder.encodeNodes(cursor, context, outputBuffer);\n\t}\n}\n\n/**\n * Encodes a single node polymorphically.\n */\nexport const anyNodeEncoder: NodeEncoder = {\n\tencodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// TODO: Fast path uniform chunk content.\n\t\tconst nodeEncoder = context.nodeEncoderFromSchema(cursor.type);\n\t\tAnyShape.encodeNode(cursor, context, outputBuffer, nodeEncoder);\n\t},\n\n\tshape: AnyShape.instance,\n};\n\n/**\n * Encodes a field polymorphically.\n */\nexport const anyFieldEncoder: FieldEncoder = {\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// TODO: Fast path uniform chunks.\n\n\t\tif (cursor.getFieldLength() === 0) {\n\t\t\tconst shape = InlineArrayEncoder.empty;\n\t\t\tAnyShape.encodeField(cursor, context, outputBuffer, shape);\n\t\t} else if (cursor.getFieldLength() === 1) {\n\t\t\t// Fast path chunk of size one size one at least: skip nested array.\n\t\t\tcursor.enterNode(0);\n\t\t\tanyNodeEncoder.encodeNode(cursor, context, outputBuffer);\n\t\t\tcursor.exitNode();\n\t\t} else {\n\t\t\t// TODO: more efficient encoding for common cases.\n\t\t\t// Could try to find more specific shape compatible with all children than `anyNodeEncoder`.\n\n\t\t\tconst shape = context.nestedArrayEncoder(anyNodeEncoder);\n\t\t\tAnyShape.encodeField(cursor, context, outputBuffer, shape);\n\t\t}\n\t},\n\n\tshape: AnyShape.instance,\n};\n\n/**\n * Encodes a chunk using {@link EncodedInlineArrayShape}.\n * @remarks\n * The fact this is also a Shape is an implementation detail of the encoder: that allows the shape it uses to be itself,\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class InlineArrayEncoder\n\textends ShapeGeneric<EncodedChunkShapeV1OrV2>\n\timplements NodesEncoder, FieldEncoder\n{\n\tpublic static readonly empty: InlineArrayEncoder = new InlineArrayEncoder(0, {\n\t\tget shape() {\n\t\t\t// Not actually used, makes count work without adding an additional shape.\n\t\t\treturn InlineArrayEncoder.empty;\n\t\t},\n\t\tencodeNodes(\n\t\t\tcursor: ITreeCursorSynchronous,\n\t\t\tcontext: EncoderContext,\n\t\t\toutputBuffer: BufferFormat,\n\t\t): void {\n\t\t\tfail(0xb4d /* Empty array should not encode any nodes */);\n\t\t},\n\t});\n\n\t/**\n\t * @param length - number of invocations of `inner`.\n\t */\n\tpublic constructor(\n\t\tpublic readonly length: number,\n\t\tpublic readonly inner: NodesEncoder,\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic encodeNodes(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// Linter is wrong about this loop being for-of compatible.\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let index = 0; index < this.length; index++) {\n\t\t\tthis.inner.encodeNodes(cursor, context, outputBuffer);\n\t\t}\n\t}\n\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\t// Its possible individual items from this array encode multiple nodes, so don't assume === here.\n\t\tassert(\n\t\t\tcursor.getFieldLength() >= this.length,\n\t\t\t0x73c /* unexpected length for fixed length array */,\n\t\t);\n\t\tcursor.firstNode();\n\t\tthis.encodeNodes(cursor, context, outputBuffer);\n\t\tassert(\n\t\t\tcursor.mode === CursorLocationType.Fields,\n\t\t\t0x73d /* should return to fields mode when finished encoding */,\n\t\t);\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1 {\n\t\treturn {\n\t\t\tb: {\n\t\t\t\tlength: this.length,\n\t\t\t\tshape: shapes.valueToIndex.get(this.inner.shape) ?? fail(0xb4e /* missing shape */),\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {\n\t\tshapeDiscovered(this.inner.shape);\n\t}\n\n\tpublic get shape(): this {\n\t\treturn this;\n\t}\n}\n\n/**\n * Encodes the shape for a nested array as {@link EncodedNestedArrayShape} shape.\n */\nexport class NestedArrayShape extends ShapeGeneric<EncodedChunkShapeV1OrV2> {\n\t/**\n\t * @param innerShape - The shape of each item in this nested array.\n\t */\n\tpublic constructor(public readonly innerShape: Shape) {\n\t\tsuper();\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV1OrV2 {\n\t\tconst shape: EncodedNestedArrayShape =\n\t\t\tshapes.valueToIndex.get(this.innerShape) ??\n\t\t\tfail(0xb4f /* index for shape not found in table */);\n\t\treturn {\n\t\t\ta: shape,\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {\n\t\tshapeDiscovered(this.innerShape);\n\t}\n}\n\n/**\n * Encodes a field as a nested array with the {@link EncodedNestedArrayShape} shape.\n * @remarks\n * The fact this is also exposes a Shape is an implementation detail: it allows the shape it uses to be itself\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class NestedArrayEncoder implements FieldEncoder {\n\tpublic constructor(\n\t\tpublic readonly innerEncoder: NodeEncoder,\n\t\tpublic readonly shape: NestedArrayShape = new NestedArrayShape(innerEncoder.shape),\n\t) {}\n\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tconst buffer: BufferFormat = [];\n\t\tlet allNonZeroSize = true;\n\t\tconst length = cursor.getFieldLength();\n\t\tforEachNode(cursor, () => {\n\t\t\tconst before = buffer.length;\n\t\t\tthis.innerEncoder.encodeNode(cursor, context, buffer);\n\t\t\tallNonZeroSize &&= buffer.length - before !== 0;\n\t\t});\n\t\tif (buffer.length === 0) {\n\t\t\t// This relies on the number of inner chunks being the same as the number of nodes.\n\t\t\t// If making inner a `NodesEncoder`, this code will have to be adjusted accordingly.\n\t\t\toutputBuffer.push(length);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tallNonZeroSize,\n\t\t\t\t0x73e /* either all or none of the members of a nested array must be 0 sized, or there is no way the decoder could process the content correctly. */,\n\t\t\t);\n\t\t\toutputBuffer.push(buffer);\n\t\t}\n\t}\n}\n\n/**\n * Encodes the shape for an incremental chunk as {@link EncodedIncrementalChunkShape} shape.\n */\nexport class IncrementalChunkShape extends ShapeGeneric<EncodedChunkShapeV2> {\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape>,\n\t): EncodedChunkShapeV2 {\n\t\treturn {\n\t\t\te: 0 /* EncodedIncrementalChunkShape */,\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape) => void,\n\t): void {}\n\n\tpublic get shape(): this {\n\t\treturn this;\n\t}\n}\n\n/**\n * Encodes an incremental field whose tree chunks are encoded separately and referenced by their {@link ChunkReferenceId}.\n * The shape of the content of this field is {@link NestedArrayShape}.\n * The inner items of the array have shape {@link IncrementalChunkShape} and are {@link ChunkReferenceId}s\n * of the encoded chunks.\n */\nexport const incrementalFieldEncoder: FieldEncoder = {\n\tencodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tassert(\n\t\t\tcontext.incrementalEncoder !== undefined,\n\t\t\t0xc88 /* incremental encoder must be defined to use incrementalFieldEncoder */,\n\t\t);\n\t\tassert(\n\t\t\tsupportsIncrementalEncoding(context.version),\n\t\t\t0xca1 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */,\n\t\t);\n\n\t\tconst chunkReferenceIds = context.incrementalEncoder.encodeIncrementalField(\n\t\t\tcursor,\n\t\t\t(chunk: TreeChunk) => compressedEncode([chunk.cursor()], context),\n\t\t);\n\t\toutputBuffer.push(chunkReferenceIds);\n\t},\n\n\tshape: new NestedArrayShape(new IncrementalChunkShape() /* innerShape */),\n};\n\n/**\n * Encode `value` with `shape` into `outputBuffer`.\n *\n * Requires that `value` is compatible with `shape`.\n */\nexport function encodeValue(\n\tvalue: Value,\n\tshape: EncodedValueShape,\n\toutputBuffer: BufferFormat,\n): void {\n\tif (shape === undefined) {\n\t\tif (value === undefined) {\n\t\t\toutputBuffer.push(false);\n\t\t} else {\n\t\t\toutputBuffer.push(true, value);\n\t\t}\n\t} else {\n\t\tif (shape === true) {\n\t\t\tassert(value !== undefined, 0x78d /* required value must not be missing */);\n\t\t\toutputBuffer.push(value);\n\t\t} else if (shape === false) {\n\t\t\tassert(value === undefined, 0x73f /* incompatible value shape: expected no value */);\n\t\t} else if (Array.isArray(shape)) {\n\t\t\tassert(shape.length === 1, 0x740 /* expected a single constant for value */);\n\t\t} else if (shape === SpecialField.Identifier) {\n\t\t\t// This case is a special case handling the encoding of identifier fields.\n\t\t\tassert(value !== undefined, 0x998 /* required value must not be missing */);\n\t\t\toutputBuffer.push(value);\n\t\t} else {\n\t\t\t// EncodedCounter case:\n\t\t\tunreachableCase(shape, \"Encoding values as deltas is not yet supported\");\n\t\t}\n\t}\n}\n\n/**\n * Provides common contextual information during encoding, like schema and policy settings.\n * Also, provides a cache to avoid duplicating equivalent shapes during a batch of encode operations.\n * @remarks\n * To avoid Shape duplication, any Shapes used in the encoding should either be:\n * - Singletons defined in a static scope.\n * - Cached in this object for future reuse such that all equivalent Shapes are deduplicated.\n */\nexport class EncoderContext implements NodeEncodeBuilder, FieldEncodeBuilder {\n\tprivate readonly nodeEncodersFromSchema: Map<TreeNodeSchemaIdentifier, NodeEncoder> =\n\t\tnew Map();\n\tprivate readonly nestedArrayEncoders: Map<NodeEncoder, NestedArrayEncoder> = new Map();\n\tpublic constructor(\n\t\tprivate readonly nodeEncoderFromPolicy: NodeEncoderPolicy,\n\t\tprivate readonly fieldEncoderFromPolicy: FieldEncoderPolicy,\n\t\tpublic readonly fieldShapes: ReadonlyMap<FieldKindIdentifier, FieldKindData>,\n\t\tpublic readonly idCompressor: IIdCompressor,\n\t\t/**\n\t\t * To be used to encode incremental chunks, if any.\n\t\t * @remarks\n\t\t * See {@link IncrementalEncoder} for more information.\n\t\t */\n\t\tpublic readonly incrementalEncoder: IncrementalEncoder | undefined,\n\t\tpublic readonly version: FieldBatchFormatVersion,\n\t\t/**\n\t\t * See {@link FieldBatchEncodingContext.isSummary}.\n\t\t */\n\t\tpublic readonly isSummary: boolean,\n\t) {}\n\n\tpublic nodeEncoderFromSchema(schemaName: TreeNodeSchemaIdentifier): NodeEncoder {\n\t\treturn getOrCreate(this.nodeEncodersFromSchema, schemaName, () =>\n\t\t\tthis.nodeEncoderFromPolicy(this, schemaName),\n\t\t);\n\t}\n\n\tpublic fieldEncoderFromSchema(fieldSchema: TreeFieldStoredSchema): FieldEncoder {\n\t\treturn new LazyFieldEncoder(this, fieldSchema, this.fieldEncoderFromPolicy);\n\t}\n\n\tpublic nestedArrayEncoder(inner: NodeEncoder): NestedArrayEncoder {\n\t\treturn getOrCreate(this.nestedArrayEncoders, inner, () => new NestedArrayEncoder(inner));\n\t}\n}\n\nexport interface NodeEncodeBuilder {\n\tnodeEncoderFromSchema(schemaName: TreeNodeSchemaIdentifier): NodeEncoder;\n}\n\nexport interface FieldEncodeBuilder {\n\tfieldEncoderFromSchema(schema: TreeFieldStoredSchema): FieldEncoder;\n}\n\n/**\n * The policy for building a {@link FieldEncoder} for a field.\n */\nexport type FieldEncoderPolicy = (\n\tnodeBuilder: NodeEncodeBuilder,\n\tschema: TreeFieldStoredSchema,\n) => FieldEncoder;\n\n/**\n * The policy for building a {@link NodeEncoder} for a node.\n */\nexport type NodeEncoderPolicy = (\n\tfieldBuilder: FieldEncodeBuilder,\n\tschemaName: TreeNodeSchemaIdentifier,\n) => NodeEncoder;\n\nclass LazyFieldEncoder implements FieldEncoder {\n\tprivate encoderLazy: FieldEncoder | undefined;\n\n\tpublic constructor(\n\t\tpublic readonly nodeBuilder: NodeEncodeBuilder,\n\t\tpublic readonly fieldSchema: TreeFieldStoredSchema,\n\t\tprivate readonly fieldEncoderFromPolicy: FieldEncoderPolicy,\n\t) {}\n\tpublic encodeField(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat,\n\t): void {\n\t\tthis.encoder.encodeField(cursor, context, outputBuffer);\n\t}\n\n\tprivate get encoder(): FieldEncoder {\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (this.encoderLazy === undefined) {\n\t\t\tthis.encoderLazy = this.fieldEncoderFromPolicy(this.nodeBuilder, this.fieldSchema);\n\t\t}\n\t\treturn this.encoderLazy;\n\t}\n\n\tpublic get shape(): Shape {\n\t\treturn this.encoder.shape;\n\t}\n}\n"]}
@@ -18,7 +18,6 @@ export declare const ShapeIndex: import("@sinclair/typebox").TNumber;
18
18
  export type ShapeIndex = Static<typeof ShapeIndex>;
19
19
  export declare const Count: import("@sinclair/typebox").TNumber;
20
20
  declare const EncodedFieldBatchBase: import("@sinclair/typebox").TObject<{
21
- version: import("@sinclair/typebox").TNumber;
22
21
  identifiers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
23
22
  /**
24
23
  * Top level array is list of field from batch.
@@ -36,8 +35,8 @@ declare const EncodedFieldBatchBase: import("@sinclair/typebox").TObject<{
36
35
  */
37
36
  export declare const EncodedFieldBatchGeneric: <TShapeSchema extends TSchema>(version: FieldBatchFormatVersion, shape: TShapeSchema) => import("@sinclair/typebox").TObject<{
38
37
  data: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TAny>>;
39
- version: import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>]>;
40
38
  identifiers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
39
+ version: import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>;
41
40
  shapes: import("@sinclair/typebox").TArray<TShapeSchema>;
42
41
  }>;
43
42
  export interface EncodedFieldBatchGeneric<TEncodedShape> extends Static<typeof EncodedFieldBatchBase> {
@@ -1 +1 @@
1
- {"version":3,"file":"formatGeneric.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAQ,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,iBAAiB,gHAG5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAA6C,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,eAAO,MAAM,KAAK,qCAA6C,CAAC;AAEhE,QAAA,MAAM,qBAAqB;;;IAIzB;;;OAGG;;EAIJ,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,0CAC3B,uBAAuB,SACzB,YAAY;;;;;EAalB,CAAC;AAEH,MAAM,WAAW,wBAAwB,CAAC,aAAa,CACtD,SAAQ,MAAM,CAAC,OAAO,qBAAqB,CAAC;IAC5C,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,uBAAuB,CAAC;CACjC"}
1
+ {"version":3,"file":"formatGeneric.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAQ,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,iBAAiB,gHAG5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAA6C,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,eAAO,MAAM,KAAK,qCAA6C,CAAC;AAEhE,QAAA,MAAM,qBAAqB;;IAGzB;;;OAGG;;EAIJ,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,0CAC3B,uBAAuB,SACzB,YAAY;;;;;EAalB,CAAC;AAEH,MAAM,WAAW,wBAAwB,CAAC,aAAa,CACtD,SAAQ,MAAM,CAAC,OAAO,qBAAqB,CAAC;IAC5C,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,uBAAuB,CAAC;CACjC"}
@@ -21,7 +21,6 @@ exports.IdentifierOrIndex = typebox_1.Type.Union([
21
21
  exports.ShapeIndex = typebox_1.Type.Number({ multipleOf: 1, minimum: 0 });
22
22
  exports.Count = typebox_1.Type.Number({ multipleOf: 1, minimum: 0 });
23
23
  const EncodedFieldBatchBase = typebox_1.Type.Object({
24
- version: typebox_1.Type.Number(),
25
24
  identifiers: typebox_1.Type.Array(typebox_1.Type.String()),
26
25
  /**
27
26
  * Top level array is list of field from batch.
@@ -1 +1 @@
1
- {"version":3,"file":"formatGeneric.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+CAAoE;AAIpE;;GAEG;AACU,QAAA,iBAAiB,GAAG,cAAI,CAAC,KAAK,CAAC;IAC3C,cAAI,CAAC,MAAM,EAAE;IACb,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAGH;;;;GAIG;AACU,QAAA,UAAU,GAAG,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAGxD,QAAA,KAAK,GAAG,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhE,MAAM,qBAAqB,GAAG,cAAI,CAAC,MAAM,CACxC;IACC,OAAO,EAAE,cAAI,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,MAAM,EAAE,CAAC;IACtC;;;OAGG;IACH,IAAI,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,EAAE,CAAC,CAAC;CACxC,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF;;;;;;;GAOG;AACI,MAAM,wBAAwB,GAAG,CACvC,OAAgC,EAChC,KAAmB,EAGlB,EAAE,CACH,cAAI,CAAC,SAAS,CACb;IACC,qBAAqB;IACrB,cAAI,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,MAAM,EAAE,cAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB,CAAC;CACF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAfU,QAAA,wBAAwB,4BAelC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\n\nimport type { FieldBatchFormatVersion } from \"./versions.js\";\n\n/**\n * Identifier OR Index of an identifier in the identifier list.\n */\nexport const IdentifierOrIndex = Type.Union([\n\tType.String(),\n\tType.Number({ multipleOf: 1, minimum: 0 }),\n]);\nexport type IdentifierOrIndex = Static<typeof IdentifierOrIndex>;\n\n/**\n * Reference to a shape, by index.\n *\n * Shapes use a dictionary encoding where they are referenced by their index in a shape array.\n */\nexport const ShapeIndex = Type.Number({ multipleOf: 1, minimum: 0 });\nexport type ShapeIndex = Static<typeof ShapeIndex>;\n\nexport const Count = Type.Number({ multipleOf: 1, minimum: 0 });\n\nconst EncodedFieldBatchBase = Type.Object(\n\t{\n\t\tversion: Type.Number(),\n\t\tidentifiers: Type.Array(Type.String()),\n\t\t/**\n\t\t * Top level array is list of field from batch.\n\t\t * Inner are TreeValues mixed with indexes into \"shapes\" and nested arrays where lengths are needed.\n\t\t */\n\t\tdata: Type.Array(Type.Array(Type.Any())),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * Format for encoding a tree chunk.\n * @param version - format version.\n * Must be changed if the previously existing decode logic will not correctly handle the new encoding.\n * If adding a new encoding version which does not use this format,\n * this parameter should be retyped to be a union of the subset of FieldBatchFormatVersion values which this supports.\n * @param shape - schema for union of shape format, see {@link DiscriminatedUnionDispatcher}.\n */\nexport const EncodedFieldBatchGeneric = <TShapeSchema extends TSchema>(\n\tversion: FieldBatchFormatVersion,\n\tshape: TShapeSchema,\n\t// Return type is intentionally derived.\n\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n) =>\n\tType.Composite(\n\t\t[\n\t\t\tEncodedFieldBatchBase,\n\t\t\tType.Object({\n\t\t\t\tversion: Type.Literal(version),\n\t\t\t\tshapes: Type.Array(shape),\n\t\t\t}),\n\t\t],\n\t\t{ additionalProperties: false },\n\t);\n\nexport interface EncodedFieldBatchGeneric<TEncodedShape>\n\textends Static<typeof EncodedFieldBatchBase> {\n\tshapes: TEncodedShape[];\n\tversion: FieldBatchFormatVersion;\n}\n"]}
1
+ {"version":3,"file":"formatGeneric.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+CAAoE;AAIpE;;GAEG;AACU,QAAA,iBAAiB,GAAG,cAAI,CAAC,KAAK,CAAC;IAC3C,cAAI,CAAC,MAAM,EAAE;IACb,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAGH;;;;GAIG;AACU,QAAA,UAAU,GAAG,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAGxD,QAAA,KAAK,GAAG,cAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhE,MAAM,qBAAqB,GAAG,cAAI,CAAC,MAAM,CACxC;IACC,WAAW,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,MAAM,EAAE,CAAC;IACtC;;;OAGG;IACH,IAAI,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,EAAE,CAAC,CAAC;CACxC,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF;;;;;;;GAOG;AACI,MAAM,wBAAwB,GAAG,CACvC,OAAgC,EAChC,KAAmB,EAGlB,EAAE,CACH,cAAI,CAAC,SAAS,CACb;IACC,qBAAqB;IACrB,cAAI,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,MAAM,EAAE,cAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB,CAAC;CACF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAfU,QAAA,wBAAwB,4BAelC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\n\nimport type { FieldBatchFormatVersion } from \"./versions.js\";\n\n/**\n * Identifier OR Index of an identifier in the identifier list.\n */\nexport const IdentifierOrIndex = Type.Union([\n\tType.String(),\n\tType.Number({ multipleOf: 1, minimum: 0 }),\n]);\nexport type IdentifierOrIndex = Static<typeof IdentifierOrIndex>;\n\n/**\n * Reference to a shape, by index.\n *\n * Shapes use a dictionary encoding where they are referenced by their index in a shape array.\n */\nexport const ShapeIndex = Type.Number({ multipleOf: 1, minimum: 0 });\nexport type ShapeIndex = Static<typeof ShapeIndex>;\n\nexport const Count = Type.Number({ multipleOf: 1, minimum: 0 });\n\nconst EncodedFieldBatchBase = Type.Object(\n\t{\n\t\tidentifiers: Type.Array(Type.String()),\n\t\t/**\n\t\t * Top level array is list of field from batch.\n\t\t * Inner are TreeValues mixed with indexes into \"shapes\" and nested arrays where lengths are needed.\n\t\t */\n\t\tdata: Type.Array(Type.Array(Type.Any())),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * Format for encoding a tree chunk.\n * @param version - format version.\n * Must be changed if the previously existing decode logic will not correctly handle the new encoding.\n * If adding a new encoding version which does not use this format,\n * this parameter should be retyped to be a union of the subset of FieldBatchFormatVersion values which this supports.\n * @param shape - schema for union of shape format, see {@link DiscriminatedUnionDispatcher}.\n */\nexport const EncodedFieldBatchGeneric = <TShapeSchema extends TSchema>(\n\tversion: FieldBatchFormatVersion,\n\tshape: TShapeSchema,\n\t// Return type is intentionally derived.\n\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n) =>\n\tType.Composite(\n\t\t[\n\t\t\tEncodedFieldBatchBase,\n\t\t\tType.Object({\n\t\t\t\tversion: Type.Literal(version),\n\t\t\t\tshapes: Type.Array(shape),\n\t\t\t}),\n\t\t],\n\t\t{ additionalProperties: false },\n\t);\n\nexport interface EncodedFieldBatchGeneric<TEncodedShape>\n\textends Static<typeof EncodedFieldBatchBase> {\n\tshapes: TEncodedShape[];\n\tversion: FieldBatchFormatVersion;\n}\n"]}
@@ -5,6 +5,6 @@
5
5
  export type { EncodedChunkShapeV1, EncodedInlineArrayShape, EncodedNestedArrayShape, EncodedNodeShape, EncodedValueShape, EncodedFieldShape, } from "./formatV1.js";
6
6
  export { EncodedAnyShape, SpecialField, } from "./formatV1.js";
7
7
  export { EncodedIncrementalChunkShape, EncodedChunkShapeV2 } from "./formatV2.js";
8
- export { FieldBatchFormatVersion, EncodedFieldBatchV1, EncodedFieldBatchV2, type EncodedFieldBatchV1OrV2, type EncodedFieldBatchV1AndV2, type EncodedChunkShapeV1OrV2, } from "./versions.js";
8
+ export { FieldBatchFormatVersion, EncodedFieldBatchV1, EncodedFieldBatchV2, supportsIncrementalEncoding, type EncodedFieldBatchV1OrV2, type EncodedFieldBatchV1AndV2, type EncodedChunkShapeV1OrV2, } from "./versions.js";
9
9
  export type { ShapeIndex, IdentifierOrIndex, EncodedFieldBatchGeneric, } from "./formatGeneric.js";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACX,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,eAAe,EACf,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC5B,MAAM,eAAe,CAAC;AACvB,YAAY,EACX,UAAU,EACV,iBAAiB,EACjB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACX,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,eAAe,EACf,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC5B,MAAM,eAAe,CAAC;AACvB,YAAY,EACX,UAAU,EACV,iBAAiB,EACjB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.EncodedFieldBatchV2 = exports.EncodedFieldBatchV1 = exports.FieldBatchFormatVersion = exports.EncodedChunkShapeV2 = exports.EncodedIncrementalChunkShape = exports.SpecialField = exports.EncodedAnyShape = void 0;
7
+ exports.supportsIncrementalEncoding = exports.EncodedFieldBatchV2 = exports.EncodedFieldBatchV1 = exports.FieldBatchFormatVersion = exports.EncodedChunkShapeV2 = exports.EncodedIncrementalChunkShape = exports.SpecialField = exports.EncodedAnyShape = void 0;
8
8
  var formatV1_js_1 = require("./formatV1.js");
9
9
  Object.defineProperty(exports, "EncodedAnyShape", { enumerable: true, get: function () { return formatV1_js_1.EncodedAnyShape; } });
10
10
  Object.defineProperty(exports, "SpecialField", { enumerable: true, get: function () { return formatV1_js_1.SpecialField; } });
@@ -15,4 +15,5 @@ var versions_js_1 = require("./versions.js");
15
15
  Object.defineProperty(exports, "FieldBatchFormatVersion", { enumerable: true, get: function () { return versions_js_1.FieldBatchFormatVersion; } });
16
16
  Object.defineProperty(exports, "EncodedFieldBatchV1", { enumerable: true, get: function () { return versions_js_1.EncodedFieldBatchV1; } });
17
17
  Object.defineProperty(exports, "EncodedFieldBatchV2", { enumerable: true, get: function () { return versions_js_1.EncodedFieldBatchV2; } });
18
+ Object.defineProperty(exports, "supportsIncrementalEncoding", { enumerable: true, get: function () { return versions_js_1.supportsIncrementalEncoding; } });
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH,6CAGuB;AAFtB,8GAAA,eAAe,OAAA;AACf,2GAAA,YAAY,OAAA;AAEb,6CAAkF;AAAzE,2HAAA,4BAA4B,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAC1D,6CAOuB;AANtB,sHAAA,uBAAuB,OAAA;AACvB,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport type {\n\tEncodedChunkShapeV1,\n\tEncodedInlineArrayShape,\n\tEncodedNestedArrayShape,\n\tEncodedNodeShape,\n\tEncodedValueShape,\n\tEncodedFieldShape,\n} from \"./formatV1.js\";\nexport {\n\tEncodedAnyShape,\n\tSpecialField,\n} from \"./formatV1.js\";\nexport { EncodedIncrementalChunkShape, EncodedChunkShapeV2 } from \"./formatV2.js\";\nexport {\n\tFieldBatchFormatVersion,\n\tEncodedFieldBatchV1,\n\tEncodedFieldBatchV2,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV1AndV2,\n\ttype EncodedChunkShapeV1OrV2,\n} from \"./versions.js\";\nexport type {\n\tShapeIndex,\n\tIdentifierOrIndex,\n\tEncodedFieldBatchGeneric,\n} from \"./formatGeneric.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH,6CAGuB;AAFtB,8GAAA,eAAe,OAAA;AACf,2GAAA,YAAY,OAAA;AAEb,6CAAkF;AAAzE,2HAAA,4BAA4B,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAC1D,6CAQuB;AAPtB,sHAAA,uBAAuB,OAAA;AACvB,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AACnB,0HAAA,2BAA2B,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport type {\n\tEncodedChunkShapeV1,\n\tEncodedInlineArrayShape,\n\tEncodedNestedArrayShape,\n\tEncodedNodeShape,\n\tEncodedValueShape,\n\tEncodedFieldShape,\n} from \"./formatV1.js\";\nexport {\n\tEncodedAnyShape,\n\tSpecialField,\n} from \"./formatV1.js\";\nexport { EncodedIncrementalChunkShape, EncodedChunkShapeV2 } from \"./formatV2.js\";\nexport {\n\tFieldBatchFormatVersion,\n\tEncodedFieldBatchV1,\n\tEncodedFieldBatchV2,\n\tsupportsIncrementalEncoding,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV1AndV2,\n\ttype EncodedChunkShapeV1OrV2,\n} from \"./versions.js\";\nexport type {\n\tShapeIndex,\n\tIdentifierOrIndex,\n\tEncodedFieldBatchGeneric,\n} from \"./formatGeneric.js\";\n"]}
@@ -14,6 +14,14 @@ export declare const FieldBatchFormatVersion: {
14
14
  readonly v1: import("../../../../util/brand.js").Brand<1, "FieldBatchFormatVersion">;
15
15
  readonly v2: import("../../../../util/brand.js").Brand<2, "FieldBatchFormatVersion">;
16
16
  };
17
+ /**
18
+ * Whether the given format version supports incremental chunk encoding.
19
+ *
20
+ * @remarks
21
+ * This helper should be used for comparison since experimental versions
22
+ * can be a string.
23
+ */
24
+ export declare function supportsIncrementalEncoding(version: FieldBatchFormatVersion): boolean;
17
25
  /**
18
26
  * Encoded {@link FieldBatch} using V1 format.
19
27
  * @remarks
@@ -22,8 +30,8 @@ export declare const FieldBatchFormatVersion: {
22
30
  export type EncodedFieldBatchV1 = Static<typeof EncodedFieldBatchV1>;
23
31
  export declare const EncodedFieldBatchV1: import("@sinclair/typebox").TObject<{
24
32
  data: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TAny>>;
25
- version: import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>]>;
26
33
  identifiers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
34
+ version: import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>;
27
35
  shapes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
28
36
  e: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNever>;
29
37
  a: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
@@ -48,8 +56,8 @@ export declare const EncodedFieldBatchV1: import("@sinclair/typebox").TObject<{
48
56
  export type EncodedFieldBatchV2 = Static<typeof EncodedFieldBatchV2>;
49
57
  export declare const EncodedFieldBatchV2: import("@sinclair/typebox").TObject<{
50
58
  data: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TAny>>;
51
- version: import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>]>;
52
59
  identifiers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
60
+ version: import("@sinclair/typebox").TLiteral<FieldBatchFormatVersion>;
53
61
  shapes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
54
62
  e: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<0>>;
55
63
  a: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/versions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC7E,eAAO,MAAM,uBAAuB;;;CAclC,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC"}
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/versions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC7E,eAAO,MAAM,uBAAuB;;;CAclC,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAMrF;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.EncodedFieldBatchV2 = exports.EncodedFieldBatchV1 = exports.FieldBatchFormatVersion = void 0;
7
+ exports.EncodedFieldBatchV2 = exports.EncodedFieldBatchV1 = exports.supportsIncrementalEncoding = exports.FieldBatchFormatVersion = void 0;
8
8
  const index_js_1 = require("../../../../util/index.js");
9
9
  const formatGeneric_js_1 = require("./formatGeneric.js");
10
10
  const formatV1_js_1 = require("./formatV1.js");
@@ -24,6 +24,20 @@ exports.FieldBatchFormatVersion = (0, index_js_1.strictEnum)("FieldBatchFormatVe
24
24
  */
25
25
  v2: 2,
26
26
  });
27
+ /**
28
+ * Whether the given format version supports incremental chunk encoding.
29
+ *
30
+ * @remarks
31
+ * This helper should be used for comparison since experimental versions
32
+ * can be a string.
33
+ */
34
+ function supportsIncrementalEncoding(version) {
35
+ if (version === exports.FieldBatchFormatVersion.v1) {
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ exports.supportsIncrementalEncoding = supportsIncrementalEncoding;
27
41
  exports.EncodedFieldBatchV1 = (0, formatGeneric_js_1.EncodedFieldBatchGeneric)(exports.FieldBatchFormatVersion.v1, formatV1_js_1.EncodedChunkShapeV1);
28
42
  exports.EncodedFieldBatchV2 = (0, formatGeneric_js_1.EncodedFieldBatchGeneric)(exports.FieldBatchFormatVersion.v2, formatV2_js_1.EncodedChunkShapeV2);
29
43
  //# sourceMappingURL=versions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/versions.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,wDAAoE;AAEpE,yDAA8D;AAC9D,+CAAoD;AACpD,+CAAoD;AAMvC,QAAA,uBAAuB,GAAG,IAAA,qBAAU,EAAC,yBAAyB,EAAE;IAC5E;;;;;OAKG;IACH,EAAE,EAAE,CAAC;IACL;;;;OAIG;IACH,EAAE,EAAE,CAAC;CACL,CAAC,CAAC;AAQU,QAAA,mBAAmB,GAAG,IAAA,2CAAwB,EAC1D,+BAAuB,CAAC,EAAE,EAC1B,iCAAmB,CACnB,CAAC;AAQW,QAAA,mBAAmB,GAAG,IAAA,2CAAwB,EAC1D,+BAAuB,CAAC,EAAE,EAC1B,iCAAmB,CACnB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { Static } from \"@sinclair/typebox\";\n\nimport { strictEnum, type Values } from \"../../../../util/index.js\";\n\nimport { EncodedFieldBatchGeneric } from \"./formatGeneric.js\";\nimport { EncodedChunkShapeV1 } from \"./formatV1.js\";\nimport { EncodedChunkShapeV2 } from \"./formatV2.js\";\n\n/**\n * The format version for the field batch.\n */\nexport type FieldBatchFormatVersion = Values<typeof FieldBatchFormatVersion>;\nexport const FieldBatchFormatVersion = strictEnum(\"FieldBatchFormatVersion\", {\n\t/**\n\t * Initial version.\n\t * @remarks\n\t * For simplicity of implementation the format for this version allows the same chunk shapes as v2, but must not use {@link EncodedIncrementalChunkShape}\n\t * as older clients will not know how to handle that shape but think they can handle this format.\n\t */\n\tv1: 1,\n\t/**\n\t * Adds support for incremental encoding of chunks.\n\t * @remarks\n\t * {@link EncodedIncrementalChunkShape} was added in this version.\n\t */\n\tv2: 2,\n});\n\n/**\n * Encoded {@link FieldBatch} using V1 format.\n * @remarks\n * Does not support {@link EncodedIncrementalChunkShape}.\n */\nexport type EncodedFieldBatchV1 = Static<typeof EncodedFieldBatchV1>;\nexport const EncodedFieldBatchV1 = EncodedFieldBatchGeneric(\n\tFieldBatchFormatVersion.v1,\n\tEncodedChunkShapeV1,\n);\n\n/**\n * Encoded {@link FieldBatch} using V2 format.\n * @remarks\n * Adds support for {@link EncodedIncrementalChunkShape}.\n */\nexport type EncodedFieldBatchV2 = Static<typeof EncodedFieldBatchV2>;\nexport const EncodedFieldBatchV2 = EncodedFieldBatchGeneric(\n\tFieldBatchFormatVersion.v2,\n\tEncodedChunkShapeV2,\n);\n\n/**\n * Encoded {@link FieldBatch}, which might use V2 features, but might also have been from a V1 encoder.\n * @remarks\n * Type wise, equivalent to V2, as that is a superset of V1.\n * Used instead of just V2 for clarity.\n */\nexport type EncodedFieldBatchV1OrV2 = EncodedFieldBatchV1 | EncodedFieldBatchV2;\n\n/**\n * Encoded data, compatible with both V1 and V2 formats.\n * @remarks\n * This is the intersection of the two versions, which is possible because V2 is a non-breaking extension of V1.\n * This type can be used when the code is compatible with both versions and does not need to distinguish between them.\n *\n * Type wise, equivalent to V1, as that is a subset of V2.\n * Used instead of just V1 for clarity.\n */\nexport type EncodedFieldBatchV1AndV2 = EncodedFieldBatchV1 & EncodedFieldBatchV2;\n\n/**\n * Encoded chunk shape, which might use V2 features, but might also have been from a V1 encoder.\n * @remarks\n * Type wise, equivalent to V2, as that is a superset of V1.\n * Used instead of just V2 for clarity.\n */\nexport type EncodedChunkShapeV1OrV2 = EncodedChunkShapeV1 | EncodedChunkShapeV2;\n"]}
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../src/feature-libraries/chunked-forest/codec/format/versions.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,wDAAoE;AAEpE,yDAA8D;AAC9D,+CAAoD;AACpD,+CAAoD;AAMvC,QAAA,uBAAuB,GAAG,IAAA,qBAAU,EAAC,yBAAyB,EAAE;IAC5E;;;;;OAKG;IACH,EAAE,EAAE,CAAC;IACL;;;;OAIG;IACH,EAAE,EAAE,CAAC;CACL,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAgB,2BAA2B,CAAC,OAAgC;IAC3E,IAAI,OAAO,KAAK,+BAAuB,CAAC,EAAE,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAND,kEAMC;AAQY,QAAA,mBAAmB,GAAG,IAAA,2CAAwB,EAC1D,+BAAuB,CAAC,EAAE,EAC1B,iCAAmB,CACnB,CAAC;AAQW,QAAA,mBAAmB,GAAG,IAAA,2CAAwB,EAC1D,+BAAuB,CAAC,EAAE,EAC1B,iCAAmB,CACnB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { Static } from \"@sinclair/typebox\";\n\nimport { strictEnum, type Values } from \"../../../../util/index.js\";\n\nimport { EncodedFieldBatchGeneric } from \"./formatGeneric.js\";\nimport { EncodedChunkShapeV1 } from \"./formatV1.js\";\nimport { EncodedChunkShapeV2 } from \"./formatV2.js\";\n\n/**\n * The format version for the field batch.\n */\nexport type FieldBatchFormatVersion = Values<typeof FieldBatchFormatVersion>;\nexport const FieldBatchFormatVersion = strictEnum(\"FieldBatchFormatVersion\", {\n\t/**\n\t * Initial version.\n\t * @remarks\n\t * For simplicity of implementation the format for this version allows the same chunk shapes as v2, but must not use {@link EncodedIncrementalChunkShape}\n\t * as older clients will not know how to handle that shape but think they can handle this format.\n\t */\n\tv1: 1,\n\t/**\n\t * Adds support for incremental encoding of chunks.\n\t * @remarks\n\t * {@link EncodedIncrementalChunkShape} was added in this version.\n\t */\n\tv2: 2,\n});\n\n/**\n * Whether the given format version supports incremental chunk encoding.\n *\n * @remarks\n * This helper should be used for comparison since experimental versions\n * can be a string.\n */\nexport function supportsIncrementalEncoding(version: FieldBatchFormatVersion): boolean {\n\tif (version === FieldBatchFormatVersion.v1) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Encoded {@link FieldBatch} using V1 format.\n * @remarks\n * Does not support {@link EncodedIncrementalChunkShape}.\n */\nexport type EncodedFieldBatchV1 = Static<typeof EncodedFieldBatchV1>;\nexport const EncodedFieldBatchV1 = EncodedFieldBatchGeneric(\n\tFieldBatchFormatVersion.v1,\n\tEncodedChunkShapeV1,\n);\n\n/**\n * Encoded {@link FieldBatch} using V2 format.\n * @remarks\n * Adds support for {@link EncodedIncrementalChunkShape}.\n */\nexport type EncodedFieldBatchV2 = Static<typeof EncodedFieldBatchV2>;\nexport const EncodedFieldBatchV2 = EncodedFieldBatchGeneric(\n\tFieldBatchFormatVersion.v2,\n\tEncodedChunkShapeV2,\n);\n\n/**\n * Encoded {@link FieldBatch}, which might use V2 features, but might also have been from a V1 encoder.\n * @remarks\n * Type wise, equivalent to V2, as that is a superset of V1.\n * Used instead of just V2 for clarity.\n */\nexport type EncodedFieldBatchV1OrV2 = EncodedFieldBatchV1 | EncodedFieldBatchV2;\n\n/**\n * Encoded data, compatible with both V1 and V2 formats.\n * @remarks\n * This is the intersection of the two versions, which is possible because V2 is a non-breaking extension of V1.\n * This type can be used when the code is compatible with both versions and does not need to distinguish between them.\n *\n * Type wise, equivalent to V1, as that is a subset of V2.\n * Used instead of just V1 for clarity.\n */\nexport type EncodedFieldBatchV1AndV2 = EncodedFieldBatchV1 & EncodedFieldBatchV2;\n\n/**\n * Encoded chunk shape, which might use V2 features, but might also have been from a V1 encoder.\n * @remarks\n * Type wise, equivalent to V2, as that is a superset of V1.\n * Used instead of just V2 for clarity.\n */\nexport type EncodedChunkShapeV1OrV2 = EncodedChunkShapeV1 | EncodedChunkShapeV2;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeEncoder.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/nodeEncoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAG7B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAmB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,qBAAa,qBACZ,SAAQ,KAAK,CAAC,uBAAuB,CACrC,YAAW,WAAW;aASL,IAAI,EAAE,SAAS,GAAG,wBAAwB;aAC1C,KAAK,EAAE,iBAAiB;IACxC;;;;;;;;;;OAUG;aACa,wBAAwB,EAAE,SAAS,iBAAiB,EAAE;IACtE;;;OAGG;aACa,kBAAkB,EAAE,SAAS,GAAG,YAAY;IAzB7D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;gBAGpC,IAAI,EAAE,SAAS,GAAG,wBAAwB,EAC1C,KAAK,EAAE,iBAAiB;IACxC;;;;;;;;;;OAUG;IACa,wBAAwB,EAAE,SAAS,iBAAiB,EAAE;IACtE;;;OAGG;IACa,kBAAkB,EAAE,SAAS,GAAG,YAAY;IAM7D,OAAO,CAAC,gBAAgB;IAajB,UAAU,CAChB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,YAAY,CAAC,uBAAuB,CAAC,GACjD,IAAI;IAgCA,WAAW,CACjB,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACvC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GACxD,uBAAuB;IAWnB,mCAAmC,CACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAC5B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,uBAAuB,CAAC,KAAK,IAAI,GAC9D,IAAI;IAeP,IAAW,KAAK,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAEjD;CACD;AAED,wBAAgB,iBAAiB,CAChC,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACvC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GACxD,iBAAiB,EAAE,GAAG,SAAS,CAUjC"}
1
+ {"version":3,"file":"nodeEncoder.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/nodeEncoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAG7B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAmB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,qBAAa,qBACZ,SAAQ,KAAK,CAAC,uBAAuB,CACrC,YAAW,WAAW;aASL,IAAI,EAAE,SAAS,GAAG,wBAAwB;aAC1C,KAAK,EAAE,iBAAiB;IACxC;;;;;;;;;;OAUG;aACa,wBAAwB,EAAE,SAAS,iBAAiB,EAAE;IACtE;;;OAGG;aACa,kBAAkB,EAAE,SAAS,GAAG,YAAY;IAzB7D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;gBAGpC,IAAI,EAAE,SAAS,GAAG,wBAAwB,EAC1C,KAAK,EAAE,iBAAiB;IACxC;;;;;;;;;;OAUG;IACa,wBAAwB,EAAE,SAAS,iBAAiB,EAAE;IACtE;;;OAGG;IACa,kBAAkB,EAAE,SAAS,GAAG,YAAY;IAM7D,OAAO,CAAC,gBAAgB;IAqBjB,UAAU,CAChB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,YAAY,CAAC,uBAAuB,CAAC,GACjD,IAAI;IAgCA,WAAW,CACjB,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACvC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GACxD,uBAAuB;IAWnB,mCAAmC,CACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAC5B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,uBAAuB,CAAC,KAAK,IAAI,GAC9D,IAAI;IAeP,IAAW,KAAK,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAEjD;CACD;AAED,wBAAgB,iBAAiB,CAChC,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACvC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GACxD,iBAAiB,EAAE,GAAG,SAAS,CAUjC"}
@@ -49,7 +49,15 @@ class NodeShapeBasedEncoder extends chunkEncodingGeneric_js_1.Shape {
49
49
  if ((0, internal_2.isStableId)(cursor.value)) {
50
50
  const sessionSpaceCompressedId = context.idCompressor.tryRecompress(cursor.value);
51
51
  if (sessionSpaceCompressedId !== undefined) {
52
- return context.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);
52
+ const opSpaceId = context.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);
53
+ // Summaries can only contain finalized op-space ids unless they also include the originator's session id somewhere.
54
+ // This is not the case for forest summaries at the time of writing, so non-finalized ids are instead written using
55
+ // their long form (by falling through to the original cursor value).
56
+ // A scenario where such ids can appear in the summary is in the attach summary of a tree being attached to an already-attached container.
57
+ // TODO: isFinalId should probably be exported from id-compressor and that could be used to do the narrowing here.
58
+ if (!context.isSummary || opSpaceId >= 0) {
59
+ return opSpaceId;
60
+ }
53
61
  }
54
62
  }
55
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nodeEncoder.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/nodeEncoder.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, fail } from \"@fluidframework/core-utils/internal\";\nimport { isStableId } from \"@fluidframework/id-compressor/internal\";\n\nimport {\n\ttype FieldKey,\n\ttype ITreeCursorSynchronous,\n\ttype TreeNodeSchemaIdentifier,\n\tforEachField,\n\ttype Value,\n} from \"../../../core/index.js\";\nimport { brand } from \"../../../util/index.js\";\n\nimport type { Counter, DeduplicationTable } from \"./chunkCodecUtilities.js\";\nimport { type BufferFormat, IdentifierToken, Shape } from \"./chunkEncodingGeneric.js\";\nimport {\n\ttype EncoderContext,\n\ttype FieldEncoder,\n\ttype KeyedFieldEncoder,\n\ttype NodeEncoder,\n\tencodeValue,\n} from \"./compressedEncode.js\";\nimport type {\n\tEncodedChunkShapeV1OrV2,\n\tEncodedFieldShape,\n\tEncodedValueShape,\n} from \"./format/index.js\";\n\n/**\n * Encodes a node with the {@link EncodedNodeShape} shape.\n * @remarks\n * The fact this is also a Shape is an implementation detail of the encoder: that allows the shape it uses to be itself,\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class NodeShapeBasedEncoder\n\textends Shape<EncodedChunkShapeV1OrV2>\n\timplements NodeEncoder\n{\n\t/**\n\t * Set of keys for fields that are encoded using {@link NodeShapeBasedEncoder.specializedFieldEncoders}.\n\t * TODO: Ensure uniform chunks, encoding and identifier generation sort fields the same.\n\t */\n\tprivate readonly specializedFieldKeys: Set<FieldKey>;\n\n\tpublic constructor(\n\t\tpublic readonly type: undefined | TreeNodeSchemaIdentifier,\n\t\tpublic readonly value: EncodedValueShape,\n\t\t/**\n\t\t * Encoders for a specific set of fields, by key, in the order they will be encoded.\n\t\t * These are fields for which specialized encoding is provided as an optimization.\n\t\t * Using these for a given field instead of falling back to {@link NodeShapeBasedEncoder.specializedFieldEncoders} is often more efficient:\n\t\t * this avoids the need to explicitly include the key and shape in the encoded data for each node instance.\n\t\t * Instead, this information is here, and thus is encoded only once as part of the node shape.\n\t\t * These encoders will be used, even if the field they apply to is empty (which can add overhead for fields which are usually empty).\n\t\t *\n\t\t * Any fields not included here will be encoded using {@link NodeShapeBasedEncoder.otherFieldsEncoder}.\n\t\t * If {@link NodeShapeBasedEncoder.otherFieldsEncoder} is undefined, then this must handle all non-empty fields.\n\t\t */\n\t\tpublic readonly specializedFieldEncoders: readonly KeyedFieldEncoder[],\n\t\t/**\n\t\t * Encoder for all other fields that are not in {@link NodeShapeBasedEncoder.specializedFieldEncoders}. These fields must\n\t\t * be encoded after the specialized fields.\n\t\t */\n\t\tpublic readonly otherFieldsEncoder: undefined | FieldEncoder,\n\t) {\n\t\tsuper();\n\t\tthis.specializedFieldKeys = new Set(this.specializedFieldEncoders.map((f) => f.key));\n\t}\n\n\tprivate getValueToEncode(cursor: ITreeCursorSynchronous, context: EncoderContext): Value {\n\t\tif (this.value === 0) {\n\t\t\tassert(typeof cursor.value === \"string\", 0x9aa /* identifier must be type string */);\n\t\t\tif (isStableId(cursor.value)) {\n\t\t\t\tconst sessionSpaceCompressedId = context.idCompressor.tryRecompress(cursor.value);\n\t\t\t\tif (sessionSpaceCompressedId !== undefined) {\n\t\t\t\t\treturn context.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cursor.value;\n\t}\n\n\tpublic encodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat<EncodedChunkShapeV1OrV2>,\n\t): void {\n\t\tif (this.type === undefined) {\n\t\t\toutputBuffer.push(new IdentifierToken(cursor.type));\n\t\t} else {\n\t\t\tassert(cursor.type === this.type, 0x741 /* type must match shape */);\n\t\t}\n\t\tencodeValue(this.getValueToEncode(cursor, context), this.value, outputBuffer);\n\t\tfor (const fieldEncoder of this.specializedFieldEncoders) {\n\t\t\tcursor.enterField(brand(fieldEncoder.key));\n\t\t\tfieldEncoder.encoder.encodeField(cursor, context, outputBuffer);\n\t\t\tcursor.exitField();\n\t\t}\n\n\t\tconst otherFieldsBuffer: BufferFormat<EncodedChunkShapeV1OrV2> = [];\n\n\t\tforEachField(cursor, () => {\n\t\t\tconst key = cursor.getFieldKey();\n\t\t\tif (!this.specializedFieldKeys.has(key)) {\n\t\t\t\tassert(\n\t\t\t\t\tthis.otherFieldsEncoder !== undefined,\n\t\t\t\t\t0x742 /* had extra local fields when shape does not support them */,\n\t\t\t\t);\n\t\t\t\totherFieldsBuffer.push(new IdentifierToken(key));\n\t\t\t\tthis.otherFieldsEncoder.encodeField(cursor, context, otherFieldsBuffer);\n\t\t\t}\n\t\t});\n\n\t\tif (this.otherFieldsEncoder !== undefined) {\n\t\t\toutputBuffer.push(otherFieldsBuffer);\n\t\t}\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n\t): EncodedChunkShapeV1OrV2 {\n\t\treturn {\n\t\t\tc: {\n\t\t\t\ttype: encodeOptionalIdentifier(this.type, identifiers),\n\t\t\t\tvalue: this.value,\n\t\t\t\tfields: encodeFieldShapes(this.specializedFieldEncoders, identifiers, shapes),\n\t\t\t\textraFields: encodeOptionalFieldShape(this.otherFieldsEncoder, shapes),\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape<EncodedChunkShapeV1OrV2>) => void,\n\t): void {\n\t\tif (this.type !== undefined) {\n\t\t\tidentifiers.add(this.type);\n\t\t}\n\n\t\tfor (const fieldEncoder of this.specializedFieldEncoders) {\n\t\t\tidentifiers.add(fieldEncoder.key);\n\t\t\tshapeDiscovered(fieldEncoder.encoder.shape);\n\t\t}\n\n\t\tif (this.otherFieldsEncoder !== undefined) {\n\t\t\tshapeDiscovered(this.otherFieldsEncoder.shape);\n\t\t}\n\t}\n\n\tpublic get shape(): Shape<EncodedChunkShapeV1OrV2> {\n\t\treturn this;\n\t}\n}\n\nexport function encodeFieldShapes(\n\tfieldEncoders: readonly KeyedFieldEncoder[],\n\tidentifiers: DeduplicationTable<string>,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): EncodedFieldShape[] | undefined {\n\tif (fieldEncoders.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn fieldEncoders.map((fieldEncoder) => [\n\t\t// key\n\t\tencodeIdentifier(fieldEncoder.key, identifiers),\n\t\t// shape\n\t\tshapes.valueToIndex.get(fieldEncoder.encoder.shape) ?? fail(0xb50 /* missing shape */),\n\t]);\n}\n\nfunction encodeIdentifier(\n\tidentifier: string,\n\tidentifiers: DeduplicationTable<string>,\n): string | number {\n\treturn identifiers.valueToIndex.get(identifier) ?? identifier;\n}\n\nfunction encodeOptionalIdentifier(\n\tidentifier: string | undefined,\n\tidentifiers: DeduplicationTable<string>,\n): string | number | undefined {\n\treturn identifier === undefined ? undefined : encodeIdentifier(identifier, identifiers);\n}\n\nfunction encodeOptionalFieldShape(\n\tencoder: FieldEncoder | undefined,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): number | undefined {\n\treturn encoder === undefined ? undefined : dedupShape(encoder.shape, shapes);\n}\n\nfunction dedupShape(\n\tshape: Shape<EncodedChunkShapeV1OrV2>,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): number {\n\treturn shapes.valueToIndex.get(shape) ?? fail(0xb51 /* missing shape */);\n}\n"]}
1
+ {"version":3,"file":"nodeEncoder.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/nodeEncoder.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, fail } from \"@fluidframework/core-utils/internal\";\nimport { isStableId } from \"@fluidframework/id-compressor/internal\";\n\nimport {\n\ttype FieldKey,\n\ttype ITreeCursorSynchronous,\n\ttype TreeNodeSchemaIdentifier,\n\tforEachField,\n\ttype Value,\n} from \"../../../core/index.js\";\nimport { brand } from \"../../../util/index.js\";\n\nimport type { Counter, DeduplicationTable } from \"./chunkCodecUtilities.js\";\nimport { type BufferFormat, IdentifierToken, Shape } from \"./chunkEncodingGeneric.js\";\nimport {\n\ttype EncoderContext,\n\ttype FieldEncoder,\n\ttype KeyedFieldEncoder,\n\ttype NodeEncoder,\n\tencodeValue,\n} from \"./compressedEncode.js\";\nimport type {\n\tEncodedChunkShapeV1OrV2,\n\tEncodedFieldShape,\n\tEncodedValueShape,\n} from \"./format/index.js\";\n\n/**\n * Encodes a node with the {@link EncodedNodeShape} shape.\n * @remarks\n * The fact this is also a Shape is an implementation detail of the encoder: that allows the shape it uses to be itself,\n * which is an easy way to keep all the related code together without extra objects.\n */\nexport class NodeShapeBasedEncoder\n\textends Shape<EncodedChunkShapeV1OrV2>\n\timplements NodeEncoder\n{\n\t/**\n\t * Set of keys for fields that are encoded using {@link NodeShapeBasedEncoder.specializedFieldEncoders}.\n\t * TODO: Ensure uniform chunks, encoding and identifier generation sort fields the same.\n\t */\n\tprivate readonly specializedFieldKeys: Set<FieldKey>;\n\n\tpublic constructor(\n\t\tpublic readonly type: undefined | TreeNodeSchemaIdentifier,\n\t\tpublic readonly value: EncodedValueShape,\n\t\t/**\n\t\t * Encoders for a specific set of fields, by key, in the order they will be encoded.\n\t\t * These are fields for which specialized encoding is provided as an optimization.\n\t\t * Using these for a given field instead of falling back to {@link NodeShapeBasedEncoder.specializedFieldEncoders} is often more efficient:\n\t\t * this avoids the need to explicitly include the key and shape in the encoded data for each node instance.\n\t\t * Instead, this information is here, and thus is encoded only once as part of the node shape.\n\t\t * These encoders will be used, even if the field they apply to is empty (which can add overhead for fields which are usually empty).\n\t\t *\n\t\t * Any fields not included here will be encoded using {@link NodeShapeBasedEncoder.otherFieldsEncoder}.\n\t\t * If {@link NodeShapeBasedEncoder.otherFieldsEncoder} is undefined, then this must handle all non-empty fields.\n\t\t */\n\t\tpublic readonly specializedFieldEncoders: readonly KeyedFieldEncoder[],\n\t\t/**\n\t\t * Encoder for all other fields that are not in {@link NodeShapeBasedEncoder.specializedFieldEncoders}. These fields must\n\t\t * be encoded after the specialized fields.\n\t\t */\n\t\tpublic readonly otherFieldsEncoder: undefined | FieldEncoder,\n\t) {\n\t\tsuper();\n\t\tthis.specializedFieldKeys = new Set(this.specializedFieldEncoders.map((f) => f.key));\n\t}\n\n\tprivate getValueToEncode(cursor: ITreeCursorSynchronous, context: EncoderContext): Value {\n\t\tif (this.value === 0) {\n\t\t\tassert(typeof cursor.value === \"string\", 0x9aa /* identifier must be type string */);\n\t\t\tif (isStableId(cursor.value)) {\n\t\t\t\tconst sessionSpaceCompressedId = context.idCompressor.tryRecompress(cursor.value);\n\t\t\t\tif (sessionSpaceCompressedId !== undefined) {\n\t\t\t\t\tconst opSpaceId = context.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);\n\t\t\t\t\t// Summaries can only contain finalized op-space ids unless they also include the originator's session id somewhere.\n\t\t\t\t\t// This is not the case for forest summaries at the time of writing, so non-finalized ids are instead written using\n\t\t\t\t\t// their long form (by falling through to the original cursor value).\n\t\t\t\t\t// A scenario where such ids can appear in the summary is in the attach summary of a tree being attached to an already-attached container.\n\t\t\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\t\t\tif (!context.isSummary || opSpaceId >= 0) {\n\t\t\t\t\t\treturn opSpaceId;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cursor.value;\n\t}\n\n\tpublic encodeNode(\n\t\tcursor: ITreeCursorSynchronous,\n\t\tcontext: EncoderContext,\n\t\toutputBuffer: BufferFormat<EncodedChunkShapeV1OrV2>,\n\t): void {\n\t\tif (this.type === undefined) {\n\t\t\toutputBuffer.push(new IdentifierToken(cursor.type));\n\t\t} else {\n\t\t\tassert(cursor.type === this.type, 0x741 /* type must match shape */);\n\t\t}\n\t\tencodeValue(this.getValueToEncode(cursor, context), this.value, outputBuffer);\n\t\tfor (const fieldEncoder of this.specializedFieldEncoders) {\n\t\t\tcursor.enterField(brand(fieldEncoder.key));\n\t\t\tfieldEncoder.encoder.encodeField(cursor, context, outputBuffer);\n\t\t\tcursor.exitField();\n\t\t}\n\n\t\tconst otherFieldsBuffer: BufferFormat<EncodedChunkShapeV1OrV2> = [];\n\n\t\tforEachField(cursor, () => {\n\t\t\tconst key = cursor.getFieldKey();\n\t\t\tif (!this.specializedFieldKeys.has(key)) {\n\t\t\t\tassert(\n\t\t\t\t\tthis.otherFieldsEncoder !== undefined,\n\t\t\t\t\t0x742 /* had extra local fields when shape does not support them */,\n\t\t\t\t);\n\t\t\t\totherFieldsBuffer.push(new IdentifierToken(key));\n\t\t\t\tthis.otherFieldsEncoder.encodeField(cursor, context, otherFieldsBuffer);\n\t\t\t}\n\t\t});\n\n\t\tif (this.otherFieldsEncoder !== undefined) {\n\t\t\toutputBuffer.push(otherFieldsBuffer);\n\t\t}\n\t}\n\n\tpublic encodeShape(\n\t\tidentifiers: DeduplicationTable<string>,\n\t\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n\t): EncodedChunkShapeV1OrV2 {\n\t\treturn {\n\t\t\tc: {\n\t\t\t\ttype: encodeOptionalIdentifier(this.type, identifiers),\n\t\t\t\tvalue: this.value,\n\t\t\t\tfields: encodeFieldShapes(this.specializedFieldEncoders, identifiers, shapes),\n\t\t\t\textraFields: encodeOptionalFieldShape(this.otherFieldsEncoder, shapes),\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic countReferencedShapesAndIdentifiers(\n\t\tidentifiers: Counter<string>,\n\t\tshapeDiscovered: (shape: Shape<EncodedChunkShapeV1OrV2>) => void,\n\t): void {\n\t\tif (this.type !== undefined) {\n\t\t\tidentifiers.add(this.type);\n\t\t}\n\n\t\tfor (const fieldEncoder of this.specializedFieldEncoders) {\n\t\t\tidentifiers.add(fieldEncoder.key);\n\t\t\tshapeDiscovered(fieldEncoder.encoder.shape);\n\t\t}\n\n\t\tif (this.otherFieldsEncoder !== undefined) {\n\t\t\tshapeDiscovered(this.otherFieldsEncoder.shape);\n\t\t}\n\t}\n\n\tpublic get shape(): Shape<EncodedChunkShapeV1OrV2> {\n\t\treturn this;\n\t}\n}\n\nexport function encodeFieldShapes(\n\tfieldEncoders: readonly KeyedFieldEncoder[],\n\tidentifiers: DeduplicationTable<string>,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): EncodedFieldShape[] | undefined {\n\tif (fieldEncoders.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn fieldEncoders.map((fieldEncoder) => [\n\t\t// key\n\t\tencodeIdentifier(fieldEncoder.key, identifiers),\n\t\t// shape\n\t\tshapes.valueToIndex.get(fieldEncoder.encoder.shape) ?? fail(0xb50 /* missing shape */),\n\t]);\n}\n\nfunction encodeIdentifier(\n\tidentifier: string,\n\tidentifiers: DeduplicationTable<string>,\n): string | number {\n\treturn identifiers.valueToIndex.get(identifier) ?? identifier;\n}\n\nfunction encodeOptionalIdentifier(\n\tidentifier: string | undefined,\n\tidentifiers: DeduplicationTable<string>,\n): string | number | undefined {\n\treturn identifier === undefined ? undefined : encodeIdentifier(identifier, identifiers);\n}\n\nfunction encodeOptionalFieldShape(\n\tencoder: FieldEncoder | undefined,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): number | undefined {\n\treturn encoder === undefined ? undefined : dedupShape(encoder.shape, shapes);\n}\n\nfunction dedupShape(\n\tshape: Shape<EncodedChunkShapeV1OrV2>,\n\tshapes: DeduplicationTable<Shape<EncodedChunkShapeV1OrV2>>,\n): number {\n\treturn shapes.valueToIndex.get(shape) ?? fail(0xb51 /* missing shape */);\n}\n"]}
@@ -14,14 +14,14 @@ import { NodeShapeBasedEncoder } from "./nodeEncoder.js";
14
14
  * @remarks See {@link schemaCompressedEncode} for more details.
15
15
  * This version does not support incremental encoding.
16
16
  */
17
- export declare function schemaCompressedEncodeV1(schema: StoredSchemaCollection, policy: SchemaPolicy, fieldBatch: FieldBatch, idCompressor: IIdCompressor): EncodedFieldBatchV1;
17
+ export declare function schemaCompressedEncodeV1(schema: StoredSchemaCollection, policy: SchemaPolicy, fieldBatch: FieldBatch, idCompressor: IIdCompressor, _incrementalEncoder: IncrementalEncoder | undefined, isSummary: boolean): EncodedFieldBatchV1;
18
18
  /**
19
19
  * Encode data from `fieldBatch` in into an `EncodedChunk` using {@link FieldBatchFormatVersion.v2}.
20
20
  * @remarks See {@link schemaCompressedEncode} for more details.
21
21
  * Incremental encoding is supported from this version onwards.
22
22
  */
23
- export declare function schemaCompressedEncodeV2(schema: StoredSchemaCollection, policy: SchemaPolicy, fieldBatch: FieldBatch, idCompressor: IIdCompressor, incrementalEncoder: IncrementalEncoder | undefined): EncodedFieldBatchV2;
24
- export declare function buildContext(storedSchema: StoredSchemaCollection, policy: SchemaPolicy, idCompressor: IIdCompressor, incrementalEncoder: IncrementalEncoder | undefined, version: FieldBatchFormatVersion): EncoderContext;
23
+ export declare function schemaCompressedEncodeV2(schema: StoredSchemaCollection, policy: SchemaPolicy, fieldBatch: FieldBatch, idCompressor: IIdCompressor, incrementalEncoder: IncrementalEncoder | undefined, isSummary: boolean): EncodedFieldBatchV2;
24
+ export declare function buildContext(storedSchema: StoredSchemaCollection, policy: SchemaPolicy, idCompressor: IIdCompressor, incrementalEncoder: IncrementalEncoder | undefined, version: FieldBatchFormatVersion, isSummary: boolean): EncoderContext;
25
25
  /**
26
26
  * Selects an encoder to use to encode fields.
27
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"schemaBasedEncode.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAIN,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAI7B,KAAK,YAAY,EACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAEvB,KAAK,iBAAiB,EAKtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,EAExB,uBAAuB,EAEvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,aAAa,GACzB,mBAAmB,CAWrB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,aAAa,EAC3B,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,GAChD,mBAAmB,CASrB;AA0BD,wBAAgB,YAAY,CAC3B,YAAY,EAAE,sBAAsB,EACpC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,aAAa,EAC3B,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,EAClD,OAAO,EAAE,uBAAuB,GAC9B,cAAc,CAYhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,sBAAsB,GAClC,YAAY,CA8Bd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,YAAY,EAAE,kBAAkB,EAChC,YAAY,EAAE,sBAAsB,EACpC,UAAU,EAAE,wBAAwB,EACpC,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,qBAAqB,CA4CvB"}
1
+ {"version":3,"file":"schemaBasedEncode.d.ts","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAIN,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAI7B,KAAK,YAAY,EACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACN,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAEvB,KAAK,iBAAiB,EAKtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,EAExB,uBAAuB,EAEvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,kBAAkB,GAAG,SAAS,EACnD,SAAS,EAAE,OAAO,GAChB,mBAAmB,CAYrB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,aAAa,EAC3B,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,EAClD,SAAS,EAAE,OAAO,GAChB,mBAAmB,CAUrB;AA2BD,wBAAgB,YAAY,CAC3B,YAAY,EAAE,sBAAsB,EACpC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,aAAa,EAC3B,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,EAClD,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,OAAO,GAChB,cAAc,CAahB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,sBAAsB,GAClC,YAAY,CA8Bd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,YAAY,EAAE,kBAAkB,EAChC,YAAY,EAAE,sBAAsB,EACpC,UAAU,EAAE,wBAAwB,EACpC,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,qBAAqB,CA4CvB"}
@@ -17,8 +17,8 @@ const nodeEncoder_js_1 = require("./nodeEncoder.js");
17
17
  * @remarks See {@link schemaCompressedEncode} for more details.
18
18
  * This version does not support incremental encoding.
19
19
  */
20
- function schemaCompressedEncodeV1(schema, policy, fieldBatch, idCompressor) {
21
- const encoded = schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, undefined /* incrementalEncoder */, (0, index_js_2.brand)(index_js_3.FieldBatchFormatVersion.v1));
20
+ function schemaCompressedEncodeV1(schema, policy, fieldBatch, idCompressor, _incrementalEncoder, isSummary) {
21
+ const encoded = schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, undefined /* incrementalEncoder */, (0, index_js_2.brand)(index_js_3.FieldBatchFormatVersion.v1), isSummary);
22
22
  // Since incrementalEncoder was not provided, no V2 features should be used, and this cast should be safe.
23
23
  return encoded;
24
24
  }
@@ -28,8 +28,8 @@ exports.schemaCompressedEncodeV1 = schemaCompressedEncodeV1;
28
28
  * @remarks See {@link schemaCompressedEncode} for more details.
29
29
  * Incremental encoding is supported from this version onwards.
30
30
  */
31
- function schemaCompressedEncodeV2(schema, policy, fieldBatch, idCompressor, incrementalEncoder) {
32
- return schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, incrementalEncoder, (0, index_js_2.brand)(index_js_3.FieldBatchFormatVersion.v2));
31
+ function schemaCompressedEncodeV2(schema, policy, fieldBatch, idCompressor, incrementalEncoder, isSummary) {
32
+ return schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, incrementalEncoder, (0, index_js_2.brand)(index_js_3.FieldBatchFormatVersion.v2), isSummary);
33
33
  }
34
34
  exports.schemaCompressedEncodeV2 = schemaCompressedEncodeV2;
35
35
  /**
@@ -42,11 +42,11 @@ exports.schemaCompressedEncodeV2 = schemaCompressedEncodeV2;
42
42
  * Optimized for encoded size and encoding performance.
43
43
  * TODO: This function should eventually also take in the root FieldSchema to more efficiently compress the nodes.
44
44
  */
45
- function schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, incrementalEncoder, version) {
46
- return (0, compressedEncode_js_1.compressedEncode)(fieldBatch, buildContext(schema, policy, idCompressor, incrementalEncoder, version));
45
+ function schemaCompressedEncode(schema, policy, fieldBatch, idCompressor, incrementalEncoder, version, isSummary) {
46
+ return (0, compressedEncode_js_1.compressedEncode)(fieldBatch, buildContext(schema, policy, idCompressor, incrementalEncoder, version, isSummary));
47
47
  }
48
- function buildContext(storedSchema, policy, idCompressor, incrementalEncoder, version) {
49
- const context = new compressedEncode_js_1.EncoderContext((fieldBuilder, schemaName) => getNodeEncoder(fieldBuilder, storedSchema, schemaName, incrementalEncoder), (nodeBuilder, fieldSchema) => getFieldEncoder(nodeBuilder, fieldSchema, context, storedSchema), policy.fieldKinds, idCompressor, incrementalEncoder, version);
48
+ function buildContext(storedSchema, policy, idCompressor, incrementalEncoder, version, isSummary) {
49
+ const context = new compressedEncode_js_1.EncoderContext((fieldBuilder, schemaName) => getNodeEncoder(fieldBuilder, storedSchema, schemaName, incrementalEncoder), (nodeBuilder, fieldSchema) => getFieldEncoder(nodeBuilder, fieldSchema, context, storedSchema), policy.fieldKinds, idCompressor, incrementalEncoder, version, isSummary);
50
50
  return context;
51
51
  }
52
52
  exports.buildContext = buildContext;
@@ -1 +1 @@
1
- {"version":3,"file":"schemaBasedEncode.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/schemaBasedEncode.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, fail } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\ttype StoredSchemaCollection,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\tValueSchema,\n\tMultiplicity,\n\tidentifierFieldKindIdentifier,\n\ttype SchemaPolicy,\n} from \"../../../core/index.js\";\nimport { brand, oneFromIterable } from \"../../../util/index.js\";\n\nimport type { IncrementalEncoder } from \"./codecs.js\";\nimport {\n\tEncoderContext,\n\ttype FieldEncoder,\n\ttype FieldEncodeBuilder,\n\ttype KeyedFieldEncoder,\n\ttype NodeEncodeBuilder,\n\tanyNodeEncoder,\n\tasFieldEncoder,\n\tcompressedEncode,\n\tincrementalFieldEncoder,\n} from \"./compressedEncode.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\ttype EncodedFieldBatchV1,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV2,\n\ttype EncodedValueShape,\n\tFieldBatchFormatVersion,\n\tSpecialField,\n} from \"./format/index.js\";\nimport { defaultIncrementalEncodingPolicy } from \"./incrementalEncodingPolicy.js\";\nimport { NodeShapeBasedEncoder } from \"./nodeEncoder.js\";\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk` using {@link FieldBatchFormatVersion.v1}.\n * @remarks See {@link schemaCompressedEncode} for more details.\n * This version does not support incremental encoding.\n */\nexport function schemaCompressedEncodeV1(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n): EncodedFieldBatchV1 {\n\tconst encoded: EncodedFieldBatchV1OrV2 = schemaCompressedEncode(\n\t\tschema,\n\t\tpolicy,\n\t\tfieldBatch,\n\t\tidCompressor,\n\t\tundefined /* incrementalEncoder */,\n\t\tbrand(FieldBatchFormatVersion.v1),\n\t);\n\t// Since incrementalEncoder was not provided, no V2 features should be used, and this cast should be safe.\n\treturn encoded as EncodedFieldBatchV1;\n}\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk` using {@link FieldBatchFormatVersion.v2}.\n * @remarks See {@link schemaCompressedEncode} for more details.\n * Incremental encoding is supported from this version onwards.\n */\nexport function schemaCompressedEncodeV2(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n): EncodedFieldBatchV2 {\n\treturn schemaCompressedEncode(\n\t\tschema,\n\t\tpolicy,\n\t\tfieldBatch,\n\t\tidCompressor,\n\t\tincrementalEncoder,\n\t\tbrand(FieldBatchFormatVersion.v2),\n\t);\n}\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk`.\n * @remarks\n * If `incrementalEncoder` is provided,\n * fields that support incremental encoding will encode their chunks separately via the `incrementalEncoder`.\n * See {@link IncrementalEncoder} for more details.\n *\n * Optimized for encoded size and encoding performance.\n * TODO: This function should eventually also take in the root FieldSchema to more efficiently compress the nodes.\n */\nfunction schemaCompressedEncode(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n\tversion: FieldBatchFormatVersion,\n): EncodedFieldBatchV1OrV2 {\n\treturn compressedEncode(\n\t\tfieldBatch,\n\t\tbuildContext(schema, policy, idCompressor, incrementalEncoder, version),\n\t);\n}\n\nexport function buildContext(\n\tstoredSchema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n\tversion: FieldBatchFormatVersion,\n): EncoderContext {\n\tconst context: EncoderContext = new EncoderContext(\n\t\t(fieldBuilder: FieldEncodeBuilder, schemaName: TreeNodeSchemaIdentifier) =>\n\t\t\tgetNodeEncoder(fieldBuilder, storedSchema, schemaName, incrementalEncoder),\n\t\t(nodeBuilder: NodeEncodeBuilder, fieldSchema: TreeFieldStoredSchema) =>\n\t\t\tgetFieldEncoder(nodeBuilder, fieldSchema, context, storedSchema),\n\t\tpolicy.fieldKinds,\n\t\tidCompressor,\n\t\tincrementalEncoder,\n\t\tversion,\n\t);\n\treturn context;\n}\n\n/**\n * Selects an encoder to use to encode fields.\n */\nexport function getFieldEncoder(\n\tnodeBuilder: NodeEncodeBuilder,\n\tfield: TreeFieldStoredSchema,\n\tcontext: EncoderContext,\n\tstoredSchema: StoredSchemaCollection,\n): FieldEncoder {\n\tconst kind = context.fieldShapes.get(field.kind) ?? fail(0xb52 /* missing FieldKind */);\n\tconst type = oneFromIterable(field.types);\n\tconst nodeEncoder =\n\t\ttype === undefined ? anyNodeEncoder : nodeBuilder.nodeEncoderFromSchema(type);\n\tif (kind.multiplicity === Multiplicity.Single) {\n\t\tif (field.kind === identifierFieldKindIdentifier) {\n\t\t\tassert(type !== undefined, 0x999 /* field type must be defined in identifier field */);\n\t\t\tconst nodeSchema = storedSchema.nodeSchema.get(type);\n\t\t\tassert(nodeSchema !== undefined, 0x99a /* nodeSchema must be defined */);\n\t\t\tassert(\n\t\t\t\tnodeSchema instanceof LeafNodeStoredSchema,\n\t\t\t\t0x99b /* nodeSchema must be LeafNodeStoredSchema */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tnodeSchema.leafValue === ValueSchema.String,\n\t\t\t\t0x99c /* identifier field can only be type string */,\n\t\t\t);\n\t\t\tconst identifierNodeEncoder = new NodeShapeBasedEncoder(\n\t\t\t\ttype,\n\t\t\t\tSpecialField.Identifier,\n\t\t\t\t[],\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn asFieldEncoder(identifierNodeEncoder);\n\t\t}\n\t\treturn asFieldEncoder(nodeEncoder);\n\t} else {\n\t\treturn context.nestedArrayEncoder(nodeEncoder);\n\t}\n}\n\n/**\n * Selects an encoder to use to encode nodes.\n */\nexport function getNodeEncoder(\n\tfieldBuilder: FieldEncodeBuilder,\n\tstoredSchema: StoredSchemaCollection,\n\tschemaName: TreeNodeSchemaIdentifier,\n\tincrementalEncoder?: IncrementalEncoder,\n): NodeShapeBasedEncoder {\n\tconst shouldEncodeIncrementally =\n\t\tincrementalEncoder?.shouldEncodeIncrementally ?? defaultIncrementalEncodingPolicy;\n\tconst schema =\n\t\tstoredSchema.nodeSchema.get(schemaName) ?? fail(0xb53 /* missing node schema */);\n\n\t// This handles both object and array nodes.\n\tif (schema instanceof ObjectNodeStoredSchema) {\n\t\t// TODO:Performance:\n\t\t// consider moving some optional and sequence fields to extra fields if they are commonly empty\n\t\t// to reduce encoded size.\n\t\tconst objectNodeFields: KeyedFieldEncoder[] = [];\n\t\tfor (const [key, field] of schema.objectNodeFields ?? []) {\n\t\t\tconst fieldEncoder = shouldEncodeIncrementally(schemaName, key)\n\t\t\t\t? incrementalFieldEncoder\n\t\t\t\t: fieldBuilder.fieldEncoderFromSchema(field);\n\t\t\tobjectNodeFields.push({\n\t\t\t\tkey,\n\t\t\t\tencoder: fieldEncoder,\n\t\t\t});\n\t\t}\n\n\t\tconst shape = new NodeShapeBasedEncoder(schemaName, false, objectNodeFields, undefined);\n\t\treturn shape;\n\t}\n\tif (schema instanceof LeafNodeStoredSchema) {\n\t\tconst shape = new NodeShapeBasedEncoder(\n\t\t\tschemaName,\n\t\t\tvalueShapeFromSchema(schema.leafValue),\n\t\t\t[],\n\t\t\tundefined,\n\t\t);\n\t\treturn shape;\n\t}\n\n\t// This handles both maps and record nodes.\n\tif (schema instanceof MapNodeStoredSchema) {\n\t\tconst fieldEncoder = shouldEncodeIncrementally(schemaName)\n\t\t\t? incrementalFieldEncoder\n\t\t\t: fieldBuilder.fieldEncoderFromSchema(schema.mapFields);\n\t\tconst shape = new NodeShapeBasedEncoder(schemaName, false, [], fieldEncoder);\n\t\treturn shape;\n\t}\n\tfail(0xb54 /* unsupported node kind */);\n}\n\nfunction valueShapeFromSchema(schema: ValueSchema | undefined): undefined | EncodedValueShape {\n\tswitch (schema) {\n\t\tcase undefined: {\n\t\t\treturn false;\n\t\t}\n\t\tcase ValueSchema.Number:\n\t\tcase ValueSchema.String:\n\t\tcase ValueSchema.Boolean:\n\t\tcase ValueSchema.FluidHandle: {\n\t\t\treturn true;\n\t\t}\n\t\tcase ValueSchema.Null: {\n\t\t\treturn [null];\n\t\t}\n\t\tdefault: {\n\t\t\tunreachableCase(schema);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"schemaBasedEncode.js","sourceRoot":"","sources":["../../../../src/feature-libraries/chunked-forest/codec/schemaBasedEncode.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, fail } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\ttype StoredSchemaCollection,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\tValueSchema,\n\tMultiplicity,\n\tidentifierFieldKindIdentifier,\n\ttype SchemaPolicy,\n} from \"../../../core/index.js\";\nimport { brand, oneFromIterable } from \"../../../util/index.js\";\n\nimport type { IncrementalEncoder } from \"./codecs.js\";\nimport {\n\tEncoderContext,\n\ttype FieldEncoder,\n\ttype FieldEncodeBuilder,\n\ttype KeyedFieldEncoder,\n\ttype NodeEncodeBuilder,\n\tanyNodeEncoder,\n\tasFieldEncoder,\n\tcompressedEncode,\n\tincrementalFieldEncoder,\n} from \"./compressedEncode.js\";\nimport type { FieldBatch } from \"./fieldBatch.js\";\nimport {\n\ttype EncodedFieldBatchV1,\n\ttype EncodedFieldBatchV1OrV2,\n\ttype EncodedFieldBatchV2,\n\ttype EncodedValueShape,\n\tFieldBatchFormatVersion,\n\tSpecialField,\n} from \"./format/index.js\";\nimport { defaultIncrementalEncodingPolicy } from \"./incrementalEncodingPolicy.js\";\nimport { NodeShapeBasedEncoder } from \"./nodeEncoder.js\";\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk` using {@link FieldBatchFormatVersion.v1}.\n * @remarks See {@link schemaCompressedEncode} for more details.\n * This version does not support incremental encoding.\n */\nexport function schemaCompressedEncodeV1(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n\t_incrementalEncoder: IncrementalEncoder | undefined,\n\tisSummary: boolean,\n): EncodedFieldBatchV1 {\n\tconst encoded: EncodedFieldBatchV1OrV2 = schemaCompressedEncode(\n\t\tschema,\n\t\tpolicy,\n\t\tfieldBatch,\n\t\tidCompressor,\n\t\tundefined /* incrementalEncoder */,\n\t\tbrand(FieldBatchFormatVersion.v1),\n\t\tisSummary,\n\t);\n\t// Since incrementalEncoder was not provided, no V2 features should be used, and this cast should be safe.\n\treturn encoded as EncodedFieldBatchV1;\n}\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk` using {@link FieldBatchFormatVersion.v2}.\n * @remarks See {@link schemaCompressedEncode} for more details.\n * Incremental encoding is supported from this version onwards.\n */\nexport function schemaCompressedEncodeV2(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n\tisSummary: boolean,\n): EncodedFieldBatchV2 {\n\treturn schemaCompressedEncode(\n\t\tschema,\n\t\tpolicy,\n\t\tfieldBatch,\n\t\tidCompressor,\n\t\tincrementalEncoder,\n\t\tbrand(FieldBatchFormatVersion.v2),\n\t\tisSummary,\n\t);\n}\n\n/**\n * Encode data from `fieldBatch` in into an `EncodedChunk`.\n * @remarks\n * If `incrementalEncoder` is provided,\n * fields that support incremental encoding will encode their chunks separately via the `incrementalEncoder`.\n * See {@link IncrementalEncoder} for more details.\n *\n * Optimized for encoded size and encoding performance.\n * TODO: This function should eventually also take in the root FieldSchema to more efficiently compress the nodes.\n */\nfunction schemaCompressedEncode(\n\tschema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tfieldBatch: FieldBatch,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n\tversion: FieldBatchFormatVersion,\n\tisSummary: boolean,\n): EncodedFieldBatchV1OrV2 {\n\treturn compressedEncode(\n\t\tfieldBatch,\n\t\tbuildContext(schema, policy, idCompressor, incrementalEncoder, version, isSummary),\n\t);\n}\n\nexport function buildContext(\n\tstoredSchema: StoredSchemaCollection,\n\tpolicy: SchemaPolicy,\n\tidCompressor: IIdCompressor,\n\tincrementalEncoder: IncrementalEncoder | undefined,\n\tversion: FieldBatchFormatVersion,\n\tisSummary: boolean,\n): EncoderContext {\n\tconst context: EncoderContext = new EncoderContext(\n\t\t(fieldBuilder: FieldEncodeBuilder, schemaName: TreeNodeSchemaIdentifier) =>\n\t\t\tgetNodeEncoder(fieldBuilder, storedSchema, schemaName, incrementalEncoder),\n\t\t(nodeBuilder: NodeEncodeBuilder, fieldSchema: TreeFieldStoredSchema) =>\n\t\t\tgetFieldEncoder(nodeBuilder, fieldSchema, context, storedSchema),\n\t\tpolicy.fieldKinds,\n\t\tidCompressor,\n\t\tincrementalEncoder,\n\t\tversion,\n\t\tisSummary,\n\t);\n\treturn context;\n}\n\n/**\n * Selects an encoder to use to encode fields.\n */\nexport function getFieldEncoder(\n\tnodeBuilder: NodeEncodeBuilder,\n\tfield: TreeFieldStoredSchema,\n\tcontext: EncoderContext,\n\tstoredSchema: StoredSchemaCollection,\n): FieldEncoder {\n\tconst kind = context.fieldShapes.get(field.kind) ?? fail(0xb52 /* missing FieldKind */);\n\tconst type = oneFromIterable(field.types);\n\tconst nodeEncoder =\n\t\ttype === undefined ? anyNodeEncoder : nodeBuilder.nodeEncoderFromSchema(type);\n\tif (kind.multiplicity === Multiplicity.Single) {\n\t\tif (field.kind === identifierFieldKindIdentifier) {\n\t\t\tassert(type !== undefined, 0x999 /* field type must be defined in identifier field */);\n\t\t\tconst nodeSchema = storedSchema.nodeSchema.get(type);\n\t\t\tassert(nodeSchema !== undefined, 0x99a /* nodeSchema must be defined */);\n\t\t\tassert(\n\t\t\t\tnodeSchema instanceof LeafNodeStoredSchema,\n\t\t\t\t0x99b /* nodeSchema must be LeafNodeStoredSchema */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tnodeSchema.leafValue === ValueSchema.String,\n\t\t\t\t0x99c /* identifier field can only be type string */,\n\t\t\t);\n\t\t\tconst identifierNodeEncoder = new NodeShapeBasedEncoder(\n\t\t\t\ttype,\n\t\t\t\tSpecialField.Identifier,\n\t\t\t\t[],\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn asFieldEncoder(identifierNodeEncoder);\n\t\t}\n\t\treturn asFieldEncoder(nodeEncoder);\n\t} else {\n\t\treturn context.nestedArrayEncoder(nodeEncoder);\n\t}\n}\n\n/**\n * Selects an encoder to use to encode nodes.\n */\nexport function getNodeEncoder(\n\tfieldBuilder: FieldEncodeBuilder,\n\tstoredSchema: StoredSchemaCollection,\n\tschemaName: TreeNodeSchemaIdentifier,\n\tincrementalEncoder?: IncrementalEncoder,\n): NodeShapeBasedEncoder {\n\tconst shouldEncodeIncrementally =\n\t\tincrementalEncoder?.shouldEncodeIncrementally ?? defaultIncrementalEncodingPolicy;\n\tconst schema =\n\t\tstoredSchema.nodeSchema.get(schemaName) ?? fail(0xb53 /* missing node schema */);\n\n\t// This handles both object and array nodes.\n\tif (schema instanceof ObjectNodeStoredSchema) {\n\t\t// TODO:Performance:\n\t\t// consider moving some optional and sequence fields to extra fields if they are commonly empty\n\t\t// to reduce encoded size.\n\t\tconst objectNodeFields: KeyedFieldEncoder[] = [];\n\t\tfor (const [key, field] of schema.objectNodeFields ?? []) {\n\t\t\tconst fieldEncoder = shouldEncodeIncrementally(schemaName, key)\n\t\t\t\t? incrementalFieldEncoder\n\t\t\t\t: fieldBuilder.fieldEncoderFromSchema(field);\n\t\t\tobjectNodeFields.push({\n\t\t\t\tkey,\n\t\t\t\tencoder: fieldEncoder,\n\t\t\t});\n\t\t}\n\n\t\tconst shape = new NodeShapeBasedEncoder(schemaName, false, objectNodeFields, undefined);\n\t\treturn shape;\n\t}\n\tif (schema instanceof LeafNodeStoredSchema) {\n\t\tconst shape = new NodeShapeBasedEncoder(\n\t\t\tschemaName,\n\t\t\tvalueShapeFromSchema(schema.leafValue),\n\t\t\t[],\n\t\t\tundefined,\n\t\t);\n\t\treturn shape;\n\t}\n\n\t// This handles both maps and record nodes.\n\tif (schema instanceof MapNodeStoredSchema) {\n\t\tconst fieldEncoder = shouldEncodeIncrementally(schemaName)\n\t\t\t? incrementalFieldEncoder\n\t\t\t: fieldBuilder.fieldEncoderFromSchema(schema.mapFields);\n\t\tconst shape = new NodeShapeBasedEncoder(schemaName, false, [], fieldEncoder);\n\t\treturn shape;\n\t}\n\tfail(0xb54 /* unsupported node kind */);\n}\n\nfunction valueShapeFromSchema(schema: ValueSchema | undefined): undefined | EncodedValueShape {\n\tswitch (schema) {\n\t\tcase undefined: {\n\t\t\treturn false;\n\t\t}\n\t\tcase ValueSchema.Number:\n\t\tcase ValueSchema.String:\n\t\tcase ValueSchema.Boolean:\n\t\tcase ValueSchema.FluidHandle: {\n\t\t\treturn true;\n\t\t}\n\t\tcase ValueSchema.Null: {\n\t\t\treturn [null];\n\t\t}\n\t\tdefault: {\n\t\t\tunreachableCase(schema);\n\t\t}\n\t}\n}\n"]}