opentok-rvc
Version:
Opentok react video chat which support stream connection and signalling
274 lines (237 loc) • 6.71 kB
JavaScript
;
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);
}
};
}