iobroker.iot 3.6.0 → 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 (254) hide show
  1. package/README.md +8 -4
  2. package/admin/assets/index-5zouxn2w.js +680 -0
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{index-BRdNnGcA.js → index-DwYdaT5M.js} +80 -81
  5. package/admin/rules/customRuleBlocks.js +2 -2
  6. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/AlexaResponse.js +101 -95
  7. package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -0
  8. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +22 -36
  9. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -0
  10. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +19 -0
  11. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +1 -0
  12. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +14 -0
  13. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +1 -0
  14. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +19 -0
  15. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +1 -0
  16. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +16 -0
  17. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +1 -0
  18. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +14 -0
  19. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +1 -0
  20. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js +27 -28
  21. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +1 -0
  22. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +14 -0
  23. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +1 -0
  24. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +14 -0
  25. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +1 -0
  26. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +19 -0
  27. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +1 -0
  28. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +25 -0
  29. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +1 -0
  30. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +14 -0
  31. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +1 -0
  32. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +37 -0
  33. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +1 -0
  34. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +32 -0
  35. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -0
  36. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +29 -0
  37. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js.map +1 -0
  38. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js +34 -27
  39. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js.map +1 -0
  40. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +39 -0
  41. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +1 -0
  42. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Directives/ReportState.js +19 -22
  43. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js.map +1 -0
  44. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +14 -0
  45. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js.map +1 -0
  46. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +36 -0
  47. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js.map +1 -0
  48. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +57 -0
  49. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js.map +1 -0
  50. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +57 -0
  51. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js.map +1 -0
  52. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +12 -0
  53. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js.map +1 -0
  54. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +16 -0
  55. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js.map +1 -0
  56. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +127 -0
  57. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -0
  58. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +18 -0
  59. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js.map +1 -0
  60. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +38 -0
  61. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -0
  62. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js +20 -29
  63. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js.map +1 -0
  64. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +23 -0
  65. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +1 -0
  66. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/LockState.js +9 -12
  67. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +1 -0
  68. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +34 -0
  69. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +1 -0
  70. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +19 -0
  71. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js.map +1 -0
  72. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +18 -0
  73. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js.map +1 -0
  74. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/PowerState.js +9 -9
  75. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +1 -0
  76. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +31 -0
  77. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +1 -0
  78. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +22 -0
  79. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +1 -0
  80. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +49 -0
  81. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +1 -0
  82. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +21 -0
  83. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js.map +1 -0
  84. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +38 -0
  85. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js.map +1 -0
  86. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +20 -0
  87. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +1 -0
  88. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +26 -0
  89. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +1 -0
  90. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js +148 -0
  91. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -0
  92. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js +13 -0
  93. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js.map +1 -0
  94. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +17 -0
  95. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +1 -0
  96. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Controls/Control.js +73 -104
  97. package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -0
  98. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js +182 -0
  99. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -0
  100. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js +127 -0
  101. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +1 -0
  102. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js +10 -0
  103. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js.map +1 -0
  104. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js +38 -0
  105. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js.map +1 -0
  106. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js +208 -0
  107. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -0
  108. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Controls/Light.js +15 -22
  109. package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -0
  110. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js +35 -0
  111. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js.map +1 -0
  112. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js +17 -0
  113. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js.map +1 -0
  114. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +26 -0
  115. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +1 -0
  116. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js +10 -0
  117. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js.map +1 -0
  118. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js +21 -0
  119. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js.map +1 -0
  120. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js +21 -0
  121. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +1 -0
  122. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js +85 -0
  123. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -0
  124. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +27 -0
  125. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -0
  126. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js +116 -0
  127. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -0
  128. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +10 -0
  129. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js.map +1 -0
  130. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js +10 -0
  131. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js.map +1 -0
  132. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js +121 -0
  133. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -0
  134. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Device.js +29 -30
  135. package/build-backend/lib/AlexaSmartHomeV3/Device.js.map +1 -0
  136. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js +392 -0
  137. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -0
  138. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +10 -0
  139. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js.map +1 -0
  140. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +10 -0
  141. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js.map +1 -0
  142. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +10 -0
  143. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js.map +1 -0
  144. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Helpers/AdapterProvider.js +12 -21
  145. package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +1 -0
  146. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +53 -0
  147. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +1 -0
  148. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Helpers/IotProxy.js +9 -26
  149. package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js.map +1 -0
  150. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js +93 -0
  151. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js.map +1 -0
  152. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +112 -0
  153. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +1 -0
  154. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js +625 -0
  155. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -0
  156. package/build-backend/lib/Utils.js +96 -0
  157. package/build-backend/lib/Utils.js.map +1 -0
  158. package/build-backend/lib/adminCommonSocket.js +715 -0
  159. package/build-backend/lib/adminCommonSocket.js.map +1 -0
  160. package/build-backend/lib/alexaCustom.js +542 -0
  161. package/build-backend/lib/alexaCustom.js.map +1 -0
  162. package/{lib → build-backend/lib}/alexaSmartHomeV2.js +4 -8
  163. package/{lib → build-backend/lib}/alexaSmartHomeV3.js +25 -45
  164. package/build-backend/lib/alexaSmartHomeV3.js.map +1 -0
  165. package/{lib → build-backend/lib}/alisa.js +41 -44
  166. package/{lib → build-backend/lib}/devices.js +11 -8
  167. package/build-backend/lib/devices.js.map +1 -0
  168. package/{lib → build-backend/lib}/functions.js +11 -8
  169. package/build-backend/lib/functions.js.map +1 -0
  170. package/{lib → build-backend/lib}/googleHome.js +25 -26
  171. package/{lib → build-backend/lib}/notifications.js +15 -22
  172. package/build-backend/lib/notifications.js.map +1 -0
  173. package/{lib → build-backend/lib}/remote.js +615 -636
  174. package/build-backend/lib/remote.js.map +1 -0
  175. package/{lib → build-backend/lib}/rooms.js +11 -8
  176. package/build-backend/lib/rooms.js.map +1 -0
  177. package/{lib → build-backend/lib}/texts.js +6 -4
  178. package/build-backend/lib/texts.js.map +1 -0
  179. package/build-backend/lib/translate.js +21 -0
  180. package/build-backend/lib/translate.js.map +1 -0
  181. package/{lib → build-backend/lib}/visuApp.js +45 -65
  182. package/build-backend/lib/visuApp.js.map +1 -0
  183. package/build-backend/main.js +1361 -0
  184. package/build-backend/main.js.map +1 -0
  185. package/io-package.json +14 -14
  186. package/package.json +18 -15
  187. package/admin/assets/index-DCbOB3g_.js +0 -681
  188. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +0 -15
  189. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +0 -10
  190. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +0 -15
  191. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +0 -10
  192. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +0 -10
  193. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +0 -10
  194. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +0 -10
  195. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +0 -15
  196. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +0 -20
  197. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +0 -10
  198. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +0 -34
  199. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +0 -14
  200. package/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +0 -27
  201. package/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +0 -39
  202. package/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +0 -13
  203. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +0 -38
  204. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +0 -55
  205. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +0 -56
  206. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +0 -14
  207. package/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +0 -11
  208. package/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +0 -108
  209. package/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +0 -14
  210. package/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +0 -40
  211. package/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +0 -22
  212. package/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +0 -32
  213. package/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +0 -17
  214. package/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +0 -14
  215. package/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +0 -28
  216. package/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +0 -20
  217. package/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +0 -52
  218. package/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +0 -19
  219. package/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +0 -14
  220. package/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +0 -22
  221. package/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +0 -28
  222. package/lib/AlexaSmartHomeV3/Controls/AirCondition.js +0 -144
  223. package/lib/AlexaSmartHomeV3/Controls/Blind.js +0 -12
  224. package/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +0 -17
  225. package/lib/AlexaSmartHomeV3/Controls/Ct.js +0 -172
  226. package/lib/AlexaSmartHomeV3/Controls/Dimmer.js +0 -124
  227. package/lib/AlexaSmartHomeV3/Controls/Door.js +0 -9
  228. package/lib/AlexaSmartHomeV3/Controls/Gate.js +0 -42
  229. package/lib/AlexaSmartHomeV3/Controls/Hue.js +0 -207
  230. package/lib/AlexaSmartHomeV3/Controls/Lock.js +0 -36
  231. package/lib/AlexaSmartHomeV3/Controls/Motion.js +0 -17
  232. package/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +0 -25
  233. package/lib/AlexaSmartHomeV3/Controls/Slider.js +0 -10
  234. package/lib/AlexaSmartHomeV3/Controls/Socket.js +0 -21
  235. package/lib/AlexaSmartHomeV3/Controls/Temperature.js +0 -22
  236. package/lib/AlexaSmartHomeV3/Controls/Thermostat.js +0 -86
  237. package/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +0 -28
  238. package/lib/AlexaSmartHomeV3/Controls/Volume.js +0 -109
  239. package/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +0 -9
  240. package/lib/AlexaSmartHomeV3/Controls/Window.js +0 -9
  241. package/lib/AlexaSmartHomeV3/Controls/index.js +0 -14
  242. package/lib/AlexaSmartHomeV3/DeviceManager.js +0 -415
  243. package/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +0 -8
  244. package/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +0 -5
  245. package/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +0 -5
  246. package/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +0 -70
  247. package/lib/AlexaSmartHomeV3/Helpers/Logger.js +0 -95
  248. package/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +0 -82
  249. package/lib/AlexaSmartHomeV3/Helpers/Utils.js +0 -583
  250. package/lib/Utils.js +0 -608
  251. package/lib/adminCommonSocket.js +0 -781
  252. package/lib/alexaCustom.js +0 -622
  253. package/lib/translate.js +0 -19
  254. package/main.js +0 -1454
