1
0
Fork 0
mirror of https://github.com/DanielnetoDotCom/YouPHPTube synced 2025-10-04 18:29:39 +02:00
Oinktube/node_modules/bencode/lib/encoding-length.js
2023-02-17 15:04:26 -03:00

69 lines
1.8 KiB
JavaScript

const { digitCount, getType } = require('./util.js')
function listLength (list) {
let length = 1 + 1 // type marker + end-of-type marker
for (const value of list) {
length += encodingLength(value)
}
return length
}
function mapLength (map) {
let length = 1 + 1 // type marker + end-of-type marker
for (const [key, value] of map) {
const keyLength = Buffer.byteLength(key)
length += digitCount(keyLength) + 1 + keyLength
length += encodingLength(value)
}
return length
}
function objectLength (value) {
let length = 1 + 1 // type marker + end-of-type marker
const keys = Object.keys(value)
for (let i = 0; i < keys.length; i++) {
const keyLength = Buffer.byteLength(keys[i])
length += digitCount(keyLength) + 1 + keyLength
length += encodingLength(value[keys[i]])
}
return length
}
function stringLength (value) {
const length = Buffer.byteLength(value)
return digitCount(length) + 1 + length
}
function arrayBufferLength (value) {
const length = value.byteLength - value.byteOffset
return digitCount(length) + 1 + length
}
function encodingLength (value) {
const length = 0
if (value == null) return length
const type = getType(value)
switch (type) {
case 'buffer': return digitCount(value.length) + 1 + value.length
case 'arraybufferview': return arrayBufferLength(value)
case 'string': return stringLength(value)
case 'array': case 'set': return listLength(value)
case 'number': return 1 + digitCount(Math.floor(value)) + 1
case 'bigint': return 1 + value.toString().length + 1
case 'object': return objectLength(value)
case 'map': return mapLength(value)
default:
throw new TypeError(`Unsupported value of type "${type}"`)
}
}
module.exports = encodingLength