Merge remote-tracking branch 'upstream/develop' into mm-exporter

auto_join_3.3
Christian Hörtnagl 2020-04-20 12:12:45 +02:00
commit c0251ad0ce
14 changed files with 61 additions and 54 deletions

View File

@ -83,7 +83,7 @@ trustProxy : ['192.0.2.5'],
## Deploy HA proxy ## Deploy HA proxy
* Configure cerificate / letsencrypt for `meet.example.com` * Configure certificate / letsencrypt for `meet.example.com`
* In this example we put a complete chain and private key in /root/certificate.pem. * In this example we put a complete chain and private key in /root/certificate.pem.
* Install and setup haproxy * Install and setup haproxy

View File

@ -2,7 +2,7 @@
## LTI ## LTI
Read more about IMS Global defined interface for tools like our VideoConference system integration with Learning Managment Systems(LMS) (e.g. moodle). Read more about IMS Global defined interface for tools like our VideoConference system integration with Learning Management Systems(LMS) (e.g. moodle).
See: [IMS Global Learning Tool Interoperability](https://www.imsglobal.org/activity/learning-tools-interoperability) See: [IMS Global Learning Tool Interoperability](https://www.imsglobal.org/activity/learning-tools-interoperability)
We implemented LTI interface version 1.0/1.1 We implemented LTI interface version 1.0/1.1
@ -57,5 +57,5 @@ Open fully the settings **Click on show more!!**
## moodle plugin ## moodle plugin
Alternativly you can use multipartymeeting moodle plugin: Alternatively you can use multipartymeeting moodle plugin:
[https://github.com/misi/moodle-mod_multipartymeeting](https://github.com/misi/moodle-mod_multipartymeeting) [https://github.com/misi/moodle-mod_multipartymeeting](https://github.com/misi/moodle-mod_multipartymeeting)

View File

@ -23,7 +23,7 @@ If you want the ansible approach, you can find ansible role [here](https://githu
## Manual installation ## Manual installation
* Prerequisites: * Prerequisites:
Currently multiparty-meeting will only run on nodejs v10.* Currently multiparty-meeting will only run on nodejs v13.x
To install see here [here](https://github.com/nodesource/distributions/blob/master/README.md#debinstall). To install see here [here](https://github.com/nodesource/distributions/blob/master/README.md#debinstall).
```bash ```bash
@ -76,7 +76,7 @@ $ npm install
$ cd server $ cd server
$ npm start $ npm start
``` ```
* Note: Do not run the server as root. If you need to use port 80/443 make a iptables-mapping for that or use systemd configuration for that (see futher down this doc). * Note: Do not run the server as root. If you need to use port 80/443 make a iptables-mapping for that or use systemd configuration for that (see further down this doc).
* Test your service in a webRTC enabled browser: `https://yourDomainOrIPAdress:3443/roomname` * Test your service in a webRTC enabled browser: `https://yourDomainOrIPAdress:3443/roomname`
## Deploy it in a server ## Deploy it in a server
@ -102,7 +102,7 @@ $ systemctl enable multiparty-meeting
## Ports and firewall ## Ports and firewall
* 3443/tcp (default https webserver and signaling - adjustable in `server/config.js`) * 3443/tcp (default https webserver and signaling - adjustable in `server/config.js`)
* 4443/tcp (default `npm start` port for developing with live browser reload, not needed in production enviroments - adjustable in app/package.json) * 4443/tcp (default `npm start` port for developing with live browser reload, not needed in production environments - adjustable in app/package.json)
* 40000-49999/udp/tcp (media ports - adjustable in `server/config.js`) * 40000-49999/udp/tcp (media ports - adjustable in `server/config.js`)
## Load balanced installation ## Load balanced installation
@ -113,7 +113,7 @@ To integrate with an LMS (e.g. Moodle), have a look at [LTI](LTI/LTI.md).
## TURN configuration ## TURN configuration
* You need an addtional [TURN](https://github.com/coturn/coturn)-server for clients located behind restrictive firewalls! Add your server and credentials to `app/config.js` * You need an additional [TURN](https://github.com/coturn/coturn)-server for clients located behind restrictive firewalls! Add your server and credentials to `app/config.js`
## Authors ## Authors

View File

@ -29,7 +29,7 @@
"react-intl": "^3.4.0", "react-intl": "^3.4.0",
"react-redux": "^7.1.1", "react-redux": "^7.1.1",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"react-scripts": "3.0.1", "react-scripts": "3.4.1",
"react-wakelock-react16": "0.0.7", "react-wakelock-react16": "0.0.7",
"redux": "^4.0.4", "redux": "^4.0.4",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",

View File

@ -151,7 +151,7 @@ export default class RoomClient
// Whether we should produce. // Whether we should produce.
this._produce = produce; this._produce = produce;
// Wheter we force TCP // Whether we force TCP
this._forceTcp = forceTcp; this._forceTcp = forceTcp;
// Use displayName // Use displayName
@ -282,7 +282,7 @@ export default class RoomClient
_startKeyListener() _startKeyListener()
{ {
// Add keypress event listner on document // Add keydown event listener on document
document.addEventListener('keydown', (event) => document.addEventListener('keydown', (event) =>
{ {
if (event.repeat) return; if (event.repeat) return;
@ -626,7 +626,7 @@ export default class RoomClient
type : 'error', type : 'error',
text : intl.formatMessage({ text : intl.formatMessage({
id : 'room.changeDisplayNameError', id : 'room.changeDisplayNameError',
defaultMessage : 'An error occured while changing your display name' defaultMessage : 'An error occurred while changing your display name'
}) })
})); }));
} }
@ -1065,7 +1065,7 @@ export default class RoomClient
{ {
// The exact formula to convert from dBs (-100..0) to linear (0..1) is: // The exact formula to convert from dBs (-100..0) to linear (0..1) is:
// Math.pow(10, dBs / 20) // Math.pow(10, dBs / 20)
// However it does not produce a visually useful output, so let exagerate // However it does not produce a visually useful output, so let exaggerate
// it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to // it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to
// minimize component renderings. // minimize component renderings.
let volume = Math.round(Math.pow(10, dBs / 85) * 10); let volume = Math.round(Math.pow(10, dBs / 85) * 10);
@ -1136,7 +1136,8 @@ export default class RoomClient
} }
}); });
if(stream){ if (stream)
{
const track = stream.getVideoTracks()[0]; const track = stream.getVideoTracks()[0];
if (track) if (track)
@ -1156,7 +1157,6 @@ export default class RoomClient
}); });
} }
store.dispatch( store.dispatch(
producerActions.setProducerTrack(this._webcamProducer.id, track)); producerActions.setProducerTrack(this._webcamProducer.id, track));
} }
@ -1840,7 +1840,7 @@ export default class RoomClient
{ {
// The exact formula to convert from dBs (-100..0) to linear (0..1) is: // The exact formula to convert from dBs (-100..0) to linear (0..1) is:
// Math.pow(10, dBs / 20) // Math.pow(10, dBs / 20)
// However it does not produce a visually useful output, so let exagerate // However it does not produce a visually useful output, so let exaggerate
// it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to // it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to
// minimize component renderings. // minimize component renderings.
let volume = Math.round(Math.pow(10, dBs / 85) * 10); let volume = Math.round(Math.pow(10, dBs / 85) * 10);
@ -2628,7 +2628,7 @@ export default class RoomClient
this.updateSpotlights(spotlights); this.updateSpotlights(spotlights);
}); });
// Don't produce if explicitely requested to not to do it. // Don't produce if explicitly requested to not to do it.
if (this._produce) if (this._produce)
{ {
if (this._mediasoupDevice.canProduce('audio')) if (this._mediasoupDevice.canProduce('audio'))
@ -2645,7 +2645,7 @@ export default class RoomClient
store.dispatch(roomActions.setRoomState('connected')); store.dispatch(roomActions.setRoomState('connected'));
// Clean all the existing notifcations. // Clean all the existing notifications.
store.dispatch(notificationActions.removeAllNotifications()); store.dispatch(notificationActions.removeAllNotifications());
this.getServerHistory(); this.getServerHistory();
@ -2834,7 +2834,7 @@ export default class RoomClient
const stream = await navigator.mediaDevices.getUserMedia( const stream = await navigator.mediaDevices.getUserMedia(
{ {
audio : { audio : {
deviceId : { exact: deviceId } deviceId : { ideal: deviceId }
} }
} }
); );
@ -2912,7 +2912,7 @@ export default class RoomClient
{ {
// The exact formula to convert from dBs (-100..0) to linear (0..1) is: // The exact formula to convert from dBs (-100..0) to linear (0..1) is:
// Math.pow(10, dBs / 20) // Math.pow(10, dBs / 20)
// However it does not produce a visually useful output, so let exagerate // However it does not produce a visually useful output, so let exaggerate
// it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to // it a bit. Also, let convert it from 0..1 to 0..10 and avoid value 1 to
// minimize component renderings. // minimize component renderings.
let volume = Math.round(Math.pow(10, dBs / 85) * 10); let volume = Math.round(Math.pow(10, dBs / 85) * 10);
@ -2947,7 +2947,7 @@ export default class RoomClient
type : 'error', type : 'error',
text : intl.formatMessage({ text : intl.formatMessage({
id : 'devices.microphoneError', id : 'devices.microphoneError',
defaultMessage : 'An error occured while accessing your microphone' defaultMessage : 'An error occurred while accessing your microphone'
}) })
})); }));
@ -3114,7 +3114,7 @@ export default class RoomClient
type : 'error', type : 'error',
text : intl.formatMessage({ text : intl.formatMessage({
id : 'devices.screenSharingError', id : 'devices.screenSharingError',
defaultMessage : 'An error occured while accessing your screen' defaultMessage : 'An error occurred while accessing your screen'
}) })
})); }));
@ -3192,7 +3192,7 @@ export default class RoomClient
{ {
video : video :
{ {
deviceId : { exact: deviceId }, deviceId : { ideal: deviceId },
...VIDEO_CONSTRAINS[resolution] ...VIDEO_CONSTRAINS[resolution]
} }
}); });
@ -3287,7 +3287,7 @@ export default class RoomClient
type : 'error', type : 'error',
text : intl.formatMessage({ text : intl.formatMessage({
id : 'devices.cameraError', id : 'devices.cameraError',
defaultMessage : 'An error occured while accessing your camera' defaultMessage : 'An error occurred while accessing your camera'
}) })
})); }));

