UNPKG

rb-sdk

Version:

rb client sdk

319 lines (287 loc) 12.1 kB
'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;