Skip to content

Commit 655614e

Browse files
committed
feat(json-pack): 🎸 add verbatim string extension
1 parent 0096464 commit 655614e

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

src/json-pack/resp/RespEncoder.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {Writer} from '../../util/buffers/Writer';
22
import {RESP} from './constants';
33
import {utf8Size} from '../../util/strings/utf8';
4-
import {RespAttributes, RespPush} from './extensions';
4+
import {RespAttributes, RespPush, RespVerbatimString} from './extensions';
5+
import {JsonPackExtension} from '../JsonPackExtension';
56
import type {IWriter, IWriterGrowable} from '../../util/buffers';
67
import type {BinaryJsonEncoder, StreamingBinaryJsonEncoder, TlvBinaryJsonEncoder} from '../types';
78
import type {Slice} from '../../util/buffers/Slice';
@@ -38,8 +39,11 @@ export class RespEncoder<W extends IWriter & IWriterGrowable = IWriter & IWriter
3839
if (value instanceof Uint8Array) return this.writeBin(value);
3940
if (value instanceof Error) return this.writeErr(value.message);
4041
if (value instanceof Set) return this.writeSet(value);
41-
if (value instanceof RespPush) return this.writePush(value.val);
42-
if (value instanceof RespAttributes) return this.writeAttr(value.val);
42+
if (value instanceof JsonPackExtension) {
43+
if (value instanceof RespPush) return this.writePush(value.val);
44+
if (value instanceof RespVerbatimString) return this.writeVerbatimStr('txt', value.val);
45+
if (value instanceof RespAttributes) return this.writeAttr(value.val);
46+
}
4347
return this.writeObj(value as Record<string, unknown>);
4448
}
4549
case 'undefined':

src/json-pack/resp/__tests__/RespEncoder.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {bufferToUint8Array} from '../../../util/buffers/bufferToUint8Array';
22
import {RespEncoder} from '../RespEncoder';
3+
import {RespVerbatimString} from '../extensions';
34
const Parser = require('redis-parser');
45

56
const parse = (uint8: Uint8Array): unknown => {
@@ -76,6 +77,12 @@ describe('strings', () => {
7677
const encoded = encoder.writer.flush();
7778
expect(toStr(encoded)).toBe('=8\r\ntxt:asdf\r\n');
7879
});
80+
81+
test('can encode verbatim string using RespVerbatimString', () => {
82+
const encoder = new RespEncoder();
83+
const encoded = encoder.encode(new RespVerbatimString('asdf'));
84+
expect(toStr(encoded)).toBe('=8\r\ntxt:asdf\r\n');
85+
});
7986
});
8087
});
8188

src/json-pack/resp/extensions.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ export class RespAttributes extends JsonPackExtension<Record<string, unknown>> {
1111
super(2, val);
1212
}
1313
}
14+
15+
export class RespVerbatimString extends JsonPackExtension<string> {
16+
constructor(public readonly val: string) {
17+
super(3, val);
18+
}
19+
}

0 commit comments

Comments
 (0)