Replace CDN React/ReactDOM/Babel with local libs; remove Babel and inline scripts Build Tailwind locally, add safelist; switch to assets/tailwind.css Self-host Font Awesome and Inter (CSS + woff2); remove external font CDNs Implement strict CSP (no unsafe-inline/eval; scripts/styles/fonts from self) Extract inline handlers; move PWA scripts to external files Add local QR code generation (qrcode lib) and remove api.qrserver.com Improve SessionTypeSelector visual selection (highlighted background and ring) Keep PWA working with service worker and offline assets Refs: CSP hardening, offline-first, no external dependencies
109 lines
2.5 KiB
JavaScript
109 lines
2.5 KiB
JavaScript
"use strict";
|
|
|
|
let hasSyncZlib = true;
|
|
let zlib = require("zlib");
|
|
let inflateSync = require("./sync-inflate");
|
|
if (!zlib.deflateSync) {
|
|
hasSyncZlib = false;
|
|
}
|
|
let SyncReader = require("./sync-reader");
|
|
let FilterSync = require("./filter-parse-sync");
|
|
let Parser = require("./parser");
|
|
let bitmapper = require("./bitmapper");
|
|
let formatNormaliser = require("./format-normaliser");
|
|
|
|
module.exports = function (buffer, options) {
|
|
if (!hasSyncZlib) {
|
|
throw new Error(
|
|
"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
|
|
);
|
|
}
|
|
|
|
let err;
|
|
function handleError(_err_) {
|
|
err = _err_;
|
|
}
|
|
|
|
let metaData;
|
|
function handleMetaData(_metaData_) {
|
|
metaData = _metaData_;
|
|
}
|
|
|
|
function handleTransColor(transColor) {
|
|
metaData.transColor = transColor;
|
|
}
|
|
|
|
function handlePalette(palette) {
|
|
metaData.palette = palette;
|
|
}
|
|
|
|
function handleSimpleTransparency() {
|
|
metaData.alpha = true;
|
|
}
|
|
|
|
let gamma;
|
|
function handleGamma(_gamma_) {
|
|
gamma = _gamma_;
|
|
}
|
|
|
|
let inflateDataList = [];
|
|
function handleInflateData(inflatedData) {
|
|
inflateDataList.push(inflatedData);
|
|
}
|
|
|
|
let reader = new SyncReader(buffer);
|
|
|
|
let parser = new Parser(options, {
|
|
read: reader.read.bind(reader),
|
|
error: handleError,
|
|
metadata: handleMetaData,
|
|
gamma: handleGamma,
|
|
palette: handlePalette,
|
|
transColor: handleTransColor,
|
|
inflateData: handleInflateData,
|
|
simpleTransparency: handleSimpleTransparency,
|
|
});
|
|
|
|
parser.start();
|
|
reader.process();
|
|
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
|
|
//join together the inflate datas
|
|
let inflateData = Buffer.concat(inflateDataList);
|
|
inflateDataList.length = 0;
|
|
|
|
let inflatedData;
|
|
if (metaData.interlace) {
|
|
inflatedData = zlib.inflateSync(inflateData);
|
|
} else {
|
|
let rowSize =
|
|
((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;
|
|
let imageSize = rowSize * metaData.height;
|
|
inflatedData = inflateSync(inflateData, {
|
|
chunkSize: imageSize,
|
|
maxLength: imageSize,
|
|
});
|
|
}
|
|
inflateData = null;
|
|
|
|
if (!inflatedData || !inflatedData.length) {
|
|
throw new Error("bad png - invalid inflate data response");
|
|
}
|
|
|
|
let unfilteredData = FilterSync.process(inflatedData, metaData);
|
|
inflateData = null;
|
|
|
|
let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);
|
|
unfilteredData = null;
|
|
|
|
let normalisedBitmapData = formatNormaliser(bitmapData, metaData);
|
|
|
|
metaData.data = normalisedBitmapData;
|
|
metaData.gamma = gamma || 0;
|
|
|
|
return metaData;
|
|
};
|