function decodePackets(transmission, packetStart = 0) {
let version = transmission.substring(packetStart, packetStart + 3)
let typeID = transmission.substring(packetStart + 3, packetStart + 6)
let decodedPacket = {
version: version,
typeID: typeID,
content: null
}
let packetLength = 6
switch(typeID) {
case "100":
let literal = ""
let groupStart = packetStart + 6
let continueReadingLiteral = true
let group = null
while (continueReadingLiteral) {
group = transmission.substring(groupStart, groupStart + 5)
let continuationBit = group[0]
literal += group.substring(1)
if (continuationBit === "0")
continueReadingLiteral = false
else {
groupStart += 5
}
}
decodedPacket.content = literal
packetLength += (groupStart + 5) - packetStart - 6
break
default:
let lengthTypeID = transmission[packetStart + 6]
if (lengthTypeID === "0") {
let subPacketsLength = readBinary(transmission.substring(packetStart + 7, packetStart + 7 + 15))
let processedBits = 0
decodedPacket.content = []
while (processedBits < subPacketsLength) {
let [subPacket, subPacketLength] = decodePackets(transmission, packetStart + 7 + 15 + processedBits)
processedBits += subPacketLength
decodedPacket.content.push(subPacket)
}
packetLength += 1 + 15 + subPacketsLength
} else {
let subPacketsNumber = readBinary(transmission.substring(packetStart + 7, packetStart + 7 + 11))
let processedPackets = 0
let subPacketsTotalLength = 0
decodedPacket.content = []
while (processedPackets < subPacketsNumber) {
let [subPacket, subPacketLength] = decodePackets(transmission, packetStart + 7 + 11 + subPacketsTotalLength)
processedPackets++
subPacketsTotalLength += subPacketLength
decodedPacket.content.push(subPacket)
}
packetLength += 1 + 11 + subPacketsTotalLength
}
}
return [decodedPacket, packetLength]
}