tera/src/process/child-process.ts

121 lines
3.3 KiB
TypeScript

/*
* @project: TERA
* @version: Development (beta)
* @license: MIT (not for evil)
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
* Web: https://terafoundation.org
* Twitter: https://twitter.com/terafoundation
* Telegram: https://t.me/terafoundation
*/
global.GlobalRunID = 0;
global.GlobalRunMap = {};
var LastAlive = Date.now();
setTimeout(function() {
setInterval(CheckAlive, 1000);
}, 20000);
if (process.send) {
setInterval(function() {
process.send({ cmd: "Alive" });
}, 1000);
process.send({ cmd: "online", message: "OK" });
setInterval(function() {
process.send({ cmd: "Alive" });
}, 1000);
global.ToLogClient = function(Str, StrKey, bFinal) {
process.send({ cmd: "ToLogClient", Str: "" + Str, StrKey: StrKey, bFinal: bFinal });
};
}
function CheckAlive() {
if (global.NOALIVE)
return;
var Delta = Date.now() - LastAlive;
if (Delta > global.CHECK_STOP_CHILD_PROCESS) {
global.ToLog("ALIVE TIMEOUT. Stop and exit: " + Delta + "/" + global.CHECK_STOP_CHILD_PROCESS);
Exit();
return;
}
};
process.on('message', function(msg) {
LastAlive = Date.now();
switch (msg.cmd) {
case "Alive":
global.DELTA_CURRENT_TIME = msg.DELTA_CURRENT_TIME;
break;
case "Exit":
Exit();
break;
case "call":
var Err = 0;
var Ret;
try {
Ret = global[msg.Name](msg.Params);
}
catch (e) {
Err = 1;
Ret = "" + e;
}
if (msg.id)
process.send({ cmd: "retcall", id: msg.id, Err: Err, Params: Ret });
break;
case "retcall":
var F = global.GlobalRunMap[msg.id];
if (F) {
delete global.GlobalRunMap[msg.id];
F(msg.Err, msg.Params);
}
break;
case "ToLogClient":
{
global.ToLogClient0(msg.Str, msg.StrKey, msg.bFinal);
break;
}
case "Eval":
global.EvalCode(msg.Code);
break;
}
});
function Exit() {
if (global.OnExit)
global.OnExit();
process.exit(0);
};
process.RunRPC = function(Name, Params, F) {
if (F) {
global.GlobalRunID++;
try {
process.send({ cmd: "call", id: global.GlobalRunID, Name: Name, Params: Params });
global.GlobalRunMap[global.GlobalRunID] = F;
}
catch (e) {
}
}
else {
process.send({ cmd: "call", id: 0, Name: Name, Params: Params });
}
};
global.EvalCode = function(Code) {
var Result;
try {
var ret = eval(Code);
Result = JSON.stringify(ret, undefined, 4);
}
catch (e) {
Result = "" + e;
}
return Result;
};
process.on('uncaughtException', function(err) {
global.ToError(err.stack);
global.ToLog(err.stack);
global.TO_ERROR_LOG(global.PROCESS_NAME, 777, err);
global.ToLog("-----------------" + global.PROCESS_NAME + " EXIT------------------");
process.exit();
});
process.on('error' as any, function(err: TeraError) {
global.ToError(global.PROCESS_NAME + ":\n" + err.stack);
global.ToLog(err.stack);
});