刷新页面时间
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m48s

This commit is contained in:
Song367 2025-08-06 17:29:26 +08:00
parent eb533aacdf
commit df6ac7ba73
2 changed files with 70 additions and 21 deletions

View File

@ -8,7 +8,17 @@ const { MessageHistory } = require('./src/message_history.js');
const app = express(); const app = express();
const server = http.createServer(app); const server = http.createServer(app);
const io = socketIo(server); const io = socketIo(server, {
pingTimeout: 60000, // 60秒超时
pingInterval: 25000, // 25秒心跳间隔
upgradeTimeout: 30000, // 30秒升级超时
allowEIO3: true, // 允许Engine.IO v3客户端
transports: ['websocket', 'polling'], // 支持多种传输方式
cors: {
origin: "*",
methods: ["GET", "POST"]
}
});
// 创建消息历史管理器 // 创建消息历史管理器
const messageHistory = new MessageHistory(); const messageHistory = new MessageHistory();

View File

@ -691,7 +691,18 @@ class WebRTCChat {
clearTimeout(timeout); clearTimeout(timeout);
bufferVideo.removeEventListener('canplay', onCanPlay); bufferVideo.removeEventListener('canplay', onCanPlay);
bufferVideo.removeEventListener('error', onError); bufferVideo.removeEventListener('error', onError);
resolve();
// 确保视频渲染了至少一帧
if (bufferVideo.readyState >= 2) {
resolve();
} else {
// 等待第一帧渲染
const onTimeUpdate = () => {
bufferVideo.removeEventListener('timeupdate', onTimeUpdate);
resolve();
};
bufferVideo.addEventListener('timeupdate', onTimeUpdate, { once: true });
}
}; };
const onError = (error) => { const onError = (error) => {
@ -701,8 +712,12 @@ class WebRTCChat {
reject(error); reject(error);
}; };
bufferVideo.addEventListener('canplay', onCanPlay); if (bufferVideo.readyState >= 3) {
bufferVideo.addEventListener('error', onError); onCanPlay();
} else {
bufferVideo.addEventListener('canplay', onCanPlay);
bufferVideo.addEventListener('error', onError);
}
// 开始播放缓冲视频 // 开始播放缓冲视频
bufferVideo.play().catch(onError); bufferVideo.play().catch(onError);
@ -762,27 +777,51 @@ class WebRTCChat {
// 执行视频过渡动画 // 执行视频过渡动画
async performVideoTransition(currentVideo, bufferVideo) { async performVideoTransition(currentVideo, bufferVideo) {
return new Promise((resolve) => { return new Promise((resolve) => {
// 添加切换类 // 确保初始状态正确
currentVideo.classList.add('switching'); bufferVideo.style.opacity = '0';
bufferVideo.classList.add('switching'); bufferVideo.style.zIndex = '3';
currentVideo.style.opacity = '1';
currentVideo.style.zIndex = '2';
// 等待CSS过渡完成 // 设置过渡属性(如果还没有)
setTimeout(() => { if (!bufferVideo.style.transition) {
// 移除切换类 bufferVideo.style.transition = 'opacity 0.3s cubic-bezier(0.4, 0.0, 0.2, 1)';
currentVideo.classList.remove('switching'); }
bufferVideo.classList.remove('switching'); if (!currentVideo.style.transition) {
currentVideo.style.transition = 'opacity 0.3s cubic-bezier(0.4, 0.0, 0.2, 1)';
// 交换z-index }
if (currentVideo.style.zIndex === '2' || !currentVideo.style.zIndex) {
// 强制重绘以确保样式生效
bufferVideo.offsetHeight;
// 开始过渡
requestAnimationFrame(() => {
bufferVideo.style.opacity = '1';
currentVideo.style.opacity = '0';
});
// 监听过渡完成
const onTransitionEnd = (e) => {
if (e.target === bufferVideo && e.propertyName === 'opacity') {
bufferVideo.removeEventListener('transitionend', onTransitionEnd);
// 重置z-index
currentVideo.style.zIndex = '1'; currentVideo.style.zIndex = '1';
bufferVideo.style.zIndex = '2'; bufferVideo.style.zIndex = '2';
} else {
currentVideo.style.zIndex = '2'; resolve();
bufferVideo.style.zIndex = '1';
} }
};
bufferVideo.addEventListener('transitionend', onTransitionEnd);
// 备用超时机制
setTimeout(() => {
bufferVideo.removeEventListener('transitionend', onTransitionEnd);
currentVideo.style.zIndex = '1';
bufferVideo.style.zIndex = '2';
resolve(); resolve();
}, 500); // 与CSS过渡时间一致 }, 400);
}); });
} }
@ -957,7 +996,7 @@ class WebRTCChat {
window.location.reload(); window.location.reload();
this.startButton.style.display = 'block'; this.startButton.style.display = 'block';
this.startButton.disabled = false; this.startButton.disabled = false;
}, 2000); }, 300);
} }
// 清除视频缓存的方法 // 清除视频缓存的方法