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