Spaces:
Runtime error
Runtime error
da03
commited on
Commit
·
c1c036e
1
Parent(s):
3f1526b
- main.py +23 -2
- static/index.html +33 -8
main.py
CHANGED
@@ -537,8 +537,18 @@ async def websocket_endpoint(websocket: WebSocket):
|
|
537 |
|
538 |
# Send the generated frame back to the client
|
539 |
print(f"[{time.perf_counter():.3f}] Sending image to client...")
|
540 |
-
|
541 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
542 |
|
543 |
# Log the input
|
544 |
log_interaction(client_id, data, generated_frame=sample_img)
|
@@ -559,6 +569,12 @@ async def websocket_endpoint(websocket: WebSocket):
|
|
559 |
is_processing = False
|
560 |
return
|
561 |
|
|
|
|
|
|
|
|
|
|
|
|
|
562 |
#if is_processing:
|
563 |
# print(f"[{current_time:.3f}] Already processing an input. Will check again later.")
|
564 |
# return
|
@@ -657,6 +673,11 @@ async def websocket_endpoint(websocket: WebSocket):
|
|
657 |
await input_queue.put(data)
|
658 |
print(f"[{receive_time:.3f}] Received input. Queue size now: {input_queue.qsize()}")
|
659 |
|
|
|
|
|
|
|
|
|
|
|
660 |
# If we're not currently processing, start processing this input
|
661 |
if not is_processing:
|
662 |
print(f"[{receive_time:.3f}] Not currently processing, will call process_next_input()")
|
|
|
537 |
|
538 |
# Send the generated frame back to the client
|
539 |
print(f"[{time.perf_counter():.3f}] Sending image to client...")
|
540 |
+
try:
|
541 |
+
await websocket.send_json({"image": img_str})
|
542 |
+
print(f"[{time.perf_counter():.3f}] Image sent. Queue size before next_input: {input_queue.qsize()}")
|
543 |
+
except RuntimeError as e:
|
544 |
+
if "Cannot call 'send' once a close message has been sent" in str(e):
|
545 |
+
print(f"[{time.perf_counter():.3f}] WebSocket closed, skipping image send")
|
546 |
+
break
|
547 |
+
else:
|
548 |
+
raise e
|
549 |
+
except Exception as e:
|
550 |
+
print(f"[{time.perf_counter():.3f}] Error sending image: {e}")
|
551 |
+
break
|
552 |
|
553 |
# Log the input
|
554 |
log_interaction(client_id, data, generated_frame=sample_img)
|
|
|
569 |
is_processing = False
|
570 |
return
|
571 |
|
572 |
+
# Check if WebSocket is still open by checking if it's in a closed state
|
573 |
+
if websocket.client_state.value >= 2: # CLOSING or CLOSED
|
574 |
+
print(f"[{current_time:.3f}] WebSocket in closed state ({websocket.client_state.value}), stopping processing")
|
575 |
+
is_processing = False
|
576 |
+
return
|
577 |
+
|
578 |
#if is_processing:
|
579 |
# print(f"[{current_time:.3f}] Already processing an input. Will check again later.")
|
580 |
# return
|
|
|
673 |
await input_queue.put(data)
|
674 |
print(f"[{receive_time:.3f}] Received input. Queue size now: {input_queue.qsize()}")
|
675 |
|
676 |
+
# Check if WebSocket is still open before processing
|
677 |
+
if websocket.client_state.value >= 2: # CLOSING or CLOSED
|
678 |
+
print(f"[{receive_time:.3f}] WebSocket closed, skipping processing")
|
679 |
+
continue
|
680 |
+
|
681 |
# If we're not currently processing, start processing this input
|
682 |
if not is_processing:
|
683 |
print(f"[{receive_time:.3f}] Not currently processing, will call process_next_input()")
|
static/index.html
CHANGED
@@ -93,7 +93,7 @@
|
|
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 |
|
@@ -190,11 +190,24 @@
|
|
190 |
|
191 |
socket.onclose = function(event) {
|
192 |
console.log("WebSocket connection closed. Attempting to reconnect...");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
193 |
isConnected = false;
|
194 |
stopAutoInput(); // Stop auto-input when connection is lost
|
195 |
stopTimeoutCountdown(); // Stop timeout countdown when connection is lost
|
196 |
-
clearInterval(heartbeatInterval);
|
197 |
-
scheduleReconnection();
|
198 |
};
|
199 |
|
200 |
socket.onerror = function(error) {
|
@@ -387,8 +400,12 @@
|
|
387 |
}
|
388 |
|
389 |
if (timeoutCountdown <= 0) {
|
|
|
390 |
stopTimeoutCountdown();
|
391 |
-
|
|
|
|
|
|
|
392 |
}
|
393 |
}, 1000);
|
394 |
}
|
@@ -416,12 +433,20 @@
|
|
416 |
}
|
417 |
|
418 |
function resetTimeout() {
|
419 |
-
// Send a
|
420 |
-
if (socket && socket.readyState === WebSocket.OPEN) {
|
421 |
try {
|
422 |
-
socket.send(JSON.stringify({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
423 |
} catch (error) {
|
424 |
-
console.error("Error sending
|
425 |
}
|
426 |
}
|
427 |
stopTimeoutCountdown();
|
|
|
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 and page will refresh automatically.
|
97 |
<button type="button" class="btn btn-sm btn-primary ms-2" onclick="resetTimeout()">Stay Connected</button>
|
98 |
</div>
|
99 |
|
|
|
190 |
|
191 |
socket.onclose = function(event) {
|
192 |
console.log("WebSocket connection closed. Attempting to reconnect...");
|
193 |
+
console.log("Close event code:", event.code, "reason:", event.reason);
|
194 |
+
|
195 |
+
// Check if this was a timeout closure
|
196 |
+
if (event.code === 1000 && event.reason === "User inactivity timeout") {
|
197 |
+
console.log("Connection closed due to timeout - refreshing page");
|
198 |
+
stopAutoInput(); // Stop auto-input when connection is lost
|
199 |
+
stopTimeoutCountdown(); // Stop timeout countdown when connection is lost
|
200 |
+
//clearInterval(heartbeatInterval);
|
201 |
+
// Refresh the page to reconnect
|
202 |
+
window.location.reload();
|
203 |
+
return;
|
204 |
+
}
|
205 |
+
|
206 |
isConnected = false;
|
207 |
stopAutoInput(); // Stop auto-input when connection is lost
|
208 |
stopTimeoutCountdown(); // Stop timeout countdown when connection is lost
|
209 |
+
//clearInterval(heartbeatInterval);
|
210 |
+
//scheduleReconnection();
|
211 |
};
|
212 |
|
213 |
socket.onerror = function(error) {
|
|
|
400 |
}
|
401 |
|
402 |
if (timeoutCountdown <= 0) {
|
403 |
+
stopAutoInput();
|
404 |
stopTimeoutCountdown();
|
405 |
+
//clearInterval(heartbeatInterval);
|
406 |
+
console.log("Connection timeout countdown finished - refreshing page");
|
407 |
+
// Refresh the page to reconnect
|
408 |
+
window.location.reload();
|
409 |
}
|
410 |
}, 1000);
|
411 |
}
|
|
|
433 |
}
|
434 |
|
435 |
function resetTimeout() {
|
436 |
+
// Send a regular input to reset the server's timeout
|
437 |
+
if (socket && socket.readyState === WebSocket.OPEN && lastSentPosition) {
|
438 |
try {
|
439 |
+
socket.send(JSON.stringify({
|
440 |
+
"x": lastSentPosition.x,
|
441 |
+
"y": lastSentPosition.y,
|
442 |
+
"is_left_click": false,
|
443 |
+
"is_right_click": false,
|
444 |
+
"keys_down": [],
|
445 |
+
"keys_up": []
|
446 |
+
}));
|
447 |
+
updateLastUserInputTime(); // Update for auto-input mechanism
|
448 |
} catch (error) {
|
449 |
+
console.error("Error sending timeout reset input:", error);
|
450 |
}
|
451 |
}
|
452 |
stopTimeoutCountdown();
|