connection fixes

This commit is contained in:
2025-10-06 09:41:23 +09:00
parent 4ceccae6ce
commit fa55367e68
361 changed files with 24633 additions and 6206 deletions

View File

@@ -1,268 +0,0 @@
#!/usr/bin/env node
/**
* Тест WebRTC соединения между Desktop Operator и Android
*/
const io = require('socket.io-client');
const WS_URL = 'ws://localhost:3001';
class WebRTCTester {
constructor() {
this.operatorSocket = null;
this.androidSocket = null;
this.operatorId = 'webrtc_operator_' + Math.random().toString(36).substr(2, 9);
this.deviceId = 'webrtc_android_' + Math.random().toString(36).substr(2, 9);
this.connectionId = null;
this.sessionId = null;
}
async setupConnections() {
console.log('🔧 Настройка WebRTC соединений...');
// Подключение Android
this.androidSocket = io(WS_URL);
await new Promise(resolve => {
this.androidSocket.on('connect', () => {
console.log('📱 Android WebSocket подключен');
resolve();
});
});
// Регистрация Android
this.androidSocket.emit('register:android', {
deviceId: this.deviceId,
deviceInfo: {
manufacturer: 'TestDevice',
model: 'WebRTC Test',
availableCameras: ['back'],
webrtcCapabilities: {
video: true,
audio: true,
codecs: ['H264', 'VP8', 'VP9'],
resolutions: ['720p', '1080p']
}
}
});
// Подключение Operator
this.operatorSocket = io(WS_URL);
await new Promise(resolve => {
this.operatorSocket.on('connect', () => {
console.log('💻 Operator WebSocket подключен');
resolve();
});
});
// Регистрация Operator
this.operatorSocket.emit('register:operator', {
operatorId: this.operatorId,
operatorInfo: {
name: 'WebRTC Tester',
permissions: ['view_cameras', 'request_camera', 'initiate_connection']
}
});
await new Promise(resolve => setTimeout(resolve, 1000));
}
setupWebRTCHandlers() {
console.log('📡 Настройка WebRTC обработчиков...');
// Operator стороне - получение offer от Android
this.operatorSocket.on('webrtc:offer', (data) => {
console.log('📤 Operator получил WebRTC offer:', {
connectionId: data.connectionId,
sdpType: data.offer.type,
sdpSize: data.offer.sdp.length
});
// Симулируем создание answer
setTimeout(() => {
console.log('📥 Operator отправляет WebRTC answer...');
this.operatorSocket.emit('webrtc:answer', {
connectionId: data.connectionId,
answer: {
type: 'answer',
sdp: this.generateMockSDP('answer')
}
});
}, 500);
});
// Operator стороне - получение ICE candidates от Android
this.operatorSocket.on('webrtc:ice-candidate', (data) => {
console.log('🧊 Operator получил ICE candidate от Android:', {
connectionId: data.connectionId,
candidate: data.candidate.candidate.substring(0, 50) + '...'
});
// Симулируем отправку своего ICE candidate
setTimeout(() => {
this.operatorSocket.emit('webrtc:ice-candidate', {
connectionId: data.connectionId,
candidate: {
candidate: 'candidate:1 1 UDP 2122252543 192.168.1.100 54400 typ host',
sdpMLineIndex: 0,
sdpMid: 'video'
}
});
}, 100);
});
// Android стороне - получение answer от Operator
this.androidSocket.on('webrtc:answer', (data) => {
console.log('📥 Android получил WebRTC answer:', {
connectionId: data.connectionId,
sdpType: data.answer.type
});
// Симулируем отправку ICE candidates
setTimeout(() => {
console.log('🧊 Android отправляет ICE candidates...');
for (let i = 0; i < 3; i++) {
this.androidSocket.emit('webrtc:ice-candidate', {
connectionId: data.connectionId,
candidate: {
candidate: `candidate:${i + 1} 1 UDP 2122252543 192.168.1.${100 + i} ${54400 + i} typ host`,
sdpMLineIndex: 0,
sdpMid: 'video'
}
});
}
}, 200);
});
// Android стороне - получение ICE candidates от Operator
this.androidSocket.on('webrtc:ice-candidate', (data) => {
console.log('🧊 Android получил ICE candidate от Operator:', {
connectionId: data.connectionId,
candidate: data.candidate.candidate.substring(0, 50) + '...'
});
});
// Обработка подключения камеры
this.androidSocket.on('camera:request', (data) => {
console.log('📷 Android получил запрос камеры для WebRTC');
this.sessionId = data.sessionId;
// Принимаем запрос
setTimeout(() => {
this.androidSocket.emit('camera:response', {
sessionId: data.sessionId,
accepted: true,
reason: 'camera_granted',
cameraType: 'back'
});
// Симулируем начало WebRTC после принятия камеры
setTimeout(() => {
this.initiateWebRTC(data.sessionId);
}, 1000);
}, 500);
});
// Уведомление о принятии камеры
this.operatorSocket.on('camera:accepted', (data) => {
console.log('✅ Operator: камера принята, ожидание WebRTC...');
});
}
generateMockSDP(type) {
return `v=0
o=- 123456789 2 IN IP4 192.168.1.100
s=-
t=0 0
a=group:BUNDLE video
a=msid-semantic: WMS stream
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:test
a=ice-pwd:testpassword
a=fingerprint:sha-256 AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99
a=setup:${type === 'offer' ? 'actpass' : 'active'}
a=mid:video
a=sendrecv
a=rtcp-mux
a=rtpmap:96 H264/90000
a=ssrc:12345 cname:test
a=ssrc:12345 msid:stream video`;
}
initiateWebRTC(connectionId) {
console.log('🚀 Android инициирует WebRTC соединение...');
// Android отправляет offer
this.androidSocket.emit('webrtc:offer', {
connectionId: connectionId,
offer: {
type: 'offer',
sdp: this.generateMockSDP('offer')
}
});
}
async testWebRTCFlow() {
console.log('📹 Тестирование WebRTC видеопотока...');
// Создаем подключение через legacy API
this.operatorSocket.emit('camera:request', {
deviceId: this.deviceId,
cameraType: 'back'
});
// Ждем завершения WebRTC handshake
await new Promise(resolve => setTimeout(resolve, 5000));
console.log('✅ WebRTC тестирование завершено!');
}
async runTest() {
try {
await this.setupConnections();
this.setupWebRTCHandlers();
await this.testWebRTCFlow();
console.log('\n📊 Результаты WebRTC тестирования:');
console.log('✅ WebSocket соединения установлены');
console.log('✅ Устройства зарегистрированы');
console.log('✅ WebRTC сигналинг работает');
console.log('✅ Обмен SDP offer/answer прошел успешно');
console.log('✅ ICE candidates обмениваются');
console.log('🎯 Готово для реального видеопотока!');
} catch (error) {
console.error('❌ Ошибка WebRTC тестирования:', error);
} finally {
this.cleanup();
}
}
cleanup() {
setTimeout(() => {
if (this.androidSocket) this.androidSocket.disconnect();
if (this.operatorSocket) this.operatorSocket.disconnect();
console.log('🧹 WebRTC тест завершен');
process.exit(0);
}, 1000);
}
}
// Запуск теста
async function main() {
console.log('🎬 Запуск WebRTC тестирования');
console.log('=' .repeat(50));
const tester = new WebRTCTester();
await tester.runTest();
}
if (require.main === module) {
main();
}
module.exports = WebRTCTester;