mediasfu-reactnative-expo
Version:
MediaSFU Prebuilt React Native (Expo) SDK
119 lines • 5 kB
JavaScript
/**
* Signals the creation of a new consumer transport.
*
* @param {SignalNewConsumerTransportOptions} options - The options for signaling a new consumer transport.
* @param {string} options.remoteProducerId - The ID of the remote producer.
* @param {string} options.islevel - Indicates the level of the consumer.
* @param {Socket} options.nsock - The socket instance for communication.
* @param {SignalNewConsumerTransportParameters} options.parameters - The parameters for the transport.
*
* @returns {Promise<string[] | void>} A promise that resolves to an array of consuming transports or void.
*
* @throws Will throw an error if the signaling process fails.
*
* @example
* const options = {
* remoteProducerId: 'producer-id',
* islevel: '1',
* nsock: socketInstance,
* parameters: {
* device: mediaDevice,
* consumingTransports: [],
* lock_screen: false,
* updateConsumingTransports: updateFunction,
* connectRecvTransport: connectFunction,
* reorderStreams: reorderFunction,
* getUpdatedAllParams: getUpdatedParamsFunction,
* },
* };
*
* signalNewConsumerTransport(options)
* .then(consumingTransports => {
* console.log('Consuming Transports:', consumingTransports);
* })
* .catch(error => {
* console.error('Error signaling new consumer transport:', error);
* });
*/
export const signalNewConsumerTransport = async ({ remoteProducerId, islevel, nsock, parameters, }) => {
try {
let { device, consumingTransports, lock_screen, updateConsumingTransports, connectRecvTransport, reorderStreams, } = parameters;
// Get updated parameters
const updatedParams = parameters.getUpdatedAllParams();
device = updatedParams.device;
consumingTransports = updatedParams.consumingTransports;
// Check if already consuming
if (consumingTransports.includes(remoteProducerId)) {
return consumingTransports;
}
// Add remote producer ID to consumingTransports array
consumingTransports.push(remoteProducerId);
updateConsumingTransports(consumingTransports);
// Emit createWebRtcTransport event to signal a new consumer
nsock.emit('createWebRtcTransport', { consumer: true, islevel }, async ({ params }) => {
if (params.error) {
// Handle error
return;
}
try {
// Create a new receiving transport using the received parameters
const consumerTransport = device.createRecvTransport({ ...params });
// Handle 'connect' event for the consumer transport
consumerTransport.on('connect', async ({ dtlsParameters }, callback, errback) => {
try {
// Emit transport-recv-connect event to signal connection
nsock.emit('transport-recv-connect', {
dtlsParameters,
serverConsumerTransportId: params.id,
});
callback();
}
catch (error) {
errback(error);
}
});
// Listen for connection state change
consumerTransport.on('connectionstatechange', async (state) => {
switch (state) {
case 'connecting':
// Handle connecting state
break;
case 'connected':
// Handle connected state
break;
case 'failed':
// Handle failed state
consumerTransport.close();
// Reorder streams based on conditions
if (lock_screen) {
await reorderStreams({ add: true, parameters });
}
else {
await reorderStreams({ add: false, parameters });
}
break;
default:
break;
}
});
// Connect the receiving transport
await connectRecvTransport({
consumerTransport,
remoteProducerId,
serverConsumerTransportId: params.id,
nsock,
parameters,
});
}
catch (error) {
console.log(error, 'createRecvTransport error');
// Handle error
}
});
}
catch (error) {
console.log(error, 'signalNewConsumerTransport error');
// Handle error
}
};
//# sourceMappingURL=signalNewConsumerTransport.js.map