@fluidframework/id-compressor 2.12.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/.eslintrc.cjs +1 -4
  2. package/CHANGELOG.md +8 -0
  3. package/dist/appendOnlySortedMap.d.ts +37 -16
  4. package/dist/appendOnlySortedMap.d.ts.map +1 -1
  5. package/dist/appendOnlySortedMap.js +39 -21
  6. package/dist/appendOnlySortedMap.js.map +1 -1
  7. package/dist/finalSpace.d.ts +2 -2
  8. package/dist/finalSpace.d.ts.map +1 -1
  9. package/dist/finalSpace.js +5 -5
  10. package/dist/finalSpace.js.map +1 -1
  11. package/dist/idCompressor.d.ts.map +1 -1
  12. package/dist/idCompressor.js +18 -15
  13. package/dist/idCompressor.js.map +1 -1
  14. package/dist/identifiers.d.ts +1 -1
  15. package/dist/identifiers.js +1 -1
  16. package/dist/identifiers.js.map +1 -1
  17. package/dist/package.json +2 -1
  18. package/dist/packageVersion.d.ts +1 -1
  19. package/dist/packageVersion.js +1 -1
  20. package/dist/packageVersion.js.map +1 -1
  21. package/dist/sessions.js.map +1 -1
  22. package/dist/test/appendOnlySortedMap.perf.spec.js.map +1 -1
  23. package/dist/test/appendOnlySortedMap.spec.js.map +1 -1
  24. package/dist/test/idCompressor.perf.spec.js.map +1 -1
  25. package/dist/test/idCompressor.spec.js.map +1 -1
  26. package/dist/test/idCompressorTestUtilities.d.ts +39 -13
  27. package/dist/test/idCompressorTestUtilities.d.ts.map +1 -1
  28. package/dist/test/idCompressorTestUtilities.js +68 -59
  29. package/dist/test/idCompressorTestUtilities.js.map +1 -1
  30. package/dist/test/numericUuid.spec.js.map +1 -1
  31. package/dist/test/sessionSpaceNormalizer.spec.js.map +1 -1
  32. package/dist/test/snapshots/summary.spec.js.map +1 -1
  33. package/dist/test/testCommon.d.ts +5 -1
  34. package/dist/test/testCommon.d.ts.map +1 -1
  35. package/dist/test/testCommon.js +2 -0
  36. package/dist/test/testCommon.js.map +1 -1
  37. package/dist/utilities.d.ts.map +1 -1
  38. package/dist/utilities.js +11 -8
  39. package/dist/utilities.js.map +1 -1
  40. package/lib/appendOnlySortedMap.d.ts +37 -16
  41. package/lib/appendOnlySortedMap.d.ts.map +1 -1
  42. package/lib/appendOnlySortedMap.js +39 -21
  43. package/lib/appendOnlySortedMap.js.map +1 -1
  44. package/lib/finalSpace.d.ts +2 -2
  45. package/lib/finalSpace.d.ts.map +1 -1
  46. package/lib/finalSpace.js +5 -5
  47. package/lib/finalSpace.js.map +1 -1
  48. package/lib/idCompressor.d.ts.map +1 -1
  49. package/lib/idCompressor.js +18 -15
  50. package/lib/idCompressor.js.map +1 -1
  51. package/lib/identifiers.d.ts +1 -1
  52. package/lib/identifiers.js +1 -1
  53. package/lib/identifiers.js.map +1 -1
  54. package/lib/packageVersion.d.ts +1 -1
  55. package/lib/packageVersion.js +1 -1
  56. package/lib/packageVersion.js.map +1 -1
  57. package/lib/sessions.js.map +1 -1
  58. package/lib/test/appendOnlySortedMap.perf.spec.js.map +1 -1
  59. package/lib/test/appendOnlySortedMap.spec.js.map +1 -1
  60. package/lib/test/idCompressor.perf.spec.js.map +1 -1
  61. package/lib/test/idCompressor.spec.js.map +1 -1
  62. package/lib/test/idCompressorTestUtilities.d.ts +39 -13
  63. package/lib/test/idCompressorTestUtilities.d.ts.map +1 -1
  64. package/lib/test/idCompressorTestUtilities.js +43 -34
  65. package/lib/test/idCompressorTestUtilities.js.map +1 -1
  66. package/lib/test/numericUuid.spec.js.map +1 -1
  67. package/lib/test/sessionSpaceNormalizer.spec.js.map +1 -1
  68. package/lib/test/snapshots/summary.spec.js.map +1 -1
  69. package/lib/test/testCommon.d.ts +5 -1
  70. package/lib/test/testCommon.d.ts.map +1 -1
  71. package/lib/test/testCommon.js +2 -0
  72. package/lib/test/testCommon.js.map +1 -1
  73. package/lib/utilities.d.ts.map +1 -1
  74. package/lib/utilities.js +11 -8
  75. package/lib/utilities.js.map +1 -1
  76. package/package.json +9 -9
  77. package/src/appendOnlySortedMap.ts +39 -21
  78. package/src/finalSpace.ts +6 -6
  79. package/src/idCompressor.ts +22 -18
  80. package/src/identifiers.ts +1 -1
  81. package/src/packageVersion.ts +1 -1
  82. package/src/sessions.ts +2 -2
  83. package/src/test/idCompressorTestUtilities.ts +70 -41
  84. package/src/test/testCommon.ts +5 -1
  85. package/src/utilities.ts +12 -9
