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-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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user