refactor: Replace postage with flume
This commit is contained in:
parent
805bf6333e
commit
e578f2d19c
11 changed files with 192 additions and 112 deletions
162
Cargo.lock
generated
162
Cargo.lock
generated
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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::<Event>(8);
|
||||
let (event_tx, event_rx) = flume::bounded::<Event>(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<Event>>(())
|
||||
Ok::<(), flume::SendError<Event>>(())
|
||||
};
|
||||
|
||||
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<Cell<bool>>,
|
||||
pub interrupt_rx: mpsc::Receiver<()>,
|
||||
pub interrupt_rx: flume::Receiver<()>,
|
||||
pub out: smol::Unblock<io::Stdout>,
|
||||
pub search_results: Vec<PathBuf>,
|
||||
}
|
||||
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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<String> {
|
||||
let (mut tx, rx) = postage::mpsc::channel(4);
|
||||
fn pactl_sinks() -> flume::Receiver<String> {
|
||||
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<String> {
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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::<ScriptInfo>(8);
|
||||
let (tx, rx) = flume::bounded::<ScriptInfo>(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<PathBuf>, tx: Sender<ScriptInfo>) {
|
||||
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<PathBuf>, tx: Sender<Script
|
|||
}
|
||||
}
|
||||
|
||||
let _ = tx.send(info).await;
|
||||
let _ = tx.send_async(info).await;
|
||||
})
|
||||
.detach();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,8 +197,7 @@ async fn fetch_favicon(url: &str, favicon_path: &Path, client: &HttpClient) -> O
|
|||
let content_type = response
|
||||
.headers()
|
||||
.get(CONTENT_TYPE)
|
||||
.map(|header| header.to_str().ok())
|
||||
.flatten()
|
||||
.and_then(|header| header.to_str().ok())
|
||||
.unwrap();
|
||||
|
||||
if !ALLOWED_FAVICON_MIME.contains(&content_type) {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ futures-lite = "1.12.0"
|
|||
gen-z = "0.1.0"
|
||||
num_cpus = "1.13.1"
|
||||
pop-launcher = { path = "../" }
|
||||
postage = { version = "0.4.1", features = ["futures-traits"] }
|
||||
regex = "1.5.4"
|
||||
ron = "0.7.0"
|
||||
serde = { version = "1.0.136", features = ["derive"] }
|
||||
|
|
@ -29,3 +28,4 @@ tracing = "0.1.31"
|
|||
tracing-subscriber = { version = "0.3.9", features = ["fmt"] }
|
||||
futures-core = "0.3.21"
|
||||
async-process = "1.3.0"
|
||||
flume = "0.10.12"
|
||||
|
|
|
|||
|
|
@ -7,11 +7,11 @@ mod plugins;
|
|||
pub use client::*;
|
||||
|
||||
use crate::plugins::*;
|
||||
use flume::{Receiver, Sender};
|
||||
use futures::SinkExt;
|
||||
use futures_core::Stream;
|
||||
use futures_lite::{future, StreamExt};
|
||||
use pop_launcher::*;
|
||||
use postage::mpsc;
|
||||
use regex::Regex;
|
||||
use slab::Slab;
|
||||
use std::{
|
||||
|
|
@ -44,17 +44,17 @@ pub async fn main() {
|
|||
}
|
||||
});
|
||||
|
||||
let (output_tx, mut output_rx) = mpsc::channel(16);
|
||||
let (output_tx, output_rx) = flume::bounded(16);
|
||||
|
||||
// Service will operate for as long as it is being awaited
|
||||
let service = Service::new(output_tx).exec(input_stream);
|
||||
let service = Service::new(output_tx.into_sink()).exec(input_stream);
|
||||
|
||||
// Responses from the service will be streamed to stdout
|
||||
let responder = async move {
|
||||
let stdout = io::stdout();
|
||||
let stdout = &mut stdout.lock();
|
||||
|
||||
while let Some(response) = output_rx.next().await {
|
||||
while let Ok(response) = output_rx.recv_async().await {
|
||||
serialize_out(stdout, &response);
|
||||
}
|
||||
};
|
||||
|
|
@ -88,7 +88,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
}
|
||||
|
||||
pub async fn exec(mut self, input: impl Stream<Item = Request>) {
|
||||
let (service_tx, service_rx) = mpsc::channel(1);
|
||||
let (service_tx, service_rx) = flume::bounded(1);
|
||||
let stream = plugins::external::load::from_paths();
|
||||
|
||||
futures_lite::pin!(stream);
|
||||
|
|
@ -124,8 +124,8 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
future::or(f1, f2).await;
|
||||
}
|
||||
|
||||
async fn response_handler(&mut self, mut service_rx: mpsc::Receiver<Event>) {
|
||||
while let Some(event) = service_rx.next().await {
|
||||
async fn response_handler(&mut self, service_rx: Receiver<Event>) {
|
||||
while let Ok(event) = service_rx.recv_async().await {
|
||||
match event {
|
||||
Event::Request(request) => {
|
||||
match request {
|
||||
|
|
@ -144,7 +144,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
Request::Exit => {
|
||||
for (_key, plugin) in self.plugins.iter_mut() {
|
||||
let tx = plugin.sender_exec();
|
||||
let _ = tx.send(Request::Exit).await;
|
||||
let _ = tx.send_async(Request::Exit).await;
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
@ -199,12 +199,9 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
}
|
||||
}
|
||||
|
||||
fn register_plugin<
|
||||
P: Plugin,
|
||||
I: Fn(usize, mpsc::Sender<Event>) -> P + Send + Sync + 'static,
|
||||
>(
|
||||
fn register_plugin<P: Plugin, I: Fn(usize, Sender<Event>) -> P + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
service_tx: mpsc::Sender<Event>,
|
||||
service_tx: Sender<Event>,
|
||||
config: PluginConfig,
|
||||
regex: Option<regex::Regex>,
|
||||
init: I,
|
||||
|
|
@ -225,7 +222,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
regex,
|
||||
isolate_with,
|
||||
Box::new(move || {
|
||||
let (request_tx, request_rx) = mpsc::channel(8);
|
||||
let (request_tx, request_rx) = flume::bounded(8);
|
||||
|
||||
let init = init.clone();
|
||||
let service_tx = service_tx.clone();
|
||||
|
|
@ -241,7 +238,10 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
|
||||
async fn activate(&mut self, id: Indice) {
|
||||
if let Some((plugin, meta)) = self.search_result(id as usize) {
|
||||
let _ = plugin.sender_exec().send(Request::Activate(meta.id)).await;
|
||||
let _ = plugin
|
||||
.sender_exec()
|
||||
.send_async(Request::Activate(meta.id))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -249,7 +249,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
if let Some((plugin, meta)) = self.search_result(id as usize) {
|
||||
let _ = plugin
|
||||
.sender_exec()
|
||||
.send(Request::ActivateContext {
|
||||
.send_async(Request::ActivateContext {
|
||||
id: meta.id,
|
||||
context,
|
||||
})
|
||||
|
|
@ -278,13 +278,19 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
|
||||
async fn complete(&mut self, id: Indice) {
|
||||
if let Some((plugin, meta)) = self.search_result(id as usize) {
|
||||
let _ = plugin.sender_exec().send(Request::Complete(meta.id)).await;
|
||||
let _ = plugin
|
||||
.sender_exec()
|
||||
.send_async(Request::Complete(meta.id))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn context(&mut self, id: Indice) {
|
||||
if let Some((plugin, meta)) = self.search_result(id as usize) {
|
||||
let _ = plugin.sender_exec().send(Request::Context(meta.id)).await;
|
||||
let _ = plugin
|
||||
.sender_exec()
|
||||
.send_async(Request::Context(meta.id))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -311,14 +317,17 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
async fn interrupt(&mut self) {
|
||||
for (_, plugin) in self.plugins.iter_mut() {
|
||||
if let Some(sender) = plugin.sender.as_mut() {
|
||||
let _ = sender.send(Request::Interrupt).await;
|
||||
let _ = sender.send_async(Request::Interrupt).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn quit(&mut self, id: Indice) {
|
||||
if let Some((plugin, meta)) = self.search_result(id as usize) {
|
||||
let _ = plugin.sender_exec().send(Request::Quit(meta.id)).await;
|
||||
let _ = plugin
|
||||
.sender_exec()
|
||||
.send_async(Request::Quit(meta.id))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -383,7 +392,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
if let Some(plugin) = self.plugins.get_mut(isolated) {
|
||||
if plugin
|
||||
.sender_exec()
|
||||
.send(Request::Search(query.to_owned()))
|
||||
.send_async(Request::Search(query.to_owned()))
|
||||
.await
|
||||
.is_ok()
|
||||
{
|
||||
|
|
@ -396,7 +405,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
if let Some(plugin) = self.plugins.get_mut(plugin_id) {
|
||||
if plugin
|
||||
.sender_exec()
|
||||
.send(Request::Search(query.to_owned()))
|
||||
.send_async(Request::Search(query.to_owned()))
|
||||
.await
|
||||
.is_ok()
|
||||
{
|
||||
|
|
@ -562,7 +571,7 @@ impl<O: futures::Sink<Response> + Unpin> Service<O> {
|
|||
}
|
||||
|
||||
/// Handles Requests received from a frontend
|
||||
async fn request_handler(input: impl Stream<Item = Request>, mut tx: mpsc::Sender<Event>) {
|
||||
async fn request_handler(input: impl Stream<Item = Request>, tx: Sender<Event>) {
|
||||
let mut requested_to_exit = false;
|
||||
|
||||
futures_lite::pin!(input);
|
||||
|
|
@ -572,7 +581,7 @@ async fn request_handler(input: impl Stream<Item = Request>, mut tx: mpsc::Sende
|
|||
requested_to_exit = true
|
||||
}
|
||||
|
||||
let _ = tx.send(Event::Request(request)).await;
|
||||
let _ = tx.send_async(Event::Request(request)).await;
|
||||
|
||||
if requested_to_exit {
|
||||
break;
|
||||
|
|
|
|||
13
service/src/plugins/external/mod.rs
vendored
13
service/src/plugins/external/mod.rs
vendored
|
|
@ -14,9 +14,8 @@ use std::{
|
|||
|
||||
use crate::{Event, Indice, Plugin, PluginResponse, Request};
|
||||
use async_oneshot::oneshot;
|
||||
use flume::Sender;
|
||||
use futures_lite::{AsyncWriteExt, FutureExt, StreamExt};
|
||||
use postage::mpsc::Sender;
|
||||
use postage::prelude::*;
|
||||
use smol::{
|
||||
process::{Child, Command, Stdio},
|
||||
Task,
|
||||
|
|
@ -70,13 +69,13 @@ impl ExternalPlugin {
|
|||
let detached = self.detached.clone();
|
||||
let searching = self.searching.clone();
|
||||
let (trip_tx, trip_rx) = oneshot::<()>();
|
||||
let mut tx = self.tx.clone();
|
||||
let tx = self.tx.clone();
|
||||
let name = self.name().to_owned();
|
||||
let id = self.id;
|
||||
|
||||
// Spawn a background task to forward JSON responses from the child process.
|
||||
let task = smol::spawn(async move {
|
||||
let mut tx_ = tx.clone();
|
||||
let tx_ = tx.clone();
|
||||
let searching_ = searching.clone();
|
||||
let name_ = name.clone();
|
||||
|
||||
|
|
@ -91,7 +90,7 @@ impl ExternalPlugin {
|
|||
searching_.store(false, Ordering::SeqCst);
|
||||
}
|
||||
|
||||
let _ = tx_.send(Event::Response((id, response))).await;
|
||||
let _ = tx_.send_async(Event::Response((id, response))).await;
|
||||
}
|
||||
Err(why) => {
|
||||
tracing::error!("{}: serde error: {:?}", name_, why);
|
||||
|
|
@ -111,7 +110,7 @@ impl ExternalPlugin {
|
|||
// Ensure that a task that was searching sends a finished signal if it dies.
|
||||
if searching.swap(false, Ordering::SeqCst) {
|
||||
let _ = tx
|
||||
.send(Event::Response((id, PluginResponse::Finished)))
|
||||
.send_async(Event::Response((id, PluginResponse::Finished)))
|
||||
.await;
|
||||
}
|
||||
|
||||
|
|
@ -207,7 +206,7 @@ impl Plugin for ExternalPlugin {
|
|||
} else {
|
||||
let _ = self
|
||||
.tx
|
||||
.send(Event::Response((self.id, PluginResponse::Finished)))
|
||||
.send_async(Event::Response((self.id, PluginResponse::Finished)))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
use crate::*;
|
||||
use flume::Sender;
|
||||
use pop_launcher::*;
|
||||
use postage::mpsc::Sender;
|
||||
use slab::Slab;
|
||||
use std::borrow::Cow;
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ impl HelpPlugin {
|
|||
|
||||
async fn reload(&mut self) {
|
||||
let (tx, rx) = async_oneshot::oneshot();
|
||||
let _ = self.tx.send(Event::Help(tx)).await;
|
||||
let _ = self.tx.send_async(Event::Help(tx)).await;
|
||||
self.details = rx.await.expect("internal error fetching help info");
|
||||
}
|
||||
}
|
||||
|
|
@ -53,7 +53,7 @@ impl Plugin for HelpPlugin {
|
|||
if let Some(help) = detail.help.as_ref() {
|
||||
let _ = self
|
||||
.tx
|
||||
.send(Event::Response((
|
||||
.send_async(Event::Response((
|
||||
self.id,
|
||||
PluginResponse::Fill(help.clone()),
|
||||
)))
|
||||
|
|
@ -91,13 +91,16 @@ impl Plugin for HelpPlugin {
|
|||
..Default::default()
|
||||
});
|
||||
|
||||
let _ = self.tx.send(Event::Response((self.id, response))).await;
|
||||
let _ = self
|
||||
.tx
|
||||
.send_async(Event::Response((self.id, response)))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
let _ = self
|
||||
.tx
|
||||
.send(Event::Response((self.id, PluginResponse::Finished)))
|
||||
.send_async(Event::Response((self.id, PluginResponse::Finished)))
|
||||
.await;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,7 @@ pub use self::help::HelpPlugin;
|
|||
|
||||
use crate::{Indice, PluginHelp, Request};
|
||||
use async_trait::async_trait;
|
||||
use postage::mpsc::{Receiver, Sender};
|
||||
use postage::prelude::*;
|
||||
use flume::{Receiver, Sender};
|
||||
use regex::Regex;
|
||||
|
||||
#[async_trait]
|
||||
|
|
@ -39,8 +38,8 @@ where
|
|||
|
||||
async fn quit(&mut self, id: Indice);
|
||||
|
||||
async fn run(&mut self, mut rx: Receiver<Request>) {
|
||||
while let Some(request) = rx.recv().await {
|
||||
async fn run(&mut self, rx: Receiver<Request>) {
|
||||
while let Ok(request) = rx.recv_async().await {
|
||||
tracing::event!(
|
||||
tracing::Level::DEBUG,
|
||||
"{}: received {:?}",
|
||||
|
|
@ -130,7 +129,7 @@ impl PluginConnector {
|
|||
..
|
||||
} = self;
|
||||
|
||||
sender.get_or_insert_with(|| init())
|
||||
sender.get_or_insert_with(init)
|
||||
}
|
||||
|
||||
/// Drops the sender, which will subsequently drop the plugin forwarder attached to it
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue