diff --git a/components/devices/class.interface.js b/components/devices/class.interface.js index cd83097..7a24a97 100644 --- a/components/devices/class.interface.js +++ b/components/devices/class.interface.js @@ -222,6 +222,18 @@ module.exports = class Interface { } + ["close", "end", "error"].forEach((event) => { + stream.on(event, (...args) => { + socket.emit(event, ...args); + }); + }); + + stream.once("destroy", () => { + writable.destory(); + readable.destroy(); + socket.destory(); + }); + stream.once("close", () => { // feedback @@ -236,9 +248,11 @@ module.exports = class Interface { // on what instance is the error thrown? // destroy everything - socket.destroy(); - readable.destroy(); - writable.destroy(); + //socket.destroy(); + //readable.destroy(); + //writable.destroy(); + //socket.end(); + //socket.emit("close"); }); @@ -250,6 +264,7 @@ module.exports = class Interface { process.nextTick(() => { + //socket.emit("connect")? socket.emit("open"); writable.pipe(stream); diff --git a/components/endpoints/class.command.js b/components/endpoints/class.command.js index f650fa2..91d65ed 100644 --- a/components/endpoints/class.command.js +++ b/components/endpoints/class.command.js @@ -329,11 +329,16 @@ module.exports = class Command { if (abort) { timer(abort, false); + return; } try { params = params.map((obj) => { + if (this.params.length === 0) { + return; + } + let param = this.params.find((param) => { return param.key === obj.key; }); @@ -347,7 +352,7 @@ module.exports = class Command { }); } catch (err) { - logger.warn(err, `Passed params to command "${this.name}" are invalid`, params); + logger.warn(err, `Passed params on endpoint to command "${this.name}" (${this._id}) are invalid`, params); timer(err, false); return; diff --git a/components/store/class.store.js b/components/store/class.store.js index 7c5ed97..12561de 100644 --- a/components/store/class.store.js +++ b/components/store/class.store.js @@ -74,6 +74,21 @@ module.exports = class Store extends Item { //item: Joi.string().allow(null).default(null), uuid: Joi.string().default(() => { return uuid.v4(); + }).custom((value) => { + + if (process.env.NODE_ENV === "development") { + + let { logger } = Store.scope; + + let msg = `Property .uuid is deprecated and will be removed in furhter version.\r\n`; + msg += `Use the .labels array instead as custom fields for identifing items.`; + + logger.warn(msg); + + } + + return value; + }) }); } diff --git a/components/vault/class.secret.js b/components/vault/class.secret.js index e08f9ff..afbe647 100644 --- a/components/vault/class.secret.js +++ b/components/vault/class.secret.js @@ -100,7 +100,7 @@ class Secret { encrypt(text) { if (!text) { - let err = new RangeError(`Value need to be set before encrypting, got: ${text}!`); + let err = new RangeError(`Value for secret "${this.name}" needs to be set before encrypting, got: ${text}!`); err.field = this.key; throw err; } @@ -122,7 +122,7 @@ class Secret { decrypt() { if (!this.value) { - let err = new RangeError(`Value need to be set before decrypting, got: ${this.value}!`); + let err = new RangeError(`Value for secret "${this.name}" needs to be set before decrypting, got: ${this.value}!`); err.field = this.key; throw err; } diff --git a/components/vault/class.vault.js b/components/vault/class.vault.js index 36dae1b..f01f625 100644 --- a/components/vault/class.vault.js +++ b/components/vault/class.vault.js @@ -85,7 +85,22 @@ module.exports = class Vault extends Item { return String(new mongodb.ObjectId()); }), name: Joi.string().required(), - identifier: Joi.string().required(), // TODO: remove + identifier: Joi.string().allow(null).default(null).custom((value) => { + + if (process.env.NODE_ENV === "development") { + + let { logger } = Vault.scope; + + let msg = `Property .identifier is deprecated and will be removed in furhter version.\r\n`; + msg += `Use the .labels array instead as custom fields for identifing items.`; + + logger.warn(msg); + + } + + return value; + + }), // TODO: remove description: Joi.string().allow(null).default(null), secrets: Joi.array().items(Secret.schema()).default([]) }); @@ -137,9 +152,27 @@ module.exports = class Vault extends Item { * @returns {Object} Key = Secret key property, Value = decrypted value */ decrypt() { - return this.secrets.reduce((prev, cur) => { - prev[cur.key] = cur.decrypt(); - return prev; + return this.secrets.reduce((obj, secret) => { + + try { + + // try to decrypt secret + // this can fail when no vaule is set + // e.g. default value = null, + // see https://github.com/OpenHausIO/backend/issues/568 + obj[secret.key] = secret.decrypt(); + + } catch (err) { + + let { logger } = Vault.scope; + logger.warn(err, `Could not decrypt secret "${secret.name}"`); + + obj[secret.key] = null; + + } + + return obj; + }, {}); } diff --git a/helper/request.js b/helper/request.js index 206ef3b..58b25bf 100644 --- a/helper/request.js +++ b/helper/request.js @@ -14,9 +14,9 @@ const promisify = require("./promisify.js"); */ function perform(uri, options, cb) { - if(!options && !cb){ + if (!options && !cb) { options = {}; - cb = () => {}; + cb = () => { }; } let { protocol } = new url.URL(uri); @@ -69,6 +69,9 @@ function perform(uri, options, cb) { request.on("error", (err) => { + //console.log("Logger in helper/request", err); + // this event listener does fire, but cb(err) call does nothing + // why in the first place does a 1:1 forwarding of events end in a abort error? cb(err); }); diff --git a/routes/router.api.devices.js b/routes/router.api.devices.js index 592f056..9fe44d7 100644 --- a/routes/router.api.devices.js +++ b/routes/router.api.devices.js @@ -146,7 +146,14 @@ module.exports = (app, router) => { // no clue why closed, cleanup anyway // TODO: check code and decide if error or success closing //stream.emit("close"); // desotroy() emit close event(!|?) - stream.destroy(); + if (code === 1005 || code === 1000) { + console.log("end normaly"); + stream.end(); + //stream.emit("end"); + } else { + //console.log("End destory"); + stream.destroy(); + } } });