diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..75dec161 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. ... + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Branch/Versions:** +If you are developer, on which branch is this. +If you are reporting as user, on which version or location you experienced the issue. +Version is available under the 3 dots in the topbar under about. + +**Server (if available please complete the following information):** + - OS: [e.g. Debian 11] + +**Client:** + - Browser [e.g. chrome, safari, firefox, edge, ...] + - Browser version [e.g. 99] + - other [e.g. mobil browser under ios] + + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 00000000..48d5f81f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/develop-deb.yml b/.github/workflows/develop-deb.yml index b9435f05..5953ab07 100644 --- a/.github/workflows/develop-deb.yml +++ b/.github/workflows/develop-deb.yml @@ -2,7 +2,7 @@ name: Debian package on: push: - branches: [ develop, release-3.5.0 ] + branches: [ master ] # pull_request: # branches: [ develop ] @@ -91,16 +91,16 @@ jobs: chmod 775 DEBIAN/postinst cd ../ dpkg-deb -Zgzip --build package - mv /home/runner/package.deb /home/runner/edumeet-$VERSION-beta1.deb + mv /home/runner/package.deb /home/runner/edumeet-$VERSION.deb - name : Upload artifact uses: actions/upload-artifact@v2 with: - name: edumeet-${{ steps.get-version.outputs.VERSION }}-beta1 + name: edumeet-${{ steps.get-version.outputs.VERSION }} path: "/home/runner/edumeet-*.deb" - name: Add to release assets uses: softprops/action-gh-release@v1 with: - tag_name: "v3.5.0-beta.1" + tag_name: ${{ steps.get-version.outputs.VERSION }} files: "/home/runner/edumeet-*.deb" diff --git a/CHANGELOG.md b/CHANGELOG.md index b71961c1..67f98c91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 3.5.3 + Hotfix configuration issue +## 3.5.2 + Security update for dependencies ## 3.5.1 * Updated Documentation diff --git a/README.md b/README.md index e32a6384..269dfb6a 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ sudo systemctl enable edumeet ## Load balanced installation -To deploy this as a load balanced cluster, have a look at [HAproxy](HAproxy.md). +To deploy this as a load balanced cluster, have a look at [HAproxy](/docs/HAproxy.md). ## Learning management integration diff --git a/app/package.json b/app/package.json index 574cdee9..579676f4 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "edumeet", - "version": "3.5.1", + "version": "3.5.5", "private": true, "description": "edumeet meeting service", "author": "Håvar Aambø Fosstveit ", @@ -43,7 +43,7 @@ "is-electron": "^2.2.0", "marked": "^0.8.0", "material-ui-popup-state": "^1.8.0", - "mediasoup-client": "^3.6.47", + "mediasoup-client": "^3.6.55", "notistack": "^0.9.5", "prop-types": "^15.7.2", "random-string": "^0.2.0", @@ -70,6 +70,7 @@ "source-map-explorer": "^2.1.0", "streamsaver": "^2.0.5", "typescript": "^4.2.4", + "universal-cookie": "4.0.4", "web-streams-polyfill": "^3.0.2", "webtorrent": "^0.108.1" }, @@ -110,6 +111,6 @@ "eslint-webpack-plugin": "^2.5.3", "foreman": "^3.0.1", "redux-mock-store": "^1.5.3", - "ts-node": "^10.5.0" + "ts-node": "^10.9.1" } } diff --git a/app/public/config/README.md b/app/public/config/README.md index 2b59e31f..d5a233a4 100644 --- a/app/public/config/README.md +++ b/app/public/config/README.md @@ -52,6 +52,9 @@ | lockLastN | If true, the users can not change the number of visible speakers. | `"boolean"` | ``false`` | | logo | If not null, it shows the logo loaded from the specified URL, otherwise it shows the title. | `"url"` | ``"images/logo.edumeet.svg"`` | | title | The title to show if the logo is not specified. | `"string"` | ``"edumeet"`` | +| infoTooltipText | Informative text on the join page. If empty hidden. | `"string"` | ``""`` | +| infoTooltipLink | Informative text link site on the join page. If empty hidden. | `"string"` | ``""`` | +| infoTooltipDesc | Informative text description on the join page. If empty hidden. | `"string"` | ``""`` | | supportUrl | The service & Support URL; if `null`, it will be not displayed on the about dialogs. | `"url"` | ``"https://support.example.com"`` | | privacyUrl | The privacy and data protection external URL or local HTML path. | `"string"` | ``"privacy/privacy.html"`` | | theme | UI theme elements colors. | `"object"` | ``{ "palette": { "primary": { "main": "#313131" } }, "overrides": { "MuiAppBar": { "colorPrimary": { "backgroundColor": "#313131" } }, "MuiButton": { "containedPrimary": { "backgroundColor": "#5F9B2D", "&:hover": { "backgroundColor": "#5F9B2D" } }, "containedSecondary": { "backgroundColor": "#f50057", "&:hover": { "backgroundColor": "#f50057" } } }, "MuiFab": { "primary": { "backgroundColor": "#518029", "&:hover": { "backgroundColor": "#518029" }, "&:disabled": { "color": "#999898", "backgroundColor": "#323131" } }, "secondary": { "backgroundColor": "#f50057", "&:hover": { "backgroundColor": "#f50057" }, "&:disabled": { "color": "#999898", "backgroundColor": "#323131" } } }, "MuiBadge": { "colorPrimary": { "backgroundColor": "#5F9B2D", "&:hover": { "backgroundColor": "#518029" } } } }, "typography": { "useNextVariants": true }}`` | diff --git a/app/public/config/config.example.js b/app/public/config/config.example.js index 6cd51625..a09f5a1b 100644 --- a/app/public/config/config.example.js +++ b/app/public/config/config.example.js @@ -304,6 +304,15 @@ var config = { // The title to show if the logo is not specified. title : 'edumeet', + // Informative text on the join page. If empty hidden. + infoTooltipText : '', + + // Informative text link site on the join page. If empty hidden. + infoTooltipLink : '', + + // Informative text description on the join page. If empty hidden. + infoTooltipDesc : '', + // The service & Support URL; if `null`, it will be not displayed on the about dialogs. supportUrl : 'https://support.example.com', diff --git a/app/public/index.html b/app/public/index.html index 0060d0fb..966bd069 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -7,6 +7,7 @@ content='width=device-width, initial-scale=1, shrink-to-fit=no' /> + diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index dd2f7f87..121f3287 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -4283,7 +4283,7 @@ export default class RoomClient try { const device = this._webcams[videoDeviceId]; - const { resolution, aspectRatio } = store.getState().settings; + const { resolution, aspectRatio, frameRate } = store.getState().settings; if (!device) throw new Error('no webcam devices'); @@ -4293,7 +4293,8 @@ export default class RoomClient video : { deviceId : { ideal: videoDeviceId }, - ...getVideoConstrains(resolution, aspectRatio) + ...getVideoConstrains(resolution, aspectRatio), + frameRate } }); diff --git a/app/src/components/Containers/Peer.js b/app/src/components/Containers/Peer.js index 3a07d4b9..5546f509 100644 --- a/app/src/components/Containers/Peer.js +++ b/app/src/components/Containers/Peer.js @@ -349,21 +349,32 @@ const Peer = (props) => { const handler = setTimeout(() => { - const consumer = webcamConsumer || screenConsumer; + const consumers = []; - if (!consumer) - return; + if (webcamConsumer) + consumers.push(webcamConsumer); - if (windowConsumer === consumer.id) + if (screenConsumer) + consumers.push(screenConsumer); + + extraVideoConsumers.map((consumer) => { - // if playing in external window, set the maximum quality levels - roomClient.setConsumerPreferredLayersMax(consumer); - } - else if (enableLayersSwitch && consumer?.type !== 'simple' - && fullScreenConsumer !== consumer.id) + consumers.push(consumer); + }); + + consumers.forEach((consumer) => { - roomClient.adaptConsumerPreferredLayers(consumer, width, height); - } + if (windowConsumer === consumer.id) + { + // if playing in external window, set the maximum quality levels + roomClient.setConsumerPreferredLayersMax(consumer); + } + else if (enableLayersSwitch && consumer?.type !== 'simple' + && fullScreenConsumer !== consumer.id) + { + roomClient.adaptConsumerPreferredLayers(consumer, width, height); + } + }); }, 1000); return () => { clearTimeout(handler); }; @@ -371,6 +382,7 @@ const Peer = (props) => enableLayersSwitch, webcamConsumer, screenConsumer, + extraVideoConsumers, windowConsumer, fullScreenConsumer, roomClient, width, height diff --git a/app/src/components/JoinDialog.js b/app/src/components/JoinDialog.js index 2346d686..dd070d00 100644 --- a/app/src/components/JoinDialog.js +++ b/app/src/components/JoinDialog.js @@ -39,6 +39,7 @@ import { useHistory, useLocation } from 'react-router-dom'; import IconButton from '@material-ui/core/IconButton'; import Tooltip from '@material-ui/core/Tooltip'; import { config } from '../config'; +import InfoIcon from '@material-ui/icons/Info'; const styles = (theme) => ({ @@ -186,7 +187,6 @@ const JoinDialog = ({ }) => { - const location = useLocation(); const history = useHistory(); @@ -671,6 +671,51 @@ const JoinDialog = ({ + { config.infoTooltipText!=='' && + +
+ + { config.infoTooltipLink!=='' && + {config.infoTooltipText} + } + + { config.infoTooltipLink==='' && +

{config.infoTooltipText}

+ } +
+ } + { config.infoTooltipDesc!=='' && +
+ {config.infoTooltipDesc} +
+ } {/* {authType === 'auth' && !loggedIn && diff --git a/app/src/components/VideoContainers/VideoView.js b/app/src/components/VideoContainers/VideoView.js index 261ca0e7..7d7f3969 100644 --- a/app/src/components/VideoContainers/VideoView.js +++ b/app/src/components/VideoContainers/VideoView.js @@ -437,6 +437,7 @@ class VideoView extends React.PureComponent localRecordingState==='resume' )&& ( + recordingConsents!==undefined && !recordingConsents.includes(peer.id) ) ) ? '':displayName @@ -459,6 +460,7 @@ class VideoView extends React.PureComponent localRecordingState==='resume' )&& ( + recordingConsents!==undefined && !recordingConsents.includes(peer.id) ) ) diff --git a/app/src/config.ts b/app/src/config.ts index c0a0eab4..402f6cd4 100644 --- a/app/src/config.ts +++ b/app/src/config.ts @@ -498,6 +498,24 @@ Setting 'play' to null disables the sound notification. format : 'String', default : 'edumeet' }, + infoTooltipText : + { + doc : 'Informative text on the join page. If empty hidden.', + format : 'String', + default : '' + }, + infoTooltipLink : + { + doc : 'Informative text link site on the join page. If empty hidden.', + format : 'String', + default : '' + }, + infoTooltipDesc : + { + doc : 'Informative text description on the join page. If empty hidden.', + format : 'String', + default : '' + }, supportUrl : { doc : 'The service & Support URL; if `null`, it will be not displayed on the about dialogs.', diff --git a/app/src/index.js b/app/src/index.js index 2ab358dd..39a207df 100644 --- a/app/src/index.js +++ b/app/src/index.js @@ -6,7 +6,7 @@ import isElectron from 'is-electron'; import { createIntl } from 'react-intl'; import { IntlProvider } from 'react-intl-redux'; - +import Cookies from 'universal-cookie'; import { Route, HashRouter, BrowserRouter, Switch } from 'react-router-dom'; import randomString from 'random-string'; import Logger from './Logger'; @@ -15,6 +15,7 @@ import RoomClient from './RoomClient'; import RoomContext from './RoomContext'; import deviceInfo from './deviceInfo'; import * as meActions from './store/actions/meActions'; +import * as roomActions from './store/actions/roomActions'; import UnsupportedBrowser from './components/UnsupportedBrowser'; import ConfigDocumentation from './components/ConfigDocumentation'; import ConfigError from './components/ConfigError'; @@ -97,6 +98,25 @@ function run() const displayName = parameters.get('displayName'); const muted = parameters.get('muted') === 'true'; const headless = parameters.get('headless'); + const hideNoVideoParticipants = parameters.get('hideNoVideoParticipants'); + const filmstripmode = parameters.get('filmstrip'); // filmstrip mode by default + const acceptCookie = parameters.get('acceptCookie'); // auto accept cookie popup + const hideSelfView = parameters.get('hideSelfView'); + + if (filmstripmode === 'true') + { + store.dispatch( + roomActions.setDisplayMode('filmstrip') + ); + } + + if (acceptCookie === 'true') + { + const cookies = new Cookies(); + + cookies.set('CookieConsent', 'true', { path: '/' }); + } + const showConfigDocumentationPath = parameters.get('config') === 'true'; const { pathname } = window.location; @@ -218,6 +238,16 @@ function run() basePath }); + if (hideNoVideoParticipants === 'true') + { + roomClient.setHideNoVideoParticipants(true); + } + + if (hideSelfView === 'true') + { + store.dispatch(roomActions.setHideSelfView(hideSelfView)); + } + global.CLIENT = roomClient; render( diff --git a/app/src/intl/translations/cn.json b/app/src/intl/translations/cn.json index 2ce8c456..c38619d4 100644 --- a/app/src/intl/translations/cn.json +++ b/app/src/intl/translations/cn.json @@ -1,12 +1,12 @@ { - "configDocumentation.title": null, - "configError.bodyText": null, - "configError.link": null, - "configError.title": null, + "configDocumentation.title": "Edumeet 配置", + "configError.bodyText": "Edumeet 配置存在如下错误:", + "configError.link": "查看配置文档", + "configError.title": "配置错误", "device.activateAudio": "激活音频", "device.audioUnsupported": "音频不受支持", "device.muteAudio": "静音", - "device.options": null, + "device.options": "设置", "device.screenSharingUnsupported": "不支持屏幕共享", "device.startScreenSharing": "开始屏幕共享", "device.startVideo": "开始视频", @@ -16,12 +16,12 @@ "device.videoUnsupported": "视频不受支持", "devices.cameraDisconnected": "相机已断开连接", "devices.cameraError": "访问相机时发生错误", - "devices.chooseMedia": null, + "devices.chooseMedia": "选择媒体", "devices.devicesChanged": "您的设备已更改,请在设置对话框中配置设备", - "devices.disableBothMicrophoneAndCamera": null, - "devices.enableBothMicrophoneAndCamera": null, - "devices.enableOnlyCamera": null, - "devices.enableOnlyMicrophone": null, + "devices.disableBothMicrophoneAndCamera": "关闭麦克风和摄像头", + "devices.enableBothMicrophoneAndCamera": "打开麦克风和摄像头", + "devices.enableOnlyCamera": "仅打开摄像头", + "devices.enableOnlyMicrophone": "仅打开麦克风", "devices.microphoneDisconnected": "麦克风已断开", "devices.microphoneEnable": "启用了麦克风", "devices.microphoneError": "麦克风发生错误", @@ -33,7 +33,7 @@ "devices.screenSharingError": "访问屏幕时发生错误", "filesharing.download": "下载共享文件", "filesharing.error": "文件共享发生错误", - "filesharing.missingSeeds": "如果此过程需要很长时间,则可能没有人播下该种子。请尝试让某人重新上传您想要的文件。", + "filesharing.missingSeeds": "如果此过程需要很长时间,则可能没有人进行做种。请尝试使上传者重新上传您想要的文件。", "filesharing.save": "保存共享文件", "filesharing.saveFileError": "无法保存文件", "filesharing.startingFileShare": "正在尝试共享文件", @@ -50,14 +50,14 @@ "label.chatNewMessages": null, "label.chatNoMessages": null, "label.close": "关闭", - "label.democratic": "民主视图", + "label.democratic": "主持人视图", "label.fileSharingUnsupported": "不支持文件共享", "label.filmstrip": "幻灯片视图", "label.fullscreen": "全屏", - "label.guest": null, + "label.guest": "访客", "label.high": "高 (HD)", "label.italic": null, - "label.join": null, + "label.join": "入会", "label.leave": "离开", "label.leaveWithSavingChat": null, "label.login": null, @@ -252,4 +252,4 @@ "unsupportedBrowser.bodyText": null, "unsupportedBrowser.titleUnsupportedBrowser": null, "unsupportedBrowser.titlewebrtcUnavailable": null -} \ No newline at end of file +} diff --git a/app/yarn.lock b/app/yarn.lock index 3a563018..a3a0e5ad 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -1209,17 +1209,12 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@csstools/convert-colors@^1.4.0": version "1.4.0" @@ -1519,6 +1514,24 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@material-ui/core@^4.11.3": version "4.11.4" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.4.tgz#4fb9fe5dec5dcf780b687e3a40cff78b2b9640a4" @@ -1931,6 +1944,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" + integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== + "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -1956,11 +1974,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/events@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -2831,10 +2844,10 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" -awaitqueue@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/awaitqueue/-/awaitqueue-2.3.3.tgz#35e6568970fcac3de1644a2c28abc1074045b570" - integrity sha512-RbzQg6VtPUtyErm55iuQLTrBJ2uihy5BKBOEkyBwv67xm5Fn2o/j+Bz+a5BmfSoe2oZ5dcz9Z3fExS8pL+LLhw== +awaitqueue@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/awaitqueue/-/awaitqueue-2.4.0.tgz#beb9a2b563b4817921f21c09cca2cdbb0d5989d4" + integrity sha512-9nTnPxVuxiuKFTHslm9ltnekUECJidOQ5kE6JpZUH77KrKqStQuWUW7JPB2GJZ7rOwWLcbToHiIXle/nJe1VpQ== axe-core@^4.0.2: version "4.2.1" @@ -4085,6 +4098,11 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4558,10 +4576,10 @@ debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -5905,9 +5923,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== for-in@^1.0.2: version "1.0.2" @@ -8401,21 +8419,21 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mediasoup-client@^3.6.47: - version "3.6.50" - resolved "https://registry.yarnpkg.com/mediasoup-client/-/mediasoup-client-3.6.50.tgz#16ca4fe7e2920c1d0e74c7e9b66bd13a4ebdf44b" - integrity sha512-YSd5GHD3gTyZXUBWDtpCeng1i+pE5dbRQeY11fQWKcFGEao2XaNW/+4FCzLBRNbEJZ2nFVJmxwNSFB4R4Jt/PQ== +mediasoup-client@^3.6.55: + version "3.6.66" + resolved "https://registry.yarnpkg.com/mediasoup-client/-/mediasoup-client-3.6.66.tgz#80e5dc2746b795d44c55901b0b8f5a796b196d87" + integrity sha512-xTT8v42ykXeAgGHH4MsTirtkMZ46hbPkKfbO663l0/vGu9uD1bSR5dFSe+scp6go1LKF+iDLnPyO0mvWLhlAKg== dependencies: "@types/debug" "^4.1.7" - "@types/events" "^3.0.0" - awaitqueue "^2.3.3" + awaitqueue "^2.4.0" bowser "^2.11.0" - debug "^4.3.3" + debug "^4.3.4" events "^3.3.0" fake-mediastreamtrack "^1.1.6" h264-profile-level-id "^1.0.1" sdp-transform "^2.14.1" - supports-color "^9.2.1" + supports-color "^9.2.3" + uuid "^3.4.0" mediasource@^2.2.2, mediasource@^2.3.0: version "2.4.0" @@ -8613,9 +8631,9 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" @@ -11618,9 +11636,9 @@ simple-concat@^1.0.0: integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== dependencies: decompress-response "^4.2.0" once "^1.3.1" @@ -12223,10 +12241,10 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" - integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== +supports-color@^9.2.3: + version "9.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.3.0.tgz#cce566c5ad562eece4dfe5a4502a58efc54986a9" + integrity sha512-hJ6RYjNbcBFkpHi+ykjar+7GgHs+65Kxyw940nBLOSjaWZ13acq4A5f+gWiV5w+xfsg5MbnjDxTigLcUuljerw== supports-hyperlinks@^2.0.0: version "2.2.0" @@ -12288,9 +12306,9 @@ tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -12540,12 +12558,12 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-node@^10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9" - integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw== +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -12556,7 +12574,7 @@ ts-node@^10.5.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-pnp@1.2.0, ts-pnp@^1.1.6: @@ -12771,6 +12789,14 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +universal-cookie@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/universal-cookie/-/universal-cookie-4.0.4.tgz#06e8b3625bf9af049569ef97109b4bb226ad798d" + integrity sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw== + dependencies: + "@types/cookie" "^0.3.3" + cookie "^0.4.0" + universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -12838,9 +12864,9 @@ url-parse-lax@^3.0.0: prepend-http "^2.0.0" url-parse@^1.4.3, url-parse@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" - integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -12941,10 +12967,10 @@ uuid@^8.1.0, uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" diff --git a/compose/edumeet/Dockerfile b/compose/edumeet/Dockerfile index 2e801cb6..58ebd82b 100644 --- a/compose/edumeet/Dockerfile +++ b/compose/edumeet/Dockerfile @@ -1,6 +1,6 @@ FROM node:14-buster-slim RUN apt-get update && \ - apt-get install -y git build-essential python pkg-config libssl-dev && \ + apt-get install -y git build-essential python pkg-config libssl-dev python3-pip && \ apt-get clean WORKDIR /edumeet ENV DEBUG=edumeet*,mediasoup* diff --git a/docs/HAproxy.md b/docs/HAproxy.md index 2166f393..14dc05b9 100644 --- a/docs/HAproxy.md +++ b/docs/HAproxy.md @@ -64,13 +64,17 @@ OR ### Server config -mm/configs/server/config.js - -``` js -redisOptions : { host: '192.0.2.4'}, -listeningPort: 80, -httpOnly: true, -trustProxy : ['192.0.2.5'], +config.yaml +``` yaml +turnAPIKey : "" +turnAPIURI : "" +listeningPort : 80 +httpOnly : true +trustProxy : "192.0.2.5" +redisOptions: + host: "192.0.2.4" + port: "6379" + password: "passwd" ``` ## Deploy HA proxy @@ -78,24 +82,121 @@ trustProxy : ['192.0.2.5'], * 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 +```bash +apt install haproxy +``` +* Install haproxy 2.2 (recommended) +``` bash +sudo apt-get install gnupg2 curl -y +curl https://haproxy.debian.net/bernat.debian.org.gpg | sudo apt-key add - +echo deb http://haproxy.debian.net buster-backports-2.2 main | sudo tee /etc/apt/sources.list.d/haproxy.list +sudo apt-get update +apt-get install haproxy=2.2.\* - `apt install haproxy` +sudo systemctl start haproxy +sudo systemctl enable haproxy +``` * Add to /etc/haproxy/haproxy.cfg config ``` plaintext - backend edumeet - balance url_param roomId - hash-type consistent - server mm1 192.0.2.1:80 check maxconn 2000 verify none - server mm2 192.0.2.2:80 check maxconn 2000 verify none - server mm3 192.0.2.3:80 check maxconn 2000 verify none + global + # mult thread setup + nbproc 1 + nbthread 4 + cpu-map auto:1/1-4 0-3 + + log /dev/log local0 + log /dev/log local1 notice + chroot /var/lib/haproxy + stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners + stats socket /run/haproxy.sock mode 660 level admin + stats timeout 30s + user haproxy + group haproxy + daemon + + # Default SSL material locations + ca-base /etc/ssl/certs + crt-base /etc/ssl/private + + # Default ciphers to use on SSL-enabled listening sockets. + # For more information, see ciphers(1SSL). This list is from: + # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ + # An alternative list with additional directives can be obtained from + # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy + ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS + ssl-default-bind-options no-sslv3 + tune.ssl.default-dh-param 2048 + maxconn 20000 + + defaults + log global + mode http + option httplog + #option logasap + #option dontlognull + timeout connect 5000 + timeout client 50000 + timeout server 50000 + errorfile 400 /etc/haproxy/errors/400.http + errorfile 403 /etc/haproxy/errors/403.http + errorfile 408 /etc/haproxy/errors/408.http + errorfile 500 /etc/haproxy/errors/500.http + errorfile 502 /etc/haproxy/errors/502.http + errorfile 503 /etc/haproxy/errors/503.http + errorfile 504 /etc/haproxy/errors/504.http + maxconn 8192 + + backend letsmeet-room-backend + fullconn 4000 + balance url_param roomId + hash-type consistent + stick-table type string len 1024 size 100k expire 8h + stick store-request url_param(roomId) + stick match url_param(roomId) + stick match url_param(state),url_dec,b64dec,field(8,'\"') + + server edumeet1 192.0.2.1:80 check maxconn 2000 verify none + server edumeet2 192.0.2.2:80 check maxconn 1000 verify none + server edumeet3 192.0.2.3:80 check maxconn 1000 verify none + + backend letsmeet-backend + fullconn 4000 + balance leastconn + stick-table type ip size 200k expire 30m + stick on src + hash-type consistent + + server edumeet1 192.0.2.1:80 check maxconn 2000 verify none + server edumeet2 192.0.2.2:80 check maxconn 1000 verify none + server edumeet3 192.0.2.3:80 check maxconn 1000 verify none + + frontend letsmeet + bind *:80 + bind*:443 ssl crt /etc/ssl/edumeet.example.com/edumeet.example.com.pem alpn h2,http/1.1 + http-request redirect scheme https if !{ ssl_fc } + http-request add-header X-Forwarded-Proto https + stats enable + stats uri /static/stats + #stats hide-version + stats refresh 10s + stats admin if TRUE + #stats admin if LOCALHOST + stats realm Haproxy\ Statistics + stats auth admin:password + + maxconn 6000 + acl roomId-acl url_param(roomId) -m found + acl callback-acl path_beg /auth/callback + use_backend letsmeet-room-backend if roomId-acl || callback-acl + default_backend letsmeet-backend - frontend meet.example.com - bind 192.0.2.5:80 - bind 192.0.2.5:443 ssl crt /root/certificate.pem - http-request redirect scheme https unless { ssl_fc } - reqadd X-Forwarded-Proto:\ https - default_backend edumeet ``` + +* Creating cert with letsencrypt : + +``` bash +sudo cat /etc/letsencrypt/live/edumeet.example.com/fullchain.pem /etc/letsencrypt/live/edumeet.example.com/privkey.pem | sudo tee /etc/ssl/edumeet.example.com/edumeet.example.com.pem +``` diff --git a/server/config/config.example.js b/server/config/config.example.js index 2805e25b..8cea477f 100644 --- a/server/config/config.example.js +++ b/server/config/config.example.js @@ -119,59 +119,6 @@ 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' - }, - turnAPITimeout : 2 * 1000, - // Backup turnservers if REST fails or is not configured - backupTurnServers : [ - { - urls : [ - 'turn:turn.example.com:443?transport=tcp' - ], - username : 'example', - credential : 'example' - } - ], - // bittorrent tracker: please replace this if you want a more private file sharing service inside eduMEET - // have a look at https://github.com/webtorrent/bittorrent-tracker for setup your own tracker - fileTracker : 'wss://tracker.openwebtorrent.com', - // redis server options - redisOptions : {}, - // session cookie secret - cookieSecret : 'T0P-S3cR3t_cook!e', - cookieName : 'edumeet.sid', - // if you use encrypted private key the set the passphrase - tls : - { - cert : `${__dirname}/../certs/mediasoup-demo.localhost.cert.pem`, - // passphrase: 'key_password' - key : `${__dirname}/../certs/mediasoup-demo.localhost.key.pem` - }, - // listening Host or IP - // If omitted listens on every IP. ("0.0.0.0" and "::") - // listeningHost: 'localhost', - // Listening port for https server. - listeningPort : 443, - // Any http request is redirected to https. - // Listening port for http server. - listeningRedirectPort : 80, - // Listens only on http, only on listeningPort - // listeningRedirectPort disabled - // use case: loadbalancer backend - httpOnly : false, - // WebServer/Express trust proxy config for httpOnly mode - // You can find more info: - // - https://expressjs.com/en/guide/behind-proxies.html - // - https://www.npmjs.com/package/proxy-addr - // use case: loadbalancer backend - trustProxy : '', // This logger class will have the log function // called every time there is a room created or destroyed, // or peer created or destroyed. This would then be able diff --git a/server/lib/config/config.ts b/server/lib/config/config.ts index 33eb6c57..d0975b53 100644 --- a/server/lib/config/config.ts +++ b/server/lib/config/config.ts @@ -32,7 +32,7 @@ import { const logger = new Logger('config'); // add network interfaces list -const ifaceWhiteListRegex = '^(eth.*)|(ens.*)|(br.*)|(wl.*)|(ww.*)'; +const ifaceWhiteListRegex = '^(eth.*)|(enp.*)|(ens.*)|(br.*)|(wl.*)|(ww.*)'; // add parsers convict.addParser([ diff --git a/server/package.json b/server/package.json index b2359351..d6987a96 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "edumeet-server", - "version": "3.5.1", + "version": "3.5.5", "private": true, "description": "edumeet server", "author": "Håvar Aambø Fosstveit ", @@ -15,7 +15,7 @@ "main": "lib/index.js", "scripts": { "start": "node dist/server.js", - "build": "mkdir -p dist && find dist/* -maxdepth 0 ! -name public -exec rm -rf {} \\; && tsc && ln -s ../certs dist/certs && chmod 755 dist/server.js && ( for fileExt in yaml json toml ; do [ -f config/config.$fileExt ] && cp config/config.$fileExt dist/config/; done ) | true && touch 'dist/ __AUTO_GENERATED_CONTENT_REFRESHED_AFTER_REBUILDING!__ '", + "build": "mkdir -p dist && touch dist/tmp && find dist/* -maxdepth 0 ! -name public -exec rm -rf {} \\; && tsc && ln -s ../certs dist/certs && chmod 755 dist/server.js && ( for fileExt in yaml json toml ; do [ -f config/config.$fileExt ] && cp config/config.$fileExt dist/config/; done ) | true && touch 'dist/ __AUTO_GENERATED_CONTENT_REFRESHED_AFTER_REBUILDING!__ '", "dev": "nodemon --exec ts-node --ignore dist/ -e js,ts server.js", "connect": "ts-node connect.js", "lint": "eslint ./ --ext .js,.ts; exit 0", @@ -43,7 +43,7 @@ "ims-lti": "^3.0.2", "json5": "^2.2.0", "jsonwebtoken": "^8.5.1", - "mediasoup": "3.9.6", + "mediasoup": "3.10.5", "openid-client": "^3.7.3", "passport": "^0.4.0", "passport-local": "^1.0.0", diff --git a/server/yarn.lock b/server/yarn.lock index 989ceae0..1bcf9d2d 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -909,7 +909,7 @@ debug@2.6.9, debug@^2.6.9, debug@~2.6.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -923,6 +923,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -1481,9 +1488,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== follow-redirects@^1.14.0: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== form-data@^2.5.0: version "2.5.1" @@ -2189,16 +2196,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mediasoup@3.9.6: - version "3.9.6" - resolved "https://registry.yarnpkg.com/mediasoup/-/mediasoup-3.9.6.tgz#406d6e5eea9096fa55df2b890ab1c42df2547b15" - integrity sha512-eRWdsyO5m9IN3EHJ1cST4Muv+ddhZbBcvDLUGHVoRm34l5xiB/2F9H0iL7aASVSis0yWN9O/ogqEAb4J6xDDlA== +mediasoup@3.10.5: + version "3.10.5" + resolved "https://registry.yarnpkg.com/mediasoup/-/mediasoup-3.10.5.tgz#bbc0da60286b4c9e44331308249d123a0e996738" + integrity sha512-qYxJvCPcHndEP5vuIUgk+b/YjFq2vlVxX7BnYLxhTC/qYZF6103o/6J7HgwxAfLpkLLEyBq+g3nSBXxretPo/Q== dependencies: "@types/node" "^16.11.10" - debug "^4.3.3" + debug "^4.3.4" h264-profile-level-id "^1.0.1" - random-number "^0.0.9" - supports-color "^9.2.1" + supports-color "^9.2.2" uuid "^8.3.2" merge-descriptors@1.0.1: @@ -2698,11 +2704,6 @@ random-bytes@~1.0.0: resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= -random-number@^0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/random-number/-/random-number-0.0.9.tgz#5907b96f05041807c52aed601c869524d86fbbd5" - integrity sha512-ipG3kRCREi/YQpi2A5QGcvDz1KemohovWmH6qGfboVyyGdR2t/7zQz0vFxrfxpbHQgPPdtVlUDaks3aikD1Ljw== - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -3154,10 +3155,10 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" - integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== +supports-color@^9.2.2: + version "9.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.3.0.tgz#cce566c5ad562eece4dfe5a4502a58efc54986a9" + integrity sha512-hJ6RYjNbcBFkpHi+ykjar+7GgHs+65Kxyw940nBLOSjaWZ13acq4A5f+gWiV5w+xfsg5MbnjDxTigLcUuljerw== supports-preserve-symlinks-flag@^1.0.0: version "1.0.0"