@fluidframework/id-compressor 2.91.0 → 2.92.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.
- package/CHANGELOG.md +13 -0
- package/api-report/id-compressor.legacy.beta.api.md +8 -1
- package/dist/idCompressor.d.ts +67 -0
- package/dist/idCompressor.d.ts.map +1 -1
- package/dist/idCompressor.js +43 -28
- package/dist/idCompressor.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +3 -2
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/test/idCompressor.spec.js.map +1 -1
- package/dist/types/idCompressor.d.ts +28 -0
- package/dist/types/idCompressor.d.ts.map +1 -1
- package/dist/types/idCompressor.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/idCompressor.d.ts +67 -0
- package/lib/idCompressor.d.ts.map +1 -1
- package/lib/idCompressor.js +40 -27
- package/lib/idCompressor.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +3 -2
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/test/idCompressor.spec.js.map +1 -1
- package/lib/types/idCompressor.d.ts +28 -0
- package/lib/types/idCompressor.d.ts.map +1 -1
- package/lib/types/idCompressor.js.map +1 -1
- package/package.json +12 -12
- package/src/idCompressor.ts +114 -29
- package/src/index.ts +6 -1
- package/src/packageVersion.ts +1 -1
- package/src/types/idCompressor.ts +29 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @fluidframework/id-compressor
|
|
2
2
|
|
|
3
|
+
## 2.92.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Deprecate IIdCompressorCore interface ([#26865](https://github.com/microsoft/FluidFramework/pull/26865)) [2e890f6416](https://github.com/microsoft/FluidFramework/commit/2e890f64160736b4e5efda0791f91bea96c5a011)
|
|
8
|
+
|
|
9
|
+
The `IIdCompressorCore` interface is deprecated and will be removed from the public API surface in 2.100.0. This also affects the return types of `createIdCompressor` and `deserializeIdCompressor`, which currently return `IIdCompressor & IIdCompressorCore` but will be narrowed to `IIdCompressor`.
|
|
10
|
+
|
|
11
|
+
#### Migration
|
|
12
|
+
- **`serialize()`**: Use the new `serializeIdCompressor(compressor, withSession)` free function instead of calling `compressor.serialize(withSession)` directly.
|
|
13
|
+
- **`takeNextCreationRange()`, `takeUnfinalizedCreationRange()`, `finalizeCreationRange()`, `beginGhostSession()`**: These are internal runtime operations that should not be called by external consumers. If you depend on these APIs, please file an issue on the FluidFramework repository describing your use case.
|
|
14
|
+
- **Return types of `createIdCompressor` / `deserializeIdCompressor`**: Stop relying on the `IIdCompressorCore` portion of the intersection type. Type your variables as `IIdCompressor` instead of `IIdCompressor & IIdCompressorCore`.
|
|
15
|
+
|
|
3
16
|
## 2.91.0
|
|
4
17
|
|
|
5
18
|
Dependency updates only.
|
|
@@ -44,10 +44,11 @@ export interface IIdCompressor {
|
|
|
44
44
|
tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// @beta @legacy
|
|
47
|
+
// @beta @deprecated @legacy
|
|
48
48
|
export interface IIdCompressorCore {
|
|
49
49
|
beginGhostSession(ghostSessionId: SessionId, ghostSessionCallback: () => void): void;
|
|
50
50
|
finalizeCreationRange(range: IdCreationRange): void;
|
|
51
|
+
resetUnfinalizedCreationRange(): void;
|
|
51
52
|
serialize(withSession: true): SerializedIdCompressorWithOngoingSession;
|
|
52
53
|
serialize(withSession: false): SerializedIdCompressorWithNoSession;
|
|
53
54
|
takeNextCreationRange(): IdCreationRange;
|
|
@@ -74,6 +75,12 @@ export type SerializedIdCompressorWithOngoingSession = SerializedIdCompressor &
|
|
|
74
75
|
readonly _hasLocalState: "1281acae-6d14-47e7-bc92-71c8ee0819cb";
|
|
75
76
|
};
|
|
76
77
|
|
|
78
|
+
// @beta @legacy
|
|
79
|
+
export function serializeIdCompressor(compressor: IIdCompressor, withSession: true): SerializedIdCompressorWithOngoingSession;
|
|
80
|
+
|
|
81
|
+
// @beta @legacy
|
|
82
|
+
export function serializeIdCompressor(compressor: IIdCompressor, withSession: false): SerializedIdCompressorWithNoSession;
|
|
83
|
+
|
|
77
84
|
// @public
|
|
78
85
|
export type SessionId = StableId & {
|
|
79
86
|
readonly SessionId: "4498f850-e14e-4be9-8db0-89ec00997e58";
|
package/dist/idCompressor.d.ts
CHANGED
|
@@ -20,6 +20,12 @@ export declare class IdCompressor implements IIdCompressor, IIdCompressorCore {
|
|
|
20
20
|
private readonly localSession;
|
|
21
21
|
private readonly normalizer;
|
|
22
22
|
private localGenCount;
|
|
23
|
+
/**
|
|
24
|
+
* The gen count to be annotated on the range returned by the next call to `takeNextCreationRange`.
|
|
25
|
+
* This is advanced to `generatedIdCount` + 1 each time it is called.
|
|
26
|
+
* On the other hand, when `resetUnfinalizedCreationRange` is called,
|
|
27
|
+
* this is moved back to the start of the unfinalized range, to ensure those IDs are included in the next range.
|
|
28
|
+
*/
|
|
23
29
|
private nextRangeBaseGenCount;
|
|
24
30
|
private readonly sessions;
|
|
25
31
|
private readonly finalSpace;
|
|
@@ -48,6 +54,7 @@ export declare class IdCompressor implements IIdCompressor, IIdCompressorCore {
|
|
|
48
54
|
private generateNextLocalId;
|
|
49
55
|
takeNextCreationRange(): IdCreationRange;
|
|
50
56
|
takeUnfinalizedCreationRange(): IdCreationRange;
|
|
57
|
+
resetUnfinalizedCreationRange(): void;
|
|
51
58
|
private updateToRange;
|
|
52
59
|
private static assertValidRange;
|
|
53
60
|
finalizeCreationRange(range: IdCreationRange): void;
|
|
@@ -73,23 +80,83 @@ export declare class IdCompressor implements IIdCompressor, IIdCompressorCore {
|
|
|
73
80
|
}
|
|
74
81
|
/**
|
|
75
82
|
* Create a new {@link IIdCompressor}.
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* The returned compressor previously also implemented {@link IIdCompressorCore}, but that
|
|
86
|
+
* interface is {@link IIdCompressorCore | deprecated} and will be removed from the return
|
|
87
|
+
* type in a future release. Consumers should type variables as {@link IIdCompressor} and
|
|
88
|
+
* use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.
|
|
89
|
+
*
|
|
76
90
|
* @legacy @beta
|
|
77
91
|
*/
|
|
78
92
|
export declare function createIdCompressor(logger?: ITelemetryBaseLogger): IIdCompressor & IIdCompressorCore;
|
|
79
93
|
/**
|
|
80
94
|
* Create a new {@link IIdCompressor}.
|
|
81
95
|
* @param sessionId - The seed ID for the compressor.
|
|
96
|
+
*
|
|
97
|
+
* @remarks
|
|
98
|
+
* The returned compressor previously also implemented {@link IIdCompressorCore}, but that
|
|
99
|
+
* interface is {@link IIdCompressorCore | deprecated} and will be removed from the return
|
|
100
|
+
* type in a future release. Consumers should type variables as {@link IIdCompressor} and
|
|
101
|
+
* use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.
|
|
102
|
+
*
|
|
82
103
|
* @legacy @beta
|
|
83
104
|
*/
|
|
84
105
|
export declare function createIdCompressor(sessionId: SessionId, logger?: ITelemetryBaseLogger): IIdCompressor & IIdCompressorCore;
|
|
85
106
|
/**
|
|
86
107
|
* Deserializes the supplied state into an ID compressor.
|
|
108
|
+
*
|
|
109
|
+
* @remarks
|
|
110
|
+
* The returned compressor previously also implemented {@link IIdCompressorCore}, but that
|
|
111
|
+
* interface is {@link IIdCompressorCore | deprecated} and will be removed from the return
|
|
112
|
+
* type in a future release. Consumers should type variables as {@link IIdCompressor} and
|
|
113
|
+
* use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.
|
|
114
|
+
*
|
|
87
115
|
* @legacy @beta
|
|
88
116
|
*/
|
|
89
117
|
export declare function deserializeIdCompressor(serialized: SerializedIdCompressorWithOngoingSession, logger?: ITelemetryLoggerExt): IIdCompressor & IIdCompressorCore;
|
|
90
118
|
/**
|
|
91
119
|
* Deserializes the supplied state into an ID compressor.
|
|
120
|
+
*
|
|
121
|
+
* @remarks
|
|
122
|
+
* The returned compressor previously also implemented {@link IIdCompressorCore}, but that
|
|
123
|
+
* interface is {@link IIdCompressorCore | deprecated} and will be removed from the return
|
|
124
|
+
* type in a future release. Consumers should type variables as {@link IIdCompressor} and
|
|
125
|
+
* use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.
|
|
126
|
+
*
|
|
92
127
|
* @legacy @beta
|
|
93
128
|
*/
|
|
94
129
|
export declare function deserializeIdCompressor(serialized: SerializedIdCompressorWithNoSession, newSessionId: SessionId, logger?: ITelemetryLoggerExt): IIdCompressor & IIdCompressorCore;
|
|
130
|
+
/**
|
|
131
|
+
* Serializes an ID compressor.
|
|
132
|
+
* @param compressor - The compressor to serialize.
|
|
133
|
+
* @param withSession - If true, the serialized state will include local session
|
|
134
|
+
* state (for stashing). If false, only finalized state is included (for summaries).
|
|
135
|
+
* @legacy @beta
|
|
136
|
+
*/
|
|
137
|
+
export declare function serializeIdCompressor(compressor: IIdCompressor, withSession: true): SerializedIdCompressorWithOngoingSession;
|
|
138
|
+
/**
|
|
139
|
+
* Serializes an ID compressor.
|
|
140
|
+
* @param compressor - The compressor to serialize.
|
|
141
|
+
* @param withSession - If true, the serialized state will include local session
|
|
142
|
+
* state (for stashing). If false, only finalized state is included (for summaries).
|
|
143
|
+
* @legacy @beta
|
|
144
|
+
*/
|
|
145
|
+
export declare function serializeIdCompressor(compressor: IIdCompressor, withSession: false): SerializedIdCompressorWithNoSession;
|
|
146
|
+
/**
|
|
147
|
+
* Casts an {@link IIdCompressor} to include {@link IIdCompressorCore}.
|
|
148
|
+
*
|
|
149
|
+
* @remarks
|
|
150
|
+
* Compressors returned by `createIdCompressor` and `deserializeIdCompressor`
|
|
151
|
+
* always implement both {@link IIdCompressor} and {@link IIdCompressorCore}, but their
|
|
152
|
+
* return types will be narrowed to {@link IIdCompressor} to keep {@link IIdCompressorCore}
|
|
153
|
+
* out of the `@legacy` API surface. Internal consumers that need access to core
|
|
154
|
+
* compressor operations (serialization, range management, etc.) should use this function.
|
|
155
|
+
*
|
|
156
|
+
* @param compressor - A compressor created by `createIdCompressor` or
|
|
157
|
+
* `deserializeIdCompressor`.
|
|
158
|
+
* @returns The same compressor, typed to include {@link IIdCompressorCore}.
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
export declare function toIdCompressorWithCore(compressor: IIdCompressor): IIdCompressor & IIdCompressorCore;
|
|
95
162
|
//# sourceMappingURL=idCompressor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idCompressor.d.ts","sourceRoot":"","sources":["../src/idCompressor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EACN,KAAK,mBAAmB,EAGxB,MAAM,0CAA0C,CAAC;AASlD,OAAO,EACN,KAAK,KAAK,EAOV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAGN,QAAQ,EAKR,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACX,aAAa,
|
|
1
|
+
{"version":3,"file":"idCompressor.d.ts","sourceRoot":"","sources":["../src/idCompressor.ts"],"names":[],"mappings":"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"}
|
package/dist/idCompressor.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.deserializeIdCompressor = exports.createIdCompressor = exports.IdCompressor = void 0;
|
|
7
|
+
exports.toIdCompressorWithCore = exports.serializeIdCompressor = exports.deserializeIdCompressor = exports.createIdCompressor = exports.IdCompressor = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
10
|
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
@@ -28,6 +28,7 @@ function rangeFinalizationError(expectedStart, actualStart) {
|
|
|
28
28
|
/**
|
|
29
29
|
* See {@link IIdCompressor} and {@link IIdCompressorCore}
|
|
30
30
|
*/
|
|
31
|
+
// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API
|
|
31
32
|
class IdCompressor {
|
|
32
33
|
// #endregion
|
|
33
34
|
constructor(localSessionIdOrDeserialized, logger) {
|
|
@@ -37,8 +38,12 @@ class IdCompressor {
|
|
|
37
38
|
this.localGenCount = 0;
|
|
38
39
|
// #endregion
|
|
39
40
|
// #region Final state
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* The gen count to be annotated on the range returned by the next call to `takeNextCreationRange`.
|
|
43
|
+
* This is advanced to `generatedIdCount` + 1 each time it is called.
|
|
44
|
+
* On the other hand, when `resetUnfinalizedCreationRange` is called,
|
|
45
|
+
* this is moved back to the start of the unfinalized range, to ensure those IDs are included in the next range.
|
|
46
|
+
*/
|
|
42
47
|
this.nextRangeBaseGenCount = 1;
|
|
43
48
|
this.sessions = new sessions_js_1.Sessions();
|
|
44
49
|
this.finalSpace = new finalSpace_js_1.FinalSpace();
|
|
@@ -156,32 +161,16 @@ class IdCompressor {
|
|
|
156
161
|
return this.updateToRange(range);
|
|
157
162
|
}
|
|
158
163
|
takeUnfinalizedCreationRange() {
|
|
164
|
+
this.resetUnfinalizedCreationRange();
|
|
165
|
+
return this.takeNextCreationRange();
|
|
166
|
+
}
|
|
167
|
+
resetUnfinalizedCreationRange() {
|
|
168
|
+
(0, internal_1.assert)(!this.ongoingGhostSession, 0xcec /* IdCompressor should not be operated normally when in a ghost session */);
|
|
159
169
|
const lastLocalCluster = this.localSession.getLastCluster();
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
count = this.localGenCount;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
firstGenCount = (0, utilities_js_1.genCountFromLocalId)((lastLocalCluster.baseLocalId - lastLocalCluster.count));
|
|
168
|
-
count = this.localGenCount - firstGenCount + 1;
|
|
169
|
-
}
|
|
170
|
-
if (count === 0) {
|
|
171
|
-
return {
|
|
172
|
-
sessionId: this.localSessionId,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
const range = {
|
|
176
|
-
ids: {
|
|
177
|
-
count,
|
|
178
|
-
firstGenCount,
|
|
179
|
-
localIdRanges: this.normalizer.getRangesBetween(firstGenCount, this.localGenCount),
|
|
180
|
-
requestedClusterSize: this.nextRequestedClusterSize,
|
|
181
|
-
},
|
|
182
|
-
sessionId: this.localSessionId,
|
|
183
|
-
};
|
|
184
|
-
return this.updateToRange(range);
|
|
170
|
+
this.nextRangeBaseGenCount =
|
|
171
|
+
lastLocalCluster === undefined
|
|
172
|
+
? 1
|
|
173
|
+
: (0, utilities_js_1.genCountFromLocalId)((lastLocalCluster.baseLocalId - lastLocalCluster.count));
|
|
185
174
|
}
|
|
186
175
|
updateToRange(range) {
|
|
187
176
|
this.nextRangeBaseGenCount = this.localGenCount + 1;
|
|
@@ -594,4 +583,30 @@ function deserializeIdCompressor(serialized, sessionIdOrLogger, loggerOrUndefine
|
|
|
594
583
|
});
|
|
595
584
|
}
|
|
596
585
|
exports.deserializeIdCompressor = deserializeIdCompressor;
|
|
586
|
+
function serializeIdCompressor(compressor, withSession) {
|
|
587
|
+
const core = toIdCompressorWithCore(compressor);
|
|
588
|
+
return withSession ? core.serialize(true) : core.serialize(false);
|
|
589
|
+
}
|
|
590
|
+
exports.serializeIdCompressor = serializeIdCompressor;
|
|
591
|
+
/**
|
|
592
|
+
* Casts an {@link IIdCompressor} to include {@link IIdCompressorCore}.
|
|
593
|
+
*
|
|
594
|
+
* @remarks
|
|
595
|
+
* Compressors returned by `createIdCompressor` and `deserializeIdCompressor`
|
|
596
|
+
* always implement both {@link IIdCompressor} and {@link IIdCompressorCore}, but their
|
|
597
|
+
* return types will be narrowed to {@link IIdCompressor} to keep {@link IIdCompressorCore}
|
|
598
|
+
* out of the `@legacy` API surface. Internal consumers that need access to core
|
|
599
|
+
* compressor operations (serialization, range management, etc.) should use this function.
|
|
600
|
+
*
|
|
601
|
+
* @param compressor - A compressor created by `createIdCompressor` or
|
|
602
|
+
* `deserializeIdCompressor`.
|
|
603
|
+
* @returns The same compressor, typed to include {@link IIdCompressorCore}.
|
|
604
|
+
* @internal
|
|
605
|
+
*/
|
|
606
|
+
function toIdCompressorWithCore(compressor) {
|
|
607
|
+
(0, internal_1.assert)("serialize" in compressor, 0xced /* Expected compressor to implement IIdCompressorCore */);
|
|
608
|
+
// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API
|
|
609
|
+
return compressor;
|
|
610
|
+
}
|
|
611
|
+
exports.toIdCompressorWithCore = toIdCompressorWithCore;
|
|
597
612
|
//# sourceMappingURL=idCompressor.js.map
|
package/dist/idCompressor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idCompressor.js","sourceRoot":"","sources":["../src/idCompressor.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 { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tLoggingError,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { FinalSpace } from \"./finalSpace.js\";\nimport {\n\ttype FinalCompressedId,\n\ttype LocalCompressedId,\n\ttype NumericUuid,\n\tisFinalId,\n} from \"./identifiers.js\";\nimport {\n\ttype Index,\n\treadBoolean,\n\treadNumber,\n\treadNumericUuid,\n\twriteBoolean,\n\twriteNumber,\n\twriteNumericUuid,\n} from \"./persistanceUtilities.js\";\nimport { SessionSpaceNormalizer } from \"./sessionSpaceNormalizer.js\";\nimport {\n\ttype IdCluster,\n\tSession,\n\tSessions,\n\tgetAlignedFinal,\n\tgetAlignedLocal,\n\tlastFinalizedFinal,\n\tlastFinalizedLocal,\n} from \"./sessions.js\";\nimport type {\n\tIIdCompressor,\n\tIIdCompressorCore,\n\tIdCreationRange,\n\tOpSpaceCompressedId,\n\tSerializedIdCompressor,\n\tSerializedIdCompressorWithNoSession,\n\tSerializedIdCompressorWithOngoingSession,\n\tSessionId,\n\tSessionSpaceCompressedId,\n\tStableId,\n} from \"./types/index.js\";\nimport {\n\tcreateSessionId,\n\tgenCountFromLocalId,\n\tlocalIdFromGenCount,\n\tnumericUuidFromStableId,\n\toffsetNumericUuid,\n\tstableIdFromNumericUuid,\n\tsubtractNumericUuids,\n} from \"./utilities.js\";\n\n/**\n * The version of IdCompressor that is currently persisted.\n * This should not be changed without careful consideration to compatibility.\n */\nconst currentWrittenVersion = 2;\n\nfunction rangeFinalizationError(expectedStart: number, actualStart: number): LoggingError {\n\treturn new LoggingError(\"Ranges finalized out of order\", {\n\t\texpectedStart,\n\t\tactualStart,\n\t});\n}\n\n/**\n * See {@link IIdCompressor} and {@link IIdCompressorCore}\n */\nexport class IdCompressor implements IIdCompressor, IIdCompressorCore {\n\t/**\n\t * Max allowed initial cluster size.\n\t */\n\tpublic static readonly maxClusterSize = 2 ** 20;\n\n\t// #region Local state\n\n\tpublic readonly localSessionId: SessionId;\n\tprivate readonly localSession: Session;\n\tprivate readonly normalizer = new SessionSpaceNormalizer();\n\t// The number of IDs generated by the local session\n\tprivate localGenCount = 0;\n\n\t// #endregion\n\n\t// #region Final state\n\n\t// The gen count to be annotated on the range returned by the next call to `takeNextCreationRange`.\n\t// This is updated to be equal to `generatedIdCount` + 1 each time it is called.\n\tprivate nextRangeBaseGenCount = 1;\n\tprivate readonly sessions = new Sessions();\n\tprivate readonly finalSpace = new FinalSpace();\n\n\t// #endregion\n\n\t// #region Ephemeral state\n\n\t/**\n\t * Roughly equates to a minimum of 1M sessions before we start allocating 64 bit IDs.\n\t * Eventually, this can be adjusted dynamically to have cluster reservation policies that\n\t * optimize the number of eager finals.\n\t * It is not readonly as it is accessed by tests for clear-box testing.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/prefer-readonly\n\tprivate nextRequestedClusterSize: number = 512;\n\t// The number of local IDs generated since the last telemetry was sent.\n\tprivate telemetryLocalIdCount = 0;\n\t// The number of eager final IDs generated since the last telemetry was sent.\n\tprivate telemetryEagerFinalIdCount = 0;\n\t// The ongoing ghost session, if one exists.\n\tprivate ongoingGhostSession?: { cluster?: IdCluster; ghostSessionId: SessionId } | undefined;\n\n\t// #endregion\n\n\tpublic constructor(\n\t\tlocalSessionIdOrDeserialized: SessionId | Sessions,\n\t\tprivate readonly logger: ITelemetryLoggerExt | undefined,\n\t) {\n\t\tif (typeof localSessionIdOrDeserialized === \"string\") {\n\t\t\tthis.localSessionId = localSessionIdOrDeserialized;\n\t\t\tthis.localSession = this.sessions.getOrCreate(localSessionIdOrDeserialized);\n\t\t} else {\n\t\t\t// Deserialize case\n\t\t\tthis.sessions = localSessionIdOrDeserialized;\n\t\t\t// As policy, the first session is always the local session. Preserve this invariant\n\t\t\t// during deserialization.\n\t\t\tconst firstSession = localSessionIdOrDeserialized.sessions().next();\n\t\t\tassert(!firstSession.done, 0x754 /* First session must be present. */);\n\t\t\tthis.localSession = firstSession.value;\n\t\t\tthis.localSessionId = stableIdFromNumericUuid(\n\t\t\t\tthis.localSession.sessionUuid,\n\t\t\t) as SessionId;\n\t\t}\n\t}\n\n\tpublic generateCompressedId(): SessionSpaceCompressedId {\n\t\t// This ghost session code inside this block should not be changed without a version bump (it is performed at a consensus point)\n\t\tif (this.ongoingGhostSession) {\n\t\t\tif (this.ongoingGhostSession.cluster === undefined) {\n\t\t\t\tthis.ongoingGhostSession.cluster = this.addEmptyCluster(\n\t\t\t\t\tthis.sessions.getOrCreate(this.ongoingGhostSession.ghostSessionId),\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.ongoingGhostSession.cluster.capacity++;\n\t\t\t}\n\t\t\tthis.ongoingGhostSession.cluster.count++;\n\t\t\treturn lastFinalizedFinal(\n\t\t\t\tthis.ongoingGhostSession.cluster,\n\t\t\t) as unknown as SessionSpaceCompressedId;\n\t\t} else {\n\t\t\tthis.localGenCount++;\n\t\t\tconst lastCluster = this.localSession.getLastCluster();\n\t\t\tif (lastCluster === undefined) {\n\t\t\t\tthis.telemetryLocalIdCount++;\n\t\t\t\treturn this.generateNextLocalId();\n\t\t\t}\n\n\t\t\t// If there exists a cluster of final IDs already claimed by the local session that still has room in it,\n\t\t\t// it is known prior to range sequencing what a local ID's corresponding final ID will be.\n\t\t\t// In this case, it is safe to return the final ID immediately. This is guaranteed to be safe because\n\t\t\t// any op that the local session sends that contains one of those final IDs are guaranteed to arrive to\n\t\t\t// collaborators *after* the one containing the creation range.\n\t\t\tconst clusterOffset = this.localGenCount - genCountFromLocalId(lastCluster.baseLocalId);\n\t\t\tif (lastCluster.capacity > clusterOffset) {\n\t\t\t\tthis.telemetryEagerFinalIdCount++;\n\t\t\t\t// Space in the cluster: eager final\n\t\t\t\treturn ((lastCluster.baseFinalId as number) +\n\t\t\t\t\tclusterOffset) as SessionSpaceCompressedId;\n\t\t\t}\n\t\t\t// No space in the cluster, return next local\n\t\t\tthis.telemetryLocalIdCount++;\n\t\t\treturn this.generateNextLocalId();\n\t\t}\n\t}\n\n\tpublic generateDocumentUniqueId():\n\t\t| (SessionSpaceCompressedId & OpSpaceCompressedId)\n\t\t| StableId {\n\t\tconst id = this.generateCompressedId();\n\t\treturn isFinalId(id) ? id : this.decompress(id);\n\t}\n\n\t/**\n\t * Starts a ghost session. Only exposed for test purposes (this class is not exported from the package).\n\t * @param ghostSessionId - The session ID to start the ghost session with.\n\t */\n\tpublic startGhostSession(ghostSessionId: SessionId): void {\n\t\tassert(!this.ongoingGhostSession, 0x8fe /* Ghost session already in progress. */);\n\t\tthis.ongoingGhostSession = { ghostSessionId };\n\t}\n\n\t/**\n\t * {@inheritdoc IIdCompressorCore.beginGhostSession}\n\t */\n\tpublic beginGhostSession(ghostSessionId: SessionId, ghostSessionCallback: () => void): void {\n\t\tthis.startGhostSession(ghostSessionId);\n\t\ttry {\n\t\t\tghostSessionCallback();\n\t\t} finally {\n\t\t\tthis.ongoingGhostSession = undefined;\n\t\t}\n\t}\n\n\tprivate generateNextLocalId(): LocalCompressedId {\n\t\t// Must tell the normalizer that we generated a local ID\n\t\tthis.normalizer.addLocalRange(this.localGenCount, 1);\n\t\treturn localIdFromGenCount(this.localGenCount);\n\t}\n\n\tpublic takeNextCreationRange(): IdCreationRange {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a6 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst count = this.localGenCount - (this.nextRangeBaseGenCount - 1);\n\t\tif (count === 0) {\n\t\t\treturn {\n\t\t\t\tsessionId: this.localSessionId,\n\t\t\t};\n\t\t}\n\t\tconst range: IdCreationRange = {\n\t\t\tsessionId: this.localSessionId,\n\t\t\tids: {\n\t\t\t\tfirstGenCount: this.nextRangeBaseGenCount,\n\t\t\t\tcount,\n\t\t\t\trequestedClusterSize: this.nextRequestedClusterSize,\n\t\t\t\tlocalIdRanges: this.normalizer.getRangesBetween(\n\t\t\t\t\tthis.nextRangeBaseGenCount,\n\t\t\t\t\tthis.localGenCount,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t\treturn this.updateToRange(range);\n\t}\n\n\tpublic takeUnfinalizedCreationRange(): IdCreationRange {\n\t\tconst lastLocalCluster = this.localSession.getLastCluster();\n\t\tlet count: number;\n\t\tlet firstGenCount: number;\n\t\tif (lastLocalCluster === undefined) {\n\t\t\tfirstGenCount = 1;\n\t\t\tcount = this.localGenCount;\n\t\t} else {\n\t\t\tfirstGenCount = genCountFromLocalId(\n\t\t\t\t(lastLocalCluster.baseLocalId - lastLocalCluster.count) as LocalCompressedId,\n\t\t\t);\n\t\t\tcount = this.localGenCount - firstGenCount + 1;\n\t\t}\n\n\t\tif (count === 0) {\n\t\t\treturn {\n\t\t\t\tsessionId: this.localSessionId,\n\t\t\t};\n\t\t}\n\n\t\tconst range: IdCreationRange = {\n\t\t\tids: {\n\t\t\t\tcount,\n\t\t\t\tfirstGenCount,\n\t\t\t\tlocalIdRanges: this.normalizer.getRangesBetween(firstGenCount, this.localGenCount),\n\t\t\t\trequestedClusterSize: this.nextRequestedClusterSize,\n\t\t\t},\n\t\t\tsessionId: this.localSessionId,\n\t\t};\n\t\treturn this.updateToRange(range);\n\t}\n\n\tprivate updateToRange(range: IdCreationRange): IdCreationRange {\n\t\tthis.nextRangeBaseGenCount = this.localGenCount + 1;\n\t\treturn IdCompressor.assertValidRange(range);\n\t}\n\n\tprivate static assertValidRange(range: IdCreationRange): IdCreationRange {\n\t\tif (range.ids === undefined) {\n\t\t\treturn range;\n\t\t}\n\t\tconst { count, requestedClusterSize } = range.ids;\n\t\tassert(count > 0, 0x755 /* Malformed ID Range. */);\n\t\tassert(requestedClusterSize > 0, 0x876 /* Clusters must have a positive capacity. */);\n\t\tassert(\n\t\t\trequestedClusterSize <= IdCompressor.maxClusterSize,\n\t\t\t0x877 /* Clusters must not exceed max cluster size. */,\n\t\t);\n\t\treturn range;\n\t}\n\n\tpublic finalizeCreationRange(range: IdCreationRange): void {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a7 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\t// Check if the range has IDs\n\t\tif (range.ids === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tIdCompressor.assertValidRange(range);\n\t\tconst { sessionId, ids } = range;\n\t\tconst { count, firstGenCount, requestedClusterSize } = ids;\n\t\tconst session = this.sessions.getOrCreate(sessionId);\n\t\tconst isLocal = session === this.localSession;\n\t\tconst rangeBaseLocal = localIdFromGenCount(firstGenCount);\n\t\tlet lastCluster = session.getLastCluster();\n\t\tif (lastCluster === undefined) {\n\t\t\t// This is the first cluster in the session space\n\t\t\tif (rangeBaseLocal !== -1) {\n\t\t\t\tthrow rangeFinalizationError(-1, rangeBaseLocal);\n\t\t\t}\n\t\t\tlastCluster = this.addEmptyCluster(session, requestedClusterSize + count);\n\t\t\tif (isLocal) {\n\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\teventName: \"RuntimeIdCompressor:FirstCluster\",\n\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst remainingCapacity = lastCluster.capacity - lastCluster.count;\n\t\tif (lastCluster.baseLocalId - lastCluster.count !== rangeBaseLocal) {\n\t\t\tthrow rangeFinalizationError(\n\t\t\t\tlastCluster.baseLocalId - lastCluster.count,\n\t\t\t\trangeBaseLocal,\n\t\t\t);\n\t\t}\n\n\t\tif (remainingCapacity >= count) {\n\t\t\t// The current range fits in the existing cluster\n\t\t\tlastCluster.count += count;\n\t\t} else {\n\t\t\tconst overflow = count - remainingCapacity;\n\t\t\tconst newClaimedFinalCount = overflow + requestedClusterSize;\n\t\t\tif (lastCluster === this.finalSpace.getLastCluster()) {\n\t\t\t\t// The last cluster in the sessions chain is the last cluster globally, so it can be expanded.\n\t\t\t\tlastCluster.capacity += newClaimedFinalCount;\n\t\t\t\tlastCluster.count += count;\n\t\t\t\tassert(\n\t\t\t\t\t!this.sessions.clusterCollides(lastCluster),\n\t\t\t\t\t0x756 /* Cluster collision detected. */,\n\t\t\t\t);\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"RuntimeIdCompressor:ClusterExpansion\",\n\t\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t\t\tpreviousCapacity: lastCluster.capacity - newClaimedFinalCount,\n\t\t\t\t\t\tnewCapacity: lastCluster.capacity,\n\t\t\t\t\t\toverflow,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// The last cluster in the sessions chain is *not* the last cluster globally. Fill and overflow to new.\n\t\t\t\tlastCluster.count = lastCluster.capacity;\n\t\t\t\tconst newCluster = this.addEmptyCluster(session, newClaimedFinalCount);\n\t\t\t\tnewCluster.count += overflow;\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"RuntimeIdCompressor:NewCluster\",\n\t\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isLocal) {\n\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\teagerFinalIdCount: this.telemetryEagerFinalIdCount,\n\t\t\t\tlocalIdCount: this.telemetryLocalIdCount,\n\t\t\t\tsessionId: this.localSessionId,\n\t\t\t});\n\t\t\tthis.telemetryEagerFinalIdCount = 0;\n\t\t\tthis.telemetryLocalIdCount = 0;\n\t\t}\n\n\t\tassert(!session.isEmpty(), 0x757 /* Empty sessions should not be created. */);\n\t}\n\n\tprivate addEmptyCluster(session: Session, capacity: number): IdCluster {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession?.cluster,\n\t\t\t0x8a8 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst newCluster = session.addNewCluster(\n\t\t\tthis.finalSpace.getAllocatedIdLimit(),\n\t\t\tcapacity,\n\t\t\t0,\n\t\t);\n\t\tassert(\n\t\t\t!this.sessions.clusterCollides(newCluster),\n\t\t\t0x758 /* Cluster collision detected. */,\n\t\t);\n\t\tthis.finalSpace.addCluster(newCluster);\n\t\treturn newCluster;\n\t}\n\n\tpublic normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId {\n\t\tif (isFinalId(id)) {\n\t\t\treturn id;\n\t\t} else {\n\t\t\tconst local = id as unknown as LocalCompressedId;\n\t\t\tif (!this.normalizer.contains(local)) {\n\t\t\t\tthrow new Error(\"Invalid ID to normalize.\");\n\t\t\t}\n\t\t\tconst finalForm = this.localSession.tryConvertToFinal(local, true);\n\t\t\treturn finalForm === undefined\n\t\t\t\t? (local as unknown as OpSpaceCompressedId)\n\t\t\t\t: (finalForm as OpSpaceCompressedId);\n\t\t}\n\t}\n\n\tpublic normalizeToSessionSpace(\n\t\tid: OpSpaceCompressedId,\n\t\toriginSessionId: SessionId,\n\t): SessionSpaceCompressedId {\n\t\tif (isFinalId(id)) {\n\t\t\tconst containingCluster = this.localSession.getClusterByAllocatedFinal(id);\n\t\t\tif (containingCluster === undefined) {\n\t\t\t\t// Does not exist in local cluster chain\n\t\t\t\tif (id >= this.finalSpace.getFinalizedIdLimit()) {\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t\treturn id as unknown as SessionSpaceCompressedId;\n\t\t\t} else {\n\t\t\t\tconst alignedLocal = getAlignedLocal(containingCluster, id);\n\t\t\t\tif (this.normalizer.contains(alignedLocal)) {\n\t\t\t\t\treturn alignedLocal;\n\t\t\t\t} else {\n\t\t\t\t\tif (genCountFromLocalId(alignedLocal) > this.localGenCount) {\n\t\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t\t}\n\t\t\t\t\treturn id as unknown as SessionSpaceCompressedId;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst localToNormalize = id as unknown as LocalCompressedId;\n\t\t\tif (originSessionId === this.localSessionId) {\n\t\t\t\tif (this.normalizer.contains(localToNormalize)) {\n\t\t\t\t\treturn localToNormalize;\n\t\t\t\t} else {\n\t\t\t\t\t// We never generated this local ID, so fail\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// LocalId from a remote session\n\t\t\t\tconst remoteSession = this.sessions.get(originSessionId);\n\t\t\t\tif (remoteSession === undefined) {\n\t\t\t\t\tthrow new Error(\"No IDs have ever been finalized by the supplied session.\");\n\t\t\t\t}\n\t\t\t\tconst correspondingFinal = remoteSession.tryConvertToFinal(localToNormalize, false);\n\t\t\t\tif (correspondingFinal === undefined) {\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t\treturn correspondingFinal as unknown as SessionSpaceCompressedId;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic decompress(id: SessionSpaceCompressedId): StableId {\n\t\tif (isFinalId(id)) {\n\t\t\tconst containingCluster = Session.getContainingCluster(id, this.finalSpace.clusters);\n\t\t\tif (containingCluster === undefined) {\n\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t}\n\t\t\tconst alignedLocal = getAlignedLocal(containingCluster, id);\n\t\t\tconst alignedGenCount = genCountFromLocalId(alignedLocal);\n\t\t\tconst lastFinalizedGenCount = genCountFromLocalId(lastFinalizedLocal(containingCluster));\n\t\t\tif (alignedGenCount > lastFinalizedGenCount) {\n\t\t\t\t// should be an eager final id generated by the local session\n\t\t\t\tif (containingCluster.session === this.localSession) {\n\t\t\t\t\tassert(!this.normalizer.contains(alignedLocal), 0x759 /* Normalizer out of sync. */);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stableIdFromNumericUuid(\n\t\t\t\toffsetNumericUuid(containingCluster.session.sessionUuid, alignedGenCount - 1),\n\t\t\t);\n\t\t} else {\n\t\t\tconst localToDecompress = id as unknown as LocalCompressedId;\n\t\t\tif (!this.normalizer.contains(localToDecompress)) {\n\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t}\n\t\t\treturn stableIdFromNumericUuid(\n\t\t\t\toffsetNumericUuid(\n\t\t\t\t\tthis.localSession.sessionUuid,\n\t\t\t\t\tgenCountFromLocalId(localToDecompress) - 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic recompress(uncompressed: StableId): SessionSpaceCompressedId {\n\t\tconst recompressed = this.tryRecompress(uncompressed);\n\t\tif (recompressed === undefined) {\n\t\t\tthrow new Error(\"Could not recompress.\");\n\t\t}\n\t\treturn recompressed;\n\t}\n\n\tpublic tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined {\n\t\tconst match = this.sessions.getContainingCluster(uncompressed);\n\t\tif (match === undefined) {\n\t\t\tconst numericUncompressed = numericUuidFromStableId(uncompressed);\n\t\t\tconst offset = subtractNumericUuids(numericUncompressed, this.localSession.sessionUuid);\n\t\t\tif (offset < Number.MAX_SAFE_INTEGER) {\n\t\t\t\tconst genCountEquivalent = Number(offset) + 1;\n\t\t\t\tconst localEquivalent = localIdFromGenCount(genCountEquivalent);\n\t\t\t\tif (this.normalizer.contains(localEquivalent)) {\n\t\t\t\t\treturn localEquivalent;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tconst [containingCluster, alignedLocal] = match;\n\t\t\tif (containingCluster.session === this.localSession) {\n\t\t\t\t// Local session\n\t\t\t\tif (this.normalizer.contains(alignedLocal)) {\n\t\t\t\t\treturn alignedLocal;\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tgenCountFromLocalId(alignedLocal) <= this.localGenCount,\n\t\t\t\t\t\t0x75a /* Clusters out of sync. */,\n\t\t\t\t\t);\n\t\t\t\t\t// Id is an eager final\n\t\t\t\t\treturn getAlignedFinal(containingCluster, alignedLocal) as\n\t\t\t\t\t\t| SessionSpaceCompressedId\n\t\t\t\t\t\t| undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Not the local session\n\t\t\t\treturn genCountFromLocalId(alignedLocal) >= lastFinalizedLocal(containingCluster)\n\t\t\t\t\t? (getAlignedFinal(containingCluster, alignedLocal) as\n\t\t\t\t\t\t\t| SessionSpaceCompressedId\n\t\t\t\t\t\t\t| undefined)\n\t\t\t\t\t: undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic serialize(withSession: true): SerializedIdCompressorWithOngoingSession;\n\tpublic serialize(withSession: false): SerializedIdCompressorWithNoSession;\n\tpublic serialize(hasLocalState: boolean): SerializedIdCompressor {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a9 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst { normalizer, finalSpace, sessions, localGenCount, logger, nextRangeBaseGenCount } =\n\t\t\tthis;\n\t\tconst sessionIndexMap = new Map<Session, number>();\n\t\tlet sessionIndex = 0;\n\t\tfor (const session of sessions.sessions()) {\n\t\t\t// Filter empty sessions to prevent them accumulating in the serialized state\n\t\t\tif (!session.isEmpty() || hasLocalState) {\n\t\t\t\tsessionIndexMap.set(session, sessionIndex);\n\t\t\t\tsessionIndex++;\n\t\t\t}\n\t\t}\n\t\tconst localStateSize = hasLocalState\n\t\t\t? 1 + // generated ID count\n\t\t\t\t1 + // next range base genCount\n\t\t\t\t1 + // count of normalizer pairs\n\t\t\t\tnormalizer.idRanges.size * 2 // pairs\n\t\t\t: 0;\n\t\t// Layout size, in 8 byte increments\n\t\tconst totalSize =\n\t\t\t1 + // version\n\t\t\t1 + // hasLocalState\n\t\t\t1 + // session count\n\t\t\t1 + // cluster count\n\t\t\tsessionIndexMap.size * 2 + // session IDs\n\t\t\tfinalSpace.clusters.length * 3 + // clusters: (sessionIndex, capacity, count)[]\n\t\t\tlocalStateSize; // local state, if present\n\n\t\tconst serializedFloat = new Float64Array(totalSize);\n\t\tconst serializedUint = new BigUint64Array(serializedFloat.buffer);\n\t\tlet index = 0;\n\t\tindex = writeNumber(serializedFloat, index, currentWrittenVersion);\n\t\tindex = writeBoolean(serializedFloat, index, hasLocalState);\n\t\tindex = writeNumber(serializedFloat, index, sessionIndexMap.size);\n\t\tindex = writeNumber(serializedFloat, index, finalSpace.clusters.length);\n\n\t\tfor (const [session] of sessionIndexMap.entries()) {\n\t\t\tindex = writeNumericUuid(serializedUint, index, session.sessionUuid);\n\t\t}\n\n\t\tfor (const cluster of finalSpace.clusters) {\n\t\t\tindex = writeNumber(\n\t\t\t\tserializedFloat,\n\t\t\t\tindex,\n\t\t\t\tsessionIndexMap.get(cluster.session) as number,\n\t\t\t);\n\t\t\tindex = writeNumber(serializedFloat, index, cluster.capacity);\n\t\t\tindex = writeNumber(serializedFloat, index, cluster.count);\n\t\t}\n\n\t\tif (hasLocalState) {\n\t\t\tindex = writeNumber(serializedFloat, index, localGenCount);\n\t\t\tindex = writeNumber(serializedFloat, index, nextRangeBaseGenCount);\n\t\t\tindex = writeNumber(serializedFloat, index, normalizer.idRanges.size);\n\t\t\tfor (const [leadingGenCount, count] of normalizer.idRanges.entries()) {\n\t\t\t\tindex = writeNumber(serializedFloat, index, leadingGenCount);\n\t\t\t\tindex = writeNumber(serializedFloat, index, count);\n\t\t\t}\n\t\t}\n\n\t\tassert(index === totalSize, 0x75b /* Serialized size was incorrectly calculated. */);\n\t\tlogger?.sendTelemetryEvent({\n\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\tsize: serializedFloat.byteLength,\n\t\t\tclusterCount: finalSpace.clusters.length,\n\t\t\tsessionCount: sessionIndexMap.size,\n\t\t});\n\n\t\treturn bufferToString(serializedFloat.buffer, \"base64\") as SerializedIdCompressor;\n\t}\n\n\tpublic static deserialize(\n\t\tparams:\n\t\t\t| {\n\t\t\t\t\tserialized: SerializedIdCompressorWithOngoingSession;\n\t\t\t\t\tlogger?: ITelemetryLoggerExt | undefined;\n\t\t\t\t\tnewSessionId?: never;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tserialized: SerializedIdCompressorWithNoSession;\n\t\t\t\t\tnewSessionId: SessionId;\n\t\t\t\t\tlogger?: ITelemetryLoggerExt | undefined;\n\t\t\t },\n\t): IdCompressor {\n\t\tconst { serialized, newSessionId, logger } = params;\n\t\tconst buffer = stringToBuffer(serialized, \"base64\");\n\t\tconst index: Index = {\n\t\t\tindex: 0,\n\t\t\tbufferFloat: new Float64Array(buffer),\n\t\t\tbufferUint: new BigUint64Array(buffer),\n\t\t};\n\t\tconst version = readNumber(index);\n\t\tswitch (version) {\n\t\t\tcase 1: {\n\t\t\t\tthrow new Error(\"IdCompressor version 1.0 is no longer supported.\");\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\treturn IdCompressor.deserialize2_0(index, newSessionId, logger);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(\"Unknown IdCompressor serialized version.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic deserialize2_0(\n\t\tindex: Index,\n\t\tsessionId: SessionId | undefined,\n\t\tlogger: ITelemetryLoggerExt | undefined,\n\t): IdCompressor {\n\t\tconst hasLocalState = readBoolean(index);\n\t\tconst sessionCount = readNumber(index);\n\t\tconst clusterCount = readNumber(index);\n\n\t\t// Sessions\n\t\tlet sessionOffset = 0;\n\t\tconst sessions: [NumericUuid, Session][] = [];\n\t\tif (hasLocalState) {\n\t\t\tassert(\n\t\t\t\tsessionId === undefined,\n\t\t\t\t0x75e /* Local state should not exist in serialized form. */,\n\t\t\t);\n\t\t} else {\n\t\t\t// If !hasLocalState, there won't be a serialized local session ID so insert one at the beginning\n\t\t\tassert(sessionId !== undefined, 0x75d /* Local session ID is undefined. */);\n\t\t\tconst localSessionNumeric = numericUuidFromStableId(sessionId);\n\t\t\tsessions.push([localSessionNumeric, new Session(localSessionNumeric)]);\n\t\t\tsessionOffset = 1;\n\t\t}\n\n\t\tfor (let i = 0; i < sessionCount; i++) {\n\t\t\tconst numeric = readNumericUuid(index);\n\t\t\tsessions.push([numeric, new Session(numeric)]);\n\t\t}\n\n\t\tconst compressor = new IdCompressor(new Sessions(sessions), logger);\n\n\t\t// Clusters\n\t\tlet baseFinalId = 0;\n\t\tfor (let i = 0; i < clusterCount; i++) {\n\t\t\tconst sessionIndex = readNumber(index);\n\t\t\tconst sessionArray = sessions[sessionIndex + sessionOffset];\n\t\t\tassert(\n\t\t\t\tsessionArray !== undefined,\n\t\t\t\t0x9d8 /* sessionArray is undefined in IdCompressor.deserialize2_0 */,\n\t\t\t);\n\t\t\tconst session = sessionArray[1];\n\t\t\tconst capacity = readNumber(index);\n\t\t\tconst count = readNumber(index);\n\t\t\tconst cluster = session.addNewCluster(baseFinalId as FinalCompressedId, capacity, count);\n\t\t\tcompressor.finalSpace.addCluster(cluster);\n\t\t\tbaseFinalId += capacity;\n\t\t}\n\n\t\t// Local state\n\t\tif (hasLocalState) {\n\t\t\tcompressor.localGenCount = readNumber(index);\n\t\t\tcompressor.nextRangeBaseGenCount = readNumber(index);\n\t\t\tconst normalizerCount = readNumber(index);\n\t\t\tfor (let i = 0; i < normalizerCount; i++) {\n\t\t\t\tcompressor.normalizer.addLocalRange(readNumber(index), readNumber(index));\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tindex.index === index.bufferFloat.length,\n\t\t\t0x75f /* Failed to read entire serialized compressor. */,\n\t\t);\n\t\treturn compressor;\n\t}\n\n\tpublic equals(other: IdCompressor, includeLocalState: boolean): boolean {\n\t\tif (\n\t\t\tincludeLocalState &&\n\t\t\t(this.localSessionId !== other.localSessionId ||\n\t\t\t\t!this.localSession.equals(other.localSession) ||\n\t\t\t\t!this.normalizer.equals(other.normalizer) ||\n\t\t\t\tthis.nextRangeBaseGenCount !== other.nextRangeBaseGenCount ||\n\t\t\t\tthis.localGenCount !== other.localGenCount)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tthis.sessions.equals(other.sessions, includeLocalState) &&\n\t\t\tthis.finalSpace.equals(other.finalSpace)\n\t\t);\n\t}\n}\n\n/**\n * Create a new {@link IIdCompressor}.\n * @legacy @beta\n */\nexport function createIdCompressor(\n\tlogger?: ITelemetryBaseLogger,\n): IIdCompressor & IIdCompressorCore;\n/**\n * Create a new {@link IIdCompressor}.\n * @param sessionId - The seed ID for the compressor.\n * @legacy @beta\n */\nexport function createIdCompressor(\n\tsessionId: SessionId,\n\tlogger?: ITelemetryBaseLogger,\n): IIdCompressor & IIdCompressorCore;\nexport function createIdCompressor(\n\tsessionIdOrLogger?: SessionId | ITelemetryBaseLogger,\n\tloggerOrUndefined?: ITelemetryBaseLogger,\n): IIdCompressor & IIdCompressorCore {\n\tlet localSessionId: SessionId;\n\tlet logger: ITelemetryBaseLogger | undefined;\n\tif (sessionIdOrLogger === undefined) {\n\t\tlocalSessionId = createSessionId();\n\t} else {\n\t\tif (typeof sessionIdOrLogger === \"string\") {\n\t\t\tlocalSessionId = sessionIdOrLogger;\n\t\t\tlogger = loggerOrUndefined;\n\t\t} else {\n\t\t\tlocalSessionId = createSessionId();\n\t\t\tlogger = sessionIdOrLogger;\n\t\t}\n\t}\n\tconst compressor = new IdCompressor(\n\t\tlocalSessionId,\n\t\tlogger === undefined ? undefined : createChildLogger({ logger }),\n\t);\n\treturn compressor;\n}\n\n/**\n * Deserializes the supplied state into an ID compressor.\n * @legacy @beta\n */\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressorWithOngoingSession,\n\tlogger?: ITelemetryLoggerExt,\n): IIdCompressor & IIdCompressorCore;\n/**\n * Deserializes the supplied state into an ID compressor.\n * @legacy @beta\n */\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressorWithNoSession,\n\tnewSessionId: SessionId,\n\tlogger?: ITelemetryLoggerExt,\n): IIdCompressor & IIdCompressorCore;\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressor | SerializedIdCompressorWithNoSession,\n\tsessionIdOrLogger: SessionId | ITelemetryLoggerExt | undefined,\n\tloggerOrUndefined?: ITelemetryLoggerExt,\n): IIdCompressor & IIdCompressorCore {\n\tif (typeof sessionIdOrLogger === \"string\") {\n\t\treturn IdCompressor.deserialize({\n\t\t\tserialized: serialized as SerializedIdCompressorWithNoSession,\n\t\t\tlogger: loggerOrUndefined,\n\t\t\tnewSessionId: sessionIdOrLogger,\n\t\t});\n\t}\n\n\tassert(\n\t\tloggerOrUndefined === undefined,\n\t\t0xc2d /* logger would be in sessionIdOrLogger in this codepath */,\n\t);\n\treturn IdCompressor.deserialize({\n\t\tserialized: serialized as SerializedIdCompressorWithOngoingSession,\n\t\tlogger: sessionIdOrLogger,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"idCompressor.js","sourceRoot":"","sources":["../src/idCompressor.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 { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tLoggingError,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { FinalSpace } from \"./finalSpace.js\";\nimport {\n\ttype FinalCompressedId,\n\ttype LocalCompressedId,\n\ttype NumericUuid,\n\tisFinalId,\n} from \"./identifiers.js\";\nimport {\n\ttype Index,\n\treadBoolean,\n\treadNumber,\n\treadNumericUuid,\n\twriteBoolean,\n\twriteNumber,\n\twriteNumericUuid,\n} from \"./persistanceUtilities.js\";\nimport { SessionSpaceNormalizer } from \"./sessionSpaceNormalizer.js\";\nimport {\n\ttype IdCluster,\n\tSession,\n\tSessions,\n\tgetAlignedFinal,\n\tgetAlignedLocal,\n\tlastFinalizedFinal,\n\tlastFinalizedLocal,\n} from \"./sessions.js\";\nimport type {\n\tIIdCompressor,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n\tIIdCompressorCore,\n\tIdCreationRange,\n\tOpSpaceCompressedId,\n\tSerializedIdCompressor,\n\tSerializedIdCompressorWithNoSession,\n\tSerializedIdCompressorWithOngoingSession,\n\tSessionId,\n\tSessionSpaceCompressedId,\n\tStableId,\n} from \"./types/index.js\";\nimport {\n\tcreateSessionId,\n\tgenCountFromLocalId,\n\tlocalIdFromGenCount,\n\tnumericUuidFromStableId,\n\toffsetNumericUuid,\n\tstableIdFromNumericUuid,\n\tsubtractNumericUuids,\n} from \"./utilities.js\";\n\n/**\n * The version of IdCompressor that is currently persisted.\n * This should not be changed without careful consideration to compatibility.\n */\nconst currentWrittenVersion = 2;\n\nfunction rangeFinalizationError(expectedStart: number, actualStart: number): LoggingError {\n\treturn new LoggingError(\"Ranges finalized out of order\", {\n\t\texpectedStart,\n\t\tactualStart,\n\t});\n}\n\n/**\n * See {@link IIdCompressor} and {@link IIdCompressorCore}\n */\n// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\nexport class IdCompressor implements IIdCompressor, IIdCompressorCore {\n\t/**\n\t * Max allowed initial cluster size.\n\t */\n\tpublic static readonly maxClusterSize = 2 ** 20;\n\n\t// #region Local state\n\n\tpublic readonly localSessionId: SessionId;\n\tprivate readonly localSession: Session;\n\tprivate readonly normalizer = new SessionSpaceNormalizer();\n\t// The number of IDs generated by the local session\n\tprivate localGenCount = 0;\n\n\t// #endregion\n\n\t// #region Final state\n\n\t/**\n\t * The gen count to be annotated on the range returned by the next call to `takeNextCreationRange`.\n\t * This is advanced to `generatedIdCount` + 1 each time it is called.\n\t * On the other hand, when `resetUnfinalizedCreationRange` is called,\n\t * this is moved back to the start of the unfinalized range, to ensure those IDs are included in the next range.\n\t */\n\tprivate nextRangeBaseGenCount = 1;\n\tprivate readonly sessions = new Sessions();\n\tprivate readonly finalSpace = new FinalSpace();\n\n\t// #endregion\n\n\t// #region Ephemeral state\n\n\t/**\n\t * Roughly equates to a minimum of 1M sessions before we start allocating 64 bit IDs.\n\t * Eventually, this can be adjusted dynamically to have cluster reservation policies that\n\t * optimize the number of eager finals.\n\t * It is not readonly as it is accessed by tests for clear-box testing.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/prefer-readonly\n\tprivate nextRequestedClusterSize: number = 512;\n\t// The number of local IDs generated since the last telemetry was sent.\n\tprivate telemetryLocalIdCount = 0;\n\t// The number of eager final IDs generated since the last telemetry was sent.\n\tprivate telemetryEagerFinalIdCount = 0;\n\t// The ongoing ghost session, if one exists.\n\tprivate ongoingGhostSession?: { cluster?: IdCluster; ghostSessionId: SessionId } | undefined;\n\n\t// #endregion\n\n\tpublic constructor(\n\t\tlocalSessionIdOrDeserialized: SessionId | Sessions,\n\t\tprivate readonly logger: ITelemetryLoggerExt | undefined,\n\t) {\n\t\tif (typeof localSessionIdOrDeserialized === \"string\") {\n\t\t\tthis.localSessionId = localSessionIdOrDeserialized;\n\t\t\tthis.localSession = this.sessions.getOrCreate(localSessionIdOrDeserialized);\n\t\t} else {\n\t\t\t// Deserialize case\n\t\t\tthis.sessions = localSessionIdOrDeserialized;\n\t\t\t// As policy, the first session is always the local session. Preserve this invariant\n\t\t\t// during deserialization.\n\t\t\tconst firstSession = localSessionIdOrDeserialized.sessions().next();\n\t\t\tassert(!firstSession.done, 0x754 /* First session must be present. */);\n\t\t\tthis.localSession = firstSession.value;\n\t\t\tthis.localSessionId = stableIdFromNumericUuid(\n\t\t\t\tthis.localSession.sessionUuid,\n\t\t\t) as SessionId;\n\t\t}\n\t}\n\n\tpublic generateCompressedId(): SessionSpaceCompressedId {\n\t\t// This ghost session code inside this block should not be changed without a version bump (it is performed at a consensus point)\n\t\tif (this.ongoingGhostSession) {\n\t\t\tif (this.ongoingGhostSession.cluster === undefined) {\n\t\t\t\tthis.ongoingGhostSession.cluster = this.addEmptyCluster(\n\t\t\t\t\tthis.sessions.getOrCreate(this.ongoingGhostSession.ghostSessionId),\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.ongoingGhostSession.cluster.capacity++;\n\t\t\t}\n\t\t\tthis.ongoingGhostSession.cluster.count++;\n\t\t\treturn lastFinalizedFinal(\n\t\t\t\tthis.ongoingGhostSession.cluster,\n\t\t\t) as unknown as SessionSpaceCompressedId;\n\t\t} else {\n\t\t\tthis.localGenCount++;\n\t\t\tconst lastCluster = this.localSession.getLastCluster();\n\t\t\tif (lastCluster === undefined) {\n\t\t\t\tthis.telemetryLocalIdCount++;\n\t\t\t\treturn this.generateNextLocalId();\n\t\t\t}\n\n\t\t\t// If there exists a cluster of final IDs already claimed by the local session that still has room in it,\n\t\t\t// it is known prior to range sequencing what a local ID's corresponding final ID will be.\n\t\t\t// In this case, it is safe to return the final ID immediately. This is guaranteed to be safe because\n\t\t\t// any op that the local session sends that contains one of those final IDs are guaranteed to arrive to\n\t\t\t// collaborators *after* the one containing the creation range.\n\t\t\tconst clusterOffset = this.localGenCount - genCountFromLocalId(lastCluster.baseLocalId);\n\t\t\tif (lastCluster.capacity > clusterOffset) {\n\t\t\t\tthis.telemetryEagerFinalIdCount++;\n\t\t\t\t// Space in the cluster: eager final\n\t\t\t\treturn ((lastCluster.baseFinalId as number) +\n\t\t\t\t\tclusterOffset) as SessionSpaceCompressedId;\n\t\t\t}\n\t\t\t// No space in the cluster, return next local\n\t\t\tthis.telemetryLocalIdCount++;\n\t\t\treturn this.generateNextLocalId();\n\t\t}\n\t}\n\n\tpublic generateDocumentUniqueId():\n\t\t| (SessionSpaceCompressedId & OpSpaceCompressedId)\n\t\t| StableId {\n\t\tconst id = this.generateCompressedId();\n\t\treturn isFinalId(id) ? id : this.decompress(id);\n\t}\n\n\t/**\n\t * Starts a ghost session. Only exposed for test purposes (this class is not exported from the package).\n\t * @param ghostSessionId - The session ID to start the ghost session with.\n\t */\n\tpublic startGhostSession(ghostSessionId: SessionId): void {\n\t\tassert(!this.ongoingGhostSession, 0x8fe /* Ghost session already in progress. */);\n\t\tthis.ongoingGhostSession = { ghostSessionId };\n\t}\n\n\t/**\n\t * {@inheritdoc IIdCompressorCore.beginGhostSession}\n\t */\n\tpublic beginGhostSession(ghostSessionId: SessionId, ghostSessionCallback: () => void): void {\n\t\tthis.startGhostSession(ghostSessionId);\n\t\ttry {\n\t\t\tghostSessionCallback();\n\t\t} finally {\n\t\t\tthis.ongoingGhostSession = undefined;\n\t\t}\n\t}\n\n\tprivate generateNextLocalId(): LocalCompressedId {\n\t\t// Must tell the normalizer that we generated a local ID\n\t\tthis.normalizer.addLocalRange(this.localGenCount, 1);\n\t\treturn localIdFromGenCount(this.localGenCount);\n\t}\n\n\tpublic takeNextCreationRange(): IdCreationRange {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a6 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst count = this.localGenCount - (this.nextRangeBaseGenCount - 1);\n\t\tif (count === 0) {\n\t\t\treturn {\n\t\t\t\tsessionId: this.localSessionId,\n\t\t\t};\n\t\t}\n\t\tconst range: IdCreationRange = {\n\t\t\tsessionId: this.localSessionId,\n\t\t\tids: {\n\t\t\t\tfirstGenCount: this.nextRangeBaseGenCount,\n\t\t\t\tcount,\n\t\t\t\trequestedClusterSize: this.nextRequestedClusterSize,\n\t\t\t\tlocalIdRanges: this.normalizer.getRangesBetween(\n\t\t\t\t\tthis.nextRangeBaseGenCount,\n\t\t\t\t\tthis.localGenCount,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t\treturn this.updateToRange(range);\n\t}\n\n\tpublic takeUnfinalizedCreationRange(): IdCreationRange {\n\t\tthis.resetUnfinalizedCreationRange();\n\t\treturn this.takeNextCreationRange();\n\t}\n\n\tpublic resetUnfinalizedCreationRange(): void {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0xcec /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\n\t\tconst lastLocalCluster = this.localSession.getLastCluster();\n\t\tthis.nextRangeBaseGenCount =\n\t\t\tlastLocalCluster === undefined\n\t\t\t\t? 1\n\t\t\t\t: genCountFromLocalId(\n\t\t\t\t\t\t(lastLocalCluster.baseLocalId - lastLocalCluster.count) as LocalCompressedId,\n\t\t\t\t\t);\n\t}\n\n\tprivate updateToRange(range: IdCreationRange): IdCreationRange {\n\t\tthis.nextRangeBaseGenCount = this.localGenCount + 1;\n\t\treturn IdCompressor.assertValidRange(range);\n\t}\n\n\tprivate static assertValidRange(range: IdCreationRange): IdCreationRange {\n\t\tif (range.ids === undefined) {\n\t\t\treturn range;\n\t\t}\n\t\tconst { count, requestedClusterSize } = range.ids;\n\t\tassert(count > 0, 0x755 /* Malformed ID Range. */);\n\t\tassert(requestedClusterSize > 0, 0x876 /* Clusters must have a positive capacity. */);\n\t\tassert(\n\t\t\trequestedClusterSize <= IdCompressor.maxClusterSize,\n\t\t\t0x877 /* Clusters must not exceed max cluster size. */,\n\t\t);\n\t\treturn range;\n\t}\n\n\tpublic finalizeCreationRange(range: IdCreationRange): void {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a7 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\t// Check if the range has IDs\n\t\tif (range.ids === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tIdCompressor.assertValidRange(range);\n\t\tconst { sessionId, ids } = range;\n\t\tconst { count, firstGenCount, requestedClusterSize } = ids;\n\t\tconst session = this.sessions.getOrCreate(sessionId);\n\t\tconst isLocal = session === this.localSession;\n\t\tconst rangeBaseLocal = localIdFromGenCount(firstGenCount);\n\t\tlet lastCluster = session.getLastCluster();\n\t\tif (lastCluster === undefined) {\n\t\t\t// This is the first cluster in the session space\n\t\t\tif (rangeBaseLocal !== -1) {\n\t\t\t\tthrow rangeFinalizationError(-1, rangeBaseLocal);\n\t\t\t}\n\t\t\tlastCluster = this.addEmptyCluster(session, requestedClusterSize + count);\n\t\t\tif (isLocal) {\n\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\teventName: \"RuntimeIdCompressor:FirstCluster\",\n\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst remainingCapacity = lastCluster.capacity - lastCluster.count;\n\t\tif (lastCluster.baseLocalId - lastCluster.count !== rangeBaseLocal) {\n\t\t\tthrow rangeFinalizationError(\n\t\t\t\tlastCluster.baseLocalId - lastCluster.count,\n\t\t\t\trangeBaseLocal,\n\t\t\t);\n\t\t}\n\n\t\tif (remainingCapacity >= count) {\n\t\t\t// The current range fits in the existing cluster\n\t\t\tlastCluster.count += count;\n\t\t} else {\n\t\t\tconst overflow = count - remainingCapacity;\n\t\t\tconst newClaimedFinalCount = overflow + requestedClusterSize;\n\t\t\tif (lastCluster === this.finalSpace.getLastCluster()) {\n\t\t\t\t// The last cluster in the sessions chain is the last cluster globally, so it can be expanded.\n\t\t\t\tlastCluster.capacity += newClaimedFinalCount;\n\t\t\t\tlastCluster.count += count;\n\t\t\t\tassert(\n\t\t\t\t\t!this.sessions.clusterCollides(lastCluster),\n\t\t\t\t\t0x756 /* Cluster collision detected. */,\n\t\t\t\t);\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"RuntimeIdCompressor:ClusterExpansion\",\n\t\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t\t\tpreviousCapacity: lastCluster.capacity - newClaimedFinalCount,\n\t\t\t\t\t\tnewCapacity: lastCluster.capacity,\n\t\t\t\t\t\toverflow,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// The last cluster in the sessions chain is *not* the last cluster globally. Fill and overflow to new.\n\t\t\t\tlastCluster.count = lastCluster.capacity;\n\t\t\t\tconst newCluster = this.addEmptyCluster(session, newClaimedFinalCount);\n\t\t\t\tnewCluster.count += overflow;\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"RuntimeIdCompressor:NewCluster\",\n\t\t\t\t\t\tsessionId: this.localSessionId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isLocal) {\n\t\t\tthis.logger?.sendTelemetryEvent({\n\t\t\t\teventName: \"RuntimeIdCompressor:IdCompressorStatus\",\n\t\t\t\teagerFinalIdCount: this.telemetryEagerFinalIdCount,\n\t\t\t\tlocalIdCount: this.telemetryLocalIdCount,\n\t\t\t\tsessionId: this.localSessionId,\n\t\t\t});\n\t\t\tthis.telemetryEagerFinalIdCount = 0;\n\t\t\tthis.telemetryLocalIdCount = 0;\n\t\t}\n\n\t\tassert(!session.isEmpty(), 0x757 /* Empty sessions should not be created. */);\n\t}\n\n\tprivate addEmptyCluster(session: Session, capacity: number): IdCluster {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession?.cluster,\n\t\t\t0x8a8 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst newCluster = session.addNewCluster(\n\t\t\tthis.finalSpace.getAllocatedIdLimit(),\n\t\t\tcapacity,\n\t\t\t0,\n\t\t);\n\t\tassert(\n\t\t\t!this.sessions.clusterCollides(newCluster),\n\t\t\t0x758 /* Cluster collision detected. */,\n\t\t);\n\t\tthis.finalSpace.addCluster(newCluster);\n\t\treturn newCluster;\n\t}\n\n\tpublic normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId {\n\t\tif (isFinalId(id)) {\n\t\t\treturn id;\n\t\t} else {\n\t\t\tconst local = id as unknown as LocalCompressedId;\n\t\t\tif (!this.normalizer.contains(local)) {\n\t\t\t\tthrow new Error(\"Invalid ID to normalize.\");\n\t\t\t}\n\t\t\tconst finalForm = this.localSession.tryConvertToFinal(local, true);\n\t\t\treturn finalForm === undefined\n\t\t\t\t? (local as unknown as OpSpaceCompressedId)\n\t\t\t\t: (finalForm as OpSpaceCompressedId);\n\t\t}\n\t}\n\n\tpublic normalizeToSessionSpace(\n\t\tid: OpSpaceCompressedId,\n\t\toriginSessionId: SessionId,\n\t): SessionSpaceCompressedId {\n\t\tif (isFinalId(id)) {\n\t\t\tconst containingCluster = this.localSession.getClusterByAllocatedFinal(id);\n\t\t\tif (containingCluster === undefined) {\n\t\t\t\t// Does not exist in local cluster chain\n\t\t\t\tif (id >= this.finalSpace.getFinalizedIdLimit()) {\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t\treturn id as unknown as SessionSpaceCompressedId;\n\t\t\t} else {\n\t\t\t\tconst alignedLocal = getAlignedLocal(containingCluster, id);\n\t\t\t\tif (this.normalizer.contains(alignedLocal)) {\n\t\t\t\t\treturn alignedLocal;\n\t\t\t\t} else {\n\t\t\t\t\tif (genCountFromLocalId(alignedLocal) > this.localGenCount) {\n\t\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t\t}\n\t\t\t\t\treturn id as unknown as SessionSpaceCompressedId;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst localToNormalize = id as unknown as LocalCompressedId;\n\t\t\tif (originSessionId === this.localSessionId) {\n\t\t\t\tif (this.normalizer.contains(localToNormalize)) {\n\t\t\t\t\treturn localToNormalize;\n\t\t\t\t} else {\n\t\t\t\t\t// We never generated this local ID, so fail\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// LocalId from a remote session\n\t\t\t\tconst remoteSession = this.sessions.get(originSessionId);\n\t\t\t\tif (remoteSession === undefined) {\n\t\t\t\t\tthrow new Error(\"No IDs have ever been finalized by the supplied session.\");\n\t\t\t\t}\n\t\t\t\tconst correspondingFinal = remoteSession.tryConvertToFinal(localToNormalize, false);\n\t\t\t\tif (correspondingFinal === undefined) {\n\t\t\t\t\tthrow new Error(\"Unknown op space ID.\");\n\t\t\t\t}\n\t\t\t\treturn correspondingFinal as unknown as SessionSpaceCompressedId;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic decompress(id: SessionSpaceCompressedId): StableId {\n\t\tif (isFinalId(id)) {\n\t\t\tconst containingCluster = Session.getContainingCluster(id, this.finalSpace.clusters);\n\t\t\tif (containingCluster === undefined) {\n\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t}\n\t\t\tconst alignedLocal = getAlignedLocal(containingCluster, id);\n\t\t\tconst alignedGenCount = genCountFromLocalId(alignedLocal);\n\t\t\tconst lastFinalizedGenCount = genCountFromLocalId(lastFinalizedLocal(containingCluster));\n\t\t\tif (alignedGenCount > lastFinalizedGenCount) {\n\t\t\t\t// should be an eager final id generated by the local session\n\t\t\t\tif (containingCluster.session === this.localSession) {\n\t\t\t\t\tassert(!this.normalizer.contains(alignedLocal), 0x759 /* Normalizer out of sync. */);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stableIdFromNumericUuid(\n\t\t\t\toffsetNumericUuid(containingCluster.session.sessionUuid, alignedGenCount - 1),\n\t\t\t);\n\t\t} else {\n\t\t\tconst localToDecompress = id as unknown as LocalCompressedId;\n\t\t\tif (!this.normalizer.contains(localToDecompress)) {\n\t\t\t\tthrow new Error(\"Unknown ID\");\n\t\t\t}\n\t\t\treturn stableIdFromNumericUuid(\n\t\t\t\toffsetNumericUuid(\n\t\t\t\t\tthis.localSession.sessionUuid,\n\t\t\t\t\tgenCountFromLocalId(localToDecompress) - 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic recompress(uncompressed: StableId): SessionSpaceCompressedId {\n\t\tconst recompressed = this.tryRecompress(uncompressed);\n\t\tif (recompressed === undefined) {\n\t\t\tthrow new Error(\"Could not recompress.\");\n\t\t}\n\t\treturn recompressed;\n\t}\n\n\tpublic tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined {\n\t\tconst match = this.sessions.getContainingCluster(uncompressed);\n\t\tif (match === undefined) {\n\t\t\tconst numericUncompressed = numericUuidFromStableId(uncompressed);\n\t\t\tconst offset = subtractNumericUuids(numericUncompressed, this.localSession.sessionUuid);\n\t\t\tif (offset < Number.MAX_SAFE_INTEGER) {\n\t\t\t\tconst genCountEquivalent = Number(offset) + 1;\n\t\t\t\tconst localEquivalent = localIdFromGenCount(genCountEquivalent);\n\t\t\t\tif (this.normalizer.contains(localEquivalent)) {\n\t\t\t\t\treturn localEquivalent;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tconst [containingCluster, alignedLocal] = match;\n\t\t\tif (containingCluster.session === this.localSession) {\n\t\t\t\t// Local session\n\t\t\t\tif (this.normalizer.contains(alignedLocal)) {\n\t\t\t\t\treturn alignedLocal;\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tgenCountFromLocalId(alignedLocal) <= this.localGenCount,\n\t\t\t\t\t\t0x75a /* Clusters out of sync. */,\n\t\t\t\t\t);\n\t\t\t\t\t// Id is an eager final\n\t\t\t\t\treturn getAlignedFinal(containingCluster, alignedLocal) as\n\t\t\t\t\t\t| SessionSpaceCompressedId\n\t\t\t\t\t\t| undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Not the local session\n\t\t\t\treturn genCountFromLocalId(alignedLocal) >= lastFinalizedLocal(containingCluster)\n\t\t\t\t\t? (getAlignedFinal(containingCluster, alignedLocal) as\n\t\t\t\t\t\t\t| SessionSpaceCompressedId\n\t\t\t\t\t\t\t| undefined)\n\t\t\t\t\t: undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic serialize(withSession: true): SerializedIdCompressorWithOngoingSession;\n\tpublic serialize(withSession: false): SerializedIdCompressorWithNoSession;\n\tpublic serialize(hasLocalState: boolean): SerializedIdCompressor {\n\t\tassert(\n\t\t\t!this.ongoingGhostSession,\n\t\t\t0x8a9 /* IdCompressor should not be operated normally when in a ghost session */,\n\t\t);\n\t\tconst { normalizer, finalSpace, sessions, localGenCount, logger, nextRangeBaseGenCount } =\n\t\t\tthis;\n\t\tconst sessionIndexMap = new Map<Session, number>();\n\t\tlet sessionIndex = 0;\n\t\tfor (const session of sessions.sessions()) {\n\t\t\t// Filter empty sessions to prevent them accumulating in the serialized state\n\t\t\tif (!session.isEmpty() || hasLocalState) {\n\t\t\t\tsessionIndexMap.set(session, sessionIndex);\n\t\t\t\tsessionIndex++;\n\t\t\t}\n\t\t}\n\t\tconst localStateSize = hasLocalState\n\t\t\t? 1 + // generated ID count\n\t\t\t\t1 + // next range base genCount\n\t\t\t\t1 + // count of normalizer pairs\n\t\t\t\tnormalizer.idRanges.size * 2 // pairs\n\t\t\t: 0;\n\t\t// Layout size, in 8 byte increments\n\t\tconst totalSize =\n\t\t\t1 + // version\n\t\t\t1 + // hasLocalState\n\t\t\t1 + // session count\n\t\t\t1 + // cluster count\n\t\t\tsessionIndexMap.size * 2 + // session IDs\n\t\t\tfinalSpace.clusters.length * 3 + // clusters: (sessionIndex, capacity, count)[]\n\t\t\tlocalStateSize; // local state, if present\n\n\t\tconst serializedFloat = new Float64Array(totalSize);\n\t\tconst serializedUint = new BigUint64Array(serializedFloat.buffer);\n\t\tlet index = 0;\n\t\tindex = writeNumber(serializedFloat, index, currentWrittenVersion);\n\t\tindex = writeBoolean(serializedFloat, index, hasLocalState);\n\t\tindex = writeNumber(serializedFloat, index, sessionIndexMap.size);\n\t\tindex = writeNumber(serializedFloat, index, finalSpace.clusters.length);\n\n\t\tfor (const [session] of sessionIndexMap.entries()) {\n\t\t\tindex = writeNumericUuid(serializedUint, index, session.sessionUuid);\n\t\t}\n\n\t\tfor (const cluster of finalSpace.clusters) {\n\t\t\tindex = writeNumber(\n\t\t\t\tserializedFloat,\n\t\t\t\tindex,\n\t\t\t\tsessionIndexMap.get(cluster.session) as number,\n\t\t\t);\n\t\t\tindex = writeNumber(serializedFloat, index, cluster.capacity);\n\t\t\tindex = writeNumber(serializedFloat, index, cluster.count);\n\t\t}\n\n\t\tif (hasLocalState) {\n\t\t\tindex = writeNumber(serializedFloat, index, localGenCount);\n\t\t\tindex = writeNumber(serializedFloat, index, nextRangeBaseGenCount);\n\t\t\tindex = writeNumber(serializedFloat, index, normalizer.idRanges.size);\n\t\t\tfor (const [leadingGenCount, count] of normalizer.idRanges.entries()) {\n\t\t\t\tindex = writeNumber(serializedFloat, index, leadingGenCount);\n\t\t\t\tindex = writeNumber(serializedFloat, index, count);\n\t\t\t}\n\t\t}\n\n\t\tassert(index === totalSize, 0x75b /* Serialized size was incorrectly calculated. */);\n\t\tlogger?.sendTelemetryEvent({\n\t\t\teventName: \"RuntimeIdCompressor:SerializedIdCompressorSize\",\n\t\t\tsize: serializedFloat.byteLength,\n\t\t\tclusterCount: finalSpace.clusters.length,\n\t\t\tsessionCount: sessionIndexMap.size,\n\t\t});\n\n\t\treturn bufferToString(serializedFloat.buffer, \"base64\") as SerializedIdCompressor;\n\t}\n\n\tpublic static deserialize(\n\t\tparams:\n\t\t\t| {\n\t\t\t\t\tserialized: SerializedIdCompressorWithOngoingSession;\n\t\t\t\t\tlogger?: ITelemetryLoggerExt | undefined;\n\t\t\t\t\tnewSessionId?: never;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tserialized: SerializedIdCompressorWithNoSession;\n\t\t\t\t\tnewSessionId: SessionId;\n\t\t\t\t\tlogger?: ITelemetryLoggerExt | undefined;\n\t\t\t },\n\t): IdCompressor {\n\t\tconst { serialized, newSessionId, logger } = params;\n\t\tconst buffer = stringToBuffer(serialized, \"base64\");\n\t\tconst index: Index = {\n\t\t\tindex: 0,\n\t\t\tbufferFloat: new Float64Array(buffer),\n\t\t\tbufferUint: new BigUint64Array(buffer),\n\t\t};\n\t\tconst version = readNumber(index);\n\t\tswitch (version) {\n\t\t\tcase 1: {\n\t\t\t\tthrow new Error(\"IdCompressor version 1.0 is no longer supported.\");\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\treturn IdCompressor.deserialize2_0(index, newSessionId, logger);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(\"Unknown IdCompressor serialized version.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic deserialize2_0(\n\t\tindex: Index,\n\t\tsessionId: SessionId | undefined,\n\t\tlogger: ITelemetryLoggerExt | undefined,\n\t): IdCompressor {\n\t\tconst hasLocalState = readBoolean(index);\n\t\tconst sessionCount = readNumber(index);\n\t\tconst clusterCount = readNumber(index);\n\n\t\t// Sessions\n\t\tlet sessionOffset = 0;\n\t\tconst sessions: [NumericUuid, Session][] = [];\n\t\tif (hasLocalState) {\n\t\t\tassert(\n\t\t\t\tsessionId === undefined,\n\t\t\t\t0x75e /* Local state should not exist in serialized form. */,\n\t\t\t);\n\t\t} else {\n\t\t\t// If !hasLocalState, there won't be a serialized local session ID so insert one at the beginning\n\t\t\tassert(sessionId !== undefined, 0x75d /* Local session ID is undefined. */);\n\t\t\tconst localSessionNumeric = numericUuidFromStableId(sessionId);\n\t\t\tsessions.push([localSessionNumeric, new Session(localSessionNumeric)]);\n\t\t\tsessionOffset = 1;\n\t\t}\n\n\t\tfor (let i = 0; i < sessionCount; i++) {\n\t\t\tconst numeric = readNumericUuid(index);\n\t\t\tsessions.push([numeric, new Session(numeric)]);\n\t\t}\n\n\t\tconst compressor = new IdCompressor(new Sessions(sessions), logger);\n\n\t\t// Clusters\n\t\tlet baseFinalId = 0;\n\t\tfor (let i = 0; i < clusterCount; i++) {\n\t\t\tconst sessionIndex = readNumber(index);\n\t\t\tconst sessionArray = sessions[sessionIndex + sessionOffset];\n\t\t\tassert(\n\t\t\t\tsessionArray !== undefined,\n\t\t\t\t0x9d8 /* sessionArray is undefined in IdCompressor.deserialize2_0 */,\n\t\t\t);\n\t\t\tconst session = sessionArray[1];\n\t\t\tconst capacity = readNumber(index);\n\t\t\tconst count = readNumber(index);\n\t\t\tconst cluster = session.addNewCluster(baseFinalId as FinalCompressedId, capacity, count);\n\t\t\tcompressor.finalSpace.addCluster(cluster);\n\t\t\tbaseFinalId += capacity;\n\t\t}\n\n\t\t// Local state\n\t\tif (hasLocalState) {\n\t\t\tcompressor.localGenCount = readNumber(index);\n\t\t\tcompressor.nextRangeBaseGenCount = readNumber(index);\n\t\t\tconst normalizerCount = readNumber(index);\n\t\t\tfor (let i = 0; i < normalizerCount; i++) {\n\t\t\t\tcompressor.normalizer.addLocalRange(readNumber(index), readNumber(index));\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tindex.index === index.bufferFloat.length,\n\t\t\t0x75f /* Failed to read entire serialized compressor. */,\n\t\t);\n\t\treturn compressor;\n\t}\n\n\tpublic equals(other: IdCompressor, includeLocalState: boolean): boolean {\n\t\tif (\n\t\t\tincludeLocalState &&\n\t\t\t(this.localSessionId !== other.localSessionId ||\n\t\t\t\t!this.localSession.equals(other.localSession) ||\n\t\t\t\t!this.normalizer.equals(other.normalizer) ||\n\t\t\t\tthis.nextRangeBaseGenCount !== other.nextRangeBaseGenCount ||\n\t\t\t\tthis.localGenCount !== other.localGenCount)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tthis.sessions.equals(other.sessions, includeLocalState) &&\n\t\t\tthis.finalSpace.equals(other.finalSpace)\n\t\t);\n\t}\n}\n\n/**\n * Create a new {@link IIdCompressor}.\n *\n * @remarks\n * The returned compressor previously also implemented {@link IIdCompressorCore}, but that\n * interface is {@link IIdCompressorCore | deprecated} and will be removed from the return\n * type in a future release. Consumers should type variables as {@link IIdCompressor} and\n * use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.\n *\n * @legacy @beta\n */\nexport function createIdCompressor(\n\tlogger?: ITelemetryBaseLogger,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore;\n/**\n * Create a new {@link IIdCompressor}.\n * @param sessionId - The seed ID for the compressor.\n *\n * @remarks\n * The returned compressor previously also implemented {@link IIdCompressorCore}, but that\n * interface is {@link IIdCompressorCore | deprecated} and will be removed from the return\n * type in a future release. Consumers should type variables as {@link IIdCompressor} and\n * use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.\n *\n * @legacy @beta\n */\nexport function createIdCompressor(\n\tsessionId: SessionId,\n\tlogger?: ITelemetryBaseLogger,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore;\nexport function createIdCompressor(\n\tsessionIdOrLogger?: SessionId | ITelemetryBaseLogger,\n\tloggerOrUndefined?: ITelemetryBaseLogger,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore {\n\tlet localSessionId: SessionId;\n\tlet logger: ITelemetryBaseLogger | undefined;\n\tif (sessionIdOrLogger === undefined) {\n\t\tlocalSessionId = createSessionId();\n\t} else {\n\t\tif (typeof sessionIdOrLogger === \"string\") {\n\t\t\tlocalSessionId = sessionIdOrLogger;\n\t\t\tlogger = loggerOrUndefined;\n\t\t} else {\n\t\t\tlocalSessionId = createSessionId();\n\t\t\tlogger = sessionIdOrLogger;\n\t\t}\n\t}\n\tconst compressor = new IdCompressor(\n\t\tlocalSessionId,\n\t\tlogger === undefined ? undefined : createChildLogger({ logger }),\n\t);\n\treturn compressor;\n}\n\n/**\n * Deserializes the supplied state into an ID compressor.\n *\n * @remarks\n * The returned compressor previously also implemented {@link IIdCompressorCore}, but that\n * interface is {@link IIdCompressorCore | deprecated} and will be removed from the return\n * type in a future release. Consumers should type variables as {@link IIdCompressor} and\n * use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.\n *\n * @legacy @beta\n */\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressorWithOngoingSession,\n\tlogger?: ITelemetryLoggerExt,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore;\n/**\n * Deserializes the supplied state into an ID compressor.\n *\n * @remarks\n * The returned compressor previously also implemented {@link IIdCompressorCore}, but that\n * interface is {@link IIdCompressorCore | deprecated} and will be removed from the return\n * type in a future release. Consumers should type variables as {@link IIdCompressor} and\n * use {@link (serializeIdCompressor:1)} for serialization instead of calling `serialize()` directly.\n *\n * @legacy @beta\n */\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressorWithNoSession,\n\tnewSessionId: SessionId,\n\tlogger?: ITelemetryLoggerExt,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore;\nexport function deserializeIdCompressor(\n\tserialized: SerializedIdCompressor | SerializedIdCompressorWithNoSession,\n\tsessionIdOrLogger: SessionId | ITelemetryLoggerExt | undefined,\n\tloggerOrUndefined?: ITelemetryLoggerExt,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore {\n\tif (typeof sessionIdOrLogger === \"string\") {\n\t\treturn IdCompressor.deserialize({\n\t\t\tserialized: serialized as SerializedIdCompressorWithNoSession,\n\t\t\tlogger: loggerOrUndefined,\n\t\t\tnewSessionId: sessionIdOrLogger,\n\t\t});\n\t}\n\n\tassert(\n\t\tloggerOrUndefined === undefined,\n\t\t0xc2d /* logger would be in sessionIdOrLogger in this codepath */,\n\t);\n\treturn IdCompressor.deserialize({\n\t\tserialized: serialized as SerializedIdCompressorWithOngoingSession,\n\t\tlogger: sessionIdOrLogger,\n\t});\n}\n\n/**\n * Serializes an ID compressor.\n * @param compressor - The compressor to serialize.\n * @param withSession - If true, the serialized state will include local session\n * state (for stashing). If false, only finalized state is included (for summaries).\n * @legacy @beta\n */\nexport function serializeIdCompressor(\n\tcompressor: IIdCompressor,\n\twithSession: true,\n): SerializedIdCompressorWithOngoingSession;\n/**\n * Serializes an ID compressor.\n * @param compressor - The compressor to serialize.\n * @param withSession - If true, the serialized state will include local session\n * state (for stashing). If false, only finalized state is included (for summaries).\n * @legacy @beta\n */\nexport function serializeIdCompressor(\n\tcompressor: IIdCompressor,\n\twithSession: false,\n): SerializedIdCompressorWithNoSession;\nexport function serializeIdCompressor(\n\tcompressor: IIdCompressor,\n\twithSession: boolean,\n): SerializedIdCompressorWithOngoingSession | SerializedIdCompressorWithNoSession {\n\tconst core = toIdCompressorWithCore(compressor);\n\treturn withSession ? core.serialize(true) : core.serialize(false);\n}\n\n/**\n * Casts an {@link IIdCompressor} to include {@link IIdCompressorCore}.\n *\n * @remarks\n * Compressors returned by `createIdCompressor` and `deserializeIdCompressor`\n * always implement both {@link IIdCompressor} and {@link IIdCompressorCore}, but their\n * return types will be narrowed to {@link IIdCompressor} to keep {@link IIdCompressorCore}\n * out of the `@legacy` API surface. Internal consumers that need access to core\n * compressor operations (serialization, range management, etc.) should use this function.\n *\n * @param compressor - A compressor created by `createIdCompressor` or\n * `deserializeIdCompressor`.\n * @returns The same compressor, typed to include {@link IIdCompressorCore}.\n * @internal\n */\nexport function toIdCompressorWithCore(\n\tcompressor: IIdCompressor,\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n): IIdCompressor & IIdCompressorCore {\n\tassert(\n\t\t\"serialize\" in compressor,\n\t\t0xced /* Expected compressor to implement IIdCompressorCore */,\n\t);\n\t// eslint-disable-next-line import-x/no-deprecated -- Will be undeprecated in 2.100.0 when it becomes an internal API\n\treturn compressor as IIdCompressor & IIdCompressorCore;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Exports for `id-compressor`
|
|
7
7
|
*/
|
|
8
|
-
export { createIdCompressor, deserializeIdCompressor } from "./idCompressor.js";
|
|
8
|
+
export { createIdCompressor, deserializeIdCompressor, serializeIdCompressor, toIdCompressorWithCore, } from "./idCompressor.js";
|
|
9
9
|
export { createSessionId, assertIsStableId, generateStableId, isStableId, } from "./utilities.js";
|
|
10
10
|
export type { IIdCompressorCore, IIdCompressor, SerializedIdCompressor, SerializedIdCompressorWithOngoingSession, SerializedIdCompressorWithNoSession, SessionSpaceCompressedId, OpSpaceCompressedId, SessionId, StableId, IdCreationRange, } from "./types/index.js";
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EACN,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACV,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,wCAAwC,EACxC,mCAAmC,EACnC,wBAAwB,EACxB,mBAAmB,EACnB,SAAS,EACT,QAAQ,EACR,eAAe,GACf,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.isStableId = exports.generateStableId = exports.assertIsStableId = exports.createSessionId = exports.deserializeIdCompressor = exports.createIdCompressor = void 0;
|
|
7
|
+
exports.isStableId = exports.generateStableId = exports.assertIsStableId = exports.createSessionId = exports.toIdCompressorWithCore = exports.serializeIdCompressor = exports.deserializeIdCompressor = exports.createIdCompressor = void 0;
|
|
8
8
|
/**
|
|
9
9
|
* Exports for `id-compressor`
|
|
10
10
|
*/
|
|
11
11
|
var idCompressor_js_1 = require("./idCompressor.js");
|
|
12
12
|
Object.defineProperty(exports, "createIdCompressor", { enumerable: true, get: function () { return idCompressor_js_1.createIdCompressor; } });
|
|
13
13
|
Object.defineProperty(exports, "deserializeIdCompressor", { enumerable: true, get: function () { return idCompressor_js_1.deserializeIdCompressor; } });
|
|
14
|
+
Object.defineProperty(exports, "serializeIdCompressor", { enumerable: true, get: function () { return idCompressor_js_1.serializeIdCompressor; } });
|
|
15
|
+
Object.defineProperty(exports, "toIdCompressorWithCore", { enumerable: true, get: function () { return idCompressor_js_1.toIdCompressorWithCore; } });
|
|
14
16
|
var utilities_js_1 = require("./utilities.js");
|
|
15
17
|
Object.defineProperty(exports, "createSessionId", { enumerable: true, get: function () { return utilities_js_1.createSessionId; } });
|
|
16
18
|
Object.defineProperty(exports, "assertIsStableId", { enumerable: true, get: function () { return utilities_js_1.assertIsStableId; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;GAEG;AAEH,qDAK2B;AAJ1B,qHAAA,kBAAkB,OAAA;AAClB,0HAAA,uBAAuB,OAAA;AACvB,wHAAA,qBAAqB,OAAA;AACrB,yHAAA,sBAAsB,OAAA;AAEvB,+CAKwB;AAJvB,+GAAA,eAAe,OAAA;AACf,gHAAA,gBAAgB,OAAA;AAChB,gHAAA,gBAAgB,OAAA;AAChB,0GAAA,UAAU,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Exports for `id-compressor`\n */\n\nexport {\n\tcreateIdCompressor,\n\tdeserializeIdCompressor,\n\tserializeIdCompressor,\n\ttoIdCompressorWithCore,\n} from \"./idCompressor.js\";\nexport {\n\tcreateSessionId,\n\tassertIsStableId,\n\tgenerateStableId,\n\tisStableId,\n} from \"./utilities.js\";\nexport type {\n\tIIdCompressorCore,\n\tIIdCompressor,\n\tSerializedIdCompressor,\n\tSerializedIdCompressorWithOngoingSession,\n\tSerializedIdCompressorWithNoSession,\n\tSessionSpaceCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n\tStableId,\n\tIdCreationRange,\n} from \"./types/index.js\";\n"]}
|
package/dist/legacy.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints" in @fluid-tools/build-cli.
|
|
8
|
+
* Generated by "flub generate entrypoints --resolutionConditions require --outFileLegacyBeta legacy --outDir ./dist" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {
|
|
@@ -25,6 +25,7 @@ export {
|
|
|
25
25
|
SerializedIdCompressorWithOngoingSession,
|
|
26
26
|
createIdCompressor,
|
|
27
27
|
createSessionId,
|
|
28
|
-
deserializeIdCompressor
|
|
28
|
+
deserializeIdCompressor,
|
|
29
|
+
serializeIdCompressor
|
|
29
30
|
// #endregion
|
|
30
31
|
} from "./index.js";
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/id-compressor";
|
|
8
|
-
export declare const pkgVersion = "2.
|
|
8
|
+
export declare const pkgVersion = "2.92.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/id-compressor";
|
|
11
|
-
exports.pkgVersion = "2.
|
|
11
|
+
exports.pkgVersion = "2.92.0";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/id-compressor\";\nexport const pkgVersion = \"2.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/id-compressor\";\nexport const pkgVersion = \"2.92.0\";\n"]}
|
package/dist/public.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints" in @fluid-tools/build-cli.
|
|
8
|
+
* Generated by "flub generate entrypoints --resolutionConditions require --outFileLegacyBeta legacy --outDir ./dist" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {
|