matterbridge 3.2.6-dev-20250904-1c6290c → 3.2.6-dev-20250904-a79f653

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/CHANGELOG.md CHANGED
@@ -22,6 +22,11 @@ If you like this project and find it useful, please consider giving it a star on
22
22
  - [frontend]: Bumped `frontend` version to 2.7.5.
23
23
  - [childbridge]: Added restart needed when the plugin is first added in childbridge mode.
24
24
  - [childbridge]: Create the server node for Dynamic plugins even if they have 0 devices. This allow to pair empty plugins in huge setup.
25
+ - [select]: Enhanced documentation for Platform setSelectDevice, setSelectDeviceEntity, and setSelectEntity methods with schema examples (see the Jsdoc of the methods).
26
+ - [MatterbridgeEndpoint]: Improved documentation in jsdoc.
27
+ - [AirConditioner]: Added AirConditioner() class and Jest test. It is not supported by the Home app. Improved createDefaultThermostatUserInterfaceConfigurationClusterServer().
28
+ - [DeviceTypes]: Add Chapter 10. Media Device Types.
29
+ - [Speaker]: Added Speaker() class and Jest test. Supported only by SmartThings.
25
30
 
26
31
  ### Changed
27
32
 
@@ -0,0 +1,17 @@
1
+ import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
2
+ import { FanControl } from '@matter/main/clusters/fan-control';
3
+ import { airConditioner, powerSource } from '../matterbridgeDeviceTypes.js';
4
+ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
+ export class AirConditioner extends MatterbridgeEndpoint {
6
+ constructor(name, serial, options = {}) {
7
+ const { localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 1, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, temperatureDisplayMode = ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius, keypadLockout = ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout, scheduleProgrammingVisibility = ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted, fanMode = FanControl.FanMode.Off, fanModeSequence = FanControl.FanModeSequence.OffLowMedHighAuto, percentSetting = 0, percentCurrent = 0, } = options;
8
+ super([airConditioner, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
9
+ this.createDefaultIdentifyClusterServer();
10
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Air Conditioner');
11
+ this.createDefaultPowerSourceWiredClusterServer();
12
+ this.createDeadFrontOnOffClusterServer(true);
13
+ this.createDefaultThermostatClusterServer(localTemperature, occupiedHeatingSetpoint, occupiedCoolingSetpoint, minSetpointDeadBand, minHeatSetpointLimit, maxHeatSetpointLimit, minCoolSetpointLimit, maxCoolSetpointLimit);
14
+ this.createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode, keypadLockout, scheduleProgrammingVisibility);
15
+ this.createDefaultFanControlClusterServer(fanMode, fanModeSequence, percentSetting, percentCurrent);
16
+ }
17
+ }
@@ -1,3 +1,4 @@
1
+ export * from './speaker.js';
1
2
  export * from './roboticVacuumCleaner.js';
2
3
  export * from './laundryWasher.js';
3
4
  export * from './laundryDryer.js';
@@ -7,6 +8,7 @@ export * from './microwaveOven.js';
7
8
  export * from './oven.js';
8
9
  export * from './cooktop.js';
9
10
  export * from './refrigerator.js';
11
+ export * from './airConditioner.js';
10
12
  export * from './waterHeater.js';
11
13
  export * from './evse.js';
12
14
  export * from './solarPower.js';
@@ -0,0 +1,35 @@
1
+ import { OnOff, LevelControl } from '@matter/main/clusters';
2
+ import { speakerDevice } from '../matterbridgeDeviceTypes.js';
3
+ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
+ export class Speaker extends MatterbridgeEndpoint {
5
+ constructor(name, serial, muted = false, volume = 128) {
6
+ if (!Number.isFinite(volume))
7
+ volume = 128;
8
+ if (volume < 1)
9
+ volume = 1;
10
+ if (volume > 254)
11
+ volume = 254;
12
+ super([speakerDevice], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
13
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Speaker');
14
+ this.createOnOffClusterServer(!muted);
15
+ this.createLevelControlClusterServer(volume);
16
+ }
17
+ async setMuted(muted) {
18
+ await this.setAttribute(OnOff.Cluster.id, 'onOff', !muted);
19
+ }
20
+ isMuted() {
21
+ return !this.getAttribute(OnOff.Cluster.id, 'onOff');
22
+ }
23
+ async setVolume(level) {
24
+ if (!Number.isFinite(level))
25
+ return;
26
+ if (level < 1)
27
+ level = 1;
28
+ if (level > 254)
29
+ level = 254;
30
+ await this.setAttribute(LevelControl.Cluster.id, 'currentLevel', level);
31
+ }
32
+ getVolume() {
33
+ return this.getAttribute(LevelControl.Cluster.id, 'currentLevel');
34
+ }
35
+ }
@@ -0,0 +1,174 @@
1
+ import { rmSync } from 'node:fs';
2
+ import { inspect } from 'node:util';
3
+ import { DeviceTypeId, Endpoint, Environment, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel, Lifecycle } from '@matter/main';
4
+ import { AggregatorEndpoint, RootEndpoint } from '@matter/main/endpoints';
5
+ import { MdnsService } from '@matter/main/protocol';
6
+ export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
7
+ for (let i = 0; i < ticks; i++)
8
+ await new Promise((resolve) => setImmediate(resolve));
9
+ for (let i = 0; i < microTurns; i++)
10
+ await Promise.resolve();
11
+ if (pause)
12
+ await new Promise((resolve) => setTimeout(resolve, pause));
13
+ }
14
+ export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2) {
15
+ const nodeStore = targetServer.env.get(ServerNodeStore);
16
+ for (let i = 0; i < rounds; i++) {
17
+ await new Promise((resolve) => setImmediate(resolve));
18
+ await nodeStore.endpointStores.close();
19
+ }
20
+ }
21
+ function collectAllEndpoints(root) {
22
+ const list = [];
23
+ const walk = (ep) => {
24
+ list.push(ep);
25
+ if (ep.parts) {
26
+ for (const child of ep.parts) {
27
+ walk(child);
28
+ }
29
+ }
30
+ };
31
+ walk(root);
32
+ return list;
33
+ }
34
+ export async function assertAllEndpointNumbersPersisted(targetServer) {
35
+ const nodeStore = targetServer.env.get(ServerNodeStore);
36
+ await nodeStore.endpointStores.close();
37
+ const all = collectAllEndpoints(targetServer);
38
+ for (const ep of all) {
39
+ const store = nodeStore.storeForEndpoint(ep);
40
+ if (ep.maybeNumber === 0) {
41
+ expect(store.number ?? 0).toBe(0);
42
+ }
43
+ else {
44
+ expect(store.number).toBeGreaterThan(0);
45
+ }
46
+ }
47
+ return all.length;
48
+ }
49
+ export function createTestEnvironment(homeDir) {
50
+ expect(homeDir).toBeDefined();
51
+ expect(typeof homeDir).toBe('string');
52
+ expect(homeDir.length).toBeGreaterThan(5);
53
+ rmSync(homeDir, { recursive: true, force: true });
54
+ const environment = Environment.default;
55
+ environment.vars.set('log.level', MatterLogLevel.DEBUG);
56
+ environment.vars.set('log.format', MatterLogFormat.ANSI);
57
+ environment.vars.set('path.root', homeDir);
58
+ environment.vars.set('runtime.signals', false);
59
+ environment.vars.set('runtime.exitcode', false);
60
+ return environment;
61
+ }
62
+ export async function startServerNode(name, port) {
63
+ const server = await ServerNode.create({
64
+ id: name + 'ServerNode',
65
+ productDescription: {
66
+ name: name + 'ServerNode',
67
+ deviceType: DeviceTypeId(RootEndpoint.deviceType),
68
+ vendorId: VendorId(0xfff1),
69
+ productId: 0x8000,
70
+ },
71
+ basicInformation: {
72
+ vendorId: VendorId(0xfff1),
73
+ vendorName: 'Matterbridge',
74
+ productId: 0x8000,
75
+ productName: 'Matterbridge ' + name,
76
+ nodeLabel: name + 'ServerNode',
77
+ hardwareVersion: 1,
78
+ softwareVersion: 1,
79
+ reachable: true,
80
+ },
81
+ network: {
82
+ port,
83
+ },
84
+ });
85
+ expect(server).toBeDefined();
86
+ expect(server.lifecycle.isReady).toBeTruthy();
87
+ const aggregator = new Endpoint(AggregatorEndpoint, {
88
+ id: name + 'AggregatorNode',
89
+ });
90
+ expect(aggregator).toBeDefined();
91
+ await server.add(aggregator);
92
+ expect(server.parts.has(aggregator.id)).toBeTruthy();
93
+ expect(server.parts.has(aggregator)).toBeTruthy();
94
+ expect(aggregator.lifecycle.isReady).toBeTruthy();
95
+ expect(server.lifecycle.isOnline).toBeFalsy();
96
+ await new Promise((resolve) => {
97
+ server.lifecycle.online.on(async () => {
98
+ resolve();
99
+ });
100
+ server.start();
101
+ });
102
+ expect(server.lifecycle.isReady).toBeTruthy();
103
+ expect(server.lifecycle.isOnline).toBeTruthy();
104
+ expect(server.lifecycle.isCommissioned).toBeFalsy();
105
+ expect(server.lifecycle.isPartsReady).toBeTruthy();
106
+ expect(server.lifecycle.hasId).toBeTruthy();
107
+ expect(server.lifecycle.hasNumber).toBeTruthy();
108
+ expect(aggregator.lifecycle.isReady).toBeTruthy();
109
+ expect(aggregator.lifecycle.isInstalled).toBeTruthy();
110
+ expect(aggregator.lifecycle.isPartsReady).toBeTruthy();
111
+ expect(aggregator.lifecycle.hasId).toBeTruthy();
112
+ expect(aggregator.lifecycle.hasNumber).toBeTruthy();
113
+ return [server, aggregator];
114
+ }
115
+ export async function stopServerNode(server) {
116
+ await flushAllEndpointNumberPersistence(server);
117
+ await assertAllEndpointNumbersPersisted(server);
118
+ expect(server).toBeDefined();
119
+ expect(server.lifecycle.isReady).toBeTruthy();
120
+ expect(server.lifecycle.isOnline).toBeTruthy();
121
+ await server.close();
122
+ expect(server.lifecycle.isReady).toBeTruthy();
123
+ expect(server.lifecycle.isOnline).toBeFalsy();
124
+ await server.env.get(MdnsService)[Symbol.asyncDispose]();
125
+ await flushAsync();
126
+ }
127
+ export async function addDevice(owner, device) {
128
+ expect(owner).toBeDefined();
129
+ expect(device).toBeDefined();
130
+ expect(owner.lifecycle.isReady).toBeTruthy();
131
+ expect(owner.construction.status).toBe(Lifecycle.Status.Active);
132
+ expect(owner.lifecycle.isPartsReady).toBeTruthy();
133
+ try {
134
+ await owner.add(device);
135
+ }
136
+ catch (error) {
137
+ const errorMessage = error instanceof Error ? error.message : error;
138
+ const errorInspect = inspect(error, { depth: 10 });
139
+ console.error(`Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
140
+ return false;
141
+ }
142
+ expect(owner.parts.has(device)).toBeTruthy();
143
+ expect(owner.lifecycle.isPartsReady).toBeTruthy();
144
+ expect(device.lifecycle.isReady).toBeTruthy();
145
+ expect(device.lifecycle.isInstalled).toBeTruthy();
146
+ expect(device.lifecycle.hasId).toBeTruthy();
147
+ expect(device.lifecycle.hasNumber).toBeTruthy();
148
+ expect(device.construction.status).toBe(Lifecycle.Status.Active);
149
+ return true;
150
+ }
151
+ export async function deleteDevice(owner, device) {
152
+ expect(owner).toBeDefined();
153
+ expect(device).toBeDefined();
154
+ expect(owner.lifecycle.isReady).toBeTruthy();
155
+ expect(owner.construction.status).toBe(Lifecycle.Status.Active);
156
+ expect(owner.lifecycle.isPartsReady).toBeTruthy();
157
+ try {
158
+ await device.delete();
159
+ }
160
+ catch (error) {
161
+ const errorMessage = error instanceof Error ? error.message : error;
162
+ const errorInspect = inspect(error, { depth: 10 });
163
+ console.error(`Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
164
+ return false;
165
+ }
166
+ expect(owner.parts.has(device)).toBeFalsy();
167
+ expect(owner.lifecycle.isPartsReady).toBeTruthy();
168
+ expect(device.lifecycle.isReady).toBeFalsy();
169
+ expect(device.lifecycle.isInstalled).toBeFalsy();
170
+ expect(device.lifecycle.hasId).toBeTruthy();
171
+ expect(device.lifecycle.hasNumber).toBeTruthy();
172
+ expect(device.construction.status).toBe(Lifecycle.Status.Destroyed);
173
+ return true;
174
+ }
@@ -1,71 +1,88 @@
1
1
  import { DeviceTypeId } from '@matter/main';
2
+ import { AccountLogin } from '@matter/main/clusters/account-login';
3
+ import { Actions } from '@matter/main/clusters/actions';
4
+ import { ActivatedCarbonFilterMonitoring } from '@matter/main/clusters/activated-carbon-filter-monitoring';
5
+ import { AdministratorCommissioning } from '@matter/main/clusters/administrator-commissioning';
6
+ import { AirQuality } from '@matter/main/clusters/air-quality';
7
+ import { ApplicationLauncher } from '@matter/main/clusters/application-launcher';
8
+ import { AudioOutput } from '@matter/main/clusters/audio-output';
2
9
  import { BooleanState } from '@matter/main/clusters/boolean-state';
3
10
  import { BooleanStateConfiguration } from '@matter/main/clusters/boolean-state-configuration';
4
11
  import { BridgedDeviceBasicInformation } from '@matter/main/clusters/bridged-device-basic-information';
5
12
  import { CarbonDioxideConcentrationMeasurement } from '@matter/main/clusters/carbon-dioxide-concentration-measurement';
6
13
  import { CarbonMonoxideConcentrationMeasurement } from '@matter/main/clusters/carbon-monoxide-concentration-measurement';
14
+ import { Channel } from '@matter/main/clusters/channel';
7
15
  import { ColorControl } from '@matter/main/clusters/color-control';
16
+ import { CommissionerControl } from '@matter/main/clusters/commissioner-control';
17
+ import { ContentControl } from '@matter/main/clusters/content-control';
18
+ import { ContentLauncher } from '@matter/main/clusters/content-launcher';
8
19
  import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
20
+ import { DeviceEnergyManagementMode } from '@matter/main/clusters/device-energy-management-mode';
21
+ import { DishwasherAlarm } from '@matter/main/clusters/dishwasher-alarm';
22
+ import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
9
23
  import { DoorLock } from '@matter/main/clusters/door-lock';
24
+ import { EcosystemInformation } from '@matter/main/clusters/ecosystem-information';
10
25
  import { ElectricalEnergyMeasurement } from '@matter/main/clusters/electrical-energy-measurement';
11
26
  import { ElectricalPowerMeasurement } from '@matter/main/clusters/electrical-power-measurement';
27
+ import { EnergyEvse } from '@matter/main/clusters/energy-evse';
28
+ import { EnergyEvseMode } from '@matter/main/clusters/energy-evse-mode';
29
+ import { EnergyPreference } from '@matter/main/clusters/energy-preference';
12
30
  import { FanControl } from '@matter/main/clusters/fan-control';
13
31
  import { FlowMeasurement } from '@matter/main/clusters/flow-measurement';
14
32
  import { FormaldehydeConcentrationMeasurement } from '@matter/main/clusters/formaldehyde-concentration-measurement';
15
33
  import { Groups } from '@matter/main/clusters/groups';
34
+ import { HepaFilterMonitoring } from '@matter/main/clusters/hepa-filter-monitoring';
16
35
  import { Identify } from '@matter/main/clusters/identify';
17
36
  import { IlluminanceMeasurement } from '@matter/main/clusters/illuminance-measurement';
37
+ import { KeypadInput } from '@matter/main/clusters/keypad-input';
38
+ import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-controls';
39
+ import { LaundryWasherControls } from '@matter/main/clusters/laundry-washer-controls';
40
+ import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
18
41
  import { LevelControl } from '@matter/main/clusters/level-control';
42
+ import { LowPower } from '@matter/main/clusters/low-power';
43
+ import { MediaInput } from '@matter/main/clusters/media-input';
44
+ import { MediaPlayback } from '@matter/main/clusters/media-playback';
45
+ import { Messages } from '@matter/main/clusters/messages';
46
+ import { MicrowaveOvenControl } from '@matter/main/clusters/microwave-oven-control';
47
+ import { MicrowaveOvenMode } from '@matter/main/clusters/microwave-oven-mode';
19
48
  import { ModeSelect } from '@matter/main/clusters/mode-select';
20
49
  import { NitrogenDioxideConcentrationMeasurement } from '@matter/main/clusters/nitrogen-dioxide-concentration-measurement';
21
50
  import { OccupancySensing } from '@matter/main/clusters/occupancy-sensing';
22
51
  import { OnOff } from '@matter/main/clusters/on-off';
52
+ import { OperationalState } from '@matter/main/clusters/operational-state';
53
+ import { OtaSoftwareUpdateProvider } from '@matter/main/clusters/ota-software-update-provider';
54
+ import { OtaSoftwareUpdateRequestor } from '@matter/main/clusters/ota-software-update-requestor';
55
+ import { OvenCavityOperationalState } from '@matter/main/clusters/oven-cavity-operational-state';
56
+ import { OvenMode } from '@matter/main/clusters/oven-mode';
23
57
  import { OzoneConcentrationMeasurement } from '@matter/main/clusters/ozone-concentration-measurement';
24
- import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement';
25
58
  import { Pm1ConcentrationMeasurement } from '@matter/main/clusters/pm1-concentration-measurement';
59
+ import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement';
26
60
  import { Pm25ConcentrationMeasurement } from '@matter/main/clusters/pm25-concentration-measurement';
27
61
  import { PowerSource } from '@matter/main/clusters/power-source';
28
62
  import { PowerTopology } from '@matter/main/clusters/power-topology';
29
63
  import { PressureMeasurement } from '@matter/main/clusters/pressure-measurement';
30
64
  import { PumpConfigurationAndControl } from '@matter/main/clusters/pump-configuration-and-control';
31
65
  import { RadonConcentrationMeasurement } from '@matter/main/clusters/radon-concentration-measurement';
66
+ import { RefrigeratorAlarm } from '@matter/main/clusters/refrigerator-alarm';
67
+ import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/main/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
32
68
  import { RelativeHumidityMeasurement } from '@matter/main/clusters/relative-humidity-measurement';
69
+ import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
70
+ import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state';
71
+ import { RvcRunMode } from '@matter/main/clusters/rvc-run-mode';
72
+ import { ServiceArea } from '@matter/main/clusters/service-area';
33
73
  import { SmokeCoAlarm } from '@matter/main/clusters/smoke-co-alarm';
34
74
  import { Switch } from '@matter/main/clusters/switch';
75
+ import { TargetNavigator } from '@matter/main/clusters/target-navigator';
76
+ import { TemperatureControl } from '@matter/main/clusters/temperature-control';
35
77
  import { TemperatureMeasurement } from '@matter/main/clusters/temperature-measurement';
36
78
  import { Thermostat } from '@matter/main/clusters/thermostat';
79
+ import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
37
80
  import { TotalVolatileOrganicCompoundsConcentrationMeasurement } from '@matter/main/clusters/total-volatile-organic-compounds-concentration-measurement';
38
81
  import { ValveConfigurationAndControl } from '@matter/main/clusters/valve-configuration-and-control';
82
+ import { WakeOnLan } from '@matter/main/clusters/wake-on-lan';
83
+ import { WaterHeaterManagement } from '@matter/main/clusters/water-heater-management';
84
+ import { WaterHeaterMode } from '@matter/main/clusters/water-heater-mode';
39
85
  import { WindowCovering } from '@matter/main/clusters/window-covering';
40
- import { AirQuality } from '@matter/main/clusters/air-quality';
41
- import { Actions } from '@matter/main/clusters/actions';
42
- import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
43
- import { EnergyPreference } from '@matter/main/clusters/energy-preference';
44
- import { RvcRunMode } from '@matter/main/clusters/rvc-run-mode';
45
- import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state';
46
- import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
47
- import { HepaFilterMonitoring } from '@matter/main/clusters/hepa-filter-monitoring';
48
- import { ActivatedCarbonFilterMonitoring } from '@matter/main/clusters/activated-carbon-filter-monitoring';
49
- import { DeviceEnergyManagementMode } from '@matter/main/clusters/device-energy-management-mode';
50
- import { AdministratorCommissioning } from '@matter/main/clusters/administrator-commissioning';
51
- import { EcosystemInformation } from '@matter/main/clusters/ecosystem-information';
52
- import { CommissionerControl } from '@matter/main/clusters/commissioner-control';
53
- import { DishwasherAlarm } from '@matter/main/clusters/dishwasher-alarm';
54
- import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
55
- import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-controls';
56
- import { LaundryWasherControls } from '@matter/main/clusters/laundry-washer-controls';
57
- import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
58
- import { MicrowaveOvenControl } from '@matter/main/clusters/microwave-oven-control';
59
- import { MicrowaveOvenMode } from '@matter/main/clusters/microwave-oven-mode';
60
- import { OperationalState } from '@matter/main/clusters/operational-state';
61
- import { OvenCavityOperationalState } from '@matter/main/clusters/oven-cavity-operational-state';
62
- import { OvenMode } from '@matter/main/clusters/oven-mode';
63
- import { RefrigeratorAlarm } from '@matter/main/clusters/refrigerator-alarm';
64
- import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/main/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
65
- import { ServiceArea } from '@matter/main/clusters/service-area';
66
- import { TemperatureControl } from '@matter/main/clusters/temperature-control';
67
- import { OtaSoftwareUpdateRequestor } from '@matter/main/clusters/ota-software-update-requestor';
68
- import { EnergyEvse, EnergyEvseMode, OtaSoftwareUpdateProvider, WaterHeaterManagement, WaterHeaterMode } from '@matter/main/clusters';
69
86
  export var DeviceClasses;
70
87
  (function (DeviceClasses) {
71
88
  DeviceClasses["Node"] = "Node";
@@ -405,6 +422,41 @@ export const airPurifier = DeviceTypeDefinition({
405
422
  requiredServerClusters: [Identify.Cluster.id, FanControl.Cluster.id],
406
423
  optionalServerClusters: [Groups.Cluster.id, OnOff.Cluster.id, HepaFilterMonitoring.Cluster.id, ActivatedCarbonFilterMonitoring.Cluster.id],
407
424
  });
425
+ export const basicVideoPlayer = DeviceTypeDefinition({
426
+ name: 'MA-basicVideoPlayer',
427
+ code: 0x0028,
428
+ deviceClass: DeviceClasses.Simple,
429
+ revision: 2,
430
+ requiredServerClusters: [OnOff.Cluster.id, MediaPlayback.Cluster.id, KeypadInput.Cluster.id],
431
+ optionalServerClusters: [WakeOnLan.Cluster.id, Channel.Cluster.id, TargetNavigator.Cluster.id, MediaInput.Cluster.id, LowPower.Cluster.id, AudioOutput.Cluster.id, ContentControl.Cluster.id, Messages.Cluster.id],
432
+ });
433
+ export const castingVideoPlayer = DeviceTypeDefinition({
434
+ name: 'MA-castingVideoPlayer',
435
+ code: 0x0023,
436
+ deviceClass: DeviceClasses.Simple,
437
+ revision: 2,
438
+ requiredServerClusters: [OnOff.Cluster.id, MediaPlayback.Cluster.id, KeypadInput.Cluster.id, ContentLauncher.Cluster.id],
439
+ optionalServerClusters: [
440
+ WakeOnLan.Cluster.id,
441
+ Channel.Cluster.id,
442
+ TargetNavigator.Cluster.id,
443
+ MediaInput.Cluster.id,
444
+ LowPower.Cluster.id,
445
+ AudioOutput.Cluster.id,
446
+ ApplicationLauncher.Cluster.id,
447
+ AccountLogin.Cluster.id,
448
+ ContentControl.Cluster.id,
449
+ Messages.Cluster.id,
450
+ ],
451
+ });
452
+ export const speakerDevice = DeviceTypeDefinition({
453
+ name: 'MA-speaker',
454
+ code: 0x0022,
455
+ deviceClass: DeviceClasses.Simple,
456
+ revision: 1,
457
+ requiredServerClusters: [OnOff.Cluster.id, LevelControl.Cluster.id],
458
+ optionalServerClusters: [],
459
+ });
408
460
  export const modeSelect = DeviceTypeDefinition({
409
461
  name: 'MA-modeselect',
410
462
  code: 0x27,
@@ -795,11 +795,11 @@ export class MatterbridgeEndpoint extends Endpoint {
795
795
  });
796
796
  return this;
797
797
  }
798
- createDefaultThermostatUserInterfaceConfigurationClusterServer() {
798
+ createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode = ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius, keypadLockout = ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout, scheduleProgrammingVisibility = ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted) {
799
799
  this.behaviors.require(ThermostatUserInterfaceConfigurationServer, {
800
- temperatureDisplayMode: ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius,
801
- keypadLockout: ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout,
802
- scheduleProgrammingVisibility: ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted,
800
+ temperatureDisplayMode,
801
+ keypadLockout,
802
+ scheduleProgrammingVisibility,
803
803
  });
804
804
  return this;
805
805
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.2.6-dev-20250904-1c6290c",
3
+ "version": "3.2.6-dev-20250904-a79f653",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.2.6-dev-20250904-1c6290c",
9
+ "version": "3.2.6-dev-20250904-a79f653",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.15.3",
@@ -31,422 +31,6 @@
31
31
  "url": "https://www.buymeacoffee.com/luligugithub"
32
32
  }
33
33
  },
34
- "node_modules/@esbuild/aix-ppc64": {
35
- "version": "0.25.9",
36
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
37
- "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
38
- "cpu": [
39
- "ppc64"
40
- ],
41
- "license": "MIT",
42
- "optional": true,
43
- "os": [
44
- "aix"
45
- ],
46
- "engines": {
47
- "node": ">=18"
48
- }
49
- },
50
- "node_modules/@esbuild/android-arm": {
51
- "version": "0.25.9",
52
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
53
- "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
54
- "cpu": [
55
- "arm"
56
- ],
57
- "license": "MIT",
58
- "optional": true,
59
- "os": [
60
- "android"
61
- ],
62
- "engines": {
63
- "node": ">=18"
64
- }
65
- },
66
- "node_modules/@esbuild/android-arm64": {
67
- "version": "0.25.9",
68
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
69
- "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
70
- "cpu": [
71
- "arm64"
72
- ],
73
- "license": "MIT",
74
- "optional": true,
75
- "os": [
76
- "android"
77
- ],
78
- "engines": {
79
- "node": ">=18"
80
- }
81
- },
82
- "node_modules/@esbuild/android-x64": {
83
- "version": "0.25.9",
84
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
85
- "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
86
- "cpu": [
87
- "x64"
88
- ],
89
- "license": "MIT",
90
- "optional": true,
91
- "os": [
92
- "android"
93
- ],
94
- "engines": {
95
- "node": ">=18"
96
- }
97
- },
98
- "node_modules/@esbuild/darwin-arm64": {
99
- "version": "0.25.9",
100
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
101
- "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
102
- "cpu": [
103
- "arm64"
104
- ],
105
- "license": "MIT",
106
- "optional": true,
107
- "os": [
108
- "darwin"
109
- ],
110
- "engines": {
111
- "node": ">=18"
112
- }
113
- },
114
- "node_modules/@esbuild/darwin-x64": {
115
- "version": "0.25.9",
116
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
117
- "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
118
- "cpu": [
119
- "x64"
120
- ],
121
- "license": "MIT",
122
- "optional": true,
123
- "os": [
124
- "darwin"
125
- ],
126
- "engines": {
127
- "node": ">=18"
128
- }
129
- },
130
- "node_modules/@esbuild/freebsd-arm64": {
131
- "version": "0.25.9",
132
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
133
- "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
134
- "cpu": [
135
- "arm64"
136
- ],
137
- "license": "MIT",
138
- "optional": true,
139
- "os": [
140
- "freebsd"
141
- ],
142
- "engines": {
143
- "node": ">=18"
144
- }
145
- },
146
- "node_modules/@esbuild/freebsd-x64": {
147
- "version": "0.25.9",
148
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
149
- "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
150
- "cpu": [
151
- "x64"
152
- ],
153
- "license": "MIT",
154
- "optional": true,
155
- "os": [
156
- "freebsd"
157
- ],
158
- "engines": {
159
- "node": ">=18"
160
- }
161
- },
162
- "node_modules/@esbuild/linux-arm": {
163
- "version": "0.25.9",
164
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
165
- "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
166
- "cpu": [
167
- "arm"
168
- ],
169
- "license": "MIT",
170
- "optional": true,
171
- "os": [
172
- "linux"
173
- ],
174
- "engines": {
175
- "node": ">=18"
176
- }
177
- },
178
- "node_modules/@esbuild/linux-arm64": {
179
- "version": "0.25.9",
180
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
181
- "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
182
- "cpu": [
183
- "arm64"
184
- ],
185
- "license": "MIT",
186
- "optional": true,
187
- "os": [
188
- "linux"
189
- ],
190
- "engines": {
191
- "node": ">=18"
192
- }
193
- },
194
- "node_modules/@esbuild/linux-ia32": {
195
- "version": "0.25.9",
196
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
197
- "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
198
- "cpu": [
199
- "ia32"
200
- ],
201
- "license": "MIT",
202
- "optional": true,
203
- "os": [
204
- "linux"
205
- ],
206
- "engines": {
207
- "node": ">=18"
208
- }
209
- },
210
- "node_modules/@esbuild/linux-loong64": {
211
- "version": "0.25.9",
212
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
213
- "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
214
- "cpu": [
215
- "loong64"
216
- ],
217
- "license": "MIT",
218
- "optional": true,
219
- "os": [
220
- "linux"
221
- ],
222
- "engines": {
223
- "node": ">=18"
224
- }
225
- },
226
- "node_modules/@esbuild/linux-mips64el": {
227
- "version": "0.25.9",
228
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
229
- "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
230
- "cpu": [
231
- "mips64el"
232
- ],
233
- "license": "MIT",
234
- "optional": true,
235
- "os": [
236
- "linux"
237
- ],
238
- "engines": {
239
- "node": ">=18"
240
- }
241
- },
242
- "node_modules/@esbuild/linux-ppc64": {
243
- "version": "0.25.9",
244
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
245
- "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
246
- "cpu": [
247
- "ppc64"
248
- ],
249
- "license": "MIT",
250
- "optional": true,
251
- "os": [
252
- "linux"
253
- ],
254
- "engines": {
255
- "node": ">=18"
256
- }
257
- },
258
- "node_modules/@esbuild/linux-riscv64": {
259
- "version": "0.25.9",
260
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
261
- "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
262
- "cpu": [
263
- "riscv64"
264
- ],
265
- "license": "MIT",
266
- "optional": true,
267
- "os": [
268
- "linux"
269
- ],
270
- "engines": {
271
- "node": ">=18"
272
- }
273
- },
274
- "node_modules/@esbuild/linux-s390x": {
275
- "version": "0.25.9",
276
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
277
- "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
278
- "cpu": [
279
- "s390x"
280
- ],
281
- "license": "MIT",
282
- "optional": true,
283
- "os": [
284
- "linux"
285
- ],
286
- "engines": {
287
- "node": ">=18"
288
- }
289
- },
290
- "node_modules/@esbuild/linux-x64": {
291
- "version": "0.25.9",
292
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
293
- "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
294
- "cpu": [
295
- "x64"
296
- ],
297
- "license": "MIT",
298
- "optional": true,
299
- "os": [
300
- "linux"
301
- ],
302
- "engines": {
303
- "node": ">=18"
304
- }
305
- },
306
- "node_modules/@esbuild/netbsd-arm64": {
307
- "version": "0.25.9",
308
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
309
- "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
310
- "cpu": [
311
- "arm64"
312
- ],
313
- "license": "MIT",
314
- "optional": true,
315
- "os": [
316
- "netbsd"
317
- ],
318
- "engines": {
319
- "node": ">=18"
320
- }
321
- },
322
- "node_modules/@esbuild/netbsd-x64": {
323
- "version": "0.25.9",
324
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
325
- "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
326
- "cpu": [
327
- "x64"
328
- ],
329
- "license": "MIT",
330
- "optional": true,
331
- "os": [
332
- "netbsd"
333
- ],
334
- "engines": {
335
- "node": ">=18"
336
- }
337
- },
338
- "node_modules/@esbuild/openbsd-arm64": {
339
- "version": "0.25.9",
340
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
341
- "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
342
- "cpu": [
343
- "arm64"
344
- ],
345
- "license": "MIT",
346
- "optional": true,
347
- "os": [
348
- "openbsd"
349
- ],
350
- "engines": {
351
- "node": ">=18"
352
- }
353
- },
354
- "node_modules/@esbuild/openbsd-x64": {
355
- "version": "0.25.9",
356
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
357
- "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
358
- "cpu": [
359
- "x64"
360
- ],
361
- "license": "MIT",
362
- "optional": true,
363
- "os": [
364
- "openbsd"
365
- ],
366
- "engines": {
367
- "node": ">=18"
368
- }
369
- },
370
- "node_modules/@esbuild/openharmony-arm64": {
371
- "version": "0.25.9",
372
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
373
- "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
374
- "cpu": [
375
- "arm64"
376
- ],
377
- "license": "MIT",
378
- "optional": true,
379
- "os": [
380
- "openharmony"
381
- ],
382
- "engines": {
383
- "node": ">=18"
384
- }
385
- },
386
- "node_modules/@esbuild/sunos-x64": {
387
- "version": "0.25.9",
388
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
389
- "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
390
- "cpu": [
391
- "x64"
392
- ],
393
- "license": "MIT",
394
- "optional": true,
395
- "os": [
396
- "sunos"
397
- ],
398
- "engines": {
399
- "node": ">=18"
400
- }
401
- },
402
- "node_modules/@esbuild/win32-arm64": {
403
- "version": "0.25.9",
404
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
405
- "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
406
- "cpu": [
407
- "arm64"
408
- ],
409
- "license": "MIT",
410
- "optional": true,
411
- "os": [
412
- "win32"
413
- ],
414
- "engines": {
415
- "node": ">=18"
416
- }
417
- },
418
- "node_modules/@esbuild/win32-ia32": {
419
- "version": "0.25.9",
420
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
421
- "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
422
- "cpu": [
423
- "ia32"
424
- ],
425
- "license": "MIT",
426
- "optional": true,
427
- "os": [
428
- "win32"
429
- ],
430
- "engines": {
431
- "node": ">=18"
432
- }
433
- },
434
- "node_modules/@esbuild/win32-x64": {
435
- "version": "0.25.9",
436
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
437
- "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
438
- "cpu": [
439
- "x64"
440
- ],
441
- "license": "MIT",
442
- "optional": true,
443
- "os": [
444
- "win32"
445
- ],
446
- "engines": {
447
- "node": ">=18"
448
- }
449
- },
450
34
  "node_modules/@isaacs/balanced-match": {
451
35
  "version": "4.0.1",
452
36
  "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
@@ -1162,47 +746,6 @@
1162
746
  "node": ">= 0.4"
1163
747
  }
1164
748
  },
1165
- "node_modules/esbuild": {
1166
- "version": "0.25.9",
1167
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
1168
- "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
1169
- "hasInstallScript": true,
1170
- "license": "MIT",
1171
- "bin": {
1172
- "esbuild": "bin/esbuild"
1173
- },
1174
- "engines": {
1175
- "node": ">=18"
1176
- },
1177
- "optionalDependencies": {
1178
- "@esbuild/aix-ppc64": "0.25.9",
1179
- "@esbuild/android-arm": "0.25.9",
1180
- "@esbuild/android-arm64": "0.25.9",
1181
- "@esbuild/android-x64": "0.25.9",
1182
- "@esbuild/darwin-arm64": "0.25.9",
1183
- "@esbuild/darwin-x64": "0.25.9",
1184
- "@esbuild/freebsd-arm64": "0.25.9",
1185
- "@esbuild/freebsd-x64": "0.25.9",
1186
- "@esbuild/linux-arm": "0.25.9",
1187
- "@esbuild/linux-arm64": "0.25.9",
1188
- "@esbuild/linux-ia32": "0.25.9",
1189
- "@esbuild/linux-loong64": "0.25.9",
1190
- "@esbuild/linux-mips64el": "0.25.9",
1191
- "@esbuild/linux-ppc64": "0.25.9",
1192
- "@esbuild/linux-riscv64": "0.25.9",
1193
- "@esbuild/linux-s390x": "0.25.9",
1194
- "@esbuild/linux-x64": "0.25.9",
1195
- "@esbuild/netbsd-arm64": "0.25.9",
1196
- "@esbuild/netbsd-x64": "0.25.9",
1197
- "@esbuild/openbsd-arm64": "0.25.9",
1198
- "@esbuild/openbsd-x64": "0.25.9",
1199
- "@esbuild/openharmony-arm64": "0.25.9",
1200
- "@esbuild/sunos-x64": "0.25.9",
1201
- "@esbuild/win32-arm64": "0.25.9",
1202
- "@esbuild/win32-ia32": "0.25.9",
1203
- "@esbuild/win32-x64": "0.25.9"
1204
- }
1205
- },
1206
749
  "node_modules/escape-html": {
1207
750
  "version": "1.0.3",
1208
751
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -1956,13 +1499,10 @@
1956
1499
  }
1957
1500
  },
