@fluidframework/id-compressor 3.3.0 → 3.5.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 (46) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/idCompressor.d.ts +10 -17
  3. package/dist/idCompressor.d.ts.map +1 -1
  4. package/dist/idCompressor.js +68 -35
  5. package/dist/idCompressor.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/packageVersion.d.ts +1 -1
  10. package/dist/packageVersion.js +1 -1
  11. package/dist/packageVersion.js.map +1 -1
  12. package/dist/test/sharding.fuzz.spec.js.map +1 -1
  13. package/dist/test/sharding.spec.js.map +1 -1
  14. package/dist/test/types/validateIdCompressorPrevious.generated.js.map +1 -1
  15. package/dist/types/idCompressor.d.ts +110 -31
  16. package/dist/types/idCompressor.d.ts.map +1 -1
  17. package/dist/types/idCompressor.js.map +1 -1
  18. package/dist/types/index.d.ts +1 -1
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/dist/types/index.js.map +1 -1
  21. package/lib/idCompressor.d.ts +10 -17
  22. package/lib/idCompressor.d.ts.map +1 -1
  23. package/lib/idCompressor.js +69 -36
  24. package/lib/idCompressor.js.map +1 -1
  25. package/lib/index.d.ts +1 -1
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js.map +1 -1
  28. package/lib/packageVersion.d.ts +1 -1
  29. package/lib/packageVersion.js +1 -1
  30. package/lib/packageVersion.js.map +1 -1
  31. package/lib/test/sharding.fuzz.spec.js.map +1 -1
  32. package/lib/test/sharding.spec.js.map +1 -1
  33. package/lib/test/types/validateIdCompressorPrevious.generated.js.map +1 -1
  34. package/lib/types/idCompressor.d.ts +110 -31
  35. package/lib/types/idCompressor.d.ts.map +1 -1
  36. package/lib/types/idCompressor.js.map +1 -1
  37. package/lib/types/index.d.ts +1 -1
  38. package/lib/types/index.d.ts.map +1 -1
  39. package/lib/types/index.js.map +1 -1
  40. package/package.json +9 -42
  41. package/src/idCompressor.ts +90 -42
  42. package/src/index.ts +10 -7
  43. package/src/packageVersion.ts +1 -1
  44. package/src/test/types/validateIdCompressorPrevious.generated.ts +1 -121
  45. package/src/types/idCompressor.ts +119 -31
  46. package/src/types/index.ts +3 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @fluidframework/id-compressor
2
2
 
3
+ ## 3.5.0
4
+
5
+ Dependency updates only.
6
+
7
+ ## 3.4.0
8
+
9
+ Dependency updates only.
10
+
3
11
  ## 3.3.0
4
12
 
