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.
Files changed (199) hide show
  1. package/README.md +1 -1
  2. package/admin/assets/index-5zouxn2w.js +680 -0
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{ActionVisu-DE8dgNVF.js → ActionVisu-D9x2f6zu.js} +1 -1
  5. package/admin/rules/assets/{ActionVisu__loadShare__react__loadShare__-BKaC-p5K.js → ActionVisu__loadShare__react__loadShare__-Cg21Ef1U.js} +1 -1
  6. package/admin/rules/assets/{ActionVisu__loadShare__react_mf_2_dom__loadShare__-Bs1o8DtQ.js → ActionVisu__loadShare__react_mf_2_dom__loadShare__-B1zRWn0u.js} +2 -2
  7. package/admin/rules/assets/ActionVisu__mf_v__runtimeInit__mf_v__-Cz053nO7.js +10 -0
  8. package/admin/rules/assets/bootstrap-BCFKIiwZ.js +1 -0
  9. package/admin/rules/assets/hostInit-hos3Txsy.js +1 -1
  10. package/admin/rules/assets/{index-DjPMvPni.js → index-CAAeiKCc.js} +2 -2
  11. package/admin/rules/assets/{index-CbxmbJvB.js → index-Duo7mFlZ.js} +2 -2
  12. package/admin/rules/assets/index-DwYdaT5M.js +1151 -0
  13. package/admin/rules/assets/{virtualExposes-BNZJTatg.js → virtualExposes-BqVak7rX.js} +2 -2
  14. package/admin/rules/customRuleBlocks.js +2 -2
  15. package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +268 -0
  16. package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -0
  17. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +110 -0
  18. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -0
  19. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +19 -0
  20. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +1 -0
  21. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +14 -0
  22. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +1 -0
  23. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +19 -0
  24. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +1 -0
  25. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +16 -0
  26. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +1 -0
  27. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +14 -0
  28. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +1 -0
  29. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js +68 -0
  30. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +1 -0
  31. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +14 -0
  32. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +1 -0
  33. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +14 -0
  34. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +1 -0
  35. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +19 -0
  36. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +1 -0
  37. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +25 -0
  38. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +1 -0
  39. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +14 -0
  40. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +1 -0
  41. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +37 -0
  42. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +1 -0
  43. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +32 -0
  44. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -0
  45. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +29 -0
  46. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js.map +1 -0
  47. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js +82 -0
  48. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js.map +1 -0
  49. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +39 -0
  50. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +1 -0
  51. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js +47 -0
  52. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js.map +1 -0
  53. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +14 -0
  54. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js.map +1 -0
  55. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +36 -0
  56. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js.map +1 -0
  57. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +57 -0
  58. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js.map +1 -0
  59. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +57 -0
  60. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js.map +1 -0
  61. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +12 -0
  62. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js.map +1 -0
  63. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +16 -0
  64. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js.map +1 -0
  65. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +127 -0
  66. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -0
  67. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +18 -0
  68. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js.map +1 -0
  69. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +38 -0
  70. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -0
  71. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js +53 -0
  72. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js.map +1 -0
  73. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +23 -0
  74. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +1 -0
  75. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js +37 -0
  76. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +1 -0
  77. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +34 -0
  78. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +1 -0
  79. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +19 -0
  80. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js.map +1 -0
  81. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +18 -0
  82. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js.map +1 -0
  83. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js +25 -0
  84. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +1 -0
  85. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +31 -0
  86. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +1 -0
  87. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +22 -0
  88. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +1 -0
  89. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +49 -0
  90. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +1 -0
  91. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +21 -0
  92. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js.map +1 -0
  93. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +38 -0
  94. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js.map +1 -0
  95. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +20 -0
  96. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +1 -0
  97. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +26 -0
  98. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +1 -0
  99. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js +148 -0
  100. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -0
  101. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js +13 -0
  102. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js.map +1 -0
  103. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +17 -0
  104. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +1 -0
  105. package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js +321 -0
  106. package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -0
  107. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js +182 -0
  108. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -0
  109. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js +127 -0
  110. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +1 -0
  111. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js +10 -0
  112. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js.map +1 -0
  113. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js +38 -0
  114. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js.map +1 -0
  115. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js +208 -0
  116. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -0
  117. package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js +47 -0
  118. package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -0
  119. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js +35 -0
  120. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js.map +1 -0
  121. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js +17 -0
  122. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js.map +1 -0
  123. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +26 -0
  124. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +1 -0
  125. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js +10 -0
  126. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js.map +1 -0
  127. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js +21 -0
  128. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js.map +1 -0
  129. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js +21 -0
  130. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +1 -0
  131. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js +85 -0
  132. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -0
  133. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +27 -0
  134. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -0
  135. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js +116 -0
  136. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -0
  137. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +10 -0
  138. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js.map +1 -0
  139. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js +10 -0
  140. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js.map +1 -0
  141. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js +121 -0
  142. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -0
  143. package/build-backend/lib/AlexaSmartHomeV3/Device.js +83 -0
  144. package/build-backend/lib/AlexaSmartHomeV3/Device.js.map +1 -0
  145. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js +392 -0
  146. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -0
  147. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +10 -0
  148. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js.map +1 -0
  149. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +10 -0
  150. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js.map +1 -0
  151. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +10 -0
  152. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js.map +1 -0
  153. package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js +37 -0
  154. package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +1 -0
  155. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +53 -0
  156. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +1 -0
  157. package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js +27 -0
  158. package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js.map +1 -0
  159. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js +93 -0
  160. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js.map +1 -0
  161. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +112 -0
  162. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +1 -0
  163. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js +625 -0
  164. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -0
  165. package/build-backend/lib/Utils.js +96 -0
  166. package/build-backend/lib/Utils.js.map +1 -0
  167. package/build-backend/lib/adminCommonSocket.js +715 -0
  168. package/build-backend/lib/adminCommonSocket.js.map +1 -0
  169. package/build-backend/lib/alexaCustom.js +542 -0
  170. package/build-backend/lib/alexaCustom.js.map +1 -0
  171. package/build-backend/lib/alexaSmartHomeV2.js +2788 -0
  172. package/build-backend/lib/alexaSmartHomeV3.js +97 -0
  173. package/build-backend/lib/alexaSmartHomeV3.js.map +1 -0
  174. package/build-backend/lib/alisa.js +2409 -0
  175. package/build-backend/lib/devices.js +23 -0
  176. package/build-backend/lib/devices.js.map +1 -0
  177. package/build-backend/lib/functions.js +24 -0
  178. package/build-backend/lib/functions.js.map +1 -0
  179. package/build-backend/lib/googleHome.js +3322 -0
  180. package/build-backend/lib/notifications.js +30 -0
  181. package/build-backend/lib/notifications.js.map +1 -0
  182. package/build-backend/lib/remote.js +1342 -0
  183. package/build-backend/lib/remote.js.map +1 -0
  184. package/build-backend/lib/rooms.js +48 -0
  185. package/build-backend/lib/rooms.js.map +1 -0
  186. package/build-backend/lib/texts.js +81 -0
  187. package/build-backend/lib/texts.js.map +1 -0
  188. package/build-backend/lib/translate.js +21 -0
  189. package/build-backend/lib/translate.js.map +1 -0
  190. package/build-backend/lib/visuApp.js +147 -0
  191. package/build-backend/lib/visuApp.js.map +1 -0
  192. package/build-backend/main.js +1361 -0
  193. package/build-backend/main.js.map +1 -0
  194. package/io-package.json +2 -2
  195. package/package.json +2 -2
  196. package/admin/assets/index-Y479CE6x.js +0 -681
  197. package/admin/rules/assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js +0 -5
  198. package/admin/rules/assets/bootstrap-Ba57tu25.js +0 -1
  199. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA2B;AAC3B,gHAAwF;AACxF,gHAAwF;AACxF,yCAAyC;AACzC,+CAAiC;AAGjC,MAAqB,WAAW;IAC5B,MAAM,CAAC,iCAAiC,GAAG,EAAE,CAAC;IAC9C,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,oBAAoB,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,uBAAuB,GAAG,YAAY,CAAC;IAE9C,MAAM,CAAC,KAAK,GAMR,IAAI,GAAG,EAAE,CAAC;IAEd,MAAM,CAAC,IAAI;QACP,IAAI,CAAC;YACD,qFAAqF;YACrF,2DAA2D;YAC3D,yCAAyC;YACzC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,yCAAyC;IACzC,0GAA0G;IAC1G,IAAI;IAEJ,MAAM,CAAC,KAAK,CAAC,KAAK;QACd,QAAQ;QACR,sGAAsG;QACtG,oBAAoB;QACpB,aAAa;QACb,IAAI;IACR,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,UAA6B;QAIpC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,IAAI,GAAG;gBACH,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE;aAC/C,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,UAA6B;QAItD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;QACvD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACL,MAAM;QACV,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iCAAiC,EAAE,CAAC;YAC9D,MAAM,IAAI,uCAA6B,CAAC,iCAAiC,UAAU,WAAW,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACnE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC;QAEhE,IAAI,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1C,MAAM,IAAI,uCAA6B,CAAC,2CAA2C,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAvFL,8BAwFC","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"]}