mediasfu-reactnative
Version:
MediaSFU Prebuilt React Native SDK
103 lines • 5.98 kB
JavaScript
const connectLocalSendTransportScreen = async ({ stream, parameters, }) => {
var _a, _b;
try {
let { localScreenProducer, localProducerTransport, updateLocalScreenProducer, updateLocalProducerTransport, device, } = parameters;
// Find VP9 codec for local screen share
const codec = (_b = (_a = device === null || device === void 0 ? void 0 : device.rtpCapabilities) === null || _a === void 0 ? void 0 : _a.codecs) === null || _b === void 0 ? void 0 : _b.find((codec) => codec.mimeType.toLowerCase() === 'video/vp9');
// Produce local screen share data
if (localProducerTransport) {
localScreenProducer = await localProducerTransport.produce({
track: stream.getVideoTracks()[0],
codec,
appData: { mediaTag: 'screen-video' },
});
// Update the local producer and transport objects
updateLocalScreenProducer === null || updateLocalScreenProducer === void 0 ? void 0 : updateLocalScreenProducer(localScreenProducer);
updateLocalProducerTransport === null || updateLocalProducerTransport === void 0 ? void 0 : updateLocalProducerTransport(localProducerTransport);
}
}
catch (error) {
console.error('Error connecting local screen transport:', error);
throw error; // Re-throw to propagate the error
}
};
/**
* Sets up and connects a screen sharing transport for sending video streams.
*
* This function supports both a primary and a local screen producer, delegating local handling to a separate function.
*
* @param {ConnectSendTransportScreenOptions} options - The configuration options for setting up the screen transport.
* @param {'all' | 'local' | 'remote'} [options.targetOption] - The target option for connecting the transport.
* @param {MediaStream} options.stream - The screen stream to be shared.
* @param {ConnectSendTransportScreenParameters} options.parameters - The parameters required for setting up the screen transport.
* @param {Producer | null} options.parameters.screenProducer - The screen producer object to be updated.
* @param {Device | null} options.parameters.device - The device object for media capabilities.
* @param {ProducerOptions} options.parameters.screenParams - The parameters for the screen producer.
* @param {Transport | null} options.parameters.producerTransport - The producer transport object.
* @param {ProducerOptions} options.parameters.params - The parameters for the producer.
* @param {Function} options.parameters.updateScreenProducer - The function to update the screen producer object.
* @param {Function} options.parameters.updateProducerTransport - The function to update the producer transport object.
* @param {Function} [options.parameters.updateLocalScreenProducer] - The function to update the local screen producer object.
* @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.
* @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.
* @param {Object} [options.parameters.*] - Additional parameters for future use.
*
* @returns {Promise<void>} - A promise that resolves once the screen transport is successfully connected and set up.
*
* @throws Will throw an error if there is an issue with the connection or setup process.
*
* @example
* ```typescript
* await connectSendTransportScreen({
* stream: screenStream,
* targetOption: 'all',
* parameters: {
* screenProducer: null,
* localScreenProducer: null,
* device: mediaDevice,
* screenParams: { encodings: [{ maxBitrate: 1500000 }] },
* producerTransport: sendTransport,
* localProducerTransport: localSendTransport,
* params: { track: screenStream.getVideoTracks()[0] },
* updateScreenProducer: setScreenProducer,
* updateLocalScreenProducer: setLocalScreenProducer,
* updateProducerTransport: setProducerTransport,
* updateLocalProducerTransport: setLocalProducerTransport,
* getUpdatedAllParams: getParams,
* },
* });
* ```
*/
export const connectSendTransportScreen = async ({ stream, parameters, targetOption = 'all', }) => {
var _a, _b;
try {
let { screenProducer, device, screenParams, producerTransport, params, updateScreenProducer, updateProducerTransport, } = parameters;
// Fetch updated device information
device = parameters.getUpdatedAllParams().device;
// Retrieve screen share parameters
params = screenParams;
// Find VP9 codec for screen share
const codec = (_b = (_a = device === null || device === void 0 ? void 0 : device.rtpCapabilities) === null || _a === void 0 ? void 0 : _a.codecs) === null || _b === void 0 ? void 0 : _b.find((codec) => codec.mimeType.toLowerCase() === 'video/vp9');
// Produce screen share data using the producer transport
if (targetOption === 'remote' || targetOption === 'all') {
screenProducer = await producerTransport.produce(Object.assign(Object.assign({ track: stream.getVideoTracks()[0] }, params), { codec, appData: { mediaTag: 'screen-video' } }));
// Update the screen producer and producer transport objects
updateScreenProducer(screenProducer);
updateProducerTransport(producerTransport);
}
// Produce screen share data using the local producer transport
if (targetOption === 'local' || targetOption === 'all') {
try {
await connectLocalSendTransportScreen({ stream, parameters });
}
catch (localError) {
console.log('Error connecting local screen transport:', localError);
}
}
}
catch (error) {
console.log('connectSendTransportScreen error', error);
throw error;
}
};
//# sourceMappingURL=connectSendTransportScreen.js.map