da03 commited on
Commit
3f1526b
·
1 Parent(s): b682e6d
Files changed (2) hide show
  1. main.py +26 -7
  2. static/index.html +15 -9
main.py CHANGED
@@ -132,8 +132,8 @@ app.mount("/static", StaticFiles(directory="static"), name="static")
132
  connection_counter = 0
133
 
134
  # Connection timeout settings
135
- CONNECTION_TIMEOUT = 30 # 30 seconds timeout
136
- WARNING_TIME = 15 # 15 seconds warning before timeout
137
 
138
  # Create a thread pool executor
139
  thread_executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
@@ -391,7 +391,9 @@ async def websocket_endpoint(websocket: WebSocket):
391
  current_time = time.perf_counter()
392
  time_since_activity = current_time - last_user_activity_time
393
 
394
- # Send warning at 15 seconds
 
 
395
  if time_since_activity >= WARNING_TIME and not timeout_warning_sent:
396
  print(f"[{current_time:.3f}] Sending timeout warning to client {client_id}")
397
  await websocket.send_json({
@@ -399,40 +401,56 @@ async def websocket_endpoint(websocket: WebSocket):
399
  "timeout_in": CONNECTION_TIMEOUT - WARNING_TIME
400
  })
401
  timeout_warning_sent = True
 
402
 
403
- # Close connection at 30 seconds
404
  if time_since_activity >= CONNECTION_TIMEOUT:
405
- print(f"[{current_time:.3f}] Closing connection {client_id} due to timeout")
 
406
 
407
  # Clear the input queue before closing
 
 
408
  while not input_queue.empty():
409
  try:
410
  input_queue.get_nowait()
411
  input_queue.task_done()
412
  except asyncio.QueueEmpty:
413
  break
 
414
 
 
415
  await websocket.close(code=1000, reason="User inactivity timeout")
 
416
  return
417
 
418
  await asyncio.sleep(1) # Check every second
419
 
420
  except Exception as e:
421
  print(f"[{time.perf_counter():.3f}] Error in timeout check for client {client_id}: {e}")
 
 
422
  break
423
 
424
  # Function to update user activity
425
  def update_user_activity():
426
  nonlocal last_user_activity_time, timeout_warning_sent
 
427
  last_user_activity_time = time.perf_counter()
 
 
 
428
  if timeout_warning_sent:
429
  print(f"[{time.perf_counter():.3f}] User activity detected, resetting timeout warning for client {client_id}")
430
  timeout_warning_sent = False
 
431
  # Send activity reset notification to client
432
  asyncio.create_task(websocket.send_json({"type": "activity_reset"}))
 
433
 
434
  # Start timeout checking
435
  timeout_task = asyncio.create_task(check_timeout())
 
436
 
437
  async def process_input(data):
438
  nonlocal previous_frame, hidden_states, keys_down, frame_num, frame_count, is_processing
@@ -465,7 +483,7 @@ async def websocket_endpoint(websocket: WebSocket):
465
  else:
466
  # Update user activity for non-auto inputs
467
  update_user_activity()
468
- print(f'[{time.perf_counter():.3f}] Processing: x: {x}, y: {y}, is_left_click: {is_left_click}, is_right_click: {is_right_click}, keys_down_list: {keys_down_list}, keys_up_list: {keys_up_list}')
469
 
470
  # Update the set based on the received data
471
  for key in keys_down_list:
@@ -653,7 +671,8 @@ async def websocket_endpoint(websocket: WebSocket):
653
  except WebSocketDisconnect:
654
  # Log final EOS entry
655
  log_interaction(client_id, {}, is_end_of_session=True)
656
- print(f"WebSocket disconnected: {client_id}")
 
657
  break
658
 
659
  except Exception as e:
 
132
  connection_counter = 0
133
 
134
  # Connection timeout settings
135
+ CONNECTION_TIMEOUT = 20 # 20 seconds timeout
136
+ WARNING_TIME = 10 # 10 seconds warning before timeout
137
 
138
  # Create a thread pool executor
139
  thread_executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
 
391
  current_time = time.perf_counter()
392
  time_since_activity = current_time - last_user_activity_time
