implement a query engine for liveview

This commit is contained in:
Evan Almloff committed 2023-03-23 16:52:29 -05:00
1 parent fa9f0d0f6c
commit 8243dfe00d
7 files changed
+323 -16

No files matched your search

+5
View File
@@ -7,11 +7,13 @@ use thiserror::Error;
use tokio::sync::broadcast::error::RecvError;
use wry::webview::WebView;
/// Tracks what query ids are currently active
#[derive(Default, Clone)]
struct SharedSlab {
slab: Rc<RefCell<Slab<()>>>,
}
/// Handles sending and receiving arbitrary queries from the webview. Queries can be resolved non-sequentially, so we use ids to track them.
#[derive(Clone)]
pub(crate) struct QueryEngine {
sender: Rc<tokio::sync::broadcast::Sender<QueryResult>>,
@@ -29,6 +31,7 @@ impl Default for QueryEngine {
}
impl QueryEngine {
/// Creates a new query and returns a handle to it. The query will be resolved when the webview returns a result with the same id.
pub fn new_query<V: DeserializeOwned>(&self, script: &str, webview: &WebView) -> Query<V> {
let request_id = self.active_requests.slab.borrow_mut().insert(());
@@ -56,6 +59,7 @@ impl QueryEngine {
}
}
/// Send a query result
pub fn send(&self, data: QueryResult) {
let _ = self.sender.send(data);
}
@@ -69,6 +73,7 @@ pub(crate) struct Query<V: DeserializeOwned> {
}
impl<V: DeserializeOwned> Query<V> {
/// Resolve the query
pub async fn resolve(mut self) -> Result<V, QueryError> {
let result = loop {
match self.reciever.recv().await {