use std::collections::HashMap;
use crate::{
DocumentActorId,
actors::{
HubToDocMsg,
document::SpawnArgs,
hub::{CommandId, CommandResult, connection::Connection},
messages::HubToDocMsgPayload,
},
io::{IoTask, IoTaskId},
network::{ConnectionEvent, ConnectionOwner, DialRequest, DialerEvent},
};
use super::io::HubIoAction;
#[derive(Debug, Default, Clone)]
pub struct HubResults {
pub new_tasks: Vec<IoTask<HubIoAction>>,
pub completed_commands: HashMap<CommandId, CommandResult>,
pub spawn_actors: Vec<SpawnArgs>,
pub actor_messages: Vec<(DocumentActorId, HubToDocMsg)>,
pub connection_events: Vec<ConnectionEvent>,
pub dial_requests: Vec<DialRequest>,
pub dialer_events: Vec<DialerEvent>,
pub stopped: bool,
pub event_type: &'static str,
pub connections_count: usize,
pub documents_count: usize,
}
impl HubResults {
pub(crate) fn send(&mut self, conn: &Connection, msg: Vec<u8>) {
tracing::trace!(conn_id=?conn.id(), remote_peer_id=?conn.remote_peer_id(), num_bytes=msg.len(), "sending message");
self.emit_io_action(HubIoAction::Send {
connection_id: conn.id(),
msg,
});
}
pub(crate) fn emit_disconnect_event(
&mut self,
connection_id: crate::ConnectionId,
owner: ConnectionOwner,
error: String,
) {
let event = ConnectionEvent::ConnectionFailed {
connection_id,
owner,
error,
};
self.connection_events.push(event);
}
pub(crate) fn emit_connection_event(&mut self, event: ConnectionEvent) {
self.connection_events.push(event);
}
pub(crate) fn send_to_doc_actor(&mut self, actor_id: DocumentActorId, msg: HubToDocMsgPayload) {
self.actor_messages.push((actor_id, HubToDocMsg(msg)));
}
pub(crate) fn emit_spawn_actor(&mut self, args: SpawnArgs) {
self.spawn_actors.push(args)
}
pub(crate) fn emit_io_action(&mut self, action: HubIoAction) -> IoTaskId {
let task_id = IoTaskId::new();
self.new_tasks.push(IoTask {
task_id: IoTaskId::new(),
action,
});
task_id
}
pub(crate) fn emit_dial_request(&mut self, request: DialRequest) {
self.dial_requests.push(request);
}
pub(crate) fn emit_connector_event(&mut self, event: DialerEvent) {
self.dialer_events.push(event);
}
}