core/factories/certificate.factory.ts

core/factories/certificate.factory.ts is a file in Bane's Lab Build Scripts. 30 lines of code and 10 definitions.

import { existsSync, mkdirSync, readFileSync } from "node:fs";
import type { DevCertificate } from "#types/certificate.types";
import { absolutePath } from "@ssot/paths";
import { generate } from "selfsigned";
import { join } from "node:path";
import { writeVerbatim } from "@govlab/canonical-write";

const CERTIFICATE_DIR = absolutePath("app.certificates");
const KEY_FILE = join(CERTIFICATE_DIR, "localhost-key.pem");
const CERT_FILE = join(CERTIFICATE_DIR, "localhost-cert.pem");
const VALIDITY_DAYS = 365;
const MS_PER_DAY = 86_400_000;
const KEY_BITS = 2048;

const expiry = function expiry(): Date {
    return new Date(Date.now() + VALIDITY_DAYS * MS_PER_DAY);
};

const writeCertificate = async function writeCertificate(): Promise<void> {
    const pems = await generate([{ name: "commonName", value: "localhost" }], {
        keySize: KEY_BITS,
        notAfterDate: expiry(),
    });
    mkdirSync(CERTIFICATE_DIR, { recursive: true });
    writeVerbatim(KEY_FILE, pems.private);
    writeVerbatim(CERT_FILE, pems.cert);
};

export const devCertificate = async function devCertificate(): Promise<DevCertificate> {
    if (!existsSync(KEY_FILE) || !existsSync(CERT_FILE)) {
        await writeCertificate();
    }
    return { cert: readFileSync(CERT_FILE, "utf8"), key: readFileSync(KEY_FILE, "utf8") };
};