@@ -1 +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\";\n\nimport { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { take } from \"@fluid-private/stochastic-test-utils\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IdCompressor, createIdCompressor, deserializeIdCompressor } from \"../idCompressor.js\";\nimport {\n\tOpSpaceCompressedId,\n\tSerializedIdCompressorWithNoSession,\n\tSessionId,\n\tSessionSpaceCompressedId,\n\tStableId,\n} from \"../index.js\";\nimport { createSessionId } from \"../utilities.js\";\n\nimport {\n\tClient,\n\tCompressorFactory,\n\tDestinationClient,\n\tIdCompressorTestNetwork,\n\tMetaClient,\n\texpectSerializes,\n\tmakeOpGenerator,\n\tperformFuzzActions,\n\troundtrip,\n\tsessionIds,\n} from \"./idCompressorTestUtilities.js\";\nimport {\n\tLocalCompressedId,\n\tfail,\n\tincrementStableId,\n\tisFinalId,\n\tisLocalId,\n} 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[] = [id1_1, id1_2, id2_1, id2_2, id2_3, id3_1];\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\n\t\tit(\"with the correct local ranges\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 1);\n\t\t\tconst ids1 = generateCompressedIds(compressor, 1);\n\t\t\tconst range1 = compressor.takeNextCreationRange(); // one local\n\t\t\tassert.deepEqual(ids1, [-1]);\n\t\t\tassert.deepEqual(range1.ids?.localIdRanges, [[1, 1]]);\n\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tconst ids2 = generateCompressedIds(compressor, 1);\n\t\t\tconst range2 = compressor.takeNextCreationRange(); // one eager final\n\t\t\tassert.deepEqual(ids2, [1]);\n\t\t\tassert.deepEqual(range2.ids?.localIdRanges, []);\n\n\t\t\t// make new cluster\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst ids3 = generateCompressedIds(compressor, 2);\n\t\t\tconst range3 = compressor.takeNextCreationRange(); // one eager final and one local\n\t\t\tassert.deepEqual(ids3, [3, -5]);\n\t\t\tassert.deepEqual(range3.ids?.localIdRanges, [[5, 1]]);\n\n\t\t\t(range3 as any).ids.requestedClusterSize = 4;\n\t\t\tconst ids4 = generateCompressedIds(compressor, 2);\n\t\t\tcompressor.finalizeCreationRange(range3);\n\t\t\tids4.push(...generateCompressedIds(compressor, 5));\n\t\t\tconst range4 = compressor.takeNextCreationRange(); // two locals, two eager finals, three locals\n\t\t\tassert.deepEqual(ids4, [-6, -7, 7, 8, -10, -11, -12]);\n\t\t\tassert.deepEqual(range4.ids?.localIdRanges, [\n\t\t\t\t[6, 2],\n\t\t\t\t[10, 3],\n\t\t\t]);\n\t\t});\n\n\t\tdescribe(\"by retaking all outstanding ranges\", () => {\n\t\t\tit(\"when there are no outstanding ranges\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\t\t\t\tlet retakenRangeEmpty = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.equal(retakenRangeEmpty.ids, undefined);\n\t\t\t\tcompressor.finalizeCreationRange(retakenRangeEmpty);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\tretakenRangeEmpty = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.equal(retakenRangeEmpty.ids, undefined);\n\t\t\t});\n\n\t\t\tit(\"when there is one outstanding ranges with local IDs only\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tcompressor.takeNextCreationRange();\n\n\t\t\t\tlet retakenRangeLocalOnly = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRangeLocalOnly.ids, {\n\t\t\t\t\tfirstGenCount: 1,\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tlocalIdRanges: [[1, 1]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tretakenRangeLocalOnly = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRangeLocalOnly.ids, {\n\t\t\t\t\tfirstGenCount: 1,\n\t\t\t\t\tcount: 2,\n\t\t\t\t\tlocalIdRanges: [[1, 2]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tlet postRetakeRange = compressor.takeNextCreationRange();\n\t\t\t\t// IDs should be undefined because retaking should still advance the taken ID counter\n\t\t\t\t// if it doesn't, ranges will be resubmitted causing out of order errors\n\t\t\t\tassert.equal(postRetakeRange.ids, undefined);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tpostRetakeRange = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(postRetakeRange.ids, {\n\t\t\t\t\tfirstGenCount: 3,\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tlocalIdRanges: [[3, 1]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tcompressor.finalizeCreationRange(retakenRangeLocalOnly);\n\t\t\t});\n\n\t\t\tit(\"when there are multiple outstanding ranges\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one local\n\t\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range2.ids?.localIdRanges, [[2, 1]]);\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one eager final\n\t\t\t\tconst range3 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range3.ids?.localIdRanges, []);\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one local\n\t\t\t\tconst range4 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range4.ids?.localIdRanges, [[4, 1]]);\n\n\t\t\t\tconst retakenRange = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRange.ids?.firstGenCount, 2);\n\t\t\t\tassert.deepEqual(retakenRange.ids?.count, 3);\n\t\t\t\tassert.deepEqual(retakenRange.ids?.localIdRanges, [\n\t\t\t\t\t[2, 1],\n\t\t\t\t\t[4, 1],\n\t\t\t\t]);\n\n\t\t\t\tcompressor.finalizeCreationRange(retakenRange);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range2),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range3),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range4),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Finalizing\", () => {\n\t\tit(\"prevents attempts to finalize ranges twice\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(compressor, 3);\n\t\t\tconst batchRange = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(batchRange);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.finalizeCreationRange(batchRange),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\te.message === \"Ranges finalized out of order\" &&\n\t\t\t\t\t(e as any).expectedStart === -4 &&\n\t\t\t\t\t(e as any).actualStart === -1,\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) =>\n\t\t\t\t\te.message === \"Ranges finalized out of order\" &&\n\t\t\t\t\t(e as any).expectedStart === -1 &&\n\t\t\t\t\t(e as any).actualStart === -2,\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) => e.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"]}
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\n/* eslint-disable import/no-nodejs-modules */\nimport { strict as assert } from \"node:assert\";\n\nimport { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { take } from \"@fluid-private/stochastic-test-utils\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IdCompressor, createIdCompressor, deserializeIdCompressor } from \"../idCompressor.js\";\nimport {\n\tOpSpaceCompressedId,\n\tSerializedIdCompressorWithNoSession,\n\tSessionId,\n\tSessionSpaceCompressedId,\n\tStableId,\n} from \"../index.js\";\nimport { createSessionId } from \"../utilities.js\";\n\nimport {\n\tClient,\n\tCompressorFactory,\n\tDestinationClient,\n\tIdCompressorTestNetwork,\n\tMetaClient,\n\texpectSerializes,\n\tmakeOpGenerator,\n\tperformFuzzActions,\n\troundtrip,\n\tsessionIds,\n} from \"./idCompressorTestUtilities.js\";\nimport {\n\tLocalCompressedId,\n\tfail,\n\tincrementStableId,\n\tisFinalId,\n\tisLocalId,\n} 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\tfor (const id of [id1_1, id1_2, id2_1, id2_2, id3_1, id3_2, id4_1, id4_2]) {\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[] = [id1_1, id1_2, id2_1, id2_2, id2_3, id3_1];\n\t\t\t\tfor (const id of allIds) 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\tfor (const id of allIds) {\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\tfor (const { title, idCount } of tests) {\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(idCount, 0);\n\t\t\t\t} else {\n\t\t\t\t\tassert.equal(range.ids.count, idCount);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tit(\"with the correct local ranges\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 1);\n\t\t\tconst ids1 = generateCompressedIds(compressor, 1);\n\t\t\tconst range1 = compressor.takeNextCreationRange(); // one local\n\t\t\tassert.deepEqual(ids1, [-1]);\n\t\t\tassert.deepEqual(range1.ids?.localIdRanges, [[1, 1]]);\n\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tconst ids2 = generateCompressedIds(compressor, 1);\n\t\t\tconst range2 = compressor.takeNextCreationRange(); // one eager final\n\t\t\tassert.deepEqual(ids2, [1]);\n\t\t\tassert.deepEqual(range2.ids?.localIdRanges, []);\n\n\t\t\t// make new cluster\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst ids3 = generateCompressedIds(compressor, 2);\n\t\t\tconst range3 = compressor.takeNextCreationRange(); // one eager final and one local\n\t\t\tassert.deepEqual(ids3, [3, -5]);\n\t\t\tassert.deepEqual(range3.ids?.localIdRanges, [[5, 1]]);\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(range3 as any).ids.requestedClusterSize = 4;\n\t\t\tconst ids4 = generateCompressedIds(compressor, 2);\n\t\t\tcompressor.finalizeCreationRange(range3);\n\t\t\tids4.push(...generateCompressedIds(compressor, 5));\n\t\t\tconst range4 = compressor.takeNextCreationRange(); // two locals, two eager finals, three locals\n\t\t\tassert.deepEqual(ids4, [-6, -7, 7, 8, -10, -11, -12]);\n\t\t\tassert.deepEqual(range4.ids?.localIdRanges, [\n\t\t\t\t[6, 2],\n\t\t\t\t[10, 3],\n\t\t\t]);\n\t\t});\n\n\t\tdescribe(\"by retaking all outstanding ranges\", () => {\n\t\t\tit(\"when there are no outstanding ranges\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\t\t\t\tlet retakenRangeEmpty = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.equal(retakenRangeEmpty.ids, undefined);\n\t\t\t\tcompressor.finalizeCreationRange(retakenRangeEmpty);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\tretakenRangeEmpty = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.equal(retakenRangeEmpty.ids, undefined);\n\t\t\t});\n\n\t\t\tit(\"when there is one outstanding ranges with local IDs only\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tcompressor.takeNextCreationRange();\n\n\t\t\t\tlet retakenRangeLocalOnly = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRangeLocalOnly.ids, {\n\t\t\t\t\tfirstGenCount: 1,\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tlocalIdRanges: [[1, 1]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tretakenRangeLocalOnly = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRangeLocalOnly.ids, {\n\t\t\t\t\tfirstGenCount: 1,\n\t\t\t\t\tcount: 2,\n\t\t\t\t\tlocalIdRanges: [[1, 2]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tlet postRetakeRange = compressor.takeNextCreationRange();\n\t\t\t\t// IDs should be undefined because retaking should still advance the taken ID counter\n\t\t\t\t// if it doesn't, ranges will be resubmitted causing out of order errors\n\t\t\t\tassert.equal(postRetakeRange.ids, undefined);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tpostRetakeRange = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(postRetakeRange.ids, {\n\t\t\t\t\tfirstGenCount: 3,\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tlocalIdRanges: [[3, 1]],\n\t\t\t\t\trequestedClusterSize: 2,\n\t\t\t\t});\n\n\t\t\t\tcompressor.finalizeCreationRange(retakenRangeLocalOnly);\n\t\t\t});\n\n\t\t\tit(\"when there are multiple outstanding ranges\", () => {\n\t\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1, 2);\n\t\t\t\tgenerateCompressedIds(compressor, 1);\n\t\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one local\n\t\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range2.ids?.localIdRanges, [[2, 1]]);\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one eager final\n\t\t\t\tconst range3 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range3.ids?.localIdRanges, []);\n\t\t\t\tgenerateCompressedIds(compressor, 1); // one local\n\t\t\t\tconst range4 = compressor.takeNextCreationRange();\n\t\t\t\tassert.deepEqual(range4.ids?.localIdRanges, [[4, 1]]);\n\n\t\t\t\tconst retakenRange = compressor.takeUnfinalizedCreationRange();\n\t\t\t\tassert.deepEqual(retakenRange.ids?.firstGenCount, 2);\n\t\t\t\tassert.deepEqual(retakenRange.ids?.count, 3);\n\t\t\t\tassert.deepEqual(retakenRange.ids?.localIdRanges, [\n\t\t\t\t\t[2, 1],\n\t\t\t\t\t[4, 1],\n\t\t\t\t]);\n\n\t\t\t\tcompressor.finalizeCreationRange(retakenRange);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range2),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range3),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => compressor.finalizeCreationRange(range4),\n\t\t\t\t\t(e: Error) => e.message === \"Ranges finalized out of order\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Finalizing\", () => {\n\t\tit(\"prevents attempts to finalize ranges twice\", () => {\n\t\t\tconst compressor = CompressorFactory.createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(compressor, 3);\n\t\t\tconst batchRange = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(batchRange);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.finalizeCreationRange(batchRange),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\te.message === \"Ranges finalized out of order\" &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t\t(e as any).expectedStart === -4 &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t\t(e as any).actualStart === -1,\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) =>\n\t\t\t\t\te.message === \"Ranges finalized out of order\" &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t\t(e as any).expectedStart === -1 &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t\t(e as any).actualStart === -2,\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\tfor (const id of ids) opIds.add(compressor.normalizeToOpSpace(id));\n\t\t\t\t\tassert.equal(ids.size, opIds.size);\n\t\t\t\t\tfor (const id of opIds) 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) => e.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;\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 = (): SessionSpaceCompressedId =>\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 (const [i, data1] of log1.entries()) {\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\tfor (const { id } of network.getIdLog(Client.Client1)) 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\tfor (const idData of network.getIdLog(Client.Client1))\n\t\t\t\tassert(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\tfor (const { id } of network.getIdLog(Client.Client1)) 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\tfor (const { id } of network.getIdLog(Client.Client2)) 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\tfor (const { id } of network.getIdLog(Client.Client1).slice(-3)) 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\tfor (const { id } of network.getIdLog(Client.Client1))\n\t\t\t\tassert(isFinalId(compressor1.normalizeToOpSpace(id)));\n\n\t\t\t// Compression should preserve ID space correctness\n\t\t\tfor (const idData of network.getIdLog(Client.Client1)) {\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\tfor (const idData of network.getIdLog(Client.Client1)) {\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\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\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst clusterCapacity: number = 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\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst clusterCapacity: number = 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\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\tconst clusterSize: number = 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): void {\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"]}