2017-12-11 14:50:41 +01:00
import { SessionInternal , SessionOptions , SignalOptions } from '../OpenViduInternal/SessionInternal' ;
2017-05-10 10:55:31 +02:00
import { Stream } from '../OpenViduInternal/Stream' ;
2018-03-15 12:43:30 +01:00
import { Connection } from '../OpenViduInternal/Connection' ;
import { OpenViduError , OpenViduErrorName } from '../OpenViduInternal/OpenViduError' ;
2016-10-15 00:11:17 +02:00
2017-05-10 10:55:31 +02:00
import { OpenVidu } from './OpenVidu' ;
2017-05-22 23:02:28 +02:00
import { Publisher } from './Publisher' ;
2017-05-10 10:55:31 +02:00
import { Subscriber } from './Subscriber' ;
2016-10-15 00:11:17 +02:00
2017-05-17 11:46:32 +02:00
import EventEmitter = require ( 'wolfy87-eventemitter' ) ;
2018-03-15 12:43:30 +01:00
import * as DetectRTC from '../KurentoUtils/DetectRTC' ;
2017-05-17 11:46:32 +02:00
2016-10-15 02:08:23 +02:00
export class Session {
2016-10-15 00:11:17 +02:00
2017-05-10 10:55:31 +02:00
sessionId : String ;
2017-05-17 11:46:32 +02:00
connection : Connection ;
private ee = new EventEmitter ( ) ;
2016-10-15 00:11:17 +02:00
2017-05-10 10:55:31 +02:00
constructor ( private session : SessionInternal , private openVidu : OpenVidu ) {
this . sessionId = session . getSessionId ( ) ;
2017-05-17 11:46:32 +02:00
// Listens to the deactivation of the default behaviour upon the deletion of a Stream object
2017-06-13 12:29:15 +02:00
this . session . addEventListener ( 'stream-destroyed-default' , event = > {
2017-05-10 10:55:31 +02:00
event . stream . removeVideo ( ) ;
} ) ;
2017-05-17 11:46:32 +02:00
2017-05-22 23:02:28 +02:00
// Listens to the deactivation of the default behaviour upon the disconnection of a Session
this . session . addEventListener ( 'session-disconnected-default' , ( ) = > {
let s : Stream ;
2018-03-14 10:19:17 +01:00
for ( let streamId in this . session . getRemoteStreams ( ) ) {
this . session . getRemoteStreams ( ) [ streamId ] . removeVideo ( ) ;
2017-05-22 23:02:28 +02:00
}
2018-03-14 10:19:17 +01:00
if ( this . connection && ( Object . keys ( this . connection . getStreams ( ) ) . length > 0 ) ) {
2017-06-09 15:21:53 +02:00
for ( let streamId in this . connection . getStreams ( ) ) {
this . connection . getStreams ( ) [ streamId ] . removeVideo ( ) ;
}
2017-05-22 23:02:28 +02:00
}
} ) ;
2017-05-17 11:46:32 +02:00
// Sets or updates the value of 'connection' property. Triggered by SessionInternal when succesful connection
this . session . addEventListener ( 'update-connection-object' , event = > {
this . connection = event . connection ;
} ) ;
2016-10-15 02:08:23 +02:00
}
2017-05-12 19:44:32 +02:00
connect ( token : string , callback : any ) ;
2017-09-12 11:43:44 +02:00
connect ( token : string , metadata : any , callback : any ) ;
2017-05-22 23:02:28 +02:00
2017-05-12 19:44:32 +02:00
connect ( param1 , param2 , param3 ? ) {
2017-05-10 10:55:31 +02:00
// Early configuration to deactivate automatic subscription to streams
2017-09-12 11:43:44 +02:00
if ( param3 ) {
2018-03-15 12:43:30 +01:00
if ( this . openVidu . checkSystemRequirements ( ) ) {
this . session . configure ( {
sessionId : this.session.getSessionId ( ) ,
participantId : param1 ,
metadata : this.session.stringClientMetadata ( param2 ) ,
subscribeToStreams : false
} ) ;
this . session . connect ( param1 , param3 ) ;
} else {
param3 ( new OpenViduError ( OpenViduErrorName . BROWSER_NOT_SUPPORTED , 'Browser ' + DetectRTC . browser . name + ' ' + DetectRTC . browser . version + ' is not supported in OpenVidu' ) ) ;
}
2017-05-12 19:44:32 +02:00
} else {
2018-03-15 12:43:30 +01:00
if ( this . openVidu . checkSystemRequirements ( ) ) {
this . session . configure ( {
sessionId : this.session.getSessionId ( ) ,
participantId : param1 ,
metadata : '' ,
subscribeToStreams : false
} ) ;
this . session . connect ( param1 , param2 ) ;
} else {
param2 ( new OpenViduError ( OpenViduErrorName . BROWSER_NOT_SUPPORTED , 'Browser ' + DetectRTC . browser . name + ' ' + DetectRTC . browser . version + ' is not supported in OpenVidu' ) ) ;
}
2017-05-12 19:44:32 +02:00
}
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
disconnect() {
this . openVidu . openVidu . close ( false ) ;
2017-05-22 23:02:28 +02:00
this . session . emitEvent ( 'sessionDisconnected' , [ {
preventDefault : ( ) = > { this . session . removeEvent ( 'session-disconnected-default' ) ; }
} ] ) ;
this . session . emitEvent ( 'session-disconnected-default' , [ { } ] ) ;
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
publish ( publisher : Publisher ) {
2018-01-10 15:00:52 +01:00
if ( ! publisher . stream . isPublisherPublished ) { // 'Session.unpublish(Publisher)' has NOT been called
if ( publisher . isScreenRequested ) { // Screen sharing Publisher
if ( ! publisher . stream . isScreenRequestedReady ) { // Screen video stream is not available yet
publisher . stream . addOnceEventListener ( 'screen-ready' , ( ) = > {
this . streamPublish ( publisher ) ;
} ) ;
} else { // // Screen video stream is already available
this . streamPublish ( publisher ) ;
}
} else { // Audio-Video Publisher
this . streamPublish ( publisher ) ;
}
} else { // 'Session.unpublish(Publisher)' has been called
2018-01-18 15:59:28 +01:00
publisher = this . openVidu . reinitPublisher ( publisher ) ;
if ( publisher . isScreenRequested && ! publisher . stream . isScreenRequestedReady ) { // Screen sharing Publisher and video stream not available yet
publisher . stream . addOnceEventListener ( 'screen-ready' , ( ) = > {
this . streamPublish ( publisher ) ;
2018-01-10 15:00:52 +01:00
} ) ;
} else { // Video stream already available
2018-01-18 15:59:28 +01:00
this . streamPublish ( publisher ) ;
2018-01-10 15:00:52 +01:00
}
2017-10-03 15:02:36 +02:00
}
2017-05-10 10:55:31 +02:00
}
2018-02-27 14:37:39 +01:00
2018-01-10 15:00:52 +01:00
private streamPublish ( publisher : Publisher ) {
publisher . session = this ;
2018-03-02 11:03:45 +01:00
this . connection . addStream ( publisher . stream ) ;
2018-01-10 15:00:52 +01:00
publisher . stream . publish ( ) ;
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
unpublish ( publisher : Publisher ) {
2018-01-10 15:00:52 +01:00
this . session . unpublish ( publisher ) ;
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
on ( eventName : string , callback ) {
2017-06-13 12:29:15 +02:00
this . session . addEventListener ( eventName , event = > {
2017-09-22 15:57:59 +02:00
if ( event ) {
console . info ( "Event '" + eventName + "' triggered by 'Session'" , event ) ;
} else {
console . info ( "Event '" + eventName + "' triggered by 'Session'" ) ;
}
2017-06-13 12:29:15 +02:00
callback ( event ) ;
} ) ;
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
once ( eventName : string , callback ) {
2017-06-13 12:29:15 +02:00
this . session . addOnceEventListener ( eventName , event = > {
callback ( event ) ;
} ) ;
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
off ( eventName : string , eventHandler ) {
2017-06-13 12:29:15 +02:00
this . session . removeListener ( eventName , eventHandler ) ;
2017-05-10 10:55:31 +02:00
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
subscribe ( stream : Stream , htmlId : string , videoOptions : any ) : Subscriber ;
subscribe ( stream : Stream , htmlId : string ) : Subscriber ;
2017-05-22 23:02:28 +02:00
2017-05-10 10:55:31 +02:00
subscribe ( param1 , param2 , param3 ? ) : Subscriber {
// Subscription
this . session . subscribe ( param1 ) ;
let subscriber = new Subscriber ( param1 , param2 ) ;
param1 . playOnlyVideo ( param2 , null ) ;
return subscriber ;
}
2017-03-28 20:17:44 +02:00
2017-05-10 10:55:31 +02:00
unsubscribe ( subscriber : Subscriber ) {
2017-12-12 14:36:43 +01:00
this . session . unsubscribe ( subscriber . stream ) ;
2017-05-10 10:55:31 +02:00
subscriber . stream . removeVideo ( ) ;
}
2017-03-28 20:17:44 +02:00
2017-12-11 14:50:41 +01:00
signal ( signal : SignalOptions , completionHandler? : Function ) {
var signalMessage = { } ;
if ( signal . to && signal . to . length > 0 ) {
let connectionIds : string [ ] = [ ] ;
for ( let i = 0 ; i < signal . to . length ; i ++ ) {
connectionIds . push ( signal . to [ i ] . connectionId ) ;
}
signalMessage [ 'to' ] = connectionIds ;
} else {
signalMessage [ 'to' ] = [ ] ;
}
signalMessage [ 'data' ] = signal . data ? signal . data : '' ;
signalMessage [ 'type' ] = signal . type ? signal . type : '' ;
2018-01-10 15:00:52 +01:00
this . openVidu . openVidu . sendMessage ( JSON . stringify ( signalMessage ) ) ;
2017-12-11 14:50:41 +01:00
}
2016-10-15 00:11:17 +02:00
}