Skip to content

Commit e884da1

Browse files
committed
Added sending buffer in case of no initialization
1 parent ed95576 commit e884da1

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

src/juno_module.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@ use crate::connection::UnixSocketConnection;
1717

1818
use async_std::{
1919
prelude::*,
20-
sync::{Arc, Mutex},
20+
sync::{Arc, Mutex, RwLock},
2121
task,
2222
};
2323
use futures::channel::{
2424
mpsc::{UnboundedReceiver, UnboundedSender},
2525
oneshot::{channel, Sender},
2626
};
2727
use futures_util::sink::SinkExt;
28-
use std::sync::RwLock;
2928
use std::{
3029
collections::HashMap,
3130
net::{AddrParseError, SocketAddr},
@@ -41,7 +40,7 @@ pub struct JunoModule {
4140
requests: ArcRequestList,
4241
functions: ArcFunctionList,
4342
hook_listeners: ArcHookListenerList,
44-
message_buffer: Buffer,
43+
message_buffer: Arc<RwLock<Buffer>>,
4544
registered: Arc<RwLock<bool>>,
4645
}
4746

@@ -83,7 +82,7 @@ impl JunoModule {
8382
requests: Arc::new(Mutex::new(HashMap::new())),
8483
functions: Arc::new(Mutex::new(HashMap::new())),
8584
hook_listeners: Arc::new(Mutex::new(HashMap::new())),
86-
message_buffer: vec![],
85+
message_buffer: Arc::new(RwLock::new(vec![])),
8786
registered: Arc::new(RwLock::new(false)),
8887
}
8988
}
@@ -165,6 +164,7 @@ impl JunoModule {
165164
let requests = self.requests.clone();
166165
let functions = self.functions.clone();
167166
let hook_listeners = self.hook_listeners.clone();
167+
let message_buffer = self.message_buffer.clone();
168168
let registered_store = self.registered.clone();
169169

170170
// Run the read-write loop
@@ -175,6 +175,7 @@ impl JunoModule {
175175
requests,
176176
functions,
177177
hook_listeners,
178+
message_buffer,
178179
registered_store,
179180
write_sender,
180181
)
@@ -186,22 +187,21 @@ impl JunoModule {
186187

187188
async fn send_request(&mut self, request: BaseMessage) -> Result<Value> {
188189
if let BaseMessage::RegisterModuleRequest { .. } = request {
189-
if *self.registered.read().unwrap() {
190+
if *self.registered.read().await {
190191
return Err(Error::Internal(String::from("Module already registered")));
191192
}
192193
}
193194

194195
let request_type = request.get_type();
195196
let request_id = request.get_request_id().clone();
196197
let mut encoded = self.protocol.encode(request);
197-
if *self.registered.read().unwrap() || request_type == 1 {
198-
if self.message_buffer.len() != 0 {
199-
self.connection.send(self.message_buffer.clone()).await;
200-
self.message_buffer.clear();
201-
}
198+
if *self.registered.read().await || request_type == 1 {
202199
self.connection.send(encoded).await;
203200
} else {
204-
self.message_buffer.append(&mut encoded);
201+
self.message_buffer
202+
.write()
203+
.await
204+
.append(&mut encoded);
205205
}
206206

207207
let (sender, receiver) = channel::<Result<Value>>();
@@ -223,6 +223,7 @@ async fn on_data_listener(
223223
requests: ArcRequestList,
224224
functions: ArcFunctionList,
225225
hook_listeners: ArcHookListenerList,
226+
message_buffer: Arc<RwLock<Buffer>>,
226227
registered_store: Arc<RwLock<bool>>,
227228
mut write_sender: UnboundedSender<Buffer>,
228229
) {
@@ -254,7 +255,7 @@ async fn on_data_listener(
254255
Ok(Value::Null)
255256
}
256257
BaseMessage::TriggerHookResponse { .. } => {
257-
execute_hook_triggered(message, &registered_store, &hook_listeners).await
258+
execute_hook_triggered(message, &message_buffer, &write_sender, &registered_store, &hook_listeners).await
258259
}
259260
BaseMessage::Error { error, .. } => Err(Error::FromJuno(error)),
260261
_ => Ok(Value::Null),
@@ -290,16 +291,23 @@ async fn execute_function_call(message: BaseMessage, functions: &ArcFunctionList
290291

291292
async fn execute_hook_triggered(
292293
message: BaseMessage,
294+
message_buffer: &Arc<RwLock<Buffer>>,
295+
mut write_sender: &UnboundedSender<Buffer>,
293296
registered_store: &Arc<RwLock<bool>>,
294297
hook_listeners: &ArcHookListenerList,
295298
) -> Result<Value> {
296299
if let BaseMessage::TriggerHookResponse { hook, data, .. } = message {
297300
if hook.is_some() {
298301
let hook = hook.unwrap();
299302
if hook == "juno.activated" {
300-
*registered_store.write().unwrap() = true;
303+
*registered_store.write().await = true;
304+
let mut buffer = message_buffer.write().await;
305+
if let Err(err) = write_sender.send(buffer.clone()).await {
306+
println!("Error writing remaining buffer: {}", err);
307+
}
308+
buffer.clear();
301309
} else if &hook == "juno.deactivated" {
302-
*registered_store.write().unwrap() = false;
310+
*registered_store.write().await = false;
303311
} else {
304312
let hook_listeners = hook_listeners.lock().await;
305313
if !hook_listeners.contains_key(&hook) {

0 commit comments

Comments
 (0)