diff --git a/front/package-lock.json b/front/package-lock.json index c62aea0c24..99224c1b7c 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -16,7 +16,7 @@ "cropperjs": "^1.5.12", "date-fns": "^2.22.1", "dayjs": "^1.10.6", - "debounce": "^1.2.1", + "debounce": "^3.0.0", "dotenv": "^6.2.0", "eslint-plugin-i18n-json": "^4.0.0", "get-value": "^3.0.1", @@ -29,8 +29,8 @@ "preact": "^10.7.2", "preact-async-route": "^2.2.1", "preact-i18n": "^2.4.0-preactx", - "preact-router": "^3.2.1", - "qrcode": "^1.4.2", + "preact-router": "^4.1.2", + "qrcode": "^1.5.4", "react-big-calendar": "^1.19.4", "react-clock": "^4.5.0", "react-datepicker": "^3.8.0", @@ -7559,10 +7559,16 @@ "license": "MIT" }, "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/debug": { "version": "4.4.0", @@ -18054,9 +18060,9 @@ } }, "node_modules/preact-router": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-3.2.1.tgz", - "integrity": "sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-4.1.2.tgz", + "integrity": "sha512-uICUaUFYh+XQ+6vZtQn1q+X6rSqwq+zorWOCLWPF5FAsQh3EJ+RsDQ9Ee+fjk545YWQHfUxhrBAaemfxEnMOUg==", "license": "MIT", "peerDependencies": { "preact": ">=10" @@ -23819,6 +23825,13 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", diff --git a/front/package.json b/front/package.json index b2648c2acf..c8fd61f261 100644 --- a/front/package.json +++ b/front/package.json @@ -56,7 +56,7 @@ "cropperjs": "^1.5.12", "date-fns": "^2.22.1", "dayjs": "^1.10.6", - "debounce": "^1.2.1", + "debounce": "^3.0.0", "dotenv": "^6.2.0", "eslint-plugin-i18n-json": "^4.0.0", "get-value": "^3.0.1", @@ -69,8 +69,8 @@ "preact": "^10.7.2", "preact-async-route": "^2.2.1", "preact-i18n": "^2.4.0-preactx", - "preact-router": "^3.2.1", - "qrcode": "^1.4.2", + "preact-router": "^4.1.2", + "qrcode": "^1.5.4", "react-big-calendar": "^1.19.4", "react-clock": "^4.5.0", "react-datepicker": "^3.8.0", diff --git a/front/src/routes/integration/index.js b/front/src/routes/integration/index.js index bd2a9ec6de..b939deb1ea 100644 --- a/front/src/routes/integration/index.js +++ b/front/src/routes/integration/index.js @@ -21,7 +21,7 @@ class Integration extends Component { searchKeyword: '', orderDir: 'asc' }; - this.getIntegrationsDebounced = debounce(this.getIntegrations, 300); + this.getIntegrationsDebounced = debounce(this.getIntegrations, 300).bind(this); } componentWillMount() { diff --git a/front/src/routes/settings/settings-system/SettingsSystemBatteryLevelWarning.jsx b/front/src/routes/settings/settings-system/SettingsSystemBatteryLevelWarning.jsx index a3040baaeb..ca6e095244 100644 --- a/front/src/routes/settings/settings-system/SettingsSystemBatteryLevelWarning.jsx +++ b/front/src/routes/settings/settings-system/SettingsSystemBatteryLevelWarning.jsx @@ -50,7 +50,9 @@ class SettingsSystemBatteryLevelWarning extends Component { }); }; - debouncedUpdateBatteryLevelUnderWarningThreshold = debounce(this.updateBatteryLevelUnderWarningThreshold, 200); + debouncedUpdateBatteryLevelUnderWarningThreshold = debounce(this.updateBatteryLevelUnderWarningThreshold, 200).bind( + this + ); updateBatteryLevelUnderWarningEnabled = async () => { const value = !this.state.batteryLevelUnderWarningEnabled; diff --git a/server/lib/device/device.notify.js b/server/lib/device/device.notify.js index 10204b754b..a592667371 100644 --- a/server/lib/device/device.notify.js +++ b/server/lib/device/device.notify.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const logger = require('../../utils/logger'); const { EVENTS } = require('../../utils/constants'); @@ -31,7 +29,7 @@ async function notify(device, event) { const service = this.serviceManager.getServiceById(device.service_id); if (service === null) { logger.warn(`Service ${device.service_id} was not found.`); - } else if (typeof get(service, `device.${serviceFuncName}`) !== 'function') { + } else if (typeof service?.device?.[serviceFuncName] !== 'function') { logger.debug(`Function device.${serviceFuncName} in service ${service.name} does not exist.`); } else { try { diff --git a/server/lib/device/device.poll.js b/server/lib/device/device.poll.js index c6178fb947..c1108b3dc1 100644 --- a/server/lib/device/device.poll.js +++ b/server/lib/device/device.poll.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { NotFoundError } = require('../../utils/coreErrors'); const logger = require('../../utils/logger'); @@ -14,7 +13,7 @@ async function poll(device) { if (service === null) { throw new NotFoundError(`Service ${device.service.name} was not found.`); } - if (typeof get(service, 'device.poll') !== 'function') { + if (typeof service?.device?.poll !== 'function') { throw new NotFoundError(`Service ${device.service.name} does not have a device.poll function.`); } try { diff --git a/server/lib/device/device.setValue.js b/server/lib/device/device.setValue.js index b2d97cca3f..39c14533f1 100644 --- a/server/lib/device/device.setValue.js +++ b/server/lib/device/device.setValue.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const { NotFoundError } = require('../../utils/coreErrors'); /** @@ -16,7 +14,7 @@ async function setValue(device, deviceFeature, value, options = {}) { if (service === null) { throw new NotFoundError(`Service ${device.service.name} was not found.`); } - if (typeof get(service, 'device.setValue') !== 'function') { + if (typeof service?.device?.setValue !== 'function') { throw new NotFoundError(`Function device.setValue in service ${device.service.name} does not exist.`); } await service.device.setValue(device, deviceFeature, value, options); diff --git a/server/lib/gateway/enedis/gateway.enedisGetConsumptionLoadCurve.js b/server/lib/gateway/enedis/gateway.enedisGetConsumptionLoadCurve.js index d8a739c05a..6490cc888c 100644 --- a/server/lib/gateway/enedis/gateway.enedisGetConsumptionLoadCurve.js +++ b/server/lib/gateway/enedis/gateway.enedisGetConsumptionLoadCurve.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const { Error403 } = require('../../../utils/httpErrors'); /** @@ -17,7 +15,7 @@ async function enedisGetConsumptionLoadCurve(query) { const consumption = await this.gladysGatewayClient.enedisGetConsumptionLoadCurve(query); return consumption; } catch (e) { - if (get(e, 'response.status') === 403) { + if (e?.response?.status === 403) { throw new Error403(); } throw e; diff --git a/server/lib/gateway/enedis/gateway.enedisGetDailyConsumption.js b/server/lib/gateway/enedis/gateway.enedisGetDailyConsumption.js index 5df6d31341..4c5dc988bc 100644 --- a/server/lib/gateway/enedis/gateway.enedisGetDailyConsumption.js +++ b/server/lib/gateway/enedis/gateway.enedisGetDailyConsumption.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const { Error403 } = require('../../../utils/httpErrors'); /** @@ -17,7 +15,7 @@ async function enedisGetDailyConsumption(query) { const consumption = await this.gladysGatewayClient.enedisGetDailyConsumption(query); return consumption; } catch (e) { - if (get(e, 'response.status') === 403) { + if (e?.response?.status === 403) { throw new Error403(); } throw e; diff --git a/server/lib/gateway/enedis/gateway.enedisGetDailyConsumptionMaxPower.js b/server/lib/gateway/enedis/gateway.enedisGetDailyConsumptionMaxPower.js index a2c849fecb..941bd91c73 100644 --- a/server/lib/gateway/enedis/gateway.enedisGetDailyConsumptionMaxPower.js +++ b/server/lib/gateway/enedis/gateway.enedisGetDailyConsumptionMaxPower.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const logger = require('../../../utils/logger'); const { Error403 } = require('../../../utils/httpErrors'); @@ -19,7 +17,7 @@ async function enedisGetDailyConsumptionMaxPower(query) { return consumption; } catch (e) { logger.debug(e); - if (get(e, 'response.status') === 403) { + if (e?.response?.status === 403) { throw new Error403(); } throw e; diff --git a/server/lib/gateway/gateway.forwardDeviceStateToAlexa.js b/server/lib/gateway/gateway.forwardDeviceStateToAlexa.js index 2d0d4ea136..08a6d2e059 100644 --- a/server/lib/gateway/gateway.forwardDeviceStateToAlexa.js +++ b/server/lib/gateway/gateway.forwardDeviceStateToAlexa.js @@ -1,5 +1,4 @@ -const get = require('get-value'); -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const logger = require('../../utils/logger'); const { EVENTS } = require('../../utils/constants'); @@ -29,8 +28,8 @@ async function sendCurrentState(stateManager, gladysGatewayClient, deviceFeature return; } - const func = get(readValues, `${gladysFeature.category}.${gladysFeature.type}`); - const mapping = get(mappings, `${gladysFeature.category}.capabilities.${gladysFeature.type}`); + const func = readValues?.[gladysFeature.category]?.[gladysFeature.type]; + const mapping = mappings?.[gladysFeature.category]?.capabilities?.[gladysFeature.type]; if (!func || !mapping) { logger.debug(`Gladys Gateway: Not forwarding state, device feature doesnt seems handled.`); @@ -42,7 +41,7 @@ async function sendCurrentState(stateManager, gladysGatewayClient, deviceFeature const properties = [ { namespace: mapping.interface, - name: get(mapping, 'properties.supported.0.name'), + name: mapping?.properties?.supported?.[0]?.name, value: func(gladysFeature.last_value, gladysFeature), timeOfSample: now, uncertaintyInMilliseconds: 0, @@ -54,7 +53,7 @@ async function sendCurrentState(stateManager, gladysGatewayClient, deviceFeature header: { namespace: 'Alexa', name: 'ChangeReport', - messageId: uuid.v4(), + messageId: randomUUID(), payloadVersion: '3', }, endpoint: { diff --git a/server/lib/gateway/gateway.getBackups.js b/server/lib/gateway/gateway.getBackups.js index 75870d852d..edf729fc15 100644 --- a/server/lib/gateway/gateway.getBackups.js +++ b/server/lib/gateway/gateway.getBackups.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const logger = require('../../utils/logger'); const { ERROR_MESSAGES } = require('../../utils/constants'); const { Error403, Error500 } = require('../../utils/httpErrors'); @@ -16,7 +14,7 @@ async function getBackups() { return backups; } catch (e) { logger.debug(e); - const status = get(e, 'response.status'); + const status = e?.response?.status; if (status) { throw new Error403(); } else { diff --git a/server/lib/gateway/gateway.getTTSApiUrl.js b/server/lib/gateway/gateway.getTTSApiUrl.js index 2b1db9f393..7b24f01691 100644 --- a/server/lib/gateway/gateway.getTTSApiUrl.js +++ b/server/lib/gateway/gateway.getTTSApiUrl.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const logger = require('../../utils/logger'); const { Error403, Error429 } = require('../../utils/httpErrors'); @@ -17,8 +16,8 @@ async function getTTSApiUrl(body) { return response; } catch (e) { logger.warn(e); - const status = get(e, 'response.status'); - const message = get(e, 'response.data.error_message'); + const status = e?.response?.status; + const message = e?.response?.data?.error_message; if (status === 403) { throw new Error403(message); } diff --git a/server/lib/gateway/gateway.getUsersKeys.js b/server/lib/gateway/gateway.getUsersKeys.js index 3650b14a5e..eea8574e9c 100644 --- a/server/lib/gateway/gateway.getUsersKeys.js +++ b/server/lib/gateway/gateway.getUsersKeys.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const Promise = require('bluebird'); const logger = require('../../utils/logger'); const { ERROR_MESSAGES } = require('../../utils/constants'); @@ -47,7 +46,7 @@ async function getUsersKeys() { return localUsers; } catch (e) { logger.debug(e); - const status = get(e, 'response.status'); + const status = e?.response?.status; if (status) { throw new Error500(); } else { diff --git a/server/lib/gateway/gateway.handleAlexaMessage.js b/server/lib/gateway/gateway.handleAlexaMessage.js index 8001a4f029..d05970b9f0 100644 --- a/server/lib/gateway/gateway.handleAlexaMessage.js +++ b/server/lib/gateway/gateway.handleAlexaMessage.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const logger = require('../../utils/logger'); const { SYSTEM_VARIABLE_NAMES } = require('../../utils/constants'); const { DIRECTIVE_NAMESPACES_LIST } = require('../../services/alexa/lib/alexa.constants'); @@ -32,8 +31,8 @@ async function handleAlexaMessage(data, rawMessage, cb) { ); this.alexaConnected = true; } - const directiveNamespace = get(body, 'directive.header.namespace'); - const directiveName = get(body, 'directive.header.name'); + const directiveNamespace = body?.directive?.header?.namespace; + const directiveName = body?.directive?.header?.name; logger.debug(`gateway.handleAlexaMessage: New message : ${directiveNamespace}`); let response; if (directiveNamespace === 'Alexa.Discovery') { diff --git a/server/lib/gateway/gateway.handleGoogleHomeMessage.js b/server/lib/gateway/gateway.handleGoogleHomeMessage.js index d9bd359306..aae2a9aa92 100644 --- a/server/lib/gateway/gateway.handleGoogleHomeMessage.js +++ b/server/lib/gateway/gateway.handleGoogleHomeMessage.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const logger = require('../../utils/logger'); const { SYSTEM_VARIABLE_NAMES } = require('../../utils/constants'); @@ -31,7 +30,7 @@ async function handleGoogleHomeMessage(data, rawMessage, cb) { ); this.googleHomeConnected = true; } - const firstOrderIntent = get(body, 'inputs.0.intent'); + const firstOrderIntent = body?.inputs?.[0]?.intent; let response; if (firstOrderIntent === 'action.devices.SYNC') { response = await service.googleActionsHandler.onSync(body); diff --git a/server/lib/gateway/gateway.handleNewMessage.js b/server/lib/gateway/gateway.handleNewMessage.js index b0174438a9..2b841b5f2e 100644 --- a/server/lib/gateway/gateway.handleNewMessage.js +++ b/server/lib/gateway/gateway.handleNewMessage.js @@ -1,5 +1,3 @@ -const get = require('get-value'); - const { NotFoundError } = require('../../utils/coreErrors'); const { EVENTS } = require('../../utils/constants'); @@ -22,7 +20,7 @@ async function handleNewMessage(data, rawMessage, cb) { (user) => user.rsa_public_key === rsaPublicKey && user.ecdsa_public_key === ecdsaPublicKey, ); - if ((!found || !found.accepted) && get(data, 'options.url') !== '/api/v1/user') { + if ((!found || !found.accepted) && data?.options?.url !== '/api/v1/user') { cb({ status: 403, error: 'USER_NOT_ACCEPTED_LOCALLY', @@ -30,7 +28,7 @@ async function handleNewMessage(data, rawMessage, cb) { }); return; } - if (!rawMessage.local_user_id && get(data, 'options.url') !== '/api/v1/user') { + if (!rawMessage.local_user_id && data?.options?.url !== '/api/v1/user') { cb({ status: 400, error: 'GATEWAY_USER_NOT_LINKED', diff --git a/server/lib/gateway/gateway.login.js b/server/lib/gateway/gateway.login.js index 2267fff708..e6ecf7c40c 100644 --- a/server/lib/gateway/gateway.login.js +++ b/server/lib/gateway/gateway.login.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { webcrypto } = require('crypto'); const logger = require('../../utils/logger'); const { ERROR_MESSAGES } = require('../../utils/constants'); @@ -29,7 +28,7 @@ async function login(email, password) { return loginResults; } catch (e) { logger.debug(e); - const status = get(e, 'response.status'); + const status = e?.response?.status; if (status) { throw new Error403(); } else { diff --git a/server/lib/gateway/gateway.openAIAsk.js b/server/lib/gateway/gateway.openAIAsk.js index 6935fcd915..844074d38e 100644 --- a/server/lib/gateway/gateway.openAIAsk.js +++ b/server/lib/gateway/gateway.openAIAsk.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const logger = require('../../utils/logger'); const { Error403, Error429 } = require('../../utils/httpErrors'); @@ -17,8 +16,8 @@ async function openAIAsk(body) { return response; } catch (e) { logger.debug(e); - const status = get(e, 'response.status'); - const message = get(e, 'response.data.error_message'); + const status = e?.response?.status; + const message = e?.response?.data?.error_message; if (status === 403) { throw new Error403(message); } diff --git a/server/lib/scene/scene.addScene.js b/server/lib/scene/scene.addScene.js index 36af10f277..310ee5c176 100644 --- a/server/lib/scene/scene.addScene.js +++ b/server/lib/scene/scene.addScene.js @@ -1,5 +1,5 @@ const cloneDeep = require('lodash.clonedeep'); -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const { BadParameters } = require('../../utils/coreErrors'); const { EVENTS } = require('../../utils/constants'); @@ -35,7 +35,7 @@ function addScene(sceneRaw) { if (scene.triggers && scene.active) { scene.triggers.forEach((trigger) => { // First, we had a trigger key, import to uniquely identify this trigger - trigger.key = uuid.v4(); + trigger.key = randomUUID(); if (trigger.type === EVENTS.TIME.CHANGED && trigger.scheduler_type !== 'interval') { const rule = {}; rule.tz = this.timezone; diff --git a/server/lib/system/system.getContainers.js b/server/lib/system/system.getContainers.js index 4bd9459716..71c8c804ce 100644 --- a/server/lib/system/system.getContainers.js +++ b/server/lib/system/system.getContainers.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { PlatformNotCompatible } = require('../../utils/coreErrors'); /** @@ -19,8 +18,8 @@ async function getContainers(options = { all: true }) { image: container.Image, state: container.State, id: container.Id, - networkMode: get(container, 'HostConfig.NetworkMode'), - devices: get(container, 'HostConfig.Devices'), + networkMode: container?.HostConfig?.NetworkMode, + devices: container?.HostConfig?.Devices, created_at: container.Created, }; }); diff --git a/server/lib/system/system.getNetworkMode.js b/server/lib/system/system.getNetworkMode.js index 5b8be9e5d0..c9243f711f 100644 --- a/server/lib/system/system.getNetworkMode.js +++ b/server/lib/system/system.getNetworkMode.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { PlatformNotCompatible } = require('../../utils/coreErrors'); /** @@ -16,7 +15,7 @@ async function getNetworkMode() { const containerId = await this.getGladysContainerId(); const gladysContainer = this.dockerode.getContainer(containerId); const gladysContainerInspect = await gladysContainer.inspect(); - this.networkMode = get(gladysContainerInspect, 'HostConfig.NetworkMode', { default: 'unknown' }); + this.networkMode = gladysContainerInspect?.HostConfig?.NetworkMode ?? 'unknown'; } return this.networkMode; diff --git a/server/lib/user/user.create.js b/server/lib/user/user.create.js index b3d1bdc82f..ca2952dd65 100644 --- a/server/lib/user/user.create.js +++ b/server/lib/user/user.create.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const db = require('../../models'); const passwordUtils = require('../../utils/password'); const { BadParameters } = require('../../utils/coreErrors'); @@ -35,7 +35,7 @@ async function create(user) { // if the instance doesn't have a clientId yet, we create it. const clientId = await this.variable.getValue('GLADYS_INSTANCE_CLIENT_ID'); if (clientId === null) { - await this.variable.setValue('GLADYS_INSTANCE_CLIENT_ID', uuid.v4()); + await this.variable.setValue('GLADYS_INSTANCE_CLIENT_ID', randomUUID()); } return plainUser; } diff --git a/server/package-lock.json b/server/package-lock.json index fbdfdb3fe4..85ed54a626 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -24,7 +24,6 @@ "duckdb": "^1.4.4", "express": "^4.18.2", "express-rate-limit": "^6.7.0", - "form-data": "^2.3.3", "fs-extra": "^11.1.0", "get-value": "^3.0.1", "handlebars": "^4.7.7", @@ -50,7 +49,6 @@ "suncalc": "^1.9.0", "tracer": "^1.1.6", "umzug": "^2.2.0", - "uuid": "^9.0.0", "ws": "^6.2.2" }, "devDependencies": { @@ -6346,6 +6344,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -12162,14 +12161,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -17614,6 +17605,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -22025,11 +22017,6 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/server/package.json b/server/package.json index 0f41a728ea..e40bd2d6ec 100644 --- a/server/package.json +++ b/server/package.json @@ -91,7 +91,6 @@ "duckdb": "^1.4.4", "express": "^4.18.2", "express-rate-limit": "^6.7.0", - "form-data": "^2.3.3", "fs-extra": "^11.1.0", "get-value": "^3.0.1", "handlebars": "^4.7.7", @@ -117,7 +116,6 @@ "suncalc": "^1.9.0", "tracer": "^1.1.6", "umzug": "^2.2.0", - "uuid": "^9.0.0", "ws": "^6.2.2" } } diff --git a/server/services/alexa/lib/alexa.onDiscovery.js b/server/services/alexa/lib/alexa.onDiscovery.js index 5b932f7987..62559a5840 100644 --- a/server/services/alexa/lib/alexa.onDiscovery.js +++ b/server/services/alexa/lib/alexa.onDiscovery.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const { syncDeviceConverter } = require('./syncDeviceConverter'); /** @@ -19,7 +19,7 @@ function onDiscovery() { namespace: 'Alexa.Discovery', name: 'Discover.Response', payloadVersion: '3', - messageId: uuid.v4(), + messageId: randomUUID(), }, payload: { endpoints, diff --git a/server/services/alexa/lib/alexa.onExecute.js b/server/services/alexa/lib/alexa.onExecute.js index 4932e8b7b5..d1c8140361 100644 --- a/server/services/alexa/lib/alexa.onExecute.js +++ b/server/services/alexa/lib/alexa.onExecute.js @@ -1,5 +1,4 @@ -const uuid = require('uuid'); -const get = require('get-value'); +const { randomUUID } = require('crypto'); const { EVENTS, ACTIONS, @@ -20,10 +19,10 @@ const { writeValues, readValues } = require('./deviceMappings'); * onExecute(); */ function onExecute(body) { - const directiveNamespace = get(body, 'directive.header.namespace'); - const directiveName = get(body, 'directive.header.name'); - const endpointId = get(body, 'directive.endpoint.endpointId'); - const correlationToken = get(body, 'directive.header.correlationToken'); + const directiveNamespace = body?.directive?.header?.namespace; + const directiveName = body?.directive?.header?.name; + const endpointId = body?.directive?.endpoint?.endpointId; + const correlationToken = body?.directive?.header?.correlationToken; let value; let nameOfAlexaFeature; const deviceInMemory = this.gladys.stateManager.get('device', endpointId); @@ -94,7 +93,7 @@ function onExecute(body) { ); value = writeValues[DIRECTIVE_NAMESPACES.BrightnessController]( directiveName, - get(body, 'directive.payload'), + body?.directive?.payload, deviceFeature.last_value, binaryDeviceFeature.last_value, deviceFeature, @@ -113,7 +112,7 @@ function onExecute(body) { deviceFeature = deviceInMemory.features.find( (f) => f.category === DEVICE_FEATURE_CATEGORIES.LIGHT && f.type === DEVICE_FEATURE_TYPES.LIGHT.COLOR, ); - value = writeValues[DIRECTIVE_NAMESPACES.ColorController](get(body, 'directive.payload.color')); + value = writeValues[DIRECTIVE_NAMESPACES.ColorController](body?.directive?.payload?.color); nameOfAlexaFeature = 'color'; // Make sure the light is on if we change the light color controlPower(deviceFeature.category, 1); @@ -137,7 +136,7 @@ function onExecute(body) { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: uuid.v4(), + messageId: randomUUID(), correlationToken, }, endpoint: body.directive.endpoint, diff --git a/server/services/alexa/lib/alexa.onReportState.js b/server/services/alexa/lib/alexa.onReportState.js index b853444152..08034a2065 100644 --- a/server/services/alexa/lib/alexa.onReportState.js +++ b/server/services/alexa/lib/alexa.onReportState.js @@ -1,5 +1,4 @@ -const uuid = require('uuid'); -const get = require('get-value'); +const { randomUUID } = require('crypto'); const { mappings, readValues } = require('./deviceMappings'); const { NotFoundError } = require('../../../utils/coreErrors'); @@ -13,7 +12,7 @@ const { NotFoundError } = require('../../../utils/coreErrors'); * onReportState(); */ function onReportState(body) { - const deviceSelector = get(body, 'directive.endpoint.endpointId'); + const deviceSelector = body?.directive?.endpoint?.endpointId; const device = this.gladys.stateManager.get('device', deviceSelector); if (!device) { throw new NotFoundError(`Device "${deviceSelector}" not found`); @@ -21,12 +20,12 @@ function onReportState(body) { const properties = []; const now = new Date().toISOString(); device.features.forEach((feature) => { - const func = get(readValues, `${feature.category}.${feature.type}`); - const mapping = get(mappings, `${feature.category}.capabilities.${feature.type}`); + const func = readValues?.[feature.category]?.[feature.type]; + const mapping = mappings?.[feature.category]?.capabilities?.[feature.type]; if (func && mapping && feature.read_only === false) { properties.push({ namespace: mapping.interface, - name: get(mapping, 'properties.supported.0.name'), + name: mapping?.properties?.supported?.[0]?.name, value: func(feature.last_value, feature), timeOfSample: now, uncertaintyInMilliseconds: 0, @@ -35,7 +34,7 @@ function onReportState(body) { }); const response = { event: { - header: { ...body.directive.header, name: 'StateReport', messageId: uuid.v4() }, + header: { ...body.directive.header, name: 'StateReport', messageId: randomUUID() }, endpoint: body.directive.endpoint, payload: {}, }, diff --git a/server/services/alexa/lib/syncDeviceConverter.js b/server/services/alexa/lib/syncDeviceConverter.js index a5d0269994..b81d9c8915 100644 --- a/server/services/alexa/lib/syncDeviceConverter.js +++ b/server/services/alexa/lib/syncDeviceConverter.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { mappings } = require('./deviceMappings'); /** @@ -28,7 +27,7 @@ function syncDeviceConverter(device) { }); uniqueDeviceFeatures.forEach((value, key) => { - const displayCategory = get(mappings, `${value.category}.category`); + const displayCategory = mappings?.[value.category]?.category; // We add a display category if not already present if (displayCategory && endpoint.displayCategories.indexOf(displayCategory) === -1) { endpoint.displayCategories.push(displayCategory); @@ -36,7 +35,7 @@ function syncDeviceConverter(device) { // read only devices are not returned if (value.read_only === false) { // we get the capability if handled - const capability = get(mappings, `${value.category}.capabilities.${value.type}`); + const capability = mappings?.[value.category]?.capabilities?.[value.type]; if (capability) { endpoint.capabilities.push(capability); } diff --git a/server/services/alexa/package-lock.json b/server/services/alexa/package-lock.json index a1a1501a7c..70fc3bd7be 100644 --- a/server/services/alexa/package-lock.json +++ b/server/services/alexa/package-lock.json @@ -17,58 +17,7 @@ "linux", "freebsd", "win32" - ], - "dependencies": { - "get-value": "^3.0.1", - "uuid": "^9.0.0" - } - }, - "node_modules/get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - } - }, - "dependencies": { - "get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + ] } } } diff --git a/server/services/alexa/package.json b/server/services/alexa/package.json index 4c4dac5192..398127bc98 100644 --- a/server/services/alexa/package.json +++ b/server/services/alexa/package.json @@ -14,8 +14,5 @@ "arm64" ], "scripts": {}, - "dependencies": { - "get-value": "^3.0.1", - "uuid": "^9.0.0" - } + "dependencies": {} } diff --git a/server/services/edf-tempo/package-lock.json b/server/services/edf-tempo/package-lock.json index 01b0b00e51..82bac8b378 100644 --- a/server/services/edf-tempo/package-lock.json +++ b/server/services/edf-tempo/package-lock.json @@ -16,104 +16,13 @@ "win32" ], "dependencies": { - "axios": "^1.6.8", "dayjs": "^1.11.7" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" } } } diff --git a/server/services/edf-tempo/package.json b/server/services/edf-tempo/package.json index 9db2598d99..d76cf996e5 100644 --- a/server/services/edf-tempo/package.json +++ b/server/services/edf-tempo/package.json @@ -13,7 +13,6 @@ ], "scripts": {}, "dependencies": { - "axios": "^1.6.8", "dayjs": "^1.11.7" } } diff --git a/server/services/enedis/package-lock.json b/server/services/enedis/package-lock.json index 8e8d62b18e..f5facad928 100644 --- a/server/services/enedis/package-lock.json +++ b/server/services/enedis/package-lock.json @@ -18,7 +18,6 @@ "dependencies": { "bluebird": "^3.7.0", "dayjs": "^1.11.5", - "get-value": "^3.0.1", "queue": "^6.0.2" } }, @@ -32,31 +31,12 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" }, - "node_modules/get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -78,24 +58,11 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" }, - "get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "requires": { - "isobject": "^3.0.1" - } - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, "queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", diff --git a/server/services/enedis/package.json b/server/services/enedis/package.json index b6108d312a..f746052266 100644 --- a/server/services/enedis/package.json +++ b/server/services/enedis/package.json @@ -15,7 +15,6 @@ "dependencies": { "bluebird": "^3.7.0", "dayjs": "^1.11.5", - "get-value": "^3.0.1", "queue": "^6.0.2" } } diff --git a/server/services/energy-monitoring/package-lock.json b/server/services/energy-monitoring/package-lock.json index 04ff6fc53d..55e30ef812 100644 --- a/server/services/energy-monitoring/package-lock.json +++ b/server/services/energy-monitoring/package-lock.json @@ -23,8 +23,7 @@ "dayjs": "^1.11.15", "lru-cache": "^11.2.2", "node-schedule": "^2.1.1", - "queue": "^6.0.2", - "uuid": "^13.0.0" + "queue": "^6.0.2" } }, "node_modules/asynckit": { @@ -388,19 +387,6 @@ "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", "license": "MIT" - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } } } } diff --git a/server/services/energy-monitoring/package.json b/server/services/energy-monitoring/package.json index 4a034d0453..65ef721160 100644 --- a/server/services/energy-monitoring/package.json +++ b/server/services/energy-monitoring/package.json @@ -18,7 +18,6 @@ "dayjs": "^1.11.15", "lru-cache": "^11.2.2", "node-schedule": "^2.1.1", - "queue": "^6.0.2", - "uuid": "^13.0.0" + "queue": "^6.0.2" } } diff --git a/server/services/energy-monitoring/utils/addEnergyFeatures.js b/server/services/energy-monitoring/utils/addEnergyFeatures.js index 3c355c2772..8def4c204f 100644 --- a/server/services/energy-monitoring/utils/addEnergyFeatures.js +++ b/server/services/energy-monitoring/utils/addEnergyFeatures.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES, DEVICE_FEATURE_UNITS } = require('../../../utils/constants'); const { ENERGY_INDEX_FEATURE_TYPES } = require('./constants'); @@ -12,7 +12,7 @@ const addEnergyFeatures = (device, defaultElectricMeterDeviceFeatureId) => { indexFeatures.forEach((indexFeature) => { // Set the default id if it's not set if (!indexFeature.id) { - indexFeature.id = uuid.v4(); + indexFeature.id = randomUUID(); } // Set the default energy parent id if it's not set @@ -31,7 +31,7 @@ const addEnergyFeatures = (device, defaultElectricMeterDeviceFeatureId) => { let consumptionFeatureId = null; if (!consumptionFeature) { - consumptionFeatureId = uuid.v4(); + consumptionFeatureId = randomUUID(); featuresToAdd.push({ id: consumptionFeatureId, category: DEVICE_FEATURE_CATEGORIES.ENERGY_SENSOR, @@ -61,7 +61,7 @@ const addEnergyFeatures = (device, defaultElectricMeterDeviceFeatureId) => { if (!costFeature) { featuresToAdd.push({ - id: uuid.v4(), + id: randomUUID(), category: DEVICE_FEATURE_CATEGORIES.ENERGY_SENSOR, type: DEVICE_FEATURE_TYPES.ENERGY_SENSOR.THIRTY_MINUTES_CONSUMPTION_COST, energy_parent_id: consumptionFeatureId, diff --git a/server/services/homekit/lib/createBridge.js b/server/services/homekit/lib/createBridge.js index 115eed8fa0..851b86d940 100644 --- a/server/services/homekit/lib/createBridge.js +++ b/server/services/homekit/lib/createBridge.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const { EVENTS } = require('../../../utils/constants'); const { eventFunctionWrapper } = require('../../../utils/functionsWrapper'); const { mappings } = require('./deviceMappings'); @@ -21,7 +21,7 @@ async function createBridge() { : this.hap.MDNSAdvertiser.BONJOUR; if (!bridgeUuid) { - bridgeUuid = uuid.v4(); + bridgeUuid = randomUUID(); await this.gladys.variable.setValue('HOMEKIT_GLADYS_UUID', bridgeUuid, this.serviceId); } diff --git a/server/services/homekit/package-lock.json b/server/services/homekit/package-lock.json index 120167a114..8c2fe717d0 100644 --- a/server/services/homekit/package-lock.json +++ b/server/services/homekit/package-lock.json @@ -16,8 +16,7 @@ "win32" ], "dependencies": { - "@homebridge/hap-nodejs": "^2.1.2", - "uuid": "^9.0.0" + "@homebridge/hap-nodejs": "^2.1.2" } }, "node_modules/@homebridge/ciao": { @@ -366,18 +365,6 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", diff --git a/server/services/homekit/package.json b/server/services/homekit/package.json index bad3a5aea9..7a7172cdd5 100644 --- a/server/services/homekit/package.json +++ b/server/services/homekit/package.json @@ -13,7 +13,6 @@ ], "scripts": {}, "dependencies": { - "@homebridge/hap-nodejs": "^2.1.2", - "uuid": "^9.0.0" + "@homebridge/hap-nodejs": "^2.1.2" } } diff --git a/server/services/melcloud/lib/device/melcloud.convertDevice.js b/server/services/melcloud/lib/device/melcloud.convertDevice.js index 427c1db8e8..21bf81464d 100644 --- a/server/services/melcloud/lib/device/melcloud.convertDevice.js +++ b/server/services/melcloud/lib/device/melcloud.convertDevice.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const { DEVICE_POLL_FREQUENCIES } = require('../../../../utils/constants'); const { getGladysDeviceFeatures } = require('./air-to-air.device'); @@ -17,7 +16,7 @@ function convertDevice(melCloudDevice) { features: [], external_id: externalId, selector: externalId, - model: get(melCloudDevice, 'Device.Units.0.Model', null), + model: melCloudDevice?.Device?.Units?.[0]?.Model ?? null, poll_frequency: DEVICE_POLL_FREQUENCIES.EVERY_10_SECONDS, should_poll: true, params: [ diff --git a/server/services/melcloud/package-lock.json b/server/services/melcloud/package-lock.json index 743b180f97..5c20556158 100644 --- a/server/services/melcloud/package-lock.json +++ b/server/services/melcloud/package-lock.json @@ -18,8 +18,7 @@ "win32" ], "dependencies": { - "axios": "^1.4.0", - "get-value": "^3.0.1" + "axios": "^1.4.0" } }, "node_modules/asynckit": { @@ -88,25 +87,6 @@ "node": ">= 6" } }, - "node_modules/get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", diff --git a/server/services/melcloud/package.json b/server/services/melcloud/package.json index 5b7d03c58e..97d5c18a7e 100644 --- a/server/services/melcloud/package.json +++ b/server/services/melcloud/package.json @@ -13,7 +13,6 @@ "arm64" ], "dependencies": { - "axios": "^1.4.0", - "get-value": "^3.0.1" + "axios": "^1.4.0" } } diff --git a/server/services/nextcloud-talk/lib/bot/bot.poll.js b/server/services/nextcloud-talk/lib/bot/bot.poll.js index 938565f75e..14b30dff16 100644 --- a/server/services/nextcloud-talk/lib/bot/bot.poll.js +++ b/server/services/nextcloud-talk/lib/bot/bot.poll.js @@ -1,4 +1,3 @@ -const get = require('get-value'); const logger = require('../../../../utils/logger'); /** @@ -43,7 +42,7 @@ async function poll(userId) { interval = 15 * 1000; } - const newMessages = get(result, 'data.ocs.data'); + const newMessages = result?.data?.ocs?.data; if ( bot.lastKnownMessageId && bot.isPolling && @@ -54,7 +53,7 @@ async function poll(userId) { } if (bot.isPolling) { - this.bots[userId].lastKnownMessageId = get(result, 'headers.x-chat-last-given') || bot.lastKnownMessageId; + this.bots[userId].lastKnownMessageId = result?.headers?.['x-chat-last-given'] || bot.lastKnownMessageId; setTimeout(() => this.poll(userId), interval); } } diff --git a/server/services/nextcloud-talk/lib/message/message.new.js b/server/services/nextcloud-talk/lib/message/message.new.js index ebd913fd25..a8df0f0c05 100644 --- a/server/services/nextcloud-talk/lib/message/message.new.js +++ b/server/services/nextcloud-talk/lib/message/message.new.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const logger = require('../../../../utils/logger'); const { EVENTS } = require('../../../../utils/constants'); @@ -24,7 +24,7 @@ async function newMessage(msg) { language: user.language, created_at: new Date(msg.timestamp * 1000).toISOString(), text: msg.message, - id: uuid.v4(), + id: randomUUID(), }; this.gladys.event.emit(EVENTS.MESSAGE.NEW, message); return null; diff --git a/server/services/nextcloud-talk/lib/message/message.send.js b/server/services/nextcloud-talk/lib/message/message.send.js index 6542cf426d..8fe49bf617 100644 --- a/server/services/nextcloud-talk/lib/message/message.send.js +++ b/server/services/nextcloud-talk/lib/message/message.send.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const logger = require('../../../../utils/logger'); /** @@ -48,7 +48,7 @@ async function send(token, message) { if (message.file) { const now = new Date(); const id = `${now.getFullYear()}-${now.getMonth() + - 1}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}${uuid.v4().split('-')[0]}`; + 1}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}${randomUUID().split('-')[0]}`; const path = `/Talk/${id}.jpg`; await this.gladys.http.request( diff --git a/server/services/nextcloud-talk/package-lock.json b/server/services/nextcloud-talk/package-lock.json index 8ef4d995d6..6dbadb629d 100644 --- a/server/services/nextcloud-talk/package-lock.json +++ b/server/services/nextcloud-talk/package-lock.json @@ -16,9 +16,7 @@ "win32" ], "dependencies": { - "axios": "^1.2.1", - "get-value": "^3.0.1", - "uuid": "^8.3.2" + "axios": "^1.2.1" } }, "node_modules/asynckit": { @@ -87,25 +85,6 @@ "node": ">= 6" } }, - "node_modules/get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -129,14 +108,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } } }, "dependencies": { @@ -183,19 +154,6 @@ "mime-types": "^2.1.12" } }, - "get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -213,11 +171,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } } diff --git a/server/services/nextcloud-talk/package.json b/server/services/nextcloud-talk/package.json index a22cb3bed2..f6951ed58d 100644 --- a/server/services/nextcloud-talk/package.json +++ b/server/services/nextcloud-talk/package.json @@ -13,8 +13,6 @@ ], "scripts": {}, "dependencies": { - "axios": "^1.2.1", - "get-value": "^3.0.1", - "uuid": "^8.3.2" + "axios": "^1.2.1" } } diff --git a/server/services/tasmota/package-lock.json b/server/services/tasmota/package-lock.json index 990bcd9da5..a1901b6cc3 100644 --- a/server/services/tasmota/package-lock.json +++ b/server/services/tasmota/package-lock.json @@ -16,25 +16,7 @@ "darwin", "linux", "win32" - ], - "dependencies": { - "uuid": "^9.0.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - } - }, - "dependencies": { - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + ] } } } diff --git a/server/services/tasmota/package.json b/server/services/tasmota/package.json index e2b981e2be..4e14f3012c 100644 --- a/server/services/tasmota/package.json +++ b/server/services/tasmota/package.json @@ -12,7 +12,5 @@ "arm", "arm64" ], - "dependencies": { - "uuid": "^9.0.0" - } + "dependencies": {} } diff --git a/server/services/telegram/lib/message.new.js b/server/services/telegram/lib/message.new.js index de467d2a72..04fbc0adf7 100644 --- a/server/services/telegram/lib/message.new.js +++ b/server/services/telegram/lib/message.new.js @@ -1,4 +1,4 @@ -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const logger = require('../../../utils/logger'); const { EVENTS } = require('../../../utils/constants'); @@ -36,7 +36,7 @@ async function newMessage(msg) { created_at: new Date(msg.date * 1000).toISOString(), text: msg.text, // We generate ID as uuidv4 as Telegram doesn't give this type of ID - id: uuid.v4(), + id: randomUUID(), }; this.gladys.event.emit(EVENTS.MESSAGE.NEW, message); return null; diff --git a/server/services/telegram/package-lock.json b/server/services/telegram/package-lock.json index 845ad3c2f3..03ecc1cd44 100644 --- a/server/services/telegram/package-lock.json +++ b/server/services/telegram/package-lock.json @@ -16,8 +16,7 @@ "win32" ], "dependencies": { - "node-telegram-bot-api": "^0.66.0", - "uuid": "^9.0.0" + "node-telegram-bot-api": "^0.66.0" } }, "node_modules/@cypress/request": { @@ -1231,14 +1230,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -2132,11 +2123,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/server/services/telegram/package.json b/server/services/telegram/package.json index 600b44bee5..242f5e644a 100644 --- a/server/services/telegram/package.json +++ b/server/services/telegram/package.json @@ -13,7 +13,6 @@ ], "scripts": {}, "dependencies": { - "node-telegram-bot-api": "^0.66.0", - "uuid": "^9.0.0" + "node-telegram-bot-api": "^0.66.0" } } diff --git a/server/test/lib/device/device.migrateFromSQLiteToDuckDb.test.js b/server/test/lib/device/device.migrateFromSQLiteToDuckDb.test.js index ca1d1b3366..b90aed099b 100644 --- a/server/test/lib/device/device.migrateFromSQLiteToDuckDb.test.js +++ b/server/test/lib/device/device.migrateFromSQLiteToDuckDb.test.js @@ -1,6 +1,6 @@ const { fake } = require('sinon'); const { expect } = require('chai'); -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const db = require('../../../models'); const Device = require('../../../lib/device'); @@ -27,7 +27,7 @@ const insertStates = async () => { for (let i = 1; i <= 1000; i += 1) { const date = new Date(now.getFullYear() - 1, 10, i).toISOString(); deviceFeatureStateToInsert.push({ - id: uuid.v4(), + id: randomUUID(), device_feature_id: 'ca91dfdf-55b2-4cf8-a58b-99c0fbf6f5e4', value: i, created_at: date, diff --git a/server/test/lib/device/device.purgeAllSqliteStates.test.js b/server/test/lib/device/device.purgeAllSqliteStates.test.js index d9cac1ce47..5de5b1c4a2 100644 --- a/server/test/lib/device/device.purgeAllSqliteStates.test.js +++ b/server/test/lib/device/device.purgeAllSqliteStates.test.js @@ -1,7 +1,7 @@ const { expect } = require('chai'); const EventEmitter = require('events'); const { fake } = require('sinon'); -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const db = require('../../../models'); const Device = require('../../../lib/device'); @@ -17,7 +17,7 @@ describe('Device', () => { for (let i = 1; i <= 110; i += 1) { const date = new Date(); deviceFeatureStateToInsert.push({ - id: uuid.v4(), + id: randomUUID(), device_feature_id: 'ca91dfdf-55b2-4cf8-a58b-99c0fbf6f5e4', value: i, created_at: date, diff --git a/server/test/lib/device/device.purgeStatesByFeatureId.test.js b/server/test/lib/device/device.purgeStatesByFeatureId.test.js index fb5073e744..72fb0c3f4d 100644 --- a/server/test/lib/device/device.purgeStatesByFeatureId.test.js +++ b/server/test/lib/device/device.purgeStatesByFeatureId.test.js @@ -1,6 +1,6 @@ const { expect } = require('chai'); const EventEmitter = require('events'); -const uuid = require('uuid'); +const { randomUUID } = require('crypto'); const Device = require('../../../lib/device'); const db = require('../../../models'); @@ -17,7 +17,7 @@ describe('device.purgeStatesByFeatureId', async function Describe() { for (let i = 1; i <= 110; i += 1) { const date = new Date(); deviceFeatureStateToInsert.push({ - id: uuid.v4(), + id: randomUUID(), device_feature_id: 'ca91dfdf-55b2-4cf8-a58b-99c0fbf6f5e4', value: i, created_at: date, diff --git a/server/test/lib/gateway/gateway.forwardDeviceStateToAlexa.test.js b/server/test/lib/gateway/gateway.forwardDeviceStateToAlexa.test.js index c8c79bc54f..587aab4813 100644 --- a/server/test/lib/gateway/gateway.forwardDeviceStateToAlexa.test.js +++ b/server/test/lib/gateway/gateway.forwardDeviceStateToAlexa.test.js @@ -1,6 +1,5 @@ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); -const get = require('get-value'); const { fake, assert } = sinon; @@ -127,7 +126,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { header: { namespace: 'Alexa', name: 'ChangeReport', - messageId: get(calledParam, 'event.header.messageId'), + messageId: calledParam?.event?.header?.messageId, payloadVersion: '3', }, endpoint: { endpointId: 'my-device' }, @@ -139,7 +138,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(calledParam, 'event.payload.change.properties.0.timeOfSample'), + timeOfSample: calledParam?.event?.payload?.change?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -152,7 +151,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(calledParam, 'context.properties.0.timeOfSample'), + timeOfSample: calledParam?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -208,7 +207,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { header: { namespace: 'Alexa', name: 'ChangeReport', - messageId: get(calledParam, 'event.header.messageId'), + messageId: calledParam?.event?.header?.messageId, payloadVersion: '3', }, endpoint: { endpointId: 'my-device' }, @@ -220,7 +219,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 50, - timeOfSample: get(calledParam, 'event.payload.change.properties.0.timeOfSample'), + timeOfSample: calledParam?.event?.payload?.change?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -233,7 +232,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 50, - timeOfSample: get(calledParam, 'context.properties.0.timeOfSample'), + timeOfSample: calledParam?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -430,7 +429,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { header: { namespace: 'Alexa', name: 'ChangeReport', - messageId: get(calledParam, 'event.header.messageId'), + messageId: calledParam?.event?.header?.messageId, payloadVersion: '3', }, endpoint: { endpointId: 'my-device' }, @@ -442,7 +441,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(calledParam, 'event.payload.change.properties.0.timeOfSample'), + timeOfSample: calledParam?.event?.payload?.change?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -455,7 +454,7 @@ describe('gateway.forwardDeviceStateToAlexa', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(calledParam, 'context.properties.0.timeOfSample'), + timeOfSample: calledParam?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], diff --git a/server/test/lib/gateway/gateway.getUsersKeys.test.js b/server/test/lib/gateway/gateway.getUsersKeys.test.js index 107f580505..10f21c52f8 100644 --- a/server/test/lib/gateway/gateway.getUsersKeys.test.js +++ b/server/test/lib/gateway/gateway.getUsersKeys.test.js @@ -117,4 +117,16 @@ describe('gateway.getUsersKeys', () => { }, ]); }); + it('should throw Error500 when getUsersInstance returns an error with status', async () => { + const error = new Error(); + error.response = { status: 400 }; + gateway.gladysGatewayClient.getUsersInstance = fake.rejects(error); + + try { + await gateway.getUsersKeys(); + expect.fail('should have thrown an error'); + } catch (e) { + expect(e.status).to.equal(500); + } + }); }); diff --git a/server/test/services/alexa/lib/alexa.onDiscovery.test.js b/server/test/services/alexa/lib/alexa.onDiscovery.test.js index c56d94ff24..707c99aa21 100644 --- a/server/test/services/alexa/lib/alexa.onDiscovery.test.js +++ b/server/test/services/alexa/lib/alexa.onDiscovery.test.js @@ -1,6 +1,5 @@ const sinon = require('sinon'); const { expect } = require('chai'); -const get = require('get-value'); const { assert, fake } = sinon; const AlexaHandler = require('../../../../services/alexa/lib'); @@ -60,7 +59,7 @@ describe('alexa.onDiscovery', () => { namespace: 'Alexa.Discovery', name: 'Discover.Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, }, payload: { endpoints: [ @@ -146,7 +145,7 @@ describe('alexa.onDiscovery', () => { namespace: 'Alexa.Discovery', name: 'Discover.Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, }, payload: { endpoints: [], diff --git a/server/test/services/alexa/lib/alexa.onExecute.test.js b/server/test/services/alexa/lib/alexa.onExecute.test.js index fec8670488..2d45ace905 100644 --- a/server/test/services/alexa/lib/alexa.onExecute.test.js +++ b/server/test/services/alexa/lib/alexa.onExecute.test.js @@ -1,6 +1,5 @@ const sinon = require('sinon'); const { expect } = require('chai'); -const get = require('get-value'); const { assert, fake } = sinon; const AlexaHandler = require('../../../../services/alexa/lib'); @@ -106,7 +105,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -119,7 +118,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'ON', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -214,7 +213,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -227,7 +226,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'ON', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -314,7 +313,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -327,7 +326,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 50, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -384,7 +383,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -397,7 +396,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -462,7 +461,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -475,7 +474,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 50, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -540,7 +539,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -553,7 +552,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 75, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -640,7 +639,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -653,7 +652,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 25, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -748,7 +747,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -761,7 +760,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 25, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -856,7 +855,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -869,7 +868,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 0, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -934,7 +933,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -947,7 +946,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 0, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -1012,7 +1011,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -1025,7 +1024,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 100, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -1096,7 +1095,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -1113,7 +1112,7 @@ describe('alexa.onExecute', () => { saturation: 1, brightness: 1, }, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -1170,7 +1169,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -1183,7 +1182,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'ON', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], @@ -1240,7 +1239,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa', name: 'Response', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JFAIAAAAAAADNYsvnxph02bkNS9vIkVRS1S/HQ30Nab1ai4U8WdBDVhSBKEkvJkzXTZFidmkW/eI78kPC8zSg4HTO0I1BfpLZ3qKVHkvLija4pKuhadAHKg96ccMDKR7krNc3AZ5RaDrg1QTPGbEfKXbUoPMNNo9HyRJzoEaqphBRI2/aFLmHaHnENYM8Ou3y7CzFj41xQ3VBjKQdyb4cxD2MJrAln2X5t0vuMcxkgMJ0ZTt9L9N3aQKFx9Xi3RI91cR4cDajUxGGx1RzYa2t6oroos5tjN3IutEntO7V0iKO/9CMnerWuFbihll7EeiDxY33h2KcY4MCIg2zQKaBRnyHwin+R/e9A7Ozv3CR/Qvxj5CxmL9nHHFjZMRXsauNNfG5vzzo03H5WutpXjC/UwfPviGk0dG+FBH7AqQ4TH1RojoLS/a1mcpsxSORo/dezT3d9zxlD/8lcsMcWZao5mxEkQybkrOBxXVhgAJyyH+5X/RJjUWVjVBxR4ODIRie1RKuTcmla7VwqM8JocAUy9lWsCMXjW5KhNBnVca/xU8I/XfhaVD+LV+pqDDvgDmq/KVYyp8bbFKVdSQ9mFrVMpgt97lnMDd2oNASDET10grmQdwbn/FivkK2tnveVlaU7/BpnC+JpGBqHT0DSJucu0es0SLlEd875QAdGPJ4Eg+OD4t8z4NqXyyH2iqVhq+AwQDFjY6UpPaWkykN', }, @@ -1253,7 +1252,7 @@ describe('alexa.onExecute', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'OFF', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 500, }, ], diff --git a/server/test/services/alexa/lib/alexa.onReportState.test.js b/server/test/services/alexa/lib/alexa.onReportState.test.js index 647b5e371d..8e740ad572 100644 --- a/server/test/services/alexa/lib/alexa.onReportState.test.js +++ b/server/test/services/alexa/lib/alexa.onReportState.test.js @@ -1,6 +1,5 @@ const sinon = require('sinon'); const { expect } = require('chai'); -const get = require('get-value'); const { fake } = sinon; const AlexaHandler = require('../../../../services/alexa/lib'); @@ -54,7 +53,7 @@ describe('alexa.onReportState', () => { namespace: 'Alexa', name: 'StateReport', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JAAIAAAAAAADgCDHXLLn3nx8SmjtElD2w8CfsniSH6KxFhbRSgD/sELuMpZTr4Jl/E3Nip62gpI2QqFNm/TrQ/Pi+XSFtf/4AVCDxe4bV2FAXSVu61AsuUlhbdqdvjUoaHOuqSLW8F3Qj9z3HWhfvTCMEbbhw4XVDWOsyXb9nknvswimA+R4ftNdBx5POWZGxWtbvU+yeBStTV+QwSSZaHWjzQdi/LAo1KW35MkmLikny7Y7J097LTTL1Tof6IkLsi9/gxOtUUFvnD4yIkWeHTT110Ch6R4kDuonNtOiHsTmMMRtsY5kRWoIL9VMfX6QHWjamhvd+XJp4sXkLMBdtJ3aTzfsUNrQIdrcPTox9qTNjShunTlbAYkq1TSUXaylEGHvcwHrbo7ZoUlBvidqnJGUNRJPxOHHyfCm5VqFzuFI8AG1W/dj1W4Di0AAND/mwzjZKUTRsiX4uEaRw8/Na4Qj/GBMuT18hUoGpe7t/UYw5JFw+MXm0kn/5jKe9r62xil3TN8BK9ODQDP9zq08+iiT0CBtEX5F4Drrowb57IwcW7nt/hkCeeyR59B/Z6nPsSq0NQ+rd1w4a1iHIyaTU6acQsKwmaX1OeTvtT2p7U/HhqfhVMSqA7ybGhQDF4FPPzIbh+o+D1S+AX9m9nVSSJNwoevikdZimCbk1l1HmUrhz78GO+j0yFg==', }, @@ -67,7 +66,7 @@ describe('alexa.onReportState', () => { namespace: 'Alexa.PowerController', name: 'powerState', value: 'ON', - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -122,7 +121,7 @@ describe('alexa.onReportState', () => { namespace: 'Alexa', name: 'StateReport', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JAAIAAAAAAADgCDHXLLn3nx8SmjtElD2w8CfsniSH6KxFhbRSgD/sELuMpZTr4Jl/E3Nip62gpI2QqFNm/TrQ/Pi+XSFtf/4AVCDxe4bV2FAXSVu61AsuUlhbdqdvjUoaHOuqSLW8F3Qj9z3HWhfvTCMEbbhw4XVDWOsyXb9nknvswimA+R4ftNdBx5POWZGxWtbvU+yeBStTV+QwSSZaHWjzQdi/LAo1KW35MkmLikny7Y7J097LTTL1Tof6IkLsi9/gxOtUUFvnD4yIkWeHTT110Ch6R4kDuonNtOiHsTmMMRtsY5kRWoIL9VMfX6QHWjamhvd+XJp4sXkLMBdtJ3aTzfsUNrQIdrcPTox9qTNjShunTlbAYkq1TSUXaylEGHvcwHrbo7ZoUlBvidqnJGUNRJPxOHHyfCm5VqFzuFI8AG1W/dj1W4Di0AAND/mwzjZKUTRsiX4uEaRw8/Na4Qj/GBMuT18hUoGpe7t/UYw5JFw+MXm0kn/5jKe9r62xil3TN8BK9ODQDP9zq08+iiT0CBtEX5F4Drrowb57IwcW7nt/hkCeeyR59B/Z6nPsSq0NQ+rd1w4a1iHIyaTU6acQsKwmaX1OeTvtT2p7U/HhqfhVMSqA7ybGhQDF4FPPzIbh+o+D1S+AX9m9nVSSJNwoevikdZimCbk1l1HmUrhz78GO+j0yFg==', }, @@ -135,7 +134,7 @@ describe('alexa.onReportState', () => { namespace: 'Alexa.BrightnessController', name: 'brightness', value: 50, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], @@ -188,7 +187,7 @@ describe('alexa.onReportState', () => { namespace: 'Alexa', name: 'StateReport', payloadVersion: '3', - messageId: get(result, 'event.header.messageId'), + messageId: result?.event?.header?.messageId, correlationToken: 'AAAAAAAAAQBe8ATzt+PzWVqbUXXQAv6JAAIAAAAAAADgCDHXLLn3nx8SmjtElD2w8CfsniSH6KxFhbRSgD/sELuMpZTr4Jl/E3Nip62gpI2QqFNm/TrQ/Pi+XSFtf/4AVCDxe4bV2FAXSVu61AsuUlhbdqdvjUoaHOuqSLW8F3Qj9z3HWhfvTCMEbbhw4XVDWOsyXb9nknvswimA+R4ftNdBx5POWZGxWtbvU+yeBStTV+QwSSZaHWjzQdi/LAo1KW35MkmLikny7Y7J097LTTL1Tof6IkLsi9/gxOtUUFvnD4yIkWeHTT110Ch6R4kDuonNtOiHsTmMMRtsY5kRWoIL9VMfX6QHWjamhvd+XJp4sXkLMBdtJ3aTzfsUNrQIdrcPTox9qTNjShunTlbAYkq1TSUXaylEGHvcwHrbo7ZoUlBvidqnJGUNRJPxOHHyfCm5VqFzuFI8AG1W/dj1W4Di0AAND/mwzjZKUTRsiX4uEaRw8/Na4Qj/GBMuT18hUoGpe7t/UYw5JFw+MXm0kn/5jKe9r62xil3TN8BK9ODQDP9zq08+iiT0CBtEX5F4Drrowb57IwcW7nt/hkCeeyR59B/Z6nPsSq0NQ+rd1w4a1iHIyaTU6acQsKwmaX1OeTvtT2p7U/HhqfhVMSqA7ybGhQDF4FPPzIbh+o+D1S+AX9m9nVSSJNwoevikdZimCbk1l1HmUrhz78GO+j0yFg==', }, @@ -205,7 +204,7 @@ describe('alexa.onReportState', () => { saturation: 1, brightness: 1, }, - timeOfSample: get(result, 'context.properties.0.timeOfSample'), + timeOfSample: result?.context?.properties?.[0]?.timeOfSample, uncertaintyInMilliseconds: 0, }, ], diff --git a/server/utils/device.js b/server/utils/device.js index 741f56cfef..b83e97b315 100644 --- a/server/utils/device.js +++ b/server/utils/device.js @@ -1,4 +1,3 @@ -const get = require('get-value'); /** * @description Get Device param by name. * @param {object} device - Device Object to parse. @@ -10,7 +9,7 @@ const get = require('get-value'); * }, 'test'); */ function getDeviceParam(device, paramName) { - if (!get(device, 'params')) { + if (!device?.params) { return null; } const param = device.params.find((oneParam) => oneParam.name === paramName); @@ -59,7 +58,7 @@ function setDeviceParam(device, paramName, newValue) { * }, 'light', 'binary'); */ function getDeviceFeature(device, category, type) { - if (!get(device, 'features')) { + if (!device?.features) { return null; } const feature = device.features.find((oneFeature) => oneFeature.category === category && oneFeature.type === type);