Skip to content

Commit f7c69d9

Browse files
committed
Heartbeat mechanism to check if receiver is connected
1 parent 2eda47a commit f7c69d9

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

lib/store.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ async def get_progress(self) -> int:
117117
progress = await self.redis.get(self._k_progress)
118118
return int(progress) if progress else 0
119119

120+
async def set_receiver_active(self) -> None:
121+
"""Mark receiver as actively downloading with TTL."""
122+
await self.redis.set(self.key('receiver_active'), '1', ex=5)
123+
124+
async def is_receiver_active(self) -> bool:
125+
"""Check if receiver is actively downloading."""
126+
return bool(await self.redis.exists(self.key('receiver_active')))
127+
120128
async def cleanup(self) -> None:
121129
"""Delete all transfer data."""
122130
pattern = self.key('*')

lib/transfer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ def _format_uid(uid: str):
6060
def get_file_info(self):
6161
return self.file.name, self.file.size, self.file.type
6262

63+
@property
64+
async def receiver_connected(self) -> bool:
65+
"""Check if a receiver is actively downloading."""
66+
return await self.store.is_receiver_active()
67+
6368
async def notify_receiver_connected(self):
6469
"""Notify sender that receiver connected."""
6570
await self.store.set_event('receiver_connected')
@@ -109,6 +114,8 @@ async def produce_download(self, on_error: Callable[[Exception | str], Awaitable
109114
self.info(f"▼ Resuming from byte {self.bytes_downloaded}")
110115

111116
try:
117+
await self.store.set_receiver_active()
118+
112119
async for chunk in self.store.stream_chunks():
113120
if chunk == self.DEAD_FLAG:
114121
raise TransferError("Sender disconnected")
@@ -120,6 +127,7 @@ async def produce_download(self, on_error: Callable[[Exception | str], Awaitable
120127

121128
self.bytes_downloaded += len(chunk)
122129
await self.store.save_progress(self.bytes_downloaded)
130+
await self.store.set_receiver_active()
123131
yield chunk
124132

125133
except TransferError as e:

views/http.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ async def http_download(request: Request, uid: str):
108108

109109
if not is_curl and not request.query_params.get('download'):
110110
log.info(f"▼ Browser request detected, serving download page")
111-
progress = await transfer.store.get_progress()
111+
receiver_connected = await transfer.receiver_connected
112112
return templates.TemplateResponse(request, "download.html",
113-
transfer.file.to_readable_dict() | {'receiver_connected': progress > 0})
113+
transfer.file.to_readable_dict() | {'receiver_connected': receiver_connected})
114114

115115
await transfer.notify_receiver_connected()
116116

0 commit comments

Comments
 (0)