Skip to content

Commit 95826b1

Browse files
authored
Merge pull request #384 from streamich/crdt-verbose-encoding
JSON CRDT verbose encoding
2 parents 17ec613 + 42bf790 commit 95826b1

File tree

17 files changed

+204
-235
lines changed

17 files changed

+204
-235
lines changed

src/json-cli/routes/crdt.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Model} from '../../json-crdt';
2-
import {Encoder as VerboseEncoder} from '../../json-crdt/codec/structural/json/Encoder';
2+
import {Encoder as VerboseEncoder} from '../../json-crdt/codec/structural/verbose/Encoder';
33
import {Encoder as CompactEncoder} from '../../json-crdt/codec/structural/compact/Encoder';
44
import {encode as encodePatch} from '../../json-crdt-patch/codec/compact/encode';
55
import {TypeRouter, RoutesBase} from '../../json-type/system/TypeRouter';

src/json-crdt/__demos__/codec/verbose.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// npx nodemon -q -x ts-node src/json-crdt/__demos__/codec/verbose.ts
55

66
import {Model} from '../..';
7-
import {Encoder} from '../../codec/structural/json/Encoder';
7+
import {Encoder} from '../../codec/structural/verbose/Encoder';
88
import {inspect} from 'util';
99

1010
const encoder = new Encoder();

src/json-crdt/__tests__/fuzzer/SessionLogical.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import {decode as decodeCompact} from '../../../json-crdt-patch/codec/compact/de
33
import {decode as decodeJson} from '../../../json-crdt-patch/codec/verbose/decode';
44
import {Decoder as BinaryDecoder} from '../../codec/structural/binary/Decoder';
55
import {Decoder as CompactDecoder} from '../../codec/structural/compact/Decoder';
6-
import {Decoder as JsonDecoder} from '../../codec/structural/json/Decoder';
6+
import {Decoder as JsonDecoder} from '../../codec/structural/verbose/Decoder';
77
import {DelOp, InsObjOp, InsStrOp, InsBinOp, InsArrOp} from '../../../json-crdt-patch/operations';
88
import {encode as encodeCompact} from '../../../json-crdt-patch/codec/compact/encode';
99
import {encode as encodeJson} from '../../../json-crdt-patch/codec/verbose/encode';
1010
import {Encoder as BinaryEncoder} from '../../codec/structural/binary/Encoder';
1111
import {Encoder as CompactEncoder} from '../../codec/structural/compact/Encoder';
12-
import {Encoder as JsonEncoder} from '../../codec/structural/json/Encoder';
12+
import {Encoder as JsonEncoder} from '../../codec/structural/verbose/Encoder';
1313
import {generateInteger} from './util';
1414
import {Model} from '../..';
1515
import {Patch} from '../../../json-crdt-patch/Patch';

src/json-crdt/codec/structural/binary/__tests__/all-types-smoketest.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Model} from '../../../../model';
2-
import {runCodecAllTypesSmokeTests} from '../../json/__tests__/runCodecAllTypesSmokeTests';
2+
import {runCodecAllTypesSmokeTests} from '../../verbose/__tests__/runCodecAllTypesSmokeTests';
33
import {ViewDecoder} from '../ViewDecoder';
44

55
const assertCodec = (doc: Model) => {

src/json-crdt/codec/structural/compact-binary/__tests__/all-types-smoketest.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Model} from '../../../../model';
22
import {Encoder} from '../Encoder';
33
import {Decoder} from '../Decoder';
4-
import {runCodecAllTypesSmokeTests} from '../../json/__tests__/runCodecAllTypesSmokeTests';
4+
import {runCodecAllTypesSmokeTests} from '../../verbose/__tests__/runCodecAllTypesSmokeTests';
55

66
const encoder = new Encoder();
77
const decoder = new Decoder();

src/json-crdt/codec/structural/compact/__tests__/all-types-smoketest.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Model} from '../../../../model';
22
import {Encoder} from '../Encoder';
33
import {Decoder} from '../Decoder';
4-
import {runCodecAllTypesSmokeTests} from '../../json/__tests__/runCodecAllTypesSmokeTests';
4+
import {runCodecAllTypesSmokeTests} from '../../verbose/__tests__/runCodecAllTypesSmokeTests';
55

66
const encoder = new Encoder();
77
const decoder = new Decoder();

src/json-crdt/codec/structural/json/types.ts

Lines changed: 0 additions & 123 deletions
This file was deleted.

