A missing room must not burn the seat
The client deleted its saved seat credentials on "no such room" — but that error proves nothing about the seat: a restarting server, a stale restore, or a wrong backend all say it, and burning the token on a transient locked a live player out of a live game (room 22EC, after this session's server-squatting incident). Now only "name is taken" — this exact token tried and refused — clears the credential; a not-found shows its error and keeps the key for the reconnect that finds the room home again. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
co-authored by
Claude Fable 5
parent
b396469bea
commit
72148dd7c2
@@ -507,8 +507,17 @@ class Net {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "error":
|
case "error":
|
||||||
if (this.roomIdPending && /no such room|name is taken/.test(msg.message)) {
|
// "Name is taken" means THIS token was tried and refused: the
|
||||||
|
// credential itself is dead, and holding it helps nobody. But
|
||||||
|
// "no such room" proves nothing about the seat — a restarting
|
||||||
|
// server, a stale restore, or the wrong backend all say it —
|
||||||
|
// and burning credentials on a transient locked a real player
|
||||||
|
// out of a live game. The seat stays; the error shows; a later
|
||||||
|
// reconnect against the right server walks back in.
|
||||||
|
if (this.roomIdPending && /name is taken/.test(msg.message)) {
|
||||||
localStorage.removeItem(SEAT_KEY);
|
localStorage.removeItem(SEAT_KEY);
|
||||||
|
}
|
||||||
|
if (this.roomIdPending && /no such room|name is taken/.test(msg.message)) {
|
||||||
this.roomIdPending = null;
|
this.roomIdPending = null;
|
||||||
}
|
}
|
||||||
this.error = msg.message;
|
this.error = msg.message;
|
||||||
|
|||||||
Reference in New Issue
Block a user