homebridge 2.0.0-alpha.4 → 2.0.0-alpha.41
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 +1 -1
- package/bin/homebridge.js +22 -0
- package/dist/api.d.ts +210 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +140 -0
- package/dist/api.js.map +1 -0
- package/dist/bridgeService.d.ts +122 -0
- package/dist/bridgeService.d.ts.map +1 -0
- package/dist/bridgeService.js +396 -0
- package/dist/bridgeService.js.map +1 -0
- package/dist/childBridgeFork.d.ts +38 -0
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/dist/childBridgeFork.js +241 -2
- package/dist/childBridgeFork.js.map +1 -7
- package/dist/childBridgeService.d.ts +204 -0
- package/dist/childBridgeService.d.ts.map +1 -0
- package/dist/childBridgeService.js +452 -0
- package/dist/childBridgeService.js.map +1 -0
- package/dist/childMatterBridgeFork.d.ts +108 -0
- package/dist/childMatterBridgeFork.d.ts.map +1 -0
- package/dist/childMatterBridgeFork.js +330 -0
- package/dist/childMatterBridgeFork.js.map +1 -0
- package/dist/childMatterBridgeService.d.ts +166 -0
- package/dist/childMatterBridgeService.d.ts.map +1 -0
- package/dist/childMatterBridgeService.js +623 -0
- package/dist/childMatterBridgeService.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -2
- package/dist/cli.js.map +1 -7
- package/dist/externalPortService.d.ts +33 -0
- package/dist/externalPortService.d.ts.map +1 -0
- package/dist/externalPortService.js +59 -0
- package/dist/externalPortService.js.map +1 -0
- package/dist/index.d.ts +90 -1099
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -7
- package/dist/ipcService.d.ts +46 -0
- package/dist/ipcService.d.ts.map +1 -0
- package/dist/ipcService.js +62 -0
- package/dist/ipcService.js.map +1 -0
- package/dist/logger.d.ts +78 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +138 -0
- package/dist/logger.js.map +1 -0
- package/dist/matter/index.d.ts +13 -0
- package/dist/matter/index.d.ts.map +1 -0
- package/dist/matter/index.js +12 -0
- package/dist/matter/index.js.map +1 -0
- package/dist/matter/matterBridge.d.ts +64 -0
- package/dist/matter/matterBridge.d.ts.map +1 -0
- package/dist/matter/matterBridge.js +154 -0
- package/dist/matter/matterBridge.js.map +1 -0
- package/dist/matter/matterConfigValidator.d.ts +27 -0
- package/dist/matter/matterConfigValidator.d.ts.map +1 -0
- package/dist/matter/matterConfigValidator.js +162 -0
- package/dist/matter/matterConfigValidator.js.map +1 -0
- package/dist/matter/matterDevice.d.ts +107 -0
- package/dist/matter/matterDevice.d.ts.map +1 -0
- package/dist/matter/matterDevice.js +913 -0
- package/dist/matter/matterDevice.js.map +1 -0
- package/dist/matter/matterDiagnostics.d.ts +121 -0
- package/dist/matter/matterDiagnostics.d.ts.map +1 -0
- package/dist/matter/matterDiagnostics.js +323 -0
- package/dist/matter/matterDiagnostics.js.map +1 -0
- package/dist/matter/matterErrorHandler.d.ts +113 -0
- package/dist/matter/matterErrorHandler.d.ts.map +1 -0
- package/dist/matter/matterErrorHandler.js +482 -0
- package/dist/matter/matterErrorHandler.js.map +1 -0
- package/dist/matter/matterNetworkMonitor.d.ts +65 -0
- package/dist/matter/matterNetworkMonitor.d.ts.map +1 -0
- package/dist/matter/matterNetworkMonitor.js +227 -0
- package/dist/matter/matterNetworkMonitor.js.map +1 -0
- package/dist/matter/matterServer.d.ts +110 -0
- package/dist/matter/matterServer.d.ts.map +1 -0
- package/dist/matter/matterServer.js +584 -0
- package/dist/matter/matterServer.js.map +1 -0
- package/dist/matter/matterSharedTypes.d.ts +167 -0
- package/dist/matter/matterSharedTypes.d.ts.map +1 -0
- package/dist/matter/matterSharedTypes.js +55 -0
- package/dist/matter/matterSharedTypes.js.map +1 -0
- package/dist/matter/matterTypes.d.ts +35 -0
- package/dist/matter/matterTypes.d.ts.map +1 -0
- package/dist/matter/matterTypes.js +278 -0
- package/dist/matter/matterTypes.js.map +1 -0
- package/dist/matter/portAllocator.d.ts +85 -0
- package/dist/matter/portAllocator.d.ts.map +1 -0
- package/dist/matter/portAllocator.js +296 -0
- package/dist/matter/portAllocator.js.map +1 -0
- package/dist/platformAccessory.d.ts +56 -0
- package/dist/platformAccessory.d.ts.map +1 -0
- package/dist/platformAccessory.js +105 -0
- package/dist/platformAccessory.js.map +1 -0
- package/dist/plugin.d.ts +30 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +182 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pluginManager.d.ts +77 -0
- package/dist/pluginManager.d.ts.map +1 -0
- package/dist/pluginManager.js +375 -0
- package/dist/pluginManager.js.map +1 -0
- package/dist/server.d.ts +67 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +799 -0
- package/dist/server.js.map +1 -0
- package/dist/storageService.d.ts +13 -0
- package/dist/storageService.d.ts.map +1 -0
- package/dist/storageService.js +41 -0
- package/dist/storageService.js.map +1 -0
- package/dist/user.d.ts +13 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +29 -0
- package/dist/user.js.map +1 -0
- package/dist/util/mac.d.ts +5 -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 +3 -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 +31 -34
- package/bin/homebridge +0 -19
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { fork } from 'node:child_process';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
import { Logger } from './logger.js';
|
|
7
|
+
import { User } from './user.js';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
11
|
+
export var ChildProcessMessageEventType;
|
|
12
|
+
(function (ChildProcessMessageEventType) {
|
|
13
|
+
/**
|
|
14
|
+
* Sent from the child process when it is ready to accept config
|
|
15
|
+
*/
|
|
16
|
+
ChildProcessMessageEventType["READY"] = "ready";
|
|
17
|
+
/**
|
|
18
|
+
* Sent to the child process with a ChildProcessLoadEventData payload
|
|
19
|
+
*/
|
|
20
|
+
ChildProcessMessageEventType["LOAD"] = "load";
|
|
21
|
+
/**
|
|
22
|
+
* Sent from the child process once it has loaded the plugin
|
|
23
|
+
*/
|
|
24
|
+
ChildProcessMessageEventType["LOADED"] = "loaded";
|
|
25
|
+
/**
|
|
26
|
+
* Sent to the child process telling it to start
|
|
27
|
+
*/
|
|
28
|
+
ChildProcessMessageEventType["START"] = "start";
|
|
29
|
+
/**
|
|
30
|
+
* Sent from the child process when the bridge is online
|
|
31
|
+
*/
|
|
32
|
+
ChildProcessMessageEventType["ONLINE"] = "online";
|
|
33
|
+
/**
|
|
34
|
+
* Sent from the child when it wants to request port allocation for an external accessory
|
|
35
|
+
*/
|
|
36
|
+
ChildProcessMessageEventType["PORT_REQUEST"] = "portRequest";
|
|
37
|
+
/**
|
|
38
|
+
* Sent from the parent with the port allocation response
|
|
39
|
+
*/
|
|
40
|
+
ChildProcessMessageEventType["PORT_ALLOCATED"] = "portAllocated";
|
|
41
|
+
/**
|
|
42
|
+
* Sent from the child to update its current status
|
|
43
|
+
*/
|
|
44
|
+
ChildProcessMessageEventType["STATUS_UPDATE"] = "status";
|
|
45
|
+
})(ChildProcessMessageEventType || (ChildProcessMessageEventType = {}));
|
|
46
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
47
|
+
export var ChildBridgeStatus;
|
|
48
|
+
(function (ChildBridgeStatus) {
|
|
49
|
+
/**
|
|
50
|
+
* When the child bridge is loading, or restarting
|
|
51
|
+
*/
|
|
52
|
+
ChildBridgeStatus["PENDING"] = "pending";
|
|
53
|
+
/**
|
|
54
|
+
* The child bridge is online and has published it's accessory
|
|
55
|
+
*/
|
|
56
|
+
ChildBridgeStatus["OK"] = "ok";
|
|
57
|
+
/**
|
|
58
|
+
* The bridge is shutting down, or the process ended unexpectedly
|
|
59
|
+
*/
|
|
60
|
+
ChildBridgeStatus["DOWN"] = "down";
|
|
61
|
+
})(ChildBridgeStatus || (ChildBridgeStatus = {}));
|
|
62
|
+
/**
|
|
63
|
+
* Manages the child processes of platforms/accessories being exposed as separate forked bridges.
|
|
64
|
+
* A child bridge runs a single platform or accessory.
|
|
65
|
+
*/
|
|
66
|
+
export class ChildBridgeService {
|
|
67
|
+
type;
|
|
68
|
+
identifier;
|
|
69
|
+
plugin;
|
|
70
|
+
bridgeConfig;
|
|
71
|
+
homebridgeConfig;
|
|
72
|
+
homebridgeOptions;
|
|
73
|
+
api;
|
|
74
|
+
ipcService;
|
|
75
|
+
externalPortService;
|
|
76
|
+
child;
|
|
77
|
+
args = [];
|
|
78
|
+
processEnv = {};
|
|
79
|
+
shuttingDown = false;
|
|
80
|
+
lastBridgeStatus = "pending" /* ChildBridgeStatus.PENDING */;
|
|
81
|
+
pairedStatus = null;
|
|
82
|
+
manuallyStopped = false;
|
|
83
|
+
setupUri = null;
|
|
84
|
+
pluginConfig = [];
|
|
85
|
+
log;
|
|
86
|
+
displayName;
|
|
87
|
+
restartCount = 0;
|
|
88
|
+
maxRestarts = 4;
|
|
89
|
+
constructor(type, identifier, plugin, bridgeConfig, homebridgeConfig, homebridgeOptions, api, ipcService, externalPortService) {
|
|
90
|
+
this.type = type;
|
|
91
|
+
this.identifier = identifier;
|
|
92
|
+
this.plugin = plugin;
|
|
93
|
+
this.bridgeConfig = bridgeConfig;
|
|
94
|
+
this.homebridgeConfig = homebridgeConfig;
|
|
95
|
+
this.homebridgeOptions = homebridgeOptions;
|
|
96
|
+
this.api = api;
|
|
97
|
+
this.ipcService = ipcService;
|
|
98
|
+
this.externalPortService = externalPortService;
|
|
99
|
+
this.log = Logger.withPrefix(this.plugin.getPluginIdentifier());
|
|
100
|
+
this.api.on('shutdown', () => {
|
|
101
|
+
this.shuttingDown = true;
|
|
102
|
+
this.teardown();
|
|
103
|
+
});
|
|
104
|
+
// make sure we don't hit the max listeners limit
|
|
105
|
+
this.api.setMaxListeners(this.api.getMaxListeners() + 1);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Start the child bridge service
|
|
109
|
+
*/
|
|
110
|
+
start() {
|
|
111
|
+
this.setProcessFlags();
|
|
112
|
+
this.setProcessEnv();
|
|
113
|
+
this.startChildProcess();
|
|
114
|
+
// set display name
|
|
115
|
+
if (this.pluginConfig.length > 1 || this.pluginConfig.length === 0) {
|
|
116
|
+
this.displayName = this.plugin.getPluginIdentifier();
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.displayName = this.pluginConfig[0]?.name || this.plugin.getPluginIdentifier();
|
|
120
|
+
}
|
|
121
|
+
// re-configured log with display name
|
|
122
|
+
this.log = Logger.withPrefix(this.displayName);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Add a config block to a child bridge.
|
|
126
|
+
* Platform child bridges can only contain one config block.
|
|
127
|
+
* @param config
|
|
128
|
+
*/
|
|
129
|
+
addConfig(config) {
|
|
130
|
+
this.pluginConfig.push(config);
|
|
131
|
+
}
|
|
132
|
+
get bridgeStatus() {
|
|
133
|
+
return this.lastBridgeStatus;
|
|
134
|
+
}
|
|
135
|
+
set bridgeStatus(value) {
|
|
136
|
+
this.lastBridgeStatus = value;
|
|
137
|
+
this.sendStatusUpdate();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Start the child bridge process
|
|
141
|
+
*/
|
|
142
|
+
startChildProcess() {
|
|
143
|
+
this.bridgeStatus = "pending" /* ChildBridgeStatus.PENDING */;
|
|
144
|
+
this.child = fork(resolve(__dirname, 'childBridgeFork.js'), this.args, this.processEnv);
|
|
145
|
+
this.child.stdout?.on('data', (data) => {
|
|
146
|
+
process.stdout.write(data);
|
|
147
|
+
});
|
|
148
|
+
this.child.stderr?.on('data', (data) => {
|
|
149
|
+
process.stderr.write(data);
|
|
150
|
+
});
|
|
151
|
+
this.child.on('error', (e) => {
|
|
152
|
+
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
153
|
+
this.log.error('Child bridge process error', e);
|
|
154
|
+
});
|
|
155
|
+
this.child.once('close', (code, signal) => {
|
|
156
|
+
this.handleProcessClose(code, signal);
|
|
157
|
+
});
|
|
158
|
+
// handle incoming ipc messages from the child process
|
|
159
|
+
this.child.on('message', (message) => {
|
|
160
|
+
if (typeof message !== 'object' || !message.id) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
switch (message.id) {
|
|
164
|
+
case "ready" /* ChildProcessMessageEventType.READY */: {
|
|
165
|
+
this.log(`Child bridge starting${this.child?.pid ? ` (pid ${this.child.pid})` : ''}...`);
|
|
166
|
+
this.loadPlugin();
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case "loaded" /* ChildProcessMessageEventType.LOADED */: {
|
|
170
|
+
const version = message.data.version;
|
|
171
|
+
if (this.pluginConfig.length > 1) {
|
|
172
|
+
this.log.success(`Child bridge started successfully with ${this.pluginConfig.length} accessories (plugin v${version}).`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.log.success(`Child bridge started successfully (plugin v${version}).`);
|
|
176
|
+
}
|
|
177
|
+
this.startBridge();
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "online" /* ChildProcessMessageEventType.ONLINE */: {
|
|
181
|
+
this.bridgeStatus = "ok" /* ChildBridgeStatus.OK */;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "portRequest" /* ChildProcessMessageEventType.PORT_REQUEST */: {
|
|
185
|
+
this.handlePortRequest(message.data);
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
case "status" /* ChildProcessMessageEventType.STATUS_UPDATE */: {
|
|
189
|
+
this.pairedStatus = message.data.paired;
|
|
190
|
+
this.setupUri = message.data.setupUri;
|
|
191
|
+
this.sendStatusUpdate();
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Called when the child bridge process exits, if Homebridge is not shutting down, it will restart the process
|
|
199
|
+
* @param code
|
|
200
|
+
* @param signal
|
|
201
|
+
*/
|
|
202
|
+
handleProcessClose(code, signal) {
|
|
203
|
+
const isLikelyPluginCrash = code === 1 && signal === null;
|
|
204
|
+
this.log.warn(`Child bridge ended (code ${code}, signal ${signal}).${isLikelyPluginCrash
|
|
205
|
+
? ' The child bridge ended unexpectedly, which is normally due to the plugin not catching its errors properly. Please report this to the plugin developer by clicking on the'
|
|
206
|
+
+ ' \'Report An Issue\' option in the plugin menu dropdown from the Homebridge UI. If there are related logs shown above, please include them in your report.'
|
|
207
|
+
: ''}`);
|
|
208
|
+
if (isLikelyPluginCrash) {
|
|
209
|
+
if (this.restartCount < this.maxRestarts) {
|
|
210
|
+
this.bridgeStatus = "pending" /* ChildBridgeStatus.PENDING */;
|
|
211
|
+
this.restartCount += 1;
|
|
212
|
+
const delay = this.restartCount * 10; // first attempt after 10 seconds, second after 20 seconds, etc.
|
|
213
|
+
this.log(`Child bridge will automatically restart in ${delay} seconds (restart attempt ${this.restartCount} of ${this.maxRestarts}).`);
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
if (!this.shuttingDown) {
|
|
216
|
+
this.startChildProcess();
|
|
217
|
+
}
|
|
218
|
+
}, delay * 1000);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
222
|
+
this.manuallyStopped = true;
|
|
223
|
+
this.log.error(`Child bridge will no longer restart after failing ${this.maxRestarts + 1} times, you will need to manually start this child bridge from the Homebridge UI.`);
|
|
224
|
+
}
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (!this.shuttingDown) {
|
|
228
|
+
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
229
|
+
this.restartCount = 0;
|
|
230
|
+
this.startChildProcess();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Helper function to send a message to the child process
|
|
235
|
+
* @param type
|
|
236
|
+
* @param data
|
|
237
|
+
*/
|
|
238
|
+
sendMessage(type, data) {
|
|
239
|
+
if (this.child && this.child.connected) {
|
|
240
|
+
this.child.send({
|
|
241
|
+
id: type,
|
|
242
|
+
data,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Some plugins may make use of the homebridge process flags
|
|
248
|
+
* These will be passed through to the forked process
|
|
249
|
+
*/
|
|
250
|
+
setProcessFlags() {
|
|
251
|
+
if (this.bridgeConfig.debugModeEnabled) {
|
|
252
|
+
this.args.push('-D');
|
|
253
|
+
}
|
|
254
|
+
if (this.homebridgeOptions.forceColourLogging) {
|
|
255
|
+
this.args.push('-C');
|
|
256
|
+
}
|
|
257
|
+
if (this.homebridgeOptions.insecureAccess) {
|
|
258
|
+
this.args.push('-I');
|
|
259
|
+
}
|
|
260
|
+
if (this.homebridgeOptions.noLogTimestamps) {
|
|
261
|
+
this.args.push('-T');
|
|
262
|
+
}
|
|
263
|
+
if (this.homebridgeOptions.keepOrphanedCachedAccessories) {
|
|
264
|
+
this.args.push('-K');
|
|
265
|
+
}
|
|
266
|
+
if (this.homebridgeOptions.customStoragePath) {
|
|
267
|
+
this.args.push('-U', this.homebridgeOptions.customStoragePath);
|
|
268
|
+
}
|
|
269
|
+
if (this.homebridgeOptions.customPluginPath) {
|
|
270
|
+
this.args.push('-P', this.homebridgeOptions.customPluginPath);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Set environment variables for the child process
|
|
275
|
+
*/
|
|
276
|
+
setProcessEnv() {
|
|
277
|
+
this.processEnv = {
|
|
278
|
+
env: {
|
|
279
|
+
...process.env,
|
|
280
|
+
DEBUG: `${process.env.DEBUG || ''} ${this.bridgeConfig.env?.DEBUG || ''}`.trim(),
|
|
281
|
+
NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} ${this.bridgeConfig.env?.NODE_OPTIONS || ''}`.trim(),
|
|
282
|
+
},
|
|
283
|
+
silent: true,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Tell the child process to load the given plugin
|
|
288
|
+
*/
|
|
289
|
+
loadPlugin() {
|
|
290
|
+
const bridgeConfig = {
|
|
291
|
+
name: this.bridgeConfig.name || this.displayName || this.plugin.getPluginIdentifier(),
|
|
292
|
+
port: this.bridgeConfig.port,
|
|
293
|
+
username: this.bridgeConfig.username,
|
|
294
|
+
advertiser: this.homebridgeConfig.bridge.advertiser,
|
|
295
|
+
pin: this.bridgeConfig.pin || this.homebridgeConfig.bridge.pin,
|
|
296
|
+
bind: this.homebridgeConfig.bridge.bind,
|
|
297
|
+
setupID: this.bridgeConfig.setupID,
|
|
298
|
+
manufacturer: this.bridgeConfig.manufacturer || this.homebridgeConfig.bridge.manufacturer,
|
|
299
|
+
model: this.bridgeConfig.model || this.homebridgeConfig.bridge.model,
|
|
300
|
+
firmwareRevision: this.bridgeConfig.firmwareRevision || this.homebridgeConfig.bridge.firmwareRevision,
|
|
301
|
+
serialNumber: this.bridgeConfig.serialNumber || this.bridgeConfig.username,
|
|
302
|
+
};
|
|
303
|
+
const bridgeOptions = {
|
|
304
|
+
cachedAccessoriesDir: User.cachedAccessoryPath(),
|
|
305
|
+
cachedAccessoriesItemName: `cachedAccessories.${this.bridgeConfig.username.replace(/:/g, '').toUpperCase()}`,
|
|
306
|
+
};
|
|
307
|
+
// shallow copy the homebridge options to the bridge options object
|
|
308
|
+
Object.assign(bridgeOptions, this.homebridgeOptions);
|
|
309
|
+
this.sendMessage("load" /* ChildProcessMessageEventType.LOAD */, {
|
|
310
|
+
type: this.type,
|
|
311
|
+
identifier: this.identifier,
|
|
312
|
+
pluginPath: this.plugin.getPluginPath(),
|
|
313
|
+
pluginConfig: this.pluginConfig,
|
|
314
|
+
bridgeConfig,
|
|
315
|
+
bridgeOptions,
|
|
316
|
+
homebridgeConfig: {
|
|
317
|
+
bridge: this.homebridgeConfig.bridge,
|
|
318
|
+
ports: this.homebridgeConfig.ports,
|
|
319
|
+
disabledPlugins: [], // not used by child bridges
|
|
320
|
+
accessories: [], // not used by child bridges
|
|
321
|
+
platforms: [], // not used by child bridges
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Tell the child bridge to start broadcasting
|
|
327
|
+
*/
|
|
328
|
+
startBridge() {
|
|
329
|
+
this.sendMessage("start" /* ChildProcessMessageEventType.START */);
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Handle external port requests from child
|
|
333
|
+
*/
|
|
334
|
+
async handlePortRequest(request) {
|
|
335
|
+
const port = await this.externalPortService.requestPort(request.username);
|
|
336
|
+
this.sendMessage("portAllocated" /* ChildProcessMessageEventType.PORT_ALLOCATED */, {
|
|
337
|
+
username: request.username,
|
|
338
|
+
port,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Send sigterm to the child bridge
|
|
343
|
+
*/
|
|
344
|
+
teardown() {
|
|
345
|
+
if (this.child && this.child.connected) {
|
|
346
|
+
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
347
|
+
this.child.kill('SIGTERM');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Trigger sending child bridge metadata to the process parent via IPC
|
|
352
|
+
*/
|
|
353
|
+
sendStatusUpdate() {
|
|
354
|
+
this.ipcService.sendMessage("childBridgeStatusUpdate" /* IpcOutgoingEvent.CHILD_BRIDGE_STATUS_UPDATE */, this.getMetadata());
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Restarts the child bridge process
|
|
358
|
+
*/
|
|
359
|
+
restartChildBridge() {
|
|
360
|
+
if (this.manuallyStopped) {
|
|
361
|
+
this.restartCount = 0;
|
|
362
|
+
this.startChildBridge();
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
this.log.warn('Child bridge restarting...');
|
|
366
|
+
this.refreshConfig();
|
|
367
|
+
this.teardown();
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Stops the child bridge, not starting it again
|
|
372
|
+
*/
|
|
373
|
+
stopChildBridge() {
|
|
374
|
+
if (!this.shuttingDown) {
|
|
375
|
+
this.log.warn('Child bridge stopping, will not restart.');
|
|
376
|
+
this.shuttingDown = true;
|
|
377
|
+
this.manuallyStopped = true;
|
|
378
|
+
this.restartCount = 0;
|
|
379
|
+
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
380
|
+
this.child?.removeAllListeners('close');
|
|
381
|
+
this.teardown();
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
this.log.warn('Child bridge already shutting down or stopped.');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Starts the child bridge, only if it was manually stopped and is no longer running
|
|
389
|
+
*/
|
|
390
|
+
startChildBridge() {
|
|
391
|
+
if (this.manuallyStopped && this.bridgeStatus === "down" /* ChildBridgeStatus.DOWN */ && (!this.child || !this.child.connected)) {
|
|
392
|
+
this.refreshConfig();
|
|
393
|
+
this.startChildProcess();
|
|
394
|
+
this.shuttingDown = false;
|
|
395
|
+
this.manuallyStopped = false;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
this.log.warn('Child bridge cannot be started, it is still running or was not manually stopped.');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Read the config.json file from disk and refresh the plugin config block for just this plugin
|
|
403
|
+
*/
|
|
404
|
+
async refreshConfig() {
|
|
405
|
+
try {
|
|
406
|
+
const homebridgeConfig = await fs.readJson(User.configPath());
|
|
407
|
+
if (this.type === "platform" /* PluginType.PLATFORM */) {
|
|
408
|
+
const config = homebridgeConfig.platforms?.filter(x => x.platform === this.identifier && x._bridge?.username === this.bridgeConfig.username);
|
|
409
|
+
if (config.length) {
|
|
410
|
+
this.pluginConfig = config;
|
|
411
|
+
this.bridgeConfig = this.pluginConfig[0]._bridge || this.bridgeConfig;
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
this.log.warn('Platform config could not be found, using existing config.');
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
else if (this.type === "accessory" /* PluginType.ACCESSORY */) {
|
|
418
|
+
const config = homebridgeConfig.accessories?.filter(x => x.accessory === this.identifier && x._bridge?.username === this.bridgeConfig.username);
|
|
419
|
+
if (config.length) {
|
|
420
|
+
this.pluginConfig = config;
|
|
421
|
+
this.bridgeConfig = this.pluginConfig[0]._bridge || this.bridgeConfig;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
this.log.warn('Accessory config could not be found, using existing config.');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
this.log.error('Failed to refresh plugin config:', error.message);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Returns metadata about this child bridge
|
|
434
|
+
*/
|
|
435
|
+
getMetadata() {
|
|
436
|
+
return {
|
|
437
|
+
type: 'hap', // Explicitly identify as HAP bridge
|
|
438
|
+
status: this.bridgeStatus,
|
|
439
|
+
paired: this.pairedStatus,
|
|
440
|
+
setupUri: this.setupUri,
|
|
441
|
+
username: this.bridgeConfig.username,
|
|
442
|
+
port: this.bridgeConfig.port,
|
|
443
|
+
pin: this.bridgeConfig.pin || this.homebridgeConfig.bridge.pin,
|
|
444
|
+
name: this.bridgeConfig.name || this.displayName || this.plugin.getPluginIdentifier(),
|
|
445
|
+
plugin: this.plugin.getPluginIdentifier(),
|
|
446
|
+
identifier: this.identifier,
|
|
447
|
+
pid: this.child?.pid,
|
|
448
|
+
manuallyStopped: this.manuallyStopped,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=childBridgeService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeService.js","sourceRoot":"","sources":["../src/childBridgeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child Matter Bridge Fork
|
|
3
|
+
*
|
|
4
|
+
* This is a standalone script executed as a child process fork
|
|
5
|
+
* specifically for running Matter bridges in isolation
|
|
6
|
+
*/
|
|
7
|
+
import type { AccessoryConfig, HomebridgeConfig, PlatformConfig } from './bridgeService.js';
|
|
8
|
+
import { PluginType } from './api.js';
|
|
9
|
+
import 'source-map-support/register.js';
|
|
10
|
+
export { ChildMatterMessageType } from './matter/matterSharedTypes.js';
|
|
11
|
+
export interface ChildMatterLoadEventData {
|
|
12
|
+
type: PluginType;
|
|
13
|
+
identifier: string;
|
|
14
|
+
pluginPath: string;
|
|
15
|
+
pluginConfig: PlatformConfig | AccessoryConfig;
|
|
16
|
+
matterConfig: {
|
|
17
|
+
port?: number;
|
|
18
|
+
name?: string;
|
|
19
|
+
};
|
|
20
|
+
homebridgeConfig: HomebridgeConfig;
|
|
21
|
+
bridgeOptions: any;
|
|
22
|
+
}
|
|
23
|
+
export interface ChildMatterStatusEventData {
|
|
24
|
+
status: 'pending' | 'ok' | 'down';
|
|
25
|
+
port?: number;
|
|
26
|
+
qrCode?: string;
|
|
27
|
+
manualPairingCode?: string;
|
|
28
|
+
serialNumber?: string;
|
|
29
|
+
deviceCount: number;
|
|
30
|
+
commissioned?: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ChildMatterPortRequestEventData {
|
|
34
|
+
identifier: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ChildMatterPortAllocatedEventData {
|
|
37
|
+
port: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ChildMatterAccessoryEventData {
|
|
40
|
+
accessory: any;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Child Matter Bridge Fork - runs in separate process
|
|
44
|
+
*/
|
|
45
|
+
export declare class ChildMatterBridgeFork {
|
|
46
|
+
private matterServer;
|
|
47
|
+
private api;
|
|
48
|
+
private pluginManager;
|
|
49
|
+
private type;
|
|
50
|
+
private plugin;
|
|
51
|
+
private identifier;
|
|
52
|
+
private pluginConfig;
|
|
53
|
+
private matterConfig;
|
|
54
|
+
private _homebridgeConfig;
|
|
55
|
+
private bridgeOptions;
|
|
56
|
+
private accessories;
|
|
57
|
+
private portRequestCallbacks;
|
|
58
|
+
constructor();
|
|
59
|
+
/**
|
|
60
|
+
* Send message to parent process
|
|
61
|
+
*/
|
|
62
|
+
private sendMessage;
|
|
63
|
+
/**
|
|
64
|
+
* Handle messages from parent process
|
|
65
|
+
*/
|
|
66
|
+
private handleMessage;
|
|
67
|
+
/**
|
|
68
|
+
* Load the plugin and configuration
|
|
69
|
+
*/
|
|
70
|
+
private loadPlugin;
|
|
71
|
+
/**
|
|
72
|
+
* Start the Matter bridge
|
|
73
|
+
*/
|
|
74
|
+
private startMatterBridge;
|
|
75
|
+
/**
|
|
76
|
+
* Initialize platform to get accessories
|
|
77
|
+
*/
|
|
78
|
+
private initializePlatform;
|
|
79
|
+
/**
|
|
80
|
+
* Add an accessory to the Matter bridge
|
|
81
|
+
*/
|
|
82
|
+
private addAccessory;
|
|
83
|
+
/**
|
|
84
|
+
* Add accessory to Matter server
|
|
85
|
+
*/
|
|
86
|
+
private addAccessoryToMatter;
|
|
87
|
+
/**
|
|
88
|
+
* Remove an accessory from the Matter bridge
|
|
89
|
+
*/
|
|
90
|
+
private removeAccessory;
|
|
91
|
+
/**
|
|
92
|
+
* Remove accessory from Matter server
|
|
93
|
+
*/
|
|
94
|
+
private removeAccessoryFromMatter;
|
|
95
|
+
/**
|
|
96
|
+
* Request a port from the parent process
|
|
97
|
+
*/
|
|
98
|
+
requestPort(identifier: string): Promise<number | undefined>;
|
|
99
|
+
/**
|
|
100
|
+
* Handle port allocation response
|
|
101
|
+
*/
|
|
102
|
+
private handlePortAllocated;
|
|
103
|
+
/**
|
|
104
|
+
* Shutdown the child process
|
|
105
|
+
*/
|
|
106
|
+
private shutdown;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=childMatterBridgeFork.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childMatterBridgeFork.d.ts","sourceRoot":"","sources":["../src/childMatterBridgeFork.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACf,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAmC,UAAU,EAAE,MAAM,UAAU,CAAA;AAQtE,OAAO,gCAAgC,CAAA;AAGvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAEtE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,cAAc,GAAG,eAAe,CAAA;IAC9C,YAAY,EAAE;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,aAAa,EAAE,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,GAAG,CAAA;CACf;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,aAAa,CAAM;IAE3B,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,oBAAoB,CAA6D;;IAuBzF;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;YACW,aAAa;IAgC3B;;OAEG;YACW,UAAU;IAiDxB;;OAEG;YACW,iBAAiB;IA6D/B;;OAEG;YACW,kBAAkB;IAiChC;;OAEG;YACW,YAAY;IAM1B;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;YACW,eAAe;IAK7B;;OAEG;YACW,yBAAyB;IA0BvC;;OAEG;IACU,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBzE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;YACW,QAAQ;CAUvB"}
|