Обновление файла

This commit is contained in:
2026-07-24 22:56:02 +03:00
parent 4eef281b15
commit 93038d4490
+19 -19
View File
@@ -1,30 +1,30 @@
// VNC-консоль через noVNC.
//
// noVNC — UMD/IIFE-библиотека, она не экспортирует ES-модули, поэтому
// подключаем её через <script> (лежит в /novnc/rfb.js, копируется из
// node_modules/@novnc/novnc/lib на этапе сборки Docker-образа).
// В noVNC 1.4.0 основной модуль — это ES-модуль (core/rfb.js), который
// экспортирует класс RFB через `export default`. Грузим его через
// динамический import(). Скрипт и его зависимости (vendor/, utils/,
// core/inflator.js и т.п.) лежат в /novnc/* внутри nginx-контейнера —
// собирается в Docker-образе из GitHub release (см. frontend/Dockerfile).
import { useEffect, useRef, useState } from "react";
import { api } from "../api.js";
const NOVNC_SCRIPT = "/novnc/rfb.js";
// @vite-ignore — запрещаем Vite пытаться разрешить путь на этапе сборки,
// иначе он упадёт, не найдя модуль в локальной файловой системе.
const NOVNC_MODULE_URL = "/novnc/core/rfb.js";
let scriptPromise = null;
let modulePromise = null;
function loadNoVNC() {
if (typeof window !== "undefined" && window.RFB) {
return Promise.resolve(window.RFB);
}
if (scriptPromise) return scriptPromise;
scriptPromise = new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = NOVNC_SCRIPT;
script.async = true;
script.onload = () => (window.RFB ? resolve(window.RFB) : reject(new Error("RFB не найден после загрузки скрипта")));
script.onerror = () => reject(new Error(`Не удалось загрузить ${NOVNC_SCRIPT}`));
document.head.appendChild(script);
});
return scriptPromise;
if (modulePromise) return modulePromise;
modulePromise = import(/* @vite-ignore */ NOVNC_MODULE_URL)
.then((mod) => {
if (!mod.default) {
throw new Error("RFB не найден в модуле noVNC");
}
return mod.default;
});
return modulePromise;
}
export default function ConsoleViewer({ instanceId }) {
@@ -83,4 +83,4 @@ export default function ConsoleViewer({ instanceId }) {
<div className="console-frame" ref={containerRef} style={{ width: "100%", height: 480 }} />
</div>
);
}
}