UNPKG

@syngrisi/syngrisi

Version:
105 lines 3.22 kB
// src/server/utils/domDumpUtils.ts import { gunzipSync, gzipSync } from "zlib"; import { createHash } from "crypto"; function isCompressedDomDump(data) { return data !== null && typeof data === "object" && "compressed" in data && data.compressed === true && "data" in data && typeof data.data === "string"; } function decompressDomDump(data) { if (!data) return null; try { if (typeof data === "object" && !isCompressedDomDump(data)) { return data; } if (isCompressedDomDump(data)) { const buffer = Buffer.from(data.data, "base64"); const decompressed = gunzipSync(buffer).toString("utf8"); return JSON.parse(decompressed); } if (typeof data === "string") { const parsed = JSON.parse(data); if (isCompressedDomDump(parsed)) { return decompressDomDump(parsed); } return parsed; } return null; } catch (e) { console.error("Failed to decompress domDump:", e); return null; } } function compressData(data) { const jsonString = typeof data === "string" ? data : JSON.stringify(data); return gzipSync(Buffer.from(jsonString, "utf8")); } function calculateHash(data) { const input = typeof data === "string" ? Buffer.from(data, "utf8") : data; return createHash("sha256").update(input).digest("hex"); } function prepareDomDumpForStorage(data, compressionHeader) { if (!data) { return { content: null, wasCompressed: false, originalSize: 0 }; } let wasCompressed = false; let content = null; let originalSize = 0; if (compressionHeader === "gzip") { wasCompressed = true; } if (typeof data === "string") { originalSize = Buffer.byteLength(data, "utf8"); try { const parsed = JSON.parse(data); if (isCompressedDomDump(parsed)) { wasCompressed = true; originalSize = parsed.originalSize; content = decompressDomDump(parsed); } else { content = parsed; } } catch { return { content: null, wasCompressed: false, originalSize: 0 }; } } else if (isCompressedDomDump(data)) { wasCompressed = true; originalSize = data.originalSize; content = decompressDomDump(data); } else { content = data; originalSize = Buffer.byteLength(JSON.stringify(data), "utf8"); } return { content, wasCompressed, originalSize }; } function serializeForStorage(data) { const jsonString = JSON.stringify(data); const originalSize = Buffer.byteLength(jsonString, "utf8"); const compressed = gzipSync(Buffer.from(jsonString, "utf8")); return { buffer: compressed, compressed: true, originalSize, compressedSize: compressed.length }; } function deserializeFromStorage(buffer, isCompressed) { try { if (isCompressed) { const decompressed = gunzipSync(buffer).toString("utf8"); return JSON.parse(decompressed); } return JSON.parse(buffer.toString("utf8")); } catch (e) { console.error("Failed to deserialize domDump from storage:", e); return null; } } export { calculateHash, compressData, decompressDomDump, deserializeFromStorage, isCompressedDomDump, prepareDomDumpForStorage, serializeForStorage }; //# sourceMappingURL=domDumpUtils.js.map