mirror of https://github.com/apibillme/broker
gah
This commit is contained in:
parent
f16d750fb9
commit
2f78de9dd0
108
src/main.rs
108
src/main.rs
|
@ -9,7 +9,7 @@ use jsonwebtoken::{encode, decode, Header, Validation};
|
|||
use broker_tokio::sync::mpsc::channel;
|
||||
use std::convert::Infallible;
|
||||
use std::time::Duration;
|
||||
use futures::StreamExt;
|
||||
use futures::stream::{StreamExt};
|
||||
use std::sync::{Mutex, Arc, RwLock};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
@ -288,76 +288,48 @@ async fn main() {
|
|||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
let sse = portal::path("events").and(portal::get()).map(move || {
|
||||
|
||||
let (mut tx, rx) = channel(100);
|
||||
let tree_clone = tree_clone3.lock().unwrap().clone();
|
||||
let tree_clone2 = tree_clone.clone();
|
||||
let mut txx = tx.clone();
|
||||
|
||||
let _ = tokio::spawn(async move {
|
||||
let vals: HashMap<String, String> = tree_clone2.iter().into_iter().filter(|x| {
|
||||
loop {
|
||||
let vals : HashMap<String, Event> = tree_clone.iter().into_iter().filter(|x| {
|
||||
let p = x.as_ref().unwrap();
|
||||
let k = std::str::from_utf8(&p.0).unwrap().to_owned();
|
||||
if !k.contains("_v_") && !k.contains("_u_") {
|
||||
let v = std::str::from_utf8(&p.1).unwrap().to_owned();
|
||||
if k.contains("_v_") {
|
||||
let json : Event = serde_json::from_str(&v).unwrap();
|
||||
let now = Utc::now().timestamp();
|
||||
if json.timestamp <= now && !json.published && !json.cancelled {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}).map(|x| {
|
||||
let p = x.as_ref().unwrap();
|
||||
let k = std::str::from_utf8(&p.0).unwrap().to_owned();
|
||||
let v = std::str::from_utf8(&p.1).unwrap().to_owned();
|
||||
let json : Event = serde_json::from_str(&v).unwrap();
|
||||
let data : String = serde_json::to_string(&json.data).unwrap();
|
||||
(json.event, data)
|
||||
let json_cloned = json.clone();
|
||||
(k, json_cloned)
|
||||
}).collect();
|
||||
|
||||
for (k, v) in vals {
|
||||
let old_json = v.clone();
|
||||
let old_json_clone = old_json.clone();
|
||||
let mut new_json = v.clone();
|
||||
new_json.published = true;
|
||||
let newer_json = new_json.clone();
|
||||
|
||||
let guid = Uuid::new_v4().to_string();
|
||||
let sse = SSE{id: guid, event: k, data: v, retry: Duration::from_millis(5000)};
|
||||
let _ = txx.send(sse).await;
|
||||
}
|
||||
});
|
||||
|
||||
// let _ = tokio::spawn(async move {
|
||||
// loop {
|
||||
// let vals : HashMap<String, Event> = tree_clone.iter().into_iter().filter(|x| {
|
||||
// let p = x.as_ref().unwrap();
|
||||
// let k = std::str::from_utf8(&p.0).unwrap().to_owned();
|
||||
// let v = std::str::from_utf8(&p.1).unwrap().to_owned();
|
||||
// if k.contains("_v_") {
|
||||
// let json : Event = serde_json::from_str(&v).unwrap();
|
||||
// let now = Utc::now().timestamp();
|
||||
// if json.timestamp <= now && !json.published && !json.cancelled {
|
||||
// return true
|
||||
// } else {
|
||||
// return false
|
||||
// }
|
||||
// } else {
|
||||
// return false
|
||||
// }
|
||||
// }).map(|x| {
|
||||
// let p = x.as_ref().unwrap();
|
||||
// let k = std::str::from_utf8(&p.0).unwrap().to_owned();
|
||||
// let v = std::str::from_utf8(&p.1).unwrap().to_owned();
|
||||
// let json : Event = serde_json::from_str(&v).unwrap();
|
||||
// let json_cloned = json.clone();
|
||||
// (k, json_cloned)
|
||||
// }).collect();
|
||||
|
||||
// for (k, v) in vals {
|
||||
// let old_json = v.clone();
|
||||
// let old_json_clone = old_json.clone();
|
||||
// let mut new_json = v.clone();
|
||||
// new_json.published = true;
|
||||
// let newer_json = new_json.clone();
|
||||
|
||||
// let guid = Uuid::new_v4().to_string();
|
||||
// let sse = SSE{id: guid, event: new_json.event, data: serde_json::to_string(&new_json.data).unwrap(), retry: Duration::from_millis(5000)};
|
||||
// let _ = tx.send(sse).await;
|
||||
// let tree_cloned = tree_clone.clone();
|
||||
let sse = SSE{id: guid, event: new_json.event, data: serde_json::to_string(&new_json.data).unwrap(), retry: Duration::from_millis(5000)};
|
||||
let _ = tx.send(sse).await;
|
||||
let tree_cloned = tree_clone.clone();
|
||||
// let _ = tokio::spawn(async move {
|
||||
// let _ = tree_cloned.compare_and_swap(old_json.event.as_bytes(), None as Option<&[u8]>, Some(b""));
|
||||
// let old_json_og = tree_cloned.get(old_json.event).unwrap().unwrap();
|
||||
|
@ -366,15 +338,43 @@ async fn main() {
|
|||
// let _ = tree_cloned.compare_and_swap(k, Some(serde_json::to_string(&old_json_clone).unwrap().as_bytes()), Some(serde_json::to_string(&newer_json).unwrap().as_bytes()));
|
||||
// let _ = tree_cloned.flush();
|
||||
// }).await;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// let tree_clone = tree_clone3.lock().unwrap().clone();
|
||||
// let tree_clone2 = tree_clone.clone();
|
||||
// let mut tx = tx_arc2.lock().unwrap().clone();
|
||||
|
||||
// let _ = tokio::spawn(async move {
|
||||
// let vals: HashMap<String, String> = tree_clone2.iter().into_iter().filter(|x| {
|
||||
// let p = x.as_ref().unwrap();
|
||||
// let k = std::str::from_utf8(&p.0).unwrap().to_owned();
|
||||
// if !k.contains("_v_") && !k.contains("_u_") {
|
||||
// return true
|
||||
// } else {
|
||||
// return false
|
||||
// }
|
||||
// }).map(|x| {
|
||||
// let p = x.as_ref().unwrap();
|
||||
// let v = std::str::from_utf8(&p.1).unwrap().to_owned();
|
||||
// let json : Event = serde_json::from_str(&v).unwrap();
|
||||
// let data : String = serde_json::to_string(&json.data).unwrap();
|
||||
// (json.event, data)
|
||||
// }).collect();
|
||||
|
||||
// for (k, v) in vals {
|
||||
// let guid = Uuid::new_v4().to_string();
|
||||
// let sse = SSE{id: guid, event: k, data: v, retry: Duration::from_millis(5000)};
|
||||
// let _ = tx.send(sse).await;
|
||||
// }
|
||||
// });
|
||||
|
||||
|
||||
let events = rx.map(|sse| {
|
||||
let to = rx.map(|sse| {
|
||||
event_stream(sse)
|
||||
});
|
||||
portal::sse::reply(portal::sse::keep_alive().interval(Duration::from_secs(5)).text("ping".to_string()).stream(events))
|
||||
|
||||
portal::sse::reply(portal::sse::keep_alive().interval(Duration::from_secs(5)).text("ping".to_string()).stream(to))
|
||||
});
|
||||
|
||||
let cors = portal::cors()
|
||||
|
|
Loading…
Reference in New Issue