diff --git a/NearbyShare/Connection/InboundNearbyConnection.swift b/NearbyShare/Connection/InboundNearbyConnection.swift index c083a04..6c001c0 100644 --- a/NearbyShare/Connection/InboundNearbyConnection.swift +++ b/NearbyShare/Connection/InboundNearbyConnection.swift @@ -512,6 +512,7 @@ class InboundNearbyConnection: NearbyConnection { frame.v1.type = .response frame.v1.connectionResponse.status = .accept currentState = .receivingFiles + isTransferring = true try sendTransferSetupFrame(frame) } catch { lastError = error diff --git a/NearbyShare/Connection/NearbyConnection.swift b/NearbyShare/Connection/NearbyConnection.swift index 50bb45d..1f1c917 100644 --- a/NearbyShare/Connection/NearbyConnection.swift +++ b/NearbyShare/Connection/NearbyConnection.swift @@ -27,6 +27,12 @@ class NearbyConnection { var lastError: Error? var bytesTransferred: Int64 = 0 var cancelled: Bool = false + var isTransferring: Bool = false { + didSet { + log("[NearbyConnection] Now transferring. Setting up data transfer inactivity timer.") + startDataTransferTimer(previousBytesTransferred: bytesTransferred) + } + } private var payloadBuffers: [Int64: NSMutableData] = [:] private var connectionClosed: Bool = false @@ -171,7 +177,7 @@ class NearbyConnection { return } - self.startInactivityTimer() + self.startAndResetHeartbeatTimer() self.receiveFrameAsync(length: frameLength) } } @@ -193,7 +199,7 @@ class NearbyConnection { return } - self.startInactivityTimer() + self.startAndResetHeartbeatTimer() self.processReceivedFrame(frameData: content) self.receiveFrameAsync() } @@ -556,7 +562,7 @@ class NearbyConnection { } - func startInactivityTimer() { + func startAndResetHeartbeatTimer() { // Cancel previous timer if any inactivityTimer?.cancel() @@ -578,6 +584,25 @@ class NearbyConnection { } + func startDataTransferTimer(previousBytesTransferred: Int64) { + NearbyConnection.dispatchQueue.asyncAfter(deadline: .now() + timeoutInterval) { + + if previousBytesTransferred < self.bytesTransferred { + // everything good, transferred more than last check, schedule next check + self.startDataTransferTimer(previousBytesTransferred: self.bytesTransferred) + } + else { + // connection stale, need to abort + if !self.connectionClosed { + log("[NearbyConnection] Connection timeout: No more data received in \(self.timeoutInterval) seconds") + self.lastError = NearbyError.canceled(reason: .timedOut) + self.disconnect() + } + } + } + } + + // -- MARK: - Internal Data Model struct InternalFileInfo { diff --git a/NearbyShare/Connection/OutboundNearbyConnection.swift b/NearbyShare/Connection/OutboundNearbyConnection.swift index 3886be8..db4ee08 100644 --- a/NearbyShare/Connection/OutboundNearbyConnection.swift +++ b/NearbyShare/Connection/OutboundNearbyConnection.swift @@ -362,6 +362,7 @@ class OutboundNearbyConnection: NearbyConnection { switch frame.v1.connectionResponse.status { case .accept: currentState = .sendingFiles + isTransferring = true delegate?.outboundConnectionTransferAccepted(connection: self) if let textToSend = textToSend { @@ -457,7 +458,7 @@ class OutboundNearbyConnection: NearbyConnection { // only for logging self.bytesTransferred += Int64(fileBuffer.count) - startInactivityTimer() + startAndResetHeartbeatTimer() delegate?.outboundConnection(connection: self, transferProgress: Double(totalBytesSent) / Double(totalBytesToSend)) if currentTransfer!.currentOffset == currentTransfer!.totalBytes {