Skip to content

Commit 654d894

Browse files
committed
feat(json-pack): 🎸 add suppport for string encoding
1 parent 86f42a0 commit 654d894

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
lines changed

src/json-pack/bencode/BencodeEncoder.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {utf8Size} from '../../util/strings/utf8';
12
import type {IWriter, IWriterGrowable} from '../../util/buffers';
23
import type {BinaryJsonEncoder} from '../types';
34

@@ -95,15 +96,27 @@ export class BencodeEncoder implements BinaryJsonEncoder {
9596
}
9697

9798
public writeBin(buf: Uint8Array): void {
98-
throw new Error('Method not implemented.');
99+
const writer = this.writer;
100+
const length = buf.length;
101+
writer.ascii(length + '');
102+
writer.u8(0x3a); // ':'
103+
writer.buf(buf, length);
99104
}
100105

101106
public writeStr(str: string): void {
102-
throw new Error('Method not implemented.');
107+
const writer = this.writer;
108+
const length = utf8Size(str);
109+
writer.ascii(length + '');
110+
writer.u8(0x3a); // ':'
111+
writer.ensureCapacity(length);
112+
writer.utf8(str);
103113
}
104114

105115
public writeAsciiStr(str: string): void {
106-
throw new Error('Method not implemented.');
116+
const writer = this.writer;
117+
writer.ascii(str.length + '');
118+
writer.u8(0x3a); // ':'
119+
writer.ascii(str);
107120
}
108121

109122
public writeArr(arr: unknown[]): void {

src/json-pack/bencode/__tests__/BencodeEncoder.spec.ts

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -71,44 +71,36 @@ describe('number', () => {
7171
});
7272
});
7373

74-
// describe('string', () => {
75-
// test('empty string', () => {
76-
// assertEncoder('');
77-
// });
78-
79-
// test('one char strings', () => {
80-
// assertEncoder('a');
81-
// assertEncoder('b');
82-
// assertEncoder('z');
83-
// assertEncoder('~');
84-
// assertEncoder('"');
85-
// assertEncoder('\\');
86-
// assertEncoder('*');
87-
// assertEncoder('@');
88-
// assertEncoder('9');
89-
// assertEncoder('✅');
90-
// assertEncoder('👍');
91-
// });
92-
93-
// test('short strings', () => {
94-
// assertEncoder('abc');
95-
// assertEncoder('abc123');
96-
// });
74+
describe('string', () => {
75+
test('empty string', () => {
76+
assertEncoder('', utf8`0:`);
77+
});
9778

98-
// test('long strings', () => {
99-
// assertEncoder(
100-
// 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.',
101-
// );
102-
// });
79+
test('one char strings', () => {
80+
assertEncoder('a', utf8`1:a`);
81+
assertEncoder('b', utf8`1:b`);
82+
assertEncoder('z', utf8`1:z`);
83+
assertEncoder('~', utf8`1:~`);
84+
assertEncoder('"', utf8`1:"`);
85+
assertEncoder('\\', utf8`1:\\`);
86+
assertEncoder('*', utf8`1:*`);
87+
assertEncoder('@', utf8`1:@`);
88+
assertEncoder('9', utf8`1:9`);
89+
});
10390

104-
// test('unsafe character in the middle of a string', () => {
105-
// assertEncoder('...................".....................');
106-
// });
91+
test('short strings', () => {
92+
assertEncoder('abc', utf8`3:abc`);
93+
assertEncoder('abc123', utf8`6:abc123`);
94+
});
10795

108-
// test('unsafe character in the middle of a string - 2', () => {
109-
// assertEncoder('...................🎉.....................');
110-
// });
111-
// });
96+
test('long strings', () => {
97+
const txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.';
98+
assertEncoder(
99+
txt,
100+
utf8(`${txt.length}:${txt}`)
101+
);
102+
});
103+
});
112104

113105
// describe('array', () => {
114106
// test('empty array', () => {

0 commit comments

Comments
 (0)