diff --git a/src/lune/builtins/net/client.rs b/src/lune/builtins/net/client.rs index 2120c58..23636ff 100644 --- a/src/lune/builtins/net/client.rs +++ b/src/lune/builtins/net/client.rs @@ -5,6 +5,8 @@ use mlua::prelude::*; use hyper::{header::HeaderName, http::HeaderValue, HeaderMap}; use reqwest::{IntoUrl, Method, RequestBuilder}; +const REGISTRY_KEY: &str = "NetClient"; + pub struct NetClientBuilder { builder: reqwest::ClientBuilder, } @@ -44,6 +46,35 @@ impl NetClient { pub fn request(&self, method: Method, url: U) -> RequestBuilder { self.0.request(method, url) } + + pub fn into_registry(self, lua: &Lua) { + lua.set_named_registry_value(REGISTRY_KEY, self) + .expect("Failed to store NetClient in lua registry"); + } + + pub fn from_registry(lua: &Lua) -> Self { + lua.named_registry_value(REGISTRY_KEY) + .expect("Failed to get NetClient from lua registry") + } } impl LuaUserData for NetClient {} + +impl<'lua> FromLua<'lua> for NetClient { + fn from_lua(value: LuaValue<'lua>, _: &'lua Lua) -> LuaResult { + if let LuaValue::UserData(ud) = value { + if let Ok(ctx) = ud.borrow::() { + return Ok(ctx.clone()); + } + } + unreachable!("NetClient should only be used from registry") + } +} + +impl<'lua> From<&'lua Lua> for NetClient { + fn from(value: &'lua Lua) -> Self { + value + .named_registry_value(REGISTRY_KEY) + .expect("Missing require context in lua registry") + } +} diff --git a/src/lune/builtins/net/mod.rs b/src/lune/builtins/net/mod.rs index 1fe2da7..105a005 100644 --- a/src/lune/builtins/net/mod.rs +++ b/src/lune/builtins/net/mod.rs @@ -29,6 +29,10 @@ use server::{NetLocalExec, NetService}; use websocket::NetWebSocket; pub fn create(lua: &'static Lua) -> LuaResult { + NetClientBuilder::new() + .headers(&[("User-Agent", create_user_agent_header())])? + .build()? + .into_registry(lua); TableBuilder::new(lua)? .with_function("jsonEncode", net_json_encode)? .with_function("jsonDecode", net_json_decode)? @@ -64,20 +68,8 @@ async fn net_request<'lua>(lua: &'lua Lua, config: RequestConfig<'lua>) -> LuaRe where 'lua: 'static, // FIXME: Get rid of static lifetime bound here { - // Create a reusable client for performing our - // web requests and store it in the lua registry, - // allowing us to reuse headers and internal structs - let client = match lua.app_data_ref::() { - Some(client) => client, - None => { - let client = NetClientBuilder::new() - .headers(&[("User-Agent", create_user_agent_header())])? - .build()?; - lua.set_app_data(client); - lua.app_data_ref::().unwrap() - } - }; // Create and send the request + let client = NetClient::from_registry(lua); let mut request = client.request(config.method, &config.url); for (query, value) in config.query { request = request.query(&[(query.to_str()?, value.to_str()?)]); diff --git a/src/lune/globals/require/context.rs b/src/lune/globals/require/context.rs index 3e917e3..e27a483 100644 --- a/src/lune/globals/require/context.rs +++ b/src/lune/globals/require/context.rs @@ -19,8 +19,6 @@ use crate::lune::{ scheduler::{IntoLuaThread, Scheduler}, }; -const REGISTRY_KEY: &str = "RequireContext"; - /** Context containing cached results for all `require` operations. @@ -310,24 +308,3 @@ impl<'lua> RequireContext<'lua> { result } } - -impl<'lua> LuaUserData for RequireContext<'lua> {} - -impl<'lua> FromLua<'lua> for RequireContext<'lua> { - fn from_lua(value: LuaValue<'lua>, _: &'lua Lua) -> LuaResult { - if let LuaValue::UserData(ud) = value { - if let Ok(ctx) = ud.borrow::() { - return Ok(ctx.clone()); - } - } - unreachable!("RequireContext should only be used from registry") - } -} - -impl<'lua> From<&'lua Lua> for RequireContext<'lua> { - fn from(value: &'lua Lua) -> Self { - value - .named_registry_value(REGISTRY_KEY) - .expect("Missing require context in lua registry") - } -}