@smarthome.exchange/integrations 2.0.0 → 3.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 (245) hide show
  1. package/changelog.md +35 -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 +6 -1
  40. package/dist_ts/integrations/hue/hue.classes.client.js +120 -45
  41. package/dist_ts/integrations/hue/hue.classes.configflow.js +16 -7
  42. package/dist_ts/integrations/hue/hue.classes.integration.d.ts +2 -0
  43. package/dist_ts/integrations/hue/hue.classes.integration.js +103 -30
  44. package/dist_ts/integrations/hue/hue.validation.d.ts +1 -0
  45. package/dist_ts/integrations/hue/hue.validation.js +14 -4
  46. package/dist_ts/integrations/mqtt/mqtt.classes.client.d.ts +15 -2
  47. package/dist_ts/integrations/mqtt/mqtt.classes.client.js +173 -23
  48. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.d.ts +5 -1
  49. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.js +53 -33
  50. package/dist_ts/integrations/mqtt/mqtt.classes.integration.d.ts +4 -1
  51. package/dist_ts/integrations/mqtt/mqtt.classes.integration.js +127 -56
  52. package/dist_ts/integrations/mqtt/mqtt.classes.session.d.ts +13 -0
  53. package/dist_ts/integrations/mqtt/mqtt.classes.session.js +130 -0
  54. package/dist_ts/integrations/mqtt/mqtt.mapper.d.ts +3 -0
  55. package/dist_ts/integrations/mqtt/mqtt.mapper.js +44 -1
  56. package/dist_ts/integrations/mqtt/mqtt.types.d.ts +46 -0
  57. package/dist_ts/integrations/mqtt/mqtt.validation.d.ts +7 -0
  58. package/dist_ts/integrations/mqtt/mqtt.validation.js +180 -0
  59. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.d.ts +4 -2
  60. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.js +41 -16
  61. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.d.ts +5 -0
  62. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.js +20 -7
  63. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.d.ts +1 -0
  64. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.js +53 -50
  65. package/dist_ts/integrations/samsungtv/samsungtv.types.d.ts +4 -1
  66. package/dist_ts/integrations/shelly/shelly.classes.client.d.ts +26 -30
  67. package/dist_ts/integrations/shelly/shelly.classes.client.js +504 -276
  68. package/dist_ts/integrations/shelly/shelly.classes.configflow.d.ts +8 -3
  69. package/dist_ts/integrations/shelly/shelly.classes.configflow.js +43 -38
  70. package/dist_ts/integrations/shelly/shelly.classes.integration.d.ts +6 -6
  71. package/dist_ts/integrations/shelly/shelly.classes.integration.js +103 -101
  72. package/dist_ts/integrations/shelly/shelly.classes.subscription.d.ts +4 -0
  73. package/dist_ts/integrations/shelly/shelly.classes.subscription.js +24 -2
  74. package/dist_ts/integrations/shelly/shelly.mapper.d.ts +1 -2
  75. package/dist_ts/integrations/shelly/shelly.mapper.js +21 -20
  76. package/dist_ts/integrations/shelly/shelly.rpc.js +4 -1
  77. package/dist_ts/integrations/shelly/shelly.types.d.ts +42 -2
  78. package/dist_ts/integrations/shelly/shelly.types.js +11 -2
  79. package/dist_ts/integrations/shelly/shelly.validation.d.ts +7 -0
  80. package/dist_ts/integrations/shelly/shelly.validation.js +79 -0
  81. package/dist_ts/integrations/sonos/sonos.classes.client.d.ts +79 -22
  82. package/dist_ts/integrations/sonos/sonos.classes.client.js +427 -139
  83. package/dist_ts/integrations/sonos/sonos.classes.configflow.d.ts +9 -2
  84. package/dist_ts/integrations/sonos/sonos.classes.configflow.js +26 -28
  85. package/dist_ts/integrations/sonos/sonos.classes.integration.d.ts +7 -6
  86. package/dist_ts/integrations/sonos/sonos.classes.integration.js +289 -224
  87. package/dist_ts/integrations/sonos/sonos.config.d.ts +6 -1
  88. package/dist_ts/integrations/sonos/sonos.config.js +23 -2
  89. package/dist_ts/integrations/sonos/sonos.mapper.d.ts +1 -1
  90. package/dist_ts/integrations/sonos/sonos.mapper.js +14 -9
  91. package/dist_ts/integrations/sonos/sonos.matchers.js +3 -3
  92. package/dist_ts/integrations/sonos/sonos.types.d.ts +26 -1
  93. package/dist_ts/integrations/tasmota/tasmota.classes.integration.d.ts +5 -0
  94. package/dist_ts/integrations/tasmota/tasmota.classes.integration.js +23 -7
  95. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.d.ts +19 -5
  96. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.js +115 -41
  97. package/dist_ts/integrations/tasmota/tasmota.config.js +23 -1
  98. package/dist_ts/integrations/tasmota/tasmota.credentials.d.ts +11 -0
  99. package/dist_ts/integrations/tasmota/tasmota.credentials.js +97 -0
  100. package/dist_ts/integrations/tasmota/tasmota.discovery.d.ts +7 -1
  101. package/dist_ts/integrations/tasmota/tasmota.discovery.js +108 -30
  102. package/dist_ts/integrations/tasmota/tasmota.mapper.d.ts +2 -2
  103. package/dist_ts/integrations/tasmota/tasmota.mapper.js +7 -7
  104. package/dist_ts/integrations/tasmota/tasmota.types.d.ts +41 -2
  105. package/dist_ts/integrations/tuya/tuya.classes.integration.d.ts +4 -1
  106. package/dist_ts/integrations/tuya/tuya.classes.integration.js +79 -110
  107. package/dist_ts/integrations/tuya/tuya.classes.runtime.d.ts +5 -2
  108. package/dist_ts/integrations/tuya/tuya.classes.runtime.js +73 -26
  109. package/dist_ts/integrations/tuya/tuya.mapper.js +2 -2
  110. package/dist_ts/integrations/tuya/tuya.types.d.ts +3 -0
  111. package/dist_ts/integrations/tuya/tuya.validation.d.ts +2 -2
  112. package/dist_ts/integrations/tuya/tuya.validation.js +6 -11
  113. package/dist_ts/integrations/webostv/webostv.classes.client.d.ts +6 -5
  114. package/dist_ts/integrations/webostv/webostv.classes.client.js +147 -76
  115. package/dist_ts/integrations/webostv/webostv.classes.configflow.d.ts +7 -2
  116. package/dist_ts/integrations/webostv/webostv.classes.configflow.js +36 -20
  117. package/dist_ts/integrations/webostv/webostv.classes.integration.d.ts +4 -4
  118. package/dist_ts/integrations/webostv/webostv.classes.integration.js +46 -54
  119. package/dist_ts/integrations/webostv/webostv.mapper.js +5 -5
  120. package/dist_ts/integrations/webostv/webostv.types.d.ts +16 -3
  121. package/dist_ts/integrations/webostv/webostv.types.js +1 -1
  122. package/dist_ts/integrations/webostv/webostv.validation.d.ts +3 -1
  123. package/dist_ts/integrations/webostv/webostv.validation.js +23 -1
  124. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.d.ts +6 -1
  125. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.js +18 -8
  126. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.d.ts +4 -1
  127. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.js +54 -6
  128. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.d.ts +12 -6
  129. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.js +73 -59
  130. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.d.ts +3 -2
  131. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.js +17 -12
  132. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.d.ts +31 -2
  133. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.d.ts +9 -1
  134. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.js +57 -7
  135. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.d.ts +10 -4
  136. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.js +167 -31
  137. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.d.ts +6 -1
  138. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.js +57 -35
  139. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.d.ts +3 -1
  140. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.js +59 -37
  141. package/dist_ts/integrations/zwave_js/zwave_js.discovery.js +3 -3
  142. package/dist_ts/integrations/zwave_js/zwave_js.mapper.js +41 -24
  143. package/dist_ts/integrations/zwave_js/zwave_js.types.d.ts +25 -3
  144. package/dist_ts/integrations/zwave_js/zwave_js.validation.d.ts +6 -2
  145. package/dist_ts/integrations/zwave_js/zwave_js.validation.js +52 -17
  146. package/dist_ts/plugins.d.ts +2 -1
  147. package/dist_ts/plugins.js +3 -2
  148. package/package.json +8 -8
  149. package/readme.md +25 -6
  150. package/ts/00_commitinfo_data.ts +1 -1
  151. package/ts/core/classes.nativeintegrationowner.ts +5 -0
  152. package/ts/core/classes.runtimemanager.ts +11 -2
  153. package/ts/core/types.ts +2 -0
  154. package/ts/integrations/deconz/deconz.classes.client.ts +348 -252
  155. package/ts/integrations/deconz/deconz.classes.configflow.ts +57 -29
  156. package/ts/integrations/deconz/deconz.classes.integration.ts +69 -37
  157. package/ts/integrations/deconz/deconz.mapper.ts +22 -5
  158. package/ts/integrations/deconz/deconz.types.ts +49 -6
  159. package/ts/integrations/deconz/deconz.validation.ts +177 -4
  160. package/ts/integrations/deconz/readme.md +15 -1
  161. package/ts/integrations/esphome/esphome.classes.client.ts +179 -94
  162. package/ts/integrations/esphome/esphome.classes.configflow.ts +40 -33
  163. package/ts/integrations/esphome/esphome.classes.integration.ts +63 -36
  164. package/ts/integrations/esphome/esphome.discovery.ts +3 -12
  165. package/ts/integrations/esphome/esphome.mapper.ts +9 -7
  166. package/ts/integrations/esphome/esphome.types.ts +35 -6
  167. package/ts/integrations/esphome/esphome.validation.ts +66 -0
  168. package/ts/integrations/esphome/readme.md +20 -6
  169. package/ts/integrations/homeassistant/homeassistant.classes.client.ts +353 -125
  170. package/ts/integrations/homeassistant/homeassistant.classes.integration.ts +35 -18
  171. package/ts/integrations/homeassistant/homeassistant.classes.runtime.ts +50 -63
  172. package/ts/integrations/homeassistant/homeassistant.types.ts +17 -1
  173. package/ts/integrations/homeassistant/readme.md +22 -6
  174. package/ts/integrations/hue/hue.classes.client.ts +110 -41
  175. package/ts/integrations/hue/hue.classes.configflow.ts +12 -6
  176. package/ts/integrations/hue/hue.classes.integration.ts +92 -26
  177. package/ts/integrations/hue/hue.validation.ts +13 -3
  178. package/ts/integrations/hue/readme.md +3 -3
  179. package/ts/integrations/mqtt/mqtt.classes.client.ts +136 -19
  180. package/ts/integrations/mqtt/mqtt.classes.configflow.ts +45 -32
  181. package/ts/integrations/mqtt/mqtt.classes.integration.ts +99 -38
  182. package/ts/integrations/mqtt/mqtt.classes.session.ts +118 -0
  183. package/ts/integrations/mqtt/mqtt.mapper.ts +43 -1
  184. package/ts/integrations/mqtt/mqtt.types.ts +52 -0
  185. package/ts/integrations/mqtt/mqtt.validation.ts +157 -0
  186. package/ts/integrations/mqtt/readme.md +12 -3
  187. package/ts/integrations/samsungtv/readme.md +11 -5
  188. package/ts/integrations/samsungtv/samsungtv.classes.client.ts +40 -15
  189. package/ts/integrations/samsungtv/samsungtv.classes.configflow.ts +21 -6
  190. package/ts/integrations/samsungtv/samsungtv.classes.integration.ts +53 -38
  191. package/ts/integrations/samsungtv/samsungtv.types.ts +4 -1
  192. package/ts/integrations/shelly/readme.md +22 -7
  193. package/ts/integrations/shelly/shelly.classes.client.ts +386 -269
  194. package/ts/integrations/shelly/shelly.classes.configflow.ts +43 -38
  195. package/ts/integrations/shelly/shelly.classes.integration.ts +92 -111
  196. package/ts/integrations/shelly/shelly.classes.subscription.ts +24 -1
  197. package/ts/integrations/shelly/shelly.mapper.ts +19 -20
  198. package/ts/integrations/shelly/shelly.rpc.ts +2 -0
  199. package/ts/integrations/shelly/shelly.types.ts +50 -2
  200. package/ts/integrations/shelly/shelly.validation.ts +76 -0
  201. package/ts/integrations/sonos/readme.md +117 -38
  202. package/ts/integrations/sonos/sonos.classes.client.ts +392 -123
  203. package/ts/integrations/sonos/sonos.classes.configflow.ts +25 -28
  204. package/ts/integrations/sonos/sonos.classes.integration.ts +211 -186
  205. package/ts/integrations/sonos/sonos.config.ts +24 -2
  206. package/ts/integrations/sonos/sonos.mapper.ts +13 -8
  207. package/ts/integrations/sonos/sonos.matchers.ts +2 -2
  208. package/ts/integrations/sonos/sonos.types.ts +30 -1
  209. package/ts/integrations/tasmota/readme.md +16 -5
  210. package/ts/integrations/tasmota/tasmota.classes.integration.ts +24 -6
  211. package/ts/integrations/tasmota/tasmota.classes.runtime.ts +112 -43
  212. package/ts/integrations/tasmota/tasmota.config.ts +17 -0
  213. package/ts/integrations/tasmota/tasmota.credentials.ts +92 -0
  214. package/ts/integrations/tasmota/tasmota.discovery.ts +87 -24
  215. package/ts/integrations/tasmota/tasmota.mapper.ts +6 -6
  216. package/ts/integrations/tasmota/tasmota.types.ts +43 -2
  217. package/ts/integrations/tuya/readme.md +52 -10
  218. package/ts/integrations/tuya/tuya.classes.integration.ts +69 -98
  219. package/ts/integrations/tuya/tuya.classes.runtime.ts +70 -24
  220. package/ts/integrations/tuya/tuya.mapper.ts +1 -1
  221. package/ts/integrations/tuya/tuya.types.ts +4 -0
  222. package/ts/integrations/tuya/tuya.validation.ts +5 -8
  223. package/ts/integrations/webostv/readme.md +115 -22
  224. package/ts/integrations/webostv/webostv.classes.client.ts +123 -50
  225. package/ts/integrations/webostv/webostv.classes.configflow.ts +35 -15
  226. package/ts/integrations/webostv/webostv.classes.integration.ts +44 -37
  227. package/ts/integrations/webostv/webostv.mapper.ts +4 -4
  228. package/ts/integrations/webostv/webostv.types.ts +18 -3
  229. package/ts/integrations/webostv/webostv.validation.ts +22 -1
  230. package/ts/integrations/zigbee2mqtt/readme.md +22 -27
  231. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +16 -7
  232. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +53 -6
  233. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +62 -49
  234. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +17 -11
  235. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +35 -2
  236. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +53 -7
  237. package/ts/integrations/zwave_js/readme.md +42 -9
  238. package/ts/integrations/zwave_js/zwave_js.classes.client.ts +155 -31
  239. package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +55 -31
  240. package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +57 -35
  241. package/ts/integrations/zwave_js/zwave_js.discovery.ts +2 -2
  242. package/ts/integrations/zwave_js/zwave_js.mapper.ts +37 -23
  243. package/ts/integrations/zwave_js/zwave_js.types.ts +26 -3
  244. package/ts/integrations/zwave_js/zwave_js.validation.ts +52 -18
  245. package/ts/plugins.ts +2 -1
