Skip to content
2 changes: 1 addition & 1 deletion src/json-crdt-patch/codec/binary/Decoder.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtReader} from '../../util/binary/CrdtDecoder';
import {CrdtReader} from '../../util/binary/CrdtReader';
import {interval, ITimespanStruct, ITimestampStruct, VectorClock, ServerVectorClock, Timestamp} from '../../clock';
import {Patch} from '../../Patch';
import {PatchBuilder} from '../../PatchBuilder';
Expand Down
2 changes: 1 addition & 1 deletion src/json-crdt-patch/codec/binary/Encoder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as operations from '../../operations';
import {JsonCrdtPatchOpcode} from '../../constants';
import {CrdtWriter} from '../../util/binary/CrdtEncoder';
import {CrdtWriter} from '../../util/binary/CrdtWriter';
import {ITimespanStruct, ITimestampStruct, Timestamp} from '../../clock';
import {CborEncoder} from '../../../json-pack/cbor/CborEncoder';
import type {JsonCrdtPatchOperation, Patch} from '../../Patch';
Expand Down
2 changes: 1 addition & 1 deletion src/json-crdt-patch/codec/binary/shared.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {Encoder} from './Encoder';
import {Decoder} from './Decoder';
import {Patch} from '../../Patch';
import {CrdtWriter} from '../../util/binary/CrdtEncoder';
import {CrdtWriter} from '../../util/binary/CrdtWriter';

/** A shared instance of the {@link CrdtWriter} class. */
const writer = new CrdtWriter(1024 * 4);
Expand Down
1 change: 0 additions & 1 deletion src/json-crdt-patch/codec/clock/ClockDecoder.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {ITimestampStruct, VectorClock, ts} from '../../clock';
import type {CrdtReader} from '../../util/binary/CrdtDecoder';

export class ClockDecoder {
/** Clock session index to logical clock. */
Expand Down
1 change: 0 additions & 1 deletion src/json-crdt-patch/codec/clock/ClockEncoder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {ITimestampStruct, IVectorClock, tick} from '../../clock';
import {RelativeTimestamp} from './RelativeTimestamp';
import type {CrdtWriter} from '../../util/binary/CrdtEncoder';

class ClockTableEntry {
constructor(public index: number, public clock: ITimestampStruct) {}
Expand Down
4 changes: 2 additions & 2 deletions src/json-crdt-patch/codec/clock/ClockTable.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {ITimestampStruct, IVectorClock, Timestamp} from '../../clock';
import {CrdtReader} from '../../util/binary/CrdtDecoder';
import {CrdtWriter} from '../../util/binary/CrdtEncoder';
import {CrdtReader} from '../../util/binary/CrdtReader';
import {CrdtWriter} from '../../util/binary/CrdtWriter';

export class ClockTableEntry {
constructor(public index: number, public id: ITimestampStruct) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {Reader} from '../../../util/buffers/Reader';

/** @todo Rename file name. */
export class CrdtReader extends Reader {
public id(): [x: number, y: number] {
const byte = this.u8();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtReader} from '../CrdtDecoder';
import {CrdtWriter} from '../CrdtWriter';
import {CrdtReader} from '../CrdtReader';

const encoder = new CrdtWriter();
const decoder = new CrdtReader();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtWriter} from '../CrdtWriter';

const encoder = new CrdtWriter(1);
const encode = (flag: boolean, num: number): Uint8Array => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtWriter} from '../CrdtWriter';

const encoder = new CrdtWriter(1);
const encode = (flag: boolean, num: number): Uint8Array => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtWriter} from '../CrdtWriter';

const encoder = new CrdtWriter(1);
const encode = (x: number, z: number): Uint8Array => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtWriter} from '../CrdtWriter';

const encoder = new CrdtWriter(1);
const encode = (num: number): Uint8Array => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {CrdtWriter} from '../CrdtEncoder';
import {CrdtWriter} from '../CrdtWriter';

