summaryrefslogtreecommitdiff
path: root/crates/teleia/src/net/fig.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/teleia/src/net/fig.rs')
-rw-r--r--crates/teleia/src/net/fig.rs73
1 files changed, 49 insertions, 24 deletions
diff --git a/crates/teleia/src/net/fig.rs b/crates/teleia/src/net/fig.rs
index 0d5e16d..d49e498 100644
--- a/crates/teleia/src/net/fig.rs
+++ b/crates/teleia/src/net/fig.rs
@@ -50,7 +50,6 @@ impl BinaryClient {
self.out_buf.write_u32::<byteorder::LE>(buf.len() as u32).wrap_err("failed to send message")?;
self.out_buf.write_all(buf).wrap_err("failed to send message")?;
Ok(())
-
}
pub fn publish(&mut self, ev: &[u8], data: &[u8]) -> Erm<()> {
write!(self.out_buf, "p").wrap_err("failed to send publish message to bus")?;
@@ -58,7 +57,7 @@ impl BinaryClient {
self.write_length_prefixed(data)?;
Ok(())
}
- fn pop_incoming_message(&mut self) -> Option<BinaryMessage> {
+ pub fn pop_incoming_message(&mut self) -> Option<BinaryMessage> {
let mut reader = std::io::Cursor::new(&self.in_buf);
let event_len = reader.read_u32::<byteorder::LE>().ok()?;
let mut event = vec![0; event_len as usize];
@@ -70,31 +69,57 @@ impl BinaryClient {
self.in_buf.drain(..len);
Some(BinaryMessage { event, data })
}
- pub fn pump(&mut self) -> Erm<Option<BinaryMessage>> {
- let mut events = polling::Events::new();
- events.clear();
- self.poller.wait(&mut events, Some(std::time::Duration::from_secs(0)))
- .wrap_err("failed to poll message bus")?;
+ fn try_read(&mut self) -> Erm<()> {
+ let mut buf = [0; 1024];
+ match self.socket.read(&mut buf) {
+ Ok(sz) => self.in_buf.extend_from_slice(&buf[..sz]),
+ Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
+ e => { e.wrap_err("failed to read from bus socket")?; },
+ }
+ Ok(())
+ }
+ fn try_write(&mut self) -> Erm<()> {
+ if !self.out_buf.is_empty() {
+ match self.socket.write(&self.out_buf) {
+ Ok(sz) => { self.out_buf.drain(..sz); },
+ Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
+ e => { e.wrap_err("failed to write to bus socket")?; },
+ }
+ }
+ Ok(())
+ }
+ fn resubscribe(&mut self) -> Erm<()> {
+ self.poller.modify(&self.socket, polling::Event::readable(KEY)).wrap_err("failed to update event to poll")?;
+ if !self.out_buf.is_empty() {
+ self.poller.modify(&self.socket, polling::Event::writable(KEY)).wrap_err("failed to update event to poll")?;
+ }
+ Ok(())
+ }
+ fn process_events(&mut self, events: &mut polling::Events) -> Erm<()> {
for ev in events.iter() {
if ev.key == KEY {
- if ev.readable {
- let mut buf = [0; 1024];
- match self.socket.read(&mut buf) {
- Ok(sz) => self.in_buf.extend_from_slice(&buf[..sz]),
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
- e => { e.wrap_err("failed to read from bus socket")?; },
- }
- }
- if ev.writable && !self.out_buf.is_empty() {
- match self.socket.write(&self.out_buf) {
- Ok(sz) => { self.out_buf.drain(..sz); },
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
- e => { e.wrap_err("failed to write to bus socket")?; },
- }
- }
- self.poller.modify(&self.socket, polling::Event::all(KEY)).wrap_err("failed to update event to poll")?;
+ if ev.readable { self.try_read()?; }
+ if ev.writable { self.try_write()?; }
}
}
- Ok(self.pop_incoming_message())
+ Ok(())
+ }
+ pub fn pump(&mut self) -> Erm<()> {
+ let mut events = polling::Events::new();
+ events.clear();
+ self.resubscribe()?;
+ self.poller.wait(&mut events, Some(std::time::Duration::from_secs(0)))
+ .wrap_err("failed to poll message bus")?;
+ self.process_events(&mut events)?;
+ Ok(())
+ }
+ pub fn wait(&mut self) -> Erm<()> {
+ let mut events = polling::Events::new();
+ events.clear();
+ self.resubscribe()?;
+ self.poller.wait(&mut events, None)
+ .wrap_err("failed to poll message bus")?;
+ self.process_events(&mut events)?;
+ Ok(())
}
}