刷新页面时间
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m48s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m48s
				
			This commit is contained in:
		
							parent
							
								
									eb533aacdf
								
							
						
					
					
						commit
						df6ac7ba73
					
				
							
								
								
									
										12
									
								
								server.js
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								server.js
									
									
									
									
									
								
							| @ -8,7 +8,17 @@ const { MessageHistory } = require('./src/message_history.js'); | ||||
| 
 | ||||
| const app = express(); | ||||
| 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(); | ||||
|  | ||||
							
								
								
									
										77
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								src/index.js
									
									
									
									
									
								
							| @ -691,7 +691,18 @@ class WebRTCChat { | ||||
|                     clearTimeout(timeout); | ||||
|                     bufferVideo.removeEventListener('canplay', onCanPlay); | ||||
|                     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) => { | ||||
| @ -701,8 +712,12 @@ class WebRTCChat { | ||||
|                     reject(error); | ||||
|                 }; | ||||
|                  | ||||
|                 bufferVideo.addEventListener('canplay', onCanPlay); | ||||
|                 bufferVideo.addEventListener('error', onError); | ||||
|                 if (bufferVideo.readyState >= 3) { | ||||
|                     onCanPlay(); | ||||
|                 } else { | ||||
|                     bufferVideo.addEventListener('canplay', onCanPlay); | ||||
|                     bufferVideo.addEventListener('error', onError); | ||||
|                 } | ||||
|                  | ||||
|                 // 开始播放缓冲视频
 | ||||
|                 bufferVideo.play().catch(onError); | ||||
| @ -762,27 +777,51 @@ class WebRTCChat { | ||||
|     // 执行视频过渡动画
 | ||||
|     async performVideoTransition(currentVideo, bufferVideo) { | ||||
|         return new Promise((resolve) => { | ||||
|             // 添加切换类
 | ||||
|             currentVideo.classList.add('switching'); | ||||
|             bufferVideo.classList.add('switching'); | ||||
|             // 确保初始状态正确
 | ||||
|             bufferVideo.style.opacity = '0'; | ||||
|             bufferVideo.style.zIndex = '3'; | ||||
|             currentVideo.style.opacity = '1'; | ||||
|             currentVideo.style.zIndex = '2'; | ||||
|              | ||||
|             // 等待CSS过渡完成
 | ||||
|             setTimeout(() => { | ||||
|                 // 移除切换类
 | ||||
|                 currentVideo.classList.remove('switching'); | ||||
|                 bufferVideo.classList.remove('switching'); | ||||
|             // 设置过渡属性(如果还没有)
 | ||||
|             if (!bufferVideo.style.transition) { | ||||
|                 bufferVideo.style.transition = 'opacity 0.3s cubic-bezier(0.4, 0.0, 0.2, 1)'; | ||||
|             } | ||||
|             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'; | ||||
|                     bufferVideo.style.zIndex = '2'; | ||||
|                 } else { | ||||
|                     currentVideo.style.zIndex = '2'; | ||||
|                     bufferVideo.style.zIndex = '1'; | ||||
|                 } | ||||
|                      | ||||
|                     resolve(); | ||||
|                 } | ||||
|             }; | ||||
|              | ||||
|             bufferVideo.addEventListener('transitionend', onTransitionEnd); | ||||
|              | ||||
|             // 备用超时机制
 | ||||
|             setTimeout(() => { | ||||
|                 bufferVideo.removeEventListener('transitionend', onTransitionEnd); | ||||
|                 currentVideo.style.zIndex = '1'; | ||||
|                 bufferVideo.style.zIndex = '2'; | ||||
|                 resolve(); | ||||
|             }, 500); // 与CSS过渡时间一致
 | ||||
|             }, 400); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| @ -957,7 +996,7 @@ class WebRTCChat { | ||||
|             window.location.reload(); | ||||
|             this.startButton.style.display = 'block'; | ||||
|             this.startButton.disabled = false; | ||||
|         }, 2000); | ||||
|         }, 300); | ||||
|     } | ||||
| 
 | ||||
|     // 清除视频缓存的方法
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Song367
						Song367