@fluid-experimental/tree 0.59.2001 → 0.59.3000

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 (258) hide show
  1. package/.eslintrc.js +2 -0
  2. package/.vscode/SharedTree.code-workspace +15 -0
  3. package/.vscode/settings.json +6 -0
  4. package/dist/ChangeCompression.js +9 -9
  5. package/dist/ChangeCompression.js.map +1 -1
  6. package/dist/ChangeTypes.d.ts +1 -6
  7. package/dist/ChangeTypes.d.ts.map +1 -1
  8. package/dist/ChangeTypes.js +5 -5
  9. package/dist/ChangeTypes.js.map +1 -1
  10. package/dist/Checkout.js +14 -14
  11. package/dist/Checkout.js.map +1 -1
  12. package/dist/Common.d.ts +21 -3
  13. package/dist/Common.d.ts.map +1 -1
  14. package/dist/Common.js +29 -4
  15. package/dist/Common.js.map +1 -1
  16. package/dist/EditLog.js +26 -25
  17. package/dist/EditLog.js.map +1 -1
  18. package/dist/EditUtilities.js +17 -17
  19. package/dist/EditUtilities.js.map +1 -1
  20. package/dist/Forest.js +31 -31
  21. package/dist/Forest.js.map +1 -1
  22. package/dist/HistoryEditFactory.js +9 -9
  23. package/dist/HistoryEditFactory.js.map +1 -1
  24. package/dist/IdConversion.js +9 -9
  25. package/dist/IdConversion.js.map +1 -1
  26. package/dist/Identifiers.d.ts +4 -0
  27. package/dist/Identifiers.d.ts.map +1 -1
  28. package/dist/Identifiers.js.map +1 -1
  29. package/dist/LogViewer.d.ts +1 -5
  30. package/dist/LogViewer.d.ts.map +1 -1
  31. package/dist/LogViewer.js +11 -19
  32. package/dist/LogViewer.js.map +1 -1
  33. package/dist/MergeHealth.js +2 -2
  34. package/dist/MergeHealth.js.map +1 -1
  35. package/dist/NodeIdUtilities.js +2 -2
  36. package/dist/NodeIdUtilities.js.map +1 -1
  37. package/dist/PayloadUtilities.js +1 -1
  38. package/dist/PayloadUtilities.js.map +1 -1
  39. package/dist/RevisionValueCache.d.ts +13 -10
  40. package/dist/RevisionValueCache.d.ts.map +1 -1
  41. package/dist/RevisionValueCache.js +14 -11
  42. package/dist/RevisionValueCache.js.map +1 -1
  43. package/dist/RevisionView.js +4 -4
  44. package/dist/RevisionView.js.map +1 -1
  45. package/dist/SerializationUtilities.js +4 -4
  46. package/dist/SerializationUtilities.js.map +1 -1
  47. package/dist/SharedTree.d.ts +93 -31
  48. package/dist/SharedTree.d.ts.map +1 -1
  49. package/dist/SharedTree.js +160 -131
  50. package/dist/SharedTree.js.map +1 -1
  51. package/dist/SharedTreeEncoder.d.ts +3 -3
  52. package/dist/SharedTreeEncoder.d.ts.map +1 -1
  53. package/dist/SharedTreeEncoder.js +36 -36
  54. package/dist/SharedTreeEncoder.js.map +1 -1
  55. package/dist/StringInterner.js +1 -1
  56. package/dist/StringInterner.js.map +1 -1
  57. package/dist/Summary.js +1 -1
  58. package/dist/Summary.js.map +1 -1
  59. package/dist/SummaryBackCompatibility.js +8 -8
  60. package/dist/SummaryBackCompatibility.js.map +1 -1
  61. package/dist/Transaction.js +1 -1
  62. package/dist/Transaction.js.map +1 -1
  63. package/dist/TransactionInternal.js +17 -17
  64. package/dist/TransactionInternal.js.map +1 -1
  65. package/dist/TreeCompressor.d.ts.map +1 -1
  66. package/dist/TreeCompressor.js +6 -8
  67. package/dist/TreeCompressor.js.map +1 -1
  68. package/dist/TreeNodeHandle.js +4 -4
  69. package/dist/TreeNodeHandle.js.map +1 -1
  70. package/dist/TreeView.js +7 -7
  71. package/dist/TreeView.js.map +1 -1
  72. package/dist/TreeViewUtilities.js +2 -2
  73. package/dist/TreeViewUtilities.js.map +1 -1
  74. package/dist/UndoRedoHandler.js +1 -1
  75. package/dist/UndoRedoHandler.js.map +1 -1
  76. package/dist/UuidUtilities.d.ts +30 -0
  77. package/dist/UuidUtilities.d.ts.map +1 -0
  78. package/dist/UuidUtilities.js +106 -0
  79. package/dist/UuidUtilities.js.map +1 -0
  80. package/dist/id-compressor/AppendOnlySortedMap.d.ts +52 -28
  81. package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  82. package/dist/id-compressor/AppendOnlySortedMap.js +167 -90
  83. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
  84. package/dist/id-compressor/IdCompressor.d.ts +43 -42
  85. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  86. package/dist/id-compressor/IdCompressor.js +179 -177
  87. package/dist/id-compressor/IdCompressor.js.map +1 -1
  88. package/dist/id-compressor/IdRange.js +1 -1
  89. package/dist/id-compressor/IdRange.js.map +1 -1
  90. package/dist/id-compressor/NumericUuid.d.ts +6 -14
  91. package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
  92. package/dist/id-compressor/NumericUuid.js +15 -76
  93. package/dist/id-compressor/NumericUuid.js.map +1 -1
  94. package/dist/id-compressor/SessionIdNormalizer.d.ts +122 -0
  95. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
  96. package/dist/id-compressor/SessionIdNormalizer.js +418 -0
  97. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -0
  98. package/dist/id-compressor/persisted-types/0.0.1.d.ts +6 -13
  99. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  100. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
  101. package/dist/index.d.ts +2 -2
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js.map +1 -1
  104. package/dist/persisted-types/0.1.1.d.ts +1 -6
  105. package/dist/persisted-types/0.1.1.d.ts.map +1 -1
  106. package/dist/persisted-types/0.1.1.js +3 -3
  107. package/dist/persisted-types/0.1.1.js.map +1 -1
  108. package/lib/ChangeTypes.d.ts +1 -6
  109. package/lib/ChangeTypes.d.ts.map +1 -1
  110. package/lib/Checkout.js.map +1 -1
  111. package/lib/Common.d.ts +21 -3
  112. package/lib/Common.d.ts.map +1 -1
  113. package/lib/Common.js +25 -3
  114. package/lib/Common.js.map +1 -1
  115. package/lib/EditLog.js +2 -1
  116. package/lib/EditLog.js.map +1 -1
  117. package/lib/EditUtilities.js.map +1 -1
  118. package/lib/Forest.js.map +1 -1
  119. package/lib/HistoryEditFactory.js.map +1 -1
  120. package/lib/Identifiers.d.ts +4 -0
  121. package/lib/Identifiers.d.ts.map +1 -1
  122. package/lib/Identifiers.js.map +1 -1
  123. package/lib/LogViewer.d.ts +1 -5
  124. package/lib/LogViewer.d.ts.map +1 -1
  125. package/lib/LogViewer.js +5 -13
  126. package/lib/LogViewer.js.map +1 -1
  127. package/lib/MergeHealth.js.map +1 -1
  128. package/lib/NodeIdUtilities.js.map +1 -1
  129. package/lib/RevisionValueCache.d.ts +13 -10
  130. package/lib/RevisionValueCache.d.ts.map +1 -1
  131. package/lib/RevisionValueCache.js +10 -7
  132. package/lib/RevisionValueCache.js.map +1 -1
  133. package/lib/RevisionView.js.map +1 -1
  134. package/lib/SharedTree.d.ts +93 -31
  135. package/lib/SharedTree.d.ts.map +1 -1
  136. package/lib/SharedTree.js +107 -78
  137. package/lib/SharedTree.js.map +1 -1
  138. package/lib/SharedTreeEncoder.d.ts +3 -3
  139. package/lib/SharedTreeEncoder.d.ts.map +1 -1
  140. package/lib/SharedTreeEncoder.js +4 -4
  141. package/lib/SharedTreeEncoder.js.map +1 -1
  142. package/lib/StringInterner.js.map +1 -1
  143. package/lib/Summary.js.map +1 -1
  144. package/lib/TreeCompressor.d.ts.map +1 -1
  145. package/lib/TreeCompressor.js +1 -3
  146. package/lib/TreeCompressor.js.map +1 -1
  147. package/lib/TreeNodeHandle.js.map +1 -1
  148. package/lib/TreeView.js.map +1 -1
  149. package/lib/TreeViewUtilities.js.map +1 -1
  150. package/lib/UuidUtilities.d.ts +30 -0
  151. package/lib/UuidUtilities.d.ts.map +1 -0
  152. package/lib/UuidUtilities.js +98 -0
  153. package/lib/UuidUtilities.js.map +1 -0
  154. package/lib/id-compressor/AppendOnlySortedMap.d.ts +52 -28
  155. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  156. package/lib/id-compressor/AppendOnlySortedMap.js +165 -88
  157. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
  158. package/lib/id-compressor/IdCompressor.d.ts +43 -42
  159. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  160. package/lib/id-compressor/IdCompressor.js +97 -95
  161. package/lib/id-compressor/IdCompressor.js.map +1 -1
  162. package/lib/id-compressor/NumericUuid.d.ts +6 -14
  163. package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
  164. package/lib/id-compressor/NumericUuid.js +11 -70
  165. package/lib/id-compressor/NumericUuid.js.map +1 -1
  166. package/lib/id-compressor/SessionIdNormalizer.d.ts +122 -0
  167. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
  168. package/lib/id-compressor/SessionIdNormalizer.js +414 -0
  169. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -0
  170. package/lib/id-compressor/persisted-types/0.0.1.d.ts +6 -13
  171. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  172. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
  173. package/lib/index.d.ts +2 -2
  174. package/lib/index.d.ts.map +1 -1
  175. package/lib/index.js.map +1 -1
  176. package/lib/persisted-types/0.1.1.d.ts +1 -6
  177. package/lib/persisted-types/0.1.1.d.ts.map +1 -1
  178. package/lib/persisted-types/0.1.1.js.map +1 -1
  179. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +6 -0
  180. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +1 -0
  181. package/lib/test/AppendOnlySortedMap.perf.tests.js +49 -0
  182. package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -0
  183. package/lib/test/AppendOnlySortedMap.tests.js +56 -14
  184. package/lib/test/AppendOnlySortedMap.tests.js.map +1 -1
  185. package/lib/test/Checkout.tests.js +2 -2
  186. package/lib/test/Checkout.tests.js.map +1 -1
  187. package/lib/test/Forest.tests.js.map +1 -1
  188. package/lib/test/IdCompressor.perf.tests.js +8 -2
  189. package/lib/test/IdCompressor.perf.tests.js.map +1 -1
  190. package/lib/test/IdCompressor.tests.js +75 -24
  191. package/lib/test/IdCompressor.tests.js.map +1 -1
  192. package/lib/test/LogViewer.tests.js +3 -5
  193. package/lib/test/LogViewer.tests.js.map +1 -1
  194. package/lib/test/NumericUuid.perf.tests.js +4 -4
  195. package/lib/test/NumericUuid.perf.tests.js.map +1 -1
  196. package/lib/test/NumericUuid.tests.js +5 -4
  197. package/lib/test/NumericUuid.tests.js.map +1 -1
  198. package/lib/test/RevisionValueCache.tests.js.map +1 -1
  199. package/lib/test/RevisionView.tests.js.map +1 -1
  200. package/lib/test/SessionIdNormalizer.tests.d.ts +6 -0
  201. package/lib/test/SessionIdNormalizer.tests.d.ts.map +1 -0
  202. package/lib/test/SessionIdNormalizer.tests.js +299 -0
  203. package/lib/test/SessionIdNormalizer.tests.js.map +1 -0
  204. package/lib/test/Summary.tests.js +1 -1
  205. package/lib/test/Summary.tests.js.map +1 -1
  206. package/lib/test/TreeCompression.tests.js +1 -1
  207. package/lib/test/TreeCompression.tests.js.map +1 -1
  208. package/lib/test/Virtualization.tests.js +1 -1
  209. package/lib/test/Virtualization.tests.js.map +1 -1
  210. package/lib/test/fuzz/Generators.d.ts +3 -14
  211. package/lib/test/fuzz/Generators.d.ts.map +1 -1
  212. package/lib/test/fuzz/Generators.js +60 -151
  213. package/lib/test/fuzz/Generators.js.map +1 -1
  214. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +10 -7
  215. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
  216. package/lib/test/fuzz/SharedTreeFuzzTests.js +94 -104
  217. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
  218. package/lib/test/fuzz/Types.d.ts +2 -9
  219. package/lib/test/fuzz/Types.d.ts.map +1 -1
  220. package/lib/test/fuzz/Types.js +1 -1
  221. package/lib/test/fuzz/Types.js.map +1 -1
  222. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +57 -11
  223. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
  224. package/lib/test/utilities/IdCompressorTestUtilities.js +112 -98
  225. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
  226. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
  227. package/lib/test/utilities/PendingLocalStateTests.js +2 -1
  228. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
  229. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  230. package/lib/test/utilities/SharedTreeTests.js +30 -1
  231. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  232. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
  233. package/lib/test/utilities/SharedTreeVersioningTests.js +20 -0
  234. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
  235. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -1
  236. package/lib/test/utilities/SummaryLoadPerfTests.js +6 -3
  237. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
  238. package/lib/test/utilities/TestNode.js.map +1 -1
  239. package/lib/test/utilities/TestUtilities.d.ts +9 -1
  240. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  241. package/lib/test/utilities/TestUtilities.js +27 -13
  242. package/lib/test/utilities/TestUtilities.js.map +1 -1
  243. package/package.json +19 -17
  244. package/src/Common.ts +42 -4
  245. package/src/EditLog.ts +1 -1
  246. package/src/Identifiers.ts +5 -0
  247. package/src/LogViewer.ts +4 -20
  248. package/src/RevisionValueCache.ts +11 -8
  249. package/src/SharedTree.ts +222 -75
  250. package/src/SharedTreeEncoder.ts +17 -11
  251. package/src/TreeCompressor.ts +2 -4
  252. package/src/UuidUtilities.ts +123 -0
  253. package/src/id-compressor/AppendOnlySortedMap.ts +183 -94
  254. package/src/id-compressor/IdCompressor.ts +144 -132
  255. package/src/id-compressor/NumericUuid.ts +11 -80
  256. package/src/id-compressor/SessionIdNormalizer.ts +497 -0
  257. package/src/id-compressor/persisted-types/0.0.1.ts +12 -15
  258. package/src/index.ts +5 -0
