fix: harden terminal websocket init
This commit is contained in:
parent
75a7febcd1
commit
a6da8280ff
@ -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-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="/static/security.js"></script>
|
||||
|
||||
<script>
|
||||
// 全局变量
|
||||
@ -559,8 +560,44 @@
|
||||
}
|
||||
|
||||
// 初始化WebSocket连接
|
||||
function initWebSocket() {
|
||||
socket = io();
|
||||
async function initWebSocket() {
|
||||
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', () => {
|
||||
@ -895,7 +932,11 @@
|
||||
// 初始化
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
initTerminal();
|
||||
initWebSocket();
|
||||
initWebSocket().catch((error) => {
|
||||
console.error('初始化 WebSocket 失败:', error);
|
||||
updateConnectionStatus(false);
|
||||
term.writeln('\x1b[31m✗ WebSocket 初始化失败,请刷新后重试\x1b[0m');
|
||||
});
|
||||
|
||||
// 定时更新
|
||||
setInterval(updateCurrentTime, 1000);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user