aboutsummaryrefslogtreecommitdiff
path: root/src/NeoRuntimeManager/RuntimeProcess.js
diff options
context:
space:
mode:
authorJakob Stendahl <jakobste@uio.no>2021-10-03 16:44:59 +0200
committerJakob Stendahl <jakob.stendahl@outlook.com>2021-10-03 16:56:41 +0200
commit5cc8e0a8ed605a15b95b707b9d1b805f32271e3f (patch)
tree04cd86c70eff0a53df41a2bf7d0867207014f67c /src/NeoRuntimeManager/RuntimeProcess.js
parent076c967a8aaac929735694f295ade5adaf8c9ff3 (diff)
downloadLuxcena-Neo-5cc8e0a8ed605a15b95b707b9d1b805f32271e3f.tar.gz
Luxcena-Neo-5cc8e0a8ed605a15b95b707b9d1b805f32271e3f.zip
:building_construction: Use UNIX socket for IPC instead of stdin/out
Diffstat (limited to 'src/NeoRuntimeManager/RuntimeProcess.js')
-rw-r--r--src/NeoRuntimeManager/RuntimeProcess.js78
1 files changed, 15 insertions, 63 deletions
diff --git a/src/NeoRuntimeManager/RuntimeProcess.js b/src/NeoRuntimeManager/RuntimeProcess.js
index 60f6a28..60c1de9 100644
--- a/src/NeoRuntimeManager/RuntimeProcess.js
+++ b/src/NeoRuntimeManager/RuntimeProcess.js
@@ -3,10 +3,11 @@ let spawn = require("child_process");
class RuntimeProcess {
- constructor(_modePath, _onVarChange, _eventEmitter) {
+ constructor(_modePath, _eventEmitter) {
this.modePath = _modePath;
this.logfile = `${this.modePath}/mode.log`;
-
+ this.errfile = `${this.modePath}/mode.error`;
+
this.stdout = "";
this.stderr = "";
@@ -16,9 +17,6 @@ class RuntimeProcess {
this.isRunning = false;
this.exitCode = null;
- this.variables = {};
- this.globvars = {};
- this.onVarChange = _onVarChange;
this.eventEmitter = _eventEmitter;
}
@@ -29,7 +27,7 @@ class RuntimeProcess {
}
this.isRunning = true;
this.proc = spawn.spawn(
- "python3",
+ "python3",
[
"-u", // This makes us able to get real-time output
`${__basedir}/NeoRuntime/Runtime/neo_runtime.py`,
@@ -44,28 +42,13 @@ class RuntimeProcess {
});
fs.ensureFileSync(this.logfile);
+ fs.ensureFileSync(this.errfile);
this.eventEmitter.emit("proc:start");
this.proc.stdout.on('data', (_stdout) => {
let stdout_str = _stdout.toString();
-
- let regex = /{ ":::data:": { (.*) } }/gi;
- let data = stdout_str.match(regex);
- stdout_str = stdout_str.replace(regex, () => "");
-
- if ((data != null) && (data.length > 0)) {
- try {
- this.processVarData(data)
- } catch {}
- }
-
- if (stdout_str.replace("\n", "").replace(" ", "") == "") {
- // In this case, we want to ignore the data.
- } else {
- // stdout_str = stdout_str.replace(/\n$/, "")
- fs.appendFile(this.logfile, "\n====stdout====\n" + stdout_str);
- this.eventEmitter.emit("proc:stdout", stdout_str);
- }
+ fs.appendFile(this.logfile, `[${timestamp()}]: ` + stdout_str);
+ this.eventEmitter.emit("proc:stdout", stdout_str);
});
this.proc.stdout.on('end', () => {
@@ -73,9 +56,8 @@ class RuntimeProcess {
});
this.proc.stderr.on('data', (_stderr) => {
- // let stderr_str = _stderr.toString().replace(/\n$/, "")
- let stderr_str = _stderr.toString()
- fs.appendFile(this.logfile, "\n====stderr====\n" + stderr_str);
+ let stderr_str = _stderr.toString();
+ fs.appendFile(this.errfile, `[${timestamp()}]: ` + stderr_str);
this.eventEmitter.emit("proc:stderr", stderr_str);
});
@@ -85,7 +67,7 @@ class RuntimeProcess {
this.proc.on('close', (code) => {
if (code) {
- fs.appendFile(this.logfile, "\n====close====\nScript exited with code " + code.toString());
+ fs.appendFile(this.logfile, `[${timestamp()}]: ` + "Script exited with code " + code.toString());
}
this.eventEmitter.emit("proc:exit", 0);
this.isRunning = false;
@@ -106,45 +88,15 @@ class RuntimeProcess {
console.log(err);
}
}
-
- processVarData(data) {
- data = JSON.parse(data)[":::data:"];
- if (data.hasOwnProperty("globvars")) {
- forEachDiff(data["globvars"], this.globvars, (key, newVal) => {
- this.onVarChange("globvars", key, newVal);
- });
- this.globvars = data["globvars"];
- }
- if (data.hasOwnProperty("variables")) {
- forEachDiff(data["variables"], this.variables, (key, newVal) => {
- this.onVarChange("variables", key, newVal);
- });
- this.variables = data["variables"];
- }
- }
-
}
-const isObject = v => v && typeof v === 'object';
-
/**
- * Will call callback on all the differences between the dicts
+ * Creates and returns a timestamp that can be used in logfiles.
+ *
+ * @return {string} timestamp
*/
-function forEachDiff(dict1, dict2, callback) {
- for (const key of new Set([...Object.keys(dict1), ...Object.keys(dict2)])) {
- if (isObject(dict1[key]) && isObject(dict2[key])) {
- if (dict1[key].value !== dict2[key].value) {
- callback(key, dict1[key]);
- }
- } else if (dict1[key] !== dict2[key]) {
- if (isObject(dict2[key]) && (dict1[key] == null)) {
- dict2[key].value = null;
- callback(key, dict2[key])
- } else {
- callback(key, dict1[key]);
- }
- }
- }
+function timestamp() {
+ return (new Date()).toISOString();
}
module.exports = RuntimeProcess;