iobroker.iot 4.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/admin/assets/index-5zouxn2w.js +680 -0
- package/admin/index_m.html +1 -1
- package/admin/rules/assets/{ActionVisu-DE8dgNVF.js → ActionVisu-D9x2f6zu.js} +1 -1
- package/admin/rules/assets/{ActionVisu__loadShare__react__loadShare__-BKaC-p5K.js → ActionVisu__loadShare__react__loadShare__-Cg21Ef1U.js} +1 -1
- package/admin/rules/assets/{ActionVisu__loadShare__react_mf_2_dom__loadShare__-Bs1o8DtQ.js → ActionVisu__loadShare__react_mf_2_dom__loadShare__-B1zRWn0u.js} +2 -2
- package/admin/rules/assets/ActionVisu__mf_v__runtimeInit__mf_v__-Cz053nO7.js +10 -0
- package/admin/rules/assets/bootstrap-BCFKIiwZ.js +1 -0
- package/admin/rules/assets/hostInit-hos3Txsy.js +1 -1
- package/admin/rules/assets/{index-DjPMvPni.js → index-CAAeiKCc.js} +2 -2
- package/admin/rules/assets/{index-CbxmbJvB.js → index-Duo7mFlZ.js} +2 -2
- package/admin/rules/assets/index-DwYdaT5M.js +1151 -0
- package/admin/rules/assets/{virtualExposes-BNZJTatg.js → virtualExposes-BqVak7rX.js} +2 -2
- package/admin/rules/customRuleBlocks.js +2 -2
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +268 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +110 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +19 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +19 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +16 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js +68 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +19 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +25 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +37 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +32 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +29 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js +82 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +39 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js +47 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +14 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +36 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +57 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +57 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +12 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +16 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +127 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +18 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +38 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js +53 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +23 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js +37 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +34 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +19 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +18 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js +25 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +31 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +22 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +49 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +21 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +38 -0
- package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +20 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +26 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js +148 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js +13 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +17 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js +321 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js +182 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js +127 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js +38 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js +208 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js +47 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js +35 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js +17 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +26 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js +21 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js +21 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js +85 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +27 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js +116 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js +121 -0
- package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Device.js +83 -0
- package/build-backend/lib/AlexaSmartHomeV3/Device.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js +392 -0
- package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +10 -0
- package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js +37 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +53 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js +27 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js +93 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +112 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +1 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js +625 -0
- package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -0
- package/build-backend/lib/Utils.js +96 -0
- package/build-backend/lib/Utils.js.map +1 -0
- package/build-backend/lib/adminCommonSocket.js +715 -0
- package/build-backend/lib/adminCommonSocket.js.map +1 -0
- package/build-backend/lib/alexaCustom.js +542 -0
- package/build-backend/lib/alexaCustom.js.map +1 -0
- package/build-backend/lib/alexaSmartHomeV2.js +2788 -0
- package/build-backend/lib/alexaSmartHomeV3.js +97 -0
- package/build-backend/lib/alexaSmartHomeV3.js.map +1 -0
- package/build-backend/lib/alisa.js +2409 -0
- package/build-backend/lib/devices.js +23 -0
- package/build-backend/lib/devices.js.map +1 -0
- package/build-backend/lib/functions.js +24 -0
- package/build-backend/lib/functions.js.map +1 -0
- package/build-backend/lib/googleHome.js +3322 -0
- package/build-backend/lib/notifications.js +30 -0
- package/build-backend/lib/notifications.js.map +1 -0
- package/build-backend/lib/remote.js +1342 -0
- package/build-backend/lib/remote.js.map +1 -0
- package/build-backend/lib/rooms.js +48 -0
- package/build-backend/lib/rooms.js.map +1 -0
- package/build-backend/lib/texts.js +81 -0
- package/build-backend/lib/texts.js.map +1 -0
- package/build-backend/lib/translate.js +21 -0
- package/build-backend/lib/translate.js.map +1 -0
- package/build-backend/lib/visuApp.js +147 -0
- package/build-backend/lib/visuApp.js.map +1 -0
- package/build-backend/main.js +1361 -0
- package/build-backend/main.js.map +1 -0
- package/io-package.json +2 -2
- package/package.json +2 -2
- package/admin/assets/index-Y479CE6x.js +0 -681
- package/admin/rules/assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js +0 -5
- package/admin/rules/assets/bootstrap-Ba57tu25.js +0 -1
- package/admin/rules/assets/index-_Y2FN5EZ.js +0 -1152
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IotProxy.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/IotProxy.ts"],"names":[],"mappings":";;AAGA,MAAqB,QAAQ;IACzB,MAAM,CAAC,MAAM,CAAe;IAC5B,MAAM,CAAC,iBAAiB,CAAS;IACjC,MAAM,CAAC,KAAK,CAAS;IAErB,MAAM,CAAC,IAAI,CAAC,MAAoB,EAAE,QAAgB,EAAE,KAAa;QAC7D,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,iBAAiB,GAAG,YAAY,QAAQ,eAAe,CAAC;QACjE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,WAA0B;QAChD,2CAA2C;QAC3C,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxD,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,KAAa,EAAE,OAA+B;QACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAc,EAAQ,EAAE,GAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9G,CAAC;CACJ;AAzBD,2BAyBC","sourcesContent":["import type { device as DeviceModule } from 'aws-iot-device-sdk';\nimport type AlexaResponse from '../Alexa/AlexaResponse';\n\nexport default class IotProxy {\n static device: DeviceModule;\n static stateChangedTopic: string;\n static login: string;\n\n static init(device: DeviceModule, clientId: string, login: string): void {\n IotProxy.device = device;\n IotProxy.stateChangedTopic = `response/${clientId}/changeReport`;\n this.login = login;\n }\n\n static publishStateChange(stateChange: AlexaResponse): void {\n // replace INVALID token with the client id\n if (stateChange.event?.endpoint) {\n stateChange.event.endpoint.scope.token = this.login;\n }\n return IotProxy.publish(IotProxy.stateChangedTopic, stateChange);\n }\n\n static publish(topic: string, message: AlexaResponse | string): void {\n if (typeof message !== 'string') {\n message = JSON.stringify(message);\n }\n setTimeout(() => IotProxy.device?.publish(topic, message, { qos: 0 }, (_error?: Error): void => {}), 100);\n }\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const AdapterProvider_1 = __importDefault(require("./AdapterProvider"));
|
|
7
|
+
class Logger {
|
|
8
|
+
logged = new Map();
|
|
9
|
+
maxLoggedEntries = 500;
|
|
10
|
+
ttl = 30;
|
|
11
|
+
_component;
|
|
12
|
+
constructor(instance) {
|
|
13
|
+
if (instance && typeof instance === 'object' && 'constructor' in instance) {
|
|
14
|
+
this._component = instance.constructor.name || 'Unknown';
|
|
15
|
+
}
|
|
16
|
+
else if (typeof instance === 'string') {
|
|
17
|
+
this._component = instance;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
this._component = 'Unknown';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
get component() {
|
|
24
|
+
return this._component;
|
|
25
|
+
}
|
|
26
|
+
set component(value) {
|
|
27
|
+
this._component = value;
|
|
28
|
+
}
|
|
29
|
+
static hashCode(str) {
|
|
30
|
+
let hash = 0;
|
|
31
|
+
let i;
|
|
32
|
+
let chr;
|
|
33
|
+
if (str.length === 0) {
|
|
34
|
+
return hash;
|
|
35
|
+
}
|
|
36
|
+
for (i = 0; i < str.length; i++) {
|
|
37
|
+
chr = str.charCodeAt(i);
|
|
38
|
+
hash = (hash << 5) - hash + chr;
|
|
39
|
+
hash |= 0; // Convert to 32bit integer
|
|
40
|
+
}
|
|
41
|
+
return hash;
|
|
42
|
+
}
|
|
43
|
+
toSkip(hash) {
|
|
44
|
+
// clear old entries
|
|
45
|
+
let keys = Array.from(this.logged.keys());
|
|
46
|
+
const now = new Date().getTime();
|
|
47
|
+
for (const key of keys) {
|
|
48
|
+
const expired = (now - key) / 1000 > this.ttl;
|
|
49
|
+
if (expired) {
|
|
50
|
+
this.logged.delete(key);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
keys = Array.from(this.logged.keys());
|
|
54
|
+
if (keys.length > this.maxLoggedEntries) {
|
|
55
|
+
const toRemove = keys.length - this.maxLoggedEntries;
|
|
56
|
+
keys.sort();
|
|
57
|
+
for (let i = 0; i < toRemove; i++) {
|
|
58
|
+
this.logged.delete(keys[i]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return Array.from(this.logged.values()).includes(hash);
|
|
62
|
+
}
|
|
63
|
+
compose(message) {
|
|
64
|
+
return `[AlexaV3::${this.component}]: ${message}`;
|
|
65
|
+
}
|
|
66
|
+
print(logger, message) {
|
|
67
|
+
if (typeof message === 'string' && message.length > 0) {
|
|
68
|
+
const hash = Logger.hashCode(message);
|
|
69
|
+
if (this.toSkip(hash)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.logged.set(new Date().getTime(), hash);
|
|
73
|
+
return logger(message);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
silly(message) {
|
|
77
|
+
return this.print(AdapterProvider_1.default.get().log.silly, this.compose(message));
|
|
78
|
+
}
|
|
79
|
+
debug(message) {
|
|
80
|
+
return this.print(AdapterProvider_1.default.get().log.debug, this.compose(message));
|
|
81
|
+
}
|
|
82
|
+
info(message) {
|
|
83
|
+
return this.print(AdapterProvider_1.default.get().log.info, this.compose(message));
|
|
84
|
+
}
|
|
85
|
+
warn(message) {
|
|
86
|
+
return this.print(AdapterProvider_1.default.get().log.warn, this.compose(message));
|
|
87
|
+
}
|
|
88
|
+
error(message) {
|
|
89
|
+
return this.print(AdapterProvider_1.default.get().log.error, this.compose(message));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.default = Logger;
|
|
93
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/Logger.ts"],"names":[],"mappings":"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","sourcesContent":["import AdapterProvider from './AdapterProvider';\n\nexport type LogFn = (message: string) => void;\n\nexport default class Logger {\n private readonly logged: Map<number, number> = new Map();\n private readonly maxLoggedEntries = 500;\n private readonly ttl = 30;\n public _component: string;\n\n constructor(instance: unknown) {\n if (instance && typeof instance === 'object' && 'constructor' in instance) {\n this._component = (instance as { constructor: { name?: string } }).constructor.name || 'Unknown';\n } else if (typeof instance === 'string') {\n this._component = instance;\n } else {\n this._component = 'Unknown';\n }\n }\n\n get component(): string {\n return this._component;\n }\n\n set component(value: string) {\n this._component = value;\n }\n\n static hashCode(str: string): number {\n let hash = 0;\n let i;\n let chr;\n if (str.length === 0) {\n return hash;\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n\n toSkip(hash: number): boolean {\n // clear old entries\n let keys = Array.from(this.logged.keys());\n const now = new Date().getTime();\n for (const key of keys) {\n const expired = (now - key) / 1000 > this.ttl;\n if (expired) {\n this.logged.delete(key);\n }\n }\n\n keys = Array.from(this.logged.keys());\n if (keys.length > this.maxLoggedEntries) {\n const toRemove = keys.length - this.maxLoggedEntries;\n keys.sort();\n for (let i = 0; i < toRemove; i++) {\n this.logged.delete(keys[i]);\n }\n }\n\n return Array.from(this.logged.values()).includes(hash);\n }\n\n compose(message: string): string {\n return `[AlexaV3::${this.component}]: ${message}`;\n }\n\n print(logger: LogFn, message: string): void {\n if (typeof message === 'string' && message.length > 0) {\n const hash = Logger.hashCode(message);\n if (this.toSkip(hash)) {\n return;\n }\n\n this.logged.set(new Date().getTime(), hash);\n return logger(message);\n }\n }\n\n silly(message: string): void {\n return this.print(AdapterProvider.get().log.silly, this.compose(message));\n }\n\n debug(message: string): void {\n return this.print(AdapterProvider.get().log.debug, this.compose(message));\n }\n\n info(message: string): void {\n return this.print(AdapterProvider.get().log.info, this.compose(message));\n }\n\n warn(message: string): void {\n return this.print(AdapterProvider.get().log.warn, this.compose(message));\n }\n\n error(message: string): void {\n return this.print(AdapterProvider.get().log.error, this.compose(message));\n }\n}\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
// import path from 'path';
|
|
40
|
+
const HourlyDeviceRateLimitExceeded_1 = __importDefault(require("../Exceptions/HourlyDeviceRateLimitExceeded"));
|
|
41
|
+
const OverallDailyRateLimitExceeded_1 = __importDefault(require("../Exceptions/OverallDailyRateLimitExceeded"));
|
|
42
|
+
// import FileHelper from './FileHelper';
|
|
43
|
+
const Utils = __importStar(require("./Utils"));
|
|
44
|
+
class RateLimiter {
|
|
45
|
+
static MAX_DEVICE_STATE_CHANGES_PER_HOUR = 60;
|
|
46
|
+
static MAX_CHANGES_PER_DAY = 1000;
|
|
47
|
+
static USAGE_STORAGE_FOLDER = 'usage';
|
|
48
|
+
static USAGE_STORAGE_FILE_NAME = 'usage.json';
|
|
49
|
+
static usage = new Map();
|
|
50
|
+
static init() {
|
|
51
|
+
try {
|
|
52
|
+
// await FileHelper.createFolder(FileHelper.absolutePath(this.USAGE_STORAGE_FOLDER));
|
|
53
|
+
// const raw = await FileHelper.read(this.storageFileName);
|
|
54
|
+
// this.usage = new Map(JSON.parse(raw));
|
|
55
|
+
this.usage = new Map();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
this.usage = new Map();
|
|
59
|
+
}
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
}
|
|
62
|
+
// static get storageFileName(): string {
|
|
63
|
+
// return FileHelper.absolutePath(path.join(this.USAGE_STORAGE_FOLDER, this.USAGE_STORAGE_FILE_NAME));
|
|
64
|
+
// }
|
|
65
|
+
static async store() {
|
|
66
|
+
// try {
|
|
67
|
+
// await FileHelper.write(this.storageFileName, JSON.stringify(Array.from(this.usage.entries())));
|
|
68
|
+
// } catch (error) {
|
|
69
|
+
// // nop
|
|
70
|
+
// }
|
|
71
|
+
}
|
|
72
|
+
static get(endpointId) {
|
|
73
|
+
let item = this.usage.get(endpointId);
|
|
74
|
+
if (!item) {
|
|
75
|
+
item = {
|
|
76
|
+
changeCounter: 0,
|
|
77
|
+
timestamp: Utils.currentHour().toISOString(),
|
|
78
|
+
};
|
|
79
|
+
this.usage.set(endpointId, item);
|
|
80
|
+
}
|
|
81
|
+
return item;
|
|
82
|
+
}
|
|
83
|
+
static async incrementAndGet(endpointId) {
|
|
84
|
+
const item = this.get(endpointId);
|
|
85
|
+
if (!Utils.isCurrentHour(Utils.parseISOString(item.timestamp))) {
|
|
86
|
+
item.changeCounter = 1;
|
|
87
|
+
item.timestamp = Utils.currentHour().toISOString();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
item.changeCounter += 1;
|
|
91
|
+
}
|
|
92
|
+
this.usage.set(endpointId, item);
|
|
93
|
+
try {
|
|
94
|
+
await this.store();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// nop
|
|
98
|
+
}
|
|
99
|
+
if (item.changeCounter > this.MAX_DEVICE_STATE_CHANGES_PER_HOUR) {
|
|
100
|
+
throw new HourlyDeviceRateLimitExceeded_1.default(`Hourly state change limit for ${endpointId} exceeded`);
|
|
101
|
+
}
|
|
102
|
+
const changesToday = Array.from(this.usage.values())
|
|
103
|
+
.filter(item => Utils.isToday(Utils.parseISOString(item.timestamp)))
|
|
104
|
+
.reduce((sum, { changeCounter }) => sum + changeCounter, 0);
|
|
105
|
+
if (changesToday > this.MAX_CHANGES_PER_DAY) {
|
|
106
|
+
throw new OverallDailyRateLimitExceeded_1.default(`Overall daily state change limit exceeded`);
|
|
107
|
+
}
|
|
108
|
+
return item;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.default = RateLimiter;
|
|
112
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/RateLimiter.ts"],"names":[],"mappings":"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","sourcesContent":["// import path from 'path';\nimport HourlyDeviceRateLimitExceeded from '../Exceptions/HourlyDeviceRateLimitExceeded';\nimport OverallDailyRateLimitExceeded from '../Exceptions/OverallDailyRateLimitExceeded';\n// import FileHelper from './FileHelper';\nimport * as Utils from './Utils';\nimport type { AlexaV3EndpointID } from '../types';\n\nexport default class RateLimiter {\n static MAX_DEVICE_STATE_CHANGES_PER_HOUR = 60;\n static MAX_CHANGES_PER_DAY = 1000;\n static USAGE_STORAGE_FOLDER = 'usage';\n static USAGE_STORAGE_FILE_NAME = 'usage.json';\n\n static usage: Map<\n string,\n {\n changeCounter: number;\n timestamp: string;\n }\n > = new Map();\n\n static init(): Promise<void> {\n try {\n // await FileHelper.createFolder(FileHelper.absolutePath(this.USAGE_STORAGE_FOLDER));\n // const raw = await FileHelper.read(this.storageFileName);\n // this.usage = new Map(JSON.parse(raw));\n this.usage = new Map();\n } catch {\n this.usage = new Map();\n }\n return Promise.resolve();\n }\n\n // static get storageFileName(): string {\n // return FileHelper.absolutePath(path.join(this.USAGE_STORAGE_FOLDER, this.USAGE_STORAGE_FILE_NAME));\n // }\n\n static async store(): Promise<void> {\n // try {\n // await FileHelper.write(this.storageFileName, JSON.stringify(Array.from(this.usage.entries())));\n // } catch (error) {\n // // nop\n // }\n }\n\n static get(endpointId: AlexaV3EndpointID): {\n changeCounter: number;\n timestamp: string;\n } {\n let item = this.usage.get(endpointId);\n if (!item) {\n item = {\n changeCounter: 0,\n timestamp: Utils.currentHour().toISOString(),\n };\n this.usage.set(endpointId, item);\n }\n return item;\n }\n\n static async incrementAndGet(endpointId: AlexaV3EndpointID): Promise<{\n changeCounter: number;\n timestamp: string;\n }> {\n const item = this.get(endpointId);\n\n if (!Utils.isCurrentHour(Utils.parseISOString(item.timestamp))) {\n item.changeCounter = 1;\n item.timestamp = Utils.currentHour().toISOString();\n } else {\n item.changeCounter += 1;\n }\n\n this.usage.set(endpointId, item);\n\n try {\n await this.store();\n } catch {\n // nop\n }\n\n if (item.changeCounter > this.MAX_DEVICE_STATE_CHANGES_PER_HOUR) {\n throw new HourlyDeviceRateLimitExceeded(`Hourly state change limit for ${endpointId} exceeded`);\n }\n\n const changesToday = Array.from(this.usage.values())\n .filter(item => Utils.isToday(Utils.parseISOString(item.timestamp)))\n .reduce((sum, { changeCounter }) => sum + changeCounter, 0);\n\n if (changesToday > this.MAX_CHANGES_PER_DAY) {\n throw new OverallDailyRateLimitExceeded(`Overall daily state change limit exceeded`);\n }\n\n return item;\n }\n}\n"]}
|