homebridge 2.0.0-alpha.43 → 2.0.0-alpha.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/api.d.ts +30 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +26 -0
  4. package/dist/api.js.map +1 -1
  5. package/dist/bridgeService.d.ts +3 -13
  6. package/dist/bridgeService.d.ts.map +1 -1
  7. package/dist/bridgeService.js +8 -24
  8. package/dist/bridgeService.js.map +1 -1
  9. package/dist/childBridgeFork.d.ts +0 -8
  10. package/dist/childBridgeFork.d.ts.map +1 -1
  11. package/dist/childBridgeFork.js +26 -127
  12. package/dist/childBridgeFork.js.map +1 -1
  13. package/dist/childBridgeService.d.ts +0 -12
  14. package/dist/childBridgeService.d.ts.map +1 -1
  15. package/dist/childBridgeService.js +9 -25
  16. package/dist/childBridgeService.js.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +1 -3
  19. package/dist/cli.js.map +1 -1
  20. package/dist/ipcService.d.ts +2 -12
  21. package/dist/ipcService.d.ts.map +1 -1
  22. package/dist/ipcService.js +0 -7
  23. package/dist/ipcService.js.map +1 -1
  24. package/dist/matter/index.d.ts +1 -1
  25. package/dist/matter/index.d.ts.map +1 -1
  26. package/dist/matter/index.js.map +1 -1
  27. package/dist/matter/matterAccessoryCache.d.ts +73 -0
  28. package/dist/matter/matterAccessoryCache.d.ts.map +1 -0
  29. package/dist/matter/matterAccessoryCache.js +168 -0
  30. package/dist/matter/matterAccessoryCache.js.map +1 -0
  31. package/dist/matter/matterBehaviors.d.ts +123 -0
  32. package/dist/matter/matterBehaviors.d.ts.map +1 -0
  33. package/dist/matter/matterBehaviors.js +582 -0
  34. package/dist/matter/matterBehaviors.js.map +1 -0
  35. package/dist/matter/matterConfigValidator.d.ts +0 -1
  36. package/dist/matter/matterConfigValidator.d.ts.map +1 -1
  37. package/dist/matter/matterConfigValidator.js +15 -45
  38. package/dist/matter/matterConfigValidator.js.map +1 -1
  39. package/dist/matter/matterErrorHandler.d.ts +1 -1
  40. package/dist/matter/matterErrorHandler.d.ts.map +1 -1
  41. package/dist/matter/matterErrorHandler.js +35 -22
  42. package/dist/matter/matterErrorHandler.js.map +1 -1
  43. package/dist/matter/matterNetworkMonitor.d.ts +3 -0
  44. package/dist/matter/matterNetworkMonitor.d.ts.map +1 -1
  45. package/dist/matter/matterNetworkMonitor.js +49 -26
  46. package/dist/matter/matterNetworkMonitor.js.map +1 -1
  47. package/dist/matter/matterServer.d.ts +79 -5
  48. package/dist/matter/matterServer.d.ts.map +1 -1
  49. package/dist/matter/matterServer.js +487 -97
  50. package/dist/matter/matterServer.js.map +1 -1
  51. package/dist/matter/matterSharedTypes.d.ts +12 -4
  52. package/dist/matter/matterSharedTypes.d.ts.map +1 -1
  53. package/dist/matter/matterSharedTypes.js.map +1 -1
  54. package/dist/matter/matterStorage.d.ts +11 -1
  55. package/dist/matter/matterStorage.d.ts.map +1 -1
  56. package/dist/matter/matterStorage.js +12 -2
  57. package/dist/matter/matterStorage.js.map +1 -1
  58. package/dist/matter/matterTypes.d.ts +68 -19
  59. package/dist/matter/matterTypes.d.ts.map +1 -1
  60. package/dist/matter/matterTypes.js.map +1 -1
  61. package/dist/matter/matterValidation.d.ts +57 -0
  62. package/dist/matter/matterValidation.d.ts.map +1 -0
  63. package/dist/matter/matterValidation.js +100 -0
  64. package/dist/matter/matterValidation.js.map +1 -0
  65. package/dist/plugin.d.ts.map +1 -1
  66. package/dist/plugin.js +2 -4
  67. package/dist/plugin.js.map +1 -1
  68. package/dist/server.d.ts +0 -7
  69. package/dist/server.d.ts.map +1 -1
  70. package/dist/server.js +80 -112
  71. package/dist/server.js.map +1 -1
  72. package/package.json +3 -3
  73. package/dist/matter/matterDiagnostics.d.ts +0 -121
  74. package/dist/matter/matterDiagnostics.d.ts.map +0 -1
  75. package/dist/matter/matterDiagnostics.js +0 -323
  76. package/dist/matter/matterDiagnostics.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Shared Matter Validation Utilities
