homebridge 2.0.0-alpha.40 → 2.0.0-alpha.42

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 (92) hide show
  1. package/config-sample.json +1 -12
  2. package/dist/api.d.ts +46 -35
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +41 -35
  5. package/dist/api.js.map +1 -1
  6. package/dist/bridgeService.d.ts +7 -15
  7. package/dist/bridgeService.d.ts.map +1 -1
  8. package/dist/bridgeService.js +10 -7
  9. package/dist/bridgeService.js.map +1 -1
  10. package/dist/childBridgeFork.d.ts +19 -0
  11. package/dist/childBridgeFork.d.ts.map +1 -1
  12. package/dist/childBridgeFork.js +198 -4
  13. package/dist/childBridgeFork.js.map +1 -1
  14. package/dist/childBridgeService.d.ts +28 -1
  15. package/dist/childBridgeService.d.ts.map +1 -1
  16. package/dist/childBridgeService.js +43 -0
  17. package/dist/childBridgeService.js.map +1 -1
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +3 -1
  20. package/dist/cli.js.map +1 -1
  21. package/dist/index.d.ts +9 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/ipcService.d.ts +21 -3
  26. package/dist/ipcService.d.ts.map +1 -1
  27. package/dist/ipcService.js +15 -0
  28. package/dist/ipcService.js.map +1 -1
  29. package/dist/matter/index.d.ts +11 -0
  30. package/dist/matter/index.d.ts.map +1 -0
  31. package/dist/matter/index.js +11 -0
  32. package/dist/matter/index.js.map +1 -0
  33. package/dist/matter/matterConfigValidator.d.ts +26 -0
  34. package/dist/matter/matterConfigValidator.d.ts.map +1 -0
  35. package/dist/matter/matterConfigValidator.js +171 -0
  36. package/dist/matter/matterConfigValidator.js.map +1 -0
  37. package/dist/matter/matterDiagnostics.d.ts +121 -0
  38. package/dist/matter/matterDiagnostics.d.ts.map +1 -0
  39. package/dist/matter/matterDiagnostics.js +323 -0
  40. package/dist/matter/matterDiagnostics.js.map +1 -0
  41. package/dist/matter/matterErrorHandler.d.ts +94 -0
  42. package/dist/matter/matterErrorHandler.d.ts.map +1 -0
  43. package/dist/matter/matterErrorHandler.js +472 -0
  44. package/dist/matter/matterErrorHandler.js.map +1 -0
  45. package/dist/matter/matterNetworkMonitor.d.ts +65 -0
  46. package/dist/matter/matterNetworkMonitor.d.ts.map +1 -0
  47. package/dist/matter/matterNetworkMonitor.js +227 -0
  48. package/dist/matter/matterNetworkMonitor.js.map +1 -0
  49. package/dist/matter/matterServer.d.ts +196 -0
  50. package/dist/matter/matterServer.d.ts.map +1 -0
  51. package/dist/matter/matterServer.js +824 -0
  52. package/dist/matter/matterServer.js.map +1 -0
  53. package/dist/matter/matterSharedTypes.d.ts +147 -0
  54. package/dist/matter/matterSharedTypes.d.ts.map +1 -0
  55. package/dist/matter/matterSharedTypes.js +51 -0
  56. package/dist/matter/matterSharedTypes.js.map +1 -0
  57. package/dist/matter/matterStorage.d.ts +112 -0
  58. package/dist/matter/matterStorage.d.ts.map +1 -0
  59. package/dist/matter/matterStorage.js +355 -0
  60. package/dist/matter/matterStorage.js.map +1 -0
  61. package/dist/matter/matterTypes.d.ts +163 -0
  62. package/dist/matter/matterTypes.d.ts.map +1 -0
  63. package/dist/matter/matterTypes.js +106 -0
  64. package/dist/matter/matterTypes.js.map +1 -0
  65. package/dist/plugin.d.ts.map +1 -1
  66. package/dist/plugin.js +4 -2
  67. package/dist/plugin.js.map +1 -1
  68. package/dist/server.d.ts +18 -4
  69. package/dist/server.d.ts.map +1 -1
  70. package/dist/server.js +361 -51
  71. package/dist/server.js.map +1 -1
  72. package/dist/user.d.ts +1 -0
  73. package/dist/user.d.ts.map +1 -1
  74. package/dist/user.js +3 -0
  75. package/dist/user.js.map +1 -1
  76. package/package.json +12 -13
  77. package/dist/matterConfigValidator.d.ts +0 -34
  78. package/dist/matterConfigValidator.d.ts.map +0 -1
  79. package/dist/matterConfigValidator.js +0 -249
  80. package/dist/matterConfigValidator.js.map +0 -1
  81. package/dist/matterService.d.ts +0 -168
  82. package/dist/matterService.d.ts.map +0 -1
  83. package/dist/matterService.js +0 -677
  84. package/dist/matterService.js.map +0 -1
  85. package/dist/matterTypes.d.ts +0 -20
  86. package/dist/matterTypes.d.ts.map +0 -1
  87. package/dist/matterTypes.js +0 -278
  88. package/dist/matterTypes.js.map +0 -1
  89. package/dist/util/matter-cli.d.ts +0 -3
  90. package/dist/util/matter-cli.d.ts.map +0 -1
  91. package/dist/util/matter-cli.js +0 -211
  92. package/dist/util/matter-cli.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -28,11 +28,13 @@ export declare class Server {
28
28
  private readonly api;
29
29
  private readonly pluginManager;
30
30
  private readonly bridgeService;
31
- private readonly matterService;
32
31
  private readonly ipcService;
33
32
  private readonly externalPortService;
34
33
  private readonly config;
35
34
  private readonly childBridges;
35
+ private matterServer?;
36
+ private readonly matterBridgeCache;
37
+ private readonly platformConfigs;
36
38
  private serverStatus;
37
39
  constructor(options?: HomebridgeOptions);
38
40
  /**
@@ -41,10 +43,22 @@ export declare class Server {
41
43
  */
42
44
  private setServerStatus;
43
45
  start(): Promise<void>;
44
- teardown(): void;
46
+ /**
47
+ * Initialize Matter server for main bridge if enabled
48
+ */
49
+ private initializeMatterServer;
50
+ /**
51
+ * Send Matter status update for main bridge
52
+ */
53
+ private sendMainBridgeMatterStatusUpdate;
54
+ teardown(): Promise<void>;
45
55
  private publishBridge;
46
- private handlePublishMatterAccessories;
47
- private handleUnpublishMatterAccessories;
56
+ private handlePublishExternalAccessories;
57
+ private handleRegisterPlatformAccessories;
58
+ private handleUnregisterPlatformAccessories;
59
+ private handleRegisterMatterAccessory;
60
+ private handleUnregisterMatterAccessory;
61
+ private handleUpdateMatterAccessoryState;
48
62
  private static loadConfig;
49
63
  private loadAccessories;
50
64
  private loadPlatforms;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,iBAAiB;IAChC,6BAA6B,CAAC,EAAE,OAAO,CAAA;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAGD,0BAAkB,YAAY;IAC5B;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,EAAE,OAAO;IAET;;OAEG;IACH,IAAI,SAAS;CACd;AAED,qBAAa,MAAM;IAiBf,OAAO,CAAC,OAAO;IAhBjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAGzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;IAG9E,OAAO,CAAC,YAAY,CAAqC;gBAG/C,OAAO,GAAE,iBAAsB;IAoEzC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAYV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC5B,QAAQ,IAAI,IAAI;IAQvB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,8BAA8B;IAUtC,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,MAAM,CAAC,UAAU;IAoFzB,OAAO,CAAC,eAAe;IAoGvB,OAAO,CAAC,aAAa;IA4FrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiCjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAuClC,OAAO,CAAC,cAAc;CAqBvB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,iBAAiB;IAChC,6BAA6B,CAAC,EAAE,OAAO,CAAA;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAGD,0BAAkB,YAAY;IAC5B;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,EAAE,OAAO;IAET;;OAEG;IACH,IAAI,SAAS;CACd;AAED,qBAAa,MAAM;IAyBf,OAAO,CAAC,OAAO;IAxBjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAGzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;IAG9E,OAAO,CAAC,YAAY,CAAC,CAAc;IAGnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAG/E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IAGzE,OAAO,CAAC,YAAY,CAAqC;gBAG/C,OAAO,GAAE,iBAAsB;IAmEzC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCnC;;OAEG;YACW,sBAAsB;IA8DpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA2B3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,gCAAgC;IAMxC,OAAO,CAAC,iCAAiC;IAKzC,OAAO,CAAC,mCAAmC;IAK3C,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,+BAA+B;IAQvC,OAAO,CAAC,gCAAgC;IAQxC,OAAO,CAAC,MAAM,CAAC,UAAU;IA0IzB,OAAO,CAAC,eAAe;IAwGvB,OAAO,CAAC,aAAa;IAiGrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiCjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+NlC,OAAO,CAAC,cAAc;CAmBvB"}
package/dist/server.js CHANGED
@@ -8,7 +8,7 @@ import { ChildBridgeService } from './childBridgeService.js';
8
8
  import { ExternalPortService } from './externalPortService.js';
9
9
  import { IpcService } from './ipcService.js';
10
10
  import { Logger } from './logger.js';
11
- import { MatterService } from './matterService.js';
11
+ import { MatterConfigValidator, MatterServer } from './matter/index.js';
12
12
  import { PluginManager } from './pluginManager.js';
13
13
  import { User } from './user.js';
14
14
  import { validMacAddress } from './util/mac.js';
@@ -34,12 +34,17 @@ export class Server {
34
34
  api;
35
35
  pluginManager;
36
36
  bridgeService;
37
- matterService;
38
37
  ipcService;
39
38
  externalPortService;
40
39
  config;
41
40
  // used to keep track of child bridges
42
41
  childBridges = new Map();
42
+ // Matter server instance for main bridge (if enabled)
43
+ matterServer;
44
+ // Cache for Matter bridge identifier -> ChildBridgeService lookups
45
+ matterBridgeCache = new Map();
46
+ // Track platform configurations for routing accessories
47
+ platformConfigs = new Map();
43
48
  // current server status
44
49
  serverStatus = "pending" /* ServerStatus.PENDING */;
45
50
  constructor(options = {}) {
@@ -67,11 +72,15 @@ export class Server {
67
72
  // shallow copy the homebridge options to the bridge options object
68
73
  Object.assign(bridgeConfig, this.options);
69
74
  this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, bridgeConfig, this.config.bridge, this.config);
70
- // create Matter service
71
- this.matterService = new MatterService(this.config.matter || {}, this.pluginManager, this.externalPortService, this.api, this.options);
72
- // Set up Matter event handlers
73
- this.api.on("publishMatterAccessories" /* InternalAPIEvent.PUBLISH_MATTER_ACCESSORIES */, this.handlePublishMatterAccessories.bind(this));
74
- this.api.on("unpublishMatterAccessories" /* InternalAPIEvent.UNPUBLISH_MATTER_ACCESSORIES */, this.handleUnpublishMatterAccessories.bind(this));
75
+ // Handle platform accessory registration
76
+ this.api.on("registerPlatformAccessories" /* InternalAPIEvent.REGISTER_PLATFORM_ACCESSORIES */, this.handleRegisterPlatformAccessories.bind(this));
77
+ this.api.on("unregisterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_PLATFORM_ACCESSORIES */, this.handleUnregisterPlatformAccessories.bind(this));
78
+ // Handle external accessories (cameras, etc.)
79
+ this.api.on("publishExternalAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_ACCESSORIES */, this.handlePublishExternalAccessories.bind(this));
80
+ // Handle Matter accessory registration
81
+ this.api.on("registerMatterAccessory" /* InternalAPIEvent.REGISTER_MATTER_ACCESSORY */, this.handleRegisterMatterAccessory.bind(this));
82
+ this.api.on("unregisterMatterAccessory" /* InternalAPIEvent.UNREGISTER_MATTER_ACCESSORY */, this.handleUnregisterMatterAccessory.bind(this));
83
+ this.api.on("updateMatterAccessoryState" /* InternalAPIEvent.UPDATE_MATTER_ACCESSORY_STATE */, this.handleUpdateMatterAccessoryState.bind(this));
75
84
  // watch bridge events to check when server is online
76
85
  this.bridgeService.bridge.on("advertised" /* AccessoryEventTypes.ADVERTISED */, () => {
77
86
  this.setServerStatus("ok" /* ServerStatus.OK */);
@@ -92,6 +101,7 @@ export class Server {
92
101
  setServerStatus(status) {
93
102
  this.serverStatus = status;
94
103
  this.ipcService.sendMessage("serverStatusUpdate" /* IpcOutgoingEvent.SERVER_STATUS_UPDATE */, {
104
+ type: 'hap', // Main bridge is HAP
95
105
  status: this.serverStatus,
96
106
  paired: this.bridgeService?.bridge?._accessoryInfo?.paired() ?? null,
97
107
  setupUri: this.bridgeService?.bridge?.setupURI() ?? null,
@@ -109,13 +119,15 @@ export class Server {
109
119
  await this.bridgeService.loadCachedPlatformAccessoriesFromDisk();
110
120
  // initialize plugins
111
121
  await this.pluginManager.initializeInstalledPlugins();
122
+ // Initialize Matter server for main bridge if enabled
123
+ await this.initializeMatterServer();
112
124
  if (this.config.platforms.length > 0) {
113
125
  promises.push(...this.loadPlatforms());
114
126
  }
115
127
  if (this.config.accessories.length > 0) {
116
128
  this.loadAccessories();
117
129
  }
118
- // start child bridges
130
+ // start child HAP bridges
119
131
  for (const childBridge of this.childBridges.values()) {
120
132
  childBridge.start();
121
133
  }
@@ -126,40 +138,142 @@ export class Server {
126
138
  await Promise.all(promises)
127
139
  .then(() => this.publishBridge());
128
140
  }
129
- teardown() {
141
+ /**
142
+ * Initialize Matter server for main bridge if enabled
143
+ */
144
+ async initializeMatterServer() {
145
+ // Check if main bridge has matter configuration
146
+ if (!this.config.bridge.matter) {
147
+ return;
148
+ }
149
+ try {
150
+ log.info('Initializing Matter server for main bridge...');
151
+ // Allocate port from pool if not explicitly configured
152
+ let matterPort = this.config.bridge.matter.port;
153
+ if (!matterPort) {
154
+ matterPort = await this.externalPortService.requestPort(`${this.config.bridge.username}:MATTER`);
155
+ if (!matterPort) {
156
+ matterPort = 5540; // Default Matter port
157
+ log.warn('No port available from pool for main Matter bridge, using default port 5540');
158
+ }
159
+ else {
160
+ log.info(`Allocated port ${matterPort} from pool for main Matter bridge`);
161
+ }
162
+ }
163
+ // Create Matter server instance
164
+ this.matterServer = new MatterServer({
165
+ storagePath: User.matterPath(),
166
+ port: matterPort,
167
+ uniqueId: 'main-bridge',
168
+ name: this.config.bridge.matter.name || (this.config.bridge.name ? `${this.config.bridge.name} (Matter)` : 'Homebridge Matter Bridge'),
169
+ });
170
+ // Start the Matter server
171
+ await this.matterServer.start();
172
+ log.info('Matter server initialized for main bridge');
173
+ // Send Matter status update to notify UI that Matter server is ready
174
+ if (this.config.bridge.disableIpc !== true) {
175
+ this.sendMainBridgeMatterStatusUpdate();
176
+ }
177
+ }
178
+ catch (error) {
179
+ log.error('Failed to initialize Matter server for main bridge:', error);
180
+ // Provide user-friendly guidance for common errors
181
+ if (error.message && error.message.includes('corrupted')) {
182
+ log.error('');
183
+ log.error('╔════════════════════════════════════════════════════════════════════════════╗');
184
+ log.error('║ MATTER STORAGE CORRUPTED ║');
185
+ log.error('╠════════════════════════════════════════════════════════════════════════════╣');
186
+ log.error('║ Your Matter storage has become corrupted. This can happen when: ║');
187
+ log.error('║ • Matter.js library version changes ║');
188
+ log.error('║ • Storage format upgrades occur ║');
189
+ log.error('║ • Incomplete writes during shutdown ║');
190
+ log.error('║ ║');
191
+ log.error('║ To fix this, delete the corrupted storage directory: ║');
192
+ log.error('║ rm -rf ~/.homebridge/matter/main-bridge ║');
193
+ log.error('║ ║');
194
+ log.error('║ Note: You will need to re-pair your Matter devices after deletion. ║');
195
+ log.error('╚════════════════════════════════════════════════════════════════════════════╝');
196
+ log.error('');
197
+ }
198
+ }
199
+ }
200
+ /**
201
+ * Send Matter status update for main bridge
202
+ */
203
+ sendMainBridgeMatterStatusUpdate() {
204
+ if (!this.matterServer || !this.matterServer.isServerRunning()) {
205
+ return;
206
+ }
207
+ const commissioningInfo = this.matterServer.getCommissioningInfo();
208
+ // Transform property names to match UI expectations
209
+ const statusUpdate = {
210
+ type: 'matter',
211
+ status: 'ok',
212
+ port: this.config.bridge.matter?.port || 5540,
213
+ setupUri: commissioningInfo.qrCode, // Map qrCode -> setupUri for UI
214
+ pin: commissioningInfo.manualPairingCode, // Map manualPairingCode -> pin for UI
215
+ serialNumber: commissioningInfo.serialNumber,
216
+ passcode: commissioningInfo.passcode,
217
+ discriminator: commissioningInfo.discriminator,
218
+ name: this.config.bridge.matter?.name || (this.config.bridge.name ? `${this.config.bridge.name} (Matter)` : 'Homebridge Matter Bridge'),
219
+ plugin: 'main-bridge',
220
+ identifier: 'main-bridge',
221
+ deviceCount: this.matterServer.getAccessories().length,
222
+ commissioned: commissioningInfo.commissioned,
223
+ };
224
+ this.ipcService.sendMessage("matterBridgeStatusUpdate" /* IpcOutgoingEvent.MATTER_BRIDGE_STATUS_UPDATE */, statusUpdate);
225
+ }
226
+ async teardown() {
130
227
  this.bridgeService.teardown();
131
- this.matterService.stop().catch((error) => {
132
- log.error('Failed to stop Matter service:', error);
133
- });
228
+ // Stop main Matter server if running
229
+ if (this.matterServer) {
230
+ try {
231
+ await this.matterServer.stop();
232
+ }
233
+ catch (error) {
234
+ log.error('Failed to stop Matter server:', error);
235
+ }
236
+ }
237
+ // Child bridge Matter servers are stopped by their own forked processes
134
238
  this.setServerStatus("down" /* ServerStatus.DOWN */);
135
239
  }
136
240
  publishBridge() {
137
241
  this.bridgeService.publishBridge();
138
- // Initialize and start Matter service if enabled
139
- this.matterService.initialize().then(() => {
140
- this.matterService.start().catch((error) => {
141
- log.error('Failed to start Matter service:', error);
142
- });
143
- }).catch((error) => {
144
- log.error('Failed to initialize Matter service:', error);
145
- });
146
242
  this.printSetupInfo(this.config.bridge.pin);
147
243
  }
148
- handlePublishMatterAccessories(accessories) {
149
- log.info(`Publishing ${accessories.length} accessories via Matter protocol`);
150
- accessories.forEach((accessory) => {
151
- this.matterService.publishAccessory(accessory).catch((error) => {
152
- log.error(`Failed to publish accessory "${accessory.displayName}" via Matter:`, error);
153
- });
154
- });
244
+ handlePublishExternalAccessories(accessories) {
245
+ log.info(`Publishing ${accessories.length} external accessories`);
246
+ // External accessories are published via HAP
247
+ // Plugins should use api.matter to register Matter accessories explicitly
155
248
  }
156
- handleUnpublishMatterAccessories(accessories) {
157
- log.info(`Unpublishing ${accessories.length} accessories from Matter protocol`);
158
- accessories.forEach((accessory) => {
159
- this.matterService.unpublishAccessory(accessory).catch((error) => {
160
- log.error(`Failed to unpublish accessory "${accessory.displayName}" from Matter:`, error);
161
- });
162
- });
249
+ handleRegisterPlatformAccessories(accessories) {
250
+ // Route to HAP bridge
251
+ this.bridgeService.handleRegisterPlatformAccessories(accessories);
252
+ }
253
+ handleUnregisterPlatformAccessories(accessories) {
254
+ // Route to HAP bridge
255
+ this.bridgeService.handleUnregisterPlatformAccessories(accessories);
256
+ }
257
+ handleRegisterMatterAccessory(accessory) {
258
+ if (!this.matterServer) {
259
+ log.warn('Cannot register Matter accessory - Matter server is not running');
260
+ return;
261
+ }
262
+ this.matterServer.registerAccessory(accessory);
263
+ }
264
+ handleUnregisterMatterAccessory(uuid) {
265
+ if (!this.matterServer) {
266
+ log.warn('Cannot unregister Matter accessory - Matter server is not running');
267
+ return;
268
+ }
269
+ this.matterServer.unregisterAccessory(uuid);
270
+ }
271
+ handleUpdateMatterAccessoryState(uuid, cluster, attributes) {
272
+ if (!this.matterServer) {
273
+ log.warn('Cannot update Matter accessory state - Matter server is not running');
274
+ return;
275
+ }
276
+ this.matterServer.updateAccessoryState(uuid, cluster, attributes);
163
277
  }
164
278
  static loadConfig() {
165
279
  // Look for the configuration file
@@ -219,6 +333,48 @@ export class Server {
219
333
  config.platforms = [];
220
334
  }
221
335
  log.info('Loaded config.json with %s accessories and %s platforms.', config.accessories.length, config.platforms.length);
336
+ // Validate Matter configuration for port conflicts
337
+ if (config.bridge.matter || config.platforms.some((p) => p._bridge?.matter) || config.accessories.some((a) => a._bridge?.matter)) {
338
+ // Validate main bridge Matter config
339
+ if (config.bridge.matter) {
340
+ // Apply default name before validation if not set
341
+ if (!config.bridge.matter.name) {
342
+ config.bridge.matter.name = config.bridge.name ? `${config.bridge.name} (Matter)` : 'Homebridge Matter Bridge';
343
+ }
344
+ const validation = MatterConfigValidator.validate(config.bridge.matter);
345
+ if (!validation.isValid) {
346
+ log.error('Main bridge Matter configuration is invalid. Matter will not be enabled for the main bridge.');
347
+ delete config.bridge.matter;
348
+ }
349
+ }
350
+ // Validate all child bridge Matter configs and check for port conflicts
351
+ const childMatterValidation = MatterConfigValidator.validateAllChildMatterConfigs(config.platforms, config.accessories);
352
+ if (!childMatterValidation.isValid) {
353
+ log.error('Some child bridge Matter configurations are invalid. Check the errors above.');
354
+ }
355
+ // Additionally, check for conflicts between main bridge Matter port and child bridge ports
356
+ if (config.bridge.matter?.port) {
357
+ const mainMatterPort = config.bridge.matter.port;
358
+ const childMatterPorts = [];
359
+ for (const platform of config.platforms) {
360
+ if (platform._bridge?.matter?.port) {
361
+ childMatterPorts.push(platform._bridge.matter.port);
362
+ }
363
+ }
364
+ for (const accessory of config.accessories) {
365
+ if (accessory._bridge?.matter?.port) {
366
+ childMatterPorts.push(accessory._bridge.matter.port);
367
+ }
368
+ }
369
+ if (childMatterPorts.includes(mainMatterPort)) {
370
+ log.error(`Main bridge Matter port ${mainMatterPort} conflicts with a child bridge Matter port. Please use unique ports.`);
371
+ }
372
+ // Check for conflict with main bridge HAP port
373
+ if (config.bridge.port && Math.abs(config.bridge.port - mainMatterPort) < 10) {
374
+ log.warn(`Main bridge HAP port ${config.bridge.port} and Matter port ${mainMatterPort} are very close. Consider spacing them further apart.`);
375
+ }
376
+ }
377
+ }
222
378
  if (config.bridge.advertiser) {
223
379
  if (![
224
380
  "bonjour-hap" /* MDNSAdvertiser.BONJOUR */,
@@ -273,6 +429,7 @@ export class Server {
273
429
  }
274
430
  const logger = Logger.withPrefix(displayName);
275
431
  logger('Initializing %s accessory...', accessoryIdentifier);
432
+ // Handle child HAP bridge
276
433
  if (accessoryConfig._bridge) {
277
434
  // ensure the username is always uppercase
278
435
  accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
@@ -295,7 +452,9 @@ export class Server {
295
452
  }
296
453
  // add config to child bridge service
297
454
  childBridge.addConfig(accessoryConfig);
298
- return;
455
+ // Matter for child bridges is handled inside the forked child process (childBridgeFork.ts)
456
+ // to maintain isolation - each child process manages its own Matter server
457
+ return; // Done - child bridge
299
458
  }
300
459
  const accessoryInstance = new constructor(logger, accessoryConfig, this.api);
301
460
  // pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
@@ -352,6 +511,7 @@ export class Server {
352
511
  }
353
512
  const logger = Logger.withPrefix(displayName);
354
513
  logger('Initializing %s platform...', platformIdentifier);
514
+ // Handle child HAP bridge
355
515
  if (platformConfig._bridge) {
356
516
  // ensure the username is always uppercase
357
517
  platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
@@ -367,6 +527,8 @@ export class Server {
367
527
  this.childBridges.set(platformConfig._bridge.username, childBridge);
368
528
  // add config to child bridge service
369
529
  childBridge.addConfig(platformConfig);
530
+ // Matter for child bridges is handled inside the forked child process (childBridgeFork.ts)
531
+ // to maintain isolation - each child process manages its own Matter server
370
532
  return;
371
533
  }
372
534
  const platform = new constructor(logger, platformConfig, this.api);
@@ -420,7 +582,9 @@ export class Server {
420
582
  // noinspection SuspiciousTypeOfGuard
421
583
  if (typeof username === 'string') {
422
584
  const childBridge = this.childBridges.get(username.toUpperCase());
423
- childBridge?.restartChildBridge();
585
+ if (childBridge) {
586
+ childBridge.restartChildBridge();
587
+ }
424
588
  }
425
589
  });
426
590
  // handle stop child bridge event
@@ -428,7 +592,9 @@ export class Server {
428
592
  // noinspection SuspiciousTypeOfGuard
429
593
  if (typeof username === 'string') {
430
594
  const childBridge = this.childBridges.get(username.toUpperCase());
431
- childBridge?.stopChildBridge();
595
+ if (childBridge) {
596
+ childBridge.stopChildBridge();
597
+ }
432
598
  }
433
599
  });
434
600
  // handle start child bridge event
@@ -436,32 +602,176 @@ export class Server {
436
602
  // noinspection SuspiciousTypeOfGuard
437
603
  if (typeof username === 'string') {
438
604
  const childBridge = this.childBridges.get(username.toUpperCase());
439
- childBridge?.startChildBridge();
605
+ if (childBridge) {
606
+ childBridge.startChildBridge();
607
+ }
440
608
  }
441
609
  });
442
610
  this.ipcService.on("childBridgeMetadataRequest" /* IpcIncomingEvent.CHILD_BRIDGE_METADATA_REQUEST */, () => {
443
- this.ipcService.sendMessage("childBridgeMetadataResponse" /* IpcOutgoingEvent.CHILD_BRIDGE_METADATA_RESPONSE */, Array.from(this.childBridges.values()).map(x => x.getMetadata()));
611
+ const childBridgeMetadata = Array.from(this.childBridges.values()).map(x => x.getMetadata());
612
+ this.ipcService.sendMessage("childBridgeMetadataResponse" /* IpcOutgoingEvent.CHILD_BRIDGE_METADATA_RESPONSE */, childBridgeMetadata);
613
+ });
614
+ // Matter bridge IPC handlers
615
+ // Main bridge Matter server runs in this process alongside HAP
616
+ // Child bridge Matter servers run in forked child processes (see childBridgeFork.ts)
617
+ this.ipcService.on("restartMatterBridge" /* IpcIncomingEvent.RESTART_MATTER_BRIDGE */, (matterBridgeId) => {
618
+ if (matterBridgeId === 'main-bridge') {
619
+ // Main Matter bridge runs in the main process, so restart the entire Homebridge instance
620
+ log.info('Restarting Homebridge (Matter bridge restart requested)...');
621
+ process.kill(process.pid, 'SIGTERM');
622
+ }
623
+ else {
624
+ // Handle child bridge using cache for efficient lookup
625
+ const childBridge = this.matterBridgeCache.get(matterBridgeId);
626
+ if (childBridge) {
627
+ childBridge.restartChildBridge();
628
+ }
629
+ else {
630
+ log.warn(`Child bridge ${matterBridgeId} not found for Matter restart`);
631
+ }
632
+ }
633
+ });
634
+ this.ipcService.on("stopMatterBridge" /* IpcIncomingEvent.STOP_MATTER_BRIDGE */, (matterBridgeId) => {
635
+ if (matterBridgeId === 'main-bridge') {
636
+ log.warn('Stop requested for main Matter bridge - this is not supported');
637
+ log.info('The main Matter bridge runs alongside the HAP bridge and cannot be stopped independently');
638
+ }
639
+ else {
640
+ // Handle child bridge using cache for efficient lookup
641
+ const childBridge = this.matterBridgeCache.get(matterBridgeId);
642
+ if (childBridge) {
643
+ childBridge.stopChildBridge();
644
+ }
645
+ else {
646
+ log.warn(`Child bridge ${matterBridgeId} not found for Matter stop`);
647
+ }
648
+ }
649
+ });
650
+ this.ipcService.on("startMatterBridge" /* IpcIncomingEvent.START_MATTER_BRIDGE */, (matterBridgeId) => {
651
+ if (matterBridgeId === 'main-bridge') {
652
+ log.warn('Start requested for main Matter bridge - this is not supported');
653
+ log.info('The main Matter bridge starts automatically with Homebridge');
654
+ }
655
+ else {
656
+ // Handle child bridge using cache for efficient lookup
657
+ const childBridge = this.matterBridgeCache.get(matterBridgeId);
658
+ if (childBridge) {
659
+ childBridge.startChildBridge();
660
+ }
661
+ else {
662
+ log.warn(`Child bridge ${matterBridgeId} not found for Matter start`);
663
+ }
664
+ }
665
+ });
666
+ this.ipcService.on("matterBridgeMetadataRequest" /* IpcIncomingEvent.MATTER_BRIDGE_METADATA_REQUEST */, () => {
667
+ const matterBridges = [];
668
+ // Add main bridge Matter metadata if enabled
669
+ if (this.matterServer && this.matterServer.isServerRunning()) {
670
+ const commissioningInfo = this.matterServer.getCommissioningInfo();
671
+ matterBridges.push({
672
+ type: 'matter',
673
+ status: 'ok',
674
+ port: this.config.bridge.matter?.port || 5540,
675
+ setupUri: commissioningInfo.qrCode,
676
+ pin: commissioningInfo.manualPairingCode,
677
+ serialNumber: commissioningInfo.serialNumber,
678
+ name: this.config.bridge.name,
679
+ plugin: 'main-bridge',
680
+ identifier: 'main-bridge',
681
+ deviceCount: this.matterServer.getAccessories().length,
682
+ commissioned: commissioningInfo.commissioned,
683
+ matterEnabled: true,
684
+ });
685
+ }
686
+ // Add child bridge Matter metadata
687
+ for (const childBridge of this.childBridges.values()) {
688
+ const matterInfo = childBridge.getCommissioningInfo();
689
+ const matterConfig = childBridge.getMatterConfig();
690
+ if (matterInfo && matterConfig) {
691
+ const metadata = childBridge.getMetadata();
692
+ // Use plugin-identifier format to match storage
693
+ const childIdentifier = `${metadata.plugin}-${childBridge.identifier}`;
694
+ // Populate cache for efficient lookups
695
+ this.matterBridgeCache.set(childIdentifier, childBridge);
696
+ matterBridges.push({
697
+ type: 'matter',
698
+ status: metadata.status === 'ok' ? 'ok' : 'pending',
699
+ port: matterConfig.port,
700
+ setupUri: matterInfo.qrCode,
701
+ pin: matterInfo.manualPairingCode,
702
+ serialNumber: matterInfo.serialNumber,
703
+ name: matterConfig.name || metadata.name,
704
+ plugin: metadata.plugin,
705
+ identifier: childIdentifier,
706
+ commissioned: matterInfo.commissioned,
707
+ username: metadata.username,
708
+ matterEnabled: true,
709
+ });
710
+ }
711
+ }
712
+ this.ipcService.sendMessage("matterBridgeMetadataResponse" /* IpcOutgoingEvent.MATTER_BRIDGE_METADATA_RESPONSE */, matterBridges);
713
+ });
714
+ this.ipcService.on("matterAccessoriesRequest" /* IpcIncomingEvent.MATTER_ACCESSORIES_REQUEST */, () => {
715
+ // Return Matter accessories from all bridges
716
+ const allMatterAccessories = {
717
+ children: {},
718
+ };
719
+ // Add main bridge accessories
720
+ if (this.matterServer) {
721
+ allMatterAccessories.children['main-bridge'] = this.matterServer.getAccessories();
722
+ }
723
+ // Child bridge accessories are managed by child processes
724
+ this.ipcService.sendMessage("matterAccessoriesResponse" /* IpcOutgoingEvent.MATTER_ACCESSORIES_RESPONSE */, allMatterAccessories);
725
+ });
726
+ this.ipcService.on("matterCommissioningInfoRequest" /* IpcIncomingEvent.MATTER_COMMISSIONING_INFO_REQUEST */, (matterBridgeId) => {
727
+ let rawInfo = { commissioned: false };
728
+ // Handle main bridge
729
+ if (matterBridgeId === 'main-bridge') {
730
+ if (this.matterServer && this.matterServer.isServerRunning()) {
731
+ rawInfo = this.matterServer.getCommissioningInfo();
732
+ }
733
+ else {
734
+ log.debug(`[Matter] Server not available when commissioning info requested for: ${matterBridgeId}`);
735
+ }
736
+ }
737
+ else {
738
+ // Handle child bridge using plugin-identifier format (e.g., homebridge-virtual-accessories-VirtualAccessoriesForHomebridge)
739
+ // Use cache for efficient O(1) lookup
740
+ const childBridge = this.matterBridgeCache.get(matterBridgeId);
741
+ if (childBridge) {
742
+ rawInfo = childBridge.getCommissioningInfo() || { commissioned: false };
743
+ }
744
+ else {
745
+ log.debug(`[Matter] Child bridge ${matterBridgeId} not found when commissioning info requested`);
746
+ }
747
+ }
748
+ // Transform property names to match MatterCommissioningInfo interface
749
+ const commissioningInfo = {
750
+ commissioned: rawInfo.commissioned || false,
751
+ pin: rawInfo.manualPairingCode, // Map manualPairingCode -> pin
752
+ setupUri: rawInfo.qrCode, // Map qrCode -> setupUri
753
+ serialNumber: rawInfo.serialNumber,
754
+ };
755
+ this.ipcService.sendMessage("matterCommissioningInfoResponse" /* IpcOutgoingEvent.MATTER_COMMISSIONING_INFO_RESPONSE */, commissioningInfo);
444
756
  });
445
757
  }
446
758
  printSetupInfo(pin) {
447
- /* eslint-disable no-console */
448
- console.log('Setup Payload:');
449
- console.log(this.bridgeService.bridge.setupURI());
759
+ log.info('Setup Payload:');
760
+ log.info(this.bridgeService.bridge.setupURI());
450
761
  if (!this.options.hideQRCode) {
451
- console.log('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
762
+ log.info('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
452
763
  qrcode.setErrorLevel('M'); // HAP specifies level M or higher for ECC
453
764
  qrcode.generate(this.bridgeService.bridge.setupURI());
454
- console.log('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
765
+ log.info('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
455
766
  }
456
767
  else {
457
- console.log('Enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
768
+ log.info('Enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
458
769
  }
459
- console.log(chalk.black.bgWhite(' '));
460
- console.log(chalk.black.bgWhite(' ┌────────────┐ '));
461
- console.log(chalk.black.bgWhite(` │ ${pin} │ `));
462
- console.log(chalk.black.bgWhite(' └────────────┘ '));
463
- console.log(chalk.black.bgWhite(' '));
464
- /* eslint-enable no-console */
770
+ log.info(chalk.black.bgWhite(' '));
771
+ log.info(chalk.black.bgWhite(' ┌────────────┐ '));
772
+ log.info(chalk.black.bgWhite(` │ ${pin} │ `));
773
+ log.info(chalk.black.bgWhite(' └────────────┘ '));
774
+ log.info(chalk.black.bgWhite(' '));
465
775
  }
466
776
  }
467
777
  //# sourceMappingURL=server.js.map