rb-sdk
Version:
rb client sdk
319 lines (287 loc) • 12.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _RBEvent = require('./RBEvent');
var _RBEvent2 = _interopRequireDefault(_RBEvent);
var _RBDebugger = require('./RBDebugger');
var _RBDebugger2 = _interopRequireDefault(_RBDebugger);
var _EventDispatcher = require('./EventDispatcher');
var _EventDispatcher2 = _interopRequireDefault(_EventDispatcher);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var ScreenRTC = function () {
function ScreenRTC(config) {
_classCallCheck(this, ScreenRTC);
this.remoteStream = null;
this.localStream = null;
this.PeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection || window.RTCPeerConnection || undefined;
this.RTCSessionDescription = window.webkitRTCSessionDescription || window.mozRTCSessionDescription || window.RTCSessionDescription || undefined;
this.conn = null;
this.candidates = [];
this.config = config;
this._init();
}
_createClass(ScreenRTC, [{
key: 'supportScreenShared',
value: function supportScreenShared() {
if (navigator.mediaDevices.getDisplayMedia) {
return true;
}
return false;
}
}, {
key: '_openScreenMedia',
value: function _openScreenMedia(constrains) {
var _this = this;
var _ref = window.require && window.require('electron'),
ipcRenderer = _ref.ipcRenderer;
if (!ipcRenderer) {
return false;
}
var success = function success(e) {
_RBDebugger2.default.info("Local screen media opened.", e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_SCREEN_MEDIA_OPENED, e));
};
var error = function error(e) {
_RBDebugger2.default.error("Local screen media open failed.", e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_SCREEN_MEDIA_OPEN_FAILED, e));
};
ipcRenderer.on('JS_RCB_START_SCREEN_SHARE_RSP', function (event, arg) {
var debugInfo = { event: event, args: arg };
_RBDebugger2.default.info("Recive sdk screen message.", debugInfo);
var rsp = JSON.parse(arg);
if (rsp.rsp_code != 200) {
console.log('share cancel.');
return;
}
var screen = rsp.data;
navigator.getUserMedia({ audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: screen.id + ''
} } }, success, error);
});
ipcRenderer.send('JS_RCB_START_SCREEN_SHARE_REQ');
return true;
}
}, {
key: 'openUserDisplayMedia',
value: function openUserDisplayMedia(constrains) {
if (this.localStream) return;
var _this = this;
var success = function success(e) {
_RBDebugger2.default.info("Local screen media opened.", e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_SCREEN_MEDIA_OPENED, e));
};
var error = function error(e) {
_RBDebugger2.default.error("Local screen media open failed.", e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_SCREEN_MEDIA_OPEN_FAILED, e));
};
if (this.supportScreenShared()) {
constrains = constrains || { video: true };
navigator.mediaDevices.getDisplayMedia(constrains).then(success).catch(error);
} else {
_RBDebugger2.default.error("Unsupport screen share api,please upgrade browser to latest version.", e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_SCREEN_UNSUPPORT, e));
}
}
}, {
key: 'getSupportedConstraints',
value: function getSupportedConstraints() {
return navigator.mediaDevices ? navigator.mediaDevices.getSupportedConstraints() : {};
}
}, {
key: '_init',
value: function _init() {
var _this = this;
_EventDispatcher2.default.addListener(_RBEvent2.default.LOCAL_SCREEN_MEDIA_OPENED, function (event) {
_RBDebugger2.default.info('Set local stream:', event.data);
_this.localStream = event.data;
_this.addLocalMediaToConnection();
});
_EventDispatcher2.default.addListener(_RBEvent2.default.REMOTE_SCREEN_MEDIA_OPENED, function (event) {
var trackEvent = event.data;
_this.remoteStream = trackEvent.stream || trackEvent.streams[0];
_RBDebugger2.default.info('Set remote stream:', _this.remoteStream);
});
}
}, {
key: 'close',
value: function close() {
if (!this.localStream) {
return;
}
var tracks = this.localStream.getTracks() || [];
tracks.forEach(function (track) {
try {
track.stop();
} catch (e) {
_RBDebugger2.default.error('Close track error:', { track: track, e: e });
}
});
this.localStream = null;
if (this.conn) {
this.conn.ontrack = null;
this.conn.onnicecandidate = null;
this.conn.oniceconnectionstatechange = null;
this.conn.onsignalingstatechange = null;
this.conn.onicegatheringstatechange = null;
this.conn.onnotificationneeded = null;
try {
this.conn.close();
} catch (e) {}
this.conn = null;
}
}
}, {
key: '_dispatchEvent',
value: function _dispatchEvent(rbEvent) {
_EventDispatcher2.default.dispatchEvent(rbEvent);
}
}, {
key: 'addLocalMediaToConnection',
value: function addLocalMediaToConnection() {
if (this.localStream && this.conn) {
_RBDebugger2.default.info('Add local stream in p2p connection', this.localStream);
if ('addTrack' in this.conn) {
for (var i = 0; i < this.localStream.getTracks().length; i++) {
this.conn.addTrack(this.localStream.getTracks()[i], this.localStream);
}
} else {
this.conn.addStream(this.localStream);
}
}
}
}, {
key: 'connect',
value: function connect() {
_RBDebugger2.default.info('New PeerConnection ready to remote.');
var serverConfig = {
"iceServers": [{ 'urls': 'stun:stun.schlund.de' }, { 'urls': 'turn:221.11.103.34', 'username': 'admin', 'credential': 'admin' }]
};
var conn = this.conn = new this.PeerConnection(serverConfig);
var _this = this;
this.addLocalMediaToConnection();
conn.onicecandidate = function (event) {
_RBDebugger2.default.info('WebRTC event[onicecandidate] occured.', event);
if (event.candidate) {
_RBDebugger2.default.info('Print event.candidate:', event.candidate);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.ON_SCREEN_ICECANDIDATE, event));
}
};
var inboundStream = null;
var _ontrack = function _ontrack(e) {
_RBDebugger2.default.info('Remote ontrack was recived:', e);
if (e.stream || e.streams && e.streams[0]) {
_RBDebugger2.default.info('Remote stream was recived:', e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.REMOTE_SCREEN_MEDIA_OPENED, e));
} else {
if (!inboundStream) {
inboundStream = new MediaStream();
}
inboundStream.addTrack(e.track);
}
};
conn.ontrack = _ontrack;
conn.oniceconnectionstatechange = function (event) {};
conn.onicegatheringstatechange = function (event) {};
conn.onsignalingstatechange = function (event) {};
conn.onnegotiationneeded = function (event) {};
}
}, {
key: 'addIceCandidate',
value: function addIceCandidate(candidate) {
var rtcCandidate = new RTCIceCandidate(candidate);
this.conn.addIceCandidate(rtcCandidate, function (candidate) {}, function (e) {
_RBDebugger2.default.error('Add addIceCandidate failed:', e);
});
_RBDebugger2.default.info('Begin add icecandidate to connection.', candidate);
}
}, {
key: 'createOffer',
value: function createOffer() {
if (this.conn.signalingState != "stable") {
_RBDebugger2.default.error("The connection isn't stable yet; so exit:", this.conn.signalingState);
return;
}
_RBDebugger2.default.info('Begin create local offer.', null);
var _this = this;
this.conn.createOffer().then(function (offer) {
_this.conn.setLocalDescription(offer);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.ON_SCREEN_OFFER_CREATED, offer));
_RBDebugger2.default.info('Complated create offer.', offer);
}).catch(function (e) {
_RBDebugger2.default.error('Failed create Local conn offer.', e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.ON_SCREEN_OFFER_FAILED, e));
});
}
}, {
key: 'createAnswer',
value: function createAnswer(_offer) {
_RBDebugger2.default.info('Begin create answer with offer:', _offer);
var _this = this;
var rtcsDesc = new RTCSessionDescription(_offer);
if (_this.conn.signalingState != "stable") {
_this.conn.setLocalDescription({ type: "rollback" });
_this.conn.setRemoteDescription(rtcsDesc, function () {}, function () {});
_RBDebugger2.default.error('P2P conn state is not [stable] so exit.', _this.conn.signalingState);
return;
}
this.conn.setRemoteDescription(rtcsDesc, function () {}, function () {});
this.conn.createAnswer(function (answer) {
_this.conn.setLocalDescription(answer);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.ON_SCREEN_ANSWER_CREATED, answer));
_RBDebugger2.default.info('Finish create answer:', answer);
}, function (e) {
_RBDebugger2.default.error('Failed to create answer.', e);
_EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.ON_SCREEN_ANSWER_FAILED, e));
});
}
}, {
key: 'receiveAnswer',
value: function receiveAnswer(answer) {
var rtcs = new RTCSessionDescription(answer);
this.conn.setRemoteDescription(rtcs);
_RBDebugger2.default.info('Recevied answer:', answer);
}
}, {
key: 'getLocalStream',
value: function getLocalStream() {
return this.localStream;
}
}, {
key: 'getRemoteStream',
value: function getRemoteStream() {
return this.remoteStream;
}
}, {
key: 'enabledAudio',
value: function enabledAudio(enabled) {
if (!this.localStream) {
return null;
}
var track = this.localStream.getAudioTracks()[0];
if (true === enabled || false === enabled) {
track.enabled = enabled;
}
return track.enabled;
}
}, {
key: 'enabledVideo',
value: function enabledVideo(enabled) {
if (!this.localStream) {
return;
}
var track = this.localStream.getVideoTracks()[0];
if (true === enabled || false === enabled) {
track.enabled = enabled;
}
return track.enabled;
}
}]);
return ScreenRTC;
}();
exports.default = ScreenRTC;