sinricpro 2.7.1 → 2.8.1
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/lib/cbhandler.js +37 -71
- package/lib/contorllers/brightness_controller.js +24 -15
- package/lib/contorllers/color_controller.js +10 -7
- package/lib/contorllers/color_temperature.js +9 -7
- package/lib/contorllers/mode_controller.js +11 -10
- package/lib/contorllers/power_controller.js +29 -21
- package/lib/contorllers/range_value_controller.js +18 -16
- package/lib/contorllers/sensors_controller.js +27 -19
- package/lib/contorllers/speaker_controller.js +27 -19
- package/lib/contorllers/toggle_state_controller.js +11 -9
- package/lib/contorllers/tv_controller.js +60 -43
- package/lib/contorllers/webrtc_controller.js +21 -0
- package/lib/errors/errors.js +8 -0
- package/lib/sinrcpro.js +1 -1
- package/package.json +2 -1
package/lib/cbhandler.js
CHANGED
|
@@ -19,6 +19,8 @@ const { Bands, BandReset } = require('./contorllers/speaker_controller');
|
|
|
19
19
|
const { AdjustBands } = require('./contorllers/speaker_controller');
|
|
20
20
|
const { ToggleState } = require('./contorllers/toggle_state_controller');
|
|
21
21
|
const { Mode } = require('./contorllers/mode_controller');
|
|
22
|
+
const { WebRTC } = require('./contorllers/webrtc_controller');
|
|
23
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('./errors/errors');
|
|
22
24
|
|
|
23
25
|
const jsonResponse = (client, defaultPayload, payloadValue, instanceId) => {
|
|
24
26
|
const header = {
|
|
@@ -38,158 +40,122 @@ const jsonResponse = (client, defaultPayload, payloadValue, instanceId) => {
|
|
|
38
40
|
value: payloadValue,
|
|
39
41
|
};
|
|
40
42
|
|
|
41
|
-
if(instanceId) payload.instanceId = instanceId;
|
|
42
|
-
|
|
43
|
+
if (instanceId) payload.instanceId = instanceId;
|
|
44
|
+
|
|
43
45
|
const signature = {
|
|
44
46
|
HMAC: getSignature(client, JSON.stringify(payload)),
|
|
45
47
|
};
|
|
46
48
|
return { header, payload, signature };
|
|
47
49
|
};
|
|
48
50
|
|
|
51
|
+
const handleError = (e) => {
|
|
52
|
+
if (e instanceof UndefinedCallbackError || e instanceof InvalidResponseError) {
|
|
53
|
+
console.error(e);
|
|
54
|
+
} else if (process.env.SR_DEBUG) console.log(e.message);
|
|
55
|
+
};
|
|
56
|
+
|
|
49
57
|
const handlePayload = (client, payload, signature, callbacks) => verifySignature(client, payload, signature)
|
|
50
58
|
.then((action) => {
|
|
51
59
|
/* eslint no-else-return: ["error", {allowElseIf: true}] */
|
|
52
60
|
if (action === 'setPowerState') {
|
|
53
61
|
return powerState(payload, callbacks)
|
|
54
62
|
.then((value) => jsonResponse(client, payload, value))
|
|
55
|
-
.catch(
|
|
56
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
57
|
-
});
|
|
63
|
+
.catch(handleError);
|
|
58
64
|
} else if (action === 'setPowerLevel') {
|
|
59
65
|
return powerLevel(payload, callbacks)
|
|
60
66
|
.then((value) => jsonResponse(client, payload, value))
|
|
61
|
-
.catch(
|
|
62
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
63
|
-
});
|
|
67
|
+
.catch(handleError);
|
|
64
68
|
} else if (action === 'adjustPowerLevel') {
|
|
65
69
|
return powerLevelAdjust(payload, callbacks)
|
|
66
70
|
.then((value) => jsonResponse(client, payload, value))
|
|
67
|
-
.catch(
|
|
68
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
69
|
-
});
|
|
71
|
+
.catch(handleError);
|
|
70
72
|
} else if (action === 'setBrightness') {
|
|
71
73
|
return Brightness(payload, callbacks)
|
|
72
74
|
.then((value) => jsonResponse(client, payload, value))
|
|
73
|
-
.catch(
|
|
74
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
75
|
-
});
|
|
75
|
+
.catch(handleError);
|
|
76
76
|
} else if (action === 'adjustBrightness') {
|
|
77
77
|
return BrightnessAdjust(payload, callbacks)
|
|
78
78
|
.then((value) => jsonResponse(client, payload, value))
|
|
79
|
-
.catch(
|
|
80
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
81
|
-
});
|
|
79
|
+
.catch(handleError);
|
|
82
80
|
} else if (action === 'setColor') {
|
|
83
81
|
return Color(payload, callbacks)
|
|
84
82
|
.then((value) => jsonResponse(client, payload, value))
|
|
85
|
-
.catch(
|
|
86
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
87
|
-
});
|
|
83
|
+
.catch(handleError);
|
|
88
84
|
} else if (action === 'setColorTemperature') {
|
|
89
85
|
return ColorTemperature(payload, callbacks)
|
|
90
86
|
.then((value) => jsonResponse(client, payload, value))
|
|
91
|
-
.catch(
|
|
92
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
93
|
-
});
|
|
87
|
+
.catch(handleError);
|
|
94
88
|
} else if (action === 'setThermostatMode') {
|
|
95
89
|
return ThermoStatMode(payload, callbacks)
|
|
96
90
|
.then((value) => jsonResponse(client, payload, value))
|
|
97
|
-
.catch(
|
|
98
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
99
|
-
});
|
|
91
|
+
.catch(handleError);
|
|
100
92
|
} else if (action === 'targetTemperature') {
|
|
101
93
|
return ThermoStatTemperature(payload, callbacks)
|
|
102
94
|
.then((value) => jsonResponse(client, payload, value))
|
|
103
|
-
.catch(
|
|
104
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
105
|
-
});
|
|
95
|
+
.catch(handleError);
|
|
106
96
|
} else if (action === 'setRangeValue') {
|
|
107
97
|
return RangeValue(payload, callbacks)
|
|
108
98
|
.then(([value, instanceId]) => jsonResponse(client, payload, value, instanceId))
|
|
109
|
-
.catch(
|
|
110
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
111
|
-
});
|
|
99
|
+
.catch(handleError);
|
|
112
100
|
} else if (action === 'adjustRangeValue') {
|
|
113
101
|
return RangeValueAdjust(payload, callbacks)
|
|
114
102
|
.then(([value, instanceId]) => jsonResponse(client, payload, value, instanceId))
|
|
115
|
-
.catch(
|
|
116
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
117
|
-
});
|
|
103
|
+
.catch(handleError);
|
|
118
104
|
} else if (action === 'setVolume') {
|
|
119
105
|
return Volume(payload, callbacks)
|
|
120
106
|
.then((value) => jsonResponse(client, payload, value))
|
|
121
|
-
.catch(
|
|
122
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
123
|
-
});
|
|
107
|
+
.catch(handleError);
|
|
124
108
|
} else if (action === 'adjustVolume') {
|
|
125
109
|
return VolumeAdjust(payload, callbacks)
|
|
126
110
|
.then((value) => jsonResponse(client, payload, value))
|
|
127
|
-
.catch(
|
|
128
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
129
|
-
});
|
|
111
|
+
.catch(handleError);
|
|
130
112
|
} else if (action === 'selectInput') {
|
|
131
113
|
return Input(payload, callbacks)
|
|
132
114
|
.then((value) => jsonResponse(client, payload, value))
|
|
133
|
-
.catch(
|
|
134
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
135
|
-
});
|
|
115
|
+
.catch(handleError);
|
|
136
116
|
} else if (action === 'mediaControl') {
|
|
137
117
|
return Media(payload, callbacks)
|
|
138
118
|
.then((value) => jsonResponse(client, payload, value))
|
|
139
|
-
.catch(
|
|
140
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
141
|
-
});
|
|
119
|
+
.catch(handleError);
|
|
142
120
|
} else if (action === 'changeChannel') {
|
|
143
121
|
return ChangeChannel(payload, callbacks)
|
|
144
122
|
.then((value) => jsonResponse(client, payload, value))
|
|
145
|
-
.catch(
|
|
146
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
147
|
-
});
|
|
123
|
+
.catch(handleError);
|
|
148
124
|
} else if (action === 'skipChannels') {
|
|
149
125
|
return SkipChannel(payload, callbacks)
|
|
150
126
|
.then((value) => jsonResponse(client, payload, value))
|
|
151
|
-
.catch(
|
|
152
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
153
|
-
});
|
|
127
|
+
.catch(handleError);
|
|
154
128
|
} else if (action === 'setBands') {
|
|
155
129
|
return Bands(payload, callbacks)
|
|
156
130
|
.then((value) => jsonResponse(client, payload, value))
|
|
157
|
-
.catch(
|
|
158
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
159
|
-
});
|
|
131
|
+
.catch(handleError);
|
|
160
132
|
} else if (action === 'adjustBands') {
|
|
161
133
|
return AdjustBands(payload, callbacks)
|
|
162
134
|
.then((value) => jsonResponse(client, payload, value))
|
|
163
|
-
.catch(
|
|
164
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
165
|
-
});
|
|
135
|
+
.catch(handleError);
|
|
166
136
|
} else if (action === 'resetBands') {
|
|
167
137
|
return BandReset(payload, callbacks)
|
|
168
138
|
.then((value) => jsonResponse(client, payload, value))
|
|
169
|
-
.catch(
|
|
170
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
171
|
-
});
|
|
139
|
+
.catch(handleError);
|
|
172
140
|
} else if (action === 'setMode') {
|
|
173
141
|
return Mode(payload, callbacks)
|
|
174
142
|
.then(([value, instanceId]) => jsonResponse(client, payload, value, instanceId))
|
|
175
|
-
.catch(
|
|
176
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
177
|
-
});
|
|
143
|
+
.catch(handleError);
|
|
178
144
|
} else if (action === 'setLockState') {
|
|
179
145
|
return Lock(payload, callbacks)
|
|
180
146
|
.then((value) => jsonResponse(client, payload, value))
|
|
181
|
-
.catch(
|
|
182
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
183
|
-
});
|
|
147
|
+
.catch(handleError);
|
|
184
148
|
} else if (action === 'setMute') {
|
|
185
149
|
return Mute(payload, callbacks)
|
|
186
150
|
.then((value) => jsonResponse(client, payload, value))
|
|
187
|
-
.catch(
|
|
188
|
-
if (process.env.SR_DEBUG) console.log(err.message);
|
|
189
|
-
});
|
|
151
|
+
.catch(handleError);
|
|
190
152
|
} else if (action === 'setToggleState') {
|
|
191
153
|
return ToggleState(payload, callbacks)
|
|
192
154
|
.then(([value, instanceId]) => jsonResponse(client, payload, value, instanceId))
|
|
155
|
+
.catch(handleError);
|
|
156
|
+
} else if (action === 'webrtcOffer') {
|
|
157
|
+
return WebRTC(payload, callbacks)
|
|
158
|
+
.then(([value, answer]) => jsonResponse(client, payload, { answer: answer } ))
|
|
193
159
|
.catch((err) => {
|
|
194
160
|
if (process.env.SR_DEBUG) console.log(err.message);
|
|
195
161
|
});
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,25 +6,35 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const Brightness = (payload, callback) => {
|
|
11
|
+
const Brightness = async (payload, callback) => {
|
|
12
12
|
sinricProData.brightness = payload.value.brightness;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
if (callback.setBrightness) {
|
|
15
|
+
const resp = await callback.setBrightness(payload.deviceId, sinricProData.brightness);
|
|
16
|
+
if (payload.value.brightness && resp) return payload.value;
|
|
17
|
+
throw new InvalidResponseError('brightness is undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setBrightness callback is undefined.');
|
|
20
|
+
}
|
|
18
21
|
};
|
|
19
22
|
|
|
20
|
-
const BrightnessAdjust = (payload, callback) => {
|
|
23
|
+
const BrightnessAdjust = async (payload, callback) => {
|
|
21
24
|
sinricProData.brightness += payload.value.brightnessDelta;
|
|
22
|
-
if (sinricProData.brightness < 0)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
if (sinricProData.brightness < 0) {
|
|
26
|
+
sinricProData.brightness = 0;
|
|
27
|
+
} else if (sinricProData.brightness > 100) {
|
|
28
|
+
sinricProData.brightness = 100;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (callback.adjustBrightness) {
|
|
32
|
+
const resp = await callback.adjustBrightness(payload.deviceId, sinricProData.brightness);
|
|
33
|
+
if (payload.value.brightness && resp) return { brightness: sinricProData.brightness };
|
|
34
|
+
throw new InvalidResponseError('brightness is undefined');
|
|
35
|
+
} else {
|
|
36
|
+
throw new UndefinedCallbackError('setBrightness callback is undefined');
|
|
37
|
+
}
|
|
29
38
|
};
|
|
30
39
|
|
|
31
40
|
module.exports = { Brightness, BrightnessAdjust };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,14 +6,18 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const Color = (payload, callbacks) => {
|
|
11
|
+
const Color = async (payload, callbacks) => {
|
|
12
12
|
sinricProData.color = payload.value.color;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
if (callbacks.setColor) {
|
|
15
|
+
const resp = await callbacks.setColor(payload.deviceId, payload.value.color);
|
|
16
|
+
if (payload.value.color && resp) return payload.value;
|
|
17
|
+
throw new InvalidResponseError('Colors undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setColor callback is undefined');
|
|
20
|
+
}
|
|
18
21
|
};
|
|
19
22
|
|
|
20
23
|
module.exports = { Color };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,15 +6,18 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const ColorTemperature = (payload, callbacks) => {
|
|
11
|
+
const ColorTemperature = async (payload, callbacks) => {
|
|
12
12
|
sinricProData.colorTemperature = payload.value.colorTemperature;
|
|
13
|
-
const resp = callbacks.setColorTemperature(payload.deviceId, payload.value.colorTemperature);
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
if (callbacks.setColorTemperature) {
|
|
15
|
+
const resp = await callbacks.setColorTemperature(payload.deviceId, payload.value.colorTemperature);
|
|
16
|
+
if (payload.value.colorTemperature && resp) return payload.value;
|
|
17
|
+
throw new InvalidResponseError('color temperature is undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setColorTemperature callback is undefined!');
|
|
20
|
+
}
|
|
19
21
|
};
|
|
20
22
|
|
|
21
23
|
module.exports = { ColorTemperature };
|
|
@@ -5,17 +5,18 @@
|
|
|
5
5
|
* This file is part of the Sinric Pro (https://github.com/sinricpro/)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const Mode = (payload, callbacks) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
9
|
+
|
|
10
|
+
const Mode = async (payload, callbacks) => {
|
|
11
|
+
if (callbacks.setMode) {
|
|
12
|
+
const resp = await callbacks.setMode(payload.deviceId, payload.value.mode, payload.instanceId);
|
|
13
|
+
if (resp) return [payload.value, payload.instanceId];
|
|
14
|
+
throw new InvalidResponseError('Mode undefined');
|
|
15
|
+
} else {
|
|
16
|
+
throw new UndefinedCallbackError('setMode callback is undefined!');
|
|
17
|
+
}
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
module.exports = {
|
|
20
|
-
Mode
|
|
21
|
+
Mode,
|
|
21
22
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,39 +6,48 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const powerState = (payload, callbacks) => {
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const powerState = async (payload, callbacks) => {
|
|
12
|
+
if (callbacks.setPowerState) {
|
|
13
|
+
const resp = await callbacks.setPowerState(payload.deviceId, payload.value.state);
|
|
14
14
|
if (payload.value.state && resp) {
|
|
15
|
-
|
|
16
|
-
} else {
|
|
17
|
-
reject(new Error('State is undefined'));
|
|
15
|
+
return payload.value;
|
|
18
16
|
}
|
|
19
|
-
|
|
17
|
+
throw new InvalidResponseError('State is undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setPowerState callback is undefined.');
|
|
20
|
+
}
|
|
20
21
|
};
|
|
21
22
|
|
|
22
|
-
const powerLevel = (payload, callbacks) => {
|
|
23
|
+
const powerLevel = async (payload, callbacks) => {
|
|
23
24
|
sinricProData.powerLevel = payload.value.powerLevel;
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
if (callbacks.setPowerLevel) {
|
|
27
|
+
const resp = await callbacks.setPowerLevel(payload.deviceId, payload.value.powerLevel);
|
|
26
28
|
if (payload.value.powerLevel && resp) {
|
|
27
|
-
|
|
28
|
-
} else {
|
|
29
|
-
reject(new Error('powerLevel is undefined'));
|
|
29
|
+
return payload.value;
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
throw new InvalidResponseError('powerLevel is undefined');
|
|
32
|
+
} else {
|
|
33
|
+
throw new UndefinedCallbackError('setPowerLevel callback is undefined.');
|
|
34
|
+
}
|
|
32
35
|
};
|
|
33
36
|
|
|
34
|
-
const powerLevelAdjust = (payload, callbacks) => {
|
|
37
|
+
const powerLevelAdjust = async (payload, callbacks) => {
|
|
35
38
|
sinricProData.powerLevel += payload.value.powerLevelDelta;
|
|
39
|
+
|
|
36
40
|
if (sinricProData.powerLevel < 0) sinricProData.powerLevel = 0;
|
|
37
41
|
else if (sinricProData.powerLevel > 100) sinricProData.powerLevel = 100;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
if (callbacks.adjustPowerLevel) {
|
|
44
|
+
const resp = await callbacks.adjustPowerLevel(payload.deviceId, sinricProData.powerLevel);
|
|
45
|
+
|
|
46
|
+
if (payload.value.powerLevelDelta && resp) return { powerLevel: sinricProData.powerLevel };
|
|
47
|
+
throw new InvalidResponseError('PowerLevelDelta is 0 or undefined');
|
|
48
|
+
} else {
|
|
49
|
+
throw new UndefinedCallbackError('adjustPowerLevel callback is undefined.');
|
|
50
|
+
}
|
|
43
51
|
};
|
|
44
52
|
|
|
45
53
|
module.exports = { powerState, powerLevel, powerLevelAdjust };
|
|
@@ -6,31 +6,33 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
9
10
|
|
|
10
|
-
const RangeValue = (payload, callbacks) => {
|
|
11
|
+
const RangeValue = async (payload, callbacks) => {
|
|
11
12
|
sinricProData.rangeValue = payload.value.rangeValue;
|
|
12
|
-
|
|
13
|
-
const resp = callbacks.setRangeValue(payload.deviceId, sinricProData.rangeValue, payload.instanceId);
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
if (callbacks.setRangeValue) {
|
|
15
|
+
const resp = await callbacks.setRangeValue(payload.deviceId, sinricProData.rangeValue, payload.instanceId);
|
|
16
|
+
if (payload.value.rangeValue !== undefined && resp) return [payload.value, payload.instanceId];
|
|
17
|
+
throw new InvalidResponseError('RangeValue is undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setRangeValue callback is undefined.');
|
|
20
|
+
}
|
|
19
21
|
};
|
|
20
22
|
|
|
21
|
-
const RangeValueAdjust = (payload, callbacks) => {
|
|
22
|
-
sinricProData.rangeValue += payload.value.rangeValueDelta;
|
|
23
|
+
const RangeValueAdjust = async (payload, callbacks) => {
|
|
24
|
+
sinricProData.rangeValue += payload.value.rangeValueDelta;
|
|
23
25
|
|
|
24
26
|
if (sinricProData.rangeValue < 0) sinricProData.rangeValue = 0;
|
|
25
27
|
else if (sinricProData.rangeValue > 100) sinricProData.rangeValue = 100;
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
if (callbacks.adjustRangeValue) {
|
|
30
|
+
const resp = await callbacks.adjustRangeValue(payload.deviceId, sinricProData.rangeValue, payload.instanceId);
|
|
31
|
+
if (payload.value.rangeValueDelta && resp) return [{ rangeValue: sinricProData.rangeValue }, payload.instanceId];
|
|
32
|
+
throw new InvalidResponseError('RangeValue is undefined');
|
|
33
|
+
} else {
|
|
34
|
+
throw new UndefinedCallbackError('adjustRangeValue callback is undefined.');
|
|
35
|
+
}
|
|
33
36
|
};
|
|
34
37
|
|
|
35
|
-
|
|
36
38
|
module.exports = { RangeValue, RangeValueAdjust };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,30 +6,39 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const ThermoStatMode = (payload, callbacks) => {
|
|
11
|
+
const ThermoStatMode = async (payload, callbacks) => {
|
|
12
12
|
sinricProData.thermostat.mode = payload.value.thermostatMode;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
if (callbacks.setThermostatMode) {
|
|
15
|
+
const resp = await callbacks.setThermostatMode(payload.deviceId, sinricProData.thermostat.mode);
|
|
16
|
+
if (payload.value.thermostatMode && resp) return payload.value;
|
|
17
|
+
throw new InvalidResponseError('Thermostat mode undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setThermostatMode callback is undefined.');
|
|
20
|
+
}
|
|
18
21
|
};
|
|
19
|
-
const ThermoStatTemperature = (payload, callbacks) => {
|
|
22
|
+
const ThermoStatTemperature = async (payload, callbacks) => {
|
|
20
23
|
sinricProData.thermostat.temperature = payload.value.temperature;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
|
|
25
|
+
if (callbacks.targetTemperature) {
|
|
26
|
+
const resp = await callbacks.targetTemperature(payload.deviceId, sinricProData.thermostat.temperature);
|
|
27
|
+
if (payload.value.temperature && resp) return payload.value;
|
|
28
|
+
throw new InvalidResponseError('Thermostat temperature undefined');
|
|
29
|
+
} else {
|
|
30
|
+
throw new UndefinedCallbackError('targetTemperature callback is undefined.');
|
|
31
|
+
}
|
|
26
32
|
};
|
|
27
33
|
|
|
28
|
-
const Lock = (payload, callbacks) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (resp)
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
+
const Lock = async (payload, callbacks) => {
|
|
35
|
+
if (callbacks.setLockState) {
|
|
36
|
+
const resp = await callbacks.setLockState(payload.deviceId, payload.value.state);
|
|
37
|
+
if (resp) return { state: `${payload.value.state.toUpperCase()}ED` };
|
|
38
|
+
throw new InvalidResponseError('Lock state is undefined');
|
|
39
|
+
} else {
|
|
40
|
+
throw new UndefinedCallbackError('setLockState callback is undefined.');
|
|
41
|
+
}
|
|
34
42
|
};
|
|
35
43
|
|
|
36
44
|
module.exports = { ThermoStatMode, ThermoStatTemperature, Lock };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,35 +6,44 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const Bands = (payload, callbacks) => {
|
|
11
|
+
const Bands = async (payload, callbacks) => {
|
|
12
12
|
sinricData.bands[0].level = payload.value.bands[0].level;
|
|
13
13
|
sinricData.bands[0].name = payload.value.bands[0].name;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
|
|
15
|
+
if (callbacks.setBands) {
|
|
16
|
+
const resp = await callbacks.setBands(payload.deviceId, payload.value.bands);
|
|
17
|
+
if (resp === true) return payload.value;
|
|
18
|
+
throw new InvalidResponseError('Callback failed');
|
|
19
|
+
} else {
|
|
20
|
+
throw new UndefinedCallbackError('setBands callback is undefined.');
|
|
21
|
+
}
|
|
19
22
|
};
|
|
20
23
|
|
|
21
|
-
const BandReset = (payload, callbacks) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (resp)
|
|
25
|
-
|
|
26
|
-
}
|
|
24
|
+
const BandReset = async (payload, callbacks) => {
|
|
25
|
+
if (callbacks.resetBands) {
|
|
26
|
+
const resp = await callbacks.resetBands(payload.deviceId, payload.value);
|
|
27
|
+
if (resp === true) return payload.value;
|
|
28
|
+
throw new InvalidResponseError('Callback failed');
|
|
29
|
+
} else {
|
|
30
|
+
throw new UndefinedCallbackError('resetBands callback is undefined.');
|
|
31
|
+
}
|
|
27
32
|
};
|
|
28
33
|
|
|
29
|
-
const AdjustBands = (payload, callbacks) => {
|
|
34
|
+
const AdjustBands = async (payload, callbacks) => {
|
|
30
35
|
if (payload.value.bands[0].levelDelta) {
|
|
31
36
|
if (sinricData.bands[0].levelDirection === 'UP') sinricData.bands[0].level += payload.value.bands[0].levelDelta;
|
|
32
37
|
else if (sinricData.bands[0].levelDirection === 'DOWN') sinricData.bands[0].level -= payload.value.bands[0].levelDelta;
|
|
33
38
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
|
|
40
|
+
if (callbacks.adjustBands) {
|
|
41
|
+
const resp = await callbacks.adjustBands(payload.deviceId, payload.value);
|
|
42
|
+
if (resp === true) return [payload.value, { bands: [{ level: sinricData.bands[0].level, name: sinricData.bands[0].name }] }];
|
|
43
|
+
throw new InvalidResponseError('Callback failed');
|
|
44
|
+
} else {
|
|
45
|
+
throw new UndefinedCallbackError('adjustBands callback is undefined.');
|
|
46
|
+
}
|
|
39
47
|
};
|
|
40
48
|
|
|
41
49
|
module.exports = {
|
|
@@ -4,16 +4,18 @@
|
|
|
4
4
|
*
|
|
5
5
|
* This file is part of the Sinric Pro (https://github.com/sinricpro/)
|
|
6
6
|
*/
|
|
7
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
7
8
|
|
|
8
|
-
const ToggleState = (payload, callbacks) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const ToggleState = async (payload, callbacks) => {
|
|
10
|
+
if (callbacks.setToggleState) {
|
|
11
|
+
const resp = await callbacks.setToggleState(payload.deviceId, payload.value.state, payload.instanceId);
|
|
12
|
+
if (resp === true) return [payload.value, payload.instanceId];
|
|
13
|
+
throw new InvalidResponseError('Callback failed');
|
|
14
|
+
} else {
|
|
15
|
+
throw new UndefinedCallbackError('setToggleState callback is undefined.');
|
|
16
|
+
}
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
module.exports = {
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
+
ToggleState,
|
|
21
|
+
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
4
3
|
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
@@ -7,68 +6,86 @@
|
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const sinricProData = require('../storage');
|
|
9
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
10
10
|
|
|
11
|
-
const Volume = (payload, callbacks) => {
|
|
11
|
+
const Volume = async (payload, callbacks) => {
|
|
12
12
|
sinricProData.volume = payload.value.volume;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
if (callbacks.setVolume) {
|
|
15
|
+
const resp = callbacks.setVolume(payload.deviceId, sinricProData.volume);
|
|
16
|
+
if (payload.value.volume && resp) return payload.value;
|
|
17
|
+
throw new InvalidResponseError('Volume undefined');
|
|
18
|
+
} else {
|
|
19
|
+
throw new UndefinedCallbackError('setVolume callback is undefined.');
|
|
20
|
+
}
|
|
18
21
|
};
|
|
19
22
|
|
|
20
|
-
const VolumeAdjust = (payload, callbacks) => {
|
|
23
|
+
const VolumeAdjust = async (payload, callbacks) => {
|
|
21
24
|
sinricProData.volume += payload.value.volume;
|
|
22
25
|
if (sinricProData.volume > 100) sinricProData.volume = 100;
|
|
23
26
|
else if (sinricProData.volume < 0) sinricProData.volume = 0;
|
|
24
|
-
const resp = callbacks.adjustVolume(payload.deviceId, sinricProData.volume);
|
|
25
|
-
return new Promise((resolve, reject) => {
|
|
26
|
-
if (payload.value.volume && resp) resolve({ volume: sinricProData.volume });
|
|
27
|
-
else reject(new Error('Volume undefined'));
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
27
|
|
|
28
|
+
if (callbacks.adjustVolume) {
|
|
29
|
+
const resp = await callbacks.setVolume(payload.deviceId, sinricProData.volume);
|
|
30
|
+
if (payload.value.volume && resp) return { volume: sinricProData.volume };
|
|
31
|
+
throw new InvalidResponseError('Volume undefined');
|
|
32
|
+
} else {
|
|
33
|
+
throw new UndefinedCallbackError('adjustVolume callback is undefined.');
|
|
34
|
+
}
|
|
35
|
+
};
|
|
31
36
|
|
|
32
|
-
const Mute = (payload, callbacks) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if ((payload.value.mute === true || payload.value.mute === false) && resp)
|
|
36
|
-
|
|
37
|
-
}
|
|
37
|
+
const Mute = async (payload, callbacks) => {
|
|
38
|
+
if (callbacks.setMute) {
|
|
39
|
+
const resp = await callbacks.setMute(payload.deviceId, payload.value.mute);
|
|
40
|
+
if ((payload.value.mute === true || payload.value.mute === false) && resp) return payload.value;
|
|
41
|
+
throw new InvalidResponseError('Mute undefined');
|
|
42
|
+
} else {
|
|
43
|
+
throw new UndefinedCallbackError('setMute callback is undefined.');
|
|
44
|
+
}
|
|
38
45
|
};
|
|
39
46
|
|
|
40
|
-
const Input = (payload, callbacks) => {
|
|
47
|
+
const Input = async (payload, callbacks) => {
|
|
41
48
|
sinricProData.input = payload.value.input;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
49
|
+
|
|
50
|
+
if (callbacks.selectInput) {
|
|
51
|
+
const resp = await callbacks.selectInput(payload.deviceId, payload.value.input);
|
|
52
|
+
if ((payload.value.mute === true || payload.value.mute === false) && resp) return payload.value;
|
|
53
|
+
throw new InvalidResponseError('Input undefined');
|
|
54
|
+
} else {
|
|
55
|
+
throw new UndefinedCallbackError('selectInput callback is undefined.');
|
|
56
|
+
}
|
|
47
57
|
};
|
|
48
58
|
|
|
49
|
-
const Media = (payload, callbacks) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (payload.value.control && resp)
|
|
53
|
-
|
|
54
|
-
}
|
|
59
|
+
const Media = async (payload, callbacks) => {
|
|
60
|
+
if (callbacks.selectInput) {
|
|
61
|
+
const resp = await callbacks.mediaControl(payload.deviceId, payload.value.control);
|
|
62
|
+
if (payload.value.control && resp) return payload.value;
|
|
63
|
+
throw new InvalidResponseError('Control undefined');
|
|
64
|
+
} else {
|
|
65
|
+
throw new UndefinedCallbackError('mediaControl callback is undefined.');
|
|
66
|
+
}
|
|
55
67
|
};
|
|
56
68
|
|
|
57
|
-
const ChangeChannel = (payload, callbacks) => {
|
|
69
|
+
const ChangeChannel = async (payload, callbacks) => {
|
|
58
70
|
const channel = payload.value.channel.name || payload.value.channel.number;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
71
|
+
|
|
72
|
+
if (callbacks.changeChannel) {
|
|
73
|
+
const resp = callbacks.changeChannel(payload.deviceId, channel);
|
|
74
|
+
if (channel && resp) return payload.value;
|
|
75
|
+
throw new InvalidResponseError('Channel name undefined');
|
|
76
|
+
} else {
|
|
77
|
+
throw new UndefinedCallbackError('mediaControl callback is undefined.');
|
|
78
|
+
}
|
|
64
79
|
};
|
|
65
80
|
|
|
66
81
|
const SkipChannel = (payload, callbacks) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (payload.value.channelCount && resp)
|
|
70
|
-
|
|
71
|
-
}
|
|
82
|
+
if (callbacks.changeChannel) {
|
|
83
|
+
const resp = callbacks.skipChannels(payload.deviceId, payload.value.channelCount);
|
|
84
|
+
if (payload.value.channelCount && resp) return payload.value;
|
|
85
|
+
throw new InvalidResponseError('Channel count undefined');
|
|
86
|
+
} else {
|
|
87
|
+
throw new UndefinedCallbackError('skipChannels callback is undefined.');
|
|
88
|
+
}
|
|
72
89
|
};
|
|
73
90
|
|
|
74
91
|
module.exports = {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2019 Sinric. All rights reserved.
|
|
3
|
+
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Sinric Pro (https://github.com/sinricpro/)
|
|
6
|
+
*/
|
|
7
|
+
const { UndefinedCallbackError, InvalidResponseError } = require('../errors/errors');
|
|
8
|
+
|
|
9
|
+
const WebRTC = async (payload, callbacks) => {
|
|
10
|
+
if (callbacks.webRtcOffer) {
|
|
11
|
+
const data = await callbacks.webRtcOffer(payload.deviceId, payload.value.format, payload.value.value);
|
|
12
|
+
if (data) return [payload.value, data.answer];
|
|
13
|
+
throw new InvalidResponseError('WebRTC error');
|
|
14
|
+
} else {
|
|
15
|
+
throw new UndefinedCallbackError('webRtcOffer callback is undefined.');
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
WebRTC,
|
|
21
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
// eslint-disable-next-line linebreak-style
|
|
3
|
+
class UndefinedCallbackError extends Error { }
|
|
4
|
+
|
|
5
|
+
class InvalidResponseError extends Error {}
|
|
6
|
+
|
|
7
|
+
module.exports.UndefinedCallbackError = UndefinedCallbackError;
|
|
8
|
+
module.exports.InvalidResponseError = InvalidResponseError;
|
package/lib/sinrcpro.js
CHANGED
|
@@ -15,7 +15,7 @@ const sdkVersion = require('./../package.json').version;
|
|
|
15
15
|
|
|
16
16
|
class SinricPro extends Websocket {
|
|
17
17
|
constructor(appkey, deviceids, secretKey, restoreStates) {
|
|
18
|
-
super("
|
|
18
|
+
super("wss://ws.sinric.pro", {
|
|
19
19
|
headers: {
|
|
20
20
|
appkey,
|
|
21
21
|
deviceids: deviceids.join(';'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sinricpro",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.1",
|
|
4
4
|
"description": "Sinric Pro Nodejs SDK",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"homepage": "https://github.com/sinricpro/nodejs-sdk#readme",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"dgram": "^1.0.1",
|
|
18
|
+
"node-fetch": "^2.6.11",
|
|
18
19
|
"process": "^0.11.10",
|
|
19
20
|
"rate-limiter-flexible": "^2.3.6",
|
|
20
21
|
"rxjs": "^6.6.3",
|