mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-09-21 13:20:56 +02:00
82 lines
2.8 KiB
JavaScript
82 lines
2.8 KiB
JavaScript
/* Worker code, contains Netscript scripts that are actually running */
|
|
//TODO Need some way to stop scripts. Idea: Put a flag in the environment, we can setActive
|
|
//this flag from outside. If the evaluate() function sees that flag it rejects the current
|
|
// Promise. We can catch that rejection and stop the script.
|
|
|
|
//TODO Tested For and while and generic call statements. Have not tested if statements
|
|
|
|
/* Actual Worker Code */
|
|
function WorkerScript() {
|
|
this.name = "";
|
|
this.running = false;
|
|
this.serverIp = null;
|
|
this.code = "";
|
|
this.env = new Environment();
|
|
this.output = "";
|
|
}
|
|
|
|
//Array containing all scripts that are running across all servers, to easily run them all
|
|
var workerScripts = [];
|
|
|
|
//Loop through workerScripts and run every script that is not currently running
|
|
function runScriptsLoop() {
|
|
//Run any scripts that haven't been started
|
|
for (var i = 0; i < workerScripts.length; i++) {
|
|
//If it isn't running, start the script
|
|
if (workerScripts[i].running == false && workerScripts[i].env.stopFlag == false) {
|
|
var ast = Parser(Tokenizer(InputStream(workerScripts[i].code)));
|
|
|
|
console.log("Starting new script: " + workerScripts[i].name);
|
|
console.log("AST of new script:");
|
|
console.log(ast);
|
|
|
|
workerScripts[i].running = true;
|
|
var p = evaluate(ast, workerScripts[i]);
|
|
var foo = workerScripts[i];
|
|
//Once the code finishes (either resolved or rejected, doesnt matter), set its
|
|
//running status to false
|
|
p.then(function(w) {
|
|
w.running = false;
|
|
w.env.stopFlag = true;
|
|
}, function(w) {
|
|
w.running = false;
|
|
w.env.stopFlag = true;
|
|
});
|
|
}
|
|
}
|
|
|
|
//Delete any scripts that finished or have been killed. Loop backwards bc removing
|
|
//items fucks up the indexing
|
|
for (var i = workerScripts.length - 1; i >= 0; i--) {
|
|
if (workerScripts[i].running == false && workerScripts[i].env.stopFlag == true) {
|
|
console.log("Deleting scripts");
|
|
//Delete script from the runningScripts array on its host serverIp
|
|
var ip = workerScripts[i].serverIp;
|
|
var name = workerScripts[i].name;
|
|
for (var j = 0; j < AllServers[ip].runningScripts.length; j++) {
|
|
if (AllServers[ip].runningScripts[j] == name) {
|
|
AllServers[ip].runningScripts.splice(j, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Delete script from workerScripts
|
|
workerScripts.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
setTimeout(runScriptsLoop, 10000);
|
|
}
|
|
|
|
//Queues a script to be killed by settings its stop flag to true. Then, the code will reject
|
|
//all of its promises recursively, and when it does so it will no longer be running.
|
|
//The runScriptsLoop() will then delete the script from worker scripts
|
|
function killWorkerScript(scriptName, serverIp) {
|
|
for (var i = 0; i < workerScripts.length; i++) {
|
|
if (workerScripts[i].name == scriptName && workerScripts[i].serverIp == serverIp) {
|
|
workerScripts[i].env.stopFlag = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
runScriptsLoop(); |