|
|
@@ -1,9 +1,8 @@
|
|
|
use std::convert::TryInto;
|
|
|
|
|
|
use super::reqrep::{Reply, Request};
|
|
|
-use super::ServicesError;
|
|
|
use crate::serial::{deserialize, serialize};
|
|
|
-use crate::Result;
|
|
|
+use crate::{Error, Result};
|
|
|
|
|
|
use async_executor::Executor;
|
|
|
use async_std::sync::Arc;
|
|
|
@@ -18,12 +17,12 @@ pub struct GatewayService {
|
|
|
}
|
|
|
|
|
|
enum NetEvent {
|
|
|
- RECEIVE(zeromq::ZmqMessage),
|
|
|
- SEND(zeromq::ZmqMessage),
|
|
|
+ Receive(zeromq::ZmqMessage),
|
|
|
+ Send(zeromq::ZmqMessage),
|
|
|
}
|
|
|
|
|
|
impl GatewayService {
|
|
|
- pub async fn start(executor: Arc<Executor<'_>>) -> Result<()> {
|
|
|
+ pub async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
|
|
|
let mut worker = zeromq::RepSocket::new();
|
|
|
worker.connect("tcp://127.0.0.1:4444").await?;
|
|
|
|
|
|
@@ -32,16 +31,16 @@ impl GatewayService {
|
|
|
let ex2 = executor.clone();
|
|
|
loop {
|
|
|
let event = futures::select! {
|
|
|
- request = worker.recv().fuse() => NetEvent::RECEIVE(request?),
|
|
|
- reply = send_queue_r.recv().fuse() => NetEvent::SEND(reply?)
|
|
|
+ request = worker.recv().fuse() => NetEvent::Receive(request?),
|
|
|
+ reply = send_queue_r.recv().fuse() => NetEvent::Send(reply?)
|
|
|
};
|
|
|
|
|
|
+ let self2 = self.clone();
|
|
|
match event {
|
|
|
- NetEvent::RECEIVE(request) => {
|
|
|
- ex2.spawn(Self::handle_request(send_queue_s.clone(), request))
|
|
|
- .detach();
|
|
|
+ NetEvent::Receive(request) => {
|
|
|
+ let _ = ex2.spawn(self2.clone().handle_request(send_queue_s.clone(), request));
|
|
|
}
|
|
|
- NetEvent::SEND(reply) => {
|
|
|
+ NetEvent::Send(reply) => {
|
|
|
worker.send(reply).await?;
|
|
|
}
|
|
|
}
|
|
|
@@ -49,6 +48,7 @@ impl GatewayService {
|
|
|
}
|
|
|
|
|
|
async fn handle_request(
|
|
|
+ self: Arc<Self>,
|
|
|
send_queue: async_channel::Sender<zeromq::ZmqMessage>,
|
|
|
request: zeromq::ZmqMessage,
|
|
|
) -> Result<()> {
|
|
|
@@ -56,12 +56,26 @@ impl GatewayService {
|
|
|
let request: Vec<u8> = request.to_vec();
|
|
|
let req: Request = deserialize(&request)?;
|
|
|
|
|
|
- // TODO
|
|
|
- // do things
|
|
|
-
|
|
|
- println!("Gateway service received a msg {:?}", req);
|
|
|
+ let data = vec![];
|
|
|
+ match req.get_command() {
|
|
|
+ 0 => {
|
|
|
+ // PUTSLAB
|
|
|
+ println!("receive PUTSLAB command");
|
|
|
+ }
|
|
|
+ 1 => {
|
|
|
+ // GETSLAB
|
|
|
+ println!("receive GETSLAB command");
|
|
|
+ }
|
|
|
+ 2 => {
|
|
|
+ // GETLASTINDEX
|
|
|
+ println!("receive GETLASTINDEX command");
|
|
|
+ }
|
|
|
+ _ => {
|
|
|
+ return Err(Error::ServicesError("wrong command"));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- let rep = Reply::from(&req, 0, "text".as_bytes().to_vec());
|
|
|
+ let rep = Reply::from(&req, 0, data);
|
|
|
let rep: Vec<u8> = serialize(&rep);
|
|
|
let rep = Bytes::from(rep);
|
|
|
send_queue.send(rep.into()).await?;
|
|
|
@@ -100,7 +114,7 @@ impl GatewayClient {
|
|
|
let reply: Reply = deserialize(&rep)?;
|
|
|
|
|
|
if reply.has_error() {
|
|
|
- return Err(ServicesError::ResonseError("response has an error").into());
|
|
|
+ return Err(crate::Error::ServicesError("response has an error"));
|
|
|
}
|
|
|
|
|
|
assert!(reply.get_id() == request.get_id());
|
|
|
@@ -109,16 +123,16 @@ impl GatewayClient {
|
|
|
}
|
|
|
|
|
|
pub async fn get_slab(&mut self, index: u32) -> Result<Vec<u8>> {
|
|
|
- self.request(GatewayCommand::GETSLAB, index.to_be_bytes().to_vec())
|
|
|
+ self.request(GatewayCommand::GetSlab, index.to_be_bytes().to_vec())
|
|
|
.await
|
|
|
}
|
|
|
|
|
|
pub async fn put_slab(&mut self, data: Vec<u8>) -> Result<()> {
|
|
|
- self.request(GatewayCommand::GETSLAB, data).await?;
|
|
|
+ self.request(GatewayCommand::PutSlab, data).await?;
|
|
|
Ok(())
|
|
|
}
|
|
|
pub async fn get_last_index(&mut self) -> Result<u32> {
|
|
|
- let rep = self.request(GatewayCommand::GETLASTINDEX, vec![]).await?;
|
|
|
+ let rep = self.request(GatewayCommand::GetLastIndex, vec![]).await?;
|
|
|
let rep: [u8; 4] = rep.try_into().unwrap();
|
|
|
Ok(u32::from_be_bytes(rep))
|
|
|
}
|
|
|
@@ -126,7 +140,7 @@ impl GatewayClient {
|
|
|
|
|
|
#[repr(u8)]
|
|
|
enum GatewayCommand {
|
|
|
- PUTSLAB,
|
|
|
- GETSLAB,
|
|
|
- GETLASTINDEX,
|
|
|
+ PutSlab,
|
|
|
+ GetSlab,
|
|
|
+ GetLastIndex,
|
|
|
}
|