3
+ *
4
+ * Common validation functions used across Matter configuration validators
5
+ * to ensure consistency and reduce duplication.
6
+ */
7
+ import { Logger } from '../logger.js';
8
+ const log = Logger.withPrefix('Matter');
9
+ /**
10
+ * Validate a Matter port number
11
+ *
12
+ * @param port - Port number to validate
13
+ * @param checkConflicts - Whether to check for known conflicting ports
14
+ * @returns Validation result with error/warning messages
15
+ */
16
+ export function validatePort(port, checkConflicts = false) {
17
+ if (!Number.isInteger(port)) {
18
+ return { valid: false, error: `Port must be an integer (got: ${port})` };
19
+ }
20
+ if (port < 1025 || port > 65534) {
21
+ return { valid: false, error: `Port must be between 1025 and 65534 (got: ${port})` };
22
+ }
23
+ // Check for common conflicts
24
+ if (checkConflicts) {
25
+ const conflictPorts = [5353, 8080, 8443]; // mDNS, common HTTP ports
26
+ if (conflictPorts.includes(port)) {
27
+ return {
28
+ valid: true,
29
+ warning: `Port ${port} may conflict with other services. Consider using a different port.`,
30
+ };
31
+ }
32
+ }
33
+ return { valid: true };
34
+ }
35
+ /**
36
+ * Sanitize a unique ID to be filesystem-safe
37
+ *
38
+ * Replaces non-alphanumeric characters with hyphens, collapses multiple hyphens,
39
+ * trims leading/trailing hyphens, and converts to lowercase.
40
+ *
41
+ * @param uniqueId - Unique identifier to sanitize
42
+ * @returns Sanitized unique ID and any warnings
43
+ */
44
+ export function sanitizeUniqueId(uniqueId) {
45
+ const warnings = [];
46
+ const original = uniqueId;
47
+ if (uniqueId.trim().length === 0) {
48
+ return {
49
+ value: '',
50
+ warnings: ['uniqueId is empty after trimming'],
51
+ };
52
+ }
53
+ const sanitized = uniqueId
54
+ .replace(/[^a-z0-9]/gi, '-') // Replace non-alphanumeric with hyphens
55
+ .replace(/-+/g, '-') // Collapse multiple hyphens
56
+ .replace(/^-|-$/g, '') // Trim leading/trailing hyphens
57
+ .toLowerCase(); // Lowercase for consistency
58
+ if (sanitized !== original) {
59
+ warnings.push(`uniqueId was sanitized from "${original}" to "${sanitized}"`);
60
+ }
61
+ if (sanitized.length === 0) {
62
+ warnings.push('uniqueId resulted in empty string after sanitization');
63
+ }
64
+ return { value: sanitized, warnings };
65
+ }
66
+ /**
67
+ * Truncate a string to a maximum length with warning
68
+ *
69
+ * @param value - String to truncate
70
+ * @param maxLength - Maximum allowed length
71
+ * @param fieldName - Name of the field (for warnings)
72
+ * @returns Truncated value and any warnings
73
+ */
74
+ export function truncateString(value, maxLength, fieldName) {
75
+ const warnings = [];
76
+ if (value.length > maxLength) {
77
+ warnings.push(`${fieldName} exceeds ${maxLength} characters, truncating: ${value}`);
78
+ log.warn(`${fieldName} exceeds ${maxLength} characters, truncating: ${value}`);
79
+ return {
80
+ value: value.slice(0, maxLength),
81
+ warnings,
82
+ };
83
+ }
84
+ return { value, warnings };
85
+ }
86
+ /**
87
+ * Check for port conflicts between HAP and Matter ports
88
+ *
89
+ * @param hapPort - HAP bridge port
90
+ * @param matterPort - Matter bridge port
91
+ * @returns Warning message if ports are too close, undefined otherwise
92
+ */
93
+ export function checkPortProximity(hapPort, matterPort) {
94
+ const MIN_PORT_SEPARATION = 10;
95
+ if (Math.abs(hapPort - matterPort) < MIN_PORT_SEPARATION) {
96
+ return `HAP port ${hapPort} and Matter port ${matterPort} are very close. Consider spacing them further apart.`;
97
+ }
98
+ return undefined;
99
+ }
100
+ //# sourceMappingURL=matterValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterValidation.js","sourceRoot":"","sources":["../../src/matter/matterValidation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,0BAA0B,EAC1B,GAAG,EACH,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAEhB,UAAU,EACX,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAerD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAC5B,QAAQ,UAAQ;IAGvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,WAAW,CAAC,CAGnB;IAGD,OAAO,CAAC,iBAAiB,CAAC,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA4D;IAClG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0D;IAC9F,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAwD;gBAEnF,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM;IA+C7E,mBAAmB,IAAI,gBAAgB;IAIvC,aAAa,IAAI,MAAM;IAIvB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,0BAA0B,GAAG,IAAI;IAYrF,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,GAAG,IAAI;IAYlF,uBAAuB,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,GAAG,0BAA0B;IAW7G,sBAAsB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,YAAY,GAAG,yBAAyB;IAmBxG,qBAAqB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,YAAY,EAAE,cAAc,EAAE,qBAAqB,GAAG,IAAI;IAczH,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,qBAAqB,GAAG,SAAS;IAMjF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD3B,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAOlD"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,0BAA0B,EAC1B,GAAG,EACH,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAEhB,UAAU,EACX,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAerD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAC5B,QAAQ,UAAQ;IAGvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,WAAW,CAAC,CAGnB;IAGD,OAAO,CAAC,iBAAiB,CAAC,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA4D;IAClG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0D;IAC9F,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAwD;gBAEnF,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM;IA+C7E,mBAAmB,IAAI,gBAAgB;IAIvC,aAAa,IAAI,MAAM;IAIvB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,0BAA0B,GAAG,IAAI;IAYrF,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,GAAG,IAAI;IAYlF,uBAAuB,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,GAAG,0BAA0B;IAW7G,sBAAsB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,YAAY,GAAG,yBAAyB;IAiBxG,qBAAqB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,YAAY,EAAE,cAAc,EAAE,qBAAqB,GAAG,IAAI;IAczH,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,qBAAqB,GAAG,SAAS;IAMjF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD3B,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAOlD"}
package/dist/plugin.js CHANGED
@@ -107,11 +107,9 @@ export class Plugin {
107
107
  throw new Error(`The requested platform '${name}' was not registered by the plugin '${this.getPluginIdentifier()}'.`);
108
108
  }
