2016-10-15 00:11:17 +02:00
/ *
2017-09-19 11:51:02 +02:00
* ( C ) Copyright 2017 OpenVidu ( http : //openvidu.io/)
2016-10-15 00:11:17 +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-05-10 10:55:31 +02:00
import { OpenViduInternal } from '../OpenViduInternal/OpenViduInternal' ;
2016-10-15 00:11:17 +02:00
2017-05-10 10:55:31 +02:00
import { Session } from './Session' ;
import { Publisher } from './Publisher' ;
2017-10-04 10:30:15 +02:00
import { OpenViduError , OpenViduErrorName } from '../OpenViduInternal/OpenViduError' ;
2018-03-01 11:13:45 +01:00
import { Stream } from '../OpenViduInternal/Stream' ;
import { LocalRecorder } from '../OpenViduInternal/LocalRecorder' ;
2016-10-15 00:11:17 +02:00
2017-05-10 10:55:31 +02:00
import * as adapter from 'webrtc-adapter' ;
2017-10-03 15:02:36 +02:00
import * as screenSharing from '../ScreenSharing/Screen-Capturing.js' ;
import * as screenSharingAuto from '../ScreenSharing/Screen-Capturing-Auto.js' ;
2018-03-15 12:43:30 +01:00
import * as DetectRTC from '../KurentoUtils/DetectRTC' ;
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
if ( window ) {
window [ "adapter" ] = adapter ;
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
export class OpenVidu {
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
openVidu : OpenViduInternal ;
2017-03-28 20:17:44 +02:00
2017-07-12 18:56:13 +02:00
constructor ( ) {
this . openVidu = new OpenViduInternal ( ) ;
2017-09-22 15:57:59 +02:00
console . info ( "'OpenVidu' initialized" ) ;
2017-07-12 18:56:13 +02:00
} ;
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
initSession ( apiKey : string , sessionId : string ) : Session ;
initSession ( sessionId : string ) : Session ;
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
initSession ( param1 , param2 ? ) : any {
2018-03-15 12:43:30 +01:00
if ( typeof param2 == "string" ) {
return new Session ( this . openVidu . initSession ( param2 ) , this ) ;
2017-04-12 00:54:35 +02:00
} else {
2018-03-15 12:43:30 +01:00
return new Session ( this . openVidu . initSession ( param1 ) , this ) ;
2017-04-12 00:54:35 +02:00
}
2017-03-28 20:17:44 +02:00
}
2017-05-19 16:04:56 +02:00
initPublisher ( parentId : string ) : Publisher ;
2017-05-10 10:55:31 +02:00
initPublisher ( parentId : string , cameraOptions : any ) : Publisher ;
initPublisher ( parentId : string , cameraOptions : any , callback : any ) : Publisher ;
2016-10-15 00:11:17 +02:00
2017-05-19 16:04:56 +02:00
initPublisher ( parentId : string , cameraOptions? : any , callback? : Function ) : any {
2017-11-18 15:43:27 +01:00
2018-03-15 12:43:30 +01:00
let publisher : Publisher ;
if ( cameraOptions != null ) {
2017-11-18 15:43:27 +01:00
2018-03-15 12:43:30 +01:00
cameraOptions . audio = cameraOptions . audio != null ? cameraOptions.audio : true ;
cameraOptions . video = cameraOptions . video != null ? cameraOptions.video : true ;
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
if ( ! cameraOptions . screen ) {
2017-10-03 15:02:36 +02:00
2018-03-15 12:43:30 +01:00
// Webcam and/or microphone is being requested
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
let cameraOptionsAux = {
sendAudio : cameraOptions.audio != null ? cameraOptions.audio : true ,
sendVideo : cameraOptions.video != null ? cameraOptions.video : true ,
activeAudio : cameraOptions.audioActive != null ? cameraOptions.audioActive : true ,
activeVideo : cameraOptions.videoActive != null ? cameraOptions.videoActive : true ,
dataChannel : true ,
mediaConstraints : this.openVidu.generateMediaConstraints ( cameraOptions )
} ;
cameraOptions = cameraOptionsAux ;
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
publisher = new Publisher ( this . openVidu . initPublisherTagged ( parentId , cameraOptions , true , callback ) , parentId , false ) ;
console . info ( "'Publisher' initialized" ) ;
2017-10-03 15:02:36 +02:00
2018-03-15 12:43:30 +01:00
return publisher ;
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
} else {
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
// Screen share is being requested
publisher = new Publisher ( this . openVidu . initPublisherScreen ( parentId , true , callback ) , parentId , true ) ;
if ( DetectRTC . browser . name === 'Firefox' && DetectRTC . browser . version >= 52 ) {
screenSharingAuto . getScreenId ( ( error , sourceId , screenConstraints ) = > {
cameraOptions = {
sendAudio : cameraOptions.audio ,
sendVideo : cameraOptions.video ,
activeAudio : cameraOptions.audioActive != null ? cameraOptions.audioActive : true ,
activeVideo : cameraOptions.videoActive != null ? cameraOptions.videoActive : true ,
dataChannel : true ,
mediaConstraints : {
video : screenConstraints.video ,
audio : false
2017-10-03 15:02:36 +02:00
}
2018-03-15 12:43:30 +01:00
}
publisher . stream . configureScreenOptions ( cameraOptions ) ;
console . info ( "'Publisher' initialized" ) ;
2017-10-03 15:02:36 +02:00
2018-03-15 12:43:30 +01:00
publisher . stream . ee . emitEvent ( 'can-request-screen' ) ;
} ) ;
return publisher ;
} else if ( DetectRTC . browser . name === 'Chrome' ) {
// Screen is being requested
/ * s c r e e n S h a r i n g . i s C h r o m e E x t e n s i o n A v a i l a b l e ( ( a v a i l a b i l i t y ) = > {
switch ( availability ) {
case 'available' :
console . warn ( 'EXTENSION AVAILABLE!!!' ) ;
screenSharing . getScreenConstraints ( ( error , screenConstraints ) = > {
if ( ! error ) {
console . warn ( screenConstraints ) ;
}
} ) ;
break ;
case 'unavailable' :
console . warn ( 'EXTENSION NOT AVAILABLE!!!' ) ;
break ;
case 'isFirefox' :
console . warn ( 'IT IS FIREFOX!!!' ) ;
screenSharing . getScreenConstraints ( ( error , screenConstraints ) = > {
if ( ! error ) {
console . warn ( screenConstraints ) ;
}
} ) ;
break ;
}
} ) ; * /
screenSharingAuto . getScreenId ( ( error , sourceId , screenConstraints ) = > {
if ( error === 'not-installed' ) {
let error = new OpenViduError ( OpenViduErrorName . SCREEN_EXTENSION_NOT_INSTALLED , 'https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk' ) ;
console . error ( error ) ;
if ( callback ) callback ( error ) ;
return ;
} else if ( error === 'permission-denied' ) {
let error = new OpenViduError ( OpenViduErrorName . SCREEN_CAPTURE_DENIED , 'You must allow access to one window of your desktop' ) ;
console . error ( error ) ;
if ( callback ) callback ( error ) ;
return ;
}
cameraOptions = {
sendAudio : cameraOptions.audio != null ? cameraOptions.audio : true ,
sendVideo : cameraOptions.video != null ? cameraOptions.video : true ,
activeAudio : cameraOptions.audioActive != null ? cameraOptions.audioActive : true ,
activeVideo : cameraOptions.videoActive != null ? cameraOptions.videoActive : true ,
dataChannel : true ,
mediaConstraints : {
video : screenConstraints.video ,
audio : false
2017-10-03 15:02:36 +02:00
}
2018-03-15 12:43:30 +01:00
}
2018-01-18 15:59:28 +01:00
2018-03-15 12:43:30 +01:00
publisher . stream . configureScreenOptions ( cameraOptions ) ;
2017-10-03 15:02:36 +02:00
2018-03-15 12:43:30 +01:00
publisher . stream . ee . emitEvent ( 'can-request-screen' ) ;
} , ( error ) = > {
console . error ( 'getScreenId error' , error ) ;
return ;
} ) ;
console . info ( "'Publisher' initialized" ) ;
return publisher ;
} else {
console . error ( 'Screen sharing not supported on ' + DetectRTC . browser . name ) ;
if ( ! ! callback ) callback ( new OpenViduError ( OpenViduErrorName . SCREEN_SHARING_NOT_SUPPORTED , 'Screen sharing not supported on ' + DetectRTC . browser . name + ' ' + DetectRTC . browser . version ) ) ;
2017-05-10 10:55:31 +02:00
}
2016-10-15 00:11:17 +02:00
}
} else {
2018-03-15 12:43:30 +01:00
cameraOptions = {
sendAudio : true ,
sendVideo : true ,
activeAudio : true ,
activeVideo : true ,
dataChannel : true ,
mediaConstraints : {
audio : true ,
video : { width : { ideal : 1280 } }
}
}
publisher = new Publisher ( this . openVidu . initPublisherTagged ( parentId , cameraOptions , true , callback ) , parentId , false ) ;
console . info ( "'Publisher' initialized" ) ;
return publisher ;
2016-10-15 00:11:17 +02:00
}
}
2018-01-18 15:59:28 +01:00
reinitPublisher ( publisher : Publisher ) : any {
if ( publisher . stream . typeOfVideo !== 'SCREEN' ) {
publisher = new Publisher ( this . openVidu . initPublisherTagged ( publisher . stream . getParentId ( ) , publisher . stream . outboundOptions , false ) , publisher . stream . getParentId ( ) , false ) ;
console . info ( "'Publisher' initialized" ) ;
return publisher ;
} else {
publisher = new Publisher ( this . openVidu . initPublisherScreen ( publisher . stream . getParentId ( ) , false ) , publisher . stream . getParentId ( ) , true ) ;
2018-03-15 12:43:30 +01:00
if ( DetectRTC . browser . name === 'Firefox' && DetectRTC . browser . version >= 52 ) {
2018-01-18 15:59:28 +01:00
screenSharingAuto . getScreenId ( ( error , sourceId , screenConstraints ) = > {
publisher . stream . outboundOptions . mediaConstraints . video = screenConstraints . video ;
publisher . stream . configureScreenOptions ( publisher . stream . outboundOptions ) ;
console . info ( "'Publisher' initialized" ) ;
publisher . stream . ee . emitEvent ( 'can-request-screen' ) ;
} ) ;
return publisher ;
2018-03-15 12:43:30 +01:00
} else if ( DetectRTC . browser . name === 'Chrome' ) {
2018-01-18 15:59:28 +01:00
screenSharingAuto . getScreenId ( ( error , sourceId , screenConstraints ) = > {
if ( error === 'not-installed' ) {
let error = new OpenViduError ( OpenViduErrorName . SCREEN_EXTENSION_NOT_INSTALLED , 'https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk' ) ;
console . error ( error ) ;
return ;
} else if ( error === 'permission-denied' ) {
let error = new OpenViduError ( OpenViduErrorName . SCREEN_CAPTURE_DENIED , 'You must allow access to one window of your desktop' ) ;
console . error ( error ) ;
return ;
}
publisher . stream . outboundOptions . mediaConstraints . video = screenConstraints . video ;
publisher . stream . configureScreenOptions ( publisher . stream . outboundOptions ) ;
publisher . stream . ee . emitEvent ( 'can-request-screen' ) ;
} , ( error ) = > {
console . error ( 'getScreenId error' , error ) ;
return ;
} ) ;
console . info ( "'Publisher' initialized" ) ;
return publisher ;
} else {
2018-03-15 12:43:30 +01:00
console . error ( 'Screen sharing not supported on ' + DetectRTC . browser . name ) ;
2018-01-18 15:59:28 +01:00
}
}
}
2017-05-10 10:55:31 +02:00
checkSystemRequirements ( ) : number {
2016-10-15 00:11:17 +02:00
2018-03-15 12:43:30 +01:00
let defaultWebRTCSupport : boolean = DetectRTC . isWebRTCSupported ;
let browser = DetectRTC . browser . name ;
let version = DetectRTC . browser . version ;
if ( ( browser !== 'Chrome' ) && ( browser !== 'Firefox' ) && ( browser !== 'Opera' ) ) {
2017-05-10 10:55:31 +02:00
return 0 ;
2018-03-15 12:43:30 +01:00
} else {
return defaultWebRTCSupport ? 1 : 0 ;
2016-10-15 00:11:17 +02:00
}
}
2017-05-10 10:55:31 +02:00
getDevices ( callback ) {
navigator . mediaDevices . enumerateDevices ( ) . then ( ( deviceInfos ) = > {
callback ( null , deviceInfos ) ;
} ) . catch ( ( error ) = > {
2017-09-22 15:57:59 +02:00
console . error ( "Error getting devices" , error ) ;
2017-05-10 10:55:31 +02:00
callback ( error , null ) ;
2016-10-15 00:11:17 +02:00
} ) ;
2017-03-13 18:55:50 +01:00
}
2017-05-19 16:04:56 +02:00
2017-09-22 15:57:59 +02:00
enableProdMode() {
2017-10-03 15:02:36 +02:00
console . log = function ( ) { } ;
console . debug = function ( ) { } ;
console . info = function ( ) { } ;
console . warn = function ( ) { } ;
2017-09-22 15:57:59 +02:00
}
2018-03-01 11:13:45 +01:00
initLocalRecorder ( stream : Stream ) : LocalRecorder {
return new LocalRecorder ( stream ) ;
}
2016-10-15 00:11:17 +02:00
}