diff --git a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js
index 210a1b0098..dedeb1736a 100644
--- a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js
+++ b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js
@@ -20,6 +20,14 @@ const hasDisplayMedia = (typeof navigator.getDisplayMedia === 'function'
const getConferenceBridge = () => Meetings.findOne().voiceProp.voiceConf;
+const getBoundGDM = () => {
+ if (typeof navigator.getDisplayMedia === 'function') {
+ return navigator.getDisplayMedia.bind(navigator);
+ } else if (navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia === 'function') {
+ return navigator.mediaDevices.getDisplayMedia.bind(navigator.mediaDevices);
+ }
+}
+
const getScreenStream = async () => {
const gDMCallback = (stream) => {
// Some older Chromium variants choke on gDM when audio: true by NOT generating
@@ -34,10 +42,10 @@ const getScreenStream = async () => {
}
if (typeof stream.getVideoTracks === 'function'
- && typeof constraints.video === 'object') {
+ && typeof GDM_CONSTRAINTS.video === 'object') {
stream.getVideoTracks().forEach(track => {
if (typeof track.applyConstraints === 'function') {
- track.applyConstraints(constraints.video).catch(error => {
+ track.applyConstraints(GDM_CONSTRAINTS.video).catch(error => {
logger.warn({
logCode: 'screenshare_videoconstraint_failed',
extraInfo: { errorName: error.name, errorCode: error.code },
@@ -49,10 +57,10 @@ const getScreenStream = async () => {
}
if (typeof stream.getAudioTracks === 'function'
- && typeof constraints.audio === 'object') {
+ && typeof GDM_CONSTRAINTS.audio === 'object') {
stream.getAudioTracks().forEach(track => {
if (typeof track.applyConstraints === 'function') {
- track.applyConstraints(constraints.audio).catch(error => {
+ track.applyConstraints(GDM_CONSTRAINTS.audio).catch(error => {
logger.warn({
logCode: 'screenshare_audioconstraint_failed',
extraInfo: { errorName: error.name, errorCode: error.code },
@@ -65,32 +73,18 @@ const getScreenStream = async () => {
return Promise.resolve(stream);
}
- const constraints = hasDisplayMedia ? GDM_CONSTRAINTS : null;
+ const getDisplayMedia = getBoundGDM();
- if (hasDisplayMedia) {
- // The double checks here is to detect whether gDM is in navigator or mediaDevices
- // because it can be on either of them depending on the browser+version
- if (typeof navigator.getDisplayMedia === 'function') {
- return navigator.getDisplayMedia(constraints)
- .then(gDMCallback)
- .catch(error => {
- logger.error({
- logCode: 'screenshare_getdisplaymedia_failed',
- extraInfo: { errorName: error.name, errorCode: error.code },
- }, 'getDisplayMedia call failed');
- return Promise.reject({ errorCode: error.code, errorMessage: error.name || error.message });
- });
- } else if (navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia === 'function') {
- return navigator.mediaDevices.getDisplayMedia(constraints)
- .then(gDMCallback)
- .catch(error => {
- logger.error({
- logCode: 'screenshare_getdisplaymedia_failed',
- extraInfo: { errorName: error.name, errorCode: error.code },
- }, 'getDisplayMedia call failed');
- return Promise.reject({ errorCode: error.code, errorMessage: error.name || error.message });
- });
- }
+ if (typeof getDisplayMedia === 'function') {
+ return getDisplayMedia(GDM_CONSTRAINTS)
+ .then(gDMCallback)
+ .catch(error => {
+ logger.error({
+ logCode: 'screenshare_getdisplaymedia_failed',
+ extraInfo: { errorName: error.name, errorCode: error.code },
+ }, 'getDisplayMedia call failed');
+ return Promise.reject({ errorCode: error.code, errorMessage: error.name || error.message });
+ });
} else {
// getDisplayMedia isn't supported, error its way out
return Promise.reject({