From 559bd03de3413563c8016fe183a3c6b72b007d89 Mon Sep 17 00:00:00 2001 From: TQ Hirsch Date: Sun, 19 Nov 2023 01:37:39 +0100 Subject: [PATCH] Implemented script reloading --- Cargo.lock | 10 ++++++++++ Cargo.toml | 2 +- src/main.rs | 12 +++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f031a65..1851b69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1242,6 +1242,15 @@ dependencies = [ "serde", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "slab" version = "0.4.9" @@ -1433,6 +1442,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", + "signal-hook-registry", "socket2 0.5.5", "tokio-macros", "windows-sys", diff --git a/Cargo.toml b/Cargo.toml index 5479102..1fb8503 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ anyhow = "1" fern = "0.6.2" log = "0.4.20" structopt = "0.3" -tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "rt"] } +tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "rt", "signal"] } tokio-util = { version = "0.7.10", features = ["io", "io-util", "rt", "compat"] } mlua = { version = "0.9.1", features = ["luau-jit", "vendored", "async", "send"] } reqwest = { version = "0.11.22", features = ["stream"] } diff --git a/src/main.rs b/src/main.rs index 20b03f4..93c5749 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use std::net::{Ipv4Addr, Ipv6Addr}; use std::path::{Path, PathBuf}; use anyhow::anyhow; use structopt::StructOpt; +use tokio::signal::unix::SignalKind; mod handler; mod engine; @@ -62,7 +63,16 @@ async fn main() -> anyhow::Result<()> { engine_impl.load_script(opts.script.clone()).await?; local_set.spawn_local(engine_impl.run()); - + { + let engine = engine.clone(); + let script = opts.script.clone(); + let mut hup_stream = tokio::signal::unix::signal(SignalKind::hangup())?; + local_set.spawn_local(async move { + while let Some(_) = hup_stream.recv().await { + engine.load_script(script.clone()).await.ok(); + } + }); + } let handler = handler::Handler::new( engine.clone(), opts.serve.as_ref()