/* * (C) Copyright 2016 OpenVidu (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. * */ import { Session, SessionOptions } from './Session'; import { Stream } from './Stream'; import * as RpcBuilder from 'kurento-jsonrpc'; export type Callback = ( error?: any, openVidu?: T ) => void; export class OpenVidu { private session: Session; private jsonRpcClient: any; private rpcParams: any; private callback: Callback; private camera: Stream; constructor( private wsUri: string ) { if(this.wsUri.charAt(wsUri.length-1) != '/'){ this.wsUri = '/'; } this.wsUri += 'room'; this.session = new Session(this); } getRoom() { return this.session; } connect( callback: Callback ): void { this.callback = callback; this.initJsonRpcClient( this.wsUri ); } private initJsonRpcClient( wsUri: string ): void { let 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 ); } private customNotification( params ) { if ( this.isRoomAvailable() ) { this.session.emitEvent( "custom-message-received", [{ params: params }] ); } } private connectCallback( error ) { if ( error ) { this.callback( error ); } else { this.callback( null, this ); } } private isRoomAvailable() { if ( this.session !== undefined && this.session instanceof Session ) { return true; } else { console.warn( 'Room instance not found' ); return false; } } private disconnectCallback() { console.log( 'Websocket connection lost' ); if ( this.isRoomAvailable() ) { this.session.onLostConnection(); } else { alert( 'Connection error. Please reload page.' ); } } private reconnectingCallback() { console.log( 'Websocket connection lost (reconnecting)' ); if ( this.isRoomAvailable() ) { this.session.onLostConnection(); } else { alert( 'Connection error. Please reload page.' ); } } private reconnectedCallback() { console.log( 'Websocket reconnected' ); } private onParticipantJoined( params ) { if ( this.isRoomAvailable() ) { this.session.onParticipantJoined( params ); } } private onParticipantPublished( params ) { if ( this.isRoomAvailable() ) { this.session.onParticipantPublished( params ); } } private onParticipantLeft( params ) { if ( this.isRoomAvailable() ) { this.session.onParticipantLeft( params ); } } private onParticipantEvicted( params ) { if ( this.isRoomAvailable() ) { this.session.onParticipantEvicted( params ); } } private onNewMessage( params ) { if ( this.isRoomAvailable() ) { this.session.onNewMessage( params ); } } private iceCandidateEvent( params ) { if ( this.isRoomAvailable() ) { this.session.recvIceCandidate( params ); } } private onRoomClosed( params ) { if ( this.isRoomAvailable() ) { this.session.onRoomClosed( params ); } } private onMediaError( params ) { if ( this.isRoomAvailable() ) { this.session.onMediaError( params ); } } setRpcParams( params: any ) { this.rpcParams = params; } sendRequest( method, params, callback?) { if ( params && params instanceof Function ) { callback = params; params = undefined; } params = params || {}; if ( this.rpcParams && this.rpcParams !== null && this.rpcParams !== undefined ) { for ( let index in this.rpcParams ) { if ( this.rpcParams.hasOwnProperty( index ) ) { params[index] = this.rpcParams[index]; console.log( 'RPC param added to request {' + index + ': ' + this.rpcParams[index] + '}' ); } } } console.log( 'Sending request: { method:"' + method + '", params: ' + JSON.stringify( params ) + ' }' ); this.jsonRpcClient.send( method, params, callback ); } close( forced ) { if ( this.isRoomAvailable() ) { this.session.leave( forced, this.jsonRpcClient ); } }; disconnectParticipant( stream ) { if ( this.isRoomAvailable() ) { this.session.disconnect( stream ); } } getCamera(options?) { if(this.camera){ return this.camera; } options = options || { audio: true, video: true, data: true } options.participant = this.session.getLocalParticipant(); this.camera = new Stream( this, true, this.session, options ); return this.camera; }; joinSession(options: SessionOptions, callback: Callback) { this.session.configure(options); this.session.connect(); this.session.addEventListener('room-connected', roomEvent => callback(undefined,this.session)); this.session.addEventListener('error-room', error => callback(error)); return this.session; }; //CHAT sendMessage( room, user, message ) { this.sendRequest( 'sendMessage', { message: message, userMessage: user, roomMessage: room }, function( error, response ) { if ( error ) { console.error( error ); } }); }; sendCustomRequest( params, callback ) { this.sendRequest( 'customRequest', params, callback ); }; }