@fluidframework/id-compressor 3.2.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/api-report/id-compressor.legacy.beta.api.md +0 -49
  3. package/dist/idCompressor.d.ts +65 -22
  4. package/dist/idCompressor.d.ts.map +1 -1
  5. package/dist/idCompressor.js +401 -60
  6. package/dist/idCompressor.js.map +1 -1
  7. package/dist/index.d.ts +2 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/legacy.d.ts +1 -12
  12. package/dist/packageVersion.d.ts +1 -1
  13. package/dist/packageVersion.js +1 -1
  14. package/dist/packageVersion.js.map +1 -1
  15. package/dist/test/idCompressor.perf.spec.js.map +1 -1
  16. package/dist/test/idCompressor.spec.js.map +1 -1
  17. package/dist/test/idCompressorTestUtilities.d.ts.map +1 -1
  18. package/dist/test/idCompressorTestUtilities.js +8 -3
  19. package/dist/test/idCompressorTestUtilities.js.map +1 -1
  20. package/dist/test/sharding.fuzz.spec.d.ts +6 -0
  21. package/dist/test/sharding.fuzz.spec.d.ts.map +1 -0
  22. package/dist/test/sharding.fuzz.spec.js.map +1 -0
  23. package/dist/test/sharding.spec.d.ts +6 -0
  24. package/dist/test/sharding.spec.d.ts.map +1 -0
  25. package/dist/test/sharding.spec.js.map +1 -0
  26. package/dist/test/snapshots/summary.spec.js.map +1 -1
  27. package/dist/test/types/validateIdCompressorPrevious.generated.js.map +1 -1
  28. package/dist/types/idCompressor.d.ts +205 -20
  29. package/dist/types/idCompressor.d.ts.map +1 -1
  30. package/dist/types/idCompressor.js +15 -0
  31. package/dist/types/idCompressor.js.map +1 -1
  32. package/dist/types/index.d.ts +2 -1
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/index.js +3 -0
  35. package/dist/types/index.js.map +1 -1
  36. package/dist/types/persisted-types/0.0.1.d.ts +4 -4
  37. package/dist/types/persisted-types/0.0.1.js.map +1 -1
  38. package/dist/utilities.d.ts +1 -1
  39. package/dist/utilities.js +1 -1
  40. package/dist/utilities.js.map +1 -1
  41. package/lib/idCompressor.d.ts +65 -22
  42. package/lib/idCompressor.d.ts.map +1 -1
  43. package/lib/idCompressor.js +402 -61
  44. package/lib/idCompressor.js.map +1 -1
  45. package/lib/index.d.ts +2 -1
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/index.js +1 -0
  48. package/lib/index.js.map +1 -1
  49. package/lib/legacy.d.ts +1 -12
  50. package/lib/packageVersion.d.ts +1 -1
  51. package/lib/packageVersion.js +1 -1
  52. package/lib/packageVersion.js.map +1 -1
  53. package/lib/test/idCompressor.perf.spec.js.map +1 -1
  54. package/lib/test/idCompressor.spec.js.map +1 -1
  55. package/lib/test/idCompressorTestUtilities.d.ts.map +1 -1
  56. package/lib/test/idCompressorTestUtilities.js +8 -3
  57. package/lib/test/idCompressorTestUtilities.js.map +1 -1
  58. package/lib/test/sharding.fuzz.spec.d.ts +6 -0
  59. package/lib/test/sharding.fuzz.spec.d.ts.map +1 -0
  60. package/lib/test/sharding.fuzz.spec.js.map +1 -0
  61. package/lib/test/sharding.spec.d.ts +6 -0
  62. package/lib/test/sharding.spec.d.ts.map +1 -0
  63. package/lib/test/sharding.spec.js.map +1 -0
  64. package/lib/test/snapshots/summary.spec.js.map +1 -1
  65. package/lib/test/types/validateIdCompressorPrevious.generated.js.map +1 -1
  66. package/lib/types/idCompressor.d.ts +205 -20
  67. package/lib/types/idCompressor.d.ts.map +1 -1
  68. package/lib/types/idCompressor.js +14 -1
  69. package/lib/types/idCompressor.js.map +1 -1
  70. package/lib/types/index.d.ts +2 -1
  71. package/lib/types/index.d.ts.map +1 -1
  72. package/lib/types/index.js +1 -1
  73. package/lib/types/index.js.map +1 -1
  74. package/lib/types/persisted-types/0.0.1.d.ts +4 -4
  75. package/lib/types/persisted-types/0.0.1.js.map +1 -1
  76. package/lib/utilities.d.ts +1 -1
  77. package/lib/utilities.js +1 -1
  78. package/lib/utilities.js.map +1 -1
  79. package/package.json +8 -8
  80. package/src/idCompressor.ts +550 -78
  81. package/src/index.ts +11 -5
  82. package/src/packageVersion.ts +1 -1
  83. package/src/test/idCompressorTestUtilities.ts +16 -3
  84. package/src/test/snapshots/v2/compressor-with-finalized-range-from-one-client +1 -0
  85. package/src/test/snapshots/v2/compressor-with-finalized-range-from-one-client-client2 +1 -0
  86. package/src/test/snapshots/v2/compressors-with-finalized-ranges-from-two-clients +1 -0
  87. package/src/test/snapshots/v2/compressors-with-finalized-ranges-from-two-clients-client2 +1 -0
  88. package/src/test/snapshots/v2/empty-compressor-summary +1 -0
  89. package/src/test/snapshots/v2/expansion-semantics +1 -0
  90. package/src/test/snapshots/v2/expansion-semantics-client2 +1 -0
  91. package/src/test/snapshots/v3/compressor-with-finalized-range-from-one-client +1 -0
  92. package/src/test/snapshots/v3/compressor-with-finalized-range-from-one-client-client2 +1 -0
  93. package/src/test/snapshots/v3/compressors-with-finalized-ranges-from-two-clients +1 -0
  94. package/src/test/snapshots/v3/compressors-with-finalized-ranges-from-two-clients-client2 +1 -0
  95. package/src/test/snapshots/v3/empty-compressor-summary +1 -0
  96. package/src/test/snapshots/v3/expansion-semantics +1 -0
  97. package/src/test/snapshots/v3/expansion-semantics-client2 +1 -0
  98. package/src/test/types/validateIdCompressorPrevious.generated.ts +1 -109
  99. package/src/types/idCompressor.ts +225 -20
  100. package/src/types/index.ts +13 -1
  101. package/src/types/persisted-types/0.0.1.ts +4 -4
  102. package/src/utilities.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharding.spec.js","sourceRoot":"","sources":["../../src/test/sharding.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert, fail } from \"node:assert\";\n\nimport { LoggingError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { createIdCompressor, IdCompressor } from \"../idCompressor.js\";\nimport { isFinalId } from \"../identifiers.js\";\nimport type {\n\tIdCreationRange,\n\tSerializedIdCompressorWithOngoingSession,\n\tSessionSpaceCompressedId,\n} from \"../index.js\";\nimport { SerializationVersion } from \"../types/index.js\";\nimport { createSessionId } from \"../utilities.js\";\n\nimport { isLocalId } from \"./testCommon.js\";\n\ndescribe(\"IdCompressor Sharding\", () => {\n\tdescribe(\"Basic Sharding\", () => {\n\t\tfor (const newShardCount of [\n\t\t\t0,\n\t\t\t-1,\n\t\t\t1.5,\n\t\t\tNumber.NaN,\n\t\t\tNumber.POSITIVE_INFINITY,\n\t\t\tNumber.MAX_SAFE_INTEGER + 1,\n\t\t]) {\n\t\t\tfor (const alreadySharded of [false, true]) {\n\t\t\t\tit(`rejects invalid shard count ${newShardCount} without changing state (alreadySharded: ${alreadySharded})`, () => {\n\t\t\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\t\t\tif (alreadySharded) {\n\t\t\t\t\t\tparent.shard(1);\n\t\t\t\t\t}\n\t\t\t\t\tconst serialized = parent.serialize(true);\n\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => parent.shard(newShardCount),\n\t\t\t\t\t\t/Shard count must be a positive safe integer/,\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(parent.serialize(true), serialized);\n\t\t\t\t\tassert.equal(parent.generateCompressedId(), alreadySharded ? -2 : -1);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tit(\"rejects an excessive stride without changing state\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tparent.shard(1);\n\t\t\tconst serialized = parent.serialize(true);\n\n\t\t\tassert.throws(() => parent.shard(Number.MAX_SAFE_INTEGER), /Sharding limit reached/);\n\t\t\tassert.equal(parent.serialize(true), serialized);\n\t\t\tassert.equal(parent.generateCompressedId(), -2);\n\t\t});\n\n\t\tit(\"can create shards\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate some IDs before sharding\n\t\t\tconst id1 = parent.generateCompressedId();\n\t\t\tconst id2 = parent.generateCompressedId();\n\t\t\tconst id3 = parent.generateCompressedId();\n\n\t\t\tassert(isLocalId(id1));\n\t\t\tassert(isLocalId(id2));\n\t\t\tassert(isLocalId(id3));\n\n\t\t\t// Create 2 shards (parent + 2 children = 3 total)\n\t\t\tconst shards = parent.shard(2);\n\t\t\tassert.equal(shards.length, 2);\n\n\t\t\t// Verify parent can still generate IDs (is in sharding mode)\n\t\t\tconst id4 = parent.generateCompressedId();\n\t\t\tassert(isLocalId(id4));\n\t\t});\n\n\t\tit(\"children recognize parent's pre-shard IDs\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate 3 IDs before sharding (genCounts 1, 2, 3 → IDs -1, -2, -3)\n\t\t\tconst id1 = parent.generateCompressedId();\n\t\t\tconst id2 = parent.generateCompressedId();\n\t\t\tconst id3 = parent.generateCompressedId();\n\n\t\t\tassert.equal(id1, -1);\n\t\t\tassert.equal(id2, -2);\n\t\t\tassert.equal(id3, -3);\n\n\t\t\t// Get UUIDs for these IDs from parent\n\t\t\tconst uuid1 = parent.decompress(id1);\n\t\t\tconst uuid2 = parent.decompress(id2);\n\t\t\tconst uuid3 = parent.decompress(id3);\n\n\t\t\t// Shard into 3 (stride=3, consecutive positioning: parent at 3, child1 at 4, child2 at 5)\n\t\t\tconst [\n\t\t\t\t{ serialized: child1Ser, syncToken: child1Token },\n\t\t\t\t{ serialized: child2Ser, syncToken: child2Token },\n\t\t\t] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\tassert.deepEqual(child1Token, child1.getShardSyncToken());\n\t\t\tassert.deepEqual(child2Token, child2.getShardSyncToken());\n\t\t\tassert.equal(child1Token.disposed, false);\n\t\t\tassert.equal(child2Token.disposed, false);\n\t\t\tassert.notEqual(child1Token.shardId, child2Token.shardId);\n\t\t\tassert.equal(parent.getChildShardSyncToken(child1Token).shardId, child1Token.shardId);\n\t\t\tassert.equal(parent.getChildShardSyncToken(child2Token).shardId, child2Token.shardId);\n\n\t\t\t// Children should be able to decompress parent's pre-shard IDs\n\t\t\t// They share the same session and are forks of the parent\n\t\t\tassert.equal(child1.decompress(id1), uuid1);\n\t\t\tassert.equal(child1.decompress(id2), uuid2);\n\t\t\tassert.equal(child1.decompress(id3), uuid3);\n\n\t\t\tassert.equal(child2.decompress(id1), uuid1);\n\t\t\tassert.equal(child2.decompress(id2), uuid2);\n\t\t\tassert.equal(child2.decompress(id3), uuid3);\n\n\t\t\t// Parent should still be able to decompress\n\t\t\tassert.equal(parent.decompress(id1), uuid1);\n\t\t\tassert.equal(parent.decompress(id2), uuid2);\n\t\t\tassert.equal(parent.decompress(id3), uuid3);\n\t\t});\n\n\t\tit(\"shards do not recognize IDs generated after sharding in other shards\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create 2 shards (stride=3)\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Child1 generates an ID (-4, genCount 4)\n\t\t\t// With consecutive positioning: child1 starts at localGenCount=1, adds stride=3\n\t\t\tconst child1Id = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id, -4);\n\n\t\t\t// Child2 should NOT be able to decompress child1's ID\n\t\t\t// because it was generated after the shard point and child2 hasn't\n\t\t\t// received the information about child1's new ID yet\n\t\t\tassert.throws(() => {\n\t\t\t\tchild2.decompress(child1Id);\n\t\t\t}, \"Child2 should not recognize Child1's post-shard ID\");\n\n\t\t\t// Parent also cannot decompress it yet, as the ID was generated by a shard\n\t\t\t// The parent would need to receive this information through the document\n\t\t\tassert.throws(() => {\n\t\t\t\tparent.decompress(child1Id);\n\t\t\t}, \"Parent should not recognize Child1's post-shard ID until it receives that information\");\n\t\t});\n\n\t\tit(\"sharding with pre-existing IDs follows stride pattern correctly\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate 3 IDs before sharding (genCounts 1,2,3 occupy first cycle)\n\t\t\tassert.equal(parent.generateCompressedId(), -1);\n\t\t\tassert.equal(parent.generateCompressedId(), -2);\n\t\t\tassert.equal(parent.generateCompressedId(), -3);\n\n\t\t\t// Shard into 3 (stride=3)\n\t\t\t// With consecutive positioning after sharding:\n\t\t\t// - Parent: localGenCount=3, next generates at 6, 9, 12, ...\n\t\t\t// - Child1: localGenCount=4, next generates at 7, 10, 13, ...\n\t\t\t// - Child2: localGenCount=5, next generates at 8, 11, 14, ...\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Verify starting state by checking the IDs they generate\n\t\t\t// If localGenCount was inherited correctly, they should generate the right sequence\n\n\t\t\t// Now generate next IDs - each adds stride to current localGenCount\n\t\t\tconst parentNext = parent.generateCompressedId();\n\t\t\tconst child1Next = child1.generateCompressedId();\n\t\t\tconst child2Next = child2.generateCompressedId();\n\n\t\t\tassert.equal(parentNext, -6); // Parent: 3+3=6\n\t\t\tassert.equal(child1Next, -7); // Child1: 4+3=7\n\t\t\tassert.equal(child2Next, -8); // Child2: 5+3=8\n\t\t});\n\n\t\tit(\"sharding with partial cycle follows stride pattern correctly\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate 5 IDs before sharding (completes 1 cycle, half-fills second)\n\t\t\tassert.equal(parent.generateCompressedId(), -1);\n\t\t\tassert.equal(parent.generateCompressedId(), -2);\n\t\t\tassert.equal(parent.generateCompressedId(), -3);\n\t\t\tassert.equal(parent.generateCompressedId(), -4);\n\t\t\tassert.equal(parent.generateCompressedId(), -5);\n\n\t\t\t// Shard into 3 (stride=3)\n\t\t\t// With consecutive positioning after sharding (parent at localGenCount=5):\n\t\t\t// - Parent: localGenCount=5, next generates at 8, 11, 14, ...\n\t\t\t// - Child1: localGenCount=6, next generates at 9, 12, 15, ...\n\t\t\t// - Child2: localGenCount=7, next generates at 10, 13, 16, ...\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Verify state by checking the IDs they generate\n\t\t\t// The stride pattern should handle the partial cycle correctly\n\n\t\t\t// Generate next IDs - each jumps to next in its stride after localGenCount=5\n\t\t\tconst parentNext = parent.generateCompressedId();\n\t\t\tconst child1Next = child1.generateCompressedId();\n\t\t\tconst child2Next = child2.generateCompressedId();\n\n\t\t\tassert.equal(parentNext, -8); // 5+3=8\n\t\t\tassert.equal(child1Next, -9); // 6+3=9\n\t\t\tassert.equal(child2Next, -10); // 7+3=10\n\t\t});\n\n\t\tit(\"generates IDs with stride pattern\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create 2 shards (stride = 3)\n\t\t\tconst [{ serialized: serializedChild1 }, { serialized: serializedChild2 }] =\n\t\t\t\tparent.shard(2);\n\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild1,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild2,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Parent: starts at localGenCount=0, generates at 3, 6, 9, ...\n\t\t\tconst parentId1 = parent.generateCompressedId();\n\t\t\tassert.equal(parentId1, -3);\n\t\t\tconst parentId2 = parent.generateCompressedId();\n\t\t\tassert.equal(parentId2, -6);\n\n\t\t\t// Child1: starts at localGenCount=1, generates at 4, 7, 10, ...\n\t\t\tconst child1Id1 = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id1, -4);\n\t\t\tconst child1Id2 = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id2, -7);\n\n\t\t\t// Child2: starts at localGenCount=2, generates at 5, 8, 11, ...\n\t\t\tconst child2Id1 = child2.generateCompressedId();\n\t\t\tassert.equal(child2Id1, -5);\n\t\t\tconst child2Id2 = child2.generateCompressedId();\n\t\t\tassert.equal(child2Id2, -8);\n\t\t});\n\n\t\tit(\"no eager finals during sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate and finalize some IDs to create a cluster\n\t\t\tparent.generateCompressedId();\n\t\t\tparent.generateCompressedId();\n\t\t\tconst range = parent.takeNextCreationRange();\n\t\t\tparent.finalizeCreationRange(range);\n\n\t\t\t// Now parent has a cluster with capacity, normally would generate eager finals\n\t\t\t// But after sharding, should only generate local IDs\n\t\t\tparent.shard(1);\n\n\t\t\tconst id1 = parent.generateCompressedId();\n\t\t\tconst id2 = parent.generateCompressedId();\n\t\t\tconst id3 = parent.generateCompressedId();\n\n\t\t\t// All should be local IDs despite cluster availability\n\t\t\tassert(isLocalId(id1));\n\t\t\tassert(isLocalId(id2));\n\t\t\tassert(isLocalId(id3));\n\t\t});\n\n\t\tit(\"shards cannot decompress IDs beyond their generation count\", () => {\n\t\t\t// When a shard generates an ID, it \"backfills\" all IDs up to and including that ID.\n\t\t\t// - Parent starts at localGenCount=0, children at 1, 2, etc.\n\t\t\t// - Each shard adds stride when generating\n\t\t\t// - Backfilling applies to a full \"stride\" worth of IDs.\n\t\t\t// Shards can only decompress IDs within genCounts they have backfilled.\n\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create 2 child shards (stride = 3 total)\n\t\t\t// Parent: starts at localGenCount=0, generates at 3, 6, 9, ...\n\t\t\t// Child1: starts at localGenCount=1, generates at 4, 7, 10, ...\n\t\t\tconst [{ serialized: serializedChild1 }] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild1,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Parent generates 2 IDs\n\t\t\tconst parentId1 = parent.generateCompressedId(); // localGenCount 0→3, ID=-3, backfills up to 3\n\t\t\tconst parentId2 = parent.generateCompressedId(); // localGenCount 3→6, ID=-6, backfills up to 6\n\t\t\tassert.equal(parentId1, -3);\n\t\t\tassert.equal(parentId2, -6);\n\n\t\t\t// Child1 generates 1 ID\n\t\t\tconst child1Id1 = child1.generateCompressedId(); // localGenCount 1→4, ID=-4, backfills up to 4\n\t\t\tassert.equal(child1Id1, -4);\n\n\t\t\t// Each shard can decompress its own IDs\n\t\t\tassert(parent.decompress(parentId1) !== undefined);\n\t\t\tassert(parent.decompress(parentId2) !== undefined);\n\t\t\tassert(child1.decompress(child1Id1) !== undefined);\n\n\t\t\t// Child1 CAN decompress parent's IDs if they're within child1's backfilled range\n\t\t\t// When child1 generates an ID at genCount 4, it backfills [2,3,4]\n\t\t\t// parentId1 is at genCount 3, so child1 can decompress it\n\t\t\tassert(child1.decompress(parentId1) !== undefined);\n\t\t\t// parentId2 is at genCount 6, beyond child1's backfilled range, so it cannot decompress it\n\t\t\tassert.throws(() => child1.decompress(parentId2));\n\n\t\t\t// Parent generates a 3rd ID to advance beyond child1's backfilled range\n\t\t\tconst parentId3 = parent.generateCompressedId(); // localGenCount 6→9, ID=-9, backfills up to 9\n\t\t\tassert.equal(parentId3, -9);\n\n\t\t\t// Parent can decompress its own new ID\n\t\t\tassert(parent.decompress(parentId3) !== undefined);\n\n\t\t\t// Child1 cannot decompress parent's ID at genCount 9 (child1 only backfilled up to 6)\n\t\t\tassert.throws(() => child1.decompress(parentId3), /Unknown ID/);\n\n\t\t\t// Neither shard can decompress IDs from genCounts they haven't backfilled\n\t\t\tassert.throws(() => parent.decompress(-12 as SessionSpaceCompressedId), /Unknown ID/); // Beyond parent's genCount 9\n\t\t\tassert.throws(() => child1.decompress(-7 as SessionSpaceCompressedId), /Unknown ID/); // Beyond child1's genCount 4\n\t\t});\n\t});\n\n\tdescribe(\"Unsharding\", () => {\n\t\tit(\"can unshard and resume normal operation\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shards\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Generate IDs in child (with consecutive positioning, child starts at 1)\n\t\t\tassert.equal(child.generateCompressedId(), -3); // 1→3\n\t\t\tassert.equal(child.generateCompressedId(), -5); // 3→5\n\n\t\t\t// Dispose child and get its shard ID for unsharding\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined);\n\t\t\t// Child's localGenCount = 5 (generated 3 then 5)\n\t\t\tassert.equal(childDisposalToken.localGenCount, 5);\n\n\t\t\t// Unshard\n\t\t\tparent.synchronizeWithShard(childDisposalToken);\n\n\t\t\t// Child should now be disposed and unusable\n\t\t\tassert.throws(() => {\n\t\t\t\tchild.generateCompressedId();\n\t\t\t}, /disposed/);\n\n\t\t\t// Parent should now exit sharding mode (has no more active children)\n\t\t\t// We can verify this by checking it generates sequential IDs again\n\n\t\t\t// After realignment to 6 and exiting sharding, generates sequential -7\n\t\t\tassert.equal(parent.generateCompressedId(), -7);\n\t\t\tassert.equal(parent.generateCompressedId(), -8);\n\t\t});\n\n\t\tit(\"resumes eager final ID allocation after unsharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate and finalize IDs to create a cluster with capacity\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\tparent.generateCompressedId();\n\t\t\t}\n\t\t\tconst range = parent.takeNextCreationRange();\n\t\t\tparent.finalizeCreationRange(range);\n\n\t\t\t// At this point, cluster has capacity for more IDs (default is 512)\n\t\t\t// Normally would generate eager finals, but after sharding, should use locals\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// During sharding, both generate local IDs despite cluster capacity\n\t\t\tconst id1 = parent.generateCompressedId();\n\t\t\tconst id2 = child.generateCompressedId();\n\t\t\tassert(isLocalId(id1));\n\t\t\tassert(isLocalId(id2));\n\n\t\t\t// Dispose and unshard\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined);\n\t\t\tparent.synchronizeWithShard(childDisposalToken);\n\n\t\t\t// After unsharding, eager finals should resume since cluster has capacity\n\t\t\tconst id3 = parent.generateCompressedId();\n\t\t\tassert(isFinalId(id3), \"Should resume generating eager final IDs after unsharding\");\n\t\t});\n\n\t\tit(\"merges normalizer state correctly\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shards (stride=2)\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Parent at 0, child at 1, stride=2\n\t\t\tassert.equal(parent.generateCompressedId(), -2); // 0→2\n\t\t\tassert.equal(child.generateCompressedId(), -3); // 1→3\n\n\t\t\t// Dispose child and get its shard ID\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined);\n\n\t\t\t// Unshard child\n\t\t\tparent.synchronizeWithShard(childDisposalToken);\n\n\t\t\t// Parent should now know about both IDs\n\t\t\t// This is tested implicitly by decompress working\n\t\t\tconst uuid1 = parent.decompress(-1 as SessionSpaceCompressedId);\n\t\t\tconst uuid2 = parent.decompress(-2 as SessionSpaceCompressedId);\n\n\t\t\tassert(uuid1 !== undefined);\n\t\t\tassert(uuid2 !== undefined);\n\t\t\tassert(uuid1 !== uuid2);\n\t\t});\n\n\t\tit(\"handles empty shards\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shard\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Don't generate any IDs in child\n\n\t\t\t// Dispose empty child\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined);\n\t\t\tassert.equal(childDisposalToken.localGenCount, 1);\n\n\t\t\t// Unshard empty child\n\t\t\tparent.synchronizeWithShard(childDisposalToken);\n\n\t\t\t// After realignment and exiting sharding mode\n\t\t\tconst nextId = parent.generateCompressedId();\n\t\t\tassert.equal(nextId, -3);\n\t\t});\n\n\t\tit(\"handles unsharding in any order\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create 3 shards\n\t\t\tconst [{ serialized: s1 }, { serialized: s2 }, { serialized: s3 }] = parent.shard(3);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: s1,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: s2,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child3 = IdCompressor.deserialize({\n\t\t\t\tserialized: s3,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Generate IDs\n\t\t\tchild1.generateCompressedId();\n\t\t\tchild2.generateCompressedId();\n\t\t\tchild2.generateCompressedId();\n\t\t\tchild3.generateCompressedId();\n\t\t\tchild3.generateCompressedId();\n\t\t\tchild3.generateCompressedId();\n\n\t\t\t// Dispose and unshard in reverse order\n\t\t\tconst child3DisposalToken = child3.disposeShard();\n\t\t\tconst child1DisposalToken = child1.disposeShard();\n\t\t\tconst child2DisposalToken = child2.disposeShard();\n\t\t\tassert(child3DisposalToken !== undefined);\n\t\t\tassert(child1DisposalToken !== undefined);\n\t\t\tassert(child2DisposalToken !== undefined);\n\t\t\tparent.synchronizeWithShard(child3DisposalToken);\n\t\t\tparent.synchronizeWithShard(child1DisposalToken);\n\t\t\tparent.synchronizeWithShard(child2DisposalToken);\n\n\t\t\t// Should have exited sharding mode (verify by generating sequential ID)\n\t\t\t// After all children unsharded, parent should generate sequentially\n\n\t\t\tconst nextId = parent.generateCompressedId();\n\t\t\tassert.equal(nextId, -17);\n\t\t});\n\t});\n\n\tdescribe(\"Recursive Sharding\", () => {\n\t\tit(\"supports recursive sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// First shard: create 2 children (stride=3)\n\t\t\t// Parent at localGenCount=0, children at 1, 2\n\t\t\tconst [{ serialized: child1Ser }] = parent.shard(2);\n\n\t\t\t// Parent generates: 0→3\n\t\t\tconst parentId1 = parent.generateCompressedId();\n\t\t\tassert.equal(parentId1, -3);\n\n\t\t\t// Second shard on parent: create 1 more child (stride becomes 6)\n\t\t\t// Parent at localGenCount=3, new child (child3) at 4\n\t\t\tconst [{ serialized: child3Ser }] = parent.shard(1);\n\n\t\t\t// Child3 generates: 4→10 (adds stride 6)\n\t\t\tconst child3 = IdCompressor.deserialize({\n\t\t\t\tserialized: child3Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child3Id = child3.generateCompressedId();\n\t\t\tassert.equal(child3Id, -12);\n\n\t\t\t// Child1 still has original stride=3, starts at localGenCount=1\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child1Id = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id, -4); // 1→4 (adds stride 3)\n\n\t\t\t// Parent now has stride=6, generates: 3→9\n\t\t\tconst parentId2 = parent.generateCompressedId();\n\t\t\tassert.equal(parentId2, -9);\n\t\t});\n\n\t\tit(\"handles complex multi-level sharding and unsharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst root = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Level 1: Root shards into 2 children (stride=3)\n\t\t\t// Root at 0, child1 at 1, child2 at 2\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = root.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Root generates: 0→3\n\t\t\tconst rootId1 = root.generateCompressedId();\n\t\t\tassert.equal(rootId1, -3);\n\n\t\t\t// Child1 generates: 1→4\n\t\t\tconst child1Id1 = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id1, -4);\n\n\t\t\t// Level 2: Child1 recursively shards into 2 grandchildren (stride becomes 9)\n\t\t\t// Child1 at 4, grandchild1 at 7, grandchild2 at 10\n\t\t\tconst [{ serialized: grandchild1Ser }, { serialized: grandchild2Ser }] = child1.shard(2);\n\t\t\tconst grandchild1 = IdCompressor.deserialize({\n\t\t\t\tserialized: grandchild1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst grandchild2 = IdCompressor.deserialize({\n\t\t\t\tserialized: grandchild2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Grandchild1 generates: 7→16 (adds stride 9, which is grandchild's original stride)\n\t\t\tconst gc1Id = grandchild1.generateCompressedId();\n\t\t\tassert.equal(gc1Id, -16);\n\n\t\t\t// Grandchild2 generates: 10→19 (adds stride 9)\n\t\t\tconst gc2Id = grandchild2.generateCompressedId();\n\t\t\tassert.equal(gc2Id, -19);\n\n\t\t\t// Child2 generates: 2→5 (adds stride 3)\n\t\t\tconst child2Id1 = child2.generateCompressedId();\n\t\t\tassert.equal(child2Id1, -5);\n\n\t\t\t// Begin unsharding: Dispose grandchildren and unshard them back into child1\n\t\t\tconst gc1DisposalToken = grandchild1.disposeShard();\n\t\t\tconst gc2DisposalToken = grandchild2.disposeShard();\n\t\t\tassert(gc1DisposalToken !== undefined);\n\t\t\tassert(gc2DisposalToken !== undefined);\n\t\t\tchild1.synchronizeWithShard(gc1DisposalToken); // bumps child1's gen count to 4 + (9*2) = 22\n\t\t\tchild1.synchronizeWithShard(gc2DisposalToken); // moves child1 back to a leaf shard, restores original stride = 3\n\n\t\t\tconst child1Id2 = child1.generateCompressedId();\n\t\t\tassert.equal(child1Id2, -25); // 22 + 3\n\n\t\t\t// Child2 is still a shard of root with stride-3 pattern (3, 6, 9, ...)\n\t\t\t// Root is still in sharding mode because it has active children (child1 and child2)\n\n\t\t\t// Generate some more IDs to verify behavior\n\t\t\tconst child2Id2 = child2.generateCompressedId();\n\t\t\tassert.equal(child2Id2, -8); // Child2's second ID in stride=3\n\n\t\t\t// Verify: child2 should generate -9 next (stride pattern: 3, 6, 9, ...)\n\t\t\tconst child2Id3 = child2.generateCompressedId();\n\t\t\tassert.equal(child2Id3, -11); // This would be a collision if child1 also generated -9!\n\n\t\t\troot.synchronizeWithShard(child1.disposeShard() ?? fail()); // bumps gen count from 3 to 27, which is first on (3, 6, 9, ... 21, 24, 27) cycle > 25\n\t\t\troot.synchronizeWithShard(child2.disposeShard() ?? fail()); // back to unsharded mode, stride = 1\n\n\t\t\tconst rootId = root.generateCompressedId();\n\t\t\tassert.equal(rootId, -28); // 27 + 1\n\t\t});\n\t});\n\n\tdescribe(\"Error Conditions\", () => {\n\t\tit(\"throws when attempting to start a ghost session while sharded\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shards to enter sharding mode\n\t\t\tparent.shard(1);\n\n\t\t\t// Attempt to start a ghost session should throw\n\t\t\tconst ghostSessionId = createSessionId();\n\t\t\tassert.throws(() => {\n\t\t\t\tparent.beginGhostSession(ghostSessionId, () => {\n\t\t\t\t\t// This callback should never be reached\n\t\t\t\t\tparent.generateCompressedId();\n\t\t\t\t});\n\t\t\t}, /Cannot start a ghost session while sharded/);\n\t\t});\n\n\t\tit(\"throws when attempting to shard during a ghost session\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst compressor = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Start a ghost session\n\t\t\tconst ghostSessionId = createSessionId();\n\n\t\t\t// Attempt to shard during ghost session should throw\n\t\t\tassert.throws(() => {\n\t\t\t\tcompressor.beginGhostSession(ghostSessionId, () => {\n\t\t\t\t\t// Attempt to shard while ghost session is active\n\t\t\t\t\tcompressor.shard(1);\n\t\t\t\t});\n\t\t\t}, /Cannot shard during ghost session/);\n\t\t});\n\n\t\tit(\"throws when disposing a shard twice\", () => {\n\t\t\tconst otherCompressor = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst root = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: child1Ser }] = root.shard(1);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// First dispose should succeed\n\t\t\tconst disposalToken1 = child1.disposeShard();\n\t\t\tassert(disposalToken1 !== undefined, \"Expected disposeShard to return a shard ID\");\n\n\t\t\t// Second dispose should throw\n\t\t\tassert.throws(() => {\n\t\t\t\tchild1.disposeShard();\n\t\t\t}, /disposed/);\n\n\t\t\t// Any operation on disposed compressor should throw\n\t\t\tassert.throws(() => {\n\t\t\t\tchild1.generateCompressedId();\n\t\t\t}, /disposed/);\n\n\t\t\totherCompressor.generateCompressedId();\n\t\t});\n\n\t\tit(\"disables all shard methods without adding enumerable properties or changing other compressors\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst children = root.shard(2).map(({ serialized: serialized }) =>\n\t\t\t\tIdCompressor.deserialize({\n\t\t\t\t\tserialized,\n\t\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst [child, sibling] = children;\n\t\t\tconst enumerableKeys = Object.keys(child);\n\t\t\tconst prototype = Object.getPrototypeOf(child) as object;\n\n\t\t\tchild.disposeShard();\n\n\t\t\t// Disposal must not turn prototype methods into enumerable instance properties.\n\t\t\tassert.deepEqual(Object.keys(child), enumerableKeys);\n\t\t\t// Discover methods dynamically so newly added operations are covered by the disposal contract.\n\t\t\tfor (const key of Reflect.ownKeys(prototype)) {\n\t\t\t\tconst original: unknown = Reflect.get(prototype, key);\n\t\t\t\tif (key === \"constructor\" || typeof original !== \"function\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst disposedMethod: unknown = Reflect.get(child, key);\n\t\t\t\tassert(typeof disposedMethod === \"function\");\n\t\t\t\t// A disposed method must reject the call before inspecting its arguments.\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => Reflect.apply(disposedMethod, child, []),\n\t\t\t\t\t/disposed/,\n\t\t\t\t\t`${String(key)} should throw after disposal`,\n\t\t\t\t);\n\t\t\t\t// Checking method identity catches accidental mutation of the shared prototype.\n\t\t\t\tassert.equal(Reflect.get(root, key), original);\n\t\t\t\tassert.equal(Reflect.get(sibling, key), original);\n\t\t\t}\n\t\t\tassert(isLocalId(root.generateCompressedId()));\n\t\t\tassert(isLocalId(sibling.generateCompressedId()));\n\t\t});\n\t});\n\n\tdescribe(\"Equality\", () => {\n\t\t/**\n\t\t * Creates a shard with active children and an independent copy of its serialized state.\n\t\t */\n\t\tfunction createEqualShards(): readonly [IdCompressor, IdCompressor] {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = root.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\t// An intermediate shard has a shard ID, different current and original strides,\n\t\t\t// and multiple child IDs, so every sharding field can be tested.\n\t\t\tchild.shard(2);\n\t\t\tconst restored = IdCompressor.deserialize({\n\t\t\t\tserialized: child.serialize(true),\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tassert(child.equals(restored, true));\n\t\t\tassert(restored.equals(child, true));\n\t\t\treturn [child, restored];\n\t\t}\n\n\t\tit(\"distinguishes sharded and unsharded compressors only when including local state\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst sharded = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\t\t\tconst unsharded = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\t\t\tassert(sharded.equals(unsharded, true));\n\t\t\t// Sharding changes ownership without advancing this root's generation count.\n\t\t\t// Equality must therefore detect sharding state rather than rely on generated IDs.\n\t\t\tsharded.shard(1);\n\n\t\t\tassert.equal(sharded.equals(unsharded, true), false);\n\t\t\tassert.equal(unsharded.equals(sharded, true), false);\n\t\t\tassert(sharded.equals(unsharded, false));\n\t\t\tassert(unsharded.equals(sharded, false));\n\t\t});\n\n\t\tfor (const field of [\n\t\t\t\"currentStride\",\n\t\t\t\"originalStride\",\n\t\t\t\"shardId\",\n\t\t\t\"activeChildIds\",\n\t\t] as const) {\n\t\t\tit(`compares ${field} when including local state`, () => {\n\t\t\t\tconst [child, restored] = createEqualShards();\n\t\t\t\t// Public sharding operations change several fields together. Mutate one field\n\t\t\t\t// directly so a comparison of another field cannot conceal a missing check.\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation -- Isolate one private field for equality testing.\n\t\t\t\tconst state = restored[\"shardingState\"];\n\t\t\t\tassert(state !== undefined);\n\t\t\t\tswitch (field) {\n\t\t\t\t\tcase \"currentStride\":\n\t\t\t\t\tcase \"originalStride\": {\n\t\t\t\t\t\tstate[field]++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"shardId\": {\n\t\t\t\t\t\tstate.shardId = createSessionId();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"activeChildIds\": {\n\t\t\t\t\t\t// Keep the size unchanged to test membership, not just the size check.\n\t\t\t\t\t\tconst [childId] = state.activeChildIds;\n\t\t\t\t\t\tstate.activeChildIds.delete(childId);\n\t\t\t\t\t\tstate.activeChildIds.add(createSessionId());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tfail(\"Unexpected sharding field\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Equality must be symmetric, and shard-only differences must not affect\n\t\t\t\t// comparisons that exclude local state.\n\t\t\t\tassert.equal(child.equals(restored, true), false);\n\t\t\t\tassert.equal(restored.equals(child, true), false);\n\t\t\t\tassert(child.equals(restored, false));\n\t\t\t\tassert(restored.equals(child, false));\n\t\t\t});\n\t\t}\n\n\t\tit(\"compares the number of active children\", () => {\n\t\t\tconst [child, restored] = createEqualShards();\n\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation -- Isolate the private child set for equality testing.\n\t\t\tconst state = restored[\"shardingState\"];\n\t\t\tassert(state !== undefined);\n\t\t\t// The original set is a strict subset of the modified one. Both comparison\n\t\t\t// directions must reject it, including the direction where every ID is present.\n\t\t\tstate.activeChildIds.add(createSessionId());\n\n\t\t\tassert.equal(child.equals(restored, true), false);\n\t\t\tassert.equal(restored.equals(child, true), false);\n\t\t\tassert(child.equals(restored, false));\n\t\t\tassert(restored.equals(child, false));\n\t\t});\n\n\t\tit(\"ignores the insertion order of active children\", () => {\n\t\t\tconst [child, restored] = createEqualShards();\n\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation -- Isolate the private child set for equality testing.\n\t\t\tconst state = restored[\"shardingState\"];\n\t\t\tassert(state !== undefined);\n\t\t\t// Ownership is unchanged even though Set iteration now visits the IDs in reverse.\n\t\t\tstate.activeChildIds = new Set([...state.activeChildIds].reverse());\n\n\t\t\tassert(child.equals(restored, true));\n\t\t\tassert(restored.equals(child, true));\n\t\t});\n\t});\n\n\tdescribe(\"Serialization\", () => {\n\t\tit(\"serializes and deserializes sharding state\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shards\n\t\t\tparent.shard(2);\n\n\t\t\t// Generate some IDs\n\t\t\tparent.generateCompressedId();\n\t\t\tparent.generateCompressedId();\n\n\t\t\t// Serialize\n\t\t\tconst serialized = parent.serialize(true);\n\n\t\t\t// Deserialize\n\t\t\tconst restored = IdCompressor.deserialize({\n\t\t\t\tserialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tassert(parent.equals(restored, true));\n\t\t\tassert(restored.equals(parent, true));\n\n\t\t\t// Verify sharding state preserved by checking ID generation continues correctly\n\n\t\t\t// Verify can continue generating with correct stride\n\t\t\tconst nextId = restored.generateCompressedId();\n\t\t\tassert.equal(nextId, -9); // Next in sequence {3,6,9,...} // Next in sequence {1,4,7,...}\n\t\t});\n\n\t\tit(\"handles version 2 documents without sharding state\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\t// Create a version 2 document (no sharding support)\n\t\t\tconst compressor = new IdCompressor(sessionId, undefined, SerializationVersion.V2);\n\n\t\t\t// Generate some IDs\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.generateCompressedId();\n\n\t\t\t// Serialize as version 2 (no sharding state)\n\t\t\tconst serialized = compressor.serialize(true);\n\n\t\t\t// Deserialize - should work fine even though deserialization code supports V3\n\t\t\tconst restored = IdCompressor.deserialize({\n\t\t\t\tserialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V2,\n\t\t\t});\n\n\t\t\t// Calling disposeShard() on V2 document should throw\n\t\t\tassert.equal(restored.disposeShard(), undefined);\n\n\t\t\t// Should work normally\n\t\t\tconst id = restored.generateCompressedId();\n\t\t\tassert.equal(id, -3);\n\t\t});\n\n\t\tit(\"serializes and deserializes recursive sharding state\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst root = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Root shards into 2 children\n\t\t\tconst [{ serialized: child1Ser }] = root.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Child1 recursively shards into 2 grandchildren\n\t\t\tconst [{ serialized: grandchild1Ser }] = child1.shard(2);\n\t\t\tconst grandchild1 = IdCompressor.deserialize({\n\t\t\t\tserialized: grandchild1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Generate IDs at each level\n\t\t\tassert.equal(root.generateCompressedId(), -3); // Root: 0→3\n\t\t\tassert.equal(child1.generateCompressedId(), -10); // Child1: 1→10 (stride 9)\n\t\t\tassert.equal(grandchild1.generateCompressedId(), -13); // Grandchild1: 4→13 (stride 9)\n\n\t\t\t// Serialize each compressor\n\t\t\tconst rootSerialized = root.serialize(true);\n\t\t\tconst child1Serialized = child1.serialize(true);\n\t\t\tconst grandchild1Serialized = grandchild1.serialize(true);\n\n\t\t\t// Deserialize and verify sharding state is preserved\n\t\t\tconst rootRestored = IdCompressor.deserialize({\n\t\t\t\tserialized: rootSerialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child1Restored = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Serialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst grandchild1Restored = IdCompressor.deserialize({\n\t\t\t\tserialized: grandchild1Serialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tassert(root.equals(rootRestored, true));\n\t\t\tassert(child1.equals(child1Restored, true));\n\t\t\tassert(grandchild1.equals(grandchild1Restored, true));\n\n\t\t\t// Verify sharding state is preserved after deserialization\n\t\t\t// by checking that they continue generating IDs correctly\n\n\t\t\t// Verify they continue generating IDs correctly after deserialization\n\t\t\tconst rootNext = rootRestored.generateCompressedId();\n\t\t\tconst child1Next = child1Restored.generateCompressedId();\n\t\t\tconst grandchild1Next = grandchild1Restored.generateCompressedId();\n\n\t\t\tassert.equal(rootNext, -6);\n\t\t\tassert.equal(child1Next, -19);\n\t\t\tassert.equal(grandchild1Next, -22);\n\t\t});\n\t});\n\n\tdescribe(\"LocalGenCount Semantics\", () => {\n\t\tit(\"localGenCount is not decremented during sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate 5 IDs\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tparent.generateCompressedId();\n\t\t\t}\n\n\t\t\t// Shard into 3 (parent owns {1,4,7,...}, child1 owns {2,5,8,...}, child2 owns {3,6,9,...})\n\t\t\tparent.shard(2);\n\n\t\t\t// Can still decompress ID -5 - proves all previously generated IDs remain accessible\n\t\t\tassert.doesNotThrow(() => parent.decompress(-5 as SessionSpaceCompressedId));\n\n\t\t\t// takeNextCreationRange should include all 5 generated IDs\n\t\t\tconst range = parent.takeNextCreationRange();\n\t\t\tassert(range.ids !== undefined);\n\t\t\tassert.equal(range.ids.count, 5, \"Range should include all 5 generated IDs\");\n\n\t\t\t// Next ID adds stride: parent at 5, adds stride 3 → 8\n\t\t\tconst nextId = parent.generateCompressedId();\n\t\t\tassert.equal(nextId, -8, \"Should jump to next genCount in stride sequence\");\n\t\t});\n\n\t\tit(\"localGenCount increments by stride in sharded mode\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Shard immediately (stride=2, parent at 0, child at 1)\n\t\t\tconst [{ serialized: childSer }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: childSer,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Parent generates IDs: 0→2, 2→4, 4→6\n\t\t\tconst id1 = parent.generateCompressedId();\n\t\t\tassert.equal(id1, -2);\n\t\t\tconst id2 = parent.generateCompressedId();\n\t\t\tassert.equal(id2, -4);\n\t\t\tconst id3 = parent.generateCompressedId();\n\t\t\tassert.equal(id3, -6);\n\n\t\t\t// Child generates IDs: 1→3, 3→5\n\t\t\tconst childId1 = child.generateCompressedId();\n\t\t\tassert.equal(childId1, -3);\n\t\t\tconst childId2 = child.generateCompressedId();\n\t\t\tassert.equal(childId2, -5);\n\n\t\t\t// Verify localGenCount by disposing child and checking\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined);\n\t\t\tassert.equal(childDisposalToken.localGenCount, 5, \"Child localGenCount should be 4\");\n\t\t});\n\t});\n\n\tdescribe(\"Creation Ranges\", () => {\n\t\tit(\"takeNextCreationRange works correctly during sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Generate some IDs before sharding\n\t\t\tassert.equal(parent.generateCompressedId(), -1);\n\t\t\tassert.equal(parent.generateCompressedId(), -2);\n\t\t\tassert.equal(parent.generateCompressedId(), -3);\n\n\t\t\t// Shard into 3 (stride=3)\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = parent.shard(2);\n\t\t\tconst child1 = IdCompressor.deserialize({\n\t\t\t\tserialized: child1Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\t\t\tconst child2 = IdCompressor.deserialize({\n\t\t\t\tserialized: child2Ser,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Generate more IDs in each shard\n\t\t\tassert.equal(parent.generateCompressedId(), -6); // 3→6\n\t\t\tassert.equal(parent.generateCompressedId(), -9); // 6→9\n\t\t\tassert.equal(child1.generateCompressedId(), -7); // 4→7\n\t\t\tassert.equal(child1.generateCompressedId(), -10); // 7→10\n\t\t\tassert.equal(child2.generateCompressedId(), -8); // 5→8\n\n\t\t\t// Only the root shard may take a creation range; child shards must not finalize the shared session.\n\t\t\tconst parentRange = parent.takeNextCreationRange();\n\t\t\tassert.throws(\n\t\t\t\t() => child1.takeNextCreationRange(),\n\t\t\t\t/non-root shard/,\n\t\t\t\t\"child shard should not be able to take a creation range\",\n\t\t\t);\n\t\t\tassert.throws(\n\t\t\t\t() => child2.takeNextCreationRange(),\n\t\t\t\t/non-root shard/,\n\t\t\t\t\"child shard should not be able to take a creation range\",\n\t\t\t);\n\n\t\t\t// Verify parent range: localGenCount went from 3 to 9\n\t\t\tassert(parentRange.ids !== undefined);\n\t\t\tassert.equal(parentRange.ids.firstGenCount, 1);\n\t\t\tassert.equal(parentRange.ids.count, 9); // Range covers genCounts 1-9\n\n\t\t\t// Verify local ID ranges are correct (all IDs should be in normalizer)\n\t\t\tassert(parentRange.ids.localIdRanges.length > 0);\n\t\t});\n\n\t\tit(\"throws when a child (non-root) shard takes a creation range\", () => {\n\t\t\tconst parent = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: childSer,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\tchild.generateCompressedId();\n\n\t\t\t// A child shard may not take a range - only the root finalizes the shared session's IDs.\n\t\t\tassert.throws(() => child.takeNextCreationRange(), /non-root shard/);\n\t\t\t// takeUnfinalizedCreationRange delegates to takeNextCreationRange, so it throws as well.\n\t\t\tassert.throws(() => child.takeUnfinalizedCreationRange(), /non-root shard/);\n\n\t\t\t// The root is still allowed to take ranges, even while it has active child shards.\n\t\t\tassert.doesNotThrow(() => parent.takeNextCreationRange());\n\t\t});\n\n\t\tit(\"takeNextCreationRange after unsharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Create shards\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = IdCompressor.deserialize({\n\t\t\t\tserialized: serializedChild,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\t\t// Generate IDs (parent at 0, child at 1, stride=2)\n\t\t\tassert.equal(parent.generateCompressedId(), -2); // 0→2\n\t\t\tassert.equal(child.generateCompressedId(), -3); // 1→3\n\t\t\tassert.equal(parent.generateCompressedId(), -4); // 2→4\n\t\t\tassert.equal(child.generateCompressedId(), -5); // 3→5\n\n\t\t\t// Dispose and unshard\n\t\t\tconst childDisposalToken = child.disposeShard();\n\t\t\tassert(childDisposalToken !== undefined, \"child.disposeShard() returned undefined\");\n\t\t\tparent.synchronizeWithShard(childDisposalToken);\n\n\t\t\t// Take range after unsharding\n\t\t\tconst range = parent.takeNextCreationRange();\n\n\t\t\tassert(range.ids !== undefined);\n\t\t\tassert.equal(range.ids.firstGenCount, 1);\n\t\t\tassert.equal(range.ids.count, 6);\n\n\t\t\t// Generate more IDs and take another range (stride back to 1 after unshard)\n\t\t\tassert.equal(parent.generateCompressedId(), -7); // After unshard: 6→7\n\t\t\tassert.equal(parent.generateCompressedId(), -8); // 7→8\n\n\t\t\tconst range2 = parent.takeNextCreationRange();\n\t\t\tassert(range2.ids !== undefined);\n\t\t\tassert.equal(range2.ids.firstGenCount, 7);\n\t\t\tassert.equal(range2.ids.count, 2);\n\t\t});\n\n\t\tit(\"multiple takeNextCreationRange calls during sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Shard (don't need to use the child for this test)\n\t\t\tparent.shard(1);\n\n\t\t\t// Generate and take first range (parent at 0, stride=2)\n\t\t\tassert.equal(parent.generateCompressedId(), -2); // 0→2\n\t\t\tassert.equal(parent.generateCompressedId(), -4); // 2→4\n\t\t\tconst range1 = parent.takeNextCreationRange();\n\n\t\t\tassert(range1.ids !== undefined);\n\t\t\tassert.equal(range1.ids.firstGenCount, 1);\n\t\t\tassert.equal(range1.ids.count, 4);\n\n\t\t\t// Generate and take second range\n\t\t\tassert.equal(parent.generateCompressedId(), -6); // 4→6\n\t\t\tconst range2 = parent.takeNextCreationRange();\n\n\t\t\tassert(range2.ids !== undefined);\n\t\t\tassert.equal(range2.ids.firstGenCount, 5);\n\t\t\tassert.equal(range2.ids.count, 2); // Range covers genCounts 5-6\n\n\t\t\t// Verify ranges are consecutive and non-overlapping\n\t\t\tassert.equal(range1.ids.firstGenCount + range1.ids.count, range2.ids.firstGenCount);\n\t\t});\n\n\t\tit(\"ranges can be finalized correctly during sharding\", () => {\n\t\t\tconst sessionId = createSessionId();\n\t\t\tconst parent = new IdCompressor(sessionId, undefined, SerializationVersion.V3);\n\n\t\t\t// Shard\n\t\t\tparent.shard(1);\n\n\t\t\t// Generate IDs (parent at 0, stride=2)\n\t\t\tassert.equal(parent.generateCompressedId(), -2); // 0→2\n\t\t\tassert.equal(parent.generateCompressedId(), -4); // 2→4\n\n\t\t\t// Take and finalize range\n\t\t\tconst range = parent.takeNextCreationRange();\n\t\t\tassert(range.ids !== undefined);\n\n\t\t\t// Should not throw\n\t\t\tparent.finalizeCreationRange(range);\n\n\t\t\t// After finalization, parent should still be in sharding mode (no eager finals)\n\t\t\tconst nextId = parent.generateCompressedId(); // 4→6\n\t\t\tassert.equal(nextId, -6);\n\t\t\tassert(\n\t\t\t\tisLocalId(nextId),\n\t\t\t\t\"Should still generate local IDs after finalization during sharding\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Shard Synchronization\", () => {\n\t\tconst deserialize = (serialized: SerializedIdCompressorWithOngoingSession): IdCompressor =>\n\t\t\tIdCompressor.deserialize({\n\t\t\t\tserialized,\n\t\t\t\trequestedWriteVersion: SerializationVersion.V3,\n\t\t\t});\n\n\t\tit(\"getShardSyncToken returns undefined when not sharded\", () => {\n\t\t\tconst compressor = new IdCompressor(\n\t\t\t\tcreateSessionId(),\n\t\t\t\tundefined,\n\t\t\t\tSerializationVersion.V3,\n\t\t\t);\n\t\t\tassert.equal(compressor.getShardSyncToken(), undefined);\n\t\t});\n\n\t\tit(\"getShardSyncToken throws on the root of a shard tree\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\troot.shard(1);\n\t\t\t// The root has sharding state but no shardId, so it cannot produce a token.\n\t\t\tassert.throws(() => root.getShardSyncToken());\n\t\t});\n\n\t\tit(\"getShardSyncToken does not dispose the shard\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = root.shard(1);\n\t\t\tconst child = deserialize(childSer);\n\n\t\t\tconst token = child.getShardSyncToken();\n\t\t\tassert(token !== undefined);\n\t\t\t// The child remains fully usable after producing a token.\n\t\t\tassert.equal(child.generateCompressedId(), -3);\n\t\t});\n\n\t\tit(\"getShardSyncToken works on a non-leaf intermediate shard\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = root.shard(1);\n\t\t\tconst child = deserialize(childSer);\n\t\t\t// The child now has an active grandchild, making it a non-leaf shard.\n\t\t\tchild.shard(1);\n\n\t\t\t// Unlike disposeShard(), a sync token can be produced while children are active.\n\t\t\t// This is what allows an intermediate shard to propagate progress upward.\n\t\t\tassert(child.getShardSyncToken() !== undefined);\n\t\t});\n\n\t\tit(\"parent can decompress a child's post-shard IDs after synchronizing\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = root.shard(1); // stride 2; child base genCount 1\n\t\t\tconst child = deserialize(childSer);\n\n\t\t\tconst childId = child.generateCompressedId();\n\t\t\tassert.equal(childId, -3);\n\n\t\t\t// Before synchronizing, the parent does not recognize the child's new ID.\n\t\t\tassert.throws(() => root.decompress(childId));\n\n\t\t\troot.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\n\t\t\t// After synchronizing, the parent decompresses it to the same stable ID\n\t\t\t// (all shards in a tree share one session).\n\t\t\tassert.equal(root.decompress(childId), child.decompress(childId));\n\t\t});\n\n\t\tit(\"supports repeated synchronization with a long-lived child\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = root.shard(1); // stride 2; child base genCount 1\n\t\t\tconst child = deserialize(childSer);\n\n\t\t\t// The root never generates its own IDs, so its decompression coverage only grows\n\t\t\t// via synchronization. Each round the child generates two new IDs.\n\t\t\tconst rounds = [\n\t\t\t\t[-3, -5],\n\t\t\t\t[-7, -9],\n\t\t\t\t[-11, -13],\n\t\t\t] as [first: SessionSpaceCompressedId, second: SessionSpaceCompressedId][];\n\n\t\t\tfor (const [first, second] of rounds) {\n\t\t\t\tassert.equal(child.generateCompressedId(), first);\n\t\t\t\tassert.equal(child.generateCompressedId(), second);\n\n\t\t\t\t// The parent cannot see the child's newest IDs until it (re)synchronizes.\n\t\t\t\tassert.throws(() => root.decompress(first));\n\n\t\t\t\t// The second and later calls would throw \"not in active children set\" if a plain\n\t\t\t\t// synchronization removed the child from the parent's active set.\n\t\t\t\troot.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\n\t\t\t\tassert.equal(root.decompress(first), child.decompress(first));\n\t\t\t\tassert.equal(root.decompress(second), child.decompress(second));\n\t\t\t}\n\n\t\t\t// The child is still active after all those syncs and can now be disposed and unsharded.\n\t\t\tconst token = child.disposeShard() ?? fail();\n\t\t\troot.synchronizeWithShard(token);\n\t\t});\n\n\t\tit(\"propagates synchronization upward through multiple ancestors\", () => {\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: childSer }] = root.shard(1); // root stride 2; child base genCount 1\n\t\t\tconst child = deserialize(childSer);\n\t\t\tconst [{ serialized: grandchildSer }] = child.shard(1); // child stride 4; grandchild base genCount 3\n\t\t\tconst grandchild = deserialize(grandchildSer);\n\n\t\t\tconst gcId1 = grandchild.generateCompressedId();\n\t\t\tconst gcId2 = grandchild.generateCompressedId();\n\t\t\tassert.equal(gcId1, -7);\n\t\t\tassert.equal(gcId2, -11);\n\n\t\t\t// Synchronize grandchild -> child.\n\t\t\tassert.throws(() => child.decompress(gcId1));\n\t\t\tchild.synchronizeWithShard(grandchild.getShardSyncToken() ?? fail());\n\t\t\tassert.equal(child.decompress(gcId1), grandchild.decompress(gcId1));\n\t\t\tassert.equal(child.decompress(gcId2), grandchild.decompress(gcId2));\n\n\t\t\t// Synchronize child -> root. The child is a non-leaf here (grandchild still active).\n\t\t\tassert.throws(() => root.decompress(gcId1));\n\t\t\troot.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\n\t\t\t// The grandchild's IDs are now visible all the way up at the root.\n\t\t\tassert.equal(root.decompress(gcId1), grandchild.decompress(gcId1));\n\t\t\tassert.equal(root.decompress(gcId2), grandchild.decompress(gcId2));\n\t\t});\n\n\t\tit(\"reclaims a disposed shard's ID space when synchronizing with its disposal token\", () => {\n\t\t\t// disposeShard() returns a sync token whose `disposed` flag is set, so it is a valid\n\t\t\t// argument to synchronizeWithShard and additionally reclaims the shard's ID space.\n\t\t\tconst root = new IdCompressor(createSessionId(), undefined, SerializationVersion.V3);\n\t\t\tconst [{ serialized: child1Ser }, { serialized: child2Ser }] = root.shard(2);\n\t\t\tconst child1 = deserialize(child1Ser);\n\t\t\tdeserialize(child2Ser); // keep the root a non-leaf so it stays in sharding mode\n\n\t\t\tconst child1Id = child1.generateCompressedId();\n\t\t\tconst expectedStable = child1.decompress(child1Id); // capture before disposal bricks child1\n\t\t\tconst disposalToken = child1.disposeShard() ?? fail();\n\n\t\t\t// The disposal token flows into synchronizeWithShard, which both syncs and reclaims.\n\t\t\troot.synchronizeWithShard(disposalToken);\n\t\t\tassert.equal(root.decompress(child1Id), expectedStable);\n\t\t});\n\n\t\tit(\"lets a live child learn parent IDs without changing its allocation stride\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\n\t\t\tconst childId = child.generateCompressedId();\n\t\t\tparent.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\t\t\tconst parentId = parent.generateCompressedId();\n\t\t\tassert.throws(() => child.decompress(parentId), {\n\t\t\t\tname: \"Error\",\n\t\t\t\tmessage: /Unknown ID/,\n\t\t\t});\n\n\t\t\tconst parentToken = parent.getChildShardSyncToken(child.getShardSyncToken() ?? fail());\n\t\t\tassert.equal(parentToken.type, \"parentIdSpaceShardSyncToken\");\n\t\t\tassert.equal(\"disposed\" in parentToken, false);\n\t\t\tchild.synchronizeWithParent(parentToken);\n\t\t\tassert.equal(child.decompress(parentId), parent.decompress(parentId));\n\t\t\tassert.equal(child.decompress(childId), parent.decompress(childId));\n\n\t\t\tconst nextChildId = child.generateCompressedId();\n\t\t\tconst nextParentId = parent.generateCompressedId();\n\t\t\tassert.notEqual(nextChildId, nextParentId);\n\t\t\tparent.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\t\t\tassert.equal(parent.decompress(nextChildId), child.decompress(nextChildId));\n\t\t});\n\n\t\tit(\"does not backfill when a child is already ahead of its parent\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tchild.generateCompressedId();\n\t\t\tchild.generateCompressedId();\n\t\t\tconst childToken = child.getShardSyncToken() ?? fail();\n\t\t\tconst before = child.serialize(true);\n\n\t\t\tchild.synchronizeWithParent(parent.getChildShardSyncToken(childToken));\n\t\t\tassert.equal(child.serialize(true), before);\n\n\t\t\tconst parentId = parent.generateCompressedId();\n\t\t\tchild.synchronizeWithParent(parent.getChildShardSyncToken(childToken));\n\t\t\tassert.equal(child.serialize(true), before);\n\t\t\tassert.equal(child.decompress(parentId), parent.decompress(parentId));\n\t\t});\n\n\t\tit(\"realigns to the original stride when reclaiming the last child\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tconst childId = child.generateCompressedId();\n\t\t\tconst expectedStableId = child.decompress(childId);\n\n\t\t\tparent.synchronizeWithShard(child.disposeShard() ?? fail());\n\t\t\tassert.equal(parent.getShardSyncToken(), undefined);\n\t\t\tassert.equal(parent.decompress(childId), expectedStableId);\n\t\t\tassert.equal(parent.generateCompressedId(), -5);\n\t\t});\n\n\t\tit(\"preserves the active child when progress cannot fit in the ID space\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tconst childToken = child.getShardSyncToken() ?? fail();\n\t\t\tconst before = parent.serialize(true);\n\n\t\t\tassert.throws(\n\t\t\t\t() =>\n\t\t\t\t\tparent.synchronizeWithShard({\n\t\t\t\t\t\t...childToken,\n\t\t\t\t\t\tlocalGenCount: Number.MAX_SAFE_INTEGER,\n\t\t\t\t\t\tdisposed: true,\n\t\t\t\t\t}),\n\t\t\t\t{ name: \"TypeError\", message: /supported ID space/ },\n\t\t\t);\n\t\t\tassert.equal(parent.serialize(true), before);\n\t\t\tassert.doesNotThrow(() => parent.getChildShardSyncToken(childToken));\n\t\t});\n\n\t\tit(\"applies local finalized ranges after parent and child generate IDs\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tconst childId = child.generateCompressedId();\n\t\t\tparent.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\t\t\tconst parentId = parent.generateCompressedId();\n\t\t\tconst range = parent.takeNextCreationRange();\n\t\t\tconst finalized: IdCreationRange[] = [];\n\t\t\tconst off = parent.events.on(\"rangeFinalized\", (value) => finalized.push(value));\n\t\t\ttry {\n\t\t\t\tparent.finalizeCreationRange(range);\n\t\t\t\tassert.deepEqual(finalized, [range]);\n\n\t\t\t\tchild.synchronizeWithParent(\n\t\t\t\t\tparent.getChildShardSyncToken(child.getShardSyncToken() ?? fail()),\n\t\t\t\t);\n\t\t\t\tchild.finalizeCreationRange(range);\n\t\t\t\tfor (const id of [parentId, childId]) {\n\t\t\t\t\tassert.equal(child.decompress(id), parent.decompress(id));\n\t\t\t\t\tassert.equal(child.normalizeToOpSpace(id), parent.normalizeToOpSpace(id));\n\t\t\t\t}\n\t\t\t\tconst next = child.generateCompressedId();\n\t\t\t\tparent.synchronizeWithShard(child.getShardSyncToken() ?? fail());\n\t\t\t\tassert.equal(parent.decompress(next), child.decompress(next));\n\t\t\t} finally {\n\t\t\t\toff();\n\t\t\t}\n\t\t});\n\n\t\tit(\"rejects a token for another child or an invalid generation count without changing state\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: firstSerialized }, { serialized: secondSerialized }] =\n\t\t\t\tparent.shard(2);\n\t\t\tconst first = deserialize(firstSerialized);\n\t\t\tconst second = deserialize(secondSerialized);\n\t\t\tconst parentToken = parent.getChildShardSyncToken(first.getShardSyncToken() ?? fail());\n\t\t\tconst before = first.serialize(true);\n\n\t\t\tassert.throws(() => second.synchronizeWithParent(parentToken), {\n\t\t\t\tname: \"Error\",\n\t\t\t\tmessage: /parent synchronization token.*child shard/,\n\t\t\t});\n\t\t\tassert.throws(\n\t\t\t\t() => first.synchronizeWithParent({ ...parentToken, localGenCount: 1.5 }),\n\t\t\t\t{ name: \"TypeError\", message: /shard synchronization token generation count/ },\n\t\t\t);\n\t\t\tassert.equal(first.serialize(true), before);\n\t\t\tassert.equal(second.generateCompressedId(), -5);\n\t\t});\n\n\t\tit(\"rejects invalid generation counts in either sync direction without changing state\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tconst childToken = child.getShardSyncToken() ?? fail();\n\t\t\tconst parentToken = parent.getChildShardSyncToken(childToken);\n\t\t\tconst originalParent = parent.serialize(true);\n\t\t\tconst originalChild = child.serialize(true);\n\t\t\tfor (const invalidCount of [\n\t\t\t\t-1,\n\t\t\t\t0.5,\n\t\t\t\tNumber.NaN,\n\t\t\t\tNumber.POSITIVE_INFINITY,\n\t\t\t\tNumber.MAX_SAFE_INTEGER + 1,\n\t\t\t]) {\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => child.synchronizeWithParent({ ...parentToken, localGenCount: invalidCount }),\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"TypeError\",\n\t\t\t\t\t\tmessage: /Invalid shard synchronization token generation count/,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tfor (const disposed of [false, true]) {\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tparent.synchronizeWithShard({\n\t\t\t\t\t\t\t\t...childToken,\n\t\t\t\t\t\t\t\tlocalGenCount: invalidCount,\n\t\t\t\t\t\t\t\tdisposed,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: \"TypeError\",\n\t\t\t\t\t\t\tmessage: /Invalid shard synchronization token generation count/,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tassert.equal(child.serialize(true), originalChild);\n\t\t\t\tassert.equal(parent.serialize(true), originalParent);\n\t\t\t\tassert.doesNotThrow(() => parent.getChildShardSyncToken(childToken));\n\t\t\t}\n\t\t});\n\n\t\tit(\"reports finalized ranges so a child can apply them in order\", () => {\n\t\t\tconst parent = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst [{ serialized: serializedChild }] = parent.shard(1);\n\t\t\tconst child = deserialize(serializedChild);\n\t\t\tconst remote = createIdCompressor(SerializationVersion.V3);\n\t\t\tconst remoteId = remote.generateCompressedId();\n\t\t\tconst encodedRemoteId = remote.normalizeToOpSpace(remoteId);\n\t\t\tconst range = remote.takeNextCreationRange();\n\t\t\tconst finalized: IdCreationRange[] = [];\n\t\t\tconst off = parent.events.on(\"rangeFinalized\", (value) => finalized.push(value));\n\t\t\ttry {\n\t\t\t\tparent.finalizeCreationRange(range);\n\t\t\t\tassert.deepEqual(finalized, [range]);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => child.normalizeToSessionSpace(encodedRemoteId, remote.localSessionId),\n\t\t\t\t\t{ name: \"Error\", message: /No IDs have ever been finalized/ },\n\t\t\t\t);\n\n\t\t\t\tfor (const update of finalized) {\n\t\t\t\t\tchild.finalizeCreationRange(update);\n\t\t\t\t}\n\t\t\t\tconst normalized = child.normalizeToSessionSpace(\n\t\t\t\t\tencodedRemoteId,\n\t\t\t\t\tremote.localSessionId,\n\t\t\t\t);\n\t\t\t\tassert.equal(child.decompress(normalized), remote.decompress(remoteId));\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => parent.finalizeCreationRange(range),\n\t\t\t\t\t(error: unknown) => {\n\t\t\t\t\t\tassert(error instanceof LoggingError);\n\t\t\t\t\t\tassert.match(error.message, /Ranges finalized out of order/);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(finalized, [range]);\n\t\t\t} finally {\n\t\t\t\toff();\n\t\t\t}\n\t\t});\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summary.spec.js","sourceRoot":"","sources":["../../../src/test/snapshots/summary.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { type SessionId, createIdCompressor, toIdCompressorWithCore } from \"../../index.js\";\nimport { modifyClusterSize } from \"../idCompressorTestUtilities.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\n\nconst regenerateSnapshots = process.argv.includes(\"--snapshot\");\n\nlet currentTestName: string | undefined;\nlet currentTestFile: string | undefined;\n\n// Simple filter to avoid tests with a name that would accidentally be parsed as directory traversal or other confusing things.\nconst nameCheck = new RegExp(/^[^\"/\\\\]+$/);\n\nassert(/(dist|lib)[/\\\\]test[/\\\\]snapshots$/.exec(_dirname));\nconst snapshotsFolder = path.join(_dirname, `../../../src/test/snapshots`);\nassert(existsSync(snapshotsFolder));\n\n/**\n * Delete the existing test file directory and recreate it.\n *\n * If the directory does not already exist, this will create it.\n *\n * @param dirPath - The path within the `snapshots` directory.\n */\nfunction useSnapshotDirectory(dirPath: string = \"files\"): void {\n\tconst normalizedDir = path.join(snapshotsFolder, dirPath);\n\t// Basic sanity check to avoid bugs like accidentally recursively deleting everything under `/` if something went wrong (like dirPath navigated up directories a lot).\n\tassert(normalizedDir.startsWith(snapshotsFolder));\n\n\tif (regenerateSnapshots) {\n\t\tif (existsSync(normalizedDir)) {\n\t\t\tconsole.log(`removing snapshot directory: ${normalizedDir}`);\n\t\t\trmSync(normalizedDir, { recursive: true, force: true });\n\t\t}\n\t\tmkdirSync(normalizedDir, { recursive: true });\n\t}\n\n\tbeforeEach(function (): void {\n\t\tcurrentTestName = this.currentTest?.title.replace(/ /g, \"-\") ?? assert.fail();\n\t\tcurrentTestFile = path.join(normalizedDir, currentTestName);\n\t});\n\n\tafterEach(() => {\n\t\tcurrentTestFile = undefined;\n\t\tcurrentTestName = undefined;\n\t});\n}\n\nfunction takeSnapshot(data: string, suffix: string = \"\"): void {\n\tassert(\n\t\tcurrentTestName !== undefined,\n\t\t\"use `useSnapshotDirectory` to configure the tests containing describe block to take snapshots\",\n\t);\n\tassert(currentTestFile !== undefined);\n\n\t// Ensure test name doesn't accidentally navigate up directories or things like that.\n\t// Done here instead of in beforeEach so errors surface better.\n\tif (nameCheck.test(currentTestName) === false) {\n\t\tassert.fail(`Expected test name to pass sanitization: \"${currentTestName}\"`);\n\t}\n\n\tconst fullFile = currentTestFile + suffix;\n\n\tconst exists = existsSync(fullFile);\n\tif (regenerateSnapshots) {\n\t\tassert(exists === false, \"snapshot should not already exist: possible name collision.\");\n\t\twriteFileSync(fullFile, data);\n\t} else {\n\t\tassert(exists, `test snapshot file does not exist: \"${fullFile}\"`);\n\t\tconst pastData = readFileSync(fullFile, \"utf8\");\n\t\tassert.equal(data, pastData, `snapshot different for \"${currentTestName}\"`);\n\t}\n}\n\ndescribe(\"snapshot tests\", () => {\n\tconst client1 = \"403f1e16-5265-4074-8507-417d99a05ee9\" as SessionId;\n\tconst client2 = \"4b02675a-5a81-428d-b7b7-d8c33a16bfde\" as SessionId;\n\n\tuseSnapshotDirectory();\n\n\tit(\"empty compressor summary\", () => {\n\t\tconst compressor = toIdCompressorWithCore(createIdCompressor(client1));\n\t\tconst summary = compressor.serialize(false);\n\n\t\ttakeSnapshot(summary);\n\t});\n\n\tit(\"compressor with finalized range from one client\", () => {\n\t\tconst compressor = toIdCompressorWithCore(createIdCompressor(client1));\n\t\tconst compressor2 = toIdCompressorWithCore(createIdCompressor(client2));\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tcompressor.generateCompressedId();\n\t\t}\n\t\tconst idRange = compressor.takeNextCreationRange();\n\t\tcompressor.finalizeCreationRange(idRange);\n\t\tconst summary = compressor.serialize(false);\n\t\tconst summary2 = compressor2.serialize(false);\n\n\t\ttakeSnapshot(summary);\n\t\ttakeSnapshot(summary2, \"-client2\");\n\t});\n\n\tit(\"compressors with finalized ranges from two clients\", () => {\n\t\tconst compressor = toIdCompressorWithCore(createIdCompressor(client1));\n\t\tconst compressor2 = toIdCompressorWithCore(createIdCompressor(client2));\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor2.generateCompressedId();\n\t\t}\n\t\tconst idRange = compressor.takeNextCreationRange();\n\t\tconst idRange2 = compressor2.takeNextCreationRange();\n\n\t\tcompressor.finalizeCreationRange(idRange);\n\t\tcompressor2.finalizeCreationRange(idRange);\n\t\tcompressor.finalizeCreationRange(idRange2);\n\t\tcompressor2.finalizeCreationRange(idRange2);\n\n\t\tconst summary = compressor.serialize(false);\n\t\tconst summary2 = compressor2.serialize(false);\n\n\t\ttakeSnapshot(summary);\n\t\ttakeSnapshot(summary2, \"-client2\");\n\t});\n\n\tit(\"expansion semantics\", () => {\n\t\tconst compressor = toIdCompressorWithCore(createIdCompressor(client1));\n\t\tconst compressor2 = toIdCompressorWithCore(createIdCompressor(client2));\n\t\tmodifyClusterSize(compressor, 2);\n\t\tcompressor.generateCompressedId();\n\t\tconst idRange = compressor.takeNextCreationRange();\n\t\tcompressor.finalizeCreationRange(idRange);\n\t\tcompressor2.finalizeCreationRange(idRange);\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tcompressor.generateCompressedId();\n\t\t}\n\n\t\tconst expansionIdRange = compressor.takeNextCreationRange();\n\t\tcompressor.finalizeCreationRange(expansionIdRange);\n\t\tcompressor2.finalizeCreationRange(expansionIdRange);\n\t\tconst summary = compressor.serialize(false);\n\t\tconst summary2 = compressor2.serialize(false);\n\n\t\ttakeSnapshot(summary);\n\t\ttakeSnapshot(summary2, \"-client2\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"summary.spec.js","sourceRoot":"","sources":["../../../src/test/snapshots/summary.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { type SessionId, createIdCompressor } from \"../../index.js\";\nimport { SerializationVersion } from \"../../types/index.js\";\nimport { modifyClusterSize } from \"../idCompressorTestUtilities.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\n\nconst regenerateSnapshots = process.argv.includes(\"--snapshot\");\n\nlet currentTestName: string | undefined;\nlet currentTestFile: string | undefined;\n\n// Simple filter to avoid tests with a name that would accidentally be parsed as directory traversal or other confusing things.\nconst nameCheck = new RegExp(/^[^\"/\\\\]+$/);\n\nassert(/(dist|lib)[/\\\\]test[/\\\\]snapshots$/.exec(_dirname));\nconst snapshotsFolder = path.join(_dirname, `../../../src/test/snapshots`);\nassert(existsSync(snapshotsFolder));\n\n/**\n * Delete the existing test file directory and recreate it.\n *\n * If the directory does not already exist, this will create it.\n *\n * @param dirPath - The path within the `snapshots` directory.\n */\nfunction useSnapshotDirectory(dirPath: string = \"files\"): void {\n\tconst normalizedDir = path.join(snapshotsFolder, dirPath);\n\t// Basic sanity check to avoid bugs like accidentally recursively deleting everything under `/` if something went wrong (like dirPath navigated up directories a lot).\n\tassert(normalizedDir.startsWith(snapshotsFolder));\n\n\tif (regenerateSnapshots) {\n\t\tif (existsSync(normalizedDir)) {\n\t\t\tconsole.log(`removing snapshot directory: ${normalizedDir}`);\n\t\t\trmSync(normalizedDir, { recursive: true, force: true });\n\t\t}\n\t\tmkdirSync(normalizedDir, { recursive: true });\n\t}\n\n\tbeforeEach(function (): void {\n\t\tcurrentTestName = this.currentTest?.title.replace(/ /g, \"-\") ?? assert.fail();\n\t\tcurrentTestFile = path.join(normalizedDir, currentTestName);\n\t});\n\n\tafterEach(() => {\n\t\tcurrentTestFile = undefined;\n\t\tcurrentTestName = undefined;\n\t});\n}\n\nfunction takeSnapshot(data: string, suffix: string = \"\"): void {\n\tassert(\n\t\tcurrentTestName !== undefined,\n\t\t\"use `useSnapshotDirectory` to configure the tests containing describe block to take snapshots\",\n\t);\n\tassert(currentTestFile !== undefined);\n\n\t// Ensure test name doesn't accidentally navigate up directories or things like that.\n\t// Done here instead of in beforeEach so errors surface better.\n\tif (nameCheck.test(currentTestName) === false) {\n\t\tassert.fail(`Expected test name to pass sanitization: \"${currentTestName}\"`);\n\t}\n\n\tconst fullFile = currentTestFile + suffix;\n\n\tconst exists = existsSync(fullFile);\n\tif (regenerateSnapshots) {\n\t\tassert(exists === false, \"snapshot should not already exist: possible name collision.\");\n\t\twriteFileSync(fullFile, data);\n\t} else {\n\t\tassert(exists, `test snapshot file does not exist: \"${fullFile}\"`);\n\t\tconst pastData = readFileSync(fullFile, \"utf8\");\n\t\tassert.equal(data, pastData, `snapshot different for \"${currentTestName}\"`);\n\t}\n}\n\ndescribe(\"snapshot tests\", () => {\n\tconst client1 = \"403f1e16-5265-4074-8507-417d99a05ee9\" as SessionId;\n\tconst client2 = \"4b02675a-5a81-428d-b7b7-d8c33a16bfde\" as SessionId;\n\n\tfor (const version of [SerializationVersion.V2, SerializationVersion.V3]) {\n\t\tdescribe(`version ${version}`, () => {\n\t\t\tuseSnapshotDirectory(`v${version}`);\n\n\t\t\tit(\"empty compressor summary\", () => {\n\t\t\t\tconst compressor = createIdCompressor(client1, version);\n\t\t\t\tconst summary = compressor.serialize(false);\n\n\t\t\t\ttakeSnapshot(summary);\n\t\t\t});\n\n\t\t\tit(\"compressor with finalized range from one client\", () => {\n\t\t\t\tconst compressor = createIdCompressor(client1, version);\n\t\t\t\tconst compressor2 = createIdCompressor(client2, version);\n\t\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t\tcompressor.generateCompressedId();\n\t\t\t\t}\n\t\t\t\tconst idRange = compressor.takeNextCreationRange();\n\t\t\t\tcompressor.finalizeCreationRange(idRange);\n\t\t\t\tconst summary = compressor.serialize(false);\n\t\t\t\tconst summary2 = compressor2.serialize(false);\n\n\t\t\t\ttakeSnapshot(summary);\n\t\t\t\ttakeSnapshot(summary2, \"-client2\");\n\t\t\t});\n\n\t\t\tit(\"compressors with finalized ranges from two clients\", () => {\n\t\t\t\tconst compressor = createIdCompressor(client1, version);\n\t\t\t\tconst compressor2 = createIdCompressor(client2, version);\n\n\t\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t\tcompressor.generateCompressedId();\n\t\t\t\t\tcompressor2.generateCompressedId();\n\t\t\t\t}\n\t\t\t\tconst idRange = compressor.takeNextCreationRange();\n\t\t\t\tconst idRange2 = compressor2.takeNextCreationRange();\n\n\t\t\t\tcompressor.finalizeCreationRange(idRange);\n\t\t\t\tcompressor2.finalizeCreationRange(idRange);\n\t\t\t\tcompressor.finalizeCreationRange(idRange2);\n\t\t\t\tcompressor2.finalizeCreationRange(idRange2);\n\n\t\t\t\tconst summary = compressor.serialize(false);\n\t\t\t\tconst summary2 = compressor2.serialize(false);\n\n\t\t\t\ttakeSnapshot(summary);\n\t\t\t\ttakeSnapshot(summary2, \"-client2\");\n\t\t\t});\n\n\t\t\tit(\"expansion semantics\", () => {\n\t\t\t\tconst compressor = createIdCompressor(client1, version);\n\t\t\t\tconst compressor2 = createIdCompressor(client2, version);\n\t\t\t\tmodifyClusterSize(compressor, 2);\n\t\t\t\tcompressor.generateCompressedId();\n\t\t\t\tconst idRange = compressor.takeNextCreationRange();\n\t\t\t\tcompressor.finalizeCreationRange(idRange);\n\t\t\t\tcompressor2.finalizeCreationRange(idRange);\n\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tcompressor.generateCompressedId();\n\t\t\t\t}\n\n\t\t\t\tconst expansionIdRange = compressor.takeNextCreationRange();\n\t\t\t\tcompressor.finalizeCreationRange(expansionIdRange);\n\t\t\t\tcompressor2.finalizeCreationRange(expansionIdRange);\n\t\t\t\tconst summary = compressor.serialize(false);\n\t\t\t\tconst summary2 = compressor2.serialize(false);\n\n\t\t\t\ttakeSnapshot(summary);\n\t\t\t\ttakeSnapshot(summary2, \"-client2\");\n\t\t\t});\n\t\t});\n\t}\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validateIdCompressorPrevious.generated.js","sourceRoot":"","sources":["../../../src/test/types/validateIdCompressorPrevious.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/*\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n * Generated by \"flub generate typetests\" from @fluid-tools/build-cli.\n *\n * Baseline (previous) version: 3.1.0\n */\n\nimport type { TypeOnly, MinimalType, FullType, requireAssignableTo } from \"@fluidframework/build-tools\";\nimport type * as old from \"@fluidframework/id-compressor-previous/legacy\";\n\nimport type * as current from \"@fluidframework/id-compressor/legacy\";\n\ndeclare type MakeUnusedImportErrorsGoAway<T> = TypeOnly<T> | MinimalType<T> | FullType<T> | typeof old | typeof current | requireAssignableTo<true, true>;\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Function_createIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Function_createIdCompressor = requireAssignableTo<TypeOnly<typeof current.createIdCompressor>, TypeOnly<typeof old.createIdCompressor>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Function_createSessionId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Function_createSessionId = requireAssignableTo<TypeOnly<typeof current.createSessionId>, TypeOnly<typeof old.createSessionId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Function_deserializeIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Function_deserializeIdCompressor = requireAssignableTo<TypeOnly<typeof current.deserializeIdCompressor>, TypeOnly<typeof old.deserializeIdCompressor>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Function_serializeIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Function_serializeIdCompressor = requireAssignableTo<TypeOnly<typeof current.serializeIdCompressor>, TypeOnly<typeof old.serializeIdCompressor>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Interface_IdCreationRange\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_Interface_IdCreationRange = requireAssignableTo<TypeOnly<old.IdCreationRange>, TypeOnly<current.IdCreationRange>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Interface_IdCreationRange\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Interface_IdCreationRange = requireAssignableTo<TypeOnly<current.IdCreationRange>, TypeOnly<old.IdCreationRange>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Interface_IIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Interface_IIdCompressor = requireAssignableTo<TypeOnly<current.IIdCompressor>, TypeOnly<old.IIdCompressor>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_OpSpaceCompressedId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_OpSpaceCompressedId = requireAssignableTo<TypeOnly<old.OpSpaceCompressedId>, TypeOnly<current.OpSpaceCompressedId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_OpSpaceCompressedId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_OpSpaceCompressedId = requireAssignableTo<TypeOnly<current.OpSpaceCompressedId>, TypeOnly<old.OpSpaceCompressedId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressor\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SerializedIdCompressor = requireAssignableTo<TypeOnly<old.SerializedIdCompressor>, TypeOnly<current.SerializedIdCompressor>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SerializedIdCompressor = requireAssignableTo<TypeOnly<current.SerializedIdCompressor>, TypeOnly<old.SerializedIdCompressor>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressorWithNoSession\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SerializedIdCompressorWithNoSession = requireAssignableTo<TypeOnly<old.SerializedIdCompressorWithNoSession>, TypeOnly<current.SerializedIdCompressorWithNoSession>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressorWithNoSession\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SerializedIdCompressorWithNoSession = requireAssignableTo<TypeOnly<current.SerializedIdCompressorWithNoSession>, TypeOnly<old.SerializedIdCompressorWithNoSession>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressorWithOngoingSession\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SerializedIdCompressorWithOngoingSession = requireAssignableTo<TypeOnly<old.SerializedIdCompressorWithOngoingSession>, TypeOnly<current.SerializedIdCompressorWithOngoingSession>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SerializedIdCompressorWithOngoingSession\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SerializedIdCompressorWithOngoingSession = requireAssignableTo<TypeOnly<current.SerializedIdCompressorWithOngoingSession>, TypeOnly<old.SerializedIdCompressorWithOngoingSession>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SessionId = requireAssignableTo<TypeOnly<old.SessionId>, TypeOnly<current.SessionId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SessionId = requireAssignableTo<TypeOnly<current.SessionId>, TypeOnly<old.SessionId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionSpaceCompressedId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SessionSpaceCompressedId = requireAssignableTo<TypeOnly<old.SessionSpaceCompressedId>, TypeOnly<current.SessionSpaceCompressedId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionSpaceCompressedId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SessionSpaceCompressedId = requireAssignableTo<TypeOnly<current.SessionSpaceCompressedId>, TypeOnly<old.SessionSpaceCompressedId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_StableId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_StableId = requireAssignableTo<TypeOnly<old.StableId>, TypeOnly<current.StableId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_StableId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_StableId = requireAssignableTo<TypeOnly<current.StableId>, TypeOnly<old.StableId>>\n"]}