@@ -39,7 +39,7 @@ class SharedTreeEncoder_0_1_1 {
39
39
  // IFluidHandles are not allowed in Ops.
40
40
  // Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.
41
41
  // So replace the handles by encoding before sending:
42
- const semiSerialized = fluidSerialize(ChangeCompression_1.compressEdit(this.changeCompressor, interner, NodeIdUtilities_1.scopeIdNormalizer(idNormalizer, idRange.sessionId), edit));
42
+ const semiSerialized = fluidSerialize((0, ChangeCompression_1.compressEdit)(this.changeCompressor, interner, (0, NodeIdUtilities_1.scopeIdNormalizer)(idNormalizer, idRange.sessionId), edit));
43
43
  return {
44
44
  type: persisted_types_1.SharedTreeOpType.Edit,
45
45
  edit: semiSerialized,
@@ -57,7 +57,7 @@ class SharedTreeEncoder_0_1_1 {
57
57
  decodeEditOp(op, fluidDeserialize, idNormalizer, interner) {
58
58
  const { edit: semiSerializedEdit } = op;
59
59
  const parsedEdit = fluidDeserialize(semiSerializedEdit);
60
- return ChangeCompression_1.decompressEdit(this.changeCompressor, interner, NodeIdUtilities_1.scopeIdNormalizer(idNormalizer, op.idRange.sessionId), parsedEdit);
60
+ return (0, ChangeCompression_1.decompressEdit)(this.changeCompressor, interner, (0, NodeIdUtilities_1.scopeIdNormalizer)(idNormalizer, op.idRange.sessionId), parsedEdit);
61
61
  }
62
62
  /**
63
63
  * Encodes a summary.
@@ -73,20 +73,20 @@ class SharedTreeEncoder_0_1_1 {
73
73
  /**
74
74
  * Decodes an encoded summary.
75
75
  */
76
- decodeSummary({ editHistory, currentTree: compressedTree, internedStrings, idCompressor: serializedIdCompressor, version, }) {
77
- Common_1.assert(version === persisted_types_1.WriteFormat.v0_1_1, `Invalid summary version to decode: ${version}, expected: 0.1.1`);
78
- Common_1.assert(typeof editHistory === 'object', '0.1.1 summary encountered with non-object edit history.');
79
- const idCompressor = id_compressor_1.hasOngoingSession(serializedIdCompressor)
76
+ decodeSummary({ editHistory, currentTree: compressedTree, internedStrings, idCompressor: serializedIdCompressor, version, }, attributionId) {
77
+ (0, Common_1.assert)(version === persisted_types_1.WriteFormat.v0_1_1, `Invalid summary version to decode: ${version}, expected: 0.1.1`);
78
+ (0, Common_1.assert)(typeof editHistory === 'object', '0.1.1 summary encountered with non-object edit history.');
79
+ const idCompressor = (0, id_compressor_1.hasOngoingSession)(serializedIdCompressor)
80
80
  ? id_compressor_1.IdCompressor.deserialize(serializedIdCompressor)
81
- : id_compressor_1.IdCompressor.deserialize(serializedIdCompressor, id_compressor_1.createSessionId()); // TODO attribution
81
+ : id_compressor_1.IdCompressor.deserialize(serializedIdCompressor, (0, id_compressor_1.createSessionId)(), attributionId);
82
82
  const interner = new StringInterner_1.MutableStringInterner(internedStrings);
83
- const sequencedNormalizer = NodeIdUtilities_1.sequencedIdNormalizer(NodeIdUtilities_1.getNodeIdContext(idCompressor));
83
+ const sequencedNormalizer = (0, NodeIdUtilities_1.sequencedIdNormalizer)((0, NodeIdUtilities_1.getNodeIdContext)(idCompressor));
84
84
  const decompressedTree = compressedTree !== undefined
85
85
  ? this.treeCompressor.decompress(compressedTree, interner, sequencedNormalizer)
86
86
  : undefined;
87
87
  const { editChunks, editIds } = editHistory;
88
- Common_1.assert(editChunks !== undefined, 'Missing editChunks on 0.1.1 summary.');
89
- Common_1.assert(editIds !== undefined, 'Missing editIds on 0.1.1 summary.');
88
+ (0, Common_1.assert)(editChunks !== undefined, 'Missing editChunks on 0.1.1 summary.');
89
+ (0, Common_1.assert)(editIds !== undefined, 'Missing editIds on 0.1.1 summary.');
90
90
  const uncompressedChunks = editChunks.map(({ startRevision, chunk }) => ({
91
91
  startRevision,
92
92
  chunk: isEditHandle(chunk)
@@ -100,7 +100,7 @@ class SharedTreeEncoder_0_1_1 {
100
100
  },
101
101
  baseHandle: chunk,
102
102
  }
103
- : chunk.map((edit) => ChangeCompression_1.decompressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)),
103
+ : chunk.map((edit) => (0, ChangeCompression_1.decompressEdit)(this.changeCompressor, interner, sequencedNormalizer, edit)),
104
104
  }));
105
105
  return {
106
106
  currentTree: decompressedTree,
@@ -115,7 +115,7 @@ class SharedTreeEncoder_0_1_1 {
115
115
  * Writes summary format 0.1.1 which does not store the currentView for no history summaries.
116
116
  */
117
117
  noHistorySummarizer(_edits, currentView, idContext, idNormalizer, interner, serializedIdCompressor) {
118
- const currentTree = SerializationUtilities_1.getChangeNodeFromView(currentView);
118
+ const currentTree = (0, SerializationUtilities_1.getChangeNodeFromView)(currentView);
119
119
  const initialTreeId = idContext.convertToNodeId(InitialTree_1.initialTree.identifier);
120
120
  const changes = [];
121
121
  // Generate a set of changes to set the root node's children to that of the root in the currentTree
@@ -126,9 +126,9 @@ class SharedTreeEncoder_0_1_1 {
126
126
  if (currentTree.payload !== undefined) {
127
127
  changes.push(persisted_types_1.ChangeInternal.setPayload(initialTreeId, currentTree.payload));
128
128
  }
129
- Common_1.assert(currentTree.identifier === initialTreeId && currentTree.definition === InitialTree_1.initialTree.definition, 'root definition and identifier should be immutable.');
130
- const edit = EditUtilities_1.newEdit(changes);
131
- const compressedChanges = edit.changes.map((change) => this.changeCompressor.compress(change, interner, NodeIdUtilities_1.sequencedIdNormalizer(idNormalizer)));
129
+ (0, Common_1.assert)(currentTree.identifier === initialTreeId && currentTree.definition === InitialTree_1.initialTree.definition, 'root definition and identifier should be immutable.');
130
+ const edit = (0, EditUtilities_1.newEdit)(changes);
131
+ const compressedChanges = edit.changes.map((change) => this.changeCompressor.compress(change, interner, (0, NodeIdUtilities_1.sequencedIdNormalizer)(idNormalizer)));
132
132
  return {
133
133
  editHistory: {
134
134
  editChunks: [{ startRevision: 0, chunk: [{ changes: compressedChanges }] }],
@@ -144,26 +144,26 @@ class SharedTreeEncoder_0_1_1 {
144
144
  * and string interning and tree compression will be applied.
145
145
  */
146
146
  fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor) {
147
- const sequencedNormalizer = NodeIdUtilities_1.sequencedIdNormalizer(idNormalizer);
148
- const currentTree = this.treeCompressor.compress(SerializationUtilities_1.getChangeNodeFromView(currentView), interner, sequencedNormalizer);
147
+ const sequencedNormalizer = (0, NodeIdUtilities_1.sequencedIdNormalizer)(idNormalizer);
148
+ const currentTree = this.treeCompressor.compress((0, SerializationUtilities_1.getChangeNodeFromView)(currentView), interner, sequencedNormalizer);
149
149
  return {
150
150
  currentTree,
151
- editHistory: edits.getEditLogSummary((edit) => ChangeCompression_1.compressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)),
151
+ editHistory: edits.getEditLogSummary((edit) => (0, ChangeCompression_1.compressEdit)(this.changeCompressor, interner, sequencedNormalizer, edit)),
152
152
  version: persisted_types_1.WriteFormat.v0_1_1,
153
153
  internedStrings: interner.getSerializable(),
154
154
  idCompressor: serializedIdCompressor,
155
155
  };
156
156
  }
157
157
  encodeEditChunk(edits, idNormalizer, interner) {
158
- const compressedEdits = edits.map((edit) => ChangeCompression_1.compressEdit(this.changeCompressor, interner, idNormalizer, edit));
158
+ const compressedEdits = edits.map((edit) => (0, ChangeCompression_1.compressEdit)(this.changeCompressor, interner, idNormalizer, edit));
159
159
  return {
160
160
  version: persisted_types_1.WriteFormat.v0_1_1,
161
161
  edits: compressedEdits,
162
162
  };
163
163
  }
164
164
  decodeEditChunk(contents, idNormalizer, interner) {
165
- Common_1.assert(contents.version === persisted_types_1.WriteFormat.v0_1_1, `Invalid editChunk to decode: ${contents.version}. Expected 0.1.1.`);
166
- return contents.edits.map((edit) => ChangeCompression_1.decompressEdit(this.changeCompressor, interner, idNormalizer, edit));
165
+ (0, Common_1.assert)(contents.version === persisted_types_1.WriteFormat.v0_1_1, `Invalid editChunk to decode: ${contents.version}. Expected 0.1.1.`);
166
+ return contents.edits.map((edit) => (0, ChangeCompression_1.decompressEdit)(this.changeCompressor, interner, idNormalizer, edit));
167
167
  }
168
168
  }
169
169
  exports.SharedTreeEncoder_0_1_1 = SharedTreeEncoder_0_1_1;
@@ -186,7 +186,7 @@ class SharedTreeEncoder_0_0_2 {
186
186
  // IFluidHandles are not allowed in Ops.
187
187
  // Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.
188
188
  // So replace the handles by encoding before sending:
189
- const semiSerialized = fluidSerialize(IdConversion_1.convertEditIds(edit, (id) => idConverter.convertToStableNodeId(id)));
189
+ const semiSerialized = fluidSerialize((0, IdConversion_1.convertEditIds)(edit, (id) => idConverter.convertToStableNodeId(id)));
190
190
  return {
191
191
  type: persisted_types_1.SharedTreeOpType.Edit,
192
192
  edit: semiSerialized,
@@ -203,7 +203,7 @@ class SharedTreeEncoder_0_0_2 {
203
203
  decodeEditOp(op, fluidDeserialize, idGenerator) {
204
204
  const { edit: semiSerializedEdit } = op;
205
205
  const parsedEdit = fluidDeserialize(semiSerializedEdit);
206
- return IdConversion_1.convertEditIds(parsedEdit, (id) => idGenerator.generateNodeId(id));
206
+ return (0, IdConversion_1.convertEditIds)(parsedEdit, (id) => idGenerator.generateNodeId(id));
207
207
  }
208
208
  /**
209
209
  * Encodes a summary.
@@ -219,19 +219,19 @@ class SharedTreeEncoder_0_0_2 {
219
219
  /**
220
220
  * Decodes an encoded summary.
221
221
  */
222
- decodeSummary({ currentTree, sequencedEdits }) {
223
- Common_1.assert(sequencedEdits !== undefined, '0.0.2 summary encountered with missing sequencedEdits field.');
224
- const idCompressor = new id_compressor_1.IdCompressor(id_compressor_1.createSessionId(), persisted_types_1.reservedIdCount);
225
- const idGenerator = NodeIdUtilities_1.getNodeIdContext(idCompressor);
222
+ decodeSummary({ currentTree, sequencedEdits }, attributionId) {
223
+ (0, Common_1.assert)(sequencedEdits !== undefined, '0.0.2 summary encountered with missing sequencedEdits field.');
224
+ const idCompressor = new id_compressor_1.IdCompressor((0, id_compressor_1.createSessionId)(), persisted_types_1.reservedIdCount, attributionId);
225
+ const idGenerator = (0, NodeIdUtilities_1.getNodeIdContext)(idCompressor);
226
226
  const generateId = (id) => idGenerator.generateNodeId(id);
227
227
  // This saves all of the edits in the summary as part of the first chunk.
228
228
  const temporaryLog = new EditLog_1.EditLog();
229
- sequencedEdits.forEach((edit) => temporaryLog.addSequencedEdit(IdConversion_1.convertEditIds(edit, generateId), {
229
+ sequencedEdits.forEach((edit) => temporaryLog.addSequencedEdit((0, IdConversion_1.convertEditIds)(edit, generateId), {
230
230
  sequenceNumber: 1,
231
231
  referenceSequenceNumber: 0,
232
232
  }));
233
233
  return {
234
- currentTree: EditUtilities_1.convertTreeNodes(currentTree, (node) => IdConversion_1.convertNodeDataIds(node, generateId)),
234
+ currentTree: (0, EditUtilities_1.convertTreeNodes)(currentTree, (node) => (0, IdConversion_1.convertNodeDataIds)(node, generateId)),
235
235
  idCompressor,
236
236
  interner: new StringInterner_1.MutableStringInterner(),
237
237
  // This cast is valid because we just constructed this log and gave it only in-session edits.
@@ -244,7 +244,7 @@ class SharedTreeEncoder_0_0_2 {
244
244
  * @param stable - Generates the single edit with a stable edit ID. False by default, used for testing.
245
245
  */
246
246
  noHistorySummarizer(_edits, currentView, idConverter) {
247
- const currentTree = SerializationUtilities_1.getChangeNode_0_0_2FromView(currentView, idConverter);
247
+ const currentTree = (0, SerializationUtilities_1.getChangeNode_0_0_2FromView)(currentView, idConverter);
248
248
  const changes = [];
249
249
  // Generate a set of changes to set the root node's children to that of the root in the currentTree
250
250
  Object.entries(currentTree.traits).forEach(([label, children]) => {
@@ -265,8 +265,8 @@ class SharedTreeEncoder_0_0_2 {
265
265
  payload: currentTree.payload,
266
266
  });
267
267
  }
268
- Common_1.assert(currentTree.identifier === InitialTree_1.initialTree.identifier && currentTree.definition === InitialTree_1.initialTree.definition, 'root definition and identifier should be immutable.');
269
- const edit = EditUtilities_1.newEdit(changes);
268
+ (0, Common_1.assert)(currentTree.identifier === InitialTree_1.initialTree.identifier && currentTree.definition === InitialTree_1.initialTree.definition, 'root definition and identifier should be immutable.');
269
+ const edit = (0, EditUtilities_1.newEdit)(changes);
270
270
  return {
271
271
  currentTree,
272
272
  sequencedEdits: [
@@ -287,20 +287,20 @@ class SharedTreeEncoder_0_0_2 {
287
287
  let idIndex = 0;
288
288
  editChunks.forEach(({ chunk }) => {
289
289
  if (isEditHandle(chunk)) {
290
- Common_1.fail('Cannot write handles to summary version 0.0.2');
290
+ (0, Common_1.fail)('Cannot write handles to summary version 0.0.2');
291
291
  }
292
292
  else {
293
293
  chunk.forEach(({ changes }) => {
294
294
  var _a;
295
- sequencedEdits.push(IdConversion_1.convertEditIds({
295
+ sequencedEdits.push((0, IdConversion_1.convertEditIds)({
296
296
  changes,
297
- id: (_a = editIds[idIndex++]) !== null && _a !== void 0 ? _a : Common_1.fail('Number of edits should match number of edit IDs.'),
297
+ id: (_a = editIds[idIndex++]) !== null && _a !== void 0 ? _a : (0, Common_1.fail)('Number of edits should match number of edit IDs.'),
298
298
  }, (id) => idConverter.convertToStableNodeId(id)));
299
299
  });
300
300
  }
301
301
  });
302
302
  return {
303
- currentTree: SerializationUtilities_1.getChangeNode_0_0_2FromView(currentView, idConverter),
303
+ currentTree: (0, SerializationUtilities_1.getChangeNode_0_0_2FromView)(currentView, idConverter),
304
304
  sequencedEdits,
305
305
  version: persisted_types_1.WriteFormat.v0_0_2,
306
306
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeEncoder.js","sourceRoot":"","sources":["../src/SharedTreeEncoder.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 { IsoBuffer } from '@fluidframework/common-utils';\nimport { assert, fail } from './Common';\nimport { EditLog } from './EditLog';\nimport { convertTreeNodes, newEdit } from './EditUtilities';\nimport { DetachedSequenceId, FinalNodeId, OpSpaceNodeId, TraitLabel } from './Identifiers';\nimport { initialTree } from './InitialTree';\nimport {\n\tContextualizedNodeIdNormalizer,\n\tgetNodeIdContext,\n\tNodeIdContext,\n\tNodeIdConverter,\n\tNodeIdGenerator,\n\tNodeIdNormalizer,\n\tscopeIdNormalizer,\n\tsequencedIdNormalizer,\n} from './NodeIdUtilities';\nimport { getChangeNodeFromView, getChangeNode_0_0_2FromView } from './SerializationUtilities';\nimport {\n\tCompressedChangeInternal,\n\tChangeInternal,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n\tChangeNode,\n\tEdit,\n\tSharedTreeEditOp,\n\tSharedTreeOpType,\n\tSharedTreeSummary,\n\tEditWithoutId,\n\tChangeTypeInternal,\n\tChangeInternal_0_0_2,\n\tSharedTreeEditOp_0_0_2,\n\treservedIdCount,\n\tChangeNode_0_0_2,\n\tEditChunkContents,\n\tEditLogSummary,\n\tEditChunkContents_0_1_1,\n\tFluidEditHandle,\n\tStablePlaceInternal,\n\tSide,\n} from './persisted-types';\nimport { RevisionView } from './RevisionView';\nimport { MutableStringInterner, StringInterner } from './StringInterner';\nimport { SummaryContents } from './Summary';\nimport { InterningTreeCompressor } from './TreeCompressor';\nimport {\n\tcreateSessionId,\n\thasOngoingSession,\n\tIdCompressor,\n\tIdCreationRange,\n\tSerializedIdCompressorWithNoSession,\n} from './id-compressor';\nimport { ChangeCompressor, compressEdit, decompressEdit } from './ChangeCompression';\nimport { convertEditIds, convertNodeDataIds } from './IdConversion';\n\n/**\n * Object capable of converting between the current internal representation for 0.1.1 edits and their wire format.\n * @internal\n */\nexport class SharedTreeEncoder_0_1_1 {\n\tprivate readonly treeCompressor = new InterningTreeCompressor<never>();\n\tprivate readonly changeCompressor = new ChangeCompressor(this.treeCompressor);\n\n\tpublic constructor(private readonly summarizeHistory: boolean) {}\n\n\t/**\n\t * Encodes an edit op to be sent.\n\t * @param edit - edit to encode.\n\t * @param fluidSerialize - Callback which serializes Fluid handles contained in a JSON-serializable object, returning the result.\n\t * Should be invoked on the edit contents at some point before op encoding is complete.\n\t * This is because edit contents may have Payloads needing to be serialized.\n\t */\n\tpublic encodeEditOp(\n\t\tedit: Edit<ChangeInternal>,\n\t\tfluidSerialize: (\n\t\t\tedit: Edit<CompressedChangeInternal<OpSpaceNodeId>>\n\t\t) => Edit<CompressedChangeInternal<OpSpaceNodeId>>,\n\t\tidRange: IdCreationRange,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner\n\t): SharedTreeEditOp {\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles by encoding before sending:\n\t\tconst semiSerialized = fluidSerialize(\n\t\t\tcompressEdit(this.changeCompressor, interner, scopeIdNormalizer(idNormalizer, idRange.sessionId), edit)\n\t\t);\n\n\t\treturn {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit: semiSerialized,\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tidRange,\n\t\t};\n\t}\n\n\t/**\n\t * Decodes an edit op encoded with `encodeEditOp`.\n\t * @param op - op to decode.\n\t * @param fluidDeserialize - Callback which deserializes Fluid handles contained in a JSON-serializable object.\n\t * Should be invoked on the semi-serialized edit contents at some point before decoding is complete.\n\t * This will rehydrate any serialized Fluid handles into usable IFluidHandle objects.\n\t */\n\tpublic decodeEditOp(\n\t\top: SharedTreeEditOp,\n\t\tfluidDeserialize: (\n\t\t\tsemiSerializedEdit: Edit<CompressedChangeInternal<OpSpaceNodeId>>\n\t\t) => Edit<CompressedChangeInternal<OpSpaceNodeId>>,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner\n\t): Edit<ChangeInternal> {\n\t\tconst { edit: semiSerializedEdit } = op;\n\t\tconst parsedEdit = fluidDeserialize(semiSerializedEdit);\n\t\treturn decompressEdit(\n\t\t\tthis.changeCompressor,\n\t\t\tinterner,\n\t\t\tscopeIdNormalizer(idNormalizer, op.idRange.sessionId),\n\t\t\tparsedEdit\n\t\t);\n\t}\n\n\t/**\n\t * Encodes a summary.\n\t */\n\tpublic encodeSummary(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidContext: NodeIdContext,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tif (this.summarizeHistory) {\n\t\t\treturn this.fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor);\n\t\t} else {\n\t\t\treturn this.noHistorySummarizer(\n\t\t\t\tedits,\n\t\t\t\tcurrentView,\n\t\t\t\tidContext,\n\t\t\t\tidNormalizer,\n\t\t\t\tinterner,\n\t\t\t\tserializedIdCompressor\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Decodes an encoded summary.\n\t */\n\tpublic decodeSummary({\n\t\teditHistory,\n\t\tcurrentTree: compressedTree,\n\t\tinternedStrings,\n\t\tidCompressor: serializedIdCompressor,\n\t\tversion,\n\t}: SharedTreeSummary): SummaryContents {\n\t\tassert(version === WriteFormat.v0_1_1, `Invalid summary version to decode: ${version}, expected: 0.1.1`);\n\t\tassert(typeof editHistory === 'object', '0.1.1 summary encountered with non-object edit history.');\n\n\t\tconst idCompressor = hasOngoingSession(serializedIdCompressor)\n\t\t\t? IdCompressor.deserialize(serializedIdCompressor)\n\t\t\t: IdCompressor.deserialize(serializedIdCompressor, createSessionId()); // TODO attribution\n\n\t\tconst interner = new MutableStringInterner(internedStrings);\n\t\tconst sequencedNormalizer = sequencedIdNormalizer(getNodeIdContext(idCompressor));\n\t\tconst decompressedTree: ChangeNode | undefined =\n\t\t\tcompressedTree !== undefined\n\t\t\t\t? this.treeCompressor.decompress(compressedTree, interner, sequencedNormalizer)\n\t\t\t\t: undefined;\n\t\tconst { editChunks, editIds } = editHistory;\n\t\tassert(editChunks !== undefined, 'Missing editChunks on 0.1.1 summary.');\n\t\tassert(editIds !== undefined, 'Missing editIds on 0.1.1 summary.');\n\n\t\tconst uncompressedChunks = editChunks.map(({ startRevision, chunk }) => ({\n\t\t\tstartRevision,\n\t\t\tchunk: isEditHandle(chunk)\n\t\t\t\t? {\n\t\t\t\t\t\tget: async () => {\n\t\t\t\t\t\t\tconst baseHandle = chunk;\n\t\t\t\t\t\t\tconst contents: EditChunkContents = JSON.parse(\n\t\t\t\t\t\t\t\tIsoBuffer.from(await baseHandle.get()).toString()\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Note: any interned IDs referenced in chunks taken at the time of summarization must be included\n\t\t\t\t\t\t\t// in the summary. So this interner is sufficient.\n\t\t\t\t\t\t\treturn this.decodeEditChunk(contents, sequencedNormalizer, interner);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbaseHandle: chunk,\n\t\t\t\t }\n\t\t\t\t: chunk.map((edit) => decompressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)),\n\t\t}));\n\t\treturn {\n\t\t\tcurrentTree: decompressedTree,\n\t\t\teditHistory: { editIds, editChunks: uncompressedChunks },\n\t\t\tidCompressor,\n\t\t\tinterner,\n\t\t};\n\t}\n\n\t/**\n\t * Does not preserve (persist) history at all.\n\t * Instead, the history returned in the summary will contain a single edit that creates a revision identical to the supplied view.\n\t * Writes summary format 0.1.1 which does not store the currentView for no history summaries.\n\t */\n\tprivate noHistorySummarizer<TChange>(\n\t\t_edits: EditLog<TChange>,\n\t\tcurrentView: RevisionView,\n\t\tidContext: NodeIdContext,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tconst currentTree = getChangeNodeFromView(currentView);\n\t\tconst initialTreeId = idContext.convertToNodeId(initialTree.identifier);\n\t\tconst changes: ChangeInternal[] = [];\n\t\t// Generate a set of changes to set the root node's children to that of the root in the currentTree\n\t\tObject.entries(currentTree.traits).forEach(([label, children]) => {\n\t\t\tconst id = 0 as DetachedSequenceId;\n\t\t\tchanges.push(\n\t\t\t\tChangeInternal.build(children, id),\n\t\t\t\tChangeInternal.insert(\n\t\t\t\t\tid,\n\t\t\t\t\tStablePlaceInternal.atStartOf({ parent: initialTreeId, label: label as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\t\t});\n\n\t\tif (currentTree.payload !== undefined) {\n\t\t\tchanges.push(ChangeInternal.setPayload(initialTreeId, currentTree.payload));\n\t\t}\n\n\t\tassert(\n\t\t\tcurrentTree.identifier === initialTreeId && currentTree.definition === initialTree.definition,\n\t\t\t'root definition and identifier should be immutable.'\n\t\t);\n\t\tconst edit = newEdit(changes);\n\t\tconst compressedChanges = edit.changes.map((change) =>\n\t\t\tthis.changeCompressor.compress(change, interner, sequencedIdNormalizer(idNormalizer))\n\t\t);\n\t\treturn {\n\t\t\teditHistory: {\n\t\t\t\teditChunks: [{ startRevision: 0, chunk: [{ changes: compressedChanges }] }],\n\t\t\t\teditIds: [edit.id],\n\t\t\t},\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t\tidCompressor: serializedIdCompressor,\n\t\t};\n\t}\n\n\t/**\n\t * Generates a summary with format version 0.1.1. This will prefer handles over edits in edit chunks where possible,\n\t * and string interning and tree compression will be applied.\n\t */\n\tprivate fullHistorySummarizer(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tconst sequencedNormalizer = sequencedIdNormalizer(idNormalizer);\n\t\tconst currentTree = this.treeCompressor.compress(\n\t\t\tgetChangeNodeFromView(currentView),\n\t\t\tinterner,\n\t\t\tsequencedNormalizer\n\t\t);\n\n\t\treturn {\n\t\t\tcurrentTree,\n\t\t\teditHistory: edits.getEditLogSummary((edit) =>\n\t\t\t\tcompressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)\n\t\t\t),\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t\tidCompressor: serializedIdCompressor,\n\t\t};\n\t}\n\n\tpublic encodeEditChunk(\n\t\tedits: readonly EditWithoutId<ChangeInternal>[],\n\t\tidNormalizer: ContextualizedNodeIdNormalizer<FinalNodeId>,\n\t\tinterner: StringInterner\n\t): EditChunkContents_0_1_1 {\n\t\tconst compressedEdits = edits.map((edit) => compressEdit(this.changeCompressor, interner, idNormalizer, edit));\n\t\treturn {\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tedits: compressedEdits,\n\t\t};\n\t}\n\n\tpublic decodeEditChunk(\n\t\tcontents: EditChunkContents,\n\t\tidNormalizer: ContextualizedNodeIdNormalizer<FinalNodeId>,\n\t\tinterner: StringInterner\n\t): EditWithoutId<ChangeInternal>[] {\n\t\tassert(\n\t\t\tcontents.version === WriteFormat.v0_1_1,\n\t\t\t`Invalid editChunk to decode: ${contents.version}. Expected 0.1.1.`\n\t\t);\n\t\treturn contents.edits.map((edit) => decompressEdit(this.changeCompressor, interner, idNormalizer, edit));\n\t}\n}\n\n/**\n * Object capable of converting between the current internal representation for 0.0.2 edits and their wire format.\n * @internal\n */\nexport class SharedTreeEncoder_0_0_2 {\n\tpublic constructor(private readonly summarizeHistory: boolean) {}\n\n\t/**\n\t * Encodes an edit op to be sent.\n\t * @param edit - edit to encode.\n\t * @param fluidSerialize - Callback which serializes Fluid handles contained in a JSON-serializable object, returning the result.\n\t * Should be invoked on the edit contents at some point before op encoding is complete.\n\t * This is because edit contents may have Payloads needing to be serialized.\n\t */\n\tpublic encodeEditOp(\n\t\tedit: Edit<ChangeInternal>,\n\t\tfluidSerialize: (edit: Edit<ChangeInternal_0_0_2>) => Edit<ChangeInternal_0_0_2>,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeEditOp_0_0_2 {\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles by encoding before sending:\n\t\tconst semiSerialized = fluidSerialize(convertEditIds(edit, (id) => idConverter.convertToStableNodeId(id)));\n\n\t\treturn {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit: semiSerialized,\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n\n\t/**\n\t * Decodes an edit op encoded with `encodeEditOp`.\n\t * @param op - op to decode.\n\t * @param fluidDeserialize - Callback which deserializes Fluid handles contained in a JSON-serializable object.\n\t * Should be invoked on the semi-serialized edit contents at some point before decoding is complete.\n\t * This will rehydrate any serialized Fluid handles into usable IFluidHandle objects.\n\t */\n\tpublic decodeEditOp(\n\t\top: SharedTreeEditOp_0_0_2,\n\t\tfluidDeserialize: (semiSerializedEdit: Edit<ChangeInternal_0_0_2>) => Edit<ChangeInternal_0_0_2>,\n\t\tidGenerator: NodeIdGenerator\n\t): Edit<ChangeInternal> {\n\t\tconst { edit: semiSerializedEdit } = op;\n\t\tconst parsedEdit = fluidDeserialize(semiSerializedEdit);\n\t\treturn convertEditIds(parsedEdit, (id) => idGenerator.generateNodeId(id));\n\t}\n\n\t/**\n\t * Encodes a summary.\n\t */\n\tpublic encodeSummary(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tif (this.summarizeHistory) {\n\t\t\treturn this.fullHistorySummarizer(edits, currentView, idConverter);\n\t\t} else {\n\t\t\treturn this.noHistorySummarizer(edits, currentView, idConverter);\n\t\t}\n\t}\n\n\t/**\n\t * Decodes an encoded summary.\n\t */\n\tpublic decodeSummary({ currentTree, sequencedEdits }: SharedTreeSummary_0_0_2): SummaryContents {\n\t\tassert(sequencedEdits !== undefined, '0.0.2 summary encountered with missing sequencedEdits field.');\n\t\tconst idCompressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\tconst idGenerator = getNodeIdContext(idCompressor);\n\t\tconst generateId = (id) => idGenerator.generateNodeId(id);\n\n\t\t// This saves all of the edits in the summary as part of the first chunk.\n\t\tconst temporaryLog = new EditLog<ChangeInternal>();\n\t\tsequencedEdits.forEach((edit) =>\n\t\t\ttemporaryLog.addSequencedEdit(convertEditIds(edit, generateId), {\n\t\t\t\tsequenceNumber: 1,\n\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t})\n\t\t);\n\n\t\treturn {\n\t\t\tcurrentTree: convertTreeNodes<ChangeNode_0_0_2, ChangeNode>(currentTree, (node) =>\n\t\t\t\tconvertNodeDataIds(node, generateId)\n\t\t\t),\n\t\t\tidCompressor,\n\t\t\tinterner: new MutableStringInterner(),\n\t\t\t// This cast is valid because we just constructed this log and gave it only in-session edits.\n\t\t\teditHistory: temporaryLog.getEditLogSummary() as EditLogSummary<ChangeInternal, never>,\n\t\t};\n\t}\n\n\t/**\n\t * Does not preserve (persist) history at all.\n\t * Instead, the history returned in the summary will contain a single edit that creates a revision identical to the supplied view.\n\t * @param stable - Generates the single edit with a stable edit ID. False by default, used for testing.\n\t */\n\tprivate noHistorySummarizer<TChange>(\n\t\t_edits: EditLog<TChange>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tconst currentTree = getChangeNode_0_0_2FromView(currentView, idConverter);\n\t\tconst changes: ChangeInternal_0_0_2[] = [];\n\t\t// Generate a set of changes to set the root node's children to that of the root in the currentTree\n\t\tObject.entries(currentTree.traits).forEach(([label, children]) => {\n\t\t\tconst id = 0 as DetachedSequenceId;\n\t\t\tchanges.push(\n\t\t\t\t{ type: ChangeTypeInternal.Build, source: children, destination: id },\n\t\t\t\t{\n\t\t\t\t\ttype: ChangeTypeInternal.Insert,\n\t\t\t\t\tsource: id,\n\t\t\t\t\tdestination: {\n\t\t\t\t\t\tside: Side.After,\n\t\t\t\t\t\treferenceTrait: { label: label as TraitLabel, parent: initialTree.identifier },\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\n\t\tif (currentTree.payload !== undefined) {\n\t\t\tchanges.push({\n\t\t\t\ttype: ChangeTypeInternal.SetValue,\n\t\t\t\tnodeToModify: initialTree.identifier,\n\t\t\t\tpayload: currentTree.payload,\n\t\t\t});\n\t\t}\n\n\t\tassert(\n\t\t\tcurrentTree.identifier === initialTree.identifier && currentTree.definition === initialTree.definition,\n\t\t\t'root definition and identifier should be immutable.'\n\t\t);\n\t\tconst edit = newEdit(changes);\n\n\t\treturn {\n\t\t\tcurrentTree,\n\t\t\tsequencedEdits: [\n\t\t\t\t{\n\t\t\t\t\tid: edit.id,\n\t\t\t\t\tchanges: edit.changes,\n\t\t\t\t},\n\t\t\t],\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n\t/**\n\t * Preserves the full history in the generated summary.\n\t */\n\tprivate fullHistorySummarizer(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tconst { editChunks, editIds } = edits.getEditLogSummary();\n\n\t\tconst sequencedEdits: Edit<ChangeInternal_0_0_2>[] = [];\n\t\tlet idIndex = 0;\n\t\teditChunks.forEach(({ chunk }) => {\n\t\t\tif (isEditHandle(chunk)) {\n\t\t\t\tfail('Cannot write handles to summary version 0.0.2');\n\t\t\t} else {\n\t\t\t\tchunk.forEach(({ changes }) => {\n\t\t\t\t\tsequencedEdits.push(\n\t\t\t\t\t\tconvertEditIds(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchanges,\n\t\t\t\t\t\t\t\tid: editIds[idIndex++] ?? fail('Number of edits should match number of edit IDs.'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(id) => idConverter.convertToStableNodeId(id)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tcurrentTree: getChangeNode_0_0_2FromView(currentView, idConverter),\n\t\t\tsequencedEdits,\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n}\n\nfunction isEditHandle(chunk: FluidEditHandle | readonly EditWithoutId<unknown>[]): chunk is FluidEditHandle {\n\treturn !Array.isArray(chunk);\n}\n"]}
1
+ {"version":3,"file":"SharedTreeEncoder.js","sourceRoot":"","sources":["../src/SharedTreeEncoder.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 { IsoBuffer } from '@fluidframework/common-utils';\nimport { assert, fail } from './Common';\nimport { EditLog } from './EditLog';\nimport { convertTreeNodes, newEdit } from './EditUtilities';\nimport { AttributionId, DetachedSequenceId, FinalNodeId, OpSpaceNodeId, TraitLabel } from './Identifiers';\nimport { initialTree } from './InitialTree';\nimport {\n\tContextualizedNodeIdNormalizer,\n\tgetNodeIdContext,\n\tNodeIdContext,\n\tNodeIdConverter,\n\tNodeIdGenerator,\n\tNodeIdNormalizer,\n\tscopeIdNormalizer,\n\tsequencedIdNormalizer,\n} from './NodeIdUtilities';\nimport { getChangeNodeFromView, getChangeNode_0_0_2FromView } from './SerializationUtilities';\nimport {\n\tCompressedChangeInternal,\n\tChangeInternal,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n\tChangeNode,\n\tEdit,\n\tSharedTreeEditOp,\n\tSharedTreeOpType,\n\tSharedTreeSummary,\n\tEditWithoutId,\n\tChangeTypeInternal,\n\tChangeInternal_0_0_2,\n\tSharedTreeEditOp_0_0_2,\n\treservedIdCount,\n\tChangeNode_0_0_2,\n\tEditChunkContents,\n\tEditLogSummary,\n\tEditChunkContents_0_1_1,\n\tFluidEditHandle,\n\tStablePlaceInternal,\n\tSide,\n} from './persisted-types';\nimport { RevisionView } from './RevisionView';\nimport { MutableStringInterner, StringInterner } from './StringInterner';\nimport { SummaryContents } from './Summary';\nimport { InterningTreeCompressor } from './TreeCompressor';\nimport {\n\tcreateSessionId,\n\thasOngoingSession,\n\tIdCompressor,\n\tIdCreationRange,\n\tSerializedIdCompressorWithNoSession,\n} from './id-compressor';\nimport { ChangeCompressor, compressEdit, decompressEdit } from './ChangeCompression';\nimport { convertEditIds, convertNodeDataIds } from './IdConversion';\n\n/**\n * Object capable of converting between the current internal representation for 0.1.1 edits and their wire format.\n * @internal\n */\nexport class SharedTreeEncoder_0_1_1 {\n\tprivate readonly treeCompressor = new InterningTreeCompressor<never>();\n\tprivate readonly changeCompressor = new ChangeCompressor(this.treeCompressor);\n\n\tpublic constructor(private readonly summarizeHistory: boolean) {}\n\n\t/**\n\t * Encodes an edit op to be sent.\n\t * @param edit - edit to encode.\n\t * @param fluidSerialize - Callback which serializes Fluid handles contained in a JSON-serializable object, returning the result.\n\t * Should be invoked on the edit contents at some point before op encoding is complete.\n\t * This is because edit contents may have Payloads needing to be serialized.\n\t */\n\tpublic encodeEditOp(\n\t\tedit: Edit<ChangeInternal>,\n\t\tfluidSerialize: (\n\t\t\tedit: Edit<CompressedChangeInternal<OpSpaceNodeId>>\n\t\t) => Edit<CompressedChangeInternal<OpSpaceNodeId>>,\n\t\tidRange: IdCreationRange,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner\n\t): SharedTreeEditOp {\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles by encoding before sending:\n\t\tconst semiSerialized = fluidSerialize(\n\t\t\tcompressEdit(this.changeCompressor, interner, scopeIdNormalizer(idNormalizer, idRange.sessionId), edit)\n\t\t);\n\n\t\treturn {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit: semiSerialized,\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tidRange,\n\t\t};\n\t}\n\n\t/**\n\t * Decodes an edit op encoded with `encodeEditOp`.\n\t * @param op - op to decode.\n\t * @param fluidDeserialize - Callback which deserializes Fluid handles contained in a JSON-serializable object.\n\t * Should be invoked on the semi-serialized edit contents at some point before decoding is complete.\n\t * This will rehydrate any serialized Fluid handles into usable IFluidHandle objects.\n\t */\n\tpublic decodeEditOp(\n\t\top: SharedTreeEditOp,\n\t\tfluidDeserialize: (\n\t\t\tsemiSerializedEdit: Edit<CompressedChangeInternal<OpSpaceNodeId>>\n\t\t) => Edit<CompressedChangeInternal<OpSpaceNodeId>>,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner\n\t): Edit<ChangeInternal> {\n\t\tconst { edit: semiSerializedEdit } = op;\n\t\tconst parsedEdit = fluidDeserialize(semiSerializedEdit);\n\t\treturn decompressEdit(\n\t\t\tthis.changeCompressor,\n\t\t\tinterner,\n\t\t\tscopeIdNormalizer(idNormalizer, op.idRange.sessionId),\n\t\t\tparsedEdit\n\t\t);\n\t}\n\n\t/**\n\t * Encodes a summary.\n\t */\n\tpublic encodeSummary(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidContext: NodeIdContext,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tif (this.summarizeHistory) {\n\t\t\treturn this.fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor);\n\t\t} else {\n\t\t\treturn this.noHistorySummarizer(\n\t\t\t\tedits,\n\t\t\t\tcurrentView,\n\t\t\t\tidContext,\n\t\t\t\tidNormalizer,\n\t\t\t\tinterner,\n\t\t\t\tserializedIdCompressor\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Decodes an encoded summary.\n\t */\n\tpublic decodeSummary(\n\t\t{\n\t\t\teditHistory,\n\t\t\tcurrentTree: compressedTree,\n\t\t\tinternedStrings,\n\t\t\tidCompressor: serializedIdCompressor,\n\t\t\tversion,\n\t\t}: SharedTreeSummary,\n\t\tattributionId: AttributionId\n\t): SummaryContents {\n\t\tassert(version === WriteFormat.v0_1_1, `Invalid summary version to decode: ${version}, expected: 0.1.1`);\n\t\tassert(typeof editHistory === 'object', '0.1.1 summary encountered with non-object edit history.');\n\n\t\tconst idCompressor = hasOngoingSession(serializedIdCompressor)\n\t\t\t? IdCompressor.deserialize(serializedIdCompressor)\n\t\t\t: IdCompressor.deserialize(serializedIdCompressor, createSessionId(), attributionId);\n\n\t\tconst interner = new MutableStringInterner(internedStrings);\n\t\tconst sequencedNormalizer = sequencedIdNormalizer(getNodeIdContext(idCompressor));\n\t\tconst decompressedTree: ChangeNode | undefined =\n\t\t\tcompressedTree !== undefined\n\t\t\t\t? this.treeCompressor.decompress(compressedTree, interner, sequencedNormalizer)\n\t\t\t\t: undefined;\n\t\tconst { editChunks, editIds } = editHistory;\n\t\tassert(editChunks !== undefined, 'Missing editChunks on 0.1.1 summary.');\n\t\tassert(editIds !== undefined, 'Missing editIds on 0.1.1 summary.');\n\n\t\tconst uncompressedChunks = editChunks.map(({ startRevision, chunk }) => ({\n\t\t\tstartRevision,\n\t\t\tchunk: isEditHandle(chunk)\n\t\t\t\t? {\n\t\t\t\t\t\tget: async () => {\n\t\t\t\t\t\t\tconst baseHandle = chunk;\n\t\t\t\t\t\t\tconst contents: EditChunkContents = JSON.parse(\n\t\t\t\t\t\t\t\tIsoBuffer.from(await baseHandle.get()).toString()\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Note: any interned IDs referenced in chunks taken at the time of summarization must be included\n\t\t\t\t\t\t\t// in the summary. So this interner is sufficient.\n\t\t\t\t\t\t\treturn this.decodeEditChunk(contents, sequencedNormalizer, interner);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbaseHandle: chunk,\n\t\t\t\t }\n\t\t\t\t: chunk.map((edit) => decompressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)),\n\t\t}));\n\t\treturn {\n\t\t\tcurrentTree: decompressedTree,\n\t\t\teditHistory: { editIds, editChunks: uncompressedChunks },\n\t\t\tidCompressor,\n\t\t\tinterner,\n\t\t};\n\t}\n\n\t/**\n\t * Does not preserve (persist) history at all.\n\t * Instead, the history returned in the summary will contain a single edit that creates a revision identical to the supplied view.\n\t * Writes summary format 0.1.1 which does not store the currentView for no history summaries.\n\t */\n\tprivate noHistorySummarizer<TChange>(\n\t\t_edits: EditLog<TChange>,\n\t\tcurrentView: RevisionView,\n\t\tidContext: NodeIdContext,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tconst currentTree = getChangeNodeFromView(currentView);\n\t\tconst initialTreeId = idContext.convertToNodeId(initialTree.identifier);\n\t\tconst changes: ChangeInternal[] = [];\n\t\t// Generate a set of changes to set the root node's children to that of the root in the currentTree\n\t\tObject.entries(currentTree.traits).forEach(([label, children]) => {\n\t\t\tconst id = 0 as DetachedSequenceId;\n\t\t\tchanges.push(\n\t\t\t\tChangeInternal.build(children, id),\n\t\t\t\tChangeInternal.insert(\n\t\t\t\t\tid,\n\t\t\t\t\tStablePlaceInternal.atStartOf({ parent: initialTreeId, label: label as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\t\t});\n\n\t\tif (currentTree.payload !== undefined) {\n\t\t\tchanges.push(ChangeInternal.setPayload(initialTreeId, currentTree.payload));\n\t\t}\n\n\t\tassert(\n\t\t\tcurrentTree.identifier === initialTreeId && currentTree.definition === initialTree.definition,\n\t\t\t'root definition and identifier should be immutable.'\n\t\t);\n\t\tconst edit = newEdit(changes);\n\t\tconst compressedChanges = edit.changes.map((change) =>\n\t\t\tthis.changeCompressor.compress(change, interner, sequencedIdNormalizer(idNormalizer))\n\t\t);\n\t\treturn {\n\t\t\teditHistory: {\n\t\t\t\teditChunks: [{ startRevision: 0, chunk: [{ changes: compressedChanges }] }],\n\t\t\t\teditIds: [edit.id],\n\t\t\t},\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t\tidCompressor: serializedIdCompressor,\n\t\t};\n\t}\n\n\t/**\n\t * Generates a summary with format version 0.1.1. This will prefer handles over edits in edit chunks where possible,\n\t * and string interning and tree compression will be applied.\n\t */\n\tprivate fullHistorySummarizer(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\tinterner: StringInterner,\n\t\tserializedIdCompressor: SerializedIdCompressorWithNoSession\n\t): SharedTreeSummary {\n\t\tconst sequencedNormalizer = sequencedIdNormalizer(idNormalizer);\n\t\tconst currentTree = this.treeCompressor.compress(\n\t\t\tgetChangeNodeFromView(currentView),\n\t\t\tinterner,\n\t\t\tsequencedNormalizer\n\t\t);\n\n\t\treturn {\n\t\t\tcurrentTree,\n\t\t\teditHistory: edits.getEditLogSummary((edit) =>\n\t\t\t\tcompressEdit(this.changeCompressor, interner, sequencedNormalizer, edit)\n\t\t\t),\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t\tidCompressor: serializedIdCompressor,\n\t\t};\n\t}\n\n\tpublic encodeEditChunk(\n\t\tedits: readonly EditWithoutId<ChangeInternal>[],\n\t\tidNormalizer: ContextualizedNodeIdNormalizer<FinalNodeId>,\n\t\tinterner: StringInterner\n\t): EditChunkContents_0_1_1 {\n\t\tconst compressedEdits = edits.map((edit) => compressEdit(this.changeCompressor, interner, idNormalizer, edit));\n\t\treturn {\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tedits: compressedEdits,\n\t\t};\n\t}\n\n\tpublic decodeEditChunk(\n\t\tcontents: EditChunkContents,\n\t\tidNormalizer: ContextualizedNodeIdNormalizer<FinalNodeId>,\n\t\tinterner: StringInterner\n\t): EditWithoutId<ChangeInternal>[] {\n\t\tassert(\n\t\t\tcontents.version === WriteFormat.v0_1_1,\n\t\t\t`Invalid editChunk to decode: ${contents.version}. Expected 0.1.1.`\n\t\t);\n\t\treturn contents.edits.map((edit) => decompressEdit(this.changeCompressor, interner, idNormalizer, edit));\n\t}\n}\n\n/**\n * Object capable of converting between the current internal representation for 0.0.2 edits and their wire format.\n * @internal\n */\nexport class SharedTreeEncoder_0_0_2 {\n\tpublic constructor(private readonly summarizeHistory: boolean) {}\n\n\t/**\n\t * Encodes an edit op to be sent.\n\t * @param edit - edit to encode.\n\t * @param fluidSerialize - Callback which serializes Fluid handles contained in a JSON-serializable object, returning the result.\n\t * Should be invoked on the edit contents at some point before op encoding is complete.\n\t * This is because edit contents may have Payloads needing to be serialized.\n\t */\n\tpublic encodeEditOp(\n\t\tedit: Edit<ChangeInternal>,\n\t\tfluidSerialize: (edit: Edit<ChangeInternal_0_0_2>) => Edit<ChangeInternal_0_0_2>,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeEditOp_0_0_2 {\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles by encoding before sending:\n\t\tconst semiSerialized = fluidSerialize(convertEditIds(edit, (id) => idConverter.convertToStableNodeId(id)));\n\n\t\treturn {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit: semiSerialized,\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n\n\t/**\n\t * Decodes an edit op encoded with `encodeEditOp`.\n\t * @param op - op to decode.\n\t * @param fluidDeserialize - Callback which deserializes Fluid handles contained in a JSON-serializable object.\n\t * Should be invoked on the semi-serialized edit contents at some point before decoding is complete.\n\t * This will rehydrate any serialized Fluid handles into usable IFluidHandle objects.\n\t */\n\tpublic decodeEditOp(\n\t\top: SharedTreeEditOp_0_0_2,\n\t\tfluidDeserialize: (semiSerializedEdit: Edit<ChangeInternal_0_0_2>) => Edit<ChangeInternal_0_0_2>,\n\t\tidGenerator: NodeIdGenerator\n\t): Edit<ChangeInternal> {\n\t\tconst { edit: semiSerializedEdit } = op;\n\t\tconst parsedEdit = fluidDeserialize(semiSerializedEdit);\n\t\treturn convertEditIds(parsedEdit, (id) => idGenerator.generateNodeId(id));\n\t}\n\n\t/**\n\t * Encodes a summary.\n\t */\n\tpublic encodeSummary(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tif (this.summarizeHistory) {\n\t\t\treturn this.fullHistorySummarizer(edits, currentView, idConverter);\n\t\t} else {\n\t\t\treturn this.noHistorySummarizer(edits, currentView, idConverter);\n\t\t}\n\t}\n\n\t/**\n\t * Decodes an encoded summary.\n\t */\n\tpublic decodeSummary(\n\t\t{ currentTree, sequencedEdits }: SharedTreeSummary_0_0_2,\n\t\tattributionId?: AttributionId\n\t): SummaryContents {\n\t\tassert(sequencedEdits !== undefined, '0.0.2 summary encountered with missing sequencedEdits field.');\n\t\tconst idCompressor = new IdCompressor(createSessionId(), reservedIdCount, attributionId);\n\t\tconst idGenerator = getNodeIdContext(idCompressor);\n\t\tconst generateId = (id) => idGenerator.generateNodeId(id);\n\n\t\t// This saves all of the edits in the summary as part of the first chunk.\n\t\tconst temporaryLog = new EditLog<ChangeInternal>();\n\t\tsequencedEdits.forEach((edit) =>\n\t\t\ttemporaryLog.addSequencedEdit(convertEditIds(edit, generateId), {\n\t\t\t\tsequenceNumber: 1,\n\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t})\n\t\t);\n\n\t\treturn {\n\t\t\tcurrentTree: convertTreeNodes<ChangeNode_0_0_2, ChangeNode>(currentTree, (node) =>\n\t\t\t\tconvertNodeDataIds(node, generateId)\n\t\t\t),\n\t\t\tidCompressor,\n\t\t\tinterner: new MutableStringInterner(),\n\t\t\t// This cast is valid because we just constructed this log and gave it only in-session edits.\n\t\t\teditHistory: temporaryLog.getEditLogSummary() as EditLogSummary<ChangeInternal, never>,\n\t\t};\n\t}\n\n\t/**\n\t * Does not preserve (persist) history at all.\n\t * Instead, the history returned in the summary will contain a single edit that creates a revision identical to the supplied view.\n\t * @param stable - Generates the single edit with a stable edit ID. False by default, used for testing.\n\t */\n\tprivate noHistorySummarizer<TChange>(\n\t\t_edits: EditLog<TChange>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tconst currentTree = getChangeNode_0_0_2FromView(currentView, idConverter);\n\t\tconst changes: ChangeInternal_0_0_2[] = [];\n\t\t// Generate a set of changes to set the root node's children to that of the root in the currentTree\n\t\tObject.entries(currentTree.traits).forEach(([label, children]) => {\n\t\t\tconst id = 0 as DetachedSequenceId;\n\t\t\tchanges.push(\n\t\t\t\t{ type: ChangeTypeInternal.Build, source: children, destination: id },\n\t\t\t\t{\n\t\t\t\t\ttype: ChangeTypeInternal.Insert,\n\t\t\t\t\tsource: id,\n\t\t\t\t\tdestination: {\n\t\t\t\t\t\tside: Side.After,\n\t\t\t\t\t\treferenceTrait: { label: label as TraitLabel, parent: initialTree.identifier },\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\n\t\tif (currentTree.payload !== undefined) {\n\t\t\tchanges.push({\n\t\t\t\ttype: ChangeTypeInternal.SetValue,\n\t\t\t\tnodeToModify: initialTree.identifier,\n\t\t\t\tpayload: currentTree.payload,\n\t\t\t});\n\t\t}\n\n\t\tassert(\n\t\t\tcurrentTree.identifier === initialTree.identifier && currentTree.definition === initialTree.definition,\n\t\t\t'root definition and identifier should be immutable.'\n\t\t);\n\t\tconst edit = newEdit(changes);\n\n\t\treturn {\n\t\t\tcurrentTree,\n\t\t\tsequencedEdits: [\n\t\t\t\t{\n\t\t\t\t\tid: edit.id,\n\t\t\t\t\tchanges: edit.changes,\n\t\t\t\t},\n\t\t\t],\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n\t/**\n\t * Preserves the full history in the generated summary.\n\t */\n\tprivate fullHistorySummarizer(\n\t\tedits: EditLog<ChangeInternal>,\n\t\tcurrentView: RevisionView,\n\t\tidConverter: NodeIdConverter\n\t): SharedTreeSummary_0_0_2 {\n\t\tconst { editChunks, editIds } = edits.getEditLogSummary();\n\n\t\tconst sequencedEdits: Edit<ChangeInternal_0_0_2>[] = [];\n\t\tlet idIndex = 0;\n\t\teditChunks.forEach(({ chunk }) => {\n\t\t\tif (isEditHandle(chunk)) {\n\t\t\t\tfail('Cannot write handles to summary version 0.0.2');\n\t\t\t} else {\n\t\t\t\tchunk.forEach(({ changes }) => {\n\t\t\t\t\tsequencedEdits.push(\n\t\t\t\t\t\tconvertEditIds(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchanges,\n\t\t\t\t\t\t\t\tid: editIds[idIndex++] ?? fail('Number of edits should match number of edit IDs.'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(id) => idConverter.convertToStableNodeId(id)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tcurrentTree: getChangeNode_0_0_2FromView(currentView, idConverter),\n\t\t\tsequencedEdits,\n\t\t\tversion: WriteFormat.v0_0_2,\n\t\t};\n\t}\n}\n\nfunction isEditHandle(chunk: FluidEditHandle | readonly EditWithoutId<unknown>[]): chunk is FluidEditHandle {\n\treturn !Array.isArray(chunk);\n}\n"]}
@@ -41,7 +41,7 @@ class MutableStringInterner {
41
41
  */
42
42
  getString(internId) {
43
43
  var _a;
44
- return (_a = this.internedStrings[internId]) !== null && _a !== void 0 ? _a : Common_1.fail(`No string associated with ${internId}.`);
44
+ return (_a = this.internedStrings[internId]) !== null && _a !== void 0 ? _a : (0, Common_1.fail)(`No string associated with ${internId}.`);
45
45
  }
46
46
  /**
47
47
  * @returns the list of strings interned where the indices map to the associated {@link InternedStringId} of each string
@@ -1 +1 @@
1
- {"version":3,"file":"StringInterner.js","sourceRoot":"","sources":["../src/StringInterner.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAgC;AAYhC;;;GAGG;AACH,MAAa,qBAAqB;IAIjC;;;OAGG;IACH,YAAY,eAAkC,EAAE;QAP/B,0BAAqB,GAAG,IAAI,GAAG,EAA4B,CAAC;QAC5D,oBAAe,GAAa,EAAE,CAAC;QAO/C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;YACjC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;SAClC;IACF,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,KAAa;;QACzC,aAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,mCAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAEM,aAAa,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,QAAgB;;QAChC,aAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,mCAAI,aAAI,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAC;IACzF,CAAC;IAED;;OAEG;IACI,eAAe;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,+GAA+G;IACvG,WAAW,CAAC,KAAa;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAwB,CAAC;QACvE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,UAAU,CAAC;IACnB,CAAC;CACD;AAlDD,sDAkDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { fail } from './Common';\nimport type { InternedStringId } from './Identifiers';\n\n/**\n * Interns strings as integers.\n */\nexport interface StringInterner {\n\tgetInternedId(input: string): InternedStringId | undefined;\n\tgetString(internedId: number): string;\n\tgetSerializable(): readonly string[];\n}\n\n/**\n * Interns strings as integers.\n * Given a string, this class will produce a unique integer associated with that string that can then be used to retrieve the string.\n */\nexport class MutableStringInterner implements StringInterner {\n\tprivate readonly stringToInternedIdMap = new Map<string, InternedStringId>();\n\tprivate readonly internedStrings: string[] = [];\n\n\t/**\n\t * @param inputStrings - A list of strings to intern in the order given. Can be used to rehydrate from a previous\n\t * `StringInterner`'s {@link StringInterner.getSerializable} return value.\n\t */\n\tconstructor(inputStrings: readonly string[] = []) {\n\t\tfor (const value of inputStrings) {\n\t\t\tthis.getOrCreateInternedId(value);\n\t\t}\n\t}\n\n\t/**\n\t * @param input - The string to get the associated intern ID for\n\t * @returns an intern ID that is uniquely associated with the input string\n\t */\n\tpublic getOrCreateInternedId(input: string): InternedStringId {\n\t\treturn this.getInternedId(input) ?? this.createNewId(input);\n\t}\n\n\tpublic getInternedId(input: string): InternedStringId | undefined {\n\t\treturn this.stringToInternedIdMap.get(input);\n\t}\n\n\t/**\n\t *\n\t * @param internId - The intern ID to get the associated string for. Can only retrieve strings that have been used as inputs to\n\t * calls of `getInternId`.\n\t * @returns a string that is uniquely associated with the given intern ID\n\t */\n\tpublic getString(internId: number): string {\n\t\treturn this.internedStrings[internId] ?? fail(`No string associated with ${internId}.`);\n\t}\n\n\t/**\n\t * @returns the list of strings interned where the indices map to the associated {@link InternedStringId} of each string\n\t */\n\tpublic getSerializable(): readonly string[] {\n\t\treturn this.internedStrings;\n\t}\n\n\t/** Create a new interned id. Assumes without validation that the input doesn't already have an interned id. */\n\tprivate createNewId(input: string): InternedStringId {\n\t\tconst internedId = this.stringToInternedIdMap.size as InternedStringId;\n\t\tthis.stringToInternedIdMap.set(input, internedId);\n\t\tthis.internedStrings.push(input);\n\t\treturn internedId;\n\t}\n}\n"]}
1
+ {"version":3,"file":"StringInterner.js","sourceRoot":"","sources":["../src/StringInterner.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAgC;AAYhC;;;GAGG;AACH,MAAa,qBAAqB;IAIjC;;;OAGG;IACH,YAAY,eAAkC,EAAE;QAP/B,0BAAqB,GAAG,IAAI,GAAG,EAA4B,CAAC;QAC5D,oBAAe,GAAa,EAAE,CAAC;QAO/C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;YACjC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;SAClC;IACF,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,KAAa;;QACzC,OAAO,MAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,mCAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAEM,aAAa,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,QAAgB;;QAChC,OAAO,MAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,mCAAI,IAAA,aAAI,EAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAC;IACzF,CAAC;IAED;;OAEG;IACI,eAAe;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,+GAA+G;IACvG,WAAW,CAAC,KAAa;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAwB,CAAC;QACvE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,UAAU,CAAC;IACnB,CAAC;CACD;AAlDD,sDAkDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { fail } from './Common';\nimport type { InternedStringId } from './Identifiers';\n\n/**\n * Interns strings as integers.\n */\nexport interface StringInterner {\n\tgetInternedId(input: string): InternedStringId | undefined;\n\tgetString(internedId: number): string;\n\tgetSerializable(): readonly string[];\n}\n\n/**\n * Interns strings as integers.\n * Given a string, this class will produce a unique integer associated with that string that can then be used to retrieve the string.\n */\nexport class MutableStringInterner implements StringInterner {\n\tprivate readonly stringToInternedIdMap = new Map<string, InternedStringId>();\n\tprivate readonly internedStrings: string[] = [];\n\n\t/**\n\t * @param inputStrings - A list of strings to intern in the order given. Can be used to rehydrate from a previous\n\t * `StringInterner`'s {@link StringInterner.getSerializable} return value.\n\t */\n\tconstructor(inputStrings: readonly string[] = []) {\n\t\tfor (const value of inputStrings) {\n\t\t\tthis.getOrCreateInternedId(value);\n\t\t}\n\t}\n\n\t/**\n\t * @param input - The string to get the associated intern ID for\n\t * @returns an intern ID that is uniquely associated with the input string\n\t */\n\tpublic getOrCreateInternedId(input: string): InternedStringId {\n\t\treturn this.getInternedId(input) ?? this.createNewId(input);\n\t}\n\n\tpublic getInternedId(input: string): InternedStringId | undefined {\n\t\treturn this.stringToInternedIdMap.get(input);\n\t}\n\n\t/**\n\t *\n\t * @param internId - The intern ID to get the associated string for. Can only retrieve strings that have been used as inputs to\n\t * calls of `getInternId`.\n\t * @returns a string that is uniquely associated with the given intern ID\n\t */\n\tpublic getString(internId: number): string {\n\t\treturn this.internedStrings[internId] ?? fail(`No string associated with ${internId}.`);\n\t}\n\n\t/**\n\t * @returns the list of strings interned where the indices map to the associated {@link InternedStringId} of each string\n\t */\n\tpublic getSerializable(): readonly string[] {\n\t\treturn this.internedStrings;\n\t}\n\n\t/** Create a new interned id. Assumes without validation that the input doesn't already have an interned id. */\n\tprivate createNewId(input: string): InternedStringId {\n\t\tconst internedId = this.stringToInternedIdMap.size as InternedStringId;\n\t\tthis.stringToInternedIdMap.set(input, internedId);\n\t\tthis.internedStrings.push(input);\n\t\treturn internedId;\n\t}\n}\n"]}
package/dist/Summary.js CHANGED
@@ -17,7 +17,7 @@ const Common_1 = require("./Common");
17
17
  */
18
18
  function serialize(summary, serializer, bind) {
19
19
  var _a;
20
- return (_a = shared_object_base_1.serializeHandles(summary, serializer, bind)) !== null && _a !== void 0 ? _a : Common_1.fail();
20
+ return (_a = (0, shared_object_base_1.serializeHandles)(summary, serializer, bind)) !== null && _a !== void 0 ? _a : (0, Common_1.fail)();
21
21
  }
22
22
  exports.serialize = serialize;
23
23
  //# sourceMappingURL=Summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Summary.js","sourceRoot":"","sources":["../src/Summary.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,2EAAwF;AACxF,qCAAgC;AA8BhC;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,OAA8B,EAAE,UAA4B,EAAE,IAAkB;;IACzG,aAAO,qCAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,mCAAI,aAAI,EAAE,CAAC;AAC9D,CAAC;AAFD,8BAEC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { IFluidSerializer, serializeHandles } from '@fluidframework/shared-object-base';\nimport { fail } from './Common';\nimport type { IdCompressor } from './id-compressor';\nimport type { EditLogSummary, SharedTreeSummaryBase, ChangeNode, ChangeInternal } from './persisted-types';\nimport type { EditHandle } from './EditLog';\nimport type { MutableStringInterner } from './StringInterner';\n\n/**\n * The contents of a SharedTree summary, converted to a common internal format that can be\n * loaded into a SharedTree.\n * @internal\n */\nexport interface SummaryContents {\n\treadonly currentTree?: ChangeNode;\n\n\t/**\n\t * Information that can populate an edit log.\n\t */\n\treadonly editHistory: EditLogSummary<ChangeInternal, EditHandle<ChangeInternal>>;\n\n\t/**\n\t * Information about all IDs compressed in the summary\n\t */\n\treadonly idCompressor: IdCompressor;\n\n\t/**\n\t * Interner pre-loaded with all definitions and labels from the summary.\n\t */\n\treadonly interner: MutableStringInterner;\n}\n\n/**\n * Serializes a SharedTree summary into a JSON string. This may later be used to initialize a SharedTree's state via `deserialize()`\n * Also replaces handle objects with their serialized form.\n *\n * @param summary - The SharedTree summary to serialize.\n * @param serializer - The serializer required to serialize handles in the summary.\n * @param bind - The object handle required to serialize handles in the summary\n */\nexport function serialize(summary: SharedTreeSummaryBase, serializer: IFluidSerializer, bind: IFluidHandle): string {\n\treturn serializeHandles(summary, serializer, bind) ?? fail();\n}\n"]}
1
+ {"version":3,"file":"Summary.js","sourceRoot":"","sources":["../src/Summary.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,2EAAwF;AACxF,qCAAgC;AA8BhC;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,OAA8B,EAAE,UAA4B,EAAE,IAAkB;;IACzG,OAAO,MAAA,IAAA,qCAAgB,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,mCAAI,IAAA,aAAI,GAAE,CAAC;AAC9D,CAAC;AAFD,8BAEC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { IFluidSerializer, serializeHandles } from '@fluidframework/shared-object-base';\nimport { fail } from './Common';\nimport type { IdCompressor } from './id-compressor';\nimport type { EditLogSummary, SharedTreeSummaryBase, ChangeNode, ChangeInternal } from './persisted-types';\nimport type { EditHandle } from './EditLog';\nimport type { MutableStringInterner } from './StringInterner';\n\n/**\n * The contents of a SharedTree summary, converted to a common internal format that can be\n * loaded into a SharedTree.\n * @internal\n */\nexport interface SummaryContents {\n\treadonly currentTree?: ChangeNode;\n\n\t/**\n\t * Information that can populate an edit log.\n\t */\n\treadonly editHistory: EditLogSummary<ChangeInternal, EditHandle<ChangeInternal>>;\n\n\t/**\n\t * Information about all IDs compressed in the summary\n\t */\n\treadonly idCompressor: IdCompressor;\n\n\t/**\n\t * Interner pre-loaded with all definitions and labels from the summary.\n\t */\n\treadonly interner: MutableStringInterner;\n}\n\n/**\n * Serializes a SharedTree summary into a JSON string. This may later be used to initialize a SharedTree's state via `deserialize()`\n * Also replaces handle objects with their serialized form.\n *\n * @param summary - The SharedTree summary to serialize.\n * @param serializer - The serializer required to serialize handles in the summary.\n * @param bind - The object handle required to serialize handles in the summary\n */\nexport function serialize(summary: SharedTreeSummaryBase, serializer: IFluidSerializer, bind: IFluidHandle): string {\n\treturn serializeHandles(summary, serializer, bind) ?? fail();\n}\n"]}
@@ -24,16 +24,16 @@ function deserialize(jsonSummary, serializer) {
24
24
  summary = serializer.parse(jsonSummary);
25
25
  }
26
26
  catch (_a) {
27
- Common_1.fail('Json syntax error in Summary');
27
+ (0, Common_1.fail)('Json syntax error in Summary');
28
28
  }
29
29
  if (typeof summary !== 'object') {
30
- Common_1.fail('Summary is not an object');
30
+ (0, Common_1.fail)('Summary is not an object');
31
31
  }
32
32
  const { version } = summary;
33
33
  if (version !== undefined) {
34
34
  return Object.assign({ version }, summary);
35
35
  }
36
- Common_1.fail('Missing fields on summary');
36
+ (0, Common_1.fail)('Missing fields on summary');
37
37
  }
38
38
  exports.deserialize = deserialize;
39
39
  /**
@@ -46,7 +46,7 @@ function getSummaryStatistics(summary) {
46
46
  const { editHistory } = summary;
47
47
  if (editHistory !== undefined) {
48
48
  if (typeof editHistory !== 'object') {
49
- Common_1.fail('Edit history is not an object');
49
+ (0, Common_1.fail)('Edit history is not an object');
50
50
  }
51
51
  const { editChunks, editIds } = editHistory;
52
52
  // TODO:#45414: Add more robust validation of the summary's fields. Even if they are present, they may be malformed.
@@ -55,10 +55,10 @@ function getSummaryStatistics(summary) {
55
55
  formatVersion: version,
56
56
  historySize: editIds.length,
57
57
  totalNumberOfChunks: editChunks.length,
58
- uploadedChunks: EditLog_1.getNumberOfHandlesFromEditLogSummary(editHistory),
58
+ uploadedChunks: (0, EditLog_1.getNumberOfHandlesFromEditLogSummary)(editHistory),
59
59
  };
60
60
  }
61
- Common_1.fail('Missing fields on edit log summary');
61
+ (0, Common_1.fail)('Missing fields on edit log summary');
62
62
  }
63
63
  }
64
64
  else if (version === persisted_types_1.WriteFormat.v0_0_2) {
@@ -69,9 +69,9 @@ function getSummaryStatistics(summary) {
69
69
  };
70
70
  }
71
71
  else {
72
- Common_1.fail('Format version is not supported');
72
+ (0, Common_1.fail)('Format version is not supported');
73
73
  }
74
- Common_1.fail('Missing fields on summary');
74
+ (0, Common_1.fail)('Missing fields on summary');
75
75
  }
76
76
  exports.getSummaryStatistics = getSummaryStatistics;
77
77
  //# sourceMappingURL=SummaryBackCompatibility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryBackCompatibility.js","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,qCAAgC;AAChC,uCAAiE;AACjE,uDAAmH;AAEnH;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,WAAmB,EAAE,UAA4B;IAC5E,IAAI,OAAuC,CAAC;IAC5C,IAAI;QACH,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KACxC;IAAC,WAAM;QACP,aAAI,CAAC,8BAA8B,CAAC,CAAC;KACrC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAChC,aAAI,CAAC,0BAA0B,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,SAAS,EAAE;QAC1B,uBAAS,OAAO,IAAK,OAAO,EAAG;KAC/B;IAED,aAAI,CAAC,2BAA2B,CAAC,CAAC;AACnC,CAAC;AAnBD,kCAmBC;AAgBD;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,OAA8B;IAClE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,6BAAW,CAAC,MAAM,EAAE;QACnC,MAAM,EAAE,WAAW,EAAE,GAAG,OAA4B,CAAC;QAErD,IAAI,WAAW,KAAK,SAAS,EAAE;YAC9B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACpC,aAAI,CAAC,+BAA+B,CAAC,CAAC;aACtC;YAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAE5C,oHAAoH;YACpH,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;gBACtD,OAAO;oBACN,aAAa,EAAE,OAAO;oBACtB,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,mBAAmB,EAAE,UAAU,CAAC,MAAM;oBACtC,cAAc,EAAE,8CAAoC,CAAC,WAAW,CAAC;iBACjE,CAAC;aACF;YAED,aAAI,CAAC,oCAAoC,CAAC,CAAC;SAC3C;KACD;SAAM,IAAI,OAAO,KAAK,6BAAW,CAAC,MAAM,EAAE;QAC1C,MAAM,EAAE,cAAc,EAAE,GAAG,OAAkC,CAAC;QAE9D,OAAO;YACN,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,cAAc,CAAC,MAAM;SAClC,CAAC;KACF;SAAM;QACN,aAAI,CAAC,iCAAiC,CAAC,CAAC;KACxC;IAED,aAAI,CAAC,2BAA2B,CAAC,CAAC;AACnC,CAAC;AArCD,oDAqCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ITelemetryProperties } from '@fluidframework/common-definitions';\nimport type { IFluidSerializer } from '@fluidframework/shared-object-base';\nimport { fail } from './Common';\nimport { getNumberOfHandlesFromEditLogSummary } from './EditLog';\nimport { SharedTreeSummary, SharedTreeSummaryBase, SharedTreeSummary_0_0_2, WriteFormat } from './persisted-types';\n\n/**\n * Deserializes a JSON object produced by `serialize()` and uses it to initialize the tree with the encoded state.\n * Also constructs handle objects from their serialized form.\n *\n * @param jsonSummary - The string to deserialize.\n * @param serializer - The serializer required to deserialize handles in the string.\n * @returns A SharedTree summary.\n * @throws If the summary could not be interpreted.\n *\n */\nexport function deserialize(jsonSummary: string, serializer: IFluidSerializer): SharedTreeSummaryBase {\n\tlet summary: Partial<SharedTreeSummaryBase>;\n\ttry {\n\t\tsummary = serializer.parse(jsonSummary);\n\t} catch {\n\t\tfail('Json syntax error in Summary');\n\t}\n\n\tif (typeof summary !== 'object') {\n\t\tfail('Summary is not an object');\n\t}\n\n\tconst { version } = summary;\n\n\tif (version !== undefined) {\n\t\treturn { version, ...summary };\n\t}\n\n\tfail('Missing fields on summary');\n}\n\n/**\n * General statistics about summaries.\n */\nexport interface SummaryStatistics extends ITelemetryProperties {\n\t/** Format version the summary is written in. */\n\treadonly formatVersion: string;\n\t/** Number of edits. */\n\treadonly historySize: number;\n\t/** Number of edit chunks in the history. */\n\treadonly totalNumberOfChunks?: number;\n\t/** Number of chunks in the summary that have handles stored. */\n\treadonly uploadedChunks?: number;\n}\n\n/**\n * @returns SummaryStatistics.\n * @throws If statistics could not be obtained from the summary.\n */\nexport function getSummaryStatistics(summary: SharedTreeSummaryBase): SummaryStatistics {\n\tconst { version } = summary;\n\n\tif (version === WriteFormat.v0_1_1) {\n\t\tconst { editHistory } = summary as SharedTreeSummary;\n\n\t\tif (editHistory !== undefined) {\n\t\t\tif (typeof editHistory !== 'object') {\n\t\t\t\tfail('Edit history is not an object');\n\t\t\t}\n\n\t\t\tconst { editChunks, editIds } = editHistory;\n\n\t\t\t// TODO:#45414: Add more robust validation of the summary's fields. Even if they are present, they may be malformed.\n\t\t\tif (editChunks !== undefined && editIds !== undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tformatVersion: version,\n\t\t\t\t\thistorySize: editIds.length,\n\t\t\t\t\ttotalNumberOfChunks: editChunks.length,\n\t\t\t\t\tuploadedChunks: getNumberOfHandlesFromEditLogSummary(editHistory),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfail('Missing fields on edit log summary');\n\t\t}\n\t} else if (version === WriteFormat.v0_0_2) {\n\t\tconst { sequencedEdits } = summary as SharedTreeSummary_0_0_2;\n\n\t\treturn {\n\t\t\tformatVersion: version,\n\t\t\thistorySize: sequencedEdits.length,\n\t\t};\n\t} else {\n\t\tfail('Format version is not supported');\n\t}\n\n\tfail('Missing fields on summary');\n}\n"]}
1
+ {"version":3,"file":"SummaryBackCompatibility.js","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,qCAAgC;AAChC,uCAAiE;AACjE,uDAAmH;AAEnH;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,WAAmB,EAAE,UAA4B;IAC5E,IAAI,OAAuC,CAAC;IAC5C,IAAI;QACH,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KACxC;IAAC,WAAM;QACP,IAAA,aAAI,EAAC,8BAA8B,CAAC,CAAC;KACrC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAChC,IAAA,aAAI,EAAC,0BAA0B,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,SAAS,EAAE;QAC1B,uBAAS,OAAO,IAAK,OAAO,EAAG;KAC/B;IAED,IAAA,aAAI,EAAC,2BAA2B,CAAC,CAAC;AACnC,CAAC;AAnBD,kCAmBC;AAgBD;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,OAA8B;IAClE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,6BAAW,CAAC,MAAM,EAAE;QACnC,MAAM,EAAE,WAAW,EAAE,GAAG,OAA4B,CAAC;QAErD,IAAI,WAAW,KAAK,SAAS,EAAE;YAC9B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACpC,IAAA,aAAI,EAAC,+BAA+B,CAAC,CAAC;aACtC;YAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAE5C,oHAAoH;YACpH,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;gBACtD,OAAO;oBACN,aAAa,EAAE,OAAO;oBACtB,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,mBAAmB,EAAE,UAAU,CAAC,MAAM;oBACtC,cAAc,EAAE,IAAA,8CAAoC,EAAC,WAAW,CAAC;iBACjE,CAAC;aACF;YAED,IAAA,aAAI,EAAC,oCAAoC,CAAC,CAAC;SAC3C;KACD;SAAM,IAAI,OAAO,KAAK,6BAAW,CAAC,MAAM,EAAE;QAC1C,MAAM,EAAE,cAAc,EAAE,GAAG,OAAkC,CAAC;QAE9D,OAAO;YACN,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,cAAc,CAAC,MAAM;SAClC,CAAC;KACF;SAAM;QACN,IAAA,aAAI,EAAC,iCAAiC,CAAC,CAAC;KACxC;IAED,IAAA,aAAI,EAAC,2BAA2B,CAAC,CAAC;AACnC,CAAC;AArCD,oDAqCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ITelemetryProperties } from '@fluidframework/common-definitions';\nimport type { IFluidSerializer } from '@fluidframework/shared-object-base';\nimport { fail } from './Common';\nimport { getNumberOfHandlesFromEditLogSummary } from './EditLog';\nimport { SharedTreeSummary, SharedTreeSummaryBase, SharedTreeSummary_0_0_2, WriteFormat } from './persisted-types';\n\n/**\n * Deserializes a JSON object produced by `serialize()` and uses it to initialize the tree with the encoded state.\n * Also constructs handle objects from their serialized form.\n *\n * @param jsonSummary - The string to deserialize.\n * @param serializer - The serializer required to deserialize handles in the string.\n * @returns A SharedTree summary.\n * @throws If the summary could not be interpreted.\n *\n */\nexport function deserialize(jsonSummary: string, serializer: IFluidSerializer): SharedTreeSummaryBase {\n\tlet summary: Partial<SharedTreeSummaryBase>;\n\ttry {\n\t\tsummary = serializer.parse(jsonSummary);\n\t} catch {\n\t\tfail('Json syntax error in Summary');\n\t}\n\n\tif (typeof summary !== 'object') {\n\t\tfail('Summary is not an object');\n\t}\n\n\tconst { version } = summary;\n\n\tif (version !== undefined) {\n\t\treturn { version, ...summary };\n\t}\n\n\tfail('Missing fields on summary');\n}\n\n/**\n * General statistics about summaries.\n */\nexport interface SummaryStatistics extends ITelemetryProperties {\n\t/** Format version the summary is written in. */\n\treadonly formatVersion: string;\n\t/** Number of edits. */\n\treadonly historySize: number;\n\t/** Number of edit chunks in the history. */\n\treadonly totalNumberOfChunks?: number;\n\t/** Number of chunks in the summary that have handles stored. */\n\treadonly uploadedChunks?: number;\n}\n\n/**\n * @returns SummaryStatistics.\n * @throws If statistics could not be obtained from the summary.\n */\nexport function getSummaryStatistics(summary: SharedTreeSummaryBase): SummaryStatistics {\n\tconst { version } = summary;\n\n\tif (version === WriteFormat.v0_1_1) {\n\t\tconst { editHistory } = summary as SharedTreeSummary;\n\n\t\tif (editHistory !== undefined) {\n\t\t\tif (typeof editHistory !== 'object') {\n\t\t\t\tfail('Edit history is not an object');\n\t\t\t}\n\n\t\t\tconst { editChunks, editIds } = editHistory;\n\n\t\t\t// TODO:#45414: Add more robust validation of the summary's fields. Even if they are present, they may be malformed.\n\t\t\tif (editChunks !== undefined && editIds !== undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tformatVersion: version,\n\t\t\t\t\thistorySize: editIds.length,\n\t\t\t\t\ttotalNumberOfChunks: editChunks.length,\n\t\t\t\t\tuploadedChunks: getNumberOfHandlesFromEditLogSummary(editHistory),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfail('Missing fields on edit log summary');\n\t\t}\n\t} else if (version === WriteFormat.v0_0_2) {\n\t\tconst { sequencedEdits } = summary as SharedTreeSummary_0_0_2;\n\n\t\treturn {\n\t\t\tformatVersion: version,\n\t\t\thistorySize: sequencedEdits.length,\n\t\t};\n\t} else {\n\t\tfail('Format version is not supported');\n\t}\n\n\tfail('Missing fields on summary');\n}\n"]}
@@ -79,7 +79,7 @@ class Transaction extends common_utils_1.TypedEventEmitter {
79
79
  if (this.isOpen) {
80
80
  if (this.transaction.changes.length > 0) {
81
81
  const result = this.transaction.close();
82
- const edit = { id: EditUtilities_1.newEditId(), changes: result.changes };
82
+ const edit = { id: (0, EditUtilities_1.newEditId)(), changes: result.changes };
83
83
  if (this.tree.edits instanceof LogViewer_1.CachingLogViewer) {
84
84
  this.tree.edits.setKnownEditingResult(edit, result);
85
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Transaction.js","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAAiE;AACjE,uDAAqE;AACrE,mDAA4C;AAI5C,+DAAgF;AAChF,2CAA+C;AAE/C;;;GAGG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC3B;;OAEG;IACH,6CAAyB,CAAA;AAC1B,CAAC,EALW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAK3B;AAUD;;;GAGG;AACH,MAAa,WAAY,SAAQ,gCAAoC;IAKpE;;;;OAIG;IACH,YAAmC,IAAgB;QAClD,KAAK,EAAE,CAAC;QAD0B,SAAI,GAAJ,IAAI,CAAY;QAElD,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,wCAAkB,CAAC,WAAW,EAAE,IAAI,yCAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,4BAAU,CAAC,OAAO,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9B,CAAC;IAYM,KAAK,CAAC,aAAgC,EAAE,GAAG,IAAc;QAC/D,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClF,IACC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;oBACnD,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAC7C;oBACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;iBACvE;aACD;SACD;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,cAAc;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAyB,EAAE,EAAE,EAAE,yBAAS,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChF,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,4BAAgB,EAAE;oBAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;iBACpD;gBACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;aAClC;SACD;IACF,CAAC;CACD;AAlFD,kCAkFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IErrorEvent } from '@fluidframework/common-definitions';\nimport { TypedEventEmitter } from '@fluidframework/common-utils';\nimport { ChangeInternal, Edit, EditStatus } from './persisted-types';\nimport { newEditId } from './EditUtilities';\nimport { TreeView } from './TreeView';\nimport { Change } from './ChangeTypes';\nimport { SharedTree } from './SharedTree';\nimport { GenericTransaction, TransactionInternal } from './TransactionInternal';\nimport { CachingLogViewer } from './LogViewer';\n\n/**\n * An event emitted by a `Transaction` to indicate a state change. See {@link TransactionEvents} for event argument information.\n * @public\n */\nexport enum TransactionEvent {\n\t/**\n\t * `currentView` has changed from `before` to `after`\n\t */\n\tViewChange = 'viewChange',\n}\n\n/**\n * Events which may be emitted by `Transaction`\n * @public\n */\nexport interface TransactionEvents extends IErrorEvent {\n\t(event: TransactionEvent.ViewChange, listener: (before: TreeView, after: TreeView) => void);\n}\n\n/**\n * Buffers changes to be applied to an isolated view of a `SharedTree` over time before applying them directly to the tree itself as a\n * single edit\n */\nexport class Transaction extends TypedEventEmitter<TransactionEvents> {\n\t/** The view of the tree when this transaction was created */\n\tpublic readonly startingView: TreeView;\n\tprivate readonly transaction: GenericTransaction;\n\n\t/**\n\t * Create a new transaction over the given tree. The tree's `currentView` at this time will become the `startingView` for this\n\t * transaction.\n\t * @param tree - the `SharedTree` that this transaction applies changes to\n\t */\n\tpublic constructor(public readonly tree: SharedTree) {\n\t\tsuper();\n\t\tconst { currentView } = tree;\n\t\tthis.transaction = new GenericTransaction(currentView, new TransactionInternal.Policy());\n\t\tthis.startingView = currentView;\n\t}\n\n\t/**\n\t * True if this transaction is open, false if it is closed. A transaction may be closed manually via `closeAndApplyEdit()`, or may\n\t * be automatically closed by a change in this transaction failing to apply (see `applyChange()`).\n\t */\n\tpublic get isOpen(): boolean {\n\t\treturn this.transaction.isOpen && this.status === EditStatus.Applied;\n\t}\n\n\t/**\n\t * The status of the most recently applied change in this transaction\n\t */\n\tpublic get status(): EditStatus {\n\t\treturn this.transaction.status;\n\t}\n\n\t/**\n\t * The state of the tree following the most change that was successfully applied. If no changes have been applied, this is the same as\n\t * `startingView`.\n\t */\n\tpublic get currentView(): TreeView {\n\t\treturn this.transaction.view;\n\t}\n\n\t/**\n\t * Attempt to apply a sequence of changes in this transaction. The `currentView` will be updated to reflect the new tree state after all\n\t * applied changes. If any change fails to apply, the remaining changes will be ignored and this transaction will be automatically\n\t * closed (see `isOpen`). If this transaction is already closed, this method has no effect. This method will emit a\n\t * `TransactionEvent.ViewChange` event at most once per call.\n\t * @param changes - the changes to apply\n\t * @returns either the `EditStatus` of the given changes or the `EditStatus` of the last change before the transaction was closed\n\t */\n\tpublic apply(...changes: Change[]): EditStatus;\n\tpublic apply(changes: Change[]): EditStatus;\n\tpublic apply(headOrChanges: Change | Change[], ...tail: Change[]): EditStatus {\n\t\tif (this.isOpen) {\n\t\t\tconst changes = Array.isArray(headOrChanges) ? headOrChanges : [headOrChanges, ...tail];\n\t\t\tif (changes.length > 0) {\n\t\t\t\tconst previousView = this.currentView;\n\t\t\t\tthis.transaction.applyChanges(changes.map((c) => this.tree.internalizeChange(c)));\n\t\t\t\tif (\n\t\t\t\t\tthis.listenerCount(TransactionEvent.ViewChange) > 0 &&\n\t\t\t\t\t!previousView.hasEqualForest(this.currentView)\n\t\t\t\t) {\n\t\t\t\t\tthis.emit(TransactionEvent.ViewChange, previousView, this.currentView);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this.status;\n\t}\n\n\t/**\n\t * Close this transaction and apply its changes to the `SharedTree`. If this transaction is already closed, this method has no effect.\n\t */\n\tpublic closeAndCommit(): void {\n\t\tif (this.isOpen) {\n\t\t\tif (this.transaction.changes.length > 0) {\n\t\t\t\tconst result = this.transaction.close();\n\t\t\t\tconst edit: Edit<ChangeInternal> = { id: newEditId(), changes: result.changes };\n\t\t\t\tif (this.tree.edits instanceof CachingLogViewer) {\n\t\t\t\t\tthis.tree.edits.setKnownEditingResult(edit, result);\n\t\t\t\t}\n\t\t\t\tthis.tree.applyEditInternal(edit);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"Transaction.js","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAAiE;AACjE,uDAAqE;AACrE,mDAA4C;AAI5C,+DAAgF;AAChF,2CAA+C;AAE/C;;;GAGG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC3B;;OAEG;IACH,6CAAyB,CAAA;AAC1B,CAAC,EALW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAK3B;AAUD;;;GAGG;AACH,MAAa,WAAY,SAAQ,gCAAoC;IAKpE;;;;OAIG;IACH,YAAmC,IAAgB;QAClD,KAAK,EAAE,CAAC;QAD0B,SAAI,GAAJ,IAAI,CAAY;QAElD,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,wCAAkB,CAAC,WAAW,EAAE,IAAI,yCAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,4BAAU,CAAC,OAAO,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9B,CAAC;IAYM,KAAK,CAAC,aAAgC,EAAE,GAAG,IAAc;QAC/D,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClF,IACC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;oBACnD,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAC7C;oBACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;iBACvE;aACD;SACD;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,cAAc;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAyB,EAAE,EAAE,EAAE,IAAA,yBAAS,GAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChF,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,4BAAgB,EAAE;oBAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;iBACpD;gBACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;aAClC;SACD;IACF,CAAC;CACD;AAlFD,kCAkFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IErrorEvent } from '@fluidframework/common-definitions';\nimport { TypedEventEmitter } from '@fluidframework/common-utils';\nimport { ChangeInternal, Edit, EditStatus } from './persisted-types';\nimport { newEditId } from './EditUtilities';\nimport { TreeView } from './TreeView';\nimport { Change } from './ChangeTypes';\nimport { SharedTree } from './SharedTree';\nimport { GenericTransaction, TransactionInternal } from './TransactionInternal';\nimport { CachingLogViewer } from './LogViewer';\n\n/**\n * An event emitted by a `Transaction` to indicate a state change. See {@link TransactionEvents} for event argument information.\n * @public\n */\nexport enum TransactionEvent {\n\t/**\n\t * `currentView` has changed from `before` to `after`\n\t */\n\tViewChange = 'viewChange',\n}\n\n/**\n * Events which may be emitted by `Transaction`\n * @public\n */\nexport interface TransactionEvents extends IErrorEvent {\n\t(event: TransactionEvent.ViewChange, listener: (before: TreeView, after: TreeView) => void);\n}\n\n/**\n * Buffers changes to be applied to an isolated view of a `SharedTree` over time before applying them directly to the tree itself as a\n * single edit\n */\nexport class Transaction extends TypedEventEmitter<TransactionEvents> {\n\t/** The view of the tree when this transaction was created */\n\tpublic readonly startingView: TreeView;\n\tprivate readonly transaction: GenericTransaction;\n\n\t/**\n\t * Create a new transaction over the given tree. The tree's `currentView` at this time will become the `startingView` for this\n\t * transaction.\n\t * @param tree - the `SharedTree` that this transaction applies changes to\n\t */\n\tpublic constructor(public readonly tree: SharedTree) {\n\t\tsuper();\n\t\tconst { currentView } = tree;\n\t\tthis.transaction = new GenericTransaction(currentView, new TransactionInternal.Policy());\n\t\tthis.startingView = currentView;\n\t}\n\n\t/**\n\t * True if this transaction is open, false if it is closed. A transaction may be closed manually via `closeAndApplyEdit()`, or may\n\t * be automatically closed by a change in this transaction failing to apply (see `applyChange()`).\n\t */\n\tpublic get isOpen(): boolean {\n\t\treturn this.transaction.isOpen && this.status === EditStatus.Applied;\n\t}\n\n\t/**\n\t * The status of the most recently applied change in this transaction\n\t */\n\tpublic get status(): EditStatus {\n\t\treturn this.transaction.status;\n\t}\n\n\t/**\n\t * The state of the tree following the most change that was successfully applied. If no changes have been applied, this is the same as\n\t * `startingView`.\n\t */\n\tpublic get currentView(): TreeView {\n\t\treturn this.transaction.view;\n\t}\n\n\t/**\n\t * Attempt to apply a sequence of changes in this transaction. The `currentView` will be updated to reflect the new tree state after all\n\t * applied changes. If any change fails to apply, the remaining changes will be ignored and this transaction will be automatically\n\t * closed (see `isOpen`). If this transaction is already closed, this method has no effect. This method will emit a\n\t * `TransactionEvent.ViewChange` event at most once per call.\n\t * @param changes - the changes to apply\n\t * @returns either the `EditStatus` of the given changes or the `EditStatus` of the last change before the transaction was closed\n\t */\n\tpublic apply(...changes: Change[]): EditStatus;\n\tpublic apply(changes: Change[]): EditStatus;\n\tpublic apply(headOrChanges: Change | Change[], ...tail: Change[]): EditStatus {\n\t\tif (this.isOpen) {\n\t\t\tconst changes = Array.isArray(headOrChanges) ? headOrChanges : [headOrChanges, ...tail];\n\t\t\tif (changes.length > 0) {\n\t\t\t\tconst previousView = this.currentView;\n\t\t\t\tthis.transaction.applyChanges(changes.map((c) => this.tree.internalizeChange(c)));\n\t\t\t\tif (\n\t\t\t\t\tthis.listenerCount(TransactionEvent.ViewChange) > 0 &&\n\t\t\t\t\t!previousView.hasEqualForest(this.currentView)\n\t\t\t\t) {\n\t\t\t\t\tthis.emit(TransactionEvent.ViewChange, previousView, this.currentView);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this.status;\n\t}\n\n\t/**\n\t * Close this transaction and apply its changes to the `SharedTree`. If this transaction is already closed, this method has no effect.\n\t */\n\tpublic closeAndCommit(): void {\n\t\tif (this.isOpen) {\n\t\t\tif (this.transaction.changes.length > 0) {\n\t\t\t\tconst result = this.transaction.close();\n\t\t\t\tconst edit: Edit<ChangeInternal> = { id: newEditId(), changes: result.changes };\n\t\t\t\tif (this.tree.edits instanceof CachingLogViewer) {\n\t\t\t\t\tthis.tree.edits.setKnownEditingResult(edit, result);\n\t\t\t\t}\n\t\t\t\tthis.tree.applyEditInternal(edit);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}