mirror of
https://github.com/denoland/deno.git
synced 2025-03-09 13:49:37 -04:00
fix: --watch
was losing items (#14317)
This commit is contained in:
parent
c30d95f2e3
commit
3d1123f8b0
1 changed files with 19 additions and 9 deletions
|
@ -25,29 +25,39 @@ const CLEAR_SCREEN: &str = "\x1B[2J\x1B[1;1H";
|
||||||
const DEBOUNCE_INTERVAL: Duration = Duration::from_millis(200);
|
const DEBOUNCE_INTERVAL: Duration = Duration::from_millis(200);
|
||||||
|
|
||||||
struct DebouncedReceiver {
|
struct DebouncedReceiver {
|
||||||
|
// The `recv()` call could be used in a tokio `select!` macro,
|
||||||
|
// and so we store this state on the struct to ensure we don't
|
||||||
|
// lose items if a `recv()` never completes
|
||||||
|
received_items: HashSet<PathBuf>,
|
||||||
receiver: mpsc::UnboundedReceiver<Vec<PathBuf>>,
|
receiver: mpsc::UnboundedReceiver<Vec<PathBuf>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DebouncedReceiver {
|
impl DebouncedReceiver {
|
||||||
fn new_with_sender() -> (Arc<mpsc::UnboundedSender<Vec<PathBuf>>>, Self) {
|
fn new_with_sender() -> (Arc<mpsc::UnboundedSender<Vec<PathBuf>>>, Self) {
|
||||||
let (sender, receiver) = mpsc::unbounded_channel();
|
let (sender, receiver) = mpsc::unbounded_channel();
|
||||||
(Arc::new(sender), Self { receiver })
|
(
|
||||||
|
Arc::new(sender),
|
||||||
|
Self {
|
||||||
|
receiver,
|
||||||
|
received_items: HashSet::new(),
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn recv(&mut self) -> Option<Vec<PathBuf>> {
|
async fn recv(&mut self) -> Option<Vec<PathBuf>> {
|
||||||
let mut received_items = self
|
if self.received_items.is_empty() {
|
||||||
.receiver
|
self
|
||||||
.recv()
|
.received_items
|
||||||
.await?
|
.extend(self.receiver.recv().await?.into_iter());
|
||||||
.into_iter()
|
}
|
||||||
.collect::<HashSet<_>>(); // prevent duplicates
|
|
||||||
loop {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
items = self.receiver.recv() => {
|
items = self.receiver.recv() => {
|
||||||
received_items.extend(items?);
|
self.received_items.extend(items?);
|
||||||
}
|
}
|
||||||
_ = sleep(DEBOUNCE_INTERVAL) => {
|
_ = sleep(DEBOUNCE_INTERVAL) => {
|
||||||
return Some(received_items.into_iter().collect());
|
return Some(self.received_items.drain().collect());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue