bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/video-provider/service.js

167 lines
4.6 KiB
JavaScript
Raw Normal View History

import { Tracker } from 'meteor/tracker';
2017-09-19 21:53:27 +08:00
import { makeCall } from '/imports/ui/services/api';
import Auth from '/imports/ui/services/auth';
2018-04-10 02:28:54 +08:00
import Meetings from '/imports/api/meetings/';
import Users from '/imports/api/users/';
import mapUser from '/imports/ui/services/user/mapUser';
2018-04-09 22:39:27 +08:00
import UserListService from '/imports/ui/components/user-list/service';
2018-04-24 23:51:41 +08:00
import SessionStorage from '/imports/ui/services/storage/session';
2017-09-01 23:26:57 +08:00
class VideoService {
constructor() {
this.defineProperties({
isSharing: false,
isConnected: false,
isWaitingResponse: false,
});
}
2017-09-20 11:12:10 +08:00
defineProperties(obj) {
Object.keys(obj).forEach((key) => {
const privateKey = `_${key}`;
this[privateKey] = {
value: obj[key],
tracker: new Tracker.Dependency(),
};
2017-09-20 11:12:10 +08:00
Object.defineProperty(this, key, {
set: (value) => {
this[privateKey].value = value;
this[privateKey].tracker.changed();
},
get: () => {
this[privateKey].tracker.depend();
return this[privateKey].value;
},
});
});
}
2017-09-01 23:26:57 +08:00
joinVideo() {
this.isSharing = true;
const joinVideoEvent = new Event('joinVideo');
document.dispatchEvent(joinVideoEvent);
}
joiningVideo() {
this.isWaitingResponse = true;
}
joinedVideo() {
this.isWaitingResponse = false;
this.isConnected = true;
}
exitVideo() {
const exitVideoEvent = new Event('exitVideo');
document.dispatchEvent(exitVideoEvent);
}
exitedVideo() {
this.isSharing = false;
this.isWaitingResponse = false;
this.isConnected = false;
}
sendUserShareWebcam(stream) {
makeCall('userShareWebcam', stream);
}
sendUserUnshareWebcam(stream) {
makeCall('userUnshareWebcam', stream);
}
getAllUsers() {
2018-04-09 22:39:27 +08:00
// Use the same function as the user-list to share the sorting/mapping
return UserListService.getUsers();
}
2018-04-10 02:28:54 +08:00
getAllUsersVideo() {
const userId = this.userId();
const isLocked = this.isLocked();
const currentUser = Users.findOne({ userId });
const currentUserIsModerator = mapUser(currentUser).isModerator;
const sharedWebcam = this.isSharing;
2018-04-10 02:28:54 +08:00
const isSharingWebcam = user => user.isSharingWebcam || (sharedWebcam && user.isCurrent);
const isNotLocked = user => !(isLocked && user.isLocked);
const isWebcamOnlyModerator = this.webcamOnlyModerator();
const allowedSeeViewersWebcams = !isWebcamOnlyModerator || currentUserIsModerator;
const webcamOnlyModerator = (user) => {
if (allowedSeeViewersWebcams) return true;
return user.isModerator || user.isCurrent;
};
return this.getAllUsers()
.filter(isSharingWebcam)
.filter(isNotLocked)
.filter(webcamOnlyModerator);
}
2018-03-22 22:14:54 +08:00
webcamOnlyModerator() {
2018-04-09 22:39:27 +08:00
const m = Meetings.findOne({ meetingId: Auth.meetingID });
2018-03-22 22:14:54 +08:00
return m.usersProp.webcamsOnlyForModerator;
}
isLocked() {
2018-04-09 22:39:27 +08:00
const m = Meetings.findOne({ meetingId: Auth.meetingID });
2018-03-22 22:14:54 +08:00
return m.lockSettingsProp ? m.lockSettingsProp.disableCam : false;
}
userId() {
return Auth.userID;
}
userName() {
const currentUser = Users.findOne({ userId: Auth.userID });
return currentUser.name;
}
meetingId() {
return Auth.meetingID;
}
sessionToken() {
return Auth.sessionToken;
}
voiceBridge() {
const voiceBridge = Meetings.findOne({ meetingId: Auth.meetingID }).voiceProp.voiceConf;
return voiceBridge;
}
isConnected() {
return this.isConnected;
}
2017-09-01 23:26:57 +08:00
isWaitingResponse() {
return this.isWaitingResponse;
}
}
const videoService = new VideoService();
2017-09-01 23:26:57 +08:00
export default {
exitVideo: () => videoService.exitVideo(),
exitingVideo: () => videoService.exitingVideo(),
exitedVideo: () => videoService.exitedVideo(),
getAllUsers: () => videoService.getAllUsers(),
2018-03-22 22:14:54 +08:00
webcamOnlyModerator: () => videoService.webcamOnlyModerator(),
2018-04-09 22:39:27 +08:00
isLocked: () => videoService.isLocked(),
2018-04-24 23:51:41 +08:00
isSharing: () => videoService.isSharing,
isConnected: () => videoService.isConnected,
isWaitingResponse: () => videoService.isWaitingResponse,
joinVideo: () => videoService.joinVideo(),
joiningVideo: () => videoService.joiningVideo(),
joinedVideo: () => videoService.joinedVideo(),
sendUserShareWebcam: stream => videoService.sendUserShareWebcam(stream),
sendUserUnshareWebcam: stream => videoService.sendUserUnshareWebcam(stream),
userId: () => videoService.userId(),
userName: () => videoService.userName(),
meetingId: () => videoService.meetingId(),
2018-04-10 02:28:54 +08:00
getAllUsersVideo: () => videoService.getAllUsersVideo(),
sessionToken: () => videoService.sessionToken(),
voiceBridge: () => videoService.voiceBridge(),
2017-09-01 23:26:57 +08:00
};