homebridge-myleviton 3.4.10 → 3.6.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 +10 -3
- package/config.schema.json +27 -0
- package/dist/api/circuit-breaker.d.ts +10 -0
- package/dist/api/circuit-breaker.d.ts.map +1 -1
- package/dist/api/circuit-breaker.js +17 -4
- package/dist/api/circuit-breaker.js.map +1 -1
- package/dist/api/client.d.ts +24 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +95 -42
- package/dist/api/client.js.map +1 -1
- package/dist/api/websocket.d.ts +6 -0
- package/dist/api/websocket.d.ts.map +1 -1
- package/dist/api/websocket.js +16 -8
- package/dist/api/websocket.js.map +1 -1
- package/dist/platform.d.ts +31 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +174 -25
- package/dist/platform.js.map +1 -1
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +6 -3
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sanitizers.js +1 -1
- package/dist/utils/sanitizers.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,15 +21,20 @@ Control your **My Leviton Decora Smart** WiFi devices through Apple HomeKit usin
|
|
|
21
21
|
|
|
22
22
|
### Reliability
|
|
23
23
|
- **Real-Time Updates** — Instant state sync via WebSocket
|
|
24
|
-
- **Automatic State Sync** — Polls device state every 30 seconds as safety net
|
|
24
|
+
- **Automatic State Sync** — Polls device state every 30 seconds as safety net (also refreshes motion/occupancy)
|
|
25
|
+
- **Automatic Retry** — Transient network and 5xx errors are retried with exponential backoff
|
|
26
|
+
- **Self-Healing Startup** — Retries device discovery after a transient outage at boot instead of staying offline until restart
|
|
25
27
|
- **Rate Limiting** — Prevents API throttling (300 requests/minute)
|
|
26
|
-
- **Circuit Breaker** — Graceful degradation during API outages
|
|
28
|
+
- **Circuit Breaker** — Graceful degradation during API outages, with state transitions surfaced in the logs
|
|
27
29
|
- **Auto-Reconnect** — Automatically recovers from connection issues
|
|
30
|
+
- **Account Isolation** — Each configured account has its own circuit breaker, rate limiter, and cache
|
|
28
31
|
- **State Persistence** — Faster startup with cached device data
|
|
29
32
|
- **Token Auto-Refresh** — Seamless authentication management
|
|
33
|
+
- **Connectivity Sensor** *(optional)* — Exposes a HomeKit contact sensor that reports whether the plugin can reach the Leviton cloud, so you can alert or automate on outages
|
|
30
34
|
|
|
31
35
|
### Quality
|
|
32
|
-
|
|
36
|
+
<!-- Canonical test count lives here only; keep other docs number-free to avoid 5-place updates. -->
|
|
37
|
+
- **503 Tests** — Comprehensive test suite with 95%+ code coverage
|
|
33
38
|
- **Child Bridge Support** — Run as isolated bridge for maximum stability
|
|
34
39
|
- **Flexible Logging** — Debug, info, warn, error levels + JSON structured logs
|
|
35
40
|
- **No Analytics** — Zero tracking or data collection
|
|
@@ -93,6 +98,8 @@ Your devices will appear in the Home app automatically.
|
|
|
93
98
|
| `excludedModels` | | Device models to skip, e.g. `["DW15P"]` |
|
|
94
99
|
| `excludedSerials` | | Device serials to skip |
|
|
95
100
|
| `structuredLogs` | | Output logs as JSON for log aggregation tools |
|
|
101
|
+
| `connectivitySensor` | | Expose a HomeKit contact sensor for Leviton cloud reachability (default: off) |
|
|
102
|
+
| `connectivitySensorName` | | Name for the connectivity sensor (default: "Leviton Cloud") |
|
|
96
103
|
|
|
97
104
|
## Not Working?
|
|
98
105
|
|
package/config.schema.json
CHANGED
|
@@ -86,6 +86,22 @@
|
|
|
86
86
|
"type": "boolean",
|
|
87
87
|
"default": false,
|
|
88
88
|
"description": "Output logs in JSON format for integration with log management tools like Datadog, Splunk, or ELK stack."
|
|
89
|
+
},
|
|
90
|
+
"connectivitySensor": {
|
|
91
|
+
"title": "Expose Cloud Connectivity Sensor",
|
|
92
|
+
"type": "boolean",
|
|
93
|
+
"default": false,
|
|
94
|
+
"description": "Adds a HomeKit contact sensor that reports whether the plugin can reach the Leviton cloud. Use it to get notified or trigger automations when connectivity is lost."
|
|
95
|
+
},
|
|
96
|
+
"connectivitySensorName": {
|
|
97
|
+
"title": "Connectivity Sensor Name",
|
|
98
|
+
"type": "string",
|
|
99
|
+
"default": "Leviton Cloud",
|
|
100
|
+
"placeholder": "Leviton Cloud",
|
|
101
|
+
"description": "Name shown in HomeKit for the connectivity sensor.",
|
|
102
|
+
"condition": {
|
|
103
|
+
"functionBody": "return model.connectivitySensor === true;"
|
|
104
|
+
}
|
|
89
105
|
}
|
|
90
106
|
}
|
|
91
107
|
},
|
|
@@ -136,6 +152,17 @@
|
|
|
136
152
|
}
|
|
137
153
|
]
|
|
138
154
|
},
|
|
155
|
+
{
|
|
156
|
+
"type": "fieldset",
|
|
157
|
+
"title": "Connectivity Sensor",
|
|
158
|
+
"description": "Optionally expose a HomeKit sensor that tracks Leviton cloud connectivity.",
|
|
159
|
+
"expandable": true,
|
|
160
|
+
"expanded": false,
|
|
161
|
+
"items": [
|
|
162
|
+
"connectivitySensor",
|
|
163
|
+
"connectivitySensorName"
|
|
164
|
+
]
|
|
165
|
+
},
|
|
139
166
|
{
|
|
140
167
|
"type": "fieldset",
|
|
141
168
|
"title": "Advanced Options",
|
|
@@ -29,6 +29,11 @@ export interface CircuitBreakerConfig {
|
|
|
29
29
|
halfOpenMax: number;
|
|
30
30
|
/** Window for counting failures (ms) */
|
|
31
31
|
failureWindow?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Invoked whenever the circuit transitions between states. Used for
|
|
34
|
+
* observability so operators can see when the breaker opens or recovers.
|
|
35
|
+
*/
|
|
36
|
+
onStateChange?: (from: CircuitState, to: CircuitState) => void;
|
|
32
37
|
}
|
|
33
38
|
/**
|
|
34
39
|
* Default circuit breaker configuration
|
|
@@ -55,6 +60,7 @@ export declare class CircuitBreaker {
|
|
|
55
60
|
private readonly resetTimeout;
|
|
56
61
|
private readonly halfOpenMax;
|
|
57
62
|
private readonly failureWindow;
|
|
63
|
+
private readonly onStateChange?;
|
|
58
64
|
private _state;
|
|
59
65
|
private failures;
|
|
60
66
|
private successes;
|
|
@@ -66,6 +72,10 @@ export declare class CircuitBreaker {
|
|
|
66
72
|
* Current circuit state
|
|
67
73
|
*/
|
|
68
74
|
get state(): CircuitState;
|
|
75
|
+
/**
|
|
76
|
+
* Transition to a new state, notifying observers only on an actual change.
|
|
77
|
+
*/
|
|
78
|
+
private transitionTo;
|
|
69
79
|
/**
|
|
70
80
|
* Check if circuit is open
|
|
71
81
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/api/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,oBAAY,YAAY;IACtB,+CAA+C;IAC/C,MAAM,WAAW;IACjB,kDAAkD;IAClD,IAAI,SAAS;IACb,mCAAmC;IACnC,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/api/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,oBAAY,YAAY;IACtB,+CAA+C;IAC/C,MAAM,WAAW;IACjB,kDAAkD;IAClD,IAAI,SAAS;IACb,mCAAmC;IACnC,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;CAC/D;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgD;IAE/E,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,iBAAiB,CAAe;gBAE5B,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAStD;;OAEG;IACH,IAAI,KAAK,IAAI,YAAY,CAExB;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,UAAU,IAAI,OAAO;IAwBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAarB;;OAEG;IACH,aAAa,IAAI,IAAI;IAkBrB;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAM5B;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,SAAS,IAAI,oBAAoB;IAmBjC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBlD;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;CAGzF;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAKxF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
|
@@ -42,6 +42,7 @@ class CircuitBreaker {
|
|
|
42
42
|
resetTimeout;
|
|
43
43
|
halfOpenMax;
|
|
44
44
|
failureWindow;
|
|
45
|
+
onStateChange;
|
|
45
46
|
_state = CircuitState.CLOSED;
|
|
46
47
|
failures = 0;
|
|
47
48
|
successes = 0;
|
|
@@ -54,6 +55,7 @@ class CircuitBreaker {
|
|
|
54
55
|
this.resetTimeout = merged.resetTimeout;
|
|
55
56
|
this.halfOpenMax = merged.halfOpenMax;
|
|
56
57
|
this.failureWindow = merged.failureWindow ?? 60000;
|
|
58
|
+
this.onStateChange = merged.onStateChange;
|
|
57
59
|
}
|
|
58
60
|
/**
|
|
59
61
|
* Current circuit state
|
|
@@ -61,6 +63,17 @@ class CircuitBreaker {
|
|
|
61
63
|
get state() {
|
|
62
64
|
return this._state;
|
|
63
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Transition to a new state, notifying observers only on an actual change.
|
|
68
|
+
*/
|
|
69
|
+
transitionTo(next) {
|
|
70
|
+
if (this._state === next) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const previous = this._state;
|
|
74
|
+
this._state = next;
|
|
75
|
+
this.onStateChange?.(previous, next);
|
|
76
|
+
}
|
|
64
77
|
/**
|
|
65
78
|
* Check if circuit is open
|
|
66
79
|
*/
|
|
@@ -85,9 +98,9 @@ class CircuitBreaker {
|
|
|
85
98
|
if (this._state === CircuitState.OPEN) {
|
|
86
99
|
// Check if enough time has passed to try again
|
|
87
100
|
if (this.lastFailureTime && (Date.now() - this.lastFailureTime) >= this.resetTimeout) {
|
|
88
|
-
this._state = CircuitState.HALF_OPEN;
|
|
89
101
|
this.halfOpenRequests = 0;
|
|
90
102
|
this.successes = 0;
|
|
103
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
91
104
|
return true;
|
|
92
105
|
}
|
|
93
106
|
return false;
|
|
@@ -123,14 +136,14 @@ class CircuitBreaker {
|
|
|
123
136
|
this.failureTimestamps.push(now);
|
|
124
137
|
if (this._state === CircuitState.HALF_OPEN) {
|
|
125
138
|
// Any failure in half-open state opens the circuit again
|
|
126
|
-
this._state = CircuitState.OPEN;
|
|
127
139
|
this.halfOpenRequests = 0;
|
|
128
140
|
this.successes = 0;
|
|
141
|
+
this.transitionTo(CircuitState.OPEN);
|
|
129
142
|
}
|
|
130
143
|
else if (this._state === CircuitState.CLOSED) {
|
|
131
144
|
this.cleanupFailures();
|
|
132
145
|
if (this.failures >= this.failureThreshold) {
|
|
133
|
-
this.
|
|
146
|
+
this.transitionTo(CircuitState.OPEN);
|
|
134
147
|
}
|
|
135
148
|
}
|
|
136
149
|
}
|
|
@@ -146,12 +159,12 @@ class CircuitBreaker {
|
|
|
146
159
|
* Reset the circuit breaker to closed state
|
|
147
160
|
*/
|
|
148
161
|
reset() {
|
|
149
|
-
this._state = CircuitState.CLOSED;
|
|
150
162
|
this.failures = 0;
|
|
151
163
|
this.successes = 0;
|
|
152
164
|
this.lastFailureTime = null;
|
|
153
165
|
this.halfOpenRequests = 0;
|
|
154
166
|
this.failureTimestamps = [];
|
|
167
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
155
168
|
}
|
|
156
169
|
/**
|
|
157
170
|
* Get current circuit breaker status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/api/circuit-breaker.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/api/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.d.ts
CHANGED
|
@@ -10,6 +10,15 @@ import { RateLimiter } from './rate-limiter';
|
|
|
10
10
|
import { CircuitBreaker } from './circuit-breaker';
|
|
11
11
|
import { ResponseCache } from './cache';
|
|
12
12
|
import type { DeviceInfo, DeviceStatus, LoginResponse, ResidentialPermission, ResidentialAccount, Residence, PowerState } from '../types';
|
|
13
|
+
/**
|
|
14
|
+
* Minimal logger surface used by the client for resilience observability.
|
|
15
|
+
* Optional methods so a partial logger (or none) can be supplied.
|
|
16
|
+
*/
|
|
17
|
+
export interface ClientLogger {
|
|
18
|
+
debug?: (message: string) => void;
|
|
19
|
+
info?: (message: string) => void;
|
|
20
|
+
warn?: (message: string) => void;
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* API configuration
|
|
15
24
|
*/
|
|
@@ -22,6 +31,10 @@ export interface ApiClientConfig {
|
|
|
22
31
|
useCache: boolean;
|
|
23
32
|
/** Cache TTL in ms */
|
|
24
33
|
cacheTtl: number;
|
|
34
|
+
/** Maximum attempts for transient (network/5xx) failures before giving up */
|
|
35
|
+
maxRetryAttempts: number;
|
|
36
|
+
/** Optional logger for resilience events (circuit breaker, rate limiting) */
|
|
37
|
+
logger?: ClientLogger;
|
|
25
38
|
}
|
|
26
39
|
/**
|
|
27
40
|
* Default API configuration
|
|
@@ -37,6 +50,11 @@ export declare class LevitonApiClient {
|
|
|
37
50
|
private readonly cache;
|
|
38
51
|
private readonly deduplicator;
|
|
39
52
|
constructor(config?: Partial<ApiClientConfig>);
|
|
53
|
+
/**
|
|
54
|
+
* Surface circuit-breaker transitions so operators can see when the Leviton
|
|
55
|
+
* API is being treated as unavailable and when it recovers.
|
|
56
|
+
*/
|
|
57
|
+
private logCircuitTransition;
|
|
40
58
|
/**
|
|
41
59
|
* Make an API request with all protections
|
|
42
60
|
*/
|
|
@@ -45,6 +63,12 @@ export declare class LevitonApiClient {
|
|
|
45
63
|
* Execute the actual request
|
|
46
64
|
*/
|
|
47
65
|
private executeRequest;
|
|
66
|
+
/**
|
|
67
|
+
* Performs a single fetch + parse cycle, translating low-level failures into
|
|
68
|
+
* typed errors. Intentionally free of circuit-breaker, rate-limit, and cache
|
|
69
|
+
* side effects so it can be safely retried.
|
|
70
|
+
*/
|
|
71
|
+
private fetchAndParse;
|
|
48
72
|
/**
|
|
49
73
|
* Login and get authentication token
|
|
50
74
|
*/
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.js
CHANGED
|
@@ -18,6 +18,7 @@ const cache_1 = require("./cache");
|
|
|
18
18
|
const request_queue_1 = require("./request-queue");
|
|
19
19
|
const validators_1 = require("../utils/validators");
|
|
20
20
|
const sanitizers_1 = require("../utils/sanitizers");
|
|
21
|
+
const retry_1 = require("../utils/retry");
|
|
21
22
|
/**
|
|
22
23
|
* Default API configuration
|
|
23
24
|
*/
|
|
@@ -26,6 +27,7 @@ exports.DEFAULT_API_CONFIG = {
|
|
|
26
27
|
timeout: 10000,
|
|
27
28
|
useCache: true,
|
|
28
29
|
cacheTtl: 2000,
|
|
30
|
+
maxRetryAttempts: 3,
|
|
29
31
|
};
|
|
30
32
|
/**
|
|
31
33
|
* Default headers for API requests
|
|
@@ -41,6 +43,34 @@ function toQueryString(params) {
|
|
|
41
43
|
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
42
44
|
.join('&');
|
|
43
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Transient errors worth retrying: network/timeouts and 5xx responses.
|
|
48
|
+
* Auth (401/403), not-found (404), and rate-limit (429) errors are excluded so
|
|
49
|
+
* they surface immediately to the caller.
|
|
50
|
+
*/
|
|
51
|
+
function isTransientError(error) {
|
|
52
|
+
if (error instanceof errors_1.NetworkError) {
|
|
53
|
+
return true; // includes TimeoutError
|
|
54
|
+
}
|
|
55
|
+
if (error instanceof errors_1.ApiResponseError) {
|
|
56
|
+
return error.httpStatus >= 500 && error.httpStatus < 600;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Errors that should count against the circuit breaker: server-side and
|
|
62
|
+
* connectivity problems. Client errors (4xx) reflect the request, not service
|
|
63
|
+
* health, and must not trip the breaker.
|
|
64
|
+
*/
|
|
65
|
+
function isCircuitBreakerFailure(error) {
|
|
66
|
+
if (error instanceof errors_1.NetworkError || error instanceof errors_1.ApiParseError) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (error instanceof errors_1.ApiResponseError) {
|
|
70
|
+
return error.httpStatus >= 500 && error.httpStatus < 600;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
44
74
|
/**
|
|
45
75
|
* Leviton API client
|
|
46
76
|
*/
|
|
@@ -52,11 +82,29 @@ class LevitonApiClient {
|
|
|
52
82
|
deduplicator;
|
|
53
83
|
constructor(config = {}) {
|
|
54
84
|
this.config = { ...exports.DEFAULT_API_CONFIG, ...config };
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
85
|
+
// Each client owns its resilience state so independent platform instances
|
|
86
|
+
// (e.g. multiple Leviton accounts) don't share a circuit breaker, rate
|
|
87
|
+
// limiter, or cache and trip each other.
|
|
88
|
+
this.rateLimiter = new rate_limiter_1.RateLimiter();
|
|
89
|
+
this.circuitBreaker = new circuit_breaker_1.CircuitBreaker({
|
|
90
|
+
onStateChange: (from, to) => this.logCircuitTransition(from, to),
|
|
91
|
+
});
|
|
92
|
+
this.cache = new cache_1.ResponseCache({ ttlMs: this.config.cacheTtl });
|
|
58
93
|
this.deduplicator = new request_queue_1.RequestDeduplicator();
|
|
59
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Surface circuit-breaker transitions so operators can see when the Leviton
|
|
97
|
+
* API is being treated as unavailable and when it recovers.
|
|
98
|
+
*/
|
|
99
|
+
logCircuitTransition(from, to) {
|
|
100
|
+
const message = `Circuit breaker ${from} -> ${to}`;
|
|
101
|
+
if (to === circuit_breaker_1.CircuitState.OPEN) {
|
|
102
|
+
this.config.logger?.warn?.(message);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.config.logger?.info?.(message);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
60
108
|
/**
|
|
61
109
|
* Make an API request with all protections
|
|
62
110
|
*/
|
|
@@ -85,14 +133,15 @@ class LevitonApiClient {
|
|
|
85
133
|
async executeRequest(url, options, requestOptions) {
|
|
86
134
|
const { useCache = false, cacheKey = url, bypassCircuitBreaker = false, debugLog = () => { }, } = requestOptions;
|
|
87
135
|
const method = options.method || 'GET';
|
|
88
|
-
// Check circuit breaker
|
|
136
|
+
// Check circuit breaker (gated once per logical request, never retried)
|
|
89
137
|
if (!bypassCircuitBreaker && !this.circuitBreaker.canRequest()) {
|
|
90
138
|
const status = this.circuitBreaker.getStatus();
|
|
91
139
|
throw new errors_1.ApiResponseError(503, `Service unavailable (circuit breaker open). Retry in ${Math.ceil((status.remainingResetTime || 30000) / 1000)}s`);
|
|
92
140
|
}
|
|
93
|
-
// Rate limit write operations
|
|
141
|
+
// Rate limit write operations (counted once per logical request, not per retry)
|
|
94
142
|
if (method !== 'GET') {
|
|
95
143
|
if (!this.rateLimiter.tryAcquire()) {
|
|
144
|
+
this.config.logger?.warn?.(`Rate limit exceeded for ${method} ${url}`);
|
|
96
145
|
throw new errors_1.ApiResponseError(429, 'Rate limit exceeded');
|
|
97
146
|
}
|
|
98
147
|
}
|
|
@@ -100,7 +149,42 @@ class LevitonApiClient {
|
|
|
100
149
|
if (!bypassCircuitBreaker && this.circuitBreaker.state === circuit_breaker_1.CircuitState.HALF_OPEN) {
|
|
101
150
|
this.circuitBreaker.trackHalfOpenRequest();
|
|
102
151
|
}
|
|
103
|
-
|
|
152
|
+
try {
|
|
153
|
+
// Retry only transient failures (network, timeout, 5xx). Auth (401/403)
|
|
154
|
+
// and rate-limit (429) errors are surfaced immediately so the platform's
|
|
155
|
+
// token-refresh path and the caller can react without blocking here.
|
|
156
|
+
const data = await (0, retry_1.withRetry)(() => this.fetchAndParse(url, options, debugLog), {
|
|
157
|
+
maxAttempts: Math.max(1, this.config.maxRetryAttempts),
|
|
158
|
+
baseDelay: 500,
|
|
159
|
+
maxDelay: 5000,
|
|
160
|
+
backoffMultiplier: 2,
|
|
161
|
+
shouldRetry: isTransientError,
|
|
162
|
+
onRetry: (attempt, error) => debugLog(`[API] Retry ${attempt} after transient error: ${error.message}`),
|
|
163
|
+
});
|
|
164
|
+
if (!bypassCircuitBreaker) {
|
|
165
|
+
this.circuitBreaker.recordSuccess();
|
|
166
|
+
}
|
|
167
|
+
// Cache response
|
|
168
|
+
if (useCache && method === 'GET') {
|
|
169
|
+
this.cache.set(cacheKey, data);
|
|
170
|
+
}
|
|
171
|
+
return data;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
// A single failure is recorded per logical request after retries are
|
|
175
|
+
// exhausted, so retries don't artificially accelerate the breaker.
|
|
176
|
+
if (!bypassCircuitBreaker && isCircuitBreakerFailure(error)) {
|
|
177
|
+
this.circuitBreaker.recordFailure();
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Performs a single fetch + parse cycle, translating low-level failures into
|
|
184
|
+
* typed errors. Intentionally free of circuit-breaker, rate-limit, and cache
|
|
185
|
+
* side effects so it can be safely retried.
|
|
186
|
+
*/
|
|
187
|
+
async fetchAndParse(url, options, debugLog) {
|
|
104
188
|
const controller = new AbortController();
|
|
105
189
|
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
106
190
|
try {
|
|
@@ -112,68 +196,37 @@ class LevitonApiClient {
|
|
|
112
196
|
...options.headers,
|
|
113
197
|
},
|
|
114
198
|
});
|
|
115
|
-
clearTimeout(timeoutId);
|
|
116
|
-
// Get response text
|
|
117
199
|
const responseText = await response.text();
|
|
118
200
|
debugLog(`[API] Response: ${response.status} ${(0, sanitizers_1.createResponsePreview)(responseText, 100)}`);
|
|
119
|
-
// Handle non-OK responses
|
|
120
201
|
if (!response.ok) {
|
|
121
|
-
if (!bypassCircuitBreaker && response.status >= 500) {
|
|
122
|
-
this.circuitBreaker.recordFailure();
|
|
123
|
-
}
|
|
124
202
|
throw (0, errors_1.createApiError)(response.status, response.statusText, responseText);
|
|
125
203
|
}
|
|
126
|
-
// Check content type
|
|
127
204
|
const contentType = response.headers.get('content-type') || '';
|
|
128
205
|
if (!contentType.includes('application/json') && !contentType.includes('text/json')) {
|
|
129
|
-
if (!bypassCircuitBreaker) {
|
|
130
|
-
this.circuitBreaker.recordFailure();
|
|
131
|
-
}
|
|
132
206
|
throw new errors_1.ApiParseError(`Expected JSON response, got ${contentType}`, responseText);
|
|
133
207
|
}
|
|
134
|
-
// Parse JSON
|
|
135
208
|
if (!responseText || responseText.trim().length === 0) {
|
|
136
209
|
throw new errors_1.ApiParseError('Empty response body');
|
|
137
210
|
}
|
|
138
|
-
let data;
|
|
139
211
|
try {
|
|
140
|
-
|
|
212
|
+
return JSON.parse(responseText);
|
|
141
213
|
}
|
|
142
214
|
catch (e) {
|
|
143
|
-
if (!bypassCircuitBreaker) {
|
|
144
|
-
this.circuitBreaker.recordFailure();
|
|
145
|
-
}
|
|
146
215
|
throw new errors_1.ApiParseError(`Failed to parse JSON: ${e.message}`, responseText);
|
|
147
216
|
}
|
|
148
|
-
// Record success
|
|
149
|
-
if (!bypassCircuitBreaker) {
|
|
150
|
-
this.circuitBreaker.recordSuccess();
|
|
151
|
-
}
|
|
152
|
-
// Cache response
|
|
153
|
-
if (useCache && method === 'GET') {
|
|
154
|
-
this.cache.set(cacheKey, data);
|
|
155
|
-
}
|
|
156
|
-
return data;
|
|
157
217
|
}
|
|
158
218
|
catch (error) {
|
|
159
|
-
clearTimeout(timeoutId);
|
|
160
|
-
// Handle abort/timeout
|
|
161
219
|
if (error.name === 'AbortError') {
|
|
162
|
-
if (!bypassCircuitBreaker) {
|
|
163
|
-
this.circuitBreaker.recordFailure();
|
|
164
|
-
}
|
|
165
220
|
throw new errors_1.TimeoutError(this.config.timeout);
|
|
166
221
|
}
|
|
167
|
-
|
|
168
|
-
if (error instanceof TypeError ||
|
|
169
|
-
error.message?.includes('fetch')) {
|
|
170
|
-
if (!bypassCircuitBreaker) {
|
|
171
|
-
this.circuitBreaker.recordFailure();
|
|
172
|
-
}
|
|
222
|
+
if (error instanceof TypeError || error.message?.includes('fetch')) {
|
|
173
223
|
throw new errors_1.NetworkError(error.message, { cause: error });
|
|
174
224
|
}
|
|
175
225
|
throw error;
|
|
176
226
|
}
|
|
227
|
+
finally {
|
|
228
|
+
clearTimeout(timeoutId);
|
|
229
|
+
}
|
|
177
230
|
}
|
|
178
231
|
/**
|
|
179
232
|
* Login and get authentication token
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/websocket.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export interface WebSocketConfig {
|
|
|
28
28
|
maxReconnectDelay: number;
|
|
29
29
|
/** Ping interval in ms to keep connection alive */
|
|
30
30
|
pingInterval: number;
|
|
31
|
+
/**
|
|
32
|
+
* Optional callback invoked when the live connection state changes:
|
|
33
|
+
* `true` once authenticated and ready, `false` on a non-user close.
|
|
34
|
+
* Used to surface real-time connectivity (e.g. a HomeKit status sensor).
|
|
35
|
+
*/
|
|
36
|
+
onConnectionChange?: (connected: boolean) => void;
|
|
31
37
|
}
|
|
32
38
|
/**
|
|
33
39
|
* Default WebSocket configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/api/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,iBAAiB,EAAE,MAAM,CAAA;IACzB,oCAAoC;IACpC,oBAAoB,EAAE,MAAM,CAAA;IAC5B,uCAAuC;IACvC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAA;IACzB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/api/websocket.ts"],"names":[],"mappings":"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"}
|
package/dist/api/websocket.js
CHANGED
|
@@ -200,9 +200,13 @@ class LevitonWebSocket {
|
|
|
200
200
|
this.logger.debug('WebSocket closed by user');
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
// Any non-user close means the live push channel is down.
|
|
204
|
+
this.config.onConnectionChange?.(false);
|
|
205
|
+
// Auth failure - don't reconnect. 401 is not a valid WebSocket close code
|
|
206
|
+
// (codes are 1000-4999), so detect auth failures via the policy-violation
|
|
207
|
+
// code (1008) or an auth-related close reason instead.
|
|
208
|
+
if (code === 1008 || /unauth|forbidden|401|403/i.test(reasonStr)) {
|
|
209
|
+
this.logger.warn(`WebSocket auth failed: ${code} ${reasonStr}`);
|
|
206
210
|
return;
|
|
207
211
|
}
|
|
208
212
|
// Remote normal closes still require reconnecting to preserve push updates.
|
|
@@ -251,6 +255,7 @@ class LevitonWebSocket {
|
|
|
251
255
|
this.logger.info('WebSocket authenticated and ready');
|
|
252
256
|
this.subscribeToDevices();
|
|
253
257
|
this.startPing();
|
|
258
|
+
this.config.onConnectionChange?.(true);
|
|
254
259
|
return;
|
|
255
260
|
}
|
|
256
261
|
// Handle notifications
|
|
@@ -285,20 +290,23 @@ class LevitonWebSocket {
|
|
|
285
290
|
return;
|
|
286
291
|
}
|
|
287
292
|
const notificationData = notification.data;
|
|
288
|
-
// Build payload
|
|
293
|
+
// Build payload. Validate each field at this trust boundary before it flows
|
|
294
|
+
// into HomeKit — a malformed frame must not push NaN/garbage into a
|
|
295
|
+
// characteristic. Unrecognized or wrong-typed values are simply dropped.
|
|
289
296
|
const payload = {
|
|
290
297
|
id: String(notification.modelId),
|
|
291
298
|
};
|
|
292
|
-
if (notificationData.power
|
|
299
|
+
if (notificationData.power === 'ON' || notificationData.power === 'OFF') {
|
|
293
300
|
payload.power = notificationData.power;
|
|
294
301
|
}
|
|
295
|
-
if (notificationData.brightness
|
|
302
|
+
if (typeof notificationData.brightness === 'number' &&
|
|
303
|
+
Number.isFinite(notificationData.brightness)) {
|
|
296
304
|
payload.brightness = notificationData.brightness;
|
|
297
305
|
}
|
|
298
|
-
if (notificationData.occupancy
|
|
306
|
+
if (typeof notificationData.occupancy === 'boolean') {
|
|
299
307
|
payload.occupancy = notificationData.occupancy;
|
|
300
308
|
}
|
|
301
|
-
if (notificationData.motion
|
|
309
|
+
if (typeof notificationData.motion === 'boolean') {
|
|
302
310
|
payload.motion = notificationData.motion;
|
|
303
311
|
}
|
|
304
312
|
// Only callback if we have meaningful data
|