@ -27,6 +27,7 @@ import io.rsocket.transport.netty.client.TcpClientTransport;
import io.rsocket.transport.netty.client.WebsocketClientTransport ;
import io.rsocket.transport.netty.client.WebsocketClientTransport ;
import reactor.core.publisher.Mono ;
import reactor.core.publisher.Mono ;
import org.springframework.lang.Nullable ;
import org.springframework.util.MimeType ;
import org.springframework.util.MimeType ;
/ * *
/ * *
@ -39,6 +40,9 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
private List < Consumer < RSocketFactory . ClientRSocketFactory > > factoryConfigurers = new ArrayList < > ( ) ;
private List < Consumer < RSocketFactory . ClientRSocketFactory > > factoryConfigurers = new ArrayList < > ( ) ;
@Nullable
private RSocketStrategies strategies ;
private List < Consumer < RSocketStrategies . Builder > > strategiesConfigurers = new ArrayList < > ( ) ;
private List < Consumer < RSocketStrategies . Builder > > strategiesConfigurers = new ArrayList < > ( ) ;
@ -48,6 +52,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
return this ;
return this ;
}
}
@Override
public RSocketRequester . Builder rsocketStrategies ( @Nullable RSocketStrategies strategies ) {
this . strategies = strategies ;
return this ;
}
@Override
@Override
public RSocketRequester . Builder rsocketStrategies ( Consumer < RSocketStrategies . Builder > configurer ) {
public RSocketRequester . Builder rsocketStrategies ( Consumer < RSocketStrategies . Builder > configurer ) {
this . strategiesConfigurers . add ( configurer ) ;
this . strategiesConfigurers . add ( configurer ) ;
@ -55,28 +65,54 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
}
}
@Override
@Override
public Mono < RSocketRequester > connectTcp ( String host , int port , MimeType dataMimeType ) {
public Mono < RSocketRequester > connectTcp ( String host , int port ) {
return connect ( TcpClientTransport . create ( host , port ) , dataMimeType ) ;
return connect ( TcpClientTransport . create ( host , port ) ) ;
}
}
@Override
@Override
public Mono < RSocketRequester > connectWebSocket ( URI uri , MimeType dataMimeType ) {
public Mono < RSocketRequester > connectWebSocket ( URI uri ) {
return connect ( WebsocketClientTransport . create ( uri ) , dataMimeType ) ;
return connect ( WebsocketClientTransport . create ( uri ) ) ;
}
}
@Override
@Override
public Mono < RSocketRequester > connect ( ClientTransport transport , MimeType dataMimeType ) {
public Mono < RSocketRequester > connect ( ClientTransport transport ) {
return Mono . defer ( ( ) - > {
return Mono . defer ( ( ) - > {
String mimeType = dataMimeType . toString ( ) ;
RSocketStrategies strategies = getRSocketStrategies ( ) ;
RSocketFactory . ClientRSocketFactory factory = RSocketFactory . connect ( ) . dataMimeType ( mimeType ) ;
MimeType dataMimeType = getDefaultDataMimeType ( strategies ) ;
this . factoryConfigurers . forEach ( configurer - > configurer . accept ( factory ) ) ;
RSocketStrategies . Builder builder = RSocketStrategies . builder ( ) ;
RSocketFactory . ClientRSocketFactory factory = RSocketFactory . connect ( ) ;
this . strategiesConfigurers . forEach ( configurer - > configurer . accept ( builder ) ) ;
if ( dataMimeType ! = null ) {
factory . dataMimeType ( dataMimeType . toString ( ) ) ;
}
this . factoryConfigurers . forEach ( configurer - > configurer . accept ( factory ) ) ;
return factory . transport ( transport ) . start ( )
return factory . transport ( transport ) . start ( )
. map ( rsocket - > RSocketRequester . create ( rsocket , dataMimeType , builder . build ( ) ) ) ;
. map ( rsocket - > RSocketRequester . create ( rsocket , dataMimeType , strategies ) ) ;
} ) ;
} ) ;
}
}
private RSocketStrategies getRSocketStrategies ( ) {
if ( this . strategiesConfigurers . isEmpty ( ) ) {
return this . strategies ! = null ? this . strategies : RSocketStrategies . builder ( ) . build ( ) ;
}
RSocketStrategies . Builder strategiesBuilder = this . strategies ! = null ?
this . strategies . mutate ( ) : RSocketStrategies . builder ( ) ;
this . strategiesConfigurers . forEach ( configurer - > configurer . accept ( strategiesBuilder ) ) ;
return strategiesBuilder . build ( ) ;
}
@Nullable
private MimeType getDefaultDataMimeType ( RSocketStrategies strategies ) {
return strategies . encoders ( ) . stream ( )
. flatMap ( encoder - > encoder . getEncodableMimeTypes ( ) . stream ( ) )
. filter ( MimeType : : isConcrete )
. findFirst ( )
. orElseGet ( ( ) - >
strategies . decoders ( ) . stream ( )
. flatMap ( encoder - > encoder . getDecodableMimeTypes ( ) . stream ( ) )
. filter ( MimeType : : isConcrete )
. findFirst ( )
. orElse ( null ) ) ;
}
}
}