View File

@ -1,6 +1,6 @@
import RoomClient from '../RoomClient'; import RoomClient from '../RoomClient';
describe('new RoomClient() without paramaters throws Error', () => describe('new RoomClient() without parameters throws Error', () =>
{ {
test('Matches the snapshot', () => test('Matches the snapshot', () =>
{ {

View File

@ -14,7 +14,7 @@ const App = (props) =>
room room
} = props; } = props;
const { id } = useParams(); const id = useParams().id.toLowerCase();
useEffect(() => useEffect(() =>
{ {

View File

@ -82,7 +82,7 @@ export const spotlightSortedPeersSelector = createSelector(
spotlightsSelector, spotlightsSelector,
peersValueSelector, peersValueSelector,
(spotlights, peers) => peers.filter((peer) => spotlights.includes(peer.id)) (spotlights, peers) => peers.filter((peer) => spotlights.includes(peer.id))
.sort((a, b) => a.displayName.localeCompare(b.displayName)) .sort((a, b) => String(a.displayName || '').localeCompare(String(b.displayName || '')))
); );
export const peersLengthSelector = createSelector( export const peersLengthSelector = createSelector(
@ -94,7 +94,7 @@ export const passivePeersSelector = createSelector(
peersValueSelector, peersValueSelector,
spotlightsSelector, spotlightsSelector,
(peers, spotlights) => peers.filter((peer) => !spotlights.includes(peer.id)) (peers, spotlights) => peers.filter((peer) => !spotlights.includes(peer.id))
.sort((a, b) => a.displayName.localeCompare(b.displayName)) .sort((a, b) => String(a.displayName || '').localeCompare(String(b.displayName || '')))
); );
export const videoBoxesSelector = createSelector( export const videoBoxesSelector = createSelector(

View File

@ -44,7 +44,7 @@ const lobbyPeers = (state = {}, action) =>
if (!oldLobbyPeer) if (!oldLobbyPeer)
{ {
// Tried to update non-existant lobbyPeer. Has probably been promoted, or left. // Tried to update non-existent lobbyPeer. Has probably been promoted, or left.
return state; return state;
} }

View File

@ -6,7 +6,7 @@
"room.chooseRoom": "Izaberite ime sobe u koju se želite prijaviti", "room.chooseRoom": "Izaberite ime sobe u koju se želite prijaviti",
"room.cookieConsent": "Ova stranica koristi kolačiće radi poboljšanja korisničkog iskustva", "room.cookieConsent": "Ova stranica koristi kolačiće radi poboljšanja korisničkog iskustva",
"room.consentUnderstand": "I understand", "room.consentUnderstand": "Razumijem",
"room.joined": "Prijavljeni ste u sobu", "room.joined": "Prijavljeni ste u sobu",
"room.cantJoin": "Prijava u sobu nije moguća", "room.cantJoin": "Prijava u sobu nije moguća",
"room.youLocked": "Zaključali ste sobu", "room.youLocked": "Zaključali ste sobu",
@ -15,10 +15,10 @@
"room.cantUnLock": "Otključavanje sobe nije moguće", "room.cantUnLock": "Otključavanje sobe nije moguće",
"room.locked": "Soba je sada zaključana", "room.locked": "Soba je sada zaključana",
"room.unlocked": "Soba je sada otključana", "room.unlocked": "Soba je sada otključana",
"room.newLobbyPeer": "U predvorju je novi učesnik", "room.newLobbyPeer": "Novi sudionik čeka u predvorju",
"room.lobbyPeerLeft": "Učesnik je napustio predvorje", "room.lobbyPeerLeft": "Sudionik je napustio predvorje",
"room.lobbyPeerChangedDisplayName": "Učesnik u predvorju je promijenio ime u {displayName}", "room.lobbyPeerChangedDisplayName": "Sudionik u predvorju je promijenio ime u {displayName}",
"room.lobbyPeerChangedPicture": "Učesnik u predvorju je promijenio sliku", "room.lobbyPeerChangedPicture": "Sudionik u predvorju je promijenio sliku",
"room.setAccessCode": "Obnovljena pristupna šifra za sobu", "room.setAccessCode": "Obnovljena pristupna šifra za sobu",
"room.accessCodeOn": "Pristupna šifra sobe je aktivna", "room.accessCodeOn": "Pristupna šifra sobe je aktivna",
"room.accessCodeOff":"Pristupna šifra sobe je neaktivna", "room.accessCodeOff":"Pristupna šifra sobe je neaktivna",
@ -40,21 +40,21 @@
"room.audioVideo": "Zvuk i slika", "room.audioVideo": "Zvuk i slika",
"room.youAreReady": "Spremni ste", "room.youAreReady": "Spremni ste",
"room.emptyRequireLogin": "Soba je trenutno prazna! Prijavite se za pokretanje sastanka, ili sačekajte organizatora" , "room.emptyRequireLogin": "Soba je trenutno prazna! Prijavite se za pokretanje sastanka, ili sačekajte organizatora" ,
"room.locketWait": "Soba je zaključana - pričekajte odobrenje ...", "room.locketWait": "Soba je zaključana - pričekajte odobrenje...",
"room.lobbyAdministration":"Upravljanje predvorjem", "room.lobbyAdministration":"Upravljanje predvorjem",
"room.peersInLobby":"Učesnici u predvorju", "room.peersInLobby":"Sudionici u predvorju",
"room.lobbyEmpty": "Trenutno nema nikoga u predvorju", "room.lobbyEmpty": "Trenutno nema nikoga u predvorju",
"room.hiddenPeers": "{hiddenPeersCount, plural, one {participant} other {participants}}", "room.hiddenPeers": "{hiddenPeersCount, plural, one {participant} other {participants}}",
"room.me": "Ja", "room.me": "Ja",
"room.spotlights": "Učesnici u fokusu", "room.spotlights": "Sudionici u fokusu",
"room.passive": "Pasivni učesnici", "room.passive": "Pasivni sudionici",
"room.videoPaused": "Video pauziran", "room.videoPaused": "Video pauziran",
"room.muteAll": null, "room.muteAll": "Utišaj sve",
"room.stopAllVideo": null, "room.stopAllVideo": "Ugasi sve kamere",
"room.closeMeeting": null, "room.closeMeeting": "Završi sastanak",
"room.speechUnsupported": null, "room.speechUnsupported": "Vaš preglednik ne podržava prepoznavanje govora",
"me.mutedPTT": null, "me.mutedPTT": "Utišani ste, pritisnite i držite SPACE tipku za razgovor",
"tooltip.login": "Prijava", "tooltip.login": "Prijava",
"tooltip.logout": "Odjava", "tooltip.logout": "Odjava",
@ -66,7 +66,7 @@
"tooltip.lobby": "Prikaži predvorje", "tooltip.lobby": "Prikaži predvorje",
"tooltip.settings": "Prikaži postavke", "tooltip.settings": "Prikaži postavke",
"tooltip.participants": "Pokažite sudionike", "tooltip.participants": "Pokažite sudionike",
"tooltip.kickParticipant": null, "tooltip.kickParticipant": "Izbaci sudionika",
"label.roomName": "Naziv sobe", "label.roomName": "Naziv sobe",
"label.chooseRoomButton": "Nastavi", "label.chooseRoomButton": "Nastavi",
@ -78,7 +78,7 @@
"label.chatInput":"Uđi u razgovor porukama", "label.chatInput":"Uđi u razgovor porukama",
"label.chat": "Razgovor", "label.chat": "Razgovor",
"label.filesharing": "Dijeljenje datoteka", "label.filesharing": "Dijeljenje datoteka",
"label.participants": "Učesnici", "label.participants": "Sudionici",
"label.shareFile": "Dijeli datoteku", "label.shareFile": "Dijeli datoteku",
"label.fileSharingUnsupported": "Dijeljenje datoteka nije podržano", "label.fileSharingUnsupported": "Dijeljenje datoteka nije podržano",
"label.unknown": "Nepoznato", "label.unknown": "Nepoznato",

View File

@ -42,7 +42,7 @@ fi
if [ "$1" = "config" ]; then if [ "$1" = "config" ]; then
echo 'graph_title MM stats' echo 'graph_title MM stats'
#echo 'graph_args --base 1000 -l 0' #echo 'graph_args --base 1000 -l 0'
echo 'graph_vlabel Actual Seesion Count' echo 'graph_vlabel Actual Session Count'
echo 'graph_category other' echo 'graph_category other'
echo 'graph_info This graph shows the mm stats.' echo 'graph_info This graph shows the mm stats.'
echo 'rooms.label rooms' echo 'rooms.label rooms'

View File

@ -38,6 +38,13 @@ module.exports =
// URI and key for requesting geoip-based TURN server closest to the client // URI and key for requesting geoip-based TURN server closest to the client
turnAPIKey : 'examplekey', turnAPIKey : 'examplekey',
turnAPIURI : 'https://example.com/api/turn', turnAPIURI : 'https://example.com/api/turn',
turnAPIparams : {
'uri_schema' : 'turn',
'transport' : 'tcp',
'ip_ver' : 'ipv4',
'servercount' : '2'
},
// Backup turnservers if REST fails or is not configured // Backup turnservers if REST fails or is not configured
backupTurnServers : [ backupTurnServers : [
{ {
@ -59,7 +66,7 @@ module.exports =
key : `${__dirname}/../certs/mediasoup-demo.localhost.key.pem` key : `${__dirname}/../certs/mediasoup-demo.localhost.key.pem`
}, },
// listening Host or IP // listening Host or IP
// If ommitted listens on every IP. ("0.0.0.0" and "::") // If omitted listens on every IP. ("0.0.0.0" and "::")
//listeningHost: 'localhost', //listeningHost: 'localhost',
// Listening port for https server. // Listening port for https server.
listeningPort : 443, listeningPort : 443,

View File

@ -383,10 +383,7 @@ class Room extends EventEmitter
config.turnAPIURI, config.turnAPIURI,
{ {
params : { params : {
'uri_schema' : 'turn', ...config.turnAPIparams,
'transport' : 'tcp',
'ip_ver' : 'ipv4',
'servercount' : '2',
'api_key' : config.turnAPIKey, 'api_key' : config.turnAPIKey,
'ip' : peer.socket.request.connection.remoteAddress 'ip' : peer.socket.request.connection.remoteAddress
} }

View File

@ -203,7 +203,7 @@ function setupLTI(ltiConfig)
if (lti.user_id && lti.custom_room) if (lti.user_id && lti.custom_room)
{ {
user.id = lti.user_id; user.id = lti.user_id;
user._lti = lti; user._userinfo = { "lti" : lti };
} }
if (lti.custom_room) if (lti.custom_room)
@ -259,12 +259,15 @@ function setupOIDC(oidcIssuer)
{ client: oidcClient, params, passReqToCallback, usePKCE }, { client: oidcClient, params, passReqToCallback, usePKCE },
(tokenset, userinfo, done) => (tokenset, userinfo, done) =>
{ {
if (userinfo && tokenset) {
userinfo._tokenset_claims = tokenset.claims();
}
const user = const user =
{ {
id : tokenset.claims.sub, id : tokenset.claims.sub,
provider : tokenset.claims.iss, provider : tokenset.claims.iss,
_userinfo : userinfo, _userinfo : userinfo
_claims : tokenset.claims
}; };
return done(null, user); return done(null, user);