Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 0 additions & 18 deletions bignum/index.js

This file was deleted.

117 changes: 117 additions & 0 deletions lib/decode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/**
* Decodes bencoded data.
*
* @param {Buffer} data
* @param {Number} start (optional)
* @param {Number} end (optional)
* @param {String} encoding (optional)
* @return {Object|Array|Buffer|String|Number}
*/
function decode (data, start, end, encoding) {
if (typeof start !== 'number' && encoding == null) {
encoding = start
start = undefined
}

if (typeof end !== 'number' && encoding == null) {
encoding = end
end = undefined
}

decode.position = 0
decode.encoding = encoding || null

decode.data = !(Buffer.isBuffer(data))
? new Buffer(data)
: data.slice(start, end)

decode.bytes = decode.data.length

return decode.next()
}

decode.bytes = 0
decode.position = 0
decode.data = null
decode.encoding = null

decode.next = function () {
switch (decode.data[decode.position]) {
case 0x64:
return decode.dictionary()
case 0x6C:
return decode.list()
case 0x69:
return decode.integer()
default:
return decode.buffer()
}
}

decode.find = function (chr) {
var i = decode.position
var c = decode.data.length
var d = decode.data

while (i < c) {
if (d[i] === chr) return i
i++
}

throw new Error(
'Invalid data: Missing delimiter "' +
String.fromCharCode(chr) + '" [0x' +
chr.toString(16) + ']'
)
}

decode.dictionary = function () {
decode.position++

var dict = {}

while (decode.data[decode.position] !== 0x65) {
dict[decode.buffer()] = decode.next()
}

decode.position++

return dict
}

decode.list = function () {
decode.position++

var lst = []

while (decode.data[decode.position] !== 0x65) {
lst.push(decode.next())
}

decode.position++

return lst
}

decode.integer = function () {
var end = decode.find(0x65)
var number = decode.data.toString('ascii', decode.position + 1, end)

decode.position += end + 1 - decode.position

return parseInt(number, 10)
}

decode.buffer = function () {
var sep = decode.find(0x3A)
var length = parseInt(decode.data.toString('ascii', decode.position, sep), 10)
var end = ++sep + length

decode.position = end

return decode.encoding
? decode.data.toString(decode.encoding, sep, end)
: decode.data.slice(sep, end)
}

module.exports = decode
128 changes: 0 additions & 128 deletions lib/decoder.js

This file was deleted.

107 changes: 107 additions & 0 deletions lib/encode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/**
* Encodes data in bencode.
*
* @param {Buffer|Array|String|Object|Number|Boolean} data
* @return {Buffer}
*/
function encode (data, buffer, offset) {
var buffers = []
var result = null

encode._encode(buffers, data)
result = Buffer.concat(buffers)
encode.bytes = result.length

if (Buffer.isBuffer(buffer)) {
result.copy(buffer, offset)
return buffer
}

return result
}

encode.bytes = -1
encode._floatConversionDetected = false

encode._encode = function (buffers, data) {
if (Buffer.isBuffer(data)) {
buffers.push(new Buffer(data.length + ':'))
buffers.push(data)
return
}

switch (typeof data) {
case 'string':
encode.buffer(buffers, data)
break
case 'number':
encode.number(buffers, data)
break
case 'object':
data.constructor === Array
? encode.list(buffers, data)
: encode.dict(buffers, data)
break
case 'boolean':
encode.number(buffers, data ? 1 : 0)
break
}
}

var buffE = new Buffer('e')
var buffD = new Buffer('d')
var buffL = new Buffer('l')

encode.buffer = function (buffers, data) {
buffers.push(new Buffer(Buffer.byteLength(data) + ':' + data))
}

encode.number = function (buffers, data) {
var maxLo = 0x80000000
var hi = (data / maxLo) << 0
var lo = (data % maxLo) << 0
var val = hi * maxLo + lo

buffers.push(new Buffer('i' + val + 'e'))

if (val !== data && !encode._floatConversionDetected) {
encode._floatConversionDetected = true
console.warn(
'WARNING: Possible data corruption detected with value "' + data + '":',
'Bencoding only defines support for integers, value was converted to "' + val + '"'
)
console.trace()
}
}

encode.dict = function (buffers, data) {
buffers.push(buffD)

var j = 0
var k
// fix for issue #13 - sorted dicts
var keys = Object.keys(data).sort()
var kl = keys.length

for (; j < kl; j++) {
k = keys[j]
encode.buffer(buffers, k)
encode._encode(buffers, data[k])
}

buffers.push(buffE)
}

encode.list = function (buffers, data) {
var i = 0
var c = data.length
buffers.push(buffL)

for (; i < c; i++) {
encode._encode(buffers, data[i])
}

buffers.push(buffE)
}

module.exports = encode
Loading