cicy-desktop 2.1.205 → 2.1.206

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/package.json +1 -1
  2. package/src/app-updater.js +27 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cicy-desktop",
3
- "version": "2.1.205",
3
+ "version": "2.1.206",
4
4
  "description": "CiCy - AI-powered operating system browser",
5
5
  "main": "src/main.js",
6
6
  "bin": {
@@ -64,6 +64,27 @@ function mirrored(githubUrl) {
64
64
  return m ? mirrorUrl(githubUrl, m) : githubUrl;
65
65
  }
66
66
 
67
+ // HEAD 探测 URL 是否可下(200/206 = ok)。跟随重定向(GitHub release 会 302 到 CDN)。
68
+ // 用于「先出包再更新版本」的客户端保险:版本号涨了但包还没传 → HEAD 404 → 先不报更新。
69
+ function headOk(url, redirects = 0) {
70
+ return new Promise((resolve) => {
71
+ if (redirects > 6) return resolve(false);
72
+ let req;
73
+ try {
74
+ req = https.request(url, { method: "HEAD", headers: { "User-Agent": "cicy-desktop" }, timeout: 10000 }, (res) => {
75
+ res.resume();
76
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
77
+ return headOk(res.headers.location, redirects + 1).then(resolve);
78
+ }
79
+ resolve(res.statusCode === 200 || res.statusCode === 206);
80
+ });
81
+ } catch { return resolve(false); }
82
+ req.on("error", () => resolve(false));
83
+ req.on("timeout", () => { req.destroy(); resolve(false); });
84
+ req.end();
85
+ });
86
+ }
87
+
67
88
  // ── 最新版本号 ────────────────────────────────────────────────────────────────
68
89
  async function fetchLatestVersion(network) {
69
90
  if (network === "cn") {
@@ -158,7 +179,12 @@ async function check() {
158
179
  const latest = await fetchLatestVersion(net);
159
180
  const current = app.getVersion();
160
181
  if (latest && cmpVer(latest, current) > 0) {
161
- broadcast({ status: "available", version: latest, current, progress: null, filePath: null });
182
+ // 「先出包再更新版本」客户端保险:版本号涨了不代表包传完了。先 HEAD 确认本平台安装包
183
+ // 真能下(200),否则当成「还没就绪」继续显已是最新,避免用户点下载 404。
184
+ const { url } = assetFor(latest, net);
185
+ const ready = await headOk(url);
186
+ if (ready) broadcast({ status: "available", version: latest, current, progress: null, filePath: null });
187
+ else { log.info(`[app-updater] ${latest} 版本号已更新但安装包未就位(HEAD 非 200):${url} — 暂不提示更新`); broadcast({ status: "up-to-date", version: current, current }); }
162
188
  } else {
163
189
  broadcast({ status: "up-to-date", version: latest || current, current });
164
190
  }