5
13
  ### Minor Changes
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import type { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
5
+ import type { ITelemetryBaseLogger, Listenable } from "@fluidframework/core-interfaces";
6
6
  import type { TelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
7
7
  import type { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/legacy";
8
8
  import { Sessions } from "./sessions.js";
9
- import type { IIdCompressor, IIdCompressorCore, IdCreationRange, OpSpaceCompressedId, SerializedIdCompressorWithNoSession, SerializedIdCompressorWithOngoingSession, SessionId, SessionSpaceCompressedId, StableId, ShardSynchronizationToken } from "./types/index.js";
9
+ import type { IIdCompressor, IIdCompressorCore, IdCreationRange, OpSpaceCompressedId, SerializedIdCompressorWithNoSession, SerializedIdCompressorWithOngoingSession, SessionId, SessionSpaceCompressedId, StableId, ShardSynchronizationToken, SerializedIdCompressorShard, ParentShardSynchronizationToken, IdCompressorEvents } from "./types/index.js";
10
10
  import { SerializationVersion } from "./types/index.js";
11
11
  /**
12
12
  * See {@link IIdCompressor} and {@link IIdCompressorCore}
@@ -19,6 +19,8 @@ export declare class IdCompressor implements IIdCompressor, IIdCompressorCore {
19
19
  * This number also determines what features are available (e.g. sharding support starts at V3).
20
20
  */
21
21
  private readonly writeVersion;
22
+ private readonly eventEmitter;
23
+ readonly events: Listenable<IdCompressorEvents>;
22
24
  /**
23
25
  * Max allowed initial cluster size.
24
26
  */
@@ -68,26 +70,17 @@ export declare class IdCompressor implements IIdCompressor, IIdCompressorCore {
68
70
  * @param ghostSessionId - The session ID to start the ghost session with.
69
71
  */
70
72
  startGhostSession(ghostSessionId: SessionId): void;
71
- /**
72
- * {@inheritdoc IIdCompressorCore.beginGhostSession}
73
- */
74
73
  beginGhostSession(ghostSessionId: SessionId, ghostSessionCallback: () => void): void;
75
- /**
76
- * {@inheritdoc IIdCompressorCore.shard}
77
- */
78
- shard(newShardCount: number): SerializedIdCompressorWithOngoingSession[];
79
- /**
80
- * {@inheritdoc IIdCompressorCore.synchronizeWithShard}
81
- */
74
+ shard(newShardCount: number): SerializedIdCompressorShard[];
82
75
  synchronizeWithShard(syncToken: ShardSynchronizationToken): void;
83
- private synchronizeChild;
76
+ getChildShardSyncToken(childToken: ShardSynchronizationToken): ParentShardSynchronizationToken;
77
+ synchronizeWithParent(token: ParentShardSynchronizationToken): void;
84
78
  /**
85
- * {@inheritdoc IIdCompressorCore.dispose}
79
+ * Adds IDs through the next position in this shard's stride after the given generation count.
86
80
  */
81
+ private backfillToNextStridePosition;
82
+ private synchronizeChild;
87
83
  disposeShard(): ShardSynchronizationToken | undefined;
88
- /**
89
- * {@inheritdoc IIdCompressorCore.getShardSyncToken}
90
- */
91
84
  getShardSyncToken(): ShardSynchronizationToken | undefined;
92
85
  /**
93
86
  * Builds a token describing this shard's current progress.
@@ -1 +1 @@
1
- {"version":3,"file":"idCompressor.d.ts","sourceRoot":"","sources":["../src/idCompressor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idCompressor.d.ts","sourceRoot":"","sources":["../src/idCompressor.ts"],"names":[],"mappings":"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"}
@@ -26,12 +26,25 @@ function rangeFinalizationError(expectedStart, actualStart) {
26
26
  });
27
27
  }
28
28
  const MAX_STRIDE_LENGTH = 1000000;
29
+ /**
30
+ * Validates the generation count in a shard synchronization token.
31
+ *
32
+ * @param localGenCount - The number of positions filled, including backfilled positions.
33
+ * @throws {@link TypeError} if the count is not a nonnegative safe integer.
34
+ */
35
+ function validateShardGenerationCount(localGenCount) {
36
+ if (!Number.isSafeInteger(localGenCount) || localGenCount < 0) {
37
+ throw new TypeError("Invalid shard synchronization token generation count.");
38
+ }
39
+ }
29
40
  /**
30
41
  * See {@link IIdCompressor} and {@link IIdCompressorCore}
31
42
  */
32
43
  class IdCompressor {
33
44
  logger;
34
45
  writeVersion;
46
+ eventEmitter = (0, client_utils_1.createEmitter)();
47
+ events = this.eventEmitter;
35
48
  /**
36
49
  * Max allowed initial cluster size.
37
50
  */
@@ -159,9 +172,6 @@ class IdCompressor {
159
172
  (0, internal_1.assert)(!this.ongoingGhostSession, 0x8fe /* Ghost session already in progress. */);
160
173
  this.ongoingGhostSession = { ghostSessionId };
161
174
  }
162
- /**
163
- * {@inheritdoc IIdCompressorCore.beginGhostSession}
164
- */
165
175
  beginGhostSession(ghostSessionId, ghostSessionCallback) {
166
176
  if (this.shardingState) {
167
177
  throw new Error("Cannot start a ghost session while sharded.");
@@ -174,9 +184,6 @@ class IdCompressor {
174
184
  this.ongoingGhostSession = undefined;
175
185
  }
176
186
  }
177
- /**
178
- * {@inheritdoc IIdCompressorCore.shard}
179
- */
180
187
  shard(newShardCount) {
181
188
  if (!Number.isSafeInteger(newShardCount) || newShardCount <= 0) {
182
189
  throw new Error("Shard count must be a positive safe integer");
@@ -230,13 +237,13 @@ class IdCompressor {
230
237
  activeChildIds: new Set(),
231
238
  shardId: childShardId,
232
239
  };
233
- shards.push(child.serialize(true));
240
+ shards.push({
241
+ serialized: child.serialize(true),
242
+ syncToken: child.makeShardToken(false),
243
+ });
234
244
  }
235
245
  return shards;
236
246
  }
237
- /**
238
- * {@inheritdoc IIdCompressorCore.synchronizeWithShard}
239
- */
240
247
  synchronizeWithShard(syncToken) {
241
248
  const isNowLeaf = this.synchronizeChild(syncToken);
242
249
  // A disposal token additionally reclaims the child's ID space. If reclaiming the last child
@@ -248,6 +255,47 @@ class IdCompressor {
248
255
  }
249
256
  }
250
257
  }
258
+ getChildShardSyncToken(childToken) {
259
+ if (!this.shardingState?.activeChildIds.has(childToken.shardId)) {
260
+ throw new Error("Cannot get a synchronization token for an inactive child shard.");
261
+ }
262
+ const token = {
263
+ type: "parentIdSpaceShardSyncToken",
264
+ shardId: childToken.shardId,
265
+ localGenCount: this.localGenCount,
266
+ };
267
+ return token;
268
+ }
269
+ synchronizeWithParent(token) {
270
+ const state = this.shardingState;
271
+ if (token.type !== "parentIdSpaceShardSyncToken" ||
272
+ state?.shardId === undefined ||
273
+ state.shardId !== token.shardId) {
274
+ throw new Error("Invalid parent synchronization token for this child shard.");
275
+ }
276
+ validateShardGenerationCount(token.localGenCount);
277
+ if (token.localGenCount <= this.localGenCount) {
278
+ // A child can already be ahead through its own allocations. Its local range
279
+ // then includes the parent's IDs through this generation count.
280
+ return;
281
+ }
282
+ this.backfillToNextStridePosition(token.localGenCount, state.currentStride);
283
+ }
284
+ /**
285
+ * Adds IDs through the next position in this shard's stride after the given generation count.
286
+ */
287
+ backfillToNextStridePosition(targetGenCount, stride) {
288
+ if (targetGenCount <= this.localGenCount) {
289
+ return;
290
+ }
291
+ const count = Math.ceil((targetGenCount - this.localGenCount + 1) / stride) * stride;
292
+ const nextGenCount = this.localGenCount + count;
293
+ if (!Number.isSafeInteger(nextGenCount)) {
294
+ throw new TypeError("Shard progress exceeds the supported ID space.");
295
+ }
296
+ this.normalizer.addLocalRange(this.localGenCount + 1, count);
297
+ this.localGenCount = nextGenCount;
298
+ }
251
299
  synchronizeChild(syncToken) {
252
300
  const childDisposed = syncToken.disposed;
253
301
  if (this.writeVersion < index_js_1.SerializationVersion.V3) {
@@ -262,33 +310,20 @@ class IdCompressor {
262
310
  if (!activeChildIds.has(childShardId)) {
263
311
  throw new Error(`Cannot synchronize with child with ID ${childShardId}: not in active children set`);
264
312
  }
265
- // Only disposal removes the child from the active set. A plain synchronization leaves the
266
- // child active so it can continue generating IDs and be synchronized with again later.
313
+ validateShardGenerationCount(syncToken.localGenCount);
314
+ // A last-child disposal realigns on the original stride. Backfill before changing
315
+ // membership so invalid progress cannot accidentally reclaim the child.
316
+ const isLeaf = childDisposed && activeChildIds.size === 1;
317
+ this.backfillToNextStridePosition(syncToken.localGenCount, isLeaf ? originalStride : this.shardingState.currentStride);
318
+ // A plain synchronization leaves the child active so it can keep generating IDs.
267
319
  if (childDisposed) {
268
320
  activeChildIds.delete(childShardId);
269
- }
270
- const isLeaf = activeChildIds.size === 0;
271
- if (isLeaf && childDisposed) {
272
- this.shardingState.currentStride = originalStride;
273
- }
274
- // Read currentStride after the possible stride reset above, so that a leaf-making disposal
275
- // realigns the parent on its original (reclaimed) stride rather than the wider sharded stride.
276
- const { currentStride } = this.shardingState;
277
- const childGenCount = syncToken.localGenCount;
278
- // Realign parent to next position in its sequence if child is ahead
279
- if (childGenCount > this.localGenCount) {
280
- // Find next aligned position in parent's sequence after child's genCount
281
- const distance = childGenCount - this.localGenCount + 1;
282
- const steps = Math.ceil(distance / currentStride);
283
- const count = steps * currentStride;
284
- this.normalizer.addLocalRange(this.localGenCount + 1, count);
285
- this.localGenCount += count;
321
+ if (isLeaf) {
322
+ this.shardingState.currentStride = originalStride;
323
+ }
286
324
  }
287
325
  return isLeaf;
288
326
  }
289
- /**
290
- * {@inheritdoc IIdCompressorCore.dispose}
291
- */
292
327
  disposeShard() {
293
328
  if (this.shardingState === undefined) {
294
329
  return undefined;
@@ -305,9 +340,6 @@ class IdCompressor {
305
340
  makeCompressorUnusable(this);
306
341
  return token;
307
342
  }
308
- /**
309
- * {@inheritdoc IIdCompressorCore.getShardSyncToken}
310
- */
311
343
  getShardSyncToken() {
312
344
  if (this.shardingState === undefined) {
313
345
  return undefined;
@@ -465,6 +497,7 @@ class IdCompressor {
465
497
  this.telemetryLocalIdCount = 0;
466
498
  }
467
499
  (0, internal_1.assert)(!session.isEmpty(), 0x757 /* Empty sessions should not be created. */);
500
+ this.eventEmitter.emit("rangeFinalized", range);
468
501
  }
469
502
  addEmptyCluster(session, capacity) {
470
503
  (0, internal_1.assert)(!this.ongoingGhostSession?.cluster, 0x8a8 /* IdCompressor should not be operated normally when in a ghost session */);