(state: AppState, udid: String, socket: WebSocket)
| 2833 | } |
| 2834 | |
| 2835 | async 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 | |
| 2890 | async fn run_control_queue( |
| 2891 | session: SimulatorSession, |
no test coverage detected