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
* 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.
* Install and setup haproxy

View File

@ -2,7 +2,7 @@
## 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)
We implemented LTI interface version 1.0/1.1
@ -57,5 +57,5 @@ Open fully the settings **Click on show more!!**
## 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)

View File

@ -23,7 +23,7 @@ If you want the ansible approach, you can find ansible role [here](https://githu
## Manual installation
* 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).
```bash
@ -76,7 +76,7 @@ $ npm install
$ cd server
$ 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`
## Deploy it in a server
@ -102,7 +102,7 @@ $ systemctl enable multiparty-meeting
## Ports and firewall
* 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`)
## 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
* 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

View File

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

View File

@ -151,7 +151,7 @@ export default class RoomClient
// Whether we should produce.
this._produce = produce;
// Wheter we force TCP
// Whether we force TCP
this._forceTcp = forceTcp;
// Use displayName
@ -282,7 +282,7 @@ export default class RoomClient
_startKeyListener()
{
// Add keypress event listner on document
// Add keydown event listener on document
document.addEventListener('keydown', (event) =>
{
if (event.repeat) return;
@ -626,7 +626,7 @@ export default class RoomClient
type : 'error',
text : intl.formatMessage({
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:
// 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
// minimize component renderings.
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];
if (track)
@ -1156,7 +1157,6 @@ export default class RoomClient
});
}
store.dispatch(
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:
// 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
// minimize component renderings.
let volume = Math.round(Math.pow(10, dBs / 85) * 10);
@ -2628,7 +2628,7 @@ export default class RoomClient
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._mediasoupDevice.canProduce('audio'))
@ -2645,7 +2645,7 @@ export default class RoomClient
store.dispatch(roomActions.setRoomState('connected'));
// Clean all the existing notifcations.
// Clean all the existing notifications.
store.dispatch(notificationActions.removeAllNotifications());
this.getServerHistory();
@ -2834,7 +2834,7 @@ export default class RoomClient
const stream = await navigator.mediaDevices.getUserMedia(
{
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:
// 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
// minimize component renderings.
let volume = Math.round(Math.pow(10, dBs / 85) * 10);
@ -2947,7 +2947,7 @@ export default class RoomClient
type : 'error',
text : intl.formatMessage({
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',
text : intl.formatMessage({
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 :
{
deviceId : { exact: deviceId },
deviceId : { ideal: deviceId },
...VIDEO_CONSTRAINS[resolution]
}
});
@ -3287,7 +3287,7 @@ export default class RoomClient
type : 'error',
text : intl.formatMessage({
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';
describe('new RoomClient() without paramaters throws Error', () =>
describe('new RoomClient() without parameters throws Error', () =>
{
test('Matches the snapshot', () =>
{

View File

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

View File

@ -82,7 +82,7 @@ export const spotlightSortedPeersSelector = createSelector(
spotlightsSelector,
peersValueSelector,
(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(
@ -94,7 +94,7 @@ export const passivePeersSelector = createSelector(
peersValueSelector,
spotlightsSelector,
(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(

View File

@ -44,7 +44,7 @@ const lobbyPeers = (state = {}, action) =>
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;
}

View File

@ -6,7 +6,7 @@
"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.consentUnderstand": "I understand",
"room.consentUnderstand": "Razumijem",
"room.joined": "Prijavljeni ste u sobu",
"room.cantJoin": "Prijava u sobu nije moguća",
"room.youLocked": "Zaključali ste sobu",
@ -15,10 +15,10 @@
"room.cantUnLock": "Otključavanje sobe nije moguće",
"room.locked": "Soba je sada zaključana",
"room.unlocked": "Soba je sada otključana",
"room.newLobbyPeer": "U predvorju je novi učesnik",
"room.lobbyPeerLeft": "Učesnik je napustio predvorje",
"room.lobbyPeerChangedDisplayName": "Učesnik u predvorju je promijenio ime u {displayName}",
"room.lobbyPeerChangedPicture": "Učesnik u predvorju je promijenio sliku",
"room.newLobbyPeer": "Novi sudionik čeka u predvorju",
"room.lobbyPeerLeft": "Sudionik je napustio predvorje",
"room.lobbyPeerChangedDisplayName": "Sudionik u predvorju je promijenio ime u {displayName}",
"room.lobbyPeerChangedPicture": "Sudionik u predvorju je promijenio sliku",
"room.setAccessCode": "Obnovljena pristupna šifra za sobu",
"room.accessCodeOn": "Pristupna šifra sobe je aktivna",
"room.accessCodeOff":"Pristupna šifra sobe je neaktivna",
@ -42,19 +42,19 @@
"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.lobbyAdministration":"Upravljanje predvorjem",
"room.peersInLobby":"Učesnici u predvorju",
"room.peersInLobby":"Sudionici u predvorju",
"room.lobbyEmpty": "Trenutno nema nikoga u predvorju",
"room.hiddenPeers": "{hiddenPeersCount, plural, one {participant} other {participants}}",
"room.me": "Ja",
"room.spotlights": "Učesnici u fokusu",
"room.passive": "Pasivni učesnici",
"room.spotlights": "Sudionici u fokusu",
"room.passive": "Pasivni sudionici",
"room.videoPaused": "Video pauziran",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"room.speechUnsupported": null,
"room.muteAll": "Utišaj sve",
"room.stopAllVideo": "Ugasi sve kamere",
"room.closeMeeting": "Završi sastanak",
"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.logout": "Odjava",
@ -66,7 +66,7 @@
"tooltip.lobby": "Prikaži predvorje",
"tooltip.settings": "Prikaži postavke",
"tooltip.participants": "Pokažite sudionike",
"tooltip.kickParticipant": null,
"tooltip.kickParticipant": "Izbaci sudionika",
"label.roomName": "Naziv sobe",
"label.chooseRoomButton": "Nastavi",
@ -78,7 +78,7 @@
"label.chatInput":"Uđi u razgovor porukama",
"label.chat": "Razgovor",
"label.filesharing": "Dijeljenje datoteka",
"label.participants": "Učesnici",
"label.participants": "Sudionici",
"label.shareFile": "Dijeli datoteku",
"label.fileSharingUnsupported": "Dijeljenje datoteka nije podržano",
"label.unknown": "Nepoznato",

View File

@ -42,7 +42,7 @@ fi
if [ "$1" = "config" ]; then
echo 'graph_title MM stats'
#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_info This graph shows the mm stats.'
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
turnAPIKey : 'examplekey',
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
backupTurnServers : [
{
@ -59,7 +66,7 @@ module.exports =
key : `${__dirname}/../certs/mediasoup-demo.localhost.key.pem`
},
// 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',
// Listening port for https server.
listeningPort : 443,

View File

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

View File

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