use crate::Error;
use std::{
net::{SocketAddr, UdpSocket},
task::Waker,
};
pub(crate) trait WakerExt {
fn chain(&self, f: impl Fn(&Waker) + Send + Sync + 'static) -> Waker;
}
impl WakerExt for Waker {
fn chain(&self, f: impl Fn(&Waker) + Send + Sync + 'static) -> Waker {
let inner = self.clone();
waker_fn::waker_fn(move || (f)(&inner))
}
}
pub(crate) struct UdpWaker {
socket: UdpSocket,
}
impl UdpWaker {
pub(crate) fn connect(addr: SocketAddr) -> Result<Self, Error> {
let socket = UdpSocket::bind("127.0.0.1:0")?;
socket.connect(addr)?;
Ok(Self { socket })
}
}
impl From<UdpWaker> for Waker {
fn from(waker: UdpWaker) -> Self {
waker_fn::waker_fn(move || {
if let Err(e) = waker.socket.send(&[1]) {
tracing::debug!("agent waker produced an error: {}", e);
}
})
}
}