1958
1501
  "node_modules/path-scurry/node_modules/lru-cache": {
1959
- "version": "11.2.0",
1960
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.0.tgz",
1961
- "integrity": "sha512-1oZqnd6TxE/NZyRZ21u+10DKV5sMqT0rJFlPbytSH/0UaXLvE/EurTrd2nDnHif6E1l8N9mothtWs/Um3RijjA==",
1502
+ "version": "11.2.1",
1503
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz",
1504
+ "integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==",
1962
1505
  "license": "ISC",
1963
- "dependencies": {
1964
- "esbuild": "^0.25.9"
1965
- },
1966
1506
  "engines": {
1967
1507
  "node": "20 || >=22"
1968
1508
  }
@@ -2030,18 +1570,34 @@
2030
1570
  }
2031
1571
  },
2032
1572
  "node_modules/raw-body": {
2033
- "version": "3.0.0",
2034
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
2035
- "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
1573
+ "version": "3.0.1",
1574
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
1575
+ "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
2036
1576
  "license": "MIT",
2037
1577
  "dependencies": {
2038
1578
  "bytes": "3.1.2",
2039
1579
  "http-errors": "2.0.0",
2040
- "iconv-lite": "0.6.3",
1580
+ "iconv-lite": "0.7.0",
2041
1581
  "unpipe": "1.0.0"
2042
1582
  },
2043
1583
  "engines": {
2044
- "node": ">= 0.8"
1584
+ "node": ">= 0.10"
1585
+ }
1586
+ },
1587
+ "node_modules/raw-body/node_modules/iconv-lite": {
1588
+ "version": "0.7.0",
1589
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
1590
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
1591
+ "license": "MIT",
1592
+ "dependencies": {
1593
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
1594
+ },
1595
+ "engines": {
1596
+ "node": ">=0.10.0"
1597
+ },
1598
+ "funding": {
1599
+ "type": "opencollective",
1600
+ "url": "https://opencollective.com/express"
2045
1601
  }
2046
1602
  },
