Ensure status/errors from global config nodes propagate properly

This commit is contained in:
Nick O'Leary
2015-11-02 20:41:59 +00:00
parent d1940a023a
commit ab87fa9ce4
7 changed files with 141 additions and 185 deletions

View File

@@ -33,6 +33,9 @@ function Node(n) {
if (n.name) {
this.name = n.name;
}
if (n._alias) {
this._alias = n._alias;
}
this.updateWires(n.wires);
}

View File

@@ -187,7 +187,6 @@ function Flow(global,flow) {
}
}
}
var targetCatchNodes = null;
var throwingNode = node;
var handled = false;

View File

@@ -38,6 +38,7 @@ var activeFlows = {};
var started = false;
var activeNodesToFlow = {};
var subflowInstanceNodeMap = {};
var typeEventRegistered = false;
@@ -151,19 +152,47 @@ function getConfig() {
return activeConfig;
}
function handleError(node,logMessage,msg) {
function delegateError(node,logMessage,msg) {
if (activeFlows[node.z]) {
activeFlows[node.z].handleError(node,logMessage,msg);
} else if (activeNodesToFlow[node.z]) {
activeFlows[activeNodesToFlow[node.z]].handleError(node,logMessage,msg);
} else if (activeFlowConfig.subflows[node.z]) {
subflowInstanceNodeMap[node.id].forEach(function(n) {
delegateError(getNode(n),logMessage,msg);
});
}
}
function handleError(node,logMessage,msg) {
if (node.z) {
delegateError(node,logMessage,msg);
} else {
if (activeFlowConfig.configs[node.id]) {
activeFlowConfig.configs[node.id]._users.forEach(function(id) {
var userNode = activeFlowConfig.allNodes[id];
delegateError(userNode,logMessage,msg);
})
}
}
}
function handleStatus(node,statusMessage) {
function delegateStatus(node,statusMessage) {
if (activeFlows[node.z]) {
activeFlows[node.z].handleStatus(node,statusMessage);
}
}
function handleStatus(node,statusMessage) {
if (node.z) {
delegateStatus(node,statusMessage);
} else {
if (activeFlowConfig.configs[node.id]) {
activeFlowConfig.configs[node.id]._users.forEach(function(id) {
var userNode = activeFlowConfig.allNodes[id];
delegateStatus(userNode,statusMessage);
})
}
}
}
function start(type,diff) {
@@ -223,7 +252,12 @@ function start(type,diff) {
var activeNodes = activeFlows[id].getActiveNodes();
Object.keys(activeNodes).forEach(function(nid) {
activeNodesToFlow[nid] = id;
if (activeNodes[nid]._alias) {
subflowInstanceNodeMap[activeNodes[nid]._alias] = subflowInstanceNodeMap[activeNodes[nid]._alias] || [];
subflowInstanceNodeMap[activeNodes[nid]._alias].push(nid);
}
});
}
}
events.emit("nodes-started");
@@ -267,6 +301,16 @@ function stop(type,diff) {
}
}
}
if (stopList) {
stopList.forEach(function(id) {
delete activeNodesToFlow[id];
});
}
// Ideally we'd prune just what got stopped - but mapping stopList
// id to the list of subflow instance nodes is something only Flow
// can do... so cheat by wiping the map knowing it'll be rebuilt
// in start()
subflowInstanceNodeMap = {};
if (diff) {
log.info(log._("nodes.flows.stopped-modified-"+type));
} else {

View File

@@ -97,11 +97,22 @@ module.exports = {
container.configs[n.id] = n;
} else {
flow.configs[n.id] = n;
flow.configs[n.id]._users = [];
}
}
}
}
});
config.forEach(function(n) {
if (n.type !== 'subflow' && n.type !== 'tab') {
for (var prop in n) {
if (n.hasOwnProperty(prop) && prop !== 'id' && prop !== 'wires' && prop !== '_users' && flow.configs[n[prop]]) {
// This property references a global config node
flow.configs[n[prop]]._users.push(n.id)
}
}
}
});
return flow;
},