mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-04 18:29:39 +02:00
69 lines
1.8 KiB
JavaScript
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
|