dsh-mesh-ui 0.0.15 → 0.0.16
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/lib/client.js +21 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -120,6 +120,8 @@ function nodeLabel(name) { return NODE_LABELS[String(name || '').toLowerCase()]
|
|
|
120
120
|
// [layout-helpers-end]
|
|
121
121
|
// [relay-helpers-begin] 2026-11-09 架构层:识别公网中转站(frps)与通信方式(纯函数,可单测)
|
|
122
122
|
// 2026-11-10 隐私:默认不展示公网 IP/域名;局域网/回环地址保留。
|
|
123
|
+
// 用户在页头打开「显示公网地址」后,maskHost/maskText 直接返回原值。
|
|
124
|
+
var showPublicAddresses = false
|
|
123
125
|
function isPrivateNetworkHost(raw) {
|
|
124
126
|
var h = String(raw || '').trim().toLowerCase().replace(/^\[|\]$/g, '')
|
|
125
127
|
h = h.replace(/^https?:\/\//, '').split('/')[0].replace(/:\d+$/, '')
|
|
@@ -135,6 +137,7 @@ function nodeLabel(name) { return NODE_LABELS[String(name || '').toLowerCase()]
|
|
|
135
137
|
}
|
|
136
138
|
function maskHost(raw) {
|
|
137
139
|
var s = String(raw || '').trim()
|
|
140
|
+
if (showPublicAddresses) return s || '—'
|
|
138
141
|
if (!s) return '—'
|
|
139
142
|
var port = ''
|
|
140
143
|
var m = /^(.*):(\d+)$/.exec(s)
|
|
@@ -142,6 +145,7 @@ function nodeLabel(name) { return NODE_LABELS[String(name || '').toLowerCase()]
|
|
|
142
145
|
return (isPrivateNetworkHost(s) ? s : '公网地址已隐藏') + port
|
|
143
146
|
}
|
|
144
147
|
function maskText(value) {
|
|
148
|
+
if (showPublicAddresses) return value
|
|
145
149
|
if (typeof value !== 'string') return value
|
|
146
150
|
return value
|
|
147
151
|
.replace(/https?:\/\/[^\s"'<>]+/gi, function (u) {
|
|
@@ -1543,6 +1547,17 @@ function deviceLinkState(data, peer, lanMap) {
|
|
|
1543
1547
|
var verdictState = useState(''); var verdictShown = verdictState[0]; var setVerdictShown = verdictState[1]
|
|
1544
1548
|
var verdictRef = useRef({ raw: '', streak: 0 })
|
|
1545
1549
|
var s5 = useState('local'); var selectedKey = s5[0]; var setSelectedKey = s5[1]
|
|
1550
|
+
var sPublic = useState(function () {
|
|
1551
|
+
try { return window.localStorage.getItem('dsh-mesh.show-public-addresses') === '1' } catch (error) { return false }
|
|
1552
|
+
})
|
|
1553
|
+
var showPublic = sPublic[0]; var setShowPublic = sPublic[1]
|
|
1554
|
+
showPublicAddresses = showPublic
|
|
1555
|
+
function toggleShowPublic(event) {
|
|
1556
|
+
var next = Boolean(event && event.target && event.target.checked)
|
|
1557
|
+
setShowPublic(next)
|
|
1558
|
+
showPublicAddresses = next
|
|
1559
|
+
try { window.localStorage.setItem('dsh-mesh.show-public-addresses', next ? '1' : '0') } catch (error) { /* ignore */ }
|
|
1560
|
+
}
|
|
1546
1561
|
// 双栏宽度:拖动分隔条调整并记忆,窄屏由 CSS 媒体查询自动堆叠。
|
|
1547
1562
|
var dragState = useState(function () {
|
|
1548
1563
|
try { var saved = Number(window.localStorage.getItem('dsh-mesh-split-w')); return Number.isFinite(saved) && saved > 0 ? saved : 0 } catch (error) { return 0 }
|
|
@@ -1684,6 +1699,10 @@ function deviceLinkState(data, peer, lanMap) {
|
|
|
1684
1699
|
}, data.warming ? '预热中' : (verdictShown || data.verdict || '?')),
|
|
1685
1700
|
h('span', { className: 'dm-sub' }, (data.meshVersion ? 'mesh ' + data.meshVersion + ' · ' : '') + (data.at ? ago(data.at) : '')),
|
|
1686
1701
|
h('span', { style: { flex: 1 } }),
|
|
1702
|
+
h('label', { className: 'dm-toggle', title: '默认隐藏公网 IP/域名;勾选后显示真实地址并记住选择' },
|
|
1703
|
+
h('input', { type: 'checkbox', checked: Boolean(showPublic), onChange: toggleShowPublic }),
|
|
1704
|
+
h('span', null, '显示公网地址')
|
|
1705
|
+
),
|
|
1687
1706
|
h('a', { className: 'dm-btn', href: API, target: '_blank', rel: 'noreferrer', style: { textDecoration: 'none' } }, '原始 JSON'),
|
|
1688
1707
|
h('button', { className: 'dm-btn', onClick: copyJson }, copied || '复制诊断'),
|
|
1689
1708
|
h('button', { className: 'dm-btn primary', onClick: function () { load(true) }, title: '立即采集一次并等待新快照(8s 冷却)' }, loading ? '采集中…' : '刷新'),
|
|
@@ -2419,6 +2438,8 @@ body[data-ds-dark-theme] .dm-dg-fs-item.active { background:rgba(88,166,255,.28)
|
|
|
2419
2438
|
.dm-lan-node { display:flex; gap:8px; align-items:center; border-top:1px solid rgba(128,128,128,.16); padding:7px 0; font-size:12px; }
|
|
2420
2439
|
.dm-lan-node:first-child { border-top:none; }
|
|
2421
2440
|
.dm-lan-code { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:12px; padding:6px 8px; border-radius:8px; background:rgba(88,166,255,.1); border:1px solid rgba(88,166,255,.35); word-break:break-all; }
|
|
2441
|
+
.dm-toggle { display:inline-flex; align-items:center; gap:5px; font-size:11.5px; opacity:.8; cursor:pointer; user-select:none; white-space:nowrap; }
|
|
2442
|
+
.dm-toggle input { margin:0; }
|
|
2422
2443
|
|
|
2423
2444
|
.dm-pane { min-width:0; display:flex; flex-direction:column; gap:12px; }
|
|
2424
2445
|
.dm-divider { cursor:col-resize; align-self:stretch; min-height:120px; border-radius:4px; position:relative; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-mesh-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "DSH sidebar page for dsh-mesh: AI network topology, peer health, and delegation panel. Read-only; data is collected from the installed dsh-mesh-node package.",
|
|
5
5
|
"icon": "icon.svg",
|
|
6
6
|
"type": "module",
|