diff --git a/Cargo.lock b/Cargo.lock index 4f48bb3..a557fef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,15 +200,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "atomic" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" -dependencies = [ - "autocfg", -] - [[package]] name = "atomic-waker" version = "1.0.0" @@ -253,6 +244,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + [[package]] name = "byteorder" version = "1.4.3" @@ -357,16 +354,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.7" @@ -544,6 +531,19 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "flume" +version = "0.10.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843c03199d0c0ca54bc1ea90ac0d507274c28abcc4f691ae8b4eaa375087c76a" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project 1.0.10", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -782,8 +782,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1050,6 +1052,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1097,6 +1108,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.14" @@ -1151,6 +1171,15 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + [[package]] name = "new_mime_guess" version = "4.0.1" @@ -1371,12 +1400,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - [[package]] name = "pop-launcher" version = "1.1.1" @@ -1406,6 +1429,7 @@ version = "1.1.1" dependencies = [ "anyhow", "async-pidfd", + "flume", "fork", "freedesktop-desktop-entry", "futures-lite", @@ -1415,7 +1439,6 @@ dependencies = [ "isahc", "new_mime_guess", "pop-launcher", - "postage", "regex", "ron", "serde", @@ -1442,6 +1465,7 @@ dependencies = [ "async-oneshot", "async-process", "async-trait", + "flume", "futures", "futures-core", "futures-lite", @@ -1449,7 +1473,6 @@ dependencies = [ "gen-z", "num_cpus", "pop-launcher", - "postage", "regex", "ron", "serde", @@ -1463,22 +1486,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "postage" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a63d25391d04a097954b76aba742b6b5b74f213dfe3dbaeeb36e8ddc1c657f0b" -dependencies = [ - "atomic", - "crossbeam-queue", - "futures", - "log", - "pin-project 1.0.10", - "pollster", - "static_assertions", - "thiserror", -] - [[package]] name = "ppv-lite86" version = "0.2.16" @@ -1654,6 +1661,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "semver" version = "0.11.0" @@ -1831,6 +1844,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" +dependencies = [ + "lock_api", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2104,6 +2126,60 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasm-bindgen" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + [[package]] name = "wepoll-ffi" version = "0.1.2" diff --git a/plugins/Cargo.toml b/plugins/Cargo.toml index d06b705..7a423cd 100644 --- a/plugins/Cargo.toml +++ b/plugins/Cargo.toml @@ -16,7 +16,6 @@ human_format = "1.0.3" human-sort = "0.2.2" new_mime_guess = "4.0.1" pop-launcher = { path = "../" } -postage = { version = "0.4.1", features = ["futures-traits"] } regex = "1.5.5" ron = "0.7.0" serde = "1.0.136" @@ -34,3 +33,4 @@ isahc = "1.7.0" url = "2.2.2" sysfs-class = "0.1.3" anyhow = "1.0.56" +flume = "0.10.12" diff --git a/plugins/src/find/mod.rs b/plugins/src/find/mod.rs index eb8351b..5ed4f9a 100644 --- a/plugins/src/find/mod.rs +++ b/plugins/src/find/mod.rs @@ -3,8 +3,6 @@ use futures_lite::*; use pop_launcher::*; -use postage::mpsc; -use postage::prelude::{Sink, Stream}; use smol::process::{Child, ChildStdout, Command, Stdio}; use std::cell::Cell; use std::io; @@ -17,10 +15,10 @@ enum Event { } pub async fn main() { - let (mut event_tx, mut event_rx) = mpsc::channel::(8); + let (event_tx, event_rx) = flume::bounded::(8); // Channel for cancelling searches that are in progress. - let (interrupt_tx, interrupt_rx) = mpsc::channel::<()>(1); + let (interrupt_tx, interrupt_rx) = flume::bounded::<()>(1); // Indicates if a search is being performed in the background. let active = Rc::new(Cell::new(false)); @@ -34,7 +32,7 @@ pub async fn main() { // Manages the external process, tracks search results, and executes activate requests let search_handler = async move { - while let Some(search) = event_rx.recv().await { + while let Ok(search) = event_rx.recv_async().await { match search { Event::Activate(id) => { if let Some(selection) = app.search_results.get(id as usize) { @@ -62,7 +60,7 @@ pub async fn main() { let request_handler = async move { let interrupt = || { let active = active.clone(); - let mut tx = interrupt_tx.clone(); + let tx = interrupt_tx.clone(); async move { if active.get() { tracing::debug!("sending interrupt"); @@ -78,7 +76,7 @@ pub async fn main() { Ok(request) => match request { // Launch the default application with the selected file Request::Activate(id) => { - event_tx.send(Event::Activate(id)).await?; + event_tx.send_async(Event::Activate(id)).await?; } // Interrupt any active searches being performed @@ -93,7 +91,7 @@ pub async fn main() { None => &query, }; - event_tx.send(Event::Search(query.to_owned())).await?; + event_tx.send_async(Event::Search(query.to_owned())).await?; active.set(true); } @@ -106,7 +104,7 @@ pub async fn main() { } } - Ok::<(), postage::sink::SendError>(()) + Ok::<(), flume::SendError>(()) }; let _ = future::zip(request_handler, search_handler).await; @@ -115,7 +113,7 @@ pub async fn main() { /// Maintains state for search requests struct SearchContext { pub active: Rc>, - pub interrupt_rx: mpsc::Receiver<()>, + pub interrupt_rx: flume::Receiver<()>, pub out: smol::Unblock, pub search_results: Vec, } @@ -177,7 +175,7 @@ impl SearchContext { 'stream: loop { let interrupt = async { - let _ = self.interrupt_rx.recv().await; + let _ = self.interrupt_rx.recv_async().await; None }; diff --git a/plugins/src/pulse/mod.rs b/plugins/src/pulse/mod.rs index fb3fe3d..732cf3f 100644 --- a/plugins/src/pulse/mod.rs +++ b/plugins/src/pulse/mod.rs @@ -74,10 +74,9 @@ impl App { let mut handles = Vec::new(); - let mut sinks = pactl_sinks(); + let sinks = pactl_sinks(); - use postage::prelude::Stream; - while let Some(id) = sinks.recv().await { + while let Ok(id) = sinks.recv_async().await { handles.push(smol::spawn(async move { let args = &[arg1, id.as_str(), arg2]; let _ = command_spawn(cmd, args).await; @@ -134,8 +133,8 @@ async fn command_spawn(cmd: &str, args: &[&str]) -> io::Result<()> { Ok(()) } -fn pactl_sinks() -> postage::mpsc::Receiver { - let (mut tx, rx) = postage::mpsc::channel(4); +fn pactl_sinks() -> flume::Receiver { + let (tx, rx) = flume::bounded(4); smol::spawn(async move { let child = smol::process::Command::new("pactl") @@ -149,8 +148,7 @@ fn pactl_sinks() -> postage::mpsc::Receiver { let mut lines = futures_lite::io::BufReader::new(stdout).lines(); while let Some(Ok(line)) = lines.next().await { if let Some(stripped) = line.strip_prefix("Sink #") { - use postage::prelude::Sink; - let _ = tx.send(stripped.trim().to_owned()).await; + let _ = tx.send_async(stripped.trim().to_owned()).await; } } } diff --git a/plugins/src/scripts/mod.rs b/plugins/src/scripts/mod.rs index 7cf509a..67a9d73 100644 --- a/plugins/src/scripts/mod.rs +++ b/plugins/src/scripts/mod.rs @@ -4,9 +4,8 @@ use crate::*; use pop_launcher::*; +use flume::Sender; use futures_lite::{AsyncBufReadExt, StreamExt}; -use postage::mpsc::Sender; -use postage::prelude::*; use smol::process::{Command, Stdio}; use std::collections::VecDeque; use std::{ @@ -69,7 +68,7 @@ impl App { } async fn reload(&mut self) { - let (tx, mut rx) = postage::mpsc::channel::(8); + let (tx, rx) = flume::bounded::(8); let mut queue = VecDeque::new(); @@ -88,7 +87,7 @@ impl App { }; let script_receiver = async { - 'outer: while let Some(script) = rx.recv().await { + 'outer: while let Ok(script) = rx.recv_async().await { tracing::debug!("appending script: {:?}", script); for cached_script in &self.scripts { if cached_script.name == script.name { @@ -149,7 +148,7 @@ struct ScriptInfo { async fn load_from(path: &Path, paths: &mut VecDeque, tx: Sender) { if let Ok(directory) = path.read_dir() { for entry in directory.filter_map(Result::ok) { - let mut tx = tx.clone(); + let tx = tx.clone(); let path = entry.path(); if path.is_dir() { @@ -200,7 +199,7 @@ async fn load_from(path: &Path, paths: &mut VecDeque, tx: Sender