import { ERROR_PACKET, PACKET_TYPES_REVERSE } from "./commons.js"; import { decode } from "./contrib/base64-arraybuffer.js"; const withNativeArrayBuffer = typeof ArrayBuffer === "function"; const decodePacket = (encodedPacket, binaryType) => { if (typeof encodedPacket !== "string") { return { type: "message", data: mapBinary(encodedPacket, binaryType) }; } const type = encodedPacket.charAt(0); if (type === "b") { return { type: "message", data: decodeBase64Packet(encodedPacket.substring(1), binaryType) }; } const packetType = PACKET_TYPES_REVERSE[type]; if (!packetType) { return ERROR_PACKET; } return encodedPacket.length > 1 ? { type: PACKET_TYPES_REVERSE[type], data: encodedPacket.substring(1) } : { type: PACKET_TYPES_REVERSE[type] }; }; const decodeBase64Packet = (data, binaryType) => { if (withNativeArrayBuffer) { const decoded = decode(data); return mapBinary(decoded, binaryType); } else { return { base64: true, data }; // fallback for old browsers } }; const mapBinary = (data, binaryType) => { switch (binaryType) { case "blob": return data instanceof ArrayBuffer ? new Blob([data]) : data; case "arraybuffer": default: return data; // assuming the data is already an ArrayBuffer } }; export default decodePacket;