393
 
394
+ print(f"[{current_time:.3f}] Timeout check - time_since_activity: {time_since_activity:.1f}s, WARNING_TIME: {WARNING_TIME}s, CONNECTION_TIMEOUT: {CONNECTION_TIMEOUT}s")
395
+
396
+ # Send warning at 10 seconds
397
  if time_since_activity >= WARNING_TIME and not timeout_warning_sent:
398
  print(f"[{current_time:.3f}] Sending timeout warning to client {client_id}")
399
  await websocket.send_json({
 
401
  "timeout_in": CONNECTION_TIMEOUT - WARNING_TIME
402
  })
403
  timeout_warning_sent = True
404
+ print(f"[{current_time:.3f}] Timeout warning sent, timeout_warning_sent: {timeout_warning_sent}")
405
 
406
+ # Close connection at 20 seconds
407
  if time_since_activity >= CONNECTION_TIMEOUT:
408
+ print(f"[{current_time:.3f}] TIMEOUT REACHED! Closing connection {client_id} due to timeout")
409
+ print(f"[{current_time:.3f}] time_since_activity: {time_since_activity:.1f}s >= CONNECTION_TIMEOUT: {CONNECTION_TIMEOUT}s")
410
 
411
  # Clear the input queue before closing
412
+ queue_size_before = input_queue.qsize()
413
+ print(f"[{current_time:.3f}] Clearing input queue, size before: {queue_size_before}")
414
  while not input_queue.empty():
415
  try:
416
  input_queue.get_nowait()
417
  input_queue.task_done()
418
  except asyncio.QueueEmpty:
419
  break
420
+ print(f"[{current_time:.3f}] Input queue cleared, size after: {input_queue.qsize()}")
421
 
422
+ print(f"[{current_time:.3f}] About to close WebSocket connection...")
423
  await websocket.close(code=1000, reason="User inactivity timeout")
424
+ print(f"[{current_time:.3f}] WebSocket.close() called, returning from check_timeout")
425
  return
426
 
427
  await asyncio.sleep(1) # Check every second
428
 
429
  except Exception as e:
430
  print(f"[{time.perf_counter():.3f}] Error in timeout check for client {client_id}: {e}")
431
+ import traceback
432
+ traceback.print_exc()
433
  break
434
 
435
  # Function to update user activity
436
  def update_user_activity():
437
  nonlocal last_user_activity_time, timeout_warning_sent
438
+ old_time = last_user_activity_time
439
  last_user_activity_time = time.perf_counter()
440
+ print(f"[{time.perf_counter():.3f}] User activity detected for client {client_id}")
441
+ print(f"[{time.perf_counter():.3f}] last_user_activity_time updated: {old_time:.3f} -> {last_user_activity_time:.3f}")
442
+
443
  if timeout_warning_sent:
444
  print(f"[{time.perf_counter():.3f}] User activity detected, resetting timeout warning for client {client_id}")
445
  timeout_warning_sent = False
446
+ print(f"[{time.perf_counter():.3f}] timeout_warning_sent reset to: {timeout_warning_sent}")
447
  # Send activity reset notification to client
448
  asyncio.create_task(websocket.send_json({"type": "activity_reset"}))
449
+ print(f"[{time.perf_counter():.3f}] Activity reset message sent to client")
450
 
451
  # Start timeout checking
452
  timeout_task = asyncio.create_task(check_timeout())
453
+ print(f"[{time.perf_counter():.3f}] Timeout task started for client {client_id}")
454
 
455
  async def process_input(data):
456
  nonlocal previous_frame, hidden_states, keys_down, frame_num, frame_count, is_processing
 
483
  else:
484
  # Update user activity for non-auto inputs
485
  update_user_activity()
486
+ print(f'[{time.perf_counter():.3f}] Processing: x: {x}, y: {y}, is_left_click: {is_left_click}, is_right_click: {is_right_click}, keys_down_list: {keys_down_list}, keys_up_list: {keys_up_list}, time_since_activity: {time.perf_counter() - last_user_activity_time:.3f}')
487
 
488
  # Update the set based on the received data
489
  for key in keys_down_list:
 
