mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Use more async funcs in runtime/lib/api to reduce Promise creation
This commit is contained in:
		| @@ -106,9 +106,8 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_comms | ||||
|     */ | ||||
|     addConnection: function(opts) { | ||||
|     addConnection: async function(opts) { | ||||
|         connections.push(opts.client); | ||||
|         return Promise.resolve(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -119,14 +118,13 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_comms | ||||
|     */ | ||||
|     removeConnection: function(opts) { | ||||
|     removeConnection: async function(opts) { | ||||
|         for (var i=0;i<connections.length;i++) { | ||||
|             if (connections[i] === opts.client) { | ||||
|                 connections.splice(i,1); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         return Promise.resolve(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -140,14 +138,13 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_comms | ||||
|     */ | ||||
|     subscribe: function(opts) { | ||||
|     subscribe: async function(opts) { | ||||
|         var re = new RegExp("^"+opts.topic.replace(/([\[\]\?\(\)\\\\$\^\*\.|])/g,"\\$1").replace(/\+/g,"[^/]+").replace(/\/#$/,"(\/.*)?")+"$"); | ||||
|         for (var t in retained) { | ||||
|             if (re.test(t)) { | ||||
|                 opts.client.send(t,retained[t]); | ||||
|             } | ||||
|         } | ||||
|         return Promise.resolve(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -159,5 +156,5 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_comms | ||||
|     */ | ||||
|     unsubscribe: function(opts) {} | ||||
|     unsubscribe: async function(opts) {} | ||||
| }; | ||||
|   | ||||
| @@ -71,7 +71,7 @@ var api = module.exports = { | ||||
|     * @return {Promise} - the node information | ||||
|     * @memberof @node-red/runtime_context | ||||
|     */ | ||||
|     getValue: function(opts) { | ||||
|     getValue: async function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var scope = opts.scope; | ||||
|             var id = opts.id; | ||||
| @@ -165,7 +165,7 @@ var api = module.exports = { | ||||
|     * @return {Promise} - the node information | ||||
|     * @memberof @node-red/runtime_context | ||||
|     */ | ||||
|     delete: function(opts) { | ||||
|     delete: async function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var scope = opts.scope; | ||||
|             var id = opts.id; | ||||
|   | ||||
| @@ -38,10 +38,10 @@ var api = module.exports = { | ||||
|     projects: require("./projects"), | ||||
|     context: require("./context"), | ||||
|  | ||||
|     isStarted: function(opts) { | ||||
|         return Promise.resolve(runtime.isStarted()); | ||||
|     isStarted: async function(opts) { | ||||
|         return runtime.isStarted(); | ||||
|     }, | ||||
|     version: function(opts) { | ||||
|         return Promise.resolve(runtime.version()); | ||||
|     version: async function(opts) { | ||||
|         return runtime.version(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -36,32 +36,30 @@ var api = module.exports = { | ||||
|     * @return {Promise<String|Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_library | ||||
|     */ | ||||
|     getEntry: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             runtime.library.getEntry(opts.library,opts.type,opts.path).then(function(result) { | ||||
|                 runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path}, opts.req); | ||||
|                 return resolve(result); | ||||
|             }).catch(function(err) { | ||||
|                 if (err) { | ||||
|                     runtime.log.warn(runtime.log._("api.library.error-load-entry",{library:opts.library,type:opts.type,path:opts.path,message:err.toString()})); | ||||
|                     if (err.code === 'forbidden') { | ||||
|                         err.status = 403; | ||||
|                         return reject(err); | ||||
|                     } else if (err.code === "not_found") { | ||||
|                         err.status = 404; | ||||
|                     } else { | ||||
|                         err.status = 400; | ||||
|                     } | ||||
|                     runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path,error:err.code}, opts.req); | ||||
|                     return reject(err); | ||||
|     getEntry: async function(opts) { | ||||
|         return runtime.library.getEntry(opts.library,opts.type,opts.path).then(function(result) { | ||||
|             runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path}, opts.req); | ||||
|             return result; | ||||
|         }).catch(function(err) { | ||||
|             if (err) { | ||||
|                 runtime.log.warn(runtime.log._("api.library.error-load-entry",{library:opts.library,type:opts.type,path:opts.path,message:err.toString()})); | ||||
|                 if (err.code === 'forbidden') { | ||||
|                     err.status = 403; | ||||
|                     throw err; | ||||
|                 } else if (err.code === "not_found") { | ||||
|                     err.status = 404; | ||||
|                 } else { | ||||
|                     err.status = 400; | ||||
|                 } | ||||
|                 runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,error:"not_found"}, opts.req); | ||||
|                 var error = new Error(); | ||||
|                 error.code = "not_found"; | ||||
|                 error.status = 404; | ||||
|                 return reject(error); | ||||
|             }); | ||||
|         }) | ||||
|                 runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path,error:err.code}, opts.req); | ||||
|                 throw err; | ||||
|             } | ||||
|             runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,error:"not_found"}, opts.req); | ||||
|             var error = new Error(); | ||||
|             error.code = "not_found"; | ||||
|             error.status = 404; | ||||
|             throw error; | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -77,23 +75,20 @@ var api = module.exports = { | ||||
|     * @return {Promise} - resolves when complete | ||||
|     * @memberof @node-red/runtime_library | ||||
|     */ | ||||
|     saveEntry: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             runtime.library.saveEntry(opts.library,opts.type,opts.path,opts.meta,opts.body).then(function() { | ||||
|                 runtime.log.audit({event: "library.set",type:opts.type,path:opts.path}, opts.req); | ||||
|                 return resolve(); | ||||
|             }).catch(function(err) { | ||||
|                 runtime.log.warn(runtime.log._("api.library.error-save-entry",{path:opts.path,message:err.toString()})); | ||||
|                 if (err.code === 'forbidden') { | ||||
|                     runtime.log.audit({event: "library.set",type:opts.type,path:opts.path,error:"forbidden"}, opts.req); | ||||
|                     err.status = 403; | ||||
|                     return reject(err); | ||||
|                 } | ||||
|                 runtime.log.audit({event: "library.set",type:opts.type,path:opts.path,error:"unexpected_error",message:err.toString()}, opts.req); | ||||
|                 var error = new Error(); | ||||
|                 error.status = 400; | ||||
|                 return reject(error); | ||||
|             }); | ||||
|         }) | ||||
|     saveEntry: async function(opts) { | ||||
|         return runtime.library.saveEntry(opts.library,opts.type,opts.path,opts.meta,opts.body).then(function() { | ||||
|             runtime.log.audit({event: "library.set",type:opts.type,path:opts.path}, opts.req); | ||||
|         }).catch(function(err) { | ||||
|             runtime.log.warn(runtime.log._("api.library.error-save-entry",{path:opts.path,message:err.toString()})); | ||||
|             if (err.code === 'forbidden') { | ||||
|                 runtime.log.audit({event: "library.set",type:opts.type,path:opts.path,error:"forbidden"}, opts.req); | ||||
|                 err.status = 403; | ||||
|                 throw err; | ||||
|             } | ||||
|             runtime.log.audit({event: "library.set",type:opts.type,path:opts.path,error:"unexpected_error",message:err.toString()}, opts.req); | ||||
|             var error = new Error(); | ||||
|             error.status = 400; | ||||
|             throw error; | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
|  * @mixin @node-red/runtime_nodes | ||||
|  */ | ||||
|  | ||||
| var fs = require("fs"); | ||||
| var fs = require("fs-extra"); | ||||
|  | ||||
| var runtime; | ||||
|  | ||||
| @@ -52,22 +52,20 @@ var api = module.exports = { | ||||
|     * @return {Promise<NodeInfo>} - the node information | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getNodeInfo: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var id = opts.id; | ||||
|             var result = runtime.nodes.getNodeInfo(id); | ||||
|             if (result) { | ||||
|                 runtime.log.audit({event: "nodes.info.get",id:id}, opts.req); | ||||
|                 delete result.loaded; | ||||
|                 return resolve(result); | ||||
|             } else { | ||||
|                 runtime.log.audit({event: "nodes.info.get",id:id,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Node not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 return reject(err); | ||||
|             } | ||||
|         }) | ||||
|     getNodeInfo: async function(opts) { | ||||
|         var id = opts.id; | ||||
|         var result = runtime.nodes.getNodeInfo(id); | ||||
|         if (result) { | ||||
|             runtime.log.audit({event: "nodes.info.get",id:id}, opts.req); | ||||
|             delete result.loaded; | ||||
|             return result; | ||||
|         } else { | ||||
|             runtime.log.audit({event: "nodes.info.get",id:id,error:"not_found"}, opts.req); | ||||
|             var err = new Error("Node not found"); | ||||
|             err.code = "not_found"; | ||||
|             err.status = 404; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -78,11 +76,9 @@ var api = module.exports = { | ||||
|     * @return {Promise<NodeList>} - the list of node modules | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getNodeList: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             runtime.log.audit({event: "nodes.list.get"}, opts.req); | ||||
|             return resolve(runtime.nodes.getNodeList()); | ||||
|         }) | ||||
|     getNodeList: async function(opts) { | ||||
|         runtime.log.audit({event: "nodes.list.get"}, opts.req); | ||||
|         return runtime.nodes.getNodeList(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -95,22 +91,20 @@ var api = module.exports = { | ||||
|     * @return {Promise<String>} - the node html content | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getNodeConfig: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var id = opts.id; | ||||
|             var lang = opts.lang; | ||||
|             var result = runtime.nodes.getNodeConfig(id,lang); | ||||
|             if (result) { | ||||
|                 runtime.log.audit({event: "nodes.config.get",id:id}, opts.req); | ||||
|                 return resolve(result); | ||||
|             } else { | ||||
|                 runtime.log.audit({event: "nodes.config.get",id:id,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Node not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 return reject(err); | ||||
|             } | ||||
|         }); | ||||
|     getNodeConfig: async function(opts) { | ||||
|         var id = opts.id; | ||||
|         var lang = opts.lang; | ||||
|         var result = runtime.nodes.getNodeConfig(id,lang); | ||||
|         if (result) { | ||||
|             runtime.log.audit({event: "nodes.config.get",id:id}, opts.req); | ||||
|             return result; | ||||
|         } else { | ||||
|             runtime.log.audit({event: "nodes.config.get",id:id,error:"not_found"}, opts.req); | ||||
|             var err = new Error("Node not found"); | ||||
|             err.code = "not_found"; | ||||
|             err.status = 404; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|     /** | ||||
|     * Gets all node html content | ||||
| @@ -121,11 +115,9 @@ var api = module.exports = { | ||||
|     * @return {Promise<String>} - the node html content | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getNodeConfigs: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             runtime.log.audit({event: "nodes.configs.get"}, opts.req); | ||||
|             return resolve(runtime.nodes.getNodeConfigs(opts.lang)); | ||||
|         }); | ||||
|     getNodeConfigs: async function(opts) { | ||||
|         runtime.log.audit({event: "nodes.configs.get"}, opts.req); | ||||
|         return runtime.nodes.getNodeConfigs(opts.lang); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -137,20 +129,18 @@ var api = module.exports = { | ||||
|     * @return {Promise<ModuleInfo>} - the node module info | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getModuleInfo: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var result = runtime.nodes.getModuleInfo(opts.module); | ||||
|             if (result) { | ||||
|                 runtime.log.audit({event: "nodes.module.get",id:opts.module}, opts.req); | ||||
|                 return resolve(result); | ||||
|             } else { | ||||
|                 runtime.log.audit({event: "nodes.module.get",id:opts.module,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Module not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 return reject(err); | ||||
|             } | ||||
|         }) | ||||
|     getModuleInfo: async function(opts) { | ||||
|         var result = runtime.nodes.getModuleInfo(opts.module); | ||||
|         if (result) { | ||||
|             runtime.log.audit({event: "nodes.module.get",id:opts.module}, opts.req); | ||||
|             return result; | ||||
|         } else { | ||||
|             runtime.log.audit({event: "nodes.module.get",id:opts.module,error:"not_found"}, opts.req); | ||||
|             var err = new Error("Module not found"); | ||||
|             err.code = "not_found"; | ||||
|             err.status = 404; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -165,83 +155,78 @@ var api = module.exports = { | ||||
|     * @return {Promise<ModuleInfo>} - the node module info | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     addModule: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             if (!runtime.settings.available()) { | ||||
|                 runtime.log.audit({event: "nodes.install",error:"settings_unavailable"}, opts.req); | ||||
|                 var err = new Error("Settings unavailable"); | ||||
|                 err.code = "settings_unavailable"; | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             } | ||||
|             if (opts.tarball) { | ||||
|                 if (runtime.settings.editorTheme && runtime.settings.editorTheme.palette && runtime.settings.editorTheme.palette.upload === false) { | ||||
|                     runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,error:"invalid_request"}, opts.req); | ||||
|                     var err = new Error("Invalid request"); | ||||
|                     err.code = "invalid_request"; | ||||
|                     err.status = 400; | ||||
|                     return reject(err); | ||||
|                 } | ||||
|                 if (opts.module || opts.version || opts.url) { | ||||
|                     runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,module:opts.module,error:"invalid_request"}, opts.req); | ||||
|                     var err = new Error("Invalid request"); | ||||
|                     err.code = "invalid_request"; | ||||
|                     err.status = 400; | ||||
|                     return reject(err); | ||||
|                 } | ||||
|                 runtime.nodes.installModule(opts.tarball.buffer).then(function(info) { | ||||
|                     runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,module:info.id}, opts.req); | ||||
|                     return resolve(info); | ||||
|                 }).catch(function(err) { | ||||
|  | ||||
|                     if (err.code) { | ||||
|                         err.status = 400; | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code}, opts.req); | ||||
|                     } else { | ||||
|                         err.status = 400; | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                     } | ||||
|                     return reject(err); | ||||
|                 }) | ||||
|                 return; | ||||
|             } | ||||
|             if (opts.module) { | ||||
|                 var existingModule = runtime.nodes.getModuleInfo(opts.module); | ||||
|                 if (existingModule) { | ||||
|                     if (!opts.version || existingModule.version === opts.version) { | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module, version:opts.version, error:"module_already_loaded"}, opts.req); | ||||
|                         var err = new Error("Module already loaded"); | ||||
|                         err.code = "module_already_loaded"; | ||||
|                         err.status = 400; | ||||
|                         return reject(err); | ||||
|                     } | ||||
|                 } | ||||
|                 runtime.nodes.installModule(opts.module,opts.version,opts.url).then(function(info) { | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url}, opts.req); | ||||
|                     return resolve(info); | ||||
|                 }).catch(function(err) { | ||||
|                     if (err.code === 404) { | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:"not_found"}, opts.req); | ||||
|                         // TODO: code/status | ||||
|                         err.status = 404; | ||||
|                     } else if (err.code) { | ||||
|                         err.status = 400; | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code}, opts.req); | ||||
|                     } else { | ||||
|                         err.status = 400; | ||||
|                         runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                     } | ||||
|                     return reject(err); | ||||
|                 }) | ||||
|             } else { | ||||
|                 runtime.log.audit({event: "nodes.install",module:opts.module,error:"invalid_request"}, opts.req); | ||||
|     addModule: async function(opts) { | ||||
|         if (!runtime.settings.available()) { | ||||
|             runtime.log.audit({event: "nodes.install",error:"settings_unavailable"}, opts.req); | ||||
|             var err = new Error("Settings unavailable"); | ||||
|             err.code = "settings_unavailable"; | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|         if (opts.tarball) { | ||||
|             if (runtime.settings.editorTheme && runtime.settings.editorTheme.palette && runtime.settings.editorTheme.palette.upload === false) { | ||||
|                 runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,error:"invalid_request"}, opts.req); | ||||
|                 var err = new Error("Invalid request"); | ||||
|                 err.code = "invalid_request"; | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|                 throw err; | ||||
|             } | ||||
|  | ||||
|         }); | ||||
|             if (opts.module || opts.version || opts.url) { | ||||
|                 runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,module:opts.module,error:"invalid_request"}, opts.req); | ||||
|                 var err = new Error("Invalid request"); | ||||
|                 err.code = "invalid_request"; | ||||
|                 err.status = 400; | ||||
|                 throw err; | ||||
|             } | ||||
|             return runtime.nodes.installModule(opts.tarball.buffer).then(function(info) { | ||||
|                 runtime.log.audit({event: "nodes.install",tarball:opts.tarball.file,module:info.id}, opts.req); | ||||
|                 return info; | ||||
|             }).catch(function(err) { | ||||
|                 if (err.code) { | ||||
|                     err.status = 400; | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code}, opts.req); | ||||
|                 } else { | ||||
|                     err.status = 400; | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                 } | ||||
|                 throw err; | ||||
|             }) | ||||
|         } | ||||
|         if (opts.module) { | ||||
|             var existingModule = runtime.nodes.getModuleInfo(opts.module); | ||||
|             if (existingModule) { | ||||
|                 if (!opts.version || existingModule.version === opts.version) { | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module, version:opts.version, error:"module_already_loaded"}, opts.req); | ||||
|                     var err = new Error("Module already loaded"); | ||||
|                     err.code = "module_already_loaded"; | ||||
|                     err.status = 400; | ||||
|                     throw err; | ||||
|                 } | ||||
|             } | ||||
|             return runtime.nodes.installModule(opts.module,opts.version,opts.url).then(function(info) { | ||||
|                 runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url}, opts.req); | ||||
|                 return info; | ||||
|             }).catch(function(err) { | ||||
|                 if (err.code === 404) { | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:"not_found"}, opts.req); | ||||
|                     // TODO: code/status | ||||
|                     err.status = 404; | ||||
|                 } else if (err.code) { | ||||
|                     err.status = 400; | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code}, opts.req); | ||||
|                 } else { | ||||
|                     err.status = 400; | ||||
|                     runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                 } | ||||
|                 throw err; | ||||
|             }) | ||||
|         } else { | ||||
|             runtime.log.audit({event: "nodes.install",module:opts.module,error:"invalid_request"}, opts.req); | ||||
|             var err = new Error("Invalid request"); | ||||
|             err.code = "invalid_request"; | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|     /** | ||||
|     * Removes a module from the runtime | ||||
| @@ -252,38 +237,35 @@ var api = module.exports = { | ||||
|     * @return {Promise} - resolves when complete | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     removeModule: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             if (!runtime.settings.available()) { | ||||
|                 runtime.log.audit({event: "nodes.install",error:"settings_unavailable"}, opts.req); | ||||
|                 var err = new Error("Settings unavailable"); | ||||
|                 err.code = "settings_unavailable"; | ||||
|     removeModule: async function(opts) { | ||||
|         if (!runtime.settings.available()) { | ||||
|             runtime.log.audit({event: "nodes.install",error:"settings_unavailable"}, opts.req); | ||||
|             var err = new Error("Settings unavailable"); | ||||
|             err.code = "settings_unavailable"; | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|         var module = runtime.nodes.getModuleInfo(opts.module); | ||||
|         if (!module) { | ||||
|             runtime.log.audit({event: "nodes.remove",module:opts.module,error:"not_found"}, opts.req); | ||||
|             var err = new Error("Module not found"); | ||||
|             err.code = "not_found"; | ||||
|             err.status = 404; | ||||
|             throw err; | ||||
|         } | ||||
|         try { | ||||
|             return runtime.nodes.uninstallModule(opts.module).then(function() { | ||||
|                 runtime.log.audit({event: "nodes.remove",module:opts.module}, opts.req); | ||||
|             }).catch(function(err) { | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             } | ||||
|             var module = runtime.nodes.getModuleInfo(opts.module); | ||||
|             if (!module) { | ||||
|                 runtime.log.audit({event: "nodes.remove",module:opts.module,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Module not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 return reject(err); | ||||
|             } | ||||
|             try { | ||||
|                 runtime.nodes.uninstallModule(opts.module).then(function() { | ||||
|                     runtime.log.audit({event: "nodes.remove",module:opts.module}, opts.req); | ||||
|                     resolve(); | ||||
|                 }).catch(function(err) { | ||||
|                     err.status = 400; | ||||
|                     runtime.log.audit({event: "nodes.remove",module:opts.module,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                     return reject(err); | ||||
|                 }) | ||||
|             } catch(error) { | ||||
|                 runtime.log.audit({event: "nodes.remove",module:opts.module,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|                 error.status = 400; | ||||
|                 return reject(error); | ||||
|             } | ||||
|         }); | ||||
|                 runtime.log.audit({event: "nodes.remove",module:opts.module,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                 throw err; | ||||
|             }) | ||||
|         } catch(error) { | ||||
|             runtime.log.audit({event: "nodes.remove",module:opts.module,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|             error.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -296,43 +278,41 @@ var api = module.exports = { | ||||
|     * @return {Promise<ModuleInfo>} - the module info object | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     setModuleState: function(opts) { | ||||
|     setModuleState: async function(opts) { | ||||
|         var mod = opts.module; | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             if (!runtime.settings.available()) { | ||||
|                 runtime.log.audit({event: "nodes.module.set",error:"settings_unavailable"}, opts.req); | ||||
|                 var err = new Error("Settings unavailable"); | ||||
|                 err.code = "settings_unavailable"; | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|         if (!runtime.settings.available()) { | ||||
|             runtime.log.audit({event: "nodes.module.set",error:"settings_unavailable"}, opts.req); | ||||
|             var err = new Error("Settings unavailable"); | ||||
|             err.code = "settings_unavailable"; | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|         try { | ||||
|             var module = runtime.nodes.getModuleInfo(mod); | ||||
|             if (!module) { | ||||
|                 runtime.log.audit({event: "nodes.module.set",module:mod,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Module not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 throw err; | ||||
|             } | ||||
|             try { | ||||
|                 var module = runtime.nodes.getModuleInfo(mod); | ||||
|                 if (!module) { | ||||
|                     runtime.log.audit({event: "nodes.module.set",module:mod,error:"not_found"}, opts.req); | ||||
|                     var err = new Error("Module not found"); | ||||
|                     err.code = "not_found"; | ||||
|                     err.status = 404; | ||||
|                     return reject(err); | ||||
|                 } | ||||
|  | ||||
|                 var nodes = module.nodes; | ||||
|                 var promises = []; | ||||
|                 for (var i = 0; i < nodes.length; ++i) { | ||||
|                     promises.push(putNode(nodes[i],opts.enabled)); | ||||
|                 } | ||||
|                 Promise.all(promises).then(function() { | ||||
|                     return resolve(runtime.nodes.getModuleInfo(mod)); | ||||
|                 }).catch(function(err) { | ||||
|                     err.status = 400; | ||||
|                     return reject(err); | ||||
|                 }); | ||||
|             } catch(error) { | ||||
|                 runtime.log.audit({event: "nodes.module.set",module:mod,enabled:opts.enabled,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|                 error.status = 400; | ||||
|                 return reject(error); | ||||
|             var nodes = module.nodes; | ||||
|             var promises = []; | ||||
|             for (var i = 0; i < nodes.length; ++i) { | ||||
|                 promises.push(putNode(nodes[i],opts.enabled)); | ||||
|             } | ||||
|         }); | ||||
|             return Promise.all(promises).then(function() { | ||||
|                 return runtime.nodes.getModuleInfo(mod); | ||||
|             }).catch(function(err) { | ||||
|                 err.status = 400; | ||||
|                 throw err; | ||||
|             }); | ||||
|         } catch(error) { | ||||
|             runtime.log.audit({event: "nodes.module.set",module:mod,enabled:opts.enabled,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|             error.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -345,43 +325,41 @@ var api = module.exports = { | ||||
|     * @return {Promise<ModuleInfo>} - the module info object | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     setNodeSetState: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             if (!runtime.settings.available()) { | ||||
|                 runtime.log.audit({event: "nodes.info.set",error:"settings_unavailable"}, opts.req); | ||||
|                 var err = new Error("Settings unavailable"); | ||||
|                 err.code = "settings_unavailable"; | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             } | ||||
|     setNodeSetState: async function(opts) { | ||||
|         if (!runtime.settings.available()) { | ||||
|             runtime.log.audit({event: "nodes.info.set",error:"settings_unavailable"}, opts.req); | ||||
|             var err = new Error("Settings unavailable"); | ||||
|             err.code = "settings_unavailable"; | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|  | ||||
|             var id = opts.id; | ||||
|             var enabled = opts.enabled; | ||||
|             try { | ||||
|                 var node = runtime.nodes.getNodeInfo(id); | ||||
|                 if (!node) { | ||||
|                     runtime.log.audit({event: "nodes.info.set",id:id,error:"not_found"}, opts.req); | ||||
|                     var err = new Error("Node not found"); | ||||
|                     err.code = "not_found"; | ||||
|                     err.status = 404; | ||||
|                     return reject(err); | ||||
|                 } else { | ||||
|                     delete node.loaded; | ||||
|                     putNode(node,enabled).then(function(result) { | ||||
|                         runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled}, opts.req); | ||||
|                         return resolve(result); | ||||
|                     }).catch(function(err) { | ||||
|                         runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                         err.status = 400; | ||||
|                         return reject(err); | ||||
|                     }); | ||||
|                 } | ||||
|             } catch(error) { | ||||
|                 runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|                 error.status = 400; | ||||
|                 return reject(error); | ||||
|         var id = opts.id; | ||||
|         var enabled = opts.enabled; | ||||
|         try { | ||||
|             var node = runtime.nodes.getNodeInfo(id); | ||||
|             if (!node) { | ||||
|                 runtime.log.audit({event: "nodes.info.set",id:id,error:"not_found"}, opts.req); | ||||
|                 var err = new Error("Node not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 throw err; | ||||
|             } else { | ||||
|                 delete node.loaded; | ||||
|                 return putNode(node,enabled).then(function(result) { | ||||
|                     runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled}, opts.req); | ||||
|                     return result; | ||||
|                 }).catch(function(err) { | ||||
|                     runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                     err.status = 400; | ||||
|                     throw err; | ||||
|                 }); | ||||
|             } | ||||
|         }); | ||||
|         } catch(error) { | ||||
|             runtime.log.audit({event: "nodes.info.set",id:id,enabled:enabled,error:error.code||"unexpected_error",message:error.toString()}, opts.req); | ||||
|             error.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -393,23 +371,21 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the message catalogs | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getModuleCatalogs: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var namespace = opts.module; | ||||
|             var lang = opts.lang; | ||||
|             var prevLang = runtime.i18n.i.language; | ||||
|             // Trigger a load from disk of the language if it is not the default | ||||
|             runtime.i18n.i.changeLanguage(lang, function(){ | ||||
|                 var nodeList = runtime.nodes.getNodeList(); | ||||
|                 var result = {}; | ||||
|                 nodeList.forEach(function(n) { | ||||
|                     if (n.module !== "node-red") { | ||||
|                         result[n.id] = runtime.i18n.i.getResourceBundle(lang, n.id)||{}; | ||||
|                     } | ||||
|                 }); | ||||
|                 resolve(result); | ||||
|     getModuleCatalogs: async function(opts) { | ||||
|         var namespace = opts.module; | ||||
|         var lang = opts.lang; | ||||
|         var prevLang = runtime.i18n.i.language; | ||||
|         // Trigger a load from disk of the language if it is not the default | ||||
|         return runtime.i18n.i.changeLanguage(lang, function(){ | ||||
|             var nodeList = runtime.nodes.getNodeList(); | ||||
|             var result = {}; | ||||
|             nodeList.forEach(function(n) { | ||||
|                 if (n.module !== "node-red") { | ||||
|                     result[n.id] = runtime.i18n.i.getResourceBundle(lang, n.id)||{}; | ||||
|                 } | ||||
|             }); | ||||
|             runtime.i18n.i.changeLanguage(prevLang); | ||||
|             return result; | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -423,17 +399,15 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the message catalog | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getModuleCatalog: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var namespace = opts.module; | ||||
|             var lang = opts.lang; | ||||
|             var prevLang = runtime.i18n.i.language; | ||||
|             // Trigger a load from disk of the language if it is not the default | ||||
|             runtime.i18n.i.changeLanguage(lang, function(){ | ||||
|                 var catalog = runtime.i18n.i.getResourceBundle(lang, namespace); | ||||
|                 resolve(catalog||{}); | ||||
|             }); | ||||
|     getModuleCatalog: async function(opts) { | ||||
|         var namespace = opts.module; | ||||
|         var lang = opts.lang; | ||||
|         var prevLang = runtime.i18n.i.language; | ||||
|         // Trigger a load from disk of the language if it is not the default | ||||
|         return runtime.i18n.i.changeLanguage(lang, function(){ | ||||
|             var catalog = runtime.i18n.i.getResourceBundle(lang, namespace); | ||||
|             runtime.i18n.i.changeLanguage(prevLang); | ||||
|             return catalog||{}; | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -445,12 +419,9 @@ var api = module.exports = { | ||||
|     * @return {Promise<IconList>} - the list of all icons | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getIconList: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             runtime.log.audit({event: "nodes.icons.get"}, opts.req); | ||||
|             return resolve(runtime.nodes.getNodeIcons()); | ||||
|         }); | ||||
|  | ||||
|     getIconList: async function(opts) { | ||||
|         runtime.log.audit({event: "nodes.icons.get"}, opts.req); | ||||
|         return runtime.nodes.getNodeIcons(); | ||||
|     }, | ||||
|     /** | ||||
|     * Gets a node icon | ||||
| @@ -462,20 +433,15 @@ var api = module.exports = { | ||||
|     * @return {Promise<Buffer>} - the icon file as a Buffer or null if no icon available | ||||
|     * @memberof @node-red/runtime_nodes | ||||
|     */ | ||||
|     getIcon: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var iconPath = runtime.nodes.getNodeIconPath(opts.module,opts.icon); | ||||
|             if (iconPath) { | ||||
|                 fs.readFile(iconPath,function(err,data) { | ||||
|                     if (err) { | ||||
|                         err.status = 400; | ||||
|                         return reject(err); | ||||
|                     } | ||||
|                     return resolve(data) | ||||
|                 }); | ||||
|             } else { | ||||
|                 resolve(null); | ||||
|             } | ||||
|         }); | ||||
|     getIcon: async function(opts) { | ||||
|         var iconPath = runtime.nodes.getNodeIconPath(opts.module,opts.icon); | ||||
|         if (iconPath) { | ||||
|             return fs.readFile(iconPath).catch(err => { | ||||
|                 err.status = 400; | ||||
|                 throw err; | ||||
|             }); | ||||
|         } else { | ||||
|             return null | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,8 +24,8 @@ var api = module.exports = { | ||||
|     init: function(_runtime) { | ||||
|         runtime = _runtime; | ||||
|     }, | ||||
|     available: function(opts) { | ||||
|         return Promise.resolve(!!runtime.storage.projects); | ||||
|     available: async function(opts) { | ||||
|         return !!runtime.storage.projects; | ||||
|     }, | ||||
|     /** | ||||
|     * List projects known to the runtime | ||||
| @@ -36,7 +36,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     listProjects: function(opts) { | ||||
|     listProjects: async function(opts) { | ||||
|         return runtime.storage.projects.listProjects(opts.user).then(function(list) { | ||||
|             var active = runtime.storage.projects.getActiveProject(opts.user); | ||||
|             var response = { | ||||
| @@ -61,7 +61,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     createProject: function(opts) { | ||||
|     createProject: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.create",name:opts.project?opts.project.name:"missing-name"}, opts.req); | ||||
|         return runtime.storage.projects.createProject(opts.user, opts.project) | ||||
|     }, | ||||
| @@ -76,7 +76,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     initialiseProject: function(opts) { | ||||
|     initialiseProject: async function(opts) { | ||||
|         // Initialised set when creating default files for an empty repo | ||||
|         runtime.log.audit({event: "projects.initialise",id:opts.id}, opts.req); | ||||
|         return runtime.storage.projects.initialiseProject(opts.user, opts.id, opts.project) | ||||
| @@ -90,8 +90,8 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the active project | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getActiveProject: function(opts) { | ||||
|         return Promise.resolve(runtime.storage.projects.getActiveProject(opts.user)); | ||||
|     getActiveProject: async function(opts) { | ||||
|         return runtime.storage.projects.getActiveProject(opts.user); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -103,13 +103,11 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     setActiveProject: function(opts) { | ||||
|     setActiveProject: async function(opts) { | ||||
|         var currentProject = runtime.storage.projects.getActiveProject(opts.user); | ||||
|         runtime.log.audit({event: "projects.set",id:opts.id}, opts.req); | ||||
|         if (!currentProject || opts.id !== currentProject.name) { | ||||
|             return runtime.storage.projects.setActiveProject(opts.user, opts.id); | ||||
|         } else { | ||||
|             return Promise.resolve(); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
| @@ -122,7 +120,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the project metadata | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getProject: function(opts) { | ||||
|     getProject: async function(opts) { | ||||
|         return runtime.storage.projects.getProject(opts.user, opts.id) | ||||
|     }, | ||||
|  | ||||
| @@ -136,7 +134,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     updateProject: function(opts) { | ||||
|     updateProject: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.update",id:opts.id}, opts.req); | ||||
|         return runtime.storage.projects.updateProject(opts.user, opts.id, opts.project); | ||||
|     }, | ||||
| @@ -150,7 +148,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     deleteProject: function(opts) { | ||||
|     deleteProject: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.delete",id:opts.id}, opts.req); | ||||
|         return runtime.storage.projects.deleteProject(opts.user, opts.id); | ||||
|     }, | ||||
| @@ -165,7 +163,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the project status | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getStatus: function(opts) { | ||||
|     getStatus: async function(opts) { | ||||
|         return runtime.storage.projects.getStatus(opts.user, opts.id, opts.remote) | ||||
|     }, | ||||
|  | ||||
| @@ -179,7 +177,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - a list of the local branches | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getBranches: function(opts) { | ||||
|     getBranches: async function(opts) { | ||||
|         return runtime.storage.projects.getBranches(opts.user, opts.id, opts.remote); | ||||
|     }, | ||||
|  | ||||
| @@ -193,7 +191,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the status of the branch | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getBranchStatus: function(opts) { | ||||
|     getBranchStatus: async function(opts) { | ||||
|         return runtime.storage.projects.getBranchStatus(opts.user, opts.id, opts.branch); | ||||
|     }, | ||||
|  | ||||
| @@ -208,7 +206,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     setBranch: function(opts) { | ||||
|     setBranch: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.branch.set",id:opts.id, branch: opts.branch, create:opts.create}, opts.req); | ||||
|         return runtime.storage.projects.setBranch(opts.user, opts.id, opts.branch, opts.create) | ||||
|     }, | ||||
| @@ -224,7 +222,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     deleteBranch: function(opts) { | ||||
|     deleteBranch: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.branch.delete",id:opts.id, branch: opts.branch, force:opts.force}, opts.req); | ||||
|         return runtime.storage.projects.deleteBranch(opts.user, opts.id, opts.branch, false, opts.force); | ||||
|     }, | ||||
| @@ -239,7 +237,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     commit: function(opts) { | ||||
|     commit: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.commit",id:opts.id}, opts.req); | ||||
|         return runtime.storage.projects.commit(opts.user, opts.id,{message: opts.message}); | ||||
|     }, | ||||
| @@ -254,7 +252,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the commit details | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getCommit: function(opts) { | ||||
|     getCommit: async function(opts) { | ||||
|         return runtime.storage.projects.getCommit(opts.user, opts.id, opts.sha); | ||||
|     }, | ||||
|  | ||||
| @@ -269,7 +267,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Array>} - an array of commits | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getCommits: function(opts) { | ||||
|     getCommits: async function(opts) { | ||||
|         return runtime.storage.projects.getCommits(opts.user, opts.id, { | ||||
|             limit: opts.limit || 20, | ||||
|             before: opts.before | ||||
| @@ -285,7 +283,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     abortMerge: function(opts) { | ||||
|     abortMerge: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.merge.abort",id:opts.id}, opts.req); | ||||
|         return runtime.storage.projects.abortMerge(opts.user, opts.id); | ||||
|     }, | ||||
| @@ -301,7 +299,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     resolveMerge: function(opts) { | ||||
|     resolveMerge: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.merge.resolve",id:opts.id, file:opts.path}, opts.req); | ||||
|         return runtime.storage.projects.resolveMerge(opts.user, opts.id, opts.path, opts.resolution); | ||||
|     }, | ||||
| @@ -315,7 +313,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the file listing | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getFiles: function(opts) { | ||||
|     getFiles: async function(opts) { | ||||
|         return runtime.storage.projects.getFiles(opts.user, opts.id); | ||||
|     }, | ||||
|  | ||||
| @@ -330,7 +328,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<String>} - the content of the file | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getFile: function(opts) { | ||||
|     getFile: async function(opts) { | ||||
|         return runtime.storage.projects.getFile(opts.user, opts.id,opts.path,opts.tree); | ||||
|     }, | ||||
|  | ||||
| @@ -344,7 +342,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     stageFile: function(opts) { | ||||
|     stageFile: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.file.stage",id:opts.id, file:opts.path}, opts.req); | ||||
|         return runtime.storage.projects.stageFile(opts.user, opts.id, opts.path); | ||||
|     }, | ||||
| @@ -359,7 +357,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     unstageFile: function(opts) { | ||||
|     unstageFile: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.file.unstage",id:opts.id, file:opts.path}, opts.req); | ||||
|         return runtime.storage.projects.unstageFile(opts.user, opts.id, opts.path); | ||||
|     }, | ||||
| @@ -374,7 +372,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     revertFile: function(opts) { | ||||
|     revertFile: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.file.revert",id:opts.id, file:opts.path}, opts.req); | ||||
|         return runtime.storage.projects.revertFile(opts.user, opts.id,opts.path) | ||||
|     }, | ||||
| @@ -390,7 +388,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the requested diff | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getFileDiff: function(opts) { | ||||
|     getFileDiff: async function(opts) { | ||||
|         return runtime.storage.projects.getFileDiff(opts.user, opts.id, opts.path, opts.type); | ||||
|     }, | ||||
|  | ||||
| @@ -403,7 +401,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - a list of project remotes | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     getRemotes: function(opts) { | ||||
|     getRemotes: async function(opts) { | ||||
|         return runtime.storage.projects.getRemotes(opts.user, opts.id); | ||||
|  | ||||
|     }, | ||||
| @@ -420,7 +418,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     addRemote: function(opts) { | ||||
|     addRemote: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.remote.add",id:opts.id, remote:opts.remote.name}, opts.req); | ||||
|         return runtime.storage.projects.addRemote(opts.user, opts.id, opts.remote) | ||||
|     }, | ||||
| @@ -435,7 +433,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     removeRemote: function(opts) { | ||||
|     removeRemote: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.remote.delete",id:opts.id, remote:opts.remote}, opts.req); | ||||
|         return runtime.storage.projects.removeRemote(opts.user, opts.id, opts.remote); | ||||
|     }, | ||||
| @@ -451,7 +449,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     updateRemote: function(opts) { | ||||
|     updateRemote: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.remote.update",id:opts.id, remote:opts.remote.name}, opts.req); | ||||
|         return runtime.storage.projects.updateRemote(opts.user, opts.id, opts.remote.name, opts.remote) | ||||
|     }, | ||||
| @@ -467,7 +465,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     pull: function(opts) { | ||||
|     pull: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.pull",id:opts.id, remote: opts.remote, track:opts.track}, opts.req); | ||||
|         return runtime.storage.projects.pull(opts.user, opts.id, opts.remote, opts.track, opts.allowUnrelatedHistories); | ||||
|     }, | ||||
| @@ -483,7 +481,7 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - resolves when complete | ||||
|     * @memberof @node-red/runtime_projects | ||||
|     */ | ||||
|     push: function(opts) { | ||||
|     push: async function(opts) { | ||||
|         runtime.log.audit({event: "projects.push",id:opts.id, remote: opts.remote, track:opts.track}, opts.req); | ||||
|         return runtime.storage.projects.push(opts.user, opts.id, opts.remote, opts.track); | ||||
|     } | ||||
|   | ||||
| @@ -64,64 +64,57 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the runtime settings | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     getRuntimeSettings: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             try { | ||||
|                 var safeSettings = { | ||||
|                     httpNodeRoot: runtime.settings.httpNodeRoot||"/", | ||||
|                     version: runtime.settings.version | ||||
|                 } | ||||
|                 if (opts.user) { | ||||
|                     safeSettings.user = {} | ||||
|                     var props = ["anonymous","username","image","permissions"]; | ||||
|                     props.forEach(prop => { | ||||
|                         if (opts.user.hasOwnProperty(prop)) { | ||||
|                             safeSettings.user[prop] = opts.user[prop]; | ||||
|                         } | ||||
|                     }) | ||||
|     getRuntimeSettings: async function(opts) { | ||||
|         var safeSettings = { | ||||
|             httpNodeRoot: runtime.settings.httpNodeRoot||"/", | ||||
|             version: runtime.settings.version | ||||
|         } | ||||
|         if (opts.user) { | ||||
|             safeSettings.user = {} | ||||
|             var props = ["anonymous","username","image","permissions"]; | ||||
|             props.forEach(prop => { | ||||
|                 if (opts.user.hasOwnProperty(prop)) { | ||||
|                     safeSettings.user[prop] = opts.user[prop]; | ||||
|                 } | ||||
|             }) | ||||
|         } | ||||
|  | ||||
|                 if (!runtime.settings.disableEditor) { | ||||
|                     safeSettings.context = runtime.nodes.listContextStores(); | ||||
|         if (!runtime.settings.disableEditor) { | ||||
|             safeSettings.context = runtime.nodes.listContextStores(); | ||||
|  | ||||
|                     if (util.isArray(runtime.settings.paletteCategories)) { | ||||
|                         safeSettings.paletteCategories = runtime.settings.paletteCategories; | ||||
|                     } | ||||
|  | ||||
|                     if (runtime.settings.flowFilePretty) { | ||||
|                         safeSettings.flowFilePretty = runtime.settings.flowFilePretty; | ||||
|                     } | ||||
|  | ||||
|                     if (!runtime.nodes.paletteEditorEnabled()) { | ||||
|                         safeSettings.editorTheme = safeSettings.editorTheme || {}; | ||||
|                         safeSettings.editorTheme.palette = safeSettings.editorTheme.palette || {}; | ||||
|                         safeSettings.editorTheme.palette.editable = false; | ||||
|                     } | ||||
|                     if (runtime.storage.projects) { | ||||
|                         var activeProject = runtime.storage.projects.getActiveProject(); | ||||
|                         if (activeProject) { | ||||
|                             safeSettings.project = activeProject; | ||||
|                         } else if (runtime.storage.projects.flowFileExists()) { | ||||
|                             safeSettings.files = { | ||||
|                                 flow: runtime.storage.projects.getFlowFilename(), | ||||
|                                 credentials: runtime.storage.projects.getCredentialsFilename() | ||||
|                             } | ||||
|                         } | ||||
|                         safeSettings.git = { | ||||
|                             globalUser: runtime.storage.projects.getGlobalGitUser() | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     safeSettings.flowEncryptionType = runtime.nodes.getCredentialKeyType(); | ||||
|                     runtime.settings.exportNodeSettings(safeSettings); | ||||
|                 } | ||||
|  | ||||
|  | ||||
|                 resolve(safeSettings); | ||||
|             }catch(err) { | ||||
|                 console.log(err); | ||||
|             if (util.isArray(runtime.settings.paletteCategories)) { | ||||
|                 safeSettings.paletteCategories = runtime.settings.paletteCategories; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|             if (runtime.settings.flowFilePretty) { | ||||
|                 safeSettings.flowFilePretty = runtime.settings.flowFilePretty; | ||||
|             } | ||||
|  | ||||
|             if (!runtime.nodes.paletteEditorEnabled()) { | ||||
|                 safeSettings.editorTheme = safeSettings.editorTheme || {}; | ||||
|                 safeSettings.editorTheme.palette = safeSettings.editorTheme.palette || {}; | ||||
|                 safeSettings.editorTheme.palette.editable = false; | ||||
|             } | ||||
|             if (runtime.storage.projects) { | ||||
|                 var activeProject = runtime.storage.projects.getActiveProject(); | ||||
|                 if (activeProject) { | ||||
|                     safeSettings.project = activeProject; | ||||
|                 } else if (runtime.storage.projects.flowFileExists()) { | ||||
|                     safeSettings.files = { | ||||
|                         flow: runtime.storage.projects.getFlowFilename(), | ||||
|                         credentials: runtime.storage.projects.getCredentialsFilename() | ||||
|                     } | ||||
|                 } | ||||
|                 safeSettings.git = { | ||||
|                     globalUser: runtime.storage.projects.getGlobalGitUser() | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             safeSettings.flowEncryptionType = runtime.nodes.getCredentialKeyType(); | ||||
|             runtime.settings.exportNodeSettings(safeSettings); | ||||
|         } | ||||
|  | ||||
|         return safeSettings; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -132,14 +125,14 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the user settings | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     getUserSettings: function(opts) { | ||||
|     getUserSettings: async function(opts) { | ||||
|         var username; | ||||
|         if (!opts.user || opts.user.anonymous) { | ||||
|             username = '_'; | ||||
|         } else { | ||||
|             username = opts.user.username; | ||||
|         } | ||||
|         return Promise.resolve(runtime.settings.getUserSettings(username)||{}); | ||||
|         return runtime.settings.getUserSettings(username)||{}; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -151,32 +144,30 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the user settings | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     updateUserSettings: function(opts) { | ||||
|     updateUserSettings: async function(opts) { | ||||
|         var username; | ||||
|         if (!opts.user || opts.user.anonymous) { | ||||
|             username = '_'; | ||||
|         } else { | ||||
|             username = opts.user.username; | ||||
|         } | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var currentSettings = runtime.settings.getUserSettings(username)||{}; | ||||
|             currentSettings = extend(currentSettings, opts.settings); | ||||
|             try { | ||||
|                 runtime.settings.setUserSettings(username, currentSettings).then(function() { | ||||
|                     runtime.log.audit({event: "settings.update",username:username}, opts.req); | ||||
|                     return resolve(); | ||||
|                 }).catch(function(err) { | ||||
|                     runtime.log.audit({event: "settings.update",username:username,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                     err.status = 400; | ||||
|                     return reject(err); | ||||
|                 }); | ||||
|             } catch(err) { | ||||
|                 runtime.log.warn(runtime.log._("settings.user-not-available",{message:runtime.log._("settings.not-available")})); | ||||
|         var currentSettings = runtime.settings.getUserSettings(username)||{}; | ||||
|         currentSettings = extend(currentSettings, opts.settings); | ||||
|         try { | ||||
|             return runtime.settings.setUserSettings(username, currentSettings).then(function() { | ||||
|                 runtime.log.audit({event: "settings.update",username:username}, opts.req); | ||||
|                 return; | ||||
|             }).catch(function(err) { | ||||
|                 runtime.log.audit({event: "settings.update",username:username,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             } | ||||
|         }); | ||||
|                 throw err; | ||||
|             }); | ||||
|         } catch(err) { | ||||
|             runtime.log.warn(runtime.log._("settings.user-not-available",{message:runtime.log._("settings.not-available")})); | ||||
|             runtime.log.audit({event: "settings.update",username:username,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -187,15 +178,12 @@ var api = module.exports = { | ||||
|     * @return {Promise<Object>} - the user's ssh keys | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     getUserKeys: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var username = getSSHKeyUsername(opts.user); | ||||
|             runtime.storage.projects.ssh.listSSHKeys(username).then(function(list) { | ||||
|                 return resolve(list); | ||||
|             }).catch(function(err) { | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             }); | ||||
|     getUserKeys: async function(opts) { | ||||
|         var username = getSSHKeyUsername(opts.user); | ||||
|         return runtime.storage.projects.ssh.listSSHKeys(username).catch(function(err) { | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|             return reject(err); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -208,23 +196,23 @@ var api = module.exports = { | ||||
|     * @return {Promise<String>} - the user's ssh public key | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     getUserKey: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var username = getSSHKeyUsername(opts.user); | ||||
|             // console.log('username:', username); | ||||
|             runtime.storage.projects.ssh.getSSHKey(username, opts.id).then(function(data) { | ||||
|                 if (data) { | ||||
|                     return resolve(data); | ||||
|                 } else { | ||||
|                     var err = new Error("Key not found"); | ||||
|                     err.code = "not_found"; | ||||
|                     err.status = 404; | ||||
|                     return reject(err); | ||||
|                 } | ||||
|             }).catch(function(err) { | ||||
|     getUserKey: async function(opts) { | ||||
|         var username = getSSHKeyUsername(opts.user); | ||||
|         // console.log('username:', username); | ||||
|         return runtime.storage.projects.ssh.getSSHKey(username, opts.id).then(function(data) { | ||||
|             if (data) { | ||||
|                 return data; | ||||
|             } else { | ||||
|                 var err = new Error("Key not found"); | ||||
|                 err.code = "not_found"; | ||||
|                 err.status = 404; | ||||
|                 throw err; | ||||
|             } | ||||
|         }).catch(function(err) { | ||||
|             if (!err.status) { | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             }); | ||||
|             } | ||||
|             throw err; | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -240,15 +228,11 @@ var api = module.exports = { | ||||
|     * @return {Promise<String>} - the id of the generated key | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     generateUserKey: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var username = getSSHKeyUsername(opts.user); | ||||
|             runtime.storage.projects.ssh.generateSSHKey(username, opts).then(function(name) { | ||||
|                 return resolve(name); | ||||
|             }).catch(function(err) { | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             }); | ||||
|     generateUserKey: async function(opts) { | ||||
|         var username = getSSHKeyUsername(opts.user); | ||||
|         return runtime.storage.projects.ssh.generateSSHKey(username, opts).catch(function(err) { | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -261,16 +245,11 @@ var api = module.exports = { | ||||
|     * @return {Promise} - resolves when deleted | ||||
|     * @memberof @node-red/runtime_settings | ||||
|     */ | ||||
|     removeUserKey: function(opts) { | ||||
|         return new Promise(function(resolve,reject) { | ||||
|             var username = getSSHKeyUsername(opts.user); | ||||
|             runtime.storage.projects.ssh.deleteSSHKey(username, opts.id).then(function() { | ||||
|                 return resolve(); | ||||
|             }).catch(function(err) { | ||||
|                 err.status = 400; | ||||
|                 return reject(err); | ||||
|             }); | ||||
|     removeUserKey: async function(opts) { | ||||
|         var username = getSSHKeyUsername(opts.user); | ||||
|         return runtime.storage.projects.ssh.deleteSSHKey(username, opts.id).catch(function(err) { | ||||
|             err.status = 400; | ||||
|             throw err; | ||||
|         }); | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user