sinricpro 5.1.0 → 6.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/README.md +43 -0
- package/dist/capabilities/SettingController.js +9 -0
- package/dist/capabilities/SettingController.js.map +1 -1
- package/dist/core/MessageQueue.js +6 -2
- package/dist/core/MessageQueue.js.map +1 -1
- package/dist/core/Signature.js +51 -18
- package/dist/core/Signature.js.map +1 -1
- package/dist/core/SinricPro.js +186 -49
- package/dist/core/SinricPro.js.map +1 -1
- package/dist/core/WebSocketClient.js +2 -22
- package/dist/core/WebSocketClient.js.map +1 -1
- package/dist/core/local/MdnsAnnouncer.js +107 -0
- package/dist/core/local/MdnsAnnouncer.js.map +1 -0
- package/dist/core/local/UdpListener.js +135 -0
- package/dist/core/local/UdpListener.js.map +1 -0
- package/dist/core/types.js +9 -1
- package/dist/core/types.js.map +1 -1
- package/dist/utils/network.js +58 -0
- package/dist/utils/network.js.map +1 -0
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ Official SinricPro SDK for Node.js and TypeScript. Control your IoT devices with
|
|
|
10
10
|
- ✅ Modern async/await API
|
|
11
11
|
- ✅ WebSocket with automatic reconnection
|
|
12
12
|
- ✅ HMAC-SHA256 authentication
|
|
13
|
+
- ✅ Local control over the LAN (works while SinricPro is unreachable)
|
|
13
14
|
- ✅ Event rate limiting
|
|
14
15
|
- ✅ Multiple device types (Switch, Light, Thermostat, etc.)
|
|
15
16
|
- ✅ Comprehensive error handling
|
|
@@ -95,6 +96,48 @@ ts-node app.ts
|
|
|
95
96
|
|
|
96
97
|
---
|
|
97
98
|
|
|
99
|
+
## 🏠 Local Control
|
|
100
|
+
|
|
101
|
+
Devices also answer signed commands over the local network, so they keep working
|
|
102
|
+
while SinricPro is unreachable. It is on by default and needs no application
|
|
103
|
+
changes: a LAN request runs the same callbacks as a cloud request. UDP listener on port `3333`, joined to multicast group `224.9.9.9` and answering unicast on the same port. Replies go back to the peer that sent the request, never to the cloud websocket.
|
|
104
|
+
|
|
105
|
+
The mDNS announcement uses `bonjour-service`, installed with the SDK:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npm install sinricpro
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Troubleshooting
|
|
114
|
+
|
|
115
|
+
### Connection Issues
|
|
116
|
+
|
|
117
|
+
1. **Check credentials** - Ensure APP_KEY and APP_SECRET are correct
|
|
118
|
+
2. **Check device ID** - Verify the device ID is exactly 24 hexadecimal characters
|
|
119
|
+
3. **Check network** - Ensure you have internet connectivity
|
|
120
|
+
4. **Enable debug logging** -
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
import { SinricProSdkLogger, LogLevel } from 'sinricpro';
|
|
124
|
+
SinricProSdkLogger.setLevel(LogLevel.DEBUG); // DEBUG, INFO, WARN, ERROR, NONE
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
### Local Control Issues
|
|
129
|
+
|
|
130
|
+
1. **No device found on the LAN** - check the log for
|
|
131
|
+
`Local control listening on UDP 3333`. A failed multicast join leaves nothing
|
|
132
|
+
listening, and the log line says so.
|
|
133
|
+
2. **No mDNS record** - install the extra: `pip install sinricpro[mdns]`.
|
|
134
|
+
3. **Discovery answers on the wrong network** - set `local_control_interface` to the
|
|
135
|
+
LAN address of the host.
|
|
136
|
+
4. **Android clients need a `WifiManager.MulticastLock`**, and iOS clients need
|
|
137
|
+
`_sinricpro._udp` listed in `NSBonjourServices`, or discovery returns nothing.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
98
141
|
## 🤝 Contributing
|
|
99
142
|
|
|
100
143
|
Contributions welcome! Please:
|
|
@@ -4,17 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SettingController = SettingController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
7
9
|
function SettingController(Base) {
|
|
8
10
|
return class extends Base {
|
|
9
11
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
12
|
constructor(...args) {
|
|
11
13
|
super(...args);
|
|
12
14
|
this.settingCallback = null;
|
|
15
|
+
this.settingEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
13
16
|
this.registerRequestHandler(this.handleSettingRequest.bind(this));
|
|
14
17
|
}
|
|
15
18
|
onSetting(callback) {
|
|
16
19
|
this.settingCallback = callback;
|
|
17
20
|
}
|
|
21
|
+
async sendSettingEvent(settingId, value, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.settingEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('setSetting', { id: settingId, value }, cause);
|
|
26
|
+
}
|
|
18
27
|
async handleSettingRequest(request) {
|
|
19
28
|
if (request.action !== 'setSetting' || !this.settingCallback) {
|
|
20
29
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingController.js","sourceRoot":"","sources":["../../src/capabilities/SettingController.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"SettingController.js","sourceRoot":"","sources":["../../src/capabilities/SettingController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqBH,8CA4CC;AA9DD,uDAAoD;AAEpD,yCAAwE;AAgBxE,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,oBAAe,GAA2B,IAAI,CAAC;YAC/C,wBAAmB,GAAiB,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK9E,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,SAAS,CAAC,QAAyB;YACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,gBAAgB,CACpB,SAAiB,EACjB,KAAc,EACd,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;QAEO,KAAK,CAAC,oBAAoB,CAAC,OAAyB;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAEjF,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,CAAC;gBACrC,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -8,8 +8,12 @@ class MessageQueue {
|
|
|
8
8
|
constructor() {
|
|
9
9
|
this.queue = [];
|
|
10
10
|
}
|
|
11
|
-
push(
|
|
12
|
-
this.queue.push(
|
|
11
|
+
push(entry) {
|
|
12
|
+
this.queue.push(entry);
|
|
13
|
+
}
|
|
14
|
+
/** Put an entry back at the head, preserving delivery order when a send is deferred. */
|
|
15
|
+
pushFront(entry) {
|
|
16
|
+
this.queue.unshift(entry);
|
|
13
17
|
}
|
|
14
18
|
pop() {
|
|
15
19
|
return this.queue.shift();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/core/MessageQueue.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/core/MessageQueue.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,MAAa,YAAY;IAAzB;QACU,UAAK,GAAoB,EAAE,CAAC;IA0BtC,CAAC;IAxBC,IAAI,CAAC,KAAoB;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,wFAAwF;IACxF,SAAS,CAAC,KAAoB;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;CACF;AA3BD,oCA2BC"}
|
package/dist/core/Signature.js
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Signature = void 0;
|
|
7
7
|
const crypto_1 = require("crypto");
|
|
8
|
+
const PAYLOAD_MARKER = '"payload":';
|
|
9
|
+
const SIGNATURE_MARKER = ',"signature"';
|
|
8
10
|
class Signature {
|
|
9
11
|
constructor(appSecret) {
|
|
10
12
|
this.appSecret = appSecret;
|
|
@@ -14,17 +16,21 @@ class Signature {
|
|
|
14
16
|
*/
|
|
15
17
|
hmacBase64(message, key) {
|
|
16
18
|
const hmac = (0, crypto_1.createHmac)('sha256', key);
|
|
17
|
-
hmac.update(message);
|
|
19
|
+
hmac.update(message, 'utf8');
|
|
18
20
|
return hmac.digest('base64');
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
|
-
* Extract payload from
|
|
23
|
+
* Extract the payload from a message exactly as it was received.
|
|
24
|
+
*
|
|
25
|
+
* The bytes between `"payload":` and `,"signature"` are taken verbatim: the
|
|
26
|
+
* sender's key order and spacing are its own and re-encoding a parsed object
|
|
27
|
+
* would produce a different byte string and a failed verification.
|
|
22
28
|
*/
|
|
23
29
|
extractPayload(messageStr) {
|
|
24
|
-
const beginPayload = messageStr.indexOf(
|
|
25
|
-
const endPayload = messageStr.indexOf(
|
|
30
|
+
const beginPayload = messageStr.indexOf(PAYLOAD_MARKER);
|
|
31
|
+
const endPayload = messageStr.indexOf(SIGNATURE_MARKER, beginPayload);
|
|
26
32
|
if (beginPayload > 0 && endPayload > 0) {
|
|
27
|
-
return messageStr.substring(beginPayload +
|
|
33
|
+
return messageStr.substring(beginPayload + PAYLOAD_MARKER.length, endPayload);
|
|
28
34
|
}
|
|
29
35
|
return '';
|
|
30
36
|
}
|
|
@@ -37,31 +43,58 @@ class Signature {
|
|
|
37
43
|
return this.hmacBase64(payload, this.appSecret);
|
|
38
44
|
}
|
|
39
45
|
/**
|
|
40
|
-
* Sign a message object
|
|
46
|
+
* Sign a message object in place.
|
|
41
47
|
*/
|
|
42
48
|
sign(message) {
|
|
43
|
-
const
|
|
44
|
-
const signature = this.calculateSignature(payloadStr);
|
|
49
|
+
const signature = this.calculateSignature(JSON.stringify(message.payload));
|
|
45
50
|
if (!message.signature) {
|
|
46
51
|
message.signature = { HMAC: '' };
|
|
47
52
|
}
|
|
48
53
|
message.signature.HMAC = signature;
|
|
49
54
|
}
|
|
50
55
|
/**
|
|
51
|
-
*
|
|
56
|
+
* Sign a message and return the exact bytes to transmit.
|
|
57
|
+
*
|
|
58
|
+
* The payload is serialised once and spliced into the envelope, so the HMAC
|
|
59
|
+
* always covers the bytes that go on the wire. Serialising it a second time
|
|
60
|
+
* for transmission is what silently breaks verification on the peer.
|
|
61
|
+
*/
|
|
62
|
+
serialize(message) {
|
|
63
|
+
const payloadStr = JSON.stringify(message.payload);
|
|
64
|
+
const hmac = this.calculateSignature(payloadStr);
|
|
65
|
+
message.signature = { HMAC: hmac };
|
|
66
|
+
return (`{"header":${JSON.stringify(message.header)},` +
|
|
67
|
+
`"payload":${payloadStr},` +
|
|
68
|
+
`"signature":{"HMAC":${JSON.stringify(hmac)}}}`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validate the signature of a message as it arrived on the wire.
|
|
72
|
+
*
|
|
73
|
+
* @param rawMessage - the received bytes, not a re-encoded object
|
|
52
74
|
*/
|
|
53
|
-
validate(
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
return
|
|
75
|
+
validate(rawMessage) {
|
|
76
|
+
const payload = this.extractPayload(rawMessage);
|
|
77
|
+
if (!payload)
|
|
78
|
+
return false;
|
|
79
|
+
let claimedSignature = '';
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(rawMessage);
|
|
82
|
+
claimedSignature = parsed?.signature?.HMAC ?? '';
|
|
57
83
|
}
|
|
58
|
-
|
|
84
|
+
catch {
|
|
59
85
|
return false;
|
|
60
86
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
87
|
+
if (!claimedSignature)
|
|
88
|
+
return false;
|
|
89
|
+
return Signature.constantTimeEquals(this.calculateSignature(payload), claimedSignature);
|
|
90
|
+
}
|
|
91
|
+
/** timingSafeEqual throws on unequal lengths; a length mismatch is never a match anyway. */
|
|
92
|
+
static constantTimeEquals(a, b) {
|
|
93
|
+
const bufferA = Buffer.from(a, 'utf8');
|
|
94
|
+
const bufferB = Buffer.from(b, 'utf8');
|
|
95
|
+
if (bufferA.length !== bufferB.length)
|
|
96
|
+
return false;
|
|
97
|
+
return (0, crypto_1.timingSafeEqual)(bufferA, bufferB);
|
|
65
98
|
}
|
|
66
99
|
}
|
|
67
100
|
exports.Signature = Signature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Signature.js","sourceRoot":"","sources":["../../src/core/Signature.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"Signature.js","sourceRoot":"","sources":["../../src/core/Signature.ts"],"names":[],"mappings":"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"}
|
package/dist/core/SinricPro.js
CHANGED
|
@@ -9,13 +9,19 @@ const WebSocketClient_1 = require("./WebSocketClient");
|
|
|
9
9
|
const MessageQueue_1 = require("./MessageQueue");
|
|
10
10
|
const Signature_1 = require("./Signature");
|
|
11
11
|
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
12
|
+
const UdpListener_1 = require("./local/UdpListener");
|
|
13
|
+
const MdnsAnnouncer_1 = require("./local/MdnsAnnouncer");
|
|
12
14
|
const types_1 = require("./types");
|
|
15
|
+
const EventLimiter_1 = require("./EventLimiter");
|
|
13
16
|
class SinricPro extends events_1.EventEmitter {
|
|
14
17
|
constructor() {
|
|
15
18
|
super();
|
|
16
19
|
this.isInitialized = false;
|
|
17
20
|
this.processingInterval = null;
|
|
18
21
|
this.moduleSettingCallback = null;
|
|
22
|
+
this.settingEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
23
|
+
this.udpListener = null;
|
|
24
|
+
this.mdnsAnnouncer = null;
|
|
19
25
|
this.devices = new Map();
|
|
20
26
|
this.receiveQueue = new MessageQueue_1.MessageQueue();
|
|
21
27
|
this.sendQueue = new MessageQueue_1.MessageQueue();
|
|
@@ -34,7 +40,10 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
34
40
|
* Initialize and connect to SinricPro service
|
|
35
41
|
* @param config - Configuration object containing appKey, appSecret, and optional settings
|
|
36
42
|
* @throws {Error} If appKey or appSecret are missing or invalid
|
|
37
|
-
*
|
|
43
|
+
*
|
|
44
|
+
* A cloud connection failure is not fatal: the SDK stays up, retries in the
|
|
45
|
+
* background, and keeps answering local control. Call isConnected() to check
|
|
46
|
+
* cloud state.
|
|
38
47
|
* @example
|
|
39
48
|
* ```typescript
|
|
40
49
|
* await SinricPro.begin({
|
|
@@ -54,6 +63,8 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
54
63
|
this.config = {
|
|
55
64
|
serverUrl: types_1.SINRICPRO_SERVER_URL,
|
|
56
65
|
debug: false,
|
|
66
|
+
localControl: process.env.SINRICPRO_NO_LOCAL_CONTROL !== '1',
|
|
67
|
+
mdns: process.env.SINRICPRO_NOMDNS !== '1',
|
|
57
68
|
...config,
|
|
58
69
|
};
|
|
59
70
|
// Set log level
|
|
@@ -69,16 +80,46 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
69
80
|
deviceIds: Array.from(this.devices.keys()),
|
|
70
81
|
});
|
|
71
82
|
this.setupWebSocketHandlers();
|
|
83
|
+
// Local control is brought up before the cloud on purpose: a host that has
|
|
84
|
+
// never reached SinricPro must still answer signed LAN requests.
|
|
85
|
+
await this.startLocalControl();
|
|
86
|
+
this.isInitialized = true;
|
|
87
|
+
this.startMessageProcessor();
|
|
72
88
|
try {
|
|
73
89
|
await this.websocket.connect();
|
|
74
|
-
this.isInitialized = true;
|
|
75
|
-
this.startMessageProcessor();
|
|
76
|
-
SinricProSdkLogger_1.SinricProSdkLogger.info('SinricPro SDK initialized successfully');
|
|
77
90
|
}
|
|
78
91
|
catch (error) {
|
|
79
|
-
|
|
80
|
-
|
|
92
|
+
// Transport failure is never fatal -- the socket's close handler arms the
|
|
93
|
+
// reconnect timer and local control already answers. Only invalid
|
|
94
|
+
// configuration throws, and validateConfig() has done so above.
|
|
95
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
96
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`Cloud connection failed (${reason}); will keep retrying`);
|
|
81
97
|
}
|
|
98
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('SinricPro SDK initialized successfully');
|
|
99
|
+
}
|
|
100
|
+
async startLocalControl() {
|
|
101
|
+
if (!this.config.localControl) {
|
|
102
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('Local control disabled by configuration');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.udpListener = new UdpListener_1.UdpListener();
|
|
106
|
+
this.udpListener.on('message', (message, origin) => {
|
|
107
|
+
this.receiveQueue.push({ message, origin });
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
await this.udpListener.start();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Already logged by the listener; the cloud path is unaffected.
|
|
114
|
+
this.udpListener = null;
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!this.config.mdns) {
|
|
118
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info('mDNS announcement disabled by configuration');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.mdnsAnnouncer = new MdnsAnnouncer_1.MdnsAnnouncer();
|
|
122
|
+
this.mdnsAnnouncer.start(Array.from(this.devices.keys()));
|
|
82
123
|
}
|
|
83
124
|
/**
|
|
84
125
|
* Add a device to SinricPro
|
|
@@ -110,6 +151,8 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
110
151
|
// Update WebSocket device list if already connected
|
|
111
152
|
if (this.isInitialized) {
|
|
112
153
|
this.websocket.updateDeviceList(Array.from(this.devices.keys()));
|
|
154
|
+
// Re-announce only because the device list changed.
|
|
155
|
+
this.mdnsAnnouncer?.update(Array.from(this.devices.keys()));
|
|
113
156
|
}
|
|
114
157
|
return device;
|
|
115
158
|
}
|
|
@@ -169,6 +212,59 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
169
212
|
onSetSetting(callback) {
|
|
170
213
|
this.moduleSettingCallback = callback;
|
|
171
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Send a module-level setting event to SinricPro server
|
|
217
|
+
*
|
|
218
|
+
* Module settings are configuration values for the module (dev board) itself.
|
|
219
|
+
* Use this to report setting changes like WiFi configuration, logging level,
|
|
220
|
+
* or other module-wide settings.
|
|
221
|
+
*
|
|
222
|
+
* @param settingId - The setting identifier
|
|
223
|
+
* @param value - The setting value (can be any JSON-serializable type)
|
|
224
|
+
* @param cause - (optional) Reason for the event (default: 'PHYSICAL_INTERACTION')
|
|
225
|
+
* @returns Promise<boolean> - true if event was sent, false if rate limited
|
|
226
|
+
* @example
|
|
227
|
+
* ```typescript
|
|
228
|
+
* await SinricPro.sendSettingEvent('wifi_retry_count', 5);
|
|
229
|
+
* await SinricPro.sendSettingEvent('debug_mode', true);
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
async sendSettingEvent(settingId, value, cause = types_1.PHYSICAL_INTERACTION) {
|
|
233
|
+
if (this.settingEventLimiter.isLimited()) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
if (!this.isConnected()) {
|
|
237
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Cannot send setting event: Not connected to SinricPro');
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
const eventMessage = {
|
|
241
|
+
header: {
|
|
242
|
+
payloadVersion: 2,
|
|
243
|
+
signatureVersion: 1,
|
|
244
|
+
},
|
|
245
|
+
payload: {
|
|
246
|
+
action: 'setSetting',
|
|
247
|
+
replyToken: this.generateMessageId(),
|
|
248
|
+
type: 'event',
|
|
249
|
+
createdAt: this.getTimestamp(),
|
|
250
|
+
cause: { type: cause },
|
|
251
|
+
scope: 'module',
|
|
252
|
+
value: { id: settingId, value },
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
try {
|
|
256
|
+
await this.sendMessage(eventMessage);
|
|
257
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`Module setting event sent: ${settingId}`, value);
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`Failed to send module setting event ${settingId}:`, error);
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
generateMessageId() {
|
|
266
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
267
|
+
}
|
|
172
268
|
/**
|
|
173
269
|
* Stop the SinricPro SDK and disconnect from the server
|
|
174
270
|
* @example
|
|
@@ -183,6 +279,10 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
183
279
|
clearInterval(this.processingInterval);
|
|
184
280
|
this.processingInterval = null;
|
|
185
281
|
}
|
|
282
|
+
this.mdnsAnnouncer?.stop();
|
|
283
|
+
this.mdnsAnnouncer = null;
|
|
284
|
+
this.udpListener?.stop();
|
|
285
|
+
this.udpListener = null;
|
|
186
286
|
await this.websocket.disconnect();
|
|
187
287
|
this.receiveQueue.clear();
|
|
188
288
|
this.sendQueue.clear();
|
|
@@ -198,8 +298,7 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
198
298
|
// ISinricPro interface methods
|
|
199
299
|
async sendMessage(message) {
|
|
200
300
|
message.payload.createdAt = this.getTimestamp();
|
|
201
|
-
this.signature.
|
|
202
|
-
this.sendQueue.push(JSON.stringify(message));
|
|
301
|
+
this.sendQueue.push({ message: this.signature.serialize(message), origin: types_1.WEBSOCKET_ORIGIN });
|
|
203
302
|
}
|
|
204
303
|
getTimestamp() {
|
|
205
304
|
return Math.floor(Date.now() / 1000);
|
|
@@ -218,14 +317,17 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
218
317
|
this.emit('disconnected');
|
|
219
318
|
});
|
|
220
319
|
this.websocket.on('message', (msg) => {
|
|
221
|
-
this.receiveQueue.push(msg);
|
|
320
|
+
this.receiveQueue.push({ message: msg, origin: types_1.WEBSOCKET_ORIGIN });
|
|
222
321
|
});
|
|
223
322
|
this.websocket.on('pong', (latency) => {
|
|
224
323
|
this.emit('pong', latency);
|
|
225
324
|
});
|
|
226
325
|
this.websocket.on('error', (error) => {
|
|
227
326
|
SinricProSdkLogger_1.SinricProSdkLogger.error('WebSocket error:', error);
|
|
228
|
-
|
|
327
|
+
// EventEmitter throws on an unhandled 'error' event; a cloud outage must
|
|
328
|
+
// not take down a process that is still serving local control.
|
|
329
|
+
if (this.listenerCount('error') > 0)
|
|
330
|
+
this.emit('error', error);
|
|
229
331
|
});
|
|
230
332
|
}
|
|
231
333
|
startMessageProcessor() {
|
|
@@ -236,19 +338,20 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
236
338
|
}
|
|
237
339
|
async processReceiveQueue() {
|
|
238
340
|
while (!this.receiveQueue.isEmpty()) {
|
|
239
|
-
const
|
|
240
|
-
if (!
|
|
341
|
+
const entry = this.receiveQueue.pop();
|
|
342
|
+
if (!entry)
|
|
241
343
|
continue;
|
|
344
|
+
const { message: rawMessage, origin } = entry;
|
|
242
345
|
try {
|
|
243
346
|
const message = JSON.parse(rawMessage);
|
|
244
347
|
// Handle timestamp message
|
|
245
348
|
if ('timestamp' in message) {
|
|
246
349
|
continue;
|
|
247
350
|
}
|
|
248
|
-
//
|
|
249
|
-
if (!this.signature.validate(
|
|
351
|
+
// Verified against the received bytes, never a re-encoded object.
|
|
352
|
+
if (!this.signature.validate(rawMessage)) {
|
|
250
353
|
SinricProSdkLogger_1.SinricProSdkLogger.error('Invalid message signature');
|
|
251
|
-
this.sendInvalidSignatureResponse(message);
|
|
354
|
+
this.sendInvalidSignatureResponse(message, origin);
|
|
252
355
|
continue;
|
|
253
356
|
}
|
|
254
357
|
// Route message
|
|
@@ -256,10 +359,10 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
256
359
|
// Check scope to determine if this is a module or device request
|
|
257
360
|
const scope = message.payload.scope || 'device';
|
|
258
361
|
if (scope === 'module') {
|
|
259
|
-
await this.handleModuleRequest(message);
|
|
362
|
+
await this.handleModuleRequest(message, origin);
|
|
260
363
|
}
|
|
261
364
|
else {
|
|
262
|
-
await this.handleRequest(message);
|
|
365
|
+
await this.handleRequest(message, origin);
|
|
263
366
|
}
|
|
264
367
|
}
|
|
265
368
|
else if (message.payload.type === 'response') {
|
|
@@ -271,31 +374,62 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
271
374
|
}
|
|
272
375
|
}
|
|
273
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Route each queued message by its own origin.
|
|
379
|
+
*
|
|
380
|
+
* The queue as a whole is never gated on the cloud - a UDP reply must go out
|
|
381
|
+
* even when the websocket has never connected.
|
|
382
|
+
*/
|
|
274
383
|
processSendQueue() {
|
|
275
|
-
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
384
|
+
const deferred = [];
|
|
278
385
|
while (!this.sendQueue.isEmpty()) {
|
|
279
|
-
const
|
|
280
|
-
if (
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
386
|
+
const entry = this.sendQueue.pop();
|
|
387
|
+
if (!entry)
|
|
388
|
+
continue;
|
|
389
|
+
if (entry.origin.transport === types_1.InterfaceType.UDP) {
|
|
390
|
+
this.udpListener?.send(entry.message, entry.origin.address, entry.origin.port);
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
if (!this.isConnected()) {
|
|
394
|
+
deferred.push(entry);
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
try {
|
|
398
|
+
this.websocket.send(entry.message);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('Failed to send message, will retry later:', error);
|
|
402
|
+
deferred.push(entry);
|
|
403
|
+
break;
|
|
290
404
|
}
|
|
291
405
|
}
|
|
406
|
+
if (deferred.length === 0)
|
|
407
|
+
return;
|
|
408
|
+
// An unreachable cloud must not grow the queue without bound.
|
|
409
|
+
const dropped = Math.max(0, deferred.length - types_1.MAX_QUEUED_WEBSOCKET_MESSAGES);
|
|
410
|
+
if (dropped > 0) {
|
|
411
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn(`Dropping ${dropped} websocket message(s): offline backlog exceeded ` +
|
|
412
|
+
`${types_1.MAX_QUEUED_WEBSOCKET_MESSAGES}`);
|
|
413
|
+
}
|
|
414
|
+
for (const entry of deferred.slice(dropped).reverse()) {
|
|
415
|
+
this.sendQueue.pushFront(entry);
|
|
416
|
+
}
|
|
292
417
|
}
|
|
293
|
-
async handleRequest(message) {
|
|
418
|
+
async handleRequest(message, origin) {
|
|
294
419
|
const deviceId = message.payload.deviceId;
|
|
295
420
|
const device = deviceId ? this.devices.get(deviceId) : null;
|
|
296
421
|
if (!device) {
|
|
422
|
+
// A LAN request for someone else's device is not ours to answer. Every
|
|
423
|
+
// device on an account shares one app secret, so a reply here is
|
|
424
|
+
// indistinguishable from the real owner's and would send a discovering
|
|
425
|
+
// client to the wrong address. The cloud only ever addresses devices we
|
|
426
|
+
// registered, so it still gets an answer.
|
|
427
|
+
if (origin.transport === types_1.InterfaceType.UDP) {
|
|
428
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`Ignoring LAN request for unknown device: ${deviceId}`);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
297
431
|
SinricProSdkLogger_1.SinricProSdkLogger.error(`Device not found: ${deviceId}`);
|
|
298
|
-
this.sendErrorResponse(message, `Device ${deviceId} not found
|
|
432
|
+
this.sendErrorResponse(message, `Device ${deviceId} not found`, origin);
|
|
299
433
|
return;
|
|
300
434
|
}
|
|
301
435
|
const request = {
|
|
@@ -305,15 +439,15 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
305
439
|
responseValue: {},
|
|
306
440
|
};
|
|
307
441
|
const success = await device.handleRequest(request);
|
|
308
|
-
this.sendResponse(message, success, request.responseValue, request.errorMessage);
|
|
442
|
+
this.sendResponse(message, success, request.responseValue, origin, request.errorMessage);
|
|
309
443
|
}
|
|
310
|
-
async handleModuleRequest(message) {
|
|
444
|
+
async handleModuleRequest(message, origin) {
|
|
311
445
|
const action = message.payload.action;
|
|
312
446
|
const requestValue = message.payload.value || {};
|
|
313
447
|
if (action === 'setSetting') {
|
|
314
448
|
if (!this.moduleSettingCallback) {
|
|
315
449
|
SinricProSdkLogger_1.SinricProSdkLogger.error('No module setting callback registered');
|
|
316
|
-
this.sendModuleResponse(message, false, {}, 'No module setting callback registered');
|
|
450
|
+
this.sendModuleResponse(message, false, {}, origin, 'No module setting callback registered');
|
|
317
451
|
return;
|
|
318
452
|
}
|
|
319
453
|
const settingId = requestValue.id || '';
|
|
@@ -321,19 +455,19 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
321
455
|
try {
|
|
322
456
|
const success = await this.moduleSettingCallback(settingId, value);
|
|
323
457
|
const responseValue = success ? { id: settingId, value } : {};
|
|
324
|
-
this.sendModuleResponse(message, success, responseValue);
|
|
458
|
+
this.sendModuleResponse(message, success, responseValue, origin);
|
|
325
459
|
}
|
|
326
460
|
catch (error) {
|
|
327
461
|
SinricProSdkLogger_1.SinricProSdkLogger.error('Error in module setting callback:', error);
|
|
328
|
-
this.sendModuleResponse(message, false, {}, String(error));
|
|
462
|
+
this.sendModuleResponse(message, false, {}, origin, String(error));
|
|
329
463
|
}
|
|
330
464
|
}
|
|
331
465
|
else {
|
|
332
466
|
SinricProSdkLogger_1.SinricProSdkLogger.error(`Unknown module action: ${action}`);
|
|
333
|
-
this.sendModuleResponse(message, false, {}, `Unknown module action: ${action}`);
|
|
467
|
+
this.sendModuleResponse(message, false, {}, origin, `Unknown module action: ${action}`);
|
|
334
468
|
}
|
|
335
469
|
}
|
|
336
|
-
sendModuleResponse(requestMessage, success, value, errorMessage) {
|
|
470
|
+
sendModuleResponse(requestMessage, success, value, origin, errorMessage) {
|
|
337
471
|
// Module response does NOT include deviceId
|
|
338
472
|
const responseMessage = {
|
|
339
473
|
header: {
|
|
@@ -352,10 +486,9 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
352
486
|
value,
|
|
353
487
|
},
|
|
354
488
|
};
|
|
355
|
-
this.signature.
|
|
356
|
-
this.sendQueue.push(JSON.stringify(responseMessage));
|
|
489
|
+
this.sendQueue.push({ message: this.signature.serialize(responseMessage), origin });
|
|
357
490
|
}
|
|
358
|
-
sendResponse(requestMessage, success, value, errorMessage) {
|
|
491
|
+
sendResponse(requestMessage, success, value, origin, errorMessage) {
|
|
359
492
|
const responseMessage = {
|
|
360
493
|
header: {
|
|
361
494
|
payloadVersion: 2,
|
|
@@ -374,11 +507,11 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
374
507
|
value,
|
|
375
508
|
},
|
|
376
509
|
};
|
|
377
|
-
|
|
510
|
+
// instanceId belongs to the payload, so it has to be set before signing.
|
|
378
511
|
if (requestMessage.payload.instanceId) {
|
|
379
512
|
responseMessage.payload.instanceId = requestMessage.payload.instanceId;
|
|
380
513
|
}
|
|
381
|
-
this.sendQueue.push(
|
|
514
|
+
this.sendQueue.push({ message: this.signature.serialize(responseMessage), origin });
|
|
382
515
|
}
|
|
383
516
|
validateConfig(config) {
|
|
384
517
|
// Validate required fields
|
|
@@ -395,11 +528,15 @@ class SinricPro extends events_1.EventEmitter {
|
|
|
395
528
|
throw new Error('Invalid appSecret: must be at least 32 characters long');
|
|
396
529
|
}
|
|
397
530
|
}
|
|
398
|
-
sendErrorResponse(message, errorMessage) {
|
|
399
|
-
this.sendResponse(message, false, { error: errorMessage });
|
|
531
|
+
sendErrorResponse(message, errorMessage, origin) {
|
|
532
|
+
this.sendResponse(message, false, { error: errorMessage }, origin);
|
|
400
533
|
}
|
|
401
|
-
|
|
402
|
-
|
|
534
|
+
/**
|
|
535
|
+
* A request that fails verification is answered rather than dropped, so a
|
|
536
|
+
* client can tell a wrong app secret from an unreachable device.
|
|
537
|
+
*/
|
|
538
|
+
sendInvalidSignatureResponse(message, origin) {
|
|
539
|
+
this.sendResponse(message, false, {}, origin, 'Signature is invalid');
|
|
403
540
|
}
|
|
404
541
|
}
|
|
405
542
|
exports.SinricPro = SinricPro;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SinricPro.js","sourceRoot":"","sources":["../../src/core/SinricPro.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SinricPro.js","sourceRoot":"","sources":["../../src/core/SinricPro.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,30 +9,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.WebSocketClient = void 0;
|
|
10
10
|
const ws_1 = __importDefault(require("ws"));
|
|
11
11
|
const events_1 = require("events");
|
|
12
|
-
const os_1 = __importDefault(require("os"));
|
|
13
12
|
const SinricProSdkLogger_1 = require("../utils/SinricProSdkLogger");
|
|
13
|
+
const network_1 = require("../utils/network");
|
|
14
14
|
const types_1 = require("./types");
|
|
15
15
|
const package_json_1 = require("../../package.json");
|
|
16
|
-
/**
|
|
17
|
-
* Get the MAC address of this machine.
|
|
18
|
-
* Returns the MAC address of the first non-internal network interface.
|
|
19
|
-
* @returns MAC address string in format XX:XX:XX:XX:XX:XX
|
|
20
|
-
*/
|
|
21
|
-
function getMacAddress() {
|
|
22
|
-
const interfaces = os_1.default.networkInterfaces();
|
|
23
|
-
for (const name of Object.keys(interfaces)) {
|
|
24
|
-
const netInterfaces = interfaces[name];
|
|
25
|
-
if (!netInterfaces)
|
|
26
|
-
continue;
|
|
27
|
-
for (const net of netInterfaces) {
|
|
28
|
-
// Skip internal and non-MAC interfaces
|
|
29
|
-
if (!net.internal && net.mac && net.mac !== '00:00:00:00:00:00') {
|
|
30
|
-
return net.mac.toUpperCase();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return '00:00:00:00:00:00';
|
|
35
|
-
}
|
|
36
16
|
class WebSocketClient extends events_1.EventEmitter {
|
|
37
17
|
constructor(config) {
|
|
38
18
|
super();
|
|
@@ -62,7 +42,7 @@ class WebSocketClient extends events_1.EventEmitter {
|
|
|
62
42
|
deviceids: this.config.deviceIds.join(';'),
|
|
63
43
|
platform: this.config.platform || 'NodeJS',
|
|
64
44
|
SDKVersion: this.config.sdkVersion || package_json_1.version,
|
|
65
|
-
mac: getMacAddress(),
|
|
45
|
+
mac: (0, network_1.getMacAddress)(),
|
|
66
46
|
};
|
|
67
47
|
SinricProSdkLogger_1.SinricProSdkLogger.info(`Connecting to ${url}`);
|
|
68
48
|
SinricProSdkLogger_1.SinricProSdkLogger.debug('WebSocket headers:', headers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.js","sourceRoot":"","sources":["../../src/core/WebSocketClient.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,4CAA2B;AAC3B,mCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"WebSocketClient.js","sourceRoot":"","sources":["../../src/core/WebSocketClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* mDNS announcement for local (LAN) control
|
|
4
|
+
*
|
|
5
|
+
* Publishes `_sinricpro._udp.local.` so apps on the same network can find this
|
|
6
|
+
* host without going through the cloud.
|
|
7
|
+
*
|
|
8
|
+
* The responder is an optional peer dependency (`bonjour-service`). It is
|
|
9
|
+
* loaded at runtime so the SDK keeps installing with no extra dependencies -
|
|
10
|
+
* without it local control still works for a client that knows the address.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.MdnsAnnouncer = void 0;
|
|
14
|
+
const SinricProSdkLogger_1 = require("../../utils/SinricProSdkLogger");
|
|
15
|
+
const network_1 = require("../../utils/network");
|
|
16
|
+
const types_1 = require("../types");
|
|
17
|
+
const package_json_1 = require("../../../package.json");
|
|
18
|
+
const OPTIONAL_MDNS_MODULES = ['bonjour-service', 'bonjour'];
|
|
19
|
+
function loadResponder() {
|
|
20
|
+
for (const moduleName of OPTIONAL_MDNS_MODULES) {
|
|
21
|
+
try {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
23
|
+
const loaded = require(moduleName);
|
|
24
|
+
const factory = loaded?.Bonjour ?? loaded?.default ?? loaded;
|
|
25
|
+
return new factory();
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`mDNS: ${moduleName} unavailable:`, error.message);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
class MdnsAnnouncer {
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.responder = null;
|
|
36
|
+
this.service = null;
|
|
37
|
+
this.deviceIds = '';
|
|
38
|
+
this.port = options.port ?? types_1.UDP_MULTICAST_PORT;
|
|
39
|
+
this.hostName = options.hostName ?? (0, network_1.getMdnsHostName)();
|
|
40
|
+
}
|
|
41
|
+
start(deviceIds) {
|
|
42
|
+
if (this.responder)
|
|
43
|
+
return;
|
|
44
|
+
this.responder = loadResponder();
|
|
45
|
+
if (!this.responder) {
|
|
46
|
+
SinricProSdkLogger_1.SinricProSdkLogger.warn('mDNS: no responder installed, local control will not be discoverable. ' +
|
|
47
|
+
'Run `npm install bonjour-service` to enable discovery.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.deviceIds = deviceIds.join(',');
|
|
51
|
+
this.announce();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Re-announce when the device list changes - not on a timer and not on every
|
|
55
|
+
* reconnect.
|
|
56
|
+
*/
|
|
57
|
+
update(deviceIds) {
|
|
58
|
+
const joined = deviceIds.join(',');
|
|
59
|
+
if (!this.responder || joined === this.deviceIds)
|
|
60
|
+
return;
|
|
61
|
+
this.deviceIds = joined;
|
|
62
|
+
if (this.service) {
|
|
63
|
+
this.service.stop();
|
|
64
|
+
this.service = null;
|
|
65
|
+
}
|
|
66
|
+
this.announce();
|
|
67
|
+
}
|
|
68
|
+
stop() {
|
|
69
|
+
if (this.service) {
|
|
70
|
+
this.service.stop();
|
|
71
|
+
this.service = null;
|
|
72
|
+
}
|
|
73
|
+
if (this.responder) {
|
|
74
|
+
this.responder.destroy();
|
|
75
|
+
this.responder = null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
isAnnouncing() {
|
|
79
|
+
return this.service !== null;
|
|
80
|
+
}
|
|
81
|
+
announce() {
|
|
82
|
+
if (!this.responder)
|
|
83
|
+
return;
|
|
84
|
+
try {
|
|
85
|
+
this.service = this.responder.publish({
|
|
86
|
+
name: this.hostName,
|
|
87
|
+
type: types_1.MDNS_SERVICE_TYPE,
|
|
88
|
+
protocol: types_1.MDNS_SERVICE_PROTOCOL,
|
|
89
|
+
port: this.port,
|
|
90
|
+
host: `${this.hostName}.local`,
|
|
91
|
+
txt: {
|
|
92
|
+
deviceIds: this.deviceIds,
|
|
93
|
+
sdk: package_json_1.version,
|
|
94
|
+
udp: '1',
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info(`mDNS: announced _${types_1.MDNS_SERVICE_TYPE}._${types_1.MDNS_SERVICE_PROTOCOL}.local. ` +
|
|
98
|
+
`host=${this.hostName}.local port=${this.port} deviceIds=${this.deviceIds}`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('mDNS: failed to announce service:', error.message);
|
|
102
|
+
this.service = null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.MdnsAnnouncer = MdnsAnnouncer;
|
|
107
|
+
//# sourceMappingURL=MdnsAnnouncer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MdnsAnnouncer.js","sourceRoot":"","sources":["../../../src/core/local/MdnsAnnouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UDP listener for local (LAN) control
|
|
4
|
+
*
|
|
5
|
+
* Listens on the SinricPro multicast group and answers unicast requests sent
|
|
6
|
+
* directly to this host on the same port.
|
|
7
|
+
*
|
|
8
|
+
* Emits `message` with (message: string, origin: UdpOrigin) and `error` with an Error.
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.UdpListener = void 0;
|
|
15
|
+
const dgram_1 = __importDefault(require("dgram"));
|
|
16
|
+
const events_1 = require("events");
|
|
17
|
+
const SinricProSdkLogger_1 = require("../../utils/SinricProSdkLogger");
|
|
18
|
+
const network_1 = require("../../utils/network");
|
|
19
|
+
const types_1 = require("../types");
|
|
20
|
+
class UdpListener extends events_1.EventEmitter {
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
super();
|
|
23
|
+
this.socket = null;
|
|
24
|
+
this.listening = false;
|
|
25
|
+
this.port = options.port ?? types_1.UDP_MULTICAST_PORT;
|
|
26
|
+
this.multicastAddress = options.multicastAddress ?? types_1.UDP_MULTICAST_ADDRESS;
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
if (this.socket)
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const socket = dgram_1.default.createSocket({ type: 'udp4', reuseAddr: true });
|
|
33
|
+
this.socket = socket;
|
|
34
|
+
socket.on('error', (error) => {
|
|
35
|
+
if (!this.listening) {
|
|
36
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`UDP: could not listen on port ${this.port}, local control unavailable:`, error.message);
|
|
37
|
+
this.socket = null;
|
|
38
|
+
socket.close();
|
|
39
|
+
reject(error);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('UDP socket error:', error.message);
|
|
43
|
+
this.emit('error', error);
|
|
44
|
+
});
|
|
45
|
+
socket.on('listening', () => {
|
|
46
|
+
this.listening = true;
|
|
47
|
+
this.joinMulticastGroup(socket);
|
|
48
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info(`UDP: listening on port ${this.port}`);
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
socket.on('message', (data, rinfo) => {
|
|
52
|
+
const message = data.toString('utf8');
|
|
53
|
+
const origin = {
|
|
54
|
+
transport: types_1.InterfaceType.UDP,
|
|
55
|
+
address: rinfo.address,
|
|
56
|
+
port: rinfo.port,
|
|
57
|
+
};
|
|
58
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`UDP received from ${rinfo.address}:${rinfo.port}:`, message);
|
|
59
|
+
this.emit('message', message, origin);
|
|
60
|
+
});
|
|
61
|
+
socket.bind(this.port);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Send a reply on the *listening* socket.
|
|
66
|
+
*
|
|
67
|
+
* A separate send-only socket is what broke this feature on ESP8266: the send
|
|
68
|
+
* reported success and nothing reached the wire. Reception survives sending
|
|
69
|
+
* from the joined socket.
|
|
70
|
+
*/
|
|
71
|
+
send(message, address, port) {
|
|
72
|
+
if (!this.socket) {
|
|
73
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('UDP: not listening, dropping reply');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!port) {
|
|
77
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error('UDP: message has no peer to answer, dropping');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const buffer = Buffer.from(message, 'utf8');
|
|
81
|
+
this.socket.send(buffer, port, address, (error) => {
|
|
82
|
+
if (error) {
|
|
83
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`UDP: reply to ${address}:${port} failed:`, error.message);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`UDP sent to ${address}:${port}:`, message);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
isListening() {
|
|
90
|
+
return this.listening;
|
|
91
|
+
}
|
|
92
|
+
stop() {
|
|
93
|
+
if (!this.socket)
|
|
94
|
+
return;
|
|
95
|
+
try {
|
|
96
|
+
this.socket.close();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug('UDP: error while closing socket:', error);
|
|
100
|
+
}
|
|
101
|
+
this.socket = null;
|
|
102
|
+
this.listening = false;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A silently failed group join is how local control dies invisibly, so the
|
|
106
|
+
* outcome is logged either way.
|
|
107
|
+
*/
|
|
108
|
+
joinMulticastGroup(socket) {
|
|
109
|
+
const interfaces = (0, network_1.getLocalIPv4Addresses)();
|
|
110
|
+
const joined = [];
|
|
111
|
+
for (const address of interfaces) {
|
|
112
|
+
try {
|
|
113
|
+
socket.addMembership(this.multicastAddress, address);
|
|
114
|
+
joined.push(address);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
SinricProSdkLogger_1.SinricProSdkLogger.debug(`UDP: could not join ${this.multicastAddress} on ${address}:`, error.message);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (joined.length === 0) {
|
|
121
|
+
// No usable interface address; let the OS pick one.
|
|
122
|
+
try {
|
|
123
|
+
socket.addMembership(this.multicastAddress);
|
|
124
|
+
joined.push('default');
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
SinricProSdkLogger_1.SinricProSdkLogger.error(`UDP: failed to join multicast group ${this.multicastAddress}, discovery will not work:`, error.message);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
SinricProSdkLogger_1.SinricProSdkLogger.info(`UDP: joined multicast group ${this.multicastAddress} on ${joined.join(', ')}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.UdpListener = UdpListener;
|
|
135
|
+
//# sourceMappingURL=UdpListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UdpListener.js","sourceRoot":"","sources":["../../../src/core/local/UdpListener.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Core type definitions for SinricPro SDK
|
|
4
4
|
*/
|
|
5
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;
|
|
6
|
+
exports.PERIODIC_POLL = exports.VOICE_INTERACTION = exports.APP_INTERACTION = exports.PHYSICAL_INTERACTION = exports.MAX_QUEUED_WEBSOCKET_MESSAGES = exports.MDNS_SERVICE_PROTOCOL = exports.MDNS_SERVICE_TYPE = exports.UDP_MULTICAST_PORT = exports.UDP_MULTICAST_ADDRESS = 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.WEBSOCKET_ORIGIN = exports.InterfaceType = exports.MessageType = void 0;
|
|
7
7
|
var MessageType;
|
|
8
8
|
(function (MessageType) {
|
|
9
9
|
MessageType["Request"] = "request";
|
|
@@ -15,6 +15,7 @@ var InterfaceType;
|
|
|
15
15
|
InterfaceType["WebSocket"] = "websocket";
|
|
16
16
|
InterfaceType["UDP"] = "udp";
|
|
17
17
|
})(InterfaceType || (exports.InterfaceType = InterfaceType = {}));
|
|
18
|
+
exports.WEBSOCKET_ORIGIN = { transport: InterfaceType.WebSocket };
|
|
18
19
|
// Constants
|
|
19
20
|
exports.SINRICPRO_SERVER_URL = 'ws.sinric.pro';
|
|
20
21
|
exports.SINRICPRO_SERVER_PORT = 80;
|
|
@@ -23,6 +24,13 @@ exports.WEBSOCKET_PING_INTERVAL = 300000; // 5 minutes
|
|
|
23
24
|
exports.WEBSOCKET_PING_TIMEOUT = 10000; // 10 seconds
|
|
24
25
|
exports.EVENT_LIMIT_STATE = 1000; // 1 second
|
|
25
26
|
exports.EVENT_LIMIT_SENSOR_VALUE = 60000; // 60 seconds
|
|
27
|
+
// Local control (LAN) configuration - must match the other SinricPro SDKs
|
|
28
|
+
exports.UDP_MULTICAST_ADDRESS = '224.9.9.9';
|
|
29
|
+
exports.UDP_MULTICAST_PORT = 3333;
|
|
30
|
+
exports.MDNS_SERVICE_TYPE = 'sinricpro';
|
|
31
|
+
exports.MDNS_SERVICE_PROTOCOL = 'udp';
|
|
32
|
+
/** Websocket messages queued while offline are capped so an unreachable cloud cannot exhaust memory. */
|
|
33
|
+
exports.MAX_QUEUED_WEBSOCKET_MESSAGES = 100;
|
|
26
34
|
exports.PHYSICAL_INTERACTION = 'PHYSICAL_INTERACTION';
|
|
27
35
|
exports.APP_INTERACTION = 'APP_INTERACTION';
|
|
28
36
|
exports.VOICE_INTERACTION = 'VOICE_INTERACTION';
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiBH,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;AAeY,QAAA,gBAAgB,GAAoB,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;AAuGxF,YAAY;AACC,QAAA,oBAAoB,GAAG,eAAe,CAAC;AACvC,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;AAE5D,0EAA0E;AAC7D,QAAA,qBAAqB,GAAG,WAAW,CAAC;AACpC,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAC1B,QAAA,iBAAiB,GAAG,WAAW,CAAC;AAChC,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAC3C,wGAAwG;AAC3F,QAAA,6BAA6B,GAAG,GAAG,CAAC;AAEpC,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,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Host network helpers shared by the websocket client and local control
|
|
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.getMacAddress = getMacAddress;
|
|
10
|
+
exports.getMdnsHostName = getMdnsHostName;
|
|
11
|
+
exports.getLocalIPv4Addresses = getLocalIPv4Addresses;
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const NO_MAC = '00:00:00:00:00:00';
|
|
14
|
+
/**
|
|
15
|
+
* MAC address of the first non-internal network interface.
|
|
16
|
+
* @returns MAC address string in format XX:XX:XX:XX:XX:XX
|
|
17
|
+
*/
|
|
18
|
+
function getMacAddress() {
|
|
19
|
+
for (const netInterfaces of Object.values(os_1.default.networkInterfaces())) {
|
|
20
|
+
if (!netInterfaces)
|
|
21
|
+
continue;
|
|
22
|
+
for (const net of netInterfaces) {
|
|
23
|
+
if (!net.internal && net.mac && net.mac !== NO_MAC) {
|
|
24
|
+
return net.mac.toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return NO_MAC;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* mDNS host name for this machine: `sinricpro-<mac, lowercase, no separators>`.
|
|
32
|
+
*/
|
|
33
|
+
function getMdnsHostName() {
|
|
34
|
+
return `sinricpro-${getMacAddress().replace(/[:-]/g, '').toLowerCase()}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* IPv4 addresses of every non-internal interface.
|
|
38
|
+
*
|
|
39
|
+
* A host commonly has several (Docker, VPN, WSL) and the multicast group has to
|
|
40
|
+
* be joined on each of them, or discovery answers on the wrong network.
|
|
41
|
+
*/
|
|
42
|
+
function getLocalIPv4Addresses() {
|
|
43
|
+
const addresses = [];
|
|
44
|
+
for (const netInterfaces of Object.values(os_1.default.networkInterfaces())) {
|
|
45
|
+
if (!netInterfaces)
|
|
46
|
+
continue;
|
|
47
|
+
for (const net of netInterfaces) {
|
|
48
|
+
if (net.internal)
|
|
49
|
+
continue;
|
|
50
|
+
// Node <18.4 reports family as 'IPv4', newer versions as 4
|
|
51
|
+
if (net.family !== 'IPv4' && net.family !== 4)
|
|
52
|
+
continue;
|
|
53
|
+
addresses.push(net.address);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return addresses;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAUH,sCAYC;AAKD,0CAEC;AAQD,sDAeC;AAlDD,4CAAoB;AAEpB,MAAM,MAAM,GAAG,mBAAmB,CAAC;AAEnC;;;GAGG;AACH,SAAgB,aAAa;IAC3B,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,YAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnD,OAAO,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe;IAC7B,OAAO,aAAa,aAAa,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB;IACnC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,YAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,QAAQ;gBAAE,SAAS;YAC3B,2DAA2D;YAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAK,GAAG,CAAC,MAA4B,KAAK,CAAC;gBAAE,SAAS;YAC/E,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sinricpro",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Official SinricPro SDK for Node.js and TypeScript - Control IoT devices with Alexa and Google Home",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -37,7 +37,9 @@
|
|
|
37
37
|
"typescript",
|
|
38
38
|
"nodejs",
|
|
39
39
|
"websocket",
|
|
40
|
-
"home-automation"
|
|
40
|
+
"home-automation",
|
|
41
|
+
"local-control",
|
|
42
|
+
"mdns"
|
|
41
43
|
],
|
|
42
44
|
"author": "SinricPro",
|
|
43
45
|
"license": "CC-BY-SA-4.0",
|
|
@@ -59,6 +61,7 @@
|
|
|
59
61
|
],
|
|
60
62
|
"sideEffects": false,
|
|
61
63
|
"dependencies": {
|
|
64
|
+
"bonjour-service": "^1.2.1",
|
|
62
65
|
"ws": "^8.14.2"
|
|
63
66
|
},
|
|
64
67
|
"devDependencies": {
|