- Electron crash handlers (render-process-gone, child-process-gone, unresponsive/responsive, process warnings) with a circuit-breaker auto-reload for renderer crashes - Renderer error capture (window.onerror, unhandledrejection, React ErrorBoundary) forwarded to the main log via a one-way IPC channel - Memory-pressure heartbeat measured against the V8 heap_size_limit - Gated DEBUG log level (RD_DEBUG) and an in-memory ring of recent WARN/ERROR lines, exposed via the /errors endpoint and support bundle - Disk-error classification (ENOSPC etc.) on download failures and integrity-check pass/fail logging
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import React from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import { App } from "./App";
|
|
import { ErrorBoundary } from "./error-boundary";
|
|
import "./styles.css";
|
|
|
|
// Forward otherwise-silent renderer failures (uncaught errors, unhandled promise
|
|
// rejections) to the main process log. Without this, a renderer crash leaves no
|
|
// trace anywhere on an unattended server.
|
|
function reportRendererError(report: Parameters<typeof window.rd.reportRendererError>[0]): void {
|
|
try {
|
|
window.rd?.reportRendererError(report);
|
|
} catch {
|
|
}
|
|
}
|
|
|
|
window.addEventListener("error", (event) => {
|
|
reportRendererError({
|
|
kind: "error",
|
|
message: event.message || String(event.error || "Unbekannter Fehler"),
|
|
stack: event.error instanceof Error ? event.error.stack : undefined,
|
|
source: event.filename || undefined,
|
|
line: typeof event.lineno === "number" ? event.lineno : undefined,
|
|
column: typeof event.colno === "number" ? event.colno : undefined
|
|
});
|
|
});
|
|
|
|
window.addEventListener("unhandledrejection", (event) => {
|
|
const reason = event.reason;
|
|
reportRendererError({
|
|
kind: "unhandledrejection",
|
|
message: reason instanceof Error ? reason.message : String(reason),
|
|
stack: reason instanceof Error ? reason.stack : undefined
|
|
});
|
|
});
|
|
|
|
const rootElement = document.getElementById("root");
|
|
if (!rootElement) {
|
|
throw new Error("Root element fehlt");
|
|
}
|
|
|
|
createRoot(rootElement).render(
|
|
<React.StrictMode>
|
|
<ErrorBoundary>
|
|
<App />
|
|
</ErrorBoundary>
|
|
</React.StrictMode>
|
|
);
|