v1.1.0 — Gzip canvas compression + throttled sends
All checks were successful
CI / ci (push) Successful in 6m29s

- Canvas snapshots gzip-compressed before sending: 1MB raw -> ~1-5KB
  for a mostly-white canvas, ~100-500KB for a busy one
- Semaphore throttles concurrent canvas sends (default 20) to prevent
  memory spikes during connection bursts
- Frontend decompresses gzip via browser DecompressionStream API
- New config: MAX_CONCURRENT_CANVAS_SENDS (default 20)
- Added flate2 dependency for gzip encoding
This commit is contained in:
2026-08-18 02:28:47 +02:00
parent 31f0fce7a9
commit 3fbae1bd95
9 changed files with 113 additions and 20 deletions

62
Cargo.lock generated
View File

@@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "adler2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "allocator-api2"
version = "0.2.21"
@@ -10,7 +16,7 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "api-types"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"domain",
"serde",
@@ -18,7 +24,7 @@ dependencies = [
[[package]]
name = "application"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"domain",
"thiserror 2.0.20",
@@ -160,7 +166,7 @@ dependencies = [
[[package]]
name = "canvas-file"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"config",
"domain",
@@ -186,14 +192,14 @@ dependencies = [
[[package]]
name = "config"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"thiserror 2.0.20",
]
[[package]]
name = "config-env"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"config",
]
@@ -222,6 +228,15 @@ dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.19"
@@ -322,7 +337,7 @@ dependencies = [
[[package]]
name = "domain"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"thiserror 2.0.20",
]
@@ -385,6 +400,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "flate2"
version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "fnv"
version = "1.0.7"
@@ -634,7 +659,7 @@ dependencies = [
[[package]]
name = "http-axum"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"axum",
"config",
@@ -841,6 +866,16 @@ dependencies = [
"unicase",
]
[[package]]
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
"simd-adler32",
]
[[package]]
name = "mio"
version = "1.2.2"
@@ -1208,7 +1243,7 @@ dependencies = [
[[package]]
name = "server"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"application",
"axum",
@@ -1275,6 +1310,12 @@ dependencies = [
"libc",
]
[[package]]
name = "simd-adler32"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
[[package]]
name = "slab"
version = "0.4.9"
@@ -1305,7 +1346,7 @@ dependencies = [
[[package]]
name = "socketio"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"api-types",
"application",
@@ -1823,11 +1864,12 @@ dependencies = [
[[package]]
name = "websocket"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"application",
"axum",
"domain",
"flate2",
"futures",
"serde",
"serde_json",