jetkvm_control/
lua_engine.rs

1#![cfg(feature = "lua")]
2// jetkvm_control/src/lua_engine.rs
3
4use anyhow::Result as AnyResult;
5use mlua::prelude::*;
6use std::sync::Arc;
7use tokio::sync::Mutex;
8use tokio::time::Duration;
9
10use crate::jetkvm_control_svr_client;
11use crate::jetkvm_rpc_client::JetKvmRpcClient;
12use crate::keyboard;
13use crate::mouse;
14
15/// LuaEngine encapsulates an mlua::Lua instance and a shared RPC client.
16/// It registers built-in functions (such as keyboard and mouse functions) so that Lua scripts can trigger RPC calls.
17pub struct LuaEngine {
18    lua: Lua,
19    client: Arc<Mutex<JetKvmRpcClient>>,
20}
21
22impl LuaEngine {
23    /// Creates a new LuaEngine given a shared RPC client.
24    pub fn new(client: Arc<Mutex<JetKvmRpcClient>>) -> Self {
25        let lua = Lua::new();
26        Self { lua, client }
27    }
28
29    pub fn register_delay(lua: &Lua) -> LuaResult<()> {
30        let delay_fn = lua.create_function(|_, millis: u64| {
31            std::thread::sleep(Duration::from_millis(millis)); // ⬅️ Now blocking
32            Ok(())
33        })?;
34        lua.globals().set("delay", delay_fn)?;
35        Ok(())
36        /* let delay_fn = lua.create_async_function(|_, millis: u64| async move {
37            sleep(Duration::from_millis(millis)).await;
38            Ok(())
39        })?;
40        lua.globals().set("delay", delay_fn)?;
41        Ok(())
42        */
43    }
44
45    /// Registers built-in functions from other modules (e.g., keyboard and mouse) to the Lua context.
46    pub fn register_builtin_functions(&self) -> LuaResult<()> {
47        keyboard::register_lua(&self.lua, self.client.clone())?;
48        mouse::register_lua(&self.lua, self.client.clone())?;
49        jetkvm_control_svr_client::register_lua(&self.lua)?;
50        Self::register_delay(&self.lua)?;
51        Ok(())
52    }
53
54    /// Asynchronously executes the provided Lua script.
55    pub async fn exec_script(&self, script: &str) -> AnyResult<()> {
56        self.lua
57            .load(script)
58            .exec_async()
59            .await
60            .map_err(|e| e.into())
61    }
62
63    /// Provides access to the underlying Lua instance.
64    pub fn lua(&self) -> &Lua {
65        &self.lua
66    }
67}