Skip to content

Commit 0b82925

Browse files
committed
feat(json-pack): 🎸 add Bencode dictionary encoding support
1 parent 3877aa2 commit 0b82925

File tree

2 files changed

+30
-52
lines changed

2 files changed

+30
-52
lines changed

src/json-pack/bencode/BencodeEncoder.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {utf8Size} from '../../util/strings/utf8';
2+
import {sort} from '../../util/sort/insertion';
23
import type {IWriter, IWriterGrowable} from '../../util/buffers';
34
import type {BinaryJsonEncoder} from '../types';
45

@@ -128,6 +129,15 @@ export class BencodeEncoder implements BinaryJsonEncoder {
128129
}
129130

130131
public writeObj(obj: Record<string, unknown>): void {
131-
throw new Error('Method not implemented.');
132+
const writer = this.writer;
133+
writer.u8(0x64); // 'd'
134+
const keys = sort(Object.keys(obj));
135+
const length = keys.length;
136+
for (let i = 0; i < length; i++) {
137+
const key = keys[i];
138+
this.writeStr(key);
139+
this.writeAny(obj[key]);
140+
}
141+
writer.u8(0x65); // 'e'
132142
}
133143
}

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

Lines changed: 19 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -134,57 +134,25 @@ describe('array', () => {
134134
});
135135
});
136136

137-
// describe('object', () => {
138-
// test('empty object', () => {
139-
// assertEncoder({});
140-
// });
141-
142-
// test('object with one key', () => {
143-
// assertEncoder({foo: 'bar'});
144-
// });
137+
describe('object', () => {
138+
test('empty object', () => {
139+
assertEncoder({}, utf8`de`);
140+
});
145141

146-
// test('object with two keys', () => {
147-
// assertEncoder({foo: 'bar', baz: 123});
148-
// });
142+
test('object with one key', () => {
143+
assertEncoder({foo: 'bar'}, utf8`d3:foo3:bare`);
144+
});
149145

150-
// test('object with various nested types', () => {
151-
// assertEncoder({
152-
// '': null,
153-
// null: false,
154-
// true: true,
155-
// str: 'asdfasdf ,asdf asdf asdf asdf asdf, asdflkasjdflakjsdflajskdlfkasdf',
156-
// num: 123,
157-
// arr: [1, 2, 3],
158-
// obj: {foo: 'bar'},
159-
// obj2: {1: 2, 3: 4},
160-
// });
161-
// });
162-
// });
146+
test('object with two keys (sorted)', () => {
147+
assertEncoder({foo: 'bar', baz: 123}, utf8`d3:bazi123e3:foo3:bare`);
148+
});
163149

164-
// describe('nested object', () => {
165-
// test('large array/object', () => {
166-
// assertEncoder({
167-
// foo: [
168-
// 1,
169-
// 2,
170-
// 3,
171-
// {
172-
// looongLoooonnnngggg: 'bar',
173-
// looongLoooonnnngggg2: 'bar',
174-
// looongLoooonnnngggg3: 'bar',
175-
// looongLoooonnnngggg4: 'bar',
176-
// looongLoooonnnngggg5: 'bar',
177-
// looongLoooonnnngggg6: 'bar',
178-
// looongLoooonnnngggg7: 'bar',
179-
// someVeryVeryLongKeyNameSuperDuperLongKeyName: 'very very long value, I said, very very long value',
180-
// someVeryVeryLongKeyNameSuperDuperLongKeyName1: 'very very long value, I said, very very long value',
181-
// someVeryVeryLongKeyNameSuperDuperLongKeyName2: 'very very long value, I said, very very long value',
182-
// someVeryVeryLongKeyNameSuperDuperLongKeyName3: 'very very long value, I said, very very long value',
183-
// someVeryVeryLongKeyNameSuperDuperLongKeyName4: 'very very long value, I said, very very long value',
184-
// someVeryVeryLongKeyNameSuperDuperLongKeyName5: 'very very long value, I said, very very long value',
185-
// someVeryVeryLongKeyNameSuperDuperLongKeyName6: 'very very long value, I said, very very long value',
186-
// },
187-
// ],
188-
// });
189-
// });
190-
// });
150+
test('object with various nested types', () => {
151+
assertEncoder({
152+
str: 'qwerty',
153+
num: 123,
154+
arr: [1, 2, 3],
155+
obj: {foo: 'bar'},
156+
}, utf8`d3:arrli1ei2ei3ee3:numi123e3:objd3:foo3:bare3:str6:qwertye`);
157+
});
158+
});

0 commit comments

Comments
 (0)