/** * WebRTC signaling message handlers. * Processes WebSocket messages for WebRTC operations. */ import { getLiveSession, updateLiveSession } from './liveSessions.js' import { getRouter, createTransport, getTransport } from './mediasoup.js' /** * Handle WebSocket message for WebRTC signaling. * @param {string} userId * @param {string} sessionId * @param {string} type * @param {object} data * @returns {Promise} Response message or null */ export async function handleWebSocketMessage(userId, sessionId, type, data) { const session = getLiveSession(sessionId) if (!session) { return { error: 'Session not found' } } if (['create-transport', 'connect-transport'].includes(type) && session.userId !== userId) { return { error: 'Forbidden' } } try { switch (type) { case 'get-router-rtp-capabilities': { const router = await getRouter(sessionId) return { type: 'router-rtp-capabilities', data: router.rtpCapabilities } } case 'create-transport': { const router = await getRouter(sessionId) const { transport, params } = await createTransport(router) updateLiveSession(sessionId, { transportId: transport.id, routerId: router.id }) return { type: 'transport-created', data: params } } case 'connect-transport': { const { transportId, dtlsParameters } = data if (!transportId || !dtlsParameters) { return { error: 'transportId and dtlsParameters required' } } const transport = getTransport(transportId) if (!transport) { return { error: 'Transport not found' } } await transport.connect({ dtlsParameters }) return { type: 'transport-connected', data: { connected: true } } } default: return { error: `Unknown message type: ${type}` } } } catch (err) { console.error('[webrtc-signaling] Error:', err) return { error: err.message || 'Internal error' } } }