109
109
  // If it's a dynamic platform plugin, ensure it's not enabled multiple times.
110
- // Skip this check in child bridge context (when process.send exists, we're a forked child)
111
- const isChildBridge = typeof process.send === 'function';
112
- if (!isChildBridge && this.activeDynamicPlatforms.has(name)) {
110
+ if (this.activeDynamicPlatforms.has(name)) {
113
111
  throw new Error(`The dynamic platform ${name} from the plugin ${this.getPluginIdentifier()} is configured `
114
- + 'multiple times in your config.json.');
112
+ + 'times in your config.json.');
115
113
  }
116
114
  return constructor;
117
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -34,7 +34,6 @@ export declare class Server {
34
34
  private readonly childBridges;
35
35
  private matterServer?;
36
36
  private readonly matterBridgeCache;
37
- private readonly platformConfigs;
38
37
  private serverStatus;
39
38
  constructor(options?: HomebridgeOptions);
40
39
  /**
@@ -62,12 +61,6 @@ export declare class Server {
62
61
  private static loadConfig;
63
62
  private loadAccessories;
64
63
  private loadPlatforms;
65
- /**
66
- * Generate a unique identifier for a child bridge
67
- * - For HAP bridges: returns the uppercase MAC address
68
- * - For Matter-only bridges: returns "matter-{plugin}-{identifier}"
69
- */
70
- private getChildBridgeKey;
71
64
  /**
72
65
  * Validate an external bridge config
73
66
  */
@@ -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;IA0Bf,OAAO,CAAC,OAAO;IAzBjB,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;IAIzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAG1E,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;IAiEpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA2B3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtC,OAAO,CAAC,aAAa;IAOrB,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;IA2IzB,OAAO,CAAC,eAAe;IA8GvB,OAAO,CAAC,aAAa;IAuGrB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgEjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+NlC,OAAO,CAAC,cAAc;CAmBvB"}
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;IAuBf,OAAO,CAAC,OAAO;IAtBjB,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;IAIzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAG1E,OAAO,CAAC,YAAY,CAAC,CAAc;IAGnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAG/E,OAAO,CAAC,YAAY,CAAqC;gBAG/C,OAAO,GAAE,iBAAsB;IAkEzC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAaV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCnC;;OAEG;YACW,sBAAsB;IA4FpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA2B3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtC,OAAO,CAAC,aAAa;IAKrB,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;IAqIzB,OAAO,CAAC,eAAe;IAoGvB,OAAO,CAAC,aAAa;IA4FrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAyCjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAgNlC,OAAO,CAAC,cAAc;CAqBvB"}
package/dist/server.js CHANGED
@@ -38,14 +38,12 @@ export class Server {
38
38
  externalPortService;
39
39
  config;
40
40
  // used to keep track of child bridges
41
- // Key is either HAP username (MAC address) or Matter-only identifier (e.g., "matter-plugin-platform")
41
+ // Key is HAP username (MAC address)
42
42
  childBridges = new Map();
43
43
  // Matter server instance for main bridge (if enabled)
44
44
  matterServer;
45
45
  // Cache for Matter bridge identifier -> ChildBridgeService lookups
46
46
  matterBridgeCache = new Map();
47
- // Track platform configurations for routing accessories
48
- platformConfigs = new Map();
49
47
  // current server status
50
48
  serverStatus = "pending" /* ServerStatus.PENDING */;
51
49
  constructor(options = {}) {
@@ -72,7 +70,7 @@ export class Server {
72
70
  };
73
71
  // shallow copy the homebridge options to the bridge options object
74
72
  Object.assign(bridgeConfig, this.options);
75
- this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, bridgeConfig, this.config.bridge, this.config);
73
+ this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, bridgeConfig, this.config.bridge);
76
74
  // Handle platform accessory registration
77
75
  this.api.on("registerPlatformAccessories" /* InternalAPIEvent.REGISTER_PLATFORM_ACCESSORIES */, this.handleRegisterPlatformAccessories.bind(this));
78
76
  this.api.on("unregisterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_PLATFORM_ACCESSORIES */, this.handleUnregisterPlatformAccessories.bind(this));
@@ -147,10 +145,12 @@ export class Server {
147
145
  if (!this.config.bridge.matter) {
148
146
  return;
149
147
  }
148
+ // Declare matterPort outside try block so it's accessible in catch
149
+ let matterPort;
150
150
  try {
151
151
  log.info('Initializing Matter server for main bridge...');
152
152
  // Allocate port from pool if not explicitly configured
153
- let matterPort = this.config.bridge.matter.port;
153
+ matterPort = this.config.bridge.matter.port;
154
154
  if (!matterPort) {
155
155
  matterPort = await this.externalPortService.requestPort(`${this.config.bridge.username}:MATTER`);
156
156
  if (!matterPort) {
@@ -161,18 +161,24 @@ export class Server {
161
161
  log.info(`Allocated port ${matterPort} from pool for main Matter bridge`);
162
162
  }
163
163
  }
164
- // Create Matter server instance
164
+ // Create Matter server instance with config inheritance from main bridge
165
165
  this.matterServer = new MatterServer({
166
166
  storagePath: User.matterPath(),
167
167
  port: matterPort,
168
168
  uniqueId: 'main-bridge',
169
- name: this.config.bridge.matter.name || (this.config.bridge.name ? `${this.config.bridge.name} (Matter)` : 'Homebridge Matter Bridge'),
169
+ manufacturer: this.config.bridge.manufacturer,
170
+ model: this.config.bridge.model,
171
+ firmwareRevision: this.config.bridge.firmwareRevision,
172
+ serialNumber: this.config.bridge.serialNumber,
173
+ debugModeEnabled: this.options.debugModeEnabled,
170
174
  });
171
175
  // Start the Matter server
172
176
  await this.matterServer.start();
173
177
  log.info('Matter server initialized for main bridge');
174
178
  // Inform the API that Matter is enabled
175
179
  this.api._setMatterEnabled(true);
180
+ // Set the Matter server reference for API methods like getAccessoryState
181
+ this.api._setMatterServer(this.matterServer);
176
182
  // Send Matter status update to notify UI that Matter server is ready
177
183
  if (this.config.bridge.disableIpc !== true) {
178
184
  this.sendMainBridgeMatterStatusUpdate();
@@ -198,6 +204,24 @@ export class Server {
198
204
  log.error('╚════════════════════════════════════════════════════════════════════════════╝');
199
205
  log.error('');
200
206
  }
207
+ else if (error.code === 'EADDRINUSE' || (error.message && error.message.includes('address already in use'))) {
208
+ log.error('');
209
+ log.error('╔════════════════════════════════════════════════════════════════════════════╗');
210
+ log.error('║ MATTER PORT ALREADY IN USE ║');
211
+ log.error('╠════════════════════════════════════════════════════════════════════════════╣');
212
+ log.error(`║ Port ${matterPort} is already in use by another application. ║`);
213
+ log.error('║ ║');
214
+ log.error('║ To fix this: ║');
215
+ log.error('║ 1. Stop the application using this port, or ║');
216
+ log.error('║ 2. Configure a different port in your config.json: ║');
217
+ log.error('║ "bridge": { ║');
218
+ log.error('║ "matter": { ║');
219
+ log.error('║ "port": <different-port> ║');
220
+ log.error('║ } ║');
221
+ log.error('║ } ║');
222
+ log.error('╚════════════════════════════════════════════════════════════════════════════╝');
223
+ log.error('');
224
+ }
201
225
  }
202
226
  }
203
227
  /**
@@ -218,7 +242,7 @@ export class Server {
218
242
  serialNumber: commissioningInfo.serialNumber,
219
243
  passcode: commissioningInfo.passcode,
220
244
  discriminator: commissioningInfo.discriminator,
221
- name: this.config.bridge.matter?.name || (this.config.bridge.name ? `${this.config.bridge.name} (Matter)` : 'Homebridge Matter Bridge'),
245
+ name: `${this.config.bridge.name} (Matter)`,
222
246
  plugin: 'main-bridge',
223
247
  identifier: 'main-bridge',
224
248
  deviceCount: this.matterServer.getAccessories().length,
@@ -242,7 +266,6 @@ export class Server {
242
266
  }
243
267
  publishBridge() {
244
268
  this.bridgeService.publishBridge();
245
- // Main bridge always has a pin (validated in loadConfig)
246
269
  this.printSetupInfo(this.config.bridge.pin);
247
270
  }
248
271
  handlePublishExternalAccessories(accessories) {
@@ -322,7 +345,6 @@ export class Server {
322
345
  bridge.username = bridge.username || defaultBridge.username;
323
346
  bridge.pin = bridge.pin || defaultBridge.pin;
324
347
  config.bridge = bridge;
325
- // Main bridge username is always required and must be valid
326
348
  const username = config.bridge.username;
327
349
  if (!validMacAddress(username)) {
328
350
  throw new Error(`Not a valid username: ${username}. Must be 6 pairs of colon-separated hexadecimal chars (A-F 0-9), like a MAC address.`);
@@ -342,10 +364,6 @@ export class Server {
342
364
  if (config.bridge.matter || config.platforms.some((p) => p._bridge?.matter) || config.accessories.some((a) => a._bridge?.matter)) {
343
365
  // Validate main bridge Matter config
344
366
  if (config.bridge.matter) {
345
- // Apply default name before validation if not set
346
- if (!config.bridge.matter.name) {
347
- config.bridge.matter.name = config.bridge.name ? `${config.bridge.name} (Matter)` : 'Homebridge Matter Bridge';
348
- }
349
367
  const validation = MatterConfigValidator.validate(config.bridge.matter);
350
368
  if (!validation.isValid) {
351
369
  log.error('Main bridge Matter configuration is invalid. Matter will not be enabled for the main bridge.');
@@ -434,37 +452,29 @@ export class Server {
434
452
  }
435
453
  const logger = Logger.withPrefix(displayName);
436
454
  logger('Initializing %s accessory...', accessoryIdentifier);
437
- // Handle child bridge (HAP, Matter-only, or HAP+Matter)
438
455
  if (accessoryConfig._bridge) {
439
- // Ensure the username is always uppercase if it exists (HAP bridges only)
440
- if (accessoryConfig._bridge.username) {
441
- accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
442
- }
443
- // Generate unique key for this child bridge
444
- const bridgeKey = this.getChildBridgeKey("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin.getPluginIdentifier(), accessoryConfig._bridge);
456
+ // ensure the username is always uppercase
457
+ accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
445
458
  try {
446
- this.validateChildBridgeConfig("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin.getPluginIdentifier(), accessoryConfig._bridge, bridgeKey);
459
+ this.validateChildBridgeConfig("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, accessoryConfig._bridge);
447
460
  }
448
461
  catch (error) {
449
462
  log.error(error.message);
450
463
  return;
451
464
  }
452
465
  let childBridge;
453
- if (this.childBridges.has(bridgeKey)) {
454
- childBridge = this.childBridges.get(bridgeKey);
455
- logger(`Adding to existing child bridge ${bridgeKey}`);
466
+ if (this.childBridges.has(accessoryConfig._bridge.username)) {
467
+ childBridge = this.childBridges.get(accessoryConfig._bridge.username);
468
+ logger(`Adding to existing child bridge ${accessoryConfig._bridge.username}`);
456
469
  }
457
470
  else {
458
- const bridgeType = accessoryConfig._bridge.matterOnly ? 'Matter-only' : 'HAP';
459
- logger(`Initializing ${bridgeType} child bridge ${bridgeKey}`);
471
+ logger(`Initializing child bridge ${accessoryConfig._bridge.username}`);
460
472
  childBridge = new ChildBridgeService("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin, accessoryConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
461
- this.childBridges.set(bridgeKey, childBridge);
473
+ this.childBridges.set(accessoryConfig._bridge.username, childBridge);
462
474
  }
463
475
  // add config to child bridge service
464
476
  childBridge.addConfig(accessoryConfig);
465
- // Matter for child bridges is handled inside the forked child process (childBridgeFork.ts)
466
- // to maintain isolation - each child process manages its own Matter server
467
- return; // Done - child bridge
477
+ return;
468
478
  }
469
479
  const accessoryInstance = new constructor(logger, accessoryConfig, this.api);
470
480
  // pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
@@ -521,29 +531,21 @@ export class Server {
521
531
  }
522
532
  const logger = Logger.withPrefix(displayName);
523
533
  logger('Initializing %s platform...', platformIdentifier);
524
- // Handle child bridge (HAP, Matter-only, or HAP+Matter)
525
534
  if (platformConfig._bridge) {
526
- // Ensure the username is always uppercase if it exists (HAP bridges only)
527
- if (platformConfig._bridge.username) {
528
- platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
529
- }
530
- // Generate unique key for this child bridge
531
- const bridgeKey = this.getChildBridgeKey("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin.getPluginIdentifier(), platformConfig._bridge);
535
+ // ensure the username is always uppercase
536
+ platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
532
537
  try {
533
- this.validateChildBridgeConfig("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin.getPluginIdentifier(), platformConfig._bridge, bridgeKey);
538
+ this.validateChildBridgeConfig("platform" /* PluginType.PLATFORM */, platformIdentifier, platformConfig._bridge);
534
539
  }
535
540
  catch (error) {
536
541
  log.error(error.message);
537
542
  return;
538
543
  }
539
- const bridgeType = platformConfig._bridge.matterOnly ? 'Matter-only' : 'HAP';
540
- logger(`Initializing ${bridgeType} child bridge ${bridgeKey}`);
544
+ logger(`Initializing child bridge ${platformConfig._bridge.username}`);
541
545
  const childBridge = new ChildBridgeService("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin, platformConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
542
- this.childBridges.set(bridgeKey, childBridge);
546
+ this.childBridges.set(platformConfig._bridge.username, childBridge);
543
547
  // add config to child bridge service
544
548
  childBridge.addConfig(platformConfig);
545
- // Matter for child bridges is handled inside the forked child process (childBridgeFork.ts)
546
- // to maintain isolation - each child process manages its own Matter server
547
549
  return;
548
550
  }
549
551
  const platform = new constructor(logger, platformConfig, this.api);
@@ -560,48 +562,21 @@ export class Server {
560
562
  });
561
563
  return promises;
562
564
  }
