@smarthome.exchange/integrations 2.0.0 → 4.0.0

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 (251) hide show
  1. package/changelog.md +46 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/core/classes.nativeintegrationowner.d.ts +2 -0
  4. package/dist_ts/core/classes.nativeintegrationowner.js +5 -1
  5. package/dist_ts/core/classes.runtimemanager.d.ts +2 -0
  6. package/dist_ts/core/classes.runtimemanager.js +11 -3
  7. package/dist_ts/core/types.d.ts +2 -0
  8. package/dist_ts/integrations/deconz/deconz.classes.client.d.ts +37 -29
  9. package/dist_ts/integrations/deconz/deconz.classes.client.js +521 -294
  10. package/dist_ts/integrations/deconz/deconz.classes.configflow.d.ts +6 -1
  11. package/dist_ts/integrations/deconz/deconz.classes.configflow.js +63 -33
  12. package/dist_ts/integrations/deconz/deconz.classes.integration.d.ts +4 -3
  13. package/dist_ts/integrations/deconz/deconz.classes.integration.js +85 -40
  14. package/dist_ts/integrations/deconz/deconz.mapper.d.ts +1 -0
  15. package/dist_ts/integrations/deconz/deconz.mapper.js +24 -6
  16. package/dist_ts/integrations/deconz/deconz.types.d.ts +43 -6
  17. package/dist_ts/integrations/deconz/deconz.validation.d.ts +7 -1
  18. package/dist_ts/integrations/deconz/deconz.validation.js +215 -4
  19. package/dist_ts/integrations/esphome/esphome.classes.client.d.ts +19 -7
  20. package/dist_ts/integrations/esphome/esphome.classes.client.js +183 -89
  21. package/dist_ts/integrations/esphome/esphome.classes.configflow.d.ts +5 -2
  22. package/dist_ts/integrations/esphome/esphome.classes.configflow.js +43 -33
  23. package/dist_ts/integrations/esphome/esphome.classes.integration.d.ts +8 -6
  24. package/dist_ts/integrations/esphome/esphome.classes.integration.js +71 -43
  25. package/dist_ts/integrations/esphome/esphome.discovery.js +4 -12
  26. package/dist_ts/integrations/esphome/esphome.mapper.d.ts +2 -2
  27. package/dist_ts/integrations/esphome/esphome.mapper.js +6 -4
  28. package/dist_ts/integrations/esphome/esphome.types.d.ts +31 -6
  29. package/dist_ts/integrations/esphome/esphome.types.js +1 -1
  30. package/dist_ts/integrations/esphome/esphome.validation.d.ts +7 -0
  31. package/dist_ts/integrations/esphome/esphome.validation.js +66 -0
  32. package/dist_ts/integrations/homeassistant/homeassistant.classes.client.d.ts +32 -4
  33. package/dist_ts/integrations/homeassistant/homeassistant.classes.client.js +345 -116
  34. package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.d.ts +8 -5
  35. package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.js +34 -8
  36. package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.d.ts +7 -4
  37. package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.js +44 -56
  38. package/dist_ts/integrations/homeassistant/homeassistant.types.d.ts +12 -1
  39. package/dist_ts/integrations/hue/hue.classes.client.d.ts +32 -4
  40. package/dist_ts/integrations/hue/hue.classes.client.js +331 -57
  41. package/dist_ts/integrations/hue/hue.classes.configflow.d.ts +6 -1
  42. package/dist_ts/integrations/hue/hue.classes.configflow.js +79 -27
  43. package/dist_ts/integrations/hue/hue.classes.integration.d.ts +3 -1
  44. package/dist_ts/integrations/hue/hue.classes.integration.js +83 -62
  45. package/dist_ts/integrations/hue/hue.mapper.d.ts +2 -0
  46. package/dist_ts/integrations/hue/hue.mapper.js +8 -6
  47. package/dist_ts/integrations/hue/hue.types.d.ts +32 -1
  48. package/dist_ts/integrations/hue/hue.validation.d.ts +9 -3
  49. package/dist_ts/integrations/hue/hue.validation.js +112 -11
  50. package/dist_ts/integrations/mqtt/mqtt.classes.client.d.ts +15 -2
  51. package/dist_ts/integrations/mqtt/mqtt.classes.client.js +173 -23
  52. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.d.ts +5 -1
  53. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.js +53 -33
  54. package/dist_ts/integrations/mqtt/mqtt.classes.integration.d.ts +4 -1
  55. package/dist_ts/integrations/mqtt/mqtt.classes.integration.js +127 -56
  56. package/dist_ts/integrations/mqtt/mqtt.classes.session.d.ts +13 -0
  57. package/dist_ts/integrations/mqtt/mqtt.classes.session.js +130 -0
  58. package/dist_ts/integrations/mqtt/mqtt.mapper.d.ts +3 -0
  59. package/dist_ts/integrations/mqtt/mqtt.mapper.js +44 -1
  60. package/dist_ts/integrations/mqtt/mqtt.types.d.ts +46 -0
  61. package/dist_ts/integrations/mqtt/mqtt.validation.d.ts +7 -0
  62. package/dist_ts/integrations/mqtt/mqtt.validation.js +180 -0
  63. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.d.ts +4 -2
  64. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.js +41 -16
  65. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.d.ts +5 -0
  66. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.js +20 -7
  67. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.d.ts +1 -0
  68. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.js +53 -50
  69. package/dist_ts/integrations/samsungtv/samsungtv.types.d.ts +4 -1
  70. package/dist_ts/integrations/shelly/shelly.classes.client.d.ts +26 -30
  71. package/dist_ts/integrations/shelly/shelly.classes.client.js +504 -276
  72. package/dist_ts/integrations/shelly/shelly.classes.configflow.d.ts +8 -3
  73. package/dist_ts/integrations/shelly/shelly.classes.configflow.js +43 -38
  74. package/dist_ts/integrations/shelly/shelly.classes.integration.d.ts +6 -6
  75. package/dist_ts/integrations/shelly/shelly.classes.integration.js +103 -101
  76. package/dist_ts/integrations/shelly/shelly.classes.subscription.d.ts +4 -0
  77. package/dist_ts/integrations/shelly/shelly.classes.subscription.js +24 -2
  78. package/dist_ts/integrations/shelly/shelly.mapper.d.ts +1 -2
  79. package/dist_ts/integrations/shelly/shelly.mapper.js +21 -20
  80. package/dist_ts/integrations/shelly/shelly.rpc.js +4 -1
  81. package/dist_ts/integrations/shelly/shelly.types.d.ts +42 -2
  82. package/dist_ts/integrations/shelly/shelly.types.js +11 -2
  83. package/dist_ts/integrations/shelly/shelly.validation.d.ts +7 -0
  84. package/dist_ts/integrations/shelly/shelly.validation.js +79 -0
  85. package/dist_ts/integrations/sonos/sonos.classes.client.d.ts +79 -22
  86. package/dist_ts/integrations/sonos/sonos.classes.client.js +427 -139
  87. package/dist_ts/integrations/sonos/sonos.classes.configflow.d.ts +9 -2
  88. package/dist_ts/integrations/sonos/sonos.classes.configflow.js +26 -28
  89. package/dist_ts/integrations/sonos/sonos.classes.integration.d.ts +7 -6
  90. package/dist_ts/integrations/sonos/sonos.classes.integration.js +289 -224
  91. package/dist_ts/integrations/sonos/sonos.config.d.ts +6 -1
  92. package/dist_ts/integrations/sonos/sonos.config.js +23 -2
  93. package/dist_ts/integrations/sonos/sonos.mapper.d.ts +1 -1
  94. package/dist_ts/integrations/sonos/sonos.mapper.js +14 -9
  95. package/dist_ts/integrations/sonos/sonos.matchers.js +3 -3
  96. package/dist_ts/integrations/sonos/sonos.types.d.ts +26 -1
  97. package/dist_ts/integrations/tasmota/tasmota.classes.integration.d.ts +5 -0
  98. package/dist_ts/integrations/tasmota/tasmota.classes.integration.js +23 -7
  99. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.d.ts +19 -5
  100. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.js +115 -41
  101. package/dist_ts/integrations/tasmota/tasmota.config.js +23 -1
  102. package/dist_ts/integrations/tasmota/tasmota.credentials.d.ts +11 -0
  103. package/dist_ts/integrations/tasmota/tasmota.credentials.js +97 -0
  104. package/dist_ts/integrations/tasmota/tasmota.discovery.d.ts +7 -1
  105. package/dist_ts/integrations/tasmota/tasmota.discovery.js +108 -30
  106. package/dist_ts/integrations/tasmota/tasmota.mapper.d.ts +2 -2
  107. package/dist_ts/integrations/tasmota/tasmota.mapper.js +7 -7
  108. package/dist_ts/integrations/tasmota/tasmota.types.d.ts +41 -2
  109. package/dist_ts/integrations/tuya/tuya.classes.integration.d.ts +4 -1
  110. package/dist_ts/integrations/tuya/tuya.classes.integration.js +79 -110
  111. package/dist_ts/integrations/tuya/tuya.classes.runtime.d.ts +5 -2
  112. package/dist_ts/integrations/tuya/tuya.classes.runtime.js +73 -26
  113. package/dist_ts/integrations/tuya/tuya.mapper.js +2 -2
  114. package/dist_ts/integrations/tuya/tuya.types.d.ts +3 -0
  115. package/dist_ts/integrations/tuya/tuya.validation.d.ts +2 -2
  116. package/dist_ts/integrations/tuya/tuya.validation.js +6 -11
  117. package/dist_ts/integrations/webostv/webostv.classes.client.d.ts +6 -5
  118. package/dist_ts/integrations/webostv/webostv.classes.client.js +147 -76
  119. package/dist_ts/integrations/webostv/webostv.classes.configflow.d.ts +7 -2
  120. package/dist_ts/integrations/webostv/webostv.classes.configflow.js +36 -20
  121. package/dist_ts/integrations/webostv/webostv.classes.integration.d.ts +4 -4
  122. package/dist_ts/integrations/webostv/webostv.classes.integration.js +46 -54
  123. package/dist_ts/integrations/webostv/webostv.mapper.js +5 -5
  124. package/dist_ts/integrations/webostv/webostv.types.d.ts +16 -3
  125. package/dist_ts/integrations/webostv/webostv.types.js +1 -1
  126. package/dist_ts/integrations/webostv/webostv.validation.d.ts +3 -1
  127. package/dist_ts/integrations/webostv/webostv.validation.js +23 -1
  128. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.d.ts +6 -1
  129. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.js +18 -8
  130. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.d.ts +4 -1
  131. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.js +54 -6
  132. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.d.ts +12 -6
  133. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.js +73 -59
  134. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.d.ts +3 -2
  135. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.js +17 -12
  136. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.d.ts +31 -2
  137. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.d.ts +9 -1
  138. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.js +57 -7
  139. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.d.ts +10 -4
  140. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.js +167 -31
  141. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.d.ts +6 -1
  142. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.js +57 -35
  143. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.d.ts +3 -1
  144. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.js +59 -37
  145. package/dist_ts/integrations/zwave_js/zwave_js.discovery.js +3 -3
  146. package/dist_ts/integrations/zwave_js/zwave_js.mapper.js +41 -24
  147. package/dist_ts/integrations/zwave_js/zwave_js.types.d.ts +25 -3
  148. package/dist_ts/integrations/zwave_js/zwave_js.validation.d.ts +6 -2
  149. package/dist_ts/integrations/zwave_js/zwave_js.validation.js +52 -17
  150. package/dist_ts/plugins.d.ts +2 -1
  151. package/dist_ts/plugins.js +3 -2
  152. package/package.json +10 -10
  153. package/readme.md +25 -6
  154. package/ts/00_commitinfo_data.ts +1 -1
  155. package/ts/core/classes.nativeintegrationowner.ts +5 -0
  156. package/ts/core/classes.runtimemanager.ts +11 -2
  157. package/ts/core/types.ts +2 -0
  158. package/ts/integrations/deconz/deconz.classes.client.ts +348 -252
  159. package/ts/integrations/deconz/deconz.classes.configflow.ts +57 -29
  160. package/ts/integrations/deconz/deconz.classes.integration.ts +69 -37
  161. package/ts/integrations/deconz/deconz.mapper.ts +22 -5
  162. package/ts/integrations/deconz/deconz.types.ts +49 -6
  163. package/ts/integrations/deconz/deconz.validation.ts +177 -4
  164. package/ts/integrations/deconz/readme.md +15 -1
  165. package/ts/integrations/esphome/esphome.classes.client.ts +179 -94
  166. package/ts/integrations/esphome/esphome.classes.configflow.ts +40 -33
  167. package/ts/integrations/esphome/esphome.classes.integration.ts +63 -36
  168. package/ts/integrations/esphome/esphome.discovery.ts +3 -12
  169. package/ts/integrations/esphome/esphome.mapper.ts +9 -7
  170. package/ts/integrations/esphome/esphome.types.ts +35 -6
  171. package/ts/integrations/esphome/esphome.validation.ts +66 -0
  172. package/ts/integrations/esphome/readme.md +20 -6
  173. package/ts/integrations/homeassistant/homeassistant.classes.client.ts +353 -125
  174. package/ts/integrations/homeassistant/homeassistant.classes.integration.ts +35 -18
  175. package/ts/integrations/homeassistant/homeassistant.classes.runtime.ts +50 -63
  176. package/ts/integrations/homeassistant/homeassistant.types.ts +17 -1
  177. package/ts/integrations/homeassistant/readme.md +22 -6
  178. package/ts/integrations/hue/hue.classes.client.ts +288 -55
  179. package/ts/integrations/hue/hue.classes.configflow.ts +68 -25
  180. package/ts/integrations/hue/hue.classes.integration.ts +75 -54
  181. package/ts/integrations/hue/hue.mapper.ts +8 -5
  182. package/ts/integrations/hue/hue.types.ts +37 -1
  183. package/ts/integrations/hue/hue.validation.ts +102 -13
  184. package/ts/integrations/hue/readme.md +49 -12
  185. package/ts/integrations/mqtt/mqtt.classes.client.ts +136 -19
  186. package/ts/integrations/mqtt/mqtt.classes.configflow.ts +45 -32
  187. package/ts/integrations/mqtt/mqtt.classes.integration.ts +99 -38
  188. package/ts/integrations/mqtt/mqtt.classes.session.ts +118 -0
  189. package/ts/integrations/mqtt/mqtt.mapper.ts +43 -1
  190. package/ts/integrations/mqtt/mqtt.types.ts +52 -0
  191. package/ts/integrations/mqtt/mqtt.validation.ts +157 -0
  192. package/ts/integrations/mqtt/readme.md +12 -3
  193. package/ts/integrations/samsungtv/readme.md +11 -5
  194. package/ts/integrations/samsungtv/samsungtv.classes.client.ts +40 -15
  195. package/ts/integrations/samsungtv/samsungtv.classes.configflow.ts +21 -6
  196. package/ts/integrations/samsungtv/samsungtv.classes.integration.ts +53 -38
  197. package/ts/integrations/samsungtv/samsungtv.types.ts +4 -1
  198. package/ts/integrations/shelly/readme.md +22 -7
  199. package/ts/integrations/shelly/shelly.classes.client.ts +386 -269
  200. package/ts/integrations/shelly/shelly.classes.configflow.ts +43 -38
  201. package/ts/integrations/shelly/shelly.classes.integration.ts +92 -111
  202. package/ts/integrations/shelly/shelly.classes.subscription.ts +24 -1
  203. package/ts/integrations/shelly/shelly.mapper.ts +19 -20
  204. package/ts/integrations/shelly/shelly.rpc.ts +2 -0
  205. package/ts/integrations/shelly/shelly.types.ts +50 -2
  206. package/ts/integrations/shelly/shelly.validation.ts +76 -0
  207. package/ts/integrations/sonos/readme.md +117 -38
  208. package/ts/integrations/sonos/sonos.classes.client.ts +392 -123
  209. package/ts/integrations/sonos/sonos.classes.configflow.ts +25 -28
  210. package/ts/integrations/sonos/sonos.classes.integration.ts +211 -186
  211. package/ts/integrations/sonos/sonos.config.ts +24 -2
  212. package/ts/integrations/sonos/sonos.mapper.ts +13 -8
  213. package/ts/integrations/sonos/sonos.matchers.ts +2 -2
  214. package/ts/integrations/sonos/sonos.types.ts +30 -1
  215. package/ts/integrations/tasmota/readme.md +16 -5
  216. package/ts/integrations/tasmota/tasmota.classes.integration.ts +24 -6
  217. package/ts/integrations/tasmota/tasmota.classes.runtime.ts +112 -43
  218. package/ts/integrations/tasmota/tasmota.config.ts +17 -0
  219. package/ts/integrations/tasmota/tasmota.credentials.ts +92 -0
  220. package/ts/integrations/tasmota/tasmota.discovery.ts +87 -24
  221. package/ts/integrations/tasmota/tasmota.mapper.ts +6 -6
  222. package/ts/integrations/tasmota/tasmota.types.ts +43 -2
  223. package/ts/integrations/tuya/readme.md +52 -10
  224. package/ts/integrations/tuya/tuya.classes.integration.ts +69 -98
  225. package/ts/integrations/tuya/tuya.classes.runtime.ts +70 -24
  226. package/ts/integrations/tuya/tuya.mapper.ts +1 -1
  227. package/ts/integrations/tuya/tuya.types.ts +4 -0
  228. package/ts/integrations/tuya/tuya.validation.ts +5 -8
  229. package/ts/integrations/webostv/readme.md +115 -22
  230. package/ts/integrations/webostv/webostv.classes.client.ts +123 -50
  231. package/ts/integrations/webostv/webostv.classes.configflow.ts +35 -15
  232. package/ts/integrations/webostv/webostv.classes.integration.ts +44 -37
  233. package/ts/integrations/webostv/webostv.mapper.ts +4 -4
  234. package/ts/integrations/webostv/webostv.types.ts +18 -3
  235. package/ts/integrations/webostv/webostv.validation.ts +22 -1
  236. package/ts/integrations/zigbee2mqtt/readme.md +22 -27
  237. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +16 -7
  238. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +53 -6
  239. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +62 -49
  240. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +17 -11
  241. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +35 -2
  242. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +53 -7
  243. package/ts/integrations/zwave_js/readme.md +42 -9
  244. package/ts/integrations/zwave_js/zwave_js.classes.client.ts +155 -31
  245. package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +55 -31
  246. package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +57 -35
  247. package/ts/integrations/zwave_js/zwave_js.discovery.ts +2 -2
  248. package/ts/integrations/zwave_js/zwave_js.mapper.ts +37 -23
  249. package/ts/integrations/zwave_js/zwave_js.types.ts +26 -3
  250. package/ts/integrations/zwave_js/zwave_js.validation.ts +52 -18
  251. package/ts/plugins.ts +2 -1
