homebridge 2.0.0-alpha.41 → 2.0.0-alpha.43

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 (91) hide show
  1. package/dist/api.d.ts +81 -20
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +71 -11
  4. package/dist/api.js.map +1 -1
  5. package/dist/bridgeService.d.ts +14 -12
  6. package/dist/bridgeService.d.ts.map +1 -1
  7. package/dist/bridgeService.js +17 -3
  8. package/dist/bridgeService.js.map +1 -1
  9. package/dist/bridgeTypes.d.ts +54 -0
  10. package/dist/bridgeTypes.d.ts.map +1 -0
  11. package/dist/bridgeTypes.js +8 -0
  12. package/dist/bridgeTypes.js.map +1 -0
  13. package/dist/childBridgeFork.d.ts +23 -0
  14. package/dist/childBridgeFork.d.ts.map +1 -1
  15. package/dist/childBridgeFork.js +240 -4
  16. package/dist/childBridgeFork.js.map +1 -1
  17. package/dist/childBridgeService.d.ts +47 -7
  18. package/dist/childBridgeService.d.ts.map +1 -1
  19. package/dist/childBridgeService.js +67 -2
  20. package/dist/childBridgeService.js.map +1 -1
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js +3 -1
  23. package/dist/cli.js.map +1 -1
  24. package/dist/index.d.ts +5 -6
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +4 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/ipcService.d.ts +3 -1
  29. package/dist/ipcService.d.ts.map +1 -1
  30. package/dist/ipcService.js +2 -0
  31. package/dist/ipcService.js.map +1 -1
  32. package/dist/matter/index.d.ts +4 -6
  33. package/dist/matter/index.d.ts.map +1 -1
  34. package/dist/matter/index.js +4 -5
  35. package/dist/matter/index.js.map +1 -1
  36. package/dist/matter/matterConfigValidator.d.ts +2 -3
  37. package/dist/matter/matterConfigValidator.d.ts.map +1 -1
  38. package/dist/matter/matterConfigValidator.js +47 -38
  39. package/dist/matter/matterConfigValidator.js.map +1 -1
  40. package/dist/matter/matterErrorHandler.d.ts +6 -25
  41. package/dist/matter/matterErrorHandler.d.ts.map +1 -1
  42. package/dist/matter/matterErrorHandler.js +89 -99
  43. package/dist/matter/matterErrorHandler.js.map +1 -1
  44. package/dist/matter/matterServer.d.ts +126 -39
  45. package/dist/matter/matterServer.d.ts.map +1 -1
  46. package/dist/matter/matterServer.js +528 -226
  47. package/dist/matter/matterServer.js.map +1 -1
  48. package/dist/matter/matterSharedTypes.d.ts +16 -38
  49. package/dist/matter/matterSharedTypes.d.ts.map +1 -1
  50. package/dist/matter/matterSharedTypes.js +3 -4
  51. package/dist/matter/matterSharedTypes.js.map +1 -1
  52. package/dist/matter/matterStorage.d.ts +116 -0
  53. package/dist/matter/matterStorage.d.ts.map +1 -0
  54. package/dist/matter/matterStorage.js +442 -0
  55. package/dist/matter/matterStorage.js.map +1 -0
  56. package/dist/matter/matterTypes.d.ts +148 -20
  57. package/dist/matter/matterTypes.d.ts.map +1 -1
  58. package/dist/matter/matterTypes.js +91 -263
  59. package/dist/matter/matterTypes.js.map +1 -1
  60. package/dist/plugin.d.ts.map +1 -1
  61. package/dist/plugin.js +4 -2
  62. package/dist/plugin.js.map +1 -1
  63. package/dist/server.d.ts +18 -4
  64. package/dist/server.d.ts.map +1 -1
  65. package/dist/server.js +376 -349
  66. package/dist/server.js.map +1 -1
  67. package/dist/user.d.ts +1 -0
  68. package/dist/user.d.ts.map +1 -1
  69. package/dist/user.js +3 -0
  70. package/dist/user.js.map +1 -1
  71. package/package.json +6 -7
  72. package/dist/childMatterBridgeFork.d.ts +0 -108
  73. package/dist/childMatterBridgeFork.d.ts.map +0 -1
  74. package/dist/childMatterBridgeFork.js +0 -330
  75. package/dist/childMatterBridgeFork.js.map +0 -1
  76. package/dist/childMatterBridgeService.d.ts +0 -166
  77. package/dist/childMatterBridgeService.d.ts.map +0 -1
  78. package/dist/childMatterBridgeService.js +0 -623
  79. package/dist/childMatterBridgeService.js.map +0 -1
  80. package/dist/matter/matterBridge.d.ts +0 -64
  81. package/dist/matter/matterBridge.d.ts.map +0 -1
  82. package/dist/matter/matterBridge.js +0 -154
  83. package/dist/matter/matterBridge.js.map +0 -1
  84. package/dist/matter/matterDevice.d.ts +0 -107
  85. package/dist/matter/matterDevice.d.ts.map +0 -1
  86. package/dist/matter/matterDevice.js +0 -913
  87. package/dist/matter/matterDevice.js.map +0 -1
  88. package/dist/matter/portAllocator.d.ts +0 -85
  89. package/dist/matter/portAllocator.d.ts.map +0 -1
  90. package/dist/matter/portAllocator.js +0 -296
  91. package/dist/matter/portAllocator.js.map +0 -1
