import path from "node:path"; import { pathToFileURL } from "node:url"; import nativeText from "./native-text.cjs"; function escapeHtml(value) { return value.replace(/[&<>"']/g, (ch) => `&#${ch.charCodeAt(0)};`); } const escapeText = (value) => String(value) .replaceAll("&", "&") .replaceAll('"', """) .replaceAll("<", "<") .replaceAll(">", ">"); function around(template, name) { const at = template.indexOf(`{${name}}`); return at < 0 ? [template, ""] : [template.slice(0, at), template.slice(at + name.length + 2)]; } /** The page the main window shows when the background server never came up, in `text`'s language. */ export function buildErrorPage({ allPortsOccupied, logDir }, text = nativeText.englishText) { const serverLogPath = path.join(logDir, "server.log"); const serverLogHref = pathToFileURL(serverLogPath).href; const reason = text.t(allPortsOccupied ? "native.dialog.serverFailed.portsTaken" : "native.dialog.serverFailed.slow"); const [before, after] = around(text.t("native.dialog.serverFailed.keepsHappening"), "log"); return ( "data:text/html;charset=utf-8," + encodeURIComponent( `
🐭

${escapeText(text.t("native.dialog.serverFailed.title"))}

${escapeHtml(reason)} ${escapeText(before)}${escapeHtml(serverLogPath)}${escapeText(after)}

`, ) ); } /** The page the live-desktop viewer shows when it cannot open, in `text`'s language. */ export function desktopViewerErrorPage(message, retryUrl, text = nativeText.englishText) { return ( "data:text/html;charset=utf-8," + encodeURIComponent(`${escapeText(text.t("native.viewer.title"))}

${escapeText(text.t("native.viewer.heading"))}

${escapeText(message)}

${escapeText(text.t("native.viewer.open"))}
`) ); }