@@ -1,46 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
1
3
  class AdapterProvider {
2
- /**
3
- * @type {Object}
4
- */
5
4
  static adapterInstance;
6
- /**
7
- * @param {Object} adapter
8
- */
9
5
  static init(adapter) {
10
6
  AdapterProvider.adapterInstance = adapter;
11
7
  }
12
8
  static get() {
13
9
  return AdapterProvider.adapterInstance;
14
10
  }
15
-
16
11
  /**
17
- * Sets iobroker state to the passed on value
18
- * @async
19
- * @param {string} id - id of the state to write the value to
20
- * @param {*} value - value to set the provided state to
21
- * @returns {Promise<Object>} - Object returned by the iobroker setForeignStateAsync function
22
- */
12
+ * Sets iobroker state to the passed on value
13
+ *
14
+ * @param id - id of the state to write the value to
15
+ * @param value - value to set the provided state to
16
+ */
23
17
  static async setState(id, value) {
24
18
  await AdapterProvider.get().setForeignStateAsync(id, value, false);
25
19
  AdapterProvider.get().log.silly(`[AlexaV3::AdapterProvider]: set [${id}] to [${value}]`);
26
20
  }
27
21
  /**
28
- * @param {string} id
29
- * @returns {Promise<Object>} - Object's val returned by the iobroker getForeignStateAsync function
22
+ * @param id State id to get the value from
23
+ * @returns Object's val returned by the iobroker getForeignStateAsync function
30
24
  */
31
25
  static async getState(id) {
32
26
  const state = await AdapterProvider.get().getForeignStateAsync(id);
33
- return state.val;
27
+ return state?.val;
34
28
  }
35
-
36
29
  static async subscribe(id) {
37
30
  await AdapterProvider.get().subscribeForeignStatesAsync(id);
38
31
  }
39
-
40
32
  static async unsubscribe(id) {
41
33
  await AdapterProvider.get().unsubscribeForeignStatesAsync(id);
42
34
  }
43
-
44
35
  }
