diff --git a/public/scripts/network.js b/public/scripts/network.js index 0046231..2fa5760 100644 --- a/public/scripts/network.js +++ b/public/scripts/network.js @@ -321,6 +321,7 @@ class Peer { static STATE_IDLE = 'idle'; static STATE_PREPARE = 'prepare'; static STATE_TRANSFER_REQUEST_SENT = 'transfer-request-sent'; + static STATE_TRANSFER_REQUEST_RECEIVED = 'transfer-request-received'; static STATE_RECEIVE_PROCEEDING = 'receive-proceeding'; static STATE_TRANSFER_PROCEEDING = 'transfer-proceeding'; static STATE_TEXT_SENT = 'text-sent'; @@ -493,7 +494,7 @@ class Peer { this._onDisplayNameChanged(message); break; case 'state': - this._onState(message.state); + await this._onState(message.state); break; case 'transfer-request': await this._onTransferRequest(message); @@ -556,23 +557,29 @@ class Peer { this._sendMessage({type: 'state', state: this._state}) } - _onState(peerState) { - if (this._state === Peer.STATE_RECEIVE_PROCEEDING) { - this._onStateReceiver(peerState); + async _onState(peerState) { + if (this._state === Peer.STATE_TRANSFER_PROCEEDING) { + this._onStateIfSender(peerState); } - else if (this._state === Peer.STATE_TRANSFER_PROCEEDING) { - this._onStateSender(peerState); + else if (this._state === Peer.STATE_RECEIVE_PROCEEDING) { + this._onStateIfReceiver(peerState); + } + else if (this._state === Peer.STATE_TRANSFER_REQUEST_SENT) { + await this._onStateIfTransferRequestSent(peerState); + } + else if (this._state === Peer.STATE_TRANSFER_REQUEST_RECEIVED) { + this._onStateIfTransferRequestReceived(peerState); } } - _onStateSender(peerState) { + _onStateIfSender(peerState) { // this peer is sender if (peerState !== Peer.STATE_RECEIVE_PROCEEDING) { this._abortTransfer(); } } - _onStateReceiver(peerState) { + _onStateIfReceiver(peerState) { // this peer is receiver switch (peerState) { case Peer.STATE_TRANSFER_REQUEST_SENT: @@ -592,6 +599,25 @@ class Peer { } } + async _onStateIfTransferRequestSent(peerState) { + // This peer has sent a transfer request + // If other peer is still idle -> send request again + if (peerState === Peer.STATE_IDLE) { + await this._sendFileTransferRequest(this._filesRequested); + } + } + + _onStateIfTransferRequestReceived(peerState) { + // This peer has received a transfer request + // If other peer is not in "STATE_TRANSFER_REQUEST_SENT" anymore -> reset and hide request from user + if (peerState !== Peer.STATE_TRANSFER_REQUEST_SENT) { + this._reset(); + Events.fire('files-transfer-request-abort', { + peerId: this._peerId + }) + } + } + _abortTransfer() { Events.fire('set-progress', {peerId: this._peerId, progress: 0, status: 'error'}); this._reset(); @@ -625,7 +651,8 @@ class Peer { } } - Events.fire('set-progress', {peerId: this._peerId, progress: 1, status: 'prepare'}) + this._state = Peer.STATE_TRANSFER_REQUEST_SENT; + Events.fire('set-progress', {peerId: this._peerId, progress: 0, status: 'wait'}); this._filesRequested = files; @@ -636,8 +663,6 @@ class Peer { thumbnailDataUrl: dataUrl }); - Events.fire('set-progress', {peerId: this._peerId, progress: 0, status: 'wait'}) - this._state = Peer.STATE_TRANSFER_REQUEST_SENT; } _onTransferRequestResponse(message) { @@ -764,6 +789,7 @@ class Peer { } } + this._state = Peer.STATE_TRANSFER_REQUEST_RECEIVED; this._pendingRequest = request; // Automatically accept request if auto-accept is set to true via the Edit Paired Devices Dialog diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 0ef241c..10b8f46 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -1444,6 +1444,7 @@ class ReceiveRequestDialog extends ReceiveDialog { this._currentRequest = null; Events.on('files-transfer-request', e => this._onRequestFileTransfer(e.detail.request, e.detail.peerId)) + Events.on('files-transfer-request-abort', e => this._onRequestFileTransferAbort(e.detail.peerId)); Events.on('keydown', e => this._onKeyDown(e)); } @@ -1461,6 +1462,22 @@ class ReceiveRequestDialog extends ReceiveDialog { this._dequeueRequests(); } + _onRequestFileTransferAbort(peerId) { + // Remove file transfer request from this peer from queue + for (let i = 0; i < this._filesTransferRequestQueue.length; i++) { + if (this._filesTransferRequestQueue[i].peerId === peerId) { + this._filesTransferRequestQueue.splice(i, 1); + break; + } + } + + // Hide dialog if the currently open transfer request is from this peer + if (this.isShown() && this.correspondingPeerId === peerId) { + this.hide(); + Events.fire('notify-user', Localization.getTranslation("notifications.selected-peer-left")); + } + } + _dequeueRequests() { if (!this._filesTransferRequestQueue.length) { this._currentRequest = null; @@ -2724,6 +2741,7 @@ class Notifications { Events.on('text-received', e => this._messageNotification(e.detail.text, e.detail.peerId)); Events.on('files-received', e => this._downloadNotification(e.detail.files, e.detail.imagesOnly)); Events.on('files-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId)); + // Todo on 'files-transfer-request-abort' remove notification } async _requestPermission() {