diff --git a/src/json-pack/resp/RespEncoder.ts b/src/json-pack/resp/RespEncoder.ts index 65b170cb5d..2fab26868f 100644 --- a/src/json-pack/resp/RespEncoder.ts +++ b/src/json-pack/resp/RespEncoder.ts @@ -300,15 +300,29 @@ export class RespEncoder<W extends IWriter & IWriterGrowable = IWriter & IWriter } public writeStartBin(): void { - throw new Error('Not implemented'); + this.writer.u32( + 36 * 0x1000000 + // $ + (63 << 16) + // ? + RESP.RN, // \r\n + ); } public writeBinChunk(buf: Uint8Array): void { - throw new Error('Not implemented'); + const writer = this.writer; + const length = buf.length; + writer.u8(59); // ; + writer.ascii(length + ''); + writer.u16(RESP.RN); // \r\n + writer.buf(buf, length); + writer.u16(RESP.RN); // \r\n } public writeEndBin(): void { - throw new Error('Not implemented'); + this.writer.u32( + 59 * 0x1000000 + // ; + (48 << 16) + // 0 + RESP.RN, // \r\n + ); } public writeStartArr(): void { diff --git a/src/json-pack/resp/__tests__/RespEncoder.spec.ts b/src/json-pack/resp/__tests__/RespEncoder.spec.ts index a5dd9ffa24..574bc282c9 100644 --- a/src/json-pack/resp/__tests__/RespEncoder.spec.ts +++ b/src/json-pack/resp/__tests__/RespEncoder.spec.ts @@ -283,4 +283,16 @@ describe('streaming data', () => { expect(toStr(encoded)).toBe('$?\r\n;3\r\nabc\r\n;3\r\ndef\r\n;0\r\n'); }); }); + + describe('binary', () => { + test('can write a streaming binary', () => { + const encoder = new RespEncoder(); + encoder.writeStartBin(); + encoder.writeBinChunk(new Uint8Array([65])); + encoder.writeBinChunk(new Uint8Array([66])); + encoder.writeEndBin(); + const encoded = encoder.writer.flush(); + expect(toStr(encoded)).toBe('$?\r\n;1\r\nA\r\n;1\r\nB\r\n;0\r\n'); + }); + }); });