From b62a89bfa718fb07c2e0e68181b9a2762dfc49c8 Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Thu, 7 Oct 2021 20:21:10 +0200 Subject: [PATCH] [mirotalksfu] - send file to specific participant --- public/js/Room.js | 8 +++++++- public/js/RoomClient.js | 21 ++++++++++++++------- src/Server.js | 12 ++++++++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/public/js/Room.js b/public/js/Room.js index d332a054..2345eb54 100644 --- a/public/js/Room.js +++ b/public/js/Room.js @@ -19,6 +19,7 @@ const _PEER = { raiseHand: '', lowerHand: '', ejectPeer: '', + sendFile: '', }; let participantsCount = 0; @@ -631,7 +632,7 @@ function handleButtons() { rc.closeProducer(RoomClient.mediaType.screen); }; fileShareButton.onclick = () => { - rc.selectFileToShare(); + rc.selectFileToShare(rc.peer_id); }; youTubeShareButton.onclick = () => { rc.youTubeShareVideo(); @@ -1296,6 +1297,7 @@ async function getParticipantsTable(peers) { + `; table += ` @@ -1304,6 +1306,7 @@ async function getParticipantsTable(peers) { + `; @@ -1315,6 +1318,7 @@ async function getParticipantsTable(peers) { let peer_video = peer_info.peer_video ? _PEER.videoOn : _PEER.videoOff; let peer_hand = peer_info.peer_hand ? _PEER.raiseHand : _PEER.lowerHand; let peer_eject = _PEER.ejectPeer; + let peer_sendFile = _PEER.sendFile; let peer_id = peer_info.peer_id; if (rc.peer_id === peer_id) { table += ` @@ -1324,6 +1328,7 @@ async function getParticipantsTable(peers) { + `; } else { @@ -1333,6 +1338,7 @@ async function getParticipantsTable(peers) { + `; diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js index 152bb2b9..954a91e3 100644 --- a/public/js/RoomClient.js +++ b/public/js/RoomClient.js @@ -1628,7 +1628,7 @@ class RoomClient { // FILE SHARING // #################################################### - selectFileToShare() { + selectFileToShare(peer_id, broadcast = true) { this.sound('open'); Swal.fire({ @@ -1660,13 +1660,15 @@ class RoomClient { } // send some metadata about our file to peers in the room this.socket.emit('fileInfo', { + peer_id: peer_id, + broadcast: broadcast, peer_name: this.peer_name, fileName: this.fileToSend.name, fileSize: this.fileToSend.size, fileType: this.fileToSend.type, }); setTimeout(() => { - this.sendFileData(); + this.sendFileData(peer_id, broadcast); }, 1000); } else { userLog('error', 'File not selected or empty.', 'top-end'); @@ -1699,7 +1701,7 @@ class RoomClient { this.receiveInProgress = true; } - sendFileData() { + sendFileData(peer_id, broadcast) { console.log('Send file ', { name: this.fileToSend.name, size: this.bytesToSize(this.fileToSend.size), @@ -1730,8 +1732,13 @@ class RoomClient { this.fileReader.addEventListener('load', (e) => { if (!this.sendInProgress) return; - this.sendFSData(e.target.result); - offset += e.target.result.byteLength; + let data = { + peer_id: peer_id, + broadcast: broadcast, + fileData: e.target.result, + }; + this.sendFSData(data); + offset += data.fileData.byteLength; sendProgress.value = offset; sendFilePercentage.innerHTML = 'Send progress: ' + ((offset / this.fileToSend.size) * 100).toFixed(2) + '%'; @@ -1783,8 +1790,8 @@ class RoomClient { handleFile(data) { if (!this.receiveInProgress) return; - this.receiveBuffer.push(data); - this.receivedSize += data.byteLength; + this.receiveBuffer.push(data.fileData); + this.receivedSize += data.fileData.byteLength; receiveProgress.value = this.receivedSize; receiveFilePercentage.innerHTML = 'Receive progress: ' + ((this.receivedSize / this.incomingFileInfo.fileSize) * 100).toFixed(2) + '%'; diff --git a/src/Server.js b/src/Server.js index 4ba49668..73220920 100644 --- a/src/Server.js +++ b/src/Server.js @@ -254,11 +254,19 @@ io.on('connection', (socket) => { socket.on('fileInfo', (data) => { log.debug('Send File Info', data); - roomList.get(socket.room_id).broadCast(socket.id, 'fileInfo', data); + if (data.broadcast) { + roomList.get(socket.room_id).broadCast(socket.id, 'fileInfo', data); + } else { + roomList.get(socket.room_id).sendTo(data.peer_id, 'fileInfo', data); + } }); socket.on('file', (data) => { - roomList.get(socket.room_id).broadCast(socket.id, 'file', data); + if (data.broadcast) { + roomList.get(socket.room_id).broadCast(socket.id, 'file', data); + } else { + roomList.get(socket.room_id).sendTo(data.peer_id, 'file', data); + } }); socket.on('fileAbort', (data) => {