Forced drops bank honestly; half-dead sockets confess
DROP OBJECT's forced drop hardcoded onHomeOf null and skipped the victory check — a treasure shaken loose over a home square neither reported the banking nor triggered scoring or the captured-treasures clause until something else prodded the engine. It now lands like any drop: homeOwnerAt reported, checkVictory immediate. And the stuck-game mystery from 38YP: a deploy restart left the browser holding a half-dead socket that never fired onclose, so the existing reconnect loop and masthead banner never engaged and a live game wore a frozen face. The client now pings every 15s and force- closes a socket silent for 45s, which wakes the reconnect machinery; the server answers pong. 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
5eb5312637
commit
ca0a4ef2e3
@@ -475,6 +475,12 @@ wss.on("connection", (socket) => {
|
||||
|
||||
try {
|
||||
switch (msg.type) {
|
||||
case "ping":
|
||||
// Liveness probe: the reply is the point. A restart can leave
|
||||
// browsers holding half-dead sockets that never fire onclose;
|
||||
// silence answered by silence is how the client finds out.
|
||||
send(socket, { type: "pong" });
|
||||
break;
|
||||
case "create": {
|
||||
const name = cleanName(msg.name);
|
||||
if (!name) return send(socket, { type: "error", message: "name required" });
|
||||
|
||||
Reference in New Issue
Block a user