@@ -22,7 +22,25 @@ use tokio_tungstenite::{
22
22
23
23
type Tx = UnboundedSender < Message > ;
24
24
pub type ConnectionMap = Arc < Mutex < HashMap < SocketAddr , Tx > > > ;
25
- type MessageQueue = Arc < Mutex < VecDeque < DisplayMessage > > > ;
25
+ type EventQueues = Arc < Mutex < Queues > > ;
26
+
27
+ static EVENT_QUEUE_ACTIVE : std:: sync:: atomic:: AtomicBool = std:: sync:: atomic:: AtomicBool :: new ( true ) ;
28
+ static TTS_QUEUE_ACTIVE : std:: sync:: atomic:: AtomicBool = std:: sync:: atomic:: AtomicBool :: new ( false ) ;
29
+ static IS_DISPLAYING : std:: sync:: atomic:: AtomicBool = std:: sync:: atomic:: AtomicBool :: new ( false ) ;
30
+
31
+ pub struct Queues {
32
+ pub events : VecDeque < DisplayMessage > ,
33
+ pub tts : VecDeque < DisplayMessage > ,
34
+ }
35
+
36
+ impl Queues {
37
+ pub fn new ( ) -> Queues {
38
+ Queues {
39
+ events : VecDeque :: new ( ) ,
40
+ tts : VecDeque :: new ( ) ,
41
+ }
42
+ }
43
+ }
26
44
27
45
pub struct FrontendApi {
28
46
ws_address : String ,
@@ -49,15 +67,32 @@ impl FrontendApi {
49
67
println ! ( "Listening on: {}" , self . ws_address) ;
50
68
51
69
let connection_state = self . connection_state . clone ( ) ;
52
- let message_queue_arc: MessageQueue = Arc :: new ( Mutex :: new ( VecDeque :: new ( ) ) ) ;
70
+ let message_queue_arc: EventQueues = Arc :: new ( Mutex :: new ( Queues :: new ( ) ) ) ;
71
+
72
+ //TODO: Need to fetch un presented messages from database
53
73
74
+ let queue = message_queue_arc. clone ( ) ;
75
+ let state = connection_state. clone ( ) ;
76
+ // Listen for incoming events and store them in the queues
54
77
tokio:: spawn ( async move {
55
78
loop {
56
79
let msg = ( & mut receiver) . recv ( ) . await ;
57
- handle_message ( connection_state . clone ( ) , message_queue_arc . clone ( ) , msg) . await ;
80
+ handle_message ( state . clone ( ) , queue . clone ( ) , msg) ;
58
81
}
59
82
} ) ;
60
83
84
+ // Process the Queues on a new thread
85
+
86
+ //tokio::spawn(async move {
87
+ // loop {
88
+ // let mut queues = message_queue_arc.lock().unwrap();
89
+ // if !queues.events.is_empty() {
90
+ // let message = queues.events.pop_front();
91
+ // handle_message(connection_state.clone(), message_queue_arc.clone(), message);
92
+ // }
93
+ // }
94
+ //});
95
+
61
96
let https_address = self . http_address . clone ( ) ;
62
97
tokio:: spawn ( async move {
63
98
let listener = TcpListener :: bind ( & https_address)
@@ -66,6 +101,7 @@ impl FrontendApi {
66
101
// build our application
67
102
let app = Router :: new ( )
68
103
. route ( "/" , get ( index) )
104
+ . route ( "/admin" , get ( admin) )
69
105
//TODO: understand where to put our assets
70
106
// Remember that these need served by nginx in production
71
107
. nest_service ( "/assets" , ServeDir :: new ( "assets" ) ) ;
@@ -96,13 +132,21 @@ impl FrontendApi {
96
132
#[ template( path = "index.html" ) ]
97
133
struct IndexTemplate { }
98
134
135
+ #[ derive( askama:: Template ) ]
136
+ #[ template( path = "admin.html" ) ]
137
+ struct AdminTemplate { }
138
+
99
139
async fn index ( ) -> IndexTemplate {
100
140
IndexTemplate { }
101
141
}
102
142
103
- async fn handle_message (
143
+ async fn admin ( ) -> AdminTemplate {
144
+ AdminTemplate { }
145
+ }
146
+
147
+ fn handle_message (
104
148
connection_state : ConnectionMap ,
105
- message_queue : MessageQueue ,
149
+ event_queues : EventQueues ,
106
150
message : Option < DisplayMessage > ,
107
151
) {
108
152
match message {
@@ -113,14 +157,17 @@ async fn handle_message(
113
157
114
158
//Enqueue message
115
159
{
116
- let mut message_queue = message_queue. lock ( ) . unwrap ( ) ;
117
- message_queue. push_back ( message. clone ( ) ) ;
160
+ let mut queues = event_queues. lock ( ) . unwrap ( ) ;
161
+ //TODO: need to handle different types of messages
162
+
163
+ queues. events . push_back ( message. clone ( ) ) ;
118
164
}
119
165
120
166
//Make html message to send to frontend
121
167
//<div id="alerts" hx-swap-oob="true">
168
+ let trigger = format ! ( "delay:{}ms" , message. display_time) ;
122
169
let html_message = html ! {
123
- div id="alerts " hx-swap-oob= "true" {
170
+ div id="notifications " hx-swap= "afterend" hx-target= "notifications" ws-send= "done" hx-trigger= ( trigger ) {
124
171
h1 { ( message. message) }
125
172
img src=( message. image_url) { }
126
173
}
@@ -158,6 +205,7 @@ async fn handle_connection(
158
205
state. lock ( ) . unwrap ( ) . insert ( peer, tx) ;
159
206
}
160
207
let ( mut ws_sender, mut ws_receiver) = ws_stream. split ( ) ;
208
+ println ! ( "Connection state: {:?}" , state. lock( ) . unwrap( ) . keys( ) ) ;
161
209
loop {
162
210
tokio:: select! {
163
211
msg = ws_receiver. next( ) => {
0 commit comments