homebridge 2.0.0-alpha.6 → 2.0.0-alpha.60

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 (108) hide show
  1. package/README.md +1 -1
  2. package/bin/homebridge.js +22 -0
  3. package/dist/api.d.ts +235 -3
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +91 -0
  6. package/dist/api.js.map +1 -1
  7. package/dist/bridgeService.d.ts +11 -3
  8. package/dist/bridgeService.d.ts.map +1 -1
  9. package/dist/bridgeService.js +9 -5
  10. package/dist/bridgeService.js.map +1 -1
  11. package/dist/childBridgeFork.d.ts +30 -3
  12. package/dist/childBridgeFork.d.ts.map +1 -1
  13. package/dist/childBridgeFork.js +270 -5
  14. package/dist/childBridgeFork.js.map +1 -1
  15. package/dist/childBridgeService.d.ts +22 -0
  16. package/dist/childBridgeService.d.ts.map +1 -1
  17. package/dist/childBridgeService.js +85 -26
  18. package/dist/childBridgeService.js.map +1 -1
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +3 -2
  21. package/dist/cli.js.map +1 -1
  22. package/dist/externalPortService.d.ts +27 -6
  23. package/dist/externalPortService.d.ts.map +1 -1
  24. package/dist/externalPortService.js +73 -7
  25. package/dist/externalPortService.js.map +1 -1
  26. package/dist/index.d.ts +48 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +36 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/ipcService.d.ts +20 -0
  31. package/dist/ipcService.d.ts.map +1 -1
  32. package/dist/ipcService.js.map +1 -1
  33. package/dist/logger.d.ts +6 -0
  34. package/dist/logger.d.ts.map +1 -1
  35. package/dist/logger.js +8 -0
  36. package/dist/logger.js.map +1 -1
  37. package/dist/matter/index.d.ts +59 -0
  38. package/dist/matter/index.d.ts.map +1 -0
  39. package/dist/matter/index.js +19 -0
  40. package/dist/matter/index.js.map +1 -0
  41. package/dist/matter/matterAccessoryCache.d.ts +77 -0
  42. package/dist/matter/matterAccessoryCache.d.ts.map +1 -0
  43. package/dist/matter/matterAccessoryCache.js +176 -0
  44. package/dist/matter/matterAccessoryCache.js.map +1 -0
  45. package/dist/matter/matterBehaviors.d.ts +158 -0
  46. package/dist/matter/matterBehaviors.d.ts.map +1 -0
  47. package/dist/matter/matterBehaviors.js +740 -0
  48. package/dist/matter/matterBehaviors.js.map +1 -0
  49. package/dist/matter/matterConfigValidator.d.ts +81 -0
  50. package/dist/matter/matterConfigValidator.d.ts.map +1 -0
  51. package/dist/matter/matterConfigValidator.js +240 -0
  52. package/dist/matter/matterConfigValidator.js.map +1 -0
  53. package/dist/matter/matterErrorHandler.d.ts +94 -0
  54. package/dist/matter/matterErrorHandler.d.ts.map +1 -0
  55. package/dist/matter/matterErrorHandler.js +485 -0
  56. package/dist/matter/matterErrorHandler.js.map +1 -0
  57. package/dist/matter/matterLogFormatter.d.ts +19 -0
  58. package/dist/matter/matterLogFormatter.d.ts.map +1 -0
  59. package/dist/matter/matterLogFormatter.js +126 -0
  60. package/dist/matter/matterLogFormatter.js.map +1 -0
  61. package/dist/matter/matterNetworkMonitor.d.ts +68 -0
  62. package/dist/matter/matterNetworkMonitor.d.ts.map +1 -0
  63. package/dist/matter/matterNetworkMonitor.js +249 -0
  64. package/dist/matter/matterNetworkMonitor.js.map +1 -0
  65. package/dist/matter/matterServer.d.ts +643 -0
  66. package/dist/matter/matterServer.d.ts.map +1 -0
  67. package/dist/matter/matterServer.js +1623 -0
  68. package/dist/matter/matterServer.js.map +1 -0
  69. package/dist/matter/matterSharedTypes.d.ts +165 -0
  70. package/dist/matter/matterSharedTypes.d.ts.map +1 -0
  71. package/dist/matter/matterSharedTypes.js +51 -0
  72. package/dist/matter/matterSharedTypes.js.map +1 -0
  73. package/dist/matter/matterStorage.d.ts +126 -0
  74. package/dist/matter/matterStorage.d.ts.map +1 -0
  75. package/dist/matter/matterStorage.js +419 -0
  76. package/dist/matter/matterStorage.js.map +1 -0
  77. package/dist/matter/matterTypes.d.ts +612 -0
  78. package/dist/matter/matterTypes.d.ts.map +1 -0
  79. package/dist/matter/matterTypes.js +150 -0
  80. package/dist/matter/matterTypes.js.map +1 -0
  81. package/dist/platformAccessory.d.ts +1 -0
  82. package/dist/platformAccessory.d.ts.map +1 -1
  83. package/dist/platformAccessory.js +8 -1
  84. package/dist/platformAccessory.js.map +1 -1
  85. package/dist/plugin.d.ts +0 -1
  86. package/dist/plugin.d.ts.map +1 -1
  87. package/dist/plugin.js +8 -11
  88. package/dist/plugin.js.map +1 -1
  89. package/dist/pluginManager.d.ts.map +1 -1
  90. package/dist/pluginManager.js +22 -21
  91. package/dist/pluginManager.js.map +1 -1
  92. package/dist/server.d.ts +23 -1
  93. package/dist/server.d.ts.map +1 -1
  94. package/dist/server.js +374 -10
  95. package/dist/server.js.map +1 -1
  96. package/dist/storageService.js +8 -8
  97. package/dist/storageService.js.map +1 -1
  98. package/dist/user.d.ts +1 -0
  99. package/dist/user.d.ts.map +1 -1
  100. package/dist/user.js +10 -7
  101. package/dist/user.js.map +1 -1
  102. package/dist/util/mac.d.ts.map +1 -1
  103. package/dist/util/mac.js +2 -2
  104. package/dist/util/mac.js.map +1 -1
  105. package/dist/version.js +2 -2
  106. package/dist/version.js.map +1 -1
  107. package/package.json +25 -26
  108. package/bin/homebridge +0 -19
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Matter Error Handler
3
+ *
4
+ * Centralized error handling and recovery for Matter.js integration
5
+ * with circuit breaker pattern and contextual recovery
6
+ */
7
+ import { Logger } from '../logger.js';
8
+ import { MatterCommissioningError, MatterDeviceError, MatterError, MatterErrorType, MatterNetworkError, MatterStorageError, } from './matterTypes.js';
9
+ const log = Logger.withPrefix('Matter/Errors');
10
+ // Re-export for backward compatibility
11
+ export { MatterCommissioningError, MatterDeviceError, MatterError, MatterErrorType, MatterNetworkError, MatterStorageError };
12
+ /**
13
+ * Circuit breaker states
14
+ */
15
+ var CircuitState;
16
+ (function (CircuitState) {
17
+ CircuitState["CLOSED"] = "CLOSED";
18
+ CircuitState["OPEN"] = "OPEN";
19
+ CircuitState["HALF_OPEN"] = "HALF_OPEN";
20
+ })(CircuitState || (CircuitState = {}));
21
+ /**
22
+ * Circuit breaker for error recovery
23
+ */
24
+ class CircuitBreaker {
25
+ threshold;
26
+ timeout;
27
+ successThreshold;
28
+ state = CircuitState.CLOSED;
29
+ failureCount = 0;
30
+ successCount = 0;
31
+ nextAttemptTime = 0;
32
+ constructor(threshold = 5, timeout = 60000, // 1 minute
33
+ successThreshold = 3) {
34
+ this.threshold = threshold;
35
+ this.timeout = timeout;
36
+ this.successThreshold = successThreshold;
37
+ }
38
+ /**
39
+ * Check if operation should be allowed
40
+ */
41
+ canAttempt() {
42
+ const now = Date.now();
43
+ switch (this.state) {
44
+ case CircuitState.CLOSED:
45
+ return true;
46
+ case CircuitState.OPEN:
47
+ if (now >= this.nextAttemptTime) {
48
+ this.state = CircuitState.HALF_OPEN;
49
+ return true;
50
+ }
51
+ return false;
52
+ case CircuitState.HALF_OPEN:
53
+ return true;
54
+ default:
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Record success
60
+ */
61
+ recordSuccess() {
62
+ this.failureCount = 0;
63
+ if (this.state === CircuitState.HALF_OPEN) {
64
+ this.successCount++;
65
+ if (this.successCount >= this.successThreshold) {
66
+ this.state = CircuitState.CLOSED;
67
+ this.successCount = 0;
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Record failure
73
+ */
74
+ recordFailure() {
75
+ this.failureCount++;
76
+ this.successCount = 0;
77
+ if (this.state === CircuitState.HALF_OPEN) {
78
+ this.state = CircuitState.OPEN;
79
+ this.nextAttemptTime = Date.now() + this.timeout;
80
+ }
81
+ else if (this.failureCount >= this.threshold) {
82
+ this.state = CircuitState.OPEN;
83
+ this.nextAttemptTime = Date.now() + this.timeout;
84
+ }
85
+ }
86
+ /**
87
+ * Get current state
88
+ */
89
+ getState() {
90
+ return this.state;
91
+ }
92
+ /**
93
+ * Reset the circuit breaker
94
+ */
95
+ reset() {
96
+ this.state = CircuitState.CLOSED;
97
+ this.failureCount = 0;
98
+ this.successCount = 0;
99
+ this.nextAttemptTime = 0;
100
+ }
101
+ }
102
+ export class MatterErrorHandler {
103
+ static instance;
104
+ errorCount = new Map();
105
+ lastErrors = new Map();
106
+ recoveryCallbacks = new Map();
107
+ circuitBreakers = new Map();
108
+ recoveryContexts = new Map();
109
+ MAX_RECOVERY_ATTEMPTS = 5;
110
+ constructor() { }
111
+ static getInstance() {
112
+ if (!MatterErrorHandler.instance) {
113
+ MatterErrorHandler.instance = new MatterErrorHandler();
114
+ }
115
+ return MatterErrorHandler.instance;
116
+ }
117
+ /**
118
+ * Handle a Matter error with context-aware recovery
119
+ */
120
+ async handleError(error, context) {
121
+ const matterError = this.categorizeError(error, context);
122
+ // Log the error with appropriate level
123
+ this.logError(matterError);
124
+ // Track error occurrence
125
+ this.trackError(matterError);
126
+ // Check circuit breaker before attempting recovery
127
+ const circuitBreaker = this.getOrCreateCircuitBreaker(matterError.type);
128
+ if (matterError.recoverable && circuitBreaker.canAttempt()) {
129
+ // Check if we should attempt recovery based on context
130
+ if (this.shouldAttemptRecovery(matterError)) {
131
+ this.attemptContextualRecovery(matterError, circuitBreaker).catch((err) => {
132
+ log.debug(`Recovery attempt failed for ${matterError.type}:`, err);
133
+ circuitBreaker.recordFailure();
134
+ });
135
+ }
136
+ }
137
+ else if (!circuitBreaker.canAttempt()) {
138
+ log.debug(`Circuit breaker OPEN for ${matterError.type}, skipping recovery`);
139
+ }
140
+ }
141
+ /**
142
+ * Categorize error into Matter error types using pattern matching
143
+ */
144
+ categorizeError(error, context) {
145
+ // If already a typed MatterError, return it
146
+ if (error instanceof MatterError) {
147
+ return error;
148
+ }
149
+ // Define error patterns with their corresponding error constructors
150
+ const errorPatterns = [
151
+ {
152
+ patterns: ['EADDRINUSE'],
153
+ create: error => new MatterNetworkError(`Port is already in use: ${error.message}`, { code: 'PORT_IN_USE', recoverable: false, type: MatterErrorType.NETWORK }),
154
+ },
155
+ {
156
+ patterns: ['ECONNREFUSED', 'ETIMEDOUT'],
157
+ create: error => new MatterNetworkError(`Connection failed: ${error.message}`, { code: 'CONNECTION_FAILED', recoverable: true, type: MatterErrorType.NETWORK }),
158
+ },
159
+ {
160
+ patterns: ['commissioning', 'pairing'],
161
+ create: error => new MatterCommissioningError(`Commissioning error: ${error.message}`, { recoverable: false, type: MatterErrorType.COMMISSIONING }),
162
+ },
163
+ {
164
+ patterns: ['storage', 'ENOENT'],
165
+ create: error => new MatterStorageError(`Storage error: ${error.message}`, { recoverable: true, type: MatterErrorType.STORAGE }),
166
+ },
167
+ {
168
+ patterns: ['config', 'invalid'],
169
+ create: error => new MatterError(`Configuration error: ${error.message}`, 'CONFIGURATION_ERROR', { recoverable: false, type: MatterErrorType.CONFIGURATION }),
170
+ },
171
+ ];
172
+ // Check message-based patterns first
173
+ for (const { patterns, create } of errorPatterns) {
174
+ if (patterns.some(pattern => error.message.toLowerCase().includes(pattern.toLowerCase()))) {
175
+ return create(error);
176
+ }
177
+ }
178
+ // Check context-based patterns
179
+ if (context?.includes('sync') || context?.includes('device')) {
180
+ return new MatterDeviceError(`Device sync error: ${error.message}`, { recoverable: true, type: MatterErrorType.DEVICE_SYNC, context });
181
+ }
182
+ if (context?.includes('server')) {
183
+ return new MatterError(`Server error: ${error.message}`, 'SERVER_ERROR', { recoverable: true, type: MatterErrorType.SERVER, context });
184
+ }
185
+ if (context?.includes('init')) {
186
+ return new MatterError(`Initialization error: ${error.message}`, 'INITIALIZATION_ERROR', { recoverable: true, type: MatterErrorType.INITIALIZATION, context });
187
+ }
188
+ // Default to unknown error
189
+ return new MatterError(error.message || 'Unknown Matter error', 'UNKNOWN_ERROR', { recoverable: false, type: MatterErrorType.UNKNOWN, originalError: error });
190
+ }
191
+ /**
192
+ * Log error with appropriate severity
193
+ */
194
+ logError(error) {
195
+ // Get the error type from the details if available, otherwise try to determine it
196
+ const details = error.details;
197
+ const errorType = details?.type || this.getErrorType(error);
198
+ const errorCount = this.errorCount.get(errorType) || 0;
199
+ const recoverable = details?.recoverable !== false;
200
+ if (error instanceof MatterNetworkError) {
201
+ if (details?.code === 'PORT_IN_USE') {
202
+ log.error('Matter port is already in use. Please configure a different port.');
203
+ }
204
+ else {
205
+ log.warn(`Matter network error: ${error.message}`);
206
+ }
207
+ }
208
+ else if (error instanceof MatterCommissioningError) {
209
+ log.info(`Matter commissioning issue: ${error.message}`);
210
+ }
211
+ else if (error instanceof MatterDeviceError) {
212
+ if (errorCount < 3) {
213
+ log.debug(`Device sync error: ${error.message}`);
214
+ }
215
+ else {
216
+ log.warn(`Repeated device sync errors: ${error.message}`);
217
+ }
218
+ }
219
+ else if (error instanceof MatterStorageError) {
220
+ log.warn(`Matter storage error: ${error.message}`);
221
+ }
222
+ else if (error.code === 'CONFIGURATION_ERROR') {
223
+ log.error(`Matter configuration error: ${error.message}`);
224
+ }
225
+ else if (error.code === 'SERVER_ERROR') {
226
+ log.error(`Matter server error: ${error.message}`);
227
+ }
228
+ else if (error.code === 'INITIALIZATION_ERROR') {
229
+ log.error(`Matter initialization error: ${error.message}`);
230
+ }
231
+ else {
232
+ log.error(`Matter error: ${error.message}`);
233
+ }
234
+ // Log stack trace for non-recoverable errors
235
+ if (!recoverable && error.stack) {
236
+ log.debug('Stack trace:', error.stack);
237
+ }
238
+ }
239
+ /**
240
+ * Get error type from MatterError
241
+ */
242
+ getErrorType(error) {
243
+ if (error instanceof MatterNetworkError) {
244
+ return MatterErrorType.NETWORK;
245
+ }
246
+ else if (error instanceof MatterCommissioningError) {
247
+ return MatterErrorType.COMMISSIONING;
248
+ }
249
+ else if (error instanceof MatterDeviceError) {
250
+ return MatterErrorType.DEVICE_SYNC;
251
+ }
252
+ else if (error instanceof MatterStorageError) {
253
+ return MatterErrorType.STORAGE;
254
+ }
255
+ else if (error.code === 'CONFIGURATION_ERROR') {
256
+ return MatterErrorType.CONFIGURATION;
257
+ }
258
+ else if (error.code === 'SERVER_ERROR') {
259
+ return MatterErrorType.SERVER;
260
+ }
261
+ else if (error.code === 'INITIALIZATION_ERROR') {
262
+ return MatterErrorType.INITIALIZATION;
263
+ }
264
+ else {
265
+ return MatterErrorType.UNKNOWN;
266
+ }
267
+ }
268
+ /**
269
+ * Track error occurrences with bounds checking
270
+ */
271
+ trackError(error) {
272
+ // Limit total error types tracked to prevent unbounded growth
273
+ const MAX_ERROR_TYPES = 50;
274
+ const MAX_ERRORS_PER_TYPE = 100;
275
+ const errorType = this.getErrorType(error);
276
+ if (!this.errorCount.has(errorType) && this.errorCount.size >= MAX_ERROR_TYPES) {
277
+ // Remove oldest error type
278
+ const firstKey = this.errorCount.keys().next().value;
279
+ if (firstKey) {
280
+ this.errorCount.delete(firstKey);
281
+ this.lastErrors.delete(firstKey);
282
+ this.recoveryContexts.delete(firstKey);
283
+ this.circuitBreakers.delete(firstKey);
284
+ }
285
+ }
286
+ const count = (this.errorCount.get(error.type) || 0) + 1;
287
+ // Cap error count per type
288
+ this.errorCount.set(error.type, Math.min(count, MAX_ERRORS_PER_TYPE));
289
+ this.lastErrors.set(error.type, error);
290
+ // Auto-cleanup old errors after 1 hour
291
+ setTimeout(() => {
292
+ const currentError = this.lastErrors.get(error.type);
293
+ if (currentError && currentError.timestamp === error.timestamp) {
294
+ this.clearErrors(error.type);
295
+ }
296
+ }, 3600000); // 1 hour
297
+ }
298
+ /**
299
+ * Clear errors for a specific type
300
+ */
301
+ clearErrors(errorType) {
302
+ this.errorCount.delete(errorType);
303
+ this.lastErrors.delete(errorType);
304
+ }
305
+ /**
306
+ * Attempt contextual recovery from error
307
+ */
308
+ async attemptContextualRecovery(error, circuitBreaker) {
309
+ // Get or create recovery context
310
+ let context = this.recoveryContexts.get(error.type);
311
+ if (!context) {
312
+ context = {
313
+ errorType: error.type,
314
+ attemptCount: 0,
315
+ lastAttemptTime: 0,
316
+ backoffMultiplier: 1,
317
+ };
318
+ this.recoveryContexts.set(error.type, context);
319
+ }
320
+ context.attemptCount++;
321
+ context.lastAttemptTime = Date.now();
322
+ const delay = this.getContextualDelay(error.type, context.attemptCount - 1);
323
+ log.info(`Attempting recovery from ${error.type} error (attempt ${context.attemptCount}) in ${delay}ms`);
324
+ // Use global.setTimeout so it can be mocked in tests
325
+ await new Promise(resolve => globalThis.setTimeout(resolve, delay));
326
+ try {
327
+ const callbacks = this.recoveryCallbacks.get(error.type) || [];
328
+ let anySuccess = false;
329
+ for (const callback of callbacks) {
330
+ try {
331
+ await callback();
332
+ anySuccess = true;
333
+ }
334
+ catch (callbackError) {
335
+ log.debug(`Recovery callback failed for ${error.type}:`, callbackError);
336
+ }
337
+ }
338
+ if (anySuccess) {
339
+ circuitBreaker.recordSuccess();
340
+ // Reset context on success
341
+ this.recoveryContexts.delete(error.type);
342
+ this.errorCount.set(error.type, 0);
343
+ log.info(`Recovery successful for ${error.type}`);
344
+ }
345
+ else {
346
+ circuitBreaker.recordFailure();
347
+ // Increase backoff multiplier but don't delete context
348
+ context.backoffMultiplier = Math.min(context.backoffMultiplier * 2, 10);
349
+ // Keep the context so attemptCount persists
350
+ }
351
+ }
352
+ catch (recoveryError) {
353
+ log.error(`Recovery failed for ${error.type}:`, recoveryError);
354
+ circuitBreaker.recordFailure();
355
+ context.backoffMultiplier = Math.min(context.backoffMultiplier * 2, 10);
356
+ // Keep the context so attemptCount persists
357
+ }
358
+ }
359
+ /**
360
+ * Get or create a circuit breaker for an error type
361
+ */
362
+ getOrCreateCircuitBreaker(type) {
363
+ let breaker = this.circuitBreakers.get(type);
364
+ if (!breaker) {
365
+ breaker = new CircuitBreaker();
366
+ this.circuitBreakers.set(type, breaker);
367
+ }
368
+ return breaker;
369
+ }
370
+ /**
371
+ * Check if we should attempt recovery
372
+ */
373
+ shouldAttemptRecovery(error) {
374
+ // Don't attempt recovery for non-recoverable errors
375
+ if (!error.recoverable) {
376
+ return false;
377
+ }
378
+ // Check if we've exceeded max recovery attempts
379
+ const context = this.recoveryContexts.get(error.type);
380
+ return !(context && context.attemptCount >= this.MAX_RECOVERY_ATTEMPTS);
381
+ }
382
+ /**
383
+ * Get contextual delay based on error type and attempt count
384
+ */
385
+ getContextualDelay(type, attemptCount) {
386
+ // Base delays by error type
387
+ const baseDelays = {
388
+ [MatterErrorType.NETWORK]: 5000,
389
+ [MatterErrorType.STORAGE]: 1000,
390
+ [MatterErrorType.DEVICE_SYNC]: 2000,
391
+ [MatterErrorType.DEVICE_ERROR]: 2000,
392
+ [MatterErrorType.COMMISSIONING]: 3000,
393
+ [MatterErrorType.CONFIGURATION]: 1000,
394
+ [MatterErrorType.INITIALIZATION]: 2000,
395
+ [MatterErrorType.SERVER]: 1000,
396
+ [MatterErrorType.UNKNOWN]: 2000,
397
+ };
398
+ const baseDelay = baseDelays[type] || 2000;
399
+ // Exponential backoff with jitter
400
+ const backoffDelay = Math.min(baseDelay * 2 ** attemptCount, 30000);
401
+ const jitter = Math.random() * 1000;
402
+ return backoffDelay + jitter;
403
+ }
404
+ /**
405
+ * Register a recovery callback for specific error type
406
+ */
407
+ registerRecoveryCallback(type, callback) {
408
+ const callbacks = this.recoveryCallbacks.get(type) || [];
409
+ callbacks.push(callback);
410
+ this.recoveryCallbacks.set(type, callbacks);
411
+ }
412
+ /**
413
+ * Reset error counts (useful after successful recovery)
414
+ */
415
+ resetErrorCount(type) {
416
+ if (type) {
417
+ this.errorCount.delete(type);
418
+ this.lastErrors.delete(type);
419
+ this.recoveryContexts.delete(type);
420
+ // Reset circuit breaker
421
+ const circuitBreaker = this.circuitBreakers.get(type);
422
+ if (circuitBreaker) {
423
+ circuitBreaker.reset();
424
+ }
425
+ }
426
+ else {
427
+ this.errorCount.clear();
428
+ this.lastErrors.clear();
429
+ this.recoveryContexts.clear();
430
+ // Reset all circuit breakers
431
+ for (const breaker of this.circuitBreakers.values()) {
432
+ breaker.reset();
433
+ }
434
+ }
435
+ }
436
+ /**
437
+ * Get error statistics
438
+ */
439
+ getErrorStats() {
440
+ const stats = new Map();
441
+ for (const [type, count] of this.errorCount) {
442
+ const lastError = this.lastErrors.get(type);
443
+ const circuitBreaker = this.circuitBreakers.get(type);
444
+ const context = this.recoveryContexts.get(type);
445
+ stats.set(type, {
446
+ count,
447
+ lastError,
448
+ circuitState: circuitBreaker?.getState(),
449
+ recoveryAttempts: context?.attemptCount,
450
+ });
451
+ }
452
+ return stats;
453
+ }
454
+ /**
455
+ * Create a wrapped function with error handling
456
+ */
457
+ wrapAsync(fn, context) {
458
+ return (async (...args) => {
459
+ try {
460
+ return await fn(...args);
461
+ }
462
+ catch (error) {
463
+ await this.handleError(error, context);
464
+ throw error;
465
+ }
466
+ });
467
+ }
468
+ /**
469
+ * Create a wrapped function with error suppression
470
+ */
471
+ wrapAsyncSafe(fn, context, defaultValue) {
472
+ return (async (...args) => {
473
+ try {
474
+ return await fn(...args);
475
+ }
476
+ catch (error) {
477
+ await this.handleError(error, context);
478
+ return defaultValue;
479
+ }
480
+ });
481
+ }
482
+ }
483
+ // Export singleton instance
484
+ export const errorHandler = MatterErrorHandler.getInstance();
485
+ //# sourceMappingURL=matterErrorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterErrorHandler.js","sourceRoot":"","sources":["../../src/matter/matterErrorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Matter.js Log Formatter
3
+ *
4
+ * Formats Matter.js library logs to match the homebridge log format and color scheme.
5
+ * This ensures consistent logging output across Homebridge and Matter.js.
6
+ */
7
+ /**
8
+ * Create a custom log formatter that matches the homebridge format.
9
+ * Format: [timestamp] [Matter:Facility] message
10
+ * Timestamp format matches system locale (via toLocaleString()).
11
+ *
12
+ * Log level color mapping:
13
+ * - Matter DEBUG/INFO → gray (Homebridge debug)
14
+ * - Matter NOTICE → no color (Homebridge info)
15
+ * - Matter WARN → yellow (Homebridge warn)
16
+ * - Matter ERROR/FATAL → red (Homebridge error)
17
+ */
18
+ export declare function createHomebridgeLogFormatter(): (diagnostic: unknown) => string;
19
+ //# sourceMappingURL=matterLogFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterLogFormatter.d.ts","sourceRoot":"","sources":["../../src/matter/matterLogFormatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,MAAM,CA2D9E"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Matter.js Log Formatter
3
+ *
4
+ * Formats Matter.js library logs to match the homebridge log format and color scheme.
5
+ * This ensures consistent logging output across Homebridge and Matter.js.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { Logger } from '../logger.js';
9
+ /**
10
+ * Create a custom log formatter that matches the homebridge format.
11
+ * Format: [timestamp] [Matter:Facility] message
12
+ * Timestamp format matches system locale (via toLocaleString()).
13
+ *
14
+ * Log level color mapping:
15
+ * - Matter DEBUG/INFO → gray (Homebridge debug)
16
+ * - Matter NOTICE → no color (Homebridge info)
17
+ * - Matter WARN → yellow (Homebridge warn)
18
+ * - Matter ERROR/FATAL → red (Homebridge error)
19
+ */
20
+ export function createHomebridgeLogFormatter() {
21
+ // Capture timestamp setting once when formatter is created
22
+ const timestampEnabled = Logger.isTimestampEnabled();
23
+ return (diagnostic) => {
24
+ // Check if this is a Matter.js log message
25
+ if (typeof diagnostic === 'object' && diagnostic !== null) {
26
+ const msg = diagnostic;
27
+ // If it's a log message with the expected structure
28
+ if (msg.now && msg.facility && msg.values) {
29
+ // Format facility as [Matter:FacilityName] in cyan color
30
+ const facility = formatCyan(`[Matter/${msg.facility}]`);
31
+ // Extract the message text from values
32
+ let messageText = formatMessageValues(msg.values);
33
+ // Trim excessively long messages from verbose facilities like MessageChannel
34
+ if (msg.facility === 'MessageChannel' && messageText.length > 200) {
35
+ messageText = `${messageText.substring(0, 200)} [trimmed...]`;
36
+ }
37
+ // Apply color based on Matter log level
38
+ // Matter DEBUG/INFO → gray (Homebridge debug)
39
+ // Matter NOTICE → no color (Homebridge info)
40
+ // Matter WARN → yellow (Homebridge warn)
41
+ // Matter ERROR/FATAL → red (Homebridge error)
42
+ let coloredMessage = messageText;
43
+ if (msg.level !== undefined) {
44
+ const levelStr = String(msg.level).toLowerCase();
45
+ if (levelStr === 'debug' || levelStr === 'info') {
46
+ // Homebridge debug style
47
+ coloredMessage = chalk.gray(messageText);
48
+ }
49
+ else if (levelStr === 'warn') {
50
+ // Homebridge warn style
51
+ coloredMessage = chalk.yellow(messageText);
52
+ }
53
+ else if (levelStr === 'error' || levelStr === 'fatal') {
54
+ // Homebridge error style
55
+ coloredMessage = chalk.red(messageText);
56
+ }
57
+ // For 'notice' or anything else, leave it uncolored (Homebridge info style)
58
+ }
59
+ // Check if timestamps are enabled (respects --no-timestamp flag)
60
+ if (timestampEnabled) {
61
+ // Format timestamp to match Homebridge format using toLocaleString() in white
62
+ const timestamp = formatHomebridgeTimestamp(msg.now);
63
+ return `${timestamp} ${facility} ${coloredMessage}`;
64
+ }
65
+ else {
66
+ // No timestamp
67
+ return `${facility} ${coloredMessage}`;
68
+ }
69
+ }
70
+ }
71
+ // Fallback for non-message diagnostics
72
+ return String(diagnostic);
73
+ };
74
+ }
75
+ /**
76
+ * Format a date object to Homebridge timestamp format.
77
+ * Uses toLocaleString() to match the main logger's format and respect system locale/timezone.
78
+ * Returns the timestamp in white color to match main logger.
79
+ */
80
+ function formatHomebridgeTimestamp(date) {
81
+ const timestamp = `[${date.toLocaleString()}]`;
82
+ return chalk.white(timestamp);
83
+ }
84
+ /**
85
+ * Format text in cyan color using chalk
86
+ */
87
+ function formatCyan(text) {
88
+ return chalk.cyan(text);
89
+ }
90
+ /**
91
+ * Format the message values array into a readable string
92
+ */
93
+ function formatMessageValues(values) {
94
+ if (!Array.isArray(values)) {
95
+ return String(values);
96
+ }
97
+ return values
98
+ .map((value) => {
99
+ if (value === null) {
100
+ return 'null';
101
+ }
102
+ if (value === undefined) {
103
+ return 'undefined';
104
+ }
105
+ // Matter.js uses lazy logging - call functions to get the actual message
106
+ if (typeof value === 'function') {
107
+ try {
108
+ return String(value());
109
+ }
110
+ catch {
111
+ return String(value);
112
+ }
113
+ }
114
+ if (typeof value === 'object') {
115
+ try {
116
+ return JSON.stringify(value);
117
+ }
118
+ catch {
119
+ return String(value);
120
+ }
121
+ }
122
+ return String(value);
123
+ })
124
+ .join(' ');
125
+ }
126
+ //# sourceMappingURL=matterLogFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterLogFormatter.js","sourceRoot":"","sources":["../../src/matter/matterLogFormatter.ts"],"names":[],"mappings":"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"}