homebridge 2.0.0-alpha.3 → 2.0.0-alpha.5
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 +8 -6
- package/config-sample.json +3 -3
- package/{lib → dist}/api.d.ts +23 -40
- package/dist/api.d.ts.map +1 -0
- package/{lib → dist}/api.js +38 -64
- package/dist/api.js.map +1 -0
- package/{lib → dist}/bridgeService.d.ts +10 -9
- package/dist/bridgeService.d.ts.map +1 -0
- package/{lib → dist}/bridgeService.js +79 -121
- package/dist/bridgeService.js.map +1 -0
- package/{lib → dist}/childBridgeFork.d.ts +4 -3
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/{lib → dist}/childBridgeFork.js +38 -41
- package/dist/childBridgeFork.js.map +1 -0
- package/{lib → dist}/childBridgeService.d.ts +8 -7
- package/dist/childBridgeService.d.ts.map +1 -0
- package/{lib → dist}/childBridgeService.js +54 -55
- 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 +89 -0
- package/dist/cli.js.map +1 -0
- package/{lib → dist}/externalPortService.d.ts +2 -2
- package/{lib → dist}/externalPortService.d.ts.map +1 -1
- package/{lib → dist}/externalPortService.js +4 -9
- package/dist/externalPortService.js.map +1 -0
- package/{lib → dist}/index.d.ts +29 -29
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/{lib → dist}/ipcService.d.ts +2 -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 +6 -6
- package/dist/logger.d.ts.map +1 -0
- package/{lib → dist}/logger.js +19 -28
- package/dist/logger.js.map +1 -0
- package/{lib → dist}/platformAccessory.d.ts +7 -6
- package/dist/platformAccessory.d.ts.map +1 -0
- package/{lib → dist}/platformAccessory.js +12 -16
- package/dist/platformAccessory.js.map +1 -0
- package/{lib → dist}/plugin.d.ts +2 -2
- package/dist/plugin.d.ts.map +1 -0
- package/{lib → dist}/plugin.js +36 -45
- 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 +72 -78
- package/dist/pluginManager.js.map +1 -0
- package/dist/server.d.ts.map +1 -0
- package/{lib → dist}/server.js +89 -116
- 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.map +1 -1
- package/dist/user.js +29 -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 +42 -42
- package/lib/api.d.ts.map +0 -1
- 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.map +0 -1
- 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 -115
- package/lib/cli.js.map +0 -1
- package/lib/externalPortService.js.map +0 -1
- 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.map +0 -1
- package/lib/storageService.js +0 -70
- package/lib/storageService.js.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}/server.d.ts +0 -0
- /package/{lib → dist}/storageService.d.ts +0 -0
- /package/{lib → dist}/user.d.ts +0 -0
- /package/{lib → dist}/version.d.ts +0 -0
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/* global NodeJS */
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { HAPStorage } from 'hap-nodejs';
|
|
4
|
+
import 'source-map-support/register.js';
|
|
5
|
+
import { HomebridgeAPI } from './api.js';
|
|
6
|
+
import { BridgeService } from './bridgeService.js';
|
|
7
|
+
import { ChildBridgeExternalPortService } from './externalPortService.js';
|
|
8
|
+
import { Logger } from './logger.js';
|
|
9
|
+
import { PluginManager } from './pluginManager.js';
|
|
10
|
+
import { User } from './user.js';
|
|
4
11
|
/**
|
|
5
12
|
* This is a standalone script executed as a child process fork
|
|
6
13
|
*/
|
|
7
|
-
process.title =
|
|
8
|
-
|
|
9
|
-
require("source-map-support/register");
|
|
10
|
-
const hap_nodejs_1 = require("hap-nodejs");
|
|
11
|
-
const api_1 = require("./api");
|
|
12
|
-
const bridgeService_1 = require("./bridgeService");
|
|
13
|
-
const externalPortService_1 = require("./externalPortService");
|
|
14
|
-
const logger_1 = require("./logger");
|
|
15
|
-
const pluginManager_1 = require("./pluginManager");
|
|
16
|
-
const user_1 = require("./user");
|
|
17
|
-
class ChildBridgeFork {
|
|
14
|
+
process.title = 'homebridge: child bridge';
|
|
15
|
+
export class ChildBridgeFork {
|
|
18
16
|
bridgeService;
|
|
19
17
|
api;
|
|
20
18
|
pluginManager;
|
|
@@ -53,23 +51,23 @@ class ChildBridgeFork {
|
|
|
53
51
|
}
|
|
54
52
|
// set bridge settings (inherited from main bridge)
|
|
55
53
|
if (this.bridgeOptions.noLogTimestamps) {
|
|
56
|
-
|
|
54
|
+
Logger.setTimestampEnabled(false);
|
|
57
55
|
}
|
|
58
56
|
if (this.bridgeOptions.debugModeEnabled) {
|
|
59
|
-
|
|
57
|
+
Logger.setDebugEnabled(true);
|
|
60
58
|
}
|
|
61
59
|
if (this.bridgeOptions.forceColourLogging) {
|
|
62
|
-
|
|
60
|
+
Logger.forceColor();
|
|
63
61
|
}
|
|
64
62
|
if (this.bridgeOptions.customStoragePath) {
|
|
65
|
-
|
|
63
|
+
User.setStoragePath(this.bridgeOptions.customStoragePath);
|
|
66
64
|
}
|
|
67
65
|
// Initialize HAP-NodeJS with a custom persist directory
|
|
68
|
-
|
|
66
|
+
HAPStorage.setCustomStoragePath(User.persistPath());
|
|
69
67
|
// load api
|
|
70
|
-
this.api = new
|
|
71
|
-
this.pluginManager = new
|
|
72
|
-
this.externalPortService = new
|
|
68
|
+
this.api = new HomebridgeAPI();
|
|
69
|
+
this.pluginManager = new PluginManager(this.api);
|
|
70
|
+
this.externalPortService = new ChildBridgeExternalPortService(this);
|
|
73
71
|
// load plugin
|
|
74
72
|
this.plugin = this.pluginManager.loadPlugin(data.pluginPath);
|
|
75
73
|
await this.plugin.load();
|
|
@@ -81,7 +79,7 @@ class ChildBridgeFork {
|
|
|
81
79
|
});
|
|
82
80
|
}
|
|
83
81
|
async startBridge() {
|
|
84
|
-
this.bridgeService = new
|
|
82
|
+
this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, this.bridgeOptions, this.bridgeConfig, this.homebridgeConfig);
|
|
85
83
|
// watch bridge events to check when server is online
|
|
86
84
|
this.bridgeService.bridge.on("advertised" /* AccessoryEventTypes.ADVERTISED */, () => {
|
|
87
85
|
this.sendPairedStatusEvent();
|
|
@@ -100,13 +98,13 @@ class ChildBridgeFork {
|
|
|
100
98
|
if (this.type === "platform" /* PluginType.PLATFORM */) {
|
|
101
99
|
const plugin = this.pluginManager.getPluginForPlatform(this.identifier);
|
|
102
100
|
const displayName = config.name || plugin.getPluginIdentifier();
|
|
103
|
-
const logger =
|
|
101
|
+
const logger = Logger.withPrefix(displayName);
|
|
104
102
|
const constructor = plugin.getPlatformConstructor(this.identifier);
|
|
105
103
|
const platform = new constructor(logger, config, this.api);
|
|
106
|
-
if (
|
|
104
|
+
if (HomebridgeAPI.isDynamicPlatformPlugin(platform)) {
|
|
107
105
|
plugin.assignDynamicPlatform(this.identifier, platform);
|
|
108
106
|
}
|
|
109
|
-
else if (
|
|
107
|
+
else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) { // Plugin 1.0, load accessories
|
|
110
108
|
await this.bridgeService.loadPlatformAccessories(plugin, platform, this.identifier, logger);
|
|
111
109
|
}
|
|
112
110
|
else {
|
|
@@ -118,19 +116,19 @@ class ChildBridgeFork {
|
|
|
118
116
|
const plugin = this.pluginManager.getPluginForAccessory(this.identifier);
|
|
119
117
|
const displayName = config.name;
|
|
120
118
|
if (!displayName) {
|
|
121
|
-
|
|
119
|
+
Logger.internal.warn('Could not load accessory %s as it is missing the required \'name\' property!', this.identifier);
|
|
122
120
|
return;
|
|
123
121
|
}
|
|
124
|
-
const logger =
|
|
122
|
+
const logger = Logger.withPrefix(displayName);
|
|
125
123
|
const constructor = plugin.getAccessoryConstructor(this.identifier);
|
|
126
124
|
const accessoryInstance = new constructor(logger, config, this.api);
|
|
127
|
-
//pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
|
|
125
|
+
// pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
|
|
128
126
|
const accessory = this.bridgeService.createHAPAccessory(plugin, accessoryInstance, displayName, this.identifier, config.uuid_base);
|
|
129
127
|
if (accessory) {
|
|
130
128
|
this.bridgeService.bridge.addBridgedAccessory(accessory);
|
|
131
129
|
}
|
|
132
130
|
else {
|
|
133
|
-
logger(
|
|
131
|
+
logger('Accessory %s returned empty set of services. Won\'t adding it to the bridge!', this.identifier);
|
|
134
132
|
}
|
|
135
133
|
}
|
|
136
134
|
}
|
|
@@ -148,7 +146,7 @@ class ChildBridgeFork {
|
|
|
148
146
|
async requestExternalPort(username) {
|
|
149
147
|
return new Promise((resolve) => {
|
|
150
148
|
const requestTimeout = setTimeout(() => {
|
|
151
|
-
|
|
149
|
+
Logger.internal.warn('Parent process did not respond to port allocation request within 5 seconds - assigning random port.');
|
|
152
150
|
resolve(undefined);
|
|
153
151
|
}, 5000);
|
|
154
152
|
// setup callback
|
|
@@ -185,7 +183,6 @@ class ChildBridgeFork {
|
|
|
185
183
|
this.bridgeService.teardown();
|
|
186
184
|
}
|
|
187
185
|
}
|
|
188
|
-
exports.ChildBridgeFork = ChildBridgeFork;
|
|
189
186
|
/**
|
|
190
187
|
* Start Self
|
|
191
188
|
*/
|
|
@@ -193,8 +190,8 @@ const childPluginFork = new ChildBridgeFork();
|
|
|
193
190
|
/**
|
|
194
191
|
* Handle incoming IPC messages from the parent Homebridge process
|
|
195
192
|
*/
|
|
196
|
-
process.on(
|
|
197
|
-
if (typeof message !==
|
|
193
|
+
process.on('message', (message) => {
|
|
194
|
+
if (typeof message !== 'object' || !message.id) {
|
|
198
195
|
return;
|
|
199
196
|
}
|
|
200
197
|
switch (message.id) {
|
|
@@ -216,28 +213,28 @@ process.on("message", (message) => {
|
|
|
216
213
|
* Handle the sigterm shutdown signals
|
|
217
214
|
*/
|
|
218
215
|
let shuttingDown = false;
|
|
219
|
-
|
|
216
|
+
function signalHandler(signal, signalNum) {
|
|
220
217
|
if (shuttingDown) {
|
|
221
218
|
return;
|
|
222
219
|
}
|
|
223
220
|
shuttingDown = true;
|
|
224
|
-
|
|
221
|
+
Logger.internal.info('Got %s, shutting down child bridge process...', signal);
|
|
225
222
|
try {
|
|
226
223
|
childPluginFork.shutdown();
|
|
227
224
|
}
|
|
228
|
-
catch (
|
|
225
|
+
catch (error) {
|
|
229
226
|
// do nothing
|
|
230
227
|
}
|
|
231
228
|
setTimeout(() => process.exit(128 + signalNum), 5000);
|
|
232
|
-
}
|
|
233
|
-
process.on(
|
|
234
|
-
process.on(
|
|
229
|
+
}
|
|
230
|
+
process.on('SIGINT', signalHandler.bind(undefined, 'SIGINT', 2));
|
|
231
|
+
process.on('SIGTERM', signalHandler.bind(undefined, 'SIGTERM', 15));
|
|
235
232
|
/**
|
|
236
233
|
* Ensure orphaned processes are cleaned up
|
|
237
234
|
*/
|
|
238
235
|
setInterval(() => {
|
|
239
236
|
if (!process.connected) {
|
|
240
|
-
|
|
237
|
+
Logger.internal.info('Parent process not connected, terminating process...');
|
|
241
238
|
process.exit(1);
|
|
242
239
|
}
|
|
243
240
|
}, 5000);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeFork.js","sourceRoot":"","sources":["../src/childBridgeFork.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
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 { Plugin } from
|
|
7
|
-
import { HomebridgeOptions } from
|
|
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 { Plugin } from './plugin.js';
|
|
7
|
+
import type { HomebridgeOptions } from './server.js';
|
|
8
|
+
import { PluginType } from './api.js';
|
|
8
9
|
export declare const enum ChildProcessMessageEventType {
|
|
9
10
|
/**
|
|
10
11
|
* Sent from the child process when it is ready to accept config
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeService.d.ts","sourceRoot":"","sources":["../src/childBridgeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var ChildProcessMessageEventType;
|
|
1
|
+
import child_process from 'node:child_process';
|
|
2
|
+
import path, { dirname } 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;
|
|
13
12
|
(function (ChildProcessMessageEventType) {
|
|
14
13
|
/**
|
|
15
14
|
* Sent from the child process when it is ready to accept config
|
|
@@ -43,8 +42,9 @@ var ChildProcessMessageEventType;
|
|
|
43
42
|
* Sent from the child to update its current status
|
|
44
43
|
*/
|
|
45
44
|
ChildProcessMessageEventType["STATUS_UPDATE"] = "status";
|
|
46
|
-
})(ChildProcessMessageEventType || (
|
|
47
|
-
|
|
45
|
+
})(ChildProcessMessageEventType || (ChildProcessMessageEventType = {}));
|
|
46
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
47
|
+
export var ChildBridgeStatus;
|
|
48
48
|
(function (ChildBridgeStatus) {
|
|
49
49
|
/**
|
|
50
50
|
* When the child bridge is loading, or restarting
|
|
@@ -58,12 +58,12 @@ var ChildBridgeStatus;
|
|
|
58
58
|
* The bridge is shutting down, or the process ended unexpectedly
|
|
59
59
|
*/
|
|
60
60
|
ChildBridgeStatus["DOWN"] = "down";
|
|
61
|
-
})(ChildBridgeStatus || (
|
|
61
|
+
})(ChildBridgeStatus || (ChildBridgeStatus = {}));
|
|
62
62
|
/**
|
|
63
63
|
* Manages the child processes of platforms/accessories being exposed as separate forked bridges.
|
|
64
64
|
* A child bridge runs a single platform or accessory.
|
|
65
65
|
*/
|
|
66
|
-
class ChildBridgeService {
|
|
66
|
+
export class ChildBridgeService {
|
|
67
67
|
type;
|
|
68
68
|
identifier;
|
|
69
69
|
plugin;
|
|
@@ -94,8 +94,8 @@ class ChildBridgeService {
|
|
|
94
94
|
this.api = api;
|
|
95
95
|
this.ipcService = ipcService;
|
|
96
96
|
this.externalPortService = externalPortService;
|
|
97
|
-
this.log =
|
|
98
|
-
this.api.on(
|
|
97
|
+
this.log = Logger.withPrefix(this.plugin.getPluginIdentifier());
|
|
98
|
+
this.api.on('shutdown', () => {
|
|
99
99
|
this.shuttingDown = true;
|
|
100
100
|
this.teardown();
|
|
101
101
|
});
|
|
@@ -117,7 +117,7 @@ class ChildBridgeService {
|
|
|
117
117
|
this.displayName = this.pluginConfig[0]?.name || this.plugin.getPluginIdentifier();
|
|
118
118
|
}
|
|
119
119
|
// re-configured log with display name
|
|
120
|
-
this.log =
|
|
120
|
+
this.log = Logger.withPrefix(this.displayName);
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
123
|
* Add a config block to a child bridge.
|
|
@@ -139,27 +139,27 @@ class ChildBridgeService {
|
|
|
139
139
|
*/
|
|
140
140
|
startChildProcess() {
|
|
141
141
|
this.bridgeStatus = "pending" /* ChildBridgeStatus.PENDING */;
|
|
142
|
-
this.child =
|
|
143
|
-
this.child.stdout?.on(
|
|
142
|
+
this.child = child_process.fork(path.resolve(__dirname, 'childBridgeFork.js'), this.args, this.processEnv);
|
|
143
|
+
this.child.stdout?.on('data', (data) => {
|
|
144
144
|
process.stdout.write(data);
|
|
145
145
|
});
|
|
146
|
-
this.child.stderr?.on(
|
|
146
|
+
this.child.stderr?.on('data', (data) => {
|
|
147
147
|
process.stderr.write(data);
|
|
148
148
|
});
|
|
149
|
-
this.child.on(
|
|
150
|
-
this.log.warn(
|
|
149
|
+
this.child.on('exit', () => {
|
|
150
|
+
this.log.warn('Child bridge process ended');
|
|
151
151
|
});
|
|
152
|
-
this.child.on(
|
|
152
|
+
this.child.on('error', (e) => {
|
|
153
153
|
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
154
|
-
this.log.error(
|
|
154
|
+
this.log.error('Child process error', e);
|
|
155
155
|
});
|
|
156
|
-
this.child.once(
|
|
156
|
+
this.child.once('close', (code, signal) => {
|
|
157
157
|
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
158
158
|
this.handleProcessClose(code, signal);
|
|
159
159
|
});
|
|
160
160
|
// handle incoming ipc messages from the child process
|
|
161
|
-
this.child.on(
|
|
162
|
-
if (typeof message !==
|
|
161
|
+
this.child.on('message', (message) => {
|
|
162
|
+
if (typeof message !== 'object' || !message.id) {
|
|
163
163
|
return;
|
|
164
164
|
}
|
|
165
165
|
switch (message.id) {
|
|
@@ -205,7 +205,7 @@ class ChildBridgeService {
|
|
|
205
205
|
this.log(`Process Ended. Code: ${code}, Signal: ${signal}`);
|
|
206
206
|
setTimeout(() => {
|
|
207
207
|
if (!this.shuttingDown) {
|
|
208
|
-
this.log(
|
|
208
|
+
this.log('Restarting Process...');
|
|
209
209
|
this.startChildProcess();
|
|
210
210
|
}
|
|
211
211
|
}, 7000);
|
|
@@ -229,25 +229,25 @@ class ChildBridgeService {
|
|
|
229
229
|
*/
|
|
230
230
|
setProcessFlags() {
|
|
231
231
|
if (this.homebridgeOptions.debugModeEnabled) {
|
|
232
|
-
this.args.push(
|
|
232
|
+
this.args.push('-D');
|
|
233
233
|
}
|
|
234
234
|
if (this.homebridgeOptions.forceColourLogging) {
|
|
235
|
-
this.args.push(
|
|
235
|
+
this.args.push('-C');
|
|
236
236
|
}
|
|
237
237
|
if (this.homebridgeOptions.insecureAccess) {
|
|
238
|
-
this.args.push(
|
|
238
|
+
this.args.push('-I');
|
|
239
239
|
}
|
|
240
240
|
if (this.homebridgeOptions.noLogTimestamps) {
|
|
241
|
-
this.args.push(
|
|
241
|
+
this.args.push('-T');
|
|
242
242
|
}
|
|
243
243
|
if (this.homebridgeOptions.keepOrphanedCachedAccessories) {
|
|
244
|
-
this.args.push(
|
|
244
|
+
this.args.push('-K');
|
|
245
245
|
}
|
|
246
246
|
if (this.homebridgeOptions.customStoragePath) {
|
|
247
|
-
this.args.push(
|
|
247
|
+
this.args.push('-U', this.homebridgeOptions.customStoragePath);
|
|
248
248
|
}
|
|
249
249
|
if (this.homebridgeOptions.customPluginPath) {
|
|
250
|
-
this.args.push(
|
|
250
|
+
this.args.push('-P', this.homebridgeOptions.customPluginPath);
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
/**
|
|
@@ -257,8 +257,8 @@ class ChildBridgeService {
|
|
|
257
257
|
this.processEnv = {
|
|
258
258
|
env: {
|
|
259
259
|
...process.env,
|
|
260
|
-
DEBUG: `${process.env.DEBUG ||
|
|
261
|
-
NODE_OPTIONS: `${process.env.NODE_OPTIONS ||
|
|
260
|
+
DEBUG: `${process.env.DEBUG || ''} ${this.bridgeConfig.env?.DEBUG || ''}`.trim(),
|
|
261
|
+
NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} ${this.bridgeConfig.env?.NODE_OPTIONS || ''}`.trim(),
|
|
262
262
|
},
|
|
263
263
|
silent: true,
|
|
264
264
|
};
|
|
@@ -280,8 +280,8 @@ class ChildBridgeService {
|
|
|
280
280
|
firmwareRevision: this.bridgeConfig.firmwareRevision || this.homebridgeConfig.bridge.firmwareRevision,
|
|
281
281
|
};
|
|
282
282
|
const bridgeOptions = {
|
|
283
|
-
cachedAccessoriesDir:
|
|
284
|
-
cachedAccessoriesItemName:
|
|
283
|
+
cachedAccessoriesDir: User.cachedAccessoryPath(),
|
|
284
|
+
cachedAccessoriesItemName: `cachedAccessories.${this.bridgeConfig.username.replace(/:/g, '').toUpperCase()}`,
|
|
285
285
|
};
|
|
286
286
|
// shallow copy the homebridge options to the bridge options object
|
|
287
287
|
Object.assign(bridgeOptions, this.homebridgeOptions);
|
|
@@ -314,7 +314,7 @@ class ChildBridgeService {
|
|
|
314
314
|
const port = await this.externalPortService.requestPort(request.username);
|
|
315
315
|
this.sendMessage("portAllocated" /* ChildProcessMessageEventType.PORT_ALLOCATED */, {
|
|
316
316
|
username: request.username,
|
|
317
|
-
port
|
|
317
|
+
port,
|
|
318
318
|
});
|
|
319
319
|
}
|
|
320
320
|
/**
|
|
@@ -323,7 +323,7 @@ class ChildBridgeService {
|
|
|
323
323
|
teardown() {
|
|
324
324
|
if (this.child && this.child.connected) {
|
|
325
325
|
this.bridgeStatus = "down" /* ChildBridgeStatus.DOWN */;
|
|
326
|
-
this.child.kill(
|
|
326
|
+
this.child.kill('SIGTERM');
|
|
327
327
|
}
|
|
328
328
|
}
|
|
329
329
|
/**
|
|
@@ -340,7 +340,7 @@ class ChildBridgeService {
|
|
|
340
340
|
this.startChildBridge();
|
|
341
341
|
}
|
|
342
342
|
else {
|
|
343
|
-
this.log.warn(
|
|
343
|
+
this.log.warn('Restarting child bridge...');
|
|
344
344
|
this.refreshConfig();
|
|
345
345
|
this.teardown();
|
|
346
346
|
}
|
|
@@ -350,14 +350,14 @@ class ChildBridgeService {
|
|
|
350
350
|
*/
|
|
351
351
|
stopChildBridge() {
|
|
352
352
|
if (!this.shuttingDown) {
|
|
353
|
-
this.log.warn(
|
|
353
|
+
this.log.warn('Stopping child bridge (will not restart)...');
|
|
354
354
|
this.shuttingDown = true;
|
|
355
355
|
this.manuallyStopped = true;
|
|
356
|
-
this.child?.removeAllListeners(
|
|
356
|
+
this.child?.removeAllListeners('close');
|
|
357
357
|
this.teardown();
|
|
358
358
|
}
|
|
359
359
|
else {
|
|
360
|
-
this.log.warn(
|
|
360
|
+
this.log.warn('Bridge already shutting down or stopped.');
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
/**
|
|
@@ -365,14 +365,14 @@ class ChildBridgeService {
|
|
|
365
365
|
*/
|
|
366
366
|
startChildBridge() {
|
|
367
367
|
if (this.manuallyStopped && this.bridgeStatus === "down" /* ChildBridgeStatus.DOWN */ && (!this.child || !this.child.connected)) {
|
|
368
|
-
this.log.warn(
|
|
368
|
+
this.log.warn('Starting child bridge...');
|
|
369
369
|
this.refreshConfig();
|
|
370
370
|
this.startChildProcess();
|
|
371
371
|
this.shuttingDown = false;
|
|
372
372
|
this.manuallyStopped = false;
|
|
373
373
|
}
|
|
374
374
|
else {
|
|
375
|
-
this.log.warn(
|
|
375
|
+
this.log.warn('Cannot start child bridge, it is still running or was not manually stopped');
|
|
376
376
|
}
|
|
377
377
|
}
|
|
378
378
|
/**
|
|
@@ -380,7 +380,7 @@ class ChildBridgeService {
|
|
|
380
380
|
*/
|
|
381
381
|
async refreshConfig() {
|
|
382
382
|
try {
|
|
383
|
-
const homebridgeConfig = await
|
|
383
|
+
const homebridgeConfig = await fs.readJson(User.configPath());
|
|
384
384
|
if (this.type === "platform" /* PluginType.PLATFORM */) {
|
|
385
385
|
const config = homebridgeConfig.platforms?.filter(x => x.platform === this.identifier && x._bridge?.username === this.bridgeConfig.username);
|
|
386
386
|
if (config.length) {
|
|
@@ -388,7 +388,7 @@ class ChildBridgeService {
|
|
|
388
388
|
this.bridgeConfig = this.pluginConfig[0]._bridge || this.bridgeConfig;
|
|
389
389
|
}
|
|
390
390
|
else {
|
|
391
|
-
this.log.warn(
|
|
391
|
+
this.log.warn('Platform config could not be found, using existing config.');
|
|
392
392
|
}
|
|
393
393
|
}
|
|
394
394
|
else if (this.type === "accessory" /* PluginType.ACCESSORY */) {
|
|
@@ -398,12 +398,12 @@ class ChildBridgeService {
|
|
|
398
398
|
this.bridgeConfig = this.pluginConfig[0]._bridge || this.bridgeConfig;
|
|
399
399
|
}
|
|
400
400
|
else {
|
|
401
|
-
this.log.warn(
|
|
401
|
+
this.log.warn('Accessory config could not be found, using existing config.');
|
|
402
402
|
}
|
|
403
403
|
}
|
|
404
404
|
}
|
|
405
|
-
catch (
|
|
406
|
-
this.log.error(
|
|
405
|
+
catch (error) {
|
|
406
|
+
this.log.error('Failed to refresh plugin config:', error.message);
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
409
|
/**
|
|
@@ -424,5 +424,4 @@ class ChildBridgeService {
|
|
|
424
424
|
};
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
|
-
exports.ChildBridgeService = ChildBridgeService;
|
|
428
427
|
//# sourceMappingURL=childBridgeService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childBridgeService.js","sourceRoot":"","sources":["../src/childBridgeService.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA,OAAO,gCAAgC,CAAA;AAiBvC,MAAM,CAAC,OAAO,UAAU,GAAG,IAAI,IAAI,CAqFlC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* global NodeJS */
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { HAPStorage } from 'hap-nodejs';
|
|
5
|
+
import { satisfies } from 'semver';
|
|
6
|
+
import 'source-map-support/register.js';
|
|
7
|
+
import { Logger } from './logger.js';
|
|
8
|
+
import { Server } from './server.js';
|
|
9
|
+
import { User } from './user.js';
|
|
10
|
+
import getVersion, { getRequiredNodeVersion } from './version.js';
|
|
11
|
+
const log = Logger.internal;
|
|
12
|
+
const requiredNodeVersion = getRequiredNodeVersion();
|
|
13
|
+
if (requiredNodeVersion && !satisfies(process.version, requiredNodeVersion)) {
|
|
14
|
+
log.warn(`Homebridge requires Node.js version of ${requiredNodeVersion} which does \
|
|
15
|
+
not satisfy the current Node.js version of ${process.version}. You may need to upgrade your installation of Node.js - see https://homebridge.io/w/JTKEF`);
|
|
16
|
+
}
|
|
17
|
+
export default function cli() {
|
|
18
|
+
let insecureAccess = false;
|
|
19
|
+
let hideQRCode = false;
|
|
20
|
+
let keepOrphans = false;
|
|
21
|
+
let customPluginPath;
|
|
22
|
+
let strictPluginResolution = false;
|
|
23
|
+
let noLogTimestamps = false;
|
|
24
|
+
let debugModeEnabled = false;
|
|
25
|
+
let forceColourLogging = false;
|
|
26
|
+
let customStoragePath;
|
|
27
|
+
let shuttingDown = false;
|
|
28
|
+
const program = new Command();
|
|
29
|
+
program
|
|
30
|
+
.version(getVersion())
|
|
31
|
+
.option('-C, --color', 'force color in logging', () => forceColourLogging = true)
|
|
32
|
+
.option('-D, --debug', 'turn on debug level logging', () => debugModeEnabled = true)
|
|
33
|
+
.option('-I, --insecure', 'allow unauthenticated requests (for easier hacking)', () => insecureAccess = true)
|
|
34
|
+
.option('-P, --plugin-path [path]', 'look for plugins installed at [path] as well as the default locations ([path] can also point to a single plugin)', path => customPluginPath = path)
|
|
35
|
+
.option('-Q, --no-qrcode', 'do not issue QRcode in logging', () => hideQRCode = true)
|
|
36
|
+
.option('-K, --keep-orphans', 'keep cached accessories for which the associated plugin is not loaded', () => keepOrphans = true)
|
|
37
|
+
.option('-T, --no-timestamp', 'do not issue timestamps in logging', () => noLogTimestamps = true)
|
|
38
|
+
.option('-U, --user-storage-path [path]', 'look for homebridge user files at [path] instead of the default location (~/.homebridge)', path => customStoragePath = path)
|
|
39
|
+
.option('--strict-plugin-resolution', 'only load plugins from the --plugin-path if set, otherwise from the primary global node_modules', () => strictPluginResolution = true)
|
|
40
|
+
.parse(process.argv);
|
|
41
|
+
if (noLogTimestamps) {
|
|
42
|
+
Logger.setTimestampEnabled(false);
|
|
43
|
+
}
|
|
44
|
+
if (debugModeEnabled) {
|
|
45
|
+
Logger.setDebugEnabled(true);
|
|
46
|
+
}
|
|
47
|
+
if (forceColourLogging) {
|
|
48
|
+
Logger.forceColor();
|
|
49
|
+
}
|
|
50
|
+
if (customStoragePath) {
|
|
51
|
+
User.setStoragePath(customStoragePath);
|
|
52
|
+
}
|
|
53
|
+
// Initialize HAP-NodeJS with a custom persist directory
|
|
54
|
+
HAPStorage.setCustomStoragePath(User.persistPath());
|
|
55
|
+
const options = {
|
|
56
|
+
keepOrphanedCachedAccessories: keepOrphans,
|
|
57
|
+
insecureAccess,
|
|
58
|
+
hideQRCode,
|
|
59
|
+
customPluginPath,
|
|
60
|
+
noLogTimestamps,
|
|
61
|
+
debugModeEnabled,
|
|
62
|
+
forceColourLogging,
|
|
63
|
+
customStoragePath,
|
|
64
|
+
strictPluginResolution,
|
|
65
|
+
};
|
|
66
|
+
const server = new Server(options);
|
|
67
|
+
const signalHandler = (signal, signalNum) => {
|
|
68
|
+
if (shuttingDown) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
shuttingDown = true;
|
|
72
|
+
log.info('Got %s, shutting down Homebridge...', signal);
|
|
73
|
+
setTimeout(() => process.exit(128 + signalNum), 5000);
|
|
74
|
+
server.teardown();
|
|
75
|
+
};
|
|
76
|
+
process.on('SIGINT', signalHandler.bind(undefined, 'SIGINT', 2));
|
|
77
|
+
process.on('SIGTERM', signalHandler.bind(undefined, 'SIGTERM', 15));
|
|
78
|
+
const errorHandler = (error) => {
|
|
79
|
+
if (error.stack) {
|
|
80
|
+
log.error(error.stack);
|
|
81
|
+
}
|
|
82
|
+
if (!shuttingDown) {
|
|
83
|
+
process.kill(process.pid, 'SIGTERM');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
process.on('uncaughtException', errorHandler);
|
|
87
|
+
server.start().catch(errorHandler);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,mBAAmB;AAInB,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,gCAAgC,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,UAAU,EAAE,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAIjE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA;AAE3B,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAA;AACpD,IAAI,mBAAmB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,0CAA0C,mBAAmB;6CAC3B,OAAO,CAAC,OAAO,4FAA4F,CAAC,CAAA;AACzJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,GAAG;IACzB,IAAI,cAAc,GAAG,KAAK,CAAA;IAC1B,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,gBAAoC,CAAA;IACxC,IAAI,sBAAsB,GAAG,KAAK,CAAA;IAClC,IAAI,eAAe,GAAG,KAAK,CAAA;IAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAC5B,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,IAAI,iBAAqC,CAAA;IAEzC,IAAI,YAAY,GAAG,KAAK,CAAA;IAExB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO;SACJ,OAAO,CAAC,UAAU,EAAE,CAAC;SACrB,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,GAAG,EAAE,CAAC,kBAAkB,GAAG,IAAI,CAAC;SAChF,MAAM,CAAC,aAAa,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACnF,MAAM,CAAC,gBAAgB,EAAE,qDAAqD,EAAE,GAAG,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC;SAC5G,MAAM,CAAC,0BAA0B,EAAE,kHAAkH,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACvL,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC;SACpF,MAAM,CAAC,oBAAoB,EAAE,uEAAuE,EAAE,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;SAC/H,MAAM,CAAC,oBAAoB,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC;SAChG,MAAM,CAAC,gCAAgC,EAAE,0FAA0F,EAAE,IAAI,CAAC,EAAE,CAAC,iBAAiB,GAAG,IAAI,CAAC;SACtK,MAAM,CAAC,4BAA4B,EAAE,iGAAiG,EAAE,GAAG,EAAE,CAAC,sBAAsB,GAAG,IAAI,CAAC;SAC5K,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtB,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAsB;QACjC,6BAA6B,EAAE,WAAW;QAC1C,cAAc;QACd,UAAU;QACV,gBAAgB;QAChB,eAAe;QACf,gBAAgB;QAChB,kBAAkB;QAClB,iBAAiB;QACjB,sBAAsB;KACvB,CAAA;IAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IAElC,MAAM,aAAa,GAAG,CAAC,MAAe,EAAE,SAAiB,EAAQ,EAAE;QACjE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QACD,YAAY,GAAG,IAAI,CAAA;QAEnB,GAAG,CAAC,IAAI,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAA;QACvD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;QAErD,MAAM,CAAC,QAAQ,EAAE,CAAA;IACnB,CAAC,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;IAEnE,MAAM,YAAY,GAAG,CAAC,KAAY,EAAQ,EAAE;QAC1C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;AACpC,CAAC"}
|