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.
- package/LICENSE +15 -0
- package/README.md +132 -15
- package/dist/capabilities/AirQualitySensor.js +23 -0
- package/dist/capabilities/AirQualitySensor.js.map +1 -0
- package/dist/capabilities/BrightnessController.js +76 -0
- package/dist/capabilities/BrightnessController.js.map +1 -0
- package/dist/capabilities/CameraController.js +29 -0
- package/dist/capabilities/CameraController.js.map +1 -0
- package/dist/capabilities/ChannelController.js +52 -0
- package/dist/capabilities/ChannelController.js.map +1 -0
- package/dist/capabilities/ColorController.js +53 -0
- package/dist/capabilities/ColorController.js.map +1 -0
- package/dist/capabilities/ColorTemperatureController.js +53 -0
- package/dist/capabilities/ColorTemperatureController.js.map +1 -0
- package/dist/capabilities/ContactSensor.js +23 -0
- package/dist/capabilities/ContactSensor.js.map +1 -0
- package/dist/capabilities/Doorbell.js +23 -0
- package/dist/capabilities/Doorbell.js.map +1 -0
- package/dist/capabilities/EqualizerController.js +103 -0
- package/dist/capabilities/EqualizerController.js.map +1 -0
- package/dist/capabilities/InputController.js +51 -0
- package/dist/capabilities/InputController.js.map +1 -0
- package/dist/capabilities/KeypadController.js +23 -0
- package/dist/capabilities/KeypadController.js.map +1 -0
- package/dist/capabilities/LockController.js +40 -0
- package/dist/capabilities/LockController.js.map +1 -0
- package/dist/capabilities/MediaController.js +40 -0
- package/dist/capabilities/MediaController.js.map +1 -0
- package/dist/capabilities/ModeController.js +51 -0
- package/dist/capabilities/ModeController.js.map +1 -0
- package/dist/capabilities/MotionSensor.js +23 -0
- package/dist/capabilities/MotionSensor.js.map +1 -0
- package/dist/capabilities/MuteController.js +51 -0
- package/dist/capabilities/MuteController.js.map +1 -0
- package/dist/capabilities/OpenCloseController.js +40 -0
- package/dist/capabilities/OpenCloseController.js.map +1 -0
- package/dist/capabilities/PercentageController.js +52 -0
- package/dist/capabilities/PercentageController.js.map +1 -0
- package/dist/capabilities/PowerLevelController.js +52 -0
- package/dist/capabilities/PowerLevelController.js.map +1 -0
- package/dist/capabilities/PowerSensor.js +23 -0
- package/dist/capabilities/PowerSensor.js.map +1 -0
- package/dist/capabilities/PowerStateController.js +53 -0
- package/dist/capabilities/PowerStateController.js.map +1 -0
- package/dist/capabilities/PushNotification.js +23 -0
- package/dist/capabilities/PushNotification.js.map +1 -0
- package/dist/capabilities/RangeController.js +52 -0
- package/dist/capabilities/RangeController.js.map +1 -0
- package/dist/capabilities/SettingController.js +33 -0
- package/dist/capabilities/SettingController.js.map +1 -0
- package/dist/capabilities/StartStopController.js +51 -0
- package/dist/capabilities/StartStopController.js.map +1 -0
- package/dist/capabilities/TemperatureSensor.js +29 -0
- package/dist/capabilities/TemperatureSensor.js.map +1 -0
- package/dist/capabilities/ThermostatController.js +70 -0
- package/dist/capabilities/ThermostatController.js.map +1 -0
- package/dist/capabilities/ToggleController.js +51 -0
- package/dist/capabilities/ToggleController.js.map +1 -0
- package/dist/capabilities/VolumeController.js +74 -0
- package/dist/capabilities/VolumeController.js.map +1 -0
- package/dist/capabilities/index.js +56 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/core/EventLimiter.js +50 -0
- package/dist/core/EventLimiter.js.map +1 -0
- package/dist/core/MessageQueue.js +28 -0
- package/dist/core/MessageQueue.js.map +1 -0
- package/dist/core/Signature.js +68 -0
- package/dist/core/Signature.js.map +1 -0
- package/dist/core/SinricPro.js +332 -0
- package/dist/core/SinricPro.js.map +1 -0
- package/dist/core/SinricProDevice.js +82 -0
- package/dist/core/SinricProDevice.js.map +1 -0
- package/dist/core/WebSocketClient.js +156 -0
- package/dist/core/WebSocketClient.js.map +1 -0
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -0
- package/dist/devices/SinricProAirQualitySensor.js +29 -0
- package/dist/devices/SinricProAirQualitySensor.js.map +1 -0
- package/dist/devices/SinricProBlinds.js +29 -0
- package/dist/devices/SinricProBlinds.js.map +1 -0
- package/dist/devices/SinricProCamera.js +29 -0
- package/dist/devices/SinricProCamera.js.map +1 -0
- package/dist/devices/SinricProContactSensor.js +28 -0
- package/dist/devices/SinricProContactSensor.js.map +1 -0
- package/dist/devices/SinricProDimSwitch.js +29 -0
- package/dist/devices/SinricProDimSwitch.js.map +1 -0
- package/dist/devices/SinricProDoorbell.js +29 -0
- package/dist/devices/SinricProDoorbell.js.map +1 -0
- package/dist/devices/SinricProFan.js +29 -0
- package/dist/devices/SinricProFan.js.map +1 -0
- package/dist/devices/SinricProFanUS.js +29 -0
- package/dist/devices/SinricProFanUS.js.map +1 -0
- package/dist/devices/SinricProGarageDoor.js +28 -0
- package/dist/devices/SinricProGarageDoor.js.map +1 -0
- package/dist/devices/SinricProLight.js +30 -0
- package/dist/devices/SinricProLight.js.map +1 -0
- package/dist/devices/SinricProLock.js +28 -0
- package/dist/devices/SinricProLock.js.map +1 -0
- package/dist/devices/SinricProMotionSensor.js +28 -0
- package/dist/devices/SinricProMotionSensor.js.map +1 -0
- package/dist/devices/SinricProPowerSensor.js +28 -0
- package/dist/devices/SinricProPowerSensor.js.map +1 -0
- package/dist/devices/SinricProSpeaker.js +33 -0
- package/dist/devices/SinricProSpeaker.js.map +1 -0
- package/dist/devices/SinricProSwitch.js +24 -0
- package/dist/devices/SinricProSwitch.js.map +1 -0
- package/dist/devices/SinricProTV.js +33 -0
- package/dist/devices/SinricProTV.js.map +1 -0
- package/dist/devices/SinricProThermostat.js +30 -0
- package/dist/devices/SinricProThermostat.js.map +1 -0
- package/dist/devices/SinricProWindowAC.js +31 -0
- package/dist/devices/SinricProWindowAC.js.map +1 -0
- package/dist/devices/index.js +44 -0
- package/dist/devices/index.js.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/SinricProSdkLogger.js +42 -0
- package/dist/utils/SinricProSdkLogger.js.map +1 -0
- package/package.json +78 -38
- package/.github/workflows/npm-publish.yml +0 -32
- package/.nvmrc +0 -1
- package/.prettierrc +0 -5
- package/CHANGELOG.md +0 -34
- package/index.js +0 -1
- package/lib/cbhandler.js +0 -182
- package/lib/contorllers/brightness_controller.js +0 -40
- package/lib/contorllers/camera_stream_controller.js +0 -39
- package/lib/contorllers/color_controller.js +0 -23
- package/lib/contorllers/color_temperature.js +0 -23
- package/lib/contorllers/mode_controller.js +0 -22
- package/lib/contorllers/power_controller.js +0 -53
- package/lib/contorllers/range_value_controller.js +0 -38
- package/lib/contorllers/sensors_controller.js +0 -54
- package/lib/contorllers/speaker_controller.js +0 -51
- package/lib/contorllers/toggle_state_controller.js +0 -21
- package/lib/contorllers/tv_controller.js +0 -93
- package/lib/errors/errors.js +0 -8
- package/lib/events/event_handler.js +0 -103
- package/lib/signature.js +0 -26
- package/lib/sinrcpro.js +0 -127
- package/lib/sinricproudp.js +0 -60
- package/lib/storage.js +0 -31
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RangeController - Adds generic range control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RangeController = RangeController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function RangeController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.rangeValueCallback = null;
|
|
15
|
+
this.adjustRangeValueCallback = null;
|
|
16
|
+
this.rangeEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
17
|
+
this.registerRequestHandler(this.handleRangeRequest.bind(this));
|
|
18
|
+
}
|
|
19
|
+
onRangeValue(callback) {
|
|
20
|
+
this.rangeValueCallback = callback;
|
|
21
|
+
}
|
|
22
|
+
onAdjustRangeValue(callback) {
|
|
23
|
+
this.adjustRangeValueCallback = callback;
|
|
24
|
+
}
|
|
25
|
+
async sendRangeValueEvent(rangeValue, cause = types_1.PHYSICAL_INTERACTION) {
|
|
26
|
+
if (this.rangeEventLimiter.isLimited()) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return this.sendEvent('setRangeValue', { rangeValue }, cause);
|
|
30
|
+
}
|
|
31
|
+
async handleRangeRequest(request) {
|
|
32
|
+
if (request.action === 'setRangeValue' && this.rangeValueCallback) {
|
|
33
|
+
const rangeValue = request.requestValue.rangeValue;
|
|
34
|
+
const success = await this.rangeValueCallback(this.getDeviceId(), rangeValue);
|
|
35
|
+
if (success) {
|
|
36
|
+
request.responseValue.rangeValue = rangeValue;
|
|
37
|
+
}
|
|
38
|
+
return success;
|
|
39
|
+
}
|
|
40
|
+
if (request.action === 'adjustRangeValue' && this.adjustRangeValueCallback) {
|
|
41
|
+
const rangeValueDelta = request.requestValue.rangeValueDelta;
|
|
42
|
+
const success = await this.adjustRangeValueCallback(this.getDeviceId(), rangeValueDelta);
|
|
43
|
+
if (success) {
|
|
44
|
+
request.responseValue.rangeValue = rangeValueDelta;
|
|
45
|
+
}
|
|
46
|
+
return success;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=RangeController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeController.js","sourceRoot":"","sources":["../../src/capabilities/RangeController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA0BH,0CAyDC;AAhFD,uDAAoD;AAEpD,yCAAwE;AAqBxE,SAAgB,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,uBAAkB,GAA8B,IAAI,CAAC;YACrD,6BAAwB,GAAoC,IAAI,CAAC;YACjE,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,YAAY,CAAC,QAA4B;YACvC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACrC,CAAC;QAED,kBAAkB,CAAC,QAAkC;YACnD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,UAAkB,EAClB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QAEO,KAAK,CAAC,kBAAkB,CAAC,OAAyB;YACxD,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAClE,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;gBAE9E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;gBAChD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;gBAC7D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;gBAEzF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,eAAe,CAAC;gBACrD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SettingController - Adds settings management capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SettingController = SettingController;
|
|
7
|
+
function SettingController(Base) {
|
|
8
|
+
return class extends Base {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
constructor(...args) {
|
|
11
|
+
super(...args);
|
|
12
|
+
this.settingCallback = null;
|
|
13
|
+
this.registerRequestHandler(this.handleSettingRequest.bind(this));
|
|
14
|
+
}
|
|
15
|
+
onSetting(callback) {
|
|
16
|
+
this.settingCallback = callback;
|
|
17
|
+
}
|
|
18
|
+
async handleSettingRequest(request) {
|
|
19
|
+
if (request.action !== 'setSetting' || !this.settingCallback) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const setting = request.requestValue.setting;
|
|
23
|
+
const value = request.requestValue.value;
|
|
24
|
+
const success = await this.settingCallback(this.getDeviceId(), setting, value);
|
|
25
|
+
if (success) {
|
|
26
|
+
request.responseValue.setting = setting;
|
|
27
|
+
request.responseValue.value = value;
|
|
28
|
+
}
|
|
29
|
+
return success;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=SettingController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingController.js","sourceRoot":"","sources":["../../src/capabilities/SettingController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAkBH,8CA+BC;AA/BD,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAGvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAJT,oBAAe,GAA2B,IAAI,CAAC;YAKrD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,SAAS,CAAC,QAAyB;YACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAClC,CAAC;QAEO,KAAK,CAAC,oBAAoB,CAAC,OAAyB;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAE/E,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC;gBACxC,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* StartStopController - Adds start/stop control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StartStopController = StartStopController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function StartStopController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.startStopCallback = null;
|
|
15
|
+
this.startStopEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
16
|
+
this.registerRequestHandler(this.handleStartStopRequest.bind(this));
|
|
17
|
+
}
|
|
18
|
+
onStartStop(callback) {
|
|
19
|
+
this.startStopCallback = callback;
|
|
20
|
+
}
|
|
21
|
+
async sendStartStopEvent(start, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.startStopEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('setStartStop', { state: start }, cause);
|
|
26
|
+
}
|
|
27
|
+
async handleStartStopRequest(request) {
|
|
28
|
+
if (request.action !== 'setStartStop' || !this.startStopCallback) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const start = request.requestValue.state;
|
|
32
|
+
const result = await this.startStopCallback(this.getDeviceId(), start);
|
|
33
|
+
// Handle both boolean and object return types
|
|
34
|
+
let success;
|
|
35
|
+
if (typeof result === 'boolean') {
|
|
36
|
+
success = result;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
success = result.success;
|
|
40
|
+
if (result.message) {
|
|
41
|
+
request.errorMessage = result.message;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (success) {
|
|
45
|
+
request.responseValue.state = start;
|
|
46
|
+
}
|
|
47
|
+
return success;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=StartStopController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartStopController.js","sourceRoot":"","sources":["../../src/capabilities/StartStopController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,kDAoDC;AArED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,mBAAmB,CAAyC,IAAO;IACjF,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,sBAAiB,GAA6B,IAAI,CAAC;YACnD,0BAAqB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKlE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,WAAW,CAAC,QAA2B;YACrC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,kBAAkB,CACtB,KAAc,EACd,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QAEO,KAAK,CAAC,sBAAsB,CAAC,OAAyB;YAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACjE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;YAEvE,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,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TemperatureSensor - Adds temperature reporting capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TemperatureSensor = TemperatureSensor;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function TemperatureSensor(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.temperatureEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
|
|
14
|
+
}
|
|
15
|
+
async sendTemperatureEvent(temperature, humidity, cause = types_1.PERIODIC_POLL) {
|
|
16
|
+
if (this.temperatureEventLimiter.isLimited()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const value = {
|
|
20
|
+
temperature,
|
|
21
|
+
};
|
|
22
|
+
if (humidity !== undefined) {
|
|
23
|
+
value.humidity = humidity;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('currentTemperature', value, cause);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=TemperatureSensor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemperatureSensor.js","sourceRoot":"","sources":["../../src/capabilities/TemperatureSensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,8CAwBC;AAlCD,uDAAoD;AACpD,yCAAwE;AASxE,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,4BAAuB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAqB/E,CAAC;QAnBC,KAAK,CAAC,oBAAoB,CACxB,WAAmB,EACnB,QAAiB,EACjB,QAAgB,qBAAa;YAE7B,IAAI,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,KAAK,GAA4B;gBACrC,WAAW;aACZ,CAAC;YAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThermostatController - Adds thermostat control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ThermostatController = ThermostatController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ThermostatController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.thermostatModeCallback = null;
|
|
15
|
+
this.targetTemperatureCallback = null;
|
|
16
|
+
this.adjustTargetTemperatureCallback = null;
|
|
17
|
+
this.thermostatEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
18
|
+
this.registerRequestHandler(this.handleThermostatRequest.bind(this));
|
|
19
|
+
}
|
|
20
|
+
onThermostatMode(callback) {
|
|
21
|
+
this.thermostatModeCallback = callback;
|
|
22
|
+
}
|
|
23
|
+
onTargetTemperature(callback) {
|
|
24
|
+
this.targetTemperatureCallback = callback;
|
|
25
|
+
}
|
|
26
|
+
onAdjustTargetTemperature(callback) {
|
|
27
|
+
this.adjustTargetTemperatureCallback = callback;
|
|
28
|
+
}
|
|
29
|
+
async sendThermostatModeEvent(mode, cause = types_1.PHYSICAL_INTERACTION) {
|
|
30
|
+
if (this.thermostatEventLimiter.isLimited()) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return this.sendEvent('setThermostatMode', { thermostatMode: mode }, cause);
|
|
34
|
+
}
|
|
35
|
+
async sendTargetTemperatureEvent(temperature, cause = types_1.PHYSICAL_INTERACTION) {
|
|
36
|
+
if (this.thermostatEventLimiter.isLimited()) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return this.sendEvent('targetTemperature', { temperature }, cause);
|
|
40
|
+
}
|
|
41
|
+
async handleThermostatRequest(request) {
|
|
42
|
+
if (request.action === 'setThermostatMode' && this.thermostatModeCallback) {
|
|
43
|
+
const mode = request.requestValue.thermostatMode;
|
|
44
|
+
const success = await this.thermostatModeCallback(this.getDeviceId(), mode);
|
|
45
|
+
if (success) {
|
|
46
|
+
request.responseValue.thermostatMode = mode;
|
|
47
|
+
}
|
|
48
|
+
return success;
|
|
49
|
+
}
|
|
50
|
+
if (request.action === 'targetTemperature' && this.targetTemperatureCallback) {
|
|
51
|
+
const temperature = request.requestValue.temperature;
|
|
52
|
+
const success = await this.targetTemperatureCallback(this.getDeviceId(), temperature);
|
|
53
|
+
if (success) {
|
|
54
|
+
request.responseValue.temperature = temperature;
|
|
55
|
+
}
|
|
56
|
+
return success;
|
|
57
|
+
}
|
|
58
|
+
if (request.action === 'adjustTargetTemperature' && this.adjustTargetTemperatureCallback) {
|
|
59
|
+
const temperatureDelta = request.requestValue.temperature.value;
|
|
60
|
+
const success = await this.adjustTargetTemperatureCallback(this.getDeviceId(), temperatureDelta);
|
|
61
|
+
if (success) {
|
|
62
|
+
request.responseValue.temperature = request.requestValue.temperature;
|
|
63
|
+
}
|
|
64
|
+
return success;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ThermostatController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThermostatController.js","sourceRoot":"","sources":["../../src/capabilities/ThermostatController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ToggleController - Adds generic toggle control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ToggleController = ToggleController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ToggleController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.toggleStateCallback = null;
|
|
15
|
+
this.toggleEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
16
|
+
this.registerRequestHandler(this.handleToggleRequest.bind(this));
|
|
17
|
+
}
|
|
18
|
+
onToggleState(callback) {
|
|
19
|
+
this.toggleStateCallback = callback;
|
|
20
|
+
}
|
|
21
|
+
async sendToggleStateEvent(state, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.toggleEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('setToggleState', { state }, cause);
|
|
26
|
+
}
|
|
27
|
+
async handleToggleRequest(request) {
|
|
28
|
+
if (request.action !== 'setToggleState' || !this.toggleStateCallback) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const state = request.requestValue.state;
|
|
32
|
+
const result = await this.toggleStateCallback(this.getDeviceId(), state);
|
|
33
|
+
// Handle both boolean and object return types
|
|
34
|
+
let success;
|
|
35
|
+
if (typeof result === 'boolean') {
|
|
36
|
+
success = result;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
success = result.success;
|
|
40
|
+
if (result.message) {
|
|
41
|
+
request.errorMessage = result.message;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (success) {
|
|
45
|
+
request.responseValue.state = state;
|
|
46
|
+
}
|
|
47
|
+
return success;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ToggleController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleController.js","sourceRoot":"","sources":["../../src/capabilities/ToggleController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,4CAoDC;AArED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,wBAAmB,GAA+B,IAAI,CAAC;YACvD,uBAAkB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK/D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,aAAa,CAAC,QAA6B;YACzC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,oBAAoB,CACxB,KAAc,EACd,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QAEO,KAAK,CAAC,mBAAmB,CAAC,OAAyB;YACzD,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;YAEzE,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,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VolumeController - Adds volume control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VolumeController = VolumeController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function VolumeController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.volumeCallback = null;
|
|
15
|
+
this.adjustVolumeCallback = null;
|
|
16
|
+
this.volumeEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
17
|
+
this.registerRequestHandler(this.handleVolumeRequest.bind(this));
|
|
18
|
+
}
|
|
19
|
+
onVolume(callback) {
|
|
20
|
+
this.volumeCallback = callback;
|
|
21
|
+
}
|
|
22
|
+
onAdjustVolume(callback) {
|
|
23
|
+
this.adjustVolumeCallback = callback;
|
|
24
|
+
}
|
|
25
|
+
async sendVolumeEvent(volume, cause = types_1.PHYSICAL_INTERACTION) {
|
|
26
|
+
if (this.volumeEventLimiter.isLimited()) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return this.sendEvent('setVolume', { volume }, cause);
|
|
30
|
+
}
|
|
31
|
+
async handleVolumeRequest(request) {
|
|
32
|
+
if (request.action === 'setVolume' && this.volumeCallback) {
|
|
33
|
+
const volume = request.requestValue.volume;
|
|
34
|
+
const result = await this.volumeCallback(this.getDeviceId(), volume);
|
|
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.volume = volume;
|
|
48
|
+
}
|
|
49
|
+
return success;
|
|
50
|
+
}
|
|
51
|
+
if (request.action === 'adjustVolume' && this.adjustVolumeCallback) {
|
|
52
|
+
const volumeDelta = request.requestValue.volumeDelta;
|
|
53
|
+
const result = await this.adjustVolumeCallback(this.getDeviceId(), volumeDelta);
|
|
54
|
+
// Handle both boolean and object return types
|
|
55
|
+
let success;
|
|
56
|
+
if (typeof result === 'boolean') {
|
|
57
|
+
success = result;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
success = result.success;
|
|
61
|
+
if (result.message) {
|
|
62
|
+
request.errorMessage = result.message;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (success) {
|
|
66
|
+
request.responseValue.volume = volumeDelta;
|
|
67
|
+
}
|
|
68
|
+
return success;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=VolumeController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeController.js","sourceRoot":"","sources":["../../src/capabilities/VolumeController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA0BH,4CA4EC;AAnGD,uDAAoD;AAEpD,yCAAwE;AAqBxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,mBAAc,GAA0B,IAAI,CAAC;YAC7C,yBAAoB,GAAgC,IAAI,CAAC;YACzD,uBAAkB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK/D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,QAAQ,CAAC,QAAwB;YAC/B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QACjC,CAAC;QAED,cAAc,CAAC,QAA8B;YAC3C,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,QAAgB,4BAAoB;YACxE,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAEO,KAAK,CAAC,mBAAmB,CAAC,OAAyB;YACzD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;gBAErE,8CAA8C;gBAC9C,IAAI,OAAgB,CAAC;gBACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,GAAG,MAAM,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;oBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxC,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACnE,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;gBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;gBAEhF,8CAA8C;gBAC9C,IAAI,OAAgB,CAAC;gBACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,GAAG,MAAM,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;oBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC7C,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Export all capability controllers
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
// Basic controls
|
|
21
|
+
__exportStar(require("./PowerStateController"), exports);
|
|
22
|
+
__exportStar(require("./BrightnessController"), exports);
|
|
23
|
+
__exportStar(require("./ColorController"), exports);
|
|
24
|
+
__exportStar(require("./ColorTemperatureController"), exports);
|
|
25
|
+
// Media & Audio
|
|
26
|
+
__exportStar(require("./VolumeController"), exports);
|
|
27
|
+
__exportStar(require("./MuteController"), exports);
|
|
28
|
+
__exportStar(require("./MediaController"), exports);
|
|
29
|
+
__exportStar(require("./EqualizerController"), exports);
|
|
30
|
+
// TV
|
|
31
|
+
__exportStar(require("./ChannelController"), exports);
|
|
32
|
+
__exportStar(require("./InputController"), exports);
|
|
33
|
+
// Sensors
|
|
34
|
+
__exportStar(require("./TemperatureSensor"), exports);
|
|
35
|
+
__exportStar(require("./MotionSensor"), exports);
|
|
36
|
+
__exportStar(require("./ContactSensor"), exports);
|
|
37
|
+
__exportStar(require("./AirQualitySensor"), exports);
|
|
38
|
+
__exportStar(require("./PowerSensor"), exports);
|
|
39
|
+
// Control
|
|
40
|
+
__exportStar(require("./LockController"), exports);
|
|
41
|
+
__exportStar(require("./ThermostatController"), exports);
|
|
42
|
+
__exportStar(require("./OpenCloseController"), exports);
|
|
43
|
+
// Generic
|
|
44
|
+
__exportStar(require("./RangeController"), exports);
|
|
45
|
+
__exportStar(require("./ModeController"), exports);
|
|
46
|
+
__exportStar(require("./ToggleController"), exports);
|
|
47
|
+
__exportStar(require("./PercentageController"), exports);
|
|
48
|
+
__exportStar(require("./PowerLevelController"), exports);
|
|
49
|
+
__exportStar(require("./StartStopController"), exports);
|
|
50
|
+
// Utility
|
|
51
|
+
__exportStar(require("./PushNotification"), exports);
|
|
52
|
+
__exportStar(require("./SettingController"), exports);
|
|
53
|
+
__exportStar(require("./KeypadController"), exports);
|
|
54
|
+
__exportStar(require("./CameraController"), exports);
|
|
55
|
+
__exportStar(require("./Doorbell"), exports);
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,iBAAiB;AACjB,yDAAuC;AACvC,yDAAuC;AACvC,oDAAkC;AAClC,+DAA6C;AAE7C,gBAAgB;AAChB,qDAAmC;AACnC,mDAAiC;AACjC,oDAAkC;AAClC,wDAAsC;AAEtC,KAAK;AACL,sDAAoC;AACpC,oDAAkC;AAElC,UAAU;AACV,sDAAoC;AACpC,iDAA+B;AAC/B,kDAAgC;AAChC,qDAAmC;AACnC,gDAA8B;AAE9B,UAAU;AACV,mDAAiC;AACjC,yDAAuC;AACvC,wDAAsC;AAEtC,UAAU;AACV,oDAAkC;AAClC,mDAAiC;AACjC,qDAAmC;AACnC,yDAAuC;AACvC,yDAAuC;AACvC,wDAAsC;AAEtC,UAAU;AACV,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC;AACnC,qDAAmC;AACnC,6CAA2B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event rate limiter to prevent excessive event sending
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EventLimiter = void 0;
|
|
7
|
+
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
8
|
+
class EventLimiter {
|
|
9
|
+
constructor(minimumDistance = 1000) {
|
|
10
|
+
this.nextEvent = 0;
|
|
11
|
+
this.extraDistance = 0;
|
|
12
|
+
this.failCounter = 0;
|
|
13
|
+
this.minimumDistance = minimumDistance;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if event should be limited
|
|
17
|
+
* @returns true if event should be blocked, false if allowed
|
|
18
|
+
*/
|
|
19
|
+
isLimited() {
|
|
20
|
+
const currentTime = Date.now();
|
|
21
|
+
const failThreshold = Math.floor(this.minimumDistance / 4);
|
|
22
|
+
if (currentTime >= this.nextEvent) {
|
|
23
|
+
if (this.failCounter > failThreshold) {
|
|
24
|
+
this.extraDistance += this.minimumDistance;
|
|
25
|
+
this.failCounter = 0;
|
|
26
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`Event limiter: Too many events detected. Adding ${this.extraDistance}ms delay.`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.extraDistance = 0;
|
|
30
|
+
}
|
|
31
|
+
this.nextEvent = currentTime + this.minimumDistance + this.extraDistance;
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
this.failCounter++;
|
|
35
|
+
if (this.failCounter === failThreshold) {
|
|
36
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`WARNING: YOUR CODE SENDS EXCESSIVE EVENTS! Events will be limited by an additional ${this.extraDistance / 1000}s delay. Please check your code!`);
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reset the limiter
|
|
42
|
+
*/
|
|
43
|
+
reset() {
|
|
44
|
+
this.nextEvent = 0;
|
|
45
|
+
this.extraDistance = 0;
|
|
46
|
+
this.failCounter = 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.EventLimiter = EventLimiter;
|
|
50
|
+
//# sourceMappingURL=EventLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventLimiter.js","sourceRoot":"","sources":["../../src/core/EventLimiter.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,oEAAiE;AAEjE,MAAa,YAAY;IAMvB,YAAY,kBAA0B,IAAI;QAJlC,cAAS,GAAW,CAAC,CAAC;QACtB,kBAAa,GAAW,CAAC,CAAC;QAC1B,gBAAW,GAAW,CAAC,CAAC;QAG9B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;QAE3D,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,WAAW,GAAG,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC;gBAC3C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;gBACrB,uCAAkB,CAAC,IAAI,CACrB,mDAAmD,IAAI,CAAC,aAAa,WAAW,CACjF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;YACvC,uCAAkB,CAAC,IAAI,CACrB,sFAAsF,IAAI,CAAC,aAAa,GAAG,IAAI,kCAAkC,CAClJ,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;CACF;AApDD,oCAoDC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple message queue implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MessageQueue = void 0;
|
|
7
|
+
class MessageQueue {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.queue = [];
|
|
10
|
+
}
|
|
11
|
+
push(message) {
|
|
12
|
+
this.queue.push(message);
|
|
13
|
+
}
|
|
14
|
+
pop() {
|
|
15
|
+
return this.queue.shift();
|
|
16
|
+
}
|
|
17
|
+
size() {
|
|
18
|
+
return this.queue.length;
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
this.queue = [];
|
|
22
|
+
}
|
|
23
|
+
isEmpty() {
|
|
24
|
+
return this.queue.length === 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.MessageQueue = MessageQueue;
|
|
28
|
+
//# sourceMappingURL=MessageQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/core/MessageQueue.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,YAAY;IAAzB;QACU,UAAK,GAAa,EAAE,CAAC;IAqB/B,CAAC;IAnBC,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;CACF;AAtBD,oCAsBC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HMAC-SHA256 signature implementation for SinricPro authentication
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Signature = void 0;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
class Signature {
|
|
9
|
+
constructor(appSecret) {
|
|
10
|
+
this.appSecret = appSecret;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Calculate HMAC-SHA256 signature and encode as base64
|
|
14
|
+
*/
|
|
15
|
+
hmacBase64(message, key) {
|
|
16
|
+
const hmac = (0, crypto_1.createHmac)('sha256', key);
|
|
17
|
+
hmac.update(message);
|
|
18
|
+
return hmac.digest('base64');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract payload from JSON message string
|
|
22
|
+
*/
|
|
23
|
+
extractPayload(messageStr) {
|
|
24
|
+
const beginPayload = messageStr.indexOf('"payload":');
|
|
25
|
+
const endPayload = messageStr.indexOf(',"signature"', beginPayload);
|
|
26
|
+
if (beginPayload > 0 && endPayload > 0) {
|
|
27
|
+
return messageStr.substring(beginPayload + 10, endPayload);
|
|
28
|
+
}
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate signature for a payload
|
|
33
|
+
*/
|
|
34
|
+
calculateSignature(payload) {
|
|
35
|
+
if (!payload)
|
|
36
|
+
return '';
|
|
37
|
+
return this.hmacBase64(payload, this.appSecret);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Sign a message object
|
|
41
|
+
*/
|
|
42
|
+
sign(message) {
|
|
43
|
+
const payloadStr = JSON.stringify(message.payload);
|
|
44
|
+
const signature = this.calculateSignature(payloadStr);
|
|
45
|
+
if (!message.signature) {
|
|
46
|
+
message.signature = { HMAC: '' };
|
|
47
|
+
}
|
|
48
|
+
message.signature.HMAC = signature;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate message signature
|
|
52
|
+
*/
|
|
53
|
+
validate(message) {
|
|
54
|
+
// Timestamp messages don't have signatures
|
|
55
|
+
if ('timestamp' in message) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (!message.signature || !message.signature.HMAC) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const messageStr = JSON.stringify(message);
|
|
62
|
+
const payload = this.extractPayload(messageStr);
|
|
63
|
+
const calculatedSignature = this.calculateSignature(payload);
|
|
64
|
+
return calculatedSignature === message.signature.HMAC;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.Signature = Signature;
|
|
68
|
+
//# sourceMappingURL=Signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Signature.js","sourceRoot":"","sources":["../../src/core/Signature.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mCAAoC;AAGpC,MAAa,SAAS;IAGpB,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAe,EAAE,GAAW;QAC7C,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,UAAkB;QACvC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAEpE,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAe;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAyB;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAyB;QAChC,2CAA2C;QAC3C,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE7D,OAAO,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;IACxD,CAAC;CACF;AAtED,8BAsEC"}
|