(
socket: WebSocket,
target: ChromeDevToolsTargetRuntime,
query: DevToolsQuery,
)
| 1248 | } |
| 1249 | |
| 1250 | async fn handle_socket_inner( |
| 1251 | socket: WebSocket, |
| 1252 | target: ChromeDevToolsTargetRuntime, |
| 1253 | query: DevToolsQuery, |
| 1254 | ) -> Result<(), String> { |
| 1255 | let (mut writer, mut reader) = socket.split(); |
| 1256 | let mut state = CdpState::default(); |
| 1257 | |
| 1258 | while let Some(message) = reader.next().await { |
| 1259 | let text = match message { |
| 1260 | Ok(Message::Text(text)) => text.to_string(), |
| 1261 | Ok(Message::Binary(bytes)) => String::from_utf8(bytes.to_vec()) |
| 1262 | .map_err(|error| format!("Invalid UTF-8 DevTools frame: {error}"))?, |
| 1263 | Ok(Message::Close(_)) => break, |
| 1264 | Ok(Message::Ping(_)) | Ok(Message::Pong(_)) => continue, |
| 1265 | Err(error) => return Err(format!("WebSocket client error: {error}")), |
| 1266 | }; |
| 1267 | |
| 1268 | let request = serde_json::from_str::<Value>(&text) |
| 1269 | .map_err(|error| format!("Malformed DevTools JSON: {error}"))?; |
| 1270 | let id = request.get("id").cloned(); |
| 1271 | let method = request |
| 1272 | .get("method") |
| 1273 | .and_then(Value::as_str) |
| 1274 | .unwrap_or_default() |
| 1275 | .to_owned(); |
| 1276 | let params = request.get("params").cloned().unwrap_or(Value::Null); |
| 1277 | let outcome = |
| 1278 | match handle_cdp_method(&mut state, &target, query.clone(), &method, params).await { |
| 1279 | Ok(outcome) => outcome, |
| 1280 | Err(message) => { |
| 1281 | let response = json!({ |
| 1282 | "id": id.unwrap_or(Value::Null), |
| 1283 | "error": { |
| 1284 | "code": -32000, |
| 1285 | "message": message, |
| 1286 | }, |
| 1287 | }); |
| 1288 | writer |
| 1289 | .send(Message::Text(response.to_string().into())) |
| 1290 | .await |
| 1291 | .map_err(|error| format!("Unable to send DevTools response: {error}"))?; |
| 1292 | continue; |
| 1293 | } |
| 1294 | }; |
| 1295 | let response = json!({ |
| 1296 | "id": id.unwrap_or(Value::Null), |
| 1297 | "result": outcome.result, |
| 1298 | }); |
| 1299 | |
| 1300 | writer |
| 1301 | .send(Message::Text(response.to_string().into())) |
| 1302 | .await |
| 1303 | .map_err(|error| format!("Unable to send DevTools response: {error}"))?; |
| 1304 | |
| 1305 | for event in outcome.events { |
| 1306 | writer |
| 1307 | .send(Message::Text(event.to_string().into())) |
no test coverage detected