UNPKG

mediasfu-reactnative

Version:
107 lines 5.76 kB
/** * Captures the canvas stream and handles the transport connection for screen sharing. * * @param {CaptureCanvasStreamOptions} options - The options for capturing the canvas stream. * @param {Object} options.parameters - The parameters required for capturing and managing the canvas stream. * @param {HTMLCanvasElement} options.parameters.canvasWhiteboard - The canvas element to capture the stream from. * @param {MediaStream} [options.parameters.canvasStream] - The current canvas stream, if any. * @param {Function} options.parameters.updateCanvasStream - Function to update the canvas stream state. * @param {Producer | null} [options.parameters.screenProducer] - The current screen producer, if any. * @param {Producer | null} [options.parameters.localScreenProducer] - The current local screen producer, if any. * @param {boolean} [options.parameters.transportCreated] - Flag indicating if the transport has been created. * @param {boolean} [options.parameters.localTransportCreated] - Flag indicating if the local transport has been created. * @param {Socket} [options.parameters.localSocket] - The local socket instance used for communication. * @param {Function} options.parameters.updateScreenProducer - Function to update the screen producer state. * @param {Function} options.parameters.updateLocalScreenProducer - Function to update the local screen producer state. * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration. * @param {Function} options.parameters.createSendTransport - Function to create a send transport for the screen. * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for the screen. * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for the screen. * @param {boolean} [start=true] - Flag indicating whether to start or stop the canvas stream. * @returns {Promise<void>} A promise that resolves when the operation is complete. * * @example * ```typescript * const canvasElement = document.querySelector('#canvas') as HTMLCanvasElement; * const options = { * parameters: { * canvasWhiteboard: canvasElement, * updateCanvasStream: (stream) => console.log('Canvas Stream Updated:', stream), * updateScreenProducer: (producer) => console.log('Screen Producer Updated:', producer), * updateLocalScreenProducer: (localProducer) => console.log('Local Screen Producer Updated:', localProducer), * createSendTransport: async (params) => console.log('Transport created with', params), * connectSendTransportScreen: async (options) => console.log('Transport connected with', options), * disconnectSendTransportScreen: async (params) => console.log('Transport disconnected with', params), * sleep: ({ ms }) => new Promise(resolve => setTimeout(resolve, ms)), * }, * start: true, * }; * await captureCanvasStream(options); * ``` */ export const captureCanvasStream = async ({ parameters, start = true, }) => { try { let { canvasWhiteboard, canvasStream, updateCanvasStream, screenProducer, localScreenProducer, transportCreated, localTransportCreated, updateScreenProducer, updateLocalScreenProducer, localSocket, //mediasfu functions sleep, createSendTransport, connectSendTransportScreen, disconnectSendTransportScreen, } = parameters; if (start && !canvasStream) { const stream = canvasWhiteboard.captureStream(30); canvasStream = stream; updateCanvasStream(canvasStream); if (localSocket && !localSocket.id) { try { if (!localTransportCreated) { await createSendTransport({ option: 'screen', parameters }); } else { try { if (localScreenProducer) { localScreenProducer.close(); if (updateLocalScreenProducer) { updateLocalScreenProducer(null); } await sleep({ ms: 500 }); } } catch (error) { console.error(error); } await connectSendTransportScreen({ stream: canvasStream, parameters }); } } catch (_a) { // do nothing } return; } if (!transportCreated) { await createSendTransport({ option: 'screen', parameters }); } else { try { if (screenProducer) { screenProducer.close(); updateScreenProducer(null); await sleep({ ms: 500 }); } } catch (error) { console.error(error); } await connectSendTransportScreen({ stream: canvasStream, parameters }); } } else { if (canvasStream && !start) { canvasStream.getTracks().forEach((track) => track === null || track === void 0 ? void 0 : track.stop()); canvasStream = null; updateCanvasStream(null); disconnectSendTransportScreen({ parameters }); } } } catch (error) { console.error(error, 'error in captureCanvasStream'); } }; //# sourceMappingURL=captureCanvasStream.js.map