sinricpro 2.12.1 → 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 -45
- 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 -108
- package/lib/signature.js +0 -26
- package/lib/sinrcpro.js +0 -129
- package/lib/sinricproudp.js +0 -60
- package/lib/storage.js +0 -31
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main SinricPro SDK class
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SinricPro = void 0;
|
|
7
|
+
const events_1 = require("events");
|
|
8
|
+
const WebSocketClient_1 = require("./WebSocketClient");
|
|
9
|
+
const MessageQueue_1 = require("./MessageQueue");
|
|
10
|
+
const Signature_1 = require("./Signature");
|
|
11
|
+
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
12
|
+
const types_1 = require("./types");
|
|
13
|
+
class SinricPro extends events_1.EventEmitter {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.isInitialized = false;
|
|
17
|
+
this.processingInterval = null;
|
|
18
|
+
this.devices = new Map();
|
|
19
|
+
this.receiveQueue = new MessageQueue_1.MessageQueue();
|
|
20
|
+
this.sendQueue = new MessageQueue_1.MessageQueue();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the singleton instance of SinricPro
|
|
24
|
+
* @returns The SinricPro singleton instance
|
|
25
|
+
*/
|
|
26
|
+
static getInstance() {
|
|
27
|
+
if (!SinricPro.instance) {
|
|
28
|
+
SinricPro.instance = new SinricPro();
|
|
29
|
+
}
|
|
30
|
+
return SinricPro.instance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize and connect to SinricPro service
|
|
34
|
+
* @param config - Configuration object containing appKey, appSecret, and optional settings
|
|
35
|
+
* @throws {Error} If appKey or appSecret are missing or invalid
|
|
36
|
+
* @throws {Error} If connection to SinricPro server fails
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* await SinricPro.begin({
|
|
40
|
+
* appKey: 'your-app-key',
|
|
41
|
+
* appSecret: 'your-app-secret',
|
|
42
|
+
* debug: false
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
async begin(config) {
|
|
47
|
+
if (this.isInitialized) {
|
|
48
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn('SinricPro already initialized');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Validate config
|
|
52
|
+
this.validateConfig(config);
|
|
53
|
+
this.config = {
|
|
54
|
+
serverUrl: types_1.SINRICPRO_SERVER_URL,
|
|
55
|
+
restoreDeviceStates: false,
|
|
56
|
+
debug: false,
|
|
57
|
+
...config,
|
|
58
|
+
};
|
|
59
|
+
// Set log level
|
|
60
|
+
if (this.config.debug) {
|
|
61
|
+
SinricProSdkLogger_1.SinricProSdkLogger.setLevel(SinricProSdkLogger_1.LogLevel.ERROR);
|
|
62
|
+
}
|
|
63
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Initializing SinricPro SDK...');
|
|
64
|
+
this.signature = new Signature_1.Signature(this.config.appSecret);
|
|
65
|
+
// Initialize WebSocket
|
|
66
|
+
this.websocket = new WebSocketClient_1.WebSocketClient({
|
|
67
|
+
serverUrl: this.config.serverUrl,
|
|
68
|
+
appKey: this.config.appKey,
|
|
69
|
+
deviceIds: Array.from(this.devices.keys()),
|
|
70
|
+
restoreDeviceStates: this.config.restoreDeviceStates,
|
|
71
|
+
});
|
|
72
|
+
this.setupWebSocketHandlers();
|
|
73
|
+
try {
|
|
74
|
+
await this.websocket.connect();
|
|
75
|
+
this.isInitialized = true;
|
|
76
|
+
this.startMessageProcessor();
|
|
77
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('SinricPro SDK initialized successfully');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Failed to initialize SinricPro:', error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Add a device to SinricPro
|
|
86
|
+
* @param device - The device instance to add
|
|
87
|
+
* @returns The added device instance
|
|
88
|
+
* @throws {Error} If deviceId is invalid or not in the correct format
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const mySwitch = SinricProSwitch('5dc1564130xxxxxxxxxxxxxx');
|
|
92
|
+
* SinricPro.add(mySwitch);
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
add(device) {
|
|
96
|
+
const deviceId = device.getDeviceId();
|
|
97
|
+
// Validate device ID format (should be 24 hex characters)
|
|
98
|
+
if (!deviceId || typeof deviceId !== 'string') {
|
|
99
|
+
throw new Error('Invalid device: deviceId is required and must be a string');
|
|
100
|
+
}
|
|
101
|
+
if (!/^[a-f0-9]{24}$/i.test(deviceId)) {
|
|
102
|
+
throw new Error(`Invalid deviceId format: ${deviceId}. Expected 24 hexadecimal characters`);
|
|
103
|
+
}
|
|
104
|
+
if (this.devices.has(deviceId)) {
|
|
105
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`Device ${deviceId} already exists, returning existing instance`);
|
|
106
|
+
return this.devices.get(deviceId);
|
|
107
|
+
}
|
|
108
|
+
device.setSinricPro(this);
|
|
109
|
+
this.devices.set(deviceId, device);
|
|
110
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info(`Device added: ${deviceId} (${device.getProductType()})`);
|
|
111
|
+
// Update WebSocket device list if already connected
|
|
112
|
+
if (this.isInitialized) {
|
|
113
|
+
this.websocket.updateDeviceList(Array.from(this.devices.keys()));
|
|
114
|
+
}
|
|
115
|
+
return device;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get a device by its ID
|
|
119
|
+
* @param deviceId - The device ID to look up
|
|
120
|
+
* @returns The device instance if found, undefined otherwise
|
|
121
|
+
*/
|
|
122
|
+
get(deviceId) {
|
|
123
|
+
return this.devices.get(deviceId);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Register a callback for when connected to SinricPro
|
|
127
|
+
* @param callback - Function to call when connected
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* SinricPro.onConnected(() => {
|
|
131
|
+
* console.log('Connected to SinricPro!');
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
onConnected(callback) {
|
|
136
|
+
this.on('connected', callback);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Register a callback for when disconnected from SinricPro
|
|
140
|
+
* @param callback - Function to call when disconnected
|
|
141
|
+
*/
|
|
142
|
+
onDisconnected(callback) {
|
|
143
|
+
this.on('disconnected', callback);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Register a callback for heartbeat pong responses
|
|
147
|
+
* @param callback - Function to call with latency in milliseconds
|
|
148
|
+
*/
|
|
149
|
+
onPong(callback) {
|
|
150
|
+
this.on('pong', callback);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Stop the SinricPro SDK and disconnect from the server
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* await SinricPro.stop();
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
async stop() {
|
|
160
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Stopping SinricPro SDK...');
|
|
161
|
+
this.isInitialized = false;
|
|
162
|
+
if (this.processingInterval) {
|
|
163
|
+
clearInterval(this.processingInterval);
|
|
164
|
+
this.processingInterval = null;
|
|
165
|
+
}
|
|
166
|
+
await this.websocket.disconnect();
|
|
167
|
+
this.receiveQueue.clear();
|
|
168
|
+
this.sendQueue.clear();
|
|
169
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('SinricPro SDK stopped');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if currently connected to SinricPro
|
|
173
|
+
* @returns true if connected, false otherwise
|
|
174
|
+
*/
|
|
175
|
+
isConnected() {
|
|
176
|
+
return this.websocket?.isConnected() || false;
|
|
177
|
+
}
|
|
178
|
+
// ISinricPro interface methods
|
|
179
|
+
async sendMessage(message) {
|
|
180
|
+
message.payload.createdAt = this.getTimestamp();
|
|
181
|
+
this.signature.sign(message);
|
|
182
|
+
this.sendQueue.push(JSON.stringify(message));
|
|
183
|
+
}
|
|
184
|
+
getTimestamp() {
|
|
185
|
+
return Math.floor(Date.now() / 1000);
|
|
186
|
+
}
|
|
187
|
+
sign(message) {
|
|
188
|
+
return this.signature.calculateSignature(message);
|
|
189
|
+
}
|
|
190
|
+
// Private methods
|
|
191
|
+
setupWebSocketHandlers() {
|
|
192
|
+
this.websocket.on('connected', () => {
|
|
193
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Connected to SinricPro server');
|
|
194
|
+
this.emit('connected');
|
|
195
|
+
});
|
|
196
|
+
this.websocket.on('disconnected', () => {
|
|
197
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Disconnected from SinricPro server');
|
|
198
|
+
this.emit('disconnected');
|
|
199
|
+
});
|
|
200
|
+
this.websocket.on('message', (msg) => {
|
|
201
|
+
this.receiveQueue.push(msg);
|
|
202
|
+
});
|
|
203
|
+
this.websocket.on('pong', (latency) => {
|
|
204
|
+
this.emit('pong', latency);
|
|
205
|
+
});
|
|
206
|
+
this.websocket.on('error', (error) => {
|
|
207
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('WebSocket error:', error);
|
|
208
|
+
this.emit('error', error);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
startMessageProcessor() {
|
|
212
|
+
this.processingInterval = setInterval(() => {
|
|
213
|
+
this.processReceiveQueue();
|
|
214
|
+
this.processSendQueue();
|
|
215
|
+
}, 10); // Process every 10ms
|
|
216
|
+
}
|
|
217
|
+
async processReceiveQueue() {
|
|
218
|
+
while (!this.receiveQueue.isEmpty()) {
|
|
219
|
+
const rawMessage = this.receiveQueue.pop();
|
|
220
|
+
if (!rawMessage)
|
|
221
|
+
continue;
|
|
222
|
+
try {
|
|
223
|
+
const message = JSON.parse(rawMessage);
|
|
224
|
+
// Handle timestamp message
|
|
225
|
+
if ('timestamp' in message) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Validate signature
|
|
229
|
+
if (!this.signature.validate(message)) {
|
|
230
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Invalid message signature');
|
|
231
|
+
this.sendInvalidSignatureResponse(message);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
// Route message
|
|
235
|
+
if (message.payload.type === 'request') {
|
|
236
|
+
await this.handleRequest(message);
|
|
237
|
+
}
|
|
238
|
+
else if (message.payload.type === 'response') {
|
|
239
|
+
this.emit('response', message);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Error processing received message:', error);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
processSendQueue() {
|
|
248
|
+
if (!this.isConnected()) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
while (!this.sendQueue.isEmpty()) {
|
|
252
|
+
const message = this.sendQueue.pop();
|
|
253
|
+
if (message) {
|
|
254
|
+
try {
|
|
255
|
+
this.websocket.send(message);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
// If send fails, put message back in queue and stop processing
|
|
259
|
+
this.sendQueue.push(message);
|
|
260
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Failed to send message, will retry later:', error);
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async handleRequest(message) {
|
|
267
|
+
const deviceId = message.payload.deviceId;
|
|
268
|
+
const device = deviceId ? this.devices.get(deviceId) : null;
|
|
269
|
+
if (!device) {
|
|
270
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`Device not found: ${deviceId}`);
|
|
271
|
+
this.sendErrorResponse(message, `Device ${deviceId} not found`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const request = {
|
|
275
|
+
action: message.payload.action,
|
|
276
|
+
instance: message.payload.instanceId || '',
|
|
277
|
+
requestValue: message.payload.value,
|
|
278
|
+
responseValue: {},
|
|
279
|
+
};
|
|
280
|
+
const success = await device.handleRequest(request);
|
|
281
|
+
this.sendResponse(message, success, request.responseValue, request.errorMessage);
|
|
282
|
+
}
|
|
283
|
+
sendResponse(requestMessage, success, value, errorMessage) {
|
|
284
|
+
const responseMessage = {
|
|
285
|
+
header: {
|
|
286
|
+
payloadVersion: 2,
|
|
287
|
+
signatureVersion: 1,
|
|
288
|
+
},
|
|
289
|
+
payload: {
|
|
290
|
+
action: requestMessage.payload.action,
|
|
291
|
+
clientId: requestMessage.payload.clientId,
|
|
292
|
+
createdAt: Math.floor(new Date().getTime() / 1000),
|
|
293
|
+
deviceId: requestMessage.payload.deviceId,
|
|
294
|
+
message: errorMessage || (success ? 'OK' : 'Request failed'),
|
|
295
|
+
replyToken: requestMessage.payload.replyToken,
|
|
296
|
+
success,
|
|
297
|
+
type: 'response',
|
|
298
|
+
value,
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
this.signature.sign(responseMessage);
|
|
302
|
+
if (requestMessage.payload.instanceId) {
|
|
303
|
+
responseMessage.payload.instanceId = requestMessage.payload.instanceId;
|
|
304
|
+
}
|
|
305
|
+
this.sendQueue.push(JSON.stringify(responseMessage));
|
|
306
|
+
}
|
|
307
|
+
validateConfig(config) {
|
|
308
|
+
// Validate required fields
|
|
309
|
+
if (!config.appKey || !config.appSecret) {
|
|
310
|
+
throw new Error('appKey and appSecret are required');
|
|
311
|
+
}
|
|
312
|
+
// Validate appKey format (should be UUID-like: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
|
|
313
|
+
const uuidRegex = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
|
|
314
|
+
if (!uuidRegex.test(config.appKey)) {
|
|
315
|
+
throw new Error('Invalid appKey format. Expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
|
|
316
|
+
}
|
|
317
|
+
// Validate appSecret format (longer UUID-like with dashes and alphanumeric)
|
|
318
|
+
if (config.appSecret.length < 32) {
|
|
319
|
+
throw new Error('Invalid appSecret: must be at least 32 characters long');
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
sendErrorResponse(message, errorMessage) {
|
|
323
|
+
this.sendResponse(message, false, { error: errorMessage });
|
|
324
|
+
}
|
|
325
|
+
sendInvalidSignatureResponse(message) {
|
|
326
|
+
this.sendErrorResponse(message, 'Invalid signature');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
exports.SinricPro = SinricPro;
|
|
330
|
+
// Export singleton instance
|
|
331
|
+
exports.default = SinricPro.getInstance();
|
|
332
|
+
//# sourceMappingURL=SinricPro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SinricPro.js","sourceRoot":"","sources":["../../src/core/SinricPro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base class for all SinricPro devices
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SinricProDevice = void 0;
|
|
7
|
+
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
8
|
+
class SinricProDevice {
|
|
9
|
+
constructor(deviceId, productType) {
|
|
10
|
+
this.sinricPro = null;
|
|
11
|
+
this.requestHandlers = [];
|
|
12
|
+
this.deviceId = deviceId;
|
|
13
|
+
this.productType = productType;
|
|
14
|
+
}
|
|
15
|
+
getDeviceId() {
|
|
16
|
+
return this.deviceId;
|
|
17
|
+
}
|
|
18
|
+
getProductType() {
|
|
19
|
+
return `sinric.device.type.${this.productType}`;
|
|
20
|
+
}
|
|
21
|
+
setSinricPro(sinricPro) {
|
|
22
|
+
this.sinricPro = sinricPro;
|
|
23
|
+
}
|
|
24
|
+
registerRequestHandler(handler) {
|
|
25
|
+
this.requestHandlers.push(handler);
|
|
26
|
+
}
|
|
27
|
+
async handleRequest(request) {
|
|
28
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`Device ${this.deviceId} handling request: ${request.action}`);
|
|
29
|
+
for (const handler of this.requestHandlers) {
|
|
30
|
+
try {
|
|
31
|
+
const result = await handler(request);
|
|
32
|
+
if (result) {
|
|
33
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`Request ${request.action} handled successfully`);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`Error handling request ${request.action}:`, error);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`No handler found for action: ${request.action}`);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
async sendEvent(action,
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
value, cause = 'PHYSICAL_INTERACTION') {
|
|
48
|
+
if (!this.sinricPro) {
|
|
49
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Cannot send event: Device not registered with SinricPro');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const eventMessage = {
|
|
53
|
+
header: {
|
|
54
|
+
payloadVersion: 2,
|
|
55
|
+
signatureVersion: 1,
|
|
56
|
+
},
|
|
57
|
+
payload: {
|
|
58
|
+
action,
|
|
59
|
+
deviceId: this.deviceId,
|
|
60
|
+
replyToken: this.generateMessageId(),
|
|
61
|
+
type: 'event',
|
|
62
|
+
createdAt: Math.floor(new Date().getTime() / 1000),
|
|
63
|
+
cause: { type: cause },
|
|
64
|
+
value,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
await this.sinricPro.sendMessage(eventMessage);
|
|
69
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`Event sent: ${action}`, value);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`Failed to send event ${action}:`, error);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
generateMessageId() {
|
|
78
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.SinricProDevice = SinricProDevice;
|
|
82
|
+
//# sourceMappingURL=SinricProDevice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SinricProDevice.js","sourceRoot":"","sources":["../../src/core/SinricProDevice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket client for SinricPro communication
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.WebSocketClient = void 0;
|
|
10
|
+
const ws_1 = __importDefault(require("ws"));
|
|
11
|
+
const events_1 = require("events");
|
|
12
|
+
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
const package_json_1 = require("../../package.json");
|
|
15
|
+
class WebSocketClient extends events_1.EventEmitter {
|
|
16
|
+
constructor(config) {
|
|
17
|
+
super();
|
|
18
|
+
this.ws = null;
|
|
19
|
+
this.pingInterval = null;
|
|
20
|
+
this.pongTimeout = null;
|
|
21
|
+
this.reconnectTimeout = null;
|
|
22
|
+
this.connected = false;
|
|
23
|
+
this.shouldReconnect = true;
|
|
24
|
+
this.lastPingTime = 0;
|
|
25
|
+
this.config = {
|
|
26
|
+
platform: 'NodeJS',
|
|
27
|
+
sdkVersion: package_json_1.version,
|
|
28
|
+
...config,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async connect() {
|
|
32
|
+
if (this.connected) {
|
|
33
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn('WebSocket already connected');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const protocol = 'wss';
|
|
37
|
+
const port = types_1.SINRICPRO_SERVER_SSL_PORT;
|
|
38
|
+
const url = `${protocol}://${this.config.serverUrl}:${port}/`;
|
|
39
|
+
const headers = {
|
|
40
|
+
appkey: this.config.appKey,
|
|
41
|
+
deviceids: this.config.deviceIds.join(';'),
|
|
42
|
+
restoredevicestates: this.config.restoreDeviceStates.toString(),
|
|
43
|
+
platform: this.config.platform || 'NodeJS',
|
|
44
|
+
SDKVersion: this.config.sdkVersion || package_json_1.version,
|
|
45
|
+
};
|
|
46
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info(`Connecting to ${url}`);
|
|
47
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug('WebSocket headers:', headers);
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
this.ws = new ws_1.default(url, { headers });
|
|
50
|
+
this.ws.on('open', () => {
|
|
51
|
+
this.connected = true;
|
|
52
|
+
this.startHeartbeat();
|
|
53
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('WebSocket connected');
|
|
54
|
+
this.emit('connected');
|
|
55
|
+
resolve();
|
|
56
|
+
});
|
|
57
|
+
this.ws.on('message', (data) => {
|
|
58
|
+
const message = data.toString();
|
|
59
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug('WebSocket received:', message);
|
|
60
|
+
this.emit('message', message);
|
|
61
|
+
});
|
|
62
|
+
this.ws.on('close', () => {
|
|
63
|
+
this.connected = false;
|
|
64
|
+
this.stopHeartbeat();
|
|
65
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('WebSocket disconnected');
|
|
66
|
+
this.emit('disconnected');
|
|
67
|
+
if (this.shouldReconnect) {
|
|
68
|
+
this.scheduleReconnect();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
this.ws.on('error', (error) => {
|
|
72
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('WebSocket error:', error.message);
|
|
73
|
+
this.emit('error', error);
|
|
74
|
+
reject(error);
|
|
75
|
+
});
|
|
76
|
+
this.ws.on('pong', () => {
|
|
77
|
+
// Clear pong timeout - connection is alive
|
|
78
|
+
if (this.pongTimeout) {
|
|
79
|
+
clearTimeout(this.pongTimeout);
|
|
80
|
+
this.pongTimeout = null;
|
|
81
|
+
}
|
|
82
|
+
const latency = Date.now() - this.lastPingTime;
|
|
83
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`WebSocket pong received (latency: ${latency}ms)`);
|
|
84
|
+
this.emit('pong', latency);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
send(message) {
|
|
89
|
+
if (!this.ws || !this.connected) {
|
|
90
|
+
const error = new Error('Cannot send message: WebSocket not connected');
|
|
91
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(error.message);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug('WebSocket sending:', message);
|
|
95
|
+
this.ws.send(message);
|
|
96
|
+
}
|
|
97
|
+
isConnected() {
|
|
98
|
+
return this.connected;
|
|
99
|
+
}
|
|
100
|
+
startHeartbeat() {
|
|
101
|
+
this.pingInterval = setInterval(() => {
|
|
102
|
+
if (this.ws && this.connected) {
|
|
103
|
+
this.lastPingTime = Date.now();
|
|
104
|
+
this.ws.ping();
|
|
105
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug('WebSocket ping sent');
|
|
106
|
+
// Set timeout for pong response
|
|
107
|
+
this.pongTimeout = setTimeout(() => {
|
|
108
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('WebSocket pong timeout - connection appears dead');
|
|
109
|
+
// Force close the connection
|
|
110
|
+
if (this.ws) {
|
|
111
|
+
this.ws.terminate();
|
|
112
|
+
}
|
|
113
|
+
}, types_1.WEBSOCKET_PING_TIMEOUT);
|
|
114
|
+
}
|
|
115
|
+
}, types_1.WEBSOCKET_PING_INTERVAL);
|
|
116
|
+
}
|
|
117
|
+
stopHeartbeat() {
|
|
118
|
+
if (this.pingInterval) {
|
|
119
|
+
clearInterval(this.pingInterval);
|
|
120
|
+
this.pingInterval = null;
|
|
121
|
+
}
|
|
122
|
+
if (this.pongTimeout) {
|
|
123
|
+
clearTimeout(this.pongTimeout);
|
|
124
|
+
this.pongTimeout = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
scheduleReconnect() {
|
|
128
|
+
if (this.reconnectTimeout) {
|
|
129
|
+
clearTimeout(this.reconnectTimeout);
|
|
130
|
+
}
|
|
131
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
132
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Attempting to reconnect...');
|
|
133
|
+
this.connect().catch((error) => {
|
|
134
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Reconnection failed:', error.message);
|
|
135
|
+
});
|
|
136
|
+
}, 5000);
|
|
137
|
+
}
|
|
138
|
+
updateDeviceList(deviceIds) {
|
|
139
|
+
this.config.deviceIds = deviceIds;
|
|
140
|
+
}
|
|
141
|
+
async disconnect() {
|
|
142
|
+
this.shouldReconnect = false;
|
|
143
|
+
if (this.reconnectTimeout) {
|
|
144
|
+
clearTimeout(this.reconnectTimeout);
|
|
145
|
+
this.reconnectTimeout = null;
|
|
146
|
+
}
|
|
147
|
+
this.stopHeartbeat();
|
|
148
|
+
if (this.ws) {
|
|
149
|
+
this.ws.close();
|
|
150
|
+
this.ws = null;
|
|
151
|
+
}
|
|
152
|
+
this.connected = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.WebSocketClient = WebSocketClient;
|
|
156
|
+
//# sourceMappingURL=WebSocketClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketClient.js","sourceRoot":"","sources":["../../src/core/WebSocketClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core type definitions for SinricPro SDK
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PERIODIC_POLL = exports.VOICE_INTERACTION = exports.APP_INTERACTION = exports.PHYSICAL_INTERACTION = exports.EVENT_LIMIT_SENSOR_VALUE = exports.EVENT_LIMIT_STATE = exports.WEBSOCKET_PING_TIMEOUT = exports.WEBSOCKET_PING_INTERVAL = exports.SINRICPRO_SERVER_SSL_PORT = exports.SINRICPRO_SERVER_PORT = exports.SINRICPRO_SERVER_URL = exports.InterfaceType = exports.MessageType = void 0;
|
|
7
|
+
var MessageType;
|
|
8
|
+
(function (MessageType) {
|
|
9
|
+
MessageType["Request"] = "request";
|
|
10
|
+
MessageType["Response"] = "response";
|
|
11
|
+
MessageType["Event"] = "event";
|
|
12
|
+
})(MessageType || (exports.MessageType = MessageType = {}));
|
|
13
|
+
var InterfaceType;
|
|
14
|
+
(function (InterfaceType) {
|
|
15
|
+
InterfaceType["WebSocket"] = "websocket";
|
|
16
|
+
InterfaceType["UDP"] = "udp";
|
|
17
|
+
})(InterfaceType || (exports.InterfaceType = InterfaceType = {}));
|
|
18
|
+
// Constants
|
|
19
|
+
exports.SINRICPRO_SERVER_URL = 'testws.sinric.pro';
|
|
20
|
+
exports.SINRICPRO_SERVER_PORT = 80;
|
|
21
|
+
exports.SINRICPRO_SERVER_SSL_PORT = 443;
|
|
22
|
+
exports.WEBSOCKET_PING_INTERVAL = 300000; // 5 minutes
|
|
23
|
+
exports.WEBSOCKET_PING_TIMEOUT = 10000; // 10 seconds
|
|
24
|
+
exports.EVENT_LIMIT_STATE = 1000; // 1 second
|
|
25
|
+
exports.EVENT_LIMIT_SENSOR_VALUE = 60000; // 60 seconds
|
|
26
|
+
exports.PHYSICAL_INTERACTION = 'PHYSICAL_INTERACTION';
|
|
27
|
+
exports.APP_INTERACTION = 'APP_INTERACTION';
|
|
28
|
+
exports.VOICE_INTERACTION = 'VOICE_INTERACTION';
|
|
29
|
+
exports.PERIODIC_POLL = 'PERIODIC_POLL';
|
|
30
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAcH,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,8BAAe,CAAA;AACjB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,4BAAW,CAAA;AACb,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAuFD,YAAY;AACC,QAAA,oBAAoB,GAAG,mBAAmB,CAAC;AAC3C,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAC3B,QAAA,yBAAyB,GAAG,GAAG,CAAC;AAChC,QAAA,uBAAuB,GAAG,MAAM,CAAC,CAAC,YAAY;AAC9C,QAAA,sBAAsB,GAAG,KAAK,CAAC,CAAC,aAAa;AAC7C,QAAA,iBAAiB,GAAG,IAAI,CAAC,CAAC,WAAW;AACrC,QAAA,wBAAwB,GAAG,KAAK,CAAC,CAAC,aAAa;AAE/C,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAC9C,QAAA,eAAe,GAAG,iBAAiB,CAAC;AACpC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,aAAa,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SinricProAirQualitySensor - Air quality sensor device
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SinricProAirQualitySensor = SinricProAirQualitySensor;
|
|
7
|
+
const SinricProDevice_1 = require("../core/SinricProDevice");
|
|
8
|
+
const AirQualitySensor_1 = require("../capabilities/AirQualitySensor");
|
|
9
|
+
const TemperatureSensor_1 = require("../capabilities/TemperatureSensor");
|
|
10
|
+
const SettingController_1 = require("../capabilities/SettingController");
|
|
11
|
+
const PushNotification_1 = require("../capabilities/PushNotification");
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
class SinricProAirQualitySensorClass extends (0, SettingController_1.SettingController)(
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
(0, PushNotification_1.PushNotification)((0, TemperatureSensor_1.TemperatureSensor)((0, AirQualitySensor_1.AirQualitySensor)(SinricProDevice_1.SinricProDevice)))) {
|
|
16
|
+
constructor(deviceId) {
|
|
17
|
+
super(deviceId, 'AIR_QUALITY_SENSOR');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a SinricProAirQualitySensor device
|
|
22
|
+
* @param deviceId - Device ID from SinricPro portal
|
|
23
|
+
* @returns SinricProAirQualitySensor instance
|
|
24
|
+
*/
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
function SinricProAirQualitySensor(deviceId) {
|
|
27
|
+
return new SinricProAirQualitySensorClass(deviceId);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=SinricProAirQualitySensor.js.map
|