homebridge-myleviton 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +112 -0
- package/config.schema.json +136 -0
- package/dist/api/cache.d.ts +108 -0
- package/dist/api/cache.d.ts.map +1 -0
- package/dist/api/cache.js +206 -0
- package/dist/api/cache.js.map +1 -0
- package/dist/api/circuit-breaker.d.ts +118 -0
- package/dist/api/circuit-breaker.d.ts.map +1 -0
- package/dist/api/circuit-breaker.js +223 -0
- package/dist/api/circuit-breaker.js.map +1 -0
- package/dist/api/client.d.ts +116 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +358 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +23 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +47 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/persistence.d.ts +107 -0
- package/dist/api/persistence.d.ts.map +1 -0
- package/dist/api/persistence.js +285 -0
- package/dist/api/persistence.js.map +1 -0
- package/dist/api/rate-limiter.d.ts +102 -0
- package/dist/api/rate-limiter.d.ts.map +1 -0
- package/dist/api/rate-limiter.js +173 -0
- package/dist/api/rate-limiter.js.map +1 -0
- package/dist/api/request-queue.d.ts +104 -0
- package/dist/api/request-queue.d.ts.map +1 -0
- package/dist/api/request-queue.js +223 -0
- package/dist/api/request-queue.js.map +1 -0
- package/dist/api/websocket.d.ts +116 -0
- package/dist/api/websocket.d.ts.map +1 -0
- package/dist/api/websocket.js +319 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/errors/index.d.ts +182 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +273 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.d.ts +139 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +664 -0
- package/dist/platform.js.map +1 -0
- package/dist/types/index.d.ts +225 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +34 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +52 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +103 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +184 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/retry.d.ts +56 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +141 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/sanitizers.d.ts +37 -0
- package/dist/utils/sanitizers.d.ts.map +1 -0
- package/dist/utils/sanitizers.js +128 -0
- package/dist/utils/sanitizers.js.map +1 -0
- package/dist/utils/validators.d.ts +51 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +243 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 tbaur
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0
|
|
6
|
+
* See LICENSE file for full license text
|
|
7
|
+
*
|
|
8
|
+
* @fileoverview Leviton API HTTP client
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.LevitonApiClient = exports.DEFAULT_API_CONFIG = void 0;
|
|
12
|
+
exports.getApiClient = getApiClient;
|
|
13
|
+
exports.resetGlobalClient = resetGlobalClient;
|
|
14
|
+
const errors_1 = require("../errors");
|
|
15
|
+
const rate_limiter_1 = require("./rate-limiter");
|
|
16
|
+
const circuit_breaker_1 = require("./circuit-breaker");
|
|
17
|
+
const cache_1 = require("./cache");
|
|
18
|
+
const request_queue_1 = require("./request-queue");
|
|
19
|
+
const validators_1 = require("../utils/validators");
|
|
20
|
+
const sanitizers_1 = require("../utils/sanitizers");
|
|
21
|
+
/**
|
|
22
|
+
* Default API configuration
|
|
23
|
+
*/
|
|
24
|
+
exports.DEFAULT_API_CONFIG = {
|
|
25
|
+
baseUrl: 'https://my.leviton.com/api',
|
|
26
|
+
timeout: 10000,
|
|
27
|
+
useCache: true,
|
|
28
|
+
cacheTtl: 2000,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Default headers for API requests
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_HEADERS = {
|
|
34
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Convert object to URL query string
|
|
38
|
+
*/
|
|
39
|
+
function toQueryString(params) {
|
|
40
|
+
return Object.entries(params)
|
|
41
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
42
|
+
.join('&');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Leviton API client
|
|
46
|
+
*/
|
|
47
|
+
class LevitonApiClient {
|
|
48
|
+
config;
|
|
49
|
+
rateLimiter;
|
|
50
|
+
circuitBreaker;
|
|
51
|
+
cache;
|
|
52
|
+
deduplicator;
|
|
53
|
+
constructor(config = {}) {
|
|
54
|
+
this.config = { ...exports.DEFAULT_API_CONFIG, ...config };
|
|
55
|
+
this.rateLimiter = (0, rate_limiter_1.getRateLimiter)();
|
|
56
|
+
this.circuitBreaker = (0, circuit_breaker_1.getCircuitBreaker)();
|
|
57
|
+
this.cache = (0, cache_1.getResponseCache)({ ttlMs: this.config.cacheTtl });
|
|
58
|
+
this.deduplicator = new request_queue_1.RequestDeduplicator();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Make an API request with all protections
|
|
62
|
+
*/
|
|
63
|
+
async request(url, options = {}, requestOptions = {}) {
|
|
64
|
+
const { useCache = false, cacheKey = url, bypassCircuitBreaker: _bypassCircuitBreaker = false, debugLog = () => { }, priority: _priority = 'normal', } = requestOptions;
|
|
65
|
+
const method = options.method || 'GET';
|
|
66
|
+
const dedupeKey = `${method}:${url}`;
|
|
67
|
+
debugLog(`[API] ${method} ${url}`);
|
|
68
|
+
// Check cache first
|
|
69
|
+
if (useCache && method === 'GET') {
|
|
70
|
+
const cached = this.cache.get(cacheKey);
|
|
71
|
+
if (cached !== null) {
|
|
72
|
+
debugLog(`[API] Cache hit: ${cacheKey}`);
|
|
73
|
+
return cached;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Deduplicate concurrent requests for same resource
|
|
77
|
+
if (useCache && method === 'GET') {
|
|
78
|
+
return this.deduplicator.execute(dedupeKey, () => this.executeRequest(url, options, requestOptions));
|
|
79
|
+
}
|
|
80
|
+
return this.executeRequest(url, options, requestOptions);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Execute the actual request
|
|
84
|
+
*/
|
|
85
|
+
async executeRequest(url, options, requestOptions) {
|
|
86
|
+
const { useCache = false, cacheKey = url, bypassCircuitBreaker = false, debugLog = () => { }, } = requestOptions;
|
|
87
|
+
const method = options.method || 'GET';
|
|
88
|
+
// Check circuit breaker
|
|
89
|
+
if (!bypassCircuitBreaker && !this.circuitBreaker.canRequest()) {
|
|
90
|
+
const status = this.circuitBreaker.getStatus();
|
|
91
|
+
throw new errors_1.ApiResponseError(503, `Service unavailable (circuit breaker open). Retry in ${Math.ceil((status.remainingResetTime || 30000) / 1000)}s`);
|
|
92
|
+
}
|
|
93
|
+
// Rate limit write operations
|
|
94
|
+
if (method !== 'GET') {
|
|
95
|
+
if (!this.rateLimiter.tryAcquire()) {
|
|
96
|
+
throw new errors_1.ApiResponseError(429, 'Rate limit exceeded');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Track half-open request
|
|
100
|
+
if (!bypassCircuitBreaker && this.circuitBreaker.state === circuit_breaker_1.CircuitState.HALF_OPEN) {
|
|
101
|
+
this.circuitBreaker.trackHalfOpenRequest();
|
|
102
|
+
}
|
|
103
|
+
// Create abort controller for timeout
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(url, {
|
|
108
|
+
...options,
|
|
109
|
+
signal: controller.signal,
|
|
110
|
+
headers: {
|
|
111
|
+
...DEFAULT_HEADERS,
|
|
112
|
+
...options.headers,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
clearTimeout(timeoutId);
|
|
116
|
+
// Get response text
|
|
117
|
+
const responseText = await response.text();
|
|
118
|
+
debugLog(`[API] Response: ${response.status} ${(0, sanitizers_1.createResponsePreview)(responseText, 100)}`);
|
|
119
|
+
// Handle non-OK responses
|
|
120
|
+
if (!response.ok) {
|
|
121
|
+
if (!bypassCircuitBreaker && response.status >= 500) {
|
|
122
|
+
this.circuitBreaker.recordFailure();
|
|
123
|
+
}
|
|
124
|
+
throw (0, errors_1.createApiError)(response.status, response.statusText, responseText);
|
|
125
|
+
}
|
|
126
|
+
// Check content type
|
|
127
|
+
const contentType = response.headers.get('content-type') || '';
|
|
128
|
+
if (!contentType.includes('application/json') && !contentType.includes('text/json')) {
|
|
129
|
+
if (!bypassCircuitBreaker) {
|
|
130
|
+
this.circuitBreaker.recordFailure();
|
|
131
|
+
}
|
|
132
|
+
throw new errors_1.ApiParseError(`Expected JSON response, got ${contentType}`, responseText);
|
|
133
|
+
}
|
|
134
|
+
// Parse JSON
|
|
135
|
+
if (!responseText || responseText.trim().length === 0) {
|
|
136
|
+
throw new errors_1.ApiParseError('Empty response body');
|
|
137
|
+
}
|
|
138
|
+
let data;
|
|
139
|
+
try {
|
|
140
|
+
data = JSON.parse(responseText);
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
if (!bypassCircuitBreaker) {
|
|
144
|
+
this.circuitBreaker.recordFailure();
|
|
145
|
+
}
|
|
146
|
+
throw new errors_1.ApiParseError(`Failed to parse JSON: ${e.message}`, responseText);
|
|
147
|
+
}
|
|
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
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
clearTimeout(timeoutId);
|
|
160
|
+
// Handle abort/timeout
|
|
161
|
+
if (error.name === 'AbortError') {
|
|
162
|
+
if (!bypassCircuitBreaker) {
|
|
163
|
+
this.circuitBreaker.recordFailure();
|
|
164
|
+
}
|
|
165
|
+
throw new errors_1.TimeoutError(this.config.timeout);
|
|
166
|
+
}
|
|
167
|
+
// Network errors
|
|
168
|
+
if (error instanceof TypeError ||
|
|
169
|
+
error.message?.includes('fetch')) {
|
|
170
|
+
if (!bypassCircuitBreaker) {
|
|
171
|
+
this.circuitBreaker.recordFailure();
|
|
172
|
+
}
|
|
173
|
+
throw new errors_1.NetworkError(error.message, { cause: error });
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Login and get authentication token
|
|
180
|
+
*/
|
|
181
|
+
async login(email, password, debugLog) {
|
|
182
|
+
const validEmail = (0, validators_1.validateEmail)(email);
|
|
183
|
+
const validPassword = (0, validators_1.validatePassword)(password);
|
|
184
|
+
const query = toQueryString({ include: 'user' });
|
|
185
|
+
const url = `${this.config.baseUrl}/Person/login?${query}`;
|
|
186
|
+
debugLog?.(`[login] Authenticating ${validEmail}`);
|
|
187
|
+
const response = await this.request(url, {
|
|
188
|
+
method: 'POST',
|
|
189
|
+
body: JSON.stringify({ email: validEmail, password: validPassword }),
|
|
190
|
+
}, {
|
|
191
|
+
bypassCircuitBreaker: true, // Login bypasses circuit breaker
|
|
192
|
+
debugLog,
|
|
193
|
+
});
|
|
194
|
+
if (!response.id || !response.userId) {
|
|
195
|
+
throw new errors_1.AuthenticationError('Invalid login response: missing token or userId');
|
|
196
|
+
}
|
|
197
|
+
debugLog?.(`[login] Success, token: ${(0, sanitizers_1.maskToken)(response.id)}`);
|
|
198
|
+
return response;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get residential permissions for a person
|
|
202
|
+
*/
|
|
203
|
+
async getResidentialPermissions(personId, token, debugLog) {
|
|
204
|
+
const validPersonId = (0, validators_1.validateDeviceId)(personId);
|
|
205
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
206
|
+
const url = `${this.config.baseUrl}/Person/${validPersonId}/residentialPermissions`;
|
|
207
|
+
return this.request(url, {
|
|
208
|
+
method: 'GET',
|
|
209
|
+
headers: { Authorization: validToken },
|
|
210
|
+
}, { debugLog });
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get residential account details
|
|
214
|
+
*/
|
|
215
|
+
async getResidentialAccount(accountId, token, debugLog) {
|
|
216
|
+
const validAccountId = (0, validators_1.validateDeviceId)(accountId);
|
|
217
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
218
|
+
const url = `${this.config.baseUrl}/ResidentialAccounts/${validAccountId}`;
|
|
219
|
+
return this.request(url, {
|
|
220
|
+
method: 'GET',
|
|
221
|
+
headers: { Authorization: validToken },
|
|
222
|
+
}, { debugLog });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get residences using v2 API
|
|
226
|
+
*/
|
|
227
|
+
async getResidences(residenceObjectId, token, debugLog) {
|
|
228
|
+
const validId = (0, validators_1.validateDeviceId)(residenceObjectId);
|
|
229
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
230
|
+
const url = `${this.config.baseUrl}/ResidentialAccounts/${validId}/residences`;
|
|
231
|
+
return this.request(url, {
|
|
232
|
+
method: 'GET',
|
|
233
|
+
headers: { Authorization: validToken },
|
|
234
|
+
}, { debugLog });
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get IoT switches for a residence
|
|
238
|
+
*/
|
|
239
|
+
async getDevices(residenceId, token, debugLog) {
|
|
240
|
+
const validResidenceId = (0, validators_1.validateDeviceId)(residenceId);
|
|
241
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
242
|
+
const url = `${this.config.baseUrl}/Residences/${validResidenceId}/iotSwitches`;
|
|
243
|
+
return this.request(url, {
|
|
244
|
+
method: 'GET',
|
|
245
|
+
headers: { Authorization: validToken },
|
|
246
|
+
}, { debugLog });
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get status of a specific device
|
|
250
|
+
*/
|
|
251
|
+
async getDeviceStatus(deviceId, token, debugLog) {
|
|
252
|
+
const validDeviceId = (0, validators_1.validateDeviceId)(deviceId);
|
|
253
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
254
|
+
const url = `${this.config.baseUrl}/IotSwitches/${validDeviceId}`;
|
|
255
|
+
const cacheKey = `device:${validDeviceId}`;
|
|
256
|
+
return this.request(url, {
|
|
257
|
+
method: 'GET',
|
|
258
|
+
headers: { Authorization: validToken },
|
|
259
|
+
}, {
|
|
260
|
+
useCache: true,
|
|
261
|
+
cacheKey,
|
|
262
|
+
debugLog,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Update device state
|
|
267
|
+
*/
|
|
268
|
+
async setDeviceState(deviceId, token, state, debugLog) {
|
|
269
|
+
const validDeviceId = (0, validators_1.validateDeviceId)(deviceId);
|
|
270
|
+
const validToken = (0, validators_1.validateToken)(token);
|
|
271
|
+
// Validate state
|
|
272
|
+
const body = {};
|
|
273
|
+
if (state.power !== undefined) {
|
|
274
|
+
body.power = (0, validators_1.validatePowerState)(state.power);
|
|
275
|
+
}
|
|
276
|
+
if (state.brightness !== undefined) {
|
|
277
|
+
body.brightness = (0, validators_1.validateBrightness)(state.brightness);
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(body).length === 0) {
|
|
280
|
+
throw new errors_1.ValidationError('state', 'At least one of power or brightness must be provided');
|
|
281
|
+
}
|
|
282
|
+
const url = `${this.config.baseUrl}/IotSwitches/${validDeviceId}`;
|
|
283
|
+
const cacheKey = `device:${validDeviceId}`;
|
|
284
|
+
const result = await this.request(url, {
|
|
285
|
+
method: 'PUT',
|
|
286
|
+
body: JSON.stringify(body),
|
|
287
|
+
headers: { Authorization: validToken },
|
|
288
|
+
}, { debugLog });
|
|
289
|
+
// Invalidate cache after successful update
|
|
290
|
+
this.cache.delete(cacheKey);
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Set device power
|
|
295
|
+
*/
|
|
296
|
+
async setPower(deviceId, token, power, debugLog) {
|
|
297
|
+
return this.setDeviceState(deviceId, token, { power: power ? 'ON' : 'OFF' }, debugLog);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Set device brightness
|
|
301
|
+
*/
|
|
302
|
+
async setBrightness(deviceId, token, brightness, debugLog) {
|
|
303
|
+
return this.setDeviceState(deviceId, token, { brightness }, debugLog);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Clear response cache
|
|
307
|
+
*/
|
|
308
|
+
clearCache() {
|
|
309
|
+
this.cache.clear();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Invalidate cache for a specific device
|
|
313
|
+
*/
|
|
314
|
+
invalidateDeviceCache(deviceId) {
|
|
315
|
+
this.cache.delete(`device:${deviceId}`);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get client status
|
|
319
|
+
*/
|
|
320
|
+
getStatus() {
|
|
321
|
+
return {
|
|
322
|
+
circuitBreaker: this.circuitBreaker.getStatus(),
|
|
323
|
+
rateLimiter: this.rateLimiter.getStatus(),
|
|
324
|
+
cache: this.cache.getStats(),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Reset all client state (for testing)
|
|
329
|
+
*/
|
|
330
|
+
reset() {
|
|
331
|
+
this.cache.clear();
|
|
332
|
+
this.circuitBreaker.reset();
|
|
333
|
+
this.rateLimiter.reset();
|
|
334
|
+
this.deduplicator.clear();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
exports.LevitonApiClient = LevitonApiClient;
|
|
338
|
+
/**
|
|
339
|
+
* Global API client instance
|
|
340
|
+
*/
|
|
341
|
+
let globalClient = null;
|
|
342
|
+
/**
|
|
343
|
+
* Get or create the global API client
|
|
344
|
+
*/
|
|
345
|
+
function getApiClient(config) {
|
|
346
|
+
if (!globalClient) {
|
|
347
|
+
globalClient = new LevitonApiClient(config);
|
|
348
|
+
}
|
|
349
|
+
return globalClient;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Reset the global client (for testing)
|
|
353
|
+
*/
|
|
354
|
+
function resetGlobalClient() {
|
|
355
|
+
globalClient?.reset();
|
|
356
|
+
globalClient = null;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 tbaur
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
* See LICENSE file for full license text
|
|
6
|
+
*
|
|
7
|
+
* @fileoverview API module exports
|
|
8
|
+
*/
|
|
9
|
+
export { LevitonApiClient, getApiClient, resetGlobalClient } from './client';
|
|
10
|
+
export type { ApiClientConfig } from './client';
|
|
11
|
+
export { RateLimiter, getRateLimiter, resetGlobalRateLimiter } from './rate-limiter';
|
|
12
|
+
export type { RateLimiterConfig } from './rate-limiter';
|
|
13
|
+
export { CircuitBreaker, getCircuitBreaker, resetGlobalCircuitBreaker, CircuitState } from './circuit-breaker';
|
|
14
|
+
export type { CircuitBreakerConfig, CircuitBreakerStatus } from './circuit-breaker';
|
|
15
|
+
export { ResponseCache, getResponseCache, resetGlobalCache } from './cache';
|
|
16
|
+
export type { CacheConfig } from './cache';
|
|
17
|
+
export { RequestQueue, RequestDeduplicator } from './request-queue';
|
|
18
|
+
export type { RequestQueueConfig } from './request-queue';
|
|
19
|
+
export { DevicePersistence, getDevicePersistence, resetGlobalPersistence, PERSISTENCE_FILE_NAME } from './persistence';
|
|
20
|
+
export type { PersistenceConfig } from './persistence';
|
|
21
|
+
export { LevitonWebSocket, createWebSocket } from './websocket';
|
|
22
|
+
export type { WebSocketConfig } from './websocket';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5E,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC9G,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGnF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC3E,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG1C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGzD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACtH,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 tbaur
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0
|
|
6
|
+
* See LICENSE file for full license text
|
|
7
|
+
*
|
|
8
|
+
* @fileoverview API module exports
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.createWebSocket = exports.LevitonWebSocket = exports.PERSISTENCE_FILE_NAME = exports.resetGlobalPersistence = exports.getDevicePersistence = exports.DevicePersistence = exports.RequestDeduplicator = exports.RequestQueue = exports.resetGlobalCache = exports.getResponseCache = exports.ResponseCache = exports.CircuitState = exports.resetGlobalCircuitBreaker = exports.getCircuitBreaker = exports.CircuitBreaker = exports.resetGlobalRateLimiter = exports.getRateLimiter = exports.RateLimiter = exports.resetGlobalClient = exports.getApiClient = exports.LevitonApiClient = void 0;
|
|
12
|
+
// Client
|
|
13
|
+
var client_1 = require("./client");
|
|
14
|
+
Object.defineProperty(exports, "LevitonApiClient", { enumerable: true, get: function () { return client_1.LevitonApiClient; } });
|
|
15
|
+
Object.defineProperty(exports, "getApiClient", { enumerable: true, get: function () { return client_1.getApiClient; } });
|
|
16
|
+
Object.defineProperty(exports, "resetGlobalClient", { enumerable: true, get: function () { return client_1.resetGlobalClient; } });
|
|
17
|
+
// Rate Limiter
|
|
18
|
+
var rate_limiter_1 = require("./rate-limiter");
|
|
19
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return rate_limiter_1.RateLimiter; } });
|
|
20
|
+
Object.defineProperty(exports, "getRateLimiter", { enumerable: true, get: function () { return rate_limiter_1.getRateLimiter; } });
|
|
21
|
+
Object.defineProperty(exports, "resetGlobalRateLimiter", { enumerable: true, get: function () { return rate_limiter_1.resetGlobalRateLimiter; } });
|
|
22
|
+
// Circuit Breaker
|
|
23
|
+
var circuit_breaker_1 = require("./circuit-breaker");
|
|
24
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_1.CircuitBreaker; } });
|
|
25
|
+
Object.defineProperty(exports, "getCircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_1.getCircuitBreaker; } });
|
|
26
|
+
Object.defineProperty(exports, "resetGlobalCircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_1.resetGlobalCircuitBreaker; } });
|
|
27
|
+
Object.defineProperty(exports, "CircuitState", { enumerable: true, get: function () { return circuit_breaker_1.CircuitState; } });
|
|
28
|
+
// Cache
|
|
29
|
+
var cache_1 = require("./cache");
|
|
30
|
+
Object.defineProperty(exports, "ResponseCache", { enumerable: true, get: function () { return cache_1.ResponseCache; } });
|
|
31
|
+
Object.defineProperty(exports, "getResponseCache", { enumerable: true, get: function () { return cache_1.getResponseCache; } });
|
|
32
|
+
Object.defineProperty(exports, "resetGlobalCache", { enumerable: true, get: function () { return cache_1.resetGlobalCache; } });
|
|
33
|
+
// Request Queue
|
|
34
|
+
var request_queue_1 = require("./request-queue");
|
|
35
|
+
Object.defineProperty(exports, "RequestQueue", { enumerable: true, get: function () { return request_queue_1.RequestQueue; } });
|
|
36
|
+
Object.defineProperty(exports, "RequestDeduplicator", { enumerable: true, get: function () { return request_queue_1.RequestDeduplicator; } });
|
|
37
|
+
// Persistence
|
|
38
|
+
var persistence_1 = require("./persistence");
|
|
39
|
+
Object.defineProperty(exports, "DevicePersistence", { enumerable: true, get: function () { return persistence_1.DevicePersistence; } });
|
|
40
|
+
Object.defineProperty(exports, "getDevicePersistence", { enumerable: true, get: function () { return persistence_1.getDevicePersistence; } });
|
|
41
|
+
Object.defineProperty(exports, "resetGlobalPersistence", { enumerable: true, get: function () { return persistence_1.resetGlobalPersistence; } });
|
|
42
|
+
Object.defineProperty(exports, "PERSISTENCE_FILE_NAME", { enumerable: true, get: function () { return persistence_1.PERSISTENCE_FILE_NAME; } });
|
|
43
|
+
// WebSocket
|
|
44
|
+
var websocket_1 = require("./websocket");
|
|
45
|
+
Object.defineProperty(exports, "LevitonWebSocket", { enumerable: true, get: function () { return websocket_1.LevitonWebSocket; } });
|
|
46
|
+
Object.defineProperty(exports, "createWebSocket", { enumerable: true, get: function () { return websocket_1.createWebSocket; } });
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,SAAS;AACT,mCAA4E;AAAnE,0GAAA,gBAAgB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAG1D,eAAe;AACf,+CAAoF;AAA3E,2GAAA,WAAW,OAAA;AAAE,8GAAA,cAAc,OAAA;AAAE,sHAAA,sBAAsB,OAAA;AAG5D,kBAAkB;AAClB,qDAA8G;AAArG,iHAAA,cAAc,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAAE,4HAAA,yBAAyB,OAAA;AAAE,+GAAA,YAAY,OAAA;AAGnF,QAAQ;AACR,iCAA2E;AAAlE,sGAAA,aAAa,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAG1D,gBAAgB;AAChB,iDAAmE;AAA1D,6GAAA,YAAY,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AAG1C,cAAc;AACd,6CAAsH;AAA7G,gHAAA,iBAAiB,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAG/F,YAAY;AACZ,yCAA+D;AAAtD,6GAAA,gBAAgB,OAAA;AAAE,4GAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 tbaur
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
* See LICENSE file for full license text
|
|
6
|
+
*
|
|
7
|
+
* @fileoverview Device state persistence for faster startup and offline resilience
|
|
8
|
+
*/
|
|
9
|
+
import type { PersistedDeviceState, DeviceStatus } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Persistence configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface PersistenceConfig {
|
|
14
|
+
/** Storage file path */
|
|
15
|
+
storagePath: string;
|
|
16
|
+
/** Maximum age of cached data in ms */
|
|
17
|
+
maxAge: number;
|
|
18
|
+
/** Maximum number of devices to persist */
|
|
19
|
+
maxDevices: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Default persistence configuration
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT_PERSISTENCE_CONFIG: Partial<PersistenceConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Default persistence file name
|
|
27
|
+
*/
|
|
28
|
+
export declare const PERSISTENCE_FILE_NAME = ".homebridge-myleviton-state.json";
|
|
29
|
+
/**
|
|
30
|
+
* Device state persistence manager
|
|
31
|
+
* Stores device states for faster startup and offline resilience
|
|
32
|
+
*/
|
|
33
|
+
export declare class DevicePersistence {
|
|
34
|
+
private readonly storagePath;
|
|
35
|
+
private readonly maxAge;
|
|
36
|
+
private readonly maxDevices;
|
|
37
|
+
private deviceStates;
|
|
38
|
+
private loaded;
|
|
39
|
+
private dirty;
|
|
40
|
+
constructor(storagePath?: string, config?: Partial<PersistenceConfig>);
|
|
41
|
+
/**
|
|
42
|
+
* Load persisted device states from disk
|
|
43
|
+
*/
|
|
44
|
+
load(): Map<string, PersistedDeviceState>;
|
|
45
|
+
/**
|
|
46
|
+
* Save device states to disk
|
|
47
|
+
*/
|
|
48
|
+
save(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Update state for a device
|
|
51
|
+
*/
|
|
52
|
+
updateDevice(deviceId: string, state: Partial<PersistedDeviceState>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Update device from API status
|
|
55
|
+
*/
|
|
56
|
+
updateFromStatus(deviceId: string, status: DeviceStatus): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get cached state for a device
|
|
59
|
+
*/
|
|
60
|
+
getDevice(deviceId: string): PersistedDeviceState | null;
|
|
61
|
+
/**
|
|
62
|
+
* Check if device has fresh cached data
|
|
63
|
+
*/
|
|
64
|
+
hasFreshCache(deviceId: string, maxAge?: number): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Get device status from cache (for fallback)
|
|
67
|
+
*/
|
|
68
|
+
getCachedStatus(deviceId: string): DeviceStatus | null;
|
|
69
|
+
/**
|
|
70
|
+
* Remove a device from persistence
|
|
71
|
+
*/
|
|
72
|
+
removeDevice(deviceId: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Clear all persisted states
|
|
75
|
+
*/
|
|
76
|
+
clear(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Get all cached device states
|
|
79
|
+
*/
|
|
80
|
+
getAllDevices(): Map<string, PersistedDeviceState>;
|
|
81
|
+
/**
|
|
82
|
+
* Get device count
|
|
83
|
+
*/
|
|
84
|
+
get size(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Check if persistence has been modified
|
|
87
|
+
*/
|
|
88
|
+
get isDirty(): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Get persistence statistics
|
|
91
|
+
*/
|
|
92
|
+
getStats(): {
|
|
93
|
+
deviceCount: number;
|
|
94
|
+
loaded: boolean;
|
|
95
|
+
dirty: boolean;
|
|
96
|
+
storagePath: string;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get or create the global persistence instance
|
|
101
|
+
*/
|
|
102
|
+
export declare function getDevicePersistence(storagePath?: string): DevicePersistence;
|
|
103
|
+
/**
|
|
104
|
+
* Reset the global persistence (for testing)
|
|
105
|
+
*/
|
|
106
|
+
export declare function resetGlobalPersistence(): void;
|
|
107
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/api/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAmB,YAAY,EAAE,MAAM,UAAU,CAAA;AAEnF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,OAAO,CAAC,iBAAiB,CAGjE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,qCAAqC,CAAA;AAEvE;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAEnC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAUzE;;OAEG;IACH,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAuCzC;;OAEG;IACH,IAAI,IAAI,OAAO;IAqCf;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAgB1E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAO9D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAKxD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO;IAQ9D;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAWtD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAKlD;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,OAAO,CAAA;QACf,KAAK,EAAE,OAAO,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;KACpB;CAQF;AAOD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAK5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|