You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
139 lines
3.6 KiB
|
|
import EventEmitter from 'events'
|
|
|
|
let conferencePlugin = null;
|
|
|
|
export class ConferencePlugin {
|
|
|
|
constructor() {
|
|
this.events = new EventEmitter();
|
|
this.rtcEngine = null;
|
|
this.conference = null;
|
|
this.localMediaStream = null;
|
|
}
|
|
|
|
setRtcEngine(rtcEngine) {
|
|
if(this.rtcEngine === null) {
|
|
this.rtcEngine = rtcEngine;
|
|
this.rtcEngine.onConferenceNetworkConnected((network)=>{
|
|
this.events.emit('connected');
|
|
network
|
|
.onConferenceParticipantJoined((participant)=>{
|
|
this.events.emit('participantJoined', participant);
|
|
})
|
|
.onConferenceParticipantLeft((participant)=>{
|
|
this.events.emit('participantLeft', participant);
|
|
})
|
|
.onConferenceEvent((event)=>{
|
|
this.events.emit('conferenceEvent', event);
|
|
})
|
|
.onConferenceMessage((message)=>{
|
|
this.events.emit('conferenceMessage', message);
|
|
})
|
|
.onConferenceFile((file)=>{
|
|
this.events.emit('conferenceFile', file);
|
|
});
|
|
}).onConferenceNetworkDisconnected(()=>{
|
|
this.events.emit('disconnected');
|
|
});
|
|
}
|
|
}
|
|
|
|
getNetwork() {
|
|
return this.rtcEngine.getConferenceNetwork();
|
|
}
|
|
|
|
joinConference(options) {
|
|
return new Promise((resolve, reject)=>{
|
|
this.getNetwork().joinConference(options).then((conference)=>{
|
|
resolve(conference);
|
|
}).catch((err)=>{
|
|
reject(err);
|
|
});
|
|
});
|
|
}
|
|
|
|
onLeft(listener) {
|
|
this.events.on('left', listener);
|
|
return this;
|
|
}
|
|
|
|
onConferenceParticipantJoined(listener) {
|
|
this.events.on('participantJoined', listener);
|
|
return this;
|
|
}
|
|
|
|
onConferenceParticipantLeft(listener) {
|
|
this.events.on('participantLeft', listener);
|
|
return this;
|
|
}
|
|
|
|
onConferenceEvent(listener) {
|
|
this.events.on('conferenceEvent', listener);
|
|
return this;
|
|
}
|
|
|
|
onConferenceMessage(listener) {
|
|
this.events.on('conferenceMessage', listener);
|
|
return this;
|
|
}
|
|
|
|
onConferenceFile(listener) {
|
|
this.events.on('conferenceFile', listener);
|
|
return this;
|
|
}
|
|
|
|
onError(listener) {
|
|
this.events.on('error', listener);
|
|
return this;
|
|
}
|
|
|
|
static getInstance() {
|
|
if(conferencePlugin === null) {
|
|
conferencePlugin = new ConferencePlugin();
|
|
}
|
|
return conferencePlugin;
|
|
}
|
|
|
|
setLocalMediaStream(localMediaStream) {
|
|
this.removeLocalMediaStream();
|
|
this.localMediaStream = localMediaStream;
|
|
}
|
|
|
|
getLocalMediaStream() {
|
|
return this.localMediaStream;
|
|
}
|
|
|
|
hasLocalMediaStream() {
|
|
return this.localMediaStream !== null;
|
|
}
|
|
|
|
removeLocalMediaStream() {
|
|
if(this.hasLocalMediaStream()) {
|
|
this.getLocalMediaStream().stop();
|
|
}
|
|
}
|
|
|
|
getLocalMediaStreamNative() {
|
|
if(this.hasLocalMediaStream()) {
|
|
return this.getLocalMediaStream().getStream();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
getLocalParticipant() {
|
|
this.conference.getLocalParticipant();
|
|
}
|
|
|
|
getRemoteParticipant(id) {
|
|
this.conference.getRemoteParticipant(id);
|
|
}
|
|
}
|
|
|
|
export default {
|
|
install(Vue) {
|
|
Vue.$conference = ConferencePlugin.getInstance();
|
|
Vue.$conference.setRtcEngine(Vue.$rtcEngine);
|
|
}
|
|
}
|