@fluid-experimental/tree 1.2.6 → 1.2.7
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.
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +22 -7
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts +2 -2
- package/dist/id-compressor/SessionIdNormalizer.js +2 -2
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +22 -7
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts +2 -2
- package/lib/id-compressor/SessionIdNormalizer.js +2 -2
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/lib/test/IdCompressor.tests.js +23 -0
- package/lib/test/IdCompressor.tests.js.map +1 -1
- package/package.json +17 -17
- package/src/id-compressor/IdCompressor.ts +28 -7
- package/src/id-compressor/SessionIdNormalizer.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdCompressor.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.tests.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 { expect } from 'chai';\nimport { v4, v5 } from 'uuid';\nimport { take } from '@fluid-internal/stochastic-test-utils';\nimport {\n\tIdCompressor,\n\tisFinalId,\n\tisLocalId,\n\thasOngoingSession,\n\tlegacySharedTreeInitialTreeId,\n} from '../id-compressor/IdCompressor';\nimport {\n\tLocalCompressedId,\n\tFinalCompressedId,\n\tSessionSpaceCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n} from '../Identifiers';\nimport { assert, assertNotUndefined, fail } from '../Common';\nimport {\n\tcreateSessionId,\n\tincrementUuid,\n\tnumericUuidFromStableId,\n\tstableIdFromNumericUuid,\n} from '../id-compressor/NumericUuid';\nimport { getIds } from '../id-compressor/IdRange';\nimport type { IdCreationRange, UnackedLocalId } from '../id-compressor';\nimport { assertIsStableId, generateStableId, isStableId } from '../UuidUtilities';\nimport {\n\tcreateCompressor,\n\tperformFuzzActions,\n\tsessionIds,\n\tIdCompressorTestNetwork,\n\tClient,\n\tDestinationClient,\n\tMetaClient,\n\texpectSerializes,\n\troundtrip,\n\tsessionNumericUuids,\n\tmakeOpGenerator,\n\tattributionIds,\n\tgenerateCompressedIds,\n} from './utilities/IdCompressorTestUtilities';\nimport { expectDefined, expectAssert } from './utilities/TestCommon';\n\ndescribe('IdCompressor', () => {\n\tit('detects invalid cluster sizes', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 1);\n\t\texpect(() => (compressor.clusterCapacity = -1)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = 0)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = IdCompressor.maxClusterSize + 1)).to.throw(\n\t\t\t'Clusters must not exceed max cluster size'\n\t\t);\n\t});\n\n\tit('reports the proper session ID', () => {\n\t\tconst sessionId = createSessionId();\n\t\tconst compressor = new IdCompressor(sessionId, 0);\n\t\texpect(compressor.localSessionId).to.equal(sessionId);\n\t});\n\n\tit('accepts different numbers of reserved IDs', () => {\n\t\tfor (const reservedIdCount of [0, 1, 5]) {\n\t\t\tconst compressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\t\tif (reservedIdCount > 0) {\n\t\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\t}\n\t\t}\n\t});\n\n\tdescribe('ID Generation', () => {\n\t\tit('can create a compressed ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can create compressed IDs with v5 overrides', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst uuidA = v5('foo', '7834b437-6e8c-4936-a1a3-0130b1178f17');\n\t\t\tconst uuidB = uuidA.slice(0, uuidA.length - 1) + (uuidA.charAt(uuidA.length - 1) === 'a' ? 'b' : 'a');\n\t\t\tconst idA = compressor.generateCompressedId(uuidA);\n\t\t\tconst idB = compressor.generateCompressedId(uuidB);\n\t\t\texpect(compressor.decompress(idA)).to.equal(uuidA);\n\t\t\texpect(compressor.decompress(idB)).to.equal(uuidB);\n\t\t});\n\n\t\tit('can manually create a compressed ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(id).to.equal(compressor.recompress(uuid));\n\t\t});\n\n\t\tit('will not decompress IDs it did not compress', () => {\n\t\t\tconst errorMessage = 'Compressed ID was not generated by this compressor';\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(() => compressor.decompress(-1 as LocalCompressedId)).to.throw(errorMessage);\n\t\t\texpect(() => compressor.decompress(compressor.reservedIdCount as FinalCompressedId)).to.throw(errorMessage);\n\t\t});\n\n\t\tit('will not re-compress uuids it did not originally compress', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.tryRecompress('5fff846a-efd4-42fb-8b78-b32ce2672f99')).to.be.undefined;\n\t\t});\n\n\t\tit('unifies duplicate overrides originating from the same compressor', () => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tconst localId1 = compressor.generateCompressedId(override);\n\t\t\tconst localId2 = compressor.generateCompressedId(override);\n\t\t\texpect(localId1).to.equal(localId2, 'only one local ID should be allocated for the same override');\n\t\t\texpect(compressor.decompress(localId1)).to.equal(override, 'override incorrectly associated with local ID');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort before the reserved session UUID', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted before the reserved UUID\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `0${legacySharedTreeInitialTreeId.slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 1 /* just needs to be > 0 */);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing override', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing override\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 0);\n\n\t\t\t// Client1 compresses a uuid with some override that will sort before the session uuid\n\t\t\tcompressor.generateCompressedId(`a${v4().slice(1)}`);\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing cluster', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing cluster\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession1 = `c${v4().slice(1)}` as SessionId;\n\t\t\tconst newSession2 = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor1 = new IdCompressor(newSession1, 0);\n\t\t\tconst compressor2 = new IdCompressor(newSession2, 0);\n\t\t\tcompressor1.clusterCapacity = 5;\n\t\t\tcompressor2.clusterCapacity = 5;\n\n\t\t\tcompressor2.generateCompressedId(); // one ID, enough to make a cluster\n\t\t\tcompressor1.finalizeCreationRange(compressor2.takeNextCreationRange());\n\n\t\t\tconst localId = compressor1.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor1.decompress(localId));\n\t\t\tconst localId3 = compressor1.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies unfinalized local overrides with final IDs from a remote session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, 3);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 3);\n\n\t\t\tconst override = 'override';\n\t\t\tconst local1 = compressor1.generateCompressedId(override);\n\t\t\tconst local2 = compressor2.generateCompressedId(override);\n\t\t\tconst creationRange = compressor2.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\n\t\t\texpect(compressor1.decompress(local1)).to.equal(override);\n\t\t\tconst final1 = compressor1.normalizeToOpSpace(local1);\n\t\t\tconst final2 = compressor2.normalizeToOpSpace(local2);\n\t\t\texpect(isFinalId(final1)).to.be.true;\n\t\t\texpect(final1).to.equal(final2);\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that have been finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst stableId = assertIsStableId(compressor.decompress(id));\n\t\t\tconst localId2 = compressor.generateCompressedId(stableId);\n\t\t\texpect(localId2).to.equal(id, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\t});\n\n\tdescribe('can enumerate all locally created IDs', () => {\n\t\tconst idCount = 10;\n\t\tit('created without finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tif (i === Math.floor(idCount / 2)) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with expanded finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount * 4; i++) {\n\t\t\t\tif (i !== 0 && i % Math.floor(idCount / 3) === 0) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with overrides', () => {\n\t\t\tconst capacity = 100;\n\t\t\tconst compressor = createCompressor(Client.Client1, capacity);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < capacity; i++) {\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId(i % 3 === 0 ? undefined : `override${i}`));\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\t});\n\n\tit('has default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\texpectDefined(compressor.attributionId);\n\t});\n\n\tit('correctly uses explicit attribution ID', () => {\n\t\tconst attributionId = generateStableId();\n\t\tconst compressor = createCompressor(Client.Client1, 5, attributionId);\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\tconst range1 = compressor.takeNextCreationRange();\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\texpect(range1.attributionId).to.equal(attributionId);\n\t});\n\n\tit('only sends attribution ID until the first ID is allocated', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 5, generateStableId());\n\t\tlet range = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\tcompressor.generateCompressedId();\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('does not send default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\tconst range = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('attributes correctly after unification', () => {\n\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));\n\t\tconst id1 = compressor1.generateCompressedId('override');\n\t\tconst id2 = compressor2.generateCompressedId('override');\n\t\tconst range1 = compressor1.takeNextCreationRange();\n\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\tcompressor1.finalizeCreationRange(range2); // 2 gets sequenced first\n\t\tcompressor2.finalizeCreationRange(range2);\n\t\tcompressor1.finalizeCreationRange(range1);\n\t\tcompressor2.finalizeCreationRange(range1);\n\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(compressor2.normalizeToOpSpace(id2));\n\t\texpect(compressor1.attributeId(id1)).to.equal(attributionIds.get(Client.Client2));\n\t\texpect(compressor1.attributeId(compressor1.recompress(compressor2.decompress(id2)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(compressor2.recompress(compressor1.decompress(id1)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(id2)).to.equal(attributionIds.get(Client.Client2));\n\t});\n\n\tdescribe('can produce a creation range', () => {\n\t\tconst tests: {\n\t\t\ttitle: string;\n\t\t\toverrideIndices: number[];\n\t\t\tidCount: number;\n\t\t}[] = [\n\t\t\t{ title: 'that is empty', overrideIndices: [], idCount: 0 },\n\t\t\t{ title: 'with only sequential IDs', overrideIndices: [], idCount: 3 },\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID before an overriding ID',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID after an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID between sequential IDs',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID between override IDs',\n\t\t\t\toverrideIndices: [0, 2],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t];\n\n\t\ttests.forEach(({ title, overrideIndices, idCount }) => {\n\t\t\tit(title, () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\tvalidateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t});\n\n\t\t\ttests.forEach(({ title: title2, overrideIndices: overrideIndices2, idCount: idCount2 }) => {\n\t\t\t\tit(`${title2} after a range ${title}`, () => {\n\t\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\t\tconst lastTaken = validateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t\t\tvalidateIdCreationRange(compressor, idCount2, new Set(overrideIndices2), lastTaken);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tfunction validateIdCreationRange(\n\t\t\tcompressor: IdCompressor,\n\t\t\tidCount: number,\n\t\t\toverrideIndices: Set<number>,\n\t\t\tlastTakenId = 0 as UnackedLocalId\n\t\t): UnackedLocalId {\n\t\t\tconst overrides: [SessionSpaceCompressedId, string?][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst override = overrideIndices.has(i) ? v4() : undefined;\n\t\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\t\toverrides.push([id, override]);\n\t\t\t}\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tlet newLastTakenId = lastTakenId;\n\t\t\tlet idsActual = getIds(range);\n\t\t\tif (overrides.length === 0) {\n\t\t\t\texpect(idsActual).to.be.undefined;\n\t\t\t} else {\n\t\t\t\tidsActual = expectDefined(idsActual);\n\t\t\t\texpect(overrides[0][0]).to.equal(idsActual.first);\n\t\t\t\texpect(overrides[overrides.length - 1][0]).to.equal(idsActual.last);\n\t\t\t\tfor (const [id, uuid] of Object.entries(overrideIndices)) {\n\t\t\t\t\texpect(overrides[id][1]).to.equal(uuid);\n\t\t\t\t}\n\t\t\t\tnewLastTakenId = idsActual.last;\n\t\t\t}\n\n\t\t\treturn newLastTakenId;\n\t\t}\n\t});\n\n\tdescribe('Finalizing', () => {\n\t\tit('can finalize multiple overrides into the same cluster using different ranges', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override1 = 'override1';\n\t\t\tconst override2 = 'override2';\n\t\t\tconst id1 = compressor.generateCompressedId(override1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\tconst id2 = compressor.generateCompressedId(override2);\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tconst finalId1 = compressor.normalizeToOpSpace(id1);\n\t\t\tconst finalId2 = compressor.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId1)).to.equal(override1);\n\t\t\texpect(compressor.decompress(finalId2)).to.equal(override2);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges twice', () => {\n\t\t\tconst rangeCompressor = createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(rangeCompressor, 3);\n\t\t\tconst batchRange = rangeCompressor.takeNextCreationRange();\n\t\t\trangeCompressor.finalizeCreationRange(batchRange);\n\t\t\texpect(() => rangeCompressor.finalizeCreationRange(batchRange)).to.throw('Ranges finalized out of order.');\n\n\t\t\t// Make a new compressor, as the first one will be left in a bad state\n\t\t\tconst explicitCompressor = createCompressor(Client.Client1);\n\t\t\texplicitCompressor.generateCompressedId();\n\t\t\texplicitCompressor.generateCompressedId('override');\n\t\t\tconst explicitRange = explicitCompressor.takeNextCreationRange();\n\t\t\texplicitCompressor.finalizeCreationRange(explicitRange);\n\t\t\texpect(() => explicitCompressor.finalizeCreationRange(explicitRange)).to.throw(\n\t\t\t\t'Ranges finalized out of order.'\n\t\t\t);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges out of order', () => {\n\t\t\tconst compressor = 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\texpect(() => compressor.finalizeCreationRange(secondRange)).to.throw('Ranges finalized out of order.');\n\t\t});\n\n\t\tit('prevents finalizing unacceptably enormous amounts of ID allocation', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst integerLargerThanHalfMax = Math.round((Number.MAX_SAFE_INTEGER / 3) * 2);\n\t\t\tconst midPoint = -integerLargerThanHalfMax as UnackedLocalId;\n\t\t\tconst largeRange1: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: { first: -1 as UnackedLocalId, last: midPoint },\n\t\t\t};\n\t\t\tcompressor1.finalizeCreationRange(largeRange1);\n\t\t\tconst largeRange2: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: {\n\t\t\t\t\tfirst: (midPoint - 1) as UnackedLocalId,\n\t\t\t\t\tlast: (-Number.MAX_SAFE_INTEGER - 2) as UnackedLocalId,\n\t\t\t\t},\n\t\t\t};\n\t\t\texpect(() => compressor1.finalizeCreationRange(largeRange2)).to.throw(\n\t\t\t\t'The number of allocated final IDs must not exceed the JS maximum safe integer.'\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Compression', () => {\n\t\tit('can re-compress a sequential uuid it generated', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress overrides from a remote client it has finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst override = 'override';\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst uuid = compressor.decompress(id);\n\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tcompressor2.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId1 = compressor2.recompress(uuid);\n\t\t\tconst finalId2 = compressor2.recompress(override);\n\t\t\tif (finalId1 === undefined || finalId2 === undefined) {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t});\n\n\t\tit('will not compress an override it never compressed or finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t// Leading zeroes to exploit calls to getOrNextLower on uuid maps, as it will be before test session uuids\n\t\t\tconst override = 'override';\n\t\t\texpect(compressor.tryRecompress(override)).to.be.undefined;\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 1))).to.be\n\t\t\t\t.undefined;\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tgenerateCompressedIds(compressor, 2);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 4))).to.be\n\t\t\t\t.undefined;\n\t\t});\n\n\t\tit('can re-compress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(finalId)).to.be.true;\n\t\t\tconst stableId = stableIdFromNumericUuid(numericUuidFromStableId(sessionIds.get(Client.Client1)), 1);\n\t\t\texpect(compressor.recompress(stableId)).to.equal(finalId);\n\t\t});\n\t});\n\n\tdescribe('Decompression', () => {\n\t\tit('can decompress a local ID before and after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('can decompress reserved IDs', () => {\n\t\t\t// This is a glass box test in that it increments UUIDs\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\tconst reservedSessionUuid = numericUuidFromStableId(\n\t\t\t\tassertIsStableId(compressor.decompress(compressor.getReservedId(1)))\n\t\t\t);\n\t\t\tfor (let i = 1; i < compressor.reservedIdCount; i++) {\n\t\t\t\tconst reservedId = compressor.getReservedId(i);\n\t\t\t\tconst stable = compressor.decompress(reservedId);\n\t\t\t\texpect(stable).to.equal(stableIdFromNumericUuid(incrementUuid(reservedSessionUuid, i - 1)));\n\t\t\t\tconst finalIdForReserved = compressor.recompress(stable);\n\t\t\t\texpect(isLocalId(finalIdForReserved)).to.be.false;\n\t\t\t\texpect(finalIdForReserved).to.equal(reservedId);\n\t\t\t}\n\t\t\tconst outOfBoundsError = 'Reserved Id index out of bounds';\n\t\t\texpect(() => compressor.getReservedId(-1)).to.throw(outOfBoundsError);\n\t\t\texpect(() => compressor.getReservedId(compressor.reservedIdCount)).to.throw(outOfBoundsError);\n\t\t});\n\n\t\tit('can decompress a final ID', () => {\n\t\t\tconst compressor = 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\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t});\n\n\t\tit('can decompress a final ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(uuid).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an override that is an UUID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst uuid = 'd1302ab1-3c08-4e79-a49a-4c39ac369c16';\n\t\t\tconst id = compressor.generateCompressedId(uuid);\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('properly sorts UUID-like overrides separately from true UUIDs', () => {\n\t\t\t// This is a glass box test that ensures overrides which would sort in between a cluster base UUID and an UUID higher up in the\n\t\t\t// same cluster are not accidentally retrieved during cluster ID lookup.\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `${compressor.localSessionId}6`;\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst decompressedId = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(decompressedId)).to.equal(id);\n\t\t});\n\n\t\tit('can decompress an override that starts with the reserved prefix character', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `\\ue15e${compressor.localSessionId}`;\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(finalId)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId)).to.equal(\n\t\t\t\tstableIdFromNumericUuid(numericUuidFromStableId(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 = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isLocalId(id)).to.be.true;\n\t\t\texpect(id).to.equal(normalized);\n\t\t});\n\n\t\tit('can normalize a local ID to op space after finalizing', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(normalized)).to.be.true;\n\t\t\texpect(id).to.not.equal(normalized);\n\t\t});\n\n\t\tit('can normalize an eagerly generated final ID', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(eagerFinalId)).to.be.true;\n\t\t\tconst opNormalized = compressor.normalizeToOpSpace(eagerFinalId);\n\t\t\texpect(eagerFinalId).to.equal(opNormalized);\n\t\t\tconst sessionNormalized = compressor.normalizeToSessionSpace(opNormalized, compressor.localSessionId);\n\t\t\texpect(sessionNormalized).to.equal(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 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst normalized = compressor1.normalizeToOpSpace(compressor1.generateCompressedId());\n\t\t\texpect(() => compressor2.normalizeToSessionSpace(normalized, compressor1.localSessionId)).to.throw(\n\t\t\t\t'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 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = 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\texpect(isLocalId(normalizedLocal)).to.be.true;\n\t\t\texpect(isFinalId(normalizedFinal)).to.be.true;\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedFinal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedLocal, compressor1.localSessionId)).to.equal(\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 = createCompressor(Client.Client1, 5);\n\t\t\tconst compressor2 = 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(compressor.normalizeToOpSpace(id), compressor.localSessionId)\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\texpect(normalizedToClient1SessionSpace).to.equal(id);\n\t\t});\n\t});\n\n\tdescribe('Serialization', () => {\n\t\tit('can serialize an empty compressor', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(compressor);\n\t\t\texpect(serializedWithSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t\texpect(serializedNoSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t});\n\n\t\tit('correctly deserializes and resumes a session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(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\tcompressor1.finalizeCreationRange(range2);\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\texpect(\n\t\t\t\tIdCompressor.deserialize(compressor1.serialize(false), createSessionId()).equals(\n\t\t\t\t\tIdCompressor.deserialize(compressor2.serialize(false), createSessionId()),\n\t\t\t\t\tfalse // don't compare local state\n\t\t\t\t)\n\t\t\t).to.be.true;\n\t\t});\n\n\t\tit('can serialize local state with attribution but no IDs', () => {\n\t\t\t// This is a regression test for the scenario in which an ID compressor sends its first range, which\n\t\t\t// includes its attribution ID, but has made no IDs. An incorrect optimization when serializing had\n\t\t\t// omitted local state if no IDs had been allocated, but then also dropped the `sentAttribution` flag\n\t\t\tconst compressor = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\texpect(range.ids).to.be.undefined;\n\t\t\texpect(range.attributionId).to.equal(attributionIds.get(Client.Client1));\n\t\t\texpectSerializes(compressor);\n\t\t});\n\t});\n\n\t// No validation, as these leave the network in a broken state\n\tdescribeNetworkNoValidation('detects UUID collision', (itNetwork) => {\n\t\titNetwork(\n\t\t\t'when a client requests an override that is an UUID reserved for later allocation by a cluster',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\t\tconst id = network.getIdLog(Client.Client2)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor2.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 1);\n\t\t\t\t// TODO:#283: Re-assess test when full unification is implemented\n\t\t\t\texpect(() => network.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid })).to.not.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork(\n\t\t\t'when a new cluster is allocated whose base UUID collides with an existing override',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1); // new cluster\n\t\t\t\texpect(() => network.deliverOperations(Client.Client1)).to.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork('detects colliding override UUIDs when expanding a cluster', 1, (network) => {\n\t\t\t// This is a glass box test in that it is testing cluster expansion\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\tconst expansion = 3;\n\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), expansion);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, expansion, { 0: nextUuid });\n\t\t\texpect(() => network.deliverOperations(DestinationClient.All)).to.throw(\n\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribeNetwork('Networked', (itNetwork) => {\n\t\tdescribe('can attribute', () => {\n\t\t\titNetwork('local IDs before and after being finalized', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from a remote session', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst id = network.getSequencedIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from multiple remote sessions', 1, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t// Ensure multiple clusters are made by each client. Cluster size === 1.\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst log = network.getSequencedIdLog(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[0].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[1].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[2].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t\texpect(compressor.attributeId(log[3].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[4].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[5].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('unified IDs', (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tconst allTargets = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tnetwork.allocateAndSendIds(client, 1, { 0: override });\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(client));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst firstTarget = allTargets[0][0];\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(firstTarget));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('eagerly generated final IDs that are not finalized', (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(DestinationClient.All);\n\t\t\t\tconst ids = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = compressor.normalizeToSessionSpace(ids[0], compressor.localSessionId);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\t\t});\n\n\t\titNetwork('upholds the invariant that IDs always decompress to the same UUID', 2, (network) => {\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5, {\n\t\t\t\t2: 'override2',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5, {\n\t\t\t\t3: 'override3',\n\t\t\t});\n\n\t\t\tconst preAckLocals = new Map<Client, [SessionSpaceCompressedId, string][]>();\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst locals: [SessionSpaceCompressedId, string][] = [];\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tlocals.push([idData.id, compressor.decompress(idData.id)]);\n\t\t\t\t}\n\t\t\t\tpreAckLocals.set(client, locals);\n\t\t\t}\n\n\t\t\t// Ack all IDs\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst preAckLocalIds = preAckLocals.get(client) ?? fail();\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tif (idData.originatingClient === client) {\n\t\t\t\t\t\texpect(isFinalId(idData.id)).to.be.false;\n\t\t\t\t\t\tconst currentUuid = compressor.decompress(idData.id);\n\t\t\t\t\t\texpect(currentUuid).to.equal(preAckLocalIds[i % preAckLocalIds.length][1]);\n\t\t\t\t\t\ti++;\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\texpect(idData.originatingClient).to.equal(client);\n\t\t\t\t\texpect(isLocalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\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\texpect(isFinalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a local session to session space IDs', (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tconst sessionSpaceIds = network.getIdLog(Client.Client1);\n\t\t\tconst opSpaceId = compressor.normalizeToOpSpace(sessionSpaceIds[0].id);\n\t\t\tconst sessionSpaceId = compressor.normalizeToSessionSpace(opSpaceId, compressor.localSessionId);\n\t\t\texpect(isFinalId(opSpaceId)).to.be.true;\n\t\t\texpect(isLocalId(sessionSpaceId)).to.be.true;\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a remote session to session space IDs', (network) => {\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client1, 1);\n\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\tconst id = opSpaceIds[0];\n\t\t\tconst getSessionNormalizedId = () => compressor2.normalizeToSessionSpace(id, compressor1.localSessionId);\n\t\t\texpect(getSessionNormalizedId).to.throw('No IDs have ever been finalized by the supplied session.');\n\t\t\tnetwork.deliverOperations(Client.Client2);\n\t\t\texpect(isFinalId(getSessionNormalizedId())).to.be.true;\n\t\t});\n\n\t\titNetwork('unifies duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst compressor3 = network.getCompressor(Client.Client3);\n\t\t\tconst clusterCapacity = compressor1.clusterCapacity;\n\n\t\t\t// Ensure some clusters exist to avoid simple case of empty clusters\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterCapacity);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst range1 = network.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tconst overrides1 = expectDefined(getIds(range1)?.overrides);\n\t\t\tconst id1 = compressor1.normalizeToSessionSpace(overrides1[0][0], compressor1.localSessionId);\n\t\t\tconst opNormalizedLocal1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isLocalId(opNormalizedLocal1)).to.be.true;\n\t\t\texpect(isFinalId(id1)).to.be.false;\n\n\t\t\tnetwork.deliverOperations(DestinationClient.Client1);\n\n\t\t\tconst finalId1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\tconst range2 = network.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tconst overrides2 = expectDefined(getIds(range2)?.overrides);\n\t\t\tconst id2 = compressor2.normalizeToSessionSpace(overrides2[0][0], compressor2.localSessionId);\n\t\t\tconst opNormalizedLocal2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isLocalId(opNormalizedLocal2)).to.be.true;\n\t\t\texpect(isFinalId(id2)).to.be.false;\n\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst finalId2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\texpect(finalId1).to.equal(finalId2);\n\n\t\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(finalId1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.decompress(id1)).to.equal(override);\n\t\t\texpect(compressor1.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor1.recompress(override)).to.equal(id1);\n\n\t\t\texpect(compressor2.normalizeToOpSpace(id2)).to.equal(finalId2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.decompress(id2)).to.equal(override);\n\t\t\texpect(compressor2.decompress(finalId2)).to.equal(override);\n\t\t\texpect(compressor2.tryRecompress(override)).to.equal(id2);\n\n\t\t\texpect(compressor3.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(finalId1);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor3.recompress(override)).to.equal(finalId1);\n\t\t});\n\n\t\titNetwork('maintains alignment after unifying duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2, 1);\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);\n\t\t\tconst log1 = network.getSequencedIdLog(client1);\n\t\t\tconst log2 = network.getSequencedIdLog(client2);\n\t\t\texpect(log1.length).to.equal(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 uuidsOrOverrides = new Set<string>();\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\texpect(isFinalId(id1)).to.be.true;\n\t\t\t\tids.add(id1);\n\t\t\t\texpect(id1).to.equal(id2);\n\t\t\t\tconst uuidOrOverride1 = compressor1.decompress(id1);\n\t\t\t\tuuidsOrOverrides.add(uuidOrOverride1);\n\t\t\t\tif (data1.expectedOverride === undefined) {\n\t\t\t\t\texpect(isStableId(uuidOrOverride1)).to.be.true;\n\t\t\t\t}\n\t\t\t\texpect(uuidOrOverride1).to.equal(compressor2.decompress(id2));\n\t\t\t}\n\t\t\tconst expectedSize = log1.length - numUnifications;\n\t\t\texpect(ids.size).to.equal(expectedSize);\n\t\t\texpect(uuidsOrOverrides.size).to.equal(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 two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\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) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.lessThan(0));\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) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 3 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t1: 'override2',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client2).forEach((id) => expect(id.id).to.be.lessThan(0));\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) => expect(id.id).to.be.greaterThan(0));\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((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.greaterThan(0));\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\texpect(Math.sign(roundtripped)).to.equal(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\texpect(Math.sign(compressor1.normalizeToSessionSpace(opNormalized, idData.sessionId))).to.equal(\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(1000, makeOpGenerator({ includeOverrides: true }));\n\t\t\tperformFuzzActions(generator, network, 1984, undefined, true, (network) => network.assertNetworkState());\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t});\n\n\t\titNetwork('can set the cluster size via constructor', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 2);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + compressor.clusterCapacity\n\t\t\t);\n\t\t});\n\n\t\titNetwork('can set the cluster size via API', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst initialClusterCapacity = compressor.clusterCapacity;\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, initialClusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, initialClusterCapacity);\n\t\t\tnetwork.enqueueCapacityChange(5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + initialClusterCapacity * 2 + compressor.clusterCapacity\n\t\t\t);\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\texpect(isFinalId(id)).to.be.true;\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tconst emptyId = (id + 1) as FinalCompressedId;\n\t\t\texpect(() => network.getCompressor(Client.Client2).decompress(emptyId)).to.throw(\n\t\t\t\t'Compressed ID was not generated by this compressor'\n\t\t\t);\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 = createCompressor(Client.Client1, 5);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId1)).to.be.true;\n\t\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId2)).to.be.true;\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\tconst finalId3 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId3)).to.be.true;\n\t\t\t\tconst finalId4 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId4)).to.be.true;\n\t\t\t\tconst finalId5 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId5)).to.be.true;\n\t\t\t\tconst localId6 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId6)).to.be.true;\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\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId3);\n\t\t\t\texpectAssert(isFinalId(opSpaceId4) && opSpaceId4 === finalId4);\n\t\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId5);\n\t\t\t\texpectAssert(isFinalId(opSpaceId6));\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId3);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(finalId4);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId5);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId6)).to.equal(localId6);\n\t\t\t});\n\n\t\t\tit('does not eagerly allocate final IDs for IDs with overrides', () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t\tconst override1 = compressor.generateCompressedId('override1');\n\t\t\t\texpect(isLocalId(override1)).to.be.true;\n\t\t\t\tconst finalId1 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\t\tgenerateCompressedIds(compressor, 5);\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t\tconst override2 = compressor.generateCompressedId('override2');\n\t\t\t\texpect(isLocalId(override2)).to.be.true;\n\t\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId2)).to.be.true;\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(override1);\n\t\t\t\tconst opSpaceId3 = compressor.normalizeToOpSpace(finalId1);\n\t\t\t\tconst opSpaceId4 = compressor.normalizeToOpSpace(override2);\n\t\t\t\tconst opSpaceId5 = compressor.normalizeToOpSpace(finalId2);\n\n\t\t\t\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId1);\n\t\t\t\texpectAssert(isFinalId(opSpaceId4));\n\t\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId2);\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(override1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(override2);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId2);\n\t\t\t});\n\n\t\t\tit('correctly normalizes eagerly allocated final IDs', () => {\n\t\t\t\tconst compressor = 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\texpect(isLocalId(localId1)).to.be.true;\n\t\t\t\texpect(isLocalId(localId2)).to.be.true;\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\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\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\t\t1: 'override1',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\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(Client.Client1).clusterCapacity;\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\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t\t2: 'override3',\n\t\t\t\t});\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(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity - 2, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override3',\n\t\t\t\t\t1: 'override4',\n\t\t\t\t\t2: 'override5',\n\t\t\t\t});\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\texpect(() =>\n\t\t\t\t\t\tIdCompressor.deserialize(serializedWithoutLocalState, sessionIds.get(Client.Client2))\n\t\t\t\t\t).to.throw('Cannot resume existing session.');\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\tconst [serializedNoSession, serializedWithSession] = expectSerializes(\n\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t);\n\t\t\t\texpect(hasOngoingSession(serializedWithSession)).to.be.true;\n\t\t\t\texpect(hasOngoingSession(serializedNoSession)).to.be.false;\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('can serialize clusters with overrides', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2, {\n\t\t\t\t\t1: 'override',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t2: 'override2',\n\t\t\t\t});\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'packs IDs into a single cluster when a single client generates non-overridden ids',\n\t\t\t\t3,\n\t\t\t\t(network) => {\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 20);\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst [serialized1WithNoSession, serialized1WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized1WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized1WithSession.clusters.length).to.equal(1);\n\t\t\t\t\tconst [serialized3WithNoSession, serialized3WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client3)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized3WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized3WithSession.clusters.length).to.equal(1);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('serializes correctly after unifying duplicate overrides', 3, (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\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.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can resume a session and interact with multiple other clients', 3, (network) => {\n\t\t\t\tconst clusterSize = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.goOfflineThenResume(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 2);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\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(1000, makeOpGenerator({ includeOverrides: true }));\n\t\t\t\tperformFuzzActions(generator, network, Math.PI, undefined, true, (network) => {\n\t\t\t\t\t// Periodically check that everyone in the network has the same serialized state\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst compressors = network.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\texpect(deserializedPrev.equals(deserializedCur, false)).to.be.true;\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\n\t\t\titNetwork('stores override indices relative to their clusters', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, { 0: 'cluster1' });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, { 0: 'cluster2' });\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst serialized = network.getCompressor(Client.Client1).serialize(false);\n\t\t\t\texpect(serialized.clusters.length).to.equal(2);\n\t\t\t\texpect(serialized.clusters[0][2]?.[0][0]).to.equal(0);\n\t\t\t\texpect(serialized.clusters[1][2]?.[0][0]).to.equal(0);\n\t\t\t});\n\t\t});\n\t});\n});\n\ntype NetworkTestFunction = (title: string, test: (network: IdCompressorTestNetwork) => void) => void;\n\ntype NetworkTestFunctionWithCapacity = (\n\ttitle: string,\n\tinitialClusterCapacity: number,\n\ttest: (network: IdCompressorTestNetwork) => void\n) => void;\n\nfunction createNetworkTestFunction(validateAfter: boolean): 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 ? assertNotUndefined(test) : 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(title: string, its: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => 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\nfunction describeNetworkNoValidation(\n\ttitle: string,\n\tits: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void\n) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IdCompressor.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.tests.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 { expect } from 'chai';\nimport { v4, v5 } from 'uuid';\nimport { take } from '@fluid-internal/stochastic-test-utils';\nimport {\n\tIdCompressor,\n\tisFinalId,\n\tisLocalId,\n\thasOngoingSession,\n\tlegacySharedTreeInitialTreeId,\n} from '../id-compressor/IdCompressor';\nimport {\n\tLocalCompressedId,\n\tFinalCompressedId,\n\tSessionSpaceCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n} from '../Identifiers';\nimport { assert, assertNotUndefined, fail } from '../Common';\nimport {\n\tcreateSessionId,\n\tincrementUuid,\n\tnumericUuidFromStableId,\n\tstableIdFromNumericUuid,\n} from '../id-compressor/NumericUuid';\nimport { getIds } from '../id-compressor/IdRange';\nimport type { IdCreationRange, UnackedLocalId } from '../id-compressor';\nimport { assertIsStableId, generateStableId, isStableId } from '../UuidUtilities';\nimport {\n\tcreateCompressor,\n\tperformFuzzActions,\n\tsessionIds,\n\tIdCompressorTestNetwork,\n\tClient,\n\tDestinationClient,\n\tMetaClient,\n\texpectSerializes,\n\troundtrip,\n\tsessionNumericUuids,\n\tmakeOpGenerator,\n\tattributionIds,\n\tgenerateCompressedIds,\n} from './utilities/IdCompressorTestUtilities';\nimport { expectDefined, expectAssert } from './utilities/TestCommon';\n\ndescribe('IdCompressor', () => {\n\tit('detects invalid cluster sizes', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 1);\n\t\texpect(() => (compressor.clusterCapacity = -1)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = 0)).to.throw('Clusters must have a positive capacity');\n\t\texpect(() => (compressor.clusterCapacity = IdCompressor.maxClusterSize + 1)).to.throw(\n\t\t\t'Clusters must not exceed max cluster size'\n\t\t);\n\t});\n\n\tit('reports the proper session ID', () => {\n\t\tconst sessionId = createSessionId();\n\t\tconst compressor = new IdCompressor(sessionId, 0);\n\t\texpect(compressor.localSessionId).to.equal(sessionId);\n\t});\n\n\tit('accepts different numbers of reserved IDs', () => {\n\t\tfor (const reservedIdCount of [0, 1, 5]) {\n\t\t\tconst compressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\t\tif (reservedIdCount > 0) {\n\t\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\t}\n\t\t}\n\t});\n\n\tdescribe('ID Generation', () => {\n\t\tit('can create a compressed ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can create compressed IDs with v5 overrides', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst uuidA = v5('foo', '7834b437-6e8c-4936-a1a3-0130b1178f17');\n\t\t\tconst uuidB = uuidA.slice(0, uuidA.length - 1) + (uuidA.charAt(uuidA.length - 1) === 'a' ? 'b' : 'a');\n\t\t\tconst idA = compressor.generateCompressedId(uuidA);\n\t\t\tconst idB = compressor.generateCompressedId(uuidB);\n\t\t\texpect(compressor.decompress(idA)).to.equal(uuidA);\n\t\t\texpect(compressor.decompress(idB)).to.equal(uuidB);\n\t\t});\n\n\t\tit('can manually create a compressed ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(id).to.equal(compressor.recompress(uuid));\n\t\t});\n\n\t\tit('will not decompress IDs it did not compress', () => {\n\t\t\tconst errorMessage = 'Compressed ID was not generated by this compressor';\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(() => compressor.decompress(-1 as LocalCompressedId)).to.throw(errorMessage);\n\t\t\texpect(() => compressor.decompress(compressor.reservedIdCount as FinalCompressedId)).to.throw(errorMessage);\n\t\t});\n\n\t\tit('will not re-compress uuids it did not originally compress', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.tryRecompress('5fff846a-efd4-42fb-8b78-b32ce2672f99')).to.be.undefined;\n\t\t});\n\n\t\tit('unifies duplicate overrides originating from the same compressor', () => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tconst localId1 = compressor.generateCompressedId(override);\n\t\t\tconst localId2 = compressor.generateCompressedId(override);\n\t\t\texpect(localId1).to.equal(localId2, 'only one local ID should be allocated for the same override');\n\t\t\texpect(compressor.decompress(localId1)).to.equal(override, 'override incorrectly associated with local ID');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort before the reserved session UUID', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted before the reserved UUID\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `0${legacySharedTreeInitialTreeId.slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 1 /* just needs to be > 0 */);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing override', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing override\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 0);\n\n\t\t\t// Client1 compresses a uuid with some override that will sort before the session uuid\n\t\t\tcompressor.generateCompressedId(`a${v4().slice(1)}`);\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing cluster', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing cluster\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession1 = `c${v4().slice(1)}` as SessionId;\n\t\t\tconst newSession2 = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor1 = new IdCompressor(newSession1, 0);\n\t\t\tconst compressor2 = new IdCompressor(newSession2, 0);\n\t\t\tcompressor1.clusterCapacity = 5;\n\t\t\tcompressor2.clusterCapacity = 5;\n\n\t\t\tcompressor2.generateCompressedId(); // one ID, enough to make a cluster\n\t\t\tcompressor1.finalizeCreationRange(compressor2.takeNextCreationRange());\n\n\t\t\tconst localId = compressor1.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor1.decompress(localId));\n\t\t\tconst localId3 = compressor1.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies unfinalized local overrides with final IDs from a remote session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, 3);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 3);\n\n\t\t\tconst override = 'override';\n\t\t\tconst local1 = compressor1.generateCompressedId(override);\n\t\t\tconst local2 = compressor2.generateCompressedId(override);\n\t\t\tconst creationRange = compressor2.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\n\t\t\texpect(compressor1.decompress(local1)).to.equal(override);\n\t\t\tconst final1 = compressor1.normalizeToOpSpace(local1);\n\t\t\tconst final2 = compressor2.normalizeToOpSpace(local2);\n\t\t\texpect(isFinalId(final1)).to.be.true;\n\t\t\texpect(final1).to.equal(final2);\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that have been finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst stableId = assertIsStableId(compressor.decompress(id));\n\t\t\tconst localId2 = compressor.generateCompressedId(stableId);\n\t\t\texpect(localId2).to.equal(id, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\t});\n\n\tdescribe('can enumerate all locally created IDs', () => {\n\t\tconst idCount = 10;\n\t\tit('created without finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tif (i === Math.floor(idCount / 2)) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with expanded finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount * 4; i++) {\n\t\t\t\tif (i !== 0 && i % Math.floor(idCount / 3) === 0) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with overrides', () => {\n\t\t\tconst capacity = 100;\n\t\t\tconst compressor = createCompressor(Client.Client1, capacity);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < capacity; i++) {\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId(i % 3 === 0 ? undefined : `override${i}`));\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\t});\n\n\tit('has default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\texpectDefined(compressor.attributionId);\n\t});\n\n\tit('correctly uses explicit attribution ID', () => {\n\t\tconst attributionId = generateStableId();\n\t\tconst compressor = createCompressor(Client.Client1, 5, attributionId);\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\tconst range1 = compressor.takeNextCreationRange();\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\texpect(range1.attributionId).to.equal(attributionId);\n\t});\n\n\tit('only sends attribution ID until the first ID is allocated', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 5, generateStableId());\n\t\tlet range = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\tcompressor.generateCompressedId();\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('does not send default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\tconst range = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('attributes correctly after unification', () => {\n\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));\n\t\tconst id1 = compressor1.generateCompressedId('override');\n\t\tconst id2 = compressor2.generateCompressedId('override');\n\t\tconst range1 = compressor1.takeNextCreationRange();\n\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\tcompressor1.finalizeCreationRange(range2); // 2 gets sequenced first\n\t\tcompressor2.finalizeCreationRange(range2);\n\t\tcompressor1.finalizeCreationRange(range1);\n\t\tcompressor2.finalizeCreationRange(range1);\n\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(compressor2.normalizeToOpSpace(id2));\n\t\texpect(compressor1.attributeId(id1)).to.equal(attributionIds.get(Client.Client2));\n\t\texpect(compressor1.attributeId(compressor1.recompress(compressor2.decompress(id2)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(compressor2.recompress(compressor1.decompress(id1)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(id2)).to.equal(attributionIds.get(Client.Client2));\n\t});\n\n\tdescribe('can produce a creation range', () => {\n\t\tconst tests: {\n\t\t\ttitle: string;\n\t\t\toverrideIndices: number[];\n\t\t\tidCount: number;\n\t\t}[] = [\n\t\t\t{ title: 'that is empty', overrideIndices: [], idCount: 0 },\n\t\t\t{ title: 'with only sequential IDs', overrideIndices: [], idCount: 3 },\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID before an overriding ID',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID after an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID between sequential IDs',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID between override IDs',\n\t\t\t\toverrideIndices: [0, 2],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t];\n\n\t\ttests.forEach(({ title, overrideIndices, idCount }) => {\n\t\t\tit(title, () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\tvalidateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t});\n\n\t\t\ttests.forEach(({ title: title2, overrideIndices: overrideIndices2, idCount: idCount2 }) => {\n\t\t\t\tit(`${title2} after a range ${title}`, () => {\n\t\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\t\tconst lastTaken = validateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t\t\tvalidateIdCreationRange(compressor, idCount2, new Set(overrideIndices2), lastTaken);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tfunction validateIdCreationRange(\n\t\t\tcompressor: IdCompressor,\n\t\t\tidCount: number,\n\t\t\toverrideIndices: Set<number>,\n\t\t\tlastTakenId = 0 as UnackedLocalId\n\t\t): UnackedLocalId {\n\t\t\tconst overrides: [SessionSpaceCompressedId, string?][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst override = overrideIndices.has(i) ? v4() : undefined;\n\t\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\t\toverrides.push([id, override]);\n\t\t\t}\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tlet newLastTakenId = lastTakenId;\n\t\t\tlet idsActual = getIds(range);\n\t\t\tif (overrides.length === 0) {\n\t\t\t\texpect(idsActual).to.be.undefined;\n\t\t\t} else {\n\t\t\t\tidsActual = expectDefined(idsActual);\n\t\t\t\texpect(overrides[0][0]).to.equal(idsActual.first);\n\t\t\t\texpect(overrides[overrides.length - 1][0]).to.equal(idsActual.last);\n\t\t\t\tfor (const [id, uuid] of Object.entries(overrideIndices)) {\n\t\t\t\t\texpect(overrides[id][1]).to.equal(uuid);\n\t\t\t\t}\n\t\t\t\tnewLastTakenId = idsActual.last;\n\t\t\t}\n\n\t\t\treturn newLastTakenId;\n\t\t}\n\t});\n\n\tdescribe('Finalizing', () => {\n\t\tit('can finalize multiple overrides into the same cluster using different ranges', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override1 = 'override1';\n\t\t\tconst override2 = 'override2';\n\t\t\tconst id1 = compressor.generateCompressedId(override1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\tconst id2 = compressor.generateCompressedId(override2);\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tconst finalId1 = compressor.normalizeToOpSpace(id1);\n\t\t\tconst finalId2 = compressor.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId1)).to.equal(override1);\n\t\t\texpect(compressor.decompress(finalId2)).to.equal(override2);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges twice', () => {\n\t\t\tconst rangeCompressor = createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(rangeCompressor, 3);\n\t\t\tconst batchRange = rangeCompressor.takeNextCreationRange();\n\t\t\trangeCompressor.finalizeCreationRange(batchRange);\n\t\t\texpect(() => rangeCompressor.finalizeCreationRange(batchRange)).to.throw('Ranges finalized out of order.');\n\n\t\t\t// Make a new compressor, as the first one will be left in a bad state\n\t\t\tconst explicitCompressor = createCompressor(Client.Client1);\n\t\t\texplicitCompressor.generateCompressedId();\n\t\t\texplicitCompressor.generateCompressedId('override');\n\t\t\tconst explicitRange = explicitCompressor.takeNextCreationRange();\n\t\t\texplicitCompressor.finalizeCreationRange(explicitRange);\n\t\t\texpect(() => explicitCompressor.finalizeCreationRange(explicitRange)).to.throw(\n\t\t\t\t'Ranges finalized out of order.'\n\t\t\t);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges out of order', () => {\n\t\t\tconst compressor = 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\texpect(() => compressor.finalizeCreationRange(secondRange)).to.throw('Ranges finalized out of order.');\n\t\t});\n\n\t\tit('prevents finalizing unacceptably enormous amounts of ID allocation', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst integerLargerThanHalfMax = Math.round((Number.MAX_SAFE_INTEGER / 3) * 2);\n\t\t\tconst midPoint = -integerLargerThanHalfMax as UnackedLocalId;\n\t\t\tconst largeRange1: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: { first: -1 as UnackedLocalId, last: midPoint },\n\t\t\t};\n\t\t\tcompressor1.finalizeCreationRange(largeRange1);\n\t\t\tconst largeRange2: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: {\n\t\t\t\t\tfirst: (midPoint - 1) as UnackedLocalId,\n\t\t\t\t\tlast: (-Number.MAX_SAFE_INTEGER - 2) as UnackedLocalId,\n\t\t\t\t},\n\t\t\t};\n\t\t\texpect(() => compressor1.finalizeCreationRange(largeRange2)).to.throw(\n\t\t\t\t'The number of allocated final IDs must not exceed the JS maximum safe integer.'\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Compression', () => {\n\t\tit('can re-compress a sequential uuid it generated', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress overrides from a remote client it has finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst override = 'override';\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst uuid = compressor.decompress(id);\n\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tcompressor2.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId1 = compressor2.recompress(uuid);\n\t\t\tconst finalId2 = compressor2.recompress(override);\n\t\t\tif (finalId1 === undefined || finalId2 === undefined) {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t});\n\n\t\tit('will not compress an override it never compressed or finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t// Leading zeroes to exploit calls to getOrNextLower on uuid maps, as it will be before test session uuids\n\t\t\tconst override = 'override';\n\t\t\texpect(compressor.tryRecompress(override)).to.be.undefined;\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 1))).to.be\n\t\t\t\t.undefined;\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tgenerateCompressedIds(compressor, 2);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 4))).to.be\n\t\t\t\t.undefined;\n\t\t});\n\n\t\tit('can re-compress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(finalId)).to.be.true;\n\t\t\tconst stableId = stableIdFromNumericUuid(numericUuidFromStableId(sessionIds.get(Client.Client1)), 1);\n\t\t\texpect(compressor.recompress(stableId)).to.equal(finalId);\n\t\t});\n\t});\n\n\tdescribe('Decompression', () => {\n\t\tit('can decompress a local ID before and after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('can decompress reserved IDs', () => {\n\t\t\t// This is a glass box test in that it increments UUIDs\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\tconst reservedSessionUuid = numericUuidFromStableId(\n\t\t\t\tassertIsStableId(compressor.decompress(compressor.getReservedId(1)))\n\t\t\t);\n\t\t\tfor (let i = 1; i < compressor.reservedIdCount; i++) {\n\t\t\t\tconst reservedId = compressor.getReservedId(i);\n\t\t\t\tconst stable = compressor.decompress(reservedId);\n\t\t\t\texpect(stable).to.equal(stableIdFromNumericUuid(incrementUuid(reservedSessionUuid, i - 1)));\n\t\t\t\tconst finalIdForReserved = compressor.recompress(stable);\n\t\t\t\texpect(isLocalId(finalIdForReserved)).to.be.false;\n\t\t\t\texpect(finalIdForReserved).to.equal(reservedId);\n\t\t\t}\n\t\t\tconst outOfBoundsError = 'Reserved Id index out of bounds';\n\t\t\texpect(() => compressor.getReservedId(-1)).to.throw(outOfBoundsError);\n\t\t\texpect(() => compressor.getReservedId(compressor.reservedIdCount)).to.throw(outOfBoundsError);\n\t\t});\n\n\t\tit('can decompress a final ID', () => {\n\t\t\tconst compressor = 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\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t});\n\n\t\tit('can decompress a final ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(uuid).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an override that is an UUID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst uuid = 'd1302ab1-3c08-4e79-a49a-4c39ac369c16';\n\t\t\tconst id = compressor.generateCompressedId(uuid);\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('properly sorts UUID-like overrides separately from true UUIDs', () => {\n\t\t\t// This is a glass box test that ensures overrides which would sort in between a cluster base UUID and an UUID higher up in the\n\t\t\t// same cluster are not accidentally retrieved during cluster ID lookup.\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `${compressor.localSessionId}6`;\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst decompressedId = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(decompressedId)).to.equal(id);\n\t\t});\n\n\t\tit('can decompress an override that starts with the reserved prefix character', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `\\ue15e${compressor.localSessionId}`;\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(finalId)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId)).to.equal(\n\t\t\t\tstableIdFromNumericUuid(numericUuidFromStableId(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 = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isLocalId(id)).to.be.true;\n\t\t\texpect(id).to.equal(normalized);\n\t\t});\n\n\t\tit('can normalize a local ID to op space after finalizing', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(normalized)).to.be.true;\n\t\t\texpect(id).to.not.equal(normalized);\n\t\t});\n\n\t\tit('can normalize an eagerly generated final ID', () => {\n\t\t\tconst compressor = 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\texpect(isFinalId(eagerFinalId)).to.be.true;\n\t\t\tconst opNormalized = compressor.normalizeToOpSpace(eagerFinalId);\n\t\t\texpect(eagerFinalId).to.equal(opNormalized);\n\t\t\tconst sessionNormalized = compressor.normalizeToSessionSpace(opNormalized, compressor.localSessionId);\n\t\t\texpect(sessionNormalized).to.equal(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 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst normalized = compressor1.normalizeToOpSpace(compressor1.generateCompressedId());\n\t\t\texpect(() => compressor2.normalizeToSessionSpace(normalized, compressor1.localSessionId)).to.throw(\n\t\t\t\t'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 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = 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\texpect(isLocalId(normalizedLocal)).to.be.true;\n\t\t\texpect(isFinalId(normalizedFinal)).to.be.true;\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedFinal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedLocal, compressor1.localSessionId)).to.equal(\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 = createCompressor(Client.Client1, 5);\n\t\t\tconst compressor2 = 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(compressor.normalizeToOpSpace(id), compressor.localSessionId)\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\texpect(normalizedToClient1SessionSpace).to.equal(id);\n\t\t});\n\t});\n\n\tdescribe('Serialization', () => {\n\t\tit('can serialize an empty compressor', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(compressor);\n\t\t\texpect(serializedWithSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t\texpect(serializedNoSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t});\n\n\t\tit('correctly deserializes and resumes a session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(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\tcompressor1.finalizeCreationRange(range2);\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\texpect(\n\t\t\t\tIdCompressor.deserialize(compressor1.serialize(false), createSessionId()).equals(\n\t\t\t\t\tIdCompressor.deserialize(compressor2.serialize(false), createSessionId()),\n\t\t\t\t\tfalse // don't compare local state\n\t\t\t\t)\n\t\t\t).to.be.true;\n\t\t});\n\n\t\tit('can serialize local state with attribution but no IDs', () => {\n\t\t\t// This is a regression test for the scenario in which an ID compressor sends its first range, which\n\t\t\t// includes its attribution ID, but has made no IDs. An incorrect optimization when serializing had\n\t\t\t// omitted local state if no IDs had been allocated, but then also dropped the `sentAttribution` flag\n\t\t\tconst compressor = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\texpect(range.ids).to.be.undefined;\n\t\t\texpect(range.attributionId).to.equal(attributionIds.get(Client.Client1));\n\t\t\texpectSerializes(compressor);\n\t\t});\n\t});\n\n\t// No validation, as these leave the network in a broken state\n\tdescribeNetworkNoValidation('detects UUID collision', (itNetwork) => {\n\t\titNetwork(\n\t\t\t'when a client requests an override that is an UUID reserved for later allocation by a cluster',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\t\tconst id = network.getIdLog(Client.Client2)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor2.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 1);\n\t\t\t\t// TODO:#283: Re-assess test when full unification is implemented\n\t\t\t\texpect(() => network.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid })).to.not.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork(\n\t\t\t'when a new cluster is allocated whose base UUID collides with an existing override',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1); // new cluster\n\t\t\t\texpect(() => network.deliverOperations(Client.Client1)).to.throw(\n\t\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork('detects colliding override UUIDs when expanding a cluster', 1, (network) => {\n\t\t\t// This is a glass box test in that it is testing cluster expansion\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\tconst expansion = 3;\n\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), expansion);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, expansion, { 0: nextUuid });\n\t\t\texpect(() => network.deliverOperations(DestinationClient.All)).to.throw(\n\t\t\t\t`Override '${nextUuid}' collides with another allocated UUID.`\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribeNetwork('Networked', (itNetwork) => {\n\t\tdescribe('can attribute', () => {\n\t\t\titNetwork('local IDs before and after being finalized', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from a remote session', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst id = network.getSequencedIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from multiple remote sessions', 1, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t// Ensure multiple clusters are made by each client. Cluster size === 1.\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst log = network.getSequencedIdLog(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[0].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[1].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[2].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t\texpect(compressor.attributeId(log[3].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[4].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[5].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('unified IDs', (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tconst allTargets = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tnetwork.allocateAndSendIds(client, 1, { 0: override });\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(client));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst firstTarget = allTargets[0][0];\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(firstTarget));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('eagerly generated final IDs that are not finalized', (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(DestinationClient.All);\n\t\t\t\tconst ids = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = compressor.normalizeToSessionSpace(ids[0], compressor.localSessionId);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\t\t});\n\n\t\titNetwork('upholds the invariant that IDs always decompress to the same UUID', 2, (network) => {\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5, {\n\t\t\t\t2: 'override2',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5, {\n\t\t\t\t3: 'override3',\n\t\t\t});\n\n\t\t\tconst preAckLocals = new Map<Client, [SessionSpaceCompressedId, string][]>();\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst locals: [SessionSpaceCompressedId, string][] = [];\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tlocals.push([idData.id, compressor.decompress(idData.id)]);\n\t\t\t\t}\n\t\t\t\tpreAckLocals.set(client, locals);\n\t\t\t}\n\n\t\t\t// Ack all IDs\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst preAckLocalIds = preAckLocals.get(client) ?? fail();\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tif (idData.originatingClient === client) {\n\t\t\t\t\t\texpect(isFinalId(idData.id)).to.be.false;\n\t\t\t\t\t\tconst currentUuid = compressor.decompress(idData.id);\n\t\t\t\t\t\texpect(currentUuid).to.equal(preAckLocalIds[i % preAckLocalIds.length][1]);\n\t\t\t\t\t\ti++;\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\texpect(idData.originatingClient).to.equal(client);\n\t\t\t\t\texpect(isLocalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\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\texpect(isFinalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a local session to session space IDs', (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tconst sessionSpaceIds = network.getIdLog(Client.Client1);\n\t\t\tconst opSpaceId = compressor.normalizeToOpSpace(sessionSpaceIds[0].id);\n\t\t\tconst sessionSpaceId = compressor.normalizeToSessionSpace(opSpaceId, compressor.localSessionId);\n\t\t\texpect(isFinalId(opSpaceId)).to.be.true;\n\t\t\texpect(isLocalId(sessionSpaceId)).to.be.true;\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a remote session to session space IDs', (network) => {\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client1, 1);\n\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\tconst id = opSpaceIds[0];\n\t\t\tconst getSessionNormalizedId = () => compressor2.normalizeToSessionSpace(id, compressor1.localSessionId);\n\t\t\texpect(getSessionNormalizedId).to.throw('No IDs have ever been finalized by the supplied session.');\n\t\t\tnetwork.deliverOperations(Client.Client2);\n\t\t\texpect(isFinalId(getSessionNormalizedId())).to.be.true;\n\t\t});\n\n\t\titNetwork('unifies duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst compressor3 = network.getCompressor(Client.Client3);\n\t\t\tconst clusterCapacity = compressor1.clusterCapacity;\n\n\t\t\t// Ensure some clusters exist to avoid simple case of empty clusters\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterCapacity);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst range1 = network.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tconst overrides1 = expectDefined(getIds(range1)?.overrides);\n\t\t\tconst id1 = compressor1.normalizeToSessionSpace(overrides1[0][0], compressor1.localSessionId);\n\t\t\tconst opNormalizedLocal1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isLocalId(opNormalizedLocal1)).to.be.true;\n\t\t\texpect(isFinalId(id1)).to.be.false;\n\n\t\t\tnetwork.deliverOperations(DestinationClient.Client1);\n\n\t\t\tconst finalId1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\tconst range2 = network.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tconst overrides2 = expectDefined(getIds(range2)?.overrides);\n\t\t\tconst id2 = compressor2.normalizeToSessionSpace(overrides2[0][0], compressor2.localSessionId);\n\t\t\tconst opNormalizedLocal2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isLocalId(opNormalizedLocal2)).to.be.true;\n\t\t\texpect(isFinalId(id2)).to.be.false;\n\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst finalId2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\texpect(finalId1).to.equal(finalId2);\n\n\t\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(finalId1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.decompress(id1)).to.equal(override);\n\t\t\texpect(compressor1.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor1.recompress(override)).to.equal(id1);\n\n\t\t\texpect(compressor2.normalizeToOpSpace(id2)).to.equal(finalId2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.decompress(id2)).to.equal(override);\n\t\t\texpect(compressor2.decompress(finalId2)).to.equal(override);\n\t\t\texpect(compressor2.tryRecompress(override)).to.equal(id2);\n\n\t\t\texpect(compressor3.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(finalId1);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor3.recompress(override)).to.equal(finalId1);\n\t\t});\n\n\t\titNetwork('maintains alignment after unifying duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2, 1);\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);\n\t\t\tconst log1 = network.getSequencedIdLog(client1);\n\t\t\tconst log2 = network.getSequencedIdLog(client2);\n\t\t\texpect(log1.length).to.equal(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 uuidsOrOverrides = new Set<string>();\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\texpect(isFinalId(id1)).to.be.true;\n\t\t\t\tids.add(id1);\n\t\t\t\texpect(id1).to.equal(id2);\n\t\t\t\tconst uuidOrOverride1 = compressor1.decompress(id1);\n\t\t\t\tuuidsOrOverrides.add(uuidOrOverride1);\n\t\t\t\tif (data1.expectedOverride === undefined) {\n\t\t\t\t\texpect(isStableId(uuidOrOverride1)).to.be.true;\n\t\t\t\t}\n\t\t\t\texpect(uuidOrOverride1).to.equal(compressor2.decompress(id2));\n\t\t\t}\n\t\t\tconst expectedSize = log1.length - numUnifications;\n\t\t\texpect(ids.size).to.equal(expectedSize);\n\t\t\texpect(uuidsOrOverrides.size).to.equal(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 two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\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) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.lessThan(0));\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) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 3 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t1: 'override2',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client2).forEach((id) => expect(id.id).to.be.lessThan(0));\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) => expect(id.id).to.be.greaterThan(0));\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((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.greaterThan(0));\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\texpect(Math.sign(roundtripped)).to.equal(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\texpect(Math.sign(compressor1.normalizeToSessionSpace(opNormalized, idData.sessionId))).to.equal(\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(1000, makeOpGenerator({ includeOverrides: true }));\n\t\t\tperformFuzzActions(generator, network, 1984, undefined, true, (network) => network.assertNetworkState());\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t});\n\n\t\titNetwork('can set the cluster size via constructor', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 2);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + compressor.clusterCapacity\n\t\t\t);\n\t\t});\n\n\t\titNetwork('can set the cluster size via API', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst initialClusterCapacity = compressor.clusterCapacity;\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, initialClusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, initialClusterCapacity);\n\t\t\tnetwork.enqueueCapacityChange(5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + initialClusterCapacity * 2 + compressor.clusterCapacity\n\t\t\t);\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\texpect(isFinalId(id)).to.be.true;\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tconst emptyId = (id + 1) as FinalCompressedId;\n\t\t\texpect(() => network.getCompressor(Client.Client2).decompress(emptyId)).to.throw(\n\t\t\t\t'Compressed ID was not generated by this compressor'\n\t\t\t);\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 = createCompressor(Client.Client1, 5);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId1)).to.be.true;\n\t\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId2)).to.be.true;\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\tconst finalId3 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId3)).to.be.true;\n\t\t\t\tconst finalId4 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId4)).to.be.true;\n\t\t\t\tconst finalId5 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId5)).to.be.true;\n\t\t\t\tconst localId6 = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId6)).to.be.true;\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\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId3);\n\t\t\t\texpectAssert(isFinalId(opSpaceId4) && opSpaceId4 === finalId4);\n\t\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId5);\n\t\t\t\texpectAssert(isFinalId(opSpaceId6));\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId3);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(finalId4);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId5);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId6)).to.equal(localId6);\n\t\t\t});\n\n\t\t\tit('does not eagerly allocate final IDs for IDs with overrides', () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t\tconst override1 = compressor.generateCompressedId('override1');\n\t\t\t\texpect(isLocalId(override1)).to.be.true;\n\t\t\t\tconst finalId1 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\t\tgenerateCompressedIds(compressor, 5);\n\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\t\tconst override2 = compressor.generateCompressedId('override2');\n\t\t\t\texpect(isLocalId(override2)).to.be.true;\n\t\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(finalId2)).to.be.true;\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(override1);\n\t\t\t\tconst opSpaceId3 = compressor.normalizeToOpSpace(finalId1);\n\t\t\t\tconst opSpaceId4 = compressor.normalizeToOpSpace(override2);\n\t\t\t\tconst opSpaceId5 = compressor.normalizeToOpSpace(finalId2);\n\n\t\t\t\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId1);\n\t\t\t\texpectAssert(isFinalId(opSpaceId4));\n\t\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId2);\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(override1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(override2);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId2);\n\t\t\t});\n\n\t\t\tit('correctly normalizes eagerly allocated final IDs', () => {\n\t\t\t\tconst compressor = 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\texpect(isLocalId(localId1)).to.be.true;\n\t\t\t\texpect(isLocalId(localId2)).to.be.true;\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\texpectAssert(isFinalId(opSpaceId1));\n\t\t\t\texpectAssert(isFinalId(opSpaceId2));\n\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\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 = createCompressor(Client.Client1, 2);\n\n\t\t\t\t// Before cluster expansion\n\t\t\t\texpect(isLocalId(compressor.generateCompressedId())).to.be.true;\n\t\t\t\tconst rangeA = compressor.takeNextCreationRange();\n\t\t\t\tcompressor.finalizeCreationRange(rangeA);\n\t\t\t\texpect(isFinalId(compressor.generateCompressedId())).to.be.true;\n\n\t\t\t\t// After cluster expansion\n\t\t\t\texpect(isLocalId(compressor.generateCompressedId())).to.be.true;\n\t\t\t\tconst rangeB = compressor.takeNextCreationRange();\n\t\t\t\tconst localId = compressor.generateCompressedId();\n\t\t\t\texpect(isLocalId(localId)).to.be.true;\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\texpect(isFinalId(eagerId)).to.be.true;\n\n\t\t\t\texpect(compressor.recompress(compressor.decompress(localId))).to.equal(localId);\n\t\t\t\texpect(compressor.recompress(compressor.decompress(eagerId))).to.equal(eagerId);\n\n\t\t\t\tcompressor.finalizeCreationRange(rangeC);\n\n\t\t\t\texpect(compressor.recompress(compressor.decompress(localId))).to.equal(localId);\n\t\t\t\texpect(compressor.recompress(compressor.decompress(eagerId))).to.equal(eagerId);\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\t\t1: 'override1',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\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(Client.Client1).clusterCapacity;\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\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t\t2: 'override3',\n\t\t\t\t});\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(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity - 2, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override3',\n\t\t\t\t\t1: 'override4',\n\t\t\t\t\t2: 'override5',\n\t\t\t\t});\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\texpect(() =>\n\t\t\t\t\t\tIdCompressor.deserialize(serializedWithoutLocalState, sessionIds.get(Client.Client2))\n\t\t\t\t\t).to.throw('Cannot resume existing session.');\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\tconst [serializedNoSession, serializedWithSession] = expectSerializes(\n\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t);\n\t\t\t\texpect(hasOngoingSession(serializedWithSession)).to.be.true;\n\t\t\t\texpect(hasOngoingSession(serializedNoSession)).to.be.false;\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('can serialize clusters with overrides', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2, {\n\t\t\t\t\t1: 'override',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t2: 'override2',\n\t\t\t\t});\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'packs IDs into a single cluster when a single client generates non-overridden ids',\n\t\t\t\t3,\n\t\t\t\t(network) => {\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 20);\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst [serialized1WithNoSession, serialized1WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized1WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized1WithSession.clusters.length).to.equal(1);\n\t\t\t\t\tconst [serialized3WithNoSession, serialized3WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client3)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized3WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized3WithSession.clusters.length).to.equal(1);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('serializes correctly after unifying duplicate overrides', 3, (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\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.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can resume a session and interact with multiple other clients', 3, (network) => {\n\t\t\t\tconst clusterSize = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.goOfflineThenResume(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 2);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\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(1000, makeOpGenerator({ includeOverrides: true }));\n\t\t\t\tperformFuzzActions(generator, network, Math.PI, undefined, true, (network) => {\n\t\t\t\t\t// Periodically check that everyone in the network has the same serialized state\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst compressors = network.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\texpect(deserializedPrev.equals(deserializedCur, false)).to.be.true;\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\n\t\t\titNetwork('stores override indices relative to their clusters', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, { 0: 'cluster1' });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, { 0: 'cluster2' });\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst serialized = network.getCompressor(Client.Client1).serialize(false);\n\t\t\t\texpect(serialized.clusters.length).to.equal(2);\n\t\t\t\texpect(serialized.clusters[0][2]?.[0][0]).to.equal(0);\n\t\t\t\texpect(serialized.clusters[1][2]?.[0][0]).to.equal(0);\n\t\t\t});\n\t\t});\n\t});\n});\n\ntype NetworkTestFunction = (title: string, test: (network: IdCompressorTestNetwork) => void) => void;\n\ntype NetworkTestFunctionWithCapacity = (\n\ttitle: string,\n\tinitialClusterCapacity: number,\n\ttest: (network: IdCompressorTestNetwork) => void\n) => void;\n\nfunction createNetworkTestFunction(validateAfter: boolean): 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 ? assertNotUndefined(test) : 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(title: string, its: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => 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\nfunction describeNetworkNoValidation(\n\ttitle: string,\n\tits: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void\n) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n}\n"]}
|