openvidu/openvidu-browser/ts/OpenVidu/Publisher.ts

167 lines
6.0 KiB
TypeScript

/*
* options: name: XXX data: true (Maybe this is based on webrtc) audio: true,
* video: true, url: "file:///..." > Player screen: true > Desktop (implicit
* video:true, audio:false) audio: true, video: true > Webcam
*
* stream.hasAudio(); stream.hasVideo(); stream.hasData();
*/
import { Stream, StreamOptions, VideoOptions } from '../OpenViduInternal/Stream';
import { Session } from './Session';
import EventEmitter = require('wolfy87-eventemitter');
export class Publisher {
private ee = new EventEmitter();
accessAllowed = false;
element: Element;
id: string;
stream: Stream;
session: Session; //Initialized by Session.publish(Publisher)
isScreenRequested: boolean = false;
flowOutAudio: boolean = false;
flowOutVideo: boolean = false;
constructor(stream: Stream, parentId: string, isScreenRequested: boolean) {
this.stream = stream;
this.isScreenRequested = isScreenRequested;
this.stream.addEventListener('camera-access-changed', (event) => {
this.accessAllowed = event.accessAllowed;
if (this.accessAllowed) {
this.ee.emitEvent('accessAllowed');
} else {
this.ee.emitEvent('accessDenied');
}
});
this.stream.addEventListener('media-flow-out-changed', (event) => {
let wasFlowing = this.flowOutAudio || this.flowOutVideo;
if(event.mediaType == "AUDIO"){
this.flowOutAudio = event.newState == "FLOWING"
}
if(event.mediaType == "VIDEO"){
this.flowOutVideo = event.newState == "FLOWING"
}
if(wasFlowing && !this.flowOutAudio && !this.flowOutVideo){
this.ee.emitEvent('flowStopped');
}
if (!wasFlowing && (this.flowOutAudio || this.flowOutVideo)) {
this.ee.emitEvent('flowStarted');
}
});
if (document.getElementById(parentId) != null) {
this.element = document.getElementById(parentId)!!;
}
}
publishAudio(value: boolean) {
this.stream.getWebRtcPeer().audioEnabled = value;
}
publishVideo(value: boolean) {
this.stream.getWebRtcPeer().videoEnabled = value;
}
destroy() {
this.session.unpublish(this);
this.stream.dispose();
this.stream.removeVideo(this.element);
return this;
}
subscribeToRemote() {
this.stream.subscribeToMyRemote();
}
on(eventName: string, callback) {
this.ee.addListener(eventName, event => {
if (event) {
console.info("Event '" + eventName + "' triggered by 'Publisher'", event);
} else {
console.info("Event '" + eventName + "' triggered by 'Publisher'");
}
callback(event);
});
if (eventName == 'streamCreated') {
if (this.stream.isPublisherPublished) {
this.ee.emitEvent('streamCreated', [{ stream: this.stream }]);
} else {
this.stream.addEventListener('stream-created-by-publisher', () => {
console.warn('Publisher emitting streamCreated');
this.ee.emitEvent('streamCreated', [{ stream: this.stream }]);
});
}
}
if (eventName == 'videoElementCreated') {
if (this.stream.isVideoELementCreated) {
this.ee.emitEvent('videoElementCreated', [{
element: this.stream.getVideoElement()
}]);
} else {
this.stream.addOnceEventListener('video-element-created-by-stream', (element) => {
this.id = element.id;
this.ee.emitEvent('videoElementCreated', [{
element: element.element
}]);
});
}
}
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', (element) => {
this.ee.emitEvent('videoPlaying', [{
element: element.element
}]);
});
}
}
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', (element) => {
this.ee.emitEvent('remoteVideoPlaying', [{
element: element.element
}]);
});
}
}
if (eventName == 'accessAllowed') {
if (this.stream.accessIsAllowed) {
this.ee.emitEvent('accessAllowed');
} else {
this.stream.addEventListener('access-allowed-by-publisher', () => {
this.ee.emitEvent('accessAllowed');
});
}
}
if (eventName == 'accessDenied') {
if (this.stream.accessIsDenied) {
this.ee.emitEvent('accessDenied');
} else {
this.stream.addEventListener('access-denied-by-publisher', () => {
this.ee.emitEvent('accessDenied');
});
}
}
}
}