Skip to content

Commit

Permalink
Merge pull request #659 from streamich/fixes
Browse files Browse the repository at this point in the history
Make log start use correct logical time
  • Loading branch information
streamich authored Jul 15, 2024
2 parents a1aa594 + 019883d commit 11780bf
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/json-crdt/log/Log.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ export class Log<N extends JsonNode = JsonNode<any>> implements Printable {
* @returns A new `PatchLog` instance.
*/
public static fromNewModel<N extends JsonNode = JsonNode<any>>(model: Model<N>): Log<N> {
const clock = model.clock.clone();
const log = new Log<N>(() => new Model(clock));
const sid = model.clock.sid;
const log = new Log<N>(() => Model.create<any>(undefined, sid) as Model<N>);
const api = model.api;
if (api.builder.patch.ops.length) log.end.applyPatch(api.flush());
return log;
Expand Down
29 changes: 29 additions & 0 deletions src/json-crdt/log/__tests__/Log.spec.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {s} from '../../../json-crdt-patch';
import {Model} from '../../model';
import {Log} from '../Log';

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

test('can create a new log from a new model with right starting logical clock', () => {
const schema0 = s.obj({
id: s.con<string>(''),
name: s.str('John Doe'),
age: s.val(s.con<number>(42)),
tags: s.arr([s.str('tag1'), s.str('tag2')]),
});
const model = Model.create(schema0);
const sid = model.clock.sid;
const log = Log.fromNewModel(model);
log.end.s.toApi().set({id: s.con('xyz') as any});
log.end.api.flush();
log.end.s.age.toApi().set(35);
log.end.api.flush();
log.end.s.tags.toApi().del(0, 1);
log.end.api.flush();
log.end.s.name.toApi().del(0, 8);
log.end.s.name.toApi().ins(0, 'Va Da');
log.end.api.flush();
log.end.s.tags[0].toApi().del(0, 4);
log.end.s.tags[0].toApi().ins(0, 'happy');
log.end.api.flush();
expect(log.start().clock.sid).toBe(sid);
expect(log.start().clock.time).toBe(1);
expect(log.end.clock.sid).toBe(sid);
expect(log.end.clock.time > 10).toBe(true);
});

test('can replay to specific patch', () => {
const {log} = setup({foo: 'bar'});
const model = log.end.clone();
Expand Down

0 comments on commit 11780bf

Please sign in to comment.