fix: 10s timeout on handshake CallAnswer; button stays visible during connect
- handshake.rs: add 10s timeout on recv_signal() waiting for CallAnswer — previously hung forever if relay didn't respond, making join button disappear with no feedback - main.ts: keep join button visible + show "Connecting…" state instead of hiding it before the await; button restores correctly on error Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -101,10 +101,13 @@ pub async fn perform_handshake(
|
|||||||
.await
|
.await
|
||||||
.map_err(HandshakeError::Transport)?;
|
.map_err(HandshakeError::Transport)?;
|
||||||
|
|
||||||
// 5. Wait for CallAnswer
|
// 5. Wait for CallAnswer — 10s timeout guards against relay not responding.
|
||||||
let answer = transport
|
let answer = tokio::time::timeout(
|
||||||
.recv_signal()
|
std::time::Duration::from_secs(10),
|
||||||
|
transport.recv_signal(),
|
||||||
|
)
|
||||||
.await
|
.await
|
||||||
|
.map_err(|_| HandshakeError::Transport(wzp_proto::TransportError::Timeout { ms: 10_000 }))?
|
||||||
.map_err(HandshakeError::Transport)?
|
.map_err(HandshakeError::Transport)?
|
||||||
.ok_or(HandshakeError::ConnectionClosed)?;
|
.ok_or(HandshakeError::ConnectionClosed)?;
|
||||||
|
|
||||||
|
|||||||
@@ -331,7 +331,9 @@ joinVoiceBtn.addEventListener("click", async () => {
|
|||||||
const s = loadSettings();
|
const s = loadSettings();
|
||||||
if (!relay) { showToast("No relay configured"); return; }
|
if (!relay) { showToast("No relay configured"); return; }
|
||||||
connectPending = true;
|
connectPending = true;
|
||||||
joinVoiceBtn.classList.add("hidden");
|
const origText = joinVoiceBtn.textContent;
|
||||||
|
joinVoiceBtn.textContent = "Connecting…";
|
||||||
|
(joinVoiceBtn as HTMLButtonElement).disabled = true;
|
||||||
try {
|
try {
|
||||||
await invoke("connect", {
|
await invoke("connect", {
|
||||||
relay: relay.address,
|
relay: relay.address,
|
||||||
@@ -344,9 +346,10 @@ joinVoiceBtn.addEventListener("click", async () => {
|
|||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
console.error("connect failed:", e);
|
console.error("connect failed:", e);
|
||||||
showToast(`Join failed: ${e}`);
|
showToast(`Join failed: ${e}`);
|
||||||
joinVoiceBtn.classList.remove("hidden");
|
|
||||||
} finally {
|
} finally {
|
||||||
connectPending = false;
|
connectPending = false;
|
||||||
|
joinVoiceBtn.textContent = origText;
|
||||||
|
(joinVoiceBtn as HTMLButtonElement).disabled = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user