matterbridge 1.7.2 → 2.0.0-edge.2

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 (102) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/dist/cli.js +3 -39
  3. package/dist/cluster/export.js +0 -2
  4. package/dist/defaultConfigSchema.js +0 -23
  5. package/dist/deviceManager.js +1 -26
  6. package/dist/frontend.js +1203 -0
  7. package/dist/index.js +1 -36
  8. package/dist/logger/export.js +0 -1
  9. package/dist/matter/export.js +0 -5
  10. package/dist/matterbridge.js +516 -2678
  11. package/dist/matterbridgeAccessoryPlatform.js +0 -33
  12. package/dist/matterbridgeBehaviors.js +23 -31
  13. package/dist/matterbridgeDeviceTypes.js +11 -82
  14. package/dist/matterbridgeDynamicPlatform.js +0 -33
  15. package/dist/matterbridgeEndpoint.js +45 -1145
  16. package/dist/matterbridgePlatform.js +14 -145
  17. package/dist/matterbridgeTypes.js +3 -24
  18. package/dist/pluginManager.js +5 -246
  19. package/dist/storage/export.js +0 -1
  20. package/dist/utils/colorUtils.js +2 -205
  21. package/dist/utils/export.js +0 -1
  22. package/dist/utils/utils.js +7 -252
  23. package/frontend/build/asset-manifest.json +3 -3
  24. package/frontend/build/index.html +1 -1
  25. package/frontend/build/static/js/{main.08241820.js → main.6204ae54.js} +3 -3
  26. package/frontend/build/static/js/main.6204ae54.js.map +1 -0
  27. package/npm-shrinkwrap.json +9 -9
  28. package/package.json +2 -3
  29. package/dist/cli.d.ts +0 -25
  30. package/dist/cli.d.ts.map +0 -1
  31. package/dist/cli.js.map +0 -1
  32. package/dist/cluster/export.d.ts +0 -2
  33. package/dist/cluster/export.d.ts.map +0 -1
  34. package/dist/cluster/export.js.map +0 -1
  35. package/dist/defaultConfigSchema.d.ts +0 -27
  36. package/dist/defaultConfigSchema.d.ts.map +0 -1
  37. package/dist/defaultConfigSchema.js.map +0 -1
  38. package/dist/deviceManager.d.ts +0 -46
  39. package/dist/deviceManager.d.ts.map +0 -1
  40. package/dist/deviceManager.js.map +0 -1
  41. package/dist/index.d.ts +0 -40
  42. package/dist/index.d.ts.map +0 -1
  43. package/dist/index.js.map +0 -1
  44. package/dist/logger/export.d.ts +0 -2
  45. package/dist/logger/export.d.ts.map +0 -1
  46. package/dist/logger/export.js.map +0 -1
  47. package/dist/matter/export.d.ts +0 -11
  48. package/dist/matter/export.d.ts.map +0 -1
  49. package/dist/matter/export.js.map +0 -1
  50. package/dist/matterbridge.d.ts +0 -483
  51. package/dist/matterbridge.d.ts.map +0 -1
  52. package/dist/matterbridge.js.map +0 -1
  53. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -39
  54. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  55. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  56. package/dist/matterbridgeBehaviors.d.ts +0 -942
  57. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  58. package/dist/matterbridgeBehaviors.js.map +0 -1
  59. package/dist/matterbridgeDevice.d.ts +0 -7077
  60. package/dist/matterbridgeDevice.d.ts.map +0 -1
  61. package/dist/matterbridgeDevice.js +0 -2736
  62. package/dist/matterbridgeDevice.js.map +0 -1
  63. package/dist/matterbridgeDeviceTypes.d.ts +0 -109
  64. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  65. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  66. package/dist/matterbridgeDynamicPlatform.d.ts +0 -39
  67. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  68. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  69. package/dist/matterbridgeEdge.d.ts +0 -91
  70. package/dist/matterbridgeEdge.d.ts.map +0 -1
  71. package/dist/matterbridgeEdge.js +0 -1077
  72. package/dist/matterbridgeEdge.js.map +0 -1
  73. package/dist/matterbridgeEndpoint.d.ts +0 -10156
  74. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  75. package/dist/matterbridgeEndpoint.js.map +0 -1
  76. package/dist/matterbridgePlatform.d.ts +0 -168
  77. package/dist/matterbridgePlatform.d.ts.map +0 -1
  78. package/dist/matterbridgePlatform.js.map +0 -1
  79. package/dist/matterbridgeTypes.d.ts +0 -172
  80. package/dist/matterbridgeTypes.d.ts.map +0 -1
  81. package/dist/matterbridgeTypes.js.map +0 -1
  82. package/dist/matterbridgeWebsocket.d.ts +0 -49
  83. package/dist/matterbridgeWebsocket.d.ts.map +0 -1
  84. package/dist/matterbridgeWebsocket.js +0 -325
  85. package/dist/matterbridgeWebsocket.js.map +0 -1
  86. package/dist/pluginManager.d.ts +0 -238
  87. package/dist/pluginManager.d.ts.map +0 -1
  88. package/dist/pluginManager.js.map +0 -1
  89. package/dist/storage/export.d.ts +0 -2
  90. package/dist/storage/export.d.ts.map +0 -1
  91. package/dist/storage/export.js.map +0 -1
  92. package/dist/utils/colorUtils.d.ts +0 -61
  93. package/dist/utils/colorUtils.d.ts.map +0 -1
  94. package/dist/utils/colorUtils.js.map +0 -1
  95. package/dist/utils/export.d.ts +0 -3
  96. package/dist/utils/export.d.ts.map +0 -1
  97. package/dist/utils/export.js.map +0 -1
  98. package/dist/utils/utils.d.ts +0 -221
  99. package/dist/utils/utils.d.ts.map +0 -1
  100. package/dist/utils/utils.js.map +0 -1
  101. package/frontend/build/static/js/main.08241820.js.map +0 -1
  102. /package/frontend/build/static/js/{main.08241820.js.LICENSE.txt → main.6204ae54.js.LICENSE.txt} +0 -0
