@@ -34,6 +34,24 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
34
34
*/
35
35
public static readonly sid = randomSessionId ;
36
36
37
+ /**
38
+ * Use this method to generate a random session ID for an existing document.
39
+ * It checks for the uniqueness of the session ID given the current peers in
40
+ * the document. This reduces the chance of collision substantially.
41
+ *
42
+ * @returns A random session ID that is not used by any peer in the current
43
+ * document.
44
+ */
45
+ public rndSid ( ) : number {
46
+ const clock = this . clock ;
47
+ const sid = clock . sid ;
48
+ const peers = clock . peers ;
49
+ while ( true ) {
50
+ const candidate = randomSessionId ( ) ;
51
+ if ( sid !== candidate && ! peers . has ( candidate ) ) return candidate ;
52
+ }
53
+ }
54
+
37
55
/**
38
56
* Create a CRDT model which uses logical clock. Logical clock assigns a
39
57
* logical timestamp to every node and operation. Logical timestamp consists
@@ -46,7 +64,7 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
46
64
* @deprecated Use `Model.create()` instead.
47
65
*/
48
66
public static readonly withLogicalClock = ( clockOrSessionId ?: clock . ClockVector | number ) : Model => {
49
- return Model . create ( undefined , clockOrSessionId ) ;
67
+ return Model . create ( void 0 , clockOrSessionId ) ;
50
68
} ;
51
69
52
70
/**
@@ -62,7 +80,7 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
62
80
* @deprecated Use `Model.create()` instead: `Model.create(undefined, SESSION.SERVER)`.
63
81
*/
64
82
public static readonly withServerClock = ( time : number = 1 ) : Model => {
65
- return Model . create ( undefined , new clock . ServerClockVector ( SESSION . SERVER , time ) ) ;
83
+ return Model . create ( void 0 , new clock . ServerClockVector ( SESSION . SERVER , time ) ) ;
66
84
} ;
67
85
68
86
/**
@@ -193,7 +211,7 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
193
211
const first = patches [ 0 ] ;
194
212
const sid = first . getId ( ) ! . sid ;
195
213
if ( ! sid ) throw new Error ( 'NO_SID' ) ;
196
- const model = Model . withLogicalClock ( sid ) ;
214
+ const model = Model . create ( void 0 , sid ) ;
197
215
model . applyBatch ( patches ) ;
198
216
return model ;
199
217
}
@@ -436,7 +454,7 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
436
454
* @param sessionId Session ID to use for the new model.
437
455
* @returns A copy of this model with a new session ID.
438
456
*/
439
- public fork ( sessionId : number = Model . sid ( ) ) : Model < N > {
457
+ public fork ( sessionId : number = this . rndSid ( ) ) : Model < N > {
440
458
const copy = Model . fromBinary ( this . toBinary ( ) ) as unknown as Model < N > ;
441
459
if ( copy . clock . sid !== sessionId && copy . clock instanceof clock . ClockVector )
442
460
copy . clock = copy . clock . fork ( sessionId ) ;
0 commit comments