sinricpro 2.6.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/CHANGELOG.md CHANGED
@@ -4,3 +4,8 @@
4
4
 
5
5
  * **Custom device types support**
6
6
  * **SR_DEBUG to support debug logs**
7
+
8
+ ## [2.7.1]
9
+
10
+ ### Features
11
+ * **Push notification feature added**
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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((err) => {
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
- const resp = callback.setBrightness(payload.deviceId, sinricProData.brightness);
14
- return new Promise((resolve, reject) => {
15
- if (payload.value.brightness && resp) resolve(payload.value);
16
- else reject(new Error('brightness is undefined'));
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) sinricProData.brightness = 0;
23
- else if (sinricProData.brightness > 100) sinricProData.brightness = 100;
24
- const resp = callback.adjustBrightness(payload.deviceId, sinricProData.brightness);
25
- return new Promise((resolve, reject) => {
26
- if (payload.value.brightness && resp) resolve({ brightness: sinricProData.brightness });
27
- else reject(new Error('brightness is undefined'));
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
- const resp = callbacks.setColor(payload.deviceId, payload.value.color);
14
- return new Promise((resolve, reject) => {
15
- if (payload.value.color && resp) resolve(payload.value);
16
- else reject(new Error('Colors undefined'));
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
- return new Promise((resolve, reject) => {
16
- if (payload.value.colorTemperature && resp) resolve(payload.value);
17
- else reject(new Error('color temperature is undefined'));
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 sinricData = require('../storage');
9
-
10
- const Mode = (payload, callbacks) => {
11
- const resp = callbacks.setMode(payload.deviceId, payload.value.mode, payload.instanceId);
12
-
13
- return new Promise((resolve, reject) => {
14
- if (resp) resolve([payload.value, payload.instanceId]);
15
- else reject(new Error('Mode undefined'));
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
- const resp = callbacks.setPowerState(payload.deviceId, payload.value.state);
13
- return new Promise((resolve, reject) => {
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
- resolve(payload.value);
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
- const resp = callbacks.setPowerLevel(payload.deviceId, payload.value.powerLevel);
25
- return new Promise((resolve, reject) => {
25
+
26
+ if (callbacks.setPowerLevel) {
27
+ const resp = await callbacks.setPowerLevel(payload.deviceId, payload.value.powerLevel);
26
28
  if (payload.value.powerLevel && resp) {
27
- resolve(payload.value);
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
- const resp = callbacks.adjustPowerLevel(payload.deviceId, sinricProData.powerLevel);
39
- return new Promise((resolve, reject) => {
40
- if (payload.value.powerLevelDelta && resp) resolve({ powerLevel: sinricProData.powerLevel });
41
- else reject(new Error('PowerLevelDelta is 0 or undefined'));
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
- return new Promise((resolve, reject) => {
16
- if (payload.value.rangeValue !== undefined && resp) resolve([payload.value, payload.instanceId]);
17
- else reject(new Error('RangeValue is undefined'));
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
- const resp = callbacks.adjustRangeValue(payload.deviceId, sinricProData.rangeValue, payload.instanceId);
28
-
29
- return new Promise((resolve, reject) => {
30
- if (payload.value.rangeValueDelta && resp) resolve([{ rangeValue: sinricProData.rangeValue }, payload.instanceId]);
31
- else reject(new Error('RangeValue undefined'));
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
- const resp = callbacks.setThermostatMode(payload.deviceId, sinricProData.thermostat.mode);
14
- return new Promise((resolve, reject) => {
15
- if (payload.value.thermostatMode && resp) resolve(payload.value);
16
- else reject(new Error('Thermostat mode undefined'));
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
- const resp = callbacks.targetTemperature(payload.deviceId, sinricProData.thermostat.temperature);
22
- return new Promise((resolve, reject) => {
23
- if (payload.value.temperature && resp) resolve(payload.value);
24
- else reject(new Error('Thermostat temperature undefined'));
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
- const resp = callbacks.setLockState(payload.deviceId, payload.value.state);
30
- return new Promise((resolve, reject) => {
31
- if (resp) resolve({ state: `${payload.value.state.toUpperCase()}ED` });
32
- else reject(new Error('Set lock state error'));
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
- const resp = callbacks.setBands(payload.deviceId, payload.value.bands);
15
- return new Promise((resolve, reject) => {
16
- if (resp === true) resolve(payload.value);
17
- else reject(new Error('Callback failed'));
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
- const resp = callbacks.resetBands(payload.deviceId, payload.value);
23
- return new Promise((resolve, reject) => {
24
- if (resp) resolve(payload.value);
25
- else reject(new Error('Rest Bands Failed'));
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
- const resp = callbacks.adjustBands(payload.deviceId, sinricData.bands);
35
- return new Promise((resolve, reject) => {
36
- if (resp) resolve(payload.value, { bands: [{ level: sinricData.bands[0].level, name: sinricData.bands[0].name }] });
37
- else reject(new Error('Rest Bands Failed'));
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
- const resp = callbacks.setToggleState(payload.deviceId, payload.value.state, payload.instanceId);
10
-
11
- return new Promise((resolve, reject) => {
12
- if (resp) resolve([payload.value, payload.instanceId]);
13
- else reject(new Error('Toggle State Error'));
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
- ToggleState
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
- const resp = callbacks.setVolume(payload.deviceId, sinricProData.volume);
14
- return new Promise((resolve, reject) => {
15
- if (payload.value.volume && resp) resolve(payload.value);
16
- else reject(new Error('Volume undefined'));
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
- const resp = callbacks.setMute(payload.deviceId, payload.value.mute);
34
- return new Promise((resolve, reject) => {
35
- if ((payload.value.mute === true || payload.value.mute === false) && resp) resolve(payload.value);
36
- else reject(new Error('Mute undefined'));
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
- const resp = callbacks.selectInput(payload.deviceId, payload.value.input);
43
- return new Promise((resolve, reject) => {
44
- if (payload.value.input && resp) resolve(payload.value);
45
- else reject(new Error('Input undefined'));
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
- const resp = callbacks.mediaControl(payload.deviceId, payload.value.control);
51
- return new Promise((resolve, reject) => {
52
- if (payload.value.control && resp) resolve(payload.value);
53
- else reject(new Error('Control undefined'));
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
- const resp = callbacks.changeChannel(payload.deviceId, channel);
60
- return new Promise((resolve, reject) => {
61
- if (channel && resp) resolve(payload.value);
62
- else reject(new Error('Channel name undefined'));
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
- const resp = callbacks.skipChannels(payload.deviceId, payload.value.channelCount);
68
- return new Promise((resolve, reject) => {
69
- if (payload.value.channelCount && resp) resolve(payload.value);
70
- else reject(new Error('Channel count undefined'));
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;
@@ -55,9 +55,10 @@ const eventNames = {
55
55
  lock: 'setLockState',
56
56
  mute: 'setMute',
57
57
  currentTemperature: 'currentTemperature',
58
+ pushNotification: 'pushNotification',
58
59
  };
59
60
 
60
- const actionArr = ['setPowerState', 'setBrightness', 'setPowerLevel', 'setColor', 'setColorTemperature', 'DoorbellPress', 'currentTemperature'];
61
+ const actionArr = ['setPowerState', 'setBrightness', 'setPowerLevel', 'setColor', 'setColorTemperature', 'DoorbellPress', 'currentTemperature', 'pushNotification'];
61
62
 
62
63
  const getJson = (client, eventName, deviceId, value) => {
63
64
  const header = {
@@ -93,7 +94,7 @@ const raiseEvent = async (client, eventName, deviceId, value) => {
93
94
  console.log('Too many events!');
94
95
  }
95
96
  } else {
96
- console.log('Invalid Event');
97
+ console.log(`Invalid Event: ${eventName}`);
97
98
  }
98
99
  };
99
100
 
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("ws://ws.sinric.pro", {
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.6.1",
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",