[fix] pre and cdn swith

This commit is contained in:
2025-11-09 00:07:44 +08:00
parent 5e663dc79e
commit 4b7735575a
5 changed files with 72 additions and 18 deletions

2
next-env.d.ts vendored
View File

@@ -1,6 +1,6 @@
/// <reference types="next" /> /// <reference types="next" />
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts"; import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

View File

@@ -346,9 +346,11 @@ pub async fn check_app_update(
app: tauri::AppHandle, app: tauri::AppHandle,
endpoint: Option<String>, endpoint: Option<String>,
include_prerelease: Option<bool>, include_prerelease: Option<bool>,
use_cdn: Option<bool>,
) -> Result<Option<UpdateInfo>, String> { ) -> Result<Option<UpdateInfo>, String> {
info!("开始检查更新..."); info!("开始检查更新...");
info!("include_prerelease: {:?}", include_prerelease); info!("include_prerelease: {:?}", include_prerelease);
info!("use_cdn: {:?}", use_cdn);
// 构建更新端点 URL // 构建更新端点 URL
// Tauri updater 需要支持 {{target}} 和 {{arch}} 变量的端点 // Tauri updater 需要支持 {{target}} 和 {{arch}} 变量的端点
@@ -413,9 +415,12 @@ pub async fn check_app_update(
// Update 类型没有实现 Debug trait所以不能使用 {:?} 格式化 // Update 类型没有实现 Debug trait所以不能使用 {:?} 格式化
// 如果需要更多信息,可以单独记录各个字段 // 如果需要更多信息,可以单独记录各个字段
// 将下载 URL 替换为 CDN 链接 // 根据 use_cdn 参数决定是否使用 CDN 链接
let mut download_url = update.download_url.to_string(); let mut download_url = update.download_url.to_string();
let original_url = download_url.clone(); let original_url = download_url.clone();
let use_cdn_value = use_cdn.unwrap_or(true); // 默认使用 CDN
if use_cdn_value {
// 如果 URL 不是 CDN 链接,则在 CDN 域名后拼接原 URL // 如果 URL 不是 CDN 链接,则在 CDN 域名后拼接原 URL
if !download_url.contains("cdn.upup.cool") { if !download_url.contains("cdn.upup.cool") {
download_url = format!("https://cdn.upup.cool/{}", original_url); download_url = format!("https://cdn.upup.cool/{}", original_url);
@@ -423,6 +428,10 @@ pub async fn check_app_update(
} else { } else {
info!("下载 URL 已经是 CDN 链接: {}", download_url); info!("下载 URL 已经是 CDN 链接: {}", download_url);
} }
} else {
// 不使用 CDN保持原始 URL
info!("不使用 CDN保持原始下载 URL: {}", download_url);
}
// 存储更新对象和 CDN URL 供后续使用 // 存储更新对象和 CDN URL 供后续使用
let pending = get_pending_update(); let pending = get_pending_update();
@@ -457,8 +466,10 @@ pub async fn check_app_update(
#[tauri::command] #[tauri::command]
pub async fn download_app_update( pub async fn download_app_update(
app: tauri::AppHandle, app: tauri::AppHandle,
use_cdn: Option<bool>,
) -> Result<(), String> { ) -> Result<(), String> {
info!("开始下载更新..."); info!("开始下载更新...");
info!("use_cdn: {:?}", use_cdn);
let pending = get_pending_update(); let pending = get_pending_update();
// 检查是否有待下载的更新 // 检查是否有待下载的更新
@@ -477,28 +488,37 @@ pub async fn download_app_update(
let app_handle_progress = app.clone(); let app_handle_progress = app.clone();
let app_handle_complete = app.clone(); let app_handle_complete = app.clone();
// 在锁内获取 update 和 CDN URL然后在锁外使用 // 根据 use_cdn 参数决定使用原始 URL 还是 CDN URL
let use_cdn_value = use_cdn.unwrap_or(true); // 默认使用 CDN
// 在锁内获取 update 和 URL然后在锁外使用
let cloned_data = { let cloned_data = {
let update_guard = pending.lock().unwrap(); let update_guard = pending.lock().unwrap();
if let Some(ref update_with_cdn) = *update_guard { if let Some(ref update_with_cdn) = *update_guard {
info!("准备下载更新 - 版本: {}, 原始 URL: {}, CDN URL: {}", let download_url = if use_cdn_value {
update_with_cdn.cdn_url.clone()
} else {
update_with_cdn.update.download_url.to_string()
};
info!("准备下载更新 - 版本: {}, 原始 URL: {}, CDN URL: {}, 使用 URL: {}",
update_with_cdn.update.version, update_with_cdn.update.version,
update_with_cdn.update.download_url, update_with_cdn.update.download_url,
update_with_cdn.cdn_url); update_with_cdn.cdn_url,
Some((update_with_cdn.update.clone(), update_with_cdn.cdn_url.clone())) download_url);
Some((update_with_cdn.update.clone(), update_with_cdn.cdn_url.clone(), download_url))
} else { } else {
None None
} }
}; };
// 现在锁已经释放,可以安全地下载 // 现在锁已经释放,可以安全地下载
if let Some((update, cdn_url)) = cloned_data { if let Some((update, cdn_url, download_url)) = cloned_data {
info!("开始使用 CDN URL 下载更新文件: {}", cdn_url); info!("开始下载更新文件: {} (使用 CDN: {})", download_url, use_cdn_value);
// 使用 reqwest 手动下载文件 // 使用 reqwest 手动下载文件
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let mut response = client let mut response = client
.get(&cdn_url) .get(&download_url)
.send() .send()
.await .await
.map_err(|e| { .map_err(|e| {

View File

@@ -64,10 +64,23 @@ export default function Page() {
? "检查更新时会包含预发布版本beta、alpha等" ? "检查更新时会包含预发布版本beta、alpha等"
: "仅检查正式版本"} : "仅检查正式版本"}
</p> </p>
<Switch
isSelected={app.state.useCdn}
size="sm"
onChange={(e) => app.setUseCdn(e.target.checked)}
>
使 CDN
</Switch>
<p className="text-xs text-zinc-500">
{app.state.useCdn
? "加速下载,避免 GitHub 无法正常访问"
: "直接从 GitHub 下载更新文件"}
</p>
</div> </div>
<UpdateChecker <UpdateChecker
customEndpoint={customEndpoint || undefined} customEndpoint={customEndpoint || undefined}
includePrerelease={app.state.includePrerelease} includePrerelease={app.state.includePrerelease}
useCdn={app.state.useCdn}
/> />
</div> </div>

View File

@@ -28,11 +28,13 @@ interface UpdateInfo {
interface UpdateCheckerProps { interface UpdateCheckerProps {
customEndpoint?: string customEndpoint?: string
includePrerelease?: boolean includePrerelease?: boolean
useCdn?: boolean
} }
export function UpdateChecker({ export function UpdateChecker({
customEndpoint, customEndpoint,
includePrerelease = false, includePrerelease = false,
useCdn = true,
}: UpdateCheckerProps) { }: UpdateCheckerProps) {
const app = useAppStore() const app = useAppStore()
const [checking, setChecking] = useState(false) const [checking, setChecking] = useState(false)
@@ -73,12 +75,25 @@ export function UpdateChecker({
setDownloadCompleted(false) setDownloadCompleted(false)
try { try {
// 如果有自定义端点使用自定义端点否则使用默认端点GitHub Release 或镜像源) // 根据是否包含测试版来选择不同的 endpoint
const endpoint = customEndpoint || null // 如果提供了 customEndpoint优先使用否则根据 includePrerelease 动态选择
let endpoint: string | null = null
if (customEndpoint) {
// 如果提供了 customEndpoint仍然使用它用于特殊场景
endpoint = customEndpoint
} else {
// 根据 includePrerelease 选择对应的 endpoint
if (includePrerelease) {
endpoint = "https://gh-info.okk.cool/repos/plsgo/cstb/releases/latest/pre/tauri"
} else {
endpoint = "https://gh-info.okk.cool/repos/plsgo/cstb/releases/latest/tauri"
}
}
const result = await invoke<UpdateInfo | null>("check_app_update", { const result = await invoke<UpdateInfo | null>("check_app_update", {
endpoint: endpoint, endpoint: endpoint,
includePrerelease: includePrerelease, includePrerelease: includePrerelease,
useCdn: useCdn,
}) })
if (result) { if (result) {
@@ -122,8 +137,8 @@ export function UpdateChecker({
setDownloadCompleted(false) setDownloadCompleted(false)
try { try {
// 使用官方 updater 插件,不需要传递 downloadUrl // 使用官方 updater 插件,传递 useCdn 参数
await invoke("download_app_update") await invoke("download_app_update", { useCdn: useCdn })
// 下载完成,标记状态 // 下载完成,标记状态
setDownloadProgress(100) setDownloadProgress(100)

View File

@@ -12,6 +12,7 @@ const defaultValue = {
notice: "", notice: "",
useMirror: true, // 默认使用镜像源CDN 加速) useMirror: true, // 默认使用镜像源CDN 加速)
includePrerelease: false, // 默认不包含预发布版本 includePrerelease: false, // 默认不包含预发布版本
useCdn: true, // 默认使用 CDN 加速下载
autoStart: false, autoStart: false,
startHidden: false, startHidden: false,
hiddenOnClose: false, hiddenOnClose: false,
@@ -34,6 +35,7 @@ export const useAppStore = () => {
setNotice, setNotice,
setUseMirror, setUseMirror,
setIncludePrerelease, setIncludePrerelease,
setUseCdn,
setAutoStart, setAutoStart,
setStartHidden, setStartHidden,
setHiddenOnClose, setHiddenOnClose,
@@ -66,6 +68,9 @@ const setUseMirror = (useMirror: boolean) => {
const setIncludePrerelease = (includePrerelease: boolean) => { const setIncludePrerelease = (includePrerelease: boolean) => {
appStore.state.includePrerelease = includePrerelease appStore.state.includePrerelease = includePrerelease
} }
const setUseCdn = (useCdn: boolean) => {
appStore.state.useCdn = useCdn
}
const setAutoStart = (autoStart: boolean) => { const setAutoStart = (autoStart: boolean) => {
if (autoStart) { if (autoStart) {
@@ -99,6 +104,7 @@ const resetAppStore = () => {
setNotice(defaultValue.notice) setNotice(defaultValue.notice)
setUseMirror(defaultValue.useMirror) setUseMirror(defaultValue.useMirror)
setIncludePrerelease(defaultValue.includePrerelease) setIncludePrerelease(defaultValue.includePrerelease)
setUseCdn(defaultValue.useCdn)
setAutoStart(defaultValue.autoStart) setAutoStart(defaultValue.autoStart)
void setStartHidden(defaultValue.startHidden) void setStartHidden(defaultValue.startHidden)
setHiddenOnClose(defaultValue.hiddenOnClose) setHiddenOnClose(defaultValue.hiddenOnClose)