summaryrefslogtreecommitdiff
path: root/interactor/interactor.js
diff options
context:
space:
mode:
Diffstat (limited to 'interactor/interactor.js')
-rwxr-xr-xinteractor/interactor.js36
1 files changed, 34 insertions, 2 deletions
diff --git a/interactor/interactor.js b/interactor/interactor.js
index 8a8a32f..32f8517 100755
--- a/interactor/interactor.js
+++ b/interactor/interactor.js
@@ -36,25 +36,56 @@ app.get("/",function(req,res){
});
});
+var childpids=[];
+
+process.on("exit",function(){
+ console.log("Exiting:");
+ console.log.apply(console,arguments);
+ childpids.forEach(function(pid){process.kill(pid);});
+ process.exit();
+});
+process.on("SIGINT",function(){
+ console.log("SIGINT:");
+ console.log.apply(console,arguments);
+ childpids.forEach(function(pid){process.kill(pid);});
+ process.exit();
+});
+
function stopproc(proc){
+ var pid=proc.pid;
+ console.log("Stopping proc with pid "+pid+", childpids="+JSON.stringify(childpids));
proc.stdin.write("Quit\n");
var timeout=setTimeout(function(){
+ console.log("Proc with pid "+pid+" didn't stop in time, killing");
proc.kill();
+ var idx=childpids.indexOf(pid); if(idx!=-1)childpids.splice(idx,1);
},500);
proc.on("exit",function(){
clearTimeout(timeout);
+ var idx=childpids.indexOf(pid); if(idx!=-1)childpids.splice(idx,1);
});
}
io.on("connection",function(conn){
var id=uniqid();
console.log("New IO connection id "+id);
+ var pingtimeout=null;
var bd=emptyboard();
var aiplayer=0;
conn.on("disconnect",function(){
console.log("Disconnect id "+id);
+ if(proc){stopproc(proc);proc=null;}
+ if(pingtimeout)clearTimeout(pingtimeout);
+ });
+ conn.on("ping",function(){ //only enable ping timeouting if a first ping received
+ if(pingtimeout)clearTimeout(pingtimeout);
+ pingtimeout=setTimeout(function(){
+ console.log("Ping timeout on id "+id+"!");
+ if(proc){stopproc(proc);proc=null;}
+ conn.disconnect(true);
+ },4000);
});
conn.on("usermove",function(idx){
idx=+idx;
@@ -71,7 +102,7 @@ io.on("connection",function(conn){
var win=checkwin(bd);
if(win!=-1){
conn.emit("win",1-aiplayer);
- stopproc(proc);
+ if(proc){stopproc(proc);proc=null;}
return;
}
}
@@ -83,6 +114,7 @@ io.on("connection",function(conn){
var proc=spawn("sh",["-c",aicmd],{
stdio:["pipe","pipe",process.stderr]
});
+ childpids.push(proc.pid);
var buffer="";
proc.stdout.on("data",function(data){
var idx,line,mv,win;
@@ -105,7 +137,7 @@ io.on("connection",function(conn){
win=checkwin(bd);
if(win!=-1){
conn.emit("win",aiplayer);
- stopproc(proc);
+ if(proc){stopproc(proc);proc=null;}
return;
}
}