41 lines
2.1 KiB
JavaScript
41 lines
2.1 KiB
JavaScript
import { createHash } from "node:crypto";
|
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
import { homedir } from "node:os";
|
|
import { resolve } from "node:path";
|
|
|
|
const assetRoot = process.env.DADA_TEXT_ASSET_ROOT ?? resolve(homedir(), "Desktop", "sticker_text");
|
|
const fontRoot = resolve(assetRoot, "字体", "面板全量采集", "font_panel_full_20260722", "resources", "font_packages", "FONT081_Lexend Deca");
|
|
const metadataPath = resolve(fontRoot, "metadata.json");
|
|
const packagePath = resolve(fontRoot, "font_package.ztf");
|
|
const fontPath = resolve(fontRoot, "font_files", "02034l0o6r57rxed4027b5689e0dxe7e142r0vi8920akeqto.ttf");
|
|
|
|
if (![metadataPath, packagePath, fontPath].every(existsSync)) throw new Error("FONT081 archived source is unavailable.");
|
|
const metadata = JSON.parse(readFileSync(metadataPath, "utf8"));
|
|
const packageBytes = readFileSync(packagePath);
|
|
const fontBytes = readFileSync(fontPath);
|
|
const hash = (bytes) => createHash("sha256").update(bytes).digest("hex").toUpperCase();
|
|
const signature = fontBytes.subarray(0, 4).toString("hex").toUpperCase();
|
|
const validSignature = ["00010000", "4F54544F", "74746366"].includes(signature);
|
|
const packageSha256 = hash(packageBytes);
|
|
const expectedPackageSha256 = String(metadata.local_sha256 ?? "").toUpperCase();
|
|
if (metadata.candidate_id !== "FONT081" || metadata.font_family !== "Lexend Deca"
|
|
|| metadata.resource_status !== "verified_extracted" || packageSha256 !== expectedPackageSha256 || !validSignature) {
|
|
throw new Error("FONT081 archived source verification failed.");
|
|
}
|
|
|
|
const result = {
|
|
extracted_font_bytes: fontBytes.length,
|
|
extracted_font_sha256: hash(fontBytes),
|
|
fallback: null,
|
|
font_family: metadata.font_family,
|
|
font_id: metadata.candidate_id,
|
|
package_sha256: packageSha256,
|
|
package_status: metadata.package_status,
|
|
resource_status: metadata.resource_status,
|
|
sfnt_signature: signature,
|
|
source_access: "read_only_normative_archive",
|
|
status: "passed",
|
|
};
|
|
if (process.env.DADA_FONT_SOURCE_EVIDENCE) writeFileSync(process.env.DADA_FONT_SOURCE_EVIDENCE, `${JSON.stringify(result, null, 2)}\n`);
|
|
console.log(JSON.stringify(result, null, 2));
|