@@ -1,172 +0,0 @@
1
- /**
2
- * This file contains the types for Matterbridge.
3
- *
4
- * @file matterbridgeTypes.ts
5
- * @author Luca Liguori
6
- * @date 2024-07-12
7
- * @version 1.0.2
8
- *
9
- * Copyright 2023, 2024, 2025 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License. *
22
- */
23
- import { NodeStorage } from 'node-persist-manager';
24
- import { LogLevel } from 'node-ansi-logger';
25
- import { MatterbridgePlatform, PlatformConfig, PlatformSchema } from './matterbridgePlatform.js';
26
- import { MatterbridgeDevice } from './matterbridgeDevice.js';
27
- import { FabricIndex, NodeId, VendorId, StorageContext, ServerNode, EndpointNumber, Endpoint as EndpointNode } from '@matter/main';
28
- import { ExposedFabricInformation } from '@matter/main/protocol';
29
- import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
30
- import { CommissioningServer } from '@project-chip/matter.js';
31
- import { Aggregator } from '@project-chip/matter.js/device';
32
- export declare const plg = "\u001B[38;5;33m";
33
- export declare const dev = "\u001B[38;5;79m";
34
- export declare const typ = "\u001B[38;5;207m";
35
- export interface RegisteredPlugin extends BaseRegisteredPlugin {
36
- nodeContext?: NodeStorage;
37
- storageContext?: StorageContext;
38
- commissioningServer?: CommissioningServer;
39
- aggregator?: Aggregator;
40
- device?: MatterbridgeDevice;
41
- platform?: MatterbridgePlatform;
42
- reachabilityTimeout?: NodeJS.Timeout;
43
- serverNode?: ServerNode<ServerNode.RootEndpoint>;
44
- aggregatorNode?: EndpointNode<AggregatorEndpoint>;
45
- }
46
- export interface BaseRegisteredPlugin {
47
- name: string;
48
- version: string;
49
- description: string;
50
- author: string;
51
- path: string;
52
- type: string;
53
- latestVersion?: string;
54
- locked?: boolean;
55
- error?: boolean;
56
- enabled?: boolean;
57
- loaded?: boolean;
58
- started?: boolean;
59
- configured?: boolean;
60
- paired?: boolean;
61
- connected?: boolean;
62
- fabricInformations?: SanitizedExposedFabricInformation[];
63
- sessionInformations?: SanitizedSessionInformation[];
64
- registeredDevices?: number;
65
- addedDevices?: number;
66
- qrPairingCode?: string;
67
- manualPairingCode?: string;
68
- configJson?: PlatformConfig;
69
- schemaJson?: PlatformSchema;
70
- }
71
- export interface SystemInformation {
72
- interfaceName: string;
73
- macAddress: string;
74
- ipv4Address: string;
75
- ipv6Address: string;
76
- nodeVersion: string;
77
- hostname: string;
78
- user: string;
79
- osType: string;
80
- osRelease: string;
81
- osPlatform: string;
82
- osArch: string;
83
- totalMemory: string;
84
- freeMemory: string;
85
- systemUptime: string;
86
- }
87
- export interface MatterbridgeInformation {
88
- homeDirectory: string;
89
- rootDirectory: string;
90
- matterbridgeDirectory: string;
91
- matterbridgePluginDirectory: string;
92
- globalModulesDirectory: string;
93
- matterbridgeVersion: string;
94
- matterbridgeLatestVersion: string;
95
- matterbridgeQrPairingCode: string | undefined;
96
- matterbridgeManualPairingCode: string | undefined;
97
- matterbridgeFabricInformations: SanitizedExposedFabricInformation[];
98
- matterbridgeSessionInformations: SanitizedSessionInformation[];
99
- matterbridgePaired: boolean;
100
- matterbridgeConnected: boolean;
101
- bridgeMode: string;
102
- restartMode: string;
103
- edge: boolean;
104
- readOnly: boolean;
105
- profile?: string;
106
- loggerLevel: LogLevel;
107
- fileLogger: boolean;
108
- matterLoggerLevel: number;
109
- matterFileLogger: boolean;
110
- mattermdnsinterface: string | undefined;
111
- matteripv4address: string | undefined;
112
- matteripv6address: string | undefined;
113
- matterPort: number;
114
- matterDiscriminator: number | undefined;
115
- matterPasscode: number | undefined;
116
- restartRequired: boolean;
117
- refreshRequired: boolean;
118
- }
119
- export interface SanitizedExposedFabricInformation {
120
- fabricIndex: FabricIndex;
121
- fabricId: string;
122
- nodeId: string;
123
- rootNodeId: string;
124
- rootVendorId: VendorId;
125
- rootVendorName: string;
126
- label: string;
127
- }
128
- export interface SessionInformation {
129
- name: string;
130
- nodeId: NodeId;
131
- peerNodeId: NodeId;
132
- fabric?: ExposedFabricInformation;
133
- isPeerActive: boolean;
134
- secure: boolean;
135
- lastInteractionTimestamp?: number;
136
- lastActiveTimestamp?: number;
137
- numberOfActiveSubscriptions: number;
138
- }
139
- export interface SanitizedSessionInformation {
140
- name: string;
141
- nodeId: string;
142
- peerNodeId: string;
143
- fabric?: SanitizedExposedFabricInformation;
144
- isPeerActive: boolean;
145
- secure: boolean;
146
- lastInteractionTimestamp?: string;
147
- lastActiveTimestamp?: string;
148
- numberOfActiveSubscriptions: number;
149
- }
150
- export interface ApiDevices {
151
- pluginName: string;
152
- type: string;
153
- endpoint: EndpointNumber | undefined;
154
- name: string;
155
- serial: string;
156
- productUrl: string;
157
- configUrl?: string;
158
- uniqueId: string;
159
- cluster: string;
160
- }
161
- export interface ApiClusters {
162
- endpoint: string;
163
- id: string;
164
- deviceTypes: number[];
165
- clusterName: string;
166
- clusterId: string;
167
- attributeName: string;
168
- attributeId: string;
169
- attributeValue: string;
170
- attributeLocalValue: unknown;
171
- }
172
- //# sourceMappingURL=matterbridgeTypes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"matterbridgeTypes.d.ts","sourceRoot":"","sources":["../src/matterbridgeTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matterbridgeTypes.js","sourceRoot":"","sources":["../src/matterbridgeTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmBH,iBAAiB;AACjB,MAAM,CAAC,MAAM,GAAG,GAAG,iBAAiB,CAAC;AACrC,MAAM,CAAC,MAAM,GAAG,GAAG,iBAAiB,CAAC;AACrC,MAAM,CAAC,MAAM,GAAG,GAAG,kBAAkB,CAAC"}
@@ -1,49 +0,0 @@
1
- /**
2
- * This file contains the function matterbridgeMessageHandler.
3
- *
4
- * @file matterbridgeWebsocket.ts
5
- * @author Luca Liguori
6
- * @date 2024-10-16
7
- * @version 1.0.0
8
- *
9
- * Copyright 2024, 2025, 2026 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License. *
22
- */
23
- import { Matterbridge } from './matterbridge.js';
24
- import WebSocket from 'ws';
25
- /**
26
- * Websocket message ID for logging.
27
- * @constant {number}
28
- */
29
- export declare const WS_ID_LOG = 0;
30
- /**
31
- * Websocket message ID indicating a refresh is needed.
32
- * @constant {number}
33
- */
34
- export declare const WS_ID_REFRESH_NEEDED = 1;
35
- /**
36
- * Websocket message ID indicating a restart is needed.
37
- * @constant {number}
38
- */
39
- export declare const WS_ID_RESTART_NEEDED = 2;
40
- /**
41
- * Handles incoming websocket messages for the Matterbridge.
42
- *
43
- * @param {Matterbridge} this - The Matterbridge instance.
44
- * @param {WebSocket} client - The websocket client that sent the message.
45
- * @param {WebSocket.RawData} message - The raw data of the message received from the client.
46
- * @returns {Promise<void>} A promise that resolves when the message has been handled.
47
- */
48
- export declare function wsMessageHandler(this: Matterbridge, client: WebSocket, message: WebSocket.RawData): Promise<void>;
49
- //# sourceMappingURL=matterbridgeWebsocket.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"matterbridgeWebsocket.d.ts","sourceRoot":"","sources":["../src/matterbridgeWebsocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOjD,OAAO,SAAS,MAAM,IAAI,CAAC;AAQ3B;;;GAGG;AACH,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B;;;GAGG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsPvH"}
@@ -1,325 +0,0 @@
1
- /**
2
- * This file contains the function matterbridgeMessageHandler.
3
- *
4
- * @file matterbridgeWebsocket.ts
5
- * @author Luca Liguori
6
- * @date 2024-10-16
7
- * @version 1.0.0
8
- *
9
- * Copyright 2024, 2025, 2026 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License. *
22
- */
23
- import { isValidNumber, isValidObject, isValidString } from './utils/utils.js';
24
- // AnsiLogger module
25
- import { debugStringify, stringify } from 'node-ansi-logger';
26
- // @matter
27
- import { EndpointServer, Logger } from '@matter/main';
28
- import { BasicInformationCluster, BridgedDeviceBasicInformationCluster } from '@matter/main/clusters';
29
- /**
30
- * Websocket message ID for logging.
31
- * @constant {number}
32
- */
33
- export const WS_ID_LOG = 0;
34
- /**
35
- * Websocket message ID indicating a refresh is needed.
36
- * @constant {number}
37
- */
38
- export const WS_ID_REFRESH_NEEDED = 1;
39
- /**
40
- * Websocket message ID indicating a restart is needed.
41
- * @constant {number}
42
- */
43
- export const WS_ID_RESTART_NEEDED = 2;
44
- /**
45
- * Handles incoming websocket messages for the Matterbridge.
46
- *
47
- * @param {Matterbridge} this - The Matterbridge instance.
48
- * @param {WebSocket} client - The websocket client that sent the message.
49
- * @param {WebSocket.RawData} message - The raw data of the message received from the client.
50
- * @returns {Promise<void>} A promise that resolves when the message has been handled.
51
- */
52
- export async function wsMessageHandler(client, message) {
53
- let data;
54
- try {
55
- data = JSON.parse(message.toString());
56
- if (!isValidNumber(data.id) || !isValidString(data.dst) || !isValidString(data.src) || !isValidString(data.method) || !isValidObject(data.params) || data.dst !== 'Matterbridge') {
57
- this.log.error(`Invalid message from websocket client: ${debugStringify(data)}`);
58
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Invalid message' }));
59
- return;
60
- }
61
- this.log.debug(`Received message from websocket client: ${debugStringify(data)}`);
62
- if (data.method === 'ping') {
63
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response: 'pong' }));
64
- return;
65
- }
66
- else if (data.method === '/api/login') {
67
- if (!this.nodeContext) {
68
- this.log.error('Login nodeContext not found');
69
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Internal error: nodeContext not found' }));
70
- return;
71
- }
72
- const storedPassword = await this.nodeContext.get('password', '');
73
- if (storedPassword === '' || storedPassword === data.params.password) {
74
- this.log.debug('Login password valid');
75
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response: { valid: true } }));
76
- return;
77
- }
78
- else {
79
- this.log.debug('Error wrong password');
80
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong password' }));
81
- return;
82
- }
83
- }
84
- else if (data.method === '/api/install') {
85
- if (!isValidString(data.params.packageName, 10)) {
86
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter packageName in /api/install' }));
87
- return;
88
- }
89
- this.spawnCommand('npm', ['install', '-g', data.params.packageName, '--omit=dev', '--verbose'])
90
- .then((response) => {
91
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response }));
92
- })
93
- .catch((error) => {
94
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: error instanceof Error ? error.message : error }));
95
- });
96
- return;
97
- }
98
- else if (data.method === '/api/uninstall') {
99
- if (!isValidString(data.params.packageName, 10)) {
100
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter packageName in /api/uninstall' }));
101
- return;
102
- }
103
- this.spawnCommand('npm', ['uninstall', '-g', data.params.packageName, '--verbose'])
104
- .then((response) => {
105
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response }));
106
- })
107
- .catch((error) => {
108
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: error instanceof Error ? error.message : error }));
109
- });
110
- return;
111
- }
112
- else if (data.method === '/api/restart') {
113
- await this.restartProcess();
114
- return;
115
- }
116
- else if (data.method === '/api/shutdown') {
117
- await this.shutdownProcess();
118
- return;
119
- }
120
- else if (data.method === '/api/settings') {
121
- this.matterbridgeInformation.bridgeMode = this.bridgeMode;
122
- this.matterbridgeInformation.restartMode = this.restartMode;
123
- this.matterbridgeInformation.loggerLevel = this.log.logLevel;
124
- this.matterbridgeInformation.matterLoggerLevel = Logger.defaultLogLevel;
125
- this.matterbridgeInformation.mattermdnsinterface = (await this.nodeContext?.get('mattermdnsinterface', '')) || '';
126
- this.matterbridgeInformation.matteripv4address = (await this.nodeContext?.get('matteripv4address', '')) || '';
127
- this.matterbridgeInformation.matteripv6address = (await this.nodeContext?.get('matteripv6address', '')) || '';
128
- this.matterbridgeInformation.matterPort = (await this.nodeContext?.get('matterport', 5540)) ?? 5540;
129
- this.matterbridgeInformation.matterDiscriminator = await this.nodeContext?.get('matterdiscriminator');
130
- this.matterbridgeInformation.matterPasscode = await this.nodeContext?.get('matterpasscode');
131
- this.matterbridgeInformation.matterbridgePaired = this.matterbridgePaired;
132
- this.matterbridgeInformation.matterbridgeConnected = this.matterbridgeConnected;
133
- this.matterbridgeInformation.matterbridgeQrPairingCode = this.matterbridgeQrPairingCode;
134
- this.matterbridgeInformation.matterbridgeManualPairingCode = this.matterbridgeManualPairingCode;
135
- this.matterbridgeInformation.matterbridgeFabricInformations = this.matterbridgeFabricInformations;
136
- this.matterbridgeInformation.matterbridgeSessionInformations = Array.from(this.matterbridgeSessionInformations.values());
137
- this.matterbridgeInformation.profile = this.profile;
138
- const response = { systemInformation: this.systemInformation, matterbridgeInformation: this.matterbridgeInformation };
139
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response }));
140
- return;
141
- }
142
- else if (data.method === '/api/plugins') {
143
- const response = await this.getBaseRegisteredPlugins();
144
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response }));
145
- return;
146
- }
147
- else if (data.method === '/api/devices') {
148
- const devices = [];
149
- this.devices.forEach(async (device) => {
150
- if (data.params.pluginName && data.params.pluginName !== device.plugin)
151
- return;
152
- let name = device.getClusterServer(BasicInformationCluster)?.attributes.nodeLabel?.getLocal();
153
- if (!name)
154
- name = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.nodeLabel?.getLocal() ?? 'Unknown';
155
- let serial = device.getClusterServer(BasicInformationCluster)?.attributes.serialNumber?.getLocal();
156
- if (!serial)
157
- serial = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.serialNumber?.getLocal() ?? 'Unknown';
158
- let productUrl = device.getClusterServer(BasicInformationCluster)?.attributes.productUrl?.getLocal();
159
- if (!productUrl)
160
- productUrl = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.productUrl?.getLocal() ?? 'Unknown';
161
- let uniqueId = device.getClusterServer(BasicInformationCluster)?.attributes.uniqueId?.getLocal();
162
- if (!uniqueId)
163
- uniqueId = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.uniqueId?.getLocal() ?? 'Unknown';
164
- const cluster = this.getClusterTextFromDevice(device);
165
- devices.push({
166
- pluginName: device.plugin ?? 'Unknown',
167
- type: device.name + ' (0x' + device.deviceType.toString(16).padStart(4, '0') + ')',
168
- endpoint: device.number,
169
- name,
170
- serial,
171
- productUrl,
172
- configUrl: device.configUrl,
173
- uniqueId,
174
- cluster: cluster,
175
- });
176
- });
177
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response: devices }));
178
- return;
179
- }
180
- else if (data.method === '/api/clusters') {
181
- if (!isValidString(data.params.plugin, 10)) {
182
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter plugin in /api/clusters' }));
183
- return;
184
- }
185
- if (!isValidNumber(data.params.endpoint, 1)) {
186
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter endpoint in /api/clusters' }));
187
- return;
188
- }
189
- const clusters = [];
190
- let deviceName = '';
191
- let serialNumber = '';
192
- let deviceTypes = [];
193
- this.devices.forEach(async (device) => {
194
- if (data.params.plugin !== device.plugin)
195
- return;
196
- if (data.params.endpoint !== device.number)
197
- return;
198
- deviceName = device.deviceName ?? 'Unknown';
199
- serialNumber = device.serialNumber ?? 'Unknown';
200
- deviceTypes = [];
201
- if (this.edge)
202
- device = EndpointServer.forEndpoint(device);
203
- const clusterServers = device.getAllClusterServers();
204
- clusterServers.forEach((clusterServer) => {
205
- Object.entries(clusterServer.attributes).forEach(([key, value]) => {
206
- if (clusterServer.name === 'EveHistory')
207
- return;
208
- if (clusterServer.name === 'Descriptor' && key === 'deviceTypeList') {
209
- value.getLocal().forEach((deviceType) => {
210
- deviceTypes.push(deviceType.deviceType);
211
- });
212
- }
213
- let attributeValue;
214
- let attributeLocalValue;
215
- try {
216
- if (typeof value.getLocal() === 'object')
217
- attributeValue = stringify(value.getLocal());
218
- else
219
- attributeValue = value.getLocal().toString();
220
- attributeLocalValue = value.getLocal();
221
- }
222
- catch (error) {
223
- attributeValue = 'Fabric-Scoped';
224
- attributeLocalValue = 'Fabric-Scoped';
225
- this.log.debug(`GetLocal value ${error} in clusterServer: ${clusterServer.name}(${clusterServer.id}) attribute: ${key}(${value.id})`);
226
- }
227
- clusters.push({
228
- endpoint: device.number ? device.number.toString() : '...',
229
- id: 'main',
230
- deviceTypes,
231
- clusterName: clusterServer.name,
232
- clusterId: '0x' + clusterServer.id.toString(16).padStart(2, '0'),
233
- attributeName: key,
234
- attributeId: '0x' + value.id.toString(16).padStart(2, '0'),
235
- attributeValue,
236
- attributeLocalValue,
237
- });
238
- });
239
- });
240
- device.getChildEndpoints().forEach((childEndpoint) => {
241
- deviceTypes = [];
242
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
- const name = this.edge ? childEndpoint.endpoint?.id : childEndpoint.uniqueStorageKey;
244
- const clusterServers = childEndpoint.getAllClusterServers();
245
- clusterServers.forEach((clusterServer) => {
246
- Object.entries(clusterServer.attributes).forEach(([key, value]) => {
247
- if (clusterServer.name === 'EveHistory')
248
- return;
249
- if (clusterServer.name === 'Descriptor' && key === 'deviceTypeList') {
250
- value.getLocal().forEach((deviceType) => {
251
- deviceTypes.push(deviceType.deviceType);
252
- });
253
- }
254
- let attributeValue;
255
- let attributeLocalValue;
256
- try {
257
- if (typeof value.getLocal() === 'object')
258
- attributeValue = stringify(value.getLocal());
259
- else
260
- attributeValue = value.getLocal().toString();
261
- attributeLocalValue = value.getLocal();
262
- }
263
- catch (error) {
264
- attributeValue = 'Fabric-Scoped';
265
- attributeLocalValue = 'Fabric-Scoped';
266
- this.log.debug(`GetLocal error ${error} in clusterServer: ${clusterServer.name}(${clusterServer.id}) attribute: ${key}(${value.id})`);
267
- }
268
- clusters.push({
269
- endpoint: childEndpoint.number ? childEndpoint.number.toString() : '...',
270
- id: name,
271
- deviceTypes,
272
- clusterName: clusterServer.name,
273
- clusterId: '0x' + clusterServer.id.toString(16).padStart(2, '0'),
274
- attributeName: key,
275
- attributeId: '0x' + value.id.toString(16).padStart(2, '0'),
276
- attributeValue,
277
- attributeLocalValue,
278
- });
279
- });
280
- });
281
- });
282
- });
283
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, plugin: data.params.plugin, deviceName, serialNumber, endpoint: data.params.endpoint, deviceTypes, response: clusters }));
284
- return;
285
- }
286
- else if (data.method === '/api/select') {
287
- if (!isValidString(data.params.plugin, 10)) {
288
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter plugin in /api/select' }));
289
- return;
290
- }
291
- const plugin = this.plugins.get(data.params.plugin);
292
- if (!plugin) {
293
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Plugin not found in /api/select' }));
294
- return;
295
- }
296
- const selectDeviceValues = plugin.platform?.selectDevice ? Array.from(plugin.platform.selectDevice.values()).sort((keyA, keyB) => keyA.name.localeCompare(keyB.name)) : [];
297
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, plugin: data.params.plugin, response: selectDeviceValues }));
298
- return;
299
- }
300
- else if (data.method === '/api/select/entities') {
301
- if (!isValidString(data.params.plugin, 10)) {
302
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Wrong parameter plugin in /api/select/entities' }));
303
- return;
304
- }
305
- const plugin = this.plugins.get(data.params.plugin);
306
- if (!plugin) {
307
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Plugin not found in /api/select/entities' }));
308
- return;
309
- }
310
- const selectEntityValues = plugin.platform?.selectDevice ? Array.from(plugin.platform.selectEntity.values()).sort((keyA, keyB) => keyA.name.localeCompare(keyB.name)) : [];
311
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, plugin: data.params.plugin, response: selectEntityValues }));
312
- return;
313
- }
314
- else {
315
- this.log.error(`Invalid method from websocket client: ${debugStringify(data)}`);
316
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: 'Invalid method' }));
317
- return;
318
- }
319
- }
320
- catch (error) {
321
- this.log.error(`Error parsing message from websocket client:`, error instanceof Error ? error.message : error);
322
- return;
323
- }
324
- }
325
- //# sourceMappingURL=matterbridgeWebsocket.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"matterbridgeWebsocket.js","sourceRoot":"","sources":["../src/matterbridgeWebsocket.ts"],"names":[],"mappings":"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"}