@@ -18,6 +18,7 @@ use clap::Parser;
1818use dotenvy:: dotenv;
1919use metrics_exporter_prometheus:: PrometheusBuilder ;
2020use rate_limit:: RedisRateLimit ;
21+ use std:: io:: Write ;
2122use std:: net:: SocketAddr ;
2223use std:: sync:: Arc ;
2324use tokio:: signal:: unix:: { signal, SignalKind } ;
@@ -68,6 +69,13 @@ struct Args {
6869 help = "Maximum number of concurrently connected clients"
6970 ) ]
7071 per_ip_connections_limit : usize ,
72+ #[ arg(
73+ long,
74+ env,
75+ default_value = "false" ,
76+ help = "Enable brotli compression on messages to downstream clients"
77+ ) ]
78+ enable_compression : bool ,
7179
7280 #[ arg(
7381 long,
@@ -208,7 +216,20 @@ async fn main() {
208216 . active_connections
209217 . set ( ( send. receiver_count ( ) - 1 ) as f64 ) ;
210218
211- match send. send ( data) {
219+ let message_data = if args. enable_compression {
220+ let data_bytes = data. as_bytes ( ) ;
221+ let mut compressed_data_bytes = Vec :: new ( ) ;
222+ {
223+ let mut compressor =
224+ brotli:: CompressorWriter :: new ( & mut compressed_data_bytes, 4096 , 5 , 22 ) ;
225+ compressor. write_all ( data_bytes) . unwrap ( ) ;
226+ }
227+ compressed_data_bytes
228+ } else {
229+ data. into_bytes ( )
230+ } ;
231+
232+ match send. send ( message_data) {
212233 Ok ( _) => ( ) ,
213234 Err ( e) => error ! ( message = "failed to send data" , error = e. to_string( ) ) ,
214235 }
0 commit comments