@matter-server/dashboard 0.3.2 → 0.3.4

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 (124) hide show
  1. package/README.md +76 -0
  2. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +2 -2
  3. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  4. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
  5. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts +36 -0
  6. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -0
  7. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +159 -0
  8. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +6 -0
  9. package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
  10. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
  11. package/dist/esm/pages/cluster-commands/index.js +1 -0
  12. package/dist/esm/pages/cluster-commands/index.js.map +1 -1
  13. package/dist/esm/pages/components/footer.d.ts.map +1 -1
  14. package/dist/esm/pages/components/footer.js +4 -7
  15. package/dist/esm/pages/components/footer.js.map +1 -1
  16. package/dist/esm/pages/components/header.d.ts +5 -0
  17. package/dist/esm/pages/components/header.d.ts.map +1 -1
  18. package/dist/esm/pages/components/header.js +75 -0
  19. package/dist/esm/pages/components/header.js.map +1 -1
  20. package/dist/esm/pages/components/node-details.js +2 -2
  21. package/dist/esm/pages/components/node-details.js.map +1 -1
  22. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  23. package/dist/esm/pages/components/server-details.js +0 -1
  24. package/dist/esm/pages/components/server-details.js.map +1 -1
  25. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  26. package/dist/esm/pages/matter-cluster-view.js +9 -4
  27. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  28. package/dist/esm/pages/matter-dashboard-app.d.ts +12 -0
  29. package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
  30. package/dist/esm/pages/matter-dashboard-app.js +84 -4
  31. package/dist/esm/pages/matter-dashboard-app.js.map +1 -1
  32. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  33. package/dist/esm/pages/matter-endpoint-view.js +8 -2
  34. package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
  35. package/dist/esm/pages/matter-network-view.d.ts +52 -0
  36. package/dist/esm/pages/matter-network-view.d.ts.map +1 -0
  37. package/dist/esm/pages/matter-network-view.js +309 -0
  38. package/dist/esm/pages/matter-network-view.js.map +6 -0
  39. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  40. package/dist/esm/pages/matter-node-view.js +86 -3
  41. package/dist/esm/pages/matter-node-view.js.map +1 -1
  42. package/dist/esm/pages/matter-server-view.d.ts +4 -0
  43. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  44. package/dist/esm/pages/matter-server-view.js +16 -1
  45. package/dist/esm/pages/matter-server-view.js.map +1 -1
  46. package/dist/esm/pages/network/base-network-graph.d.ts +74 -0
  47. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -0
  48. package/dist/esm/pages/network/base-network-graph.js +411 -0
  49. package/dist/esm/pages/network/base-network-graph.js.map +6 -0
  50. package/dist/esm/pages/network/device-icons.d.ts +52 -0
  51. package/dist/esm/pages/network/device-icons.d.ts.map +1 -0
  52. package/dist/esm/pages/network/device-icons.js +197 -0
  53. package/dist/esm/pages/network/device-icons.js.map +6 -0
  54. package/dist/esm/pages/network/device-panel.d.ts +31 -0
  55. package/dist/esm/pages/network/device-panel.d.ts.map +1 -0
  56. package/dist/esm/pages/network/device-panel.js +183 -0
  57. package/dist/esm/pages/network/device-panel.js.map +6 -0
  58. package/dist/esm/pages/network/network-details.d.ts +77 -0
  59. package/dist/esm/pages/network/network-details.d.ts.map +1 -0
  60. package/dist/esm/pages/network/network-details.js +904 -0
  61. package/dist/esm/pages/network/network-details.js.map +6 -0
  62. package/dist/esm/pages/network/network-types.d.ts +159 -0
  63. package/dist/esm/pages/network/network-types.d.ts.map +1 -0
  64. package/dist/esm/pages/network/network-types.js +19 -0
  65. package/dist/esm/pages/network/network-types.js.map +6 -0
  66. package/dist/esm/pages/network/network-utils.d.ts +196 -0
  67. package/dist/esm/pages/network/network-utils.d.ts.map +1 -0
  68. package/dist/esm/pages/network/network-utils.js +540 -0
  69. package/dist/esm/pages/network/network-utils.js.map +6 -0
  70. package/dist/esm/pages/network/thread-graph.d.ts +27 -0
  71. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -0
  72. package/dist/esm/pages/network/thread-graph.js +137 -0
  73. package/dist/esm/pages/network/thread-graph.js.map +6 -0
  74. package/dist/esm/pages/network/update-connections-dialog.d.ts +55 -0
  75. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -0
  76. package/dist/esm/pages/network/update-connections-dialog.js +284 -0
  77. package/dist/esm/pages/network/update-connections-dialog.js.map +6 -0
  78. package/dist/esm/pages/network/wifi-graph.d.ts +27 -0
  79. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -0
  80. package/dist/esm/pages/network/wifi-graph.js +169 -0
  81. package/dist/esm/pages/network/wifi-graph.js.map +6 -0
  82. package/dist/esm/util/format_hex.d.ts +18 -0
  83. package/dist/esm/util/format_hex.d.ts.map +1 -1
  84. package/dist/esm/util/format_hex.js +21 -1
  85. package/dist/esm/util/format_hex.js.map +1 -1
  86. package/dist/web/js/{commission-node-dialog-CBSDiqRW.js → commission-node-dialog-CcMuttYO.js} +5 -5
  87. package/dist/web/js/{commission-node-existing-TP6s8Tez.js → commission-node-existing-CqTRDMAr.js} +2 -5
  88. package/dist/web/js/{commission-node-thread-DOB8pu6x.js → commission-node-thread-DgwtTVwK.js} +2 -5
  89. package/dist/web/js/{commission-node-wifi-tzavmk1j.js → commission-node-wifi-XaN2SEnE.js} +2 -5
  90. package/dist/web/js/{dialog-box-Dknil_Be.js → dialog-box-COpDD8i7.js} +2 -2
  91. package/dist/web/js/{fire_event-DRpOSjJR.js → fire_event-mDYWi2sw.js} +1 -1
  92. package/dist/web/js/{log-level-dialog-TXkma-7Z.js → log-level-dialog-Bc32kZVw.js} +2 -3
  93. package/dist/web/js/main.js +1 -1
  94. package/dist/web/js/matter-dashboard-app-CrBHT4fT.js +31606 -0
  95. package/dist/web/js/{node-binding-dialog-D52FCBFP.js → node-binding-dialog-C8fqOJiB.js} +2 -4
  96. package/dist/web/js/prevent_default-D-ohDGsN.js +8 -0
  97. package/package.json +6 -5
  98. package/src/pages/cluster-commands/base-cluster-commands.ts +2 -2
  99. package/src/pages/cluster-commands/clusters/basic-information-commands.ts +171 -0
  100. package/src/pages/cluster-commands/index.ts +1 -0
  101. package/src/pages/components/footer.ts +4 -7
  102. package/src/pages/components/header.ts +81 -0
  103. package/src/pages/components/node-details.ts +3 -3
  104. package/src/pages/components/server-details.ts +0 -1
  105. package/src/pages/matter-cluster-view.ts +11 -4
  106. package/src/pages/matter-dashboard-app.ts +105 -5
  107. package/src/pages/matter-endpoint-view.ts +10 -3
  108. package/src/pages/matter-network-view.ts +325 -0
  109. package/src/pages/matter-node-view.ts +93 -4
  110. package/src/pages/matter-server-view.ts +17 -1
  111. package/src/pages/network/base-network-graph.ts +477 -0
  112. package/src/pages/network/device-icons.ts +283 -0
  113. package/src/pages/network/device-panel.ts +180 -0
  114. package/src/pages/network/network-details.ts +1015 -0
  115. package/src/pages/network/network-types.ts +167 -0
  116. package/src/pages/network/network-utils.ts +861 -0
  117. package/src/pages/network/thread-graph.ts +170 -0
  118. package/src/pages/network/update-connections-dialog.ts +327 -0
  119. package/src/pages/network/wifi-graph.ts +193 -0
  120. package/src/util/format_hex.ts +39 -0
  121. package/dist/web/js/matter-dashboard-app-B7GUghkC.js +0 -17254
  122. package/dist/web/js/outlined-text-field-D1DyKQY-.js +0 -968
  123. package/dist/web/js/prevent_default-BPgSQsuY.js +0 -814
  124. package/dist/web/js/validator-C735j770.js +0 -1122
