From 571581767ec6f8a4c6b25619a99d267c658cde0f Mon Sep 17 00:00:00 2001 From: ErrorNoInternet Date: Fri, 14 Mar 2025 18:03:15 -0400 Subject: [PATCH] feat(lua): add timeout function --- src/lua/mod.rs | 14 ++++---------- src/lua/thread.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 src/lua/thread.rs diff --git a/src/lua/mod.rs b/src/lua/mod.rs index 1603fbb..7ddcce1 100644 --- a/src/lua/mod.rs +++ b/src/lua/mod.rs @@ -7,11 +7,12 @@ pub mod logging; pub mod nochatreports; pub mod player; pub mod system; +pub mod thread; pub mod vec3; use crate::{ListenerMap, build_info::built}; use mlua::{Lua, Table}; -use std::{io, time::Duration}; +use std::io; #[derive(Debug)] #[allow(dead_code)] @@ -33,19 +34,12 @@ pub fn register_globals( globals.set("GIT_COMMIT_HASH", built::GIT_COMMIT_HASH)?; globals.set("GIT_COMMIT_HASH_SHORT", built::GIT_COMMIT_HASH_SHORT)?; - globals.set( - "sleep", - lua.create_async_function(async |_, duration: u64| { - tokio::time::sleep(Duration::from_millis(duration)).await; - Ok(()) - })?, - )?; - block::register_globals(lua, globals)?; events::register_globals(lua, globals, event_listeners)?; logging::register_globals(lua, globals)?; nochatreports::register_globals(lua, globals)?; - system::register_globals(lua, globals) + system::register_globals(lua, globals)?; + thread::register_globals(lua, globals) } pub fn reload(lua: &Lua, sender: Option) -> Result<(), Error> { diff --git a/src/lua/thread.rs b/src/lua/thread.rs new file mode 100644 index 0000000..d8e5158 --- /dev/null +++ b/src/lua/thread.rs @@ -0,0 +1,27 @@ +use mlua::{Error, Function, Lua, Result, Table}; +use std::time::Duration; +use tokio::time::{sleep, timeout}; + +pub fn register_globals(lua: &Lua, globals: &Table) -> Result<()> { + globals.set( + "sleep", + lua.create_async_function(async |_, duration: u64| { + sleep(Duration::from_millis(duration)).await; + Ok(()) + })?, + )?; + + globals.set( + "timeout", + lua.create_async_function(async |_, (duration, function): (u64, Function)| { + timeout( + Duration::from_millis(duration), + function.call_async::<()>(()), + ) + .await + .map_err(Error::external) + })?, + )?; + + Ok(()) +}