Нет активных сессий
'; - console.log('No sessions to display'); - return; - } - - console.log('Displaying', sessions.length, 'sessions'); - sessions.forEach(session => { - const sessionCard = document.createElement('div'); - sessionCard.className = `session-card session-${session.status}`; - - const statusText = { - 'pending': 'Ожидание', - 'active': 'Активна', - 'rejected': 'Отклонена', - 'ended': 'Завершена' - }; - - sessionCard.innerHTML = ` -Устройство: ${session.deviceId}
-Камера: ${session.cameraType}
-Статус: ${statusText[session.status] || session.status}
-Создана: ${new Date(session.createdAt).toLocaleString()}
- ${session.status === 'active' ? ` - - - - ` : ''} - `; - - container.appendChild(sessionCard); - }); - }); -} - -// Завершение сессии -function endSession(sessionId) { - if (!operatorSocket) { - showAlert('Не подключен как оператор', 'danger'); - return; - } - - operatorSocket.emit('session:end', { sessionId }); - logMessage('info', `Завершаем сессию: ${sessionId}`); -} - -// Переключение камеры -function switchCamera(sessionId, cameraType) { - if (!operatorSocket) { - showAlert('Не подключен как оператор', 'danger'); - return; - } - - operatorSocket.emit('camera:switch', { - sessionId, - cameraType - }); - logMessage('info', `Переключаем камеру: ${sessionId} на ${cameraType}`); -} - -// Показ уведомления -function showAlert(message, type) { +// Вспомогательная функция для показа уведомлений +function showAlert(type, message) { + // Создаем временное уведомление const alert = document.createElement('div'); alert.className = `alert alert-${type}`; alert.textContent = message; @@ -909,66 +814,10 @@ function showAlert(message, type) { document.body.appendChild(alert); + // Удаляем через 5 секунд setTimeout(() => { if (document.body.contains(alert)) { document.body.removeChild(alert); } }, 5000); -} - -// === ОПЕРАТОР: Веб-камера и WebRTC === -function showOperatorWebcamButton() { - const btn = document.getElementById('startOperatorWebcam'); - if (btn) btn.style.display = ''; -} -function hideOperatorWebcamButton() { - const btn = document.getElementById('startOperatorWebcam'); - if (btn) btn.style.display = 'none'; -} -function startOperatorWebcam() { - navigator.mediaDevices.getUserMedia({ video: true, audio: false }) - .then(stream => { - operatorWebcamStream = stream; - const video = document.getElementById('operatorWebcam'); - if (video) { - video.srcObject = stream; - video.style.display = ''; - } - startOperatorWebRTC(stream); - }) - .catch(err => { - showAlert('danger', 'Ошибка доступа к веб-камере: ' + err); - }); -} -function startOperatorWebRTC(stream) { - operatorWebcamPeer = new RTCPeerConnection(rtcConfig); - stream.getTracks().forEach(track => operatorWebcamPeer.addTrack(track, stream)); - operatorWebcamPeer.onicecandidate = e => { - if (e.candidate) { - socket.emit('webrtc:ice-candidate', { candidate: e.candidate }); - } - }; - operatorWebcamPeer.createOffer().then(offer => { - return operatorWebcamPeer.setLocalDescription(offer); - }).then(() => { - socket.emit('webrtc:offer', { offer: operatorWebcamPeer.localDescription }); - }); -} -socket.on('webrtc:answer', data => { - if (operatorWebcamPeer) { - operatorWebcamPeer.setRemoteDescription(new RTCSessionDescription(data.answer)); - } -}); -socket.on('webrtc:ice-candidate', data => { - if (operatorWebcamPeer && data.candidate) { - operatorWebcamPeer.addIceCandidate(new RTCIceCandidate(data.candidate)); - } -}); -// Показывать кнопку веб-камеры при принятии сессии -socket.on('camera:response', data => { - if (data.accepted) { - showOperatorWebcamButton(); - } else { - hideOperatorWebcamButton(); - } -}); \ No newline at end of file +} \ No newline at end of file diff --git a/backend/public/index.html b/backend/public/index.html index 3bf1f8e..28c4b06 100644 --- a/backend/public/index.html +++ b/backend/public/index.html @@ -400,14 +400,13 @@ + - -Нажмите кнопку включения камеры
-Оператор запрашивает доступ к камере
- -