const encoder = new CrdtWriter(1);
const encode = (num: number): Uint8Array => {
Expand Down
2 changes: 1 addition & 1 deletion src/json-crdt/codec/indexed/binary/Decoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
StrChunk,
} from '../../../nodes';
import {ClockTable} from '../../../../json-crdt-patch/codec/clock/ClockTable';
import {CrdtReader} from '../../../../json-crdt-patch/util/binary/CrdtDecoder';
import {CrdtReader} from '../../../../json-crdt-patch/util/binary/CrdtReader';
import {IndexedFields, FieldName, IndexedNodeFields} from './types';
import {ITimestampStruct, IVectorClock, Timestamp, VectorClock} from '../../../../json-crdt-patch/clock';
import {Model, UNDEFINED} from '../../../model/Model';
Expand Down
2 changes: 1 addition & 1 deletion src/json-crdt/codec/indexed/binary/Encoder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {ITimestampStruct, Timestamp} from '../../../../json-crdt-patch/clock';
import {ClockTable} from '../../../../json-crdt-patch/codec/clock/ClockTable';
import {CrdtWriter} from '../../../../json-crdt-patch/util/binary/CrdtEncoder';
import {CrdtWriter} from '../../../../json-crdt-patch/util/binary/CrdtWriter';
import {MsgPackEncoder} from '../../../../json-pack/msgpack';
import {Model} from '../../../model';
import {ConNode, JsonNode, ValNode, ArrNode, BinNode, ObjNode, StrNode} from '../../../nodes';
Expand Down
3 changes: 2 additions & 1 deletion src/json-crdt/codec/structural/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Structural Codecs

