@@ -42,15 +42,17 @@ pub struct InternalListenerHandle {
4242 pub name : String ,
4343 pub connection_sender : mpsc:: UnboundedSender < InternalConnectionPair > ,
4444 listener_ref : Weak < ( ) > ,
45+ buffer_size_kb : Option < u32 > ,
4546}
4647
4748impl InternalListenerHandle {
4849 pub fn new (
4950 name : String ,
5051 connection_sender : mpsc:: UnboundedSender < InternalConnectionPair > ,
5152 listener_ref : Weak < ( ) > ,
53+ buffer_size_kb : Option < u32 > ,
5254 ) -> Self {
53- Self { name, connection_sender, listener_ref }
55+ Self { name, connection_sender, listener_ref, buffer_size_kb }
5456 }
5557
5658 pub fn is_alive ( & self ) -> bool {
@@ -64,7 +66,7 @@ impl InternalListenerHandle {
6466
6567 let metadata = InternalConnectionMetadata {
6668 listener_name : self . name . clone ( ) ,
67- buffer_size_kb : None ,
69+ buffer_size_kb : self . buffer_size_kb ,
6870 created_at : Instant :: now ( ) ,
6971 endpoint_id,
7072 } ;
@@ -185,12 +187,13 @@ impl InternalConnectionFactory {
185187 pub async fn register_listener (
186188 & self ,
187189 name : String ,
190+ buffer_size_kb : Option < u32 > ,
188191 ) -> Result < ( InternalListenerHandle , mpsc:: UnboundedReceiver < InternalConnectionPair > , Arc < ( ) > ) > {
189192 let ( connection_tx, connection_rx) = mpsc:: unbounded_channel ( ) ;
190193 let listener_ref = Arc :: new ( ( ) ) ;
191194 let weak_ref = Arc :: downgrade ( & listener_ref) ;
192195
193- let handle = InternalListenerHandle :: new ( name. clone ( ) , connection_tx, weak_ref) ;
196+ let handle = InternalListenerHandle :: new ( name. clone ( ) , connection_tx, weak_ref, buffer_size_kb ) ;
194197
195198 let mut listeners = self . listeners . write ( ) . await ;
196199
@@ -337,8 +340,12 @@ impl AsyncWrite for InternalStreamWrapper {
337340 }
338341}
339342
343+ const DEFAULT_BUFFER_SIZE : usize = 8192 ;
344+
340345fn create_internal_connection_pair ( metadata : InternalConnectionMetadata ) -> ( Arc < InternalStream > , Arc < InternalStream > ) {
341- let ( upstream_io, downstream_io) = tokio:: io:: duplex ( 1024 ) ;
346+ let buffer_size = metadata. buffer_size_kb . map ( |kb| ( kb as usize ) * 1024 ) . unwrap_or ( DEFAULT_BUFFER_SIZE ) ;
347+
348+ let ( upstream_io, downstream_io) = tokio:: io:: duplex ( buffer_size) ;
342349
343350 let upstream = Arc :: new ( InternalStream :: new ( metadata. clone ( ) , upstream_io) ) ;
344351 let downstream = Arc :: new ( InternalStream :: new ( metadata, downstream_io) ) ;
@@ -368,22 +375,22 @@ mod tests {
368375 async fn test_listener_registration ( ) {
369376 let factory = InternalConnectionFactory :: new ( ) ;
370377
371- let result = factory. register_listener ( "test_listener" . to_string ( ) ) . await ;
378+ let result = factory. register_listener ( "test_listener" . to_string ( ) , None ) . await ;
372379 assert ! ( result. is_ok( ) ) ;
373380 let ( _handle, _rx, _listener_ref) = result. unwrap ( ) ;
374381
375382 let stats = factory. get_stats ( ) . await ;
376383 assert_eq ! ( stats. active_listeners, 1 ) ;
377384
378- let result = factory. register_listener ( "test_listener" . to_string ( ) ) . await ;
385+ let result = factory. register_listener ( "test_listener" . to_string ( ) , None ) . await ;
379386 assert ! ( result. is_err( ) ) ;
380387 }
381388
382389 #[ tokio:: test]
383390 async fn test_listener_unregistration ( ) {
384391 let factory = InternalConnectionFactory :: new ( ) ;
385392
386- let ( _handle, _rx, _listener_ref) = factory. register_listener ( "test_listener" . to_string ( ) ) . await . unwrap ( ) ;
393+ let ( _handle, _rx, _listener_ref) = factory. register_listener ( "test_listener" . to_string ( ) , None ) . await . unwrap ( ) ;
387394 let result = factory. unregister_listener ( "test_listener" ) . await ;
388395 assert ! ( result. is_ok( ) ) ;
389396
@@ -406,7 +413,7 @@ mod tests {
406413 async fn test_listener_lifecycle ( ) {
407414 let factory = InternalConnectionFactory :: new ( ) ;
408415
409- let ( handle, _rx, _listener_ref) = factory. register_listener ( "test_listener" . to_string ( ) ) . await . unwrap ( ) ;
416+ let ( handle, _rx, _listener_ref) = factory. register_listener ( "test_listener" . to_string ( ) , None ) . await . unwrap ( ) ;
410417
411418 assert ! ( factory. is_listener_active( "test_listener" ) . await ) ;
412419 assert ! ( handle. is_alive( ) ) ;
@@ -423,8 +430,8 @@ mod tests {
423430 let listeners = factory. list_listeners ( ) . await ;
424431 assert ! ( listeners. is_empty( ) ) ;
425432
426- let ( _handle1, _rx1, _listener_ref1) = factory. register_listener ( "listener1" . to_string ( ) ) . await . unwrap ( ) ;
427- let ( _handle2, _rx2, _listener_ref2) = factory. register_listener ( "listener2" . to_string ( ) ) . await . unwrap ( ) ;
433+ let ( _handle1, _rx1, _listener_ref1) = factory. register_listener ( "listener1" . to_string ( ) , None ) . await . unwrap ( ) ;
434+ let ( _handle2, _rx2, _listener_ref2) = factory. register_listener ( "listener2" . to_string ( ) , None ) . await . unwrap ( ) ;
428435
429436 let listeners = factory. list_listeners ( ) . await ;
430437 assert_eq ! ( listeners. len( ) , 2 ) ;
@@ -438,4 +445,27 @@ mod tests {
438445 let stats = factory. get_stats ( ) . await ;
439446 assert_eq ! ( stats. max_pooled_connections, 0 ) ;
440447 }
448+
449+ #[ tokio:: test]
450+ async fn test_buffer_size_configuration ( ) {
451+ let metadata_default = InternalConnectionMetadata {
452+ listener_name : "test" . to_string ( ) ,
453+ buffer_size_kb : None ,
454+ created_at : Instant :: now ( ) ,
455+ endpoint_id : None ,
456+ } ;
457+ let ( upstream, downstream) = create_internal_connection_pair ( metadata_default) ;
458+ assert ! ( upstream. is_active( ) ) ;
459+ assert ! ( downstream. is_active( ) ) ;
460+
461+ let metadata_custom = InternalConnectionMetadata {
462+ listener_name : "test" . to_string ( ) ,
463+ buffer_size_kb : Some ( 4 ) ,
464+ created_at : Instant :: now ( ) ,
465+ endpoint_id : None ,
466+ } ;
467+ let ( upstream_custom, downstream_custom) = create_internal_connection_pair ( metadata_custom) ;
468+ assert ! ( upstream_custom. is_active( ) ) ;
469+ assert ! ( downstream_custom. is_active( ) ) ;
470+ }
441471}
0 commit comments