@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
@@ -4,11 +4,13 @@
4
4
  */
5
5
  import { expect } from 'chai';
6
6
  import { v4, v5 } from 'uuid';
7
+ import { take } from '@fluid-internal/stochastic-test-utils';
7
8
  import { IdCompressor, isFinalId, isLocalId, hasOngoingSession, legacySharedTreeInitialTreeId, } from '../id-compressor/IdCompressor';
8
9
  import { assert, assertNotUndefined, fail } from '../Common';
9
- import { assertIsStableId, createSessionId as createSessionId, incrementUuid, isStableId, numericUuidFromStableId, stableIdFromNumericUuid, } from '../id-compressor/NumericUuid';
10
+ import { createSessionId, incrementUuid, numericUuidFromStableId, stableIdFromNumericUuid, } from '../id-compressor/NumericUuid';
10
11
  import { getIds } from '../id-compressor/IdRange';
11
- import { createCompressor, performFuzzActions, sessionIds, IdCompressorTestNetwork, Client, DestinationClient, MetaClient, expectSerializes, roundtrip, sessionNumericUuids, } from './utilities/IdCompressorTestUtilities';
12
+ import { assertIsStableId, generateStableId, isStableId } from '../UuidUtilities';
13
+ import { createCompressor, performFuzzActions, sessionIds, IdCompressorTestNetwork, Client, DestinationClient, MetaClient, expectSerializes, roundtrip, sessionNumericUuids, makeOpGenerator, attributionIds, } from './utilities/IdCompressorTestUtilities';
12
14
  import { expectDefined } from './utilities/TestCommon';
13
15
  describe('IdCompressor', () => {
14
16
  it('detects invalid cluster sizes', () => {
@@ -174,12 +176,51 @@ describe('IdCompressor', () => {
174
176
  expect(returnedIds).to.deep.equal(ids);
175
177
  });
176
178
  });
177
- it('only sends attribution info on the first range from each session', () => {
178
- const compressor = createCompressor(Client.Client1, 5, 'attribution');
179
+ it('has default attribution ID', () => {
180
+ const compressor = createCompressor(Client.Client1);
181
+ expectDefined(compressor.attributionId);
182
+ });
183
+ it('correctly uses explicit attribution ID', () => {
184
+ const attributionId = generateStableId();
185
+ const compressor = createCompressor(Client.Client1, 5, attributionId);
186
+ expect(compressor.attributionId).to.equal(attributionId);
179
187
  const range1 = compressor.takeNextCreationRange();
180
- expectDefined(range1.attributionInfo);
181
- const range2 = compressor.takeNextCreationRange();
182
- expect(range2.attributionInfo).to.be.undefined;
188
+ expect(compressor.attributionId).to.equal(attributionId);
189
+ expect(range1.attributionId).to.equal(attributionId);
190
+ });
191
+ it('only sends attribution ID until the first ID is allocated', () => {
192
+ const compressor = createCompressor(Client.Client1, 5, generateStableId());
193
+ let range = compressor.takeNextCreationRange();
194
+ expectDefined(range.attributionId);
195
+ range = compressor.takeNextCreationRange();
196
+ expectDefined(range.attributionId);
197
+ compressor.generateCompressedId();
198
+ range = compressor.takeNextCreationRange();
199
+ expectDefined(range.attributionId);
200
+ range = compressor.takeNextCreationRange();
201
+ expect(range.attributionId).to.be.undefined;
202
+ });
203
+ it('does not send default attribution ID', () => {
204
+ const compressor = createCompressor(Client.Client1);
205
+ const range = compressor.takeNextCreationRange();
206
+ expect(range.attributionId).to.be.undefined;
207
+ });
208
+ it('attributes correctly after unification', () => {
209
+ const compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));
210
+ const compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));
211
+ const id1 = compressor1.generateCompressedId('override');
212
+ const id2 = compressor2.generateCompressedId('override');
213
+ const range1 = compressor1.takeNextCreationRange();
214
+ const range2 = compressor2.takeNextCreationRange();
215
+ compressor1.finalizeCreationRange(range2); // 2 gets sequenced first
216
+ compressor2.finalizeCreationRange(range2);
217
+ compressor1.finalizeCreationRange(range1);
218
+ compressor2.finalizeCreationRange(range1);
219
+ expect(compressor1.normalizeToOpSpace(id1)).to.equal(compressor2.normalizeToOpSpace(id2));
220
+ expect(compressor1.attributeId(id1)).to.equal(attributionIds.get(Client.Client2));
221
+ expect(compressor1.attributeId(compressor1.recompress(compressor2.decompress(id2)))).to.equal(attributionIds.get(Client.Client2));
222
+ expect(compressor2.attributeId(compressor2.recompress(compressor1.decompress(id1)))).to.equal(attributionIds.get(Client.Client2));
223
+ expect(compressor2.attributeId(id2)).to.equal(attributionIds.get(Client.Client2));
183
224
  });