@@ -1,4 +1,7 @@
1
- import { deconzEndpoint, deconzGatewayConfig, deconzGroupActionPatch, deconzLightStatePatch, deconzPort, deconzSensorConfigPatch, deconzSensorStatePatch, deconzSnapshot, deconzWebsocketEvent, isDeconzRecord } from './deconz.validation.js';
1
+ import * as plugins from '../../plugins.js';
2
+ import { NoSqlConfigStore } from '../../core/classes.configstore.js';
3
+ import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
4
+ import { captureDeconzOptions, deconzCurrentPatch, deconzData, deconzEndpoint, deconzGatewayConfig, deconzGroupActionPatch, deconzLightStatePatch, deconzPort, deconzSensorConfigPatch, deconzSensorStatePatch, deconzSnapshot, deconzText, deconzWebsocketEvent, isDeconzRecord, normalizeDeconzConfig } from './deconz.validation.js';
2
5
  export class DeconzRequestError extends Error {
3
6
  apiErrorType;
4
7
  constructor(messageArg, apiErrorType) {
@@ -6,334 +9,558 @@ export class DeconzRequestError extends Error {
6
9
  this.apiErrorType = apiErrorType;
7
10
  }
8
11
  }
12
+ export class DeconzWriteError extends Error {
13
+ effectOutcome = 'indeterminate';
14
+ constructor() { super('deCONZ command was dispatched; its outcome is indeterminate.'); }
15
+ }
16
+ /** Credentials and persistence resources are supplied by the independently selected host. */
9
17
  export class DeconzClient {
10
- abortSignal;
11
- config;
12
- endpoint;
13
- timeoutMs;
14
- lifetime = new AbortController();
15
- operations = new Set();
16
- subscriptions = new Set();
17
- streamHealthy = true;
18
- gatewayHealthy = false;
19
- gatewayId;
20
- constructor(configArg, abortSignal) {
21
- this.abortSignal = abortSignal;
22
- this.config = structuredClone(configArg);
23
- const config = this.config;
24
- if (config.snapshot && config.host !== undefined)
25
- throw new Error('deCONZ snapshot fixtures cannot be combined with a live endpoint.');
26
- this.timeoutMs = config.requestTimeoutMs ?? 15000;
27
- if (!Number.isInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 2147483647) {
28
- throw new Error('deCONZ requestTimeoutMs must be a positive timer-safe integer.');
29
- }
30
- if (config.host !== undefined)
31
- this.endpoint = deconzEndpoint(config);
32
- if (!config.snapshot && !this.endpoint)
33
- throw new Error('deCONZ host is required.');
34
- if (config.apiKey !== undefined && (typeof config.apiKey !== 'string' || !config.apiKey.trim() || config.apiKey.trim() !== config.apiKey)) {
35
- throw new Error('deCONZ API key must be a non-empty string.');
36
- }
37
- if (config.websocketPort !== undefined)
38
- deconzPort(config.websocketPort);
39
- if (config.bridgeId !== undefined && (typeof config.bridgeId !== 'string' || !config.bridgeId))
40
- throw new Error('Invalid deCONZ configured gateway identity.');
41
- if (config.enableWebSocket !== undefined && typeof config.enableWebSocket !== 'boolean')
42
- throw new Error('Invalid deCONZ WebSocket setting.');
43
- }
44
- get isHealthy() {
45
- return !this.lifetime.signal.aborted && !this.abortSignal?.aborted && this.streamHealthy && this.gatewayHealthy;
46
- }
47
- async getSnapshot(abortSignalArg) {
48
- try {
49
- this.assertActive(abortSignalArg);
50
- const snapshot = deconzSnapshot(this.config.snapshot ? structuredClone(this.config.snapshot) : await this.requestJson('GET', '', undefined, abortSignalArg));
51
- this.assertGatewayIdentity(snapshot.config);
52
- this.gatewayHealthy = true;
53
- return snapshot;
54
- }
55
- catch (error) {
56
- this.gatewayHealthy = false;
57
- throw error;
58
- }
59
- }
60
- async getGatewayConfig(abortSignalArg) {
61
- try {
62
- this.assertActive(abortSignalArg);
63
- const config = deconzGatewayConfig(this.config.snapshot ? this.config.snapshot.config : await this.requestJson('GET', '/config', undefined, abortSignalArg));
64
- this.assertGatewayIdentity(config);
65
- this.gatewayHealthy = true;
66
- return config;
18
+ #config;
19
+ #options;
20
+ #context;
21
+ #owner;
22
+ #ownsOwner;
23
+ #endpoint;
24
+ #lifetime;
25
+ #operations = new Set();
26
+ #subscriptions = new Set();
27
+ #callbackFailures = new Set();
28
+ #store;
29
+ #ownsStore;
30
+ #closePromise;
31
+ #retryPromise;
32
+ #streamHealthy = true;
33
+ #gatewayHealthy = false;
34
+ #onAbort;
35
+ constructor(configArg, contextArg, optionsArg = {}, ownerArg) {
36
+ this.#config = normalizeDeconzConfig(configArg);
37
+ this.#options = captureDeconzOptions(optionsArg);
38
+ this.#ownsOwner = !ownerArg;
39
+ this.#owner = ownerArg ?? new NativeIntegrationOwner('deconz', { homeId: this.#options.homeId, capacity: this.#options.capacity });
40
+ this.#context = this.#owner.admission.admit(contextArg, this.#config.homeId);
41
+ if (this.#options.homeId !== undefined && this.#options.homeId !== this.#context.homeId)
42
+ throw new Error('deCONZ constructor home does not match the host home.');
43
+ this.#endpoint = deconzEndpoint(this.#config);
44
+ if (this.#context.configStore && this.#options.db)
45
+ throw new Error('deCONZ requires one selected credential store.');
46
+ this.#ownsStore = !this.#context.configStore && Boolean(this.#options.db);
47
+ if (this.#options.db && !(this.#options.db instanceof plugins.nosqldb.SmartdataDb))
48
+ throw new TypeError('deCONZ requires an actual caller-owned database.');
49
+ this.#store = this.#context.configStore ?? (this.#options.db && this.#options.keyProvider ? new NoSqlConfigStore({ db: this.#options.db, keyProvider: this.#options.keyProvider, homeId: this.#context.homeId, integrationDomain: 'deconz', timeoutMs: this.#config.requestTimeoutMs }) : undefined);
50
+ if (!this.#options.credentialProvider && !this.#store)
51
+ throw new Error('deCONZ requires an explicit credential provider or an actual encrypted config store.');
52
+ this.#lifetime = new AbortController();
53
+ if (this.#context.abortSignal) {
54
+ this.#onAbort = () => { void this.destroy().catch(() => undefined); };
55
+ this.#context.abortSignal.addEventListener('abort', this.#onAbort, { once: true });
67
56
  }
68
- catch (error) {
69
- this.gatewayHealthy = false;
70
- throw error;
71
- }
72
- }
73
- async acquireApiKey(deviceTypeArg = 'smarthome.exchange', abortSignalArg) {
74
- if (typeof deviceTypeArg !== 'string' || !deviceTypeArg || deviceTypeArg.length > 40)
75
- throw new Error('Invalid deCONZ client name.');
76
- const result = await this.requestJson('POST', '', { devicetype: deviceTypeArg }, abortSignalArg, true);
77
- if (!Array.isArray(result) || result.length !== 1 || !isDeconzRecord(result[0]) || !isDeconzRecord(result[0].success) || typeof result[0].success.username !== 'string' || !result[0].success.username.trim()) {
78
- throw new Error('Invalid deCONZ pairing response.');
79
- }
80
- return result[0].success.username;
81
- }
82
- async setLightState(idArg, stateArg, signalArg) {
83
- const patch = deconzLightStatePatch(stateArg);
84
- await this.put(`/lights/${this.resourceId(idArg)}/state`, patch, signalArg);
85
57
  }
86
- async setGroupState(idArg, actionArg, signalArg) {
87
- const patch = deconzGroupActionPatch(actionArg);
88
- await this.put(`/groups/${this.resourceId(idArg)}/action`, patch, signalArg);
89
- }
90
- async setSensorConfig(idArg, configArg, signalArg) {
91
- const patch = deconzSensorConfigPatch(configArg);
92
- await this.put(`/sensors/${this.resourceId(idArg)}/config`, patch, signalArg);
58
+ get isHealthy() { return !this.#closePromise && !this.#lifetime.signal.aborted && !this.#context.abortSignal?.aborted && !this.#owner.signal.aborted && this.#streamHealthy && this.#gatewayHealthy; }
59
+ get canCreateCredential() { return Boolean(this.#options.credentialProvider?.create || !this.#options.credentialProvider && this.#store); }
60
+ async getSnapshot(signalArg) { return this.#run((operation) => this.#snapshot(operation), signalArg); }
61
+ async getGatewayConfig(signalArg) { return this.#run(async (operation) => (await this.#snapshot(operation)).config, signalArg); }
62
+ /** Keeps a runtime command, its actual callbacks, and its readback on one shared operation lease. */
63
+ execute(workArg, signalArg) {
64
+ return this.#run(async (operation) => {
65
+ let open = true;
66
+ let written = false;
67
+ let selectedSnapshot;
68
+ let observation;
69
+ const check = (signal) => { if (!open)
70
+ throw new Error('deCONZ command session is closed.'); signal?.throwIfAborted(); this.#active(operation); };
71
+ const write = async (path, patch, signal) => { check(signal); if (written)
72
+ throw new Error('deCONZ command permits one write attempt.'); written = true; observation = await this.#write(operation, path, patch, selectedSnapshot); return observation; };
73
+ const session = Object.freeze({
74
+ isHealthy: this.isHealthy,
75
+ getSnapshot: async (signal) => { check(signal); selectedSnapshot = await this.#snapshot(operation); return structuredClone(selectedSnapshot); },
76
+ setLightState: async (id, patch, signal) => write(`/lights/${this.#resourceId(id)}/state`, deconzLightStatePatch(patch), signal),
77
+ setGroupState: async (id, patch, signal) => write(`/groups/${this.#resourceId(id)}/action`, deconzGroupActionPatch(patch), signal),
78
+ setSensorConfig: async (id, patch, signal) => write(`/sensors/${this.#resourceId(id)}/config`, deconzSensorConfigPatch(patch), signal),
79
+ setSensorState: async (id, patch, signal) => write(`/sensors/${this.#resourceId(id)}/state`, this.#sensorPatch(patch), signal),
80
+ });
81
+ try {
82
+ const result = await this.#foreign(operation, () => workArg(session));
83
+ return { result, observation };
84
+ }
85
+ finally {
86
+ open = false;
87
+ }
88
+ }, signalArg);
93
89
  }
94
- async setSensorState(idArg, stateArg, signalArg) {
95
- const snapshot = await this.getSnapshot(signalArg);
96
- if (!snapshot.sensors[idArg]?.type?.startsWith('CLIP'))
97
- throw new Error('deCONZ sensor state is writable only for CLIP sensors.');
98
- deconzSensorStatePatch(snapshot.sensors[idArg].type, stateArg);
99
- await this.put(`/sensors/${this.resourceId(idArg)}/state`, stateArg, signalArg);
90
+ acquireApiKey(deviceTypeArg = 'smarthome.exchange', signalArg) {
91
+ deconzText(deviceTypeArg, 'client name', 40);
92
+ return this.#run(async (operation) => {
93
+ this.#permission('config', this.#config.bridgeId, ['pair', 'credentials:create']);
94
+ if (!this.canCreateCredential)
95
+ throw new Error('deCONZ pairing requires credential creation by the selected provider or encrypted store.');
96
+ await this.#basic(operation);
97
+ let dispatched = false;
98
+ try {
99
+ const result = await this.#request(operation, 'POST', '/api', { devicetype: deviceTypeArg }, () => { dispatched = true; });
100
+ if (!Array.isArray(result) || result.length !== 1 || !isDeconzRecord(result[0]) || !isDeconzRecord(result[0].success))
101
+ throw new Error('Invalid deCONZ pairing acknowledgement.');
102
+ return this.#key(result[0].success.username);
103
+ }
104
+ catch (error) {
105
+ if (error instanceof DeconzRequestError && error.apiErrorType === 101)
106
+ throw error;
107
+ if (dispatched)
108
+ throw new DeconzWriteError();
109
+ throw error;
110
+ }
111
+ }, signalArg);
100
112
  }
101
- async recallScene(groupIdArg, sceneIdArg, signalArg) {
102
- await this.put(`/groups/${this.resourceId(groupIdArg)}/scenes/${this.resourceId(sceneIdArg)}/recall`, {}, signalArg);
113
+ createCredential(apiKeyArg, signalArg) {
114
+ const apiKey = this.#key(apiKeyArg);
115
+ return this.#run(async (operation) => {
116
+ this.#permission('config', this.#config.bridgeId, ['credentials:create']);
117
+ if (!this.canCreateCredential)
118
+ throw new Error('deCONZ credential creation is unavailable.');
119
+ await this.#snapshot(operation, apiKey);
120
+ const request = this.#credentialRequest(operation);
121
+ let dispatched = false;
122
+ try {
123
+ if (this.#options.credentialProvider?.create)
124
+ await this.#foreign(operation, () => { dispatched = true; return this.#options.credentialProvider.create(request, apiKey); });
125
+ else {
126
+ await this.#foreign(operation, () => this.#store.initialize({ signal: operation.signal }));
127
+ await this.#foreign(operation, () => { dispatched = true; return this.#store.create(this.#storeKey(), { version: 1, homeId: request.homeId, origin: request.origin, bridgeId: request.bridgeId, credentialReference: request.credentialReference, apiKey }); });
128
+ }
129
+ this.#active(operation);
130
+ }
131
+ catch (error) {
132
+ if (dispatched)
133
+ throw new DeconzWriteError();
134
+ throw error;
135
+ }
136
+ }, signalArg);
103
137
  }
138
+ async setLightState(idArg, patchArg, signalArg) { return this.put(`/lights/${this.#resourceId(idArg)}/state`, deconzLightStatePatch(patchArg), signalArg); }
139
+ async setGroupState(idArg, patchArg, signalArg) { return this.put(`/groups/${this.#resourceId(idArg)}/action`, deconzGroupActionPatch(patchArg), signalArg); }
140
+ async setSensorConfig(idArg, patchArg, signalArg) { return this.put(`/sensors/${this.#resourceId(idArg)}/config`, deconzSensorConfigPatch(patchArg), signalArg); }
141
+ async setSensorState(idArg, patchArg, signalArg) { return this.put(`/sensors/${this.#resourceId(idArg)}/state`, this.#sensorPatch(patchArg), signalArg); }
142
+ async recallScene(groupIdArg, sceneIdArg, signalArg) { return this.put(`/groups/${this.#resourceId(groupIdArg)}/scenes/${this.#resourceId(sceneIdArg)}/recall`, {}, signalArg); }
104
143
  async put(pathArg, dataArg, signalArg) {
105
- const result = await this.requestJson('PUT', pathArg, dataArg, signalArg);
106
- this.assertWriteAcknowledgement(result, pathArg);
107
- return result;
144
+ const match = /^\/(lights|groups|sensors)\/([a-z0-9_-]+)\/(state|action|config)$/i.exec(pathArg);
145
+ const scene = /^\/groups\/([a-z0-9_-]+)\/scenes\/([a-z0-9_-]+)\/recall$/i.exec(pathArg);
146
+ if (!match && !scene)
147
+ throw new Error('Unsupported deCONZ command path.');
148
+ const patch = scene ? deconzData(dataArg, []) : match[1] === 'lights' && match[3] === 'state' ? deconzLightStatePatch(dataArg) : match[1] === 'groups' && match[3] === 'action' ? deconzGroupActionPatch(dataArg) : match[1] === 'sensors' && match[3] === 'config' ? deconzSensorConfigPatch(dataArg) : match[1] === 'sensors' && match[3] === 'state' ? this.#sensorPatch(dataArg) : undefined;
149
+ if (!patch)
150
+ throw new Error('Unsupported deCONZ command endpoint.');
151
+ return this.#run((operation) => this.#write(operation, pathArg, patch), signalArg);
108
152
  }
109
153
  async post(pathArg, dataArg, signalArg) {
110
- const result = await this.requestJson('POST', pathArg, dataArg, signalArg);
111
- this.assertWriteAcknowledgement(result);
112
- return result;
154
+ void pathArg;
155
+ void dataArg;
156
+ void signalArg;
157
+ throw new Error('deCONZ arbitrary creation requires a supported current control contract.');
113
158
  }
114
- async subscribeToEvents(handlerArg, abortSignalArg, errorHandlerArg) {
115
- this.assertActive(abortSignalArg);
116
- if (this.config.enableWebSocket === false)
117
- return async () => { };
118
- if (!this.endpoint)
119
- throw new Error('deCONZ WebSocket requires a live gateway endpoint.');
120
- if (typeof globalThis.WebSocket !== 'function')
121
- throw new Error('deCONZ requires native WebSocket support.');
122
- const port = this.config.websocketPort ?? (await this.getGatewayConfig(abortSignalArg)).websocketport;
123
- this.assertActive(abortSignalArg);
124
- if (port === undefined)
125
- throw new Error('deCONZ gateway did not advertise a WebSocket port.');
126
- const websocketUrl = new URL(this.endpoint);
127
- websocketUrl.protocol = 'ws:';
128
- websocketUrl.port = String(deconzPort(port));
129
- const socket = new WebSocket(websocketUrl);
130
- const signal = AbortSignal.any([this.lifetime.signal, ...(this.abortSignal ? [this.abortSignal] : []), ...(abortSignalArg ? [abortSignalArg] : [])]);
131
- let closing = false;
132
- let closePromise;
133
- let opened = false;
134
- let resolveOpen = () => { };
135
- let rejectOpen = () => { };
136
- const ready = new Promise((resolveArg, rejectArg) => { resolveOpen = resolveArg; rejectOpen = rejectArg; });
137
- const report = (messageArg) => {
138
- this.streamHealthy = false;
139
- const error = new Error(messageArg);
140
- if (!opened)
141
- rejectOpen(error);
142
- else if (!closing)
143
- errorHandlerArg?.(error);
144
- };
145
- const message = (eventArg) => {
146
- if (closing || signal.aborted)
147
- return;
148
- let event;
149
- try {
150
- if (typeof eventArg.data !== 'string' || eventArg.data.length > 1048576)
151
- throw new Error('Invalid message.');
152
- event = deconzWebsocketEvent(JSON.parse(eventArg.data));
153
- }
154
- catch {
155
- report('deCONZ WebSocket received an invalid event.');
156
- return;
157
- }
158
- handlerArg(event);
159
- };
160
- const onOpen = () => { opened = true; this.streamHealthy = true; resolveOpen(); };
161
- const onError = () => report('deCONZ WebSocket connection failed.');
162
- const onClose = () => {
163
- if (!closing)
164
- report('deCONZ WebSocket connection closed.');
165
- cleanup();
166
- };
167
- const onAbort = () => {
168
- rejectOpen(new Error('deCONZ subscription cancelled.'));
169
- void close().catch(() => {
170
- this.streamHealthy = false;
171
- errorHandlerArg?.(new Error('deCONZ WebSocket cleanup failed.'));
172
- });
173
- };
174
- const cleanup = () => {
175
- socket.removeEventListener('open', onOpen);
176
- socket.removeEventListener('message', message);
177
- socket.removeEventListener('error', onError);
178
- socket.removeEventListener('close', onClose);
179
- signal.removeEventListener('abort', onAbort);
180
- this.subscriptions.delete(close);
181
- };
182
- const close = () => {
183
- if (closePromise)
184
- return closePromise;
185
- closing = true;
186
- socket.removeEventListener('message', message);
187
- if (socket.readyState === WebSocket.CLOSED) {
188
- cleanup();
189
- return Promise.resolve();
190
- }
191
- closePromise = new Promise((resolveArg, rejectArg) => {
192
- const closed = () => { clearTimeout(timer); socket.removeEventListener('close', closed); cleanup(); resolveArg(); };
193
- const timer = setTimeout(() => {
194
- socket.removeEventListener('close', closed);
195
- closePromise = undefined;
196
- rejectArg(new Error('deCONZ WebSocket close timed out.'));
197
- }, this.timeoutMs);
198
- socket.addEventListener('close', closed, { once: true });
199
- socket.close();
200
- });
201
- return closePromise;
202
- };
203
- this.subscriptions.add(close);
204
- socket.addEventListener('open', onOpen, { once: true });
205
- socket.addEventListener('message', message);
206
- socket.addEventListener('error', onError);
207
- socket.addEventListener('close', onClose, { once: true });
208
- signal.addEventListener('abort', onAbort, { once: true });
209
- const timer = setTimeout(() => rejectOpen(new Error('deCONZ WebSocket open timed out.')), this.timeoutMs);
159
+ subscribeToEvents(handlerArg, signalArg, errorHandlerArg) {
160
+ if (typeof handlerArg !== 'function' || errorHandlerArg !== undefined && typeof errorHandlerArg !== 'function')
161
+ throw new TypeError('deCONZ subscriber requires data functions.');
162
+ let resolveSubscription = () => { };
163
+ let rejectSubscription = () => { };
164
+ let issued = false;
165
+ const subscribed = new Promise((resolve, reject) => { resolveSubscription = resolve; rejectSubscription = reject; });
166
+ let admitted;
210
167
  try {
211
- if (signal.aborted)
212
- onAbort();
213
- await ready;
214
- this.assertActive(abortSignalArg);
215
- return close;
168
+ admitted = this.#run(async (operation) => {
169
+ if (this.#config.enableWebSocket === false) {
170
+ issued = true;
171
+ resolveSubscription(async () => { });
172
+ return;
173
+ }
174
+ const config = (await this.#snapshot(operation)).config;
175
+ const port = config.websocketport;
176
+ if (port === undefined)
177
+ throw new Error('deCONZ gateway did not advertise a WebSocket port.');
178
+ this.#active(operation);
179
+ if (typeof globalThis.WebSocket !== 'function')
180
+ throw new Error('deCONZ requires native WebSocket support.');
181
+ const url = new URL(this.#endpoint);
182
+ url.protocol = 'ws:';
183
+ url.port = String(deconzPort(port));
184
+ const signal = AbortSignal.any([this.#lifetime.signal, this.#owner.signal, ...(this.#context.abortSignal ? [this.#context.abortSignal] : []), ...(signalArg ? [signalArg] : [])]);
185
+ const callbacks = new Set();
186
+ let closing = false;
187
+ let opened = false;
188
+ let closePromise;
189
+ let closeFailed = false;
190
+ let resolveOpen = () => { };
191
+ let rejectOpen = () => { };
192
+ const ready = new Promise((resolve, reject) => { resolveOpen = resolve; rejectOpen = reject; });
193
+ // Keep the subscription's actual lifetime on the shared lease after the caller receives its close handle.
194
+ let releaseLifetime = () => { };
195
+ const lifetime = new Promise((resolve) => { releaseLifetime = resolve; });
196
+ operation.actual.add(lifetime);
197
+ void lifetime.then(() => operation.actual.delete(lifetime));
198
+ let socket;
199
+ try {
200
+ socket = new WebSocket(url);
201
+ }
202
+ catch {
203
+ releaseLifetime();
204
+ throw new Error('deCONZ WebSocket allocation failed.');
205
+ }
206
+ const cleanup = () => {
207
+ socket.removeEventListener('open', onOpen);
208
+ socket.removeEventListener('message', message);
209
+ socket.removeEventListener('error', onError);
210
+ socket.removeEventListener('close', onClose);
211
+ signal.removeEventListener('abort', onAbort);
212
+ };
213
+ const subscription = { close: (retryArg = false) => {
214
+ if (retryArg && closeFailed) {
215
+ closePromise = undefined;
216
+ closeFailed = false;
217
+ }
218
+ if (!closePromise) {
219
+ closing = true;
220
+ closePromise = Promise.resolve().then(async () => {
221
+ const closed = socket.readyState === WebSocket.CLOSED ? Promise.resolve() : new Promise((resolve, reject) => {
222
+ const done = () => { clearTimeout(timer); socket.removeEventListener('close', done); resolve(); };
223
+ const timer = setTimeout(() => { socket.removeEventListener('close', done); reject(new Error('deCONZ WebSocket close timed out.')); }, this.#config.requestTimeoutMs);
224
+ socket.addEventListener('close', done, { once: true });
225
+ try {
226
+ socket.close();
227
+ }
228
+ catch {
229
+ clearTimeout(timer);
230
+ socket.removeEventListener('close', done);
231
+ reject(new Error('deCONZ WebSocket close failed.'));
232
+ }
233
+ });
234
+ const [closedResult] = await Promise.allSettled([closed, ...callbacks]);
235
+ const errors = closedResult.status === 'rejected' ? [closedResult] : [];
236
+ if (errors.length)
237
+ throw new AggregateError(errors.map(() => new Error('deCONZ subscription cleanup failed.')), 'deCONZ subscription cleanup failed.');
238
+ cleanup();
239
+ this.#subscriptions.delete(subscription);
240
+ });
241
+ void closePromise.then(releaseLifetime, () => { closeFailed = true; releaseLifetime(); });
242
+ }
243
+ return closePromise;
244
+ } };
245
+ this.#subscriptions.add(subscription);
246
+ const invoke = (work) => {
247
+ if (closing || signal.aborted)
248
+ return;
249
+ let callback;
250
+ try {
251
+ callback = this.#run((leaseOperation) => this.#foreign(leaseOperation, async () => {
252
+ try {
253
+ await work();
254
+ }
255
+ catch {
256
+ this.#callbackFailures.add(new Error('deCONZ subscriber failed.'));
257
+ this.#streamHealthy = false;
258
+ throw new Error('deCONZ subscriber failed.');
259
+ }
260
+ }));
261
+ }
262
+ catch {
263
+ this.#callbackFailures.add(new Error('deCONZ subscriber admission failed.'));
264
+ this.#streamHealthy = false;
265
+ return;
266
+ }
267
+ callbacks.add(callback);
268
+ void callback.then(() => callbacks.delete(callback), () => { callbacks.delete(callback); if (!closing && !signal.aborted) {
269
+ this.#callbackFailures.add(new Error('deCONZ subscriber failed.'));
270
+ this.#streamHealthy = false;
271
+ } });
272
+ };
273
+ const report = (messageArg) => { this.#streamHealthy = false; const error = new Error(messageArg); if (!opened)
274
+ rejectOpen(error);
275
+ else if (errorHandlerArg)
276
+ invoke(() => errorHandlerArg(error)); };
277
+ const message = (eventArg) => {
278
+ if (closing || signal.aborted)
279
+ return;
280
+ try {
281
+ if (typeof eventArg.data !== 'string' || eventArg.data.length > 1048576)
282
+ throw new Error('Invalid deCONZ event.');
283
+ const event = deconzWebsocketEvent(JSON.parse(eventArg.data));
284
+ invoke(() => handlerArg(event));
285
+ }
286
+ catch {
287
+ report('deCONZ WebSocket received an invalid event.');
288
+ }
289
+ };
290
+ const onOpen = () => { opened = true; this.#streamHealthy = true; resolveOpen(); };
291
+ const onError = () => report('deCONZ WebSocket connection failed.');
292
+ const onClose = () => { if (!closing) {
293
+ report('deCONZ WebSocket connection closed.');
294
+ void subscription.close().catch(() => { this.#streamHealthy = false; });
295
+ } };
296
+ const onAbort = () => { rejectOpen(new Error('deCONZ subscription cancelled.')); void subscription.close().catch(() => { this.#streamHealthy = false; }); };
297
+ const onDeadline = () => rejectOpen(this.#cancelled(operation));
298
+ socket.addEventListener('open', onOpen, { once: true });
299
+ socket.addEventListener('message', message);
300
+ socket.addEventListener('error', onError);
301
+ socket.addEventListener('close', onClose);
302
+ signal.addEventListener('abort', onAbort, { once: true });
303
+ operation.signal.addEventListener('abort', onDeadline, { once: true });
304
+ try {
305
+ await this.#foreign(operation, () => ready);
306
+ this.#active(operation);
307
+ if (signal.aborted)
308
+ throw new Error('deCONZ subscription cancelled.');
309
+ issued = true;
310
+ resolveSubscription(async () => { await subscription.close(); await admitted; });
311
+ }
312
+ catch (error) {
313
+ await subscription.close();
314
+ throw error;
315
+ }
316
+ finally {
317
+ operation.signal.removeEventListener('abort', onDeadline);
318
+ }
319
+ }, signalArg);
216
320
  }
217
321
  catch (error) {
218
- await close();
219
- throw error;
322
+ rejectSubscription(error);
323
+ return subscribed;
220
324
  }
221
- finally {
222
- clearTimeout(timer);
325
+ void admitted.then(() => { if (!issued)
326
+ rejectSubscription(new Error('deCONZ subscription failed.')); }, (error) => { if (!issued)
327
+ rejectSubscription(error);
328
+ else {
329
+ this.#callbackFailures.add(new Error('deCONZ subscription lifecycle failed.'));
330
+ this.#streamHealthy = false;
331
+ } });
332
+ return subscribed;
333
+ }
334
+ destroy() {
335
+ if (!this.#closePromise) {
336
+ this.#closePromise = Promise.resolve().then(() => this.#drain(false));
337
+ this.#lifetime.abort();
338
+ if (this.#onAbort)
339
+ this.#context.abortSignal.removeEventListener('abort', this.#onAbort);
223
340
  }
341
+ return this.#closePromise;
224
342
  }
225
- async destroy() {
226
- this.lifetime.abort();
227
- const results = await Promise.allSettled([...this.subscriptions].map((closeArg) => closeArg()));
228
- await Promise.allSettled([...this.operations]);
229
- const failures = results.filter((resultArg) => resultArg.status === 'rejected');
230
- if (failures.length)
231
- throw new AggregateError(failures.map((failureArg) => failureArg.reason), 'deCONZ cleanup failed.');
343
+ retryCleanup() {
344
+ if (!this.#closePromise)
345
+ throw new Error('deCONZ cleanup retry requires a terminal client.');
346
+ if (!this.#retryPromise) {
347
+ this.#retryPromise = Promise.resolve().then(async () => { await this.#closePromise.catch(() => undefined); await this.#drain(true); });
348
+ const settled = () => { this.#retryPromise = undefined; };
349
+ void this.#retryPromise.then(settled, settled);
350
+ }
351
+ return this.#retryPromise;
232
352
  }
233
- requestJson(methodArg, pathArg, dataArg, signalArg, pairingArg = false) {
234
- this.assertActive(signalArg);
235
- if (!this.endpoint || !pairingArg && !this.config.apiKey)
236
- throw new Error('deCONZ live requests require a host and API key.');
237
- if (pathArg && (!/^\/[a-z0-9/%_-]+$/i.test(pathArg) || pathArg.includes('..')))
238
- throw new Error('Invalid deCONZ request path.');
239
- const url = new URL(this.endpoint);
240
- url.pathname = pairingArg ? '/api' : `/api/${encodeURIComponent(this.config.apiKey)}${pathArg}`;
241
- const operation = this.fetchJson(url, methodArg, dataArg, signalArg);
242
- this.operations.add(operation);
243
- void operation.then(() => this.operations.delete(operation), () => this.operations.delete(operation));
244
- return operation;
353
+ async #drain(retryArg) {
354
+ if (retryArg)
355
+ this.#callbackFailures.clear();
356
+ const results = await Promise.allSettled([...this.#subscriptions].map((subscription) => subscription.close(retryArg)));
357
+ await Promise.allSettled([...this.#operations]);
358
+ const other = await Promise.allSettled([...(this.#ownsStore && this.#store ? [retryArg ? this.#store.retryCleanup() : this.#store.close()] : []), ...(this.#ownsOwner ? [retryArg ? this.#owner.retryCleanup() : this.#owner.close()] : [])]);
359
+ const errors = [...results, ...other].filter((result) => result.status === 'rejected').map(() => new Error('deCONZ cleanup failed.'));
360
+ errors.push(...this.#callbackFailures);
361
+ if (errors.length)
362
+ throw new AggregateError(errors, 'deCONZ cleanup failed; handles remain retained for explicit retry.');
245
363
  }
246
- async fetchJson(urlArg, methodArg, dataArg, signalArg) {
247
- const deadline = new AbortController();
248
- const timer = setTimeout(() => deadline.abort(), this.timeoutMs);
249
- const signal = AbortSignal.any([deadline.signal, this.lifetime.signal, ...(this.abortSignal ? [this.abortSignal] : []), ...(signalArg ? [signalArg] : [])]);
250
- try {
251
- const response = await fetch(urlArg, { method: methodArg, redirect: 'error', signal, headers: dataArg ? { 'content-type': 'application/json' } : undefined, body: dataArg ? JSON.stringify(dataArg) : undefined });
252
- if (!response.ok) {
253
- await response.body?.cancel();
254
- throw new DeconzRequestError(`deCONZ request failed with HTTP ${response.status}.`);
255
- }
256
- const reader = response.body?.getReader();
257
- if (!reader)
258
- throw new DeconzRequestError('Empty deCONZ response.');
259
- const chunks = [];
260
- let length = 0;
364
+ #run(workArg, signalArg) {
365
+ if (this.#closePromise || this.#lifetime.signal.aborted)
366
+ throw new DeconzRequestError('deCONZ request cancelled.');
367
+ const operation = this.#owner.runOperation(this.#context, this.#config.homeId, async (lease) => {
368
+ const deadlineAbort = new AbortController();
369
+ const deadline = performance.now() + this.#config.requestTimeoutMs;
370
+ const signal = AbortSignal.any([lease.signal, this.#lifetime.signal, deadlineAbort.signal, ...(signalArg ? [signalArg] : [])]);
371
+ const actual = new Set();
372
+ lease.own(async () => { while (actual.size)
373
+ await Promise.allSettled([...actual]); });
374
+ const timer = setTimeout(() => deadlineAbort.abort(new DeconzRequestError('deCONZ request timed out.')), this.#config.requestTimeoutMs);
261
375
  try {
262
- while (true) {
263
- const chunk = await reader.read();
264
- if (chunk.done)
265
- break;
266
- length += chunk.value.length;
267
- if (length > 8388608) {
268
- await reader.cancel();
269
- throw new DeconzRequestError('deCONZ response exceeds the size limit.');
270
- }
271
- chunks.push(chunk.value);
272
- }
376
+ return await workArg({ lease, signal, deadline, actual });
273
377
  }
274
378
  finally {
275
- reader.releaseLock();
276
- }
277
- const bytes = new Uint8Array(length);
278
- let offset = 0;
279
- for (const chunk of chunks) {
280
- bytes.set(chunk, offset);
281
- offset += chunk.length;
282
- }
283
- let result;
284
- try {
285
- result = JSON.parse(new TextDecoder().decode(bytes));
286
- }
287
- catch {
288
- throw new DeconzRequestError('Invalid deCONZ JSON response.');
289
- }
290
- if (Array.isArray(result)) {
291
- for (const item of result) {
292
- if (isDeconzRecord(item) && isDeconzRecord(item.error)) {
293
- const type = typeof item.error.type === 'number' && Number.isInteger(item.error.type) ? item.error.type : undefined;
294
- throw new DeconzRequestError('deCONZ rejected the request.', type);
295
- }
296
- }
379
+ clearTimeout(timer);
297
380
  }
381
+ });
382
+ this.#operations.add(operation);
383
+ void operation.then(() => this.#operations.delete(operation), () => this.#operations.delete(operation));
384
+ return operation;
385
+ }
386
+ async #foreign(operationArg, workArg, transportArg = false) {
387
+ this.#active(operationArg);
388
+ if (operationArg.actual.size >= 16)
389
+ throw new Error('deCONZ actual callback capacity reached.');
390
+ const actual = Promise.resolve().then(() => { this.#active(operationArg); return workArg(); });
391
+ operationArg.actual.add(actual);
392
+ void actual.then(() => operationArg.actual.delete(actual), () => operationArg.actual.delete(actual));
393
+ let abort = () => { };
394
+ const cancelled = new Promise((resolve, reject) => { void resolve; abort = () => reject(this.#cancelled(operationArg)); operationArg.signal.addEventListener('abort', abort, { once: true }); if (operationArg.signal.aborted)
395
+ abort(); });
396
+ try {
397
+ const result = await Promise.race([actual, cancelled]);
398
+ this.#active(operationArg);
298
399
  return result;
299
400
  }
300
401
  catch (error) {
301
- if (signal.aborted)
302
- throw new DeconzRequestError(deadline.signal.aborted ? 'deCONZ request timed out.' : 'deCONZ request cancelled.');
303
- if (error instanceof DeconzRequestError)
402
+ if (operationArg.signal.aborted)
403
+ throw this.#cancelled(operationArg);
404
+ if (error instanceof DeconzWriteError)
405
+ throw new DeconzWriteError();
406
+ if (transportArg && error instanceof DeconzRequestError)
304
407
  throw error;
305
- throw new DeconzRequestError('deCONZ network request failed.');
408
+ throw new Error('deCONZ operation failed.');
306
409
  }
307
410
  finally {
308
- clearTimeout(timer);
411
+ operationArg.signal.removeEventListener('abort', abort);
309
412
  }
310
413
  }
311
- assertWriteAcknowledgement(valueArg, pathArg) {
312
- const entries = Array.isArray(valueArg) ? valueArg : [valueArg];
313
- if (!entries.length || entries.some((entryArg) => !isDeconzRecord(entryArg) || !isDeconzRecord(entryArg.success) || !Object.keys(entryArg.success).length)) {
314
- throw new Error('Invalid deCONZ write acknowledgement.');
414
+ #active(operationArg) { if (operationArg.signal.aborted || performance.now() >= operationArg.deadline || this.#closePromise)
415
+ throw this.#cancelled(operationArg); operationArg.lease.assertOpen(); }
416
+ #cancelled(operationArg) { return new DeconzRequestError(performance.now() >= operationArg.deadline || operationArg.signal.reason instanceof DeconzRequestError && operationArg.signal.reason.message === 'deCONZ request timed out.' ? 'deCONZ request timed out.' : 'deCONZ request cancelled.'); }
417
+ #credentialRequest(operationArg) { return Object.freeze({ homeId: this.#context.homeId, origin: this.#endpoint.origin, bridgeId: this.#config.bridgeId, credentialReference: this.#config.credentialReference, signal: operationArg.signal, deadline: operationArg.deadline }); }
418
+ #storeKey() { return `deconz.credential.${encodeURIComponent(this.#config.credentialReference)}`; }
419
+ async #credential(operationArg) {
420
+ const request = this.#credentialRequest(operationArg);
421
+ if (this.#options.credentialProvider)
422
+ return this.#key(await this.#foreign(operationArg, () => this.#options.credentialProvider.resolve(request)));
423
+ await this.#foreign(operationArg, () => this.#store.initialize({ signal: operationArg.signal }));
424
+ const envelope = deconzData(await this.#foreign(operationArg, () => this.#store.get(this.#storeKey())), ['version', 'homeId', 'origin', 'bridgeId', 'credentialReference', 'apiKey']);
425
+ if (envelope.version !== 1 || envelope.homeId !== request.homeId || envelope.origin !== request.origin || envelope.bridgeId !== request.bridgeId || envelope.credentialReference !== request.credentialReference)
426
+ throw new Error('deCONZ credential reference does not match the selected home and bridge.');
427
+ return this.#key(envelope.apiKey);
428
+ }
429
+ #key(valueArg) { return deconzText(valueArg, 'resolved credential', 256); }
430
+ async #basic(operationArg) { const config = deconzGatewayConfig(await this.#request(operationArg, 'GET', '/api/config')); this.#identity(config); return config; }
431
+ async #snapshot(operationArg, keyArg) {
432
+ try {
433
+ await this.#basic(operationArg);
434
+ const key = keyArg ?? await this.#credential(operationArg);
435
+ const snapshot = deconzSnapshot(await this.#request(operationArg, 'GET', `/api/${encodeURIComponent(key)}`));
436
+ this.#identity(snapshot.config);
437
+ this.#active(operationArg);
438
+ this.#gatewayHealthy = true;
439
+ return { ...snapshot, homeId: this.#context.homeId };
315
440
  }
316
- if (pathArg && entries.some((entryArg) => isDeconzRecord(entryArg) && isDeconzRecord(entryArg.success) && Object.keys(entryArg.success).some((addressArg) => addressArg !== pathArg && !addressArg.startsWith(`${pathArg}/`)))) {
317
- throw new Error('deCONZ write acknowledgement addresses a different resource.');
441
+ catch (error) {
442
+ this.#gatewayHealthy = false;
443
+ throw error;
318
444
  }
319
445
  }
320
- assertActive(signalArg) {
321
- if (this.lifetime.signal.aborted || this.abortSignal?.aborted || signalArg?.aborted)
322
- throw new Error('deCONZ operation cancelled.');
446
+ #identity(configArg) { if (configArg.bridgeid?.toLowerCase() !== this.#config.bridgeId && configArg.uuid?.toLowerCase() !== this.#config.bridgeId) {
447
+ this.#streamHealthy = false;
448
+ throw new Error('deCONZ gateway identity does not match configuration.');
449
+ } }
450
+ #permission(resourceArg, idArg, fieldsArg) {
451
+ if (!this.#options.controlPermissions?.some((permission) => permission.resource === resourceArg && permission.resourceId === idArg && fieldsArg.every((field) => permission.fields.includes(field))))
452
+ throw new Error('deCONZ control requires exact owner authorization.');
453
+ }
454
+ #sensorPatch(valueArg) {
455
+ return deconzData(valueArg, ['alarm', 'battery', 'carbonmonoxide', 'consumption', 'current', 'dark', 'daylight', 'fire', 'flag', 'humidity', 'lightlevel', 'lux', 'open', 'power', 'presence', 'duration', 'pressure', 'status', 'temperature', 'vibration', 'voltage', 'water', 'buttonevent']);
323
456
  }
324
- assertGatewayIdentity(configArg) {
325
- const identity = (configArg.bridgeid ?? configArg.uuid)?.toLowerCase();
326
- const expected = this.config.bridgeId?.toLowerCase();
327
- if (expected && configArg.bridgeid?.toLowerCase() !== expected && configArg.uuid?.toLowerCase() !== expected || this.gatewayId && identity !== this.gatewayId) {
328
- this.streamHealthy = false;
329
- throw new Error('deCONZ gateway identity does not match configuration.');
457
+ async #write(operationArg, pathArg, patchArg, selectedArg) {
458
+ await this.#basic(operationArg);
459
+ const key = await this.#credential(operationArg);
460
+ const snapshot = await this.#snapshot(operationArg, key);
461
+ const parts = pathArg.split('/');
462
+ const resource = parts[1];
463
+ const id = parts[2];
464
+ const section = parts[3];
465
+ if (selectedArg && (resource === 'lights' || resource === 'sensors')) {
466
+ const current = snapshot[resource][id];
467
+ const selected = selectedArg[resource][id];
468
+ if (!selected || !current || selected.uniqueid !== current.uniqueid || selected.type !== current.type)
469
+ throw new Error('deCONZ selected resource changed before dispatch.');
470
+ }
471
+ if (selectedArg && resource === 'groups' && JSON.stringify(selectedArg.groups[id]?.lights) !== JSON.stringify(snapshot.groups[id]?.lights))
472
+ throw new Error('deCONZ selected group membership changed before dispatch.');
473
+ if (section === 'scenes') {
474
+ this.#permission('scenes', `${id}/${parts[4]}`, ['recall']);
475
+ if (snapshot.config?.rfconnected === false || !snapshot.groups[id]?.lights?.length || !Object.values(snapshot.groups[id].scenes ?? {}).some((scene) => scene.id === parts[4]))
476
+ throw new Error('deCONZ scene is not currently available.');
477
+ }
478
+ else {
479
+ this.#permission(resource, id, Object.keys(patchArg));
480
+ if (resource === 'sensors' && section === 'state')
481
+ deconzSensorStatePatch(snapshot.sensors[id]?.type, patchArg);
482
+ deconzCurrentPatch(snapshot, resource, id, section, patchArg);
483
+ }
484
+ let dispatched = false;
485
+ try {
486
+ const result = await this.#request(operationArg, 'PUT', `/api/${encodeURIComponent(key)}${pathArg}`, patchArg, () => { dispatched = true; });
487
+ this.#acknowledgement(result, pathArg);
488
+ const observedState = await this.#snapshot(operationArg);
489
+ return { effectOutcome: 'accepted', observedState, causalityConfirmed: false, physicalCompletion: 'unconfirmed' };
490
+ }
491
+ catch (error) {
492
+ this.#gatewayHealthy = false;
493
+ if (dispatched)
494
+ throw new DeconzWriteError();
495
+ throw error;
330
496
  }
331
- this.gatewayId = identity;
332
497
  }
333
- resourceId(valueArg) {
334
- if (typeof valueArg !== 'string' || !/^[a-z0-9_-]+$/i.test(valueArg))
335
- throw new Error('Invalid deCONZ resource identity.');
336
- return encodeURIComponent(valueArg);
498
+ #resourceId(valueArg) { if (typeof valueArg !== 'string' || !/^[a-z0-9_-]+$/i.test(valueArg))
499
+ throw new Error('Invalid deCONZ resource identity.'); return valueArg; }
500
+ #acknowledgement(valueArg, pathArg) {
501
+ const entries = Array.isArray(valueArg) ? valueArg : [valueArg];
502
+ if (!entries.length || entries.some((entry) => !isDeconzRecord(entry) || !isDeconzRecord(entry.success) || !Object.keys(entry.success).length || Object.keys(entry.success).some((address) => address !== pathArg && !address.startsWith(`${pathArg}/`))))
503
+ throw new Error('Invalid deCONZ write acknowledgement.');
504
+ }
505
+ async #request(operationArg, methodArg, pathArg, dataArg, dispatchArg) {
506
+ const url = new URL(this.#endpoint);
507
+ url.pathname = pathArg;
508
+ return this.#foreign(operationArg, async () => {
509
+ try {
510
+ dispatchArg?.();
511
+ const response = await fetch(url, { method: methodArg, redirect: 'error', signal: operationArg.signal, headers: dataArg ? { 'content-type': 'application/json' } : undefined, body: dataArg ? JSON.stringify(dataArg) : undefined });
512
+ if (!response.ok) {
513
+ await response.body?.cancel();
514
+ throw new DeconzRequestError(`deCONZ request failed with HTTP ${response.status}.`);
515
+ }
516
+ const reader = response.body?.getReader();
517
+ if (!reader)
518
+ throw new DeconzRequestError('Empty deCONZ response.');
519
+ const chunks = [];
520
+ let length = 0;
521
+ try {
522
+ while (true) {
523
+ const chunk = await reader.read();
524
+ if (chunk.done)
525
+ break;
526
+ length += chunk.value.length;
527
+ if (length > 8388608) {
528
+ await reader.cancel();
529
+ throw new DeconzRequestError('deCONZ response exceeds the size limit.');
530
+ }
531
+ chunks.push(chunk.value);
532
+ }
533
+ }
534
+ finally {
535
+ reader.releaseLock();
536
+ }
537
+ const bytes = new Uint8Array(length);
538
+ let offset = 0;
539
+ for (const chunk of chunks) {
540
+ bytes.set(chunk, offset);
541
+ offset += chunk.length;
542
+ }
543
+ let result;
544
+ try {
545
+ result = JSON.parse(new TextDecoder().decode(bytes));
546
+ }
547
+ catch {
548
+ throw new DeconzRequestError('Invalid deCONZ JSON response.');
549
+ }
550
+ if (Array.isArray(result))
551
+ for (const item of result)
552
+ if (isDeconzRecord(item) && isDeconzRecord(item.error))
553
+ throw new DeconzRequestError('deCONZ rejected the request.', typeof item.error.type === 'number' && Number.isInteger(item.error.type) ? item.error.type : undefined);
554
+ return result;
555
+ }
556
+ catch (error) {
557
+ if (operationArg.signal.aborted)
558
+ throw this.#cancelled(operationArg);
559
+ if (error instanceof DeconzRequestError)
560
+ throw error;
561
+ throw new DeconzRequestError('deCONZ network request failed.');
562
+ }
563
+ }, true);
337
564
  }
338
565
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb256LmNsYXNzZXMuY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL2RlY29uei9kZWNvbnouY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9PLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxLQUFLO0lBQ0ssWUFBWTtJQUE1RCxZQUFZLFVBQWtCLEVBQWtCLFlBQXFCO1FBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUEzQyxZQUFZO0lBQWdDLENBQUM7Q0FDOUY7QUFFRCxNQUFNLE9BQU8sWUFBWTtJQVdnQyxXQUFXO0lBVmpELE1BQU0sQ0FBZ0I7SUFDdEIsUUFBUSxDQUFPO0lBQ2YsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUN6QyxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDeEQsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFNBQVMsQ0FBVTtJQUUzQixZQUFZLFNBQXdCLEVBQW1CLFdBQXlCOzJCQUF6QixXQUFXO1FBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENB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
566
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb256LmNsYXNzZXMuY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL2RlY29uei9kZWNvbnouY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQThCLE1BQU0sOENBQThDLENBQUM7QUFJbEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeFUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDSyxZQUFZO0lBQTVELFlBQVksVUFBa0IsRUFBa0IsWUFBcUI7UUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQTNDLFlBQVk7SUFBZ0MsQ0FBQztDQUM5RjtBQUVELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pCLGFBQWEsR0FBRyxlQUF3QixDQUFDO0lBQ3pELGdCQUFnQixLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekY7QUFzQkQsNkZBQTZGO0FBQzdGLE1BQU0sT0FBTyxZQUFZO0lBQ2QsT0FBTyxDQUEwQjtJQUNqQyxRQUFRLENBQXNDO0lBQzlDLFFBQVEsQ0FBMEI7SUFDbEMsTUFBTSxDQUF5QjtJQUMvQixVQUFVLENBQVU7SUFDcEIsU0FBUyxDQUFNO0lBQ2YsU0FBUyxDQUFrQjtJQUMzQixXQUFXLEdBQUcsSUFB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