bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/captions/service.js
Ramón Souza 3840d4ff63 fix(closed captions): avoid padId subscription
Remove padIds from the closed captions MongoDB collection subscription.

Users now have to fetch the padId from Meteor when needed. Meteor is
responsible for checking the user's access level and return the
proper id.
2021-10-04 19:22:18 +00:00

200 lines
5.1 KiB
JavaScript

import _ from 'lodash';
import Captions from '/imports/api/captions';
import Users from '/imports/api/users';
import Auth from '/imports/ui/services/auth';
import { makeCall } from '/imports/ui/services/api';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
const CAPTIONS_CONFIG = Meteor.settings.public.captions;
const CAPTIONS_TOKEN = '_cc_';
const LINE_BREAK = '\n';
const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
const getActiveCaptions = () => {
const activeCaptions = Session.get('activeCaptions');
if (!activeCaptions) return '';
return activeCaptions;
};
const getCaptions = locale => Captions.findOne({
meetingId: Auth.meetingID,
locale,
});
const getCaptionsData = () => {
const activeCaptions = getActiveCaptions();
let locale = '';
let revs = 0;
let data = '';
if (activeCaptions) {
const captions = getCaptions(activeCaptions);
if (!_.isEmpty(captions)) {
locale = activeCaptions;
revs = captions.revs; // eslint-disable-line prefer-destructuring
data = captions.data; // eslint-disable-line prefer-destructuring
}
}
return { locale, revs, data };
};
const getAvailableLocales = () => {
const { meetingID } = Auth;
const locales = [];
Captions.find({ meetingId: meetingID },
{ sort: { locale: 1 } },
{ fields: { ownerId: 1, locale: 1, name: 1 } })
.forEach((caption) => {
if (caption.ownerId === '') {
locales.push({
locale: caption.locale,
name: caption.name,
});
}
});
return locales;
};
const getOwnedLocales = () => {
const { meetingID } = Auth;
const locales = [];
Captions.find({ meetingId: meetingID },
{ fields: { ownerId: 1, locale: 1, name: 1 } })
.forEach((caption) => {
if (caption.ownerId !== '') {
locales.push({
locale: caption.locale,
name: caption.name,
});
}
});
return locales;
};
const takeOwnership = (locale) => {
makeCall('takeOwnership', locale);
};
const appendText = (text, locale) => {
if (typeof text !== 'string' || text.length === 0) return;
const formattedText = `${text.trim().replace(/^\w/, (c) => c.toUpperCase())}\n\n`;
makeCall('appendText', formattedText, locale);
};
const canIOwnThisPad = (ownerId) => {
const { userID } = Auth;
if (!CAPTIONS_CONFIG.takeOwnership) return false;
if (ownerId === '') return false;
return ownerId !== userID;
};
const getSpeechRecognitionAPI = () => window.SpeechRecognition || window.webkitSpeechRecognition;
const canIDictateThisPad = (ownerId) => {
const { userID } = Auth;
if (!CAPTIONS_CONFIG.enableDictation) return false;
if (ownerId === '') return false;
const SpeechRecognitionAPI = getSpeechRecognitionAPI();
if (!SpeechRecognitionAPI) return false;
return ownerId === userID;
};
const setActiveCaptions = (locale) => {
Session.set('activeCaptions', locale);
};
const setCaptionsSettings = (settings) => {
Session.set('captionsSettings', settings);
};
const getCaptionsSettings = () => {
const settings = Session.get('captionsSettings');
if (!settings) {
const {
backgroundColor, fontColor, fontFamily, fontSize,
} = CAPTIONS_CONFIG;
return {
backgroundColor, fontColor, fontFamily, fontSize,
};
}
return settings;
};
const isCaptionsEnabled = () => {
const captions = Captions.findOne({ meetingId: Auth.meetingID });
return CAPTIONS_CONFIG.enabled && captions;
};
const isCaptionsAvailable = () => {
if (isCaptionsEnabled) {
const ownedLocales = getOwnedLocales();
return (ownedLocales.length > 0);
}
return false;
};
const isCaptionsActive = () => {
const enabled = isCaptionsEnabled();
const activated = getActiveCaptions() !== '';
return (enabled && activated);
};
const deactivateCaptions = () => {
setActiveCaptions('');
};
const activateCaptions = (locale, settings) => {
setCaptionsSettings(settings);
setActiveCaptions(locale);
};
const formatCaptionsText = (text) => {
const splitText = text.split(LINE_BREAK);
const filteredText = splitText.filter((line, index) => {
const lastLine = index === (splitText.length - 1);
const emptyLine = line.length === 0;
return (!emptyLine || lastLine);
});
while (filteredText.length > CAPTIONS_CONFIG.lines) filteredText.shift();
return filteredText.join(LINE_BREAK);
};
const amIModerator = () => Users.findOne({ userId: Auth.userID },
{ fields: { role: 1 } }).role === ROLE_MODERATOR;
const initSpeechRecognition = (locale) => {
const SpeechRecognitionAPI = getSpeechRecognitionAPI();
let recognition = null;
if (SpeechRecognitionAPI) {
recognition = new SpeechRecognitionAPI();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = locale;
}
return recognition;
};
export default {
CAPTIONS_TOKEN,
getCaptionsData,
getAvailableLocales,
getOwnedLocales,
takeOwnership,
appendText,
getCaptions,
canIOwnThisPad,
canIDictateThisPad,
getCaptionsSettings,
isCaptionsEnabled,
isCaptionsAvailable,
isCaptionsActive,
deactivateCaptions,
activateCaptions,
formatCaptionsText,
amIModerator,
initSpeechRecognition,
};