1
+ {"version":3,"file":"validateIdCompressorPrevious.generated.js","sourceRoot":"","sources":["../../../src/test/types/validateIdCompressorPrevious.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/*\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n * Generated by \"flub generate typetests\" from @fluid-tools/build-cli.\n *\n * Baseline (previous) version: 3.3.0\n */\n\nimport type { TypeOnly, MinimalType, FullType, requireAssignableTo } from \"@fluidframework/build-tools\";\nimport type * as old from \"@fluidframework/id-compressor-previous/legacy\";\n\nimport type * as current from \"@fluidframework/id-compressor/legacy\";\n\ndeclare type MakeUnusedImportErrorsGoAway<T> = TypeOnly<T> | MinimalType<T> | FullType<T> | typeof old | typeof current | requireAssignableTo<true, true>;\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"Interface_IIdCompressor\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_Interface_IIdCompressor = requireAssignableTo<TypeOnly<current.IIdCompressor>, TypeOnly<old.IIdCompressor>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_OpSpaceCompressedId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_OpSpaceCompressedId = requireAssignableTo<TypeOnly<old.OpSpaceCompressedId>, TypeOnly<current.OpSpaceCompressedId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_OpSpaceCompressedId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_OpSpaceCompressedId = requireAssignableTo<TypeOnly<current.OpSpaceCompressedId>, TypeOnly<old.OpSpaceCompressedId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SessionId = requireAssignableTo<TypeOnly<old.SessionId>, TypeOnly<current.SessionId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SessionId = requireAssignableTo<TypeOnly<current.SessionId>, TypeOnly<old.SessionId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionSpaceCompressedId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_SessionSpaceCompressedId = requireAssignableTo<TypeOnly<old.SessionSpaceCompressedId>, TypeOnly<current.SessionSpaceCompressedId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_SessionSpaceCompressedId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_SessionSpaceCompressedId = requireAssignableTo<TypeOnly<current.SessionSpaceCompressedId>, TypeOnly<old.SessionSpaceCompressedId>>\n\n/*\n * Validate forward compatibility by using the old type in place of the current type.\n * If this test starts failing, it indicates a change that is not forward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_StableId\": {\"forwardCompat\": false}\n */\ndeclare type old_as_current_for_TypeAlias_StableId = requireAssignableTo<TypeOnly<old.StableId>, TypeOnly<current.StableId>>\n\n/*\n * Validate backward compatibility by using the current type in place of the old type.\n * If this test starts failing, it indicates a change that is not backward compatible.\n * To acknowledge the breaking change, add the following to package.json under\n * typeValidation.broken:\n * \"TypeAlias_StableId\": {\"backCompat\": false}\n */\ndeclare type current_as_old_for_TypeAlias_StableId = requireAssignableTo<TypeOnly<current.StableId>, TypeOnly<old.StableId>>\n"]}