@matterbridge/core 3.7.5-dev-20260420-1c36532 → 3.7.5-dev-20260422-2a34593

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.
@@ -17,6 +17,7 @@ export declare class Frontend extends EventEmitter<FrontendEvents> {
17
17
  private listening;
18
18
  storedPassword: string | undefined;
19
19
  authClients: Set<string>;
20
+ authClientsTimeout: NodeJS.Timeout | undefined;
20
21
  private expressApp;
21
22
  private httpServer;
22
23
  private httpsServer;
package/dist/frontend.js CHANGED
@@ -27,6 +27,7 @@ export class Frontend extends EventEmitter {
27
27
  listening = false;
28
28
  storedPassword = undefined;
29
29
  authClients = new Set();
30
+ authClientsTimeout = undefined;
30
31
  expressApp;
31
32
  httpServer;
32
33
  httpsServer;
@@ -55,6 +56,8 @@ export class Frontend extends EventEmitter {
55
56
  this.server.on('broadcast_message', this.broadcastMsgHandler.bind(this));
56
57
  }
57
58
  destroy() {
59
+ clearTimeout(this.authClientsTimeout);
60
+ this.authClientsTimeout = undefined;
58
61
  this.server.off('broadcast_message', this.broadcastMsgHandler.bind(this));
59
62
  this.server.close();
60
63
  }
@@ -221,7 +224,9 @@ export class Frontend extends EventEmitter {
221
224
  if (this.webSocketServer?.clients.size === 0) {
222
225
  AnsiLogger.setGlobalCallback(undefined);
223
226
  this.log.debug('All WebSocket clients disconnected. WebSocketServer logger global callback removed');
224
- setTimeout(() => {
227
+ clearTimeout(this.authClientsTimeout);
228
+ this.authClientsTimeout = setTimeout(() => {
229
+ this.authClientsTimeout = undefined;
225
230
  this.log.debug('All WebSocket clients disconnected. Auth clients list cleared');
226
231
  if (this.webSocketServer?.clients.size === 0)
227
232
  this.authClients.clear();
@@ -13,6 +13,11 @@ export declare const updateAttributeMatterbridgeEndpointSpy: import("jest-mock")
13
13
  <T extends import("@matter/types").ClusterType, A extends keyof import("@matter/types").ClusterType.AttributeValues<T>>(cluster: T, attribute: A, value: import("@matter/types").ClusterType.AttributeValues<T>[A], log?: import("node-ansi-logger").AnsiLogger): Promise<boolean>;
14
14
  (cluster: import("@matter/types").ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: import("node-ansi-logger").AnsiLogger): Promise<boolean>;
15
15
  }>;
16
+ export declare const subscribeAttributeMatterbridgeEndpointSpy: import("jest-mock").SpiedFunction<{
17
+ <T extends import("@matter/node").Behavior.Type, A extends keyof import("@matter/node").Behavior.StateOf<T>>(cluster: T, attribute: A, listener: (newValue: import("@matter/node").Behavior.StateOf<T>[A], oldValue: import("@matter/node").Behavior.StateOf<T>[A], context: import("@matter/node").ActionContext) => void, log?: import("node-ansi-logger").AnsiLogger): Promise<boolean>;
18
+ <T extends import("@matter/types").ClusterType, A extends keyof import("@matter/types").ClusterType.AttributeValues<T>>(cluster: T, attribute: A, listener: (newValue: import("@matter/types").ClusterType.AttributeValues<T>[A], oldValue: import("@matter/types").ClusterType.AttributeValues<T>[A], context: import("@matter/node").ActionContext) => void, log?: import("node-ansi-logger").AnsiLogger): Promise<boolean>;
19
+ (cluster: import("@matter/types").ClusterId | string, attribute: string, listener: (newValue: any, oldValue: any, context: import("@matter/node").ActionContext) => void, log?: import("node-ansi-logger").AnsiLogger): Promise<boolean>;
20
+ }>;
16
21
  export declare const triggerEventMatterbridgeEndpointSpy: import("jest-mock").SpiedFunction<{
17
22
  <T extends import("@matter/node").Behavior.Type, E extends keyof import("@matter/types").ClusterType.EventsOf<T extends {
18
23
  cluster: infer C extends import("@matter/types").ClusterType;
@@ -3,5 +3,6 @@ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
3
3
  export const setClusterMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'setCluster');
4
4
  export const setAttributeMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'setAttribute');
5
5
  export const updateAttributeMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'updateAttribute');
6
+ export const subscribeAttributeMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'subscribeAttribute');
6
7
  export const triggerEventMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'triggerEvent');
7
8
  export const triggerSwitchEventMatterbridgeEndpointSpy = jest.spyOn(MatterbridgeEndpoint.prototype, 'triggerSwitchEvent');
@@ -10,11 +10,12 @@ export declare let frontend: Frontend;
10
10
  export declare let plugins: PluginManager;
11
11
  export declare let devices: DeviceManager;
12
12
  export declare function startMatterbridge(bridgeMode?: 'bridge' | 'childbridge' | 'controller' | '', frontendPort?: number, matterPort?: number, passcode?: number, discriminator?: number, pluginSize?: number, devicesSize?: number): Promise<Matterbridge>;
13
- export declare function stopMatterbridge(cleanupPause?: number, destroyPause?: number, closeMdns?: boolean): Promise<void>;
13
+ export declare function stopMatterbridge(cleanupPause?: number, destroyPause?: number, closeMdns?: boolean, closeRuntime?: boolean): Promise<void>;
14
14
  export declare function createMatterbridgeEnvironment(): Promise<Matterbridge>;
15
15
  export declare function startMatterbridgeEnvironment(port?: number, createOnly?: boolean): Promise<[ServerNode<ServerNode.RootEndpoint>, Endpoint<AggregatorEndpoint>]>;
16
16
  export declare function addMatterbridgePlatform(platform: MatterbridgePlatform, name?: string): void;
17
17
  export declare function stopMatterbridgeEnvironment(createOnly?: boolean): Promise<void>;
18
- export declare function destroyMatterbridgeEnvironment(cleanupPause?: number, destroyPause?: number, closeMdns?: boolean): Promise<void>;
18
+ export declare function destroyMatterbridgeEnvironment(cleanupPause?: number, destroyPause?: number, closeMdns?: boolean, closeRuntime?: boolean): Promise<void>;
19
19
  export declare function destroyInstance(matterbridge: Matterbridge, cleanupPause?: number, destroyPause?: number): Promise<void>;
20
20
  export declare function closeMdnsInstance(matterbridge: Matterbridge): Promise<void>;
21
+ export declare function closeRuntimeInstance(matterbridge: Matterbridge): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { Environment } from '@matter/general';
2
+ import { Environment, RuntimeService } from '@matter/general';
3
3
  import { MdnsService } from '@matter/protocol';
4
4
  import { MATTER_STORAGE_DIR, NODE_STORAGE_DIR } from '@matterbridge/types';
5
5
  import { rs, UNDERLINE, UNDERLINEOFF } from 'node-ansi-logger';
@@ -103,8 +103,8 @@ export async function startMatterbridge(bridgeMode = 'bridge', frontendPort = 82
103
103
  }
104
104
  return matterbridge;
105
105
  }
106
- export async function stopMatterbridge(cleanupPause = 10, destroyPause = 250, closeMdns = true) {
107
- await destroyMatterbridgeEnvironment(cleanupPause, destroyPause, closeMdns);
106
+ export async function stopMatterbridge(cleanupPause = 10, destroyPause = 250, closeMdns = false, closeRuntime = false) {
107
+ await destroyMatterbridgeEnvironment(cleanupPause, destroyPause, closeMdns, closeRuntime);
108
108
  }
109
109
  export async function createMatterbridgeEnvironment() {
110
110
  matterbridge = await Matterbridge.loadInstance(false);
@@ -222,19 +222,31 @@ export async function stopMatterbridgeEnvironment(createOnly = false) {
222
222
  matterbridge.nodeStorage = undefined;
223
223
  await flushAsync();
224
224
  }
225
- export async function destroyMatterbridgeEnvironment(cleanupPause = 10, destroyPause = 250, closeMdns = true) {
225
+ export async function destroyMatterbridgeEnvironment(cleanupPause = 10, destroyPause = 100, closeMdns = false, closeRuntime = false) {
226
226
  await destroyInstance(matterbridge, cleanupPause, destroyPause);
227
227
  if (closeMdns) {
228
228
  await closeMdnsInstance(matterbridge);
229
229
  }
230
+ if (closeRuntime) {
231
+ await closeRuntimeInstance(matterbridge);
232
+ }
230
233
  Matterbridge.instance = undefined;
231
234
  }
232
- export async function destroyInstance(matterbridge, cleanupPause = 10, destroyPause = 250) {
235
+ export async function destroyInstance(matterbridge, cleanupPause = 10, destroyPause = 10) {
233
236
  await matterbridge.cleanup('destroying instance...', false, cleanupPause);
234
237
  if (destroyPause > 0)
235
238
  await flushAsync(undefined, undefined, destroyPause);
236
239
  }
237
240
  export async function closeMdnsInstance(matterbridge) {
238
- const mdns = matterbridge.environment.get(MdnsService);
241
+ const environment = matterbridge.environment;
242
+ const mdns = environment.maybeGet(MdnsService);
243
+ if (!mdns)
244
+ return;
239
245
  await mdns.close();
246
+ environment.delete(MdnsService, mdns);
247
+ }
248
+ export async function closeRuntimeInstance(matterbridge) {
249
+ const environment = matterbridge.environment;
250
+ const runtime = environment.maybeGet(RuntimeService);
251
+ await runtime?.close();
240
252
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.7.5-dev-20260420-1c36532",
3
+ "version": "3.7.5-dev-20260422-2a34593",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -130,10 +130,10 @@
130
130
  ],
131
131
  "dependencies": {
132
132
  "@matter/main": "0.16.11",
133
- "@matterbridge/dgram": "3.7.5-dev-20260420-1c36532",
134
- "@matterbridge/thread": "3.7.5-dev-20260420-1c36532",
135
- "@matterbridge/types": "3.7.5-dev-20260420-1c36532",
136
- "@matterbridge/utils": "3.7.5-dev-20260420-1c36532",
133
+ "@matterbridge/dgram": "3.7.5-dev-20260422-2a34593",
134
+ "@matterbridge/thread": "3.7.5-dev-20260422-2a34593",
135
+ "@matterbridge/types": "3.7.5-dev-20260422-2a34593",
136
+ "@matterbridge/utils": "3.7.5-dev-20260422-2a34593",
137
137
  "escape-html": "1.0.3",
138
138
  "express": "5.2.1",
139
139
  "express-rate-limit": "8.3.2",