45
-
46
- module.exports = AdapterProvider;
36
+ exports.default = AdapterProvider;
37
+ //# sourceMappingURL=AdapterProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdapterProvider.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.ts"],"names":[],"mappings":";;AAEA,MAAqB,eAAe;IAChC,MAAM,CAAC,eAAe,CAAa;IAEnC,MAAM,CAAC,IAAI,CAAC,OAAmB;QAC3B,eAAe,CAAC,eAAe,GAAG,OAAO,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,GAAG;QACN,OAAO,eAAe,CAAC,eAAe,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,KAA0B;QACxD,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnE,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC5B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,EAAE,GAAG,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAU;QAC7B,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAU;QAC/B,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;CACJ;AAtCD,kCAsCC","sourcesContent":["import type { IotAdapter } from '../../../main';\n\nexport default class AdapterProvider {\n static adapterInstance: IotAdapter;\n\n static init(adapter: IotAdapter): void {\n AdapterProvider.adapterInstance = adapter;\n }\n\n static get(): IotAdapter {\n return AdapterProvider.adapterInstance;\n }\n\n /**\n * Sets iobroker state to the passed on value\n *\n * @param id - id of the state to write the value to\n * @param value - value to set the provided state to\n */\n static async setState(id: string, value: ioBroker.StateValue): Promise<void> {\n await AdapterProvider.get().setForeignStateAsync(id, value, false);\n AdapterProvider.get().log.silly(`[AlexaV3::AdapterProvider]: set [${id}] to [${value}]`);\n }\n\n /**\n * @param id State id to get the value from\n * @returns Object's val returned by the iobroker getForeignStateAsync function\n */\n static async getState(id: string): Promise<ioBroker.StateValue | undefined> {\n const state = await AdapterProvider.get().getForeignStateAsync(id);\n return state?.val;\n }\n\n static async subscribe(id: string): Promise<void> {\n await AdapterProvider.get().subscribeForeignStatesAsync(id);\n }\n\n static async unsubscribe(id: string): Promise<void> {\n await AdapterProvider.get().unsubscribeForeignStatesAsync(id);\n }\n}\n"]}
@@ -0,0 +1,53 @@
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 node_fs_1 = __importDefault(require("node:fs"));
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const adapter_core_1 = __importDefault(require("@iobroker/adapter-core"));
9
+ const AdapterProvider_1 = __importDefault(require("./AdapterProvider"));
10
+ class FileHelper {
11
+ static _rootFolder;
12
+ static get rootFolder() {
13
+ this._rootFolder ||= adapter_core_1.default.getAbsoluteInstanceDataDir(AdapterProvider_1.default.get());
14
+ return this._rootFolder;
15
+ }
16
+ static async createFolder(folderPath) {
17
+ return new Promise((resolve, reject) => {
18
+ node_fs_1.default.access(folderPath, error => {
19
+ if (error) {
20
+ // If the directory does not exist, then create it
21
+ node_fs_1.default.mkdir(folderPath, { recursive: true }, error => {
22
+ if (error) {
23
+ reject(error);
24
+ }
25
+ else {
26
+ resolve();
27
+ }
28
+ });
29
+ }
30
+ else {
31
+ resolve();
32
+ }
33
+ });
34
+ });
35
+ }
36
+ static absolutePath(relativePath) {
37
+ return node_path_1.default.join(this.rootFolder, relativePath);
38
+ }
39
+ static exists(fileName) {
40
+ return node_fs_1.default.existsSync(fileName);
41
+ }
42
+ static async read(fileName) {
43
+ return node_fs_1.default.promises.readFile(fileName, 'utf-8');
44
+ }
45
+ static async write(fileName, content) {
46
+ if (typeof content !== 'string') {
47
+ content = JSON.stringify(content);
48
+ }
49
+ return node_fs_1.default.promises.writeFile(fileName, content);
50
+ }
51
+ }
52
+ exports.default = FileHelper;
53
+ //# sourceMappingURL=FileHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileHelper.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/FileHelper.ts"],"names":[],"mappings":";;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAC7B,0EAA2C;AAC3C,wEAAgD;AAEhD,MAAqB,UAAU;IAC3B,MAAM,CAAC,WAAW,CAAS;IAC3B,MAAM,KAAK,UAAU;QACjB,IAAI,CAAC,WAAW,KAAK,sBAAK,CAAC,0BAA0B,CAAC,yBAAe,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAkB;QACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,iBAAE,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;gBAC1B,IAAI,KAAK,EAAE,CAAC;oBACR,kDAAkD;oBAClD,iBAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE;wBAC9C,IAAI,KAAK,EAAE,CAAC;4BACR,MAAM,CAAC,KAAK,CAAC,CAAC;wBAClB,CAAC;6BAAM,CAAC;4BACJ,OAAO,EAAE,CAAC;wBACd,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,OAAO,EAAE,CAAC;gBACd,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,YAAoB;QACpC,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,QAAgB;QAC1B,OAAO,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAgB;QAC9B,OAAO,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAY;QAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,iBAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ;AA5CD,6BA4CC","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport utils from '@iobroker/adapter-core';\nimport AdapterProvider from './AdapterProvider';\n\nexport default class FileHelper {\n static _rootFolder: string;\n static get rootFolder(): string {\n this._rootFolder ||= utils.getAbsoluteInstanceDataDir(AdapterProvider.get());\n return this._rootFolder;\n }\n\n static async createFolder(folderPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.access(folderPath, error => {\n if (error) {\n // If the directory does not exist, then create it\n fs.mkdir(folderPath, { recursive: true }, error => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n resolve();\n }\n });\n });\n }\n\n static absolutePath(relativePath: string): string {\n return path.join(this.rootFolder, relativePath);\n }\n\n static exists(fileName: string): boolean {\n return fs.existsSync(fileName);\n }\n\n static async read(fileName: string): Promise<string> {\n return fs.promises.readFile(fileName, 'utf-8');\n }\n\n static async write(fileName: string, content: any): Promise<void> {\n if (typeof content !== 'string') {\n content = JSON.stringify(content);\n }\n return fs.promises.writeFile(fileName, content);\n }\n}\n"]}
@@ -1,44 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
1
3
  class IotProxy {
2
- /**
3
- * @type {Object}
4
- */
5
4
  static device;
6
- /**
7
- * @type {string}
8
- */
9
5
  static stateChangedTopic;
10
-
11
- /**
12
- * @param {Object} device
13
- * @param {string} clientId
14
- * @param {string} login
15
- */
6
+ static login;
16
7
  static init(device, clientId, login) {
17
8
  IotProxy.device = device;
18
9
  IotProxy.stateChangedTopic = `response/${clientId}/changeReport`;
19
10
  this.login = login;
20
11
  }
21
-
22
- /**
23
- * @param {Object} stateChange
24
- */
25
12
  static publishStateChange(stateChange) {
26
13
  // replace INVALID token with the client id
27
- stateChange.event.endpoint.scope.token = this.login;
14
+ if (stateChange.event?.endpoint) {
15
+ stateChange.event.endpoint.scope.token = this.login;
16
+ }
28
17
  return IotProxy.publish(IotProxy.stateChangedTopic, stateChange);
29
18
  }
30
-
31
- /**
32
- * @param {string} topic
33
- * @param {string} message
34
- */
35
19
  static publish(topic, message) {
36
20
  if (typeof message !== 'string') {
37
21
  message = JSON.stringify(message);
38
22
  }
39
- setTimeout(() =>
40
- IotProxy.device?.publish(topic, message, { qos: 0 }, (error, result) => { }), 100);
23
+ setTimeout(() => IotProxy.device?.publish(topic, message, { qos: 0 }, (_error) => { }), 100);
41
24
  }
42
25
  }
43
-
44
- module.exports = IotProxy;
26
+ exports.default = IotProxy;
27
+ //# sourceMappingURL=IotProxy.js.map
@@ -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"]}