@fluidframework/id-compressor 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.245554

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 (263) hide show
  1. package/.eslintrc.cjs +5 -5
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/id-compressor.api.md +2 -2
  8. package/dist/finalSpace.d.ts +2 -2
  9. package/dist/finalSpace.d.ts.map +1 -1
  10. package/dist/finalSpace.js +4 -4
  11. package/dist/finalSpace.js.map +1 -1
  12. package/dist/id-compressor-alpha.d.ts +114 -47
  13. package/dist/id-compressor-beta.d.ts +83 -75
  14. package/dist/id-compressor-public.d.ts +83 -75
  15. package/dist/id-compressor-untrimmed.d.ts +114 -47
  16. package/dist/idCompressor.d.ts +9 -3
  17. package/dist/idCompressor.d.ts.map +1 -1
  18. package/dist/idCompressor.js +76 -64
  19. package/dist/idCompressor.js.map +1 -1
  20. package/dist/identifiers.d.ts +1 -1
  21. package/dist/identifiers.d.ts.map +1 -1
  22. package/dist/identifiers.js.map +1 -1
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +8 -8
  26. package/dist/index.js.map +1 -1
  27. package/dist/package.json +3 -0
  28. package/dist/packageVersion.d.ts +1 -1
  29. package/dist/packageVersion.js +1 -1
  30. package/dist/packageVersion.js.map +1 -1
  31. package/dist/persistanceUtilities.d.ts +1 -1
  32. package/dist/persistanceUtilities.d.ts.map +1 -1
  33. package/dist/persistanceUtilities.js.map +1 -1
  34. package/dist/sessionSpaceNormalizer.d.ts +2 -2
  35. package/dist/sessionSpaceNormalizer.d.ts.map +1 -1
  36. package/dist/sessionSpaceNormalizer.js +4 -4
  37. package/dist/sessionSpaceNormalizer.js.map +1 -1
  38. package/dist/sessions.d.ts +2 -2
  39. package/dist/sessions.d.ts.map +1 -1
  40. package/dist/sessions.js +12 -12
  41. package/dist/sessions.js.map +1 -1
  42. package/dist/test/appendOnlySortedMap.perf.spec.d.ts +6 -0
  43. package/dist/test/appendOnlySortedMap.perf.spec.d.ts.map +1 -0
  44. package/dist/test/appendOnlySortedMap.perf.spec.js.map +1 -0
  45. package/dist/test/appendOnlySortedMap.spec.d.ts +6 -0
  46. package/dist/test/appendOnlySortedMap.spec.d.ts.map +1 -0
  47. package/dist/test/appendOnlySortedMap.spec.js.map +1 -0
  48. package/dist/test/idCompressor.perf.spec.d.ts +6 -0
  49. package/dist/test/idCompressor.perf.spec.d.ts.map +1 -0
  50. package/dist/test/idCompressor.perf.spec.js.map +1 -0
  51. package/dist/test/idCompressor.spec.d.ts +6 -0
  52. package/dist/test/idCompressor.spec.d.ts.map +1 -0
  53. package/dist/test/idCompressor.spec.js.map +1 -0
  54. package/dist/test/idCompressorTestUtilities.d.ts +245 -0
  55. package/dist/test/idCompressorTestUtilities.d.ts.map +1 -0
  56. package/dist/test/idCompressorTestUtilities.js +589 -0
  57. package/dist/test/idCompressorTestUtilities.js.map +1 -0
  58. package/dist/test/index.d.ts +9 -0
  59. package/dist/test/index.d.ts.map +1 -0
  60. package/dist/test/index.js +13 -0
  61. package/dist/test/index.js.map +1 -0
  62. package/dist/test/numericUuid.spec.d.ts +6 -0
  63. package/dist/test/numericUuid.spec.d.ts.map +1 -0
  64. package/dist/test/numericUuid.spec.js.map +1 -0
  65. package/dist/test/sessionSpaceNormalizer.spec.d.ts +6 -0
  66. package/dist/test/sessionSpaceNormalizer.spec.d.ts.map +1 -0
  67. package/dist/test/sessionSpaceNormalizer.spec.js.map +1 -0
  68. package/dist/test/snapshots/dirname.cjs +16 -0
  69. package/dist/test/snapshots/dirname.cjs.map +1 -0
  70. package/dist/test/snapshots/dirname.d.cts +6 -0
  71. package/dist/test/snapshots/dirname.d.cts.map +1 -0
  72. package/{lib/types/idCompressor.mjs → dist/test/snapshots/summary.spec.d.ts} +1 -1
  73. package/dist/test/snapshots/summary.spec.d.ts.map +1 -0
  74. package/dist/test/snapshots/summary.spec.js.map +1 -0
  75. package/dist/test/testCommon.d.ts +90 -0
  76. package/dist/test/testCommon.d.ts.map +1 -0
  77. package/dist/test/testCommon.js +90 -0
  78. package/dist/test/testCommon.js.map +1 -0
  79. package/dist/tsdoc-metadata.json +1 -1
  80. package/dist/types/idCompressor.d.ts +134 -67
  81. package/dist/types/idCompressor.d.ts.map +1 -1
  82. package/dist/types/idCompressor.js.map +1 -1
  83. package/dist/types/index.d.ts +3 -3
  84. package/dist/types/index.d.ts.map +1 -1
  85. package/dist/types/index.js.map +1 -1
  86. package/dist/types/persisted-types/0.0.1.d.ts +1 -1
  87. package/dist/types/persisted-types/0.0.1.d.ts.map +1 -1
  88. package/dist/types/persisted-types/0.0.1.js.map +1 -1
  89. package/dist/types/persisted-types/index.d.ts +1 -1
  90. package/dist/types/persisted-types/index.d.ts.map +1 -1
  91. package/dist/types/persisted-types/index.js.map +1 -1
  92. package/dist/utilities.d.ts +2 -2
  93. package/dist/utilities.d.ts.map +1 -1
  94. package/dist/utilities.js.map +1 -1
  95. package/lib/{appendOnlySortedMap.d.mts → appendOnlySortedMap.d.ts} +1 -1
  96. package/lib/appendOnlySortedMap.d.ts.map +1 -0
  97. package/lib/{appendOnlySortedMap.mjs → appendOnlySortedMap.js} +3 -1
  98. package/lib/appendOnlySortedMap.js.map +1 -0
  99. package/lib/{finalSpace.d.mts → finalSpace.d.ts} +3 -3
  100. package/lib/finalSpace.d.ts.map +1 -0
  101. package/lib/{finalSpace.mjs → finalSpace.js} +2 -2
  102. package/lib/finalSpace.js.map +1 -0
  103. package/lib/{id-compressor-alpha.d.mts → id-compressor-alpha.d.ts} +114 -47
  104. package/lib/id-compressor-beta.d.ts +179 -0
  105. package/lib/id-compressor-public.d.ts +179 -0
  106. package/lib/{id-compressor-untrimmed.d.mts → id-compressor-untrimmed.d.ts} +114 -47
  107. package/lib/{idCompressor.d.mts → idCompressor.d.ts} +10 -4
  108. package/lib/idCompressor.d.ts.map +1 -0
  109. package/lib/{idCompressor.mjs → idCompressor.js} +20 -8
  110. package/lib/idCompressor.js.map +1 -0
  111. package/lib/{identifiers.d.mts → identifiers.d.ts} +2 -2
  112. package/lib/identifiers.d.ts.map +1 -0
  113. package/lib/{identifiers.mjs → identifiers.js} +1 -1
  114. package/lib/identifiers.js.map +1 -0
  115. package/lib/{index.d.mts → index.d.ts} +7 -4
  116. package/lib/index.d.ts.map +1 -0
  117. package/lib/{index.mjs → index.js} +6 -3
  118. package/lib/index.js.map +1 -0
  119. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  120. package/lib/packageVersion.d.ts.map +1 -0
  121. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  122. package/lib/packageVersion.js.map +1 -0
  123. package/lib/{persistanceUtilities.d.mts → persistanceUtilities.d.ts} +2 -2
  124. package/lib/persistanceUtilities.d.ts.map +1 -0
  125. package/lib/{persistanceUtilities.mjs → persistanceUtilities.js} +1 -1
  126. package/lib/persistanceUtilities.js.map +1 -0
  127. package/lib/{sessionSpaceNormalizer.d.mts → sessionSpaceNormalizer.d.ts} +3 -3
  128. package/lib/sessionSpaceNormalizer.d.ts.map +1 -0
  129. package/lib/{sessionSpaceNormalizer.mjs → sessionSpaceNormalizer.js} +3 -3
  130. package/lib/sessionSpaceNormalizer.js.map +1 -0
  131. package/lib/{sessions.d.mts → sessions.d.ts} +3 -3
  132. package/lib/sessions.d.ts.map +1 -0
  133. package/lib/{sessions.mjs → sessions.js} +2 -2
  134. package/lib/sessions.js.map +1 -0
  135. package/lib/test/appendOnlySortedMap.perf.spec.d.ts +6 -0
  136. package/lib/test/appendOnlySortedMap.perf.spec.d.ts.map +1 -0
  137. package/lib/test/appendOnlySortedMap.perf.spec.js +49 -0
  138. package/lib/test/appendOnlySortedMap.perf.spec.js.map +1 -0
  139. package/lib/test/appendOnlySortedMap.spec.d.ts +6 -0
  140. package/lib/test/appendOnlySortedMap.spec.d.ts.map +1 -0
  141. package/lib/test/appendOnlySortedMap.spec.js +166 -0
  142. package/lib/test/appendOnlySortedMap.spec.js.map +1 -0
  143. package/lib/test/idCompressor.perf.spec.d.ts +6 -0
  144. package/lib/test/idCompressor.perf.spec.d.ts.map +1 -0
  145. package/lib/test/idCompressor.perf.spec.js +281 -0
  146. package/lib/test/idCompressor.perf.spec.js.map +1 -0
  147. package/lib/test/idCompressor.spec.d.ts +6 -0
  148. package/lib/test/idCompressor.spec.d.ts.map +1 -0
  149. package/lib/test/idCompressor.spec.js +953 -0
  150. package/lib/test/idCompressor.spec.js.map +1 -0
  151. package/lib/test/idCompressorTestUtilities.d.ts +245 -0
  152. package/lib/test/idCompressorTestUtilities.d.ts.map +1 -0
  153. package/lib/test/idCompressorTestUtilities.js +576 -0
  154. package/lib/test/idCompressorTestUtilities.js.map +1 -0
  155. package/lib/test/index.d.ts +9 -0
  156. package/lib/test/index.d.ts.map +1 -0
  157. package/lib/test/index.js +9 -0
  158. package/lib/test/index.js.map +1 -0
  159. package/lib/test/numericUuid.spec.d.ts +6 -0
  160. package/lib/test/numericUuid.spec.d.ts.map +1 -0
  161. package/lib/test/numericUuid.spec.js +74 -0
  162. package/lib/test/numericUuid.spec.js.map +1 -0
  163. package/lib/test/sessionSpaceNormalizer.spec.d.ts +6 -0
  164. package/lib/test/sessionSpaceNormalizer.spec.d.ts.map +1 -0
  165. package/lib/test/sessionSpaceNormalizer.spec.js +43 -0
  166. package/lib/test/sessionSpaceNormalizer.spec.js.map +1 -0
  167. package/lib/test/snapshots/dirname.cjs +16 -0
  168. package/lib/test/snapshots/dirname.cjs.map +1 -0
  169. package/lib/test/snapshots/dirname.d.cts +6 -0
  170. package/lib/test/snapshots/dirname.d.cts.map +1 -0
  171. package/lib/test/snapshots/summary.spec.d.ts +6 -0
  172. package/lib/test/snapshots/summary.spec.d.ts.map +1 -0
  173. package/lib/test/snapshots/summary.spec.js +127 -0
  174. package/lib/test/snapshots/summary.spec.js.map +1 -0
  175. package/lib/test/testCommon.d.ts +90 -0
  176. package/lib/test/testCommon.d.ts.map +1 -0
  177. package/lib/test/testCommon.js +80 -0
  178. package/lib/test/testCommon.js.map +1 -0
  179. package/lib/types/{idCompressor.d.mts → idCompressor.d.ts} +135 -68
  180. package/lib/types/idCompressor.d.ts.map +1 -0
  181. package/lib/types/{identifiers.mjs → idCompressor.js} +1 -1
  182. package/lib/types/idCompressor.js.map +1 -0
  183. package/lib/types/{identifiers.d.mts → identifiers.d.ts} +1 -1
  184. package/lib/types/identifiers.d.ts.map +1 -0
  185. package/lib/types/identifiers.js +6 -0
  186. package/lib/types/identifiers.js.map +1 -0
  187. package/lib/types/{index.d.mts → index.d.ts} +4 -4
  188. package/lib/types/index.d.ts.map +1 -0
  189. package/lib/types/{persisted-types/0.0.1.mjs → index.js} +1 -1
  190. package/lib/types/index.js.map +1 -0
  191. package/lib/types/persisted-types/{0.0.1.d.mts → 0.0.1.d.ts} +2 -2
  192. package/lib/types/persisted-types/0.0.1.d.ts.map +1 -0
  193. package/lib/types/persisted-types/{index.mjs → 0.0.1.js} +1 -1
  194. package/lib/types/persisted-types/0.0.1.js.map +1 -0
  195. package/lib/types/persisted-types/{index.d.mts → index.d.ts} +2 -2
  196. package/lib/types/persisted-types/index.d.ts.map +1 -0
  197. package/lib/types/{index.mjs → persisted-types/index.js} +1 -1
  198. package/lib/types/persisted-types/index.js.map +1 -0
  199. package/lib/{utilities.d.mts → utilities.d.ts} +3 -3
  200. package/lib/utilities.d.ts.map +1 -0
  201. package/lib/{utilities.mjs → utilities.js} +2 -1
  202. package/lib/utilities.js.map +1 -0
  203. package/package.json +88 -22
  204. package/src/finalSpace.ts +2 -2
  205. package/src/idCompressor.ts +22 -8
  206. package/src/identifiers.ts +1 -1
  207. package/src/index.ts +3 -3
  208. package/src/packageVersion.ts +1 -1
  209. package/src/persistanceUtilities.ts +1 -1
  210. package/src/sessionSpaceNormalizer.ts +3 -3
  211. package/src/sessions.ts +3 -3
  212. package/src/test/idCompressorTestUtilities.ts +921 -0
  213. package/src/test/index.ts +10 -0
  214. package/src/test/snapshots/dirname.cts +13 -0
  215. package/src/test/snapshots/files/compressor-with-finalized-range-from-one-client +1 -0
  216. package/src/test/snapshots/files/compressor-with-finalized-range-from-one-client-client2 +1 -0
  217. package/src/test/snapshots/files/compressors-with-finalized-ranges-from-two-clients +1 -0
  218. package/src/test/snapshots/files/compressors-with-finalized-ranges-from-two-clients-client2 +1 -0
  219. package/src/test/snapshots/files/empty-compressor-summary +1 -0
  220. package/src/test/snapshots/files/expansion-semantics +1 -0
  221. package/src/test/snapshots/files/expansion-semantics-client2 +1 -0
  222. package/src/test/testCommon.ts +143 -0
  223. package/src/test/tsconfig.cjs.json +12 -0
  224. package/src/test/tsconfig.json +20 -0
  225. package/src/types/idCompressor.ts +147 -72
  226. package/src/types/index.ts +8 -3
  227. package/src/types/persisted-types/0.0.1.ts +1 -1
  228. package/src/types/persisted-types/index.ts +1 -1
  229. package/src/utilities.ts +2 -2
  230. package/tsconfig.cjs.json +7 -0
  231. package/tsconfig.json +2 -5
  232. package/lib/appendOnlySortedMap.d.mts.map +0 -1
  233. package/lib/appendOnlySortedMap.mjs.map +0 -1
  234. package/lib/finalSpace.d.mts.map +0 -1
  235. package/lib/finalSpace.mjs.map +0 -1
  236. package/lib/id-compressor-beta.d.mts +0 -171
  237. package/lib/id-compressor-public.d.mts +0 -171
  238. package/lib/idCompressor.d.mts.map +0 -1
  239. package/lib/idCompressor.mjs.map +0 -1
  240. package/lib/identifiers.d.mts.map +0 -1
  241. package/lib/identifiers.mjs.map +0 -1
  242. package/lib/index.d.mts.map +0 -1
  243. package/lib/index.mjs.map +0 -1
  244. package/lib/packageVersion.d.mts.map +0 -1
  245. package/lib/packageVersion.mjs.map +0 -1
  246. package/lib/persistanceUtilities.d.mts.map +0 -1
  247. package/lib/persistanceUtilities.mjs.map +0 -1
  248. package/lib/sessionSpaceNormalizer.d.mts.map +0 -1
  249. package/lib/sessionSpaceNormalizer.mjs.map +0 -1
  250. package/lib/sessions.d.mts.map +0 -1
  251. package/lib/sessions.mjs.map +0 -1
  252. package/lib/types/idCompressor.d.mts.map +0 -1
  253. package/lib/types/idCompressor.mjs.map +0 -1
  254. package/lib/types/identifiers.d.mts.map +0 -1
  255. package/lib/types/identifiers.mjs.map +0 -1
  256. package/lib/types/index.d.mts.map +0 -1
  257. package/lib/types/index.mjs.map +0 -1
  258. package/lib/types/persisted-types/0.0.1.d.mts.map +0 -1
  259. package/lib/types/persisted-types/0.0.1.mjs.map +0 -1
  260. package/lib/types/persisted-types/index.d.mts.map +0 -1
  261. package/lib/types/persisted-types/index.mjs.map +0 -1
  262. package/lib/utilities.d.mts.map +0 -1
  263. package/lib/utilities.mjs.map +0 -1