563
- /**
564
- * Generate a unique identifier for a child bridge
565
- * - For HAP bridges: returns the uppercase MAC address
566
- * - For Matter-only bridges: returns "matter-{plugin}-{identifier}"
567
- */
568
- getChildBridgeKey(type, identifier, pluginName, bridgeConfig) {
569
- if (bridgeConfig.matterOnly) {
570
- // Matter-only bridge: generate identifier from plugin and platform/accessory name
571
- return `matter-${pluginName}-${identifier}`;
572
- }
573
- // HAP bridge: use MAC address (already validated and uppercased)
574
- return bridgeConfig.username.toUpperCase();
575
- }
576
565
  /**
577
566
  * Validate an external bridge config
578
567
  */
579
- validateChildBridgeConfig(type, identifier, pluginName, bridgeConfig, bridgeKey) {
580
- // Matter-only bridges don't require HAP fields
581
- if (bridgeConfig.matterOnly) {
582
- if (!bridgeConfig.matter) {
583
- throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
584
- + 'Matter-only bridge must have a "matter" configuration block in _bridge.matter.');
585
- }
586
- // Check for duplicate Matter-only bridges
587
- if (this.childBridges.has(bridgeKey)) {
588
- throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
589
- + 'A Matter-only bridge with this plugin and platform/accessory combination already exists. Each Matter-only bridge must be unique.');
590
- }
591
- // Matter-only bridges don't need username/pin validation
592
- return;
593
- }
594
- // HAP bridges (or HAP+Matter bridges) require username and pin
568
+ validateChildBridgeConfig(type, identifier, bridgeConfig) {
569
+ // All child bridges require username
595
570
  if (!bridgeConfig.username) {
596
571
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
597
- + 'Missing required field "_bridge.username". Set "matterOnly": true if you want a Matter-only bridge.');
572
+ + 'Missing required field "_bridge.username".');
598
573
  }