@@ -0,0 +1,540 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const WIFI_FEATURE = 1 << 0;
7
+ const THREAD_FEATURE = 1 << 1;
8
+ const ETHERNET_FEATURE = 1 << 2;
9
+ const SIGNAL_STRONG_THRESHOLD = -70;
10
+ const SIGNAL_MEDIUM_THRESHOLD = -85;
11
+ const LQI_STRONG_THRESHOLD = 200;
12
+ const LQI_MEDIUM_THRESHOLD = 100;
13
+ const SIGNAL_COLOR_STRONG = "#4caf50";
14
+ const SIGNAL_COLOR_MEDIUM = "#ff9800";
15
+ const SIGNAL_COLOR_WEAK = "#f44336";
16
+ function base64ToBigInt(base64) {
17
+ try {
18
+ const binary = atob(base64);
19
+ let result = 0n;
20
+ const start = binary.length > 8 ? binary.length - 8 : 0;
21
+ for (let i = start; i < binary.length; i++) {
22
+ result = result << 8n | BigInt(binary.charCodeAt(i));
23
+ }
24
+ return result;
25
+ } catch {
26
+ return 0n;
27
+ }
28
+ }
29
+ function normalizeExtAddress(value) {
30
+ if (typeof value === "bigint") {
31
+ return value;
32
+ }
33
+ if (typeof value === "string") {
34
+ return base64ToBigInt(value);
35
+ }
36
+ if (typeof value === "number") {
37
+ return BigInt(value);
38
+ }
39
+ return 0n;
40
+ }
41
+ function getNetworkType(node) {
42
+ const featureMap = node.attributes["0/49/65532"];
43
+ if (featureMap === void 0) {
44
+ return "unknown";
45
+ }
46
+ if (featureMap & THREAD_FEATURE) {
47
+ return "thread";
48
+ }
49
+ if (featureMap & WIFI_FEATURE) {
50
+ return "wifi";
51
+ }
52
+ if (featureMap & ETHERNET_FEATURE) {
53
+ return "ethernet";
54
+ }
55
+ return "unknown";
56
+ }
57
+ function categorizeDevices(nodes) {
58
+ const result = {
59
+ thread: [],
60
+ wifi: [],
61
+ ethernet: [],
62
+ unknown: []
63
+ };
64
+ for (const node of Object.values(nodes)) {
65
+ const nodeId = String(node.node_id);
66
+ const networkType = getNetworkType(node);
67
+ result[networkType].push(nodeId);
68
+ }
69
+ return result;
70
+ }
71
+ function getThreadRole(node) {
72
+ return node.attributes["0/53/1"];
73
+ }
74
+ function getThreadChannel(node) {
75
+ return node.attributes["0/53/0"];
76
+ }
77
+ function getThreadExtendedPanId(node) {
78
+ return node.attributes["0/53/4"];
79
+ }
80
+ function getThreadExtendedAddress(node) {
81
+ const networkInterfaces = node.attributes["0/51/0"];
82
+ if (!Array.isArray(networkInterfaces) || networkInterfaces.length === 0) {
83
+ return void 0;
84
+ }
85
+ const threadIface = networkInterfaces.find((i) => i["7"] === 4) || networkInterfaces[0];
86
+ if (!threadIface) {
87
+ return void 0;
88
+ }
89
+ const hwAddrB64 = threadIface["4"];
90
+ if (typeof hwAddrB64 !== "string" || !hwAddrB64) {
91
+ return void 0;
92
+ }
93
+ const extAddr = base64ToBigInt(hwAddrB64);
94
+ return extAddr !== 0n ? extAddr : void 0;
95
+ }
96
+ function getThreadExtendedAddressHex(node) {
97
+ const extAddr = getThreadExtendedAddress(node);
98
+ if (extAddr !== void 0) {
99
+ return extAddr.toString(16).padStart(16, "0").toUpperCase();
100
+ }
101
+ return void 0;
102
+ }
103
+ function parseNeighborTable(node) {
104
+ const neighborTable = node.attributes["0/53/7"];
105
+ if (!Array.isArray(neighborTable)) {
106
+ return [];
107
+ }
108
+ return neighborTable.map((entry) => {
109
+ const rawExtAddr = entry["0"] ?? entry.extAddress;
110
+ const extAddress = normalizeExtAddress(rawExtAddr);
111
+ return {
112
+ extAddress,
113
+ // Field 1: age
114
+ age: entry["1"] ?? entry.age ?? 0,
115
+ // Field 2: rloc16
116
+ rloc16: entry["2"] ?? entry.rloc16 ?? 0,
117
+ // Field 3: linkFrameCounter
118
+ linkFrameCounter: entry["3"] ?? entry.linkFrameCounter ?? 0,
119
+ // Field 4: mleFrameCounter
120
+ mleFrameCounter: entry["4"] ?? entry.mleFrameCounter ?? 0,
121
+ // Field 5: lqi
122
+ lqi: entry["5"] ?? entry.lqi ?? 0,
123
+ // Field 6: averageRssi (nullable)
124
+ avgRssi: entry["6"] ?? entry.averageRssi ?? null,
125
+ // Field 7: lastRssi (nullable)
126
+ lastRssi: entry["7"] ?? entry.lastRssi ?? null,
127
+ // Field 8: frameErrorRate
128
+ frameErrorRate: entry["8"] ?? entry.frameErrorRate ?? 0,
129
+ // Field 9: messageErrorRate
130
+ messageErrorRate: entry["9"] ?? entry.messageErrorRate ?? 0,
131
+ // Field 10: rxOnWhenIdle
132
+ rxOnWhenIdle: entry["10"] ?? entry.rxOnWhenIdle ?? false,
133
+ // Field 11: fullThreadDevice
134
+ fullThreadDevice: entry["11"] ?? entry.fullThreadDevice ?? false,
135
+ // Field 12: fullNetworkData
136
+ fullNetworkData: entry["12"] ?? entry.fullNetworkData ?? false,
137
+ // Field 13: isChild
138
+ isChild: entry["13"] ?? entry.isChild ?? false
139
+ };
140
+ });
141
+ }
142
+ function parseRouteTable(node) {
143
+ const routeTable = node.attributes["0/53/8"];
144
+ if (!Array.isArray(routeTable)) {
145
+ return [];
146
+ }
147
+ return routeTable.map((entry) => {
148
+ const rawExtAddr = entry["0"] ?? entry.extAddress;
149
+ const extAddress = normalizeExtAddress(rawExtAddr);
150
+ return {
151
+ extAddress,
152
+ // Field 1: rloc16
153
+ rloc16: entry["1"] ?? entry.rloc16 ?? 0,
154
+ // Field 2: routerId
155
+ routerId: entry["2"] ?? entry.routerId ?? 0,
156
+ // Field 3: nextHop
157
+ nextHop: entry["3"] ?? entry.nextHop ?? 0,
158
+ // Field 4: pathCost
159
+ pathCost: entry["4"] ?? entry.pathCost ?? 0,
160
+ // Field 5: lqiIn
161
+ lqiIn: entry["5"] ?? entry.lqiIn ?? 0,
162
+ // Field 6: lqiOut
163
+ lqiOut: entry["6"] ?? entry.lqiOut ?? 0,
164
+ // Field 7: age
165
+ age: entry["7"] ?? entry.age ?? 0,
166
+ // Field 8: allocated
167
+ allocated: entry["8"] ?? entry.allocated ?? false,
168
+ // Field 9: linkEstablished
169
+ linkEstablished: entry["9"] ?? entry.linkEstablished ?? false
170
+ };
171
+ });
172
+ }
173
+ function findRouteByExtAddress(node, targetExtAddr) {
174
+ const routes = parseRouteTable(node);
175
+ return routes.find((route) => route.extAddress === targetExtAddr && route.linkEstablished);
176
+ }
177
+ function getRoutableDestinationsCount(node) {
178
+ const routes = parseRouteTable(node);
179
+ return routes.filter((route) => route.allocated && route.linkEstablished).length;
180
+ }
181
+ function getRouteBidirectionalLqi(route) {
182
+ if (route.lqiIn > 0 && route.lqiOut > 0) {
183
+ return Math.round((route.lqiIn + route.lqiOut) / 2);
184
+ }
185
+ if (route.lqiIn > 0) return route.lqiIn;
186
+ if (route.lqiOut > 0) return route.lqiOut;
187
+ return void 0;
188
+ }
189
+ function getThreadRloc16(node) {
190
+ const value = node.attributes["0/53/64"];
191
+ if (typeof value === "number") {
192
+ return value;
193
+ }
194
+ return void 0;
195
+ }
196
+ function buildExtAddrMap(nodes) {
197
+ const extAddrMap = /* @__PURE__ */ new Map();
198
+ for (const node of Object.values(nodes)) {
199
+ const nodeId = String(node.node_id);
200
+ const extAddr = getThreadExtendedAddress(node);
201
+ if (extAddr !== void 0) {
202
+ extAddrMap.set(extAddr, nodeId);
203
+ }
204
+ }
205
+ return extAddrMap;
206
+ }
207
+ function buildRloc16Map(nodes) {
208
+ const rloc16Map = /* @__PURE__ */ new Map();
209
+ for (const node of Object.values(nodes)) {
210
+ const nodeId = String(node.node_id);
211
+ const rloc16 = getThreadRloc16(node);
212
+ if (rloc16 !== void 0) {
213
+ rloc16Map.set(rloc16, nodeId);
214
+ }
215
+ }
216
+ return rloc16Map;
217
+ }
218
+ function findUnknownDevices(nodes, extAddrMap) {
219
+ const unknownMap = /* @__PURE__ */ new Map();
220
+ for (const node of Object.values(nodes)) {
221
+ const nodeId = String(node.node_id);
222
+ const neighbors = parseNeighborTable(node);
223
+ for (const neighbor of neighbors) {
224
+ if (extAddrMap.has(neighbor.extAddress)) {
225
+ continue;
226
+ }
227
+ const extAddressHex = neighbor.extAddress.toString(16).padStart(16, "0").toUpperCase();
228
+ const id = `unknown_${extAddressHex}`;
229
+ if (!unknownMap.has(id)) {
230
+ unknownMap.set(id, {
231
+ id,
232
+ extAddressHex,
233
+ extAddress: neighbor.extAddress,
234
+ seenBy: [],
235
+ isRouter: false,
236
+ bestRssi: null
237
+ });
238
+ }
239
+ const unknown = unknownMap.get(id);
240
+ if (!unknown.seenBy.includes(nodeId)) {
241
+ unknown.seenBy.push(nodeId);
242
+ }
243
+ if (neighbor.rxOnWhenIdle) {
244
+ unknown.isRouter = true;
245
+ }
246
+ const rssi = neighbor.avgRssi ?? neighbor.lastRssi;
247
+ if (rssi !== null && (unknown.bestRssi === null || rssi > unknown.bestRssi)) {
248
+ unknown.bestRssi = rssi;
249
+ }
250
+ }
251
+ }
252
+ return Array.from(unknownMap.values());
253
+ }
254
+ function getSignalColor(neighbor) {
255
+ const rssi = neighbor.avgRssi ?? neighbor.lastRssi;
256
+ if (rssi !== null) {
257
+ if (rssi > SIGNAL_STRONG_THRESHOLD) {
258
+ return SIGNAL_COLOR_STRONG;
259
+ }
260
+ if (rssi > SIGNAL_MEDIUM_THRESHOLD) {
261
+ return SIGNAL_COLOR_MEDIUM;
262
+ }
263
+ return SIGNAL_COLOR_WEAK;
264
+ }
265
+ if (neighbor.lqi > LQI_STRONG_THRESHOLD) {
266
+ return SIGNAL_COLOR_STRONG;
267
+ }
268
+ if (neighbor.lqi > LQI_MEDIUM_THRESHOLD) {
269
+ return SIGNAL_COLOR_MEDIUM;
270
+ }
271
+ return SIGNAL_COLOR_WEAK;
272
+ }
273
+ function getSignalColorFromLqi(lqi) {
274
+ if (lqi > LQI_STRONG_THRESHOLD) {
275
+ return SIGNAL_COLOR_STRONG;
276
+ }
277
+ if (lqi > LQI_MEDIUM_THRESHOLD) {
278
+ return SIGNAL_COLOR_MEDIUM;
279
+ }
280
+ return SIGNAL_COLOR_WEAK;
281
+ }
282
+ function getDeviceName(node) {
283
+ if (node.nodeLabel) {
284
+ return node.nodeLabel;
285
+ }
286
+ const productName = node.productName || "Unknown Device";
287
+ const serialNumber = node.serialNumber;
288
+ if (serialNumber) {
289
+ return `${productName} (${serialNumber})`;
290
+ }
291
+ return productName;
292
+ }
293
+ function getThreadRoleName(role) {
294
+ switch (role) {
295
+ case 0:
296
+ return "Unspecified";
297
+ case 1:
298
+ return "Unassigned";
299
+ case 2:
300
+ return "Sleepy End Device";
301
+ case 3:
302
+ return "End Device";
303
+ case 4:
304
+ return "REED";
305
+ case 5:
306
+ return "Router";
307
+ case 6:
308
+ return "Leader";
309
+ default:
310
+ return "Unknown";
311
+ }
312
+ }
313
+ function getWiFiDiagnostics(node) {
314
+ const bssidRaw = node.attributes["0/54/0"];
315
+ let bssid = null;
316
+ if (bssidRaw) {
317
+ try {
318
+ const binary = atob(bssidRaw);
319
+ bssid = Array.from(binary).map((c) => c.charCodeAt(0).toString(16).padStart(2, "0").toUpperCase()).join(":");
320
+ } catch {
321
+ bssid = null;
322
+ }
323
+ }
324
+ const rssi = node.attributes["0/54/4"];
325
+ const channel = node.attributes["0/54/3"];
326
+ const securityType = node.attributes["0/54/1"];
327
+ const wifiVersion = node.attributes["0/54/2"];
328
+ return {
329
+ bssid,
330
+ rssi: rssi ?? null,
331
+ channel: channel ?? null,
332
+ securityType: securityType ?? null,
333
+ wifiVersion: wifiVersion ?? null
334
+ };
335
+ }
336
+ function getSignalColorFromRssi(rssi) {
337
+ if (rssi === null) {
338
+ return SIGNAL_COLOR_MEDIUM;
339
+ }
340
+ if (rssi > SIGNAL_STRONG_THRESHOLD) {
341
+ return SIGNAL_COLOR_STRONG;
342
+ }
343
+ if (rssi > SIGNAL_MEDIUM_THRESHOLD) {
344
+ return SIGNAL_COLOR_MEDIUM;
345
+ }
346
+ return SIGNAL_COLOR_WEAK;
347
+ }
348
+ function getWiFiSecurityTypeName(securityType) {
349
+ switch (securityType) {
350
+ case 0:
351
+ return "Unspecified";
352
+ case 1:
353
+ return "None";
354
+ case 2:
355
+ return "WEP";
356
+ case 3:
357
+ return "WPA Personal";
358
+ case 4:
359
+ return "WPA2 Personal";
360
+ case 5:
361
+ return "WPA3 Personal";
362
+ default:
363
+ return "Unknown";
364
+ }
365
+ }
366
+ function getWiFiVersionName(version) {
367
+ switch (version) {
368
+ case 0:
369
+ return "802.11a";
370
+ case 1:
371
+ return "802.11b";
372
+ case 2:
373
+ return "802.11g";
374
+ case 3:
375
+ return "802.11n";
376
+ case 4:
377
+ return "802.11ac";
378
+ case 5:
379
+ return "802.11ax";
380
+ case 6:
381
+ return "802.11ah";
382
+ default:
383
+ return "Unknown";
384
+ }
385
+ }
386
+ function buildThreadConnections(nodes, extAddrMap, unknownDevices) {
387
+ const connections = [];
388
+ const seenConnections = /* @__PURE__ */ new Set();
389
+ const unknownExtAddrMap = /* @__PURE__ */ new Map();
390
+ for (const unknown of unknownDevices) {
391
+ unknownExtAddrMap.set(unknown.extAddress, unknown.id);
392
+ }
393
+ for (const node of Object.values(nodes)) {
394
+ const fromNodeId = String(node.node_id);
395
+ const neighbors = parseNeighborTable(node);
396
+ for (const neighbor of neighbors) {
397
+ let toNodeId = extAddrMap.get(neighbor.extAddress);
398
+ if (toNodeId === void 0) {
399
+ toNodeId = unknownExtAddrMap.get(neighbor.extAddress);
400
+ }
401
+ if (toNodeId === void 0) {
402
+ continue;
403
+ }
404
+ if (fromNodeId === toNodeId) {
405
+ continue;
406
+ }
407
+ const connectionKey = `${fromNodeId}-${toNodeId}`;
408
+ const reverseKey = `${toNodeId}-${fromNodeId}`;
409
+ if (seenConnections.has(connectionKey) || seenConnections.has(reverseKey)) {
410
+ continue;
411
+ }
412
+ seenConnections.add(connectionKey);
413
+ const routeEntry = findRouteByExtAddress(node, neighbor.extAddress);
414
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
415
+ connections.push({
416
+ fromNodeId,
417
+ toNodeId,
418
+ signalColor: getSignalColor(neighbor),
419
+ lqi: neighbor.lqi,
420
+ rssi: neighbor.avgRssi ?? neighbor.lastRssi,
421
+ pathCost: routeEntry?.pathCost,
422
+ bidirectionalLqi
423
+ });
424
+ }
425
+ const routes = parseRouteTable(node);
426
+ for (const route of routes) {
427
+ if (!route.linkEstablished || !route.allocated) continue;
428
+ let toNodeId = extAddrMap.get(route.extAddress);
429
+ if (toNodeId === void 0) {
430
+ toNodeId = unknownExtAddrMap.get(route.extAddress);
431
+ }
432
+ if (toNodeId === void 0 || toNodeId === fromNodeId) continue;
433
+ const connectionKey = `${fromNodeId}-${toNodeId}`;
434
+ const reverseKey = `${toNodeId}-${fromNodeId}`;
435
+ if (seenConnections.has(connectionKey) || seenConnections.has(reverseKey)) {
436
+ continue;
437
+ }
438
+ seenConnections.add(connectionKey);
439
+ const bidirectionalLqi = getRouteBidirectionalLqi(route);
440
+ const signalColor = bidirectionalLqi !== void 0 ? getSignalColorFromLqi(bidirectionalLqi) : "var(--md-sys-color-outline, grey)";
441
+ connections.push({
442
+ fromNodeId,
443
+ toNodeId,
444
+ signalColor,
445
+ lqi: bidirectionalLqi ?? 0,
446
+ rssi: null,
447
+ pathCost: route.pathCost,
448
+ bidirectionalLqi,
449
+ fromRouteTable: true
450
+ });
451
+ }
452
+ }
453
+ return connections;
454
+ }
455
+ function getNodeConnections(nodeId, nodes, extAddrMap) {
456
+ const connections = [];
457
+ const seenConnectedIds = /* @__PURE__ */ new Set();
458
+ const node = nodes[nodeId];
459
+ if (!node) return connections;
460
+ const thisExtAddr = getThreadExtendedAddress(node);
461
+ const neighbors = parseNeighborTable(node);
462
+ for (const neighbor of neighbors) {
463
+ const connectedNodeId = extAddrMap.get(neighbor.extAddress);
464
+ const connectedNode = connectedNodeId ? nodes[connectedNodeId] : void 0;
465
+ const isUnknown = connectedNodeId === void 0;
466
+ const displayId = isUnknown ? `unknown_${neighbor.extAddress.toString(16).toUpperCase().padStart(16, "0")}` : connectedNodeId;
467
+ seenConnectedIds.add(displayId);
468
+ const routeEntry = findRouteByExtAddress(node, neighbor.extAddress);
469
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
470
+ connections.push({
471
+ connectedNodeId: displayId,
472
+ connectedNode,
473
+ extAddressHex: neighbor.extAddress.toString(16).toUpperCase().padStart(16, "0"),
474
+ signalColor: getSignalColor(neighbor),
475
+ lqi: neighbor.lqi,
476
+ rssi: neighbor.avgRssi ?? neighbor.lastRssi,
477
+ isOutgoing: true,
478
+ isUnknown,
479
+ pathCost: routeEntry?.pathCost,
480
+ bidirectionalLqi
481
+ });
482
+ }
483
+ if (thisExtAddr !== void 0) {
484
+ for (const otherNode of Object.values(nodes)) {
485
+ const otherNodeId = String(otherNode.node_id);
486
+ if (otherNodeId === nodeId) continue;
487
+ if (seenConnectedIds.has(otherNodeId)) continue;
488
+ const otherNeighbors = parseNeighborTable(otherNode);
489
+ const reverseEntry = otherNeighbors.find((n) => n.extAddress === thisExtAddr);
490
+ if (reverseEntry) {
491
+ const otherExtAddr = getThreadExtendedAddress(otherNode);
492
+ const extAddrHex = otherExtAddr ? otherExtAddr.toString(16).toUpperCase().padStart(16, "0") : "Unknown";
493
+ const routeEntry = findRouteByExtAddress(otherNode, thisExtAddr);
494
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
495
+ connections.push({
496
+ connectedNodeId: otherNodeId,
497
+ connectedNode: otherNode,
498
+ extAddressHex: extAddrHex,
499
+ signalColor: getSignalColor(reverseEntry),
500
+ lqi: reverseEntry.lqi,
501
+ rssi: reverseEntry.avgRssi ?? reverseEntry.lastRssi,
502
+ isOutgoing: false,
503
+ isUnknown: false,
504
+ pathCost: routeEntry?.pathCost,
505
+ bidirectionalLqi
506
+ });
507
+ }
508
+ }
509
+ }
510
+ return connections;
511
+ }
512
+ export {
513
+ buildExtAddrMap,
514
+ buildRloc16Map,
515
+ buildThreadConnections,
516
+ categorizeDevices,
517
+ findRouteByExtAddress,
518
+ findUnknownDevices,
519
+ getDeviceName,
520
+ getNetworkType,
521
+ getNodeConnections,
522
+ getRoutableDestinationsCount,
523
+ getRouteBidirectionalLqi,
524
+ getSignalColor,
525
+ getSignalColorFromLqi,
526
+ getSignalColorFromRssi,
527
+ getThreadChannel,
528
+ getThreadExtendedAddress,
529
+ getThreadExtendedAddressHex,
530
+ getThreadExtendedPanId,
531
+ getThreadRloc16,
532
+ getThreadRole,
533
+ getThreadRoleName,
534
+ getWiFiDiagnostics,
535
+ getWiFiSecurityTypeName,
536
+ getWiFiVersionName,
537
+ parseNeighborTable,
538
+ parseRouteTable
539
+ };
540
+ //# sourceMappingURL=network-utils.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/network/network-utils.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseNetworkGraph } from "./base-network-graph.js";
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ "thread-graph": ThreadGraph;
10
+ }
11
+ }
12
+ export declare class ThreadGraph extends BaseNetworkGraph {
13
+ /** Cache of unknown devices for the current render */
14
+ private _unknownDevices;
15
+ /** Cached map of unknown devices (rebuilt in _updateGraph) */
16
+ private _unknownDevicesMapCache;
17
+ /** Get unknown devices as a map for use by details panel */
18
+ get unknownDevicesMap(): Map<string, {
19
+ extAddressHex: string;
20
+ isRouter: boolean;
21
+ seenBy: string[];
22
+ bestRssi: number | null;
23
+ }>;
24
+ protected _updateGraph(): void;
25
+ render(): import("lit-html").TemplateResult<1>;
26
+ }
27
+ //# sourceMappingURL=thread-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-graph.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/thread-graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAY3D,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,cAAc,EAAE,WAAW,CAAC;KAC/B;CACJ;AAED,qBACa,WAAY,SAAQ,gBAAgB;IAC7C,sDAAsD;IACtD,OAAO,CAAC,eAAe,CAA6B;IAEpD,8DAA8D;IAC9D,OAAO,CAAC,uBAAuB,CAGjB;IAEd,4DAA4D;IAC5D,IAAW,iBAAiB,IAAI,GAAG,CAC/B,MAAM,EACN;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAC1F,CAEA;cAEkB,YAAY,IAAI,IAAI;IA8G9B,MAAM;CAclB"}