@syngrisi/syngrisi
Version:
Syngrisi - Visual Testing Tool
105 lines • 3.22 kB
JavaScript
// 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