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 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;;AAkBH,8CA+BC;AA/BD,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAGvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAJT,oBAAe,GAA2B,IAAI,CAAC;YAKrD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,SAAS,CAAC,QAAyB;YACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAClC,CAAC;QAEO,KAAK,CAAC,oBAAoB,CAAC,OAAyB;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,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"}
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(message) {
12
- this.queue.push(message);
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;;;AAEH,MAAa,YAAY;IAAzB;QACU,UAAK,GAAa,EAAE,CAAC;IAqB/B,CAAC;IAnBC,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;CACF;AAtBD,oCAsBC"}
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"}
@@ -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 JSON message string
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('"payload":');
25
- const endPayload = messageStr.indexOf(',"signature"', beginPayload);
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 + 10, endPayload);
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 payloadStr = JSON.stringify(message.payload);
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
- * Validate message signature
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(message) {
54
- // Timestamp messages don't have signatures
55
- if ('timestamp' in message) {
56
- return true;
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
- if (!message.signature || !message.signature.HMAC) {
84
+ catch {
59
85
  return false;
60
86
  }
61
- const messageStr = JSON.stringify(message);
62
- const payload = this.extractPayload(messageStr);
63
- const calculatedSignature = this.calculateSignature(payload);
64
- return calculatedSignature === message.signature.HMAC;
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,mCAAoC;AAGpC,MAAa,SAAS;IAGpB,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAe,EAAE,GAAW;QAC7C,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,UAAkB;QACvC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAEpE,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAe;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAyB;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAyB;QAChC,2CAA2C;QAC3C,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE7D,OAAO,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;IACxD,CAAC;CACF;AAtED,8BAsEC"}
1
+ {"version":3,"file":"Signature.js","sourceRoot":"","sources":["../../src/core/Signature.ts"],"names":[],"mappings":"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"}
@@ -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
- * @throws {Error} If connection to SinricPro server fails
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
- SinricProSdkLogger_1.SinricProSdkLogger.error('Failed to initialize SinricPro:', error);
80
- throw error;
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.sign(message);
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
- this.emit('error', error);
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 rawMessage = this.receiveQueue.pop();
240
- if (!rawMessage)
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
- // Validate signature
249
- if (!this.signature.validate(message)) {
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
- if (!this.isConnected()) {
276
- return;
277
- }
384
+ const deferred = [];
278
385
  while (!this.sendQueue.isEmpty()) {
279
- const message = this.sendQueue.pop();
280
- if (message) {
281
- try {
282
- this.websocket.send(message);
283
- }
284
- catch (error) {
285
- // If send fails, put message back in queue and stop processing
286
- this.sendQueue.push(message);
287
- SinricProSdkLogger_1.SinricProSdkLogger.error('Failed to send message, will retry later:', error);
288
- break;
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.sign(responseMessage);
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
- this.signature.sign(responseMessage);
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(JSON.stringify(responseMessage));
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
- sendInvalidSignatureResponse(message) {
402
- this.sendErrorResponse(message, 'Invalid signature');
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":"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"}
1
+ {"version":3,"file":"WebSocketClient.js","sourceRoot":"","sources":["../../src/core/WebSocketClient.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,4CAA2B;AAC3B,mCAAsC;AACtC,oEAAiE;AACjE,8CAAiD;AACjD,mCAIiB;AACjB,qDAA6C;AAU7C,MAAa,eAAgB,SAAQ,qBAAY;IAU/C,YAAY,MAAuB;QACjC,KAAK,EAAE,CAAC;QAVF,OAAE,GAAqB,IAAI,CAAC;QAE5B,iBAAY,GAA0B,IAAI,CAAC;QAC3C,gBAAW,GAA0B,IAAI,CAAC;QAC1C,qBAAgB,GAA0B,IAAI,CAAC;QAC/C,cAAS,GAAY,KAAK,CAAC;QAC3B,oBAAe,GAAY,IAAI,CAAC;QAChC,iBAAY,GAAW,CAAC,CAAC;QAI/B,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,sBAAO;YACnB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,uCAAkB,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,iCAAyB,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,CAAC;QAE9D,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;YAC1C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ;YAC1C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,sBAAO;YAC7C,GAAG,EAAE,IAAA,uBAAa,GAAE;SACrB,CAAC;QAEF,uCAAkB,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QAChD,uCAAkB,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAExD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,EAAE,GAAG,IAAI,YAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE1C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,uCAAkB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAoB,EAAE,EAAE;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,uCAAkB,CAAC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,uCAAkB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,uCAAkB,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,2CAA2C;gBAC3C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;gBAC/C,uCAAkB,CAAC,KAAK,CAAC,qCAAqC,OAAO,KAAK,CAAC,CAAC;gBAC5E,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACxE,uCAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,uCAAkB,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACf,uCAAkB,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAEhD,gCAAgC;gBAChC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;oBACjC,uCAAkB,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;oBAC7E,6BAA6B;oBAC7B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;wBACZ,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;oBACtB,CAAC;gBACH,CAAC,EAAE,8BAAsB,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,EAAE,+BAAuB,CAAC,CAAC;IAC9B,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,uCAAkB,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7B,uCAAkB,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED,gBAAgB,CAAC,SAAmB;QAClC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;CACF;AAxKD,0CAwKC"}
@@ -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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"}
@@ -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';
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAaH,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;AA8FD,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;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"}
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": "5.1.0",
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": {