MCPcopy Create free account
hub / github.com/NativeScript/SimDeck / handle_control_socket

Function handle_control_socket

packages/server/src/api/routes.rs:2835–2888  ·  view source on GitHub ↗
(state: AppState, udid: String, socket: WebSocket)

Source from the content-addressed store, hash-verified

2833}
2834
2835async fn handle_control_socket(state: AppState, udid: String, socket: WebSocket) {
2836 let session = match state.registry.get_or_create_async(&udid).await {
2837 Ok(session) => session,
2838 Err(error) => {
2839 tracing::debug!("Failed to create control session for {udid}: {error}");
2840 return;
2841 }
2842 };
2843 if let Err(error) = session.ensure_started_async().await {
2844 tracing::debug!("Failed to start control session for {udid}: {error}");
2845 return;
2846 }
2847
2848 let (mut sender, mut receiver) = socket.split();
2849 let _ = sender
2850 .send(Message::Text(
2851 json_value!({ "type": "ready", "udid": udid })
2852 .to_string()
2853 .into(),
2854 ))
2855 .await;
2856 let (control_tx, control_rx) = mpsc::unbounded_channel::<ControlMessage>();
2857 let bridge = state.registry.bridge().clone();
2858 let control_task = task::spawn(run_control_queue(session, bridge, udid.clone(), control_rx));
2859
2860 while let Some(message) = receiver.next().await {
2861 let text = match message {
2862 Ok(Message::Text(text)) => text,
2863 Ok(Message::Binary(bytes)) => match String::from_utf8(bytes.to_vec()) {
2864 Ok(text) => text.into(),
2865 Err(_) => continue,
2866 },
2867 Ok(Message::Close(_)) => break,
2868 Ok(Message::Ping(_)) | Ok(Message::Pong(_)) => continue,
2869 Err(error) => {
2870 tracing::debug!("Control WebSocket closed for {udid}: {error}");
2871 break;
2872 }
2873 };
2874
2875 let control_message = match serde_json::from_str::<ControlMessage>(&text) {
2876 Ok(message) => message,
2877 Err(error) => {
2878 tracing::debug!("Invalid control message for {udid}: {error}");
2879 continue;
2880 }
2881 };
2882 if control_tx.send(control_message).is_err() {
2883 break;
2884 }
2885 }
2886 drop(control_tx);
2887 let _ = control_task.await;
2888}
2889
2890async fn run_control_queue(
2891 session: SimulatorSession,

Callers 1

control_socketFunction · 0.85

Calls 7

TextInterface · 0.85
run_control_queueFunction · 0.85
get_or_create_asyncMethod · 0.80
ensure_started_asyncMethod · 0.80
bridgeMethod · 0.80
sendMethod · 0.65
cloneMethod · 0.65

Tested by

no test coverage detected