src/json-crdt/codec/structural/json/Decoder.ts renamed to src/json-crdt/codec/structural/verbose/Decoder.ts

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,17 @@ import {fromBase64} from '../../../../util/base64/fromBase64';
33
import {ITimestampStruct, ts, VectorClock} from '../../../../json-crdt-patch/clock';
44
import {Model} from '../../../model';
55
import {SESSION} from '../../../../json-crdt-patch/constants';
6-
import {
7-
JsonCrdtNode,
8-
ObjectJsonCrdtNode,
9-
ArrayJsonCrdtNode,
10-
ArrayJsonCrdtChunk,
11-
JsonCrdtRgaTombstone,
12-
ValueJsonCrdtNode,
13-
StringJsonCrdtNode,
14-
StringJsonCrdtChunk,
15-
ConstantJsonCrdtNode,
16-
BinaryJsonCrdtNode,
17-
BinaryJsonCrdtChunk,
18-
JsonCrdtSnapshot,
19-
JsonCrdtLogicalTimestamp,
20-
JsonCrdtTimestamp,
21-
TupleJsonCrdtNode,
22-
} from './types';
6+
import * as types from './types';
237

248
export class Decoder {
25-
public decode({time, root}: JsonCrdtSnapshot): Model {
9+
public decode({time, root}: types.JsonCrdtVerboseDocument): Model {
2610
const isServerClock = typeof time === 'number';
2711
const doc = isServerClock ? Model.withServerClock(time) : Model.withLogicalClock(this.cClock(time));
2812
this.cRoot(doc, root);
2913
return doc;
3014
}
3115

32-
protected cClock(timestamps: JsonCrdtLogicalTimestamp[]): VectorClock {
16+
protected cClock(timestamps: types.JsonCrdtVerboseLogicalTimestamp[]): VectorClock {
3317
const [stamp] = timestamps;
3418
const vectorClock = new VectorClock(stamp[0], stamp[1]);
3519
const length = timestamps.length;
@@ -41,18 +25,18 @@ export class Decoder {
4125
return vectorClock;
4226
}
4327

44-
protected cTs(stamp: JsonCrdtTimestamp): ITimestampStruct {
28+
protected cTs(stamp: types.JsonCrdtVerboseTimestamp): ITimestampStruct {
4529
const isServerClock = typeof stamp === 'number';
4630
return isServerClock ? ts(SESSION.SERVER, stamp) : ts(stamp[0], stamp[1]);
4731
}
4832

49-
protected cRoot(doc: Model, {node}: ValueJsonCrdtNode): void {
50-
const val = node ? this.cNode(doc, node) : new nodes.ConNode(doc.clock.tick(0), null);
33+
protected cRoot(doc: Model, {value}: types.JsonCrdtVerboseVal): void {
34+
const val = value ? this.cNode(doc, value) : new nodes.ConNode(doc.clock.tick(0), null);
5135
const root = new nodes.RootNode(doc, val.id);
5236
doc.root = root;
5337
}
5438

55-
protected cNode(doc: Model, node: JsonCrdtNode): nodes.JsonNode {
39+
protected cNode(doc: Model, node: types.JsonCrdtNode): nodes.JsonNode {
5640
switch (node.type) {
5741
case 'obj':
5842
return this.cObj(doc, node);
@@ -62,44 +46,45 @@ export class Decoder {
6246
return this.cStr(doc, node);
6347
case 'val':
6448
return this.cVal(doc, node);
65-
case 'const':
66-
return this.cConst(doc, node);
67-
case 'tup':
68-
return this.cTup(doc, node);
49+
case 'con':
50+
return this.cCon(doc, node);
51+
case 'vec':
52+
return this.cVec(doc, node);
6953
case 'bin':
7054
return this.cBin(doc, node);
7155
}
7256
throw new Error('UNKNOWN_NODE');
7357
}
7458

75-
protected cObj(doc: Model, node: ObjectJsonCrdtNode): nodes.ObjNode {
59+
protected cObj(doc: Model, node: types.JsonCrdtVerboseObj): nodes.ObjNode {
7660
const id = this.cTs(node.id);
7761
const obj = new nodes.ObjNode(doc, id);
78-
const keys = Object.keys(node.keys);
62+
const map = node.map;
63+
const keys = Object.keys(map);
7964
for (const key of keys) {
80-
const keyNode = node.keys[key];
65+
const keyNode = map[key];
8166
obj.put(key, this.cNode(doc, keyNode).id);
8267
}
8368
doc.index.set(id, obj);
8469
return obj;
8570
}
8671

87-
protected cTup(doc: Model, node: TupleJsonCrdtNode): nodes.VecNode {
72+
protected cVec(doc: Model, node: types.JsonCrdtVerboseVec): nodes.VecNode {
8873
const id = this.cTs(node.id);
8974
const obj = new nodes.VecNode(doc, id);
9075
const elements = obj.elements;
91-
const components = node.components;
92-
const length = components.length;
76+
const map = node.map;
77+
const length = map.length;
9378
for (let i = 0; i < length; i++) {
94-
const component = components[i];
79+
const component = map[i];
9580
if (!component) elements.push(undefined);
9681
else elements.push(this.cNode(doc, component).id);
9782
}
9883
doc.index.set(id, obj);
9984
return obj;
10085
}
10186

102-
protected cArr(doc: Model, node: ArrayJsonCrdtNode): nodes.ArrNode {
87+
protected cArr(doc: Model, node: types.JsonCrdtVerboseArr): nodes.ArrNode {
10388
const id = this.cTs(node.id);
10489
const rga = new nodes.ArrNode(doc, id);
10590
const chunks = node.chunks;
@@ -110,10 +95,10 @@ export class Decoder {
11095
rga.ingest(length, () => {
11196
const c = chunks[i++];
11297
const id = self.cTs(c.id);
113-
if (typeof (c as JsonCrdtRgaTombstone).span === 'number')
114-
return new nodes.ArrChunk(id, (c as JsonCrdtRgaTombstone).span, undefined);
98+
if (typeof (c as types.JsonCrdtVerboseTombstone).span === 'number')
99+
return new nodes.ArrChunk(id, (c as types.JsonCrdtVerboseTombstone).span, undefined);
115100
else {
116-
const ids = (c as ArrayJsonCrdtChunk).nodes.map((n) => this.cNode(doc, n).id);
101+
const ids = (c as types.JsonCrdtVerboseArrChunk).value.map((n) => this.cNode(doc, n).id);
117102
return new nodes.ArrChunk(id, ids.length, ids);
118103
}
119104
});
@@ -122,7 +107,7 @@ export class Decoder {
122107
return rga;
123108
}
124109

125-
protected cStr(doc: Model, node: StringJsonCrdtNode): nodes.StrNode {
110+
protected cStr(doc: Model, node: types.JsonCrdtVerboseStr): nodes.StrNode {
126111
const id = this.cTs(node.id);
127112
const rga = new nodes.StrNode(id);
128113
const chunks = node.chunks;
@@ -133,10 +118,10 @@ export class Decoder {
133118
rga.ingest(length, () => {
134119
const c = chunks[i++];
135120
const id = self.cTs(c.id);
136-
if (typeof (c as JsonCrdtRgaTombstone).span === 'number')
137-
return new nodes.StrChunk(id, (c as JsonCrdtRgaTombstone).span, '');
121+
if (typeof (c as types.JsonCrdtVerboseTombstone).span === 'number')
122+
return new nodes.StrChunk(id, (c as types.JsonCrdtVerboseTombstone).span, '');
138123
else {
139-
const value = (c as StringJsonCrdtChunk).value;
124+
const value = (c as types.JsonCrdtVerboseStrChunk).value;
140125
return new nodes.StrChunk(id, value.length, value);
141126
}
142127
});
@@ -145,7 +130,7 @@ export class Decoder {
145130
return rga;
146131
}
147132

148-
protected cBin(doc: Model, node: BinaryJsonCrdtNode): nodes.BinNode {
133+
protected cBin(doc: Model, node: types.JsonCrdtVerboseBin): nodes.BinNode {
149134
const id = this.cTs(node.id);
150135
const rga = new nodes.BinNode(id);
151136
const chunks = node.chunks;
@@ -156,10 +141,10 @@ export class Decoder {
156141
rga.ingest(length, () => {
157142
const c = chunks[i++];
158143
const id = self.cTs(c.id);
159-
if (typeof (c as JsonCrdtRgaTombstone).span === 'number')
160-
return new nodes.BinChunk(id, (c as JsonCrdtRgaTombstone).span, undefined);
144+
if (typeof (c as types.JsonCrdtVerboseTombstone).span === 'number')
145+
return new nodes.BinChunk(id, (c as types.JsonCrdtVerboseTombstone).span, undefined);
161146
else {
162-
const value = (c as BinaryJsonCrdtChunk).value;
147+
const value = (c as types.JsonCrdtVerboseBinChunk).value;
163148
const buf = fromBase64(value);
164149
return new nodes.BinChunk(id, buf.length, buf);
165150
}
@@ -169,17 +154,17 @@ export class Decoder {
169154
return rga;
170155
}
171156

172-
protected cVal(doc: Model, node: ValueJsonCrdtNode): nodes.ValNode {
157+
protected cVal(doc: Model, node: types.JsonCrdtVerboseVal): nodes.ValNode {
173158
const id = this.cTs(node.id);
174-
const val = this.cNode(doc, node.node);
159+
const val = this.cNode(doc, node.value);
175160
const obj = new nodes.ValNode(doc, id, val.id);
176161
doc.index.set(id, obj);
177162
return obj;
178163
}
179164

180-
protected cConst(doc: Model, node: ConstantJsonCrdtNode): nodes.ConNode {
165+
protected cCon(doc: Model, node: types.JsonCrdtVerboseCon): nodes.ConNode {
181166
const id = this.cTs(node.id);
182-
const val = node.timestamp ? this.cTs(node.value as JsonCrdtLogicalTimestamp) : node.value;
167+
const val = node.timestamp ? this.cTs(node.value as types.JsonCrdtVerboseLogicalTimestamp) : node.value;
183168
const obj = new nodes.ConNode(id, val);
184169
doc.index.set(id, obj);
185170
return obj;

0 commit comments

Comments
 (0)