homebridge 2.0.0-beta.39 → 2.0.0-beta.40
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/dist/childBridgeFork.d.ts +0 -5
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +4 -9
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/childBridgeService.d.ts +7 -0
- package/dist/childBridgeService.d.ts.map +1 -1
- package/dist/childBridgeService.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/ipcService.d.ts +2 -4
- package/dist/ipcService.d.ts.map +1 -1
- package/dist/ipcService.js +0 -2
- package/dist/ipcService.js.map +1 -1
- package/dist/matter/ChildBridgeMatterManager.d.ts +2 -2
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -1
- package/dist/matter/ChildBridgeMatterManager.js +10 -8
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -1
- package/dist/matter/MatterBridgeManager.d.ts +0 -4
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -1
- package/dist/matter/MatterBridgeManager.js +0 -13
- package/dist/matter/MatterBridgeManager.js.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +6 -7
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.js +146 -83
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +2 -3
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.js +46 -24
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +24 -12
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.js +41 -15
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +1 -2
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.js +20 -6
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +3 -3
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +5 -6
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.js +100 -37
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +15 -10
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.d.ts +3 -4
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.js +64 -32
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.spec.js +27 -15
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +20 -6
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +3 -2
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +3 -4
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +60 -23
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.js +20 -6
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +3 -2
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +2 -3
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.js +38 -12
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +3 -2
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +1 -2
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.js +82 -34
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +5 -6
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.js +102 -50
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -1
- package/dist/matter/errors.d.ts +178 -0
- package/dist/matter/errors.d.ts.map +1 -0
- package/dist/matter/errors.js +200 -0
- package/dist/matter/errors.js.map +1 -0
- package/dist/matter/index.d.ts +1 -0
- package/dist/matter/index.d.ts.map +1 -1
- package/dist/matter/index.js +1 -0
- package/dist/matter/index.js.map +1 -1
- package/dist/matter/server.d.ts +9 -16
- package/dist/matter/server.d.ts.map +1 -1
- package/dist/matter/server.js +60 -142
- package/dist/matter/server.js.map +1 -1
- package/dist/matter/types.d.ts +11 -50
- package/dist/matter/types.d.ts.map +1 -1
- package/dist/matter/types.js +0 -17
- package/dist/matter/types.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +0 -7
- package/dist/server.js.map +1 -1
- package/package.json +6 -6
|
@@ -50,16 +50,22 @@ describe('homebridgeDoorLockServer', () => {
|
|
|
50
50
|
await behavior.lockDoor();
|
|
51
51
|
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
|
|
52
52
|
});
|
|
53
|
-
it('should
|
|
53
|
+
it('should propagate handler execution errors', async () => {
|
|
54
54
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
55
|
-
// Should
|
|
56
|
-
expect(
|
|
55
|
+
// Should throw/reject when handler fails
|
|
56
|
+
await expect(behavior.lockDoor()).rejects.toThrow('Handler failed');
|
|
57
57
|
});
|
|
58
|
-
it('should sync state
|
|
58
|
+
it('should not sync state if handler fails', async () => {
|
|
59
59
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
60
60
|
mockState.lockState = 1;
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
try {
|
|
62
|
+
await behavior.lockDoor();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Expected to throw
|
|
66
|
+
}
|
|
67
|
+
// State should NOT be synced when handler fails
|
|
68
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
63
69
|
});
|
|
64
70
|
it('should check lockState before syncing', async () => {
|
|
65
71
|
// When lockState is defined, it syncs
|
|
@@ -78,16 +84,22 @@ describe('homebridgeDoorLockServer', () => {
|
|
|
78
84
|
await behavior.unlockDoor();
|
|
79
85
|
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 2 });
|
|
80
86
|
});
|
|
81
|
-
it('should
|
|
87
|
+
it('should propagate handler execution errors', async () => {
|
|
82
88
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
83
|
-
// Should
|
|
84
|
-
expect(
|
|
89
|
+
// Should throw/reject when handler fails
|
|
90
|
+
await expect(behavior.unlockDoor()).rejects.toThrow('Handler failed');
|
|
85
91
|
});
|
|
86
|
-
it('should sync state
|
|
92
|
+
it('should not sync state if handler fails', async () => {
|
|
87
93
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
88
94
|
mockState.lockState = 2;
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
try {
|
|
96
|
+
await behavior.unlockDoor();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Expected to throw
|
|
100
|
+
}
|
|
101
|
+
// State should NOT be synced when handler fails
|
|
102
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
91
103
|
});
|
|
92
104
|
it('should check lockState before syncing', async () => {
|
|
93
105
|
// When lockState is defined, it syncs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DoorLockBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,YAA8B,CAAA;IAClC,IAAI,QAAkC,CAAA;IACtC,IAAI,YAAiB,CAAA;IACrB,IAAI,SAAgC,CAAA;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB;QACvB,YAAY,GAAG;YACb,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC/C,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;SACnB,CAAA;QAER,iCAAiC;QACjC,wBAAwB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAElD,oBAAoB;QACpB,SAAS,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA,CAAC,2BAA2B;QAExD,uBAAuB;QACvB,YAAY,GAAG;YACb,EAAE,EAAE,mBAAmB;SACxB,CAAA;QAED,kDAAkD;QAClD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;YAC1C,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE;YACvC,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACpB,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,SAAS,GAAG,KAAK,CAAA;YACnB,CAAC;YACD,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;YAEzB,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACvG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,SAAS,CAAC,SAAS,GAAG,CAAC,CAAA,CAAC,SAAS;YAEjC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;YAEzB,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CACxD,mBAAmB,EACnB,UAAU,EACV,EAAE,SAAS,EAAE,CAAC,EAAE,CACjB,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FanControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAKrE;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,gBAAgB;;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI3C,UAAU,IAAI,IAAI;CAoE5B"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Handles fan control commands for fans
|
|
5
5
|
*/
|
|
6
6
|
import { FanControlServer } from '@matter/main/behaviors/fan-control';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
7
9
|
/**
|
|
8
10
|
* Custom FanControl Server that calls plugin handlers
|
|
9
11
|
*/
|
|
@@ -22,24 +24,48 @@ export class HomebridgeFanControlServer extends FanControlServer {
|
|
|
22
24
|
// React to percentSetting attribute changes (speed)
|
|
23
25
|
this.reactTo(this.events.percentSetting$Changed, this.#handlePercentSettingChange);
|
|
24
26
|
}
|
|
25
|
-
#handleFanModeChange(value, oldValue) {
|
|
27
|
+
async #handleFanModeChange(value, oldValue) {
|
|
26
28
|
const endpointId = this.endpoint.id;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
try {
|
|
30
|
+
// Execute user handler
|
|
31
|
+
await HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'fanModeChange', { fanMode: value, oldFanMode: oldValue });
|
|
32
|
+
// Sync state to cache
|
|
33
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', { fanMode: value });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
37
|
+
// This sends a proper Matter protocol error response to the controller
|
|
38
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
42
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
throw new StatusResponseError(`Failed to change fan mode: ${message}`, Status.Failure);
|
|
45
|
+
}
|
|
32
46
|
}
|
|
33
|
-
#handlePercentSettingChange(value, oldValue) {
|
|
47
|
+
async #handlePercentSettingChange(value, oldValue) {
|
|
34
48
|
const endpointId = this.endpoint.id;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
try {
|
|
50
|
+
// Execute user handler
|
|
51
|
+
await HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'percentSettingChange', { percentSetting: value, oldPercentSetting: oldValue });
|
|
52
|
+
// Sync state to cache
|
|
53
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', {
|
|
54
|
+
percentSetting: value,
|
|
55
|
+
percentCurrent: value,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
60
|
+
// This sends a proper Matter protocol error response to the controller
|
|
61
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
65
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
66
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
|
+
throw new StatusResponseError(`Failed to change fan speed: ${message}`, Status.Failure);
|
|
68
|
+
}
|
|
43
69
|
}
|
|
44
70
|
}
|
|
45
71
|
//# sourceMappingURL=FanControlBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FanControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
5
|
*/
|
|
6
|
-
import type { MaybePromise } from '@matter/main';
|
|
7
6
|
import type { Identify } from '@matter/main/clusters';
|
|
8
7
|
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
9
8
|
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
@@ -16,6 +15,6 @@ export declare class HomebridgeIdentifyServer extends IdentifyServer {
|
|
|
16
15
|
* Set the behavior registry (called once during server initialization)
|
|
17
16
|
*/
|
|
18
17
|
static setRegistry(registry: BehaviorRegistry): void;
|
|
19
|
-
identify(request: Identify.IdentifyRequest):
|
|
18
|
+
identify(request: Identify.IdentifyRequest): Promise<void>;
|
|
20
19
|
}
|
|
21
20
|
//# sourceMappingURL=IdentifyBehavior.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentifyBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAKhE;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB1E"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
5
|
*/
|
|
6
6
|
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
7
9
|
/**
|
|
8
10
|
* Custom Identify Server that calls plugin handlers
|
|
9
11
|
*/
|
|
@@ -15,13 +17,25 @@ export class HomebridgeIdentifyServer extends IdentifyServer {
|
|
|
15
17
|
static setRegistry(registry) {
|
|
16
18
|
this.registry = registry;
|
|
17
19
|
}
|
|
18
|
-
identify(request) {
|
|
20
|
+
async identify(request) {
|
|
19
21
|
const endpointId = this.endpoint.id;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
try {
|
|
23
|
+
// Execute user handler
|
|
24
|
+
await HomebridgeIdentifyServer.registry.executeHandler(endpointId, 'identify', 'identify', request);
|
|
25
|
+
// Only reached if handler succeeded - call base implementation
|
|
26
|
+
return await super.identify(request);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
30
|
+
// This sends a proper Matter protocol error response to the controller
|
|
31
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
35
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
throw new StatusResponseError(`Failed to identify: ${message}`, Status.Failure);
|
|
38
|
+
}
|
|
25
39
|
}
|
|
26
40
|
}
|
|
27
41
|
//# sourceMappingURL=IdentifyBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentifyBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IAClD,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEQ,KAAK,CAAC,QAAQ,CAAC,OAAiC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;YAEnG,+DAA+D;YAC/D,OAAO,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAA;YACb,CAAC;YAED,4DAA4D;YAC5D,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,IAAI,mBAAmB,CAAC,uBAAuB,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -47,11 +47,11 @@ describe('homebridgeIdentifyServer', () => {
|
|
|
47
47
|
await behavior.identify(request);
|
|
48
48
|
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'identify', 'identify', request);
|
|
49
49
|
});
|
|
50
|
-
it('should handle handler execution errors gracefully', () => {
|
|
50
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
51
51
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
52
52
|
const request = { identifyTime: 5 };
|
|
53
|
-
//
|
|
54
|
-
expect(
|
|
53
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
54
|
+
await expect(behavior.identify(request)).rejects.toThrow('Failed to identify: Handler failed');
|
|
55
55
|
});
|
|
56
56
|
it('should call identify even if handler is not registered', () => {
|
|
57
57
|
mockRegistry.executeHandler = vi.fn().mockResolvedValue(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentifyBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,YAA8B,CAAA;IAClC,IAAI,QAAkC,CAAA;IACtC,IAAI,YAAiB,CAAA;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB;QACvB,YAAY,GAAG;YACb,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACzC,CAAA;QAER,iCAAiC;QACjC,wBAAwB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAElD,uBAAuB;QACvB,YAAY,GAAG;YACb,EAAE,EAAE,mBAAmB;SACxB,CAAA;QAED,kDAAkD;QAClD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;YAC1C,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,gDAAgD;QAChD,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAC5G,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;YAEpC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA,CAAC,aAAa;YAErD,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,YAA8B,CAAA;IAClC,IAAI,QAAkC,CAAA;IACtC,IAAI,YAAiB,CAAA;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB;QACvB,YAAY,GAAG;YACb,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACzC,CAAA;QAER,iCAAiC;QACjC,wBAAwB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAElD,uBAAuB;QACvB,YAAY,GAAG;YACb,EAAE,EAAE,mBAAmB;SACxB,CAAA;QAED,kDAAkD;QAClD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;YAC1C,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,gDAAgD;QAChD,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAC5G,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;YAEpC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA,CAAC,aAAa;YAErD,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,YAAY,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;YACpF,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,wEAAwE;YACxE,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAA;QAChG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,YAAY,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,mBAAmB;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles brightness/level control for dimmable lights
|
|
5
5
|
*/
|
|
6
|
-
import type { MaybePromise } from '@matter/main';
|
|
7
6
|
import type { LevelControl } from '@matter/main/clusters/level-control';
|
|
8
7
|
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
9
8
|
import { LevelControlServer } from '@matter/main/behaviors/level-control';
|
|
@@ -13,22 +12,22 @@ export declare class HomebridgeLevelControlServer extends LevelControlServer {
|
|
|
13
12
|
/**
|
|
14
13
|
* Handle moveToLevel command
|
|
15
14
|
*/
|
|
16
|
-
moveToLevel(request: LevelControl.MoveToLevelRequest):
|
|
15
|
+
moveToLevel(request: LevelControl.MoveToLevelRequest): Promise<void>;
|
|
17
16
|
/**
|
|
18
17
|
* Handle move command
|
|
19
18
|
*/
|
|
20
|
-
move(request: LevelControl.MoveRequest):
|
|
19
|
+
move(request: LevelControl.MoveRequest): Promise<void>;
|
|
21
20
|
/**
|
|
22
21
|
* Handle step command
|
|
23
22
|
*/
|
|
24
|
-
step(request: LevelControl.StepRequest):
|
|
23
|
+
step(request: LevelControl.StepRequest): Promise<void>;
|
|
25
24
|
/**
|
|
26
25
|
* Handle stop command
|
|
27
26
|
*/
|
|
28
|
-
stop(request: LevelControl.StopRequest):
|
|
27
|
+
stop(request: LevelControl.StopRequest): Promise<void>;
|
|
29
28
|
/**
|
|
30
29
|
* Handle moveToLevelWithOnOff command
|
|
31
30
|
*/
|
|
32
|
-
moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest):
|
|
31
|
+
moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): Promise<void>;
|
|
33
32
|
}
|
|
34
33
|
//# sourceMappingURL=LevelControlBehavior.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LevelControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"LevelControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAKzE,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;OAEG;IACY,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnF;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgC7F"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Handles brightness/level control for dimmable lights
|
|
5
5
|
*/
|
|
6
6
|
import { LevelControlServer } from '@matter/main/behaviors/level-control';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
7
9
|
export class HomebridgeLevelControlServer extends LevelControlServer {
|
|
8
10
|
static registry;
|
|
9
11
|
static setRegistry(registry) {
|
|
@@ -12,64 +14,125 @@ export class HomebridgeLevelControlServer extends LevelControlServer {
|
|
|
12
14
|
/**
|
|
13
15
|
* Handle moveToLevel command
|
|
14
16
|
*/
|
|
15
|
-
moveToLevel(request) {
|
|
17
|
+
async moveToLevel(request) {
|
|
16
18
|
const endpointId = this.endpoint.id;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
19
|
+
try {
|
|
20
|
+
// Execute user handler
|
|
21
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevel', request);
|
|
22
|
+
// Only reached if handler succeeded - update Matter state
|
|
23
|
+
await super.moveToLevel(request);
|
|
24
|
+
// Sync state to cache
|
|
25
|
+
HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
|
|
26
|
+
currentLevel: request.level,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
31
|
+
// This sends a proper Matter protocol error response to the controller
|
|
32
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
36
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
throw new StatusResponseError(`Failed to set level: ${message}`, Status.Failure);
|
|
39
|
+
}
|
|
28
40
|
}
|
|
29
41
|
/**
|
|
30
42
|
* Handle move command
|
|
31
43
|
*/
|
|
32
|
-
move(request) {
|
|
44
|
+
async move(request) {
|
|
33
45
|
const endpointId = this.endpoint.id;
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
try {
|
|
47
|
+
// Execute user handler
|
|
48
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'move', request);
|
|
49
|
+
// Only reached if handler succeeded
|
|
50
|
+
await super.move(request);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
54
|
+
// This sends a proper Matter protocol error response to the controller
|
|
55
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
59
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
60
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
+
throw new StatusResponseError(`Failed to move level: ${message}`, Status.Failure);
|
|
62
|
+
}
|
|
38
63
|
}
|
|
39
64
|
/**
|
|
40
65
|
* Handle step command
|
|
41
66
|
*/
|
|
42
|
-
step(request) {
|
|
67
|
+
async step(request) {
|
|
43
68
|
const endpointId = this.endpoint.id;
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
69
|
+
try {
|
|
70
|
+
// Execute user handler
|
|
71
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'step', request);
|
|
72
|
+
// Only reached if handler succeeded
|
|
73
|
+
await super.step(request);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
77
|
+
// This sends a proper Matter protocol error response to the controller
|
|
78
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
82
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
83
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
+
throw new StatusResponseError(`Failed to step level: ${message}`, Status.Failure);
|
|
85
|
+
}
|
|
48
86
|
}
|
|
49
87
|
/**
|
|
50
88
|
* Handle stop command
|
|
51
89
|
*/
|
|
52
|
-
stop(request) {
|
|
90
|
+
async stop(request) {
|
|
53
91
|
const endpointId = this.endpoint.id;
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
92
|
+
try {
|
|
93
|
+
// Execute user handler
|
|
94
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'stop', request);
|
|
95
|
+
// Only reached if handler succeeded
|
|
96
|
+
await super.stop(request);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
100
|
+
// This sends a proper Matter protocol error response to the controller
|
|
101
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
105
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
106
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
107
|
+
throw new StatusResponseError(`Failed to stop level change: ${message}`, Status.Failure);
|
|
108
|
+
}
|
|
58
109
|
}
|
|
59
110
|
/**
|
|
60
111
|
* Handle moveToLevelWithOnOff command
|
|
61
112
|
*/
|
|
62
|
-
moveToLevelWithOnOff(request) {
|
|
113
|
+
async moveToLevelWithOnOff(request) {
|
|
63
114
|
const endpointId = this.endpoint.id;
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
115
|
+
try {
|
|
116
|
+
// Execute user handler
|
|
117
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevelWithOnOff', request);
|
|
118
|
+
// Only reached if handler succeeded - update Matter state
|
|
119
|
+
await super.moveToLevelWithOnOff(request);
|
|
120
|
+
// Sync state to cache
|
|
121
|
+
HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
|
|
122
|
+
currentLevel: request.level,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
127
|
+
// This sends a proper Matter protocol error response to the controller
|
|
128
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
132
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
133
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
134
|
+
throw new StatusResponseError(`Failed to set level with on/off: ${message}`, Status.Failure);
|
|
135
|
+
}
|
|
73
136
|
}
|
|
74
137
|
}
|
|
75
138
|
//# sourceMappingURL=LevelControlBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LevelControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"LevelControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,10 +57,11 @@ describe('homebridgeLevelControlServer', () => {
|
|
|
57
57
|
await behavior.moveToLevel(request);
|
|
58
58
|
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 254 });
|
|
59
59
|
});
|
|
60
|
-
it('should handle handler execution errors gracefully', () => {
|
|
60
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
61
61
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
62
62
|
const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
|
|
63
|
-
|
|
63
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
64
|
+
await expect(behavior.moveToLevel(request)).rejects.toThrow('Failed to set level: Handler failed');
|
|
64
65
|
});
|
|
65
66
|
});
|
|
66
67
|
describe('move', () => {
|
|
@@ -74,10 +75,11 @@ describe('homebridgeLevelControlServer', () => {
|
|
|
74
75
|
await behavior.move(request);
|
|
75
76
|
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
76
77
|
});
|
|
77
|
-
it('should handle handler execution errors gracefully', () => {
|
|
78
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
78
79
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
79
80
|
const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
|
|
80
|
-
|
|
81
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
82
|
+
await expect(behavior.move(request)).rejects.toThrow('Failed to move level: Handler failed');
|
|
81
83
|
});
|
|
82
84
|
});
|
|
83
85
|
describe('step', () => {
|
|
@@ -91,10 +93,11 @@ describe('homebridgeLevelControlServer', () => {
|
|
|
91
93
|
await behavior.step(request);
|
|
92
94
|
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
93
95
|
});
|
|
94
|
-
it('should handle handler execution errors gracefully', () => {
|
|
96
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
95
97
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
96
98
|
const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
|
|
97
|
-
|
|
99
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
100
|
+
await expect(behavior.step(request)).rejects.toThrow('Failed to step level: Handler failed');
|
|
98
101
|
});
|
|
99
102
|
});
|
|
100
103
|
describe('stop', () => {
|
|
@@ -108,10 +111,11 @@ describe('homebridgeLevelControlServer', () => {
|
|
|
108
111
|
await behavior.stop(request);
|
|
109
112
|
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
110
113
|
});
|
|
111
|
-
it('should handle handler execution errors gracefully', () => {
|
|
114
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
112
115
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
113
116
|
const request = { optionsMask: {}, optionsOverride: {} };
|
|
114
|
-
|
|
117
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
118
|
+
await expect(behavior.stop(request)).rejects.toThrow('Failed to stop level change: Handler failed');
|
|
115
119
|
});
|
|
116
120
|
});
|
|
117
121
|
describe('moveToLevelWithOnOff', () => {
|
|
@@ -130,10 +134,11 @@ describe('homebridgeLevelControlServer', () => {
|
|
|
130
134
|
await behavior.moveToLevelWithOnOff(request);
|
|
131
135
|
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 0 });
|
|
132
136
|
});
|
|
133
|
-
it('should handle handler execution errors gracefully', () => {
|
|
137
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
134
138
|
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
135
139
|
const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
|
|
136
|
-
|
|
140
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
141
|
+
await expect(behavior.moveToLevelWithOnOff(request)).rejects.toThrow('Failed to set level with on/off: Handler failed');
|
|
137
142
|
});
|
|
138
143
|
});
|
|
139
144
|
});
|