mirror of https://github.com/MedzikUser/servers
release v0.3.0
This commit is contained in:
parent
093671ff8f
commit
45a9fe605d
24
CHANGELOG.md
24
CHANGELOG.md
|
@ -1,16 +1,25 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
||||||
|
|
||||||
<!-- next-header -->
|
<!-- next-header -->
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
## Chore
|
|
||||||
|
## [0.3.0] - 2022-08-04
|
||||||
|
## **Breaking**
|
||||||
- **tcp**: use tcp from tokio instead of std
|
- **tcp**: use tcp from tokio instead of std
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- **client**: added `peer_addr` function
|
||||||
|
- **server**: added `/help` command
|
||||||
|
- **api**: re-export `async_trait` so that it doesn't have to be added to dependencies in plugins
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
- **server**: the `/help` command has been accelerated
|
||||||
|
- **cli**: moved to the `cli.rs` file
|
||||||
|
- **logger**: changed `log` to `tracing`
|
||||||
|
- **dependencies**: updated
|
||||||
|
- **cli**: deleted option `--disable-websocket` and added `--enable-websocket`
|
||||||
|
|
||||||
## [0.2.0] - 2022-06-26
|
## [0.2.0] - 2022-06-26
|
||||||
### Features
|
### Features
|
||||||
- **plugins**: add `Result<()>` in `fn execute()` (Event and Command traits)
|
- **plugins**: add `Result<()>` in `fn execute()` (Event and Command traits)
|
||||||
|
@ -32,6 +41,7 @@ You set custom host and port `./servers --host 0.0.0.0 --port 9999`
|
||||||
Show cli help `./servers --help`
|
Show cli help `./servers --help`
|
||||||
|
|
||||||
<!-- next-url -->
|
<!-- next-url -->
|
||||||
[Unreleased]: https://github.com/MedzikUser/servers/compare/v0.2.0...HEAD
|
[Unreleased]: https://github.com/MedzikUser/servers/compare/v0.3.0...HEAD
|
||||||
|
[0.3.0]: https://github.com/MedzikUser/servers/commits/v0.3.0
|
||||||
[0.2.0]: https://github.com/MedzikUser/servers/commits/v0.2.0
|
[0.2.0]: https://github.com/MedzikUser/servers/commits/v0.2.0
|
||||||
[0.1.0]: https://github.com/MedzikUser/servers/commits/v0.1.0
|
[0.1.0]: https://github.com/MedzikUser/servers/commits/v0.1.0
|
||||||
|
|
|
@ -563,7 +563,7 @@ checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "servers"
|
name = "servers"
|
||||||
version = "0.3.0-pre"
|
version = "0.3.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|
13
Cargo.toml
13
Cargo.toml
|
@ -1,12 +1,13 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
members = ["plugin_test"]
|
members = ["plugin_test"]
|
||||||
|
resolver = "2"
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "servers"
|
name = "servers"
|
||||||
description = "Simple TCP server for clients written in Rust with plugins support"
|
description = "Simple TCP server for clients written in Rust with plugins support."
|
||||||
version = "0.3.0-pre"
|
version = "0.3.0"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
authors = ["MedzikUser <nivua1fn@duck.com>"]
|
authors = ["MedzikUser <medzik@duck.com>"]
|
||||||
homepage = "https://github.com/MedzikUser/servers"
|
homepage = "https://github.com/MedzikUser/servers"
|
||||||
repository = "https://github.com/MedzikUser/servers.git"
|
repository = "https://github.com/MedzikUser/servers.git"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -17,15 +18,15 @@ opt-level = 'z'
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
lazy_static = "1.4.0"
|
|
||||||
anyhow = "1.0.58"
|
anyhow = "1.0.58"
|
||||||
async-trait = "0.1.56"
|
async-trait = "0.1.56"
|
||||||
better-panic = "0.3.0"
|
better-panic = "0.3.0"
|
||||||
|
lazy_static = "1.4.0"
|
||||||
libloading = "0.7.3"
|
libloading = "0.7.3"
|
||||||
tokio-tungstenite = "0.17.2"
|
tokio-tungstenite = "0.17.2"
|
||||||
tungstenite = "0.17.3"
|
|
||||||
tracing-subscriber = "0.3.15"
|
|
||||||
tracing = "0.1.36"
|
tracing = "0.1.36"
|
||||||
|
tracing-subscriber = "0.3.15"
|
||||||
|
tungstenite = "0.17.3"
|
||||||
clap = { version = "3.2.16", features = ["derive"] }
|
clap = { version = "3.2.16", features = ["derive"] }
|
||||||
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
|
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
|
||||||
tokio = { version = "1.20.1", features = ["rt-multi-thread", "macros", "net"] }
|
tokio = { version = "1.20.1", features = ["rt-multi-thread", "macros", "net"] }
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use servers::{
|
use servers::{
|
||||||
|
async_trait,
|
||||||
plugins::{Command, Event, Plugin, PluginManagerType, Registrar, Result},
|
plugins::{Command, Event, Plugin, PluginManagerType, Registrar, Result},
|
||||||
tcp::Client, async_trait,
|
tcp::Client,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PluginTest;
|
struct PluginTest;
|
||||||
|
|
10
src/cli.rs
10
src/cli.rs
|
@ -2,9 +2,9 @@ use clap::Parser;
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[clap(
|
#[clap(
|
||||||
name = "servers",
|
name = env!("CARGO_PKG_NAME"),
|
||||||
version = env!("CARGO_PKG_VERSION"),
|
version = env!("CARGO_PKG_VERSION"),
|
||||||
about = "A simple TCP server for client which can be extended with plugins."
|
about = env!("CARGO_PKG_DESCRIPTION"),
|
||||||
)]
|
)]
|
||||||
pub struct Cli {
|
pub struct Cli {
|
||||||
#[clap(
|
#[clap(
|
||||||
|
@ -35,9 +35,9 @@ pub struct Cli {
|
||||||
pub ws_port: String,
|
pub ws_port: String,
|
||||||
|
|
||||||
#[clap(
|
#[clap(
|
||||||
long = "disable-websocket",
|
long = "enable-websocket",
|
||||||
help = "Disable WebSocket proxy to Tcp",
|
help = "Enable WebSocket proxy to Tcp [default disabled]",
|
||||||
display_order = 4
|
display_order = 4
|
||||||
)]
|
)]
|
||||||
pub ws_disable: bool,
|
pub ws_enable: bool,
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
pub mod commands;
|
pub mod commands;
|
||||||
pub mod logger;
|
pub mod logger;
|
||||||
mod macros;
|
|
||||||
pub mod plugins;
|
pub mod plugins;
|
||||||
pub mod tcp;
|
pub mod tcp;
|
||||||
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/// Update value in the Mutex
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// use std::sync::Mutex;
|
|
||||||
/// use servers::update_mutex;
|
|
||||||
///
|
|
||||||
/// // create a new Mutex
|
|
||||||
/// let mutex: Mutex<String> = Mutex::new(String::new());
|
|
||||||
///
|
|
||||||
/// // update the value in the Mutex
|
|
||||||
/// update_mutex!(mutex, "new value".to_string());
|
|
||||||
/// ```
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! update_mutex {
|
|
||||||
($mutex: expr, $($new_value:tt)+) => {
|
|
||||||
*$crate::lock_mutex!($mutex) = $($new_value)+;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Lock value in the Mutex
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// use std::sync::Mutex;
|
|
||||||
/// use servers::lock_mutex;
|
|
||||||
///
|
|
||||||
/// // create a new Mutex
|
|
||||||
/// let mutex: Mutex<String> = Mutex::new("value".to_string());
|
|
||||||
///
|
|
||||||
/// // lock the Mutex
|
|
||||||
/// let value = lock_mutex!(mutex);
|
|
||||||
///
|
|
||||||
/// println!("{}", value);
|
|
||||||
/// ```
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! lock_mutex {
|
|
||||||
($mutex: expr) => {
|
|
||||||
$mutex.lock().expect("failed to lock mutex")
|
|
||||||
};
|
|
||||||
}
|
|
15
src/main.rs
15
src/main.rs
|
@ -1,5 +1,6 @@
|
||||||
|
mod cli;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use cli::Cli;
|
|
||||||
use servers::{
|
use servers::{
|
||||||
logger,
|
logger,
|
||||||
plugins::loader,
|
plugins::loader,
|
||||||
|
@ -8,7 +9,7 @@ use servers::{
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
use tracing::{error, info};
|
use tracing::{error, info};
|
||||||
|
|
||||||
mod cli;
|
use crate::cli::Cli;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
|
@ -18,7 +19,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
let args = Cli::parse();
|
let args = Cli::parse();
|
||||||
|
|
||||||
// if enabled start WebSocket server
|
// if enabled start WebSocket server
|
||||||
if !args.ws_disable {
|
if args.ws_enable {
|
||||||
tokio::spawn(start_ws_server(
|
tokio::spawn(start_ws_server(
|
||||||
args.host.clone(),
|
args.host.clone(),
|
||||||
args.ws_port,
|
args.ws_port,
|
||||||
|
@ -34,10 +35,10 @@ async fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
/// Start tcp server
|
/// Start tcp server
|
||||||
async fn start_tcp_server(host: String, port: String) -> anyhow::Result<()> {
|
async fn start_tcp_server(host: String, port: String) -> anyhow::Result<()> {
|
||||||
// listen Tcp server
|
// listen TCP server
|
||||||
let listener = TcpListener::bind(format!("{host}:{port}")).await?;
|
let listener = TcpListener::bind(format!("{host}:{port}")).await?;
|
||||||
|
|
||||||
info!("Tcp server started at: {}", listener.local_addr()?);
|
info!("TCP server started at: {}", listener.local_addr()?);
|
||||||
|
|
||||||
// load plugins, commands and events
|
// load plugins, commands and events
|
||||||
let plugin_manager = loader()?;
|
let plugin_manager = loader()?;
|
||||||
|
@ -50,9 +51,7 @@ async fn start_tcp_server(host: String, port: String) -> anyhow::Result<()> {
|
||||||
// handle client connection in new thread
|
// handle client connection in new thread
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
// get ip address of the client
|
// get ip address of the client
|
||||||
let ip = client
|
let ip = client.peer_addr().expect("failed to get peer address");
|
||||||
.peer_addr()
|
|
||||||
.expect("failed to get peer address");
|
|
||||||
|
|
||||||
if let Err(e) = handle_connection(client, plugin_manager).await {
|
if let Err(e) = handle_connection(client, plugin_manager).await {
|
||||||
error!("Client {ip}: {e}")
|
error!("Client {ip}: {e}")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//! Plugins loader
|
//! Plugins loader
|
||||||
//!
|
//!
|
||||||
//! # Writing a plugins
|
//! # Writing plugins
|
||||||
//!
|
//!
|
||||||
//! Create a new project `cargo new --lib plugin`
|
//! Create a new project `cargo new --lib plugin`
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::net::SocketAddr;
|
||||||
|
|
||||||
use tokio::{
|
use tokio::{
|
||||||
io::{self, AsyncReadExt, AsyncWriteExt},
|
io::{self, AsyncReadExt, AsyncWriteExt},
|
||||||
net::{TcpStream},
|
net::TcpStream,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Max size of a TCP packet
|
/// Max size of a TCP packet
|
||||||
|
@ -30,10 +30,15 @@ impl Client {
|
||||||
let len = self.stream.read(&mut buf).await?;
|
let len = self.stream.read(&mut buf).await?;
|
||||||
|
|
||||||
// select only used bytes from the buffer
|
// select only used bytes from the buffer
|
||||||
let recv_buf = &buf[0..len];
|
let buf = &buf[0..len];
|
||||||
|
|
||||||
// encode buffer (&[u8]) to a String
|
// encode buffer (&[u8]) to a String
|
||||||
let decoded = String::from_utf8(recv_buf.to_vec())?;
|
let mut decoded = String::from_utf8(buf.to_vec())?;
|
||||||
|
|
||||||
|
// remove new line characters
|
||||||
|
while decoded.ends_with("\n") || decoded.ends_with("\r") {
|
||||||
|
decoded.pop();
|
||||||
|
}
|
||||||
|
|
||||||
Ok(decoded)
|
Ok(decoded)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue