(
state: AppState,
force_refresh: bool,
)
| 5499 | } |
| 5500 | |
| 5501 | async fn list_simulators_cached( |
| 5502 | state: AppState, |
| 5503 | force_refresh: bool, |
| 5504 | ) -> Result<Vec<crate::native::bridge::Simulator>, AppError> { |
| 5505 | { |
| 5506 | let guard = state.simulator_inventory.inner.lock().await; |
| 5507 | if !force_refresh { |
| 5508 | if let (Some(simulators), Some(updated_at)) = (&guard.simulators, guard.updated_at) { |
| 5509 | if updated_at.elapsed() <= SIMULATOR_INVENTORY_CACHE_TTL { |
| 5510 | return Ok(simulators.clone()); |
| 5511 | } |
| 5512 | } |
| 5513 | } |
| 5514 | } |
| 5515 | |
| 5516 | let inventory_timeout = if force_refresh { |
| 5517 | SIMULATOR_INVENTORY_FORCE_REFRESH_TIMEOUT |
| 5518 | } else { |
| 5519 | SIMULATOR_INVENTORY_TIMEOUT |
| 5520 | }; |
| 5521 | |
| 5522 | let simulators = match timeout( |
| 5523 | inventory_timeout, |
| 5524 | run_bridge_action(state.clone(), |bridge| bridge.list_simulators()), |
| 5525 | ) |
| 5526 | .await |
| 5527 | { |
| 5528 | Ok(result) => result?, |
| 5529 | Err(_) => { |
| 5530 | tracing::warn!( |
| 5531 | timeout_seconds = inventory_timeout.as_secs(), |
| 5532 | force_refresh, |
| 5533 | "Timed out listing iOS simulators; returning cached inventory." |
| 5534 | ); |
| 5535 | let guard = state.simulator_inventory.inner.lock().await; |
| 5536 | return Ok(guard.simulators.clone().unwrap_or_default()); |
| 5537 | } |
| 5538 | }; |
| 5539 | |
| 5540 | let mut guard = state.simulator_inventory.inner.lock().await; |
| 5541 | guard.simulators = Some(simulators.clone()); |
| 5542 | guard.updated_at = Some(Instant::now()); |
| 5543 | Ok(simulators) |
| 5544 | } |
| 5545 | |
| 5546 | async fn android_simulator_payload(state: AppState, udid: String) -> Result<Json<Value>, AppError> { |
| 5547 | let android_devices = |
no test coverage detected