@fluidframework/id-compressor 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.245554

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 (263) hide show
  1. package/.eslintrc.cjs +5 -5
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/id-compressor.api.md +2 -2
  8. package/dist/finalSpace.d.ts +2 -2
  9. package/dist/finalSpace.d.ts.map +1 -1
  10. package/dist/finalSpace.js +4 -4
  11. package/dist/finalSpace.js.map +1 -1
  12. package/dist/id-compressor-alpha.d.ts +114 -47
  13. package/dist/id-compressor-beta.d.ts +83 -75
  14. package/dist/id-compressor-public.d.ts +83 -75
  15. package/dist/id-compressor-untrimmed.d.ts +114 -47
  16. package/dist/idCompressor.d.ts +9 -3
  17. package/dist/idCompressor.d.ts.map +1 -1
  18. package/dist/idCompressor.js +76 -64
  19. package/dist/idCompressor.js.map +1 -1
  20. package/dist/identifiers.d.ts +1 -1
  21. package/dist/identifiers.d.ts.map +1 -1
  22. package/dist/identifiers.js.map +1 -1
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +8 -8
  26. package/dist/index.js.map +1 -1
  27. package/dist/package.json +3 -0
  28. package/dist/packageVersion.d.ts +1 -1
  29. package/dist/packageVersion.js +1 -1
  30. package/dist/packageVersion.js.map +1 -1
  31. package/dist/persistanceUtilities.d.ts +1 -1
  32. package/dist/persistanceUtilities.d.ts.map +1 -1
  33. package/dist/persistanceUtilities.js.map +1 -1
  34. package/dist/sessionSpaceNormalizer.d.ts +2 -2
  35. package/dist/sessionSpaceNormalizer.d.ts.map +1 -1
  36. package/dist/sessionSpaceNormalizer.js +4 -4
  37. package/dist/sessionSpaceNormalizer.js.map +1 -1
  38. package/dist/sessions.d.ts +2 -2
  39. package/dist/sessions.d.ts.map +1 -1
  40. package/dist/sessions.js +12 -12
  41. package/dist/sessions.js.map +1 -1
  42. package/dist/test/appendOnlySortedMap.perf.spec.d.ts +6 -0
  43. package/dist/test/appendOnlySortedMap.perf.spec.d.ts.map +1 -0
  44. package/dist/test/appendOnlySortedMap.perf.spec.js.map +1 -0
  45. package/dist/test/appendOnlySortedMap.spec.d.ts +6 -0
  46. package/dist/test/appendOnlySortedMap.spec.d.ts.map +1 -0
  47. package/dist/test/appendOnlySortedMap.spec.js.map +1 -0
  48. package/dist/test/idCompressor.perf.spec.d.ts +6 -0
  49. package/dist/test/idCompressor.perf.spec.d.ts.map +1 -0
  50. package/dist/test/idCompressor.perf.spec.js.map +1 -0
  51. package/dist/test/idCompressor.spec.d.ts +6 -0
  52. package/dist/test/idCompressor.spec.d.ts.map +1 -0
  53. package/dist/test/idCompressor.spec.js.map +1 -0
  54. package/dist/test/idCompressorTestUtilities.d.ts +245 -0
  55. package/dist/test/idCompressorTestUtilities.d.ts.map +1 -0
  56. package/dist/test/idCompressorTestUtilities.js +589 -0
  57. package/dist/test/idCompressorTestUtilities.js.map +1 -0
  58. package/dist/test/index.d.ts +9 -0
  59. package/dist/test/index.d.ts.map +1 -0
  60. package/dist/test/index.js +13 -0
  61. package/dist/test/index.js.map +1 -0
  62. package/dist/test/numericUuid.spec.d.ts +6 -0
  63. package/dist/test/numericUuid.spec.d.ts.map +1 -0
  64. package/dist/test/numericUuid.spec.js.map +1 -0
  65. package/dist/test/sessionSpaceNormalizer.spec.d.ts +6 -0
  66. package/dist/test/sessionSpaceNormalizer.spec.d.ts.map +1 -0
  67. package/dist/test/sessionSpaceNormalizer.spec.js.map +1 -0
  68. package/dist/test/snapshots/dirname.cjs +16 -0
  69. package/dist/test/snapshots/dirname.cjs.map +1 -0
  70. package/dist/test/snapshots/dirname.d.cts +6 -0
  71. package/dist/test/snapshots/dirname.d.cts.map +1 -0
  72. package/{lib/types/idCompressor.mjs → dist/test/snapshots/summary.spec.d.ts} +1 -1
  73. package/dist/test/snapshots/summary.spec.d.ts.map +1 -0
  74. package/dist/test/snapshots/summary.spec.js.map +1 -0
  75. package/dist/test/testCommon.d.ts +90 -0
  76. package/dist/test/testCommon.d.ts.map +1 -0
  77. package/dist/test/testCommon.js +90 -0
  78. package/dist/test/testCommon.js.map +1 -0
  79. package/dist/tsdoc-metadata.json +1 -1
  80. package/dist/types/idCompressor.d.ts +134 -67
  81. package/dist/types/idCompressor.d.ts.map +1 -1
  82. package/dist/types/idCompressor.js.map +1 -1
  83. package/dist/types/index.d.ts +3 -3
  84. package/dist/types/index.d.ts.map +1 -1
  85. package/dist/types/index.js.map +1 -1
  86. package/dist/types/persisted-types/0.0.1.d.ts +1 -1
  87. package/dist/types/persisted-types/0.0.1.d.ts.map +1 -1
  88. package/dist/types/persisted-types/0.0.1.js.map +1 -1
  89. package/dist/types/persisted-types/index.d.ts +1 -1
  90. package/dist/types/persisted-types/index.d.ts.map +1 -1
  91. package/dist/types/persisted-types/index.js.map +1 -1
  92. package/dist/utilities.d.ts +2 -2
  93. package/dist/utilities.d.ts.map +1 -1
  94. package/dist/utilities.js.map +1 -1
  95. package/lib/{appendOnlySortedMap.d.mts → appendOnlySortedMap.d.ts} +1 -1
  96. package/lib/appendOnlySortedMap.d.ts.map +1 -0
  97. package/lib/{appendOnlySortedMap.mjs → appendOnlySortedMap.js} +3 -1
  98. package/lib/appendOnlySortedMap.js.map +1 -0
  99. package/lib/{finalSpace.d.mts → finalSpace.d.ts} +3 -3
  100. package/lib/finalSpace.d.ts.map +1 -0
  101. package/lib/{finalSpace.mjs → finalSpace.js} +2 -2
  102. package/lib/finalSpace.js.map +1 -0
  103. package/lib/{id-compressor-alpha.d.mts → id-compressor-alpha.d.ts} +114 -47
  104. package/lib/id-compressor-beta.d.ts +179 -0
  105. package/lib/id-compressor-public.d.ts +179 -0
  106. package/lib/{id-compressor-untrimmed.d.mts → id-compressor-untrimmed.d.ts} +114 -47
  107. package/lib/{idCompressor.d.mts → idCompressor.d.ts} +10 -4
  108. package/lib/idCompressor.d.ts.map +1 -0
  109. package/lib/{idCompressor.mjs → idCompressor.js} +20 -8
  110. package/lib/idCompressor.js.map +1 -0
  111. package/lib/{identifiers.d.mts → identifiers.d.ts} +2 -2
  112. package/lib/identifiers.d.ts.map +1 -0
  113. package/lib/{identifiers.mjs → identifiers.js} +1 -1
  114. package/lib/identifiers.js.map +1 -0
  115. package/lib/{index.d.mts → index.d.ts} +7 -4
  116. package/lib/index.d.ts.map +1 -0
  117. package/lib/{index.mjs → index.js} +6 -3
  118. package/lib/index.js.map +1 -0
  119. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  120. package/lib/packageVersion.d.ts.map +1 -0
  121. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  122. package/lib/packageVersion.js.map +1 -0
  123. package/lib/{persistanceUtilities.d.mts → persistanceUtilities.d.ts} +2 -2
  124. package/lib/persistanceUtilities.d.ts.map +1 -0
  125. package/lib/{persistanceUtilities.mjs → persistanceUtilities.js} +1 -1
  126. package/lib/persistanceUtilities.js.map +1 -0
  127. package/lib/{sessionSpaceNormalizer.d.mts → sessionSpaceNormalizer.d.ts} +3 -3
  128. package/lib/sessionSpaceNormalizer.d.ts.map +1 -0
  129. package/lib/{sessionSpaceNormalizer.mjs → sessionSpaceNormalizer.js} +3 -3
  130. package/lib/sessionSpaceNormalizer.js.map +1 -0
  131. package/lib/{sessions.d.mts → sessions.d.ts} +3 -3
  132. package/lib/sessions.d.ts.map +1 -0
  133. package/lib/{sessions.mjs → sessions.js} +2 -2
  134. package/lib/sessions.js.map +1 -0
  135. package/lib/test/appendOnlySortedMap.perf.spec.d.ts +6 -0
  136. package/lib/test/appendOnlySortedMap.perf.spec.d.ts.map +1 -0
  137. package/lib/test/appendOnlySortedMap.perf.spec.js +49 -0
  138. package/lib/test/appendOnlySortedMap.perf.spec.js.map +1 -0
  139. package/lib/test/appendOnlySortedMap.spec.d.ts +6 -0
  140. package/lib/test/appendOnlySortedMap.spec.d.ts.map +1 -0
  141. package/lib/test/appendOnlySortedMap.spec.js +166 -0
  142. package/lib/test/appendOnlySortedMap.spec.js.map +1 -0
  143. package/lib/test/idCompressor.perf.spec.d.ts +6 -0
  144. package/lib/test/idCompressor.perf.spec.d.ts.map +1 -0
  145. package/lib/test/idCompressor.perf.spec.js +281 -0
  146. package/lib/test/idCompressor.perf.spec.js.map +1 -0
  147. package/lib/test/idCompressor.spec.d.ts +6 -0
  148. package/lib/test/idCompressor.spec.d.ts.map +1 -0
  149. package/lib/test/idCompressor.spec.js +953 -0
  150. package/lib/test/idCompressor.spec.js.map +1 -0
  151. package/lib/test/idCompressorTestUtilities.d.ts +245 -0
  152. package/lib/test/idCompressorTestUtilities.d.ts.map +1 -0
  153. package/lib/test/idCompressorTestUtilities.js +576 -0
  154. package/lib/test/idCompressorTestUtilities.js.map +1 -0
  155. package/lib/test/index.d.ts +9 -0
  156. package/lib/test/index.d.ts.map +1 -0
  157. package/lib/test/index.js +9 -0
  158. package/lib/test/index.js.map +1 -0
  159. package/lib/test/numericUuid.spec.d.ts +6 -0
  160. package/lib/test/numericUuid.spec.d.ts.map +1 -0
  161. package/lib/test/numericUuid.spec.js +74 -0
  162. package/lib/test/numericUuid.spec.js.map +1 -0
  163. package/lib/test/sessionSpaceNormalizer.spec.d.ts +6 -0
  164. package/lib/test/sessionSpaceNormalizer.spec.d.ts.map +1 -0
  165. package/lib/test/sessionSpaceNormalizer.spec.js +43 -0
  166. package/lib/test/sessionSpaceNormalizer.spec.js.map +1 -0
  167. package/lib/test/snapshots/dirname.cjs +16 -0
  168. package/lib/test/snapshots/dirname.cjs.map +1 -0
  169. package/lib/test/snapshots/dirname.d.cts +6 -0
  170. package/lib/test/snapshots/dirname.d.cts.map +1 -0
  171. package/lib/test/snapshots/summary.spec.d.ts +6 -0
  172. package/lib/test/snapshots/summary.spec.d.ts.map +1 -0
  173. package/lib/test/snapshots/summary.spec.js +127 -0
  174. package/lib/test/snapshots/summary.spec.js.map +1 -0
  175. package/lib/test/testCommon.d.ts +90 -0
  176. package/lib/test/testCommon.d.ts.map +1 -0
  177. package/lib/test/testCommon.js +80 -0
  178. package/lib/test/testCommon.js.map +1 -0
  179. package/lib/types/{idCompressor.d.mts → idCompressor.d.ts} +135 -68
  180. package/lib/types/idCompressor.d.ts.map +1 -0
  181. package/lib/types/{identifiers.mjs → idCompressor.js} +1 -1
  182. package/lib/types/idCompressor.js.map +1 -0
  183. package/lib/types/{identifiers.d.mts → identifiers.d.ts} +1 -1
  184. package/lib/types/identifiers.d.ts.map +1 -0
  185. package/lib/types/identifiers.js +6 -0
  186. package/lib/types/identifiers.js.map +1 -0
  187. package/lib/types/{index.d.mts → index.d.ts} +4 -4
  188. package/lib/types/index.d.ts.map +1 -0
  189. package/lib/types/{persisted-types/0.0.1.mjs → index.js} +1 -1
  190. package/lib/types/index.js.map +1 -0
  191. package/lib/types/persisted-types/{0.0.1.d.mts → 0.0.1.d.ts} +2 -2
  192. package/lib/types/persisted-types/0.0.1.d.ts.map +1 -0
  193. package/lib/types/persisted-types/{index.mjs → 0.0.1.js} +1 -1
  194. package/lib/types/persisted-types/0.0.1.js.map +1 -0
  195. package/lib/types/persisted-types/{index.d.mts → index.d.ts} +2 -2
  196. package/lib/types/persisted-types/index.d.ts.map +1 -0
  197. package/lib/types/{index.mjs → persisted-types/index.js} +1 -1
  198. package/lib/types/persisted-types/index.js.map +1 -0
  199. package/lib/{utilities.d.mts → utilities.d.ts} +3 -3
  200. package/lib/utilities.d.ts.map +1 -0
  201. package/lib/{utilities.mjs → utilities.js} +2 -1
  202. package/lib/utilities.js.map +1 -0
  203. package/package.json +88 -22
  204. package/src/finalSpace.ts +2 -2
  205. package/src/idCompressor.ts +22 -8
  206. package/src/identifiers.ts +1 -1
  207. package/src/index.ts +3 -3
  208. package/src/packageVersion.ts +1 -1
  209. package/src/persistanceUtilities.ts +1 -1
  210. package/src/sessionSpaceNormalizer.ts +3 -3
  211. package/src/sessions.ts +3 -3
  212. package/src/test/idCompressorTestUtilities.ts +921 -0
  213. package/src/test/index.ts +10 -0
  214. package/src/test/snapshots/dirname.cts +13 -0
  215. package/src/test/snapshots/files/compressor-with-finalized-range-from-one-client +1 -0
  216. package/src/test/snapshots/files/compressor-with-finalized-range-from-one-client-client2 +1 -0
  217. package/src/test/snapshots/files/compressors-with-finalized-ranges-from-two-clients +1 -0
  218. package/src/test/snapshots/files/compressors-with-finalized-ranges-from-two-clients-client2 +1 -0
  219. package/src/test/snapshots/files/empty-compressor-summary +1 -0
  220. package/src/test/snapshots/files/expansion-semantics +1 -0
  221. package/src/test/snapshots/files/expansion-semantics-client2 +1 -0
  222. package/src/test/testCommon.ts +143 -0
  223. package/src/test/tsconfig.cjs.json +12 -0
  224. package/src/test/tsconfig.json +20 -0
  225. package/src/types/idCompressor.ts +147 -72
  226. package/src/types/index.ts +8 -3
  227. package/src/types/persisted-types/0.0.1.ts +1 -1
  228. package/src/types/persisted-types/index.ts +1 -1
  229. package/src/utilities.ts +2 -2
  230. package/tsconfig.cjs.json +7 -0
  231. package/tsconfig.json +2 -5
  232. package/lib/appendOnlySortedMap.d.mts.map +0 -1
  233. package/lib/appendOnlySortedMap.mjs.map +0 -1
  234. package/lib/finalSpace.d.mts.map +0 -1
  235. package/lib/finalSpace.mjs.map +0 -1
  236. package/lib/id-compressor-beta.d.mts +0 -171
  237. package/lib/id-compressor-public.d.mts +0 -171
  238. package/lib/idCompressor.d.mts.map +0 -1
  239. package/lib/idCompressor.mjs.map +0 -1
  240. package/lib/identifiers.d.mts.map +0 -1
  241. package/lib/identifiers.mjs.map +0 -1
  242. package/lib/index.d.mts.map +0 -1
  243. package/lib/index.mjs.map +0 -1
  244. package/lib/packageVersion.d.mts.map +0 -1
  245. package/lib/packageVersion.mjs.map +0 -1
  246. package/lib/persistanceUtilities.d.mts.map +0 -1
  247. package/lib/persistanceUtilities.mjs.map +0 -1
  248. package/lib/sessionSpaceNormalizer.d.mts.map +0 -1
  249. package/lib/sessionSpaceNormalizer.mjs.map +0 -1
  250. package/lib/sessions.d.mts.map +0 -1
  251. package/lib/sessions.mjs.map +0 -1
  252. package/lib/types/idCompressor.d.mts.map +0 -1
  253. package/lib/types/idCompressor.mjs.map +0 -1
  254. package/lib/types/identifiers.d.mts.map +0 -1
  255. package/lib/types/identifiers.mjs.map +0 -1
  256. package/lib/types/index.d.mts.map +0 -1
  257. package/lib/types/index.mjs.map +0 -1
  258. package/lib/types/persisted-types/0.0.1.d.mts.map +0 -1
  259. package/lib/types/persisted-types/0.0.1.mjs.map +0 -1
  260. package/lib/types/persisted-types/index.d.mts.map +0 -1
  261. package/lib/types/persisted-types/index.mjs.map +0 -1
  262. package/lib/utilities.d.mts.map +0 -1
  263. package/lib/utilities.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idCompressor.spec.js","sourceRoot":"","sources":["../../src/test/idCompressor.spec.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 { strict as assert } from \"assert\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { take } from \"@fluid-private/stochastic-test-utils\";\nimport { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport {\n\tOpSpaceCompressedId,\n\tSerializedIdCompressorWithNoSession,\n\tSessionId,\n\tSessionSpaceCompressedId,\n\tStableId,\n} from \"..//index.js\";\nimport { IdCompressor, createIdCompressor, deserializeIdCompressor } from \"../idCompressor.js\";\nimport { createSessionId } from \"../utilities.js\";\nimport {\n\tperformFuzzActions,\n\tsessionIds,\n\tIdCompressorTestNetwork,\n\tClient,\n\tDestinationClient,\n\tMetaClient,\n\texpectSerializes,\n\troundtrip,\n\tmakeOpGenerator,\n\tCompressorFactory,\n} from \"./idCompressorTestUtilities.js\";\nimport { LocalCompressedId, incrementStableId, isFinalId, isLocalId, fail } from \"./testCommon.js\";\n\ndescribe(\"IdCompressor\", () => {\n\tit(\"reports the proper session ID\", () => {\n\t\tconst sessionId = createSessionId();\n\t\tconst compressor = CompressorFactory.createCompressorWithSession(sessionId);\n\t\tassert(compressor.localSessionId, sessionId);\n\t});\n\n\tdescribe(\"ID Generation\", () => {\n\t\tit(\"can manually create a compressed ID\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\tassert.equal(id, compressor.recompress(uuid));\n\t\t});\n\n\t\tit(\"can generate document unique IDs\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\t\t\tlet id = compressor.generateDocumentUniqueId();\n\t\t\tassert(typeof id === \"string\");\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tid = compressor.generateDocumentUniqueId();\n\t\t\tassert(typeof id === \"number\" && isFinalId(id));\n\t\t\tid = compressor.generateDocumentUniqueId();\n\t\t\tassert(typeof id === \"number\" && isFinalId(id));\n\t\t\tid = compressor.generateDocumentUniqueId();\n\t\t\tassert(typeof id === \"string\");\n\t\t});\n\n\t\tdescribe(\"Eager final ID allocation\", () => {\n\t\t\tit(\"eagerly allocates final IDs when cluster creation has been finalized\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 3);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(localId1));\n\t\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(localId2));\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\tconst finalId3 = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(finalId3));\n\t\t\t\tconst finalId4 = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(finalId4));\n\t\t\t\tconst finalId5 = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(finalId5));\n\t\t\t\tconst localId6 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(localId6));\n\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t\tconst opSpaceId1 = compressor.normalizeToOpSpace(localId1);\n\t\t\t\tconst opSpaceId2 = compressor.normalizeToOpSpace(localId2);\n\t\t\t\tconst opSpaceId3 = compressor.normalizeToOpSpace(finalId3);\n\t\t\t\tconst opSpaceId4 = compressor.normalizeToOpSpace(finalId4);\n\t\t\t\tconst opSpaceId5 = compressor.normalizeToOpSpace(finalId5);\n\t\t\t\tconst opSpaceId6 = compressor.normalizeToOpSpace(localId6);\n\n\t\t\t\tassert(isFinalId(opSpaceId1));\n\t\t\t\tassert(isFinalId(opSpaceId2));\n\t\t\t\tassert(isFinalId(opSpaceId3) && opSpaceId3 === finalId3);\n\t\t\t\tassert(isFinalId(opSpaceId4) && opSpaceId4 === finalId4);\n\t\t\t\tassert(isFinalId(opSpaceId5) && opSpaceId5 === finalId5);\n\t\t\t\tassert(isFinalId(opSpaceId6));\n\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId1, compressor.localSessionId),\n\t\t\t\t\tlocalId1,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId2, compressor.localSessionId),\n\t\t\t\t\tlocalId2,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId3, compressor.localSessionId),\n\t\t\t\t\tfinalId3,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId4, compressor.localSessionId),\n\t\t\t\t\tfinalId4,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId5, compressor.localSessionId),\n\t\t\t\t\tfinalId5,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId6, compressor.localSessionId),\n\t\t\t\t\tlocalId6,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"correctly normalizes eagerly allocated final IDs\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\t\tassert(isLocalId(localId1));\n\t\t\t\tassert(isLocalId(localId2));\n\n\t\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\t\tcompressor.finalizeCreationRange(range2);\n\n\t\t\t\tconst opSpaceId1 = compressor.normalizeToOpSpace(localId1);\n\t\t\t\tconst opSpaceId2 = compressor.normalizeToOpSpace(localId2);\n\n\t\t\t\tassert(isFinalId(opSpaceId1));\n\t\t\t\tassert(isFinalId(opSpaceId2));\n\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId1, compressor.localSessionId),\n\t\t\t\t\tlocalId1,\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tcompressor.normalizeToSessionSpace(opSpaceId2, compressor.localSessionId),\n\t\t\t\t\tlocalId2,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"generates correct eager finals when there are outstanding locals after cluster expansion\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\n\t\t\t\t// Before cluster expansion\n\t\t\t\tassert(isLocalId(compressor.generateCompressedId()));\n\t\t\t\tconst rangeA = compressor.takeNextCreationRange();\n\t\t\t\tcompressor.finalizeCreationRange(rangeA);\n\t\t\t\tassert(isFinalId(compressor.generateCompressedId()));\n\t\t\t\tassert(isFinalId(compressor.generateCompressedId()));\n\n\t\t\t\t// After cluster expansion\n\t\t\t\tassert(isLocalId(compressor.generateCompressedId()));\n\t\t\t\tconst rangeB = compressor.takeNextCreationRange();\n\t\t\t\tconst localId = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(localId));\n\n\t\t\t\t// Take a range that won't be finalized in this test; the finalizing of range B should associate this range with finals\n\t\t\t\tconst rangeC = compressor.takeNextCreationRange();\n\n\t\t\t\tcompressor.finalizeCreationRange(rangeB);\n\t\t\t\tconst eagerId = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(eagerId));\n\n\t\t\t\tassert.equal(compressor.recompress(compressor.decompress(localId)), localId);\n\t\t\t\tassert.equal(compressor.recompress(compressor.decompress(eagerId)), eagerId);\n\n\t\t\t\tcompressor.finalizeCreationRange(rangeC);\n\n\t\t\t\tassert.equal(compressor.recompress(compressor.decompress(localId)), localId);\n\t\t\t\tassert.equal(compressor.recompress(compressor.decompress(eagerId)), eagerId);\n\t\t\t});\n\n\t\t\tit(\"generates unique eager finals when multiple outstanding creation ranges during finalizing\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t10 /* must be 10 for the test to make sense */,\n\t\t\t\t);\n\n\t\t\t\t// Make a first outstanding range\n\t\t\t\tconst id1_1 = compressor.generateCompressedId();\n\t\t\t\tconst id1_2 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(id1_1));\n\t\t\t\tassert(isLocalId(id1_2));\n\t\t\t\tconst range1 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Make a second outstanding range\n\t\t\t\tconst id2_1 = compressor.generateCompressedId();\n\t\t\t\tconst id2_2 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(id2_1));\n\t\t\t\tassert(isLocalId(id2_2));\n\t\t\t\tconst range2 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Finalize just the first one, which should create finals that align with both outstanding ranges\n\t\t\t\tcompressor.finalizeCreationRange(range1);\n\n\t\t\t\t// Make a third range. This one should be composed of eager finals that align after the two ranges above.\n\t\t\t\tconst id3_1 = compressor.generateCompressedId();\n\t\t\t\tconst id3_2 = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(id3_1));\n\t\t\t\tassert(isFinalId(id3_2));\n\t\t\t\tconst range3 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Finalize both initial ranges.\n\t\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\t\tcompressor.finalizeCreationRange(range3);\n\n\t\t\t\t// Make some more eager finals that should be aligned correctly.\n\t\t\t\tconst id4_1 = compressor.generateCompressedId();\n\t\t\t\tconst id4_2 = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(id4_1));\n\t\t\t\tassert(isFinalId(id4_2));\n\n\t\t\t\t// Assert everything is unique and consistent.\n\t\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\t\tconst uuids = new Set<StableId | string>();\n\t\t\t\t[id1_1, id1_2, id2_1, id2_2, id3_1, id3_2, id4_1, id4_2].forEach((id) => {\n\t\t\t\t\tids.add(id);\n\t\t\t\t\tuuids.add(compressor.decompress(id));\n\t\t\t\t});\n\t\t\t\tassert.equal(ids.size, 8);\n\t\t\t\tassert.equal(uuids.size, 8);\n\t\t\t});\n\n\t\t\tit(\"generates unique eager finals when there are still outstanding locals after a cluster is expanded\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t2 /* must be 2 for the test to make sense */,\n\t\t\t\t);\n\n\t\t\t\t// Make locals to fill half the future cluster\n\t\t\t\tconst id1_1 = compressor.generateCompressedId();\n\t\t\t\tconst id1_2 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(id1_1));\n\t\t\t\tassert(isLocalId(id1_2));\n\t\t\t\tconst range1 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Make locals to overflow the future cluster\n\t\t\t\tconst id2_1 = compressor.generateCompressedId();\n\t\t\t\tconst id2_2 = compressor.generateCompressedId();\n\t\t\t\tconst id2_3 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(id2_1));\n\t\t\t\tassert(isLocalId(id2_2));\n\t\t\t\tassert(isLocalId(id2_3));\n\t\t\t\tconst range2 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Finalize the first range. This should align the first four locals (i.e. all of range1, and 2/3 of range2)\n\t\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\t\tassert(isFinalId(compressor.normalizeToOpSpace(id2_2)));\n\t\t\t\tassert(isLocalId(compressor.normalizeToOpSpace(id2_3)));\n\n\t\t\t\t// Make a single range that should still be overflowing the initial cluster (i.e. be local)\n\t\t\t\tconst id3_1 = compressor.generateCompressedId();\n\t\t\t\tassert(isLocalId(id3_1));\n\t\t\t\tconst range3 = compressor.takeNextCreationRange();\n\n\t\t\t\t// Second finalize should expand the cluster and align all outstanding ranges.\n\t\t\t\tcompressor.finalizeCreationRange(range2);\n\n\t\t\t\t// All generated IDs should have aligned finals (even though range3 has not been finalized)\n\t\t\t\tconst allIds: SessionSpaceCompressedId[] = [\n\t\t\t\t\tid1_1,\n\t\t\t\t\tid1_2,\n\t\t\t\t\tid2_1,\n\t\t\t\t\tid2_2,\n\t\t\t\t\tid2_3,\n\t\t\t\t\tid3_1,\n\t\t\t\t];\n\t\t\t\tallIds.forEach((id) => assert(isFinalId(compressor.normalizeToOpSpace(id))));\n\n\t\t\t\tcompressor.finalizeCreationRange(range3);\n\n\t\t\t\t// Make one eager final\n\t\t\t\tconst id4_1 = compressor.generateCompressedId();\n\t\t\t\tallIds.push(id4_1);\n\t\t\t\tassert(isFinalId(id4_1));\n\n\t\t\t\t// Assert everything is unique and consistent.\n\t\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\t\tconst uuids = new Set<StableId | string>();\n\t\t\t\tallIds.forEach((id) => {\n\t\t\t\t\tids.add(id);\n\t\t\t\t\tuuids.add(compressor.decompress(id));\n\t\t\t\t});\n\t\t\t\tassert.equal(ids.size, 7);\n\t\t\t\tassert.equal(uuids.size, 7);\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * Helper to generate a fixed number of IDs.\n\t */\n\tfunction generateCompressedIds(\n\t\tcompressor: IdCompressor,\n\t\tcount: number,\n\t): SessionSpaceCompressedId[] {\n\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tids.push(compressor.generateCompressedId());\n\t\t}\n\t\treturn ids;\n\t}\n\n\tdescribe(\"can produce a creation range\", () => {\n\t\tconst clusterSize = 5;\n\t\tconst tests: {\n\t\t\ttitle: string;\n\t\t\tidCount: number;\n\t\t}[] = [\n\t\t\t{ title: \"that is empty\", idCount: 0 },\n\t\t\t{ title: \"with one ID\", idCount: 1 },\n\t\t\t{ title: \"with more IDs than fit in a cluster\", idCount: clusterSize * 2 },\n\t\t];\n\n\t\ttests.forEach(({ title, idCount }) => {\n\t\t\tit(title, () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\t\tgenerateCompressedIds(compressor, idCount);\n\t\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\t\tif (range.ids !== undefined) {\n\t\t\t\t\tassert.equal(range.ids.count, idCount);\n\t\t\t\t} else {\n\t\t\t\t\tassert.equal(idCount, 0);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"does not return the same non-empty range twice\", () => {\n\t\tconst rangeCompressor = CompressorFactory.createCompressor(Client.Client1);\n\t\tgenerateCompressedIds(rangeCompressor, 3);\n\t\tconst range1 = rangeCompressor.takeNextCreationRange();\n\t\tassert.notEqual(range1.ids, undefined);\n\t\tconst range2 = rangeCompressor.takeNextCreationRange();\n\t\tassert.equal(range2.ids, undefined);\n\t\trangeCompressor.finalizeCreationRange(range1);\n\t\trangeCompressor.finalizeCreationRange(range2);\n\t});\n\n\tdescribe(\"Finalizing\", () => {\n\t\tit(\"prevents attempts to finalize ranges twice\", () => {\n\t\t\tconst rangeCompressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(rangeCompressor, 3);\n\t\t\tconst batchRange = rangeCompressor.takeNextCreationRange();\n\t\t\trangeCompressor.finalizeCreationRange(batchRange);\n\t\t\tassert.throws(\n\t\t\t\t() => rangeCompressor.finalizeCreationRange(batchRange),\n\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order.\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prevents attempts to finalize ranges out of order\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.takeNextCreationRange();\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst secondRange = compressor.takeNextCreationRange();\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.finalizeCreationRange(secondRange),\n\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order.\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can finalize ranges into clusters of varying sizes\", () => {\n\t\t\tfor (let i = 1; i < 5; i++) {\n\t\t\t\tfor (let j = 0; j <= i; j++) {\n\t\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, i);\n\t\t\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\t\t\tfor (let k = 0; k <= j; k++) {\n\t\t\t\t\t\tids.add(compressor.generateCompressedId());\n\t\t\t\t\t}\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t\tconst opIds = new Set<OpSpaceCompressedId>();\n\t\t\t\t\tids.forEach((id) => opIds.add(compressor.normalizeToOpSpace(id)));\n\t\t\t\t\tassert.equal(ids.size, opIds.size);\n\t\t\t\t\topIds.forEach((id) => assert.equal(isFinalId(id), true));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"Ghost sessions\", () => {\n\t\tit(\"prevents non-allocation mutations during a ghost session\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.beginGhostSession(createSessionId(), () => {\n\t\t\t\tassert.throws(() => compressor.takeNextCreationRange());\n\t\t\t\tassert.throws(() => compressor.finalizeCreationRange(range));\n\t\t\t\tassert.throws(() => compressor.serialize(false));\n\t\t\t});\n\t\t});\n\n\t\tit(\"can generate IDs during a ghost session\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst idCount = 10;\n\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\tconst ghostSession = createSessionId();\n\t\t\tcompressor.beginGhostSession(ghostSession, () => {\n\t\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t\tconst id = compressor.generateCompressedId();\n\t\t\t\t\tassert(isFinalId(id));\n\t\t\t\t\tassert(compressor.decompress(id) === incrementStableId(ghostSession, i));\n\t\t\t\t\tids.add(id);\n\t\t\t\t}\n\t\t\t});\n\t\t\tassert.equal(ids.size, idCount);\n\t\t});\n\n\t\tit(\"does not create a cluster for a no-op ghost session\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5, mockLogger);\n\t\t\tcompressor.serialize(false);\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\t\t\tclusterCount: 0,\n\t\t\t\t\tsessionCount: 0,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tcompressor.beginGhostSession(createSessionId(), () => {});\n\t\t\tcompressor.serialize(false);\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\t\t\tclusterCount: 0,\n\t\t\t\t\tsessionCount: 0,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tcompressor.beginGhostSession(createSessionId(), () => {\n\t\t\t\tcompressor.generateCompressedId();\n\t\t\t});\n\t\t\tcompressor.serialize(false);\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\t\t\tclusterCount: 1,\n\t\t\t\t\tsessionCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"Recompression\", () => {\n\t\tit(\"can re-compress a uuid it generated\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\tassert.equal(compressor.recompress(uuid), id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tassert.equal(compressor.recompress(uuid), id);\n\t\t});\n\n\t\tit(\"can re-compress uuids from a remote client\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst uuid = compressor.decompress(compressor.generateCompressedId());\n\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2);\n\t\t\tcompressor2.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor2.recompress(uuid);\n\t\t\tif (finalId === undefined) {\n\t\t\t\tassert.fail();\n\t\t\t}\n\t\t\tassert(isFinalId(finalId));\n\t\t});\n\n\t\tit(\"will not re-compress uuids it did not originally generate\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tassert.equal(\n\t\t\t\tcompressor.tryRecompress(\"5fff846a-efd4-42fb-8b78-b32ce2672f99\" as StableId),\n\t\t\t\tundefined,\n\t\t\t);\n\t\t});\n\n\t\tit(\"can re-compress an eager final ID that is not finalized\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.generateCompressedId();\n\t\t\tassert(isFinalId(finalId));\n\t\t\tconst stableId = incrementStableId(sessionIds.get(Client.Client1), 1);\n\t\t\tassert.equal(compressor.recompress(stableId), finalId);\n\t\t});\n\t});\n\n\tdescribe(\"Decompression\", () => {\n\t\tit(\"will not decompress IDs it did not generate\", () => {\n\t\t\tconst errorMessage = \"Unknown ID\";\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.decompress(-1 as LocalCompressedId),\n\t\t\t\t(e: Error) => e.message === errorMessage,\n\t\t\t);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.decompress(0 as SessionSpaceCompressedId),\n\t\t\t\t(e: Error) => e.message === errorMessage,\n\t\t\t);\n\t\t});\n\n\t\tit(\"can decompress a local ID before and after finalizing\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tassert.equal(compressor.decompress(id), uuid);\n\t\t});\n\n\t\tit(\"can decompress a final ID\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\tassert.fail(\"Op space ID was finalized but is local\");\n\t\t\t}\n\t\t\tcompressor.decompress(\n\t\t\t\tcompressor.normalizeToSessionSpace(finalId, compressor.localSessionId),\n\t\t\t);\n\t\t});\n\n\t\tit(\"can decompress an eagerly generated final ID that is not finalized\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.generateCompressedId();\n\t\t\tassert(isFinalId(finalId));\n\t\t\tassert.equal(\n\t\t\t\tcompressor.decompress(finalId),\n\t\t\t\tincrementStableId(sessionIds.get(Client.Client1), 1),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Normalization\", () => {\n\t\tit(\"can normalize a local ID to op space before finalizing\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\tassert(isLocalId(id));\n\t\t\tassert.equal(id, normalized);\n\t\t});\n\n\t\tit(\"can normalize a local ID to op space after finalizing\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\tassert(isFinalId(normalized));\n\t\t\tassert.notEqual(id, normalized);\n\t\t});\n\n\t\tit(\"can normalize an eagerly generated final ID\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst eagerFinalId = compressor.generateCompressedId();\n\t\t\tassert(isFinalId(eagerFinalId));\n\t\t\tconst opNormalized = compressor.normalizeToOpSpace(eagerFinalId);\n\t\t\tassert.equal(eagerFinalId, opNormalized);\n\t\t\tconst sessionNormalized = compressor.normalizeToSessionSpace(\n\t\t\t\topNormalized,\n\t\t\t\tcompressor.localSessionId,\n\t\t\t);\n\t\t\tassert.equal(sessionNormalized, opNormalized);\n\t\t});\n\n\t\tit(\"cannot normalize a remote ID to session space if it has not been finalized\", () => {\n\t\t\tconst compressor1 = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2);\n\t\t\tconst normalized = compressor1.normalizeToOpSpace(compressor1.generateCompressedId());\n\t\t\tassert.throws(\n\t\t\t\t() => compressor2.normalizeToSessionSpace(normalized, compressor1.localSessionId),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\te.message === \"No IDs have ever been finalized by the supplied session.\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can normalize local and final IDs from a remote session to session space\", () => {\n\t\t\tconst compressor1 = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2);\n\t\t\tconst id = compressor1.generateCompressedId();\n\t\t\tconst normalizedLocal = compressor1.normalizeToOpSpace(id);\n\t\t\tconst range = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range);\n\t\t\tconst normalizedFinal = compressor1.normalizeToOpSpace(id);\n\t\t\tcompressor2.finalizeCreationRange(range);\n\t\t\tassert(isLocalId(normalizedLocal));\n\t\t\tassert(isFinalId(normalizedFinal));\n\t\t\tassert.equal(\n\t\t\t\tcompressor2.normalizeToSessionSpace(normalizedFinal, compressor1.localSessionId),\n\t\t\t\tnormalizedFinal,\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tcompressor2.normalizeToSessionSpace(normalizedLocal, compressor1.localSessionId),\n\t\t\t\tnormalizedFinal,\n\t\t\t);\n\t\t});\n\n\t\tit(\"can normalize a final ID created by the local session but sent in another client's op space\", () => {\n\t\t\t// Regression test for the situation in which a client creates a final ID and another client references\n\t\t\t// that final ID in a message back to the creating client. The creating client will normalize it and\n\t\t\t// pass the session ID of the remote (non-creating) client. This should be handled correctly.\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5);\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2, 5);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst creationRange = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\t\t\tconst idInClient2OpSpace = compressor2.normalizeToOpSpace(\n\t\t\t\tcompressor2.normalizeToSessionSpace(\n\t\t\t\t\tcompressor.normalizeToOpSpace(id),\n\t\t\t\t\tcompressor.localSessionId,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst normalizedToClient1SessionSpace = compressor.normalizeToSessionSpace(\n\t\t\t\tidInClient2OpSpace,\n\t\t\t\tcompressor2.localSessionId,\n\t\t\t);\n\t\t\tassert.equal(normalizedToClient1SessionSpace, id);\n\t\t});\n\t});\n\n\tdescribe(\"Telemetry\", () => {\n\t\tit(\"emits first cluster and new cluster telemetry events\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tassert(isLocalId(localId1));\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tmockLogger.assertMatch([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:FirstCluster\",\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"emits new cluster event on second cluster\", () => {\n\t\t\t// Fill the first cluster\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 1, mockLogger);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\n\t\t\t// Create another cluster with a different client so that expansion doesn't happen\n\t\t\tconst mockLogger2 = new MockLogger();\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2, 1, mockLogger2);\n\t\t\tcompressor2.finalizeCreationRange(range);\n\t\t\tcompressor2.generateCompressedId();\n\t\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\t// Make sure we emitted the FirstCluster event\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:FirstCluster\",\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\t// Fill the one remaining spot\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t// Trigger a new cluster creation\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:NewCluster\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"correctly logs telemetry events for eager final id allocations\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tassert(isLocalId(localId1));\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\t\t\tconst finalId1 = compressor.generateCompressedId();\n\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\tassert(isFinalId(finalId1));\n\t\t\tassert(isFinalId(finalId2));\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\t\teagerFinalIdCount: 2,\n\t\t\t\t\tlocalIdCount: 0,\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"correctly logs telemetry events for expansion case\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tassert(isLocalId(localId1));\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst id = compressor.generateCompressedId();\n\t\t\t\tassert(isFinalId(id));\n\t\t\t}\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\t\teagerFinalIdCount: 5,\n\t\t\t\t\tlocalIdCount: 0,\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\tconst expansionId1 = compressor.generateCompressedId();\n\t\t\tconst expansionId2 = compressor.generateCompressedId();\n\t\t\tassert(isLocalId(expansionId1));\n\t\t\tassert(isLocalId(expansionId2));\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:ClusterExpansion\",\n\t\t\t\t\tsessionId: compressor.localSessionId,\n\t\t\t\t\tpreviousCapacity: 6,\n\t\t\t\t\tnewCapacity: 13,\n\t\t\t\t\toverflow: 2,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"emits telemetry when serialized\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 5, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tassert(isLocalId(localId1));\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tcompressor.serialize(false);\n\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\t\t\tsize: 72,\n\t\t\t\t\tclusterCount: 1,\n\t\t\t\t\tsessionCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"correctly passes logger when no session specified\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createIdCompressor(mockLogger);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: \"RuntimeIdCompressor:FirstCluster\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"Serialization\", () => {\n\t\tit(\"can serialize an empty compressor\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\texpectSerializes(compressor);\n\t\t\tcompressor.generateCompressedId();\n\t\t\texpectSerializes(compressor);\n\t\t});\n\n\t\tit(\"correctly deserializes and resumes a session\", () => {\n\t\t\tconst compressor1 = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst compressor2 = CompressorFactory.createCompressor(Client.Client2);\n\t\t\tcompressor1.generateCompressedId();\n\t\t\tconst creationRange = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\t\t\tconst [_, serializedWithSession] = expectSerializes(compressor1);\n\t\t\tconst compressorResumed = IdCompressor.deserialize(serializedWithSession);\n\t\t\tcompressorResumed.generateCompressedId();\n\t\t\tconst range2 = compressorResumed.takeNextCreationRange();\n\t\t\tcompressorResumed.finalizeCreationRange(range2);\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\tconst [__, roundtrippedCompressorResumed] = roundtrip(compressorResumed, false);\n\t\t\tconst [___, roundtrippedCompressor2] = roundtrip(compressor2, false);\n\t\t\tassert(\n\t\t\t\troundtrippedCompressorResumed.equals(\n\t\t\t\t\troundtrippedCompressor2,\n\t\t\t\t\tfalse, // don't compare local state\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tit(\"can detect and fails to load 1.0 documents\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst base64Content = compressor.serialize(false);\n\t\t\tconst floatView = new Float64Array(stringToBuffer(base64Content, \"base64\"));\n\t\t\t// Change the version to 1.0\n\t\t\tfloatView[0] = 1.0;\n\t\t\tconst docString1 = bufferToString(\n\t\t\t\tfloatView.buffer,\n\t\t\t\t\"base64\",\n\t\t\t) as SerializedIdCompressorWithNoSession;\n\t\t\tassert.throws(\n\t\t\t\t() => deserializeIdCompressor(docString1, createSessionId()),\n\t\t\t\t(e: Error) => e.message === \"IdCompressor version 1.0 is no longer supported.\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Collision detection\", () => {\n\t\tit(\"detects when a new cluster is allocated whose UUIDs collide with another cluster\", () => {\n\t\t\tconst compressor1 = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tconst compressor2 = CompressorFactory.createCompressorWithSession(\n\t\t\t\tincrementStableId(compressor1.localSessionId, 5) as SessionId,\n\t\t\t);\n\t\t\tcompressor1.generateCompressedId();\n\t\t\tconst creationRange1 = compressor1.takeNextCreationRange();\n\n\t\t\tcompressor2.generateCompressedId();\n\t\t\tconst creationRange2 = compressor2.takeNextCreationRange();\n\n\t\t\tconst errorMessage = \"0x758\";\n\n\t\t\t// Simulate world in which range1 was sequenced first\n\t\t\tcompressor1.finalizeCreationRange(creationRange1);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor1.finalizeCreationRange(creationRange2),\n\t\t\t\t(e: Error) => e.message === errorMessage,\n\t\t\t);\n\n\t\t\t// Simulate world in which range2 was sequenced first\n\t\t\tcompressor2.finalizeCreationRange(creationRange2);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor2.finalizeCreationRange(creationRange1),\n\t\t\t\t(e: Error) => e.message === errorMessage,\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribeNetwork(\"Networked\", (itNetwork) => {\n\t\titNetwork(\n\t\t\t\"upholds the invariant that IDs always decompress to the same UUID\",\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5);\n\n\t\t\t\tconst preAckLocals = new Map<Client, [SessionSpaceCompressedId, string][]>();\n\t\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\t\tconst locals: [SessionSpaceCompressedId, string][] = [];\n\t\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\t\tlocals.push([idData.id, compressor.decompress(idData.id)]);\n\t\t\t\t\t}\n\t\t\t\t\tpreAckLocals.set(client, locals);\n\t\t\t\t}\n\n\t\t\t\t// Ack all IDs\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\t\tconst preAckLocalIds =\n\t\t\t\t\t\tpreAckLocals.get(client) ?? fail(\"Expected preack locals for client\");\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\t\tif (idData.originatingClient === client) {\n\t\t\t\t\t\t\tassert(!isFinalId(idData.id));\n\t\t\t\t\t\t\tconst currentUuid = compressor.decompress(idData.id);\n\t\t\t\t\t\t\tassert.equal(currentUuid, preAckLocalIds[i % preAckLocalIds.length][1]);\n\t\t\t\t\t\t\ti++;\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\titNetwork(\"can normalize session space IDs to op space\", 5, (network) => {\n\t\t\tconst clusterCapacity = 5;\n\t\t\tconst idCount = clusterCapacity * 2;\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t}\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tassert.equal(idData.originatingClient, client);\n\t\t\t\t\tassert(isLocalId(compressor.normalizeToOpSpace(idData.id)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tassert(isFinalId(compressor.normalizeToOpSpace(idData.id)));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork(\n\t\t\t\"can normalize local op space IDs from a local session to session space IDs\",\n\t\t\t(network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst sessionSpaceIds = network.getIdLog(Client.Client1);\n\t\t\t\tconst opSpaceId = compressor.normalizeToOpSpace(sessionSpaceIds[0].id);\n\t\t\t\tconst sessionSpaceId = compressor.normalizeToSessionSpace(\n\t\t\t\t\topSpaceId,\n\t\t\t\t\tcompressor.localSessionId,\n\t\t\t\t);\n\t\t\t\tassert(isFinalId(opSpaceId));\n\t\t\t\tassert(isLocalId(sessionSpaceId));\n\t\t\t},\n\t\t);\n\n\t\titNetwork(\n\t\t\t\"can normalize local op space IDs from a remote session to session space IDs\",\n\t\t\t(network) => {\n\t\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\t// Mimic sending a reference to an ID that hasn't been acked yet, such as in a slow network\n\t\t\t\tconst id = opSpaceIds[0];\n\t\t\t\tconst getSessionNormalizedId = () =>\n\t\t\t\t\tcompressor2.normalizeToSessionSpace(id, compressor1.localSessionId);\n\t\t\t\tassert.throws(\n\t\t\t\t\tgetSessionNormalizedId,\n\t\t\t\t\t(e: Error) =>\n\t\t\t\t\t\te.message === \"No IDs have ever been finalized by the supplied session.\",\n\t\t\t\t);\n\t\t\t\tnetwork.deliverOperations(Client.Client2);\n\t\t\t\tassert(isFinalId(getSessionNormalizedId()));\n\t\t\t},\n\t\t);\n\n\t\tfunction expectSequencedLogsAlign(\n\t\t\tnetwork: IdCompressorTestNetwork,\n\t\t\tclient1: Client,\n\t\t\tclient2: Client,\n\t\t\tnumUnifications = 0,\n\t\t): void {\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tassert(client1 !== client2, \"Clients must not be the same\");\n\t\t\tconst log1 = network.getSequencedIdLog(client1);\n\t\t\tconst log2 = network.getSequencedIdLog(client2);\n\t\t\tassert.equal(log1.length, log2.length);\n\t\t\tconst compressor1 = network.getCompressor(client1);\n\t\t\tconst compressor2 = network.getCompressor(client2);\n\t\t\tconst ids = new Set<OpSpaceCompressedId>();\n\t\t\tconst uuids = new Set<StableId>();\n\t\t\tfor (let i = 0; i < log1.length; i++) {\n\t\t\t\tconst data1 = log1[i];\n\t\t\t\tconst id1 = compressor1.normalizeToOpSpace(data1.id);\n\t\t\t\tconst id2 = compressor2.normalizeToOpSpace(log2[i].id);\n\t\t\t\tassert(isFinalId(id1));\n\t\t\t\tids.add(id1);\n\t\t\t\tassert.equal(id1, id2);\n\t\t\t\tconst uuidOrOverride1 = compressor1.decompress(\n\t\t\t\t\tcompressor1.normalizeToSessionSpace(id1, compressor1.localSessionId),\n\t\t\t\t);\n\t\t\t\tuuids.add(uuidOrOverride1);\n\t\t\t\tassert.equal(\n\t\t\t\t\tuuidOrOverride1,\n\t\t\t\t\tcompressor2.decompress(\n\t\t\t\t\t\tcompressor2.normalizeToSessionSpace(id2, compressor2.localSessionId),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst expectedSize = log1.length - numUnifications;\n\t\t\tassert.equal(ids.size, expectedSize);\n\t\t\tassert.equal(uuids.size, expectedSize);\n\t\t}\n\n\t\titNetwork(\"produces ID spaces correctly\", (network) => {\n\t\t\t// This test asserts that IDs returned from IdCompressor APIs are correctly encoded as either local or final.\n\t\t\t// This is a glass box test in that it assumes the negative/positive encoding of CompressedIds (negative = local, positive = final).\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\n\t\t\t// Client 1 makes three IDs\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3);\n\t\t\tnetwork.getIdLog(Client.Client1).forEach(({ id }) => assert(isLocalId(id)));\n\n\t\t\t// Client 1's IDs have not been acked so have no op space equivalent\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach((idData) => assert(isLocalId(compressor1.normalizeToOpSpace(idData.id))));\n\n\t\t\t// Client 1's IDs are acked\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tnetwork.getIdLog(Client.Client1).forEach(({ id }) => assert(isLocalId(id)));\n\n\t\t\t// Client 2 makes three IDs\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\n\t\t\tnetwork.getIdLog(Client.Client2).forEach(({ id }) => assert(isLocalId(id)));\n\n\t\t\t// Client 1 receives Client 2's IDs\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.slice(-3)\n\t\t\t\t.forEach(({ id }) => assert(isFinalId(id)));\n\n\t\t\t// All IDs have been acked or are from another client, and therefore have a final form in op space\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach(({ id }) => assert(isFinalId(compressor1.normalizeToOpSpace(id))));\n\n\t\t\t// Compression should preserve ID space correctness\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst roundtripped = compressor1.recompress(compressor1.decompress(idData.id));\n\t\t\t\tassert.equal(Math.sign(roundtripped), Math.sign(idData.id));\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst opNormalized = compressor1.normalizeToOpSpace(idData.id);\n\t\t\t\tassert.equal(\n\t\t\t\t\tMath.sign(compressor1.normalizeToSessionSpace(opNormalized, idData.sessionId)),\n\t\t\t\t\tMath.sign(idData.id),\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\titNetwork(\"produces consistent IDs with large fuzz input\", (network) => {\n\t\t\tconst generator = take(5000, makeOpGenerator({}));\n\t\t\tperformFuzzActions(generator, network, 1984, undefined, true, (n) =>\n\t\t\t\tn.assertNetworkState(),\n\t\t\t);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t});\n\n\t\titNetwork(\"does not decompress ids for empty parts of clusters\", 2, (network) => {\n\t\t\t// This is a glass box test in that it creates a final ID outside of the ID compressor\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst id = network.getSequencedIdLog(Client.Client2)[0].id;\n\t\t\tassert(isFinalId(id));\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tconst emptyId = (id + 1) as SessionSpaceCompressedId;\n\t\t\tassert.throws(\n\t\t\t\t() => network.getCompressor(Client.Client2).decompress(emptyId),\n\t\t\t\t(e: Error) => e.message === \"Unknown ID\",\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"Finalizing\", () => {\n\t\t\titNetwork(\"can finalize IDs from multiple clients\", (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3);\n\t\t\t\tnetwork.allocateAndSendIds(\n\t\t\t\t\tClient.Client2,\n\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t\tnetwork.getCompressor(Client.Client2)[\"nextRequestedClusterSize\"] * 2,\n\t\t\t\t);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork(\"can finalize a range when the current cluster is full\", 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t)[\"nextRequestedClusterSize\"];\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork(\"can finalize a range that spans multiple clusters\", 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(\n\t\t\t\t\tClient.Client1,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t)[\"nextRequestedClusterSize\"];\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity * 3);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Serialization\", () => {\n\t\t\titNetwork(\n\t\t\t\t\"prevents attempts to resume a session from a serialized compressor with no session\",\n\t\t\t\t(network) => {\n\t\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t\tconst serializedWithoutLocalState = compressor.serialize(false);\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tIdCompressor.deserialize(\n\t\t\t\t\t\t\t\tserializedWithoutLocalState,\n\t\t\t\t\t\t\t\tsessionIds.get(Client.Client2),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(e: Error) => e.message === \"Cannot resume existing session.\",\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\titNetwork(\"round-trips local state\", 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t// Some un-acked locals at the end\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 4);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t});\n\n\t\t\titNetwork(\"can serialize a partially empty cluster\", 5, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\"can serialize a full cluster\", 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\"can serialize full clusters from different clients\", 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\"can serialize clusters of different sizes and clients\", 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\n\t\t\t\t\"can resume a session and interact with multiple other clients\",\n\t\t\t\t3,\n\t\t\t\t(network) => {\n\t\t\t\t\tconst clusterSize = network.getCompressor(\n\t\t\t\t\t\tClient.Client1,\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t\t)[\"nextRequestedClusterSize\"];\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tnetwork.goOfflineThenResume(Client.Client1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 2);\n\t\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\titNetwork(\"can serialize after a large fuzz input\", 3, (network) => {\n\t\t\t\tconst generator = take(5000, makeOpGenerator({}));\n\t\t\t\tperformFuzzActions(generator, network, Math.PI, undefined, true, (n) => {\n\t\t\t\t\t// Periodically check that everyone in the network has the same serialized state\n\t\t\t\t\tn.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst compressors = n.getTargetCompressors(DestinationClient.All);\n\t\t\t\t\tlet deserializedPrev = roundtrip(compressors[0][1], false)[1];\n\t\t\t\t\tfor (let i = 1; i < compressors.length; i++) {\n\t\t\t\t\t\tconst deserializedCur = roundtrip(compressors[i][1], false)[1];\n\t\t\t\t\t\tassert(deserializedPrev.equals(deserializedCur, false));\n\t\t\t\t\t\tdeserializedPrev = deserializedCur;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\t\t});\n\t});\n});\n\ntype NetworkTestFunction = (\n\ttitle: string,\n\ttest: (network: IdCompressorTestNetwork) => void,\n) => void;\n\ntype NetworkTestFunctionWithCapacity = (\n\ttitle: string,\n\tinitialClusterCapacity: number,\n\ttest: (network: IdCompressorTestNetwork) => void,\n) => void;\n\nfunction createNetworkTestFunction(\n\tvalidateAfter: boolean,\n): NetworkTestFunction & NetworkTestFunctionWithCapacity {\n\treturn (\n\t\ttitle: string,\n\t\ttestOrCapacity: ((network: IdCompressorTestNetwork) => void) | number,\n\t\ttest?: (network: IdCompressorTestNetwork) => void,\n\t) => {\n\t\tit(title, () => {\n\t\t\tconst hasCapacity = typeof testOrCapacity === \"number\";\n\t\t\tconst capacity = hasCapacity ? testOrCapacity : undefined;\n\t\t\tconst network = new IdCompressorTestNetwork(capacity);\n\t\t\t(hasCapacity ? test ?? fail(\"test must be defined\") : testOrCapacity)(network);\n\t\t\tif (validateAfter) {\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.assertNetworkState();\n\t\t\t}\n\t\t}).timeout(10000);\n\t};\n}\n\nfunction describeNetwork(\n\ttitle: string,\n\tits: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void,\n) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n\n\tdescribe(`${title} (with validation)`, () => {\n\t\tits(createNetworkTestFunction(true));\n\t});\n}\n"]}