2047
1603
  "node_modules/readable-stream": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.2.6-dev-20250904-1c6290c",
3
+ "version": "3.2.6-dev-20250904-a79f653",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -1,44 +0,0 @@
1
- import { ServerNodeStore } from '@matter/main';
2
- export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
3
- for (let i = 0; i < ticks; i++)
4
- await new Promise((resolve) => setImmediate(resolve));
5
- for (let i = 0; i < microTurns; i++)
6
- await Promise.resolve();
7
- if (pause)
8
- await new Promise((resolve) => setTimeout(resolve, pause));
9
- }
10
- export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2) {
11
- const nodeStore = targetServer.env.get(ServerNodeStore);
12
- for (let i = 0; i < rounds; i++) {
13
- await new Promise((resolve) => setImmediate(resolve));
14
- await nodeStore.endpointStores.close();
15
- }
16
- }
17
- function collectAllEndpoints(root) {
18
- const list = [];
19
- const walk = (ep) => {
20
- list.push(ep);
21
- if (ep.parts) {
22
- for (const child of ep.parts) {
23
- walk(child);
24
- }
25
- }
26
- };
27
- walk(root);
28
- return list;
29
- }
30
- export async function assertAllEndpointNumbersPersisted(targetServer) {
31
- const nodeStore = targetServer.env.get(ServerNodeStore);
32
- await nodeStore.endpointStores.close();
33
- const all = collectAllEndpoints(targetServer);
34
- for (const ep of all) {
35
- const store = nodeStore.storeForEndpoint(ep);
36
- if (ep.maybeNumber === 0) {
37
- expect(store.number ?? 0).toBe(0);
38
- }
39
- else {
40
- expect(store.number).toBeGreaterThan(0);
41
- }
42
- }
43
- return all.length;
44
- }