From a1f565f7560bd291002b7b35e7f7dc7f249aef34 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 30 Nov 2020 16:58:05 +0000 Subject: [PATCH] Use more async funcs in runtime/lib/api to reduce Promise creation --- .../@node-red/runtime/lib/api/comms.js | 11 +- .../@node-red/runtime/lib/api/context.js | 4 +- .../@node-red/runtime/lib/api/index.js | 8 +- .../@node-red/runtime/lib/api/library.js | 81 ++- .../@node-red/runtime/lib/api/nodes.js | 516 ++++++++---------- .../@node-red/runtime/lib/api/projects.js | 68 ++- .../@node-red/runtime/lib/api/settings.js | 215 ++++---- 7 files changed, 419 insertions(+), 484 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/api/comms.js b/packages/node_modules/@node-red/runtime/lib/api/comms.js index 55789b806..42e727412 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/comms.js +++ b/packages/node_modules/@node-red/runtime/lib/api/comms.js @@ -106,9 +106,8 @@ var api = module.exports = { * @return {Promise} - 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} - resolves when complete * @memberof @node-red/runtime_comms */ - removeConnection: function(opts) { + removeConnection: async function(opts) { for (var i=0;i} - 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} - resolves when complete * @memberof @node-red/runtime_comms */ - unsubscribe: function(opts) {} + unsubscribe: async function(opts) {} }; diff --git a/packages/node_modules/@node-red/runtime/lib/api/context.js b/packages/node_modules/@node-red/runtime/lib/api/context.js index f69349a62..6716b6831 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/context.js +++ b/packages/node_modules/@node-red/runtime/lib/api/context.js @@ -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; diff --git a/packages/node_modules/@node-red/runtime/lib/api/index.js b/packages/node_modules/@node-red/runtime/lib/api/index.js index 8856ac3c2..b131470b0 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/index.js +++ b/packages/node_modules/@node-red/runtime/lib/api/index.js @@ -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(); } } diff --git a/packages/node_modules/@node-red/runtime/lib/api/library.js b/packages/node_modules/@node-red/runtime/lib/api/library.js index f252d3264..6b7ed6218 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/library.js +++ b/packages/node_modules/@node-red/runtime/lib/api/library.js @@ -36,32 +36,30 @@ var api = module.exports = { * @return {Promise} - 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; + }); } } diff --git a/packages/node_modules/@node-red/runtime/lib/api/nodes.js b/packages/node_modules/@node-red/runtime/lib/api/nodes.js index a06cbed96..6a05b4c17 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/nodes.js +++ b/packages/node_modules/@node-red/runtime/lib/api/nodes.js @@ -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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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 + } } } diff --git a/packages/node_modules/@node-red/runtime/lib/api/projects.js b/packages/node_modules/@node-red/runtime/lib/api/projects.js index d792f3765..14d1d0ec1 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/projects.js +++ b/packages/node_modules/@node-red/runtime/lib/api/projects.js @@ -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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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} - 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); } diff --git a/packages/node_modules/@node-red/runtime/lib/api/settings.js b/packages/node_modules/@node-red/runtime/lib/api/settings.js index 6ebeeccfb..b34e9a27c 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/settings.js +++ b/packages/node_modules/@node-red/runtime/lib/api/settings.js @@ -64,64 +64,57 @@ var api = module.exports = { * @return {Promise} - 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} - 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} - 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} - 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} - 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} - 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; }); - } }