From a3013bb716be7e189d8ce81515b2d576a7e30943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Tue, 4 Jun 2019 12:58:12 +0200 Subject: [PATCH] Removed screensharing extension. Added some small optimization fixes. --- .gitignore | 1 + CHANGELOG.md | 17 ++ README.md | 1 - app/package.json | 2 +- app/public/index.html | 3 +- app/public/robots.txt | 3 + app/src/RoomClient.js | 51 +----- app/src/ScreenShare.js | 237 +------------------------ app/src/actions/stateActions.js | 11 +- app/src/components/Controls/Sidebar.js | 7 +- app/src/reducers/me.js | 10 -- server/package.json | 2 +- 12 files changed, 31 insertions(+), 314 deletions(-) create mode 100644 app/public/robots.txt diff --git a/.gitignore b/.gitignore index 7f87e51..ded69d9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules/ /server/public/ /server/certs/ !/server/certs/mediasoup-demo.localhost.* +.vscode \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f982c1..375f121 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +### 2.1 +* Updated to mediasoup v3 +* Replace lib "passport-datporten" with "openid-client" (a general OIDC certified client) + - OpenID Connect discovery + - Auth code flow +* Add spdy http2 support. + - Notice it does not supports node 11.x + + ### 2.0 +* Material UI +* Separate settings for lastN for desktop and mobile + + ### 1.2 +* Add Lock Room feature +* Fix suspended Web Audio context / fixed delayed getUsermedia +* Added support for the new getdisplaymedia API in Chrome 72 + ### 1.1 * Moved Filesharing code out from React code to RoomClient * Major cleanup of CSS. Variables for most colors and sizes exposed in :root diff --git a/README.md b/README.md index a657a05..6e69fb1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Try it online at https://letsmeet.no. You can add /roomname to the URL for speci * Chat * Screen sharing * File sharing -* Different video layouts There is also a SIP gateway that can be found [here](https://github.com/havfo/multiparty-meeting-sipgw). To try it, call: roomname@letsmeet.no. diff --git a/app/package.json b/app/package.json index 943109e..c61504f 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "multiparty-meeting", - "version": "2.0.0", + "version": "2.1.0", "private": true, "description": "multiparty meeting service", "author": "Håvar Aambø Fosstveit ", diff --git a/app/public/index.html b/app/public/index.html index 2c07c0b..86b1003 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -9,8 +9,7 @@ - - + diff --git a/app/public/robots.txt b/app/public/robots.txt new file mode 100644 index 0000000..21fed79 --- /dev/null +++ b/app/public/robots.txt @@ -0,0 +1,3 @@ +# Allow crawling of all content +User-agent: * +Disallow: \ No newline at end of file diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 8aa36ad..217e268 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -748,53 +748,6 @@ export default class RoomClient } } - installExtension() - { - logger.debug('installExtension()'); - - return new Promise((resolve, reject) => - { - window.addEventListener('message', _onExtensionMessage, false); - // eslint-disable-next-line - chrome.webstore.install(null, _successfulInstall, _failedInstall); - function _onExtensionMessage({ data }) - { - if (data.type === 'ScreenShareInjected') - { - logger.debug('installExtension() | installation succeeded'); - - return resolve(); - } - } - - function _failedInstall(reason) - { - window.removeEventListener('message', _onExtensionMessage); - - return reject( - new Error('Failed to install extension: %s', reason)); - } - - function _successfulInstall() - { - logger.debug('installExtension() | installation accepted'); - } - }) - .then(() => - { - // This should be handled better - store.dispatch(stateActions.setScreenCapabilities( - { - canShareScreen : this._room.canSend('video'), - needExtension : false - })); - }) - .catch((error) => - { - logger.error('installExtension() | failed: %o', error); - }); - } - async changeAudioDevice(deviceId) { logger.debug('changeAudioDevice() [deviceId: %s]', deviceId); @@ -1697,7 +1650,6 @@ export default class RoomClient canSendWebcam : this._mediasoupDevice.canProduce('video'), canShareScreen : this._mediasoupDevice.canProduce('video') && this._screenSharing.isScreenShareAvailable(), - needExtension : this._screenSharing.needExtension(), canShareFiles : this._torrentSupport })); @@ -2021,8 +1973,7 @@ export default class RoomClient try { - const available = this._screenSharing.isScreenShareAvailable() && - !this._screenSharing.needExtension(); + const available = this._screenSharing.isScreenShareAvailable(); if (!available) throw new Error('screen sharing not available'); diff --git a/app/src/ScreenShare.js b/app/src/ScreenShare.js index 9df56b4..c9336d1 100644 --- a/app/src/ScreenShare.js +++ b/app/src/ScreenShare.js @@ -1,113 +1,4 @@ -class ChromeScreenShare -{ - constructor() - { - this._stream = null; - } - - start(options = { }) - { - const state = this; - - return new Promise((resolve, reject) => - { - window.addEventListener('message', _onExtensionMessage, false); - window.postMessage({ type: 'getStreamId' }, '*'); - - function _onExtensionMessage({ data }) - { - if (data.type !== 'gotStreamId') - { - return; - } - - const constraints = state._toConstraints(options, data.streamId); - - navigator.mediaDevices.getUserMedia(constraints) - .then((stream) => - { - window.removeEventListener('message', _onExtensionMessage); - - state._stream = stream; - resolve(stream); - }) - .catch((err) => - { - window.removeEventListener('message', _onExtensionMessage); - - reject(err); - }); - } - }); - } - - stop() - { - if (this._stream instanceof MediaStream === false) - { - return; - } - - this._stream.getTracks().forEach((track) => track.stop()); - this._stream = null; - } - - isScreenShareAvailable() - { - if ('__multipartyMeetingScreenShareExtensionAvailable__' in window) - { - return true; - } - - return false; - } - - needExtension() - { - if ('__multipartyMeetingScreenShareExtensionAvailable__' in window) - { - return false; - } - - return true; - } - - _toConstraints(options, streamId) - { - const constraints = { - video : { - mandatory : { - chromeMediaSource : 'desktop', - chromeMediaSourceId : streamId - }, - optional : [ { - googTemporalLayeredScreencast : true - } ] - }, - audio : false - }; - - if (isFinite(options.width)) - { - constraints.video.mandatory.maxWidth = options.width; - constraints.video.mandatory.minWidth = options.width; - } - if (isFinite(options.height)) - { - constraints.video.mandatory.maxHeight = options.height; - constraints.video.mandatory.minHeight = options.height; - } - if (isFinite(options.frameRate)) - { - constraints.video.mandatory.maxFrameRate = options.frameRate; - constraints.video.mandatory.minFrameRate = options.frameRate; - } - - return constraints; - } -} - -class Chrome72ScreenShare +class DisplayMediaScreenShare { constructor() { @@ -143,11 +34,6 @@ class Chrome72ScreenShare return true; } - needExtension() - { - return false; - } - _toConstraints() { const constraints = { @@ -194,11 +80,6 @@ class FirefoxScreenShare return true; } - needExtension() - { - return false; - } - _toConstraints(options) { const constraints = { @@ -238,119 +119,12 @@ class FirefoxScreenShare } } -class Firefox66ScreenShare -{ - constructor() - { - this._stream = null; - } - - start(options = {}) - { - const constraints = this._toConstraints(options); - - return navigator.mediaDevices.getDisplayMedia(constraints) - .then((stream) => - { - this._stream = stream; - - return Promise.resolve(stream); - }); - } - - stop() - { - if (this._stream instanceof MediaStream === false) - { - return; - } - - this._stream.getTracks().forEach((track) => track.stop()); - this._stream = null; - } - - isScreenShareAvailable() - { - return true; - } - - needExtension() - { - return false; - } - - _toConstraints() - { - const constraints = { - video : true - }; - - return constraints; - } -} - -class EdgeScreenShare -{ - constructor() - { - this._stream = null; - } - - start(options = {}) - { - const constraints = this._toConstraints(options); - - return navigator.getDisplayMedia(constraints) - .then((stream) => - { - this._stream = stream; - - return Promise.resolve(stream); - }); - } - - stop() - { - if (this._stream instanceof MediaStream === false) - { - return; - } - - this._stream.getTracks().forEach((track) => track.stop()); - this._stream = null; - } - - isScreenShareAvailable() - { - return true; - } - - needExtension() - { - return false; - } - - _toConstraints() - { - const constraints = { - video : true - }; - - return constraints; - } -} - class DefaultScreenShare { isScreenShareAvailable() { return false; } - - needExtension() - { - return false; - } } export default class ScreenShare @@ -364,18 +138,15 @@ export default class ScreenShare if (device.version < 66.0) return new FirefoxScreenShare(); else - return new Firefox66ScreenShare(); + return new DisplayMediaScreenShare(); } case 'chrome': { - if (device.version < 72.0) - return new ChromeScreenShare(); - else - return new Chrome72ScreenShare(); + return new DisplayMediaScreenShare(); } case 'msedge': { - return new EdgeScreenShare(); + return new DisplayMediaScreenShare(); } default: { diff --git a/app/src/actions/stateActions.js b/app/src/actions/stateActions.js index 26d0baf..98f6fda 100644 --- a/app/src/actions/stateActions.js +++ b/app/src/actions/stateActions.js @@ -69,21 +69,12 @@ export const setMediaCapabilities = ({ canSendMic, canSendWebcam, canShareScreen, - needExtension, canShareFiles }) => { return { type : 'SET_MEDIA_CAPABILITIES', - payload : { canSendMic, canSendWebcam, canShareScreen, needExtension, canShareFiles } - }; -}; - -export const setScreenCapabilities = ({ canShareScreen, needExtension }) => -{ - return { - type : 'SET_SCREEN_CAPABILITIES', - payload : { canShareScreen, needExtension } + payload : { canSendMic, canSendWebcam, canShareScreen, canShareFiles } }; }; diff --git a/app/src/components/Controls/Sidebar.js b/app/src/components/Controls/Sidebar.js index cc9fe86..fbb11db 100644 --- a/app/src/components/Controls/Sidebar.js +++ b/app/src/components/Controls/Sidebar.js @@ -119,12 +119,7 @@ const Sidebar = (props) => let screenTip; - if (me.needExtension) - { - screenState = 'need-extension'; - screenTip = 'Install screen sharing extension'; - } - else if (!me.canShareScreen) + if (!me.canShareScreen) { screenState = 'unsupported'; screenTip = 'Screen sharing not supported'; diff --git a/app/src/reducers/me.js b/app/src/reducers/me.js index 948988f..8f0969b 100644 --- a/app/src/reducers/me.js +++ b/app/src/reducers/me.js @@ -5,7 +5,6 @@ const initialState = canSendMic : false, canSendWebcam : false, canShareScreen : false, - needExtension : false, canShareFiles : false, audioDevices : null, webcamDevices : null, @@ -50,7 +49,6 @@ const me = (state = initialState, action) => canSendMic, canSendWebcam, canShareScreen, - needExtension, canShareFiles } = action.payload; @@ -59,18 +57,10 @@ const me = (state = initialState, action) => canSendMic, canSendWebcam, canShareScreen, - needExtension, canShareFiles }; } - case 'SET_SCREEN_CAPABILITIES': - { - const { canShareScreen, needExtension } = action.payload; - - return { ...state, canShareScreen, needExtension }; - } - case 'SET_AUDIO_DEVICES': { const { devices } = action.payload; diff --git a/server/package.json b/server/package.json index 1762e0c..4269b56 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "multiparty-meeting-server", - "version": "3.0.0", + "version": "2.1.0", "private": true, "description": "multiparty meeting server", "author": "Håvar Aambø Fosstveit ",