vane 0.9.0

A flow-based reverse proxy with multi-layer routing and programmable pipelines.
/* src/plugins/l4/abort.rs */

use crate::engine::interfaces::{
	ConnectionObject, Layer, ParamDef, Plugin, ResolvedInputs, Terminator, TerminatorResult,
};
use crate::resources::kv::KvStore;
use anyhow::Result;
use async_trait::async_trait;
use fancy_log::{LogLevel, log};
use std::any::Any;
use tokio::io::AsyncWriteExt;

pub struct AbortConnectionPlugin;

impl Plugin for AbortConnectionPlugin {
	fn name(&self) -> &'static str {
		"internal.transport.abort"
	}

	fn params(&self) -> Vec<ParamDef> {
		vec![]
	}

	fn as_any(&self) -> &dyn Any {
		self
	}

	fn as_terminator(&self) -> Option<&dyn Terminator> {
		Some(self)
	}
}

#[async_trait]
impl Terminator for AbortConnectionPlugin {
	fn supported_layers(&self) -> Vec<Layer> {
		vec![Layer::L4, Layer::L4Plus, Layer::L7]
	}

	async fn execute(
		&self,
		_inputs: ResolvedInputs,
		_kv: &mut KvStore,
		conn: ConnectionObject,
	) -> Result<TerminatorResult> {
		log(LogLevel::Debug, "➜ Aborting connection intentionally...");

		match conn {
			ConnectionObject::Tcp(mut stream) => {
				let _ = stream.shutdown().await;
			}
			ConnectionObject::Stream(mut stream) => {
				let _ = stream.shutdown().await;
			}
			ConnectionObject::Udp { .. } => {
				log(LogLevel::Debug, "⚙ UDP flow dropped.");
			}
			ConnectionObject::Virtual(_) => {
				log(LogLevel::Debug, "⚙ Virtual flow aborted.");
			}
		}

		Ok(TerminatorResult::Finished)
	}
}