Skip to main content

futu_gateway_core/bridge/
reference_runtime.rs

1//! Reference-data runtime boundary.
2//!
3//! Owns the HTTP reference-data caches that are warmed during bridge startup
4//! and then read by QOT handlers. Keeping them in one bundle prevents
5//! `GatewayBridge` from exposing each cache as another top-level state field.
6
7use std::sync::Arc;
8
9use super::{clock::ServerClock, reference_data_download};
10
11#[derive(Clone)]
12pub struct ReferenceRuntime {
13    /// 停牌数据缓存 (stock_id -> Vec<timestamp>).
14    suspend_cache: futu_backend::suspend_data::SuspendCache,
15    /// 代码变更数据缓存 (HTTP 下载的 CodeRelation + CodeTemp).
16    code_change_cache: futu_backend::code_change::CodeChangeCache,
17}
18
19impl ReferenceRuntime {
20    pub fn new() -> Self {
21        Self {
22            suspend_cache: Arc::new(dashmap::DashMap::new()),
23            code_change_cache: futu_backend::code_change::new_cache(),
24        }
25    }
26
27    pub fn suspend_cache(&self) -> futu_backend::suspend_data::SuspendCache {
28        Arc::clone(&self.suspend_cache)
29    }
30
31    pub fn code_change_cache(&self) -> futu_backend::code_change::CodeChangeCache {
32        Arc::clone(&self.code_change_cache)
33    }
34
35    pub fn spawn_downloads(&self, clock: Arc<dyn ServerClock>) -> Vec<tokio::task::JoinHandle<()>> {
36        let reference_http_client = match futu_backend::reference_http::build_client() {
37            Ok(client) => client,
38            Err(error) => {
39                tracing::error!(
40                    %error,
41                    "reference-data HTTP client config failed; skipping reference data preload"
42                );
43                return Vec::new();
44            }
45        };
46
47        // 后台异步加载停牌数据 (不阻塞启动).
48        let suspend_handle = reference_data_download::spawn_suspend_data_download(
49            Arc::clone(&self.suspend_cache),
50            reference_http_client.clone(),
51        );
52
53        // 后台异步加载代码变更数据 (不阻塞启动).
54        let code_change_handle = reference_data_download::spawn_code_change_data_download(
55            Arc::clone(&self.code_change_cache),
56            reference_http_client,
57            clock,
58        );
59
60        vec![suspend_handle, code_change_handle]
61    }
62}
63
64impl Default for ReferenceRuntime {
65    fn default() -> Self {
66        Self::new()
67    }
68}