matter-server 0.2.4 → 0.2.6
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/dist/esm/MatterServer.js +4 -0
- package/dist/esm/MatterServer.js.map +1 -1
- package/dist/esm/converter/LegacyDataLoader.d.ts +16 -0
- package/dist/esm/converter/LegacyDataLoader.d.ts.map +1 -1
- package/dist/esm/converter/LegacyDataLoader.js +43 -0
- package/dist/esm/converter/LegacyDataLoader.js.map +1 -1
- package/package.json +5 -5
- package/src/MatterServer.ts +11 -0
- package/src/converter/LegacyDataLoader.ts +79 -0
package/dist/esm/MatterServer.js
CHANGED
|
@@ -116,6 +116,10 @@ async function start() {
|
|
|
116
116
|
logger.info(`Found legacy data: ${parts.join(", ")}`);
|
|
117
117
|
}
|
|
118
118
|
config = await ConfigStorage.create(env);
|
|
119
|
+
if (legacyData.mostCommonFabricLabel?.length && legacyData.mostCommonFabricLabel !== "HomeAssistant" && config.fabricLabel === "HomeAssistant") {
|
|
120
|
+
logger.info(`Setting fabric label from legacy data: "${legacyData.mostCommonFabricLabel}"`);
|
|
121
|
+
await config.set({ fabricLabel: legacyData.mostCommonFabricLabel });
|
|
122
|
+
}
|
|
119
123
|
controller = await MatterController.create(
|
|
120
124
|
env,
|
|
121
125
|
config,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/MatterServer.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EACI;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACG;AACP,SAAS,YAAY;AACrB,SAAS,qBAAmD;AAC5D;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAEG;AACP,SAAS,yBAAyB;AAClC,SAAS,iBAAiB;AAG1B,OAAO;AACP,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AAMtC,eAAe,iBAAiB,MAAc;AAC1C,QAAM,aAAa,MAAM,KAAK,MAAM,GAAG;AACvC,QAAM,SAAS,WAAW,kBAAkB;AAC5C,UAAQ;AAAA,IACJ;AAAA,IACA,MAAM,KAAK,WAAW,MAAM,EAAE,MAAM,SAAO,OAAO,QAAQ,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAAA,EACvG;AAEA,SAAO,CAAC,iBAAyB;AAC7B,QAAI;AACA,aAAO,MAAM,GAAG,YAAY;AAAA,CAAI;AAAA,IACpC,SAAS,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK,EAAE;AAAA,IACzD;AAAA,EACJ;AACJ;AAGA,MAAM,aAAa,cAAc;AAKjC,SAAS,YAAY,OAA8B;AAC/C,UAAQ,OAAO;AAAA,IACX,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACD,aAAO,SAAS;AAAA,IACpB;AACI,aAAO,SAAS;AAAA,EACxB;AACJ;AAGA,OAAO,QAAQ,YAAY,WAAW,QAAQ;AAE9C,MAAM,SAAS,OAAO,IAAI,cAAc;AAExC,MAAM,MAAM,YAAY;AAGxB,IAAI,KAAK,IAAI,gBAAgB,WAAW,WAAW;AACnD,IAAI,WAAW,qBAAqB,MAAM;AACtC,MAAI,KAAK,IAAI,cAAc,IAAI;AAC/B,MAAI,KAAK,IAAI,cAAc,WAAW,gBAAgB;AAC1D;AACA,IAAI,WAAW,kBAAkB;AAC7B,MAAI,KAAK,IAAI,yBAAyB,WAAW,gBAAgB;AACrE;AAEA,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,eAAe,QAAQ;AAEnB,MAAI,WAAW,SAAS;AACpB,QAAI;AACA,YAAM,aAAa,MAAM,iBAAiB,WAAW,OAAO;AAC5D,aAAO,aAAa,OAAO,eAAe;AAAA,QACtC,OAAO;AAAA,QACP,OAAO,YAAY,WAAW,QAAQ;AAAA,QACtC,QAAQ,UAAU,OAAO;AAAA,MAC7B,CAAC;AACD,aAAO,KAAK,yBAAyB,WAAW,OAAO,EAAE;AAAA,IAC7D,SAAS,OAAO;AACZ,aAAO,MAAM,kCAAkC,KAAK,EAAE;AAAA,IAC1D;AAAA,EACJ;AAEA,QAAM,mBAAqC;AAAA,IACvC,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,EACzB;AAGA,eAAa,MAAM,eAAe,KAAK,WAAW,WAAW;AAC7D,MAAI,WAAW,OAAO;AAClB,WAAO,KAAK,sBAAsB,WAAW,KAAK,EAAE;AAAA,EACxD;AACA,MAAI,WAAW,SAAS;AACpB,UAAM,QAAkB,CAAC;AACzB,QAAI,WAAW,cAAc;AACzB,YAAM,KAAK,UAAU;AACrB,uBAAiB,SAAS,WAAW;AACrC,aAAO,KAAK,UAAU,iBAAiB,MAAM;AAAA,IACjD;AACA,QAAI,WAAW,YAAY;AACvB,YAAM,YAAY,OAAO,KAAK,WAAW,WAAW,KAAK,EAAE;AAC3D,uBAAiB,WAAW,WAAW;AACvC,YAAM,KAAK,GAAG,SAAS,UAAU;AAAA,IACrC;AACA,QAAI,WAAW,4BAA4B;AACvC,YAAM,KAAK,gBAAgB;AAC3B,uBAAiB,cAAc,WAAW;AAC1C,aAAO,KAAK,eAAe,iBAAiB,WAAW;AAAA,IAC3D;AACA,WAAO,KAAK,sBAAsB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,EACxD;AAEA,WAAS,MAAM,cAAc,OAAO,GAAG;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -6,6 +6,20 @@
|
|
|
6
6
|
import { CertificateAuthorityConfiguration, Environment, LegacyFabricConfigData, LegacyServerFile } from "@matter-server/ws-controller";
|
|
7
7
|
import { ChipConfigData } from "./index.js";
|
|
8
8
|
import type { OperationalCredentials } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Extract the most common fabric label from node attributes.
|
|
11
|
+
*
|
|
12
|
+
* For each node:
|
|
13
|
+
* 1. Gets "0/62/5" (CurrentFabricIndex) - the index of our controller's fabric on that node
|
|
14
|
+
* 2. Finds the matching entry in "0/62/1" (Fabrics) where key "254" equals CurrentFabricIndex
|
|
15
|
+
* 3. Extracts the label (key "5") from that entry
|
|
16
|
+
*
|
|
17
|
+
* Returns the label that appears most frequently across all nodes.
|
|
18
|
+
*
|
|
19
|
+
* @param serverFile The legacy server file with node data
|
|
20
|
+
* @returns The most common fabric label, or undefined if none found
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractMostCommonFabricLabel(serverFile: LegacyServerFile): string | undefined;
|
|
9
23
|
/** Result of loading legacy data */
|
|
10
24
|
export interface LegacyData {
|
|
11
25
|
/** Chip config data (fabric certs, sessions, etc.) */
|
|
@@ -18,6 +32,8 @@ export interface LegacyData {
|
|
|
18
32
|
operationalCredentials?: OperationalCredentials;
|
|
19
33
|
/** Certificate Authority configuration (parsed from operational credentials) */
|
|
20
34
|
certificateAuthorityConfig?: CertificateAuthorityConfiguration;
|
|
35
|
+
/** Most common fabric label found across all nodes (from attribute 0/62/1) */
|
|
36
|
+
mostCommonFabricLabel?: string;
|
|
21
37
|
/** Whether any legacy data was found */
|
|
22
38
|
hasData: boolean;
|
|
23
39
|
/** Error message if loading failed */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegacyDataLoader.d.ts","sourceRoot":"","sources":["../../../src/converter/LegacyDataLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,iCAAiC,EAGjC,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAEnB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"LegacyDataLoader.d.ts","sourceRoot":"","sources":["../../../src/converter/LegacyDataLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,iCAAiC,EAGjC,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAEnB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAsBzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAmD7F;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACvB,sDAAsD;IACtD,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,kDAAkD;IAClD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,qEAAqE;IACrE,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,4EAA4E;IAC5E,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,gFAAgF;IAChF,0BAA0B,CAAC,EAAE,iCAAiC,CAAC;IAC/D,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyG/F;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzE;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACtC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,sBAAsB,EACpC,UAAU,EAAE,gBAAgB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC3C,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,sBAAsB,EACpC,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAChD,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,sBAAsB,EACpC,MAAM,EAAE,MAAM,GAAG,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -12,6 +12,47 @@ import { access, copyFile, readFile, writeFile } from "node:fs/promises";
|
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
import { ChipConfigData } from "./index.js";
|
|
14
14
|
const logger = Logger.get("LegacyDataLoader");
|
|
15
|
+
const FABRICS_ATTRIBUTE_PATH = "0/62/1";
|
|
16
|
+
const CURRENT_FABRIC_INDEX_PATH = "0/62/5";
|
|
17
|
+
const FABRIC_LABEL_KEY = "5";
|
|
18
|
+
const FABRIC_INDEX_KEY = "254";
|
|
19
|
+
function extractMostCommonFabricLabel(serverFile) {
|
|
20
|
+
const labelCounts = /* @__PURE__ */ new Map();
|
|
21
|
+
for (const nodeData of Object.values(serverFile.nodes)) {
|
|
22
|
+
const currentFabricIndex = nodeData.attributes[CURRENT_FABRIC_INDEX_PATH];
|
|
23
|
+
if (typeof currentFabricIndex !== "number") {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const fabricsAttr = nodeData.attributes[FABRICS_ATTRIBUTE_PATH];
|
|
27
|
+
if (!Array.isArray(fabricsAttr)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
for (const fabricDescriptor of fabricsAttr) {
|
|
31
|
+
if (fabricDescriptor && typeof fabricDescriptor === "object" && fabricDescriptor[FABRIC_INDEX_KEY] === currentFabricIndex) {
|
|
32
|
+
const label = fabricDescriptor[FABRIC_LABEL_KEY];
|
|
33
|
+
if (typeof label === "string" && label.length > 0) {
|
|
34
|
+
labelCounts.set(label, (labelCounts.get(label) ?? 0) + 1);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (labelCounts.size === 0) {
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
let mostCommonLabel;
|
|
44
|
+
let maxCount = 0;
|
|
45
|
+
for (const [label, count] of labelCounts) {
|
|
46
|
+
if (count > maxCount) {
|
|
47
|
+
maxCount = count;
|
|
48
|
+
mostCommonLabel = label;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (mostCommonLabel) {
|
|
52
|
+
logger.info(`Found most common fabric label "${mostCommonLabel}" (appeared in ${maxCount} node(s))`);
|
|
53
|
+
}
|
|
54
|
+
return mostCommonLabel;
|
|
55
|
+
}
|
|
15
56
|
async function loadLegacyData(env, storagePath) {
|
|
16
57
|
const result = {
|
|
17
58
|
hasData: false
|
|
@@ -84,6 +125,7 @@ async function loadLegacyData(env, storagePath) {
|
|
|
84
125
|
logger.info(
|
|
85
126
|
`Loaded legacy server data from ${serverFileName}: ${nodeCount} node(s), last_node_id=${serverFile.last_node_id}`
|
|
86
127
|
);
|
|
128
|
+
result.mostCommonFabricLabel = extractMostCommonFabricLabel(serverFile);
|
|
87
129
|
} catch (err) {
|
|
88
130
|
if (err.code !== "ENOENT") {
|
|
89
131
|
logger.warn(`Error loading server file ${serverFileName}: ${err}`);
|
|
@@ -178,6 +220,7 @@ async function removeNodeFromLegacyServerFile(env, storagePath, fabricConfig, no
|
|
|
178
220
|
}
|
|
179
221
|
export {
|
|
180
222
|
addNodeToLegacyServerFile,
|
|
223
|
+
extractMostCommonFabricLabel,
|
|
181
224
|
hasLegacyData,
|
|
182
225
|
loadLegacyData,
|
|
183
226
|
removeNodeFromLegacyServerFile,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/converter/LegacyDataLoader.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EAEI;AAAA,EACA;AAAA,EAIA;AAAA,OACG;AACP,SAAS,QAAQ,UAAU,UAAU,iBAAiB;AACtD,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAa/B,MAAM,SAAS,OAAO,IAAI,kBAAkB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matter-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "WebSocket Matter server based on matter.js",
|
|
6
6
|
"bugs": {
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@matter/main": "0.16.5",
|
|
27
|
-
"@matter-server/ws-controller": "0.2.
|
|
28
|
-
"@matter-server/dashboard": "0.2.
|
|
29
|
-
"@matter-server/custom-clusters": "0.2.
|
|
27
|
+
"@matter-server/ws-controller": "0.2.6",
|
|
28
|
+
"@matter-server/dashboard": "0.2.6",
|
|
29
|
+
"@matter-server/custom-clusters": "0.2.6",
|
|
30
30
|
"commander": "^14.0.2",
|
|
31
31
|
"express": "^5.2.1"
|
|
32
32
|
},
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@types/express": "^5.0.6",
|
|
35
35
|
"@types/node": "^25.0.8",
|
|
36
36
|
"@matter/testing": "0.16.5",
|
|
37
|
-
"@matter-server/ws-client": "0.2.
|
|
37
|
+
"@matter-server/ws-client": "0.2.6"
|
|
38
38
|
},
|
|
39
39
|
"files": [
|
|
40
40
|
"dist/**/*",
|
package/src/MatterServer.ts
CHANGED
|
@@ -146,6 +146,17 @@ async function start() {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
config = await ConfigStorage.create(env);
|
|
149
|
+
|
|
150
|
+
// If we found a most common fabric label in legacy data, use it as the default
|
|
151
|
+
// (only applies on first migration when no fabricLabel is stored yet)
|
|
152
|
+
if (
|
|
153
|
+
legacyData.mostCommonFabricLabel?.length &&
|
|
154
|
+
legacyData.mostCommonFabricLabel !== "HomeAssistant" &&
|
|
155
|
+
config.fabricLabel === "HomeAssistant"
|
|
156
|
+
) {
|
|
157
|
+
logger.info(`Setting fabric label from legacy data: "${legacyData.mostCommonFabricLabel}"`);
|
|
158
|
+
await config.set({ fabricLabel: legacyData.mostCommonFabricLabel });
|
|
159
|
+
}
|
|
149
160
|
controller = await MatterController.create(
|
|
150
161
|
env,
|
|
151
162
|
config,
|
|
@@ -30,6 +30,80 @@ import type { OperationalCredentials } from "./types.js";
|
|
|
30
30
|
|
|
31
31
|
const logger = Logger.get("LegacyDataLoader");
|
|
32
32
|
|
|
33
|
+
// Attribute paths for OperationalCredentials cluster (62/0x3E)
|
|
34
|
+
const FABRICS_ATTRIBUTE_PATH = "0/62/1"; // Fabrics list
|
|
35
|
+
const CURRENT_FABRIC_INDEX_PATH = "0/62/5"; // CurrentFabricIndex
|
|
36
|
+
|
|
37
|
+
// Keys in the tag-based FabricDescriptor structure
|
|
38
|
+
const FABRIC_LABEL_KEY = "5"; // Label field
|
|
39
|
+
const FABRIC_INDEX_KEY = "254"; // FabricIndex field
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Extract the most common fabric label from node attributes.
|
|
43
|
+
*
|
|
44
|
+
* For each node:
|
|
45
|
+
* 1. Gets "0/62/5" (CurrentFabricIndex) - the index of our controller's fabric on that node
|
|
46
|
+
* 2. Finds the matching entry in "0/62/1" (Fabrics) where key "254" equals CurrentFabricIndex
|
|
47
|
+
* 3. Extracts the label (key "5") from that entry
|
|
48
|
+
*
|
|
49
|
+
* Returns the label that appears most frequently across all nodes.
|
|
50
|
+
*
|
|
51
|
+
* @param serverFile The legacy server file with node data
|
|
52
|
+
* @returns The most common fabric label, or undefined if none found
|
|
53
|
+
*/
|
|
54
|
+
export function extractMostCommonFabricLabel(serverFile: LegacyServerFile): string | undefined {
|
|
55
|
+
const labelCounts = new Map<string, number>();
|
|
56
|
+
|
|
57
|
+
for (const nodeData of Object.values(serverFile.nodes)) {
|
|
58
|
+
// Get the current fabric index for this node
|
|
59
|
+
const currentFabricIndex = nodeData.attributes[CURRENT_FABRIC_INDEX_PATH];
|
|
60
|
+
if (typeof currentFabricIndex !== "number") {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Get the fabrics list
|
|
65
|
+
const fabricsAttr = nodeData.attributes[FABRICS_ATTRIBUTE_PATH];
|
|
66
|
+
if (!Array.isArray(fabricsAttr)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Find the fabric entry matching our fabric index
|
|
71
|
+
for (const fabricDescriptor of fabricsAttr) {
|
|
72
|
+
if (
|
|
73
|
+
fabricDescriptor &&
|
|
74
|
+
typeof fabricDescriptor === "object" &&
|
|
75
|
+
fabricDescriptor[FABRIC_INDEX_KEY] === currentFabricIndex
|
|
76
|
+
) {
|
|
77
|
+
const label = fabricDescriptor[FABRIC_LABEL_KEY];
|
|
78
|
+
if (typeof label === "string" && label.length > 0) {
|
|
79
|
+
labelCounts.set(label, (labelCounts.get(label) ?? 0) + 1);
|
|
80
|
+
}
|
|
81
|
+
break; // Found our fabric, no need to check others
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (labelCounts.size === 0) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Find the label with the highest count
|
|
91
|
+
let mostCommonLabel: string | undefined;
|
|
92
|
+
let maxCount = 0;
|
|
93
|
+
for (const [label, count] of labelCounts) {
|
|
94
|
+
if (count > maxCount) {
|
|
95
|
+
maxCount = count;
|
|
96
|
+
mostCommonLabel = label;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (mostCommonLabel) {
|
|
101
|
+
logger.info(`Found most common fabric label "${mostCommonLabel}" (appeared in ${maxCount} node(s))`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return mostCommonLabel;
|
|
105
|
+
}
|
|
106
|
+
|
|
33
107
|
/** Result of loading legacy data */
|
|
34
108
|
export interface LegacyData {
|
|
35
109
|
/** Chip config data (fabric certs, sessions, etc.) */
|
|
@@ -42,6 +116,8 @@ export interface LegacyData {
|
|
|
42
116
|
operationalCredentials?: OperationalCredentials;
|
|
43
117
|
/** Certificate Authority configuration (parsed from operational credentials) */
|
|
44
118
|
certificateAuthorityConfig?: CertificateAuthorityConfiguration;
|
|
119
|
+
/** Most common fabric label found across all nodes (from attribute 0/62/1) */
|
|
120
|
+
mostCommonFabricLabel?: string;
|
|
45
121
|
/** Whether any legacy data was found */
|
|
46
122
|
hasData: boolean;
|
|
47
123
|
/** Error message if loading failed */
|
|
@@ -147,6 +223,9 @@ export async function loadLegacyData(env: Environment, storagePath: string): Pro
|
|
|
147
223
|
logger.info(
|
|
148
224
|
`Loaded legacy server data from ${serverFileName}: ${nodeCount} node(s), last_node_id=${serverFile.last_node_id}`,
|
|
149
225
|
);
|
|
226
|
+
|
|
227
|
+
// Extract the most common fabric label from node attributes
|
|
228
|
+
result.mostCommonFabricLabel = extractMostCommonFabricLabel(serverFile);
|
|
150
229
|
} catch (err) {
|
|
151
230
|
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
152
231
|
logger.warn(`Error loading server file ${serverFileName}: ${err}`);
|