Skip to content

Commit 11780bf

Browse files
authored
Merge pull request #659 from streamich/fixes
Make log start use correct logical time
2 parents a1aa594 + 019883d commit 11780bf

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/json-crdt/log/Log.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ export class Log<N extends JsonNode = JsonNode<any>> implements Printable {
2828
* @returns A new `PatchLog` instance.
2929
*/
3030
public static fromNewModel<N extends JsonNode = JsonNode<any>>(model: Model<N>): Log<N> {
31-
const clock = model.clock.clone();
32-
const log = new Log<N>(() => new Model(clock));
31+
const sid = model.clock.sid;
32+
const log = new Log<N>(() => Model.create<any>(undefined, sid) as Model<N>);
3333
const api = model.api;
3434
if (api.builder.patch.ops.length) log.end.applyPatch(api.flush());
3535
return log;

src/json-crdt/log/__tests__/Log.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {s} from '../../../json-crdt-patch';
12
import {Model} from '../../model';
23
import {Log} from '../Log';
34

@@ -8,6 +9,34 @@ const setup = (view: unknown) => {
89
return {log};
910
};
1011

12+
test('can create a new log from a new model with right starting logical clock', () => {
13+
const schema0 = s.obj({
14+
id: s.con<string>(''),
15+
name: s.str('John Doe'),
16+
age: s.val(s.con<number>(42)),
17+
tags: s.arr([s.str('tag1'), s.str('tag2')]),
18+
});
19+
const model = Model.create(schema0);
20+
const sid = model.clock.sid;
21+
const log = Log.fromNewModel(model);
22+
log.end.s.toApi().set({id: s.con('xyz') as any});
23+
log.end.api.flush();
24+
log.end.s.age.toApi().set(35);
25+
log.end.api.flush();
26+
log.end.s.tags.toApi().del(0, 1);
27+
log.end.api.flush();
28+
log.end.s.name.toApi().del(0, 8);
29+
log.end.s.name.toApi().ins(0, 'Va Da');
30+
log.end.api.flush();
31+
log.end.s.tags[0].toApi().del(0, 4);
32+
log.end.s.tags[0].toApi().ins(0, 'happy');
33+
log.end.api.flush();
34+
expect(log.start().clock.sid).toBe(sid);
35+
expect(log.start().clock.time).toBe(1);
36+
expect(log.end.clock.sid).toBe(sid);
37+
expect(log.end.clock.time > 10).toBe(true);
38+
});
39+
1140
test('can replay to specific patch', () => {
1241
const {log} = setup({foo: 'bar'});
1342
const model = log.end.clone();

0 commit comments

Comments
 (0)