599
574
  if (!validMacAddress(bridgeConfig.username)) {
600
575
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
601
576
  + `not a valid username in _bridge.username: "${bridgeConfig.username}". Must be 6 pairs of colon-separated hexadecimal chars (A-F 0-9), like a MAC address.`);
602
577
  }
603
- if (this.childBridges.has(bridgeKey)) {
604
- const childBridge = this.childBridges.get(bridgeKey);
578
+ if (this.childBridges.has(bridgeConfig.username)) {
579
+ const childBridge = this.childBridges.get(bridgeConfig.username);
605
580
  if (type === "platform" /* PluginType.PLATFORM */) {
606
581
  // only a single platform can exist on one child bridge
607
582
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
@@ -613,8 +588,6 @@ export class Server {
613
588
  + `Duplicate username found in _bridge.username: "${bridgeConfig.username}". You can only group accessories of the same type in a child bridge.`);
614
589
  }
615
590
  }
616
- // Check that child bridge username doesn't conflict with main bridge
617
- // Main bridge always has a username (validated in loadConfig)
618
591
  if (bridgeConfig.username === this.config.bridge.username.toUpperCase()) {
619
592
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
620
593
  + `Username found in _bridge.username: "${bridgeConfig.username}" is the same as the main bridge. Each child bridge platform/accessory must have it's own unique username.`);
@@ -631,9 +604,7 @@ export class Server {
631
604
  // noinspection SuspiciousTypeOfGuard
632
605
  if (typeof username === 'string') {
633
606
  const childBridge = this.childBridges.get(username.toUpperCase());
634
- if (childBridge) {
635
- childBridge.restartChildBridge();
636
- }
607
+ childBridge?.restartChildBridge();
637
608
  }
638
609
  });
