aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock57
-rw-r--r--server/replaytool/Cargo.toml1
-rw-r--r--server/replaytool/src/main.rs20
3 files changed, 75 insertions, 3 deletions
diff --git a/Cargo.lock b/Cargo.lock
index fd1b6eff..a7c11a81 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -82,6 +82,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
+name = "async-compression"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5"
+dependencies = [
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "zstd",
+ "zstd-safe",
+]
+
+[[package]]
name = "autocfg"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -134,6 +148,11 @@ name = "cc"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "066fce287b1d4eafef758e89e09d724a24808a9196fe9756b8ca90e86d0719a2"
+dependencies = [
+ "jobserver",
+ "libc",
+ "once_cell",
+]
[[package]]
name = "cfg-if"
@@ -454,6 +473,7 @@ name = "hurrycurry-replaytool"
version = "0.1.0"
dependencies = [
"anyhow",
+ "async-compression",
"clap",
"env_logger",
"futures-util",
@@ -510,6 +530,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
+name = "jobserver"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
name = "libc"
version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1305,3 +1334,31 @@ dependencies = [
"quote",
"syn",
]
+
+[[package]]
+name = "zstd"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.12+zstd.1.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
diff --git a/server/replaytool/Cargo.toml b/server/replaytool/Cargo.toml
index e6c1cc23..036c464b 100644
--- a/server/replaytool/Cargo.toml
+++ b/server/replaytool/Cargo.toml
@@ -14,5 +14,6 @@ tokio-tungstenite = { version = "0.23.1", features = ["native-tls"] }
futures-util = "0.3.30"
rand = "0.9.0-alpha.1"
clap = { version = "4.5.8", features = ["derive"] }
+async-compression = { version = "0.4.11", features = ["zstd", "tokio"] }
hurrycurry-protocol = { path = "../protocol" }
diff --git a/server/replaytool/src/main.rs b/server/replaytool/src/main.rs
index 9b9a9eb2..ee6a8def 100644
--- a/server/replaytool/src/main.rs
+++ b/server/replaytool/src/main.rs
@@ -16,6 +16,7 @@
*/
use anyhow::anyhow;
+use async_compression::tokio::{bufread::ZstdDecoder, write::ZstdEncoder};
use clap::Parser;
use futures_util::{SinkExt, StreamExt};
use hurrycurry_protocol::{PacketC, PacketS};
@@ -52,7 +53,7 @@ async fn main() -> anyhow::Result<()> {
match args {
Args::Record { url, output } => {
- let mut file = BufWriter::new(File::create(&output).await?);
+ let mut file = BufWriter::new(ZstdEncoder::new(File::create(&output).await?));
info!("connecting to {url:?}...");
let (mut sock, _) = tokio_tungstenite::connect_async(url).await?;
info!("starting recording.");
@@ -69,6 +70,9 @@ async fn main() -> anyhow::Result<()> {
}
};
debug!("<- {packet:?}");
+
+ let is_end = matches!(packet, PacketC::SetIngame { state: false, .. });
+
file.write_all(
format!(
"{}\n",
@@ -80,19 +84,29 @@ async fn main() -> anyhow::Result<()> {
)
.as_bytes(),
)
- .await?
+ .await?;
+
+ if is_end {
+ info!("stopping replay...");
+ break;
+ }
}
Message::Close(_) => break,
_ => (),
}
}
+ drop(file);
+ info!("done")
}
Args::Replay { input } => {
let ws_listener = TcpListener::bind("0.0.0.0:27032").await?;
info!("listening for websockets on {}", ws_listener.local_addr()?);
loop {
- let mut file = BufReader::new(File::open(&input).await?).lines();
+ let mut file =
+ BufReader::new(ZstdDecoder::new(BufReader::new(File::open(&input).await?)))
+ .lines();
+
let mut next_event =
serde_json::from_str::<Event>(&file.next_line().await?.ok_or(anyhow!("eof"))?)?;
let mut time = 0.;