0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 20:25:12 -05:00

fix: --watch was losing items (#14317)

This commit is contained in:
David Sherret 2022-04-19 10:12:30 -04:00 committed by GitHub
parent c30d95f2e3
commit 3d1123f8b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -25,29 +25,39 @@ const CLEAR_SCREEN: &str = "\x1B[2J\x1B[1;1H";
const DEBOUNCE_INTERVAL: Duration = Duration::from_millis(200);
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>>,
}
impl DebouncedReceiver {
fn new_with_sender() -> (Arc<mpsc::UnboundedSender<Vec<PathBuf>>>, Self) {
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>> {
let mut received_items = self
.receiver
.recv()
.await?
.into_iter()
.collect::<HashSet<_>>(); // prevent duplicates
if self.received_items.is_empty() {
self
.received_items
.extend(self.receiver.recv().await?.into_iter());
}
loop {
tokio::select! {
items = self.receiver.recv() => {
received_items.extend(items?);
self.received_items.extend(items?);
}
_ = sleep(DEBOUNCE_INTERVAL) => {
return Some(received_items.into_iter().collect());
return Some(self.received_items.drain().collect());
}
}
}