Skip to content

Commit

Permalink
Merge pull request #536 from streamich/cnt-extension
Browse files Browse the repository at this point in the history
JSON CRDT `cnt` extension refactor
  • Loading branch information
streamich authored Mar 5, 2024
2 parents 4fe604f + 89d3c7c commit 4ef2fcc
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 20 deletions.
32 changes: 32 additions & 0 deletions src/json-crdt-extensions/cnt/__demos__/usage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* tslint:disable no-console */

/**
* Run this demo with:
*
* npx nodemon -q -x ts-node src/json-crdt-extensions/cnt/__demos__/usage.ts
*/

import {Model, s} from '../../../json-crdt';
import {CntExt} from '..';

console.clear();

const model = Model.withLogicalClock(1234);

model.ext.register(CntExt);

model.api.root({
cnt: CntExt.new(42),
});

console.log('');
console.log('Initial value:');
console.log(model + '');

const api = model.api.in(['cnt']).asExt(CntExt);

api.inc(10);

console.log('');
console.log('After update:');
console.log(model + '');
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import {GcntExt} from '..';
import {CntExt} from '..';
import {Model} from '../../../json-crdt/model';

test('can set new values in single fork', () => {
const model = Model.withLogicalClock();
model.ext.register(GcntExt);
model.ext.register(CntExt);
model.api.root({
counter: GcntExt.new(24),
counter: CntExt.new(24),
});
expect(model.view()).toEqual({counter: 24});
const counter = model.api.in(['counter']).asExt(GcntExt);
const counter = model.api.in(['counter']).asExt(CntExt);
expect(counter.view()).toBe(24);
counter.inc(2);
expect(model.view()).toEqual({counter: 26});
Expand All @@ -18,15 +18,15 @@ test('can set new values in single fork', () => {

test('two concurrent users can increment the counter', () => {
const model = Model.withLogicalClock();
model.ext.register(GcntExt);
model.ext.register(CntExt);
model.api.root({
counter: GcntExt.new(),
counter: CntExt.new(),
});
expect(model.view()).toEqual({counter: 0});
const counter = model.api.in(['counter']).asExt(GcntExt);
const counter = model.api.in(['counter']).asExt(CntExt);
expect(counter.view()).toBe(0);
const model2 = model.fork();
const counter2 = model2.api.in(['counter']).asExt(GcntExt);
const counter2 = model2.api.in(['counter']).asExt(CntExt);
counter.inc(2);
counter2.inc(3);
model.applyPatch(model2.api.flush());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import type {ExtensionJsonNode, JsonNode} from '../../json-crdt';
import type {Printable} from '../../util/print/types';
import type {ExtensionApi} from '../../json-crdt';

const name = 'gcnt';
const name = 'cnt';

class GcntNode implements ExtensionJsonNode, Printable {
class CntNode implements ExtensionJsonNode, Printable {
public readonly id: ITimestampStruct;

constructor(public readonly data: ObjNode) {
Expand Down Expand Up @@ -50,7 +50,7 @@ class GcntNode implements ExtensionJsonNode, Printable {
}
}

class GcntApi extends NodeApi<GcntNode> implements ExtensionApi<GcntNode> {
class CntApi extends NodeApi<CntNode> implements ExtensionApi<CntNode> {
public inc(increment: number): this {
const {api, node} = this;
const sid = api.model.clock.sid;
Expand All @@ -65,14 +65,14 @@ class GcntApi extends NodeApi<GcntNode> implements ExtensionApi<GcntNode> {
}
}

export const GcntExt: ExtensionDefinition<ObjNode, GcntNode, GcntApi> = {
id: ExtensionId.gcnt,
export const CntExt: ExtensionDefinition<ObjNode, CntNode, CntApi> = {
id: ExtensionId.cnt,
name,
new: (value?: number, sid: number = 0) =>
ext(
ExtensionId.gcnt,
ExtensionId.cnt,
delayed((builder) => builder.constOrJson(value ? {[sid]: value} : {})),
),
Node: GcntNode,
Api: GcntApi,
Node: CntNode,
Api: CntApi,
};
7 changes: 3 additions & 4 deletions src/json-crdt-extensions/constants.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
export const enum ExtensionId {
mval = 0,
gcnt = 1,
pncnt = 2,
peritext = 3,
quill = 4,
cnt = 1,
peritext = 2,
quill = 3,
}

0 comments on commit 4ef2fcc

Please sign in to comment.