@@ -1,168 +1,456 @@
1
1
  import * as plugins from '../../plugins.js';
2
- import { isSonosDataRecord, normalizeSonosConfig, normalizeSonosUid } from './sonos.config.js';
2
+ import { NativeHomeAdmission } from '../../core/classes.nativehomeadmission.js';
3
+ import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
4
+ import { isSonosDataRecord, normalizeSonosConfig, normalizeSonosOwnerOptions, normalizeSonosUid } from './sonos.config.js';
3
5
  import { parseSonosGroup } from './sonos.topology.js';
4
6
  import { readSonosXmlElement, readSonosText, readSonosOptionalText } from './sonos.xml.js';
5
7
  const transportPath = '/MediaRenderer/AVTransport/Control';
8
+ const renderingPath = '/MediaRenderer/RenderingControl/Control';
9
+ const transportService = 'urn:schemas-upnp-org:service:AVTransport:1';
10
+ const renderingService = 'urn:schemas-upnp-org:service:RenderingControl:1';
11
+ export class SonosCommandError extends Error {
12
+ effectOutcome;
13
+ physicalEffectConfirmed = false;
14
+ acknowledgedActions;
15
+ constructor(message, effectOutcome, acknowledgedActions, cause) {
16
+ super(message, { cause });
17
+ this.effectOutcome = effectOutcome;
18
+ this.name = 'SonosCommandError';
19
+ this.acknowledgedActions = Object.freeze([...acknowledgedActions]);
20
+ }
21
+ }
6
22
  export class SonosClient {
7
- abortSignal;
8
23
  config;
24
+ controlAllowed;
25
+ context;
26
+ owner;
27
+ standalone;
28
+ resourceLease;
29
+ setupLease;
9
30
  lifetime = new AbortController();
10
- soap;
11
- playback;
12
- volume;
13
31
  operations = new Set();
32
+ cleanup = new Set();
33
+ resources;
14
34
  selectedUid;
35
+ closed = false;
15
36
  closePromise;
16
- constructor(config, abortSignal) {
17
- this.abortSignal = abortSignal;
37
+ ownedClosePromise;
38
+ retryPromise;
39
+ /** The explicit context remains required even when constructor home is constrained. */
40
+ constructor(config, context, options = {}, ownership) {
18
41
  this.config = normalizeSonosConfig(config);
19
- const baseUrl = `http://${this.config.host}:${this.config.port}`;
20
- this.soap = new plugins.ecobridgeDeviceManager.UpnpSoapClient(baseUrl, {
21
- timeoutMs: this.config.timeoutMs, maxResponseBytes: this.config.maxResponseBytes,
22
- abortSignal: this.signal(),
23
- });
24
- this.playback = plugins.ecobridgeDeviceManager.UpnpPlaybackController.forSonos(this.config.host, this.config.port, this.soap);
25
- this.volume = plugins.ecobridgeDeviceManager.UpnpVolumeController.forSonos(this.config.host, this.config.port, this.soap);
26
- }
27
- getSnapshot(abortSignal) {
28
- return this.request(async (signal) => {
29
- const speakerInfo = await this.getSpeakerInfo(signal);
30
- const [group, transportInfo, positionInfo, volume, muted] = await settledValues([
31
- this.getGroup(speakerInfo.uid, signal), this.getTransportInfo(signal), this.getPositionInfo(signal),
32
- this.volume.getVolume(signal), this.volume.getMute(signal),
33
- ]);
34
- return { speakerInfo, group, transportInfo, positionInfo, volume, muted, observedAt: new Date().toISOString() };
35
- }, abortSignal);
36
- }
37
- getSpeakerInfo(abortSignal) {
38
- return this.request(async (signal) => {
39
- const xml = await this.soap.getXml('/xml/device_description.xml', signal);
40
- const root = readSonosXmlElement(this.soap.parseXml(xml).root, 'device description');
41
- if (root['@_xmlns'] !== 'urn:schemas-upnp-org:device-1-0')
42
- throw new Error('Sonos device description has an invalid namespace.');
43
- const device = readSonosXmlElement(root.device, 'renderer');
44
- if (readSonosText(device, 'deviceType') !== 'urn:schemas-upnp-org:device:ZonePlayer:1' || !['sonos', 'sonos, inc.'].includes(readSonosText(device, 'manufacturer').toLowerCase())) {
45
- throw new Error('Configured endpoint is not a Sonos ZonePlayer.');
46
- }
47
- const uid = normalizeSonosUid(readSonosText(device, 'UDN').replace(/^uuid:/i, ''));
48
- const expectedUid = this.config.expectedUid ?? this.selectedUid;
49
- if (expectedUid && uid !== expectedUid)
50
- throw new Error('Sonos renderer identity changed or does not match configuration.');
51
- this.selectedUid ??= uid;
52
- const zoneXml = await this.soap.soapAction('/DeviceProperties/Control', 'urn:schemas-upnp-org:service:DeviceProperties:1', 'GetZoneAttributes', {}, signal);
53
- const zoneName = this.soap.extractValue(zoneXml, 'CurrentZoneName');
54
- if (!zoneName.trim() || zoneName.length > 256)
55
- throw new Error('Sonos zone name is invalid.');
56
- return {
57
- uid, zoneName, manufacturer: 'Sonos', modelName: readSonosOptionalText(device, 'modelName'),
58
- modelNumber: readSonosOptionalText(device, 'modelNumber'), serialNumber: readSonosOptionalText(device, 'serialNum'),
59
- softwareVersion: readSonosOptionalText(device, 'softwareVersion'),
60
- };
61
- }, abortSignal);
62
- }
63
- getTransportInfo(abortSignal) {
64
- return this.request(async (signal) => {
65
- const transport = await this.soap.getTransportInfo(transportPath, signal);
66
- return { currentTransportState: transport.state, currentTransportStatus: transport.status, currentSpeed: transport.speed };
67
- }, abortSignal);
68
- }
69
- getPositionInfo(abortSignal) {
70
- return this.request(async (signal) => {
71
- const position = await this.soap.getPositionInfo(transportPath, signal);
72
- const metadata = position.trackMetadata && position.trackMetadata !== 'NOT_IMPLEMENTED'
73
- ? this.soap.extractOptionalValues(position.trackMetadata, ['title', 'creator', 'artist', 'album', 'albumArtURI']) : {};
74
- return {
75
- track: position.track, trackDuration: position.trackDuration, trackMetaData: position.trackMetadata,
76
- trackUri: position.trackUri, relativeTime: position.relativeTime, title: metadata.title,
77
- artist: metadata.creator ?? metadata.artist, album: metadata.album, albumArtUri: metadata.albumArtURI,
78
- };
79
- }, abortSignal);
80
- }
81
- getVolume(signal) { return this.request((signal) => this.volume.getVolume(signal), signal); }
82
- getMute(signal) { return this.request((signal) => this.volume.getMute(signal), signal); }
83
- play(signal) { return this.transport((signal) => this.playback.play(undefined, signal), signal); }
84
- pause(signal) { return this.transport((signal) => this.playback.pause(signal), signal); }
85
- stop(signal) { return this.transport((signal) => this.playback.stop(signal), signal); }
86
- next(signal) { return this.transport((signal) => this.playback.next(signal), signal); }
87
- previous(signal) { return this.transport((signal) => this.playback.previous(signal), signal); }
88
- setVolume(value, signal) {
89
- if (!Number.isInteger(value) || value < 0 || value > 100)
90
- throw new Error('Sonos volume must be an integer from 0 to 100.');
91
- return this.request(async (signal) => { await this.getSpeakerInfo(signal); await this.volume.setVolume(value, signal); }, signal);
92
- }
93
- setMute(value, signal) {
94
- if (typeof value !== 'boolean')
95
- throw new Error('Sonos mute must be boolean.');
96
- return this.request(async (signal) => { await this.getSpeakerInfo(signal); await this.volume.setMute(value, signal); }, signal);
42
+ const selected = normalizeSonosOwnerOptions(options);
43
+ this.context = new NativeHomeAdmission('sonos', selected.homeId === undefined ? {} : { homeId: selected.homeId }).admit(context, this.config.homeId);
44
+ this.controlAllowed = selected.allowControl === true;
45
+ if (ownership && !(ownership.owner instanceof NativeIntegrationOwner))
46
+ throw new Error('Sonos requires an actual native integration owner.');
47
+ this.standalone = ownership === undefined;
48
+ this.owner = ownership?.owner ?? new NativeIntegrationOwner('sonos', { homeId: this.context.homeId });
49
+ // This admission is independent of config, discovery, and the shared owner's prior binding.
50
+ this.owner.admission.admit(this.context, this.config.homeId);
51
+ if (ownership) {
52
+ ownership.lease.assertOpen();
53
+ if (ownership.lease.context.homeId !== this.context.homeId || ownership.lease.context.configStore !== this.context.configStore)
54
+ throw new Error('Sonos client ownership does not match its admitted context.');
55
+ this.setupLease = ownership.lease;
56
+ this.resourceLease = Promise.resolve(ownership.lease);
57
+ }
58
+ else {
59
+ let cleanupStarted = false;
60
+ this.resourceLease = this.owner.runSetup(this.context, this.config.homeId, async (lease) => {
61
+ lease.own(() => { const retry = cleanupStarted; cleanupStarted = true; return this.closeOwnedResources(retry); });
62
+ lease.promoteToRuntime();
63
+ return lease;
64
+ });
65
+ // The owning ledger retains failures; construction has no unhandled promise rejection.
66
+ void this.resourceLease.catch(() => undefined);
67
+ }
97
68
  }
69
+ getSnapshot(signal) { return this.withOperation((session) => session.getSnapshot(), signal); }
70
+ getSpeakerInfo(signal) { return this.withOperation((session) => session.getSpeakerInfo(), signal); }
71
+ getTransportInfo(signal) { return this.withOperation((session) => session.getTransportInfo(), signal); }
72
+ getPositionInfo(signal) { return this.withOperation((session) => session.getPositionInfo(), signal); }
73
+ getVolume(signal) { return this.withOperation((session) => session.getVolume(), signal); }
74
+ getMute(signal) { return this.withOperation((session) => session.getMute(), signal); }
75
+ play(signal) { return this.withOperation((session) => session.play(), signal); }
76
+ pause(signal) { return this.withOperation((session) => session.pause(), signal); }
77
+ stop(signal) { return this.withOperation((session) => session.stop(), signal); }
78
+ next(signal) { return this.withOperation((session) => session.next(), signal); }
79
+ previous(signal) { return this.withOperation((session) => session.previous(), signal); }
80
+ setVolume(value, signal) { return this.withOperation((session) => session.setVolume(value), signal); }
81
+ setMute(value, signal) { return this.withOperation((session) => session.setMute(value), signal); }
98
82
  playUri(uri, options = {}, signal) {
99
- if (!isSonosDataRecord(options) || Object.keys(options).some((key) => !['title', 'mimeType'].includes(key)))
100
- throw new Error('Sonos media options contain unsupported fields.');
101
- const { title, mimeType } = options;
102
- if (typeof uri !== 'string' || uri.length > 4096 || /[\x00-\x20]/.test(uri))
103
- throw new Error('Sonos media URI is invalid.');
104
- const url = new URL(uri);
105
- if (!['http:', 'https:', 'x-sonos-http:', 'x-rincon-mp3radio:'].includes(url.protocol) || !url.hostname
106
- || uri.slice(url.protocol.length, url.protocol.length + 2) !== '//' || url.username || url.password)
107
- throw new Error('Sonos media URI must use an uncredentialed supported stream URL.');
108
- if (title !== undefined && (typeof title !== 'string' || !title.trim() || title.length > 256))
109
- throw new Error('Sonos media title is invalid.');
110
- if (mimeType !== undefined && (typeof mimeType !== 'string' || !/^audio\/[a-z0-9][a-z0-9!#$&^_.+-]{0,126}$/i.test(mimeType)))
111
- throw new Error('Sonos MIME type must identify a specific audio format.');
112
- if (title !== undefined && mimeType === undefined)
113
- throw new Error('Sonos titled media requires an explicit audio MIME type.');
114
- const metadata = title === undefined ? '' : this.soap.generateDidlMetadata(title, uri, mimeType);
115
- return this.transport(async (signal) => {
116
- await this.soap.setAVTransportURI(transportPath, uri, metadata, signal);
117
- await this.playback.play(undefined, signal);
118
- }, signal);
83
+ const selected = media(uri, options);
84
+ return this.withOperation((session) => session.playUri(selected.uri, selected.options), signal);
85
+ }
86
+ /** Registers the entire caller continuation, not only individual HTTP exchanges. */
87
+ withOperation(work, signal) {
88
+ try {
89
+ this.assertOpen();
90
+ if (typeof work !== 'function' || (signal !== undefined && !(signal instanceof AbortSignal)))
91
+ throw new Error('Sonos operation/cancellation is invalid.');
92
+ signal?.throwIfAborted();
93
+ const deadline = new AbortController();
94
+ const combined = AbortSignal.any([this.lifetime.signal, deadline.signal, ...(this.context.abortSignal ? [this.context.abortSignal] : []), ...(signal ? [signal] : [])]);
95
+ let timer;
96
+ const operation = this.owner.runOperation({ ...this.context, abortSignal: combined }, this.config.homeId, async (lease) => {
97
+ lease.own(async () => { clearTimeout(timer); });
98
+ const resources = await this.resourceLease;
99
+ resources.assertOpen();
100
+ return this.runAdmitted(lease, resources, work);
101
+ });
102
+ // Capacity and home are reserved before allocation; deadline includes queued callback time.
103
+ timer = setTimeout(() => deadline.abort(new Error('Sonos operation deadline expired.')), this.config.timeoutMs);
104
+ void operation.then(() => clearTimeout(timer), () => clearTimeout(timer));
105
+ return operation;
106
+ }
107
+ catch (error) {
108
+ return Promise.reject(error);
109
+ }
110
+ }
111
+ /** Integration setup already owns this exact lease; no second setup/operation pool is created. */
112
+ withSetupLease(lease, work) {
113
+ this.assertOpen();
114
+ if (lease !== this.setupLease)
115
+ throw new Error('Sonos setup requires its exact owning lease.');
116
+ lease.assertOpen();
117
+ if (lease.context.homeId !== this.context.homeId || lease.context.configStore !== this.context.configStore)
118
+ throw new Error('Sonos setup lease conflicts with client admission.');
119
+ return this.runAdmitted(lease, lease, work);
119
120
  }
120
121
  destroy() {
121
122
  if (!this.closePromise) {
123
+ this.closed = true;
124
+ let close;
125
+ this.closePromise = Promise.resolve().then(() => close);
126
+ close = this.standalone ? this.owner.close() : this.closeOwnedResources(false);
122
127
  this.lifetime.abort(new Error('Sonos client is closed.'));
123
- this.closePromise = (async () => {
124
- const results = await Promise.allSettled([this.playback.close(), this.volume.close(), this.soap.close()]);
125
- await Promise.allSettled([...this.operations]);
126
- const failures = results.filter((result) => result.status === 'rejected');
127
- if (failures.length)
128
- throw new AggregateError(failures.map((result) => result.reason), 'Sonos client cleanup failed.');
129
- })();
130
128
  }
131
129
  return this.closePromise;
132
130
  }
133
- getGroup(uid, signal) {
134
- return this.request(async (signal) => {
135
- const response = await this.soap.soapAction('/ZoneGroupTopology/Control', 'urn:schemas-upnp-org:service:ZoneGroupTopology:1', 'GetZoneGroupState', {}, signal);
136
- return parseSonosGroup(this.soap.parseXml(this.soap.extractValue(response, 'ZoneGroupState')), uid);
137
- }, signal);
138
- }
139
- transport(operation, signal) {
140
- return this.request(async (signal) => {
141
- const speaker = await this.getSpeakerInfo(signal);
142
- const group = await this.getGroup(speaker.uid, signal);
143
- if (group.coordinatorUid !== speaker.uid)
144
- throw new Error('Sonos playback requires selecting the group coordinator.');
131
+ retryCleanup() {
132
+ if (!this.closed)
133
+ return Promise.reject(new Error('Sonos cleanup retry requires a closed client.'));
134
+ if (!this.retryPromise) {
135
+ const retry = Promise.resolve().then(() => this.standalone ? this.owner.retryCleanup() : this.closeOwnedResources(true));
136
+ this.retryPromise = retry;
137
+ const settled = () => { this.retryPromise = undefined; };
138
+ void retry.then(settled, settled);
139
+ }
140
+ return this.retryPromise;
141
+ }
142
+ closeOwnedResources(retry) {
143
+ if (retry)
144
+ return this.drain(true);
145
+ if (!this.ownedClosePromise) {
146
+ this.closed = true;
147
+ this.ownedClosePromise = Promise.resolve().then(() => this.drain(false));
148
+ this.lifetime.abort(new Error('Sonos client is closed.'));
149
+ }
150
+ return this.ownedClosePromise;
151
+ }
152
+ async drain(retry) {
153
+ const closing = [...this.cleanup].map((entry) => {
154
+ if (retry && entry.status === 'failed')
155
+ entry.promise = undefined;
156
+ if (!entry.promise) {
157
+ entry.status = 'pending';
158
+ entry.promise = Promise.resolve().then(() => entry.close()).then(() => { entry.status = 'closed'; }, (error) => { entry.status = 'failed'; throw error; });
159
+ }
160
+ return entry.promise;
161
+ });
162
+ const [results] = await Promise.all([Promise.allSettled(closing), Promise.allSettled([...this.operations])]);
163
+ const failures = results.filter((result) => result.status === 'rejected');
164
+ if (failures.length)
165
+ throw new AggregateError(failures.map((result) => result.reason), 'Sonos client cleanup failed; handles remain retained.');
166
+ }
167
+ allocate(lease) {
168
+ this.assertOpen();
169
+ lease.assertOpen();
170
+ if (this.resources)
171
+ return this.resources;
172
+ const soap = new plugins.ecobridgeDeviceManager.UpnpSoapClient(`http://${this.config.host}:${this.config.port}`, {
173
+ timeoutMs: this.config.timeoutMs, maxResponseBytes: this.config.maxResponseBytes,
174
+ abortSignal: AbortSignal.any([this.lifetime.signal, lease.signal]),
175
+ });
176
+ this.cleanup.add({ close: () => soap.close(), status: 'idle' });
177
+ const playback = plugins.ecobridgeDeviceManager.UpnpPlaybackController.forSonos(this.config.host, this.config.port, soap);
178
+ this.cleanup.add({ close: () => playback.close(), status: 'idle' });
179
+ const volume = plugins.ecobridgeDeviceManager.UpnpVolumeController.forSonos(this.config.host, this.config.port, soap);
180
+ this.cleanup.add({ close: () => volume.close(), status: 'idle' });
181
+ this.resources = { soap, playback, volume };
182
+ return this.resources;
183
+ }
184
+ runAdmitted(lease, resourceLease, work) {
185
+ const deadline = new AbortController();
186
+ const signal = AbortSignal.any([lease.signal, resourceLease.signal, this.lifetime.signal, deadline.signal]);
187
+ const timer = setTimeout(() => deadline.abort(new Error('Sonos operation deadline expired.')), this.config.timeoutMs);
188
+ let active = true;
189
+ let operation;
190
+ operation = Promise.resolve().then(async () => {
191
+ this.assertOpen();
192
+ lease.assertOpen();
193
+ signal.throwIfAborted();
194
+ const resources = this.allocate(resourceLease);
195
+ const calls = new Set();
196
+ let controlStarted = false;
197
+ const invoke = (callback) => {
198
+ if (!active)
199
+ throw new Error('Sonos operation session is closed.');
200
+ this.assertOpen();
201
+ lease.assertOpen();
202
+ signal.throwIfAborted();
203
+ let call;
204
+ call = Promise.resolve().then(callback).finally(() => calls.delete(call));
205
+ calls.add(call);
206
+ void call.then(() => undefined, () => undefined);
207
+ return call;
208
+ };
209
+ const control = (callback) => {
210
+ if (controlStarted)
211
+ throw new Error('Sonos admits one control sequence per operation.');
212
+ controlStarted = true;
213
+ return invoke(callback);
214
+ };
215
+ const session = Object.freeze({
216
+ getSnapshot: () => invoke(() => this.readSnapshot(resources, signal)),
217
+ getSpeakerInfo: () => invoke(async () => (await this.readDescription(resources, signal)).speakerInfo),
218
+ getTransportInfo: () => invoke(() => this.readTransport(resources, signal)),
219
+ getPositionInfo: () => invoke(() => this.readPosition(resources, signal)),
220
+ getVolume: () => invoke(async () => { await this.readDescription(resources, signal); return resources.volume.getVolume(signal); }),
221
+ getMute: () => invoke(async () => { await this.readDescription(resources, signal); return resources.volume.getMute(signal); }),
222
+ play: () => control(() => this.transportControl(resources, 'Play', signal)),
223
+ pause: () => control(() => this.transportControl(resources, 'Pause', signal)),
224
+ stop: () => control(() => this.transportControl(resources, 'Stop', signal)),
225
+ next: () => control(() => this.transportControl(resources, 'Next', signal)),
226
+ previous: () => control(() => this.transportControl(resources, 'Previous', signal)),
227
+ setVolume: (value) => control(() => this.renderingControl(resources, 'SetVolume', value, signal)),
228
+ setMute: (value) => control(() => this.renderingControl(resources, 'SetMute', value, signal)),
229
+ playUri: (uri, options = {}) => { const selected = media(uri, options); return control(() => this.mediaControl(resources, selected, signal)); },
230
+ });
231
+ let result;
232
+ try {
233
+ result = await work(session);
234
+ }
235
+ catch (error) {
236
+ active = false;
237
+ await Promise.allSettled([...calls]);
238
+ throw error;
239
+ }
240
+ active = false;
241
+ const results = await Promise.allSettled([...calls]);
242
+ const failures = results.filter((entry) => entry.status === 'rejected');
243
+ if (failures.length)
244
+ throw new AggregateError(failures.map((entry) => entry.reason), 'Sonos operation continuation failed.');
245
+ return result;
246
+ }).finally(() => { active = false; clearTimeout(timer); this.operations.delete(operation); });
247
+ this.operations.add(operation);
248
+ return operation;
249
+ }
250
+ assertOpen() {
251
+ if (this.closed)
252
+ throw new Error('Sonos client is closed.');
253
+ this.lifetime.signal.throwIfAborted();
254
+ this.context.abortSignal?.throwIfAborted();
255
+ }
256
+ async readDescription(resources, signal) {
257
+ const root = readSonosXmlElement(resources.soap.parseXml(await resources.soap.getXml('/xml/device_description.xml', signal)).root, 'device description');
258
+ if (root['@_xmlns'] !== 'urn:schemas-upnp-org:device-1-0')
259
+ throw new Error('Sonos device description has an invalid namespace.');
260
+ const device = readSonosXmlElement(root.device, 'renderer');
261
+ if (readSonosText(device, 'deviceType') !== 'urn:schemas-upnp-org:device:ZonePlayer:1' || !['sonos', 'sonos, inc.'].includes(readSonosText(device, 'manufacturer').toLowerCase()))
262
+ throw new Error('Configured endpoint is not a Sonos ZonePlayer.');
263
+ const uid = normalizeSonosUid(readSonosText(device, 'UDN').replace(/^uuid:/i, ''));
264
+ if ((this.config.expectedUid ?? this.selectedUid) && uid !== (this.config.expectedUid ?? this.selectedUid))
265
+ throw new Error('Sonos renderer identity changed or does not match configuration.');
266
+ this.selectedUid ??= uid;
267
+ const xml = await resources.soap.soapAction('/DeviceProperties/Control', 'urn:schemas-upnp-org:service:DeviceProperties:1', 'GetZoneAttributes', {}, signal);
268
+ const zoneName = resources.soap.extractValue(xml, 'CurrentZoneName');
269
+ if (!zoneName.trim() || zoneName.length > 256)
270
+ throw new Error('Sonos zone name is invalid.');
271
+ return { device, speakerInfo: { uid, zoneName, manufacturer: 'Sonos', modelName: readSonosOptionalText(device, 'modelName'), modelNumber: readSonosOptionalText(device, 'modelNumber'), serialNumber: readSonosOptionalText(device, 'serialNum'), softwareVersion: readSonosOptionalText(device, 'softwareVersion') } };
272
+ }
273
+ async readSnapshot(resources, signal) {
274
+ const description = await this.readDescription(resources, signal);
275
+ const [group, transportInfo, positionInfo, volume, muted, transport, rendering] = await settledValues([
276
+ this.readGroup(resources, description.speakerInfo.uid, signal), this.readTransport(resources, signal), this.readPosition(resources, signal),
277
+ resources.volume.getVolume(signal), resources.volume.getMute(signal), this.transportCapabilities(resources, description.device, signal), this.renderingCapabilities(resources, description.device, signal),
278
+ ]);
279
+ signal.throwIfAborted();
280
+ return { homeId: this.context.homeId, controlAllowed: this.controlAllowed, speakerInfo: description.speakerInfo, group, transportInfo, positionInfo, volume, muted,
281
+ capabilities: { ...transport, ...rendering }, observedAt: new Date().toISOString() };
282
+ }
283
+ async readGroup(resources, uid, signal) {
284
+ const xml = await resources.soap.soapAction('/ZoneGroupTopology/Control', 'urn:schemas-upnp-org:service:ZoneGroupTopology:1', 'GetZoneGroupState', {}, signal);
285
+ return parseSonosGroup(resources.soap.parseXml(resources.soap.extractValue(xml, 'ZoneGroupState')), uid);
286
+ }
287
+ async readTransport(resources, signal) {
288
+ const value = await resources.soap.getTransportInfo(transportPath, signal);
289
+ return { currentTransportState: value.state, currentTransportStatus: value.status, currentSpeed: value.speed };
290
+ }
291
+ async readPosition(resources, signal) {
292
+ const value = await resources.soap.getPositionInfo(transportPath, signal);
293
+ const metadata = value.trackMetadata && value.trackMetadata !== 'NOT_IMPLEMENTED' ? resources.soap.extractOptionalValues(value.trackMetadata, ['title', 'creator', 'artist', 'album', 'albumArtURI']) : {};
294
+ return { track: value.track, trackDuration: value.trackDuration, trackMetaData: value.trackMetadata, trackUri: value.trackUri, relativeTime: value.relativeTime,
295
+ title: metadata.title, artist: metadata.creator ?? metadata.artist, album: metadata.album, albumArtUri: metadata.albumArtURI };
296
+ }
297
+ async serviceActions(resources, device, serviceType, controlPath, signal) {
298
+ const services = [];
299
+ const visit = (value, depth) => {
300
+ if (depth > 8)
301
+ throw new Error('Sonos device description nesting is excessive.');
302
+ if (value.serviceList !== undefined)
303
+ for (const service of list(readSonosXmlElement(value.serviceList, 'service list').service)) {
304
+ services.push(readSonosXmlElement(service, 'service'));
305
+ if (services.length > 64)
306
+ throw new Error('Sonos description contains too many services.');
307
+ }
308
+ if (value.deviceList !== undefined)
309
+ for (const child of list(readSonosXmlElement(value.deviceList, 'device list').device))
310
+ visit(readSonosXmlElement(child, 'device'), depth + 1);
311
+ };
312
+ visit(device, 0);
313
+ const matches = services.filter((service) => readSonosText(service, 'serviceType') === serviceType);
314
+ if (matches.length !== 1)
315
+ throw new Error('Sonos selected renderer must declare exactly one required service.');
316
+ const selected = matches[0];
317
+ const origin = new URL(`http://${this.config.host}:${this.config.port}`).origin;
318
+ const control = new URL(readSonosText(selected, 'controlURL'), origin);
319
+ const scpd = new URL(readSonosText(selected, 'SCPDURL'), origin);
320
+ if (control.origin !== origin || control.pathname !== controlPath || control.username || control.password || control.search || control.hash
321
+ || scpd.origin !== origin || scpd.username || scpd.password || scpd.search || scpd.hash || !scpd.pathname.startsWith('/xml/'))
322
+ throw new Error('Sonos service description must remain on the exact selected renderer.');
323
+ const root = readSonosXmlElement(resources.soap.parseXml(await resources.soap.getXml(scpd.pathname, signal)).scpd, 'service description');
324
+ if (root['@_xmlns'] !== 'urn:schemas-upnp-org:service-1-0')
325
+ throw new Error('Sonos service description namespace is invalid.');
326
+ const actions = list(readSonosXmlElement(root.actionList, 'action list').action).map((action) => readSonosText(readSonosXmlElement(action, 'action'), 'name'));
327
+ if (!actions.length || actions.length > 256 || actions.some((action) => !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(action)) || new Set(actions).size !== actions.length)
328
+ throw new Error('Sonos service actions are invalid or duplicated.');
329
+ return actions;
330
+ }
331
+ async transportCapabilities(resources, device, signal) {
332
+ const declaredTransportActions = await this.serviceActions(resources, device, transportService, transportPath, signal);
333
+ if (!declaredTransportActions.includes('GetCurrentTransportActions'))
334
+ throw new Error('Sonos renderer does not expose current transport action authority.');
335
+ const xml = await resources.soap.soapAction(transportPath, transportService, 'GetCurrentTransportActions', { InstanceID: 0 }, signal);
336
+ const value = resources.soap.extractValue(xml, 'Actions');
337
+ const transportActions = value === '' ? [] : value.split(',').map((action) => action.trim());
338
+ if (transportActions.length > 128 || transportActions.some((action) => !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(action)) || new Set(transportActions).size !== transportActions.length)
339
+ throw new Error('Sonos current transport actions are malformed.');
340
+ return { transportActions, declaredTransportActions };
341
+ }
342
+ async renderingCapabilities(resources, device, signal) {
343
+ const actions = await this.serviceActions(resources, device, renderingService, renderingPath, signal);
344
+ let fixed = false;
345
+ if (actions.includes('GetOutputFixed')) {
346
+ const xml = await resources.soap.soapAction(renderingPath, renderingService, 'GetOutputFixed', { InstanceID: 0 }, signal);
347
+ const value = resources.soap.extractValue(xml, 'CurrentFixed');
348
+ if (!['0', '1', 'false', 'true'].includes(value))
349
+ throw new Error('Sonos fixed-output response is invalid.');
350
+ fixed = value === '1' || value === 'true';
351
+ }
352
+ return { volumeWritable: actions.includes('SetVolume') && !fixed, muteWritable: actions.includes('SetMute') };
353
+ }
354
+ async transportAuthority(resources, action, signal) {
355
+ const description = await this.readDescription(resources, signal);
356
+ const [group, capabilities] = await settledValues([this.readGroup(resources, description.speakerInfo.uid, signal), this.transportCapabilities(resources, description.device, signal)]);
357
+ if (group.coordinatorUid !== description.speakerInfo.uid)
358
+ throw new Error('Sonos playback requires selecting the group coordinator.');
359
+ if (!capabilities.declaredTransportActions.includes(action) || (action !== 'SetAVTransportURI' && !capabilities.transportActions.includes(action)))
360
+ throw new Error(`Sonos renderer does not currently authorize ${action}.`);
361
+ signal.throwIfAborted();
362
+ }
363
+ async transportControl(resources, action, signal) {
364
+ const target = action === 'Play' ? 'PLAYING' : action === 'Pause' ? 'PAUSED_PLAYBACK' : action === 'Stop' ? 'STOPPED' : undefined;
365
+ return this.control(resources, signal, async (acknowledge, attempted) => {
366
+ await this.transportAuthority(resources, action, signal);
367
+ attempted();
368
+ if (action === 'Play')
369
+ await resources.playback.play(undefined, signal);
370
+ else if (action === 'Pause')
371
+ await resources.playback.pause(signal);
372
+ else if (action === 'Stop')
373
+ await resources.playback.stop(signal);
374
+ else if (action === 'Next')
375
+ await resources.playback.next(signal);
376
+ else
377
+ await resources.playback.previous(signal);
378
+ acknowledge(action);
379
+ }, target, (snapshot) => snapshot.transportInfo.currentTransportState);
380
+ }
381
+ renderingControl(resources, action, value, signal) {
382
+ if ((action === 'SetVolume' && (typeof value !== 'number' || !Number.isInteger(value) || value < 0 || value > 100))
383
+ || (action === 'SetMute' && typeof value !== 'boolean'))
384
+ throw new Error('Sonos rendering value must be an integer percent from 0 to 100 or boolean mute.');
385
+ return this.control(resources, signal, async (acknowledge, attempted) => {
386
+ const description = await this.readDescription(resources, signal);
387
+ const capabilities = await this.renderingCapabilities(resources, description.device, signal);
388
+ if (action === 'SetVolume' ? !capabilities.volumeWritable : !capabilities.muteWritable)
389
+ throw new Error('Sonos rendering control is not currently writable.');
145
390
  signal.throwIfAborted();
146
- await operation(signal);
147
- }, signal);
391
+ attempted();
392
+ if (action === 'SetVolume')
393
+ await resources.volume.setVolume(value, signal);
394
+ else
395
+ await resources.volume.setMute(value, signal);
396
+ acknowledge(action);
397
+ }, value, (snapshot) => action === 'SetVolume' ? snapshot.volume : snapshot.muted);
148
398
  }
149
- signal(signal) {
150
- return AbortSignal.any([this.lifetime.signal, ...(this.abortSignal ? [this.abortSignal] : []), ...(signal ? [signal] : [])]);
399
+ mediaControl(resources, selected, signal) {
400
+ return this.control(resources, signal, async (acknowledge, attempted) => {
401
+ await this.transportAuthority(resources, 'SetAVTransportURI', signal);
402
+ const metadata = selected.options.title === undefined ? '' : resources.soap.generateDidlMetadata(selected.options.title, selected.uri, selected.options.mimeType);
403
+ attempted();
404
+ await resources.soap.setAVTransportURI(transportPath, selected.uri, metadata, signal);
405
+ acknowledge('SetAVTransportURI');
406
+ // URI admission changes transport state; authority must be observed again before the distinct Play effect.
407
+ await this.transportAuthority(resources, 'Play', signal);
408
+ attempted();
409
+ await resources.playback.play(undefined, signal);
410
+ acknowledge('Play');
411
+ }, undefined, () => undefined);
151
412
  }
152
- request(operation, signal) {
153
- const combined = this.signal(signal);
154
- combined.throwIfAborted();
155
- const result = operation(combined);
156
- this.operations.add(result);
157
- void result.then(() => this.operations.delete(result), () => this.operations.delete(result));
158
- return result;
413
+ async control(resources, signal, dispatch, requestedValue, observation) {
414
+ const acknowledgedActions = [];
415
+ let attempted = false;
416
+ try {
417
+ if (!this.controlAllowed)
418
+ throw new Error('Sonos control requires explicit runtime owner permission.');
419
+ await dispatch((action) => acknowledgedActions.push(action), () => { attempted = true; });
420
+ const snapshot = await this.readSnapshot(resources, signal);
421
+ const observedValue = observation(snapshot);
422
+ return Object.freeze({ acknowledgedActions: Object.freeze([...acknowledgedActions]), snapshot, requestedValue, observedValue,
423
+ outcome: requestedValue === undefined ? 'observed-state' : requestedValue === observedValue ? 'observed-target' : 'observed-different', physicalEffectConfirmed: false });
424
+ }
425
+ catch (error) {
426
+ const outcome = !attempted ? 'not-sent' : error instanceof plugins.ecobridgeDeviceManager.UpnpSoapFault && !acknowledgedActions.length ? 'rejected' : 'indeterminate';
427
+ throw new SonosCommandError(error instanceof Error ? error.message : 'Sonos control failed.', outcome, acknowledgedActions, error);
428
+ }
159
429
  }
160
430
  }
431
+ function media(uri, options) {
432
+ if (!isSonosDataRecord(options) || Object.keys(options).some((key) => !['title', 'mimeType'].includes(key)))
433
+ throw new Error('Sonos media options contain unsupported fields.');
434
+ const { title, mimeType } = options;
435
+ if (typeof uri !== 'string' || uri.length > 4096 || /[\x00-\x20]/.test(uri))
436
+ throw new Error('Sonos media URI is invalid.');
437
+ const url = new URL(uri);
438
+ if (!['http:', 'https:', 'x-sonos-http:', 'x-rincon-mp3radio:'].includes(url.protocol) || !url.hostname || uri.slice(url.protocol.length, url.protocol.length + 2) !== '//' || url.username || url.password)
439
+ throw new Error('Sonos media URI must use an uncredentialed supported stream URL.');
440
+ if (title !== undefined && (typeof title !== 'string' || !title.trim() || title.length > 256))
441
+ throw new Error('Sonos media title is invalid.');
442
+ if (mimeType !== undefined && (typeof mimeType !== 'string' || !/^audio\/[a-z0-9][a-z0-9!#$&^_.+-]{0,126}$/i.test(mimeType)))
443
+ throw new Error('Sonos MIME type must identify a specific audio format.');
444
+ if (title !== undefined && mimeType === undefined)
445
+ throw new Error('Sonos titled media requires an explicit audio MIME type.');
446
+ return { uri, options: Object.freeze({ title, mimeType }) };
447
+ }
448
+ function list(value) { return value === undefined ? [] : Array.isArray(value) ? value : [value]; }
161
449
  async function settledValues(values) {
162
450
  const results = await Promise.allSettled(values);
163
- const failure = results.find((result) => result.status === 'rejected');
164
- if (failure)
165
- throw failure.reason;
451
+ const failures = results.filter((result) => result.status === 'rejected');
452
+ if (failures.length)
453
+ throw new AggregateError(failures.map((result) => result.reason), 'Sonos observation failed.');
166
454
  return results.map((result) => result.value);
167
455
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ub3MuY2xhc3Nlcy5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvc29ub3Mvc29ub3MuY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQStCLE1BQU0sbUJBQW1CLENBQUM7QUFDNUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixNQUFNLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQztBQUUzRCxNQUFNLE9BQU8sV0FBVztJQVU2QixXQUFXO0lBVDlDLE1BQU0sQ0FBeUI7SUFDOUIsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsSUFBSSxDQUFnRDtJQUNwRCxRQUFRLENBQXdEO0lBQ2hFLE1BQU0sQ0FBc0Q7SUFDNUQsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ2xELFdBQVcsQ0FBVTtJQUNyQixZQUFZLENBQWlCO0lBRXJDLFlBQVksTUFBb0IsRUFBbUIsV0FBeUI7MkJBQXpCLFdBQVc7UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ3JFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxD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
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ub3MuY2xhc3Nlcy5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvc29ub3Mvc29ub3MuY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQWdDLE1BQU0sMkNBQTJDLENBQUM7QUFDOUcsT0FBTyxFQUFFLHNCQUFzQixFQUFzRCxNQUFNLDhDQUE4QyxDQUFDO0FBRTFJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBK0IsTUFBTSxtQkFBbUIsQ0FBQztBQUN4SixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNGLE1BQU0sYUFBYSxHQUFHLG9DQUFvQyxDQUFDO0FBQzNELE1BQU0sYUFBYSxHQUFHLHlDQUF5QyxDQUFDO0FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7QUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxpREFBaUQsQ0FBQztBQTZCM0UsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFHRyxhQUFhO0lBRjFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUNoQyxtQkFBbUIsQ0FBb0I7SUFDdkQsWUFBWSxPQUFlLEVBQWtCLGFBQXdELEVBQUUsbUJBQXNDLEVBQUUsS0FBZTtRQUM1SixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzs2QkFEaUIsYUFBYTtRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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