dsh-pocket 0.1.0 → 1.0.0

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/README.md CHANGED
@@ -35,6 +35,29 @@ dsh plugin --profile web add dsh-pocket -w
35
35
 
36
36
  DSH 的 `/api` 浏览器信任栅栏只认 loopback 或 `--trusted-host`(官方还禁了 `0.0.0.0` 绑定,防止把远程执行代码暴露给网络)。Pocket 把入站请求的 `Host` / `Origin` 统一改写成 `127.0.0.1:<dsh端口>`,栅栏永远看到 loopback——**不需要改 dsh 的任何配置**。代理随插件自动启动,公网隧道按需开启(首次自动下载 cloudflared)。
37
37
 
38
+ ## ⚠️ 公网隧道常见问题(必读)
39
+
40
+ **现象**:点「开启公网访问」后,手机上打开公网地址报 `error 1033`(Tunnel error)。
41
+
42
+ **最常见原因:本机开着代理/VPN(Clash、Surge、v2ray、sing-box 等,尤其 TUN 模式)**。
43
+ 这类工具会接管全部流量,并常常把 cloudflared 的隧道边缘连接
44
+ (`*.argotunnel.com`、Cloudflare 边缘 IP)掐断,导致隧道注册成功但数据面连不上。
45
+
46
+ **解决(三选一)**:
47
+
48
+ 1. 临时**彻底退出代理软件**(不只是关界面:Clash 要右键菜单栏图标 → 退出;若装有
49
+ 后台服务还要在服务管理器里停掉,`ps aux | grep clash` 确认进程消失),再重试
50
+ 2. 给代理加**直连规则**,放行隧道域名与 Cloudflare 边缘(Clash 规则示例):
51
+ ```yaml
52
+ - DOMAIN-SUFFIX,argotunnel.com,DIRECT
53
+ - DOMAIN-SUFFIX,trycloudflare.com,DIRECT
54
+ - IP-CIDR,198.41.192.0/24,DIRECT,no-resolve
55
+ ```
56
+ 3. 网络实在不通时,改用**局域网模式**:手机开热点 → 电脑连手机热点 → 扫局域网码,
57
+ 效果完全一样(人在外面也能用)
58
+
59
+ **其他可能**:企业防火墙/校园网拦截出站;此时请让 IT 放行或改用热点。
60
+
38
61
  ## 架构(单包)
39
62
 
40
63
  | 文件 | 说明 |
@@ -73,15 +73,25 @@ async function main() {
73
73
  console.log('⚠️ 未检测到局域网 IP,跳过局域网二维码');
74
74
  }
75
75
 
76
+ // Ctrl+C / kill:停隧道 → 关代理 → 真正退出(修复:之前只停隧道不退出进程)
77
+ const controller = new AbortController();
78
+ let tunnel = null;
79
+ const shutdown = async () => {
80
+ console.log('\n👋 dsh-pocket 已退出 | bye');
81
+ controller.abort();
82
+ tunnel?.kill();
83
+ await close().catch(() => {});
84
+ process.exit(130);
85
+ };
86
+ process.on('SIGINT', () => void shutdown());
87
+ process.on('SIGTERM', () => void shutdown());
88
+
76
89
  if (args.public) {
77
90
  console.log('🌐 正在建立公网隧道(cloudflared)…');
78
- const controller = new AbortController();
79
- process.on('SIGINT', () => controller.abort());
80
91
  try {
81
- const tunnel = await startQuickTunnel({ port, signal: controller.signal });
92
+ tunnel = await startQuickTunnel({ port, signal: controller.signal });
82
93
  printQr(tunnel.url, '🌐 公网访问(人在外面也能用):');
83
94
  console.log(' 隧道会持续运行;Ctrl+C 退出(下次启动会换新 URL)');
84
- process.on('SIGINT', () => { tunnel.kill(); });
85
95
  } catch (err) {
86
96
  console.error(`❌ 公网隧道失败:${err.message}(局域网二维码仍可用)`);
87
97
  }
package/client/build.mjs CHANGED
@@ -15,7 +15,7 @@ const result = await build({
15
15
  format: 'cjs',
16
16
  platform: 'browser',
17
17
  target: ['chrome100'],
18
- external: ['react', 'react/jsx-runtime'],
18
+ external: ['react', 'react/jsx-runtime', '@deepseek-ai/dsh-client-ui-primitives'],
19
19
  write: false,
20
20
  minify: process.env.NODE_ENV === 'production',
21
21
  legalComments: 'none',