mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Merge pull request #2679 from rorysavage77/mutex-for-flow-modification
Updated flow modification methods to support mutex serialization
This commit is contained in:
commit
0c5eae2349
@ -27,6 +27,7 @@
|
|||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "6.12.3",
|
"ajv": "6.12.3",
|
||||||
|
"async-mutex": "0.2.4",
|
||||||
"basic-auth": "2.0.1",
|
"basic-auth": "2.0.1",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"body-parser": "1.19.0",
|
"body-parser": "1.19.0",
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
var runtime;
|
var runtime;
|
||||||
|
var Mutex = require('async-mutex').Mutex;
|
||||||
|
const mutex = new Mutex();
|
||||||
|
|
||||||
var api = module.exports = {
|
var api = module.exports = {
|
||||||
init: function(_runtime) {
|
init: function(_runtime) {
|
||||||
@ -64,6 +66,7 @@ var api = module.exports = {
|
|||||||
* @memberof @node-red/runtime_flows
|
* @memberof @node-red/runtime_flows
|
||||||
*/
|
*/
|
||||||
setFlows: function(opts) {
|
setFlows: function(opts) {
|
||||||
|
return mutex.runExclusive(function() {
|
||||||
return new Promise(function(resolve,reject) {
|
return new Promise(function(resolve,reject) {
|
||||||
|
|
||||||
var flows = opts.flows;
|
var flows = opts.flows;
|
||||||
@ -95,6 +98,7 @@ var api = module.exports = {
|
|||||||
return reject(err);
|
return reject(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -107,19 +111,23 @@ var api = module.exports = {
|
|||||||
* @memberof @node-red/runtime_flows
|
* @memberof @node-red/runtime_flows
|
||||||
*/
|
*/
|
||||||
addFlow: function(opts) {
|
addFlow: function(opts) {
|
||||||
|
return mutex.runExclusive(function() {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var flow = opts.flow;
|
var flow = opts.flow;
|
||||||
runtime.nodes.addFlow(flow).then(function (id) {
|
runtime.nodes.addFlow(flow).then(function (id) {
|
||||||
runtime.log.audit({event: "flow.add", id: id}, opts.req);
|
runtime.log.audit({event: "flow.add", id: id}, opts.req);
|
||||||
return resolve(id);
|
return resolve(id);
|
||||||
}).catch(function (err) {
|
}).catch(function (err) {
|
||||||
runtime.log.audit({event: "flow.add",error:err.code||"unexpected_error",message:err.toString()}, opts.req);
|
runtime.log.audit({
|
||||||
|
event: "flow.add",
|
||||||
|
error: err.code || "unexpected_error",
|
||||||
|
message: err.toString()
|
||||||
|
}, opts.req);
|
||||||
err.status = 400;
|
err.status = 400;
|
||||||
return reject(err);
|
return reject(err);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,7 +153,6 @@ var api = module.exports = {
|
|||||||
return reject(err);
|
return reject(err);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Updates an existing flow configuration
|
* Updates an existing flow configuration
|
||||||
@ -158,6 +165,7 @@ var api = module.exports = {
|
|||||||
* @memberof @node-red/runtime_flows
|
* @memberof @node-red/runtime_flows
|
||||||
*/
|
*/
|
||||||
updateFlow: function(opts) {
|
updateFlow: function(opts) {
|
||||||
|
return mutex.runExclusive(function() {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var flow = opts.flow;
|
var flow = opts.flow;
|
||||||
var id = opts.id;
|
var id = opts.id;
|
||||||
@ -166,7 +174,11 @@ var api = module.exports = {
|
|||||||
runtime.log.audit({event: "flow.update", id: id}, opts.req);
|
runtime.log.audit({event: "flow.update", id: id}, opts.req);
|
||||||
return resolve(id);
|
return resolve(id);
|
||||||
}).catch(function (err) {
|
}).catch(function (err) {
|
||||||
runtime.log.audit({event: "flow.update",error:err.code||"unexpected_error",message:err.toString()}, opts.req);
|
runtime.log.audit({
|
||||||
|
event: "flow.update",
|
||||||
|
error: err.code || "unexpected_error",
|
||||||
|
message: err.toString()
|
||||||
|
}, opts.req);
|
||||||
err.status = 400;
|
err.status = 400;
|
||||||
return reject(err);
|
return reject(err);
|
||||||
})
|
})
|
||||||
@ -178,13 +190,17 @@ var api = module.exports = {
|
|||||||
err.code = "not_found";
|
err.code = "not_found";
|
||||||
return reject(err);
|
return reject(err);
|
||||||
} else {
|
} else {
|
||||||
runtime.log.audit({event: "flow.update",error:err.code||"unexpected_error",message:err.toString()}, opts.req);
|
runtime.log.audit({
|
||||||
|
event: "flow.update",
|
||||||
|
error: err.code || "unexpected_error",
|
||||||
|
message: err.toString()
|
||||||
|
}, opts.req);
|
||||||
err.status = 400;
|
err.status = 400;
|
||||||
return reject(err);
|
return reject(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Deletes a flow
|
* Deletes a flow
|
||||||
@ -196,6 +212,7 @@ var api = module.exports = {
|
|||||||
* @memberof @node-red/runtime_flows
|
* @memberof @node-red/runtime_flows
|
||||||
*/
|
*/
|
||||||
deleteFlow: function(opts) {
|
deleteFlow: function(opts) {
|
||||||
|
return mutex.runExclusive(function() {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var id = opts.id;
|
var id = opts.id;
|
||||||
try {
|
try {
|
||||||
@ -203,7 +220,12 @@ var api = module.exports = {
|
|||||||
runtime.log.audit({event: "flow.remove", id: id}, opts.req);
|
runtime.log.audit({event: "flow.remove", id: id}, opts.req);
|
||||||
return resolve();
|
return resolve();
|
||||||
}).catch(function (err) {
|
}).catch(function (err) {
|
||||||
runtime.log.audit({event: "flow.remove",id:id,error:err.code||"unexpected_error",message:err.toString()}, opts.req);
|
runtime.log.audit({
|
||||||
|
event: "flow.remove",
|
||||||
|
id: id,
|
||||||
|
error: err.code || "unexpected_error",
|
||||||
|
message: err.toString()
|
||||||
|
}, opts.req);
|
||||||
err.status = 400;
|
err.status = 400;
|
||||||
return reject(err);
|
return reject(err);
|
||||||
});
|
});
|
||||||
@ -215,12 +237,18 @@ var api = module.exports = {
|
|||||||
err.code = "not_found";
|
err.code = "not_found";
|
||||||
return reject(err);
|
return reject(err);
|
||||||
} else {
|
} else {
|
||||||
runtime.log.audit({event: "flow.remove",id:id,error:err.code||"unexpected_error",message:err.toString()}, opts.req);
|
runtime.log.audit({
|
||||||
|
event: "flow.remove",
|
||||||
|
id: id,
|
||||||
|
error: err.code || "unexpected_error",
|
||||||
|
message: err.toString()
|
||||||
|
}, opts.req);
|
||||||
err.status = 400;
|
err.status = 400;
|
||||||
return reject(err);
|
return reject(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -264,5 +292,4 @@ var api = module.exports = {
|
|||||||
resolve(sendCredentials);
|
resolve(sendCredentials);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@node-red/registry": "1.1.3",
|
"@node-red/registry": "1.1.3",
|
||||||
"@node-red/util": "1.1.3",
|
"@node-red/util": "1.1.3",
|
||||||
|
"async-mutex": "0.2.4",
|
||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"express": "4.17.1",
|
"express": "4.17.1",
|
||||||
"fs-extra": "8.1.0",
|
"fs-extra": "8.1.0",
|
||||||
|
Loading…
Reference in New Issue
Block a user