Use rfdc module for cloning when we know its pure JSON

This commit is contained in:
Nick O'Leary 2024-05-03 16:45:50 +01:00
parent a712a9363b
commit 1a3cc06935
No known key found for this signature in database
GPG Key ID: 4F2157149161A6C9
6 changed files with 32 additions and 30 deletions

View File

@ -73,6 +73,7 @@
"passport-http-bearer": "1.0.1", "passport-http-bearer": "1.0.1",
"passport-oauth2-client-password": "0.1.2", "passport-oauth2-client-password": "0.1.2",
"raw-body": "2.5.2", "raw-body": "2.5.2",
"rfdc": "^1.3.1",
"semver": "7.5.4", "semver": "7.5.4",
"tar": "6.2.1", "tar": "6.2.1",
"tough-cookie": "4.1.3", "tough-cookie": "4.1.3",

View File

@ -15,6 +15,7 @@
**/ **/
const clone = require("clone"); const clone = require("clone");
const jsonClone = require("rfdc")();
const Flow = require('./Flow').Flow; const Flow = require('./Flow').Flow;
const context = require('../nodes/context'); const context = require('../nodes/context');
const util = require("util"); const util = require("util");
@ -108,7 +109,7 @@ class Subflow extends Flow {
} }
} }
subflowInternalFlowConfig.subflows = clone(subflowDef.subflows || {}); subflowInternalFlowConfig.subflows = jsonClone(subflowDef.subflows || {});
remapSubflowNodes(subflowInternalFlowConfig.configs,node_map); remapSubflowNodes(subflowInternalFlowConfig.configs,node_map);
remapSubflowNodes(subflowInternalFlowConfig.nodes,node_map); remapSubflowNodes(subflowInternalFlowConfig.nodes,node_map);
@ -220,7 +221,7 @@ class Subflow extends Flow {
} }
if (this.subflowDef.in) { if (this.subflowDef.in) {
subflowInstanceConfig.wires = this.subflowDef.in.map(function(n) { return n.wires.map(function(w) { return self.node_map[w.id].id;})}) subflowInstanceConfig.wires = this.subflowDef.in.map(function(n) { return n.wires.map(function(w) { return self.node_map[w.id].id;})})
subflowInstanceConfig._originalWires = clone(subflowInstanceConfig.wires); subflowInstanceConfig._originalWires = jsonClone(subflowInstanceConfig.wires);
} }
this.node = new Node(subflowInstanceConfig); this.node = new Node(subflowInstanceConfig);
@ -244,14 +245,14 @@ class Subflow extends Flow {
if (self.subflowDef.out) { if (self.subflowDef.out) {
var node,wires,i,j; var node,wires,i,j;
// Restore the original wiring to the internal nodes // Restore the original wiring to the internal nodes
subflowInstanceConfig.wires = clone(subflowInstanceConfig._originalWires); subflowInstanceConfig.wires = jsonClone(subflowInstanceConfig._originalWires);
for (i=0;i<self.subflowDef.out.length;i++) { for (i=0;i<self.subflowDef.out.length;i++) {
wires = self.subflowDef.out[i].wires; wires = self.subflowDef.out[i].wires;
for (j=0;j<wires.length;j++) { for (j=0;j<wires.length;j++) {
if (wires[j].id != self.subflowDef.id) { if (wires[j].id != self.subflowDef.id) {
node = self.node_map[wires[j].id]; node = self.node_map[wires[j].id];
if (node && node._originalWires) { if (node && node._originalWires) {
node.wires = clone(node._originalWires); node.wires = jsonClone(node._originalWires);
} }
} }
} }
@ -300,7 +301,7 @@ class Subflow extends Flow {
var node = self.node_map[wires[j].id]; var node = self.node_map[wires[j].id];
if (node) { if (node) {
if (!node._originalWires) { if (!node._originalWires) {
node._originalWires = clone(node.wires); node._originalWires = jsonClone(node.wires);
} }
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]); node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
} else { } else {
@ -323,7 +324,7 @@ class Subflow extends Flow {
var node = self.node_map[wires[j].id]; var node = self.node_map[wires[j].id];
if (node) { if (node) {
if (!node._originalWires) { if (!node._originalWires) {
node._originalWires = clone(node.wires); node._originalWires = jsonClone(node.wires);
} }
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]); node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
node.wires[wires[j].port].push(subflowStatusId); node.wires[wires[j].port].push(subflowStatusId);
@ -463,7 +464,7 @@ class Subflow extends Flow {
* @return {[type]} [description] * @return {[type]} [description]
*/ */
function createNodeInSubflow(subflowInstanceId, def) { function createNodeInSubflow(subflowInstanceId, def) {
let node = clone(def); let node = jsonClone(def);
let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId(); let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId();
// console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")") // console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")")
// node_map[node.id] = node; // node_map[node.id] = node;

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
**/ **/
var clone = require("clone"); const jsonClone = require("rfdc")();
var Flow = require('./Flow'); var Flow = require('./Flow');
@ -140,16 +140,16 @@ function setFlows(_config,_credentials,type,muteLog,forceStart,user) {
if (type === "load") { if (type === "load") {
isLoad = true; isLoad = true;
configSavePromise = loadFlows().then(function(_config) { configSavePromise = loadFlows().then(function(_config) {
config = clone(_config.flows); config = jsonClone(_config.flows);
newFlowConfig = flowUtil.parseConfig(clone(config)); newFlowConfig = flowUtil.parseConfig(jsonClone(config));
type = "full"; type = "full";
return _config.rev; return _config.rev;
}); });
} else { } else {
// Clone the provided config so it can be manipulated // Clone the provided config so it can be manipulated
config = clone(_config); config = jsonClone(_config);
// Parse the configuration // Parse the configuration
newFlowConfig = flowUtil.parseConfig(clone(config)); newFlowConfig = flowUtil.parseConfig(jsonClone(config));
// Generate a diff to identify what has changed // Generate a diff to identify what has changed
diff = flowUtil.diffConfigs(activeFlowConfig,newFlowConfig); diff = flowUtil.diffConfigs(activeFlowConfig,newFlowConfig);
@ -609,7 +609,7 @@ async function addFlow(flow, user) {
nodes.push(node); nodes.push(node);
} }
} }
var newConfig = clone(activeConfig.flows); var newConfig = jsonClone(activeConfig.flows);
newConfig = newConfig.concat(nodes); newConfig = newConfig.concat(nodes);
return setFlows(newConfig, null, 'flows', true, null, user).then(function() { return setFlows(newConfig, null, 'flows', true, null, user).then(function() {
@ -650,7 +650,7 @@ function getFlow(id) {
var nodeIds = Object.keys(flow.nodes); var nodeIds = Object.keys(flow.nodes);
if (nodeIds.length > 0) { if (nodeIds.length > 0) {
result.nodes = nodeIds.map(function(nodeId) { result.nodes = nodeIds.map(function(nodeId) {
var node = clone(flow.nodes[nodeId]); var node = jsonClone(flow.nodes[nodeId]);
if (node.type === 'link out') { if (node.type === 'link out') {
delete node.wires; delete node.wires;
} }
@ -662,7 +662,7 @@ function getFlow(id) {
if (flow.configs) { if (flow.configs) {
var configIds = Object.keys(flow.configs); var configIds = Object.keys(flow.configs);
result.configs = configIds.map(function(configId) { result.configs = configIds.map(function(configId) {
const node = clone(flow.configs[configId]); const node = jsonClone(flow.configs[configId]);
delete node.credentials; delete node.credentials;
return node return node
@ -674,17 +674,17 @@ function getFlow(id) {
if (flow.subflows) { if (flow.subflows) {
var subflowIds = Object.keys(flow.subflows); var subflowIds = Object.keys(flow.subflows);
result.subflows = subflowIds.map(function(subflowId) { result.subflows = subflowIds.map(function(subflowId) {
var subflow = clone(flow.subflows[subflowId]); var subflow = jsonClone(flow.subflows[subflowId]);
var nodeIds = Object.keys(subflow.nodes); var nodeIds = Object.keys(subflow.nodes);
subflow.nodes = nodeIds.map(function(id) { subflow.nodes = nodeIds.map(function(id) {
const node = clone(subflow.nodes[id]) const node = jsonClone(subflow.nodes[id])
delete node.credentials delete node.credentials
return node return node
}); });
if (subflow.configs) { if (subflow.configs) {
var configIds = Object.keys(subflow.configs); var configIds = Object.keys(subflow.configs);
subflow.configs = configIds.map(function(id) { subflow.configs = configIds.map(function(id) {
const node = clone(subflow.configs[id]) const node = jsonClone(subflow.configs[id])
delete node.credentials delete node.credentials
return node return node
}) })
@ -709,7 +709,7 @@ async function updateFlow(id,newFlow, user) {
} }
label = activeFlowConfig.flows[id].label; label = activeFlowConfig.flows[id].label;
} }
var newConfig = clone(activeConfig.flows); var newConfig = jsonClone(activeConfig.flows);
var nodes; var nodes;
if (id === 'global') { if (id === 'global') {
@ -779,7 +779,7 @@ async function removeFlow(id, user) {
throw e; throw e;
} }
var newConfig = clone(activeConfig.flows); var newConfig = jsonClone(activeConfig.flows);
newConfig = newConfig.filter(function(node) { newConfig = newConfig.filter(function(node) {
return node.z !== id && node.id !== id; return node.z !== id && node.id !== id;
}); });

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
**/ **/
const clone = require("clone"); const jsonClone = require("rfdc")();
const redUtil = require("@node-red/util").util; const redUtil = require("@node-red/util").util;
const Log = require("@node-red/util").log; const Log = require("@node-red/util").log;
const typeRegistry = require("@node-red/registry"); const typeRegistry = require("@node-red/registry");
@ -175,7 +175,7 @@ async function createNode(flow,config) {
try { try {
var nodeTypeConstructor = typeRegistry.get(type); var nodeTypeConstructor = typeRegistry.get(type);
if (typeof nodeTypeConstructor === "function") { if (typeof nodeTypeConstructor === "function") {
var conf = clone(config); var conf = jsonClone(config);
delete conf.credentials; delete conf.credentials;
try { try {
Object.defineProperty(conf,'_module', {value: typeRegistry.getNodeInfo(type), enumerable: false, writable: true }) Object.defineProperty(conf,'_module', {value: typeRegistry.getNodeInfo(type), enumerable: false, writable: true })
@ -202,8 +202,8 @@ async function createNode(flow,config) {
var subflowInstanceConfig = subflowConfig.subflows[nodeTypeConstructor.subflow.id]; var subflowInstanceConfig = subflowConfig.subflows[nodeTypeConstructor.subflow.id];
delete subflowConfig.subflows[nodeTypeConstructor.subflow.id]; delete subflowConfig.subflows[nodeTypeConstructor.subflow.id];
subflowInstanceConfig.subflows = subflowConfig.subflows; subflowInstanceConfig.subflows = subflowConfig.subflows;
var instanceConfig = clone(config); var instanceConfig = jsonClone(config);
instanceConfig.env = clone(nodeTypeConstructor.subflow.env); instanceConfig.env = jsonClone(nodeTypeConstructor.subflow.env);
instanceConfig.env = nodeTypeConstructor.subflow.env.map(nodeProp => { instanceConfig.env = nodeTypeConstructor.subflow.env.map(nodeProp => {
var nodePropType; var nodePropType;
@ -256,7 +256,7 @@ function parseConfig(config) {
flow.missingTypes = []; flow.missingTypes = [];
config.forEach(function (n) { config.forEach(function (n) {
flow.allNodes[n.id] = clone(n); flow.allNodes[n.id] = jsonClone(n);
if (n.type === 'tab') { if (n.type === 'tab') {
flow.flows[n.id] = n; flow.flows[n.id] = n;
flow.flows[n.id].subflows = {}; flow.flows[n.id].subflows = {};

View File

@ -14,9 +14,8 @@
* limitations under the License. * limitations under the License.
**/ **/
var path = require("path");
var fs = require("fs"); const jsonClone = require("rfdc")();
var clone = require("clone");
var util = require("util"); var util = require("util");
var registry = require("@node-red/registry"); var registry = require("@node-red/registry");
@ -98,7 +97,7 @@ function createNode(node,def) {
} }
var creds = credentials.get(id); var creds = credentials.get(id);
if (creds) { if (creds) {
creds = clone(creds); creds = jsonClone(creds);
//console.log("Attaching credentials to ",node.id); //console.log("Attaching credentials to ",node.id);
// allow $(foo) syntax to substitute env variables for credentials also... // allow $(foo) syntax to substitute env variables for credentials also...
for (var p in creds) { for (var p in creds) {

View File

@ -22,6 +22,7 @@
"clone": "2.1.2", "clone": "2.1.2",
"express": "4.19.2", "express": "4.19.2",
"fs-extra": "11.1.1", "fs-extra": "11.1.1",
"json-stringify-safe": "5.0.1" "json-stringify-safe": "5.0.1",
"rfdc": "^1.3.1"
} }
} }