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.
Files changed (104) hide show
  1. package/dist/childBridgeFork.d.ts +0 -5
  2. package/dist/childBridgeFork.d.ts.map +1 -1
  3. package/dist/childBridgeFork.js +4 -9
  4. package/dist/childBridgeFork.js.map +1 -1
  5. package/dist/childBridgeService.d.ts +7 -0
  6. package/dist/childBridgeService.d.ts.map +1 -1
  7. package/dist/childBridgeService.js.map +1 -1
  8. package/dist/index.d.ts +24 -5
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +23 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/ipcService.d.ts +2 -4
  13. package/dist/ipcService.d.ts.map +1 -1
  14. package/dist/ipcService.js +0 -2
  15. package/dist/ipcService.js.map +1 -1
  16. package/dist/matter/ChildBridgeMatterManager.d.ts +2 -2
  17. package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -1
  18. package/dist/matter/ChildBridgeMatterManager.js +10 -8
  19. package/dist/matter/ChildBridgeMatterManager.js.map +1 -1
  20. package/dist/matter/MatterBridgeManager.d.ts +0 -4
  21. package/dist/matter/MatterBridgeManager.d.ts.map +1 -1
  22. package/dist/matter/MatterBridgeManager.js +0 -13
  23. package/dist/matter/MatterBridgeManager.js.map +1 -1
  24. package/dist/matter/behaviors/ColorControlBehavior.d.ts +6 -7
  25. package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -1
  26. package/dist/matter/behaviors/ColorControlBehavior.js +146 -83
  27. package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -1
  28. package/dist/matter/behaviors/DoorLockBehavior.d.ts +2 -3
  29. package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -1
  30. package/dist/matter/behaviors/DoorLockBehavior.js +46 -24
  31. package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -1
  32. package/dist/matter/behaviors/DoorLockBehavior.spec.js +24 -12
  33. package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -1
  34. package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -1
  35. package/dist/matter/behaviors/FanControlBehavior.js +41 -15
  36. package/dist/matter/behaviors/FanControlBehavior.js.map +1 -1
  37. package/dist/matter/behaviors/IdentifyBehavior.d.ts +1 -2
  38. package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -1
  39. package/dist/matter/behaviors/IdentifyBehavior.js +20 -6
  40. package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -1
  41. package/dist/matter/behaviors/IdentifyBehavior.spec.js +3 -3
  42. package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -1
  43. package/dist/matter/behaviors/LevelControlBehavior.d.ts +5 -6
  44. package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -1
  45. package/dist/matter/behaviors/LevelControlBehavior.js +100 -37
  46. package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -1
  47. package/dist/matter/behaviors/LevelControlBehavior.spec.js +15 -10
  48. package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -1
  49. package/dist/matter/behaviors/OnOffBehavior.d.ts +3 -4
  50. package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -1
  51. package/dist/matter/behaviors/OnOffBehavior.js +64 -32
  52. package/dist/matter/behaviors/OnOffBehavior.js.map +1 -1
  53. package/dist/matter/behaviors/OnOffBehavior.spec.js +27 -15
  54. package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -1
  55. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +1 -1
  56. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -1
  57. package/dist/matter/behaviors/RvcCleanModeBehavior.js +20 -6
  58. package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -1
  59. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +3 -2
  60. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -1
  61. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +3 -4
  62. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -1
  63. package/dist/matter/behaviors/RvcOperationalStateBehavior.js +60 -23
  64. package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -1
  65. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +1 -1
  66. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -1
  67. package/dist/matter/behaviors/RvcRunModeBehavior.js +20 -6
  68. package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -1
  69. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +3 -2
  70. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -1
  71. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +2 -3
  72. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -1
  73. package/dist/matter/behaviors/ServiceAreaBehavior.js +38 -12
  74. package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -1
  75. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +3 -2
  76. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -1
  77. package/dist/matter/behaviors/ThermostatBehavior.d.ts +1 -2
  78. package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -1
  79. package/dist/matter/behaviors/ThermostatBehavior.js +82 -34
  80. package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -1
  81. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +5 -6
  82. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -1
  83. package/dist/matter/behaviors/WindowCoveringBehavior.js +102 -50
  84. package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -1
  85. package/dist/matter/errors.d.ts +178 -0
  86. package/dist/matter/errors.d.ts.map +1 -0
  87. package/dist/matter/errors.js +200 -0
  88. package/dist/matter/errors.js.map +1 -0
  89. package/dist/matter/index.d.ts +1 -0
  90. package/dist/matter/index.d.ts.map +1 -1
  91. package/dist/matter/index.js +1 -0
  92. package/dist/matter/index.js.map +1 -1
  93. package/dist/matter/server.d.ts +9 -16
  94. package/dist/matter/server.d.ts.map +1 -1
  95. package/dist/matter/server.js +60 -142
  96. package/dist/matter/server.js.map +1 -1
  97. package/dist/matter/types.d.ts +11 -50
  98. package/dist/matter/types.d.ts.map +1 -1
  99. package/dist/matter/types.js +0 -17
  100. package/dist/matter/types.js.map +1 -1
  101. package/dist/server.d.ts.map +1 -1
  102. package/dist/server.js +0 -7
  103. package/dist/server.js.map +1 -1
  104. 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 handle handler execution errors gracefully', () => {
53
+ it('should propagate handler execution errors', async () => {
54
54
  mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
55
- // Should not throw (returns undefined, not a promise)
56
- expect(() => behavior.lockDoor()).not.toThrow();
55
+ // Should throw/reject when handler fails
56
+ await expect(behavior.lockDoor()).rejects.toThrow('Handler failed');
57
57
  });
