UNPKG

rb-sdk

Version:

rb client sdk

328 lines (298 loc) 12.2 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 WebRTC = function () { function WebRTC(config) { _classCallCheck(this, WebRTC); 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(WebRTC, [{ key: 'getUserMedia', value: async function getUserMedia(constrains) { var _this = this; var success = function success(e) { _RBDebugger2.default.info("Local media opened.", e); _EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_MEDIA_OPENED, e)); }; var error = function error(e) { _RBDebugger2.default.error("Local media open failed.", e); _EventDispatcher2.default.dispatchEvent(new _RBEvent2.default(_this, _RBEvent2.default.LOCAL_MEDIA_OPEN_FAILED, e)); }; if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia(constrains).then(success).catch(error); } else if (navigator.mozGetUserMedia) { navigator.mozGetUserMedia(constrains, success, error); } else if (navigator.webkitGetUserMedia) { navigator.webkitGetUserMedia(constrains).then(success).catch(error); } else if (navigator.getUserMedia) { navigator.getUserMedia(constrains, success, error); } } }, { 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_MEDIA_OPENED, function (event) { _RBDebugger2.default.info('Set local stream:', event.data); _this.localStream = event.data; _this.addLocalMediaToConnection(); }); _EventDispatcher2.default.addListener(_RBEvent2.default.REMOTE_MEDIA_OPENED, function (event) { var trackEvent = event.data; _this.remoteStream = trackEvent.stream || trackEvent.streams[0]; _RBDebugger2.default.info('Set remote stream:', _this.remoteStream); }); } }, { key: 'closeMedia', value: function closeMedia(video, audio) { if (false === video) { var tracks = this.localStream.getVideoTracks(); tracks.forEach(function (track) { try { track.stop(); } catch (e) { _RBDebugger2.default.error('Close vedio track error:', { track: track, e: e }); } }); } if (false === audio) { var _tracks = this.localStream.getAudioTracks(); _tracks.forEach(function (track) { try { track.stop(); } catch (e) { _RBDebugger2.default.error('Close vedio track error:', { track: track, e: e }); } }); } } }, { 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: 'openMedia', value: function openMedia(options) { this.getUserMedia(options); } }, { 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' }, { 'urls': 'turn:221.11.103.35', '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.WEBRTC_ON_LOCALE_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_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.WEBRTC_LOCAL_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.WEBRTC_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.WEBRTC_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.WEBRTC_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: 'applyConstraints', value: function applyConstraints(setting) { if (!setting || 'local' !== setting.stream && 'remote' !== setting.stream) { _RBDebugger2.default.error('The param setting is illegal:', setting); return; } var stream = 'remote' === setting.stream ? this.remoteStream : this.localStream; var tragetTrack = null; stream.getTracks().forEach(function (track) { if ('audio' === setting.media && 'audio' == track.kind) { tragetTrack = track; } if ('video' === setting.media && 'video' == track.kind) { tragetTrack = track; } }); if (!tragetTrack) { _RBDebugger2.default.warn('No track found:', setting); return; } tragetTrack.applyConstraints(setting.constraints).catch(function (e) { _RBDebugger2.default.error('Apply tracke constraints error:', e); }); } }, { 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 WebRTC; }(); exports.default = WebRTC;