mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Refactor lib/flows code to include initial router component
This commit is contained in:
@@ -52,7 +52,7 @@ var api = module.exports = {
|
||||
getFlows: function(opts) {
|
||||
return new Promise(function(resolve,reject) {
|
||||
runtime.log.audit({event: "flows.get"}, opts.req);
|
||||
return resolve(runtime.nodes.getFlows());
|
||||
return resolve(runtime.flows.getFlows());
|
||||
});
|
||||
},
|
||||
/**
|
||||
@@ -75,10 +75,10 @@ var api = module.exports = {
|
||||
|
||||
var apiPromise;
|
||||
if (deploymentType === 'reload') {
|
||||
apiPromise = runtime.nodes.loadFlows(true);
|
||||
apiPromise = runtime.flows.loadFlows(true);
|
||||
} else {
|
||||
if (flows.hasOwnProperty('rev')) {
|
||||
var currentVersion = runtime.nodes.getFlows().rev;
|
||||
var currentVersion = runtime.flows.getFlows().rev;
|
||||
if (currentVersion !== flows.rev) {
|
||||
var err;
|
||||
err = new Error();
|
||||
@@ -114,7 +114,7 @@ var api = module.exports = {
|
||||
return mutex.runExclusive(function() {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var flow = opts.flow;
|
||||
runtime.nodes.addFlow(flow,opts.user).then(function (id) {
|
||||
runtime.flows.addFlow(flow, opts.user).then(function (id) {
|
||||
runtime.log.audit({event: "flow.add", id: id}, opts.req);
|
||||
return resolve(id);
|
||||
}).catch(function (err) {
|
||||
@@ -141,7 +141,7 @@ var api = module.exports = {
|
||||
*/
|
||||
getFlow: function(opts) {
|
||||
return new Promise(function (resolve,reject) {
|
||||
var flow = runtime.nodes.getFlow(opts.id);
|
||||
var flow = runtime.flows.getFlow(opts.id);
|
||||
if (flow) {
|
||||
runtime.log.audit({event: "flow.get",id:opts.id}, opts.req);
|
||||
return resolve(flow);
|
||||
@@ -170,7 +170,7 @@ var api = module.exports = {
|
||||
var flow = opts.flow;
|
||||
var id = opts.id;
|
||||
try {
|
||||
runtime.nodes.updateFlow(id, flow, opts.user).then(function () {
|
||||
runtime.flows.updateFlow(id, flow, opts.user).then(function () {
|
||||
runtime.log.audit({event: "flow.update", id: id}, opts.req);
|
||||
return resolve(id);
|
||||
}).catch(function (err) {
|
||||
@@ -216,7 +216,7 @@ var api = module.exports = {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var id = opts.id;
|
||||
try {
|
||||
runtime.nodes.removeFlow(id, opts.user).then(function () {
|
||||
runtime.flows.removeFlow(id, opts.user).then(function () {
|
||||
runtime.log.audit({event: "flow.remove", id: id}, opts.req);
|
||||
return resolve();
|
||||
}).catch(function (err) {
|
||||
|
@@ -17,8 +17,10 @@
|
||||
var clone = require("clone");
|
||||
var redUtil = require("@node-red/util").util;
|
||||
var flowUtil = require("./util");
|
||||
var events = require("../../events");
|
||||
const context = require('../context');
|
||||
var events = require("../events");
|
||||
const context = require('../nodes/context');
|
||||
const router = require("./router");
|
||||
|
||||
|
||||
var Subflow;
|
||||
var Log;
|
||||
@@ -543,6 +545,10 @@ class Flow {
|
||||
return asyncMessageDelivery
|
||||
}
|
||||
|
||||
send(src,destinationId,msg) {
|
||||
router.send(src,destinationId,msg);
|
||||
}
|
||||
|
||||
dump() {
|
||||
console.log("==================")
|
||||
console.log(this.TYPE, this.id);
|
@@ -16,14 +16,14 @@
|
||||
|
||||
const clone = require("clone");
|
||||
const Flow = require('./Flow').Flow;
|
||||
const context = require('../context');
|
||||
const context = require('../nodes/context');
|
||||
const util = require("util");
|
||||
|
||||
const redUtil = require("@node-red/util").util;
|
||||
const flowUtil = require("./util");
|
||||
|
||||
|
||||
const credentials = require("../credentials");
|
||||
const credentials = require("../nodes/credentials");
|
||||
|
||||
var Log;
|
||||
|
||||
@@ -159,7 +159,7 @@ class Subflow extends Flow {
|
||||
start(diff) {
|
||||
var self = this;
|
||||
// Create a subflow node to accept inbound messages and route appropriately
|
||||
var Node = require("../Node");
|
||||
var Node = require("../nodes/Node");
|
||||
|
||||
if (this.subflowDef.status) {
|
||||
var subflowStatusConfig = {
|
@@ -22,13 +22,12 @@ var Flow = require('./Flow');
|
||||
var typeRegistry = require("@node-red/registry");
|
||||
var deprecated = typeRegistry.deprecated;
|
||||
|
||||
|
||||
var context = require("../context")
|
||||
var credentials = require("../credentials");
|
||||
|
||||
var context = require("../nodes/context")
|
||||
var credentials = require("../nodes/credentials");
|
||||
var router = require("./router");
|
||||
var flowUtil = require("./util");
|
||||
var log;
|
||||
var events = require("../../events");
|
||||
var events = require("../events");
|
||||
var redUtil = require("@node-red/util").util;
|
||||
|
||||
var storage = null;
|
||||
@@ -71,6 +70,7 @@ function init(runtime) {
|
||||
}
|
||||
Flow.init(runtime);
|
||||
flowUtil.init(runtime);
|
||||
router.init(runtime);
|
||||
}
|
||||
|
||||
function loadFlows() {
|
50
packages/node_modules/@node-red/runtime/lib/flows/router/index.js
vendored
Normal file
50
packages/node_modules/@node-red/runtime/lib/flows/router/index.js
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
var settings;
|
||||
|
||||
const LocalRouter = require("./localRouter");
|
||||
var defaultRouter;
|
||||
|
||||
|
||||
class Router {
|
||||
constructor(stack) {
|
||||
this.stack = stack || [];
|
||||
}
|
||||
send(source,destinationId,msg) {
|
||||
var pos = 0;
|
||||
var next = () => {
|
||||
var router = this.stack[pos++];
|
||||
if (router) {
|
||||
router.send(source,destinationId,msg,next);
|
||||
}
|
||||
}
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
function init(runtime) {
|
||||
settings = runtime.settings;
|
||||
|
||||
defaultRouter = new Router([
|
||||
new LocalRouter(),
|
||||
new PostMessageLogger()
|
||||
])
|
||||
|
||||
}
|
||||
|
||||
function send(source,destinationId,msg) {
|
||||
defaultRouter.send(source,destinationId,msg);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
init:init,
|
||||
send: send
|
||||
}
|
||||
|
||||
|
||||
|
||||
class PostMessageLogger {
|
||||
constructor() {}
|
||||
send(source,destinationId,msg,next) {
|
||||
console.log(source.id.padEnd(16),"->",destinationId.padEnd(16),JSON.stringify(msg));
|
||||
}
|
||||
}
|
17
packages/node_modules/@node-red/runtime/lib/flows/router/localRouter.js
vendored
Normal file
17
packages/node_modules/@node-red/runtime/lib/flows/router/localRouter.js
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
class LocalRouter {
|
||||
constructor() {}
|
||||
send(source,destinationId,msg,next) {
|
||||
var node = source._flow.getNode(destinationId);
|
||||
if (node) {
|
||||
setImmediate(function() {
|
||||
node.receive(msg);
|
||||
next();
|
||||
});
|
||||
} else if (next) {
|
||||
next()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = LocalRouter
|
@@ -19,6 +19,7 @@ var when = require('when');
|
||||
var externalAPI = require("./api");
|
||||
|
||||
var redNodes = require("./nodes");
|
||||
var flows = require("./flows");
|
||||
var storage = require("./storage");
|
||||
var library = require("./library");
|
||||
var events = require("./events");
|
||||
@@ -273,6 +274,7 @@ var runtime = {
|
||||
storage: storage,
|
||||
events: events,
|
||||
nodes: redNodes,
|
||||
flows: flows,
|
||||
library: library,
|
||||
exec: exec,
|
||||
util: require("@node-red/util").util,
|
||||
|
@@ -20,7 +20,7 @@ var EventEmitter = require("events").EventEmitter;
|
||||
var redUtil = require("@node-red/util").util;
|
||||
var Log = require("@node-red/util").log;
|
||||
var context = require("./context");
|
||||
var flows = require("./flows");
|
||||
var flows = require("../flows");
|
||||
|
||||
const NOOP_SEND = function() {}
|
||||
|
||||
@@ -55,10 +55,6 @@ function Node(n) {
|
||||
// as part of its constructor - config._flow will overwrite this._flow
|
||||
// which we can tolerate as they are the same object.
|
||||
Object.defineProperty(this,'_flow', {value: n._flow, enumerable: false, writable: true })
|
||||
this._asyncDelivery = n._flow.asyncMessageDelivery;
|
||||
}
|
||||
if (this._asyncDelivery === undefined) {
|
||||
this._asyncDelivery = true;
|
||||
}
|
||||
this.updateWires(n.wires);
|
||||
}
|
||||
@@ -173,15 +169,7 @@ Node.prototype._emit = Node.prototype.emit;
|
||||
Node.prototype.emit = function(event, ...args) {
|
||||
var node = this;
|
||||
if (event === "input") {
|
||||
// When Pluggable Message Routing arrives, this will be called from
|
||||
// that and will already be sync/async depending on the router.
|
||||
if (this._asyncDelivery) {
|
||||
setImmediate(function() {
|
||||
node._emitInput.apply(node,args);
|
||||
});
|
||||
} else {
|
||||
this._emitInput.apply(this,args);
|
||||
}
|
||||
this._emitInput.apply(this,args);
|
||||
} else {
|
||||
this._emit.apply(this,arguments);
|
||||
}
|
||||
@@ -366,11 +354,7 @@ Node.prototype.send = function(msg) {
|
||||
msg._msgid = redUtil.generateId();
|
||||
}
|
||||
this.metric("send",msg);
|
||||
node = this._flow.getNode(this._wire);
|
||||
/* istanbul ignore else */
|
||||
if (node) {
|
||||
node.receive(msg);
|
||||
}
|
||||
this._flow.send(this,this._wire,msg);
|
||||
return;
|
||||
} else {
|
||||
msg = [msg];
|
||||
@@ -398,23 +382,20 @@ Node.prototype.send = function(msg) {
|
||||
var k = 0;
|
||||
// for each recipent node of that output
|
||||
for (var j = 0; j < wires.length; j++) {
|
||||
node = this._flow.getNode(wires[j]); // node at end of wire j
|
||||
if (node) {
|
||||
// for each msg to send eg. [[m1, m2, ...], ...]
|
||||
for (k = 0; k < msgs.length; k++) {
|
||||
var m = msgs[k];
|
||||
if (m !== null && m !== undefined) {
|
||||
/* istanbul ignore else */
|
||||
if (!sentMessageId) {
|
||||
sentMessageId = m._msgid;
|
||||
}
|
||||
if (msgSent) {
|
||||
var clonedmsg = redUtil.cloneMessage(m);
|
||||
sendEvents.push({n:node,m:clonedmsg});
|
||||
} else {
|
||||
sendEvents.push({n:node,m:m});
|
||||
msgSent = true;
|
||||
}
|
||||
// for each msg to send eg. [[m1, m2, ...], ...]
|
||||
for (k = 0; k < msgs.length; k++) {
|
||||
var m = msgs[k];
|
||||
if (m !== null && m !== undefined) {
|
||||
/* istanbul ignore else */
|
||||
if (!sentMessageId) {
|
||||
sentMessageId = m._msgid;
|
||||
}
|
||||
if (msgSent) {
|
||||
var clonedmsg = redUtil.cloneMessage(m);
|
||||
sendEvents.push({n:wires[j],m:clonedmsg});
|
||||
} else {
|
||||
sendEvents.push({n:wires[j],m:m});
|
||||
msgSent = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -434,7 +415,7 @@ Node.prototype.send = function(msg) {
|
||||
if (!ev.m._msgid) {
|
||||
ev.m._msgid = sentMessageId;
|
||||
}
|
||||
ev.n.receive(ev.m);
|
||||
this._flow.send(this,ev.n,ev.m);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -18,7 +18,6 @@ var clone = require("clone");
|
||||
var log = require("@node-red/util").log;
|
||||
var util = require("@node-red/util").util;
|
||||
var memory = require("./memory");
|
||||
var flows;
|
||||
|
||||
var settings;
|
||||
|
||||
@@ -48,7 +47,6 @@ function logUnknownStore(name) {
|
||||
}
|
||||
|
||||
function init(_settings) {
|
||||
flows = require("../flows");
|
||||
settings = _settings;
|
||||
contexts = {};
|
||||
stores = {};
|
||||
@@ -513,39 +511,6 @@ function getContext(nodeId, flowId) {
|
||||
return newContext;
|
||||
}
|
||||
|
||||
//
|
||||
// function getContext(localId,flowId,parent) {
|
||||
// var contextId = localId;
|
||||
// if (flowId) {
|
||||
// contextId = localId+":"+flowId;
|
||||
// }
|
||||
// console.log("getContext",localId,flowId,"known?",contexts.hasOwnProperty(contextId));
|
||||
// if (contexts.hasOwnProperty(contextId)) {
|
||||
// return contexts[contextId];
|
||||
// }
|
||||
// var newContext = createContext(contextId,undefined,parent);
|
||||
// if (flowId) {
|
||||
// var node = flows.get(flowId);
|
||||
// console.log("flows,get",flowId,node&&node.type)
|
||||
// var parent = undefined;
|
||||
// if (node && node.type.startsWith("subflow:")) {
|
||||
// parent = node.context().flow;
|
||||
// }
|
||||
// else {
|
||||
// parent = createRootContext();
|
||||
// }
|
||||
// var flowContext = getContext(flowId,undefined,parent);
|
||||
// Object.defineProperty(newContext, 'flow', {
|
||||
// value: flowContext
|
||||
// });
|
||||
// }
|
||||
// Object.defineProperty(newContext, 'global', {
|
||||
// value: contexts['global']
|
||||
// })
|
||||
// contexts[contextId] = newContext;
|
||||
// return newContext;
|
||||
// }
|
||||
|
||||
function deleteContext(id,flowId) {
|
||||
if(!hasConfiguredStore){
|
||||
// only delete context if there's no configured storage.
|
||||
|
@@ -23,8 +23,8 @@ var util = require("util");
|
||||
var registry = require("@node-red/registry");
|
||||
|
||||
var credentials = require("./credentials");
|
||||
var flows = require("./flows");
|
||||
var flowUtil = require("./flows/util")
|
||||
var flows = require("../flows");
|
||||
var flowUtil = require("../flows/util")
|
||||
var context = require("./context");
|
||||
var Node = require("./Node");
|
||||
var log;
|
||||
|
Reference in New Issue
Block a user