58
- it('should sync state even if handler fails', async () => {
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
- await behavior.lockDoor();
62
- expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
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 handle handler execution errors gracefully', () => {
87
+ it('should propagate handler execution errors', async () => {
82
88
  mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
83
- // Should not throw (returns undefined, not a promise)
84
- expect(() => behavior.unlockDoor()).not.toThrow();
89
+ // Should throw/reject when handler fails
90
+ await expect(behavior.unlockDoor()).rejects.toThrow('Handler failed');
85
91
  });
86
- it('should sync state even if handler fails', async () => {
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
- await behavior.unlockDoor();
90
- expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 2 });
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":"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"}
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;AAErE;;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;CA4C5B"}
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
- // Execute user handler (errors are logged by registry)
28
- HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'fanModeChange', { fanMode: value, oldFanMode: oldValue }).catch(() => {
29
- // Error already logged by registry
30
- });
31
- HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', { fanMode: value });
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
- // Execute user handler (errors are logged by registry)
36
- HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'percentSettingChange', { percentSetting: value, oldPercentSetting: oldValue }).catch(() => {
37
- // Error already logged by registry
38
- });
39
- HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', {
40
- percentSetting: value,
41
- percentCurrent: value,
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;AAErE;;GAEG;AACH,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IACtD,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEQ,UAAU;QACjB,KAAK,CAAC,UAAU,EAAE,CAAA;QAElB,8CAA8C;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAEpE,oDAAoD;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACpF,CAAC;IAED,oBAAoB,CAAC,KAAa,EAAE,QAAgB;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,0BAA0B,CAAC,QAAQ,CAAC,cAAc,CAChD,UAAU,EACV,YAAY,EACZ,eAAe,EACf,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CACzC,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,0BAA0B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IACpG,CAAC;IAED,2BAA2B,CAAC,KAAoB,EAAE,QAAuB;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,0BAA0B,CAAC,QAAQ,CAAC,cAAc,CAChD,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CACvD,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,0BAA0B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE;YAC7E,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAA;IACJ,CAAC;CACF"}
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): MaybePromise;
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,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,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;AAEhE;;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;IAI3C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,GAAG,YAAY;CAUnE"}
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
- // Execute user handler (errors are logged by registry)
21
- HomebridgeIdentifyServer.registry.executeHandler(endpointId, 'identify', 'identify', request).catch(() => {
22
- // Error already logged by registry
23
- });
24
- return super.identify(request);
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;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE;;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,QAAQ,CAAC,OAAiC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACvG,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;CACF"}
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
- // Should not throw
54
- expect(() => behavior.identify(request)).not.toThrow();
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":"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"}
1
+ {"version":3,"file":"IdentifyBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":"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"}
@@ -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): MaybePromise<void>;
15
+ moveToLevel(request: LevelControl.MoveToLevelRequest): Promise<void>;
17
16
  /**
18
17
  * Handle move command
19
18
  */
20
- move(request: LevelControl.MoveRequest): MaybePromise<void>;
19
+ move(request: LevelControl.MoveRequest): Promise<void>;
21
20
  /**
22
21
  * Handle step command
23
22
  */
24
- step(request: LevelControl.StepRequest): MaybePromise<void>;
23
+ step(request: LevelControl.StepRequest): Promise<void>;
25
24
  /**
26
25
  * Handle stop command
27
26
  */
28
- stop(request: LevelControl.StopRequest): MaybePromise<void>;
27
+ stop(request: LevelControl.StopRequest): Promise<void>;
29
28
  /**
30
29
  * Handle moveToLevelWithOnOff command
31
30
  */
32
- moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): MaybePromise<void>;
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,cAAc,CAAA;AAChD,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;AAEzE,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;OAEG;IACM,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC;IAwBlF;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC;CAqB5F"}
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
- // Execute user handler (errors are logged by registry)
18
- HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevel', request).catch(() => {
19
- // Error already logged by registry
20
- });
21
- // Call base implementation
22
- const result = super.moveToLevel(request);
23
- // Sync state to cache
24
- HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
25
- currentLevel: request.level,
26
- });
27
- return result;
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
- HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'move', request).catch(() => {
35
- // Error already logged by registry
36
- });
37
- return super.move(request);
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
- HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'step', request).catch(() => {
45
- // Error already logged by registry
46
- });
47
- return super.step(request);
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
- HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'stop', request).catch(() => {
55
- // Error already logged by registry
56
- });
57
- return super.stop(request);
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
- HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevelWithOnOff', request).catch(() => {
65
- // Error already logged by registry
66
- });
67
- const result = super.moveToLevelWithOnOff(request);
68
- // Sync state to cache
69
- HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
70
- currentLevel: request.level,
71
- });
72
- return result;
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;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEzE,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED;;OAEG;IACM,WAAW,CAAC,OAAwC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,aAAa,EACb,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAEzC,sBAAsB;QACtB,4BAA4B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE;YACjF,YAAY,EAAE,OAAO,CAAC,KAAK;SAC5B,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,oBAAoB,CAAC,OAAwC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAElD,sBAAsB;QACtB,4BAA4B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE;YACjF,YAAY,EAAE,OAAO,CAAC,KAAK;SAC5B,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
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
- expect(() => behavior.moveToLevel(request)).not.toThrow();
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
- expect(() => behavior.move(request)).not.toThrow();
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
- expect(() => behavior.step(request)).not.toThrow();
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
- expect(() => behavior.stop(request)).not.toThrow();
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
- expect(() => behavior.moveToLevelWithOnOff(request)).not.toThrow();
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
  });