Files
edgeever/scripts/create-windows-update-metadata.mjs

88 lines
2.9 KiB
JavaScript

import { createHash } from "node:crypto";
import { createReadStream, readFileSync, statSync, writeFileSync } from "node:fs";
import { basename, join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import {
WINDOWS_UPDATE_KEY_ID,
WINDOWS_UPDATE_MANIFEST_NAME,
} from "../apps/desktop/src/main/windows-update-trust.mjs";
const STABLE_VERSION = /^\d+\.\d+\.\d+$/;
const hashFile = (path, algorithm, encoding) => new Promise((resolveHash, rejectHash) => {
const hash = createHash(algorithm);
const stream = createReadStream(path);
stream.on("error", rejectHash);
stream.on("data", (chunk) => hash.update(chunk));
stream.on("end", () => resolveHash(hash.digest(encoding)));
});
export const createWindowsUpdateMetadata = async ({ directory, version }) => {
if (!STABLE_VERSION.test(version)) {
throw new Error(`Windows update version must be stable X.Y.Z: ${version}`);
}
const installerName = `EdgeEver-${version}-windows-x64.exe`;
const installerPath = join(directory, installerName);
const stats = statSync(installerPath);
if (!stats.isFile() || stats.size <= 0) {
throw new Error(`Windows installer is missing or empty: ${installerPath}`);
}
const [sha512, sha256] = await Promise.all([
hashFile(installerPath, "sha512", "base64"),
hashFile(installerPath, "sha256", "hex"),
]);
const releaseDate = new Date().toISOString();
const manifest = {
schemaVersion: 1,
keyId: WINDOWS_UPDATE_KEY_ID,
version,
platform: "win32",
arch: "x64",
releaseDate,
file: {
name: installerName,
size: stats.size,
sha512,
sha256,
},
};
writeFileSync(
join(directory, WINDOWS_UPDATE_MANIFEST_NAME),
`${JSON.stringify(manifest, null, 2)}\n`,
);
writeFileSync(join(directory, "latest.yml"), [
`version: ${version}`,
"files:",
` - url: ${installerName}`,
` sha512: ${sha512}`,
` size: ${stats.size}`,
`path: ${installerName}`,
`sha512: ${sha512}`,
`releaseDate: '${releaseDate}'`,
"",
].join("\n"));
writeFileSync(
join(directory, "SHA256SUMS-windows.txt"),
`${sha256} ${installerName}\n`,
);
return manifest;
};
const run = async () => {
const [directoryValue, version] = process.argv.slice(2);
if (!directoryValue || !version) {
throw new Error("Usage: node scripts/create-windows-update-metadata.mjs <directory> <version>");
}
const directory = resolve(directoryValue);
const packageVersion = JSON.parse(readFileSync("apps/desktop/package.json", "utf8")).version;
if (version !== packageVersion) {
throw new Error(`Requested version ${version} does not match desktop package version ${packageVersion}`);
}
const manifest = await createWindowsUpdateMetadata({ directory, version });
process.stdout.write(`${basename(directory)}: ${manifest.file.name}\n`);
};
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
await run();
}