diff --git a/crates/lune-std-net/src/lib.rs b/crates/lune-std-net/src/lib.rs index a800e9b..f4c8e06 100644 --- a/crates/lune-std-net/src/lib.rs +++ b/crates/lune-std-net/src/lib.rs @@ -10,7 +10,7 @@ pub(crate) mod url; use self::{ client::ws_stream::WsStream, - server::{config::ServeConfig, handle::ServeHandle}, + server::config::ServeConfig, shared::{request::Request, response::Response, websocket::Websocket}, }; @@ -50,8 +50,10 @@ async fn net_socket(_: Lua, url: String) -> LuaResult> { self::client::connect_websocket(url).await } -async fn net_serve(lua: Lua, (port, config): (u16, ServeConfig)) -> LuaResult { - self::server::serve(lua, port, config).await +async fn net_serve(lua: Lua, (port, config): (u16, ServeConfig)) -> LuaResult { + self::server::serve(lua.clone(), port, config) + .await? + .into_lua_table(lua) } fn net_url_encode( diff --git a/crates/lune-std-net/src/server/handle.rs b/crates/lune-std-net/src/server/handle.rs index 63bbb54..4f2f10c 100644 --- a/crates/lune-std-net/src/server/handle.rs +++ b/crates/lune-std-net/src/server/handle.rs @@ -8,6 +8,7 @@ use std::{ use async_channel::{unbounded, Receiver, Sender}; +use lune_utils::TableBuilder; use mlua::prelude::*; #[derive(Debug, Clone)] @@ -27,6 +28,27 @@ impl ServeHandle { }; (this, receiver) } + + // TODO: Remove this in the next major release to use colon/self + // based call syntax and userdata implementation below instead + pub fn into_lua_table(self, lua: Lua) -> LuaResult { + let shutdown = self.shutdown.clone(); + let sender = self.sender.clone(); + TableBuilder::new(lua)? + .with_value("ip", self.addr.ip().to_string())? + .with_value("port", self.addr.port())? + .with_function("stop", move |_, ()| { + if shutdown.load(Ordering::SeqCst) { + Err(LuaError::runtime("Server already stopped")) + } else { + shutdown.store(true, Ordering::SeqCst); + sender.try_send(()).ok(); + sender.close(); + Ok(()) + } + })? + .build() + } } impl LuaUserData for ServeHandle {