You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
1.2 KiB
33 lines
1.2 KiB
2 years ago
|
import encodePacket from "./encodePacket.js";
|
||
|
import decodePacket from "./decodePacket.js";
|
||
|
const SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text
|
||
|
const encodePayload = (packets, callback) => {
|
||
|
// some packets may be added to the array while encoding, so the initial length must be saved
|
||
|
const length = packets.length;
|
||
|
const encodedPackets = new Array(length);
|
||
|
let count = 0;
|
||
|
packets.forEach((packet, i) => {
|
||
|
// force base64 encoding for binary packets
|
||
|
encodePacket(packet, false, encodedPacket => {
|
||
|
encodedPackets[i] = encodedPacket;
|
||
|
if (++count === length) {
|
||
|
callback(encodedPackets.join(SEPARATOR));
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
const decodePayload = (encodedPayload, binaryType) => {
|
||
|
const encodedPackets = encodedPayload.split(SEPARATOR);
|
||
|
const packets = [];
|
||
|
for (let i = 0; i < encodedPackets.length; i++) {
|
||
|
const decodedPacket = decodePacket(encodedPackets[i], binaryType);
|
||
|
packets.push(decodedPacket);
|
||
|
if (decodedPacket.type === "error") {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return packets;
|
||
|
};
|
||
|
export const protocol = 4;
|
||
|
export { encodePacket, encodePayload, decodePacket, decodePayload };
|