diff --git a/app/package.json b/app/package.json index 89a116e..4ea27ec 100644 --- a/app/package.json +++ b/app/package.json @@ -11,9 +11,10 @@ "@material-ui/core": "^4.5.1", "@material-ui/icons": "^4.5.1", "bowser": "^2.7.0", + "create-torrent": "^4.4.1", "dompurify": "^2.0.7", "domready": "^1.0.8", - "end-of-stream": "1.4.0", + "end-of-stream": "1.4.1", "file-saver": "^2.0.2", "hark": "^1.2.3", "is-electron": "^2.2.0", @@ -37,7 +38,7 @@ "riek": "^1.1.0", "socket.io-client": "^2.3.0", "source-map-explorer": "^2.1.0", - "webtorrent": "^0.107.16" + "webtorrent": "^0.107.17" }, "scripts": { "analyze": "source-map-explorer build/static/js/*", diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index d9f18fd..d50d4ae 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -14,6 +14,8 @@ import * as consumerActions from './actions/consumerActions'; import * as producerActions from './actions/producerActions'; import * as notificationActions from './actions/notificationActions'; +let createTorrent; + let WebTorrent; let saveAs; @@ -704,26 +706,48 @@ export default class RoomClient }) })); - this._webTorrent.seed( - files, - { announceList: [['wss://tracker.lab.vvc.niif.hu:443']] }, - (torrent) => + createTorrent(files, (err, torrent) => + { + if (err) { - store.dispatch(requestActions.notify( + return store.dispatch(requestActions.notify( { + type : 'error', text : intl.formatMessage({ - id : 'filesharing.successfulFileShare', - defaultMessage : 'File successfully shared' + id : 'filesharing.unableToShare', + defaultMessage : 'Unable to share file' }) })); + } - store.dispatch(fileActions.addFile( - this._peerId, - torrent.magnetURI - )); + const existingTorrent = this._webTorrent.get(torrent); - this._sendFile(torrent.magnetURI); - }); + if (existingTorrent) + { + return this._sendFile(existingTorrent.magnetURI); + } + + this._webTorrent.seed( + files, + { announceList: [ [ 'wss://tracker.lab.vvc.niif.hu:443' ] ] }, + (newTorrent) => + { + store.dispatch(requestActions.notify( + { + text : intl.formatMessage({ + id : 'filesharing.successfulFileShare', + defaultMessage : 'File successfully shared' + }) + })); + + store.dispatch(fileActions.addFile( + this._peerId, + newTorrent.magnetURI + )); + + this._sendFile(newTorrent.magnetURI); + }); + }); } // { file, name, picture } @@ -1344,6 +1368,13 @@ export default class RoomClient async _loadDynamicImports() { + ({ default: createTorrent } = await import( + + /* webpackPrefetch: true */ + /* webpackChunkName: "createtorrent" */ + 'create-torrent' + )); + ({ default: WebTorrent } = await import( /* webpackPrefetch: true */ @@ -2066,6 +2097,30 @@ export default class RoomClient try { + this._torrentSupport = WebTorrent.WEBRTC_SUPPORT; + + this._webTorrent = this._torrentSupport && new WebTorrent({ + tracker : { + rtcConfig : { + iceServers : this._turnServers + } + } + }); + + this._webTorrent.on('error', (error) => + { + logger.error('Filesharing [error:"%o"]', error); + + store.dispatch(requestActions.notify( + { + type : 'error', + text : intl.formatMessage({ + id : 'filesharing.error', + defaultMessage : 'There was a filesharing error' + }) + })); + }); + this._mediasoupDevice = new mediasoupClient.Device(); const routerRtpCapabilities =