@@ -0,0 +1,245 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Generator, SaveInfo, BaseFuzzTestState } from "@fluid-private/stochastic-test-utils";
6
+ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
7
+ import { OpSpaceCompressedId, SerializedIdCompressorWithNoSession, SerializedIdCompressorWithOngoingSession, SessionId, SessionSpaceCompressedId, type IIdCompressor, type IIdCompressorCore } from "..//index.js";
8
+ import { IdCompressor } from "../idCompressor.js";
9
+ import { ReadonlyIdCompressor } from "./testCommon.js";
10
+ /**
11
+ * A readonly `Map` which is known to contain a value for every possible key
12
+ */
13
+ export interface ClosedMap<K, V> extends Omit<Map<K, V>, "delete" | "clear"> {
14
+ get(key: K): V;
15
+ }
16
+ /** Identifies a compressor in a network */
17
+ export declare enum Client {
18
+ Client1 = "Client1",
19
+ Client2 = "Client2",
20
+ Client3 = "Client3"
21
+ }
22
+ /** Identifies categories of compressors */
23
+ export declare enum MetaClient {
24
+ All = "All"
25
+ }
26
+ /** Identifies a compressor inside the network but outside the three specially tracked clients. */
27
+ export declare enum OutsideClient {
28
+ Remote = "Remote"
29
+ }
30
+ /**
31
+ * Used to attribute actions to clients in a distributed collaboration session.
32
+ * `Local` implies a local and unsequenced operation. All others imply sequenced operations.
33
+ */
34
+ export type OriginatingClient = Client | OutsideClient;
35
+ export declare const OriginatingClient: {
36
+ Remote: OutsideClient.Remote;
37
+ Client1: Client.Client1;
38
+ Client2: Client.Client2;
39
+ Client3: Client.Client3;
40
+ };
41
+ /** Identifies a compressor to which to send an operation */
42
+ export type DestinationClient = Client | MetaClient;
43
+ export declare const DestinationClient: {
44
+ All: MetaClient.All;
45
+ Client1: Client.Client1;
46
+ Client2: Client.Client2;
47
+ Client3: Client.Client3;
48
+ };
49
+ export declare class CompressorFactory {
50
+ /**
51
+ * Creates a new compressor with the supplied cluster capacity.
52
+ */
53
+ static createCompressor(client: Client, clusterCapacity?: number, logger?: ITelemetryBaseLogger): IdCompressor;
54
+ /**
55
+ * Creates a new compressor with the supplied cluster capacity.
56
+ */
57
+ static createCompressorWithSession(sessionId: SessionId, clusterCapacity?: number, logger?: ITelemetryBaseLogger): IdCompressor;
58
+ }
59
+ /**
60
+ * Utility for building a huge compressor.
61
+ * Build via the compressor factory.
62
+ */
63
+ export declare function buildHugeCompressor(numSessions?: number, capacity?: number, numClustersPerSession?: number): IdCompressor;
64
+ /**
65
+ * A closed map from NamedClient to T.
66
+ */
67
+ export type ClientMap<T> = ClosedMap<Client, T>;
68
+ /**
69
+ * An array of session ID strings corresponding to all non-local `Client` entries.
70
+ */
71
+ export declare const sessionIds: ClientMap<SessionId>;
72
+ /** Information about a generated ID in a network to be validated by tests */
73
+ export interface TestIdData {
74
+ readonly id: SessionSpaceCompressedId;
75
+ readonly originatingClient: OriginatingClient;
76
+ readonly sessionId: SessionId;
77
+ readonly isSequenced: boolean;
78
+ }
79
+ /**
80
+ * Simulates a network of ID compressors.
81
+ * Not suitable for performance testing.
82
+ */
83
+ export declare class IdCompressorTestNetwork {
84
+ readonly initialClusterSize: number;
85
+ /** The compressors used in this network */
86
+ private readonly compressors;
87
+ /** The log of operations seen by the server so far. Append-only. */
88
+ private readonly serverOperations;
89
+ /** An index into `serverOperations` for each client which represents how many operations have been delivered to that client */
90
+ private readonly clientProgress;
91
+ /** All ids (local and sequenced) that a client has created or received, in order. */
92
+ private readonly idLogs;
93
+ /** All ids that a client has received from the server, in order. */
94
+ private readonly sequencedIdLogs;
95
+ constructor(initialClusterSize?: number);
96
+ /**
97
+ * Returns the number of undelivered operations for the given client that are in flight in the network.
98
+ */
99
+ getPendingOperations(destination: Client): number;
100
+ /**
101
+ * Returns an immutable handle to a compressor in the network.
102
+ */
103
+ getCompressor(client: Client): ReadonlyIdCompressor;
104
+ /**
105
+ * Returns a mutable handle to a compressor in the network. Use of mutation methods will break the network invariants and
106
+ * should only be used if the network will not be used again.
107
+ */
108
+ getCompressorUnsafe(client: Client): IdCompressor;
109
+ /**
110
+ * Returns a mutable handle to a compressor in the network. Use of mutation methods will break the network invariants and
111
+ * should only be used if the network will not be used again. Additionally, the returned compressor will be invalidated/unusable
112
+ * if any network operations cause it to be regenerated (serialization/deserialization, etc.).
113
+ */
114
+ getCompressorUnsafeNoProxy(client: Client): IdCompressor;
115
+ /**
116
+ * Returns data for all IDs created and received by this client, including ack's of their own (i.e. their own IDs will appear twice)
117
+ */
118
+ getIdLog(client: Client): readonly TestIdData[];
119
+ /**
120
+ * Returns data for all IDs received by this client, including ack's of their own.
121
+ */
122
+ getSequencedIdLog(client: Client): readonly TestIdData[];
123
+ /**
124
+ * Get all compressors for the given destination
125
+ */
126
+ getTargetCompressors(clientTo: DestinationClient): [Client, IdCompressor][];
127
+ /**
128
+ * Changes the capacity request amount for a client. It will take effect immediately.
129
+ */
130
+ changeCapacity(client: Client, newClusterCapacity: number): void;
131
+ private addNewId;
132
+ /**
133
+ * Allocates a new range of local IDs and enqueues them for future delivery via a `testIdDelivery` action.
134
+ * Calls to this method determine the total order of delivery, regardless of when `deliverOperations` is called.
135
+ */
136
+ allocateAndSendIds(clientFrom: Client, numIds: number): OpSpaceCompressedId[];
137
+ /**
138
+ * Same contract as `allocateAndSendIds`, but the originating client will be a client with the supplied sessionId.
139
+ */
140
+ allocateAndSendIdsFromRemoteClient(clientFrom: OriginatingClient, sessionIdFrom: SessionId, numIds: number): OpSpaceCompressedId[];
141
+ /**
142
+ * Delivers all undelivered ID ranges from the server to the target clients.
143
+ */
144
+ deliverOperations(clientTakingDelivery: Client, opsToDeliver?: number): void;
145
+ /**
146
+ * Delivers all undelivered ID ranges from the server to the target clients.
147
+ */
148
+ deliverOperations(clientTakingDelivery: DestinationClient): void;
149
+ /**
150
+ * Simulate a client disconnecting (and serializing), then reconnecting (and deserializing)
151
+ */
152
+ goOfflineThenResume(client: Client): void;
153
+ /**
154
+ * Ensure general validity of the network state. Useful for calling periodically or at the end of test scenarios.
155
+ */
156
+ assertNetworkState(): void;
157
+ }
158
+ /**
159
+ * Roundtrips the supplied compressor through serialization and deserialization.
160
+ */
161
+ export declare function roundtrip(compressor: ReadonlyIdCompressor, withSession: true): [SerializedIdCompressorWithOngoingSession, IdCompressor];
162
+ /**
163
+ * Roundtrips the supplied compressor through serialization and deserialization.
164
+ */
165
+ export declare function roundtrip(compressor: ReadonlyIdCompressor, withSession: false): [SerializedIdCompressorWithNoSession, IdCompressor];
166
+ /**
167
+ * Asserts that the supplied compressor correctly roundtrips through serialization/deserialization.
168
+ */
169
+ export declare function expectSerializes(compressor: ReadonlyIdCompressor): [SerializedIdCompressorWithNoSession, SerializedIdCompressorWithOngoingSession];
170
+ /**
171
+ * Merges 'from' into 'to', and returns 'to'.
172
+ */
173
+ export declare function mergeArrayMaps<K, V>(to: Pick<Map<K, V[]>, "get" | "set">, from: ReadonlyMap<K, V[]>): Pick<Map<K, V[]>, "get" | "set">;
174
+ interface AllocateIds {
175
+ type: "allocateIds";
176
+ client: Client;
177
+ numIds: number;
178
+ }
179
+ interface AllocateOutsideIds {
180
+ type: "allocateOutsideIds";
181
+ sessionId: SessionId;
182
+ numIds: number;
183
+ }
184
+ interface DeliverAllOperations {
185
+ type: "deliverAllOperations";
186
+ }
187
+ interface DeliverSomeOperations {
188
+ type: "deliverSomeOperations";
189
+ client: Client;
190
+ count: number;
191
+ }
192
+ interface ChangeCapacity {
193
+ type: "changeCapacity";
194
+ client: Client;
195
+ newSize: number;
196
+ }
197
+ interface Reconnect {
198
+ type: "reconnect";
199
+ client: Client;
200
+ }
201
+ interface Validate {
202
+ type: "validate";
203
+ }
204
+ type Operation = AllocateIds | AllocateOutsideIds | DeliverSomeOperations | DeliverAllOperations | ChangeCapacity | Reconnect | Validate;
205
+ interface FuzzTestState extends BaseFuzzTestState {
206
+ network: IdCompressorTestNetwork;
207
+ activeClients: Client[];
208
+ selectableClients: Client[];
209
+ clusterSize: number;
210
+ }
211
+ export interface OperationGenerationConfig {
212
+ /** maximum cluster size of the network. Default: 25 */
213
+ maxClusterSize?: number;
214
+ /** Number of ops between validation ops. Default: 200 */
215
+ validateInterval?: number;
216
+ /** Fraction of ID allocations that are from an outside client (not Client1/2/3). */
217
+ outsideAllocationFraction?: number;
218
+ }
219
+ export declare function makeOpGenerator(options: OperationGenerationConfig): Generator<Operation, FuzzTestState>;
220
+ /**
221
+ * Performs random actions on a test network.
222
+ * @param generator - the generator used to provide operations
223
+ * @param network - the test network to test
224
+ * @param seed - the seed for the random generation of the fuzz actions
225
+ * @param observerClient - if provided, this client will never generate local ids
226
+ * @param synchronizeAtEnd - if provided, all client will have all operations delivered from the server at the end of the test
227
+ * @param validator - if provided, this callback will be invoked periodically during the fuzz test.
228
+ */
229
+ export declare function performFuzzActions(generator: Generator<Operation, FuzzTestState>, network: IdCompressorTestNetwork, seed: number, observerClient?: Client, synchronizeAtEnd?: boolean, validator?: (network: IdCompressorTestNetwork) => void, saveInfo?: SaveInfo): void;
230
+ /**
231
+ * Helper to generate a fixed number of IDs.
232
+ */
233
+ export declare function generateCompressedIds(compressor: IdCompressor, count: number): SessionSpaceCompressedId[];
234
+ /**
235
+ * Creates a compressor that only produces final IDs.
236
+ * It should only be used for testing purposes.
237
+ */
238
+ export declare function createAlwaysFinalizedIdCompressor(logger?: ITelemetryBaseLogger): IIdCompressor & IIdCompressorCore;
239
+ /**
240
+ * Creates a compressor that only produces final IDs.
241
+ * It should only be used for testing purposes.
242
+ */
243
+ export declare function createAlwaysFinalizedIdCompressor(sessionId: SessionId, logger?: ITelemetryBaseLogger): IIdCompressor & IIdCompressorCore;
244
+ export {};
245
+ //# sourceMappingURL=idCompressorTestUtilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idCompressorTestUtilities.d.ts","sourceRoot":"","sources":["../../src/test/idCompressorTestUtilities.ts"],"names":[],"mappings":"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"}