sinricpro 2.11.4 → 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 (142) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +132 -15
  3. package/dist/capabilities/AirQualitySensor.js +23 -0
  4. package/dist/capabilities/AirQualitySensor.js.map +1 -0
  5. package/dist/capabilities/BrightnessController.js +76 -0
  6. package/dist/capabilities/BrightnessController.js.map +1 -0
  7. package/dist/capabilities/CameraController.js +29 -0
  8. package/dist/capabilities/CameraController.js.map +1 -0
  9. package/dist/capabilities/ChannelController.js +52 -0
  10. package/dist/capabilities/ChannelController.js.map +1 -0
  11. package/dist/capabilities/ColorController.js +53 -0
  12. package/dist/capabilities/ColorController.js.map +1 -0
  13. package/dist/capabilities/ColorTemperatureController.js +53 -0
  14. package/dist/capabilities/ColorTemperatureController.js.map +1 -0
  15. package/dist/capabilities/ContactSensor.js +23 -0
  16. package/dist/capabilities/ContactSensor.js.map +1 -0
  17. package/dist/capabilities/Doorbell.js +23 -0
  18. package/dist/capabilities/Doorbell.js.map +1 -0
  19. package/dist/capabilities/EqualizerController.js +103 -0
  20. package/dist/capabilities/EqualizerController.js.map +1 -0
  21. package/dist/capabilities/InputController.js +51 -0
  22. package/dist/capabilities/InputController.js.map +1 -0
  23. package/dist/capabilities/KeypadController.js +23 -0
  24. package/dist/capabilities/KeypadController.js.map +1 -0
  25. package/dist/capabilities/LockController.js +40 -0
  26. package/dist/capabilities/LockController.js.map +1 -0
  27. package/dist/capabilities/MediaController.js +40 -0
  28. package/dist/capabilities/MediaController.js.map +1 -0
  29. package/dist/capabilities/ModeController.js +51 -0
  30. package/dist/capabilities/ModeController.js.map +1 -0
  31. package/dist/capabilities/MotionSensor.js +23 -0
  32. package/dist/capabilities/MotionSensor.js.map +1 -0
  33. package/dist/capabilities/MuteController.js +51 -0
  34. package/dist/capabilities/MuteController.js.map +1 -0
  35. package/dist/capabilities/OpenCloseController.js +40 -0
  36. package/dist/capabilities/OpenCloseController.js.map +1 -0
  37. package/dist/capabilities/PercentageController.js +52 -0
  38. package/dist/capabilities/PercentageController.js.map +1 -0
  39. package/dist/capabilities/PowerLevelController.js +52 -0
  40. package/dist/capabilities/PowerLevelController.js.map +1 -0
  41. package/dist/capabilities/PowerSensor.js +23 -0
  42. package/dist/capabilities/PowerSensor.js.map +1 -0
  43. package/dist/capabilities/PowerStateController.js +53 -0
  44. package/dist/capabilities/PowerStateController.js.map +1 -0
  45. package/dist/capabilities/PushNotification.js +23 -0
  46. package/dist/capabilities/PushNotification.js.map +1 -0
  47. package/dist/capabilities/RangeController.js +52 -0
  48. package/dist/capabilities/RangeController.js.map +1 -0
  49. package/dist/capabilities/SettingController.js +33 -0
  50. package/dist/capabilities/SettingController.js.map +1 -0
  51. package/dist/capabilities/StartStopController.js +51 -0
  52. package/dist/capabilities/StartStopController.js.map +1 -0
  53. package/dist/capabilities/TemperatureSensor.js +29 -0
  54. package/dist/capabilities/TemperatureSensor.js.map +1 -0
  55. package/dist/capabilities/ThermostatController.js +70 -0
  56. package/dist/capabilities/ThermostatController.js.map +1 -0
  57. package/dist/capabilities/ToggleController.js +51 -0
  58. package/dist/capabilities/ToggleController.js.map +1 -0
  59. package/dist/capabilities/VolumeController.js +74 -0
  60. package/dist/capabilities/VolumeController.js.map +1 -0
  61. package/dist/capabilities/index.js +56 -0
  62. package/dist/capabilities/index.js.map +1 -0
  63. package/dist/core/EventLimiter.js +50 -0
  64. package/dist/core/EventLimiter.js.map +1 -0
  65. package/dist/core/MessageQueue.js +28 -0
  66. package/dist/core/MessageQueue.js.map +1 -0
  67. package/dist/core/Signature.js +68 -0
  68. package/dist/core/Signature.js.map +1 -0
  69. package/dist/core/SinricPro.js +332 -0
  70. package/dist/core/SinricPro.js.map +1 -0
  71. package/dist/core/SinricProDevice.js +82 -0
  72. package/dist/core/SinricProDevice.js.map +1 -0
  73. package/dist/core/WebSocketClient.js +156 -0
  74. package/dist/core/WebSocketClient.js.map +1 -0
  75. package/dist/core/types.js +30 -0
  76. package/dist/core/types.js.map +1 -0
  77. package/dist/devices/SinricProAirQualitySensor.js +29 -0
  78. package/dist/devices/SinricProAirQualitySensor.js.map +1 -0
  79. package/dist/devices/SinricProBlinds.js +29 -0
  80. package/dist/devices/SinricProBlinds.js.map +1 -0
  81. package/dist/devices/SinricProCamera.js +29 -0
  82. package/dist/devices/SinricProCamera.js.map +1 -0
  83. package/dist/devices/SinricProContactSensor.js +28 -0
  84. package/dist/devices/SinricProContactSensor.js.map +1 -0
  85. package/dist/devices/SinricProDimSwitch.js +29 -0
  86. package/dist/devices/SinricProDimSwitch.js.map +1 -0
  87. package/dist/devices/SinricProDoorbell.js +29 -0
  88. package/dist/devices/SinricProDoorbell.js.map +1 -0
  89. package/dist/devices/SinricProFan.js +29 -0
  90. package/dist/devices/SinricProFan.js.map +1 -0
  91. package/dist/devices/SinricProFanUS.js +29 -0
  92. package/dist/devices/SinricProFanUS.js.map +1 -0
  93. package/dist/devices/SinricProGarageDoor.js +28 -0
  94. package/dist/devices/SinricProGarageDoor.js.map +1 -0
  95. package/dist/devices/SinricProLight.js +30 -0
  96. package/dist/devices/SinricProLight.js.map +1 -0
  97. package/dist/devices/SinricProLock.js +28 -0
  98. package/dist/devices/SinricProLock.js.map +1 -0
  99. package/dist/devices/SinricProMotionSensor.js +28 -0
  100. package/dist/devices/SinricProMotionSensor.js.map +1 -0
  101. package/dist/devices/SinricProPowerSensor.js +28 -0
  102. package/dist/devices/SinricProPowerSensor.js.map +1 -0
  103. package/dist/devices/SinricProSpeaker.js +33 -0
  104. package/dist/devices/SinricProSpeaker.js.map +1 -0
  105. package/dist/devices/SinricProSwitch.js +24 -0
  106. package/dist/devices/SinricProSwitch.js.map +1 -0
  107. package/dist/devices/SinricProTV.js +33 -0
  108. package/dist/devices/SinricProTV.js.map +1 -0
  109. package/dist/devices/SinricProThermostat.js +30 -0
  110. package/dist/devices/SinricProThermostat.js.map +1 -0
  111. package/dist/devices/SinricProWindowAC.js +31 -0
  112. package/dist/devices/SinricProWindowAC.js.map +1 -0
  113. package/dist/devices/index.js +44 -0
  114. package/dist/devices/index.js.map +1 -0
  115. package/dist/index.js +43 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/utils/SinricProSdkLogger.js +42 -0
  118. package/dist/utils/SinricProSdkLogger.js.map +1 -0
  119. package/package.json +78 -38
  120. package/.github/workflows/npm-publish.yml +0 -32
  121. package/.nvmrc +0 -1
  122. package/.prettierrc +0 -5
  123. package/CHANGELOG.md +0 -34
  124. package/index.js +0 -1
  125. package/lib/cbhandler.js +0 -182
  126. package/lib/contorllers/brightness_controller.js +0 -40
  127. package/lib/contorllers/camera_stream_controller.js +0 -39
  128. package/lib/contorllers/color_controller.js +0 -23
  129. package/lib/contorllers/color_temperature.js +0 -23
  130. package/lib/contorllers/mode_controller.js +0 -22
  131. package/lib/contorllers/power_controller.js +0 -53
  132. package/lib/contorllers/range_value_controller.js +0 -38
  133. package/lib/contorllers/sensors_controller.js +0 -54
  134. package/lib/contorllers/speaker_controller.js +0 -51
  135. package/lib/contorllers/toggle_state_controller.js +0 -21
  136. package/lib/contorllers/tv_controller.js +0 -93
  137. package/lib/errors/errors.js +0 -8
  138. package/lib/events/event_handler.js +0 -103
  139. package/lib/signature.js +0 -26
  140. package/lib/sinrcpro.js +0 -127
  141. package/lib/sinricproudp.js +0 -60
  142. package/lib/storage.js +0 -31
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
2
+
3
+ Copyright (c) 2024 SinricPro
4
+
5
+ This is a human-readable summary of (and not a substitute for) the license.
6
+
7
+ You are free to:
8
+ - Share — copy and redistribute the material in any medium or format
9
+ - Adapt — remix, transform, and build upon the material for any purpose, even commercially
10
+
11
+ Under the following terms:
12
+ - Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made
13
+ - ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original
14
+
15
+ Full license text: https://creativecommons.org/licenses/by-sa/4.0/legalcode
package/README.md CHANGED
@@ -1,15 +1,132 @@
1
- # SinricPro (NodeJs-SDK)
2
-
3
- [![](https://img.shields.io/npm/v/sinricpro)](https://www.npmjs.com/package/sinricpro)
4
- [![](https://img.shields.io/npm/dependency-version/sinricpro/dev/eslint)](https://www.npmjs.com/package/sinricpro)
5
- [![](https://img.shields.io/bundlephobia/min/sinricpro)](https://www.npmjs.com/package/sinricpro)
6
- [![](https://img.shields.io/github/languages/code-size/sinricpro/nodejs-sdk)](https://www.npmjs.com/package/sinricpro)
7
-
8
- ### Installation
9
-
10
- ```
11
- npm install sinricpro
12
- ```
13
-
14
- ### Examples
15
- Check the examples [here](https://github.com/sinricpro/nodejs-sdk/tree/master/examples)
1
+ # SinricPro SDK for Node.js & TypeScript
2
+
3
+ [![npm version](https://badge.fury.io/js/sinricpro.svg)](https://www.npmjs.com/package/sinricpro)
4
+ [![License](https://img.shields.io/badge/License-CC%20BY--SA%204.0-blue.svg)](LICENSE)
5
+
6
+ Official SinricPro SDK for Node.js and TypeScript. Control your IoT devices with Alexa and Google Home.
7
+
8
+ **🎯 Features:**
9
+ - ✅ Full TypeScript support with strong typing
10
+ - ✅ Modern async/await API
11
+ - WebSocket with automatic reconnection
12
+ - ✅ HMAC-SHA256 authentication
13
+ - ✅ Event rate limiting
14
+ - ✅ Multiple device types (Switch, Light, Thermostat, etc.)
15
+ - Comprehensive error handling
16
+ - ✅ Unit tested
17
+
18
+ ---
19
+
20
+ ## 📦 Installation
21
+
22
+ ```bash
23
+ npm install sinricpro
24
+ ```
25
+
26
+ Or with yarn:
27
+ ```bash
28
+ yarn add sinricpro
29
+ ```
30
+
31
+ ---
32
+
33
+ ## 🚀 Quick Start
34
+
35
+ ### 1. Get Your Credentials
36
+
37
+ 1. Sign up at [sinric.pro](https://sinric.pro)
38
+ 2. Create a new device (e.g., "Switch")
39
+ 3. Copy your credentials:
40
+ - `APP_KEY`
41
+ - `APP_SECRET`
42
+ - `DEVICE_ID`
43
+
44
+ ### 2. Create a Simple Switch
45
+
46
+ ```typescript
47
+ import SinricPro from 'sinricpro';
48
+ import { SinricProSwitch } from 'sinricpro/devices';
49
+
50
+ const config = {
51
+ appKey: 'YOUR-APP-KEY',
52
+ appSecret: 'YOUR-APP-SECRET',
53
+ };
54
+
55
+ async function main() {
56
+ // Create a switch device
57
+ const mySwitch = SinricProSwitch('YOUR-DEVICE-ID');
58
+
59
+ // Handle power state changes from Alexa/Google Home
60
+ mySwitch.onPowerState(async (deviceId, state) => {
61
+ console.log(`Device turned ${state ? 'ON' : 'OFF'}`);
62
+ // Control your hardware here
63
+ return true; // Return true if successful
64
+ });
65
+
66
+ // Add device to SinricPro
67
+ SinricPro.add(mySwitch);
68
+
69
+ // Connection events
70
+ SinricPro.onConnected(() => console.log('Connected!'));
71
+ SinricPro.onDisconnected(() => console.log('Disconnected!'));
72
+
73
+ // Initialize SDK
74
+ await SinricPro.begin(config);
75
+
76
+ // Send events when state changes locally
77
+ setTimeout(async () => {
78
+ await mySwitch.sendPowerStateEvent(true);
79
+ }, 5000);
80
+ }
81
+
82
+ main().catch(console.error);
83
+ ```
84
+
85
+ ### 3. Run Your App
86
+
87
+ ```bash
88
+ ts-node app.ts
89
+ ```
90
+
91
+ ### 4. Control with Voice
92
+
93
+ - "Alexa, turn on Switch"
94
+ - "OK Google, turn off Switch"
95
+
96
+ ---
97
+
98
+ ## 🤝 Contributing
99
+
100
+ Contributions welcome! Please:
101
+
102
+ 1. Fork the repository
103
+ 2. Create a feature branch
104
+ 3. Add tests for new features
105
+ 4. Submit a pull request
106
+
107
+ ---
108
+
109
+ ## 📄 License
110
+
111
+ This project is licensed under CC-BY-SA-4.0.
112
+
113
+ ---
114
+
115
+ ## 🔗 Links
116
+
117
+ - **Website:** [sinric.pro](https://sinric.pro)
118
+ - **Documentation:** [help.sinric.pro](https://help.sinric.pro)
119
+ - **GitHub:** [github.com/sinricpro](https://github.com/sinricpro)
120
+ - **Support:** [community.sinric.pro](https://community.sinric.pro)
121
+
122
+ ---
123
+
124
+ ## 💬 Support
125
+
126
+ - **Issues:** [GitHub Issues](https://github.com/sinricpro/nodejs-sdk/issues)
127
+ - **Community:** [SinricPro Community](https://community.sinric.pro)
128
+ - **Email:** support@sinric.pro
129
+
130
+ ---
131
+
132
+ **Made with ❤️ by the SinricPro team**
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * AirQualitySensor - Adds air quality monitoring capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AirQualitySensor = AirQualitySensor;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function AirQualitySensor(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.airQualityEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
14
+ }
15
+ async sendAirQualityEvent(value, cause = types_1.PERIODIC_POLL) {
16
+ if (this.airQualityEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('currentAirQuality', value, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=AirQualitySensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AirQualitySensor.js","sourceRoot":"","sources":["../../src/capabilities/AirQualitySensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,4CAeC;AAhCD,uDAAoD;AACpD,yCAAwE;AAgBxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,2BAAsB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAY9E,CAAC;QAVC,KAAK,CAAC,mBAAmB,CACvB,KAAsB,EACtB,QAAgB,qBAAa;YAE7B,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * BrightnessController - Adds brightness control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BrightnessController = BrightnessController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function BrightnessController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.brightnessCallback = null;
15
+ this.adjustBrightnessCallback = null;
16
+ this.brightnessEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
17
+ this.registerRequestHandler(this.handleBrightnessRequest.bind(this));
18
+ }
19
+ onBrightness(callback) {
20
+ this.brightnessCallback = callback;
21
+ }
22
+ onAdjustBrightness(callback) {
23
+ this.adjustBrightnessCallback = callback;
24
+ }
25
+ async sendBrightnessEvent(brightness, cause = types_1.PHYSICAL_INTERACTION) {
26
+ if (this.brightnessEventLimiter.isLimited()) {
27
+ return false;
28
+ }
29
+ return this.sendEvent('setBrightness', {
30
+ brightness,
31
+ }, cause);
32
+ }
33
+ async handleBrightnessRequest(request) {
34
+ if (request.action === 'setBrightness' && this.brightnessCallback) {
35
+ const brightness = request.requestValue.brightness;
36
+ const result = await this.brightnessCallback(this.getDeviceId(), brightness);
37
+ // Handle both boolean and object return types
38
+ let success;
39
+ if (typeof result === 'boolean') {
40
+ success = result;
41
+ }
42
+ else {
43
+ success = result.success;
44
+ if (result.message) {
45
+ request.errorMessage = result.message;
46
+ }
47
+ }
48
+ if (success) {
49
+ request.responseValue.brightness = brightness;
50
+ }
51
+ return success;
52
+ }
53
+ if (request.action === 'adjustBrightness' && this.adjustBrightnessCallback) {
54
+ const brightnessDelta = request.requestValue.brightnessDelta;
55
+ const result = await this.adjustBrightnessCallback(this.getDeviceId(), brightnessDelta);
56
+ // Handle both boolean and object return types
57
+ let success;
58
+ if (typeof result === 'boolean') {
59
+ success = result;
60
+ }
61
+ else {
62
+ success = result.success;
63
+ if (result.message) {
64
+ request.errorMessage = result.message;
65
+ }
66
+ }
67
+ if (success) {
68
+ request.responseValue.brightness = brightnessDelta;
69
+ }
70
+ return success;
71
+ }
72
+ return false;
73
+ }
74
+ };
75
+ }
76
+ //# sourceMappingURL=BrightnessController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrightnessController.js","sourceRoot":"","sources":["../../src/capabilities/BrightnessController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * CameraController - Adds camera control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CameraController = CameraController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function CameraController(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.cameraEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
14
+ }
15
+ async sendCameraStreamEvent(streamUrl, protocol = 'RTSP', cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.cameraEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('setCameraStream', { streamUrl, protocol }, cause);
20
+ }
21
+ async sendSnapshotEvent(imageUrl, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.cameraEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('snapshot', { imageUrl }, cause);
26
+ }
27
+ };
28
+ }
29
+ //# sourceMappingURL=CameraController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraController.js","sourceRoot":"","sources":["../../src/capabilities/CameraController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAcH,4CA2BC;AAtCD,uDAAoD;AACpD,yCAAwE;AAUxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,uBAAkB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QAwBnE,CAAC;QAtBC,KAAK,CAAC,qBAAqB,CACzB,SAAiB,EACjB,WAAmB,MAAM,EACzB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * ChannelController - Adds TV channel control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChannelController = ChannelController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function ChannelController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.changeChannelCallback = null;
15
+ this.skipChannelsCallback = null;
16
+ this.channelEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
17
+ this.registerRequestHandler(this.handleChannelRequest.bind(this));
18
+ }
19
+ onChangeChannel(callback) {
20
+ this.changeChannelCallback = callback;
21
+ }
22
+ onSkipChannels(callback) {
23
+ this.skipChannelsCallback = callback;
24
+ }
25
+ async sendChannelEvent(channel, cause = types_1.PHYSICAL_INTERACTION) {
26
+ if (this.channelEventLimiter.isLimited()) {
27
+ return false;
28
+ }
29
+ return this.sendEvent('changeChannel', { channel }, cause);
30
+ }
31
+ async handleChannelRequest(request) {
32
+ if (request.action === 'changeChannel' && this.changeChannelCallback) {
33
+ const channel = request.requestValue.channel;
34
+ const success = await this.changeChannelCallback(this.getDeviceId(), channel);
35
+ if (success) {
36
+ request.responseValue.channel = channel;
37
+ }
38
+ return success;
39
+ }
40
+ if (request.action === 'skipChannels' && this.skipChannelsCallback) {
41
+ const channelCount = request.requestValue.channelCount;
42
+ const success = await this.skipChannelsCallback(this.getDeviceId(), channelCount);
43
+ if (success) {
44
+ request.responseValue.channelCount = channelCount;
45
+ }
46
+ return success;
47
+ }
48
+ return false;
49
+ }
50
+ };
51
+ }
52
+ //# sourceMappingURL=ChannelController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelController.js","sourceRoot":"","sources":["../../src/capabilities/ChannelController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA+BH,8CAyDC;AArFD,uDAAoD;AAEpD,yCAAwE;AA0BxE,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,0BAAqB,GAAiC,IAAI,CAAC;YAC3D,yBAAoB,GAAgC,IAAI,CAAC;YACzD,wBAAmB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKhE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,eAAe,CAAC,QAA+B;YAC7C,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;QACxC,CAAC;QAED,cAAc,CAAC,QAA8B;YAC3C,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,gBAAgB,CACpB,OAAoB,EACpB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;QAEO,KAAK,CAAC,oBAAoB,CAAC,OAAyB;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACrE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;gBAE9E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC1C,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACnE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;gBAElF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,YAAY,CAAC;gBACpD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * ColorController - Adds RGB color control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ColorController = ColorController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function ColorController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.colorCallback = null;
15
+ this.colorEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleColorRequest.bind(this));
17
+ }
18
+ onColor(callback) {
19
+ this.colorCallback = callback;
20
+ }
21
+ async sendColorEvent(r, g, b, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.colorEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setColor', {
26
+ color: { r, g, b },
27
+ }, cause);
28
+ }
29
+ async handleColorRequest(request) {
30
+ if (request.action !== 'setColor' || !this.colorCallback) {
31
+ return false;
32
+ }
33
+ const { r, g, b } = request.requestValue.color;
34
+ const result = await this.colorCallback(this.getDeviceId(), r, g, b);
35
+ // Handle both boolean and object return types
36
+ let success;
37
+ if (typeof result === 'boolean') {
38
+ success = result;
39
+ }
40
+ else {
41
+ success = result.success;
42
+ if (result.message) {
43
+ request.errorMessage = result.message;
44
+ }
45
+ }
46
+ if (success) {
47
+ request.responseValue.color = { r, g, b };
48
+ }
49
+ return success;
50
+ }
51
+ };
52
+ }
53
+ //# sourceMappingURL=ColorController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorController.js","sourceRoot":"","sources":["../../src/capabilities/ColorController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,0CA4DC;AAxED,uDAAoD;AAEpD,yCAAwE;AAUxE,SAAgB,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,kBAAa,GAAyB,IAAI,CAAC;YAC3C,sBAAiB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK9D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,QAAuB;YAC7B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,cAAc,CAClB,CAAS,EACT,CAAS,EACT,CAAS,EACT,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CACnB,UAAU,EACV;gBACE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;aACnB,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAEO,KAAK,CAAC,kBAAkB,CAAC,OAAyB;YACxD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACzD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAErE,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * ColorTemperatureController - Adds color temperature control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ColorTemperatureController = ColorTemperatureController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function ColorTemperatureController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.colorTemperatureCallback = null;
15
+ this.colorTemperatureEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleColorTemperatureRequest.bind(this));
17
+ }
18
+ onColorTemperature(callback) {
19
+ this.colorTemperatureCallback = callback;
20
+ }
21
+ async sendColorTemperatureEvent(colorTemperature, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.colorTemperatureEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setColorTemperature', {
26
+ colorTemperature,
27
+ }, cause);
28
+ }
29
+ async handleColorTemperatureRequest(request) {
30
+ if (request.action !== 'setColorTemperature' || !this.colorTemperatureCallback) {
31
+ return false;
32
+ }
33
+ const colorTemperature = request.requestValue.colorTemperature;
34
+ const result = await this.colorTemperatureCallback(this.getDeviceId(), colorTemperature);
35
+ // Handle both boolean and object return types
36
+ let success;
37
+ if (typeof result === 'boolean') {
38
+ success = result;
39
+ }
40
+ else {
41
+ success = result.success;
42
+ if (result.message) {
43
+ request.errorMessage = result.message;
44
+ }
45
+ }
46
+ if (success) {
47
+ request.responseValue.colorTemperature = colorTemperature;
48
+ }
49
+ return success;
50
+ }
51
+ };
52
+ }
53
+ //# sourceMappingURL=ColorTemperatureController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorTemperatureController.js","sourceRoot":"","sources":["../../src/capabilities/ColorTemperatureController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,gEA0DC;AAtED,uDAAoD;AAEpD,yCAAwE;AAUxE,SAAgB,0BAA0B,CAAyC,IAAO;IACxF,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,6BAAwB,GAAoC,IAAI,CAAC;YACjE,iCAA4B,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKzE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,kBAAkB,CAAC,QAAkC;YACnD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,yBAAyB,CAC7B,gBAAwB,EACxB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CACnB,qBAAqB,EACrB;gBACE,gBAAgB;aACjB,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAEO,KAAK,CAAC,6BAA6B,CAAC,OAAyB;YACnE,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC/E,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAEzF,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YAC5D,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * ContactSensor - Adds contact/door sensor capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ContactSensor = ContactSensor;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function ContactSensor(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.contactEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
14
+ }
15
+ async sendContactEvent(detected, cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.contactEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('setContactState', { state: detected ? 'closed' : 'open' }, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=ContactSensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactSensor.js","sourceRoot":"","sources":["../../src/capabilities/ContactSensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAeC;AAzBD,uDAAoD;AACpD,yCAA+E;AAS/E,SAAgB,aAAa,CAAyC,IAAO;IAC3E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,wBAAmB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAY3E,CAAC;QAVC,KAAK,CAAC,gBAAgB,CACpB,QAAiB,EACjB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3F,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * Doorbell - Adds doorbell press capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Doorbell = Doorbell;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function Doorbell(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.doorbellEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
14
+ }
15
+ async sendDoorbellEvent(cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.doorbellEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('DoorbellPress', { state: 'pressed' }, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=Doorbell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Doorbell.js","sourceRoot":"","sources":["../../src/capabilities/Doorbell.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,4BAYC;AAtBD,uDAAoD;AACpD,yCAAwE;AASxE,SAAgB,QAAQ,CAAyC,IAAO;IACtE,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,yBAAoB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QASrE,CAAC;QAPC,KAAK,CAAC,iBAAiB,CAAC,QAAgB,4BAAoB;YAC1D,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC1C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * EqualizerController - Adds equalizer control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EqualizerController = EqualizerController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function EqualizerController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.setBandsCallback = null;
15
+ this.adjustBandsCallback = null;
16
+ this.setModeCallback = null;
17
+ this.equalizerEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
18
+ this.registerRequestHandler(this.handleEqualizerRequest.bind(this));
19
+ }
20
+ onSetBands(callback) {
21
+ this.setBandsCallback = callback;
22
+ }
23
+ onAdjustBands(callback) {
24
+ this.adjustBandsCallback = callback;
25
+ }
26
+ onSetMode(callback) {
27
+ this.setModeCallback = callback;
28
+ }
29
+ async sendBandsEvent(bands, cause = types_1.PHYSICAL_INTERACTION) {
30
+ if (this.equalizerEventLimiter.isLimited()) {
31
+ return false;
32
+ }
33
+ return this.sendEvent('setBands', { bands }, cause);
34
+ }
35
+ async sendModeEvent(mode, cause = types_1.PHYSICAL_INTERACTION) {
36
+ if (this.equalizerEventLimiter.isLimited()) {
37
+ return false;
38
+ }
39
+ return this.sendEvent('setMode', { mode }, cause);
40
+ }
41
+ async handleEqualizerRequest(request) {
42
+ if (request.action === 'setBands' && this.setBandsCallback) {
43
+ const bands = request.requestValue.bands;
44
+ const result = await this.setBandsCallback(this.getDeviceId(), bands);
45
+ // Handle both boolean and object return types
46
+ let success;
47
+ if (typeof result === 'boolean') {
48
+ success = result;
49
+ }
50
+ else {
51
+ success = result.success;
52
+ if (result.message) {
53
+ request.errorMessage = result.message;
54
+ }
55
+ }
56
+ if (success) {
57
+ request.responseValue.bands = bands;
58
+ }
59
+ return success;
60
+ }
61
+ if (request.action === 'adjustBands' && this.adjustBandsCallback) {
62
+ const bands = request.requestValue.bands;
63
+ const result = await this.adjustBandsCallback(this.getDeviceId(), bands);
64
+ // Handle both boolean and object return types
65
+ let success;
66
+ if (typeof result === 'boolean') {
67
+ success = result;
68
+ }
69
+ else {
70
+ success = result.success;
71
+ if (result.message) {
72
+ request.errorMessage = result.message;
73
+ }
74
+ }
75
+ if (success) {
76
+ request.responseValue.bands = bands;
77
+ }
78
+ return success;
79
+ }
80
+ if (request.action === 'setMode' && this.setModeCallback) {
81
+ const mode = request.requestValue.mode;
82
+ const result = await this.setModeCallback(this.getDeviceId(), mode);
83
+ // Handle both boolean and object return types
84
+ let success;
85
+ if (typeof result === 'boolean') {
86
+ success = result;
87
+ }
88
+ else {
89
+ success = result.success;
90
+ if (result.message) {
91
+ request.errorMessage = result.message;
92
+ }
93
+ }
94
+ if (success) {
95
+ request.responseValue.mode = mode;
96
+ }
97
+ return success;
98
+ }
99
+ return false;
100
+ }
101
+ };
102
+ }
103
+ //# sourceMappingURL=EqualizerController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EqualizerController.js","sourceRoot":"","sources":["../../src/capabilities/EqualizerController.ts"],"names":[],"mappings":"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"}