node-red-trexmes-service
Version:
service Nodes for trexMes systems
95 lines (86 loc) • 4.09 kB
JavaScript
module.exports = function(RED) {
"use strict";
function ContextSetter(n) {
RED.nodes.createNode(this, n);
const node = this;
node.name = n.name;
node.context = n.context;
node.workstationid = n.workstationid;
node.workstationidType = n.workstationidType || "num";
node.items = n.items || [];
node.on('input', function(msg) {
try {
let wsid;
if (node.workstationidType === "msg") {
wsid = RED.util.getMessageProperty(msg, node.workstationid);
} else {
wsid = Number(node.workstationid);
}
// Snapshot msg before payload is overwritten so 'msg' type items resolve correctly
const msgSnapshot = RED.util.cloneMessage(msg);
let payload = msg.payload;
let receiveddata = null;
if (Array.isArray(payload)) {
if (payload.length > 0 && payload[0].receiveddata !== undefined && payload[0].receiveddata !== null) {
receiveddata = msg.payload[0].receiveddata;
}
} else {
receiveddata = msg.payload;
msg.payload = [];
}
let tasks = node.items.map(function(item) {
return new Promise(function(resolve, reject) {
let computedValue;
switch (item.vt) {
case 'msg':
computedValue = RED.util.getMessageProperty(msgSnapshot, item.v);
break;
case 'flow':
computedValue = node.context().flow.get(item.v);
break;
case 'global':
computedValue = node.context().global.get(item.v);
break;
case 'num':
computedValue = Number(item.v);
break;
case 'json':
try { computedValue = JSON.parse(item.v); } catch (e) { computedValue = null; }
break;
case 'bool':
computedValue = item.v === 'true';
break;
case 'jsonata': {
let expr = RED.util.prepareJSONataExpression(item.v, node);
RED.util.evaluateJSONataExpression(expr, msgSnapshot, function(err, result) {
if (err) { reject(err); }
else { resolve({ itemname: item.n, value: result }); }
});
return;
}
default:
computedValue = item.v;
}
resolve({ itemname: item.n, value: computedValue });
});
});
Promise.all(tasks).then(function(resolvedItems) {
const newmsg = {
"message" : node.context,
"valuelabel" : wsid,
"name" : node.name,
"operationtype": "ContextSetterProcess",
"bindcontrols" : resolvedItems
};
msg.payload.push(newmsg);
node.send(msg);
}).catch(function(err) {
node.error("error: " + err.message, msg);
});
} catch (err) {
node.error("error: " + err.message, msg);
}
});
}
RED.nodes.registerType("Context Setter", ContextSetter);
};