@matterbridge/core 3.11.1-dev-20261023-bb03f52 → 3.11.1-dev-20261025-9f9c3fa

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.
@@ -6,6 +6,7 @@ import { WebRtcTransportProvider } from '@matter/types/clusters/web-rtc-transpor
6
6
  import { StatusResponseError } from '@matter/types/common';
7
7
  import { EndpointNumber, FabricIndex, NodeId } from '@matter/types/datatype';
8
8
  import { Status, StreamUsage } from '@matter/types/globals';
9
+ import { protectPrototype } from '../protectPrototypes.js';
9
10
  import { MatterbridgeCameraAvStreamManagementServer } from './cameraAvStreamManagementServer.js';
10
11
  import { MatterbridgeServer } from './matterbridgeServer.js';
11
12
  import { WeriftWebRtcSession } from './weriftSession.js';
@@ -458,6 +459,7 @@ export class MatterbridgeWebRtcTransportProviderServer extends WebRtcTransportPr
458
459
  device.log.info(`MatterbridgeWebRtcTransportProviderServer.closeAllSessions: closed ${webRtcPeers.length} webRTC session(s) (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
459
460
  }
460
461
  }
462
+ protectPrototype(MatterbridgeWebRtcTransportProviderServer);
461
463
  (function (MatterbridgeWebRtcTransportProviderServer) {
462
464
  class State extends WebRtcTransportProviderServer.State {
463
465
  weriftOfferOptions = { offerVideo: true, offerAudio: true, videoSource: 'none', audioSource: 'none' };
@@ -1,5 +1,6 @@
1
1
  import { WebRtcTransportRequestorServer } from '@matter/node/behaviors/web-rtc-transport-requestor';
2
2
  import { WebRtcTransportRequestor } from '@matter/types/clusters/web-rtc-transport-requestor';
3
+ import { protectPrototype } from '../protectPrototypes.js';
3
4
  export class MatterbridgeWebRtcTransportRequestorServer extends WebRtcTransportRequestorServer {
4
5
  async offer(request) {
5
6
  await super.offer(request);
@@ -18,6 +19,7 @@ export class MatterbridgeWebRtcTransportRequestorServer extends WebRtcTransportR
18
19
  this.endpoint.emitCommand(WebRtcTransportRequestor, 'end', request, this.context);
19
20
  }
20
21
  }
22
+ protectPrototype(MatterbridgeWebRtcTransportRequestorServer);
21
23
  export function createDefaultWebRtcTransportRequestorClusterServer(endpoint) {
22
24
  endpoint.behaviors.require(MatterbridgeWebRtcTransportRequestorServer, { currentSessions: [] });
23
25
  return endpoint;
@@ -3,6 +3,7 @@ import { fireAndForget, getErrorMessage } from '@matterbridge/utils';
3
3
  import { AnsiLogger, MAGENTA } from 'node-ansi-logger';
4
4
  import { RTCPeerConnection, RTCRtpCodecParameters, useH264, useOPUS, usePCMU, useVP8 } from 'werift';
5
5
  import { navigator } from 'werift/nonstandard';
6
+ import { protectPrototype } from '../protectPrototypes.js';
6
7
  import { hasFfmpeg, runFfmpeg } from './ffmpeg.js';
7
8
  export class WeriftWebRtcSession {
8
9
  static activeSessions = new Set();
@@ -625,3 +626,4 @@ export class WeriftWebRtcSession {
625
626
  this.log.info(`RTCPeerConnection closed (connectionState=${this.peerConnection.connectionState})`);
626
627
  }
627
628
  }
629
+ protectPrototype(WeriftWebRtcSession);
package/dist/cli.js CHANGED
@@ -126,6 +126,8 @@ export async function main() {
126
126
  await startInspector();
127
127
  log.debug(`***Matterbridge.loadInstance(true) called`);
128
128
  const { Matterbridge } = await import('./matterbridge.js');
129
+ const { protectCorePrototypes } = await import('./protectPrototypes.js');
130
+ await protectCorePrototypes();
129
131
  instance = await Matterbridge.loadInstance(true);
130
132
  log.debug(`***Matterbridge.loadInstance(true) exited`);
131
133
  if (hasParameter('experimental-backend')) {
@@ -470,6 +470,9 @@ export function getVendorIdName(vendorId) {
470
470
  case 5264:
471
471
  vendorName = '(Shelly)';
472
472
  break;
473
+ case 5010:
474
+ vendorName = '(Tapo)';
475
+ break;
473
476
  case 0x1488:
474
477
  vendorName = '(ShortcutLabsFlic)';
475
478
  break;
@@ -32,6 +32,7 @@ interface MatterbridgeEvents {
32
32
  triggergarbagecollection: [];
33
33
  }
34
34
  export declare class Matterbridge extends EventEmitter<MatterbridgeEvents> {
35
+ #private;
35
36
  private readonly debug;
36
37
  private readonly verbose;
37
38
  private readonly diagnostic;
@@ -71,7 +72,6 @@ export declare class Matterbridge extends EventEmitter<MatterbridgeEvents> {
71
72
  readonly frontend: Frontend;
72
73
  nodeStorage: NodeStorageManager | undefined;
73
74
  nodeContext: NodeStorage | undefined;
74
- protected static instance: Matterbridge | undefined;
75
75
  shutdown: boolean;
76
76
  private readonly failCountLimit;
77
77
  hasCleanupStarted: boolean;
@@ -108,7 +108,7 @@ export class Matterbridge extends EventEmitter {
108
108
  frontend = new Frontend(this);
109
109
  nodeStorage;
110
110
  nodeContext;
111
- static instance;
111
+ static #instance;
112
112
  shutdown = false;
113
113
  failCountLimit = 300;
114
114
  hasCleanupStarted = false;
@@ -431,14 +431,14 @@ export class Matterbridge extends EventEmitter {
431
431
  }
432
432
  }
433
433
  static async loadInstance(initialize = false) {
434
- if (!Matterbridge.instance) {
435
- if (hasParameter('debug'))
436
- console.log(GREEN + 'Creating a new instance of Matterbridge.', initialize ? 'Initializing...' : 'Not initializing...', rs);
437
- Matterbridge.instance = new Matterbridge();
438
- if (initialize)
439
- await Matterbridge.instance.initialize();
440
- }
441
- return Matterbridge.instance;
434
+ if (Matterbridge.#instance)
435
+ throw new Error('Matterbridge instance already loaded');
436
+ if (hasParameter('debug'))
437
+ console.log(GREEN + 'Creating a new instance of Matterbridge.', initialize ? 'Initializing...' : 'Not initializing...', rs);
438
+ Matterbridge.#instance = new Matterbridge();
439
+ if (initialize)
440
+ await Matterbridge.#instance.initialize();
441
+ return Matterbridge.#instance;
442
442
  }
443
443
  async initialize() {
444
444
  this.emit('initialize_started');
@@ -1198,7 +1198,12 @@ export class Matterbridge extends EventEmitter {
1198
1198
  this.systemInformation.bunVersion = process.versions.bun;
1199
1199
  }
1200
1200
  this.systemInformation.hostname = os.hostname();
1201
- this.systemInformation.user = os.userInfo().username;
1201
+ try {
1202
+ this.systemInformation.user = os.userInfo().username;
1203
+ }
1204
+ catch {
1205
+ this.systemInformation.user = String(process.getuid?.() ?? 'unknown');
1206
+ }
1202
1207
  this.systemInformation.osType = os.type();
1203
1208
  this.systemInformation.osRelease = os.release();
1204
1209
  this.systemInformation.osPlatform = os.platform();
@@ -1596,18 +1601,18 @@ export class Matterbridge extends EventEmitter {
1596
1601
  if (restart) {
1597
1602
  if (message === 'updating...') {
1598
1603
  this.log.info('Cleanup completed. Updating...');
1599
- Matterbridge.instance = undefined;
1604
+ Matterbridge.#instance = undefined;
1600
1605
  this.emit('update');
1601
1606
  }
1602
1607
  else if (message === 'restarting...') {
1603
1608
  this.log.info('Cleanup completed. Restarting...');
1604
- Matterbridge.instance = undefined;
1609
+ Matterbridge.#instance = undefined;
1605
1610
  this.emit('restart');
1606
1611
  }
1607
1612
  }
1608
1613
  else {
1609
1614
  this.log.notice('Cleanup completed. Shutting down...');
1610
- Matterbridge.instance = undefined;
1615
+ Matterbridge.#instance = undefined;
1611
1616
  this.emit('shutdown');
1612
1617
  }
1613
1618
  this.hasCleanupStarted = false;
@@ -0,0 +1,4 @@
1
+ export declare function protectPrototype(type: {
2
+ readonly prototype: object;
3
+ }): void;
4
+ export declare function protectCorePrototypes(): Promise<void>;
@@ -0,0 +1,28 @@
1
+ import { logModuleLoaded } from '@matterbridge/utils/loader';
2
+ logModuleLoaded('ProtectPrototypes');
3
+ export function protectPrototype(type) {
4
+ Object.freeze(type.prototype);
5
+ }
6
+ export async function protectCorePrototypes() {
7
+ const { BroadcastServer } = await import('@matterbridge/thread/server');
8
+ const { ThreadsManager } = await import('@matterbridge/thread/manager');
9
+ const { MatterbridgeServer } = await import('./behaviors/matterbridgeServer.js');
10
+ const { Matterbridge } = await import('./matterbridge.js');
11
+ const { MatterbridgePlatform } = await import('./matterbridgePlatform.js');
12
+ const { MatterbridgeAccessoryPlatform } = await import('./matterbridgeAccessoryPlatform.js');
13
+ const { MatterbridgeDynamicPlatform } = await import('./matterbridgeDynamicPlatform.js');
14
+ const { MatterbridgeEndpoint } = await import('./matterbridgeEndpoint.js');
15
+ const { CommandHandler } = await import('./matterbridgeEndpointCommandHandler.js');
16
+ for (const type of [
17
+ BroadcastServer,
18
+ ThreadsManager,
19
+ Matterbridge,
20
+ MatterbridgeEndpoint,
21
+ CommandHandler,
22
+ MatterbridgeServer,
23
+ MatterbridgePlatform,
24
+ MatterbridgeDynamicPlatform,
25
+ MatterbridgeAccessoryPlatform,
26
+ ])
27
+ protectPrototype(type);
28
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.11.1-dev-20261023-bb03f52",
3
+ "version": "3.11.1-dev-20261025-9f9c3fa",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -136,10 +136,10 @@
136
136
  },
137
137
  "dependencies": {
138
138
  "@matter/main": "0.18.0",
139
- "@matterbridge/dgram": "3.11.1-dev-20261023-bb03f52",
140
- "@matterbridge/thread": "3.11.1-dev-20261023-bb03f52",
141
- "@matterbridge/types": "3.11.1-dev-20261023-bb03f52",
142
- "@matterbridge/utils": "3.11.1-dev-20261023-bb03f52",
139
+ "@matterbridge/dgram": "3.11.1-dev-20261025-9f9c3fa",
140
+ "@matterbridge/thread": "3.11.1-dev-20261025-9f9c3fa",
141
+ "@matterbridge/types": "3.11.1-dev-20261025-9f9c3fa",
142
+ "@matterbridge/utils": "3.11.1-dev-20261025-9f9c3fa",
143
143
  "escape-html": "1.0.3",
144
144
  "express": "5.3.0",
145
145
  "express-rate-limit": "8.7.1",