futu_gateway_core/bridge/
reference_runtime.rs1use std::sync::Arc;
8
9use super::{clock::ServerClock, reference_data_download};
10
11#[derive(Clone)]
12pub struct ReferenceRuntime {
13 suspend_cache: futu_backend::suspend_data::SuspendCache,
15 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 let suspend_handle = reference_data_download::spawn_suspend_data_download(
49 Arc::clone(&self.suspend_cache),
50 reference_http_client.clone(),
51 );
52
53 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}