Skip to content

Commit 0075640

Browse files
authored
Merge branch 'master' into node-versions
2 parents 1860631 + c308c4b commit 0075640

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

lib/encode.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ encode.getType = function (value) {
3131
if (ArrayBuffer.isView(value)) return 'arraybufferview'
3232
if (value instanceof Number) return 'number'
3333
if (value instanceof Boolean) return 'boolean'
34+
if (value instanceof Set) return 'set'
35+
if (value instanceof Map) return 'map'
3436
if (value instanceof ArrayBuffer) return 'arraybuffer'
3537
return typeof value
3638
}
@@ -41,7 +43,9 @@ encode._encode = function (buffers, data) {
4143
switch (encode.getType(data)) {
4244
case 'buffer': encode.buffer(buffers, data); break
4345
case 'object': encode.dict(buffers, data); break
46+
case 'map': encode.dictMap(buffers, data); break
4447
case 'array': encode.list(buffers, data); break
48+
case 'set': encode.listSet(buffers, data); break
4549
case 'string': encode.string(buffers, data); break
4650
case 'number': encode.number(buffers, data); break
4751
case 'boolean': encode.number(buffers, data); break
@@ -99,6 +103,22 @@ encode.dict = function (buffers, data) {
99103
buffers.push(buffE)
100104
}
101105

106+
encode.dictMap = function (buffers, data) {
107+
buffers.push(buffD)
108+
109+
var keys = Array.from(data.keys()).sort()
110+
111+
for (var key of keys) {
112+
if (data.get(key) == null) continue
113+
Buffer.isBuffer(key)
114+
? encode._encode(buffers, key)
115+
: encode.string(buffers, String(key))
116+
encode._encode(buffers, data.get(key))
117+
}
118+
119+
buffers.push(buffE)
120+
}
121+
102122
encode.list = function (buffers, data) {
103123
var i = 0
104124
var c = data.length
@@ -112,4 +132,15 @@ encode.list = function (buffers, data) {
112132
buffers.push(buffE)
113133
}
114134

135+
encode.listSet = function (buffers, data) {
136+
buffers.push(buffL)
137+
138+
for (var item of data) {
139+
if (item == null) continue
140+
encode._encode(buffers, item)
141+
}
142+
143+
buffers.push(buffE)
144+
}
145+
115146
module.exports = encode

test/encode.test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ test('bencode#encode()', function (t) {
3131
t.equal(bencode.encode(data).toString(), 'd2:1211:Hello World2:34i12345ee')
3232
})
3333

34+
t.test('should encode a Map as dictionary', function (t) {
35+
t.plan(1)
36+
var data = new Map([
37+
[ 12, 'Hello World' ],
38+
[ '34', 12345 ],
39+
[ Buffer.from('buffer key'), Buffer.from('buffer value') ]
40+
])
41+
t.equal(bencode.encode(data).toString(), 'd2:1211:Hello World2:34i12345e10:buffer key12:buffer valuee')
42+
})
43+
3444
t.test('should be able to encode a positive integer', function (t) {
3545
t.plan(1)
3646
t.equal(bencode.encode(123).toString(), 'i123e')
@@ -110,6 +120,11 @@ test('bencode#encode()', function (t) {
110120
t.equal(bencode.encode([32, 12]).toString(), 'li32ei12ee')
111121
t.equal(bencode.encode([':asdf:']).toString(), 'l6::asdf:e')
112122
})
123+
t.test('should be able to encode a Set as a list', function (t) {
124+
t.plan(2)
125+
t.equal(bencode.encode(new Set([32, 12])).toString(), 'li32ei12ee')
126+
t.equal(bencode.encode(new Set([':asdf:'])).toString(), 'l6::asdf:e')
127+
})
113128
t.test('should be able to encode an object', function (t) {
114129
t.plan(3)
115130
t.equal(bencode.encode({ 'a': 'bc' }).toString(), 'd1:a2:bce')

0 commit comments

Comments
 (0)