184
225
  describe('can produce a creation range', () => {
185
226
  const tests = [
@@ -467,8 +508,8 @@ describe('IdCompressor', () => {
467
508
  expect(serializedNoSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');
468
509
  });
469
510
  it('correctly deserializes and resumes a session', () => {
470
- const compressor1 = createCompressor(Client.Client1, undefined, Client.Client1);
471
- const compressor2 = createCompressor(Client.Client2, undefined, Client.Client2);
511
+ const compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));
512
+ const compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));
472
513
  compressor1.generateCompressedId();
473
514
  const creationRange = compressor1.takeNextCreationRange();
474
515
  compressor1.finalizeCreationRange(creationRange);
@@ -482,6 +523,16 @@ describe('IdCompressor', () => {
482
523
  expect(IdCompressor.deserialize(compressor1.serialize(false), createSessionId()).equals(IdCompressor.deserialize(compressor2.serialize(false), createSessionId()), false // don't compare local state
483
524
  )).to.be.true;
484
525
  });
526
+ it('can serialize local state with attribution but no IDs', () => {
527
+ // This is a regression test for the scenario in which an ID compressor sends its first range, which
528
+ // includes its attribution ID, but has made no IDs. An incorrect optimization when serializing had
529
+ // omitted local state if no IDs had been allocated, but then also dropped the `sentAttribution` flag
530
+ const compressor = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));
531
+ const range = compressor.takeNextCreationRange();
532
+ expect(range.ids).to.be.undefined;
533
+ expect(range.attributionId).to.equal(attributionIds.get(Client.Client1));
534
+ expectSerializes(compressor);
535
+ });
485
536
  });
486
537
  // No validation, as these leave the network in a broken state
487
538
  describeNetworkNoValidation('detects UUID collision', (itNetwork) => {
@@ -526,16 +577,16 @@ describe('IdCompressor', () => {
526
577
  const compressor = network.getCompressor(Client.Client1);
527
578
  network.allocateAndSendIds(Client.Client1, 1);
528
579
  const id = network.getIdLog(Client.Client1)[0].id;
529
- expect(compressor.attributeId(id)).to.equal(Client.Client1);
580
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));
530
581
  network.deliverOperations(Client.Client1);
531
- expect(compressor.attributeId(id)).to.equal(Client.Client1);
582
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));
532
583
  });
533
584
  itNetwork('final IDs from a remote session', (network) => {
534
585
  const compressor = network.getCompressor(Client.Client1);
535
586
  network.allocateAndSendIds(Client.Client2, 1);
536
587
  network.deliverOperations(DestinationClient.All);
537
588
  const id = network.getSequencedIdLog(Client.Client1)[0].id;
538
- expect(compressor.attributeId(id)).to.equal(Client.Client2);
589
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client2));
539
590
  });
