Skip to content

Commit e097971

Browse files
authored
feat: add more codecs
Add 6 new codecs: dag-json, dag-cbor, bencode, resp, bson, ejson
2 parents b88c391 + 555ff3c commit e097971

File tree

8 files changed

+157
-1
lines changed

8 files changed

+157
-1
lines changed

src/CliCodecs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {CliCodec} from './types';
22

3-
const CODEC_REGEX = /(\w{0,32})(?:\:(\w{0,32}))?/;
3+
const CODEC_REGEX = /([\w-]{0,32})(?:\:([\w-]{0,32}))?/;
44

55
export class CliCodecs {
66
public defaultCodec: string = 'json4';

src/codecs/bencode.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {BencodeDecoder} from '@jsonjoy.com/json-pack/lib/bencode/BencodeDecoder';
2+
import {BencodeEncoder} from '@jsonjoy.com/json-pack/lib/bencode/BencodeEncoder';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecBencode implements CliCodec<'bencode'> {
7+
public readonly id = 'bencode';
8+
public readonly description = 'Bencode: Bittorrent serialization format';
9+
protected readonly encoder: BencodeEncoder;
10+
protected readonly decoder: BencodeDecoder;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new BencodeEncoder(writer);
14+
this.decoder = new BencodeDecoder();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/codecs/bson.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {BsonDecoder} from '@jsonjoy.com/json-pack/lib/bson/BsonDecoder';
2+
import {BsonEncoder} from '@jsonjoy.com/json-pack/lib/bson/BsonEncoder';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecBson implements CliCodec<'bson'> {
7+
public readonly id = 'bson';
8+
public readonly description = 'BSON: MongoDB binary format';
9+
protected readonly encoder: BsonEncoder;
10+
protected readonly decoder: BsonDecoder;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new BsonEncoder(writer);
14+
this.decoder = new BsonDecoder();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/codecs/dag-cbor.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {CborDecoderDag} from '@jsonjoy.com/json-pack/lib/cbor/CborDecoderDag';
2+
import {CborEncoderDag} from '@jsonjoy.com/json-pack/lib/cbor/CborEncoderDag';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecDagCbor implements CliCodec<'dag-cbor'> {
7+
public readonly id = 'dag-cbor';
8+
public readonly description = 'DAG-CBOR: deterministic CBOR codec';
9+
protected readonly encoder: CborEncoderDag;
10+
protected readonly decoder: CborDecoderDag;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new CborEncoderDag(writer);
14+
this.decoder = new CborDecoderDag();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/codecs/dag-json.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {JsonDecoderDag} from '@jsonjoy.com/json-pack/lib/json/JsonDecoderDag';
2+
import {JsonEncoderDag} from '@jsonjoy.com/json-pack/lib/json/JsonEncoderDag';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecDagJson implements CliCodec<'dag-json'> {
7+
public readonly id = 'dag-json';
8+
public readonly description = 'DAG-JSON: deterministic JSON codec';
9+
protected readonly encoder: JsonEncoderDag;
10+
protected readonly decoder: JsonDecoderDag;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new JsonEncoderDag(writer);
14+
this.decoder = new JsonDecoderDag();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/codecs/ejson.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {EjsonDecoder} from '@jsonjoy.com/json-pack/lib/ejson/EjsonDecoder';
2+
import {EjsonEncoder} from '@jsonjoy.com/json-pack/lib/ejson/EjsonEncoder';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecEjson implements CliCodec<'ejson'> {
7+
public readonly id = 'ejson';
8+
public readonly description = 'EJSON v2: MongoDB text variant of BSON';
9+
protected readonly encoder: EjsonEncoder;
10+
protected readonly decoder: EjsonDecoder;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new EjsonEncoder(writer);
14+
this.decoder = new EjsonDecoder();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/codecs/resp.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {RespDecoder} from '@jsonjoy.com/json-pack/lib/resp/RespDecoder';
2+
import {RespEncoder} from '@jsonjoy.com/json-pack/lib/resp/RespEncoder';
3+
import type {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
4+
import type {CliCodec} from '../types';
5+
6+
export class CliCodecResp implements CliCodec<'resp'> {
7+
public readonly id = 'resp';
8+
public readonly description = 'RESP3: Redis serialization format';
9+
protected readonly encoder: RespEncoder;
10+
protected readonly decoder: RespDecoder;
11+
12+
constructor(protected readonly writer: Writer) {
13+
this.encoder = new RespEncoder(writer);
14+
this.decoder = new RespDecoder();
15+
}
16+
17+
encode(value: unknown): Uint8Array {
18+
return this.encoder.encode(value);
19+
}
20+
21+
decode(bytes: Uint8Array): unknown {
22+
return this.decoder.read(bytes);
23+
}
24+
}

src/defaultCodecs.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import {CliCodecText} from './codecs/text';
1010
import {CliCodecTree} from './codecs/tree';
1111
import {CliCodecUbjson} from './codecs/ubjson';
1212
import {CliCodecHex} from './codecs/hex';
13+
import {CliCodecDagJson} from './codecs/dag-json';
14+
import {CliCodecDagCbor} from './codecs/dag-cbor';
15+
import {CliCodecBencode} from './codecs/bencode';
16+
import {CliCodecResp} from './codecs/resp';
17+
import {CliCodecBson} from './codecs/bson';
18+
import {CliCodecEjson} from './codecs/ejson';
1319

1420
export const defaultCodecs = new CliCodecs();
1521

@@ -24,3 +30,9 @@ defaultCodecs.register(new CliCodecText());
2430
defaultCodecs.register(new CliCodecTree());
2531
defaultCodecs.register(new CliCodecRaw());
2632
defaultCodecs.register(new CliCodecHex());
33+
defaultCodecs.register(new CliCodecDagJson(writer));
34+
defaultCodecs.register(new CliCodecDagCbor(writer));
35+
defaultCodecs.register(new CliCodecBencode(writer));
36+
defaultCodecs.register(new CliCodecResp(writer));
37+
defaultCodecs.register(new CliCodecBson(writer));
38+
defaultCodecs.register(new CliCodecEjson(writer));

0 commit comments

Comments
 (0)