UNPKG

opentok-rvc

Version:

Opentok react video chat which support stream connection and signalling

274 lines (237 loc) 6.71 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createSession; /** * Create new video session */ function createSession() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, apiKey = _ref.apiKey, sessionId = _ref.sessionId, token = _ref.token, onStreamsUpdated = _ref.onStreamsUpdated, onConnect = _ref.onConnect, onError = _ref.onError, onSignalRecieve = _ref.onSignalRecieve, checkScreenSharing = _ref.checkScreenSharing, getDevices = _ref.getDevices, onMediaDevices = _ref.onMediaDevices; if (!apiKey) { throw new Error('Missing apiKey'); } if (!sessionId) { throw new Error('Missing sessionId'); } if (!token) { throw new Error('Missing token'); } var streams = []; var OTDeviceChecker = null; var deviceInterval = null; // Create new video stream // check the stream already created var onStreamCreated = function onStreamCreated(event) { var index = streams.findIndex(function (stream) { return stream.id === event.stream.id; }); if (index < 0) { streams.push(event.stream); onStreamsUpdated(streams); } }; // Destroy the video stream var onStreamDestroyed = function onStreamDestroyed(event) { var index = streams.findIndex(function (stream) { return stream.id === event.stream.id; }); if (index >= 0) { streams.splice(index, 1); onStreamsUpdated(streams); } }; // Event handlers used for the video session var eventHandlers = { streamCreated: onStreamCreated, streamDestroyed: onStreamDestroyed }; // Initialize opentok video session var session = OT.initSession(apiKey, sessionId); session.on(eventHandlers); session.connect(token, function (err) { if (!session) { // Either this session has been disconnected or OTSession // has been unmounted so don't invoke any callbacks return; } if (err && typeof onError === 'function') { onError(err); } else if (!err && typeof onConnect === 'function') { onConnect(); } }) // Event listener to check stream property change session.on("streamPropertyChanged", function (event) { console.log('streamPropertyChanged =>', event.stream); var subscribers = session.getSubscribersForStream(event.stream); // for (var i = 0; i < subscribers.length; i++) { // // You may want to display some UI text for each // // subscriber, or make some other UI change, // // based on event.changedProperty and // // event.newValue // } }) // Event listener to check stream is created session.on("streamCreated", function (event) { console.log("New stream in the session: " + event.stream.streamId); }); // signal message listener session.on('signal:msg', function signalCallback(event) { console.log(event); onSignalRecieve(event); }); // further signal samples session.on('signal:sessionStateChanged', function signalCallback(event) { console.log(event); onSignalRecieve(event); }); session.on('signal:sessionOnHold', function signalCallback(event) { console.log(event); onSignalRecieve(event); }); session.on('signal:newParticipant', function signalCallback(event) { console.log(event); onSignalRecieve(event); }); session.on('signal:updateDetails', function signalCallback(event) { console.log(event); onSignalRecieve(event); }); session.on('sessionDisconnect', function signalCallback(event) { if (session) { session.off(eventHandlers); session.disconnect(); } onSignalRecieve(event); }); // Send signal var onSignalSend = function onSignalSend(data) { session.signal({ type: 'chat', data: data }, function signalCallback(error) { if (error) { console.error('Error sending signal:', error.name, error.message); } else { console.log(data); } }); } // Check OT have screen share capability OT.checkScreenSharingCapability(function (response) { checkScreenSharing(response); }); // Get media devices that connected OT.getDevices(function (error, devices) { // dont allow the empty media devices var _devices = []; devices.forEach(device => { if (device.label !== '') { _devices.push(device); } }) onMediaDevices(devices); deviceInterval = setInterval(() => { getMediaDevices(); }, 1500); // start interval to get the video devices var videoDevices = []; devices.forEach(device => { if (device.kind === 'videoInput') { // if (device.label !== 'EpocCam Camera' && device.label !== '') { // videoDevices.push(device); // } if (device.label !== '') { if(device.label === 'EpocCam Camera') { // device.label = device.label+'('+device.deviceId.substring(1, 4)+')'; // videoDevices.push(device); } else { videoDevices.push(device); } } } }) if (videoDevices.length === 0) { OTDeviceChecker = setInterval(() => { getOTDevices(); }, 1000); } else { clearInterval(OTDeviceChecker); } }); var getOTDevices = function () { OT.getDevices(function (error, devices) { onMediaDevices(devices); var videoDevices = []; devices.forEach(device => { if (device.kind === 'videoInput') { // if (device.label !== 'EpocCam Camera') { // videoDevices.push(device); // } if(device.label === 'EpocCam Camera') { // device.label = device.label+'('+device.deviceId.substring(1, 4)+')'; // videoDevices.push(device); } else { videoDevices.push(device); } } }) if (videoDevices.length > 0) { clearInterval(OTDeviceChecker); } }); } // media device listener var getMediaDevices = function () { OT.getDevices(function (error, devices) { var media = { audioDevices: [], videoDevices: [] }; devices.forEach(device => { if (device.kind === 'audioInput' && device.label !== '') { media.audioDevices.push(device); } // if (device.kind === 'videoInput' && device.label !== '' && device.label !== 'EpocCam Camera') { if (device.kind === 'videoInput' && device.label !== '') { if(device.label === 'EpocCam Camera') { // device.label = device.label+'('+device.deviceId.substring(1, 4)+')'; // media.videoDevices.push(device); } else { media.videoDevices.push(device); } } }) getDevices(media); }); } return { session: session, streams: streams, disconnect: function disconnect() { if (session) { session.off(eventHandlers); session.disconnect(); } streams = null; onStreamCreated = null; onStreamDestroyed = null; eventHandlers = null; session = null; this.session = null; this.streams = null; clearInterval(OTDeviceChecker); } }; }