@@ -62,6 +62,120 @@ export declare interface IdCreationRange {
62
62
  };
63
63
  }
64
64
 
65
+ /**
66
+ * A distributed UUID generator and compressor.
67
+ * `IdCompressor` offers the ability to generate arbitrary non-colliding v4 UUIDs, called stable IDs, while compressing them into small integers
68
+ * for efficient storage and transmission. It also provides the ability to decompress these integers back into their original UUIDs.
69
+ *
70
+ * The compressor is designed to be used in a distributed environment, where multiple clients may be generating IDs concurrently.
71
+ * IDs generated by a compressor, via calls to `generateCompressedId`, are created in the compressor's "local" session.
72
+ * These IDs are unique within the session, but may not be unique across sessions. In the context of Fluid, the scope of a session
73
+ * is the same as the scope of a container. This means that anytime IDs are transferred between sessions, they must be translated
74
+ * through a process called "normalization":
75
+ * - The scope of a local session (in which local IDs are unique) is called the "session space" of the client.
76
+ * - The context of persisted state (in Fluid, this is the context of ops and summaries) is called "op space".
77
+ * - `SessionSpaceCompressedId`s, generated via calls to `generateCompressedId`, should NEVER be serialized directly.
78
+ * In Fluid, this means they should not be included in ops or summaries.
79
+ * - Before serialization, IDs must be normalized to op space to ensure they are interpretable by other clients.
80
+ * - Upon receipt, IDs should be normalized back to session space before use.
81
+ *
82
+ * Example Usage:
83
+ *
84
+ * ### Client A (Sender)
85
+ *
86
+ * ```typescript
87
+ * // Generate several local IDs
88
+ * const localId1 = idCompressor.generateCompressedId();
89
+ * const localId2 = idCompressor.generateCompressedId();
90
+ * const localId3 = idCompressor.generateCompressedId();
91
+ *
92
+ * // Normalize these IDs to op space for inclusion in a message
93
+ * const opSpaceId1 = idCompressor.normalizeToOpSpace(localId1);
94
+ * const opSpaceId2 = idCompressor.normalizeToOpSpace(localId2);
95
+ * const opSpaceId3 = idCompressor.normalizeToOpSpace(localId3);
96
+ *
97
+ * // Create and send a message containing these op space IDs along with the sender's session ID
98
+ * // In Fluid, this would be an op or summary
99
+ * const message = {
100
+ * sessionID: idCompressor.localSessionId,
101
+ * ids: [opSpaceId1, opSpaceId2, opSpaceId3]
102
+ * };
103
+ * ```
104
+ *
105
+ * ### Client B (Receiver)
106
+ *
107
+ * ```typescript
108
+ * // Receive the message from Client A
109
+ * const receivedMessage = ...; // In Fluid, this would be an op or summary
110
+ *
111
+ * // Normalize the received IDs back to session space, utilizing the sender's session ID
112
+ * const sessionSpaceId1 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[0], receivedMessage.sessionID);
113
+ * const sessionSpaceId2 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[1], receivedMessage.sessionID);
114
+ * const sessionSpaceId3 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[2], receivedMessage.sessionID);
115
+ * ```
116
+ * @public
117
+ */
118
+ export declare interface IIdCompressor {
119
+ /**
120
+ * The local session ID.
121
+ */
122
+ localSessionId: SessionId;
123
+ /**
124
+ * Generates a new compressed ID.
125
+ * The returned ID is in session space and should not be serialized directly. See `IIdCompressor` for more details.
126
+ * @returns A new local ID in session space.
127
+ */
128
+ generateCompressedId(): SessionSpaceCompressedId;
129
+ /**
130
+ * Generates a new ID that is guaranteed to be unique across all sessions known to this compressor without the need for any
131
+ * normalization. The returned ID is not guaranteed to be a compressed ID (small number); it may be a stable ID (UUID string).
132
+ * In Fluid, the likelihood of generating the bulkier stable ID is dictated by network conditions and is highly probably in
133
+ * scenarios such as offline. This is still useful for use cases where simplicity is more important than performance and
134
+ * this approach will often be superior to generating a UUID.
135
+ * If small numbers are a requirement, `generateCompressedId` and normalization should be used instead.
136
+ * See `IIdCompressor` for more details.
137
+ * @returns A new local ID in session space.
138
+ */
139
+ generateDocumentUniqueId(): (SessionSpaceCompressedId & OpSpaceCompressedId) | StableId;
140
+ /**
141
+ * Normalizes a session space ID into op space.
142
+ * The returned ID is in op space and can be safely serialized. However, it should be normalized back to session space before use.
143
+ * See `IIdCompressor` for more details.
144
+ * @param id - The local ID to normalize.
145
+ * @returns The ID in op space.
146
+ */
147
+ normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId;
148
+ /**
149
+ * Normalizes an ID into session space.
150
+ * @param id - The ID to normalize.
151
+ * @param originSessionId - The session from which `id` originated. This should be the ID of the client that normalized `id` to op space.
152
+ * This means that it may not be the client that created `id` in the first place, but rather the client that serialized it.
153
+ * This is an important distinction in the case of a reference, where a client might refer to an ID created by another client.
154
+ * @returns The session-space ID in the local session corresponding to `id`.
155
+ */
156
+ normalizeToSessionSpace(id: OpSpaceCompressedId, originSessionId: SessionId): SessionSpaceCompressedId;
157
+ /**
158
+ * Decompresses a previously compressed ID into a UUID.
159
+ * @param id - The compressed ID to be decompressed.
160
+ * @returns The UUID associated with the compressed ID.
161
+ * @throws If the ID was not generated by any session known to this compressor.
162
+ */
163
+ decompress(id: SessionSpaceCompressedId): StableId;
164
+ /**
165
+ * Recompresses a UUID.
166
+ * @param uncompressed - The UUID to recompress.
167
+ * @returns The `CompressedId` associated with `uncompressed`.
168
+ * @throws If the UUID was not generated by any session known to this compressor.
169
+ */
170
+ recompress(uncompressed: StableId): SessionSpaceCompressedId;
171
+ /**
172
+ * Attempts to recompress a UUID.
173
+ * @param uncompressed - The UUID to recompress.
174
+ * @returns The `CompressedId` associated with `uncompressed` or undefined if the UUID was not generated by any session known to this compressor.
175
+ */
176
+ tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined;
177
+ }
178
+
65
179
  /**
66
180
  * A distributed UUID generator and compressor.
67
181
  *
@@ -122,53 +236,6 @@ export declare interface IdCreationRange {
122
236
  *
123
237
  * These two spaces naturally define a rule: consumers of compressed IDs should use session-space IDs, but serialized forms such as ops
124
238
  * should use op-space IDs.
125
- * @public
126
- */
127
- export declare interface IIdCompressor {
128
- localSessionId: SessionId;
129
- /**
130
- * Generates a new compressed ID or returns an existing one.
131
- * This should ONLY be called to generate IDs for local operations.
132
- * @returns A new local ID in session space.
133
- */
134
- generateCompressedId(): SessionSpaceCompressedId;
135
- /**
136
- * Normalizes a session space ID into op space.
137
- * @param id - the local ID to normalize.
138
- * @returns the ID in op space.
139
- */
140
- normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId;
141
- /**
142
- * Normalizes an ID into session space.
143
- * @param id - the ID to normalize. If it is a local ID, it is assumed to have been created by the session corresponding
144
- * to `sessionId`.
145
- * @param originSessionId - the session from which `id` originated
146
- * @returns the session-space ID corresponding to `id`, which might not have been a final ID if the client that created it had not yet
147
- * finalized it. This can occur when a client references an ID during the window of time in which it is waiting to receive the ordered
148
- * range that contained it from the server.
149
- */
150
- normalizeToSessionSpace(id: OpSpaceCompressedId, originSessionId: SessionId): SessionSpaceCompressedId;
151
- /**
152
- * Decompresses a previously compressed ID into a UUID.
153
- * @param id - the compressed ID to be decompressed.
154
- * @returns the UUID associated with the compressed ID. Fails if the ID was not generated by this compressor.
155
- */
156
- decompress(id: SessionSpaceCompressedId): StableId;
157
- /**
158
- * Recompresses a UUID.
159
- * @param uncompressed - the UUID to recompress.
160
- * @returns the `CompressedId` associated with `uncompressed`. Fails if it has not been previously compressed by this compressor.
161
- */
162
- recompress(uncompressed: StableId): SessionSpaceCompressedId;
163
- /**
164
- * Attempts to recompresses a UUID.
165
- * @param uncompressed - the UUID to recompress,
166
- * @returns the `CompressedId` associated with `uncompressed` or undefined if it has not been previously compressed by this compressor.
167
- */
168
- tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined;
169
- }
170
-
171
- /**
172
239
  * @alpha
173
240
  */
