# G-Tunnel Desktop

G-Tunnel 桌面客户端（Wails v3）。登录账号后填本地端口即可一键获得公网 HTTPS 地址。

私有仓库（open-core 闭源半边），与 [gt-control](https://github.com/zxln007/gt-control) 配套；数据面是 [gt](https://github.com/zxln007/gt)（客户端以子进程方式拉起 gt worker 二进制）。

## 本地开发

```powershell
# 依赖：Go 1.25+、WebView2 运行时（Windows 自带）、gt worker 二进制
# worker 三种来源（优先级从高到低）：
#   1. 环境变量 GT_DESKTOP_GT_BINARY 指向 gt.exe
#   2. PATH 中的 gt.exe
#   3. ./bin/gt.exe（CI 打包时放置）

# 生产模式构建（注意：必须带 -tags production，否则走 dev 模式 runtime 会失败）
go build -tags production -trimpath -ldflags="-w -s -H windowsgui" -o bin/GT-Desktop.exe .
$env:GT_DESKTOP_GT_BINARY="bin/gt.exe"; .\bin\GT-Desktop.exe
```

## Wails v3 alpha 踩坑（重要）

1. runtime.js 是 ES Module，必须 `<script type="module">` 加载；经典脚本加载会静默失败（无 onerror）
2. `window.wails.Call` 在模块求值后仍会延迟挂载，`frontend/main.js` 的 `ensureWailsRuntime` 负责轮询等待
3. WebView2 下 `window.alert` 无对话框处理器会永久阻塞 JS 线程（白屏），main.js 已拦截
4. 没有 `window.go` 全局绑定，走 `window.wails.Call.ByName`（getGTApp 的 Proxy 转发）
5. 运行时配置必须输出 gt 原生 `options:` 包裹格式，扁平格式 id 会被静默丢弃

## CI

push main → 构建 Windows 版 + 下载 gt worker → 打包 zip → artifact；打 tag `v*` → GitHub Release。
