From 098e8468ae7a52a55850c09f90506f52b8133567 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sat, 8 Dec 2018 14:34:52 +0100
Subject: [PATCH] Attempt to not throw exception on server socket error

---
 TODO                                     |  4 ---
 public/javascripts/base_rules.js         |  1 +
 public/javascripts/variants/Checkered.js |  6 ++--
 sockets.js                               | 40 ++++++++++++++++++------
 4 files changed, 36 insertions(+), 15 deletions(-)
 delete mode 100644 TODO

diff --git a/TODO b/TODO
deleted file mode 100644
index bcda2e84..00000000
--- a/TODO
+++ /dev/null
@@ -1,4 +0,0 @@
-For animation, moves should contains "moving" and "fading" maybe...
-(But it's really just for Magnetic chess)
-setInterval "CRON" task in sockets.js to check connected clients
-(every 1hour maybe, or more)
diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js
index 172f68b4..860495a4 100644
--- a/public/javascripts/base_rules.js
+++ b/public/javascripts/base_rules.js
@@ -10,6 +10,7 @@ class PiPo //Piece+Position
 	}
 }
 
+// TODO: for animation, moves should contains "moving" and "fading" maybe...
 class Move
 {
 	// o: {appear, vanish, [start,] [end,]}
diff --git a/public/javascripts/variants/Checkered.js b/public/javascripts/variants/Checkered.js
index b702018a..b9e7223b 100644
--- a/public/javascripts/variants/Checkered.js
+++ b/public/javascripts/variants/Checkered.js
@@ -262,9 +262,11 @@ class CheckeredRules extends ChessRules
 				notation = startColumn + "x" + finalSquare + "=" + move.appear[0].p.toUpperCase();
 			}
 			else //no capture
+			{
 				notation = finalSquare;
-			if (move.appear.length > 0 && piece != move.appear[0].p) //promotion
-				notation += "=" + move.appear[0].p.toUpperCase();
+				if (move.appear.length > 0 && piece != move.appear[0].p) //promotion
+					notation += "=" + move.appear[0].p.toUpperCase();
+			}
 			return notation;
 		}
 
diff --git a/sockets.js b/sockets.js
index 820a88c7..452cb6e0 100644
--- a/sockets.js
+++ b/sockets.js
@@ -8,6 +8,19 @@ module.exports = function(wss) {
 	for (const v of Variants)
 		clients[v.name] = {};
 
+//	// Safety counter (TODO: is it necessary ?)
+//	setInterval(() => {
+//		Object.keys(clients).forEach(k => {
+//			Object.keys(clients[k]).forEach(ck => {
+//				if (!clients[k][ck] || clients[k][ck].readyState != 1)
+//					delete clients[k][ck];
+//			});
+//		});
+//	}, 60000); //every minute (will be lowered if a lot of users...)
+
+	// No-op function as a callback when sending messages
+	const noop = () => { };
+
 	wss.on("connection", (socket, req) => {
 		const params = new URL("http://localhost" + req.url).searchParams;
 		const sid = params.get("sid");
@@ -25,11 +38,11 @@ module.exports = function(wss) {
 		{
 			// Send to every client connected on index an update message for counts
 			Object.keys(clients["index"]).forEach( k => {
-				clients["index"][k].send(JSON.stringify({code:"increase",vname:page}));
+				clients["index"][k].send(JSON.stringify({code:"increase",vname:page}), noop);
 			});
 			// Also notify potential opponents: hit all clients which check if sid corresponds
 			Object.keys(clients[page]).forEach( k => {
-				clients[page][k].send(JSON.stringify({code:"connect",id:sid}));
+				clients[page][k].send(JSON.stringify({code:"connect",id:sid}), noop);
 			});
 			socket.on("message", objtxt => {
 				let obj = JSON.parse(objtxt);
@@ -37,7 +50,10 @@ module.exports = function(wss) {
 				{
 					case "newmove":
 						if (!!clients[page][obj.oppid])
-							clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
+						{
+							clients[page][obj.oppid].send(
+								JSON.stringify({code:"newmove",move:obj.move}), noop);
+						}
 						break;
 					case "ping":
 						if (!!clients[page][obj.oppid])
@@ -48,7 +64,7 @@ module.exports = function(wss) {
 						{
 							const oppId = obj.oppid;
 							obj.oppid = sid; //I'm oppid for my opponent
-							clients[page][oppId].send(JSON.stringify(obj));
+							clients[page][oppId].send(JSON.stringify(obj), noop);
 						}
 						break;
 					case "newgame":
@@ -59,16 +75,22 @@ module.exports = function(wss) {
 							const fen = games[page]["fen"];
 							delete games[page];
 							const mycolor = Math.random() < 0.5 ? 'w' : 'b';
-							socket.send(JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor}));
+							socket.send(
+								JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor}));
 							if (!!clients[page][oppId])
-								clients[page][oppId].send(JSON.stringify({code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}));
+							{
+								clients[page][oppId].send(
+									JSON.stringify(
+										{code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}),
+									noop);
+							}
 						}
 						else
 							games[page] = {id:sid, fen:obj.fen}; //wait for opponent
 						break;
 					case "resign":
 						if (!!clients[page][obj.oppid])
-							clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
+							clients[page][obj.oppid].send(JSON.stringify({code:"resign"}), noop);
 						break;
 				}
 			});
@@ -82,12 +104,12 @@ module.exports = function(wss) {
 			{
 				// Send to every client connected on index an update message for counts
 				Object.keys(clients["index"]).forEach( k => {
-					clients["index"][k].send(JSON.stringify({code:"decrease",vname:page}));
+					clients["index"][k].send(JSON.stringify({code:"decrease",vname:page}), noop);
 				});
 			}
 			// Also notify potential opponents: hit all clients which check if sid corresponds
 			Object.keys(clients[page]).forEach( k => {
-				clients[page][k].send(JSON.stringify({code:"disconnect",id:sid}));
+				clients[page][k].send(JSON.stringify({code:"disconnect",id:sid}), noop);
 			});
 		});
 	});
-- 
2.44.0