cordon off the tokio runtime to the subsonic client
This commit is contained in:
parent
abd2331eb2
commit
9f97a2cae3
2 changed files with 24 additions and 13 deletions
|
@ -30,13 +30,6 @@ pub mod mpv;
|
|||
#[link(name = "soup-3.0")]
|
||||
extern "C" {}
|
||||
|
||||
pub fn runtime() -> &'static tokio::runtime::Runtime {
|
||||
static RUNTIME: std::sync::OnceLock<tokio::runtime::Runtime> = std::sync::OnceLock::new();
|
||||
RUNTIME.get_or_init(|| {
|
||||
tokio::runtime::Runtime::new().expect("could not initialize the tokio runtime")
|
||||
})
|
||||
}
|
||||
|
||||
fn main() -> glib::ExitCode {
|
||||
gio::resources_register_include!("audrey.gresource").expect("could not register resources");
|
||||
|
||||
|
@ -52,7 +45,7 @@ fn main() -> glib::ExitCode {
|
|||
let app = Application::new();
|
||||
|
||||
// smol test for the subsonic client
|
||||
runtime().spawn(async {
|
||||
glib::spawn_future_local(async {
|
||||
let keyring = oo7::Keyring::new().await.unwrap();
|
||||
let attributes = vec![("xdg:schema", APP_ID)];
|
||||
let items = keyring.search_items(&attributes).await.unwrap();
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
mod schema;
|
||||
|
||||
fn runtime() -> &'static tokio::runtime::Runtime {
|
||||
static RUNTIME: std::sync::OnceLock<tokio::runtime::Runtime> = std::sync::OnceLock::new();
|
||||
RUNTIME.get_or_init(|| {
|
||||
tokio::runtime::Runtime::new().expect("could not initialize the tokio runtime")
|
||||
})
|
||||
}
|
||||
|
||||
impl<T> schema::SubsonicResponse<T> {
|
||||
fn fixup(self) -> Result<T, Error> {
|
||||
match self {
|
||||
|
@ -100,11 +107,22 @@ impl Client {
|
|||
.unwrap_or_else(|_| unsafe { std::hint::unreachable_unchecked() })
|
||||
.extend(path);
|
||||
|
||||
self.client
|
||||
.get(url)
|
||||
.query(query)
|
||||
.send()
|
||||
.await?
|
||||
// FIXME: is an entire channel per request overkill? maybe pool them?
|
||||
let (sender, receiver) = async_channel::bounded(1);
|
||||
|
||||
let future = self.client.get(url).query(query).send();
|
||||
runtime().spawn(async move {
|
||||
let response = future.await;
|
||||
sender
|
||||
.send(response)
|
||||
.await
|
||||
.expect("could not send subsonic response back to the main loop");
|
||||
});
|
||||
|
||||
receiver
|
||||
.recv()
|
||||
.await
|
||||
.expect("could not receive subsonic response from tokio")?
|
||||
.error_for_status()?
|
||||
.json::<schema::SubsonicResponseOuter<T>>()
|
||||
.await?
|
||||
|
|
Loading…
Reference in a new issue