| 645 | } |
| 646 | |
| 647 | fn build_metro_target( |
| 648 | udid: &str, |
| 649 | http_origin: Option<&str>, |
| 650 | access_token: Option<&str>, |
| 651 | port: u16, |
| 652 | entry: &Value, |
| 653 | ) -> ChromeDevToolsTarget { |
| 654 | let metro_id = string_value(entry, "id").unwrap_or_else(|| "target".to_owned()); |
| 655 | let id = format!("metro-{port}-{}", path_safe_id(&metro_id)); |
| 656 | let app_id = string_value(entry, "appId"); |
| 657 | let title = string_value(entry, "title") |
| 658 | .or_else(|| app_id.clone()) |
| 659 | .unwrap_or_else(|| "React Native".to_owned()); |
| 660 | let description = string_value(entry, "description") |
| 661 | .unwrap_or_else(|| "React Native Metro DevTools target".to_owned()); |
| 662 | let web_socket_path = format!("/api/simulators/{udid}/devtools/targets/{id}/socket"); |
| 663 | let web_socket_path = websocket_path_with_access_token(web_socket_path, access_token); |
| 664 | let web_socket_debugger_url = websocket_url(http_origin.unwrap_or(""), &web_socket_path); |
| 665 | let devtools_frontend_url = metro_devtools_frontend_url(port, entry, &web_socket_debugger_url); |
| 666 | let app_name = app_id.clone().or_else(|| Some(title.clone())); |
| 667 | |
| 668 | ChromeDevToolsTarget { |
| 669 | id, |
| 670 | title, |
| 671 | target_type: string_value(entry, "type").unwrap_or_else(|| "node".to_owned()), |
| 672 | url: app_id |
| 673 | .as_deref() |
| 674 | .map(|app_id| format!("metro://{app_id}/{udid}")) |
| 675 | .unwrap_or_else(|| format!("metro://{udid}/{metro_id}")), |
| 676 | description, |
| 677 | devtools_frontend_url, |
| 678 | web_socket_debugger_url, |
| 679 | source: SOURCE_REACT_NATIVE_METRO.to_owned(), |
| 680 | process_identifier: 0, |
| 681 | bundle_identifier: app_id, |
| 682 | app_name, |
| 683 | } |
| 684 | } |
| 685 | |
| 686 | fn metro_websocket_debugger_url(port: u16, entry: &Value) -> String { |
| 687 | chrome_inspector_websocket_debugger_url(port, entry) |