|
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.reconstructPacket = exports.deconstructPacket = void 0; |
|
const is_binary_js_1 = require("./is-binary.js"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function deconstructPacket(packet) { |
|
const buffers = []; |
|
const packetData = packet.data; |
|
const pack = packet; |
|
pack.data = _deconstructPacket(packetData, buffers); |
|
pack.attachments = buffers.length; |
|
return { packet: pack, buffers: buffers }; |
|
} |
|
exports.deconstructPacket = deconstructPacket; |
|
function _deconstructPacket(data, buffers) { |
|
if (!data) |
|
return data; |
|
if ((0, is_binary_js_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 (Object.prototype.hasOwnProperty.call(data, key)) { |
|
newData[key] = _deconstructPacket(data[key], buffers); |
|
} |
|
} |
|
return newData; |
|
} |
|
return data; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function reconstructPacket(packet, buffers) { |
|
packet.data = _reconstructPacket(packet.data, buffers); |
|
delete packet.attachments; |
|
return packet; |
|
} |
|
exports.reconstructPacket = reconstructPacket; |
|
function _reconstructPacket(data, buffers) { |
|
if (!data) |
|
return data; |
|
if (data && data._placeholder === true) { |
|
const isIndexValid = typeof data.num === "number" && |
|
data.num >= 0 && |
|
data.num < buffers.length; |
|
if (isIndexValid) { |
|
return buffers[data.num]; |
|
} |
|
else { |
|
throw new Error("illegal attachments"); |
|
} |
|
} |
|
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 (Object.prototype.hasOwnProperty.call(data, key)) { |
|
data[key] = _reconstructPacket(data[key], buffers); |
|
} |
|
} |
|
} |
|
return data; |
|
} |
|
|