homebridge 2.0.0-alpha.5 → 2.0.0-alpha.50

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 (105) hide show
  1. package/README.md +1 -1
  2. package/bin/homebridge.js +22 -0
  3. package/dist/api.d.ts +219 -3
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +79 -0
  6. package/dist/api.js.map +1 -1
  7. package/dist/bridgeService.d.ts +10 -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 +17 -2
  12. package/dist/childBridgeFork.d.ts.map +1 -1
  13. package/dist/childBridgeFork.js +161 -4
  14. package/dist/childBridgeFork.js.map +1 -1
  15. package/dist/childBridgeService.d.ts +21 -0
  16. package/dist/childBridgeService.d.ts.map +1 -1
  17. package/dist/childBridgeService.js +72 -25
  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.js.map +1 -1
  23. package/dist/index.d.ts +48 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +15 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/ipcService.d.ts +20 -0
  28. package/dist/ipcService.d.ts.map +1 -1
  29. package/dist/ipcService.js.map +1 -1
  30. package/dist/logger.d.ts +6 -0
  31. package/dist/logger.d.ts.map +1 -1
  32. package/dist/logger.js +8 -0
  33. package/dist/logger.js.map +1 -1
  34. package/dist/matter/index.d.ts +51 -0
  35. package/dist/matter/index.d.ts.map +1 -0
  36. package/dist/matter/index.js +11 -0
  37. package/dist/matter/index.js.map +1 -0
  38. package/dist/matter/matterAccessoryCache.d.ts +77 -0
  39. package/dist/matter/matterAccessoryCache.d.ts.map +1 -0
  40. package/dist/matter/matterAccessoryCache.js +176 -0
  41. package/dist/matter/matterAccessoryCache.js.map +1 -0
  42. package/dist/matter/matterBehaviors.d.ts +127 -0
  43. package/dist/matter/matterBehaviors.d.ts.map +1 -0
  44. package/dist/matter/matterBehaviors.js +611 -0
  45. package/dist/matter/matterBehaviors.js.map +1 -0
  46. package/dist/matter/matterConfigValidator.d.ts +81 -0
  47. package/dist/matter/matterConfigValidator.d.ts.map +1 -0
  48. package/dist/matter/matterConfigValidator.js +240 -0
  49. package/dist/matter/matterConfigValidator.js.map +1 -0
  50. package/dist/matter/matterErrorHandler.d.ts +94 -0
  51. package/dist/matter/matterErrorHandler.d.ts.map +1 -0
  52. package/dist/matter/matterErrorHandler.js +485 -0
  53. package/dist/matter/matterErrorHandler.js.map +1 -0
  54. package/dist/matter/matterLogFormatter.d.ts +18 -0
  55. package/dist/matter/matterLogFormatter.d.ts.map +1 -0
  56. package/dist/matter/matterLogFormatter.js +128 -0
  57. package/dist/matter/matterLogFormatter.js.map +1 -0
  58. package/dist/matter/matterNetworkMonitor.d.ts +68 -0
  59. package/dist/matter/matterNetworkMonitor.d.ts.map +1 -0
  60. package/dist/matter/matterNetworkMonitor.js +250 -0
  61. package/dist/matter/matterNetworkMonitor.js.map +1 -0
  62. package/dist/matter/matterServer.d.ts +283 -0
  63. package/dist/matter/matterServer.d.ts.map +1 -0
  64. package/dist/matter/matterServer.js +1416 -0
  65. package/dist/matter/matterServer.js.map +1 -0
  66. package/dist/matter/matterSharedTypes.d.ts +165 -0
  67. package/dist/matter/matterSharedTypes.d.ts.map +1 -0
  68. package/dist/matter/matterSharedTypes.js +51 -0
  69. package/dist/matter/matterSharedTypes.js.map +1 -0
  70. package/dist/matter/matterStorage.d.ts +126 -0
  71. package/dist/matter/matterStorage.d.ts.map +1 -0
  72. package/dist/matter/matterStorage.js +419 -0
  73. package/dist/matter/matterStorage.js.map +1 -0
  74. package/dist/matter/matterTypes.d.ts +250 -0
  75. package/dist/matter/matterTypes.d.ts.map +1 -0
  76. package/dist/matter/matterTypes.js +142 -0
  77. package/dist/matter/matterTypes.js.map +1 -0
  78. package/dist/platformAccessory.d.ts +1 -0
  79. package/dist/platformAccessory.d.ts.map +1 -1
  80. package/dist/platformAccessory.js +8 -1
  81. package/dist/platformAccessory.js.map +1 -1
  82. package/dist/plugin.d.ts +0 -1
  83. package/dist/plugin.d.ts.map +1 -1
  84. package/dist/plugin.js +9 -12
  85. package/dist/plugin.js.map +1 -1
  86. package/dist/pluginManager.d.ts.map +1 -1
  87. package/dist/pluginManager.js +22 -21
  88. package/dist/pluginManager.js.map +1 -1
  89. package/dist/server.d.ts +16 -1
  90. package/dist/server.d.ts.map +1 -1
  91. package/dist/server.js +276 -8
  92. package/dist/server.js.map +1 -1
  93. package/dist/storageService.js +8 -8
  94. package/dist/storageService.js.map +1 -1
  95. package/dist/user.d.ts +1 -0
  96. package/dist/user.d.ts.map +1 -1
  97. package/dist/user.js +10 -7
  98. package/dist/user.js.map +1 -1
  99. package/dist/util/mac.d.ts.map +1 -1
  100. package/dist/util/mac.js +2 -2
  101. package/dist/util/mac.js.map +1 -1
  102. package/dist/version.js +2 -2
  103. package/dist/version.js.map +1 -1
  104. package/package.json +25 -26
  105. package/bin/homebridge +0 -19
