futu_opend/startup/
phase3.rs1use std::sync::Arc;
13
14use futu_gateway_core::bridge::GatewayBridge;
15use futu_server::listener::{ApiServer, ServerConfig};
16
17use crate::config::RuntimeConfig;
18
19pub(super) struct Phase3Out {
21 pub(super) server: ApiServer,
22 pub(super) server_config: ServerConfig,
23 pub(super) ws_broadcaster: Arc<futu_rest::ws::WsBroadcaster>,
24 pub(super) grpc_broadcaster: Arc<futu_grpc::server::GrpcPushBroadcaster>,
25}
26
27pub(super) fn run_phase3(
28 config: &RuntimeConfig,
29 bridge: &Arc<GatewayBridge>,
30 listen_addr: &str,
31 shutdown_tx: tokio::sync::watch::Sender<bool>,
32) -> Phase3Out {
33 let server_config = ServerConfig {
35 listen_addr: listen_addr.to_string(),
36 server_ver: 1000,
37 login_user_id: 0,
40 keepalive_interval: 10,
41 rsa_private_key: config.rsa_private_key.clone(),
42 };
43 if server_config.rsa_private_key.is_some() {
44 tracing::info!("RSA encryption enabled for InitConnect");
45 }
46 let mut server = ApiServer::new(server_config.clone());
47 server
48 .router()
49 .set_startup_readiness(bridge.startup_readiness().clone());
50 server.set_server_time_store(bridge.server_clock().anchor_store());
51 server.set_metrics(std::sync::Arc::clone(bridge.push_runtime().metrics()));
52 server.set_subscriptions(bridge.subscription_runtime().manager());
53
54 futu_server::metrics::install_prometheus_extension(std::sync::Arc::clone(server.metrics()));
59 let bridge_for_push_health_metrics = std::sync::Arc::clone(bridge);
63 futu_auth::metrics::register_global_renderer(move || {
64 bridge_for_push_health_metrics
65 .push_runtime()
66 .push_health()
67 .render_prometheus()
68 });
69 let bridge_for_broker_tcp_metrics = std::sync::Arc::clone(bridge);
72 futu_auth::metrics::register_global_renderer(move || {
73 bridge_for_broker_tcp_metrics
74 .broker_runtime()
75 .render_prometheus()
76 });
77
78 {
84 let router = server.router();
85 futu_gateway_qot::register_handlers(router, bridge);
86 futu_gateway_trd::register_handlers(router, bridge);
87 futu_gateway_core::handlers_sys::register_handlers_with_shutdown_and_user_info(
88 router,
89 bridge,
90 shutdown_tx,
91 futu_gateway_core::handlers_sys::UserInfoRuntimeConfig {
92 update_check_url: Some(config.update_check_url.clone()),
93 is_nn: config.platform == crate::cli::Platform::Futunn,
94 },
95 );
96 tracing::info!("all business handlers registered");
97 }
98
99 let ws_broadcaster = std::sync::Arc::new(futu_rest::ws::WsBroadcaster::new(1024));
101 let grpc_broadcaster = std::sync::Arc::new(futu_grpc::server::GrpcPushBroadcaster::new(1024));
102
103 Phase3Out {
104 server,
105 server_config,
106 ws_broadcaster,
107 grpc_broadcaster,
108 }
109}
110
111#[cfg(test)]
112mod tests;