@@ -1,40 +1,59 @@
1
- import { PlatformAccessory } from '../platformAccessory.js';
2
- import { MatterDevice } from './matterDevice.js';
1
+ /**
2
+ * Matter.js Server Implementation for Homebridge Plugin API
3
+ *
4
+ * This provides a Matter bridge that plugins can use to register
5
+ * Matter accessories via the Homebridge API.
6
+ */
3
7
  import { MatterServerConfig } from './matterSharedTypes.js';
8
+ import { clusters, MatterAccessory } from './matterTypes.js';
4
9
  export { MatterServerConfig } from './matterSharedTypes.js';
5
10
  /**
6
- * Real Matter.js Server for Homebridge
7
- * Creates a Matter bridge that exposes HAP accessories to Matter controllers
11
+ * Matter Server for Homebridge Plugin API
12
+ * Allows plugins to register Matter accessories explicitly
8
13
  */
9
14
  export declare class MatterServer {
10
15
  private readonly config;
11
16
  private serverNode;
12
17
  private aggregator;
13
- private devices;
14
- private removedDevices;
18
+ private accessories;
15
19
  private isRunning;
16
- private restartTimer;
17
- private isRestarting;
18
20
  private readonly MAX_DEVICES;
19
- private readonly MAX_REMOVED_DEVICES;
20
- private readonly RESTART_DELAY_MS;
21
21
  private shutdownHandler;
22
22
  private passcode;
23
23
  private discriminator;
24
- private vendorId;
25
- private productId;
24
+ private readonly vendorId;
25
+ private readonly productId;
26
26
  private commissioningInfo;
27
27
  private serialNumber?;
28
28
  private cleanupHandlers;
29
+ private storageManager;
30
+ private matterStoragePath?;
29
31
  constructor(config?: MatterServerConfig);
30
32
  /**
31
33
  * Generate a secure random passcode
34
+ * According to Matter spec, passcode must be:
35
+ * - 8 digits (00000001 to 99999998)
36
+ * - Not in the invalid list
37
+ * - Not sequential or repeating patterns
32
38
  */
33
39
  private generateSecurePasscode;
40
+ /**
41
+ * Validate a passcode according to Matter specifications
42
+ */
43
+ private isValidPasscode;
34
44
  /**
35
45
  * Generate a random discriminator
46
+ * According to Matter spec, discriminator must be:
47
+ * - 12 bits (0-4095)
48
+ * - Should be random for security
36
49
  */
37
50
  private generateRandomDiscriminator;
51
+ /**
52
+ * Create ServerNode with automatic recovery from corrupted storage
53
+ * If ServerNode creation fails due to corrupted fabric data, automatically
54
+ * clean up the ServerNodeStore and retry once
55
+ */
56
+ private createServerNodeWithRecovery;
38
57
  /**
39
58
  * Start the Matter server
40
59
  */
@@ -43,6 +62,11 @@ export declare class MatterServer {
43
62
  * Set up and validate storage
44
63
  */
45
64
  private setupStorage;
65
+ /**
66
+ * Load or generate commissioning credentials (passcode and discriminator)
67
+ * These must be persistent across restarts to maintain the same QR code
68
+ */
69
+ private loadOrGenerateCredentials;
46
70
  /**
47
71
  * Generate serial number for the bridge
48
72
  */
@@ -56,27 +80,65 @@ export declare class MatterServer {
56
80
  */
57
81
  private waitForServerReady;
58
82
  /**
59
- * Add a Homebridge accessory as a bridged Matter device
83
+ * Register a Matter accessory (Plugin API)
84
+ */
85
+ registerAccessory(accessory: MatterAccessory): Promise<void>;
86
+ /**
87
+ * Unregister a Matter accessory (Plugin API)
88
+ */
89
+ unregisterAccessory(uuid: string): Promise<void>;
90
+ /**
91
+ * Update a Matter accessory's state (Plugin API)
92
+ */
93
+ updateAccessoryState(uuid: string, cluster: string, attributes: Record<string, unknown>): Promise<void>;
94
+ /**
95
+ * Get all registered accessories (Plugin API)
96
+ */
97
+ getAccessories(): MatterAccessory[];
98
+ /**
99
+ * Get a specific accessory by UUID (Plugin API)
100
+ */
101
+ getAccessory(uuid: string): MatterAccessory | undefined;
102
+ /**
103
+ * Configure a Matter endpoint after it's been added to the aggregator
104
+ */
105
+ private configureEndpoint;
106
+ /**
107
+ * Stop the Matter server
108
+ */
109
+ stop(): Promise<void>;
110
+ /**
111
+ * Cleanup resources
112
+ */
113
+ private cleanup;
114
+ /**
115
+ * Get fabric information for commissioned controllers
60
116
  */
61
- addAccessory(accessory: PlatformAccessory): Promise<MatterDevice | null>;
117
+ getFabricInfo(): Array<{
118
+ fabricIndex: number;
119
+ fabricId: string;
120
+ nodeId: string;
121
+ rootVendorId: number;
122
+ label?: string;
123
+ }>;
62
124
  /**
63
- * Remove a Matter device
125
+ * Check if the server is commissioned
64
126
  */
65
- removeAccessory(accessory: PlatformAccessory): Promise<void>;
127
+ isCommissioned(): boolean;
66
128
  /**
67
- * Schedule a server restart to clean up removed endpoints
129
+ * Get the number of commissioned fabrics
68
130
  */
69
- private scheduleRestart;
131
+ getCommissionedFabricCount(): number;
70
132
  /**
71
- * Get server information
133
+ * Get server status information
72
134
  */
73
- getInfo(): {
135
+ getServerInfo(): {
74
136
  running: boolean;
75
137
  port: number;
76
138
  deviceCount: number;
77
- config: MatterServerConfig;
139
+ commissioned: boolean;
140
+ fabricCount: number;
78
141
  serialNumber?: string;
79
- commissioned?: boolean;
80
142
  };
81
143
  /**
82
144
  * Get commissioning information
@@ -84,27 +146,52 @@ export declare class MatterServer {
84
146
  getCommissioningInfo(): {
85
147
  qrCode?: string;
86
148
  manualPairingCode?: string;
149
+ serialNumber?: string;
150
+ passcode?: number;
151
+ discriminator?: number;
87
152
  commissioned: boolean;
88
153
  };
89
154
  /**
90
- * Check if the server is commissioned
91
- */
92
- isCommissioned(): boolean;
93
- /**
94
- * Get all Matter devices
95
- */
96
- getDevices(): Map<string, MatterDevice>;
97
- /**
98
- * Stop the Matter server
99
- */
100
- stop(): Promise<void>;
101
- /**
102
- * Cleanup resources
103
- */
104
- private cleanup;
155
+ * Get storage statistics
156
+ */
157
+ getStorageStats(): Array<{
158
+ entries: number;
159
+ namespace: string;
160
+ path: string;
161
+ }> | null;
162
+ /**
163
+ * Check if server is running
164
+ */
165
+ isServerRunning(): boolean;
166
+ /**
167
+ * Get Matter device types available for plugin use
168
+ */
169
+ getDeviceTypes(): {
170
+ readonly OnOffLight: import("@matter/node/devices").OnOffLightDevice;
171
+ readonly DimmableLight: import("@matter/node/devices").DimmableLightDevice;
172
+ readonly ColorTemperatureLight: import("@matter/node/devices").ColorTemperatureLightDevice;
173
+ readonly ExtendedColorLight: import("@matter/node/devices").ExtendedColorLightDevice;
174
+ readonly OnOffSwitch: import("@matter/node/devices").OnOffLightSwitchDevice;
175
+ readonly OnOffOutlet: import("@matter/node/devices").OnOffPlugInUnitDevice;
176
+ readonly DimmableOutlet: import("@matter/node/devices").DimmablePlugInUnitDevice;
177
+ readonly TemperatureSensor: import("@matter/node/devices").TemperatureSensorDevice;
178
+ readonly HumiditySensor: import("@matter/node/devices").HumiditySensorDevice;
179
+ readonly LightSensor: import("@matter/node/devices").LightSensorDevice;
180
+ readonly MotionSensor: import("@matter/node/devices").OccupancySensorDevice;
181
+ readonly ContactSensor: import("@matter/node/devices").ContactSensorDevice;
182
+ readonly LeakSensor: import("@matter/node/devices").WaterLeakDetectorDevice;
183
+ readonly SmokeSensor: import("@matter/node/devices").SmokeCoAlarmDevice;
184
+ readonly Thermostat: import("@matter/node/devices").ThermostatDevice;
185
+ readonly Fan: import("@matter/node/devices").FanDevice;
186
+ readonly DoorLock: import("@matter/node/devices").DoorLockDevice;
187
+ readonly WindowCovering: import("@matter/node/devices").WindowCoveringDevice;
188
+ readonly GenericSwitch: import("@matter/node/devices").GenericSwitchDevice;
189
+ readonly Pump: import("@matter/node/devices").PumpDevice;
190
+ readonly RoomAirConditioner: import("@matter/node/devices").RoomAirConditionerDevice;
191
+ };
105
192
  /**
106
- * Clean up all devices
193
+ * Get Matter clusters available for plugin use
107
194
  */
108
- private cleanupAllDevices;
195
+ getClusters(): typeof clusters;
109
196
  }
110
197
  //# sourceMappingURL=matterServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"matterServer.d.ts","sourceRoot":"","sources":["../../src/matter/matterServer.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D;;;GAGG;AACH,qBAAa,YAAY;IA4BX,OAAO,CAAC,QAAQ,CAAC,MAAM;IA3BnC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,eAAe,CAAqC;IAE5D,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,iBAAiB,CAInB;IAEN,OAAO,CAAC,YAAY,CAAC,CAAQ;IAE7B,OAAO,CAAC,eAAe,CAAwC;gBAElC,MAAM,GAAE,kBAAuB;IAoB5D;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+G5B;;OAEG;YACW,YAAY;IA6C1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;YACW,yBAAyB;IAmDvC;;OAEG;YACW,kBAAkB;IAchC;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAgD9E;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyClE;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACH,OAAO,IAAI;QACT,OAAO,EAAE,OAAO,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,kBAAkB,CAAA;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB;IAqBD;;OAEG;IACH,oBAAoB,IAAI;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;QAC1B,YAAY,EAAE,OAAO,CAAA;KACtB;IAOD;;OAEG;IACH,cAAc,IAAI,OAAO;IAUzB;;OAEG;IACH,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAIvC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC3B;;OAEG;YACW,OAAO;IA+BrB;;OAEG;YACW,iBAAiB;CAoBhC"}
1
+ {"version":3,"file":"matterServer.d.ts","sourceRoot":"","sources":["../../src/matter/matterServer.ts"],"names":[],"mappings":"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"}