Skip to content

Commit d321d32

Browse files
author
substack
committed
working end to end finally
1 parent 4b55006 commit d321d32

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/store.rs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::collections::{HashMap,BTreeMap};
55
use async_std::{
66
prelude::*,
77
stream::Stream,stream,channel,sync::{Arc,RwLock,Mutex},
8-
task,task::{Context,Poll},pin::Pin,
8+
task,task::{Waker,Context,Poll},pin::Pin,
99
};
1010
use desert::ToBytes;
1111
pub type Keypair = ([u8;32],[u8;64]);
@@ -20,6 +20,7 @@ struct LiveStream {
2020
sender: channel::Sender<Post>,
2121
receiver: channel::Receiver<Post>,
2222
live_streams: Arc<RwLock<Vec<Self>>>,
23+
waker: Arc<Mutex<Option<Waker>>>,
2324
}
2425

2526
impl LiveStream {
@@ -29,13 +30,14 @@ impl LiveStream {
2930
live_streams: Arc<RwLock<Vec<Self>>>,
3031
) -> Self {
3132
let (sender,receiver) = channel::bounded(options.limit);
32-
Self { id, options, sender, receiver, live_streams }
33+
Self { id, options, sender, receiver, live_streams, waker: Arc::new(Mutex::new(None)) }
3334
}
34-
pub fn send(&self, post: Post) {
35+
pub async fn send(&mut self, post: Post) {
3536
if let Err(_) = self.sender.try_send(post) {}
37+
if let Some(waker) = self.waker.lock().await.as_ref() {
38+
waker.wake_by_ref();
39+
}
3640
}
37-
}
38-
impl LiveStream {
3941
pub fn matches(&self, post: &Post) -> bool {
4042
if Some(&self.options.channel) != post.get_channel() { return false }
4143
match (self.options.time_start, self.options.time_end) {
@@ -50,10 +52,28 @@ impl LiveStream {
5052
impl Stream for LiveStream {
5153
type Item = Result<Post,Error>;
5254
fn poll_next(self: Pin<&mut Self>, ctx: &mut Context) -> Poll<Option<Self::Item>> {
53-
let r = futures::ready![Pin::new(&mut self.receiver.recv()).poll(ctx)].unwrap();
54-
Poll::Ready(Some(Ok(r)))
55+
let r = Pin::new(&mut self.receiver.recv()).poll(ctx);
56+
match r {
57+
Poll::Ready(Ok(x)) => {
58+
let m_waker = self.waker.clone();
59+
task::block_on(async move { *m_waker.lock().await = None; });
60+
Poll::Ready(Some(Ok(x)))
61+
},
62+
Poll::Ready(Err(x)) => {
63+
let m_waker = self.waker.clone();
64+
task::block_on(async move { *m_waker.lock().await = None; });
65+
Poll::Ready(Some(Err(x.into())))
66+
},
67+
Poll::Pending => {
68+
let m_waker = self.waker.clone();
69+
let waker = ctx.waker().clone();
70+
task::block_on(async move { *m_waker.lock().await = Some(waker); });
71+
Poll::Pending
72+
},
73+
}
5574
}
5675
}
76+
5777
impl Drop for LiveStream {
5878
fn drop(&mut self) {
5979
let live_streams = self.live_streams.clone();
@@ -170,9 +190,9 @@ impl Store for MemoryStore {
170190
}
171191
}
172192
if let Some(senders) = self.live_streams.read().await.get(channel) {
173-
for stream in senders.read().await.iter() {
193+
for stream in senders.write().await.iter_mut() {
174194
if stream.matches(&post) {
175-
stream.send(post.clone());
195+
stream.send(post.clone()).await;
176196
}
177197
}
178198
}

0 commit comments

Comments
 (0)