Skip to content

Instantly share code, notes, and snippets.

@thewh1teagle
Created February 27, 2024 15:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thewh1teagle/ee21492f435a9ba42d908152feb902ec to your computer and use it in GitHub Desktop.
Save thewh1teagle/ee21492f435a9ba42d908152feb902ec to your computer and use it in GitHub Desktop.
async fn eval_with_event(webview: Webview, event_name: &str, script: &str, timeout: Duration) -> anyhow::Result<Value> {
let (sender, receiver): (Sender<String>, Receiver<String>) = channel();
let id = webview.listen(event_name, move |event| {
let value = event.payload().to_string();
let result = sender.send(value);
if let Err(err) = result {
log::error!("failed to get result from callback {}", err);
}
});
let result = webview.eval(&script);
if let Err(err) = result {
log::error!("failed to eval {}", err);
}
log::debug!("waiting for eval result from webview");
let mut final_value: Value = serde_json::Value::Object(Default::default());
let start = Instant::now();
while start.elapsed() < timeout {
match receiver.try_recv() {
Ok(json_value) => {
let value: Result<Value, serde_json::Error> = serde_json::from_str(&json_value);
if let Ok(value) = value {
final_value = value;
}
break;
}
Err(TryRecvError::Empty) => {
// No HTML received yet, sleep for a bit before trying again
tokio::time::sleep(Duration::from_millis(100)).await;
}
Err(TryRecvError::Disconnected) => {
// The sender has disconnected, handle the error
log::error!("sender disconnected while waiting for eval result");
break;
}
}
}
// here wait for payload to receive and then unlisten
webview.unlisten(id);
Ok(final_value)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment