| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.reconstructPacket = exports.deconstructPacket = void 0; |
| const is_binary_1 = require("./is-binary"); |
| /** |
| * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. |
| * |
| * @param {Object} packet - socket.io event packet |
| * @return {Object} with deconstructed packet and list of buffers |
| * @public |
| */ |
| function deconstructPacket(packet) { |
| const buffers = []; |
| const packetData = packet.data; |
| const pack = packet; |
| pack.data = _deconstructPacket(packetData, buffers); |
| pack.attachments = buffers.length; // number of binary 'attachments' |
| return { packet: pack, buffers: buffers }; |
| } |
| exports.deconstructPacket = deconstructPacket; |
| function _deconstructPacket(data, buffers) { |
| if (!data) |
| return data; |
| if (is_binary_1.isBinary(data)) { |
| const placeholder = { _placeholder: true, num: buffers.length }; |
| buffers.push(data); |
| return placeholder; |
| } |
| else if (Array.isArray(data)) { |
| const newData = new Array(data.length); |
| for (let i = 0; i < data.length; i++) { |
| newData[i] = _deconstructPacket(data[i], buffers); |
| } |
| return newData; |
| } |
| else if (typeof data === "object" && !(data instanceof Date)) { |
| const newData = {}; |
| for (const key in data) { |
| if (data.hasOwnProperty(key)) { |
| newData[key] = _deconstructPacket(data[key], buffers); |
| } |
| } |
| return newData; |
| } |
| return data; |
| } |
| /** |
| * Reconstructs a binary packet from its placeholder packet and buffers |
| * |
| * @param {Object} packet - event packet with placeholders |
| * @param {Array} buffers - binary buffers to put in placeholder positions |
| * @return {Object} reconstructed packet |
| * @public |
| */ |
| function reconstructPacket(packet, buffers) { |
| packet.data = _reconstructPacket(packet.data, buffers); |
| packet.attachments = undefined; // no longer useful |
| return packet; |
| } |
| exports.reconstructPacket = reconstructPacket; |
| function _reconstructPacket(data, buffers) { |
| if (!data) |
| return data; |
| if (data && data._placeholder) { |
| return buffers[data.num]; // appropriate buffer (should be natural order anyway) |
| } |
| else if (Array.isArray(data)) { |
| for (let i = 0; i < data.length; i++) { |
| data[i] = _reconstructPacket(data[i], buffers); |
| } |
| } |
| else if (typeof data === "object") { |
| for (const key in data) { |
| if (data.hasOwnProperty(key)) { |
| data[key] = _reconstructPacket(data[key], buffers); |
| } |
| } |
| } |
| return data; |
| } |