@@ -0,0 +1,68 @@
1
+ export interface NetworkStatus {
2
+ isOnline: boolean;
3
+ interfaces: string[];
4
+ primaryInterface?: string;
5
+ lastCheck: Date;
6
+ consecutiveFailures: number;
7
+ }
8
+ export declare class MatterNetworkMonitor {
9
+ private static instance;
10
+ private status;
11
+ private checkInterval;
12
+ private callbacks;
13
+ private checkIntervalMs;
14
+ private isMonitoring;
15
+ private stabilityCounter;
16
+ private readonly STABILITY_THRESHOLD;
17
+ private constructor();
18
+ static getInstance(): MatterNetworkMonitor;
19
+ /**
20
+ * Start monitoring network connectivity
21
+ */
22
+ startMonitoring(): void;
23
+ /**
24
+ * Stop monitoring
25
+ */
26
+ stopMonitoring(): void;
27
+ /**
28
+ * Check network status
29
+ */
30
+ private checkNetworkStatus;
31
+ /**
32
+ * Get active network interfaces
33
+ */
34
+ private getActiveInterfaces;
35
+ /**
36
+ * Test network connectivity with optimizations
37
+ *
38
+ * Races multiple DNS servers to return as soon as any succeeds,
39
+ * providing faster connectivity checks and better redundancy.
40
+ */
41
+ private testConnectivity;
42
+ /**
43
+ * Handle network recovery
44
+ */
45
+ private handleNetworkRecovery;
46
+ /**
47
+ * Register a callback for network status changes
48
+ */
49
+ onStatusChange(callback: (status: NetworkStatus) => void): void;
50
+ /**
51
+ * Remove a status change callback
52
+ */
53
+ removeStatusChangeCallback(callback: (status: NetworkStatus) => void): void;
54
+ /**
55
+ * Notify all listeners of status change
56
+ */
57
+ private notifyStatusChange;
58
+ /**
59
+ * Get current network status
60
+ */
61
+ getStatus(): NetworkStatus;
62
+ /**
63
+ * Check if network is healthy
64
+ */
65
+ isHealthy(): boolean;
66
+ }
67
+ export declare const networkMonitor: MatterNetworkMonitor;
68
+ //# sourceMappingURL=matterNetworkMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterNetworkMonitor.d.ts","sourceRoot":"","sources":["../../src/matter/matterNetworkMonitor.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,IAAI,CAAA;IACf,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAI;IAExC,OAAO;IASP,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,eAAe,IAAI,IAAI;IA4BvB;;OAEG;IACH,cAAc,IAAI,IAAI;IAStB;;OAEG;YACW,kBAAkB;IAgDhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;YACW,gBAAgB;IAiE9B;;OAEG;YACW,qBAAqB;IAcnC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAI/D;;OAEG;IACH,0BAA0B,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAI3E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAGD,eAAO,MAAM,cAAc,sBAAqC,CAAA"}
@@ -0,0 +1,250 @@
1
+ /* global NodeJS */
2
+ /**
3
+ * Matter Network Monitor
4
+ *
5
+ * Monitors network connectivity and handles recovery
6
+ */
7
+ import * as net from 'node:net';
8
+ import * as os from 'node:os';
9
+ import { Logger } from '../logger.js';
10
+ import { errorHandler, MatterErrorType } from './matterErrorHandler.js';
11
+ const log = Logger.withPrefix('Matter/Network');
12
+ export class MatterNetworkMonitor {
13
+ static instance;
14
+ status;
15
+ checkInterval = null;
16
+ callbacks = new Set();
17
+ checkIntervalMs = 30000; // Check every 30 seconds
18
+ isMonitoring = false;
19
+ stabilityCounter = 0;
20
+ STABILITY_THRESHOLD = 3;
21
+ constructor() {
22
+ this.status = {
23
+ isOnline: true,
24
+ interfaces: [],
25
+ lastCheck: new Date(),
26
+ consecutiveFailures: 0,
27
+ };
28
+ }
29
+ static getInstance() {
30
+ if (!MatterNetworkMonitor.instance) {
31
+ MatterNetworkMonitor.instance = new MatterNetworkMonitor();
32
+ }
33
+ return MatterNetworkMonitor.instance;
34
+ }
35
+ /**
36
+ * Start monitoring network connectivity
37
+ */
38
+ startMonitoring() {
39
+ if (this.isMonitoring) {
40
+ return;
41
+ }
42
+ this.isMonitoring = true;
43
+ log.debug('Starting Matter network monitoring');
44
+ // Initial check (fire-and-forget with error handling)
45
+ this.checkNetworkStatus().catch((error) => {
46
+ log.debug('Error during initial network check:', error);
47
+ });
48
+ // Set up periodic checks
49
+ this.checkInterval = setInterval(() => {
50
+ // Fire-and-forget with error handling
51
+ this.checkNetworkStatus().catch((error) => {
52
+ log.debug('Error during periodic network check:', error);
53
+ });
54
+ }, this.checkIntervalMs);
55
+ // Register recovery callback with error handler
56
+ errorHandler.registerRecoveryCallback(MatterErrorType.NETWORK, async () => this.handleNetworkRecovery());
57
+ }
58
+ /**
59
+ * Stop monitoring
60
+ */
61
+ stopMonitoring() {
62
+ if (this.checkInterval) {
63
+ clearInterval(this.checkInterval);
64
+ this.checkInterval = null;
65
+ }
66
+ this.isMonitoring = false;
67
+ log.debug('Stopped Matter network monitoring');
68
+ }
69
+ /**
70
+ * Check network status
71
+ */
72
+ async checkNetworkStatus() {
73
+ try {
74
+ // Get network interfaces
75
+ const interfaces = this.getActiveInterfaces();
76
+ // Test connectivity with a simple port check
77
+ const isOnline = await this.testConnectivity();
78
+ const previousStatus = this.status.isOnline;
79
+ this.status = {
80
+ isOnline,
81
+ interfaces: interfaces.map(i => i.name),
82
+ primaryInterface: interfaces[0]?.name,
83
+ lastCheck: new Date(),
84
+ consecutiveFailures: isOnline ? 0 : this.status.consecutiveFailures + 1,
85
+ };
86
+ // Notify listeners if status changed
87
+ if (previousStatus !== isOnline) {
88
+ this.notifyStatusChange();
89
+ if (!isOnline) {
90
+ this.stabilityCounter = 0;
91
+ log.warn('Matter network connectivity lost');
92
+ await errorHandler.handleError(new Error('Network connectivity lost'), 'network-monitor');
93
+ }
94
+ else {
95
+ this.stabilityCounter = 0;
96
+ log.info('Matter network connectivity restored');
97
+ errorHandler.resetErrorCount(MatterErrorType.NETWORK);
98
+ }
99
+ }
100
+ else if (isOnline) {
101
+ // Increment stability counter when consistently online
102
+ this.stabilityCounter = Math.min(this.stabilityCounter + 1, this.STABILITY_THRESHOLD);
103
+ }
104
+ // Log warnings for repeated failures
105
+ if (this.status.consecutiveFailures > 3) {
106
+ log.error(`Network has been offline for ${this.status.consecutiveFailures} consecutive checks`);
107
+ }
108
+ }
109
+ catch (error) {
110
+ log.debug('Error checking network status:', error);
111
+ }
112
+ }
113
+ /**
114
+ * Get active network interfaces
115
+ */
116
+ getActiveInterfaces() {
117
+ const interfaces = [];
118
+ const networkInterfaces = os.networkInterfaces();
119
+ for (const [name, addrs] of Object.entries(networkInterfaces)) {
120
+ if (!addrs) {
121
+ continue;
122
+ }
123
+ for (const addr of addrs) {
124
+ // Skip internal (loopback) and non-IPv4 addresses
125
+ if (!addr.internal && addr.family === 'IPv4') {
126
+ interfaces.push({ name, address: addr.address });
127
+ }
128
+ }
129
+ }
130
+ return interfaces;
131
+ }
132
+ /**
133
+ * Test network connectivity with optimizations
134
+ *
135
+ * Races multiple DNS servers to return as soon as any succeeds,
136
+ * providing faster connectivity checks and better redundancy.
137
+ */
138
+ async testConnectivity() {
139
+ // If we recently had a successful check, skip the test
140
+ const timeSinceLastCheck = Date.now() - (this.status.lastCheck?.getTime() || 0);
141
+ if (this.status.isOnline && timeSinceLastCheck < 5000 && this.stabilityCounter >= this.STABILITY_THRESHOLD) {
142
+ log.debug('Skipping connectivity test - recent successful check');
143
+ return true;
144
+ }
145
+ const servers = [
146
+ { host: '1.1.1.1', port: 53 }, // Cloudflare DNS
147
+ { host: '8.8.8.8', port: 53 }, // Google DNS
148
+ { host: '9.9.9.9', port: 53 }, // Quad9 DNS
149
+ ];
150
+ // Test a single server
151
+ const testServer = (server) => {
152
+ return new Promise((resolve) => {
153
+ const socket = new net.Socket();
154
+ const timeout = 2000;
155
+ const cleanup = () => socket.destroy();
156
+ socket.setTimeout(timeout);
157
+ socket.once('connect', () => {
158
+ cleanup();
159
+ resolve(true);
160
+ });
161
+ socket.once('error', () => {
162
+ cleanup();
163
+ resolve(false);
164
+ });
165
+ socket.once('timeout', () => {
166
+ cleanup();
167
+ resolve(false);
168
+ });
169
+ socket.connect(server.port, server.host);
170
+ });
171
+ };
172
+ // Race all servers - return true as soon as ANY succeeds
173
+ try {
174
+ const racePromises = servers.map(async (server) => {
175
+ const success = await testServer(server);
176
+ if (success) {
177
+ // If this server succeeded, return true immediately
178
+ return { success: true };
179
+ }
180
+ // Otherwise, never resolve (let other promises continue racing)
181
+ return new Promise(() => { });
182
+ });
183
+ // Add a timeout promise to ensure we don't wait forever
184
+ const timeoutPromise = new Promise((resolve) => {
185
+ setTimeout(() => resolve({ success: false }), 3000);
186
+ });
187
+ const result = await Promise.race([...racePromises, timeoutPromise]);
188
+ return result.success;
189
+ }
190
+ catch (error) {
191
+ log.debug('Error during connectivity test:', error);
192
+ return false;
193
+ }
194
+ }
195
+ /**
196
+ * Handle network recovery
197
+ */
198
+ async handleNetworkRecovery() {
199
+ log.info('Attempting network recovery...');
200
+ // Force a network check
201
+ await this.checkNetworkStatus();
202
+ if (this.status.isOnline) {
203
+ log.info('Network is online, recovery successful');
204
+ }
205
+ else {
206
+ log.warn('Network still offline, will retry');
207
+ throw new Error('Network recovery failed');
208
+ }
209
+ }
210
+ /**
211
+ * Register a callback for network status changes
212
+ */
213
+ onStatusChange(callback) {
214
+ this.callbacks.add(callback);
215
+ }
216
+ /**
217
+ * Remove a status change callback
218
+ */
219
+ removeStatusChangeCallback(callback) {
220
+ this.callbacks.delete(callback);
221
+ }
222
+ /**
223
+ * Notify all listeners of status change
224
+ */
225
+ notifyStatusChange() {
226
+ for (const callback of this.callbacks) {
227
+ try {
228
+ callback(this.status);
229
+ }
230
+ catch (error) {
231
+ log.debug('Error in network status callback:', error);
232
+ }
233
+ }
234
+ }
235
+ /**
236
+ * Get current network status
237
+ */
238
+ getStatus() {
239
+ return { ...this.status };
240
+ }
241
+ /**
242
+ * Check if network is healthy
243
+ */
244
+ isHealthy() {
245
+ return this.status.isOnline && this.status.consecutiveFailures === 0;
246
+ }
247
+ }
248
+ // Export singleton instance
249
+ export const networkMonitor = MatterNetworkMonitor.getInstance();
250
+ //# sourceMappingURL=matterNetworkMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterNetworkMonitor.js","sourceRoot":"","sources":["../../src/matter/matterNetworkMonitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Matter.js Server Implementation for Homebridge Plugin API
3
+ *
4
+ * This provides a Matter bridge that plugins can use to register
5
+ * Matter accessories via the Homebridge API.
6
+ */
7
+ import type { SerializedMatterAccessory } from './matterAccessoryCache.js';
8
+ import { EventEmitter } from 'node:events';
9
+ import { MatterServerConfig } from './matterSharedTypes.js';
10
+ import { clusters, MatterAccessory, MatterServerEvents } from './matterTypes.js';
11
+ export { MatterServerConfig } from './matterSharedTypes.js';
12
+ /**
13
+ * Matter Server for Homebridge Plugin API
14
+ * Allows plugins to register Matter accessories explicitly
15
+ *
16
+ * Extends EventEmitter to provide commissioning lifecycle events
17
+ */
18
+ export declare class MatterServer extends EventEmitter {
19
+ on: <K extends keyof MatterServerEvents>(event: K, listener: MatterServerEvents[K]) => this;
20
+ emit: <K extends keyof MatterServerEvents>(event: K, ...args: Parameters<MatterServerEvents[K]>) => boolean;
21
+ removeListener: <K extends keyof MatterServerEvents>(event: K, listener: MatterServerEvents[K]) => this;
22
+ removeAllListeners: (event?: keyof MatterServerEvents) => this;
23
+ private readonly config;
24
+ private serverNode;
25
+ private aggregator;
26
+ private accessories;
27
+ private isRunning;
28
+ private readonly MAX_DEVICES;
29
+ private shutdownHandler;
30
+ private passcode;
31
+ private discriminator;
32
+ private readonly vendorId;
33
+ private readonly productId;
34
+ private commissioningInfo;
35
+ private serialNumber?;
36
+ private cleanupHandlers;
37
+ private storageManager;
38
+ private matterStoragePath?;
39
+ private accessoryCache;
40
+ private fabricMonitorInterval;
41
+ private previousFabrics;
42
+ constructor(config: MatterServerConfig);
43
+ /**
44
+ * Validate and sanitize Matter server configuration
45
+ * Throws descriptive errors if configuration is invalid
46
+ */
47
+ private validateAndSanitizeConfig;
48
+ /**
49
+ * Generate a secure random passcode
50
+ * According to Matter spec, passcode must be:
51
+ * - 8 digits (00000001 to 99999998)
52
+ * - Not in the invalid list
53
+ * - Not sequential or repeating patterns
54
+ */
55
+ private generateSecurePasscode;
56
+ /**
57
+ * Validate a passcode according to Matter specifications
58
+ */
59
+ private isValidPasscode;
60
+ /**
61
+ * Generate a random discriminator
62
+ * According to Matter spec, discriminator must be:
63
+ * - 12 bits (0-4095)
64
+ * - Should be random for security
65
+ */
66
+ private generateRandomDiscriminator;
67
+ /**
68
+ * Create ServerNode with automatic recovery from corrupted storage
69
+ *
70
+ * Matter.js can fail to start if fabric data is corrupted (common after
71
+ * hard shutdowns or disk errors). This method implements automatic recovery by:
72
+ *
73
+ * 1. Attempting normal ServerNode creation
74
+ * 2. If it fails with storage errors, identifying and removing corrupted files
75
+ * 3. Retrying ServerNode creation with fresh storage
76
+ *
77
+ * This prevents the need for manual intervention while preserving data
78
+ * safety by only removing storage on confirmed corruption errors.
79
+ *
80
+ * @param nodeOptions - Matter.js ServerNode configuration
81
+ * @param sanitizedId - Filesystem-safe bridge identifier
82
+ * @returns Initialized ServerNode instance
83
+ * @throws Error if recovery fails or error is not storage-related
84
+ */
85
+ private createServerNodeWithRecovery;
86
+ /**
87
+ * Start the Matter server
88
+ */
89
+ start(): Promise<void>;
90
+ /**
91
+ * Set up and validate storage
92
+ */
93
+ private setupStorage;
94
+ /**
95
+ * Load or generate commissioning credentials (passcode and discriminator)
96
+ * These must be persistent across restarts to maintain the same QR code
97
+ */
98
+ private loadOrGenerateCredentials;
99
+ /**
100
+ * Generate and display commissioning information
101
+ */
102
+ private generateCommissioningInfo;
103
+ /**
104
+ * Wait for the server to be ready
105
+ */
106
+ private waitForServerReady;
107
+ /**
108
+ * Start monitoring fabric changes to emit commissioning events
109
+ */
110
+ private startFabricMonitoring;
111
+ /**
112
+ * Stop fabric monitoring
113
+ */
114
+ private stopFabricMonitoring;
115
+ /**
116
+ * Check for fabric changes and emit appropriate events
117
+ */
118
+ private checkFabricChanges;
119
+ /**
120
+ * Update commissioning info file when commissioning state changes
121
+ */
122
+ private updateCommissioningFile;
123
+ /**
124
+ * Register Matter platform accessories (Plugin API - matches HAP pattern)
125
+ */
126
+ registerPlatformAccessories(pluginIdentifier: string, platformName: string, accessories: MatterAccessory[]): Promise<void>;
127
+ /**
128
+ * Unregister Matter platform accessories (Plugin API - matches HAP pattern)
129
+ */
130
+ unregisterPlatformAccessories(pluginIdentifier: string, platformName: string, accessories: MatterAccessory[]): Promise<void>;
131
+ /**
132
+ * Register a single Matter accessory (internal method)
133
+ */
134
+ private registerAccessory;
135
+ /**
136
+ * Unregister a Matter accessory (Plugin API)
137
+ */
138
+ unregisterAccessory(uuid: string): Promise<void>;
139
+ /**
140
+ * Update a Matter accessory's state (Plugin API)
141
+ *
142
+ * This method can be called from anywhere, including from within handlers.
143
+ * State updates are automatically deferred to avoid transaction conflicts.
144
+ */
145
+ updateAccessoryState(uuid: string, cluster: string, attributes: Record<string, unknown>): Promise<void>;
146
+ /**
147
+ * Get a Matter accessory's current state (Plugin API)
148
+ *
149
+ * Returns the current cluster attribute values that are exposed to Matter controllers.
150
+ * This is useful for:
151
+ * - Reading state after plugin restart (when local variables are lost)
152
+ * - Verifying current state before making changes
153
+ * - Multiple parts of code that need to read state
154
+ * - Debugging and logging
155
+ *
156
+ * @param uuid - The UUID of the accessory
157
+ * @param cluster - The cluster name (e.g., 'onOff', 'levelControl')
158
+ * @returns Current cluster attribute values, or undefined if cluster not found
159
+ */
160
+ getAccessoryState(uuid: string, cluster: string): Record<string, unknown> | undefined;
161
+ /**
162
+ * Get all cached accessories (Internal - for restore process)
163
+ * @internal
164
+ */
165
+ getAllCachedAccessories(): SerializedMatterAccessory[];
166
+ /**
167
+ * Get all registered accessories (Plugin API)
168
+ */
169
+ getAccessories(): MatterAccessory[];
170
+ /**
171
+ * Get a specific accessory by UUID (Plugin API)
172
+ */
173
+ getAccessory(uuid: string): MatterAccessory | undefined;
174
+ /**
175
+ * Stop the Matter server
176
+ */
177
+ stop(): Promise<void>;
178
+ /**
179
+ * Cleanup resources
180
+ */
181
+ private cleanup;
182
+ /**
183
+ * Get fabric information for commissioned controllers
184
+ */
185
+ getFabricInfo(): Array<{
186
+ fabricIndex: number;
187
+ fabricId: string;
188
+ nodeId: string;
189
+ rootVendorId: number;
190
+ label?: string;
191
+ }>;
192
+ /**
193
+ * Check if the server is commissioned
194
+ */
195
+ isCommissioned(): boolean;
196
+ /**
197
+ * Get the number of commissioned fabrics
198
+ */
199
+ getCommissionedFabricCount(): number;
200
+ /**
201
+ * Get server status information
202
+ */
203
+ getServerInfo(): {
204
+ running: boolean;
205
+ port: number;
206
+ deviceCount: number;
207
+ commissioned: boolean;
208
+ fabricCount: number;
209
+ serialNumber?: string;
210
+ };
211
+ /**
212
+ * Get commissioning information
213
+ */
214
+ getCommissioningInfo(): {
215
+ qrCode?: string;
216
+ manualPairingCode?: string;
217
+ serialNumber?: string;
218
+ passcode?: number;
219
+ discriminator?: number;
220
+ commissioned: boolean;
221
+ };
222
+ /**
223
+ * Get storage statistics
224
+ */
225
+ getStorageStats(): Array<{
226
+ entries: number;
227
+ namespace: string;
228
+ path: string;
229
+ }> | null;
230
+ /**
231
+ * Check if server is running
232
+ */
233
+ isServerRunning(): boolean;
234
+ /**
235
+ * Get Matter device types available for plugin use
236
+ */
237
+ getDeviceTypes(): {
238
+ readonly OnOffLight: import("@matter/node/devices").OnOffLightDevice;
239
+ readonly DimmableLight: import("@matter/node/devices").DimmableLightDevice;
240
+ readonly ColorTemperatureLight: import("@matter/node/devices").ColorTemperatureLightDevice;
241
+ readonly ExtendedColorLight: import("@matter/node/devices").ExtendedColorLightDevice;
242
+ readonly OnOffSwitch: import("@matter/node/devices").OnOffLightSwitchDevice;
243
+ readonly OnOffOutlet: import("@matter/node/devices").OnOffPlugInUnitDevice;
244
+ readonly DimmableOutlet: import("@matter/node/devices").DimmablePlugInUnitDevice;
245
+ readonly TemperatureSensor: import("@matter/node/devices").TemperatureSensorDevice;
246
+ readonly HumiditySensor: import("@matter/node/devices").HumiditySensorDevice;
247
+ readonly LightSensor: import("@matter/node/devices").LightSensorDevice;
248
+ readonly MotionSensor: import("@matter/node/devices").OccupancySensorDevice;
249
+ readonly ContactSensor: import("@matter/node/devices").ContactSensorDevice;
250
+ readonly LeakSensor: import("@matter/node/devices").WaterLeakDetectorDevice;
251
+ readonly SmokeSensor: import("@matter/node/devices").SmokeCoAlarmDevice;
252
+ readonly Thermostat: import("@matter/node/devices").ThermostatDevice;
253
+ readonly Fan: import("@matter/node/devices").FanDevice;
254
+ readonly DoorLock: import("@matter/node/devices").DoorLockDevice;
255
+ readonly WindowCovering: import("@matter/node/devices").WindowCoveringDevice;
256
+ readonly GenericSwitch: import("@matter/node/devices").GenericSwitchDevice;
257
+ readonly Pump: import("@matter/node/devices").PumpDevice;
258
+ readonly RoomAirConditioner: import("@matter/node/devices").RoomAirConditionerDevice;
259
+ };
260
+ /**
261
+ * Get Matter clusters available for plugin use
262
+ */
263
+ getClusters(): typeof clusters;
264
+ /**
265
+ * Remove a specific fabric (controller) from the bridge
266
+ * This decommissions a single controller while leaving others intact
267
+ *
268
+ * @param fabricIndex - The fabric index to remove
269
+ * @returns Promise that resolves when the fabric is removed
270
+ */
271
+ removeFabric(fabricIndex: number): Promise<void>;
272
+ /**
273
+ * Check if a specific fabric exists
274
+ */
275
+ hasFabric(fabricIndex: number): boolean;
276
+ /**
277
+ * Notify controllers that the parts list has changed
278
+ * This triggers controllers (like Home app) to re-read the device list
279
+ * and discover new or removed accessories without needing to re-pair
280
+ */
281
+ private notifyPartsListChanged;
282
+ }
283
+ //# sourceMappingURL=matterServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterServer.d.ts","sourceRoot":"","sources":["../../src/matter/matterServer.ts"],"names":[],"mappings":"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"}