Merge branch 'feat-lobby' of https://github.com/havfo/multiparty-meeting into feat-lobby
commit
447e674876
|
|
@ -610,61 +610,44 @@ export default class RoomClient
|
||||||
const {
|
const {
|
||||||
chatHistory,
|
chatHistory,
|
||||||
fileHistory,
|
fileHistory,
|
||||||
lastN,
|
lastNHistory,
|
||||||
locked,
|
locked,
|
||||||
lobbyPeers,
|
lobbyPeers,
|
||||||
accessCode
|
accessCode
|
||||||
} = await this.sendRequest('serverHistory');
|
} = await this.sendRequest('serverHistory');
|
||||||
|
|
||||||
if (chatHistory.length > 0)
|
(chatHistory.length > 0) && store.dispatch(
|
||||||
{
|
|
||||||
logger.debug('Got chat history');
|
|
||||||
store.dispatch(
|
|
||||||
stateActions.addChatHistory(chatHistory));
|
stateActions.addChatHistory(chatHistory));
|
||||||
}
|
|
||||||
|
|
||||||
if (fileHistory.length > 0)
|
(fileHistory.length > 0) && store.dispatch(
|
||||||
|
stateActions.addFileHistory(fileHistory));
|
||||||
|
|
||||||
|
if (lastNHistory.length > 0)
|
||||||
{
|
{
|
||||||
logger.debug('Got files history');
|
logger.debug('Got lastNHistory');
|
||||||
|
|
||||||
store.dispatch(stateActions.addFileHistory(fileHistory));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastN.length > 0)
|
|
||||||
{
|
|
||||||
logger.debug('Got lastN');
|
|
||||||
|
|
||||||
// Remove our self from list
|
// Remove our self from list
|
||||||
const index = lastN.indexOf(this._peerId);
|
const index = lastNHistory.indexOf(this._peerId);
|
||||||
|
|
||||||
lastN.splice(index, 1);
|
lastNHistory.splice(index, 1);
|
||||||
|
|
||||||
this._spotlights.addSpeakerList(lastN);
|
this._spotlights.addSpeakerList(lastNHistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
locked ?
|
locked ?
|
||||||
store.dispatch(stateActions.setRoomLocked()) :
|
store.dispatch(stateActions.setRoomLocked()) :
|
||||||
store.dispatch(stateActions.setRoomUnLocked());
|
store.dispatch(stateActions.setRoomUnLocked());
|
||||||
|
|
||||||
if (lobbyPeers.length > 0)
|
(lobbyPeers.length > 0) && lobbyPeers.forEach((peer) =>
|
||||||
{
|
|
||||||
logger.debug('Got lobby peers');
|
|
||||||
|
|
||||||
lobbyPeers.forEach((peer) =>
|
|
||||||
{
|
{
|
||||||
store.dispatch(
|
store.dispatch(
|
||||||
stateActions.addLobbyPeer(peer.peerId));
|
stateActions.addLobbyPeer(peer.peerId));
|
||||||
store.dispatch(
|
store.dispatch(
|
||||||
stateActions.setLobbyPeerDisplayName(peer.displayName));
|
stateActions.setLobbyPeerDisplayName(peer.displayName));
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (accessCode != null)
|
(accessCode != null) && store.dispatch(
|
||||||
{
|
stateActions.setAccessCode(accessCode));
|
||||||
logger.debug('Got accessCode');
|
|
||||||
|
|
||||||
store.dispatch(stateActions.setAccessCode(accessCode))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (error)
|
catch (error)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React from 'react';
|
import React, { useState } from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { withStyles } from '@material-ui/core/styles';
|
import { withStyles } from '@material-ui/core/styles';
|
||||||
import { withRoomContext } from '../RoomContext';
|
import { withRoomContext } from '../RoomContext';
|
||||||
|
|
@ -58,6 +58,28 @@ const JoinDialog = ({
|
||||||
classes
|
classes
|
||||||
}) =>
|
}) =>
|
||||||
{
|
{
|
||||||
|
const [ localDisplayName, setLocalDisplayName ] = useState(displayName);
|
||||||
|
|
||||||
|
const handleKeyDown = (event) =>
|
||||||
|
{
|
||||||
|
const { key } = event;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'Enter':
|
||||||
|
case 'Escape':
|
||||||
|
{
|
||||||
|
if (localDisplayName !== '') // Don't allow empty displayName
|
||||||
|
changeDisplayName(localDisplayName);
|
||||||
|
else
|
||||||
|
setLocalDisplayName(displayName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes.root}>
|
<div className={classes.root}>
|
||||||
<Dialog
|
<Dialog
|
||||||
|
|
@ -69,21 +91,30 @@ const JoinDialog = ({
|
||||||
{ window.config.logo &&
|
{ window.config.logo &&
|
||||||
<img alt='Logo' className={classes.logo} src={window.config.logo} />
|
<img alt='Logo' className={classes.logo} src={window.config.logo} />
|
||||||
}
|
}
|
||||||
<Typography variant='subtitle1'>
|
<Typography variant='h2' align='center'>
|
||||||
|
Welcome
|
||||||
|
</Typography>
|
||||||
|
<Typography variant='h6'>
|
||||||
You are about to join a meeting.
|
You are about to join a meeting.
|
||||||
Set your name that others will see,
|
Set the name that others will see,
|
||||||
and chose how you want to join?
|
and choose how you want to join?
|
||||||
</Typography>
|
</Typography>
|
||||||
<TextField
|
<TextField
|
||||||
id='displayname'
|
id='displayname'
|
||||||
label='Name'
|
label='Your name'
|
||||||
className={classes.textField}
|
className={classes.textField}
|
||||||
value={displayName}
|
value={localDisplayName}
|
||||||
onChange={(event) =>
|
onChange={(event) =>
|
||||||
{
|
{
|
||||||
const { value } = event.target;
|
const { value } = event.target;
|
||||||
|
|
||||||
changeDisplayName(value);
|
setLocalDisplayName(value);
|
||||||
|
}}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
onBlur={() =>
|
||||||
|
{
|
||||||
|
if (localDisplayName !== displayName)
|
||||||
|
changeDisplayName(localDisplayName);
|
||||||
}}
|
}}
|
||||||
margin='normal'
|
margin='normal'
|
||||||
/>
|
/>
|
||||||
|
|
@ -94,6 +125,17 @@ const JoinDialog = ({
|
||||||
roomClient.join({ joinVideo: false });
|
roomClient.join({ joinVideo: false });
|
||||||
}}
|
}}
|
||||||
variant='contained'
|
variant='contained'
|
||||||
|
color='secondary'
|
||||||
|
>
|
||||||
|
Sign in
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() =>
|
||||||
|
{
|
||||||
|
roomClient.join({ joinVideo: false });
|
||||||
|
}}
|
||||||
|
variant='contained'
|
||||||
|
color='secondary'
|
||||||
>
|
>
|
||||||
Audio only
|
Audio only
|
||||||
</Button>
|
</Button>
|
||||||
|
|
@ -103,6 +145,7 @@ const JoinDialog = ({
|
||||||
roomClient.join({ joinVideo: true });
|
roomClient.join({ joinVideo: true });
|
||||||
}}
|
}}
|
||||||
variant='contained'
|
variant='contained'
|
||||||
|
color='secondary'
|
||||||
>
|
>
|
||||||
Audio and Video
|
Audio and Video
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,8 @@ export default class PeerAudio extends React.PureComponent
|
||||||
this._setTrack(audioTrack);
|
this._setTrack(audioTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps)
|
// eslint-disable-next-line camelcase
|
||||||
|
UNSAFE_componentWillReceiveProps(nextProps)
|
||||||
{
|
{
|
||||||
const { audioTrack } = nextProps;
|
const { audioTrack } = nextProps;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,8 @@ class VideoView extends React.PureComponent
|
||||||
clearInterval(this._videoResolutionTimer);
|
clearInterval(this._videoResolutionTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps)
|
// eslint-disable-next-line camelcase
|
||||||
|
UNSAFE_componentWillReceiveProps(nextProps)
|
||||||
{
|
{
|
||||||
const { videoTrack } = nextProps;
|
const { videoTrack } = nextProps;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,168 +0,0 @@
|
||||||
module.exports =
|
|
||||||
{
|
|
||||||
env:
|
|
||||||
{
|
|
||||||
browser: true,
|
|
||||||
es6: true,
|
|
||||||
node: true
|
|
||||||
},
|
|
||||||
extends:
|
|
||||||
[
|
|
||||||
'eslint:recommended'
|
|
||||||
],
|
|
||||||
settings: {},
|
|
||||||
parserOptions:
|
|
||||||
{
|
|
||||||
ecmaVersion: 6,
|
|
||||||
sourceType: 'module',
|
|
||||||
ecmaFeatures:
|
|
||||||
{
|
|
||||||
impliedStrict: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
rules:
|
|
||||||
{
|
|
||||||
'array-bracket-spacing': [ 2, 'always',
|
|
||||||
{
|
|
||||||
objectsInArrays: true,
|
|
||||||
arraysInArrays: true
|
|
||||||
}],
|
|
||||||
'arrow-parens': [ 2, 'always' ],
|
|
||||||
'arrow-spacing': 2,
|
|
||||||
'block-spacing': [ 2, 'always' ],
|
|
||||||
'brace-style': [ 2, 'allman', { allowSingleLine: true } ],
|
|
||||||
'camelcase': 2,
|
|
||||||
'comma-dangle': 2,
|
|
||||||
'comma-spacing': [ 2, { before: false, after: true } ],
|
|
||||||
'comma-style': 2,
|
|
||||||
'computed-property-spacing': 2,
|
|
||||||
'constructor-super': 2,
|
|
||||||
'func-call-spacing': 2,
|
|
||||||
'generator-star-spacing': 2,
|
|
||||||
'guard-for-in': 2,
|
|
||||||
'indent': [ 2, 'tab', { 'SwitchCase': 1 } ],
|
|
||||||
'key-spacing': [ 2,
|
|
||||||
{
|
|
||||||
singleLine:
|
|
||||||
{
|
|
||||||
beforeColon: false,
|
|
||||||
afterColon: true
|
|
||||||
},
|
|
||||||
multiLine:
|
|
||||||
{
|
|
||||||
beforeColon: true,
|
|
||||||
afterColon: true,
|
|
||||||
align: 'colon'
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
'keyword-spacing': 2,
|
|
||||||
'linebreak-style': [ 2, 'unix' ],
|
|
||||||
'lines-around-comment': [ 2,
|
|
||||||
{
|
|
||||||
allowBlockStart: true,
|
|
||||||
allowObjectStart: true,
|
|
||||||
beforeBlockComment: true,
|
|
||||||
beforeLineComment: false
|
|
||||||
}],
|
|
||||||
'max-len': [ 2, 90,
|
|
||||||
{
|
|
||||||
tabWidth: 2,
|
|
||||||
comments: 110,
|
|
||||||
ignoreUrls: true,
|
|
||||||
ignoreStrings: true,
|
|
||||||
ignoreTemplateLiterals: true,
|
|
||||||
ignoreRegExpLiterals: true
|
|
||||||
}],
|
|
||||||
'newline-after-var': 2,
|
|
||||||
'newline-before-return': 2,
|
|
||||||
'newline-per-chained-call': 2,
|
|
||||||
'no-alert': 2,
|
|
||||||
'no-caller': 2,
|
|
||||||
'no-case-declarations': 2,
|
|
||||||
'no-catch-shadow': 2,
|
|
||||||
'no-class-assign': 2,
|
|
||||||
'no-confusing-arrow': 2,
|
|
||||||
'no-console': 2,
|
|
||||||
'no-const-assign': 2,
|
|
||||||
'no-debugger': 2,
|
|
||||||
'no-dupe-args': 2,
|
|
||||||
'no-dupe-keys': 2,
|
|
||||||
'no-duplicate-case': 2,
|
|
||||||
'no-div-regex': 2,
|
|
||||||
'no-empty': [ 2, { allowEmptyCatch: true } ],
|
|
||||||
'no-empty-pattern': 2,
|
|
||||||
'no-else-return': 0,
|
|
||||||
'no-eval': 2,
|
|
||||||
'no-extend-native': 2,
|
|
||||||
'no-ex-assign': 2,
|
|
||||||
'no-extra-bind': 2,
|
|
||||||
'no-extra-boolean-cast': 2,
|
|
||||||
'no-extra-label': 2,
|
|
||||||
'no-extra-semi': 2,
|
|
||||||
'no-fallthrough': 2,
|
|
||||||
'no-func-assign': 2,
|
|
||||||
'no-global-assign': 2,
|
|
||||||
'no-implicit-coercion': 2,
|
|
||||||
'no-implicit-globals': 2,
|
|
||||||
'no-inner-declarations': 2,
|
|
||||||
'no-invalid-regexp': 2,
|
|
||||||
'no-invalid-this': 2,
|
|
||||||
'no-irregular-whitespace': 2,
|
|
||||||
'no-lonely-if': 2,
|
|
||||||
'no-mixed-operators': 2,
|
|
||||||
'no-mixed-spaces-and-tabs': 2,
|
|
||||||
'no-multi-spaces': 2,
|
|
||||||
'no-multi-str': 2,
|
|
||||||
'no-multiple-empty-lines': [ 2, { max: 1, maxEOF: 0, maxBOF: 0 } ],
|
|
||||||
'no-native-reassign': 2,
|
|
||||||
'no-negated-in-lhs': 2,
|
|
||||||
'no-new': 2,
|
|
||||||
'no-new-func': 2,
|
|
||||||
'no-new-wrappers': 2,
|
|
||||||
'no-obj-calls': 2,
|
|
||||||
'no-proto': 2,
|
|
||||||
'no-prototype-builtins': 0,
|
|
||||||
'no-redeclare': 2,
|
|
||||||
'no-regex-spaces': 2,
|
|
||||||
'no-restricted-imports': 2,
|
|
||||||
'no-return-assign': 2,
|
|
||||||
'no-self-assign': 2,
|
|
||||||
'no-self-compare': 2,
|
|
||||||
'no-sequences': 2,
|
|
||||||
'no-shadow': 2,
|
|
||||||
'no-shadow-restricted-names': 2,
|
|
||||||
'no-spaced-func': 2,
|
|
||||||
'no-sparse-arrays': 2,
|
|
||||||
'no-this-before-super': 2,
|
|
||||||
'no-throw-literal': 2,
|
|
||||||
'no-undef': 2,
|
|
||||||
'no-unexpected-multiline': 2,
|
|
||||||
'no-unmodified-loop-condition': 2,
|
|
||||||
'no-unreachable': 2,
|
|
||||||
'no-unused-vars': [ 1, { vars: 'all', args: 'after-used' }],
|
|
||||||
'no-use-before-define': [ 2, { functions: false } ],
|
|
||||||
'no-useless-call': 2,
|
|
||||||
'no-useless-computed-key': 2,
|
|
||||||
'no-useless-concat': 2,
|
|
||||||
'no-useless-rename': 2,
|
|
||||||
'no-var': 2,
|
|
||||||
'no-whitespace-before-property': 2,
|
|
||||||
'object-curly-newline': 0,
|
|
||||||
'object-curly-spacing': [ 2, 'always' ],
|
|
||||||
'object-property-newline': [ 2, { allowMultiplePropertiesPerLine: true } ],
|
|
||||||
'prefer-const': 2,
|
|
||||||
'prefer-rest-params': 2,
|
|
||||||
'prefer-spread': 2,
|
|
||||||
'prefer-template': 2,
|
|
||||||
'quotes': [ 2, 'single', { avoidEscape: true } ],
|
|
||||||
'semi': [ 2, 'always' ],
|
|
||||||
'semi-spacing': 2,
|
|
||||||
'space-before-blocks': 2,
|
|
||||||
'space-before-function-paren': [ 2, 'never' ],
|
|
||||||
'space-in-parens': [ 2, 'never' ],
|
|
||||||
'spaced-comment': [ 2, 'always' ],
|
|
||||||
'strict': 0,
|
|
||||||
'valid-typeof': 2,
|
|
||||||
'yoda': 2
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
@ -0,0 +1,171 @@
|
||||||
|
{
|
||||||
|
"env":
|
||||||
|
{
|
||||||
|
"es6": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends":
|
||||||
|
[
|
||||||
|
"eslint:recommended"
|
||||||
|
],
|
||||||
|
"settings": {},
|
||||||
|
"parserOptions":
|
||||||
|
{
|
||||||
|
"ecmaVersion": 2018,
|
||||||
|
"sourceType": "module",
|
||||||
|
"ecmaFeatures":
|
||||||
|
{
|
||||||
|
"impliedStrict": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rules":
|
||||||
|
{
|
||||||
|
"array-bracket-spacing": [ 2, "always",
|
||||||
|
{
|
||||||
|
"objectsInArrays": true,
|
||||||
|
"arraysInArrays": true
|
||||||
|
}],
|
||||||
|
"arrow-parens": [ 2, "always" ],
|
||||||
|
"arrow-spacing": 2,
|
||||||
|
"block-spacing": [ 2, "always" ],
|
||||||
|
"brace-style": [ 2, "allman", { "allowSingleLine": true } ],
|
||||||
|
"camelcase": 2,
|
||||||
|
"comma-dangle": 2,
|
||||||
|
"comma-spacing": [ 2, { "before": false, "after": true } ],
|
||||||
|
"comma-style": 2,
|
||||||
|
"computed-property-spacing": 2,
|
||||||
|
"constructor-super": 2,
|
||||||
|
"func-call-spacing": 2,
|
||||||
|
"generator-star-spacing": 2,
|
||||||
|
"guard-for-in": 2,
|
||||||
|
"indent": [ 2, "tab", { "SwitchCase": 1 } ],
|
||||||
|
"key-spacing": [ 2,
|
||||||
|
{
|
||||||
|
"singleLine":
|
||||||
|
{
|
||||||
|
"beforeColon": false,
|
||||||
|
"afterColon": true
|
||||||
|
},
|
||||||
|
"multiLine":
|
||||||
|
{
|
||||||
|
"beforeColon": true,
|
||||||
|
"afterColon": true,
|
||||||
|
"align": "colon"
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
"keyword-spacing": 2,
|
||||||
|
"linebreak-style": [ 2, "unix" ],
|
||||||
|
"lines-around-comment": [ 2,
|
||||||
|
{
|
||||||
|
"allowBlockStart": true,
|
||||||
|
"allowObjectStart": true,
|
||||||
|
"beforeBlockComment": true,
|
||||||
|
"beforeLineComment": false
|
||||||
|
}],
|
||||||
|
"max-len": [ 2, 90,
|
||||||
|
{
|
||||||
|
"tabWidth": 2,
|
||||||
|
"comments": 90,
|
||||||
|
"ignoreUrls": true,
|
||||||
|
"ignoreStrings": true,
|
||||||
|
"ignoreTemplateLiterals": true,
|
||||||
|
"ignoreRegExpLiterals": true
|
||||||
|
}],
|
||||||
|
"newline-after-var": 2,
|
||||||
|
"newline-before-return": 2,
|
||||||
|
"newline-per-chained-call": 2,
|
||||||
|
"no-alert": 2,
|
||||||
|
"no-caller": 2,
|
||||||
|
"no-case-declarations": 2,
|
||||||
|
"no-catch-shadow": 2,
|
||||||
|
"no-class-assign": 2,
|
||||||
|
"no-confusing-arrow": 2,
|
||||||
|
"no-console": 2,
|
||||||
|
"no-const-assign": 2,
|
||||||
|
"no-debugger": 2,
|
||||||
|
"no-dupe-args": 2,
|
||||||
|
"no-dupe-keys": 2,
|
||||||
|
"no-duplicate-case": 2,
|
||||||
|
"no-div-regex": 2,
|
||||||
|
"no-empty": [ 2, { "allowEmptyCatch": true } ],
|
||||||
|
"no-empty-pattern": 2,
|
||||||
|
"no-else-return": 0,
|
||||||
|
"no-eval": 2,
|
||||||
|
"no-extend-native": 2,
|
||||||
|
"no-ex-assign": 2,
|
||||||
|
"no-extra-bind": 2,
|
||||||
|
"no-extra-boolean-cast": 2,
|
||||||
|
"no-extra-label": 2,
|
||||||
|
"no-extra-semi": 2,
|
||||||
|
"no-fallthrough": 2,
|
||||||
|
"no-func-assign": 2,
|
||||||
|
"no-global-assign": 2,
|
||||||
|
"no-implicit-coercion": 2,
|
||||||
|
"no-implicit-globals": 2,
|
||||||
|
"no-inner-declarations": 2,
|
||||||
|
"no-invalid-regexp": 2,
|
||||||
|
"no-invalid-this": 2,
|
||||||
|
"no-irregular-whitespace": 2,
|
||||||
|
"no-lonely-if": 2,
|
||||||
|
"no-mixed-operators": 2,
|
||||||
|
"no-mixed-spaces-and-tabs": 2,
|
||||||
|
"no-multi-spaces": 2,
|
||||||
|
"no-multi-str": 2,
|
||||||
|
"no-multiple-empty-lines": [ 1, { "max": 1, "maxEOF": 0, "maxBOF": 0 } ],
|
||||||
|
"no-native-reassign": 2,
|
||||||
|
"no-negated-in-lhs": 2,
|
||||||
|
"no-new": 2,
|
||||||
|
"no-new-func": 2,
|
||||||
|
"no-new-wrappers": 2,
|
||||||
|
"no-obj-calls": 2,
|
||||||
|
"no-proto": 2,
|
||||||
|
"no-prototype-builtins": 0,
|
||||||
|
"no-redeclare": 2,
|
||||||
|
"no-regex-spaces": 2,
|
||||||
|
"no-restricted-imports": 2,
|
||||||
|
"no-return-assign": 2,
|
||||||
|
"no-self-assign": 2,
|
||||||
|
"no-self-compare": 2,
|
||||||
|
"no-sequences": 2,
|
||||||
|
"no-shadow": 2,
|
||||||
|
"no-shadow-restricted-names": 2,
|
||||||
|
"no-spaced-func": 2,
|
||||||
|
"no-sparse-arrays": 2,
|
||||||
|
"no-this-before-super": 2,
|
||||||
|
"no-throw-literal": 2,
|
||||||
|
"no-undef": 2,
|
||||||
|
"no-unexpected-multiline": 2,
|
||||||
|
"no-unmodified-loop-condition": 2,
|
||||||
|
"no-unreachable": 2,
|
||||||
|
"no-unused-vars": [ 1, { "vars": "all", "args": "after-used" }],
|
||||||
|
"no-use-before-define": [ 2, { "functions": false } ],
|
||||||
|
"no-useless-call": 2,
|
||||||
|
"no-useless-computed-key": 2,
|
||||||
|
"no-useless-concat": 2,
|
||||||
|
"no-useless-rename": 2,
|
||||||
|
"no-var": 2,
|
||||||
|
"no-whitespace-before-property": 2,
|
||||||
|
"object-curly-newline": 0,
|
||||||
|
"object-curly-spacing": [ 2, "always" ],
|
||||||
|
"object-property-newline": [ 2, { "allowMultiplePropertiesPerLine": true } ],
|
||||||
|
"prefer-const": 2,
|
||||||
|
"prefer-rest-params": 2,
|
||||||
|
"prefer-spread": 2,
|
||||||
|
"prefer-template": 2,
|
||||||
|
"quotes": [ 2, "single", { "avoidEscape": true } ],
|
||||||
|
"semi": [ 2, "always" ],
|
||||||
|
"semi-spacing": 2,
|
||||||
|
"space-before-blocks": 2,
|
||||||
|
"space-before-function-paren": [ 2,
|
||||||
|
{
|
||||||
|
"anonymous" : "never",
|
||||||
|
"named" : "never",
|
||||||
|
"asyncArrow" : "always"
|
||||||
|
}],
|
||||||
|
"space-in-parens": [ 2, "never" ],
|
||||||
|
"spaced-comment": [ 2, "always" ],
|
||||||
|
"strict": 2,
|
||||||
|
"valid-typeof": 2,
|
||||||
|
"yoda": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
/**
|
|
||||||
* Tasks:
|
|
||||||
*
|
|
||||||
* gulp lint
|
|
||||||
* Checks source code
|
|
||||||
*
|
|
||||||
* gulp watch
|
|
||||||
* Observes changes in the code
|
|
||||||
*
|
|
||||||
* gulp
|
|
||||||
* Invokes both `lint` and `watch` tasks
|
|
||||||
*/
|
|
||||||
|
|
||||||
const gulp = require('gulp');
|
|
||||||
const plumber = require('gulp-plumber');
|
|
||||||
const eslint = require('gulp-eslint');
|
|
||||||
|
|
||||||
const LINTING_FILES =
|
|
||||||
[
|
|
||||||
'gulpfile.js',
|
|
||||||
'server.js',
|
|
||||||
'config/config.example.js',
|
|
||||||
'lib/**/*.js'
|
|
||||||
];
|
|
||||||
|
|
||||||
gulp.task('lint', () =>
|
|
||||||
{
|
|
||||||
|
|
||||||
return gulp.src(LINTING_FILES)
|
|
||||||
.pipe(plumber())
|
|
||||||
.pipe(eslint())
|
|
||||||
.pipe(eslint.format());
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('lint-fix', function()
|
|
||||||
{
|
|
||||||
return gulp.src(LINTING_FILES)
|
|
||||||
.pipe(plumber())
|
|
||||||
.pipe(eslint({ fix: true }))
|
|
||||||
.pipe(eslint.format())
|
|
||||||
.pipe(gulp.dest((file) => file.base));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('default', gulp.series('lint'));
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const headers = {
|
|
||||||
'access-control-allow-origin': '*',
|
|
||||||
'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
||||||
'access-control-allow-headers': 'content-type, accept',
|
|
||||||
'access-control-max-age': 10,
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.prepareResponse = (req, cb) =>
|
|
||||||
{
|
|
||||||
let data = '';
|
|
||||||
|
|
||||||
req.on('data', (chunk) =>
|
|
||||||
{
|
|
||||||
data += chunk;
|
|
||||||
});
|
|
||||||
|
|
||||||
req.on('end', () =>
|
|
||||||
{
|
|
||||||
cb(data);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.respond = (res, data, status) =>
|
|
||||||
{
|
|
||||||
status = status || 200;
|
|
||||||
res.writeHead(status, headers);
|
|
||||||
res.end(data);
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.send404 = (res) =>
|
|
||||||
{
|
|
||||||
exports.respond(res, 'Not Found', 404);
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.redirector = (res, loc, status) =>
|
|
||||||
{
|
|
||||||
status = status || 302;
|
|
||||||
res.writeHead(status, { Location: loc });
|
|
||||||
res.end();
|
|
||||||
};
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const EventEmitter = require('events').EventEmitter;
|
const EventEmitter = require('events').EventEmitter;
|
||||||
const Logger = require('./Logger');
|
const Logger = require('./Logger');
|
||||||
|
|
||||||
|
|
@ -46,7 +44,11 @@ class Lobby extends EventEmitter
|
||||||
{
|
{
|
||||||
logger.info('peerList()');
|
logger.info('peerList()');
|
||||||
|
|
||||||
return Object.values(this._peers).map((peer) => ({ peerId: peer.peerId, displayName: peer.displayName }));
|
return Object.values(this._peers).map((peer) =>
|
||||||
|
({
|
||||||
|
peerId : peer.peerId,
|
||||||
|
displayName : peer.displayName
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
hasPeer(peerId)
|
hasPeer(peerId)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const debug = require('debug');
|
const debug = require('debug');
|
||||||
|
|
||||||
const APP_NAME = 'multiparty-meeting-server';
|
const APP_NAME = 'multiparty-meeting-server';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const EventEmitter = require('events').EventEmitter;
|
const EventEmitter = require('events').EventEmitter;
|
||||||
const Logger = require('./Logger');
|
const Logger = require('./Logger');
|
||||||
const Lobby = require('./Lobby');
|
const Lobby = require('./Lobby');
|
||||||
|
|
@ -23,7 +21,7 @@ class Room extends EventEmitter
|
||||||
logger.info('create() [roomId:%s, forceH264:%s]', roomId);
|
logger.info('create() [roomId:%s, forceH264:%s]', roomId);
|
||||||
|
|
||||||
// Router media codecs.
|
// Router media codecs.
|
||||||
let mediaCodecs = config.mediasoup.router.mediaCodecs;
|
const mediaCodecs = config.mediasoup.router.mediaCodecs;
|
||||||
|
|
||||||
// Create a mediasoup Router.
|
// Create a mediasoup Router.
|
||||||
const mediasoupRouter = await mediasoupWorker.createRouter({ mediaCodecs });
|
const mediasoupRouter = await mediasoupWorker.createRouter({ mediaCodecs });
|
||||||
|
|
@ -58,18 +56,19 @@ class Room extends EventEmitter
|
||||||
// if true: accessCode is a possibility to open the room
|
// if true: accessCode is a possibility to open the room
|
||||||
this._joinByAccesCode = true;
|
this._joinByAccesCode = true;
|
||||||
|
|
||||||
// access code to the room, applicable if ( _locked == true and _joinByAccessCode == true )
|
// access code to the room,
|
||||||
|
// applicable if ( _locked == true and _joinByAccessCode == true )
|
||||||
this._accessCode = '';
|
this._accessCode = '';
|
||||||
|
|
||||||
this._lobby = new Lobby();
|
this._lobby = new Lobby();
|
||||||
|
|
||||||
this._lobby.on('promotePeer', (peer) =>
|
this._lobby.on('promotePeer', (promotedPeer) =>
|
||||||
{
|
{
|
||||||
logger.info('promotePeer() [peer:"%o"]', peer);
|
logger.info('promotePeer() [promotedPeer:"%o"]', promotedPeer);
|
||||||
|
|
||||||
const { peerId } = peer;
|
const { peerId } = promotedPeer;
|
||||||
|
|
||||||
this._peerJoining({ ...peer });
|
this._peerJoining({ ...promotedPeer });
|
||||||
|
|
||||||
Object.values(this._peers).forEach((peer) =>
|
Object.values(this._peers).forEach((peer) =>
|
||||||
{
|
{
|
||||||
|
|
@ -77,9 +76,9 @@ class Room extends EventEmitter
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
this._lobby.on('lobbyPeerDisplayNameChanged', (peer) =>
|
this._lobby.on('lobbyPeerDisplayNameChanged', (changedPeer) =>
|
||||||
{
|
{
|
||||||
const { peerId, displayName } = peer;
|
const { peerId, displayName } = changedPeer;
|
||||||
|
|
||||||
Object.values(this._peers).forEach((peer) =>
|
Object.values(this._peers).forEach((peer) =>
|
||||||
{
|
{
|
||||||
|
|
@ -87,11 +86,11 @@ class Room extends EventEmitter
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
this._lobby.on('peerClosed', (peer) =>
|
this._lobby.on('peerClosed', (closedPeer) =>
|
||||||
{
|
{
|
||||||
logger.info('peerClosed() [peer:"%o"]', peer);
|
logger.info('peerClosed() [closedPeer:"%o"]', closedPeer);
|
||||||
|
|
||||||
const { peerId } = peer;
|
const { peerId } = closedPeer;
|
||||||
|
|
||||||
Object.values(this._peers).forEach((peer) =>
|
Object.values(this._peers).forEach((peer) =>
|
||||||
{
|
{
|
||||||
|
|
@ -279,13 +278,13 @@ class Room extends EventEmitter
|
||||||
return this._locked;
|
return this._locked;
|
||||||
}
|
}
|
||||||
|
|
||||||
peerAuthenticated(peerid)
|
peerAuthenticated(peerId)
|
||||||
{
|
{
|
||||||
logger.debug('peerAuthenticated() | [peerId:"%s"]', peerId);
|
logger.debug('peerAuthenticated() | [peerId:"%s"]', peerId);
|
||||||
|
|
||||||
if (!this._locked)
|
if (!this._locked)
|
||||||
{
|
{
|
||||||
if (!Boolean(this._peers[peerid]))
|
if (!this._peers[peerId])
|
||||||
{
|
{
|
||||||
this._lobby.promotePeer(peerId);
|
this._lobby.promotePeer(peerId);
|
||||||
}
|
}
|
||||||
|
|
@ -833,12 +832,13 @@ class Room extends EventEmitter
|
||||||
{
|
{
|
||||||
// Return to sender
|
// Return to sender
|
||||||
const lobbyPeers = this._lobby.peerList();
|
const lobbyPeers = this._lobby.peerList();
|
||||||
|
|
||||||
cb(
|
cb(
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
chatHistory : this._chatHistory,
|
chatHistory : this._chatHistory,
|
||||||
fileHistory : this._fileHistory,
|
fileHistory : this._fileHistory,
|
||||||
lastN : this._lastN,
|
lastNHistory : this._lastN,
|
||||||
locked : this._locked,
|
locked : this._locked,
|
||||||
lobbyPeers : lobbyPeers,
|
lobbyPeers : lobbyPeers,
|
||||||
accessCode : this._accessCode
|
accessCode : this._accessCode
|
||||||
|
|
@ -916,7 +916,6 @@ class Room extends EventEmitter
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case 'promotePeer':
|
case 'promotePeer':
|
||||||
{
|
{
|
||||||
const { peerId } = request.data;
|
const { peerId } = request.data;
|
||||||
|
|
@ -1103,7 +1102,6 @@ class Room extends EventEmitter
|
||||||
kind : producer.kind,
|
kind : producer.kind,
|
||||||
producerId : producer.id,
|
producerId : producer.id,
|
||||||
id : consumer.id,
|
id : consumer.id,
|
||||||
kind : consumer.kind,
|
|
||||||
rtpParameters : consumer.rtpParameters,
|
rtpParameters : consumer.rtpParameters,
|
||||||
type : consumer.type,
|
type : consumer.type,
|
||||||
appData : producer.appData,
|
appData : producer.appData,
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,5 @@
|
||||||
"passport": "^0.4.0",
|
"passport": "^0.4.0",
|
||||||
"socket.io": "^2.3.0",
|
"socket.io": "^2.3.0",
|
||||||
"spdy": "^4.0.1"
|
"spdy": "^4.0.1"
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"gulp": "^4.0.2",
|
|
||||||
"gulp-eslint": "^6.0.0",
|
|
||||||
"gulp-plumber": "^1.2.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
process.title = 'multiparty-meeting-server';
|
process.title = 'multiparty-meeting-server';
|
||||||
|
|
||||||
const config = require('./config/config');
|
const config = require('./config/config');
|
||||||
|
|
@ -14,7 +12,6 @@ const mediasoup = require('mediasoup');
|
||||||
const AwaitQueue = require('awaitqueue');
|
const AwaitQueue = require('awaitqueue');
|
||||||
const Logger = require('./lib/Logger');
|
const Logger = require('./lib/Logger');
|
||||||
const Room = require('./lib/Room');
|
const Room = require('./lib/Room');
|
||||||
const utils = require('./util');
|
|
||||||
const base64 = require('base-64');
|
const base64 = require('base-64');
|
||||||
// auth
|
// auth
|
||||||
const passport = require('passport');
|
const passport = require('passport');
|
||||||
|
|
@ -26,7 +23,7 @@ const sharedSession = require('express-socket.io-session');
|
||||||
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
||||||
console.log('- config.mediasoup.logLevel:', config.mediasoup.logLevel);
|
console.log('- config.mediasoup.logLevel:', config.mediasoup.logLevel);
|
||||||
console.log('- config.mediasoup.logTags:', config.mediasoup.logTags);
|
console.log('- config.mediasoup.logTags:', config.mediasoup.logTags);
|
||||||
/* eslint-enable nopassportSocketIo-console */
|
/* eslint-enable no-console */
|
||||||
|
|
||||||
const logger = new Logger();
|
const logger = new Logger();
|
||||||
|
|
||||||
|
|
@ -57,11 +54,12 @@ const session = expressSession({
|
||||||
resave : true,
|
resave : true,
|
||||||
saveUninitialized : true,
|
saveUninitialized : true,
|
||||||
cookie : { secure: true }
|
cookie : { secure: true }
|
||||||
})
|
});
|
||||||
|
|
||||||
app.use(session);
|
app.use(session);
|
||||||
|
|
||||||
let httpsServer;
|
let httpsServer;
|
||||||
|
let io;
|
||||||
let oidcClient;
|
let oidcClient;
|
||||||
let oidcStrategy;
|
let oidcStrategy;
|
||||||
|
|
||||||
|
|
@ -228,8 +226,7 @@ async function setupAuth(oidcIssuer)
|
||||||
state : base64.encode(JSON.stringify({
|
state : base64.encode(JSON.stringify({
|
||||||
id : req.query.id,
|
id : req.query.id,
|
||||||
roomId : req.query.roomId,
|
roomId : req.query.roomId,
|
||||||
peerId : req.query.peerId,
|
peerId : req.query.peerId
|
||||||
code : utils.random(10)
|
|
||||||
}))
|
}))
|
||||||
})(req, res, next);
|
})(req, res, next);
|
||||||
});
|
});
|
||||||
|
|
@ -334,7 +331,7 @@ async function runHttpsServer()
|
||||||
*/
|
*/
|
||||||
async function runWebSocketServer()
|
async function runWebSocketServer()
|
||||||
{
|
{
|
||||||
const io = require('socket.io')(httpsServer);
|
io = require('socket.io')(httpsServer);
|
||||||
|
|
||||||
io.use(
|
io.use(
|
||||||
sharedSession(session, {
|
sharedSession(session, {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var crypto = require('crypto');
|
|
||||||
|
|
||||||
exports.random = function (howMany, chars) {
|
|
||||||
chars = chars
|
|
||||||
|| "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
|
|
||||||
var rnd = crypto.randomBytes(howMany)
|
|
||||||
, value = new Array(howMany)
|
|
||||||
, len = len = Math.min(256, chars.length)
|
|
||||||
, d = 256 / len
|
|
||||||
|
|
||||||
for (var i = 0; i < howMany; i++) {
|
|
||||||
value[i] = chars[Math.floor(rnd[i] / d)]
|
|
||||||
};
|
|
||||||
|
|
||||||
return value.join('');
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue