2017-05-31 17:55:18 +02:00
webpackJsonp ( [ 1 , 4 ] , {
2017-09-22 16:05:34 +02:00
/***/ 102 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2017-08-22 13:27:44 +02:00
"use strict" ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return CredentialsDialogComponent ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var _ _metadata = ( this && this . _ _metadata ) || function ( k , v ) {
if ( typeof Reflect === "object" && typeof Reflect . metadata === "function" ) return Reflect . metadata ( k , v ) ;
} ;
2017-08-22 13:27:44 +02:00
2017-09-22 16:05:34 +02:00
var CredentialsDialogComponent = ( function ( ) {
function CredentialsDialogComponent ( ) {
}
CredentialsDialogComponent . prototype . testVideo = function ( ) {
this . myReference . close ( this . secret ) ;
} ;
return CredentialsDialogComponent ;
} ( ) ) ;
CredentialsDialogComponent = _ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_4" /* Component */ ] ) ( {
selector : 'app-credentials-dialog' ,
template : "\n <div>\n <h1 md-dialog-title>\n Insert your secret\n </h1>\n <form #dialogForm (ngSubmit)=\"testVideo()\">\n <md-dialog-content>\n <md-input-container>\n <input mdInput name=\"secret\" type=\"password\" [(ngModel)]=\"secret\">\n </md-input-container>\n </md-dialog-content>\n <md-dialog-actions>\n <button md-button md-dialog-close>CANCEL</button>\n <button md-button id=\"join-btn\" type=\"submit\">TEST</button>\n </md-dialog-actions>\n </form>\n </div>\n " ,
styles : [ "\n #quality-div {\n margin-top: 20px;\n }\n #join-div {\n margin-top: 25px;\n margin-bottom: 20px;\n }\n #quality-tag {\n display: block;\n }\n h5 {\n margin-bottom: 10px;\n text-align: left;\n }\n #joinWithVideo {\n margin-right: 50px;\n }\n md-dialog-actions {\n display: block;\n }\n #join-btn {\n float: right;\n }\n " ] ,
} ) ,
_ _metadata ( "design:paramtypes" , [ ] )
] , CredentialsDialogComponent ) ;
//# sourceMappingURL=credentials-dialog.component.js.map
/***/ } ) ,
/***/ 103 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _material _ _ = _ _webpack _require _ _ ( 101 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _2 _ _services _info _service _ _ = _ _webpack _require _ _ ( 55 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _3 _openvidu _browser _ _ = _ _webpack _require _ _ ( 308 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _3 _openvidu _browser _ _ _default = _ _webpack _require _ _ . n ( _ _WEBPACK _IMPORTED _MODULE _3 _openvidu _browser _ _ ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _4 _ _credentials _dialog _component _ _ = _ _webpack _require _ _ ( 102 ) ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return DashboardComponent ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var _ _metadata = ( this && this . _ _metadata ) || function ( k , v ) {
if ( typeof Reflect === "object" && typeof Reflect . metadata === "function" ) return Reflect . metadata ( k , v ) ;
} ;
var DashboardComponent = ( function ( ) {
function DashboardComponent ( infoService , dialog ) {
2017-08-22 13:27:44 +02:00
var _this = this ;
2017-09-22 16:05:34 +02:00
this . infoService = infoService ;
this . dialog = dialog ;
this . lockScroll = false ;
this . info = [ ] ;
this . testStatus = 'DISCONNECTED' ;
this . testButton = 'Test' ;
this . tickClass = 'trigger' ;
this . showSpinner = false ;
this . msgChain = [ ] ;
// Subscription to info updated event raised by InfoService
this . infoSubscription = this . infoService . newInfo$ . subscribe ( function ( info ) {
_this . info . push ( info ) ;
_this . scrollToBottom ( ) ;
2017-08-22 13:27:44 +02:00
} ) ;
}
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . ngOnInit = function ( ) {
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . beforeunloadHandler = function ( ) {
// On window closed leave test session
if ( this . session ) {
this . endTestVideo ( ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . ngOnDestroy = function ( ) {
// On component destroyed leave test session
if ( this . session ) {
this . endTestVideo ( ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . toggleTestVideo = function ( ) {
if ( ! this . session ) {
this . testVideo ( ) ;
}
else {
this . endTestVideo ( ) ;
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . testVideo = function ( ) {
var _this = this ;
var dialogRef ;
dialogRef = this . dialog . open ( _ _WEBPACK _IMPORTED _MODULE _4 _ _credentials _dialog _component _ _ [ "a" /* CredentialsDialogComponent */ ] ) ;
dialogRef . componentInstance . myReference = dialogRef ;
dialogRef . afterClosed ( ) . subscribe ( function ( secret ) {
if ( secret ) {
_this . connectToSession ( 'wss://' + location . hostname + ':8443/testSession?secret=' + secret ) ;
}
} ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . connectToSession = function ( mySessionId ) {
var _this = this ;
this . msgChain = [ ] ;
var OV = new _ _WEBPACK _IMPORTED _MODULE _3 _openvidu _browser _ _ [ "OpenVidu" ] ( ) ;
this . session = OV . initSession ( mySessionId ) ;
this . testStatus = 'CONNECTING' ;
this . testButton = 'Testing...' ;
this . session . connect ( 'token' , function ( error ) {
if ( ! error ) {
_this . testStatus = 'CONNECTED' ;
var publisherRemote = OV . initPublisher ( 'mirrored-video' , {
audio : true ,
video : true ,
quality : 'MEDIUM'
} ) ;
publisherRemote . on ( 'accessAllowed' , function ( ) {
_this . msgChain . push ( 'Camera access allowed' ) ;
} ) ;
publisherRemote . on ( 'accessDenied' , function ( ) {
_this . endTestVideo ( ) ;
_this . msgChain . push ( 'Camera access denied' ) ;
} ) ;
publisherRemote . on ( 'videoElementCreated' , function ( video ) {
_this . showSpinner = true ;
_this . msgChain . push ( 'Video element created' ) ;
} ) ;
publisherRemote . on ( 'remoteVideoPlaying' , function ( video ) {
_this . msgChain . push ( 'Remote video playing' ) ;
_this . testButton = 'End test' ;
_this . testStatus = 'PLAYING' ;
_this . showSpinner = false ;
} ) ;
publisherRemote . subscribeToRemote ( ) ;
_this . session . publish ( publisherRemote ) ;
}
else {
if ( error . code === 401 ) {
_this . endTestVideo ( ) ;
var dialogRef = void 0 ;
dialogRef = _this . dialog . open ( _ _WEBPACK _IMPORTED _MODULE _4 _ _credentials _dialog _component _ _ [ "a" /* CredentialsDialogComponent */ ] ) ;
dialogRef . componentInstance . myReference = dialogRef ;
dialogRef . afterClosed ( ) . subscribe ( function ( secret ) {
if ( secret ) {
_this . connectToSession ( 'wss://' + location . hostname + ':8443/testSession?secret=' + secret ) ;
}
} ) ;
}
else {
console . error ( error ) ;
}
}
} ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . endTestVideo = function ( ) {
this . session . disconnect ( ) ;
this . session = null ;
this . testStatus = 'DISCONNECTED' ;
this . testButton = 'Test' ;
this . showSpinner = false ;
this . info = [ ] ;
this . msgChain = [ ] ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
DashboardComponent . prototype . scrollToBottom = function ( ) {
try {
if ( ! this . lockScroll ) {
this . myScrollContainer . nativeElement . scrollTop = this . myScrollContainer . nativeElement . scrollHeight ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
catch ( err ) {
console . error ( '[Error]:' + err . toString ( ) ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
return DashboardComponent ;
} ( ) ) ;
_ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_7" /* ViewChild */ ] ) ( 'scrollMe' ) ,
_ _metadata ( "design:type" , typeof ( _a = typeof _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "l" /* ElementRef */ ] !== "undefined" && _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "l" /* ElementRef */ ] ) === "function" && _a || Object )
] , DashboardComponent . prototype , "myScrollContainer" , void 0 ) ;
_ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_12" /* HostListener */ ] ) ( 'window:beforeunload' ) ,
_ _metadata ( "design:type" , Function ) ,
_ _metadata ( "design:paramtypes" , [ ] ) ,
_ _metadata ( "design:returntype" , void 0 )
] , DashboardComponent . prototype , "beforeunloadHandler" , null ) ;
DashboardComponent = _ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_4" /* Component */ ] ) ( {
selector : 'app-dashboard' ,
template : _ _webpack _require _ _ ( 238 ) ,
styles : [ _ _webpack _require _ _ ( 227 ) ] ,
} ) ,
_ _metadata ( "design:paramtypes" , [ typeof ( _b = typeof _ _WEBPACK _IMPORTED _MODULE _2 _ _services _info _service _ _ [ "a" /* InfoService */ ] !== "undefined" && _ _WEBPACK _IMPORTED _MODULE _2 _ _services _info _service _ _ [ "a" /* InfoService */ ] ) === "function" && _b || Object , typeof ( _c = typeof _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _material _ _ [ "j" /* MdDialog */ ] !== "undefined" && _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _material _ _ [ "j" /* MdDialog */ ] ) === "function" && _c || Object ] )
] , DashboardComponent ) ;
var _a , _b , _c ;
//# sourceMappingURL=dashboard.component.js.map
/***/ } ) ,
/***/ 104 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return SessionDetailsComponent ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var _ _metadata = ( this && this . _ _metadata ) || function ( k , v ) {
if ( typeof Reflect === "object" && typeof Reflect . metadata === "function" ) return Reflect . metadata ( k , v ) ;
} ;
var SessionDetailsComponent = ( function ( ) {
function SessionDetailsComponent ( ) {
}
SessionDetailsComponent . prototype . ngOnInit = function ( ) {
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
return SessionDetailsComponent ;
} ( ) ) ;
SessionDetailsComponent = _ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_4" /* Component */ ] ) ( {
selector : 'app-session-details' ,
template : _ _webpack _require _ _ ( 239 ) ,
styles : [ _ _webpack _require _ _ ( 228 ) ]
} ) ,
_ _metadata ( "design:paramtypes" , [ ] )
] , SessionDetailsComponent ) ;
//# sourceMappingURL=session-details.component.js.map
/***/ } ) ,
/***/ 136 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
/* WEBPACK VAR INJECTION */ ( function ( global ) { / *
* ( C ) Copyright 2013 - 2015 Kurento ( http : //kurento.org/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
var BrowserWebSocket = global . WebSocket || global . MozWebSocket ;
var Logger = console ;
/ * *
* Get either the ` WebSocket ` or ` MozWebSocket ` globals
* in the browser or try to resolve WebSocket - compatible
* interface exposed by ` ws ` for Node - like environment .
* /
/ * v a r W e b S o c k e t = B r o w s e r W e b S o c k e t ;
if ( ! WebSocket && typeof window === 'undefined' ) {
try {
WebSocket = require ( 'ws' ) ;
} catch ( e ) { }
} * /
//var SockJS = require('sockjs-client');
var MAX _RETRIES = 2000 ; // Forever...
var RETRY _TIME _MS = 3000 ; // FIXME: Implement exponential wait times...
var CONNECTING = 0 ;
var OPEN = 1 ;
var CLOSING = 2 ;
var CLOSED = 3 ;
/ *
config = {
uri : wsUri ,
useSockJS : true ( use SockJS ) / false ( use WebSocket ) by default ,
onconnected : callback method to invoke when connection is successful ,
ondisconnect : callback method to invoke when the connection is lost ,
onreconnecting : callback method to invoke when the client is reconnecting ,
onreconnected : callback method to invoke when the client succesfully reconnects ,
} ;
* /
function WebSocketWithReconnection ( config ) {
var closing = false ;
var registerMessageHandler ;
var wsUri = config . uri ;
var useSockJS = config . useSockJS ;
var reconnecting = false ;
var forcingDisconnection = false ;
var ws ;
if ( useSockJS ) {
ws = new SockJS ( wsUri ) ;
}
else {
ws = new WebSocket ( wsUri ) ;
}
ws . onopen = function ( ) {
logConnected ( ws , wsUri ) ;
if ( config . onconnected ) {
config . onconnected ( ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
ws . onerror = function ( error ) {
Logger . error ( "Could not connect to " + wsUri + " (invoking onerror if defined)" , error ) ;
if ( config . onerror ) {
config . onerror ( error ) ;
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
function logConnected ( ws , wsUri ) {
try {
Logger . debug ( "WebSocket connected to " + wsUri ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
catch ( e ) {
Logger . error ( e ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
var reconnectionOnClose = function ( ) {
if ( ws . readyState === CLOSED ) {
if ( closing ) {
Logger . debug ( "Connection closed by user" ) ;
}
else {
Logger . debug ( "Connection closed unexpectecly. Reconnecting..." ) ;
reconnectToSameUri ( MAX _RETRIES , 1 ) ;
2017-08-22 13:27:44 +02:00
}
}
else {
2017-09-22 16:05:34 +02:00
Logger . debug ( "Close callback from previous websocket. Ignoring it" ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
ws . onclose = reconnectionOnClose ;
function reconnectToSameUri ( maxRetries , numRetries ) {
Logger . debug ( "reconnectToSameUri (attempt #" + numRetries + ", max=" + maxRetries + ")" ) ;
if ( numRetries === 1 ) {
if ( reconnecting ) {
Logger . warn ( "Trying to reconnectToNewUri when reconnecting... Ignoring this reconnection." ) ;
return ;
}
else {
reconnecting = true ;
}
if ( config . onreconnecting ) {
config . onreconnecting ( ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( forcingDisconnection ) {
reconnectToNewUri ( maxRetries , numRetries , wsUri ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else {
if ( config . newWsUriOnReconnection ) {
config . newWsUriOnReconnection ( function ( error , newWsUri ) {
if ( error ) {
Logger . debug ( error ) ;
setTimeout ( function ( ) {
reconnectToSameUri ( maxRetries , numRetries + 1 ) ;
} , RETRY _TIME _MS ) ;
}
else {
reconnectToNewUri ( maxRetries , numRetries , newWsUri ) ;
}
} ) ;
}
else {
reconnectToNewUri ( maxRetries , numRetries , wsUri ) ;
}
}
}
// TODO Test retries. How to force not connection?
function reconnectToNewUri ( maxRetries , numRetries , reconnectWsUri ) {
Logger . debug ( "Reconnection attempt #" + numRetries ) ;
ws . close ( ) ;
wsUri = reconnectWsUri || wsUri ;
var newWs ;
if ( useSockJS ) {
newWs = new SockJS ( wsUri ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
newWs = new WebSocket ( wsUri ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
newWs . onopen = function ( ) {
Logger . debug ( "Reconnected after " + numRetries + " attempts..." ) ;
logConnected ( newWs , wsUri ) ;
reconnecting = false ;
registerMessageHandler ( ) ;
if ( config . onreconnected ( ) ) {
config . onreconnected ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
newWs . onclose = reconnectionOnClose ;
} ;
var onErrorOrClose = function ( error ) {
Logger . warn ( "Reconnection error: " , error ) ;
if ( numRetries === maxRetries ) {
if ( config . ondisconnect ) {
config . ondisconnect ( ) ;
}
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
setTimeout ( function ( ) {
reconnectToSameUri ( maxRetries , numRetries + 1 ) ;
} , RETRY _TIME _MS ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
} ;
newWs . onerror = onErrorOrClose ;
ws = newWs ;
}
this . close = function ( ) {
closing = true ;
ws . close ( ) ;
} ;
// This method is only for testing
this . forceClose = function ( millis ) {
Logger . debug ( "Testing: Force WebSocket close" ) ;
if ( millis ) {
Logger . debug ( "Testing: Change wsUri for " + millis + " millis to simulate net failure" ) ;
var goodWsUri = wsUri ;
wsUri = "wss://21.234.12.34.4:443/" ;
forcingDisconnection = true ;
setTimeout ( function ( ) {
Logger . debug ( "Testing: Recover good wsUri " + goodWsUri ) ;
wsUri = goodWsUri ;
forcingDisconnection = false ;
} , millis ) ;
}
ws . close ( ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
this . reconnectWs = function ( ) {
Logger . debug ( "reconnectWs" ) ;
reconnectToSameUri ( MAX _RETRIES , 1 , wsUri ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
this . send = function ( message ) {
ws . send ( message ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
this . addEventListener = function ( type , callback ) {
registerMessageHandler = function ( ) {
ws . addEventListener ( type , callback ) ;
} ;
registerMessageHandler ( ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
}
module . exports = WebSocketWithReconnection ;
/* WEBPACK VAR INJECTION */ } . call ( exports , _ _webpack _require _ _ ( 13 ) ) )
/***/ } ) ,
/***/ 137 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
/ *
* ( C ) Copyright 2014 Kurento ( http : //kurento.org/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
var defineProperty _IE8 = false ;
if ( Object . defineProperty ) {
try {
Object . defineProperty ( { } , "x" , { } ) ;
}
catch ( e ) {
defineProperty _IE8 = true ;
}
}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
if ( ! Function . prototype . bind ) {
Function . prototype . bind = function ( oThis ) {
if ( typeof this !== 'function' ) {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError ( 'Function.prototype.bind - what is trying to be bound is not callable' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
var aArgs = Array . prototype . slice . call ( arguments , 1 ) , fToBind = this , fNOP = function ( ) { } , fBound = function ( ) {
return fToBind . apply ( this instanceof fNOP && oThis
? this
: oThis , aArgs . concat ( Array . prototype . slice . call ( arguments ) ) ) ;
} ;
fNOP . prototype = this . prototype ;
fBound . prototype = new fNOP ( ) ;
return fBound ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
}
var EventEmitter = _ _webpack _require _ _ ( 116 ) . EventEmitter ;
var inherits = _ _webpack _require _ _ ( 117 ) ;
var packers = _ _webpack _require _ _ ( 304 ) ;
var Mapper = _ _webpack _require _ _ ( 298 ) ;
var BASE _TIMEOUT = 5000 ;
function unifyResponseMethods ( responseMethods ) {
if ( ! responseMethods )
return { } ;
for ( var key in responseMethods ) {
var value = responseMethods [ key ] ;
if ( typeof value == 'string' )
responseMethods [ key ] =
{
response : value
} ;
}
;
return responseMethods ;
}
;
function unifyTransport ( transport ) {
if ( ! transport )
return ;
// Transport as a function
if ( transport instanceof Function )
return { send : transport } ;
// WebSocket & DataChannel
if ( transport . send instanceof Function )
return transport ;
// Message API (Inter-window & WebWorker)
if ( transport . postMessage instanceof Function ) {
transport . send = transport . postMessage ;
return transport ;
}
// Stream API
if ( transport . write instanceof Function ) {
transport . send = transport . write ;
return transport ;
}
// Transports that only can receive messages, but not send
if ( transport . onmessage !== undefined )
return ;
if ( transport . pause instanceof Function )
return ;
throw new SyntaxError ( "Transport is not a function nor a valid object" ) ;
}
;
/ * *
* Representation of a RPC notification
*
* @ class
*
* @ constructor
*
* @ param { String } method - method of the notification
* @ param params - parameters of the notification
* /
function RpcNotification ( method , params ) {
if ( defineProperty _IE8 ) {
this . method = method ;
this . params = params ;
}
else {
Object . defineProperty ( this , 'method' , { value : method , enumerable : true } ) ;
Object . defineProperty ( this , 'params' , { value : params , enumerable : true } ) ;
}
}
;
/ * *
* @ class
*
* @ constructor
*
* @ param { object } packer
*
* @ param { object } [ options ]
*
* @ param { object } [ transport ]
*
* @ param { Function } [ onRequest ]
* /
function RpcBuilder ( packer , options , transport , onRequest ) {
var self = this ;
if ( ! packer )
throw new SyntaxError ( 'Packer is not defined' ) ;
if ( ! packer . pack || ! packer . unpack )
throw new SyntaxError ( 'Packer is invalid' ) ;
var responseMethods = unifyResponseMethods ( packer . responseMethods ) ;
if ( options instanceof Function ) {
if ( transport != undefined )
throw new SyntaxError ( "There can't be parameters after onRequest" ) ;
onRequest = options ;
transport = undefined ;
options = undefined ;
}
;
if ( options && options . send instanceof Function ) {
if ( transport && ! ( transport instanceof Function ) )
throw new SyntaxError ( "Only a function can be after transport" ) ;
onRequest = transport ;
transport = options ;
options = undefined ;
}
;
if ( transport instanceof Function ) {
if ( onRequest != undefined )
throw new SyntaxError ( "There can't be parameters after onRequest" ) ;
onRequest = transport ;
transport = undefined ;
}
;
if ( transport && transport . send instanceof Function )
if ( onRequest && ! ( onRequest instanceof Function ) )
throw new SyntaxError ( "Only a function can be after transport" ) ;
options = options || { } ;
EventEmitter . call ( this ) ;
if ( onRequest )
this . on ( 'request' , onRequest ) ;
if ( defineProperty _IE8 )
this . peerID = options . peerID ;
else
Object . defineProperty ( this , 'peerID' , { value : options . peerID } ) ;
var max _retries = options . max _retries || 0 ;
function transportMessage ( event ) {
self . decode ( event . data || event ) ;
}
;
this . getTransport = function ( ) {
return transport ;
} ;
this . setTransport = function ( value ) {
// Remove listener from old transport
if ( transport ) {
// W3C transports
if ( transport . removeEventListener )
transport . removeEventListener ( 'message' , transportMessage ) ;
else if ( transport . removeListener )
transport . removeListener ( 'data' , transportMessage ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
// Set listener on new transport
if ( value ) {
// W3C transports
if ( value . addEventListener )
value . addEventListener ( 'message' , transportMessage ) ;
else if ( value . addListener )
value . addListener ( 'data' , transportMessage ) ;
}
;
transport = unifyTransport ( value ) ;
} ;
if ( ! defineProperty _IE8 )
Object . defineProperty ( this , 'transport' , {
get : this . getTransport . bind ( this ) ,
set : this . setTransport . bind ( this )
} ) ;
this . setTransport ( transport ) ;
var request _timeout = options . request _timeout || BASE _TIMEOUT ;
var ping _request _timeout = options . ping _request _timeout || request _timeout ;
var response _timeout = options . response _timeout || BASE _TIMEOUT ;
var duplicates _timeout = options . duplicates _timeout || BASE _TIMEOUT ;
var requestID = 0 ;
var requests = new Mapper ( ) ;
var responses = new Mapper ( ) ;
var processedResponses = new Mapper ( ) ;
var message2Key = { } ;
/ * *
* Store the response to prevent to process duplicate request later
* /
function storeResponse ( message , id , dest ) {
var response = {
message : message ,
/** Timeout to auto-clean old responses */
timeout : setTimeout ( function ( ) {
responses . remove ( id , dest ) ;
} , response _timeout )
} ;
responses . set ( response , id , dest ) ;
}
;
/ * *
* Store the response to ignore duplicated messages later
* /
function storeProcessedResponse ( ack , from ) {
var timeout = setTimeout ( function ( ) {
processedResponses . remove ( ack , from ) ;
} , duplicates _timeout ) ;
processedResponses . set ( timeout , ack , from ) ;
}
;
/ * *
* Representation of a RPC request
*
* @ class
* @ extends RpcNotification
*
* @ constructor
*
* @ param { String } method - method of the notification
* @ param params - parameters of the notification
* @ param { Integer } id - identifier of the request
* @ param [ from ] - source of the notification
* /
function RpcRequest ( method , params , id , from , transport ) {
RpcNotification . call ( this , method , params ) ;
this . getTransport = function ( ) {
return transport ;
} ;
this . setTransport = function ( value ) {
transport = unifyTransport ( value ) ;
} ;
if ( ! defineProperty _IE8 )
Object . defineProperty ( this , 'transport' , {
get : this . getTransport . bind ( this ) ,
set : this . setTransport . bind ( this )
} ) ;
var response = responses . get ( id , from ) ;
/ * *
* @ constant { Boolean } duplicated
* /
if ( ! ( transport || self . getTransport ( ) ) ) {
if ( defineProperty _IE8 )
this . duplicated = Boolean ( response ) ;
else
Object . defineProperty ( this , 'duplicated' , {
value : Boolean ( response )
} ) ;
}
var responseMethod = responseMethods [ method ] ;
this . pack = packer . pack . bind ( packer , this , id ) ;
/ * *
* Generate a response to this request
*
* @ param { Error } [ error ]
* @ param { * } [ result ]
*
* @ returns { string }
* /
this . reply = function ( error , result , transport ) {
// Fix optional parameters
if ( error instanceof Function || error && error . send instanceof Function ) {
if ( result != undefined )
throw new SyntaxError ( "There can't be parameters after callback" ) ;
transport = error ;
result = null ;
error = undefined ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else if ( result instanceof Function
|| result && result . send instanceof Function ) {
if ( transport != undefined )
throw new SyntaxError ( "There can't be parameters after callback" ) ;
transport = result ;
result = null ;
}
;
transport = unifyTransport ( transport ) ;
// Duplicated request, remove old response timeout
if ( response )
clearTimeout ( response . timeout ) ;
if ( from != undefined ) {
if ( error )
error . dest = from ;
if ( result )
result . dest = from ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
var message ;
// New request or overriden one, create new response with provided data
if ( error || result != undefined ) {
if ( self . peerID != undefined ) {
if ( error )
error . from = self . peerID ;
else
result . from = self . peerID ;
}
// Protocol indicates that responses has own request methods
if ( responseMethod ) {
if ( responseMethod . error == undefined && error )
message =
{
error : error
} ;
else {
var method = error
? responseMethod . error
: responseMethod . response ;
message =
{
method : method ,
params : error || result
} ;
}
}
else
message =
{
error : error ,
result : result
} ;
message = packer . pack ( message , id ) ;
}
else if ( response )
message = response . message ;
else
message = packer . pack ( { result : null } , id ) ;
// Store the response to prevent to process a duplicated request later
storeResponse ( message , id , from ) ;
// Return the stored response so it can be directly send back
transport = transport || this . getTransport ( ) || self . getTransport ( ) ;
if ( transport )
return transport . send ( message ) ;
return message ;
} ;
}
;
inherits ( RpcRequest , RpcNotification ) ;
function cancel ( message ) {
var key = message2Key [ message ] ;
if ( ! key )
return ;
delete message2Key [ message ] ;
var request = requests . pop ( key . id , key . dest ) ;
if ( ! request )
return ;
clearTimeout ( request . timeout ) ;
// Start duplicated responses timeout
storeProcessedResponse ( key . id , key . dest ) ;
}
;
/ * *
* Allow to cancel a request and don ' t wait for a response
*
* If ` message ` is not given , cancel all the request
* /
this . cancel = function ( message ) {
if ( message )
return cancel ( message ) ;
for ( var message in message2Key )
cancel ( message ) ;
} ;
this . close = function ( ) {
// Prevent to receive new messages
var transport = this . getTransport ( ) ;
if ( transport && transport . close )
transport . close ( ) ;
// Request & processed responses
this . cancel ( ) ;
processedResponses . forEach ( clearTimeout ) ;
// Responses
responses . forEach ( function ( response ) {
clearTimeout ( response . timeout ) ;
2017-08-22 13:27:44 +02:00
} ) ;
} ;
2017-09-22 16:05:34 +02:00
/ * *
* Generates and encode a JsonRPC 2.0 message
*
* @ param { String } method - method of the notification
* @ param params - parameters of the notification
* @ param [ dest ] - destination of the notification
* @ param { object } [ transport ] - transport where to send the message
* @ param [ callback ] - function called when a response to this request is
* received . If not defined , a notification will be send instead
*
* @ returns { string } A raw JsonRPC 2.0 request or notification string
* /
this . encode = function ( method , params , dest , transport , callback ) {
// Fix optional parameters
if ( params instanceof Function ) {
if ( dest != undefined )
throw new SyntaxError ( "There can't be parameters after callback" ) ;
callback = params ;
transport = undefined ;
dest = undefined ;
params = undefined ;
}
else if ( dest instanceof Function ) {
if ( transport != undefined )
throw new SyntaxError ( "There can't be parameters after callback" ) ;
callback = dest ;
transport = undefined ;
dest = undefined ;
}
else if ( transport instanceof Function ) {
if ( callback != undefined )
throw new SyntaxError ( "There can't be parameters after callback" ) ;
callback = transport ;
transport = undefined ;
}
;
if ( self . peerID != undefined ) {
params = params || { } ;
params . from = self . peerID ;
}
;
if ( dest != undefined ) {
params = params || { } ;
params . dest = dest ;
}
;
// Encode message
var message = {
method : method ,
params : params
} ;
if ( callback ) {
var id = requestID ++ ;
var retried = 0 ;
message = packer . pack ( message , id ) ;
function dispatchCallback ( error , result ) {
self . cancel ( message ) ;
callback ( error , result ) ;
}
;
var request = {
message : message ,
callback : dispatchCallback ,
responseMethods : responseMethods [ method ] || { }
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
var encode _transport = unifyTransport ( transport ) ;
function sendRequest ( transport ) {
var rt = ( method === 'ping' ? ping _request _timeout : request _timeout ) ;
request . timeout = setTimeout ( timeout , rt * Math . pow ( 2 , retried ++ ) ) ;
message2Key [ message ] = { id : id , dest : dest } ;
requests . set ( request , id , dest ) ;
transport = transport || encode _transport || self . getTransport ( ) ;
if ( transport )
return transport . send ( message ) ;
return message ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
function retry ( transport ) {
transport = unifyTransport ( transport ) ;
console . warn ( retried + ' retry for request message:' , message ) ;
var timeout = processedResponses . pop ( id , dest ) ;
clearTimeout ( timeout ) ;
return sendRequest ( transport ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
function timeout ( ) {
if ( retried < max _retries )
return retry ( transport ) ;
var error = new Error ( 'Request has timed out' ) ;
error . request = message ;
error . retry = retry ;
dispatchCallback ( error ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
return sendRequest ( transport ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
// Return the packed message
message = packer . pack ( message ) ;
transport = transport || this . getTransport ( ) ;
if ( transport )
return transport . send ( message ) ;
return message ;
} ;
/ * *
* Decode and process a JsonRPC 2.0 message
*
* @ param { string } message - string with the content of the message
*
* @ returns { RpcNotification | RpcRequest | undefined } - the representation of the
* notification or the request . If a response was processed , it will return
* ` undefined ` to notify that it was processed
*
* @ throws { TypeError } - Message is not defined
* /
this . decode = function ( message , transport ) {
if ( ! message )
throw new TypeError ( "Message is not defined" ) ;
try {
message = packer . unpack ( message ) ;
}
catch ( e ) {
// Ignore invalid messages
return console . debug ( e , message ) ;
}
;
var id = message . id ;
var ack = message . ack ;
var method = message . method ;
var params = message . params || { } ;
var from = params . from ;
var dest = params . dest ;
// Ignore messages send by us
if ( self . peerID != undefined && from == self . peerID )
return ;
// Notification
if ( id == undefined && ack == undefined ) {
var notification = new RpcNotification ( method , params ) ;
if ( self . emit ( 'request' , notification ) )
return ;
return notification ;
}
;
function processRequest ( ) {
// If we have a transport and it's a duplicated request, reply inmediatly
transport = unifyTransport ( transport ) || self . getTransport ( ) ;
if ( transport ) {
var response = responses . get ( id , from ) ;
if ( response )
return transport . send ( response . message ) ;
}
;
var idAck = ( id != undefined ) ? id : ack ;
var request = new RpcRequest ( method , params , idAck , from , transport ) ;
if ( self . emit ( 'request' , request ) )
return ;
return request ;
}
;
function processResponse ( request , error , result ) {
request . callback ( error , result ) ;
}
;
function duplicatedResponse ( timeout ) {
console . warn ( "Response already processed" , message ) ;
// Update duplicated responses timeout
clearTimeout ( timeout ) ;
storeProcessedResponse ( ack , from ) ;
}
;
// Request, or response with own method
if ( method ) {
// Check if it's a response with own method
if ( dest == undefined || dest == self . peerID ) {
var request = requests . get ( ack , from ) ;
if ( request ) {
var responseMethods = request . responseMethods ;
if ( method == responseMethods . error )
return processResponse ( request , params ) ;
if ( method == responseMethods . response )
return processResponse ( request , null , params ) ;
return processRequest ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
var processed = processedResponses . get ( ack , from ) ;
if ( processed )
return duplicatedResponse ( processed ) ;
}
// Request
return processRequest ( ) ;
}
;
var error = message . error ;
var result = message . result ;
// Ignore responses not send to us
if ( error && error . dest && error . dest != self . peerID )
return ;
if ( result && result . dest && result . dest != self . peerID )
return ;
// Response
var request = requests . get ( ack , from ) ;
if ( ! request ) {
var processed = processedResponses . get ( ack , from ) ;
if ( processed )
return duplicatedResponse ( processed ) ;
return console . warn ( "No callback was defined for this message" , message ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
// Process response
processResponse ( request , error , result ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
}
;
inherits ( RpcBuilder , EventEmitter ) ;
RpcBuilder . RpcNotification = RpcNotification ;
module . exports = RpcBuilder ;
var clients = _ _webpack _require _ _ ( 299 ) ;
var transports = _ _webpack _require _ _ ( 301 ) ;
RpcBuilder . clients = clients ;
RpcBuilder . clients . transports = transports ;
RpcBuilder . packers = packers ;
/***/ } ) ,
/***/ 138 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var EventEmitter = _ _webpack _require _ _ ( 40 ) ;
var Publisher = /** @class */ ( function ( ) {
function Publisher ( stream , parentId ) {
2017-08-22 13:27:44 +02:00
var _this = this ;
2017-09-22 16:05:34 +02:00
this . ee = new EventEmitter ( ) ;
this . accessAllowed = false ;
this . stream = stream ;
this . stream . addEventListener ( 'camera-access-changed' , function ( event ) {
_this . accessAllowed = event . accessAllowed ;
if ( _this . accessAllowed ) {
_this . ee . emitEvent ( 'accessAllowed' ) ;
}
else {
_this . ee . emitEvent ( 'accessDenied' ) ;
}
} ) ;
if ( document . getElementById ( parentId ) != null ) {
this . element = document . getElementById ( parentId ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
Publisher . prototype . publishAudio = function ( value ) {
this . stream . getWebRtcPeer ( ) . audioEnabled = value ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Publisher . prototype . publishVideo = function ( value ) {
this . stream . getWebRtcPeer ( ) . videoEnabled = value ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Publisher . prototype . destroy = function ( ) {
this . session . unpublish ( this ) ;
this . stream . dispose ( ) ;
this . stream . removeVideo ( this . element ) ;
return this ;
} ;
Publisher . prototype . subscribeToRemote = function ( ) {
this . stream . subscribeToMyRemote ( ) ;
} ;
Publisher . prototype . on = function ( eventName , callback ) {
2017-08-22 13:27:44 +02:00
var _this = this ;
2017-09-22 16:05:34 +02:00
this . ee . addListener ( eventName , function ( event ) {
if ( event ) {
console . info ( "Event '" + eventName + "' triggered by 'Publisher'" , event ) ;
}
else {
console . info ( "Event '" + eventName + "' triggered by 'Publisher'" ) ;
}
callback ( event ) ;
2017-08-22 13:27:44 +02:00
} ) ;
2017-09-22 16:05:34 +02:00
if ( eventName == 'videoElementCreated' ) {
if ( this . stream . isVideoELementCreated ) {
this . ee . emitEvent ( 'videoElementCreated' , [ {
element : this . stream . getVideoElement ( )
2017-08-22 13:27:44 +02:00
} ] ) ;
}
2017-09-22 16:05:34 +02:00
else {
this . stream . addOnceEventListener ( 'video-element-created-by-stream' , function ( element ) {
_this . id = element . id ;
_this . ee . emitEvent ( 'videoElementCreated' , [ {
element : element . element
} ] ) ;
2017-08-22 13:27:44 +02:00
} ) ;
}
}
2017-09-22 16:05:34 +02:00
if ( eventName == 'videoPlaying' ) {
var video = this . stream . getVideoElement ( ) ;
if ( ! this . stream . displayMyRemote ( ) && video &&
video . currentTime > 0 &&
video . paused == false &&
video . ended == false &&
video . readyState == 4 ) {
this . ee . emitEvent ( 'videoPlaying' , [ {
element : this . stream . getVideoElement ( )
} ] ) ;
}
else {
this . stream . addOnceEventListener ( 'video-is-playing' , function ( element ) {
_this . ee . emitEvent ( 'videoPlaying' , [ {
element : element . element
} ] ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
}
2017-09-22 16:05:34 +02:00
if ( eventName == 'remoteVideoPlaying' ) {
var video = this . stream . getVideoElement ( ) ;
if ( this . stream . displayMyRemote ( ) && video &&
video . currentTime > 0 &&
video . paused == false &&
video . ended == false &&
video . readyState == 4 ) {
this . ee . emitEvent ( 'remoteVideoPlaying' , [ {
element : this . stream . getVideoElement ( )
} ] ) ;
}
else {
this . stream . addOnceEventListener ( 'remote-video-is-playing' , function ( element ) {
_this . ee . emitEvent ( 'remoteVideoPlaying' , [ {
element : element . element
} ] ) ;
} ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( eventName == 'streamCreated' ) {
if ( this . stream . isReady ) {
this . ee . emitEvent ( 'streamCreated' , [ { stream : this . stream } ] ) ;
}
else {
this . stream . addEventListener ( 'stream-created-by-publisher' , function ( ) {
console . warn ( 'Publisher emitting streamCreated' ) ;
_this . ee . emitEvent ( 'streamCreated' , [ { stream : _this . stream } ] ) ;
2017-08-22 13:27:44 +02:00
} ) ;
2017-09-22 16:05:34 +02:00
}
}
if ( eventName == 'accessAllowed' ) {
if ( this . stream . accessIsAllowed ) {
this . ee . emitEvent ( 'accessAllowed' ) ;
}
else {
this . stream . addEventListener ( 'access-allowed-by-publisher' , function ( ) {
_this . ee . emitEvent ( 'accessAllowed' ) ;
2017-08-22 13:27:44 +02:00
} ) ;
}
}
2017-09-22 16:05:34 +02:00
if ( eventName == 'accessDenied' ) {
if ( this . stream . accessIsDenied ) {
this . ee . emitEvent ( 'accessDenied' ) ;
}
else {
this . stream . addEventListener ( 'access-denied-by-publisher' , function ( ) {
_this . ee . emitEvent ( 'accessDenied' ) ;
} ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-08-23 21:30:12 +02:00
} ;
2017-09-22 16:05:34 +02:00
return Publisher ;
2017-08-23 21:30:12 +02:00
} ( ) ) ;
2017-09-22 16:05:34 +02:00
exports . Publisher = Publisher ;
2017-08-23 21:30:12 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 139 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-07-28 17:00:56 +02:00
"use strict" ;
2017-09-22 16:05:34 +02:00
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var Subscriber _1 = _ _webpack _require _ _ ( 140 ) ;
var EventEmitter = _ _webpack _require _ _ ( 40 ) ;
var Session = /** @class */ ( function ( ) {
function Session ( session , openVidu ) {
2017-07-28 17:00:56 +02:00
var _this = this ;
2017-09-22 16:05:34 +02:00
this . session = session ;
this . openVidu = openVidu ;
this . ee = new EventEmitter ( ) ;
this . sessionId = session . getSessionId ( ) ;
// Listens to the deactivation of the default behaviour upon the deletion of a Stream object
this . session . addEventListener ( 'stream-destroyed-default' , function ( event ) {
event . stream . removeVideo ( ) ;
} ) ;
// Listens to the deactivation of the default behaviour upon the disconnection of a Session
this . session . addEventListener ( 'session-disconnected-default' , function ( ) {
var s ;
for ( var _i = 0 , _a = _this . openVidu . openVidu . getRemoteStreams ( ) ; _i < _a . length ; _i ++ ) {
s = _a [ _i ] ;
s . removeVideo ( ) ;
}
if ( _this . connection ) {
for ( var streamId in _this . connection . getStreams ( ) ) {
_this . connection . getStreams ( ) [ streamId ] . removeVideo ( ) ;
}
}
} ) ;
// Sets or updates the value of 'connection' property. Triggered by SessionInternal when succesful connection
this . session . addEventListener ( 'update-connection-object' , function ( event ) {
_this . connection = event . connection ;
2017-07-28 17:00:56 +02:00
} ) ;
}
2017-09-22 16:05:34 +02:00
Session . prototype . connect = function ( param1 , param2 , param3 ) {
// Early configuration to deactivate automatic subscription to streams
if ( param3 ) {
this . session . configure ( {
sessionId : this . session . getSessionId ( ) ,
participantId : param1 ,
metadata : this . session . stringClientMetadata ( param2 ) ,
subscribeToStreams : false
} ) ;
this . session . connect ( param1 , param3 ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
this . session . configure ( {
sessionId : this . session . getSessionId ( ) ,
participantId : param1 ,
metadata : '' ,
subscribeToStreams : false
} ) ;
this . session . connect ( param1 , param2 ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . disconnect = function ( ) {
2017-08-29 17:31:34 +02:00
var _this = this ;
2017-09-22 16:05:34 +02:00
this . openVidu . openVidu . close ( false ) ;
this . session . emitEvent ( 'sessionDisconnected' , [ {
preventDefault : function ( ) { _this . session . removeEvent ( 'session-disconnected-default' ) ; }
} ] ) ;
this . session . emitEvent ( 'session-disconnected-default' , [ { } ] ) ;
2017-08-23 21:30:12 +02:00
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . publish = function ( publisher ) {
publisher . session = this ;
publisher . stream . publish ( ) ;
} ;
Session . prototype . unpublish = function ( publisher ) {
this . session . unpublish ( publisher . stream ) ;
} ;
Session . prototype . on = function ( eventName , callback ) {
this . session . addEventListener ( eventName , function ( event ) {
if ( event ) {
console . info ( "Event '" + eventName + "' triggered by 'Session'" , event ) ;
2017-07-28 17:00:56 +02:00
}
2017-08-23 21:30:12 +02:00
else {
2017-09-22 16:05:34 +02:00
console . info ( "Event '" + eventName + "' triggered by 'Session'" ) ;
2017-08-23 21:30:12 +02:00
}
2017-09-22 16:05:34 +02:00
callback ( event ) ;
2017-07-28 17:00:56 +02:00
} ) ;
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . once = function ( eventName , callback ) {
this . session . addOnceEventListener ( eventName , function ( event ) {
callback ( event ) ;
} ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . off = function ( eventName , eventHandler ) {
this . session . removeListener ( eventName , eventHandler ) ;
2017-07-28 17:00:56 +02:00
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . subscribe = function ( param1 , param2 , param3 ) {
// Subscription
this . session . subscribe ( param1 ) ;
var subscriber = new Subscriber _1 . Subscriber ( param1 , param2 ) ;
param1 . playOnlyVideo ( param2 , null ) ;
return subscriber ;
2017-07-28 17:00:56 +02:00
} ;
2017-09-22 16:05:34 +02:00
Session . prototype . unsubscribe = function ( subscriber ) {
this . session . unsuscribe ( subscriber . stream ) ;
subscriber . stream . removeVideo ( ) ;
} ;
/* Shortcut event API */
Session . prototype . onStreamCreated = function ( callback ) {
this . session . addEventListener ( "streamCreated" , function ( streamEvent ) {
callback ( streamEvent . stream ) ;
} ) ;
} ;
Session . prototype . onStreamDestroyed = function ( callback ) {
this . session . addEventListener ( "streamDestroyed" , function ( streamEvent ) {
callback ( streamEvent . stream ) ;
} ) ;
} ;
Session . prototype . onParticipantJoined = function ( callback ) {
this . session . addEventListener ( "participant-joined" , function ( participantEvent ) {
callback ( participantEvent . connection ) ;
} ) ;
} ;
Session . prototype . onParticipantLeft = function ( callback ) {
this . session . addEventListener ( "participant-left" , function ( participantEvent ) {
callback ( participantEvent . connection ) ;
} ) ;
} ;
Session . prototype . onParticipantPublished = function ( callback ) {
this . session . addEventListener ( "participant-published" , function ( participantEvent ) {
callback ( participantEvent . connection ) ;
} ) ;
} ;
Session . prototype . onParticipantEvicted = function ( callback ) {
this . session . addEventListener ( "participant-evicted" , function ( participantEvent ) {
callback ( participantEvent . connection ) ;
} ) ;
} ;
Session . prototype . onRoomClosed = function ( callback ) {
this . session . addEventListener ( "room-closed" , function ( roomEvent ) {
callback ( roomEvent . room ) ;
} ) ;
} ;
Session . prototype . onLostConnection = function ( callback ) {
this . session . addEventListener ( "lost-connection" , function ( roomEvent ) {
callback ( roomEvent . room ) ;
} ) ;
} ;
Session . prototype . onMediaError = function ( callback ) {
this . session . addEventListener ( "error-media" , function ( errorEvent ) {
callback ( errorEvent . error ) ;
} ) ;
} ;
return Session ;
2017-07-28 17:00:56 +02:00
} ( ) ) ;
2017-09-22 16:05:34 +02:00
exports . Session = Session ;
2017-07-28 17:00:56 +02:00
2017-08-22 13:27:44 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 140 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2017-09-22 16:05:34 +02:00
var EventEmitter = _ _webpack _require _ _ ( 40 ) ;
var Subscriber = /** @class */ ( function ( ) {
function Subscriber ( stream , parentId ) {
2017-08-22 13:27:44 +02:00
this . ee = new EventEmitter ( ) ;
this . stream = stream ;
if ( document . getElementById ( parentId ) != null ) {
this . element = document . getElementById ( parentId ) ;
}
}
2017-09-22 16:05:34 +02:00
Subscriber . prototype . on = function ( eventName , callback ) {
2017-08-22 13:27:44 +02:00
var _this = this ;
this . ee . addListener ( eventName , function ( event ) {
2017-09-22 16:05:34 +02:00
if ( event ) {
console . info ( "Event '" + eventName + "' triggered by 'Subscriber'" , event ) ;
}
else {
console . info ( "Event '" + eventName + "' triggered by 'Subscriber'" ) ;
}
2017-08-22 13:27:44 +02:00
callback ( event ) ;
} ) ;
if ( eventName == 'videoElementCreated' ) {
2017-09-22 16:05:34 +02:00
if ( this . stream . isReady ) {
2017-08-22 13:27:44 +02:00
this . ee . emitEvent ( 'videoElementCreated' , [ {
element : this . stream . getVideoElement ( )
} ] ) ;
}
else {
2017-09-22 16:05:34 +02:00
this . stream . addOnceEventListener ( 'video-element-created-by-stream' , function ( element ) {
console . warn ( "Subscriber emitting videoElementCreated" ) ;
2017-08-22 13:27:44 +02:00
_this . id = element . id ;
_this . ee . emitEvent ( 'videoElementCreated' , [ {
2017-09-22 16:05:34 +02:00
element : element
2017-08-22 13:27:44 +02:00
} ] ) ;
} ) ;
}
}
2017-09-22 16:05:34 +02:00
if ( eventName == 'videoPlaying' ) {
var video = this . stream . getVideoElement ( ) ;
if ( ! this . stream . displayMyRemote ( ) && video &&
video . currentTime > 0 &&
video . paused == false &&
video . ended == false &&
video . readyState == 4 ) {
this . ee . emitEvent ( 'videoPlaying' , [ {
element : this . stream . getVideoElement ( )
} ] ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
this . stream . addOnceEventListener ( 'video-is-playing' , function ( element ) {
_this . ee . emitEvent ( 'videoPlaying' , [ {
element : element . element
} ] ) ;
2017-08-22 13:27:44 +02:00
} ) ;
}
}
} ;
2017-09-22 16:05:34 +02:00
return Subscriber ;
2017-08-22 13:27:44 +02:00
} ( ) ) ;
2017-09-22 16:05:34 +02:00
exports . Subscriber = Subscriber ;
2017-08-22 13:27:44 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 141 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2017-09-22 16:05:34 +02:00
var Stream _1 = _ _webpack _require _ _ ( 86 ) ;
var Connection = /** @class */ ( function ( ) {
2017-08-22 13:27:44 +02:00
function Connection ( openVidu , local , room , options ) {
this . openVidu = openVidu ;
this . local = local ;
this . room = room ;
this . options = options ;
this . streams = { } ;
this . streamsOpts = [ ] ;
2017-09-22 16:05:34 +02:00
console . info ( "'Connection' created (" + ( local ? "local" : "remote" ) + ")" + ( local ? "" : ", with 'connectionId' [" + ( options ? options . id : '' ) + "] " ) ) ;
2017-08-22 13:27:44 +02:00
if ( options ) {
this . connectionId = options . id ;
this . data = options . metadata ;
if ( options . streams ) {
2017-09-22 16:05:34 +02:00
this . initStreams ( options ) ;
2017-08-22 13:27:44 +02:00
}
}
}
Connection . prototype . addStream = function ( stream ) {
this . streams [ stream . getIdInParticipant ( ) ] = stream ;
this . room . getStreams ( ) [ stream . getIdInParticipant ( ) ] = stream ;
} ;
Connection . prototype . getStreams = function ( ) {
return this . streams ;
} ;
Connection . prototype . dispose = function ( ) {
for ( var key in this . streams ) {
this . streams [ key ] . dispose ( ) ;
}
} ;
Connection . prototype . sendIceCandidate = function ( candidate ) {
console . debug ( ( this . local ? "Local" : "Remote" ) , "candidate for" , this . connectionId , JSON . stringify ( candidate ) ) ;
this . openVidu . sendRequest ( "onIceCandidate" , {
endpointName : this . connectionId ,
candidate : candidate . candidate ,
sdpMid : candidate . sdpMid ,
sdpMLineIndex : candidate . sdpMLineIndex
} , function ( error , response ) {
if ( error ) {
console . error ( "Error sending ICE candidate: "
+ JSON . stringify ( error ) ) ;
}
} ) ;
} ;
2017-09-22 16:05:34 +02:00
Connection . prototype . initStreams = function ( options ) {
for ( var _i = 0 , _a = options . streams ; _i < _a . length ; _i ++ ) {
var streamOptions = _a [ _i ] ;
var streamOpts = {
id : streamOptions . id ,
connection : this ,
recvVideo : ( streamOptions . recvVideo == undefined ? true : streamOptions . recvVideo ) ,
recvAudio : ( streamOptions . recvAudio == undefined ? true : streamOptions . recvAudio ) ,
audio : streamOptions . audio ,
video : streamOptions . video ,
data : streamOptions . data ,
mediaConstraints : streamOptions . mediaConstraints ,
audioOnly : streamOptions . audioOnly ,
} ;
var stream = new Stream _1 . Stream ( this . openVidu , false , this . room , streamOpts ) ;
this . addStream ( stream ) ;
this . streamsOpts . push ( streamOpts ) ;
}
console . info ( "Remote 'Connection' with 'connectionId' [" + this . connectionId + "] is now configured for receiving Streams with options: " , this . streamsOpts ) ;
} ;
2017-08-22 13:27:44 +02:00
return Connection ;
} ( ) ) ;
exports . Connection = Connection ;
2017-07-28 17:00:56 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 143 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports ) {
function webpackEmptyContext ( req ) {
throw new Error ( "Cannot find module '" + req + "'." ) ;
}
webpackEmptyContext . keys = function ( ) { return [ ] ; } ;
webpackEmptyContext . resolve = webpackEmptyContext ;
module . exports = webpackEmptyContext ;
2017-09-22 16:05:34 +02:00
webpackEmptyContext . id = 143 ;
2017-05-31 17:55:18 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 144 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( _ _webpack _exports _ _ , "__esModule" , { value : true } ) ;
2017-07-28 17:00:56 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _platform _browser _dynamic _ _ = _ _webpack _require _ _ ( 164 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _2 _ _app _app _module _ _ = _ _webpack _require _ _ ( 169 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _3 _ _environments _environment _ _ = _ _webpack _require _ _ ( 171 ) ;
2017-05-31 17:55:18 +02:00
if ( _ _WEBPACK _IMPORTED _MODULE _3 _ _environments _environment _ _ [ "a" /* environment */ ] . production ) {
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "a" /* enableProdMode */ ] ) ( ) ;
}
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _platform _browser _dynamic _ _ [ "a" /* platformBrowserDynamic */ ] ) ( ) . bootstrapModule ( _ _WEBPACK _IMPORTED _MODULE _2 _ _app _app _module _ _ [ "a" /* AppModule */ ] ) ;
//# sourceMappingURL=main.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 167 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2017-07-28 17:00:56 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _app _services _info _service _ _ = _ _webpack _require _ _ ( 55 ) ;
2017-05-31 17:55:18 +02:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return AppComponent ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var _ _metadata = ( this && this . _ _metadata ) || function ( k , v ) {
if ( typeof Reflect === "object" && typeof Reflect . metadata === "function" ) return Reflect . metadata ( k , v ) ;
} ;
var AppComponent = ( function ( ) {
function AppComponent ( infoService ) {
this . infoService = infoService ;
}
AppComponent . prototype . ngOnInit = function ( ) {
var _this = this ;
2017-06-14 15:45:22 +02:00
var protocol = location . protocol . includes ( 'https' ) ? 'wss://' : 'ws://' ;
var port = ( location . port ) ? ( ':' + location . port ) : '' ;
this . websocket = new WebSocket ( protocol + location . hostname + port + '/info' ) ;
2017-05-31 17:55:18 +02:00
this . websocket . onopen = function ( event ) {
console . log ( 'Info websocket connected' ) ;
} ;
this . websocket . onclose = function ( event ) {
console . log ( 'Info websocket closed' ) ;
} ;
this . websocket . onerror = function ( event ) {
console . log ( 'Info websocket error' ) ;
} ;
this . websocket . onmessage = function ( event ) {
console . log ( 'Info websocket message' ) ;
console . log ( event . data ) ;
_this . infoService . updateInfo ( event . data ) ;
} ;
} ;
AppComponent . prototype . ngOnDestroy = function ( ) {
this . websocket . close ( ) ;
} ;
AppComponent . prototype . beforeUnloadHander = function ( event ) {
console . warn ( 'Closing info websocket' ) ;
this . websocket . close ( ) ;
} ;
return AppComponent ;
} ( ) ) ;
_ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_12" /* HostListener */ ] ) ( 'window:beforeunload' , [ '$event' ] ) ,
_ _metadata ( "design:type" , Function ) ,
_ _metadata ( "design:paramtypes" , [ Object ] ) ,
_ _metadata ( "design:returntype" , void 0 )
] , AppComponent . prototype , "beforeUnloadHander" , null ) ;
AppComponent = _ _decorate ( [
2017-07-28 17:00:56 +02:00
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "_4" /* Component */ ] ) ( {
2017-05-31 17:55:18 +02:00
selector : 'app-root' ,
2017-09-22 16:05:34 +02:00
template : _ _webpack _require _ _ ( 237 ) ,
styles : [ _ _webpack _require _ _ ( 226 ) ]
2017-05-31 17:55:18 +02:00
} ) ,
_ _metadata ( "design:paramtypes" , [ typeof ( _a = typeof _ _WEBPACK _IMPORTED _MODULE _1 _app _services _info _service _ _ [ "a" /* InfoService */ ] !== "undefined" && _ _WEBPACK _IMPORTED _MODULE _1 _app _services _info _service _ _ [ "a" /* InfoService */ ] ) === "function" && _a || Object ] )
] , AppComponent ) ;
var _a ;
//# sourceMappingURL=app.component.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 168 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2017-07-28 17:00:56 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _platform _browser _animations _ _ = _ _webpack _require _ _ ( 165 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ = _ _webpack _require _ _ ( 101 ) ;
2017-05-31 17:55:18 +02:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return AppMaterialModule ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var AppMaterialModule = ( function ( ) {
function AppMaterialModule ( ) {
}
return AppMaterialModule ;
} ( ) ) ;
AppMaterialModule = _ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "b" /* NgModule */ ] ) ( {
2017-08-22 13:27:44 +02:00
imports : [
_ _WEBPACK _IMPORTED _MODULE _1 _ _angular _platform _browser _animations _ _ [ "a" /* BrowserAnimationsModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "a" /* MdButtonModule */ ] ,
2017-08-29 17:31:34 +02:00
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "b" /* MdIconModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "c" /* MdCheckboxModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "d" /* MdCardModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "e" /* MdInputModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "f" /* MdProgressSpinnerModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "g" /* MdTooltipModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "h" /* MdDialogModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "i" /* MdSlideToggleModule */ ]
2017-08-22 13:27:44 +02:00
] ,
exports : [
_ _WEBPACK _IMPORTED _MODULE _1 _ _angular _platform _browser _animations _ _ [ "a" /* BrowserAnimationsModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "a" /* MdButtonModule */ ] ,
2017-08-29 17:31:34 +02:00
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "b" /* MdIconModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "c" /* MdCheckboxModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "d" /* MdCardModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "e" /* MdInputModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "f" /* MdProgressSpinnerModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "g" /* MdTooltipModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "h" /* MdDialogModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _2 _ _angular _material _ _ [ "i" /* MdSlideToggleModule */ ]
2017-08-22 13:27:44 +02:00
] ,
2017-05-31 17:55:18 +02:00
} )
] , AppMaterialModule ) ;
//# sourceMappingURL=app.material.module.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 169 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _platform _browser _ _ = _ _webpack _require _ _ ( 16 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _ _angular _flex _layout _ _ = _ _webpack _require _ _ ( 161 ) ;
2017-07-28 17:00:56 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _2 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _3 _ _angular _forms _ _ = _ _webpack _require _ _ ( 99 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _4 _ _angular _http _ _ = _ _webpack _require _ _ ( 100 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _5 _hammerjs _ _ = _ _webpack _require _ _ ( 230 ) ;
2017-08-29 17:31:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _5 _hammerjs _ _ _default = _ _webpack _require _ _ . n ( _ _WEBPACK _IMPORTED _MODULE _5 _hammerjs _ _ ) ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _6 _ _app _routing _ _ = _ _webpack _require _ _ ( 170 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _7 _app _app _material _module _ _ = _ _webpack _require _ _ ( 168 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _8 _ _services _info _service _ _ = _ _webpack _require _ _ ( 55 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _9 _ _app _component _ _ = _ _webpack _require _ _ ( 167 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _10 _ _components _dashboard _dashboard _component _ _ = _ _webpack _require _ _ ( 103 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _11 _ _components _session _details _session _details _component _ _ = _ _webpack _require _ _ ( 104 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _12 _ _components _dashboard _credentials _dialog _component _ _ = _ _webpack _require _ _ ( 102 ) ;
2017-05-31 17:55:18 +02:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return AppModule ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
2017-07-28 17:00:56 +02:00
2017-08-23 21:30:12 +02:00
2017-05-31 17:55:18 +02:00
var AppModule = ( function ( ) {
function AppModule ( ) {
}
return AppModule ;
} ( ) ) ;
AppModule = _ _decorate ( [
2017-07-28 17:00:56 +02:00
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _2 _ _angular _core _ _ [ "b" /* NgModule */ ] ) ( {
2017-05-31 17:55:18 +02:00
declarations : [
2017-08-23 21:30:12 +02:00
_ _WEBPACK _IMPORTED _MODULE _9 _ _app _component _ _ [ "a" /* AppComponent */ ] ,
_ _WEBPACK _IMPORTED _MODULE _10 _ _components _dashboard _dashboard _component _ _ [ "a" /* DashboardComponent */ ] ,
_ _WEBPACK _IMPORTED _MODULE _11 _ _components _session _details _session _details _component _ _ [ "a" /* SessionDetailsComponent */ ] ,
_ _WEBPACK _IMPORTED _MODULE _12 _ _components _dashboard _credentials _dialog _component _ _ [ "a" /* CredentialsDialogComponent */ ] ,
2017-05-31 17:55:18 +02:00
] ,
imports : [
_ _WEBPACK _IMPORTED _MODULE _0 _ _angular _platform _browser _ _ [ "a" /* BrowserModule */ ] ,
2017-07-28 17:00:56 +02:00
_ _WEBPACK _IMPORTED _MODULE _3 _ _angular _forms _ _ [ "a" /* FormsModule */ ] ,
_ _WEBPACK _IMPORTED _MODULE _4 _ _angular _http _ _ [ "a" /* HttpModule */ ] ,
2017-08-29 17:31:34 +02:00
_ _WEBPACK _IMPORTED _MODULE _6 _ _app _routing _ _ [ "a" /* routing */ ] ,
_ _WEBPACK _IMPORTED _MODULE _7 _app _app _material _module _ _ [ "a" /* AppMaterialModule */ ] ,
2017-07-28 17:00:56 +02:00
_ _WEBPACK _IMPORTED _MODULE _1 _ _angular _flex _layout _ _ [ "a" /* FlexLayoutModule */ ]
2017-05-31 17:55:18 +02:00
] ,
2017-08-23 21:30:12 +02:00
entryComponents : [
_ _WEBPACK _IMPORTED _MODULE _12 _ _components _dashboard _credentials _dialog _component _ _ [ "a" /* CredentialsDialogComponent */ ] ,
] ,
2017-08-29 17:31:34 +02:00
providers : [ _ _WEBPACK _IMPORTED _MODULE _8 _ _services _info _service _ _ [ "a" /* InfoService */ ] ] ,
2017-08-23 21:30:12 +02:00
bootstrap : [ _ _WEBPACK _IMPORTED _MODULE _9 _ _app _component _ _ [ "a" /* AppComponent */ ] ]
2017-05-31 17:55:18 +02:00
} )
] , AppModule ) ;
//# sourceMappingURL=app.module.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 170 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2017-09-22 16:05:34 +02:00
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _router _ _ = _ _webpack _require _ _ ( 166 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _app _components _dashboard _dashboard _component _ _ = _ _webpack _require _ _ ( 103 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _2 _app _components _session _details _session _details _component _ _ = _ _webpack _require _ _ ( 104 ) ;
2017-05-31 17:55:18 +02:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return routing ; } ) ;
var appRoutes = [
{
path : '' ,
component : _ _WEBPACK _IMPORTED _MODULE _1 _app _components _dashboard _dashboard _component _ _ [ "a" /* DashboardComponent */ ]
} ,
{
path : 'session/:id' ,
component : _ _WEBPACK _IMPORTED _MODULE _2 _app _components _session _details _session _details _component _ _ [ "a" /* SessionDetailsComponent */ ]
}
] ;
var routing = _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _router _ _ [ "a" /* RouterModule */ ] . forRoot ( appRoutes ) ;
//# sourceMappingURL=app.routing.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 171 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return environment ; } ) ;
// The file contents for the current environment will overwrite these during build.
// The build system defaults to the dev environment which uses `environment.ts`, but if you do
// `ng build --env=prod` then `environment.prod.ts` will be used instead.
// The list of which env maps to which file can be found in `.angular-cli.json`.
// The file contents for the current environment will overwrite these during build.
var environment = {
production : false
} ;
//# sourceMappingURL=environment.js.map
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 226 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
exports = module . exports = _ _webpack _require _ _ ( 30 ) ( false ) ;
2017-05-31 17:55:18 +02:00
// imports
// module
exports . push ( [ module . i , "" , "" ] ) ;
// exports
/*** EXPORTS FROM exports-loader ***/
module . exports = module . exports . toString ( ) ;
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 227 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
exports = module . exports = _ _webpack _require _ _ ( 30 ) ( false ) ;
2017-05-31 17:55:18 +02:00
// imports
// module
2017-09-22 16:05:34 +02:00
exports . push ( [ module . i , "#dashboard-div {\n padding: 20px;\n}\n\n#log {\n height: 90%;\n}\n\n#log-content {\n height: 90%;\n font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n overflow-y: auto;\n overflow-x: hidden\n}\n\nul {\n margin: 0;\n}\n\nbutton.mat-raised-button {\n text-transform: uppercase;\n float: right;\n}\n\nmd-card-title button.blue {\n color: #ffffff;\n background-color: #0088aa;\n}\n\nmd-card-title button.yellow {\n color: rgba(0, 0, 0, 0.87);\n background-color: #ffcc00;\n}\n\nmd-spinner {\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n}\n\n#tick-div {\n width: 100px;\n height: 100px;\n z-index: 1;\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n}\n\n#tooltip-tick {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 2;\n}\n\n.circ {\n opacity: 0;\n stroke-dasharray: 130;\n stroke-dashoffset: 130;\n transition: all 1s;\n}\n\n.tick {\n stroke-dasharray: 50;\n stroke-dashoffset: 50;\n transition: stroke-dashoffset 1s 0.5s ease-out;\n}\n\n.drawn+svg .path {\n opacity: 1;\n stroke-dashoffset: 0;\n}\n\n#mirrored-video {\n position: relative;\n}\n\n\n/* Pure CSS loader */\n\n#loader {\n width: 100px;\n height: 100px;\n z-index: 1;\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n}\n\n#loader * {\n box-sizing: border-box;\n}\n\n#loader ::after {\n box-sizing: border-box;\n}\n\n#loader ::before {\n box-sizing: border-box;\n}\n\n.loader-1 {\n height: 100px;\n width: 100px;\n -webkit-animation: loader-1-1 4.8s linear infinite;\n animation: loader-1-1 4.8s linear infinite;\n}\n\n@-webkit-keyframes loader-1-1 {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n\n@keyframes loader-1-1 {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.loader-1 span {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n margin: auto;\n height: 100px;\n width: 100px;\n clip: rect(0, 100px, 100px, 50px);\n -webkit-animation: loader-1-2 1.2s linear infinite;\n animation: loader-1-2 1.2s linear infinite;\n}\n\n@-webkit-keyframes loader-1-2 {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(220deg);\n }\n}\n\n@keyframes loader-1-2 {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(220deg);\n transform: rotate(220deg);\n }\n}\n\n.loader-1 span::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n margin: auto;\n height: 100px;\n width: 100px;\n clip: rect(0, 100px, 100px, 50px);\n border: 8px solid #4d4d4d;\n border-radius: 50%;\n -webkit-animation: loader-1-3 1.2s cubic-bezier(0.770, 0.000, 0.175, 1.000) infinite;\n animation: loader-1-3 1.2s cubic-bezier(0.770, 0.000, 0.175, 1.000) infinite;\n}\n\n@-webkit-keyframes loader-1-3 {\n 0% {\n -webkit-transform: rotate(-140deg);\n }\n 50% {\n -webkit-transform: rotate(-160deg);\n }\n 100% {\n -webkit-transform: rotate(140deg);\n }\n}\n\n@keyframes loader-1-3 {\n 0% {\n -webkit-transform: rotate(-140deg);\n transform: rotate(-140deg);\n }\n 50% {\n -webkit-transform: rotate(-160deg);\n transform: rotate(-160deg);\n }\n 100% {\n -webkit-transform: rotate(140deg);\n transform: rotate(140deg);\n }\n}" , "" ] ) ;
2017-05-31 17:55:18 +02:00
// exports
/*** EXPORTS FROM exports-loader ***/
module . exports = module . exports . toString ( ) ;
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 228 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
exports = module . exports = _ _webpack _require _ _ ( 30 ) ( false ) ;
2017-05-31 17:55:18 +02:00
// imports
// module
exports . push ( [ module . i , "" , "" ] ) ;
// exports
/*** EXPORTS FROM exports-loader ***/
module . exports = module . exports . toString ( ) ;
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 237 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports ) {
module . exports = "<main>\n <router-outlet></router-outlet>\n</main>"
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 238 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports ) {
2017-09-22 16:05:34 +02:00
module . exports = "<div id=\"dashboard-div\" fxLayout=\"row\" fxLayout.xs=\"column\" fxLayoutGap=\"20px\" fxFlexFill>\n\n <div fxLayout=\"column\" fxFlex=\"66%\" fxFlexOrder=\"1\" fxFlexOrder.xs=\"2\">\n <md-card id=\"log\">\n <md-card-title>Server events\n <md-slide-toggle title=\"Lock Scroll\" [(ngModel)]=\"lockScroll\" style=\"float: right; margin-left: auto;\">\n <md-icon>lock_outline</md-icon>\n </md-slide-toggle>\n </md-card-title>\n <md-divider></md-divider>\n <md-card-content #scrollMe id=\"log-content\">\n <ul>\n <li *ngFor=\"let i of info\">\n <p>{{i}}</p>\n </li>\n </ul>\n </md-card-content>\n </md-card>\n </div>\n\n <div fxLayout=\"column\" fxFlex=\"33%\" fxFlexOrder=\"2\" fxFlexOrder.xs=\"1\">\n <md-card id=\"video-loop\">\n <md-card-title>Test the connection\n <button [class]=\"testStatus == 'DISCONNECTED' ? 'blue' : (testStatus == 'PLAYING' ? 'yellow' : 'disabled')\" md-raised-button\n (click)=\"toggleTestVideo()\" [disabled]=\"testStatus==='CONNECTING' || testStatus==='CONNECTED'\">{{testButton}}</button></md-card-title>\n <md-card-content #scrollMe id=\"log-content\">\n <div id=\"mirrored-video\">\n <div *ngIf=\"showSpinner\" id=\"loader\">\n <div class=\"loader-1 center\"><span></span></div>\n </div>\n <!--<md-spinner *ngIf=\"showSpinner\" [color]=\"color\"></md-spinner>-->\n <div *ngIf=\"session\" id=\"tick-div\">\n <div id=\"tooltip-tick\" *ngIf=\"testStatus=='PLAYING'\" mdTooltip=\"The connection is successful\" mdTooltipPosition=\"below\"></div>\n <div [class]=\"testStatus=='PLAYING' ? 'trigger drawn' : 'trigger'\"></div>\n <svg version=\"1.1\" id=\"tick\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n viewBox=\"-1 -1 39 39\" style=\"enable-background:new 0 0 37 37;\" xml:space=\"preserve\">\n <path class=\"circ path\" style=\"fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;\" d=\"\n\tM30.5,6.5L30.5,6.5c6.6,6.6,6.6,17.4,0,24l0,0c-6.6,6.6-17.4,6.6-24,0l0,0c-6.6-6.6-6.6-17.4,0-24l0,0C13.1-0.2,23.9-0.2,30.5,6.5z\"\n />\n <polyline class=\"tick path\" style=\"fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;\" points=\"\n\t11.6,20 15.9,24.2 26.4,13.8 \" />\n </svg>\n </div>\n </div>\n <div id=\"msg-chain\"><p *ngFor=\"let msg of msgChain\">{{msg}}</p></div>\n </md-card-content>\n </md-card>\n </div>\n\n</div>\n"
2017-05-31 17:55:18 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 239 :
2017-05-31 17:55:18 +02:00
/***/ ( function ( module , exports ) {
module . exports = "<p>\n session-details works!\n</p>\n"
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 298 :
/***/ ( function ( module , exports ) {
function Mapper ( ) {
var sources = { } ;
this . forEach = function ( callback ) {
for ( var key in sources ) {
var source = sources [ key ] ;
for ( var key2 in source )
callback ( source [ key2 ] ) ;
}
;
} ;
this . get = function ( id , source ) {
var ids = sources [ source ] ;
if ( ids == undefined )
return undefined ;
return ids [ id ] ;
} ;
this . remove = function ( id , source ) {
var ids = sources [ source ] ;
if ( ids == undefined )
return ;
delete ids [ id ] ;
// Check it's empty
for ( var i in ids ) {
return false ;
}
delete sources [ source ] ;
} ;
this . set = function ( value , id , source ) {
if ( value == undefined )
return this . remove ( id , source ) ;
var ids = sources [ source ] ;
if ( ids == undefined )
sources [ source ] = ids = { } ;
ids [ id ] = value ;
} ;
}
;
Mapper . prototype . pop = function ( id , source ) {
var value = this . get ( id , source ) ;
if ( value == undefined )
return undefined ;
this . remove ( id , source ) ;
return value ;
} ;
module . exports = Mapper ;
/***/ } ) ,
/***/ 299 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
/ *
* ( C ) Copyright 2014 Kurento ( http : //kurento.org/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
var JsonRpcClient = _ _webpack _require _ _ ( 300 ) ;
exports . JsonRpcClient = JsonRpcClient ;
/***/ } ) ,
/***/ 300 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-08-22 13:27:44 +02:00
/ *
2017-09-22 16:05:34 +02:00
* ( C ) Copyright 2014 Kurento ( http : //kurento.org/)
2017-08-22 13:27:44 +02:00
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
2017-09-22 16:05:34 +02:00
var RpcBuilder = _ _webpack _require _ _ ( 137 ) ;
var WebSocketWithReconnection = _ _webpack _require _ _ ( 136 ) ;
Date . now = Date . now || function ( ) {
return + new Date ;
} ;
var PING _INTERVAL = 5000 ;
var RECONNECTING = 'RECONNECTING' ;
var CONNECTED = 'CONNECTED' ;
var DISCONNECTED = 'DISCONNECTED' ;
var Logger = console ;
/ * *
*
* heartbeat : interval in ms for each heartbeat message ,
* sendCloseMessage : true / false , before closing the connection , it sends a closeSession message
* < pre >
* ws : {
* uri : URI to conntect to ,
* useSockJS : true ( use SockJS ) / false ( use WebSocket ) by default ,
* onconnected : callback method to invoke when connection is successful ,
* ondisconnect : callback method to invoke when the connection is lost ,
* onreconnecting : callback method to invoke when the client is reconnecting ,
* onreconnected : callback method to invoke when the client succesfully reconnects ,
* onerror : callback method to invoke when there is an error
* } ,
* rpc : {
* requestTimeout : timeout for a request ,
* sessionStatusChanged : callback method for changes in session status ,
* mediaRenegotiation : mediaRenegotiation
* }
* < / p r e >
* /
function JsonRpcClient ( configuration ) {
var self = this ;
var wsConfig = configuration . ws ;
var notReconnectIfNumLessThan = - 1 ;
var pingNextNum = 0 ;
var enabledPings = true ;
var pingPongStarted = false ;
var pingInterval ;
var status = DISCONNECTED ;
var onreconnecting = wsConfig . onreconnecting ;
var onreconnected = wsConfig . onreconnected ;
var onconnected = wsConfig . onconnected ;
var onerror = wsConfig . onerror ;
configuration . rpc . pull = function ( params , request ) {
request . reply ( null , "push" ) ;
} ;
wsConfig . onreconnecting = function ( ) {
Logger . debug ( "--------- ONRECONNECTING -----------" ) ;
if ( status === RECONNECTING ) {
Logger . error ( "Websocket already in RECONNECTING state when receiving a new ONRECONNECTING message. Ignoring it" ) ;
return ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
status = RECONNECTING ;
if ( onreconnecting ) {
onreconnecting ( ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
wsConfig . onreconnected = function ( ) {
Logger . debug ( "--------- ONRECONNECTED -----------" ) ;
if ( status === CONNECTED ) {
Logger . error ( "Websocket already in CONNECTED state when receiving a new ONRECONNECTED message. Ignoring it" ) ;
return ;
}
status = CONNECTED ;
enabledPings = true ;
updateNotReconnectIfLessThan ( ) ;
usePing ( ) ;
if ( onreconnected ) {
onreconnected ( ) ;
}
} ;
wsConfig . onconnected = function ( ) {
Logger . debug ( "--------- ONCONNECTED -----------" ) ;
if ( status === CONNECTED ) {
Logger . error ( "Websocket already in CONNECTED state when receiving a new ONCONNECTED message. Ignoring it" ) ;
return ;
}
status = CONNECTED ;
enabledPings = true ;
usePing ( ) ;
if ( onconnected ) {
onconnected ( ) ;
}
} ;
wsConfig . onerror = function ( error ) {
Logger . debug ( "--------- ONERROR -----------" ) ;
status = DISCONNECTED ;
if ( onerror ) {
onerror ( error ) ;
}
} ;
var ws = new WebSocketWithReconnection ( wsConfig ) ;
Logger . debug ( 'Connecting websocket to URI: ' + wsConfig . uri ) ;
var rpcBuilderOptions = {
request _timeout : configuration . rpc . requestTimeout ,
ping _request _timeout : configuration . rpc . heartbeatRequestTimeout
} ;
var rpc = new RpcBuilder ( RpcBuilder . packers . JsonRPC , rpcBuilderOptions , ws , function ( request ) {
Logger . debug ( 'Received request: ' + JSON . stringify ( request ) ) ;
try {
var func = configuration . rpc [ request . method ] ;
if ( func === undefined ) {
Logger . error ( "Method " + request . method + " not registered in client" ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
func ( request . params , request ) ;
}
}
catch ( err ) {
Logger . error ( 'Exception processing request: ' + JSON . stringify ( request ) ) ;
Logger . error ( err ) ;
}
} ) ;
this . send = function ( method , params , callback ) {
if ( method !== 'ping' ) {
Logger . debug ( 'Request: method:' + method + " params:" + JSON . stringify ( params ) ) ;
}
var requestTime = Date . now ( ) ;
rpc . encode ( method , params , function ( error , result ) {
if ( error ) {
try {
Logger . error ( "ERROR:" + error . message + " in Request: method:" +
method + " params:" + JSON . stringify ( params ) + " request:" +
error . request ) ;
if ( error . data ) {
Logger . error ( "ERROR DATA:" + JSON . stringify ( error . data ) ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
catch ( e ) { }
error . requestTime = requestTime ;
}
if ( callback ) {
if ( result != undefined && result . value !== 'pong' ) {
Logger . debug ( 'Response: ' + JSON . stringify ( result ) ) ;
}
callback ( error , result ) ;
}
} ) ;
} ;
function updateNotReconnectIfLessThan ( ) {
Logger . debug ( "notReconnectIfNumLessThan = " + pingNextNum + ' (old=' +
notReconnectIfNumLessThan + ')' ) ;
notReconnectIfNumLessThan = pingNextNum ;
}
function sendPing ( ) {
if ( enabledPings ) {
var params = null ;
if ( pingNextNum == 0 || pingNextNum == notReconnectIfNumLessThan ) {
params = {
interval : configuration . heartbeat || PING _INTERVAL
2017-08-22 13:27:44 +02:00
} ;
}
2017-09-22 16:05:34 +02:00
pingNextNum ++ ;
self . send ( 'ping' , params , ( function ( pingNum ) {
return function ( error , result ) {
if ( error ) {
Logger . debug ( "Error in ping request #" + pingNum + " (" +
error . message + ")" ) ;
if ( pingNum > notReconnectIfNumLessThan ) {
enabledPings = false ;
updateNotReconnectIfLessThan ( ) ;
Logger . debug ( "Server did not respond to ping message #" +
pingNum + ". Reconnecting... " ) ;
ws . reconnectWs ( ) ;
}
}
} ;
} ) ( pingNextNum ) ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
Logger . debug ( "Trying to send ping, but ping is not enabled" ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
/ *
* If configuration . hearbeat has any value , the ping - pong will work with the interval
* of configuration . hearbeat
* /
function usePing ( ) {
if ( ! pingPongStarted ) {
Logger . debug ( "Starting ping (if configured)" ) ;
pingPongStarted = true ;
if ( configuration . heartbeat != undefined ) {
pingInterval = setInterval ( sendPing , configuration . heartbeat ) ;
sendPing ( ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
this . close = function ( ) {
Logger . debug ( "Closing jsonRpcClient explicitly by client" ) ;
if ( pingInterval != undefined ) {
Logger . debug ( "Clearing ping interval" ) ;
clearInterval ( pingInterval ) ;
}
pingPongStarted = false ;
enabledPings = false ;
if ( configuration . sendCloseMessage ) {
Logger . debug ( "Sending close message" ) ;
this . send ( 'closeSession' , null , function ( error , result ) {
if ( error ) {
Logger . error ( "Error sending close message: " + JSON . stringify ( error ) ) ;
}
ws . close ( ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
ws . close ( ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
// This method is only for testing
this . forceClose = function ( millis ) {
ws . forceClose ( millis ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
this . reconnect = function ( ) {
ws . reconnectWs ( ) ;
} ;
}
module . exports = JsonRpcClient ;
2017-08-22 13:27:44 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 301 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
/ *
* ( C ) Copyright 2014 Kurento ( http : //kurento.org/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
var WebSocketWithReconnection = _ _webpack _require _ _ ( 136 ) ;
exports . WebSocketWithReconnection = WebSocketWithReconnection ;
2017-08-22 13:27:44 +02:00
2017-09-22 16:05:34 +02:00
/***/ } ) ,
/***/ 302 :
/***/ ( function ( module , exports ) {
/ * *
* JsonRPC 2.0 packer
* /
/ * *
* Pack a JsonRPC 2.0 message
*
* @ param { Object } message - object to be packaged . It requires to have all the
* fields needed by the JsonRPC 2.0 message that it ' s going to be generated
*
* @ return { String } - the stringified JsonRPC 2.0 message
* /
function pack ( message , id ) {
var result = {
jsonrpc : "2.0"
} ;
// Request
if ( message . method ) {
result . method = message . method ;
if ( message . params )
result . params = message . params ;
// Request is a notification
if ( id != undefined )
result . id = id ;
}
else if ( id != undefined ) {
if ( message . error ) {
if ( message . result !== undefined )
throw new TypeError ( "Both result and error are defined" ) ;
result . error = message . error ;
}
else if ( message . result !== undefined )
result . result = message . result ;
else
throw new TypeError ( "No result or error is defined" ) ;
result . id = id ;
}
;
return JSON . stringify ( result ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
;
/ * *
* Unpack a JsonRPC 2.0 message
*
* @ param { String } message - string with the content of the JsonRPC 2.0 message
*
* @ throws { TypeError } - Invalid JsonRPC version
*
* @ return { Object } - object filled with the JsonRPC 2.0 message content
* /
function unpack ( message ) {
var result = message ;
if ( typeof message === 'string' || message instanceof String ) {
result = JSON . parse ( message ) ;
}
// Check if it's a valid message
var version = result . jsonrpc ;
if ( version !== '2.0' )
throw new TypeError ( "Invalid JsonRPC version '" + version + "': " + message ) ;
// Response
if ( result . method == undefined ) {
if ( result . id == undefined )
throw new TypeError ( "Invalid message: " + message ) ;
var result _defined = result . result !== undefined ;
var error _defined = result . error !== undefined ;
// Check only result or error is defined, not both or none
if ( result _defined && error _defined )
throw new TypeError ( "Both result and error are defined: " + message ) ;
if ( ! result _defined && ! error _defined )
throw new TypeError ( "No result or error is defined: " + message ) ;
result . ack = result . id ;
delete result . id ;
}
// Return unpacked message
return result ;
}
;
exports . pack = pack ;
exports . unpack = unpack ;
/***/ } ) ,
/***/ 303 :
/***/ ( function ( module , exports ) {
function pack ( message ) {
throw new TypeError ( "Not yet implemented" ) ;
}
;
function unpack ( message ) {
throw new TypeError ( "Not yet implemented" ) ;
}
;
exports . pack = pack ;
exports . unpack = unpack ;
2017-08-22 13:27:44 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 304 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
var JsonRPC = _ _webpack _require _ _ ( 302 ) ;
var XmlRPC = _ _webpack _require _ _ ( 303 ) ;
exports . JsonRPC = JsonRPC ;
exports . XmlRPC = XmlRPC ;
/***/ } ) ,
/***/ 305 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-08-22 13:27:44 +02:00
/ *
2017-09-22 16:05:34 +02:00
* ( C ) Copyright 2014 - 2015 Kurento ( http : //kurento.org/)
2017-08-22 13:27:44 +02:00
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2017-09-22 16:05:34 +02:00
var freeice = _ _webpack _require _ _ ( 229 ) ;
var inherits = _ _webpack _require _ _ ( 117 ) ;
var UAParser = _ _webpack _require _ _ ( 312 ) ;
var uuid = _ _webpack _require _ _ ( 314 ) ;
var hark = _ _webpack _require _ _ ( 231 ) ;
var EventEmitter = _ _webpack _require _ _ ( 116 ) . EventEmitter ;
var recursive = _ _webpack _require _ _ ( 235 ) . recursive . bind ( undefined , true ) ;
var sdpTranslator = _ _webpack _require _ _ ( 294 ) ;
var logger = window . Logger || console ;
// var gUM = navigator.mediaDevices.getUserMedia || function (constraints) {
// return new Promise(navigator.getUserMedia(constraints, function (stream) {
// videoStream = stream
// start()
// }).eror(callback));
// }
try {
_ _webpack _require _ _ ( 234 ) ;
}
catch ( error ) {
if ( typeof getScreenConstraints === 'undefined' ) {
logger . warn ( 'screen sharing is not available' ) ;
getScreenConstraints = function getScreenConstraints ( sendSource , callback ) {
callback ( new Error ( "This library is not enabled for screen sharing" ) ) ;
} ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
var MEDIA _CONSTRAINTS = {
audio : true ,
video : {
width : 640 ,
framerate : 15
}
} ;
// Somehow, the UAParser constructor gets an empty window object.
// We need to pass the user agent string in order to get information
var ua = ( window && window . navigator ) ? window . navigator . userAgent : '' ;
var parser = new UAParser ( ua ) ;
var browser = parser . getBrowser ( ) ;
var usePlanB = false ;
if ( browser . name === 'Chrome' || browser . name === 'Chromium' ) {
logger . debug ( browser . name + ": using SDP PlanB" ) ;
usePlanB = true ;
}
function noop ( error ) {
if ( error )
logger . error ( error ) ;
}
function trackStop ( track ) {
track . stop && track . stop ( ) ;
}
function streamStop ( stream ) {
stream . getTracks ( ) . forEach ( trackStop ) ;
}
/ * *
* Returns a string representation of a SessionDescription object .
* /
var dumpSDP = function ( description ) {
if ( typeof description === 'undefined' || description === null ) {
return '' ;
}
return 'type: ' + description . type + '\r\n' + description . sdp ;
} ;
function bufferizeCandidates ( pc , onerror ) {
var candidatesQueue = [ ] ;
pc . addEventListener ( 'signalingstatechange' , function ( ) {
if ( this . signalingState === 'stable' ) {
while ( candidatesQueue . length ) {
var entry = candidatesQueue . shift ( ) ;
this . addIceCandidate ( entry . candidate , entry . callback , entry . callback ) ;
}
}
} ) ;
return function ( candidate , callback ) {
callback = callback || onerror ;
switch ( pc . signalingState ) {
case 'closed' :
callback ( new Error ( 'PeerConnection object is closed' ) ) ;
break ;
case 'stable' :
if ( pc . remoteDescription ) {
pc . addIceCandidate ( candidate , callback , callback ) ;
break ;
}
default :
candidatesQueue . push ( {
candidate : candidate ,
callback : callback
} ) ;
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
}
/* Simulcast utilities */
function removeFIDFromOffer ( sdp ) {
var n = sdp . indexOf ( "a=ssrc-group:FID" ) ;
if ( n > 0 ) {
return sdp . slice ( 0 , n ) ;
}
else {
return sdp ;
}
}
function getSimulcastInfo ( videoStream ) {
var videoTracks = videoStream . getVideoTracks ( ) ;
if ( ! videoTracks . length ) {
logger . warn ( 'No video tracks available in the video stream' ) ;
return '' ;
}
var lines = [
'a=x-google-flag:conference' ,
'a=ssrc-group:SIM 1 2 3' ,
'a=ssrc:1 cname:localVideo' ,
'a=ssrc:1 msid:' + videoStream . id + ' ' + videoTracks [ 0 ] . id ,
'a=ssrc:1 mslabel:' + videoStream . id ,
'a=ssrc:1 label:' + videoTracks [ 0 ] . id ,
'a=ssrc:2 cname:localVideo' ,
'a=ssrc:2 msid:' + videoStream . id + ' ' + videoTracks [ 0 ] . id ,
'a=ssrc:2 mslabel:' + videoStream . id ,
'a=ssrc:2 label:' + videoTracks [ 0 ] . id ,
'a=ssrc:3 cname:localVideo' ,
'a=ssrc:3 msid:' + videoStream . id + ' ' + videoTracks [ 0 ] . id ,
'a=ssrc:3 mslabel:' + videoStream . id ,
'a=ssrc:3 label:' + videoTracks [ 0 ] . id
] ;
lines . push ( '' ) ;
return lines . join ( '\n' ) ;
}
/ * *
* Wrapper object of an RTCPeerConnection . This object is aimed to simplify the
* development of WebRTC - based applications .
*
* @ constructor module : kurentoUtils . WebRtcPeer
*
* @ param { String } mode Mode in which the PeerConnection will be configured .
* Valid values are : 'recv' , 'send' , and 'sendRecv'
* @ param localVideo Video tag for the local stream
* @ param remoteVideo Video tag for the remote stream
* @ param { MediaStream } videoStream Stream to be used as primary source
* ( typically video and audio , or only video if combined with audioStream ) for
* localVideo and to be added as stream to the RTCPeerConnection
* @ param { MediaStream } audioStream Stream to be used as second source
* ( typically for audio ) for localVideo and to be added as stream to the
* RTCPeerConnection
* /
function WebRtcPeer ( mode , options , callback ) {
if ( ! ( this instanceof WebRtcPeer ) ) {
return new WebRtcPeer ( mode , options , callback ) ;
}
WebRtcPeer . super _ . call ( this ) ;
if ( options instanceof Function ) {
callback = options ;
options = undefined ;
}
options = options || { } ;
callback = ( callback || noop ) . bind ( this ) ;
var self = this ;
var localVideo = options . localVideo ;
var remoteVideo = options . remoteVideo ;
var videoStream = options . videoStream ;
var audioStream = options . audioStream ;
var mediaConstraints = options . mediaConstraints ;
var connectionConstraints = options . connectionConstraints ;
var pc = options . peerConnection ;
var sendSource = options . sendSource || 'webcam' ;
var dataChannelConfig = options . dataChannelConfig ;
var useDataChannels = options . dataChannels || false ;
var dataChannel ;
var guid = uuid . v4 ( ) ;
var configuration = recursive ( {
iceServers : freeice ( )
} , options . configuration ) ;
var onicecandidate = options . onicecandidate ;
if ( onicecandidate )
this . on ( 'icecandidate' , onicecandidate ) ;
var oncandidategatheringdone = options . oncandidategatheringdone ;
if ( oncandidategatheringdone ) {
this . on ( 'candidategatheringdone' , oncandidategatheringdone ) ;
}
var simulcast = options . simulcast ;
var multistream = options . multistream ;
var interop = new sdpTranslator . Interop ( ) ;
var candidatesQueueOut = [ ] ;
var candidategatheringdone = false ;
Object . defineProperties ( this , {
'peerConnection' : {
get : function ( ) {
return pc ;
}
} ,
'id' : {
value : options . id || guid ,
writable : false
} ,
'remoteVideo' : {
get : function ( ) {
return remoteVideo ;
}
} ,
'localVideo' : {
get : function ( ) {
return localVideo ;
}
} ,
'dataChannel' : {
get : function ( ) {
return dataChannel ;
}
} ,
/ * *
* @ member { ( external : ImageData | undefined ) } currentFrame
* /
'currentFrame' : {
get : function ( ) {
// [ToDo] Find solution when we have a remote stream but we didn't set
// a remoteVideo tag
if ( ! remoteVideo )
return ;
if ( remoteVideo . readyState < remoteVideo . HAVE _CURRENT _DATA )
throw new Error ( 'No video stream data available' ) ;
var canvas = document . createElement ( 'canvas' ) ;
canvas . width = remoteVideo . videoWidth ;
canvas . height = remoteVideo . videoHeight ;
canvas . getContext ( '2d' ) . drawImage ( remoteVideo , 0 , 0 ) ;
return canvas ;
}
}
} ) ;
// Init PeerConnection
if ( ! pc ) {
pc = new RTCPeerConnection ( configuration ) ;
if ( useDataChannels && ! dataChannel ) {
var dcId = 'WebRtcPeer-' + self . id ;
var dcOptions = undefined ;
if ( dataChannelConfig ) {
dcId = dataChannelConfig . id || dcId ;
dcOptions = dataChannelConfig . options ;
}
dataChannel = pc . createDataChannel ( dcId , dcOptions ) ;
if ( dataChannelConfig ) {
dataChannel . onopen = dataChannelConfig . onopen ;
dataChannel . onclose = dataChannelConfig . onclose ;
dataChannel . onmessage = dataChannelConfig . onmessage ;
dataChannel . onbufferedamountlow = dataChannelConfig . onbufferedamountlow ;
dataChannel . onerror = dataChannelConfig . onerror || noop ;
}
}
}
pc . addEventListener ( 'icecandidate' , function ( event ) {
var candidate = event . candidate ;
if ( EventEmitter . listenerCount ( self , 'icecandidate' ) ||
EventEmitter . listenerCount ( self , 'candidategatheringdone' ) ) {
if ( candidate ) {
var cand ;
if ( multistream && usePlanB ) {
cand = interop . candidateToUnifiedPlan ( candidate ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
cand = candidate ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
self . emit ( 'icecandidate' , cand ) ;
candidategatheringdone = false ;
}
else if ( ! candidategatheringdone ) {
self . emit ( 'candidategatheringdone' ) ;
candidategatheringdone = true ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else if ( ! candidategatheringdone ) {
// Not listening to 'icecandidate' or 'candidategatheringdone' events, queue
// the candidate until one of them is listened
candidatesQueueOut . push ( candidate ) ;
if ( ! candidate )
candidategatheringdone = true ;
}
} ) ;
pc . ontrack = options . onaddstream ;
pc . onnegotiationneeded = options . onnegotiationneeded ;
this . on ( 'newListener' , function ( event , listener ) {
if ( event === 'icecandidate' || event === 'candidategatheringdone' ) {
while ( candidatesQueueOut . length ) {
var candidate = candidatesQueueOut . shift ( ) ;
if ( ! candidate === ( event === 'candidategatheringdone' ) ) {
listener ( candidate ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
}
} ) ;
var addIceCandidate = bufferizeCandidates ( pc ) ;
/ * *
* Callback function invoked when an ICE candidate is received . Developers are
* expected to invoke this function in order to complete the SDP negotiation .
*
* @ function module : kurentoUtils . WebRtcPeer . prototype . addIceCandidate
*
* @ param iceCandidate - Literal object with the ICE candidate description
* @ param callback - Called when the ICE candidate has been added .
* /
this . addIceCandidate = function ( iceCandidate , callback ) {
var candidate ;
if ( multistream && usePlanB ) {
candidate = interop . candidateToPlanB ( iceCandidate ) ;
}
else {
candidate = new RTCIceCandidate ( iceCandidate ) ;
}
logger . debug ( 'Remote ICE candidate received' , iceCandidate ) ;
callback = ( callback || noop ) . bind ( this ) ;
addIceCandidate ( candidate , callback ) ;
} ;
this . generateOffer = function ( callback ) {
callback = callback . bind ( this ) ;
var offerAudio = true ;
var offerVideo = true ;
// Constraints must have both blocks
if ( mediaConstraints ) {
offerAudio = ( typeof mediaConstraints . audio === 'boolean' ) ?
mediaConstraints . audio : true ;
offerVideo = ( typeof mediaConstraints . video === 'boolean' ) ?
mediaConstraints . video : true ;
}
var browserDependantConstraints = {
offerToReceiveAudio : ( mode !== 'sendonly' && offerAudio ) ,
offerToReceiveVideo : ( mode !== 'sendonly' && offerVideo )
} ;
//FIXME: clarify possible constraints passed to createOffer()
/ * v a r c o n s t r a i n t s = r e c u r s i v e ( b r o w s e r D e p e n d a n t C o n s t r a i n t s ,
connectionConstraints ) * /
var constraints = browserDependantConstraints ;
logger . debug ( 'constraints: ' + JSON . stringify ( constraints ) ) ;
pc . createOffer ( constraints ) . then ( function ( offer ) {
logger . debug ( 'Created SDP offer' ) ;
offer = mangleSdpToAddSimulcast ( offer ) ;
return pc . setLocalDescription ( offer ) ;
} ) . then ( function ( ) {
var localDescription = pc . localDescription ;
logger . debug ( 'Local description set' , localDescription . sdp ) ;
if ( multistream && usePlanB ) {
localDescription = interop . toUnifiedPlan ( localDescription ) ;
logger . debug ( 'offer::origPlanB->UnifiedPlan' , dumpSDP ( localDescription ) ) ;
}
callback ( null , localDescription . sdp , self . processAnswer . bind ( self ) ) ;
} ) . catch ( callback ) ;
} ;
this . getLocalSessionDescriptor = function ( ) {
return pc . localDescription ;
} ;
this . getRemoteSessionDescriptor = function ( ) {
return pc . remoteDescription ;
} ;
function setRemoteVideo ( ) {
if ( remoteVideo ) {
var stream = pc . getRemoteStreams ( ) [ 0 ] ;
var url = stream ? URL . createObjectURL ( stream ) : '' ;
remoteVideo . pause ( ) ;
remoteVideo . src = url ;
remoteVideo . load ( ) ;
logger . debug ( 'Remote URL:' , url ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
this . showLocalVideo = function ( ) {
localVideo . src = URL . createObjectURL ( videoStream ) ;
localVideo . muted = true ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
this . send = function ( data ) {
if ( dataChannel && dataChannel . readyState === 'open' ) {
dataChannel . send ( data ) ;
}
else {
logger . warn ( 'Trying to send data over a non-existing or closed data channel' ) ;
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
/ * *
* Callback function invoked when a SDP answer is received . Developers are
* expected to invoke this function in order to complete the SDP negotiation .
*
* @ function module : kurentoUtils . WebRtcPeer . prototype . processAnswer
*
* @ param sdpAnswer - Description of sdpAnswer
* @ param callback -
* Invoked after the SDP answer is processed , or there is an error .
* /
this . processAnswer = function ( sdpAnswer , callback ) {
callback = ( callback || noop ) . bind ( this ) ;
var answer = new RTCSessionDescription ( {
type : 'answer' ,
sdp : sdpAnswer
2017-08-22 13:27:44 +02:00
} ) ;
2017-09-22 16:05:34 +02:00
if ( multistream && usePlanB ) {
var planBAnswer = interop . toPlanB ( answer ) ;
logger . debug ( 'asnwer::planB' , dumpSDP ( planBAnswer ) ) ;
answer = planBAnswer ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
logger . debug ( 'SDP answer received, setting remote description' ) ;
if ( pc . signalingState === 'closed' ) {
return callback ( 'PeerConnection is closed' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
pc . setRemoteDescription ( answer , function ( ) {
setRemoteVideo ( ) ;
callback ( ) ;
} , callback ) ;
} ;
/ * *
* Callback function invoked when a SDP offer is received . Developers are
* expected to invoke this function in order to complete the SDP negotiation .
*
* @ function module : kurentoUtils . WebRtcPeer . prototype . processOffer
*
* @ param sdpOffer - Description of sdpOffer
* @ param callback - Called when the remote description has been set
* successfully .
* /
this . processOffer = function ( sdpOffer , callback ) {
callback = callback . bind ( this ) ;
var offer = new RTCSessionDescription ( {
type : 'offer' ,
sdp : sdpOffer
} ) ;
if ( multistream && usePlanB ) {
var planBOffer = interop . toPlanB ( offer ) ;
logger . debug ( 'offer::planB' , dumpSDP ( planBOffer ) ) ;
offer = planBOffer ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
logger . debug ( 'SDP offer received, setting remote description' ) ;
if ( pc . signalingState === 'closed' ) {
return callback ( 'PeerConnection is closed' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
pc . setRemoteDescription ( offer ) . then ( function ( ) {
return setRemoteVideo ( ) ;
} ) . then ( function ( ) {
return pc . createAnswer ( ) ;
} ) . then ( function ( answer ) {
answer = mangleSdpToAddSimulcast ( answer ) ;
logger . debug ( 'Created SDP answer' ) ;
return pc . setLocalDescription ( answer ) ;
} ) . then ( function ( ) {
var localDescription = pc . localDescription ;
if ( multistream && usePlanB ) {
localDescription = interop . toUnifiedPlan ( localDescription ) ;
logger . debug ( 'answer::origPlanB->UnifiedPlan' , dumpSDP ( localDescription ) ) ;
}
logger . debug ( 'Local description set' , localDescription . sdp ) ;
callback ( null , localDescription . sdp ) ;
} ) . catch ( callback ) ;
} ;
function mangleSdpToAddSimulcast ( answer ) {
if ( simulcast ) {
if ( browser . name === 'Chrome' || browser . name === 'Chromium' ) {
logger . debug ( 'Adding multicast info' ) ;
answer = new RTCSessionDescription ( {
'type' : answer . type ,
'sdp' : removeFIDFromOffer ( answer . sdp ) + getSimulcastInfo ( videoStream )
} ) ;
}
else {
logger . warn ( 'Simulcast is only available in Chrome browser.' ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
return answer ;
}
/ * *
* This function creates the RTCPeerConnection object taking into account the
* properties received in the constructor . It starts the SDP negotiation
* process : generates the SDP offer and invokes the onsdpoffer callback . This
* callback is expected to send the SDP offer , in order to obtain an SDP
* answer from another peer .
* /
function start ( ) {
if ( pc . signalingState === 'closed' ) {
callback ( 'The peer connection object is in "closed" state. This is most likely due to an invocation of the dispose method before accepting in the dialogue' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( videoStream && localVideo ) {
self . showLocalVideo ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( videoStream ) {
pc . addStream ( videoStream ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( audioStream ) {
pc . addStream ( audioStream ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
// [Hack] https://code.google.com/p/chromium/issues/detail?id=443558
var browser = parser . getBrowser ( ) ;
if ( mode === 'sendonly' &&
( browser . name === 'Chrome' || browser . name === 'Chromium' ) &&
browser . major === 39 ) {
mode = 'sendrecv' ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
callback ( ) ;
}
if ( mode !== 'recvonly' && ! videoStream && ! audioStream ) {
function getMedia ( constraints ) {
if ( constraints === undefined ) {
constraints = MEDIA _CONSTRAINTS ;
}
navigator . mediaDevices . getUserMedia ( constraints ) . then ( function ( stream ) {
videoStream = stream ;
start ( ) ;
} ) . catch ( callback ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( sendSource === 'webcam' ) {
getMedia ( mediaConstraints ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else {
getScreenConstraints ( sendSource , function ( error , constraints _ ) {
if ( error )
return callback ( error ) ;
constraints = [ mediaConstraints ] ;
constraints . unshift ( constraints _ ) ;
getMedia ( recursive . apply ( undefined , constraints ) ) ;
} , guid ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
else {
setTimeout ( start , 0 ) ;
}
this . on ( '_dispose' , function ( ) {
if ( localVideo ) {
localVideo . pause ( ) ;
localVideo . src = '' ;
localVideo . load ( ) ;
//Unmute local video in case the video tag is later used for remote video
localVideo . muted = false ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( remoteVideo ) {
remoteVideo . pause ( ) ;
remoteVideo . src = '' ;
remoteVideo . load ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
self . removeAllListeners ( ) ;
if ( window . cancelChooseDesktopMedia !== undefined ) {
window . cancelChooseDesktopMedia ( guid ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
} ) ;
}
inherits ( WebRtcPeer , EventEmitter ) ;
function createEnableDescriptor ( type ) {
var method = 'get' + type + 'Tracks' ;
return {
enumerable : true ,
get : function ( ) {
// [ToDo] Should return undefined if not all tracks have the same value?
if ( ! this . peerConnection )
return ;
var streams = this . peerConnection . getLocalStreams ( ) ;
if ( ! streams . length )
return ;
for ( var i = 0 , stream ; stream = streams [ i ] ; i ++ ) {
var tracks = stream [ method ] ( ) ;
for ( var j = 0 , track ; track = tracks [ j ] ; j ++ )
if ( ! track . enabled )
return false ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
return true ;
} ,
set : function ( value ) {
function trackSetEnable ( track ) {
track . enabled = value ;
}
this . peerConnection . getLocalStreams ( ) . forEach ( function ( stream ) {
stream [ method ] ( ) . forEach ( trackSetEnable ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
}
Object . defineProperties ( WebRtcPeer . prototype , {
'enabled' : {
enumerable : true ,
get : function ( ) {
return this . audioEnabled && this . videoEnabled ;
} ,
set : function ( value ) {
this . audioEnabled = this . videoEnabled = value ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
} ,
'audioEnabled' : createEnableDescriptor ( 'Audio' ) ,
'videoEnabled' : createEnableDescriptor ( 'Video' )
} ) ;
WebRtcPeer . prototype . getLocalStream = function ( index ) {
if ( this . peerConnection ) {
return this . peerConnection . getLocalStreams ( ) [ index || 0 ] ;
}
} ;
WebRtcPeer . prototype . getRemoteStream = function ( index ) {
if ( this . peerConnection ) {
return this . peerConnection . getRemoteStreams ( ) [ index || 0 ] ;
}
} ;
/ * *
* @ description This method frees the resources used by WebRtcPeer .
*
* @ function module : kurentoUtils . WebRtcPeer . prototype . dispose
* /
WebRtcPeer . prototype . dispose = function ( ) {
logger . debug ( 'Disposing WebRtcPeer' ) ;
var pc = this . peerConnection ;
var dc = this . dataChannel ;
try {
if ( dc ) {
if ( dc . signalingState === 'closed' )
return ;
dc . close ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( pc ) {
if ( pc . signalingState === 'closed' )
return ;
pc . getLocalStreams ( ) . forEach ( streamStop ) ;
// FIXME This is not yet implemented in firefox
// if(videoStream) pc.removeStream(videoStream);
// if(audioStream) pc.removeStream(audioStream);
pc . close ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
catch ( err ) {
logger . warn ( 'Exception disposing webrtc peer ' + err ) ;
}
this . emit ( '_dispose' ) ;
} ;
//
// Specialized child classes
//
function WebRtcPeerRecvonly ( options , callback ) {
if ( ! ( this instanceof WebRtcPeerRecvonly ) ) {
return new WebRtcPeerRecvonly ( options , callback ) ;
}
WebRtcPeerRecvonly . super _ . call ( this , 'recvonly' , options , callback ) ;
}
inherits ( WebRtcPeerRecvonly , WebRtcPeer ) ;
function WebRtcPeerSendonly ( options , callback ) {
if ( ! ( this instanceof WebRtcPeerSendonly ) ) {
return new WebRtcPeerSendonly ( options , callback ) ;
}
WebRtcPeerSendonly . super _ . call ( this , 'sendonly' , options , callback ) ;
}
inherits ( WebRtcPeerSendonly , WebRtcPeer ) ;
function WebRtcPeerSendrecv ( options , callback ) {
if ( ! ( this instanceof WebRtcPeerSendrecv ) ) {
return new WebRtcPeerSendrecv ( options , callback ) ;
}
WebRtcPeerSendrecv . super _ . call ( this , 'sendrecv' , options , callback ) ;
}
inherits ( WebRtcPeerSendrecv , WebRtcPeer ) ;
function harkUtils ( stream , options ) {
return hark ( stream , options ) ;
}
exports . bufferizeCandidates = bufferizeCandidates ;
exports . WebRtcPeerRecvonly = WebRtcPeerRecvonly ;
exports . WebRtcPeerSendonly = WebRtcPeerSendonly ;
exports . WebRtcPeerSendrecv = WebRtcPeerSendrecv ;
exports . hark = harkUtils ;
2017-08-22 13:27:44 +02:00
/***/ } ) ,
2017-09-22 16:05:34 +02:00
/***/ 306 :
2017-08-22 13:27:44 +02:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2017-09-22 16:05:34 +02:00
/ *
* ( C ) Copyright 2014 Kurento ( http : //kurento.org/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
/ * *
* This module contains a set of reusable components that have been found useful
* during the development of the WebRTC applications with Kurento .
*
* @ module kurentoUtils
*
* @ copyright 2014 Kurento ( http : //kurento.org/)
* @ license ALv2
* /
var WebRtcPeer = _ _webpack _require _ _ ( 305 ) ;
exports . WebRtcPeer = WebRtcPeer ;
/***/ } ) ,
/***/ 307 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
/ *
* ( C ) Copyright 2017 OpenVidu ( http : //openvidu.io/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
var OpenViduInternal _1 = _ _webpack _require _ _ ( 309 ) ;
var Session _1 = _ _webpack _require _ _ ( 139 ) ;
var Publisher _1 = _ _webpack _require _ _ ( 138 ) ;
var adapter = _ _webpack _require _ _ ( 142 ) ;
if ( window ) {
window [ "adapter" ] = adapter ;
}
var OpenVidu = /** @class */ ( function ( ) {
function OpenVidu ( ) {
this . openVidu = new OpenViduInternal _1 . OpenViduInternal ( ) ;
console . info ( "'OpenVidu' initialized" ) ;
}
;
OpenVidu . prototype . initSession = function ( param1 , param2 ) {
if ( this . checkSystemRequirements ( ) ) {
if ( typeof param2 == "string" ) {
return new Session _1 . Session ( this . openVidu . initSession ( param2 ) , this ) ;
}
else {
return new Session _1 . Session ( this . openVidu . initSession ( param1 ) , this ) ;
}
}
else {
alert ( "Browser not supported" ) ;
}
} ;
OpenVidu . prototype . initPublisher = function ( parentId , cameraOptions , callback ) {
if ( this . checkSystemRequirements ( ) ) {
if ( cameraOptions != null ) {
var cameraOptionsAux = {
audio : cameraOptions . audio != null ? cameraOptions . audio : true ,
video : cameraOptions . video != null ? cameraOptions . video : true ,
data : true ,
mediaConstraints : this . openVidu . generateMediaConstraints ( cameraOptions . quality )
} ;
cameraOptions = cameraOptionsAux ;
}
else {
cameraOptions = {
audio : true ,
video : true ,
data : true ,
mediaConstraints : {
audio : true ,
video : { width : { ideal : 1280 } }
}
} ;
}
var publisher = new Publisher _1 . Publisher ( this . openVidu . initPublisherTagged ( parentId , cameraOptions , callback ) , parentId ) ;
console . info ( "'Publisher' initialized" ) ;
return publisher ;
}
else {
alert ( "Browser not supported" ) ;
}
} ;
OpenVidu . prototype . checkSystemRequirements = function ( ) {
var browser = adapter . browserDetails . browser ;
var version = adapter . browserDetails . version ;
//Bug fix: 'navigator.userAgent' in Firefox for Ubuntu 14.04 does not return "Firefox/[version]" in the string, so version returned is null
if ( ( browser == 'firefox' ) && ( version == null ) ) {
return 1 ;
}
if ( ( ( browser == 'chrome' ) && ( version >= 28 ) ) || ( ( browser == 'edge' ) && ( version >= 12 ) ) || ( ( browser == 'firefox' ) && ( version >= 22 ) ) ) {
return 1 ;
}
else {
return 0 ;
}
} ;
OpenVidu . prototype . getDevices = function ( callback ) {
navigator . mediaDevices . enumerateDevices ( ) . then ( function ( deviceInfos ) {
callback ( null , deviceInfos ) ;
} ) . catch ( function ( error ) {
console . error ( "Error getting devices" , error ) ;
callback ( error , null ) ;
} ) ;
} ;
OpenVidu . prototype . enableProdMode = function ( ) {
console . log = function ( ) { } ;
console . debug = function ( ) { } ;
console . info = function ( ) { } ;
console . warn = function ( ) { } ;
} ;
return OpenVidu ;
} ( ) ) ;
exports . OpenVidu = OpenVidu ;
/***/ } ) ,
/***/ 308 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
function _ _export ( m ) {
for ( var p in m ) if ( ! exports . hasOwnProperty ( p ) ) exports [ p ] = m [ p ] ;
}
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
_ _export ( _ _webpack _require _ _ ( 307 ) ) ;
_ _export ( _ _webpack _require _ _ ( 139 ) ) ;
_ _export ( _ _webpack _require _ _ ( 138 ) ) ;
_ _export ( _ _webpack _require _ _ ( 140 ) ) ;
_ _export ( _ _webpack _require _ _ ( 86 ) ) ;
_ _export ( _ _webpack _require _ _ ( 141 ) ) ;
/***/ } ) ,
/***/ 309 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
/ *
* ( C ) Copyright 2017 OpenVidu ( http : //openvidu.io/)
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* /
var SessionInternal _1 = _ _webpack _require _ _ ( 310 ) ;
var Stream _1 = _ _webpack _require _ _ ( 86 ) ;
var RpcBuilder = _ _webpack _require _ _ ( 137 ) ;
var OpenViduInternal = /** @class */ ( function ( ) {
function OpenViduInternal ( ) {
this . remoteStreams = [ ] ;
}
;
/* NEW METHODS */
OpenViduInternal . prototype . initSession = function ( sessionId ) {
console . info ( "'Session' initialized with 'sessionId' [" + sessionId + "]" ) ;
this . session = new SessionInternal _1 . SessionInternal ( this , sessionId ) ;
return this . session ;
} ;
OpenViduInternal . prototype . initPublisherTagged = function ( parentId , cameraOptions , callback ) {
var _this = this ;
this . getCamera ( cameraOptions ) ;
if ( callback == null ) {
this . camera . requestCameraAccess ( function ( error , camera ) {
if ( error ) {
console . error ( "Error accessing the camera" , error ) ;
}
else {
_this . camera . setVideoElement ( _this . cameraReady ( camera , parentId ) ) ;
}
} ) ;
return this . camera ;
}
else {
this . camera . requestCameraAccess ( function ( error , camera ) {
if ( error ) {
callback ( error ) ;
}
else {
_this . camera . setVideoElement ( _this . cameraReady ( camera , parentId ) ) ;
callback ( undefined ) ;
}
} ) ;
return this . camera ;
}
} ;
OpenViduInternal . prototype . cameraReady = function ( camera , parentId ) {
this . camera = camera ;
var videoElement = this . camera . playOnlyVideo ( parentId , null ) ;
this . camera . emitStreamReadyEvent ( ) ;
return videoElement ;
} ;
OpenViduInternal . prototype . initPublisher = function ( cameraOptions , callback ) {
this . getCamera ( cameraOptions ) ;
this . camera . requestCameraAccess ( function ( error , camera ) {
if ( error )
callback ( error ) ;
else
callback ( undefined ) ;
} ) ;
} ;
OpenViduInternal . prototype . getLocalStream = function ( ) {
return this . camera ;
} ;
OpenViduInternal . prototype . getRemoteStreams = function ( ) {
return this . remoteStreams ;
} ;
/* NEW METHODS */
OpenViduInternal . prototype . getWsUri = function ( ) {
return this . wsUri ;
} ;
OpenViduInternal . prototype . setWsUri = function ( wsUri ) {
this . wsUri = wsUri ;
} ;
OpenViduInternal . prototype . getSecret = function ( ) {
return this . secret ;
} ;
OpenViduInternal . prototype . setSecret = function ( secret ) {
this . secret = secret ;
} ;
OpenViduInternal . prototype . getOpenViduServerURL = function ( ) {
return 'https://' + this . wsUri . split ( "wss://" ) [ 1 ] . split ( "/room" ) [ 0 ] ;
} ;
OpenViduInternal . prototype . getRoom = function ( ) {
return this . session ;
} ;
OpenViduInternal . prototype . connect = function ( callback ) {
this . callback = callback ;
this . initJsonRpcClient ( this . wsUri ) ;
} ;
OpenViduInternal . prototype . initJsonRpcClient = function ( wsUri ) {
var config = {
heartbeat : 3000 ,
sendCloseMessage : false ,
ws : {
uri : wsUri ,
useSockJS : false ,
onconnected : this . connectCallback . bind ( this ) ,
ondisconnect : this . disconnectCallback . bind ( this ) ,
onreconnecting : this . reconnectingCallback . bind ( this ) ,
onreconnected : this . reconnectedCallback . bind ( this )
} ,
rpc : {
requestTimeout : 15000 ,
//notifications
participantJoined : this . onParticipantJoined . bind ( this ) ,
participantPublished : this . onParticipantPublished . bind ( this ) ,
participantUnpublished : this . onParticipantLeft . bind ( this ) ,
participantLeft : this . onParticipantLeft . bind ( this ) ,
participantEvicted : this . onParticipantEvicted . bind ( this ) ,
sendMessage : this . onNewMessage . bind ( this ) ,
iceCandidate : this . iceCandidateEvent . bind ( this ) ,
mediaError : this . onMediaError . bind ( this ) ,
custonNotification : this . customNotification . bind ( this )
}
} ;
this . jsonRpcClient = new RpcBuilder . clients . JsonRpcClient ( config ) ;
} ;
OpenViduInternal . prototype . customNotification = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . emitEvent ( "custom-message-received" , [ { params : params } ] ) ;
}
} ;
OpenViduInternal . prototype . connectCallback = function ( error ) {
if ( error ) {
this . callback ( error ) ;
}
else {
this . callback ( null ) ;
}
} ;
OpenViduInternal . prototype . isRoomAvailable = function ( ) {
if ( this . session !== undefined && this . session instanceof SessionInternal _1 . SessionInternal ) {
return true ;
}
else {
console . warn ( 'Room instance not found' ) ;
return false ;
}
} ;
OpenViduInternal . prototype . disconnectCallback = function ( ) {
console . warn ( 'Websocket connection lost' ) ;
if ( this . isRoomAvailable ( ) ) {
this . session . onLostConnection ( ) ;
}
else {
alert ( 'Connection error. Please reload page.' ) ;
}
} ;
OpenViduInternal . prototype . reconnectingCallback = function ( ) {
console . warn ( 'Websocket connection lost (reconnecting)' ) ;
if ( this . isRoomAvailable ( ) ) {
this . session . onLostConnection ( ) ;
}
else {
alert ( 'Connection error. Please reload page.' ) ;
}
} ;
OpenViduInternal . prototype . reconnectedCallback = function ( ) {
console . warn ( 'Websocket reconnected' ) ;
} ;
OpenViduInternal . prototype . onParticipantJoined = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onParticipantJoined ( params ) ;
}
} ;
OpenViduInternal . prototype . onParticipantPublished = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onParticipantPublished ( params ) ;
}
} ;
OpenViduInternal . prototype . onParticipantLeft = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onParticipantLeft ( params ) ;
}
} ;
OpenViduInternal . prototype . onParticipantEvicted = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onParticipantEvicted ( params ) ;
}
} ;
OpenViduInternal . prototype . onNewMessage = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onNewMessage ( params ) ;
}
} ;
OpenViduInternal . prototype . iceCandidateEvent = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . recvIceCandidate ( params ) ;
}
} ;
OpenViduInternal . prototype . onRoomClosed = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onRoomClosed ( params ) ;
}
} ;
OpenViduInternal . prototype . onMediaError = function ( params ) {
if ( this . isRoomAvailable ( ) ) {
this . session . onMediaError ( params ) ;
}
} ;
OpenViduInternal . prototype . setRpcParams = function ( params ) {
this . rpcParams = params ;
} ;
OpenViduInternal . prototype . sendRequest = function ( method , params , callback ) {
if ( params && params instanceof Function ) {
callback = params ;
params = undefined ;
}
params = params || { } ;
if ( this . rpcParams && this . rpcParams !== null && this . rpcParams !== undefined ) {
for ( var index in this . rpcParams ) {
if ( this . rpcParams . hasOwnProperty ( index ) ) {
params [ index ] = this . rpcParams [ index ] ;
console . debug ( 'RPC param added to request {' + index + ': ' + this . rpcParams [ index ] + '}' ) ;
}
}
}
console . debug ( 'Sending request: {method:"' + method + '", params: ' + JSON . stringify ( params ) + '}' ) ;
this . jsonRpcClient . send ( method , params , callback ) ;
} ;
OpenViduInternal . prototype . close = function ( forced ) {
if ( this . isRoomAvailable ( ) ) {
this . session . leave ( forced , this . jsonRpcClient ) ;
}
} ;
;
OpenViduInternal . prototype . disconnectParticipant = function ( stream ) {
if ( this . isRoomAvailable ( ) ) {
this . session . disconnect ( stream ) ;
}
} ;
OpenViduInternal . prototype . getCamera = function ( options ) {
if ( this . camera ) {
return this . camera ;
}
options = options || {
audio : true ,
video : true ,
data : true ,
mediaConstraints : {
audio : true ,
video : { width : { ideal : 1280 } }
}
} ;
options . connection = this . session . getLocalParticipant ( ) ;
this . camera = new Stream _1 . Stream ( this , true , this . session , options ) ;
return this . camera ;
} ;
;
/ * j o i n S e s s i o n ( o p t i o n s : S e s s i o n O p t i o n s , c a l l b a c k : C a l l b a c k < S e s s i o n > ) {
this . session . configure ( options ) ;
this . session . connect2 ( ) ;
this . session . addEventListener ( 'room-connected' , roomEvent => callback ( undefined , this . session ) ) ;
this . session . addEventListener ( 'error-room' , error => callback ( error ) ) ;
return this . session ;
} ; * /
//CHAT
OpenViduInternal . prototype . sendMessage = function ( room , user , message ) {
this . sendRequest ( 'sendMessage' , {
message : message ,
userMessage : user ,
roomMessage : room
} , function ( error , response ) {
if ( error ) {
console . error ( error ) ;
}
} ) ;
} ;
;
OpenViduInternal . prototype . sendCustomRequest = function ( params , callback ) {
this . sendRequest ( 'customRequest' , params , callback ) ;
} ;
;
OpenViduInternal . prototype . toggleLocalVideoTrack = function ( activate ) {
this . getCamera ( ) . getWebRtcPeer ( ) . videoEnabled = activate ;
} ;
OpenViduInternal . prototype . toggleLocalAudioTrack = function ( activate ) {
this . getCamera ( ) . getWebRtcPeer ( ) . audioEnabled = activate ;
} ;
OpenViduInternal . prototype . publishLocalVideoAudio = function ( ) {
this . toggleLocalVideoTrack ( true ) ;
this . toggleLocalAudioTrack ( true ) ;
} ;
OpenViduInternal . prototype . unpublishLocalVideoAudio = function ( ) {
this . toggleLocalVideoTrack ( false ) ;
this . toggleLocalAudioTrack ( false ) ;
} ;
OpenViduInternal . prototype . generateMediaConstraints = function ( quality ) {
var mediaConstraints = {
audio : true ,
video : { }
} ;
var w , h ;
switch ( quality ) {
case 'LOW' :
w = 320 ;
h = 240 ;
break ;
case 'MEDIUM' :
w = 640 ;
h = 480 ;
break ;
case 'HIGH' :
w = 1280 ;
h = 720 ;
break ;
default :
w = 640 ;
h = 480 ;
}
mediaConstraints . video [ 'width' ] = { exact : w } ;
mediaConstraints . video [ 'height' ] = { exact : h } ;
//mediaConstraints.video['frameRate'] = { ideal: Number((<HTMLInputElement>document.getElementById('frameRate')).value) };
return mediaConstraints ;
} ;
return OpenViduInternal ;
} ( ) ) ;
exports . OpenViduInternal = OpenViduInternal ;
/***/ } ) ,
/***/ 310 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var Connection _1 = _ _webpack _require _ _ ( 141 ) ;
var EventEmitter = _ _webpack _require _ _ ( 40 ) ;
var SECRET _PARAM = '?secret=' ;
var SessionInternal = /** @class */ ( function ( ) {
function SessionInternal ( openVidu , sessionId ) {
this . openVidu = openVidu ;
this . ee = new EventEmitter ( ) ;
this . streams = { } ;
this . participants = { } ;
this . participantsSpeaking = [ ] ;
this . connected = false ;
this . sessionId = this . getUrlWithoutSecret ( sessionId ) ;
this . localParticipant = new Connection _1 . Connection ( this . openVidu , true , this ) ;
if ( ! this . openVidu . getWsUri ( ) ) {
this . processOpenViduUrl ( sessionId ) ;
}
}
SessionInternal . prototype . processOpenViduUrl = function ( url ) {
this . openVidu . setSecret ( this . getSecretFromUrl ( url ) ) ;
this . openVidu . setWsUri ( this . getFinalUrl ( url ) ) ;
} ;
SessionInternal . prototype . getSecretFromUrl = function ( url ) {
var secret = '' ;
if ( url . indexOf ( SECRET _PARAM ) !== - 1 ) {
secret = url . substring ( url . lastIndexOf ( SECRET _PARAM ) + SECRET _PARAM . length , url . length ) ;
}
return secret ;
} ;
SessionInternal . prototype . getUrlWithoutSecret = function ( url ) {
if ( url . indexOf ( SECRET _PARAM ) !== - 1 ) {
url = url . substring ( 0 , url . lastIndexOf ( SECRET _PARAM ) ) ;
}
return url ;
} ;
SessionInternal . prototype . getFinalUrl = function ( url ) {
url = this . getUrlWithoutSecret ( url ) . substring ( 0 , url . lastIndexOf ( '/' ) ) + '/room' ;
if ( url . indexOf ( ".ngrok.io" ) !== - 1 ) {
// OpenVidu server URL referes to a ngrok IP: secure wss protocol and delete port of URL
url = url . replace ( "ws://" , "wss://" ) ;
var regex = /\.ngrok\.io:\d+/ ;
url = url . replace ( regex , ".ngrok.io" ) ;
}
else if ( ( url . indexOf ( "localhost" ) !== - 1 ) || ( url . indexOf ( "127.0.0.1" ) != - 1 ) ) {
// OpenVidu server URL referes to localhost IP
}
return url ;
} ;
/* NEW METHODS */
SessionInternal . prototype . connect = function ( token , callback ) {
var _this = this ;
this . openVidu . connect ( function ( error ) {
if ( error ) {
callback ( 'ERROR CONNECTING TO OPENVIDU' ) ;
}
else {
if ( ! token ) {
token = _this . randomToken ( ) ;
}
var joinParams = {
token : token ,
session : _this . sessionId ,
metadata : _this . options . metadata ,
secret : _this . openVidu . getSecret ( ) ,
dataChannels : false
} ;
if ( _this . localParticipant ) {
if ( Object . keys ( _this . localParticipant . getStreams ( ) ) . some ( function ( streamId ) {
return _this . streams [ streamId ] . isDataChannelEnabled ( ) ;
} ) ) {
joinParams . dataChannels = true ;
}
}
_this . openVidu . sendRequest ( 'joinRoom' , joinParams , function ( error , response ) {
if ( error ) {
callback ( error ) ;
}
else {
_this . connected = true ;
var exParticipants = response . value ;
// IMPORTANT: Update connectionId with value send by server
_this . localParticipant . connectionId = response . id ;
_this . participants [ response . id ] = _this . localParticipant ;
var roomEvent = {
participants : new Array ( ) ,
streams : new Array ( )
} ;
var length _1 = exParticipants . length ;
for ( var i = 0 ; i < length _1 ; i ++ ) {
var connection = new Connection _1 . Connection ( _this . openVidu , false , _this , exParticipants [ i ] ) ;
connection . creationTime = new Date ( ) . getTime ( ) ;
_this . participants [ connection . connectionId ] = connection ;
roomEvent . participants . push ( connection ) ;
var streams = connection . getStreams ( ) ;
for ( var key in streams ) {
roomEvent . streams . push ( streams [ key ] ) ;
if ( _this . subscribeToStreams ) {
streams [ key ] . subscribe ( ) ;
}
}
}
// Update local Connection object properties with values returned by server
_this . localParticipant . data = response . metadata ;
_this . localParticipant . creationTime = new Date ( ) . getTime ( ) ;
// Updates the value of property 'connection' in Session object
_this . ee . emitEvent ( 'update-connection-object' , [ { connection : _this . localParticipant } ] ) ;
// Own connection created event
_this . ee . emitEvent ( 'connectionCreated' , [ { connection : _this . localParticipant } ] ) ;
// One connection created event for each existing connection in the session
for ( var _i = 0 , _a = roomEvent . participants ; _i < _a . length ; _i ++ ) {
var part = _a [ _i ] ;
_this . ee . emitEvent ( 'connectionCreated' , [ { connection : part } ] ) ;
}
//if (this.subscribeToStreams) {
for ( var _b = 0 , _c = roomEvent . streams ; _b < _c . length ; _b ++ ) {
var stream = _c [ _b ] ;
_this . ee . emitEvent ( 'streamCreated' , [ { stream : stream } ] ) ;
// Adding the remote stream to the OpenVidu object
_this . openVidu . getRemoteStreams ( ) . push ( stream ) ;
}
//}
callback ( undefined ) ;
}
} ) ;
}
} ) ;
} ;
SessionInternal . prototype . publish = function ( ) {
this . openVidu . getCamera ( ) . publish ( ) ;
} ;
/* NEW METHODS */
SessionInternal . prototype . configure = function ( options ) {
this . options = options ;
this . id = options . sessionId ;
this . subscribeToStreams = options . subscribeToStreams == null ? true : options . subscribeToStreams ;
this . updateSpeakerInterval = options . updateSpeakerInterval || 1500 ;
this . thresholdSpeaker = options . thresholdSpeaker || - 50 ;
this . activateUpdateMainSpeaker ( ) ;
} ;
SessionInternal . prototype . getId = function ( ) {
return this . id ;
} ;
SessionInternal . prototype . getSessionId = function ( ) {
return this . sessionId ;
} ;
SessionInternal . prototype . activateUpdateMainSpeaker = function ( ) {
var _this = this ;
setInterval ( function ( ) {
if ( _this . participantsSpeaking . length > 0 ) {
_this . ee . emitEvent ( 'update-main-speaker' , [ {
participantId : _this . participantsSpeaking [ _this . participantsSpeaking . length - 1 ]
} ] ) ;
}
} , this . updateSpeakerInterval ) ;
} ;
SessionInternal . prototype . getLocalParticipant = function ( ) {
return this . localParticipant ;
} ;
SessionInternal . prototype . addEventListener = function ( eventName , listener ) {
this . ee . on ( eventName , listener ) ;
} ;
SessionInternal . prototype . addOnceEventListener = function ( eventName , listener ) {
this . ee . once ( eventName , listener ) ;
} ;
SessionInternal . prototype . removeListener = function ( eventName , listener ) {
this . ee . off ( eventName , listener ) ;
} ;
SessionInternal . prototype . removeEvent = function ( eventName ) {
this . ee . removeEvent ( eventName ) ;
} ;
SessionInternal . prototype . emitEvent = function ( eventName , eventsArray ) {
this . ee . emitEvent ( eventName , eventsArray ) ;
} ;
SessionInternal . prototype . subscribe = function ( stream ) {
stream . subscribe ( ) ;
} ;
SessionInternal . prototype . unsuscribe = function ( stream ) {
console . info ( "Unsubscribing from " + stream . getId ( ) ) ;
this . openVidu . sendRequest ( 'unsubscribeFromVideo' , {
sender : stream . getId ( )
} , function ( error , response ) {
if ( error ) {
console . error ( "Error unsubscribing from Subscriber" , error ) ;
}
else {
console . info ( "Unsubscribed correctly from " + stream . getId ( ) ) ;
}
} ) ;
} ;
SessionInternal . prototype . onParticipantPublished = function ( options ) {
options . metadata = this . participants [ options . id ] . data ;
// Get the existing Connection created on 'onParticipantJoined' for
// existing participants or create a new one for new participants
var connection = this . participants [ options . id ] ;
if ( connection ) {
// Update existing Connection
connection . options = options ;
connection . initStreams ( options ) ;
}
else {
// Create new Connection
connection = new Connection _1 . Connection ( this . openVidu , false , this , options ) ;
}
var pid = connection . connectionId ;
if ( ! ( pid in this . participants ) ) {
console . debug ( "Remote Connection not found in connections list by its id [" + pid + "]" ) ;
}
else {
console . debug ( "Remote Connection found in connections list by its id [" + pid + "]" ) ;
}
connection . creationTime = this . participants [ pid ] . creationTime ;
this . participants [ pid ] = connection ;
this . ee . emitEvent ( 'participant-published' , [ { connection : connection } ] ) ;
var streams = connection . getStreams ( ) ;
for ( var key in streams ) {
var stream = streams [ key ] ;
if ( this . subscribeToStreams ) {
stream . subscribe ( ) ;
}
this . ee . emitEvent ( 'streamCreated' , [ { stream : stream } ] ) ;
// Adding the remote stream to the OpenVidu object
this . openVidu . getRemoteStreams ( ) . push ( stream ) ;
}
} ;
SessionInternal . prototype . onParticipantJoined = function ( msg ) {
var connection = new Connection _1 . Connection ( this . openVidu , false , this , msg ) ;
connection . creationTime = new Date ( ) . getTime ( ) ;
var pid = connection . connectionId ;
if ( ! ( pid in this . participants ) ) {
this . participants [ pid ] = connection ;
}
else {
//use existing so that we don't lose streams info
console . warn ( "Connection already exists in connections list with " +
"the same connectionId, old:" , this . participants [ pid ] , ", joined now:" , connection ) ;
connection = this . participants [ pid ] ;
}
this . ee . emitEvent ( 'participant-joined' , [ {
connection : connection
} ] ) ;
this . ee . emitEvent ( 'connectionCreated' , [ {
connection : connection
} ] ) ;
} ;
SessionInternal . prototype . onParticipantLeft = function ( msg ) {
var _this = this ;
var connection = this . participants [ msg . name ] ;
if ( connection !== undefined ) {
delete this . participants [ msg . name ] ;
this . ee . emitEvent ( 'participant-left' , [ {
connection : connection
} ] ) ;
var streams = connection . getStreams ( ) ;
for ( var key in streams ) {
this . ee . emitEvent ( 'streamDestroyed' , [ {
stream : streams [ key ] ,
preventDefault : function ( ) { _this . ee . removeEvent ( 'stream-destroyed-default' ) ; }
} ] ) ;
this . ee . emitEvent ( 'stream-destroyed-default' , [ {
stream : streams [ key ]
} ] ) ;
// Deleting the removed stream from the OpenVidu object
var index = this . openVidu . getRemoteStreams ( ) . indexOf ( streams [ key ] ) ;
this . openVidu . getRemoteStreams ( ) . splice ( index , 1 ) ;
}
connection . dispose ( ) ;
this . ee . emitEvent ( 'connectionDestroyed' , [ {
connection : connection
} ] ) ;
}
else {
console . warn ( "Participant " + msg . name
+ " unknown. Participants: "
+ JSON . stringify ( this . participants ) ) ;
}
} ;
;
SessionInternal . prototype . onParticipantEvicted = function ( msg ) {
this . ee . emitEvent ( 'participant-evicted' , [ {
localParticipant : this . localParticipant
} ] ) ;
} ;
;
SessionInternal . prototype . onNewMessage = function ( msg ) {
console . info ( "New message: " + JSON . stringify ( msg ) ) ;
var room = msg . room ;
var user = msg . user ;
var message = msg . message ;
if ( user !== undefined ) {
this . ee . emitEvent ( 'newMessage' , [ {
room : room ,
user : user ,
message : message
} ] ) ;
}
else {
console . warn ( "User undefined in new message:" , msg ) ;
}
} ;
SessionInternal . prototype . recvIceCandidate = function ( msg ) {
var candidate = {
candidate : msg . candidate ,
sdpMid : msg . sdpMid ,
sdpMLineIndex : msg . sdpMLineIndex
} ;
var connection = this . participants [ msg . endpointName ] ;
if ( ! connection ) {
console . error ( "Participant not found for endpoint " +
msg . endpointName + ". Ice candidate will be ignored." , candidate ) ;
return ;
}
var streams = connection . getStreams ( ) ;
var _loop _1 = function ( key ) {
var stream = streams [ key ] ;
stream . getWebRtcPeer ( ) . addIceCandidate ( candidate , function ( error ) {
if ( error ) {
console . error ( "Error adding candidate for " + key
+ " stream of endpoint " + msg . endpointName
+ ": " + error ) ;
}
} ) ;
} ;
for ( var key in streams ) {
_loop _1 ( key ) ;
}
} ;
SessionInternal . prototype . onRoomClosed = function ( msg ) {
console . info ( "Room closed: " + JSON . stringify ( msg ) ) ;
var room = msg . room ;
if ( room !== undefined ) {
this . ee . emitEvent ( 'room-closed' , [ {
room : room
} ] ) ;
}
else {
console . warn ( "Room undefined in on room closed" , msg ) ;
}
} ;
SessionInternal . prototype . onLostConnection = function ( ) {
if ( ! this . connected ) {
console . warn ( 'Not connected to room: if you are not debugging, this is probably a certificate error' ) ;
if ( window . confirm ( 'If you are not debugging, this is probably a certificate error at \"' + this . openVidu . getOpenViduServerURL ( ) + '\"\n\nClick OK to navigate and accept it' ) ) {
location . assign ( this . openVidu . getOpenViduServerURL ( ) + '/accept-certificate' ) ;
}
;
return ;
}
console . warn ( 'Lost connection in Session ' + this . id ) ;
var room = this . id ;
if ( room !== undefined ) {
this . ee . emitEvent ( 'lost-connection' , [ { room : room } ] ) ;
}
else {
console . warn ( 'Room undefined when lost connection' ) ;
}
} ;
SessionInternal . prototype . onMediaError = function ( params ) {
console . error ( "Media error: " + JSON . stringify ( params ) ) ;
var error = params . error ;
if ( error ) {
this . ee . emitEvent ( 'error-media' , [ {
error : error
} ] ) ;
}
else {
console . warn ( "Received undefined media error. Params:" , params ) ;
}
} ;
/ *
* forced means the user was evicted , no need to send the 'leaveRoom' request
* /
SessionInternal . prototype . leave = function ( forced , jsonRpcClient ) {
forced = ! ! forced ;
console . info ( "Leaving Session (forced=" + forced + ")" ) ;
if ( this . connected && ! forced ) {
this . openVidu . sendRequest ( 'leaveRoom' , function ( error , response ) {
if ( error ) {
console . error ( error ) ;
}
jsonRpcClient . close ( ) ;
} ) ;
}
else {
jsonRpcClient . close ( ) ;
}
2017-08-22 13:27:44 +02:00
this . connected = false ;
2017-09-22 16:05:34 +02:00
if ( this . participants ) {
for ( var pid in this . participants ) {
this . participants [ pid ] . dispose ( ) ;
delete this . participants [ pid ] ;
}
}
} ;
SessionInternal . prototype . disconnect = function ( stream ) {
var connection = stream . getParticipant ( ) ;
if ( ! connection ) {
console . error ( "Stream to disconnect has no participant" , stream ) ;
return ;
}
delete this . participants [ connection . connectionId ] ;
connection . dispose ( ) ;
if ( connection === this . localParticipant ) {
console . info ( "Unpublishing my media (I'm " + connection . connectionId + ")" ) ;
delete this . localParticipant ;
this . openVidu . sendRequest ( 'unpublishVideo' , function ( error , response ) {
if ( error ) {
console . error ( error ) ;
}
else {
console . info ( "Media unpublished correctly" ) ;
}
} ) ;
}
else {
this . unsuscribe ( stream ) ;
}
} ;
SessionInternal . prototype . unpublish = function ( stream ) {
var connection = stream . getParticipant ( ) ;
if ( ! connection ) {
console . error ( "Stream to disconnect has no participant" , stream ) ;
return ;
}
if ( connection === this . localParticipant ) {
delete this . participants [ connection . connectionId ] ;
connection . dispose ( ) ;
console . info ( "Unpublishing my media (I'm " + connection . connectionId + ")" ) ;
delete this . localParticipant ;
this . openVidu . sendRequest ( 'unpublishVideo' , function ( error , response ) {
if ( error ) {
console . error ( error ) ;
}
else {
console . info ( "Media unpublished correctly" ) ;
}
} ) ;
}
} ;
SessionInternal . prototype . getStreams = function ( ) {
return this . streams ;
} ;
SessionInternal . prototype . addParticipantSpeaking = function ( participantId ) {
this . participantsSpeaking . push ( participantId ) ;
} ;
SessionInternal . prototype . removeParticipantSpeaking = function ( participantId ) {
var pos = - 1 ;
for ( var i = 0 ; i < this . participantsSpeaking . length ; i ++ ) {
if ( this . participantsSpeaking [ i ] == participantId ) {
pos = i ;
break ;
}
}
if ( pos != - 1 ) {
this . participantsSpeaking . splice ( pos , 1 ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
} ;
SessionInternal . prototype . stringClientMetadata = function ( metadata ) {
if ( ! ( typeof metadata === 'string' ) ) {
return JSON . stringify ( metadata ) ;
}
else {
return metadata ;
}
} ;
SessionInternal . prototype . randomToken = function ( ) {
return Math . random ( ) . toString ( 36 ) . slice ( 2 ) + Math . random ( ) . toString ( 36 ) . slice ( 2 ) ;
} ;
return SessionInternal ;
} ( ) ) ;
exports . SessionInternal = SessionInternal ;
/***/ } ) ,
/***/ 327 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
module . exports = _ _webpack _require _ _ ( 144 ) ;
/***/ } ) ,
/***/ 55 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ = _ _webpack _require _ _ ( 0 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _rxjs _Subject _ _ = _ _webpack _require _ _ ( 24 ) ;
/* harmony import */ var _ _WEBPACK _IMPORTED _MODULE _1 _rxjs _Subject _ _ _default = _ _webpack _require _ _ . n ( _ _WEBPACK _IMPORTED _MODULE _1 _rxjs _Subject _ _ ) ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return InfoService ; } ) ;
var _ _decorate = ( this && this . _ _decorate ) || function ( decorators , target , key , desc ) {
var c = arguments . length , r = c < 3 ? target : desc === null ? desc = Object . getOwnPropertyDescriptor ( target , key ) : desc , d ;
if ( typeof Reflect === "object" && typeof Reflect . decorate === "function" ) r = Reflect . decorate ( decorators , target , key , desc ) ;
else for ( var i = decorators . length - 1 ; i >= 0 ; i -- ) if ( d = decorators [ i ] ) r = ( c < 3 ? d ( r ) : c > 3 ? d ( target , key , r ) : d ( target , key ) ) || r ;
return c > 3 && r && Object . defineProperty ( target , key , r ) , r ;
} ;
var _ _metadata = ( this && this . _ _metadata ) || function ( k , v ) {
if ( typeof Reflect === "object" && typeof Reflect . metadata === "function" ) return Reflect . metadata ( k , v ) ;
} ;
var InfoService = ( function ( ) {
function InfoService ( ) {
this . newInfo$ = new _ _WEBPACK _IMPORTED _MODULE _1 _rxjs _Subject _ _ [ "Subject" ] ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
InfoService . prototype . getInfo = function ( ) {
return this . info ;
2017-08-29 17:31:34 +02:00
} ;
2017-09-22 16:05:34 +02:00
InfoService . prototype . updateInfo = function ( info ) {
this . info = info ;
this . newInfo$ . next ( info ) ;
} ;
return InfoService ;
} ( ) ) ;
InfoService = _ _decorate ( [
_ _webpack _require _ _ . i ( _ _WEBPACK _IMPORTED _MODULE _0 _ _angular _core _ _ [ "c" /* Injectable */ ] ) ( ) ,
_ _metadata ( "design:paramtypes" , [ ] )
] , InfoService ) ;
//# sourceMappingURL=info.service.js.map
/***/ } ) ,
/***/ 86 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var EventEmitter = _ _webpack _require _ _ ( 40 ) ;
var kurentoUtils = _ _webpack _require _ _ ( 306 ) ;
var adapter = _ _webpack _require _ _ ( 142 ) ;
if ( window ) {
window [ "adapter" ] = adapter ;
}
function jq ( id ) {
return id . replace ( /(@|:|\.|\[|\]|,)/g , "\\$1" ) ;
}
function show ( id ) {
document . getElementById ( jq ( id ) ) . style . display = 'block' ;
}
function hide ( id ) {
document . getElementById ( jq ( id ) ) . style . display = 'none' ;
}
var Stream = /** @class */ ( function ( ) {
function Stream ( openVidu , local , room , options ) {
var _this = this ;
this . openVidu = openVidu ;
this . local = local ;
this . room = room ;
this . ee = new EventEmitter ( ) ;
this . videoElements = [ ] ;
this . elements = [ ] ;
this . showMyRemote = false ;
this . localMirrored = false ;
this . chanId = 0 ;
this . dataChannelOpened = false ;
this . audioOnly = false ;
this . isReady = false ;
this . isVideoELementCreated = false ;
this . accessIsAllowed = false ;
this . accessIsDenied = false ;
if ( options . id ) {
this . id = options . id ;
2017-08-29 17:31:34 +02:00
}
2017-09-22 16:05:34 +02:00
else {
this . id = "webcam" ;
}
this . connection = options . connection ;
this . recvVideo = options . recvVideo ;
this . recvAudio = options . recvAudio ;
this . dataChannel = options . data || false ;
this . sendVideo = options . video ;
this . sendAudio = options . audio ;
this . mediaConstraints = options . mediaConstraints ;
this . audioOnly = options . audioOnly || false ;
this . addEventListener ( 'src-added' , function ( srcEvent ) {
_this . videoSrcObject = srcEvent . srcObject ;
if ( _this . video )
_this . video . srcObject = srcEvent . srcObject ;
console . debug ( "Video srcObject [" + srcEvent . srcObject + "] added to stream [" + _this . getId ( ) + "]" ) ;
} ) ;
}
Stream . prototype . emitSrcEvent = function ( wrstream ) {
this . ee . emitEvent ( 'src-added' , [ {
srcObject : wrstream
} ] ) ;
} ;
Stream . prototype . emitStreamReadyEvent = function ( ) {
this . ee . emitEvent ( 'stream-ready' ) , [ { } ] ;
2017-08-29 17:31:34 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getVideoSrcObject = function ( ) {
return this . videoSrcObject ;
2017-08-29 17:31:34 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . removeVideo = function ( parentElement ) {
if ( typeof parentElement === "string" ) {
document . getElementById ( parentElement ) . removeChild ( this . video ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else if ( parentElement instanceof Element ) {
parentElement . removeChild ( this . video ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else if ( ! parentElement ) {
if ( document . getElementById ( this . parentId ) ) {
document . getElementById ( this . parentId ) . removeChild ( this . video ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getVideoElement = function ( ) {
return this . video ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . setVideoElement = function ( video ) {
this . video = video ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getRecvVideo = function ( ) {
return this . recvVideo ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getRecvAudio = function ( ) {
return this . recvAudio ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . subscribeToMyRemote = function ( ) {
this . showMyRemote = true ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . displayMyRemote = function ( ) {
return this . showMyRemote ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . mirrorLocalStream = function ( wr ) {
this . showMyRemote = true ;
this . localMirrored = true ;
if ( wr ) {
this . wrStream = wr ;
this . emitSrcEvent ( this . wrStream ) ;
}
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . isLocalMirrored = function ( ) {
return this . localMirrored ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getChannelName = function ( ) {
return this . getId ( ) + '_' + this . chanId ++ ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . isDataChannelEnabled = function ( ) {
return this . dataChannel ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . isDataChannelOpened = function ( ) {
return this . dataChannelOpened ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . onDataChannelOpen = function ( event ) {
console . debug ( 'Data channel is opened' ) ;
this . dataChannelOpened = true ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . onDataChannelClosed = function ( event ) {
console . debug ( 'Data channel is closed' ) ;
this . dataChannelOpened = false ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . sendData = function ( data ) {
if ( this . wp === undefined ) {
throw new Error ( 'WebRTC peer has not been created yet' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( ! this . dataChannelOpened ) {
throw new Error ( 'Data channel is not opened' ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
console . info ( "Sending through data channel: " + data ) ;
this . wp . send ( data ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getWrStream = function ( ) {
return this . wrStream ;
} ;
Stream . prototype . getWebRtcPeer = function ( ) {
return this . wp ;
} ;
Stream . prototype . addEventListener = function ( eventName , listener ) {
this . ee . addListener ( eventName , listener ) ;
} ;
Stream . prototype . addOnceEventListener = function ( eventName , listener ) {
this . ee . addOnceListener ( eventName , listener ) ;
} ;
Stream . prototype . removeListener = function ( eventName ) {
this . ee . removeAllListeners ( eventName ) ;
} ;
Stream . prototype . showSpinner = function ( spinnerParentId ) {
var progress = document . createElement ( 'div' ) ;
progress . id = 'progress-' + this . getId ( ) ;
progress . style . background = "center transparent url('img/spinner.gif') no-repeat" ;
var spinnerParent = document . getElementById ( spinnerParentId ) ;
if ( spinnerParent ) {
spinnerParent . appendChild ( progress ) ;
2017-08-22 13:27:44 +02:00
}
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . hideSpinner = function ( spinnerId ) {
spinnerId = ( spinnerId === undefined ) ? this . getId ( ) : spinnerId ;
hide ( 'progress-' + spinnerId ) ;
} ;
Stream . prototype . playOnlyVideo = function ( parentElement , thumbnailId ) {
// TO-DO: check somehow if the stream is audio only, so the element created is <audio> instead of <video>
var _this = this ;
this . video = document . createElement ( 'video' ) ;
this . video . id = ( this . local ? 'local-' : 'remote-' ) + 'video-' + this . getId ( ) ;
this . video . autoplay = true ;
this . video . controls = false ;
this . video . srcObject = this . videoSrcObject ;
this . videoElements . push ( {
thumb : thumbnailId ,
video : this . video
} ) ;
if ( this . local && ! this . displayMyRemote ( ) ) {
this . video . muted = true ;
this . video . onplay = function ( ) {
console . info ( "Local 'Stream' with id [" + _this . getId ( ) + "] video is now playing" ) ;
_this . ee . emitEvent ( 'video-is-playing' , [ {
element : _this . video
2017-08-22 13:27:44 +02:00
} ] ) ;
2017-09-22 16:05:34 +02:00
} ;
}
else {
this . video . title = this . getId ( ) ;
}
if ( typeof parentElement === "string" ) {
this . parentId = parentElement ;
var parentElementDom = document . getElementById ( parentElement ) ;
if ( parentElementDom ) {
this . video = parentElementDom . appendChild ( this . video ) ;
this . ee . emitEvent ( 'video-element-created-by-stream' , [ {
element : this . video
2017-08-22 13:27:44 +02:00
} ] ) ;
2017-09-22 16:05:34 +02:00
this . isVideoELementCreated = true ;
2017-08-22 13:27:44 +02:00
}
}
else {
2017-09-22 16:05:34 +02:00
this . parentId = parentElement . id ;
this . video = parentElement . appendChild ( this . video ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
this . ee . emitEvent ( 'stream-created-by-publisher' ) ;
this . isReady = true ;
return this . video ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . playThumbnail = function ( thumbnailId ) {
var container = document . createElement ( 'div' ) ;
container . className = "participant" ;
container . id = this . getId ( ) ;
var thumbnail = document . getElementById ( thumbnailId ) ;
if ( thumbnail ) {
thumbnail . appendChild ( container ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
this . elements . push ( container ) ;
var name = document . createElement ( 'div' ) ;
container . appendChild ( name ) ;
var userName = this . getId ( ) . replace ( '_webcam' , '' ) ;
if ( userName . length >= 16 ) {
userName = userName . substring ( 0 , 16 ) + "..." ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
name . appendChild ( document . createTextNode ( userName ) ) ;
name . id = "name-" + this . getId ( ) ;
name . className = "name" ;
name . title = this . getId ( ) ;
this . showSpinner ( thumbnailId ) ;
return this . playOnlyVideo ( container , thumbnailId ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . getIdInParticipant = function ( ) {
return this . id ;
} ;
Stream . prototype . getParticipant = function ( ) {
return this . connection ;
} ;
Stream . prototype . getId = function ( ) {
return this . connection . connectionId + "_" + this . id ;
} ;
Stream . prototype . getRTCPeerConnection = function ( ) {
return this . getWebRtcPeer ( ) . peerConnection ;
} ;
Stream . prototype . requestCameraAccess = function ( callback ) {
var _this = this ;
this . connection . addStream ( this ) ;
var constraints = this . mediaConstraints ;
/ * l e t c o n s t r a i n t s 2 = {
audio : true ,
video : {
width : {
ideal : 1280
} ,
frameRate : {
ideal : 15
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
}
} ; * /
this . userMediaHasVideo ( function ( hasVideo ) {
if ( ! hasVideo ) {
constraints . video = false ;
_this . sendVideo = false ;
_this . audioOnly = true ;
_this . requestCameraAccesAux ( constraints , callback ) ;
}
else {
_this . requestCameraAccesAux ( constraints , callback ) ;
}
} ) ;
} ;
Stream . prototype . requestCameraAccesAux = function ( constraints , callback ) {
var _this = this ;
navigator . mediaDevices . getUserMedia ( constraints )
. then ( function ( userStream ) {
_this . cameraAccessSuccess ( userStream , callback ) ;
} )
. catch ( function ( error ) {
// Try to ask for microphone only
navigator . mediaDevices . getUserMedia ( { audio : true , video : false } )
. then ( function ( userStream ) {
constraints . video = false ;
_this . sendVideo = false ;
_this . audioOnly = true ;
_this . cameraAccessSuccess ( userStream , callback ) ;
} )
. catch ( function ( error ) {
_this . accessIsDenied = true ;
_this . accessIsAllowed = false ;
_this . ee . emitEvent ( 'access-denied-by-publisher' ) ;
console . error ( "Access denied" , error ) ;
callback ( error , _this ) ;
2017-08-22 13:27:44 +02:00
} ) ;
2017-09-22 16:05:34 +02:00
} ) ;
} ;
Stream . prototype . cameraAccessSuccess = function ( userStream , callback ) {
this . accessIsAllowed = true ;
this . accessIsDenied = false ;
this . ee . emitEvent ( 'access-allowed-by-publisher' ) ;
if ( userStream . getAudioTracks ( ) [ 0 ] != null ) {
userStream . getAudioTracks ( ) [ 0 ] . enabled = this . sendAudio ;
}
if ( userStream . getVideoTracks ( ) [ 0 ] != null ) {
userStream . getVideoTracks ( ) [ 0 ] . enabled = this . sendVideo ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
this . wrStream = userStream ;
this . emitSrcEvent ( this . wrStream ) ;
callback ( undefined , this ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . userMediaHasVideo = function ( callback ) {
navigator . mediaDevices . enumerateDevices ( ) . then ( function ( mediaDevices ) {
var videoInput = mediaDevices . filter ( function ( deviceInfo ) {
return deviceInfo . kind === 'videoinput' ;
} ) [ 0 ] ;
callback ( videoInput != null ) ;
} ) ;
} ;
Stream . prototype . publishVideoCallback = function ( error , sdpOfferParam , wp ) {
var _this = this ;
if ( error ) {
return console . error ( "(publish) SDP offer error: "
+ JSON . stringify ( error ) ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
console . debug ( "Sending SDP offer to publish as "
+ this . getId ( ) , sdpOfferParam ) ;
this . openVidu . sendRequest ( "publishVideo" , {
sdpOffer : sdpOfferParam ,
doLoopback : this . displayMyRemote ( ) || false ,
audioOnly : this . audioOnly
} , function ( error , response ) {
if ( error ) {
console . error ( "Error on publishVideo: " + JSON . stringify ( error ) ) ;
}
else {
_this . processSdpAnswer ( response . sdpAnswer ) ;
console . info ( "'Publisher' succesfully published to session" ) ;
}
} ) ;
} ;
Stream . prototype . startVideoCallback = function ( error , sdpOfferParam , wp ) {
var _this = this ;
if ( error ) {
return console . error ( "(subscribe) SDP offer error: "
+ JSON . stringify ( error ) ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
console . debug ( "Sending SDP offer to subscribe to "
+ this . getId ( ) , sdpOfferParam ) ;
this . openVidu . sendRequest ( "receiveVideoFrom" , {
sender : this . getId ( ) ,
sdpOffer : sdpOfferParam
} , function ( error , response ) {
if ( error ) {
console . error ( "Error on recvVideoFrom: " + JSON . stringify ( error ) ) ;
}
else {
_this . processSdpAnswer ( response . sdpAnswer ) ;
}
} ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . initWebRtcPeer = function ( sdpOfferCallback ) {
var _this = this ;
if ( this . local ) {
var userMediaConstraints = {
audio : this . sendAudio ,
video : this . sendVideo
} ;
var options = {
videoStream : this . wrStream ,
mediaConstraints : userMediaConstraints ,
onicecandidate : this . connection . sendIceCandidate . bind ( this . connection ) ,
} ;
if ( this . dataChannel ) {
options . dataChannelConfig = {
id : this . getChannelName ( ) ,
onopen : this . onDataChannelOpen ,
onclose : this . onDataChannelClosed
} ;
options . dataChannels = true ;
}
if ( this . displayMyRemote ( ) ) {
this . wp = kurentoUtils . WebRtcPeer . WebRtcPeerSendrecv ( options , function ( error ) {
if ( error ) {
return console . error ( error ) ;
}
_this . wp . generateOffer ( sdpOfferCallback . bind ( _this ) ) ;
} ) ;
}
else {
this . wp = kurentoUtils . WebRtcPeer . WebRtcPeerSendonly ( options , function ( error ) {
if ( error ) {
return console . error ( error ) ;
}
_this . wp . generateOffer ( sdpOfferCallback . bind ( _this ) ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
}
else {
2017-09-22 16:05:34 +02:00
var offerConstraints = {
audio : this . recvAudio ,
video : ! this . audioOnly
} ;
console . debug ( "'Session.subscribe(Stream)' called. Constraints of generate SDP offer" , offerConstraints ) ;
var options = {
onicecandidate : this . connection . sendIceCandidate . bind ( this . connection ) ,
mediaConstraints : offerConstraints
} ;
this . wp = kurentoUtils . WebRtcPeer . WebRtcPeerRecvonly ( options , function ( error ) {
2017-08-22 13:27:44 +02:00
if ( error ) {
2017-09-22 16:05:34 +02:00
return console . error ( error ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
_this . wp . generateOffer ( sdpOfferCallback . bind ( _this ) ) ;
2017-08-22 13:27:44 +02:00
} ) ;
}
2017-09-22 16:05:34 +02:00
console . debug ( "Waiting for SDP offer to be generated ("
+ ( this . local ? "local" : "remote" ) + " 'Stream': " + this . getId ( ) + ")" ) ;
} ;
Stream . prototype . publish = function ( ) {
var _this = this ;
// FIXME: Throw error when stream is not local
if ( this . isReady ) {
this . initWebRtcPeer ( this . publishVideoCallback ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else {
this . ee . once ( 'stream-ready' , function ( streamEvent ) {
_this . publish ( ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
// FIXME: Now we have coupled connecting to a room and adding a
// stream to this room. But in the new API, there are two steps.
// This is the second step. For now, it do nothing.
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . subscribe = function ( ) {
// FIXME: In the current implementation all participants are subscribed
// automatically to all other participants. We use this method only to
// negotiate SDP
this . initWebRtcPeer ( this . startVideoCallback ) ;
} ;
Stream . prototype . processSdpAnswer = function ( sdpAnswer ) {
var _this = this ;
var answer = new RTCSessionDescription ( {
type : 'answer' ,
sdp : sdpAnswer ,
} ) ;
console . debug ( this . getId ( ) + ": set peer connection with recvd SDP answer" , sdpAnswer ) ;
var participantId = this . getId ( ) ;
var pc = this . wp . peerConnection ;
pc . setRemoteDescription ( answer , function ( ) {
// Avoids to subscribe to your own stream remotely
// except when showMyRemote is true
if ( ! _this . local || _this . displayMyRemote ( ) ) {
_this . wrStream = pc . getRemoteStreams ( ) [ 0 ] ;
console . debug ( "Peer remote stream" , _this . wrStream ) ;
if ( _this . wrStream != undefined ) {
_this . emitSrcEvent ( _this . wrStream ) ;
_this . speechEvent = kurentoUtils . WebRtcPeer . hark ( _this . wrStream , { threshold : _this . room . thresholdSpeaker } ) ;
_this . speechEvent . on ( 'speaking' , function ( ) {
_this . room . addParticipantSpeaking ( participantId ) ;
_this . room . emitEvent ( 'stream-speaking' , [ {
participantId : participantId
} ] ) ;
} ) ;
_this . speechEvent . on ( 'stopped_speaking' , function ( ) {
_this . room . removeParticipantSpeaking ( participantId ) ;
_this . room . emitEvent ( 'stream-stopped-speaking' , [ {
participantId : participantId
} ] ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
for ( var _i = 0 , _a = _this . videoElements ; _i < _a . length ; _i ++ ) {
var videoElement = _a [ _i ] ;
var thumbnailId = videoElement . thumb ;
var video = videoElement . video ;
video . srcObject = _this . wrStream ;
video . onplay = function ( ) {
if ( _this . local && _this . displayMyRemote ( ) ) {
console . info ( "Your own remote 'Stream' with id [" + _this . getId ( ) + "] video is now playing" ) ;
_this . ee . emitEvent ( 'remote-video-is-playing' , [ {
element : _this . video
} ] ) ;
}
else if ( ! _this . local && ! _this . displayMyRemote ( ) ) {
console . info ( "Remote 'Stream' with id [" + _this . getId ( ) + "] video is now playing" ) ;
_this . ee . emitEvent ( 'video-is-playing' , [ {
element : _this . video
} ] ) ;
}
//show(thumbnailId);
//this.hideSpinner(this.getId());
} ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
_this . room . emitEvent ( 'stream-subscribed' , [ {
stream : _this
} ] ) ;
}
} , function ( error ) {
console . error ( _this . getId ( ) + ": Error setting SDP to the peer connection: "
+ JSON . stringify ( error ) ) ;
} ) ;
} ;
Stream . prototype . unpublish = function ( ) {
if ( this . wp ) {
this . wp . dispose ( ) ;
2017-08-22 13:27:44 +02:00
}
else {
2017-09-22 16:05:34 +02:00
if ( this . wrStream ) {
this . wrStream . getAudioTracks ( ) . forEach ( function ( track ) {
track . stop && track . stop ( ) ;
} ) ;
this . wrStream . getVideoTracks ( ) . forEach ( function ( track ) {
track . stop && track . stop ( ) ;
} ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
if ( this . speechEvent ) {
this . speechEvent . stop ( ) ;
}
console . info ( this . getId ( ) + ": Stream '" + this . id + "' unpublished" ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
Stream . prototype . dispose = function ( ) {
function disposeElement ( element ) {
if ( element && element . parentNode ) {
element . parentNode . removeChild ( element ) ;
}
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
this . elements . forEach ( function ( e ) { return disposeElement ( e ) ; } ) ;
//this.videoElements.forEach(ve => disposeElement(ve.video));
disposeElement ( "progress-" + this . getId ( ) ) ;
if ( this . wp ) {
this . wp . dispose ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
else {
if ( this . wrStream ) {
this . wrStream . getAudioTracks ( ) . forEach ( function ( track ) {
track . stop && track . stop ( ) ;
} ) ;
this . wrStream . getVideoTracks ( ) . forEach ( function ( track ) {
track . stop && track . stop ( ) ;
} ) ;
2017-08-22 13:27:44 +02:00
}
}
2017-09-22 16:05:34 +02:00
if ( this . speechEvent ) {
this . speechEvent . stop ( ) ;
2017-08-22 13:27:44 +02:00
}
2017-09-22 16:05:34 +02:00
console . info ( ( this . local ? "Local " : "Remote " ) + "'Stream' with id [" + this . getId ( ) + "]' has been succesfully disposed" ) ;
2017-08-22 13:27:44 +02:00
} ;
2017-09-22 16:05:34 +02:00
return Stream ;
2017-05-31 17:55:18 +02:00
} ( ) ) ;
2017-09-22 16:05:34 +02:00
exports . Stream = Stream ;
2017-05-31 17:55:18 +02:00
/***/ } )
2017-09-22 16:05:34 +02:00
} , [ 327 ] ) ;
2017-05-31 17:55:18 +02:00
//# sourceMappingURL=main.bundle.js.map