All Downloads are FREE. Search and download functionalities are using the official Maven repository.

netflix.karyon.transport.http.websockets.KaryonWebSocketsModule Maven / Gradle / Ivy

package netflix.karyon.transport.http.websockets;

import com.google.inject.Key;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.multibindings.MapBinder;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.reactivex.netty.channel.ConnectionHandler;
import io.reactivex.netty.server.RxServer;
import netflix.karyon.transport.AbstractServerModule;
import netflix.karyon.transport.http.websockets.KaryonWebSocketsModule.WebSocketsServerConfigBuilder;

import static netflix.karyon.utils.TypeUtils.keyFor;

/**
 * @author Tomasz Bak
 */
public abstract class KaryonWebSocketsModule extends
        AbstractServerModule {

    protected final Key> connectionHandlerKey;
    protected final Key> serverKey;


    protected KaryonWebSocketsModule(String moduleName, Class iType, Class oType) {
        super(moduleName, iType, oType);
        connectionHandlerKey = keyFor(ConnectionHandler.class, iType, oType, nameAnnotation);
        serverKey = keyFor(RxServer.class, iType, oType, nameAnnotation);
    }

    @Override
    protected void configure() {
        configureServer();
        bind(serverConfigKey).toInstance(serverConfigBuilder.build());
        MapBinder.newMapBinder(binder(), String.class, RxServer.class).addBinding(nameAnnotation.value()).toProvider(
                new WebSocketsRxServerProvider>(nameAnnotation.value(), iType, oType)
        ).asEagerSingleton();
    }

    @Override
    protected WebSocketsServerConfigBuilder newServerConfigBuilder() {
        return new WebSocketsServerConfigBuilder();
    }

    public LinkedBindingBuilder> bindConnectionHandler() {
        return bind(connectionHandlerKey);
    }

    public static class WebSocketsServerConfig extends AbstractServerModule.ServerConfig {
        private final boolean messageAggregator;

        public WebSocketsServerConfig(int port, boolean messageAggregator) {
            super(port);
            this.messageAggregator = messageAggregator;
        }

        public boolean isMessageAggregator() {
            return messageAggregator;
        }
    }

    public static class WebSocketsServerConfigBuilder extends AbstractServerModule.ServerConfigBuilder {

        protected boolean messageAggregator;

        public WebSocketsServerConfigBuilder withMessageAggregator(boolean messageAggregator) {
            this.messageAggregator = messageAggregator;
            return this;
        }

        @Override
        public WebSocketsServerConfig build() {
            return new WebSocketsServerConfig(port, messageAggregator);
        }
    }
}