fix: harden terminal websocket init

This commit is contained in:
JOJO 2025-11-24 20:11:58 +08:00
parent 75a7febcd1
commit a6da8280ff

View File

@ -414,6 +414,7 @@
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script> <script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.9.0/lib/xterm-addon-web-links.js"></script> <script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.9.0/lib/xterm-addon-web-links.js"></script>
<script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script> <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
<script src="/static/security.js"></script>
<script> <script>
// 全局变量 // 全局变量
@ -559,8 +560,44 @@
} }
// 初始化WebSocket连接 // 初始化WebSocket连接
function initWebSocket() { async function initWebSocket() {
socket = io(); const usePollingOnly = window.location.hostname !== 'localhost' &&
window.location.hostname !== '127.0.0.1';
const socketOptions = usePollingOnly ? {
transports: ['polling'],
upgrade: false,
autoConnect: false
} : {
transports: ['websocket', 'polling'],
autoConnect: false
};
socket = io('/', socketOptions);
const assignSocketToken = async () => {
if (typeof window.requestSocketToken !== 'function') {
console.warn('缺少 requestSocketToken(),无法获取终端连接凭证');
return false;
}
try {
const freshToken = await window.requestSocketToken();
socket.auth = { socket_token: freshToken };
return true;
} catch (error) {
console.error('获取 WebSocket token 失败:', error);
return false;
}
};
if (socket.io && typeof socket.io.on === 'function') {
socket.io.on('reconnect_attempt', async () => {
await assignSocketToken();
});
}
await assignSocketToken();
socket.connect();
// 连接成功 // 连接成功
socket.on('connect', () => { socket.on('connect', () => {
@ -895,7 +932,11 @@
// 初始化 // 初始化
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
initTerminal(); initTerminal();
initWebSocket(); initWebSocket().catch((error) => {
console.error('初始化 WebSocket 失败:', error);
updateConnectionStatus(false);
term.writeln('\x1b[31m✗ WebSocket 初始化失败,请刷新后重试\x1b[0m');
});
// 定时更新 // 定时更新
setInterval(updateCurrentTime, 1000); setInterval(updateCurrentTime, 1000);