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.
Files changed (2) hide show
  1. package/lib/client.js +21 -0
  2. 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.15",
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",