639
610
  // handle stop child bridge event
@@ -641,9 +612,7 @@ export class Server {
641
612
  // noinspection SuspiciousTypeOfGuard
642
613
  if (typeof username === 'string') {
643
614
  const childBridge = this.childBridges.get(username.toUpperCase());
644
- if (childBridge) {
645
- childBridge.stopChildBridge();
646
- }
615
+ childBridge?.stopChildBridge();
647
616
  }
648
617
  });
649
618
  // handle start child bridge event
@@ -651,9 +620,7 @@ export class Server {
651
620
  // noinspection SuspiciousTypeOfGuard
652
621
  if (typeof username === 'string') {
653
622
  const childBridge = this.childBridges.get(username.toUpperCase());
654
- if (childBridge) {
655
- childBridge.startChildBridge();
656
- }
623
+ childBridge?.startChildBridge();
657
624
  }
658
625
  });
659
626
  this.ipcService.on("childBridgeMetadataRequest" /* IpcIncomingEvent.CHILD_BRIDGE_METADATA_REQUEST */, () => {
@@ -713,6 +680,17 @@ export class Server {
713
680
  }
714
681
  });
715
682
  this.ipcService.on("matterBridgeMetadataRequest" /* IpcIncomingEvent.MATTER_BRIDGE_METADATA_REQUEST */, () => {
683
+ /**
684
+ * Sanitize Matter bridge identifier to match MatterServer filesystem sanitization
685
+ * Must match the logic in MatterServer: lowercase, replace non-alphanumeric with dashes
686
+ */
687
+ const sanitizeMatterId = (id) => {
688
+ return id
689
+ .replace(/[^a-z0-9]/gi, '-')
690
+ .replace(/-+/g, '-')
691
+ .replace(/^-|-$/g, '')
692
+ .toLowerCase();
693
+ };
716
694
  const matterBridges = [];
717
695
  // Add main bridge Matter metadata if enabled
718
696
  if (this.matterServer && this.matterServer.isServerRunning()) {
@@ -738,8 +716,8 @@ export class Server {
738
716
  const matterConfig = childBridge.getMatterConfig();
739
717
  if (matterInfo && matterConfig) {
740
718
  const metadata = childBridge.getMetadata();
741
- // Use plugin-identifier format to match storage
742
- const childIdentifier = `${metadata.plugin}-${childBridge.identifier}`;
719
+ // Sanitize the Matter identifier to match filesystem (lowercase, dashes)
720
+ const childIdentifier = sanitizeMatterId(metadata.matterIdentifier);
743
721
  // Populate cache for efficient lookups
744
722
  this.matterBridgeCache.set(childIdentifier, childBridge);
745
723
  matterBridges.push({
@@ -749,7 +727,7 @@ export class Server {
749
727
  setupUri: matterInfo.qrCode,
750
728
  pin: matterInfo.manualPairingCode,
751
729
  serialNumber: matterInfo.serialNumber,
752
- name: matterConfig.name || metadata.name,
730
+ name: metadata.name,
753
731
  plugin: metadata.plugin,
754
732
  identifier: childIdentifier,
755
733
  commissioned: matterInfo.commissioned,
@@ -760,18 +738,6 @@ export class Server {
760
738
  }
761
739
  this.ipcService.sendMessage("matterBridgeMetadataResponse" /* IpcOutgoingEvent.MATTER_BRIDGE_METADATA_RESPONSE */, matterBridges);
762
740
  });
763
- this.ipcService.on("matterAccessoriesRequest" /* IpcIncomingEvent.MATTER_ACCESSORIES_REQUEST */, () => {
764
- // Return Matter accessories from all bridges
765
- const allMatterAccessories = {
766
- children: {},
767
- };
768
- // Add main bridge accessories
769
- if (this.matterServer) {
770
- allMatterAccessories.children['main-bridge'] = this.matterServer.getAccessories();
771
- }
772
- // Child bridge accessories are managed by child processes
773
- this.ipcService.sendMessage("matterAccessoriesResponse" /* IpcOutgoingEvent.MATTER_ACCESSORIES_RESPONSE */, allMatterAccessories);
774
- });
775
741
  this.ipcService.on("matterCommissioningInfoRequest" /* IpcIncomingEvent.MATTER_COMMISSIONING_INFO_REQUEST */, (matterBridgeId) => {
776
742
  let rawInfo = { commissioned: false };
777
743
  // Handle main bridge
@@ -805,22 +771,24 @@ export class Server {
805
771
  });
806
772
  }
807
773
  printSetupInfo(pin) {
808
- log.info('Setup Payload:');
809
- log.info(this.bridgeService.bridge.setupURI());
774
+ /* eslint-disable no-console */
775
+ console.log('Setup Payload:');
776
+ console.log(this.bridgeService.bridge.setupURI());
810
777
  if (!this.options.hideQRCode) {
811
- log.info('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
778
+ console.log('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
812
779
  qrcode.setErrorLevel('M'); // HAP specifies level M or higher for ECC
813
780
  qrcode.generate(this.bridgeService.bridge.setupURI());
814
- log.info('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
781
+ console.log('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
815
782
  }
816
783
  else {
817
- log.info('Enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
784
+ console.log('Enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
818
785
  }
819
- log.info(chalk.black.bgWhite(' '));
820
- log.info(chalk.black.bgWhite(' ┌────────────┐ '));
821
- log.info(chalk.black.bgWhite(` │ ${pin} │ `));
822
- log.info(chalk.black.bgWhite(' └────────────┘ '));
823
- log.info(chalk.black.bgWhite(' '));
786
+ console.log(chalk.black.bgWhite(' '));
787
+ console.log(chalk.black.bgWhite(' ┌────────────┐ '));
788
+ console.log(chalk.black.bgWhite(` │ ${pin} │ `));
789
+ console.log(chalk.black.bgWhite(' └────────────┘ '));
790
+ console.log(chalk.black.bgWhite(' '));
791
+ /* eslint-enable no-console */
824
792
  }
825
793
  }
826
794
  //# sourceMappingURL=server.js.map