540
591
  itNetwork('final IDs from multiple remote sessions', 1, (network) => {
541
592
  const compressor = network.getCompressor(Client.Client1);
@@ -548,12 +599,12 @@ describe('IdCompressor', () => {
548
599
  network.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);
549
600
  network.deliverOperations(DestinationClient.All);
550
601
  const log = network.getSequencedIdLog(Client.Client1);
551
- expect(compressor.attributeId(log[0].id)).to.equal(Client.Client1);
552
- expect(compressor.attributeId(log[1].id)).to.equal(Client.Client2);
553
- expect(compressor.attributeId(log[2].id)).to.equal(Client.Client3);
554
- expect(compressor.attributeId(log[3].id)).to.equal(Client.Client1);
555
- expect(compressor.attributeId(log[4].id)).to.equal(Client.Client2);
556
- expect(compressor.attributeId(log[5].id)).to.equal(Client.Client3);
602
+ expect(compressor.attributeId(log[0].id)).to.equal(attributionIds.get(Client.Client1));
603
+ expect(compressor.attributeId(log[1].id)).to.equal(attributionIds.get(Client.Client2));
604
+ expect(compressor.attributeId(log[2].id)).to.equal(attributionIds.get(Client.Client3));
605
+ expect(compressor.attributeId(log[3].id)).to.equal(attributionIds.get(Client.Client1));
606
+ expect(compressor.attributeId(log[4].id)).to.equal(attributionIds.get(Client.Client2));
607
+ expect(compressor.attributeId(log[5].id)).to.equal(attributionIds.get(Client.Client3));
557
608
  });
558
609
  itNetwork('unified IDs', (network) => {
559
610
  const override = 'override';
@@ -561,14 +612,14 @@ describe('IdCompressor', () => {
561
612
  for (const [client, compressor] of allTargets) {
562
613
  network.allocateAndSendIds(client, 1, { 0: override });
563
614
  for (const { id } of network.getIdLog(client)) {
564
- expect(compressor.attributeId(id)).to.equal(client);
615
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(client));
565
616
  }
566
617
  }
567
618
  network.deliverOperations(DestinationClient.All);
568
619
  const firstTarget = allTargets[0][0];
569
620
  for (const [client, compressor] of allTargets) {
570
621
  for (const { id } of network.getIdLog(client)) {
571
- expect(compressor.attributeId(id)).to.equal(firstTarget);
622
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(firstTarget));
572
623
  }
573
624
  }
574
625
  });
@@ -775,7 +826,8 @@ describe('IdCompressor', () => {
775
826
  });
776
827
  });
777
828
  itNetwork('produces consistent IDs with large fuzz input', (network) => {
778
- performFuzzActions(network, 1984, true, undefined, true, 1000, 25, (network) => network.assertNetworkState());
829
+ const generator = take(1000, makeOpGenerator({ includeOverrides: true }));
830
+ performFuzzActions(generator, network, 1984, undefined, true, (network) => network.assertNetworkState());
779
831
  network.deliverOperations(DestinationClient.All);
780
832
  });
781
833
  itNetwork('can set the cluster size via constructor', 2, (network) => {
@@ -1015,7 +1067,8 @@ describe('IdCompressor', () => {
1015
1067
  expectSequencedLogsAlign(network, Client.Client1, Client.Client2);
1016
1068
  });
1017
1069
  itNetwork('can serialize after a large fuzz input', 3, (network) => {
1018
- performFuzzActions(network, Math.PI, true, undefined, true, 1000, 25, (network) => {
1070
+ const generator = take(1000, makeOpGenerator({ includeOverrides: true }));
1071
+ performFuzzActions(generator, network, Math.PI, undefined, true, (network) => {
1019
1072
  // Periodically check that everyone in the network has the same serialized state
1020
1073
  network.deliverOperations(DestinationClient.All);
1021
1074
  const compressors = network.getTargetCompressors(DestinationClient.All);
@@ -1048,9 +1101,7 @@ function createNetworkTestFunction(validateAfter) {
1048
1101
  it(title, () => {
1049
1102
  const hasCapacity = typeof testOrCapacity === 'number';
1050
1103
  const capacity = hasCapacity ? testOrCapacity : undefined;
1051
- // TODO: This cast can be removed on typescript 4.6
1052
1104
  const network = new IdCompressorTestNetwork(capacity);
1053
- // TODO: This cast can be removed on typescript 4.6
1054
1105
  (hasCapacity ? assertNotUndefined(test) : testOrCapacity)(network);
1055
1106
  if (validateAfter) {
1056
1107
  network.deliverOperations(DestinationClient.All);