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.
Files changed (72) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +112 -0
  3. package/config.schema.json +136 -0
  4. package/dist/api/cache.d.ts +108 -0
  5. package/dist/api/cache.d.ts.map +1 -0
  6. package/dist/api/cache.js +206 -0
  7. package/dist/api/cache.js.map +1 -0
  8. package/dist/api/circuit-breaker.d.ts +118 -0
  9. package/dist/api/circuit-breaker.d.ts.map +1 -0
  10. package/dist/api/circuit-breaker.js +223 -0
  11. package/dist/api/circuit-breaker.js.map +1 -0
  12. package/dist/api/client.d.ts +116 -0
  13. package/dist/api/client.d.ts.map +1 -0
  14. package/dist/api/client.js +358 -0
  15. package/dist/api/client.js.map +1 -0
  16. package/dist/api/index.d.ts +23 -0
  17. package/dist/api/index.d.ts.map +1 -0
  18. package/dist/api/index.js +47 -0
  19. package/dist/api/index.js.map +1 -0
  20. package/dist/api/persistence.d.ts +107 -0
  21. package/dist/api/persistence.d.ts.map +1 -0
  22. package/dist/api/persistence.js +285 -0
  23. package/dist/api/persistence.js.map +1 -0
  24. package/dist/api/rate-limiter.d.ts +102 -0
  25. package/dist/api/rate-limiter.d.ts.map +1 -0
  26. package/dist/api/rate-limiter.js +173 -0
  27. package/dist/api/rate-limiter.js.map +1 -0
  28. package/dist/api/request-queue.d.ts +104 -0
  29. package/dist/api/request-queue.d.ts.map +1 -0
  30. package/dist/api/request-queue.js +223 -0
  31. package/dist/api/request-queue.js.map +1 -0
  32. package/dist/api/websocket.d.ts +116 -0
  33. package/dist/api/websocket.d.ts.map +1 -0
  34. package/dist/api/websocket.js +319 -0
  35. package/dist/api/websocket.js.map +1 -0
  36. package/dist/errors/index.d.ts +182 -0
  37. package/dist/errors/index.d.ts.map +1 -0
  38. package/dist/errors/index.js +273 -0
  39. package/dist/errors/index.js.map +1 -0
  40. package/dist/index.d.ts +16 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +42 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/platform.d.ts +139 -0
  45. package/dist/platform.d.ts.map +1 -0
  46. package/dist/platform.js +664 -0
  47. package/dist/platform.js.map +1 -0
  48. package/dist/types/index.d.ts +225 -0
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/index.js +34 -0
  51. package/dist/types/index.js.map +1 -0
  52. package/dist/utils/index.d.ts +15 -0
  53. package/dist/utils/index.d.ts.map +1 -0
  54. package/dist/utils/index.js +52 -0
  55. package/dist/utils/index.js.map +1 -0
  56. package/dist/utils/logger.d.ts +103 -0
  57. package/dist/utils/logger.d.ts.map +1 -0
  58. package/dist/utils/logger.js +184 -0
  59. package/dist/utils/logger.js.map +1 -0
  60. package/dist/utils/retry.d.ts +56 -0
  61. package/dist/utils/retry.d.ts.map +1 -0
  62. package/dist/utils/retry.js +141 -0
  63. package/dist/utils/retry.js.map +1 -0
  64. package/dist/utils/sanitizers.d.ts +37 -0
  65. package/dist/utils/sanitizers.d.ts.map +1 -0
  66. package/dist/utils/sanitizers.js +128 -0
  67. package/dist/utils/sanitizers.js.map +1 -0
  68. package/dist/utils/validators.d.ts +51 -0
  69. package/dist/utils/validators.d.ts.map +1 -0
  70. package/dist/utils/validators.js +243 -0
  71. package/dist/utils/validators.js.map +1 -0
  72. 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"}