174
241
  export declare interface IIdCompressorCore {
@@ -0,0 +1,179 @@
1
+ import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
2
+ import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils';
3
+
4
+ /* Excluded from this release type: assertIsStableId */
5
+
6
+ /* Excluded from this release type: createIdCompressor */
7
+
8
+ /* Excluded from this release type: createSessionId */
9
+
10
+ /* Excluded from this release type: deserializeIdCompressor */
11
+
12
+ /* Excluded from this release type: generateStableId */
13
+
14
+ /* Excluded from this release type: IdCreationRange */
15
+
16
+ /**
17
+ * A distributed UUID generator and compressor.
18
+ * `IdCompressor` offers the ability to generate arbitrary non-colliding v4 UUIDs, called stable IDs, while compressing them into small integers
19
+ * for efficient storage and transmission. It also provides the ability to decompress these integers back into their original UUIDs.
20
+ *
21
+ * The compressor is designed to be used in a distributed environment, where multiple clients may be generating IDs concurrently.
22
+ * IDs generated by a compressor, via calls to `generateCompressedId`, are created in the compressor's "local" session.
23
+ * These IDs are unique within the session, but may not be unique across sessions. In the context of Fluid, the scope of a session
24
+ * is the same as the scope of a container. This means that anytime IDs are transferred between sessions, they must be translated
25
+ * through a process called "normalization":
26
+ * - The scope of a local session (in which local IDs are unique) is called the "session space" of the client.
27
+ * - The context of persisted state (in Fluid, this is the context of ops and summaries) is called "op space".
28
+ * - `SessionSpaceCompressedId`s, generated via calls to `generateCompressedId`, should NEVER be serialized directly.
29
+ * In Fluid, this means they should not be included in ops or summaries.
30
+ * - Before serialization, IDs must be normalized to op space to ensure they are interpretable by other clients.
31
+ * - Upon receipt, IDs should be normalized back to session space before use.
32
+ *
33
+ * Example Usage:
34
+ *
35
+ * ### Client A (Sender)
36
+ *
37
+ * ```typescript
38
+ * // Generate several local IDs
39
+ * const localId1 = idCompressor.generateCompressedId();
40
+ * const localId2 = idCompressor.generateCompressedId();
41
+ * const localId3 = idCompressor.generateCompressedId();
42
+ *
43
+ * // Normalize these IDs to op space for inclusion in a message
44
+ * const opSpaceId1 = idCompressor.normalizeToOpSpace(localId1);
45
+ * const opSpaceId2 = idCompressor.normalizeToOpSpace(localId2);
46
+ * const opSpaceId3 = idCompressor.normalizeToOpSpace(localId3);
47
+ *
48
+ * // Create and send a message containing these op space IDs along with the sender's session ID
49
+ * // In Fluid, this would be an op or summary
50
+ * const message = {
51
+ * sessionID: idCompressor.localSessionId,
52
+ * ids: [opSpaceId1, opSpaceId2, opSpaceId3]
53
+ * };
54
+ * ```
55
+ *
56
+ * ### Client B (Receiver)
57
+ *
58
+ * ```typescript
59
+ * // Receive the message from Client A
60
+ * const receivedMessage = ...; // In Fluid, this would be an op or summary
61
+ *
62
+ * // Normalize the received IDs back to session space, utilizing the sender's session ID
63
+ * const sessionSpaceId1 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[0], receivedMessage.sessionID);
64
+ * const sessionSpaceId2 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[1], receivedMessage.sessionID);
65
+ * const sessionSpaceId3 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[2], receivedMessage.sessionID);
66
+ * ```
67
+ * @public
68
+ */
69
+ export declare interface IIdCompressor {
70
+ /**
71
+ * The local session ID.
72
+ */
73
+ localSessionId: SessionId;
74
+ /**
75
+ * Generates a new compressed ID.
76
+ * The returned ID is in session space and should not be serialized directly. See `IIdCompressor` for more details.
77
+ * @returns A new local ID in session space.
78
+ */
79
+ generateCompressedId(): SessionSpaceCompressedId;
80
+ /**
81
+ * Generates a new ID that is guaranteed to be unique across all sessions known to this compressor without the need for any
82
+ * normalization. The returned ID is not guaranteed to be a compressed ID (small number); it may be a stable ID (UUID string).
83
+ * In Fluid, the likelihood of generating the bulkier stable ID is dictated by network conditions and is highly probably in
84
+ * scenarios such as offline. This is still useful for use cases where simplicity is more important than performance and
85
+ * this approach will often be superior to generating a UUID.
86
+ * If small numbers are a requirement, `generateCompressedId` and normalization should be used instead.
87
+ * See `IIdCompressor` for more details.
88
+ * @returns A new local ID in session space.
89
+ */
90
+ generateDocumentUniqueId(): (SessionSpaceCompressedId & OpSpaceCompressedId) | StableId;
91
+ /**
92
+ * Normalizes a session space ID into op space.
93
+ * The returned ID is in op space and can be safely serialized. However, it should be normalized back to session space before use.
94
+ * See `IIdCompressor` for more details.
95
+ * @param id - The local ID to normalize.
96
+ * @returns The ID in op space.
97
+ */
98
+ normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId;
99
+ /**
100
+ * Normalizes an ID into session space.
101
+ * @param id - The ID to normalize.
102
+ * @param originSessionId - The session from which `id` originated. This should be the ID of the client that normalized `id` to op space.
103
+ * This means that it may not be the client that created `id` in the first place, but rather the client that serialized it.
104
+ * This is an important distinction in the case of a reference, where a client might refer to an ID created by another client.
105
+ * @returns The session-space ID in the local session corresponding to `id`.
106
+ */
107
+ normalizeToSessionSpace(id: OpSpaceCompressedId, originSessionId: SessionId): SessionSpaceCompressedId;
108
+ /**
109
+ * Decompresses a previously compressed ID into a UUID.
110
+ * @param id - The compressed ID to be decompressed.
111
+ * @returns The UUID associated with the compressed ID.
112
+ * @throws If the ID was not generated by any session known to this compressor.
113
+ */
114
+ decompress(id: SessionSpaceCompressedId): StableId;
115
+ /**
116
+ * Recompresses a UUID.
117
+ * @param uncompressed - The UUID to recompress.
118
+ * @returns The `CompressedId` associated with `uncompressed`.
119
+ * @throws If the UUID was not generated by any session known to this compressor.
120
+ */
121
+ recompress(uncompressed: StableId): SessionSpaceCompressedId;
122
+ /**
123
+ * Attempts to recompress a UUID.
124
+ * @param uncompressed - The UUID to recompress.
125
+ * @returns The `CompressedId` associated with `uncompressed` or undefined if the UUID was not generated by any session known to this compressor.
126
+ */
127
+ tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined;
128
+ }
129
+
130
+ /* Excluded from this release type: IIdCompressorCore */
131
+
132
+ /* Excluded from this release type: isStableId */
133
+
134
+ /**
135
+ * A compressed ID that has been normalized into "op space".
136
+ * Serialized/persisted structures (e.g. ops) should use op-space IDs as a performance optimization, as they require less normalizing when
137
+ * received by a remote client due to the fact that op space for a given compressor is session space for all other compressors.
138
+ * @public
139
+ */
140
+ export declare type OpSpaceCompressedId = number & {
141
+ readonly OpNormalized: "9209432d-a959-4df7-b2ad-767ead4dbcae";
142
+ };
143
+
144
+ /* Excluded from this release type: SerializedIdCompressor */
145
+
146
+ /* Excluded from this release type: SerializedIdCompressorWithNoSession */
147
+
148
+ /* Excluded from this release type: SerializedIdCompressorWithOngoingSession */
149
+
150
+ /**
151
+ * A StableId which is suitable for use as a session identifier
152
+ * @public
153
+ */
154
+ export declare type SessionId = StableId & {
155
+ readonly SessionId: "4498f850-e14e-4be9-8db0-89ec00997e58";
156
+ };
157
+
158
+ /**
159
+ * A compressed ID that has been normalized into "session space" (see `IdCompressor` for more).
160
+ * Consumer-facing APIs and data structures should use session-space IDs as their lifetime and equality is stable and tied to
161
+ * the scope of the session (i.e. compressor) that produced them.
162
+ * @public
163
+ */
164
+ export declare type SessionSpaceCompressedId = number & {
165
+ readonly SessionUnique: "cea55054-6b82-4cbf-ad19-1fa645ea3b3e";
166
+ };
167
+
168
+ /**
169
+ * A version 4, variant 1 uuid (https://datatracker.ietf.org/doc/html/rfc4122).
170
+ * A 128-bit Universally Unique IDentifier. Represented here
171
+ * with a string of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
172
+ * where x is a lowercase hex digit.
173
+ * @public
174
+ */
175
+ export declare type StableId = string & {
176
+ readonly StableId: "53172b0d-a3d5-41ea-bd75-b43839c97f5a";
177
+ };
178
+
179
+ export { }
@@ -0,0 +1,179 @@
1
+ import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
2
+ import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils';
3
+
4
+ /* Excluded from this release type: assertIsStableId */
5
+
6
+ /* Excluded from this release type: createIdCompressor */
7
+
8
+ /* Excluded from this release type: createSessionId */
9
+
10
+ /* Excluded from this release type: deserializeIdCompressor */
11
+
12
+ /* Excluded from this release type: generateStableId */
13
+
14
+ /* Excluded from this release type: IdCreationRange */
15
+
16
+ /**
17
+ * A distributed UUID generator and compressor.
18
+ * `IdCompressor` offers the ability to generate arbitrary non-colliding v4 UUIDs, called stable IDs, while compressing them into small integers
19
+ * for efficient storage and transmission. It also provides the ability to decompress these integers back into their original UUIDs.
20
+ *
21
+ * The compressor is designed to be used in a distributed environment, where multiple clients may be generating IDs concurrently.
22
+ * IDs generated by a compressor, via calls to `generateCompressedId`, are created in the compressor's "local" session.
23
+ * These IDs are unique within the session, but may not be unique across sessions. In the context of Fluid, the scope of a session
24
+ * is the same as the scope of a container. This means that anytime IDs are transferred between sessions, they must be translated
25
+ * through a process called "normalization":
26
+ * - The scope of a local session (in which local IDs are unique) is called the "session space" of the client.
27
+ * - The context of persisted state (in Fluid, this is the context of ops and summaries) is called "op space".
28
+ * - `SessionSpaceCompressedId`s, generated via calls to `generateCompressedId`, should NEVER be serialized directly.
29
+ * In Fluid, this means they should not be included in ops or summaries.
30
+ * - Before serialization, IDs must be normalized to op space to ensure they are interpretable by other clients.
31
+ * - Upon receipt, IDs should be normalized back to session space before use.
32
+ *
33
+ * Example Usage:
34
+ *
35
+ * ### Client A (Sender)
36
+ *
37
+ * ```typescript
38
+ * // Generate several local IDs
39
+ * const localId1 = idCompressor.generateCompressedId();
40
+ * const localId2 = idCompressor.generateCompressedId();
41
+ * const localId3 = idCompressor.generateCompressedId();
42
+ *
43
+ * // Normalize these IDs to op space for inclusion in a message
44
+ * const opSpaceId1 = idCompressor.normalizeToOpSpace(localId1);
45
+ * const opSpaceId2 = idCompressor.normalizeToOpSpace(localId2);
46
+ * const opSpaceId3 = idCompressor.normalizeToOpSpace(localId3);
47
+ *
48
+ * // Create and send a message containing these op space IDs along with the sender's session ID
49
+ * // In Fluid, this would be an op or summary
50
+ * const message = {
51
+ * sessionID: idCompressor.localSessionId,
52
+ * ids: [opSpaceId1, opSpaceId2, opSpaceId3]
53
+ * };
54
+ * ```
55
+ *
56
+ * ### Client B (Receiver)
57
+ *
58
+ * ```typescript
59
+ * // Receive the message from Client A
60
+ * const receivedMessage = ...; // In Fluid, this would be an op or summary
61
+ *
62
+ * // Normalize the received IDs back to session space, utilizing the sender's session ID
63
+ * const sessionSpaceId1 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[0], receivedMessage.sessionID);
64
+ * const sessionSpaceId2 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[1], receivedMessage.sessionID);
65
+ * const sessionSpaceId3 = idCompressor.normalizeToSessionSpace(receivedMessage.ids[2], receivedMessage.sessionID);
66
+ * ```
67
+ * @public
68
+ */
69
+ export declare interface IIdCompressor {
70
+ /**
71
+ * The local session ID.
72
+ */
73
+ localSessionId: SessionId;
74
+ /**
75
+ * Generates a new compressed ID.
76
+ * The returned ID is in session space and should not be serialized directly. See `IIdCompressor` for more details.
77
+ * @returns A new local ID in session space.
78
+ */
79
+ generateCompressedId(): SessionSpaceCompressedId;
80
+ /**
81
+ * Generates a new ID that is guaranteed to be unique across all sessions known to this compressor without the need for any
82
+ * normalization. The returned ID is not guaranteed to be a compressed ID (small number); it may be a stable ID (UUID string).
83
+ * In Fluid, the likelihood of generating the bulkier stable ID is dictated by network conditions and is highly probably in
84
+ * scenarios such as offline. This is still useful for use cases where simplicity is more important than performance and
85
+ * this approach will often be superior to generating a UUID.
86
+ * If small numbers are a requirement, `generateCompressedId` and normalization should be used instead.
87
+ * See `IIdCompressor` for more details.
88
+ * @returns A new local ID in session space.
89
+ */
90
+ generateDocumentUniqueId(): (SessionSpaceCompressedId & OpSpaceCompressedId) | StableId;
91
+ /**
92
+ * Normalizes a session space ID into op space.
93
+ * The returned ID is in op space and can be safely serialized. However, it should be normalized back to session space before use.
94
+ * See `IIdCompressor` for more details.
95
+ * @param id - The local ID to normalize.
96
+ * @returns The ID in op space.
97
+ */
98
+ normalizeToOpSpace(id: SessionSpaceCompressedId): OpSpaceCompressedId;
99
+ /**
100
+ * Normalizes an ID into session space.
101
+ * @param id - The ID to normalize.
102
+ * @param originSessionId - The session from which `id` originated. This should be the ID of the client that normalized `id` to op space.
103
+ * This means that it may not be the client that created `id` in the first place, but rather the client that serialized it.
104
+ * This is an important distinction in the case of a reference, where a client might refer to an ID created by another client.
105
+ * @returns The session-space ID in the local session corresponding to `id`.
106
+ */
107
+ normalizeToSessionSpace(id: OpSpaceCompressedId, originSessionId: SessionId): SessionSpaceCompressedId;
108
+ /**
109
+ * Decompresses a previously compressed ID into a UUID.
110
+ * @param id - The compressed ID to be decompressed.
111
+ * @returns The UUID associated with the compressed ID.
112
+ * @throws If the ID was not generated by any session known to this compressor.
113
+ */
114
+ decompress(id: SessionSpaceCompressedId): StableId;
115
+ /**
116
+ * Recompresses a UUID.
117
+ * @param uncompressed - The UUID to recompress.
118
+ * @returns The `CompressedId` associated with `uncompressed`.
119
+ * @throws If the UUID was not generated by any session known to this compressor.
120
+ */
121
+ recompress(uncompressed: StableId): SessionSpaceCompressedId;
122
+ /**
123
+ * Attempts to recompress a UUID.
124
+ * @param uncompressed - The UUID to recompress.
125
+ * @returns The `CompressedId` associated with `uncompressed` or undefined if the UUID was not generated by any session known to this compressor.
126
+ */
127
+ tryRecompress(uncompressed: StableId): SessionSpaceCompressedId | undefined;
128
+ }
129
+
130
+ /* Excluded from this release type: IIdCompressorCore */
131
+
132
+ /* Excluded from this release type: isStableId */
133
+
134
+ /**
135
+ * A compressed ID that has been normalized into "op space".
136
+ * Serialized/persisted structures (e.g. ops) should use op-space IDs as a performance optimization, as they require less normalizing when
137
+ * received by a remote client due to the fact that op space for a given compressor is session space for all other compressors.
138
+ * @public
139
+ */
140
+ export declare type OpSpaceCompressedId = number & {
141
+ readonly OpNormalized: "9209432d-a959-4df7-b2ad-767ead4dbcae";
142
+ };
143
+
144
+ /* Excluded from this release type: SerializedIdCompressor */
145
+
146
+ /* Excluded from this release type: SerializedIdCompressorWithNoSession */
147
+
148
+ /* Excluded from this release type: SerializedIdCompressorWithOngoingSession */
149
+
150
+ /**
151
+ * A StableId which is suitable for use as a session identifier
152
+ * @public
153
+ */
154
+ export declare type SessionId = StableId & {
155
+ readonly SessionId: "4498f850-e14e-4be9-8db0-89ec00997e58";
156
+ };
157
+
158
+ /**
159
+ * A compressed ID that has been normalized into "session space" (see `IdCompressor` for more).
160
+ * Consumer-facing APIs and data structures should use session-space IDs as their lifetime and equality is stable and tied to
161
+ * the scope of the session (i.e. compressor) that produced them.
162
+ * @public
163
+ */
164
+ export declare type SessionSpaceCompressedId = number & {
165
+ readonly SessionUnique: "cea55054-6b82-4cbf-ad19-1fa645ea3b3e";
166
+ };
167
+
168
+ /**
169
+ * A version 4, variant 1 uuid (https://datatracker.ietf.org/doc/html/rfc4122).
170
+ * A 128-bit Universally Unique IDentifier. Represented here
171
+ * with a string of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
172
+ * where x is a lowercase hex digit.
173
+ * @public
174
+ */
175
+ export declare type StableId = string & {
176
+ readonly StableId: "53172b0d-a3d5-41ea-bd75-b43839c97f5a";
177
+ };
178
+
179
+ export { }