core/adapters/diagram.adapter.ts
core/adapters/diagram.adapter.ts is a file in Bane's Lab Build Scripts. 89 lines of code and 18 definitions.
import {
ELK_PACKAGE,
ELK_ROUTE,
FONT_ROUTE,
MEDIA_TYPES,
MERMAID_PACKAGE,
MERMAID_ROUTE,
} from "#configuration/constants/diagram.constants";
import type { IncomingMessage, ServerResponse } from "node:http";
import { dirname, extname, join, normalize } from "node:path";
import { existsSync, readFileSync } from "node:fs";
import { NO_STAGE_PORT } from "#configuration/strings/diagram.strings";
import type { Server } from "node:https";
import type { Stage } from "#types/diagram.types";
import { absolutePath } from "@ssot/paths";
import { createServer } from "node:https";
import { devCertificate } from "#core/factories/certificate.factory";
import { fileURLToPath } from "node:url";
import { once } from "node:events";
import { stageMarkup } from "#core/formatters/diagram.formatter";
import { tokenValues } from "#core/converters/diagram.converter";
const LOOPBACK = "127.0.0.1";
const NOT_FOUND = 404;
const OK = 200;
const packageDist = function packageDist(specifier: string): string {
return dirname(fileURLToPath(import.meta.resolve(specifier)));
};
const serveFile = function serveFile(response: ServerResponse, file: string): void {
const clean = normalize(file);
if (!existsSync(clean)) {
response.statusCode = NOT_FOUND;
response.end();
return;
}
response.statusCode = OK;
response.setHeader("Content-Type", MEDIA_TYPES.get(extname(clean)) ?? "application/octet-stream");
response.end(readFileSync(clean));
};
const routeOf = function routeOf(roots: ReadonlyMap<string, string>, url: string): string | null {
for (const [route, root] of roots) {
if (url.startsWith(route)) {
return join(root, url.slice(route.length));
}
}
return null;
};
const handler = function handler(markup: string, roots: ReadonlyMap<string, string>) {
return function respond(request: IncomingMessage, response: ServerResponse): void {
const url = request.url ?? "";
if (url === "/") {
response.statusCode = OK;
response.setHeader("Content-Type", MEDIA_TYPES.get(".html") ?? "");
response.end(markup);
return;
}
const file = routeOf(roots, url);
if (file === null) {
response.statusCode = NOT_FOUND;
response.end();
return;
}
serveFile(response, file);
};
};
const listening = async function listening(server: Server): Promise<number> {
const bound = server.listen(0, LOOPBACK);
await once(bound, "listening");
const address = bound.address();
if (address === null || typeof address === "string") {
throw new Error(NO_STAGE_PORT);
}
return address.port;
};
export const openStage = async function openStage(): Promise<Stage> {
const tokens = tokenValues(readFileSync(absolutePath("app.tokens"), "utf8"));
const roots = new Map([
[MERMAID_ROUTE, packageDist(MERMAID_PACKAGE)],
[ELK_ROUTE, packageDist(ELK_PACKAGE)],
[FONT_ROUTE, absolutePath("app.fonts")],
]);
const server = createServer(await devCertificate(), handler(stageMarkup(tokens), roots));
const port = await listening(server);
return {
close: (): void => {
server.close();
},
url: `https://${LOOPBACK}:${String(port)}/`,
};
};