summaryrefslogtreecommitdiff
path: root/src/event
diff options
context:
space:
mode:
authorzirkonya <zirkonya@iridium.lan>2026-08-27 09:45:12 +0200
committerzirkonya <zirkonya@iridium.lan>2026-08-27 09:45:12 +0200
commitbb41e396aca01fee9f81785681fac0a79d0fd9d8 (patch)
tree94ebe4800a50c14abc413cbcabe9ffaaab7496ef /src/event
parent8bae725a803ee00bf5bc86b9fc0be6853b95115e (diff)
split event and enhance context
Diffstat (limited to 'src/event')
-rw-r--r--src/event/connection.rs13
-rw-r--r--src/event/disconnect.rs25
-rw-r--r--src/event/handler.rs67
-rw-r--r--src/event/listener.rs47
-rw-r--r--src/event/received.rs7
-rw-r--r--src/event/sent.rs7
6 files changed, 166 insertions, 0 deletions
diff --git a/src/event/connection.rs b/src/event/connection.rs
new file mode 100644
index 0000000..99813fd
--- /dev/null
+++ b/src/event/connection.rs
@@ -0,0 +1,13 @@
+use std::net::SocketAddr;
+
+use getset::Getters;
+
+// TODO : identification
+// TODO : reason type
+#[derive(Getters)]
+pub struct ConnectionEvent {
+ #[getset(get = "pub")]
+ peer_addr: SocketAddr,
+ #[getset(get = "pub")]
+ local_addr: SocketAddr,
+}
diff --git a/src/event/disconnect.rs b/src/event/disconnect.rs
new file mode 100644
index 0000000..6511027
--- /dev/null
+++ b/src/event/disconnect.rs
@@ -0,0 +1,25 @@
+use std::io;
+
+use getset::Getters;
+
+// TODO : better error type for protocol violation
+pub type ProtocolViolation = String;
+
+pub enum DisconnectReason {
+ Normal,
+ Error(io::Error),
+ ProtocolError(ProtocolViolation),
+ Timeout,
+ ServerShutdown,
+}
+
+#[derive(Getters)]
+pub struct DisconnectEvent<Uid>
+where
+ Uid: PartialEq,
+{
+ #[getset(get = "pub")]
+ connection_id: Uid,
+ #[getset(get = "pub")]
+ reason: DisconnectReason,
+}
diff --git a/src/event/handler.rs b/src/event/handler.rs
index 7d8b5b5..3f9827e 100644
--- a/src/event/handler.rs
+++ b/src/event/handler.rs
@@ -1,2 +1,69 @@
// TODO : dispatch event through all listener
// TODO : maybe compile listener into one ?
+
+use crate::{
+ context::Context,
+ event::{
+ Event,
+ listener::{Listener, ListenerResult},
+ },
+};
+
+pub struct EventHandler<Packet, Data = (), Uid = u64>
+where
+ Uid: PartialEq,
+{
+ listeners: Vec<Box<dyn Listener<Packet, Data, Uid>>>,
+}
+
+impl<Packet, Data, Uid> EventHandler<Packet, Data, Uid>
+where
+ Uid: PartialEq + Clone,
+{
+ pub fn register<L: Listener<Packet, Data, Uid> + 'static>(&mut self, listener: L) {
+ self.listeners.push(Box::new(listener));
+ }
+
+ pub fn dispatch(&self, event: &Event<Packet, Uid>, ctx: &Context<Data>) {
+ match event.kind() {
+ super::EventKind::Connection(connection_event) => {
+ for listener in &self.listeners {
+ if matches!(
+ listener.on_connection(connection_event, ctx),
+ ListenerResult::Cancel | ListenerResult::Disconnect
+ ) {
+ event.cancel();
+ break;
+ }
+ }
+ }
+ super::EventKind::PacketReceived(packet_received_event) => {
+ for listener in &self.listeners {
+ if matches!(
+ listener.on_packet_received(packet_received_event, ctx),
+ ListenerResult::Cancel | ListenerResult::Disconnect
+ ) {
+ event.cancel();
+ break;
+ }
+ }
+ }
+ super::EventKind::PacketSent(packet_sent_event) => {
+ for listener in &self.listeners {
+ if matches!(
+ listener.on_packet_sent(packet_sent_event, ctx),
+ ListenerResult::Cancel | ListenerResult::Disconnect
+ ) {
+ event.cancel();
+ break;
+ }
+ }
+ }
+ super::EventKind::Disconnect(disconnect_event) => {
+ for listener in &self.listeners {
+ listener.on_disconnect(disconnect_event, ctx);
+ }
+ }
+ }
+ }
+}
diff --git a/src/event/listener.rs b/src/event/listener.rs
index 178dda8..81f4b57 100644
--- a/src/event/listener.rs
+++ b/src/event/listener.rs
@@ -1 +1,48 @@
+use crate::{
+ context::Context,
+ event::{ConnectionEvent, DisconnectEvent, PacketReceivedEvent, PacketSentEvent},
+};
+
// TODO : Listener ; interface to perform action when event occured
+// TODO async trait for async runtime
+
+pub enum ListenerResult {
+ Continue,
+ /// Cancel the event
+ /// `ConectionEvent` => same as `ListenerResult::Disconnect`
+ /// `PacketReceived` => the received packet is drop
+ /// `PacketSent` => the packet isn't send
+ /// `Disconnect` => non sense
+ Cancel,
+ /// Force disconnect the connection
+ Disconnect,
+}
+
+pub trait Listener<Packet, Data = (), Uid = u64>
+where
+ Uid: PartialEq,
+{
+ fn on_connection(&self, event: &ConnectionEvent, ctx: &Context<Data>) -> ListenerResult {
+ let _ = (event, ctx);
+ ListenerResult::Continue
+ }
+ fn on_packet_received(
+ &self,
+ event: &PacketReceivedEvent<Packet>,
+ ctx: &Context<Data>,
+ ) -> ListenerResult {
+ let _ = (event, ctx);
+ ListenerResult::Continue
+ }
+ fn on_packet_sent(
+ &self,
+ event: &PacketSentEvent<Packet>,
+ ctx: &Context<Data>,
+ ) -> ListenerResult {
+ let _ = (event, ctx);
+ ListenerResult::Continue
+ }
+ fn on_disconnect(&self, event: &DisconnectEvent<Uid>, ctx: &Context<Data>) {
+ let _ = (event, ctx);
+ }
+}
diff --git a/src/event/received.rs b/src/event/received.rs
new file mode 100644
index 0000000..0ef6d0e
--- /dev/null
+++ b/src/event/received.rs
@@ -0,0 +1,7 @@
+use getset::Getters;
+
+#[derive(Getters)]
+pub struct PacketReceivedEvent<Packet> {
+ #[getset(get = "pub")]
+ packet: Packet,
+}
diff --git a/src/event/sent.rs b/src/event/sent.rs
new file mode 100644
index 0000000..5278842
--- /dev/null
+++ b/src/event/sent.rs
@@ -0,0 +1,7 @@
+use getset::Getters;
+
+#[derive(Getters)]
+pub struct PacketSentEvent<Packet> {
+ #[getset(get = "pub")]
+ packet: Packet,
+}