Skip to main content

auto_update/
auto_update.rs

1use futures_util::StreamExt;
2
3use ai_cortex_sdk::{CortexClient, CortexConfig};
4
5/// 演示自动更新流程:
6///   1. check_update(Pull):轮询是否有新版本,打印 has_update / force_update / 目标版本
7///   2. open_update_events(Push,可选):订阅 SSE 更新事件流,打印 3 条后退出
8///
9/// Usage:
10///   cargo run --example auto_update -- [PAT] [SOFTWARE_ID]
11///   # 末尾追加 "stream" 参数以演示 SSE:cargo run --example auto_update -- <PAT> <SOFTWARE_ID> stream
12#[tokio::main]
13async fn main() {
14    let server_url =
15        std::env::var("CORTEX_SERVER_URL").unwrap_or_else(|_| "http://localhost:40404".into());
16    let pat = std::env::args()
17        .nth(1)
18        .or_else(|| std::env::var("CORTEX_PAT").ok())
19        .unwrap_or_else(|| "REPLACE_WITH_YOUR_PAT".to_string());
20    let software_id = std::env::args()
21        .nth(2)
22        .or_else(|| std::env::var("CORTEX_SOFTWARE_ID").ok())
23        .unwrap_or_else(|| "00000000-0000-0000-0000-000000000000".to_string());
24    // 第 3 个位置参数(任意值)= 演示 SSE 流
25    let demo_stream = std::env::args().nth(3).is_some();
26
27    // 关闭心跳,避免示例对服务端产生副作用
28    let config = CortexConfig::new(&server_url, &pat, &software_id).without_heartbeat();
29    let client = CortexClient::new(config);
30
31    // --- 1. Pull:检查更新 ---
32    println!("=== Check Update (Pull) ===");
33    let platform = std::env::consts::OS; // linux / macos / windows
34    let current_version = "1.0.0";
35    match client
36        .check_update(platform, current_version, None)
37        .await
38    {
39        Ok(info) => {
40            println!("current_version : {}", info.current_version);
41            println!("has_update      : {}", info.has_update);
42            println!("force_update    : {}", info.force_update);
43            if let Some(t) = &info.target_version {
44                println!("target_version  : {} (channel={}, size={} bytes)", t.version, t.channel, t.file_size);
45                println!("release_notes   : {}", t.release_notes);
46                println!("min_compatible  : {}", t.min_compatible);
47            }
48            // force_update 语义:客户端应阻止启动直到用户升级
49            if info.has_update && info.force_update {
50                println!("\n>>> 强制更新:当前版本被阻塞,必须升级后才能继续。");
51            }
52        }
53        Err(e) => eprintln!("check_update failed: {e}"),
54    }
55
56    // --- 2. Push:订阅 SSE 更新事件流(可选) ---
57    if demo_stream {
58        println!("\n=== Update Events (Push / SSE) ===");
59        match client.open_update_events(Some(&software_id), None).await {
60            Ok(mut stream) => {
61                println!("SSE connected. Waiting for events (will print 3 then exit)...");
62                let mut count = 0usize;
63                while let Some(ev) = stream.next().await {
64                    match ev {
65                        Ok(e) => {
66                            println!(
67                                "event #{}: software={} version={} platform={} channel={} force={}",
68                                e.id, e.software_id, e.version, e.platform, e.channel, e.force_update
69                            );
70                            count += 1;
71                            if count >= 3 {
72                                println!("Received 3 events, exiting demo.");
73                                break;
74                            }
75                        }
76                        Err(e) => {
77                            eprintln!("stream error: {e}");
78                            break;
79                        }
80                    }
81                }
82            }
83            Err(e) => eprintln!("open_update_events failed: {e}"),
84        }
85    }
86}