package cc.blynk.server.application;
import cc.blynk.server.Holder;
import cc.blynk.server.application.handlers.main.AppChannelStateHandler;
import cc.blynk.server.application.handlers.main.auth.AppLoginHandler;
import cc.blynk.server.application.handlers.main.auth.GetServerHandler;
import cc.blynk.server.application.handlers.main.auth.RegisterHandler;
import cc.blynk.server.application.handlers.sharing.auth.AppShareLoginHandler;
import cc.blynk.server.core.BaseServer;
import cc.blynk.server.core.protocol.handlers.decoders.MessageDecoder;
import cc.blynk.server.core.protocol.handlers.encoders.MessageEncoder;
import cc.blynk.server.handlers.common.UserNotLoggedHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.ReadTimeoutHandler;
/**
* Class responsible for handling all Application connections and netty pipeline initialization.
*
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/1/2015.
*/
public class AppServer extends BaseServer {
private final ChannelInitializer<SocketChannel> channelInitializer;
public AppServer(Holder holder) {
super(holder.props.getProperty("listen.address"), holder.props.getIntProperty("app.ssl.port"), holder.transportTypeHolder);
final int appTimeoutSecs = holder.limits.APP_IDLE_TIMEOUT;
final String[] loadBalancingIPs = holder.props.getCommaSeparatedValueAsArray("load.balancing.ips");
final AppChannelStateHandler appChannelStateHandler = new AppChannelStateHandler(holder.sessionDao);
final RegisterHandler registerHandler = new RegisterHandler(holder);
final AppLoginHandler appLoginHandler = new AppLoginHandler(holder);
final AppShareLoginHandler appShareLoginHandler = new AppShareLoginHandler(holder);
final UserNotLoggedHandler userNotLoggedHandler = new UserNotLoggedHandler();
final GetServerHandler getServerHandler = new GetServerHandler(holder, loadBalancingIPs);
log.debug("app.socket.idle.timeout = {}", appTimeoutSecs);
this.channelInitializer = new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
final ChannelPipeline pipeline = ch.pipeline();
if (appTimeoutSecs > 0) {
pipeline.addLast("AReadTimeout", new ReadTimeoutHandler(appTimeoutSecs));
}
pipeline.addLast("ASSL", holder.sslContextHolder.sslCtx.newHandler(ch.alloc()))
.addLast("AChannelState", appChannelStateHandler)
.addLast("AMessageDecoder", new MessageDecoder(holder.stats))
.addLast("AMessageEncoder", new MessageEncoder(holder.stats))
.addLast("AGetServer", getServerHandler)
.addLast("ARegister", registerHandler)
.addLast("ALogin", appLoginHandler)
.addLast("AShareLogin", appShareLoginHandler)
.addLast("ANotLogged", userNotLoggedHandler);
}
};
}
@Override
public ChannelInitializer<SocketChannel> getChannelInitializer() {
return channelInitializer;
}
@Override
protected String getServerName() {
return "Application";
}
@Override
public void close() {
System.out.println("Shutting down Application SSL server...");
super.close();
}
}