Structural codecs encode the hierarchical structure of the document.
Structural codecs encode the hierarchical structure of the document. Indexed
codecs encode the document as a flat map of nodes.
105 changes: 47 additions & 58 deletions src/json-crdt/codec/structural/binary/Decoder.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {ClockDecoder} from '../../../../json-crdt-patch/codec/clock/ClockDecoder';
import {CrdtReader} from '../../../../json-crdt-patch/util/binary/CrdtDecoder';
import {CrdtReader} from '../../../../json-crdt-patch/util/binary/CrdtReader';
import {ITimestampStruct, Timestamp} from '../../../../json-crdt-patch/clock';
import {Model, UNDEFINED} from '../../../model/Model';
import {MsgPackDecoderFast} from '../../../../json-pack/msgpack';
import {CborDecoderBase} from '../../../../json-pack/cbor/CborDecoderBase';
import {SESSION} from '../../../../json-crdt-patch/constants';
import {
ArrNode,
Expand All @@ -18,8 +18,9 @@ import {
VecNode,
type JsonNode,
} from '../../../nodes';
import {CRDT_MAJOR} from './constants';

export class Decoder extends MsgPackDecoderFast<CrdtReader> {
export class Decoder extends CborDecoderBase<CrdtReader> {
protected doc!: Model;
protected clockDecoder?: ClockDecoder;
protected time: number = -1;
Expand Down Expand Up @@ -79,74 +80,62 @@ export class Decoder extends MsgPackDecoderFast<CrdtReader> {
return !peek ? UNDEFINED : this.cNode();
}

public cNode(): JsonNode {
protected cNode(): JsonNode {
const reader = this.reader;
const id = this.ts();
const byte = reader.u8();
if (byte <= 0b10001111) return this.cObj(id, byte & 0b1111);
else if (byte <= 0b10011111) return this.cArr(id, byte & 0b1111);
else if (byte <= 0b10111111) return this.cStr(id, byte & 0b11111);
else {
switch (byte) {
case 0xc4:
return this.cBin(id, reader.u8());
case 0xc5:
return this.cBin(id, reader.u16());
case 0xc6:
return this.cBin(id, reader.u32());
case 0xd4: {
const obj = new ConNode(id, this.val());
this.doc.index.set(id, obj);
return obj;
}
case 0xd5: {
const obj = new ConNode(id, this.ts());
this.doc.index.set(id, obj);
return obj;
}
case 0xd6: {
const val = this.cNode();
const obj = new ValNode(this.doc, id, val.id);
this.doc.index.set(id, obj);
return obj;
}
case 0xde:
return this.cObj(id, reader.u16());
case 0xdf:
return this.cObj(id, reader.u32());
case 0xdc:
return this.cArr(id, reader.u16());
case 0xdd:
return this.cArr(id, reader.u32());
case 0xd9:
return this.cStr(id, reader.u8());
case 0xda:
return this.cStr(id, reader.u16());
case 0xdb:
return this.cStr(id, reader.u32());
case 0xc7:
return this.cTup(id);
}
const octet = reader.u8();
const major = octet >> 5;
const minor = octet & 0b11111;
const length = minor < 24 ? minor : minor === 24 ? reader.u8() : minor === 25 ? reader.u16() : reader.u32();
switch (major) {
case CRDT_MAJOR.CON:
return this.cCon(id, length);
case CRDT_MAJOR.VAL:
return this.cVal(id);
case CRDT_MAJOR.VEC:
return this.cVec(id, length);
case CRDT_MAJOR.OBJ:
return this.cObj(id, length);
case CRDT_MAJOR.STR:
return this.cStr(id, length);
case CRDT_MAJOR.BIN:
return this.cBin(id, length);
case CRDT_MAJOR.ARR:
return this.cArr(id, length);
}
throw new Error('UNKNOWN_NODE');
}

public cObj(id: ITimestampStruct, length: number): ObjNode {
protected cCon(id: ITimestampStruct, length: number): ConNode {
const doc = this.doc;
const data = !length ? this.val() : this.ts();
const node = new ConNode(id, data);
doc.index.set(id, node);
return node;
}

protected cVal(id: ITimestampStruct): ValNode {
const child = this.cNode();
const doc = this.doc;
const node = new ValNode(doc, id, child.id);
doc.index.set(id, node);
return node;
}

protected cObj(id: ITimestampStruct, length: number): ObjNode {
const obj = new ObjNode(this.doc, id);
for (let i = 0; i < length; i++) this.cObjChunk(obj);
this.doc.index.set(id, obj);
return obj;
}

private cObjChunk(obj: ObjNode): void {
protected cObjChunk(obj: ObjNode): void {
const key: string = this.key();
obj.keys.set(key, this.cNode().id);
}

public cTup(id: ITimestampStruct): VecNode {
protected cVec(id: ITimestampStruct, length: number): VecNode {
const reader = this.reader;
const length = this.reader.u8();
reader.x++;
const obj = new VecNode(this.doc, id);
const elements = obj.elements;
for (let i = 0; i < length; i++) {
Expand All @@ -160,7 +149,7 @@ export class Decoder extends MsgPackDecoderFast<CrdtReader> {
return obj;
}

public cArr(id: ITimestampStruct, length: number): ArrNode {
protected cArr(id: ITimestampStruct, length: number): ArrNode {
const obj = new ArrNode(this.doc, id);
obj.ingest(length, this.cArrChunk);
this.doc.index.set(id, obj);
Expand All @@ -176,7 +165,7 @@ export class Decoder extends MsgPackDecoderFast<CrdtReader> {
return new ArrChunk(id, length, ids);
};

public cStr(id: ITimestampStruct, length: number): StrNode {
protected cStr(id: ITimestampStruct, length: number): StrNode {
const node = new StrNode(id);
if (length) node.ingest(length, this.cStrChunk);
this.doc.index.set(id, node);
Expand All @@ -192,11 +181,11 @@ export class Decoder extends MsgPackDecoderFast<CrdtReader> {
const length = reader.vu39();
return new StrChunk(id, length, '');
}
const text: string = this.str() as string;
const text: string = this.readAsStr() as string;
return new StrChunk(id, text.length, text);
};

public cBin(id: ITimestampStruct, length: number): BinNode {
protected cBin(id: ITimestampStruct, length: number): BinNode {
const node = new BinNode(id);
if (length) node.ingest(length, this.cBinChunk);
this.doc.index.set(id, node);
Expand Down
Loading