homebridge 2.0.0-beta.3 → 2.0.0-beta.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -17
- package/bin/homebridge.js +22 -0
- package/config-sample.json +3 -3
- package/dist/api.d.ts +457 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +221 -0
- package/dist/api.js.map +1 -0
- package/{lib → dist}/bridgeService.d.ts +19 -10
- package/dist/bridgeService.d.ts.map +1 -0
- package/{lib → dist}/bridgeService.js +85 -117
- package/dist/bridgeService.js.map +1 -0
- package/dist/childBridgeFork.d.ts +65 -0
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/dist/childBridgeFork.js +531 -0
- package/dist/childBridgeFork.js.map +1 -0
- package/{lib → dist}/childBridgeService.d.ts +30 -7
- package/dist/childBridgeService.d.ts.map +1 -0
- package/{lib → dist}/childBridgeService.js +127 -69
- package/dist/childBridgeService.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/externalPortService.d.ts +54 -0
- package/dist/externalPortService.d.ts.map +1 -0
- package/dist/externalPortService.js +125 -0
- package/dist/externalPortService.js.map +1 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/{lib → dist}/ipcService.d.ts +22 -5
- package/dist/ipcService.d.ts.map +1 -0
- package/{lib → dist}/ipcService.js +12 -12
- package/dist/ipcService.js.map +1 -0
- package/{lib → dist}/logger.d.ts +12 -6
- package/dist/logger.d.ts.map +1 -0
- package/{lib → dist}/logger.js +27 -28
- package/dist/logger.js.map +1 -0
- package/dist/matter/index.d.ts +123 -0
- package/dist/matter/index.d.ts.map +1 -0
- package/dist/matter/index.js +19 -0
- package/dist/matter/index.js.map +1 -0
- package/dist/matter/matterAccessoryCache.d.ts +96 -0
- package/dist/matter/matterAccessoryCache.d.ts.map +1 -0
- package/dist/matter/matterAccessoryCache.js +192 -0
- package/dist/matter/matterAccessoryCache.js.map +1 -0
- package/dist/matter/matterBehaviors.d.ts +194 -0
- package/dist/matter/matterBehaviors.d.ts.map +1 -0
- package/dist/matter/matterBehaviors.js +665 -0
- package/dist/matter/matterBehaviors.js.map +1 -0
- package/dist/matter/matterConfigValidator.d.ts +81 -0
- package/dist/matter/matterConfigValidator.d.ts.map +1 -0
- package/dist/matter/matterConfigValidator.js +240 -0
- package/dist/matter/matterConfigValidator.js.map +1 -0
- package/dist/matter/matterErrorHandler.d.ts +106 -0
- package/dist/matter/matterErrorHandler.d.ts.map +1 -0
- package/dist/matter/matterErrorHandler.js +495 -0
- package/dist/matter/matterErrorHandler.js.map +1 -0
- package/dist/matter/matterLogFormatter.d.ts +19 -0
- package/dist/matter/matterLogFormatter.d.ts.map +1 -0
- package/dist/matter/matterLogFormatter.js +144 -0
- package/dist/matter/matterLogFormatter.js.map +1 -0
- package/dist/matter/matterNetworkMonitor.d.ts +68 -0
- package/dist/matter/matterNetworkMonitor.d.ts.map +1 -0
- package/dist/matter/matterNetworkMonitor.js +249 -0
- package/dist/matter/matterNetworkMonitor.js.map +1 -0
- package/dist/matter/matterServer.d.ts +656 -0
- package/dist/matter/matterServer.d.ts.map +1 -0
- package/dist/matter/matterServer.js +1690 -0
- package/dist/matter/matterServer.js.map +1 -0
- package/dist/matter/matterServerHelpers.d.ts +81 -0
- package/dist/matter/matterServerHelpers.d.ts.map +1 -0
- package/dist/matter/matterServerHelpers.js +323 -0
- package/dist/matter/matterServerHelpers.js.map +1 -0
- package/dist/matter/matterSharedTypes.d.ts +170 -0
- package/dist/matter/matterSharedTypes.d.ts.map +1 -0
- package/dist/matter/matterSharedTypes.js +52 -0
- package/dist/matter/matterSharedTypes.js.map +1 -0
- package/dist/matter/matterStorage.d.ts +128 -0
- package/dist/matter/matterStorage.d.ts.map +1 -0
- package/dist/matter/matterStorage.js +415 -0
- package/dist/matter/matterStorage.js.map +1 -0
- package/dist/matter/matterTypes.d.ts +745 -0
- package/dist/matter/matterTypes.d.ts.map +1 -0
- package/dist/matter/matterTypes.js +174 -0
- package/dist/matter/matterTypes.js.map +1 -0
- package/{lib → dist}/platformAccessory.d.ts +8 -6
- package/dist/platformAccessory.d.ts.map +1 -0
- package/{lib → dist}/platformAccessory.js +19 -16
- package/dist/platformAccessory.js.map +1 -0
- package/{lib → dist}/plugin.d.ts +2 -3
- package/dist/plugin.d.ts.map +1 -0
- package/{lib → dist}/plugin.js +39 -51
- package/dist/plugin.js.map +1 -0
- package/{lib → dist}/pluginManager.d.ts +3 -3
- package/dist/pluginManager.d.ts.map +1 -0
- package/{lib → dist}/pluginManager.js +76 -81
- package/dist/pluginManager.js.map +1 -0
- package/{lib → dist}/server.d.ts +23 -1
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +811 -0
- package/dist/server.js.map +1 -0
- package/{lib → dist}/storageService.d.ts.map +1 -1
- package/dist/storageService.js +41 -0
- package/dist/storageService.js.map +1 -0
- package/{lib → dist}/user.d.ts +1 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +32 -0
- package/dist/user.js.map +1 -0
- package/{lib → dist}/util/mac.d.ts +1 -0
- package/dist/util/mac.d.ts.map +1 -0
- package/dist/util/mac.js +14 -0
- package/dist/util/mac.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +48 -49
- package/bin/homebridge +0 -17
- package/lib/api.d.ts +0 -210
- package/lib/api.d.ts.map +0 -1
- package/lib/api.js +0 -155
- package/lib/api.js.map +0 -1
- package/lib/bridgeService.d.ts.map +0 -1
- package/lib/bridgeService.js.map +0 -1
- package/lib/childBridgeFork.d.ts +0 -37
- package/lib/childBridgeFork.d.ts.map +0 -1
- package/lib/childBridgeFork.js +0 -244
- package/lib/childBridgeFork.js.map +0 -1
- package/lib/childBridgeService.d.ts.map +0 -1
- package/lib/childBridgeService.js.map +0 -1
- package/lib/cli.d.ts +0 -4
- package/lib/cli.d.ts.map +0 -1
- package/lib/cli.js +0 -111
- package/lib/cli.js.map +0 -1
- package/lib/externalPortService.d.ts +0 -33
- package/lib/externalPortService.d.ts.map +0 -1
- package/lib/externalPortService.js +0 -64
- package/lib/externalPortService.js.map +0 -1
- package/lib/index.d.ts +0 -76
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -72
- package/lib/index.js.map +0 -1
- package/lib/ipcService.d.ts.map +0 -1
- package/lib/ipcService.js.map +0 -1
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js.map +0 -1
- package/lib/platformAccessory.d.ts.map +0 -1
- package/lib/platformAccessory.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/pluginManager.d.ts.map +0 -1
- package/lib/pluginManager.js.map +0 -1
- package/lib/server.d.ts.map +0 -1
- package/lib/server.js +0 -457
- package/lib/server.js.map +0 -1
- package/lib/storageService.js +0 -70
- package/lib/storageService.js.map +0 -1
- package/lib/user.d.ts.map +0 -1
- package/lib/user.js +0 -36
- package/lib/user.js.map +0 -1
- package/lib/util/mac.d.ts.map +0 -1
- package/lib/util/mac.js +0 -20
- package/lib/util/mac.js.map +0 -1
- package/lib/version.d.ts.map +0 -1
- package/lib/version.js +0 -21
- package/lib/version.js.map +0 -1
- /package/{lib → dist}/storageService.d.ts +0 -0
- /package/{lib → dist}/version.d.ts +0 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
/* global NodeJS */
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { HAPStorage } from 'hap-nodejs';
|
|
4
|
+
import { HomebridgeAPI } from './api.js';
|
|
5
|
+
import { BridgeService } from './bridgeService.js';
|
|
6
|
+
import { ChildBridgeExternalPortService } from './externalPortService.js';
|
|
7
|
+
import { Logger } from './logger.js';
|
|
8
|
+
import { MatterServer } from './matter/index.js';
|
|
9
|
+
import { PluginManager } from './pluginManager.js';
|
|
10
|
+
import { User } from './user.js';
|
|
11
|
+
import { generate } from './util/mac.js';
|
|
12
|
+
import 'source-map-support/register.js';
|
|
13
|
+
/**
|
|
14
|
+
* This is a standalone script executed as a child process fork
|
|
15
|
+
*/
|
|
16
|
+
process.title = 'homebridge: child bridge';
|
|
17
|
+
export class ChildBridgeFork {
|
|
18
|
+
bridgeService;
|
|
19
|
+
api;
|
|
20
|
+
pluginManager;
|
|
21
|
+
externalPortService;
|
|
22
|
+
matterServer;
|
|
23
|
+
// External Matter servers for accessories that need their own bridge
|
|
24
|
+
externalMatterServers = new Map();
|
|
25
|
+
matterConfig;
|
|
26
|
+
matterSerialNumber;
|
|
27
|
+
type;
|
|
28
|
+
plugin;
|
|
29
|
+
identifier;
|
|
30
|
+
pluginConfig;
|
|
31
|
+
bridgeConfig;
|
|
32
|
+
bridgeOptions;
|
|
33
|
+
portRequestCallback = new Map();
|
|
34
|
+
constructor() {
|
|
35
|
+
// tell the parent process we are ready to accept plugin config
|
|
36
|
+
this.sendMessage("ready" /* ChildProcessMessageEventType.READY */);
|
|
37
|
+
}
|
|
38
|
+
sendMessage(type, data) {
|
|
39
|
+
if (process.send) {
|
|
40
|
+
process.send({
|
|
41
|
+
id: type,
|
|
42
|
+
data,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async loadPlugin(data) {
|
|
47
|
+
// set data
|
|
48
|
+
this.type = data.type;
|
|
49
|
+
this.identifier = data.identifier;
|
|
50
|
+
this.pluginConfig = data.pluginConfig;
|
|
51
|
+
this.bridgeConfig = data.bridgeConfig;
|
|
52
|
+
this.bridgeOptions = data.bridgeOptions;
|
|
53
|
+
// remove the _bridge key (some plugins do not like unknown config)
|
|
54
|
+
for (const config of this.pluginConfig) {
|
|
55
|
+
delete config._bridge;
|
|
56
|
+
}
|
|
57
|
+
// set bridge settings (inherited from main bridge)
|
|
58
|
+
if (this.bridgeOptions.noLogTimestamps) {
|
|
59
|
+
Logger.setTimestampEnabled(false);
|
|
60
|
+
}
|
|
61
|
+
if (this.bridgeOptions.debugModeEnabled) {
|
|
62
|
+
Logger.setDebugEnabled(true);
|
|
63
|
+
}
|
|
64
|
+
if (this.bridgeOptions.forceColourLogging) {
|
|
65
|
+
Logger.forceColor();
|
|
66
|
+
}
|
|
67
|
+
if (this.bridgeOptions.customStoragePath) {
|
|
68
|
+
User.setStoragePath(this.bridgeOptions.customStoragePath);
|
|
69
|
+
}
|
|
70
|
+
// Initialize HAP-NodeJS with a custom persist directory
|
|
71
|
+
HAPStorage.setCustomStoragePath(User.persistPath());
|
|
72
|
+
// load api
|
|
73
|
+
this.api = new HomebridgeAPI();
|
|
74
|
+
this.pluginManager = new PluginManager(this.api);
|
|
75
|
+
this.externalPortService = new ChildBridgeExternalPortService(this);
|
|
76
|
+
// load plugin
|
|
77
|
+
this.plugin = this.pluginManager.loadPlugin(data.pluginPath);
|
|
78
|
+
await this.plugin.load();
|
|
79
|
+
await this.pluginManager.initializePlugin(this.plugin, data.identifier);
|
|
80
|
+
// change process title to include plugin name
|
|
81
|
+
process.title = `homebridge: ${this.plugin.getPluginIdentifier()}`;
|
|
82
|
+
this.sendMessage("loaded" /* ChildProcessMessageEventType.LOADED */, {
|
|
83
|
+
version: this.plugin.version,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async startBridge() {
|
|
87
|
+
// Check if Matter is configured
|
|
88
|
+
this.matterConfig = this.bridgeConfig.matter;
|
|
89
|
+
// Initialize Matter if it's configured
|
|
90
|
+
if (this.matterConfig) {
|
|
91
|
+
Logger.internal.debug('Child bridge has Matter config (Combined HAP+Matter), starting Matter server');
|
|
92
|
+
// If Matter doesn't have a port configured, allocate one
|
|
93
|
+
if (!this.matterConfig.port) {
|
|
94
|
+
// Generate a unique username for Matter port allocation
|
|
95
|
+
const matterUsername = `${this.bridgeConfig.username}:MATTER`;
|
|
96
|
+
const matterPort = await this.externalPortService.requestPort(matterUsername);
|
|
97
|
+
if (!matterPort) {
|
|
98
|
+
throw new Error('Failed to allocate Matter port for child bridge. '
|
|
99
|
+
+ 'Please specify a port manually in the _bridge.matter configuration, or free up ports in the configured range.');
|
|
100
|
+
}
|
|
101
|
+
this.matterConfig.port = matterPort;
|
|
102
|
+
Logger.internal.debug(`Allocated Matter port: ${this.matterConfig.port} (HAP port: ${this.bridgeConfig.port})`);
|
|
103
|
+
}
|
|
104
|
+
// Start Matter server
|
|
105
|
+
await this.startMatterServer(this.matterConfig);
|
|
106
|
+
// Unified status with both HAP and Matter info will be sent when HAP bridge is advertised
|
|
107
|
+
}
|
|
108
|
+
this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, this.bridgeOptions, this.bridgeConfig);
|
|
109
|
+
// watch bridge events to check when server is online
|
|
110
|
+
this.bridgeService.bridge.on("advertised" /* AccessoryEventTypes.ADVERTISED */, () => {
|
|
111
|
+
this.sendPairedStatusEvent();
|
|
112
|
+
});
|
|
113
|
+
// watch for the paired event to update the server status
|
|
114
|
+
this.bridgeService.bridge.on("paired" /* AccessoryEventTypes.PAIRED */, () => {
|
|
115
|
+
this.sendPairedStatusEvent();
|
|
116
|
+
});
|
|
117
|
+
// watch for the unpaired event to update the server status
|
|
118
|
+
this.bridgeService.bridge.on("unpaired" /* AccessoryEventTypes.UNPAIRED */, () => {
|
|
119
|
+
this.sendPairedStatusEvent();
|
|
120
|
+
});
|
|
121
|
+
// load the cached accessories
|
|
122
|
+
await this.bridgeService.loadCachedPlatformAccessoriesFromDisk();
|
|
123
|
+
for (const config of this.pluginConfig) {
|
|
124
|
+
if (this.type === "platform" /* PluginType.PLATFORM */) {
|
|
125
|
+
const plugin = this.pluginManager.getPluginForPlatform(this.identifier);
|
|
126
|
+
const displayName = config.name || plugin.getPluginIdentifier();
|
|
127
|
+
const logger = Logger.withPrefix(displayName);
|
|
128
|
+
const constructor = plugin.getPlatformConstructor(this.identifier);
|
|
129
|
+
const platform = new constructor(logger, config, this.api);
|
|
130
|
+
if (HomebridgeAPI.isDynamicPlatformPlugin(platform)) {
|
|
131
|
+
plugin.assignDynamicPlatform(this.identifier, platform);
|
|
132
|
+
}
|
|
133
|
+
else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) { // Plugin 1.0, load accessories
|
|
134
|
+
await this.bridgeService.loadPlatformAccessories(plugin, platform, this.identifier, logger);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// otherwise it's a IndependentPlatformPlugin which doesn't expose any methods at all.
|
|
138
|
+
// We just call the constructor and let it be enabled.
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (this.type === "accessory" /* PluginType.ACCESSORY */) {
|
|
142
|
+
const plugin = this.pluginManager.getPluginForAccessory(this.identifier);
|
|
143
|
+
const displayName = config.name;
|
|
144
|
+
if (!displayName) {
|
|
145
|
+
Logger.internal.warn('Could not load accessory %s as it is missing the required \'name\' property!', this.identifier);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const logger = Logger.withPrefix(displayName);
|
|
149
|
+
const constructor = plugin.getAccessoryConstructor(this.identifier);
|
|
150
|
+
const accessoryInstance = new constructor(logger, config, this.api);
|
|
151
|
+
// pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
|
|
152
|
+
const accessory = this.bridgeService.createHAPAccessory(plugin, accessoryInstance, displayName, this.identifier, config.uuid_base);
|
|
153
|
+
if (accessory) {
|
|
154
|
+
this.bridgeService.bridge.addBridgedAccessory(accessory);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
logger('Accessory %s returned empty set of services. Won\'t adding it to the bridge!', this.identifier);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// restore the cached accessories
|
|
162
|
+
this.bridgeService.restoreCachedPlatformAccessories();
|
|
163
|
+
// Only restore Matter accessories if Matter is enabled for this bridge
|
|
164
|
+
if (this.matterServer) {
|
|
165
|
+
this.restoreCachedMatterAccessories();
|
|
166
|
+
}
|
|
167
|
+
this.bridgeService.publishBridge();
|
|
168
|
+
this.api.signalFinished();
|
|
169
|
+
// tell the parent we are online
|
|
170
|
+
this.sendMessage("online" /* ChildProcessMessageEventType.ONLINE */);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Request the next available external HAP port from the parent process
|
|
174
|
+
* @param username
|
|
175
|
+
*/
|
|
176
|
+
async requestExternalPort(username) {
|
|
177
|
+
return new Promise((resolve) => {
|
|
178
|
+
const requestTimeout = setTimeout(() => {
|
|
179
|
+
Logger.internal.warn('Parent process did not respond to port allocation request within 5 seconds - assigning random port.');
|
|
180
|
+
resolve(undefined);
|
|
181
|
+
}, 5000);
|
|
182
|
+
// setup callback
|
|
183
|
+
const callback = (port) => {
|
|
184
|
+
clearTimeout(requestTimeout);
|
|
185
|
+
resolve(port);
|
|
186
|
+
this.portRequestCallback.delete(username);
|
|
187
|
+
};
|
|
188
|
+
this.portRequestCallback.set(username, callback);
|
|
189
|
+
// send port request
|
|
190
|
+
this.sendMessage("portRequest" /* ChildProcessMessageEventType.PORT_REQUEST */, { username });
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Request the next available Matter port from the parent process
|
|
195
|
+
* @param uniqueId - MAC-derived identifier (without colons)
|
|
196
|
+
*/
|
|
197
|
+
async requestMatterPort(uniqueId) {
|
|
198
|
+
return new Promise((resolve) => {
|
|
199
|
+
const requestTimeout = setTimeout(() => {
|
|
200
|
+
Logger.internal.warn('Parent process did not respond to Matter port allocation request within 5 seconds - assigning random port.');
|
|
201
|
+
resolve(undefined);
|
|
202
|
+
}, 5000);
|
|
203
|
+
// Use uniqueId as the key for the callback map
|
|
204
|
+
const mac = uniqueId;
|
|
205
|
+
// setup callback
|
|
206
|
+
const callback = (port) => {
|
|
207
|
+
clearTimeout(requestTimeout);
|
|
208
|
+
resolve(port);
|
|
209
|
+
this.portRequestCallback.delete(mac);
|
|
210
|
+
};
|
|
211
|
+
this.portRequestCallback.set(mac, callback);
|
|
212
|
+
// send Matter port request
|
|
213
|
+
this.sendMessage("portRequest" /* ChildProcessMessageEventType.PORT_REQUEST */, {
|
|
214
|
+
username: mac,
|
|
215
|
+
portType: 'matter',
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Handles the port allocation response message from the parent process
|
|
221
|
+
* @param data
|
|
222
|
+
*/
|
|
223
|
+
handleExternalResponse(data) {
|
|
224
|
+
const callback = this.portRequestCallback.get(data.username);
|
|
225
|
+
if (callback) {
|
|
226
|
+
callback(data.port);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Sends the current pairing status of the child bridge to the parent process
|
|
231
|
+
*/
|
|
232
|
+
sendPairedStatusEvent() {
|
|
233
|
+
// Get Matter commissioning info if Matter is configured
|
|
234
|
+
let matterInfo;
|
|
235
|
+
if (this.matterConfig && this.matterServer) {
|
|
236
|
+
const commissioningInfo = this.matterServer.getCommissioningInfo();
|
|
237
|
+
matterInfo = {
|
|
238
|
+
qrCode: commissioningInfo.qrCode,
|
|
239
|
+
manualPairingCode: commissioningInfo.manualPairingCode,
|
|
240
|
+
serialNumber: this.matterSerialNumber || commissioningInfo.serialNumber,
|
|
241
|
+
commissioned: commissioningInfo.commissioned || false,
|
|
242
|
+
deviceCount: this.matterServer.getAccessories().length,
|
|
243
|
+
};
|
|
244
|
+
Logger.internal.debug('Including Matter info in unified status update');
|
|
245
|
+
}
|
|
246
|
+
this.sendMessage("status" /* ChildProcessMessageEventType.STATUS_UPDATE */, {
|
|
247
|
+
paired: this.bridgeService?.bridge?._accessoryInfo?.paired() ?? null,
|
|
248
|
+
setupUri: this.bridgeService?.bridge?.setupURI() ?? null,
|
|
249
|
+
// Include Matter commissioning info in unified message
|
|
250
|
+
...(matterInfo && { matter: matterInfo }),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Restore cached Matter accessories
|
|
255
|
+
*/
|
|
256
|
+
restoreCachedMatterAccessories() {
|
|
257
|
+
if (!this.matterServer) {
|
|
258
|
+
Logger.internal.debug('Matter server not available for restoring cached accessories');
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const cachedAccessories = this.matterServer.getAllCachedAccessories();
|
|
262
|
+
Logger.internal.debug(`Restoring ${cachedAccessories.length} cached Matter accessories`);
|
|
263
|
+
for (const cachedAccessory of cachedAccessories) {
|
|
264
|
+
let plugin = this.pluginManager.getPlugin(cachedAccessory.plugin);
|
|
265
|
+
if (!plugin) {
|
|
266
|
+
try {
|
|
267
|
+
// Try to find plugin by platform name (handles plugin renames)
|
|
268
|
+
plugin = this.pluginManager.getPluginByActiveDynamicPlatform(cachedAccessory.platform);
|
|
269
|
+
if (plugin) {
|
|
270
|
+
Logger.internal.info(`When searching for the associated plugin of the Matter accessory '${cachedAccessory.displayName}' `
|
|
271
|
+
+ `it seems like the plugin name changed from '${cachedAccessory.plugin}' to '${plugin.getPluginIdentifier()}'. Plugin association is now being transformed!`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
Logger.internal.warn(`Could not find the associated plugin for the Matter accessory '${cachedAccessory.displayName}'. `
|
|
276
|
+
+ `Tried to find the plugin by the platform name but ${error.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const platformPlugin = plugin && plugin.getActiveDynamicPlatform(cachedAccessory.platform);
|
|
280
|
+
if (!platformPlugin) {
|
|
281
|
+
Logger.internal.warn(`Failed to find plugin to handle Matter accessory ${cachedAccessory.displayName} (plugin: ${cachedAccessory.plugin}, platform: ${cachedAccessory.platform})`);
|
|
282
|
+
// Note: Matter accessories are not added to the bridge here - they're registered via plugin's didFinishLaunching
|
|
283
|
+
// The plugin can check if this accessory still exists and re-register or remove it
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Call configureMatterAccessory if the plugin implements it
|
|
287
|
+
if (platformPlugin.configureMatterAccessory) {
|
|
288
|
+
Logger.internal.debug(`Calling configureMatterAccessory for ${cachedAccessory.displayName}`);
|
|
289
|
+
platformPlugin.configureMatterAccessory(cachedAccessory);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
Logger.internal.debug(`Platform ${cachedAccessory.platform} does not implement configureMatterAccessory`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Start Matter server for child bridge
|
|
299
|
+
*/
|
|
300
|
+
async startMatterServer(matterConfig) {
|
|
301
|
+
Logger.internal.info('Starting Matter server in child bridge process');
|
|
302
|
+
// Create Matter server with the provided configuration
|
|
303
|
+
const serialNumber = this.bridgeConfig.username.replace(/:/g, '');
|
|
304
|
+
// Normalize bind config to array format
|
|
305
|
+
const networkInterfaces = this.bridgeConfig.bind
|
|
306
|
+
? Array.isArray(this.bridgeConfig.bind)
|
|
307
|
+
? this.bridgeConfig.bind
|
|
308
|
+
: [this.bridgeConfig.bind]
|
|
309
|
+
: undefined;
|
|
310
|
+
this.matterServer = new MatterServer({
|
|
311
|
+
port: matterConfig.port || 5540,
|
|
312
|
+
uniqueId: serialNumber,
|
|
313
|
+
storagePath: User.matterPath(),
|
|
314
|
+
debugModeEnabled: this.bridgeOptions.debugModeEnabled,
|
|
315
|
+
manufacturer: this.bridgeConfig.manufacturer,
|
|
316
|
+
model: this.bridgeConfig.model,
|
|
317
|
+
firmwareRevision: this.bridgeConfig.firmwareRevision,
|
|
318
|
+
serialNumber,
|
|
319
|
+
networkInterfaces,
|
|
320
|
+
});
|
|
321
|
+
await this.matterServer.start();
|
|
322
|
+
// Inform the API that Matter is enabled
|
|
323
|
+
this.api._setMatterEnabled(true);
|
|
324
|
+
// Set the Matter server reference for API methods like getAccessoryState
|
|
325
|
+
this.api._setMatterServer(this.matterServer);
|
|
326
|
+
const commissioningInfo = this.matterServer.getCommissioningInfo();
|
|
327
|
+
Logger.internal.info('Matter server started with commissioning info:', commissioningInfo);
|
|
328
|
+
// Store the serial number for status updates
|
|
329
|
+
this.matterSerialNumber = commissioningInfo.serialNumber;
|
|
330
|
+
// Listen for Matter commissioning events to update status
|
|
331
|
+
this.matterServer.on('commissioning-changed', (commissioned, fabricCount) => {
|
|
332
|
+
Logger.internal.info(`Matter commissioning state changed: commissioned=${commissioned}, fabricCount=${fabricCount}`);
|
|
333
|
+
this.sendPairedStatusEvent();
|
|
334
|
+
});
|
|
335
|
+
// Set up event listeners for Matter API calls
|
|
336
|
+
this.api.on("publishExternalMatterAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_MATTER_ACCESSORIES */, (accessories) => {
|
|
337
|
+
this.handlePublishExternalMatterAccessories(accessories).catch((error) => {
|
|
338
|
+
Logger.internal.error('Failed to publish external Matter accessories:', error);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
this.api.on("registerMatterPlatformAccessories" /* InternalAPIEvent.REGISTER_MATTER_PLATFORM_ACCESSORIES */, (pluginIdentifier, platformName, accessories) => {
|
|
342
|
+
if (this.matterServer) {
|
|
343
|
+
this.matterServer.registerPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
|
|
344
|
+
Logger.internal.error(`Failed to register Matter accessories for ${pluginIdentifier}:`, error);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
this.api.on("unregisterMatterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_MATTER_PLATFORM_ACCESSORIES */, (pluginIdentifier, platformName, accessories) => {
|
|
349
|
+
if (this.matterServer) {
|
|
350
|
+
this.matterServer.unregisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
|
|
351
|
+
Logger.internal.error(`Failed to unregister Matter accessories for ${pluginIdentifier}:`, error);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
this.api.on("updateMatterAccessoryState" /* InternalAPIEvent.UPDATE_MATTER_ACCESSORY_STATE */, (uuid, cluster, attributes, partId) => {
|
|
356
|
+
// Check if this is an external accessory first (each has its own MatterServer)
|
|
357
|
+
if (this.externalMatterServers.has(uuid)) {
|
|
358
|
+
const externalServer = this.externalMatterServers.get(uuid);
|
|
359
|
+
externalServer.updateAccessoryState(uuid, cluster, attributes, partId).catch((error) => {
|
|
360
|
+
Logger.internal.error(`Failed to update Matter accessory state for external accessory ${uuid}:`, error);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
else if (this.matterServer) {
|
|
364
|
+
// Otherwise, try the main child bridge Matter server
|
|
365
|
+
this.matterServer.updateAccessoryState(uuid, cluster, attributes, partId).catch((error) => {
|
|
366
|
+
Logger.internal.error(`Failed to update Matter accessory state for ${uuid}:`, error);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Handle external Matter accessories - each gets its own dedicated Matter server
|
|
373
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
374
|
+
* requires to be on their own bridge.
|
|
375
|
+
*/
|
|
376
|
+
async handlePublishExternalMatterAccessories(accessories) {
|
|
377
|
+
Logger.internal.info(`Publishing ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'} from child bridge`);
|
|
378
|
+
for (const accessory of accessories) {
|
|
379
|
+
try {
|
|
380
|
+
// Validate accessory has required fields
|
|
381
|
+
if (!accessory.uuid) {
|
|
382
|
+
Logger.internal.error('External Matter accessory missing UUID - skipping');
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
if (!accessory.displayName) {
|
|
386
|
+
Logger.internal.error(`External Matter accessory ${accessory.uuid} missing displayName - skipping`);
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
// Check if already published
|
|
390
|
+
if (this.externalMatterServers.has(accessory.uuid)) {
|
|
391
|
+
Logger.internal.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is already published`);
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
// Generate deterministic MAC address from UUID (same pattern as HAP external accessories)
|
|
395
|
+
const advertiseAddress = generate(accessory.uuid);
|
|
396
|
+
// For Matter, use the MAC without colons as uniqueId
|
|
397
|
+
const uniqueId = advertiseAddress.replace(/:/g, '');
|
|
398
|
+
// Allocate Matter port from parent process via IPC
|
|
399
|
+
const port = await this.externalPortService.requestMatterPort(uniqueId);
|
|
400
|
+
if (!port) {
|
|
401
|
+
Logger.internal.error(`Failed to allocate Matter port for external Matter accessory ${accessory.displayName}`);
|
|
402
|
+
Logger.internal.error('Please configure matterPorts in config.json or free up ports in the default range (5530-5541)');
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
Logger.internal.info(`Allocated port ${port} for external Matter accessory: ${accessory.displayName}`);
|
|
406
|
+
// Normalize bind config to array format (inherit from bridge)
|
|
407
|
+
const networkInterfaces = this.bridgeConfig.bind
|
|
408
|
+
? Array.isArray(this.bridgeConfig.bind)
|
|
409
|
+
? this.bridgeConfig.bind
|
|
410
|
+
: [this.bridgeConfig.bind]
|
|
411
|
+
: undefined;
|
|
412
|
+
// Create dedicated Matter server for this accessory
|
|
413
|
+
const matterServer = new MatterServer({
|
|
414
|
+
port,
|
|
415
|
+
uniqueId,
|
|
416
|
+
storagePath: User.matterPath(),
|
|
417
|
+
manufacturer: accessory.manufacturer,
|
|
418
|
+
model: accessory.model,
|
|
419
|
+
firmwareRevision: accessory.firmwareRevision,
|
|
420
|
+
serialNumber: accessory.serialNumber || uniqueId, // Use uniqueId as fallback serial number
|
|
421
|
+
debugModeEnabled: this.bridgeOptions.debugModeEnabled,
|
|
422
|
+
externalAccessory: true, // external accessory, so added before server runs
|
|
423
|
+
networkInterfaces,
|
|
424
|
+
});
|
|
425
|
+
// Start the Matter server (but don't run it yet due to externalAccessory mode)
|
|
426
|
+
await matterServer.start();
|
|
427
|
+
// Get plugin identifier from accessory
|
|
428
|
+
const pluginIdentifier = accessory._associatedPlugin || 'unknown';
|
|
429
|
+
// Register the accessory to this dedicated server
|
|
430
|
+
await matterServer.registerPlatformAccessories(pluginIdentifier, 'ExternalMatter', [accessory]);
|
|
431
|
+
// Now run the server with the device already attached (required for external accessories)
|
|
432
|
+
await matterServer.runServer();
|
|
433
|
+
// Store the server instance
|
|
434
|
+
this.externalMatterServers.set(accessory.uuid, matterServer);
|
|
435
|
+
Logger.internal.info(`✓ External Matter accessory published: ${accessory.displayName} on port ${port}`);
|
|
436
|
+
// Log commissioning info
|
|
437
|
+
const commissioningInfo = matterServer.getCommissioningInfo();
|
|
438
|
+
if (commissioningInfo.qrCode && commissioningInfo.manualPairingCode) {
|
|
439
|
+
Logger.internal.info(`📱 Commissioning codes for ${accessory.displayName}:`);
|
|
440
|
+
Logger.internal.info(` QR Code: ${commissioningInfo.qrCode}`);
|
|
441
|
+
Logger.internal.info(` Manual Code: ${commissioningInfo.manualPairingCode}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
Logger.internal.error(`Failed to publish external Matter accessory ${accessory.displayName}:`, error);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Handle metadata request from parent process
|
|
451
|
+
* Sends unified HAP+Matter status
|
|
452
|
+
*/
|
|
453
|
+
handleMetadataRequest() {
|
|
454
|
+
// Send unified status with both HAP and Matter information
|
|
455
|
+
this.sendPairedStatusEvent();
|
|
456
|
+
}
|
|
457
|
+
shutdown() {
|
|
458
|
+
this.bridgeService.teardown();
|
|
459
|
+
// Stop main Matter server if it was initialized
|
|
460
|
+
if (this.matterServer && typeof this.matterServer.stop === 'function') {
|
|
461
|
+
Logger.internal.debug('Stopping Matter server');
|
|
462
|
+
this.matterServer.stop().catch((error) => {
|
|
463
|
+
Logger.internal.error('Error stopping Matter server:', error);
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
// Stop all external Matter servers
|
|
467
|
+
for (const [uuid, matterServer] of this.externalMatterServers) {
|
|
468
|
+
Logger.internal.debug(`Stopping external Matter server for ${uuid}`);
|
|
469
|
+
matterServer.stop().catch((error) => {
|
|
470
|
+
Logger.internal.error(`Error stopping external Matter server for ${uuid}:`, error);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
this.externalMatterServers.clear();
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Start Self
|
|
478
|
+
*/
|
|
479
|
+
const childPluginFork = new ChildBridgeFork();
|
|
480
|
+
/**
|
|
481
|
+
* Handle incoming IPC messages from the parent Homebridge process
|
|
482
|
+
*/
|
|
483
|
+
process.on('message', (message) => {
|
|
484
|
+
if (typeof message !== 'object' || !message.id) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
switch (message.id) {
|
|
488
|
+
case "load" /* ChildProcessMessageEventType.LOAD */: {
|
|
489
|
+
childPluginFork.loadPlugin(message.data);
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
case "start" /* ChildProcessMessageEventType.START */: {
|
|
493
|
+
childPluginFork.startBridge();
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
case "portAllocated" /* ChildProcessMessageEventType.PORT_ALLOCATED */: {
|
|
497
|
+
childPluginFork.handleExternalResponse(message.data);
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
/**
|
|
503
|
+
* Handle the sigterm shutdown signals
|
|
504
|
+
*/
|
|
505
|
+
let shuttingDown = false;
|
|
506
|
+
function signalHandler(signal, signalNum) {
|
|
507
|
+
if (shuttingDown) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
shuttingDown = true;
|
|
511
|
+
Logger.internal.info('Got %s, shutting down child bridge process...', signal);
|
|
512
|
+
try {
|
|
513
|
+
childPluginFork.shutdown();
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
// do nothing
|
|
517
|
+
}
|
|
518
|
+
setTimeout(() => process.exit(128 + signalNum), 5000);
|
|
519
|
+
}
|
|
520
|
+
process.on('SIGINT', signalHandler.bind(undefined, 'SIGINT', 2));
|
|
521
|
+
process.on('SIGTERM', signalHandler.bind(undefined, 'SIGTERM', 15));
|
|
522
|
+
/**
|
|
523
|
+
* Ensure orphaned processes are cleaned up
|
|
524
|
+
*/
|
|
525
|
+
setInterval(() => {
|
|
526
|
+
if (!process.connected) {
|
|
527
|
+
Logger.internal.info('Parent process not connected, terminating process...');
|
|
528
|
+
process.exit(1);
|
|
529
|
+
}
|
|
530
|
+
}, 5000);
|
|
531
|
+
//# sourceMappingURL=childBridgeFork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeFork.js","sourceRoot":"","sources":["../src/childBridgeFork.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { MacAddress } from
|
|
2
|
-
import { HomebridgeAPI
|
|
3
|
-
import { AccessoryConfig, BridgeConfiguration, BridgeOptions, HomebridgeConfig, PlatformConfig } from
|
|
4
|
-
import { ExternalPortService } from
|
|
5
|
-
import { IpcService } from
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import type { MacAddress } from 'hap-nodejs';
|
|
2
|
+
import type { HomebridgeAPI } from './api.js';
|
|
3
|
+
import type { AccessoryConfig, BridgeConfiguration, BridgeOptions, HomebridgeConfig, PlatformConfig } from './bridgeService.js';
|
|
4
|
+
import type { ExternalPortService } from './externalPortService.js';
|
|
5
|
+
import type { IpcService } from './ipcService.js';
|
|
6
|
+
import type { MatterConfig } from './matter/index.js';
|
|
7
|
+
import type { Plugin } from './plugin.js';
|
|
8
|
+
import type { HomebridgeOptions } from './server.js';
|
|
9
|
+
import { PluginType } from './api.js';
|
|
8
10
|
export declare const enum ChildProcessMessageEventType {
|
|
9
11
|
/**
|
|
10
12
|
* Sent from the child process when it is ready to accept config
|
|
@@ -71,6 +73,7 @@ export interface ChildProcessPluginLoadedEventData {
|
|
|
71
73
|
}
|
|
72
74
|
export interface ChildProcessPortRequestEventData {
|
|
73
75
|
username: MacAddress;
|
|
76
|
+
portType?: 'hap' | 'matter';
|
|
74
77
|
}
|
|
75
78
|
export interface ChildProcessPortAllocatedEventData {
|
|
76
79
|
username: MacAddress;
|
|
@@ -80,17 +83,34 @@ export interface ChildBridgePairedStatusEventData {
|
|
|
80
83
|
paired: boolean | null;
|
|
81
84
|
setupUri: string | null;
|
|
82
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Child bridge metadata
|
|
88
|
+
*
|
|
89
|
+
* Contains all metadata for a child bridge, including HAP properties
|
|
90
|
+
* like paired status, setupUri, and pin.
|
|
91
|
+
*
|
|
92
|
+
* When Matter is enabled (_bridge.matter is configured), this interface
|
|
93
|
+
* also includes Matter commissioning information for unified status reporting.
|
|
94
|
+
*/
|
|
83
95
|
export interface ChildMetadata {
|
|
84
96
|
status: ChildBridgeStatus;
|
|
85
97
|
paired?: boolean | null;
|
|
86
98
|
setupUri?: string | null;
|
|
87
99
|
username: MacAddress;
|
|
100
|
+
port?: number;
|
|
88
101
|
pin: string;
|
|
89
102
|
name: string;
|
|
90
103
|
plugin: string;
|
|
91
104
|
identifier: string;
|
|
92
105
|
manuallyStopped: boolean;
|
|
93
106
|
pid?: number;
|
|
107
|
+
matterConfig?: MatterConfig;
|
|
108
|
+
matterIdentifier?: string;
|
|
109
|
+
matterSetupUri?: string;
|
|
110
|
+
matterPin?: string;
|
|
111
|
+
matterSerialNumber?: string;
|
|
112
|
+
matterCommissioned?: boolean;
|
|
113
|
+
matterDeviceCount?: number;
|
|
94
114
|
}
|
|
95
115
|
/**
|
|
96
116
|
* Manages the child processes of platforms/accessories being exposed as separate forked bridges.
|
|
@@ -114,9 +134,12 @@ export declare class ChildBridgeService {
|
|
|
114
134
|
private pairedStatus;
|
|
115
135
|
private manuallyStopped;
|
|
116
136
|
private setupUri;
|
|
137
|
+
private matterCommissioningInfo?;
|
|
117
138
|
private pluginConfig;
|
|
118
139
|
private log;
|
|
119
140
|
private displayName?;
|
|
141
|
+
private restartCount;
|
|
142
|
+
private readonly maxRestarts;
|
|
120
143
|
constructor(type: PluginType, identifier: string, plugin: Plugin, bridgeConfig: BridgeConfiguration, homebridgeConfig: HomebridgeConfig, homebridgeOptions: HomebridgeOptions, api: HomebridgeAPI, ipcService: IpcService, externalPortService: ExternalPortService);
|
|
121
144
|
/**
|
|
122
145
|
* Start the child bridge service
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeService.d.ts","sourceRoot":"","sources":["../src/childBridgeService.ts"],"names":[],"mappings":"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"}
|