import axios from 'axios'; import { Device } from 'mediasoup-client'; import { DtlsParameters } from 'mediasoup-client/lib/Transport'; export async function connectServerTransport( sendTransport, dtlsParameters: DtlsParameters, apiToken: string, apiUrl: string, ) { console.log('client: connecting send transport'); await axios .post(`${apiUrl}/transports/${sendTransport.id}/connect`, { dtlsParameters, apiToken, }) .catch((e) => { console.error('client: error connecting transport', e); throw e; }); console.log('client: connected'); } export async function createTransport( device: Device, type: 'send' | 'recv', apiUrl: string, apiToken: string, ) { const respTransport = await axios .post(`${apiUrl}/transports`, { sctpCapabilities: device.sctpCapabilities, apiToken, }) .catch((e) => { console.error('client: error creating transport', e); throw e; }); const transportInfo = respTransport.data; if (!transportInfo) { throw new Error('client: transport info is not defined'); } const { id, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, } = transportInfo; console.log('client: creating send transport on device'); const transportOptions = { id, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, }; const transport = type === 'send' ? device.createSendTransport(transportOptions) : device.createRecvTransport(transportOptions); transport.on('connectionstatechange', async (state) => { console.log(`client: ${type} transport connection state`, state); if (state === 'connected') { console.log('client: connected'); } }); transport?.on( 'connect', async (data: { dtlsParameters: DtlsParameters }, callback, errback) => { console.log(`client: connected ${type} transport`); connectServerTransport(transport, data.dtlsParameters, apiToken, apiUrl) .then(callback) .catch(errback); }, ); console.log(`client: created ${type} transport on device`); return transport; }