parent
e132a3623c
commit
7141c65d09
@ -0,0 +1,125 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
* All rights reserved. |
||||||
|
* Licensed under the Apache License, Version 2.0 |
||||||
|
* <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
|
* or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
||||||
|
* at your option. All files in the project carrying such |
||||||
|
* notice may not be copied, modified, or distributed except |
||||||
|
* according to those terms. |
||||||
|
*/ |
||||||
|
use crate::broker::{ServerConfig, BROKER}; |
||||||
|
use crate::connection::NoiseFSM; |
||||||
|
use crate::types::*; |
||||||
|
use crate::{actor::*, types::ProtocolMessage}; |
||||||
|
use async_std::sync::Mutex; |
||||||
|
use ng_repo::errors::*; |
||||||
|
use ng_repo::log::*; |
||||||
|
use ng_repo::types::{Block, OverlayId, PubKey}; |
||||||
|
use serde::{Deserialize, Serialize}; |
||||||
|
use std::sync::Arc; |
||||||
|
|
||||||
|
impl CommitGet { |
||||||
|
pub fn get_actor(&self, id: i64) -> Box<dyn EActor> { |
||||||
|
Actor::<CommitGet, Block>::new_responder(id) |
||||||
|
} |
||||||
|
|
||||||
|
pub fn overlay(&self) -> &OverlayId { |
||||||
|
match self { |
||||||
|
Self::V0(v0) => v0.overlay.as_ref().unwrap(), |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn set_overlay(&mut self, overlay: OverlayId) { |
||||||
|
match self { |
||||||
|
Self::V0(v0) => v0.overlay = Some(overlay), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl TryFrom<ProtocolMessage> for CommitGet { |
||||||
|
type Error = ProtocolError; |
||||||
|
fn try_from(msg: ProtocolMessage) -> Result<Self, Self::Error> { |
||||||
|
let req: ClientRequestContentV0 = msg.try_into()?; |
||||||
|
if let ClientRequestContentV0::CommitGet(a) = req { |
||||||
|
Ok(a) |
||||||
|
} else { |
||||||
|
log_debug!("INVALID {:?}", req); |
||||||
|
Err(ProtocolError::InvalidValue) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<CommitGet> for ProtocolMessage { |
||||||
|
fn from(msg: CommitGet) -> ProtocolMessage { |
||||||
|
let overlay = *msg.overlay(); |
||||||
|
ProtocolMessage::from_client_request_v0(ClientRequestContentV0::CommitGet(msg), overlay) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl TryFrom<ProtocolMessage> for Block { |
||||||
|
type Error = ProtocolError; |
||||||
|
fn try_from(msg: ProtocolMessage) -> Result<Self, Self::Error> { |
||||||
|
let res: ClientResponseContentV0 = msg.try_into()?; |
||||||
|
if let ClientResponseContentV0::Block(a) = res { |
||||||
|
Ok(a) |
||||||
|
} else { |
||||||
|
log_debug!("INVALID {:?}", res); |
||||||
|
Err(ProtocolError::InvalidValue) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<Block> for ProtocolMessage { |
||||||
|
fn from(b: Block) -> ProtocolMessage { |
||||||
|
let mut cr: ClientResponse = ClientResponseContentV0::Block(b).into(); |
||||||
|
cr.set_result(ServerError::PartialContent.into()); |
||||||
|
cr.into() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Actor<'_, CommitGet, Block> {} |
||||||
|
|
||||||
|
#[async_trait::async_trait] |
||||||
|
impl EActor for Actor<'_, CommitGet, Block> { |
||||||
|
async fn respond( |
||||||
|
&mut self, |
||||||
|
msg: ProtocolMessage, |
||||||
|
fsm: Arc<Mutex<NoiseFSM>>, |
||||||
|
) -> Result<(), ProtocolError> { |
||||||
|
let req = CommitGet::try_from(msg)?; |
||||||
|
log_info!("GOT CommitGet {:?}", req); |
||||||
|
let broker = BROKER.read().await; |
||||||
|
let blocks_res = broker |
||||||
|
.get_server_storage()? |
||||||
|
.get_commit(req.overlay(), req.id()); |
||||||
|
|
||||||
|
match blocks_res { |
||||||
|
Ok(blocks) => { |
||||||
|
if blocks.len() == 0 { |
||||||
|
let re: Result<(), ServerError> = Err(ServerError::EmptyStream); |
||||||
|
fsm.lock() |
||||||
|
.await |
||||||
|
.send_in_reply_to(re.into(), self.id()) |
||||||
|
.await?; |
||||||
|
return Ok(()); |
||||||
|
} |
||||||
|
let mut lock = fsm.lock().await; |
||||||
|
|
||||||
|
for block in blocks { |
||||||
|
lock.send_in_reply_to(block.into(), self.id()).await?; |
||||||
|
} |
||||||
|
let re: Result<(), ServerError> = Err(ServerError::EndOfStream); |
||||||
|
lock.send_in_reply_to(re.into(), self.id()).await?; |
||||||
|
} |
||||||
|
Err(e) => { |
||||||
|
let re: Result<(), ServerError> = Err(e); |
||||||
|
fsm.lock() |
||||||
|
.await |
||||||
|
.send_in_reply_to(re.into(), self.id()) |
||||||
|
.await?; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Ok(()) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue