Spaces:
Runtime error
Runtime error
da03
commited on
Commit
·
941cf55
1
Parent(s):
8b76adf
- dispatcher.py +34 -4
dispatcher.py
CHANGED
|
@@ -182,6 +182,8 @@ class UserSession:
|
|
| 182 |
ip_address: Optional[str] = None
|
| 183 |
interaction_count: int = 0
|
| 184 |
queue_start_time: Optional[float] = None
|
|
|
|
|
|
|
| 185 |
|
| 186 |
@dataclass
|
| 187 |
class WorkerInfo:
|
|
@@ -332,23 +334,27 @@ class SessionManager:
|
|
| 332 |
elapsed = current_time - session.last_activity if session.last_activity else 0
|
| 333 |
remaining = session.max_session_time - elapsed
|
| 334 |
|
| 335 |
-
# Send warning at 15 seconds before timeout
|
| 336 |
-
if remaining <= 15 and remaining > 10:
|
| 337 |
await session.websocket.send_json({
|
| 338 |
"type": "session_warning",
|
| 339 |
"time_remaining": remaining,
|
| 340 |
"queue_size": len(self.session_queue)
|
| 341 |
})
|
|
|
|
|
|
|
| 342 |
|
| 343 |
# Grace period handling
|
| 344 |
elif remaining <= 10 and remaining > 0:
|
| 345 |
# Check if queue is empty - if so, extend session
|
| 346 |
if len(self.session_queue) == 0:
|
| 347 |
session.max_session_time = None # Remove time limit
|
|
|
|
| 348 |
await session.websocket.send_json({
|
| 349 |
"type": "time_limit_removed",
|
| 350 |
"reason": "queue_empty"
|
| 351 |
})
|
|
|
|
| 352 |
else:
|
| 353 |
await session.websocket.send_json({
|
| 354 |
"type": "grace_period",
|
|
@@ -367,11 +373,13 @@ class SessionManager:
|
|
| 367 |
if idle_time >= self.IDLE_TIMEOUT:
|
| 368 |
await self.end_session(session_id, SessionStatus.TIMEOUT)
|
| 369 |
return
|
| 370 |
-
elif idle_time >= self.QUEUE_WARNING_TIME:
|
| 371 |
await session.websocket.send_json({
|
| 372 |
"type": "idle_warning",
|
| 373 |
"time_remaining": self.IDLE_TIMEOUT - idle_time
|
| 374 |
})
|
|
|
|
|
|
|
| 375 |
|
| 376 |
await asyncio.sleep(1) # Check every second
|
| 377 |
|
|
@@ -510,11 +518,33 @@ class SessionManager:
|
|
| 510 |
return full_cycles_time + current_cycle_time
|
| 511 |
|
| 512 |
async def handle_user_activity(self, session_id: str):
|
| 513 |
-
"""Update user activity timestamp"""
|
| 514 |
session = self.sessions.get(session_id)
|
| 515 |
if session:
|
|
|
|
| 516 |
session.last_activity = time.time()
|
| 517 |
session.interaction_count += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 518 |
if not session.user_has_interacted:
|
| 519 |
session.user_has_interacted = True
|
| 520 |
logger.info(f"User started interacting in session {session_id}")
|
|
|
|
| 182 |
ip_address: Optional[str] = None
|
| 183 |
interaction_count: int = 0
|
| 184 |
queue_start_time: Optional[float] = None
|
| 185 |
+
idle_warning_sent: bool = False
|
| 186 |
+
session_warning_sent: bool = False
|
| 187 |
|
| 188 |
@dataclass
|
| 189 |
class WorkerInfo:
|
|
|
|
| 334 |
elapsed = current_time - session.last_activity if session.last_activity else 0
|
| 335 |
remaining = session.max_session_time - elapsed
|
| 336 |
|
| 337 |
+
# Send warning at 15 seconds before timeout (only once)
|
| 338 |
+
if remaining <= 15 and remaining > 10 and not session.session_warning_sent:
|
| 339 |
await session.websocket.send_json({
|
| 340 |
"type": "session_warning",
|
| 341 |
"time_remaining": remaining,
|
| 342 |
"queue_size": len(self.session_queue)
|
| 343 |
})
|
| 344 |
+
session.session_warning_sent = True
|
| 345 |
+
logger.info(f"Session warning sent to {session_id}, time remaining: {remaining:.1f}s")
|
| 346 |
|
| 347 |
# Grace period handling
|
| 348 |
elif remaining <= 10 and remaining > 0:
|
| 349 |
# Check if queue is empty - if so, extend session
|
| 350 |
if len(self.session_queue) == 0:
|
| 351 |
session.max_session_time = None # Remove time limit
|
| 352 |
+
session.session_warning_sent = False # Reset warning since limit removed
|
| 353 |
await session.websocket.send_json({
|
| 354 |
"type": "time_limit_removed",
|
| 355 |
"reason": "queue_empty"
|
| 356 |
})
|
| 357 |
+
logger.info(f"Session time limit removed for {session_id} (queue empty)")
|
| 358 |
else:
|
| 359 |
await session.websocket.send_json({
|
| 360 |
"type": "grace_period",
|
|
|
|
| 373 |
if idle_time >= self.IDLE_TIMEOUT:
|
| 374 |
await self.end_session(session_id, SessionStatus.TIMEOUT)
|
| 375 |
return
|
| 376 |
+
elif idle_time >= self.QUEUE_WARNING_TIME and not session.idle_warning_sent:
|
| 377 |
await session.websocket.send_json({
|
| 378 |
"type": "idle_warning",
|
| 379 |
"time_remaining": self.IDLE_TIMEOUT - idle_time
|
| 380 |
})
|
| 381 |
+
session.idle_warning_sent = True
|
| 382 |
+
logger.info(f"Idle warning sent to {session_id}, time remaining: {self.IDLE_TIMEOUT - idle_time:.1f}s")
|
| 383 |
|
| 384 |
await asyncio.sleep(1) # Check every second
|
| 385 |
|
|
|
|
| 518 |
return full_cycles_time + current_cycle_time
|
| 519 |
|
| 520 |
async def handle_user_activity(self, session_id: str):
|
| 521 |
+
"""Update user activity timestamp and reset warning flags"""
|
| 522 |
session = self.sessions.get(session_id)
|
| 523 |
if session:
|
| 524 |
+
old_time = session.last_activity
|
| 525 |
session.last_activity = time.time()
|
| 526 |
session.interaction_count += 1
|
| 527 |
+
|
| 528 |
+
# Reset warning flags if user activity detected after warnings
|
| 529 |
+
warning_reset = False
|
| 530 |
+
if session.idle_warning_sent:
|
| 531 |
+
logger.info(f"User activity detected, resetting idle warning for session {session_id}")
|
| 532 |
+
session.idle_warning_sent = False
|
| 533 |
+
warning_reset = True
|
| 534 |
+
|
| 535 |
+
if session.session_warning_sent:
|
| 536 |
+
logger.info(f"User activity detected, resetting session warning for session {session_id}")
|
| 537 |
+
session.session_warning_sent = False
|
| 538 |
+
warning_reset = True
|
| 539 |
+
|
| 540 |
+
# Notify client that activity was detected and warnings are reset
|
| 541 |
+
if warning_reset:
|
| 542 |
+
try:
|
| 543 |
+
await session.websocket.send_json({"type": "activity_reset"})
|
| 544 |
+
logger.info(f"Activity reset message sent to session {session_id}")
|
| 545 |
+
except Exception as e:
|
| 546 |
+
logger.error(f"Failed to send activity reset to session {session_id}: {e}")
|
| 547 |
+
|
| 548 |
if not session.user_has_interacted:
|
| 549 |
session.user_has_interacted = True
|
| 550 |
logger.info(f"User started interacting in session {session_id}")
|