node-red-contrib-self-healing
Version:
SHEN: Self-healing extensions for Node-RED.
101 lines (89 loc) • 2.71 kB
JavaScript
const request = require("request");
module.exports = function (RED) {
function setErrorStatus(errMsg, error, node, send, done) {
node.status({
fill: "red",
shape: "dot",
text: errMsg,
});
sendErrorOutput(error, send, done);
}
function sendErrorOutput(error, send, done) {
send([null, { payload: "Error" }]);
done(error);
}
function setSuccessStatus(node, sucessMsg, editedFlow, send, done, config) {
node.status({
fill: "green",
shape: "dot",
text: sucessMsg,
});
sendSuccessOutput(editedFlow, send, done, config);
}
function sendSuccessOutput(editedFlow, send, done, config) {
send([
{
payload: {
flow: config.targetFlow,
disabled: editedFlow["disabled"],
},
},
null,
]);
done();
}
function setFlowStatus(targetUrl, editedFlow, node, send, done, config) {
request
.put(
{
uri: targetUrl,
json: editedFlow,
},
function (error, response, body) {
if (!error && response.statusCode == 200) {
setSuccessStatus(node, "Ok", editedFlow, send, done, config);
} else {
setErrorStatus("Node Missconfig", error, node, send, done);
}
console.log("Upload successful! Server responded with:", body);
}
)
.on("error", function (error) {
setErrorStatus("Node Missconfig", error, node, send, done);
});
}
function getSetFlowStatus(targetUrl, node, msg, send, done, config) {
request
.get(targetUrl, function (error, response, body) {
if (!error && response.statusCode == 200) {
let editedFlow = JSON.parse(body);
editedFlow["disabled"] = !msg.payload ? true : false;
setFlowStatus(targetUrl, editedFlow, node, send, done, config);
} else {
setErrorStatus("Node Missconfig", error, node, send, done);
}
})
.on("error", function (error) {
setErrorStatus("Node Missconfig", error, node, send, done);
});
}
function FlowControl(config) {
RED.nodes.createNode(this, config);
const node = this;
node.on("input", function (msg, send, done) {
const targetUrl = `http://${config.targetHost}:${config.targetPort}/flow/${config.targetFlow}`;
if (typeof msg.payload === "boolean") {
getSetFlowStatus(targetUrl, node, msg, send, done, config);
} else {
setErrorStatus(
"Not Boolean Input",
"Input type is not boolean",
node,
send,
done
);
}
});
}
RED.nodes.registerType("flow-control", FlowControl);
};