Skip to content

Commit 4813bc9

Browse files
committed
feat(json-crdt): 🎸 use SESSION.GLOBAL for default value and schema setup
1 parent f3d2298 commit 4813bc9

File tree

4 files changed

+77
-32
lines changed

4 files changed

+77
-32
lines changed

src/json-crdt-patch/clock/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface ITimestampStruct {
88
* Session ID (or actor ID, site ID, process ID, etc.), a random identifier
99
* randomly assigned to each editing session.
1010
*/
11-
readonly sid: number;
11+
sid: number;
1212

1313
/**
1414
* Logical time (or sequence number, tick, etc.), a monotonically increasing

src/json-crdt/model/Model.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,21 @@ export class Model<N extends JsonNode = JsonNode<any>> implements Printable {
396396
* the document is empty.
397397
*
398398
* @param schema The schema to set for this model.
399+
* @param sid Session ID to use for setting the default value of the document.
400+
* Defaults to `SESSION.GLOBAL` (2), which is the default session ID
401+
* for all operations operations that are not attributed to a specific
402+
* session.
399403
* @returns Strictly typed model.
400404
*/
401-
public setSchema<S extends NodeBuilder>(schema: S): Model<SchemaToJsonNode<S>> {
402-
if (this.clock.time < 2) this.api.root(schema);
405+
public setSchema<S extends NodeBuilder>(schema: S, useGlobalSession: boolean = true): Model<SchemaToJsonNode<S>> {
406+
const clock = this.clock;
407+
const sid = useGlobalSession ? SESSION.GLOBAL : clock.sid;
408+
if (clock.time < 2) {
409+
const oldSid = clock.sid;
410+
clock.sid = sid;
411+
this.api.root(schema);
412+
clock.sid = oldSid;
413+
}
403414
return <any>this;
404415
}
405416

src/json-crdt/model/__tests__/Model.schema.spec.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import {nodes, s} from '../../../json-crdt-patch';
2+
import {SESSION} from '../../../json-crdt-patch/constants';
3+
import {Model} from '../Model';
4+
5+
test('can set object schema', () => {
6+
const model = Model.withLogicalClock().setSchema(
7+
s.obj({
8+
str: s.str('asdf'),
9+
con: s.con(123),
10+
}),
11+
);
12+
expect(model.s.str.toApi().view()).toBe('asdf');
13+
expect(model.s.con.toApi().view()).toBe(123);
14+
});
15+
16+
test('can set map schema', () => {
17+
const model = Model.withLogicalClock().setSchema(
18+
s.map<nodes.str | nodes.con<number>>({
19+
str: s.str('asdf'),
20+
con1: s.con(123),
21+
}),
22+
);
23+
expect(model.s.str.toApi().view()).toBe('asdf');
24+
expect(model.s.con1.toApi().view()).toBe(123);
25+
expect(model.view().str).toBe('asdf');
26+
expect(model.view().con1).toBe(123);
27+
expect(model.view().anyKeyAllowed).toBe(undefined);
28+
});
29+
30+
test('uses global session ID by default', () => {
31+
const model = Model.withLogicalClock().setSchema(s.obj({
32+
id: s.str<string>('asdf'),
33+
num: s.con(123),
34+
}));
35+
expect(model.api.r.get().node.id.sid).toBe(SESSION.GLOBAL);
36+
expect(model.api.r.get().get('id').node.id.sid).toBe(SESSION.GLOBAL);
37+
expect(model.api.r.get().get('num').node.id.sid).toBe(SESSION.GLOBAL);
38+
});
39+
40+
test('allows to specify custom session ID', () => {
41+
const schema = s.obj({
42+
id: s.str<string>('asdf'),
43+
num: s.con(123),
44+
});
45+
const model = Model.withLogicalClock().setSchema(schema, false);
46+
expect(model.api.r.get().node.id.sid).toBe(model.clock.sid);
47+
expect(model.api.r.get().get('id').node.id.sid).toBe(model.clock.sid);
48+
expect(model.api.r.get().get('num').node.id.sid).toBe(model.clock.sid);
49+
});
50+
51+
test('resets session ID to user specified', () => {
52+
const model = Model.withLogicalClock().setSchema(s.obj({
53+
id: s.str<string>('asdf'),
54+
num: s.con(123),
55+
}));
56+
expect(model.view().num).toBe(123);
57+
expect(model.api.r.get().get('num').node.id.sid).toBe(SESSION.GLOBAL);
58+
model.api.r.get().set({
59+
num: 456,
60+
});
61+
expect(model.view().num).toBe(456);
62+
expect(model.api.r.get().get('num').node.id.sid).not.toBe(SESSION.GLOBAL);
63+
});

0 commit comments

Comments
 (0)