671
  except WebSocketDisconnect:
672
  # Log final EOS entry
673
  log_interaction(client_id, {}, is_end_of_session=True)
674
+ print(f"[{time.perf_counter():.3f}] WebSocket disconnected: {client_id}")
675
+ print(f"[{time.perf_counter():.3f}] WebSocketDisconnect exception caught")
676
  break
677
 
678
  except Exception as e:
static/index.html CHANGED
@@ -91,6 +91,12 @@
91
  </div>
92
 
93
  <div class="canvas-container">
 
 
 
 
 
 
94
  <div class="canvas-wrapper">
95
  <div class="instruction-box">Move your mouse inside to interact</div>
96
  <canvas id="displayCanvas" width="512" height="384"></canvas>
@@ -114,12 +120,6 @@
114
  <input class="form-check-input" type="checkbox" role="switch" id="autoInputToggle" checked>
115
  <label class="form-check-label" for="autoInputToggle" id="autoInputLabel">Auto Input</label>
116
  </div>
117
-
118
- <div id="timeoutWarning" class="alert alert-warning" style="display: none; margin-top: 10px;">
119
- <strong>Connection Timeout Warning:</strong>
120
- No user activity detected. Connection will be dropped in <span id="timeoutCountdown">15</span> seconds.
121
- <button type="button" class="btn btn-sm btn-primary ms-2" onclick="resetTimeout()">Stay Connected</button>
122
- </div>
123
  </div>
124
  </div>
125
 
@@ -279,7 +279,7 @@
279
 
280
  // Timeout countdown mechanism
281
  let timeoutCountdownInterval = null;
282
- let timeoutCountdown = 15;
283
  let timeoutWarningActive = false;
284
 
285
  // Track currently pressed keys
@@ -369,7 +369,7 @@
369
  clearInterval(timeoutCountdownInterval);
370
  }
371
 
372
- timeoutCountdown = 15;
373
  timeoutWarningActive = true;
374
 
375
  // Show warning
@@ -400,7 +400,13 @@
400
  }
401
 
402
  timeoutWarningActive = false;
403
- timeoutCountdown = 15;
 
 
 
 
 
 
404
 
405
  // Hide warning
406
  const warning = document.getElementById('timeoutWarning');
 
91
  </div>
92
 
93
  <div class="canvas-container">
94
+ <div id="timeoutWarning" class="alert alert-warning" style="display: none; margin-bottom: 15px;">
95
+ <strong>Connection Timeout Warning:</strong>
96
+ No user activity detected. Connection will be dropped in <span id="timeoutCountdown">10</span> seconds.
97
+ <button type="button" class="btn btn-sm btn-primary ms-2" onclick="resetTimeout()">Stay Connected</button>
98
+ </div>
99
+
100
  <div class="canvas-wrapper">
101
  <div class="instruction-box">Move your mouse inside to interact</div>
102
  <canvas id="displayCanvas" width="512" height="384"></canvas>
 
120
  <input class="form-check-input" type="checkbox" role="switch" id="autoInputToggle" checked>
121
  <label class="form-check-label" for="autoInputToggle" id="autoInputLabel">Auto Input</label>
122
  </div>
 
 
 
 
 
 
123
  </div>
124
  </div>
125
 
 
279
 
280
  // Timeout countdown mechanism
281
  let timeoutCountdownInterval = null;
282
+ let timeoutCountdown = 10;
283
  let timeoutWarningActive = false;
284
 
285
  // Track currently pressed keys
 
369
  clearInterval(timeoutCountdownInterval);
370
  }
371
 
372
+ timeoutCountdown = 10;
373
  timeoutWarningActive = true;
374
 
375
  // Show warning
 
400
  }
401
 
402
  timeoutWarningActive = false;
403
+ timeoutCountdown = 10;
404
+
405
+ // Reset the countdown display to 10 seconds
406
+ const countdownElement = document.getElementById('timeoutCountdown');
407
+ if (countdownElement) {
408
+ countdownElement.textContent = timeoutCountdown;
409
+ }
410
 
411
  // Hide warning
412
  const warning = document.getElementById('timeoutWarning');