@karinjs/plugin-puppeteer
Version:
karin的 puppeteer截图、渲染插件
70 lines (68 loc) • 2.92 kB
JavaScript
import { getConfig, HMR_KEY, pluginVersion, pluginName } from './chunk-PIY2AHNK.js';
import path from 'node:path';
import { snapka } from '@snapka/puppeteer';
export * from '@snapka/puppeteer';
import { karin, registerRender, renderTpl, logger } from 'node-karin';
var formatBytes = (bytes) => {
const units = ["B", "KB", "MB", "GB", "TB"];
if (!bytes || bytes < 0) return "0 B";
const i = Math.floor(Math.log(bytes) / Math.log(1024));
const value = bytes / Math.pow(1024, i);
return `${i === 0 ? Math.round(value) : value.toFixed(2)} ${units[i]}`;
};
var getScreenshotByteSize = (payload, encoding) => {
try {
if (payload == null) return null;
const enc = (encoding || "").toLowerCase();
if (Array.isArray(payload)) {
let total = 0;
for (const item of payload) {
const size = getScreenshotByteSize(item, enc);
if (typeof size === "number") total += size;
}
return total;
}
if (typeof payload === "string") {
return enc === "base64" ? Buffer.from(payload, "base64").length : Buffer.byteLength(payload);
}
if (Buffer.isBuffer(payload)) return payload.length;
if (payload instanceof Uint8Array) return payload.byteLength;
if (payload instanceof ArrayBuffer) return payload.byteLength;
const anyPayload = payload;
if (typeof anyPayload.data === "string") {
return enc === "base64" ? Buffer.from(anyPayload.data, "base64").length : Buffer.byteLength(anyPayload.data);
}
if (Buffer.isBuffer(anyPayload.buffer)) return anyPayload.buffer.length;
if (anyPayload.buffer instanceof ArrayBuffer) return anyPayload.buffer.byteLength;
if (typeof anyPayload.byteLength === "number") return anyPayload.byteLength;
if (typeof anyPayload.length === "number") return anyPayload.length;
return null;
} catch {
return null;
}
};
var main = async () => {
const config = getConfig();
const browser = await snapka.launch(config);
karin.on(HMR_KEY, async () => {
await browser.restart();
});
const name = "@karinjs/plugin-puppeteer";
registerRender(name, async (options) => {
options.encoding = "base64";
const data = renderTpl(options);
data.encoding = options.encoding;
const time = Date.now();
const { run } = await browser.screenshot(data);
const result = await run();
const fileName = typeof data?.file === "string" ? path.basename(data.file) : "unknown";
const sizeBytes = getScreenshotByteSize(result, options.encoding);
const sizeStr = typeof sizeBytes === "number" ? `\u5927\u5C0F: ${logger.green(formatBytes(sizeBytes))} ` : "";
logger.info(
`[${name}][${fileName}] \u622A\u56FE\u5B8C\u6210 ${sizeStr}\u8017\u65F6: ${logger.green(Date.now() - time + "")} ms`
);
return result;
});
logger.info(`${logger.violet(`[\u63D2\u4EF6:${pluginVersion}]`)} ${logger.green(pluginName)} \u521D\u59CB\u5316\u5B8C\u6210~`);
};
main();