Skip to main content

dht_rpc/
periodic_job.rs

1use std::{pin::Pin, time::Duration};
2
3use futures::task::{Context, Poll};
4use wasm_timer::{Delay, Instant};
5
6#[derive(Debug)]
7pub struct PeriodicJob {
8    pub interval: Duration,
9    pub inner: Delay,
10}
11
12impl PeriodicJob {
13    pub fn new(interval: Duration) -> Self {
14        Self {
15            interval,
16            inner: Delay::new(interval),
17        }
18    }
19
20    pub fn poll_now(&mut self, cx: &mut Context<'_>) -> Poll<()> {
21        if let Poll::Ready(Ok(_)) = Delay::poll(Pin::new(&mut self.inner), cx) {
22            let deadline = Instant::now() + self.interval;
23            self.inner = Delay::new_at(deadline);
24            Poll::Ready(())
25        } else {
26            Poll::Pending
27        }
28    }
29
30    pub fn poll(&mut self, cx: &mut Context<'_>, now: Instant) -> Poll<()> {
31        if let Poll::Ready(Ok(_)) = Delay::poll(Pin::new(&mut self.inner), cx) {
32            let deadline = now + self.interval;
33            self.inner = Delay::new_at(deadline);
34            Poll::Ready(())
35        } else {
36            Poll::Pending
37        }
38    }
39}