NettyUtil class

Пакет: com.hypixel.hytale.server.core.io.netty

Файл: com/hypixel/hytale/server/core/io/netty/NettyUtil.java

Поля (41)

МодификаторыТипИмя
final HytaleLogger CONNECTION_EXCEPTION_LOGGER
public static final AttributeKey<NettyUtil.TimeoutContext> KEY
private static final AttributeKey<Long> LOGIN_START_KEY
private static final HytaleLogger LOGIN_TIMING_LOGGER
private final SocketProtocolFamily family
var0
HytaleLoggerBackend var0
int var1
SocketAddress var1
var1
var1
ScheduledFuture var1
NettyUtil.TimeoutContext var1
PlayerChannelHandler var2
ThreadFactory var2
CompletableFuture var2
Universe var2
NettyUtil.TimeoutContext var2
int var3
PacketHandler var3
var3
long var3
NettyUtil.TimeoutContext var3
byte[] var4
ChannelHandler var4
ByteBuf var5
PacketHandler var5
ScheduledFuture var5
String var5
NettyUtil.TimeoutContext var5
CompletableFuture var6
QuicStreamChannel var6
CompletableFuture var6
long var6
String var6
NettyUtil.NettyChannelConnection var7
CompletableFuture var7
Long var7
QuicChannel var8
io.netty.util.concurrent.ScheduledFuture var8
long var8

Методы (88)

МодификаторыВозвратСигнатура
abstract return new EpollEventLoopGroupreturn new EpollEventLoopGroup(var0, var2)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("TimeoutContext not initialized - this indicates a bug in the connection flow")
public ReflectiveChannelFactorypublic ReflectiveChannelFactory(@Nonnull Class<? extends T> var1, SocketProtocolFamily var2)
public record TimeoutContextrecord TimeoutContext(@Nonnull String stage, long connectionStartNs, @Nonnull String playerIdentifier)
public void clearPacketTimeoutpublic void clearPacketTimeout()
public void clearStageTimeoutpublic void clearStageTimeout()
private void closeprivate void close(boolean var1, int var2)
public Future<Void> closepublic Future<Void> close()
static void closeApplicationConnectionvoid closeApplicationConnection(@Nonnull Channel var0)
static void closeApplicationConnectionvoid closeApplicationConnection(@Nonnull Channel var0, @Nonnull QuicApplicationErrorCode var1)
static void closeApplicationConnectionvoid closeApplicationConnection(@Nonnull Channel var0, @Nonnull QuicApplicationErrorCode var1, @Nonnull FormattedMessage var2)
public void closeApplicationConnectionpublic void closeApplicationConnection()
public void closeApplicationConnectionpublic void closeApplicationConnection(@Nonnull QuicApplicationErrorCode var1)
public void closeApplicationConnectionpublic void closeApplicationConnection(@Nonnull QuicApplicationErrorCode var1, @Nonnull FormattedMessage var2)
abstract closeApplicationConnection closeApplicationConnection(var0, QuicApplicationErrorCode.NoError)
abstract closeApplicationConnection closeApplicationConnection(var0, var1)
static void closeConnectionvoid closeConnection(@Nonnull Channel var0)
public void closeConnectionpublic void closeConnection()
public void disconnectpublic void disconnect(@Nonnull FormattedMessage var1)
public boolean equalspublic boolean equals(Object var1)
public void executepublic void execute(Runnable var1)
public void flushpublic void flush()
static String formatLocalAddressString formatLocalAddress(Channel var0)
static String formatRemoteAddressString formatRemoteAddress(Channel var0)
public String formatRemoteAddresspublic String formatRemoteAddress()
public static NettyUtil.TimeoutContext getpublic static NettyUtil.TimeoutContext get(@Nonnull Channel var0)
public X509Certificate getClientCertificatepublic X509Certificate getClientCertificate()
abstract return getEventLoopGroupreturn getEventLoopGroup(0, var0)
public PacketStatsRecorder getPacketStatsRecorderpublic PacketStatsRecorder getPacketStatsRecorder()
public String getSimpleNamepublic String getSimpleName()
public String getSniHostnamepublic String getSniHostname()
public int hashCodepublic int hashCode()
if if(var0 instanceof QuicChannel var2)
if if(var0 instanceof QuicChannel var2)
if if(var3 > 1000)
if if(var0 instanceof QuicChannel var6)
if if(var4 != null)
if if(var4 instanceof PlayerChannelHandler var5)
if if(var0 instanceof QuicStreamChannel var6)
if if(var3 != null)
if if(var0 == 0)
if if(var0 instanceof QuicChannel var1)
if if(var0 instanceof QuicChannel var1)
if if(var0 instanceof QuicChannel var1)
if if(var2 != null)
if if(var1 == Level.OFF)
if if(this.channel instanceof QuicStreamChannel var2)
if if(this.channel instanceof QuicStreamChannel var3)
if if(this.channel instanceof QuicStreamChannel var3)
if if(var5 != null)
if if(var1 != null)
if if(var7 == null)
if if(this.channel instanceof QuicChannel var3)
if if(this == var1)
if if(var1 == null)
static void initvoid init()
public static void initpublic static void init(@Nonnull Channel var0, @Nonnull String var1, @Nonnull String var2)
protected void initChannelprotected void initChannel(@Nonnull Channel var1)
public void initTimeoutContextpublic void initTimeoutContext(@Nonnull String var1, @Nonnull String var2)
static void injectLoggervoid injectLogger(@Nonnull Channel var0)
abstract injectLogger injectLogger(var15)
public boolean isActivepublic boolean isActive()
static boolean isFromSameOriginboolean isFromSameOrigin(Channel var0, Channel var1)
public boolean isFromSameOriginpublic boolean isFromSameOrigin(ChannelConnection var1)
public boolean isWritablepublic boolean isWritable()
public SocketAddress localAddresspublic SocketAddress localAddress()
public void logConnectionTimingspublic void logConnectionTimings(@Nonnull String var1, @Nonnull Level var2)
public T newChannelpublic T newChannel()
public SocketAddress remoteAddresspublic SocketAddress remoteAddress()
static void setChannelHandlervoid setChannelHandler(@Nonnull Channel var0, @Nonnull PacketHandler var1)
public void setChannelHandlerpublic void setChannelHandler(@Nonnull ConnectionHandler var1)
abstract setChannelHandler setChannelHandler(var6, var4)
public void setPacketTimeoutpublic void setPacketTimeout(@Nonnull Duration var1)
public void setStageTimeoutpublic void setStageTimeout(@Nonnull String var1, @Nonnull Duration var2, @Nonnull BooleanSupplier var3, @Nonnull Runnable var4)
public CompletableFuture<Void> setupAuxiliaryChannelspublic CompletableFuture<Void> setupAuxiliaryChannels(@Nonnull ConnectionHandler var1, @Nonnull BiConsumer<NetworkChannel, ChannelConnection> var2)
public String toStringpublic String toString()
public String toStringpublic String toString()
static void uninjectLoggervoid uninjectLogger(@Nonnull Channel var0)
abstract uninjectLogger uninjectLogger(var7)
public static void updatepublic static void update(@Nonnull Channel var0, @Nonnull String var1, @Nonnull String var2)
public static void updatepublic static void update(@Nonnull Channel var0, @Nonnull String var1)
public void updateStreamPrioritypublic void updateStreamPriority(int var1, boolean var2)
public void updateTimeoutContextpublic void updateTimeoutContext(@Nonnull String var1, @Nonnull String var2)
public void updateTimeoutContextpublic void updateTimeoutContext(@Nonnull String var1)
public void writepublic void write(ToClientPacket var1)
public void writepublic void write(ToClientPacket[] var1)
public void writeAndFlushpublic void writeAndFlush(ToClientPacket var1)
public void writeAndFlushpublic void writeAndFlush(ToClientPacket[] var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.io.netty;

class="kw">import com.google.common.flogger.LazyArgs;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.backend.HytaleLoggerBackend;
class="kw">import com.hypixel.hytale.protocol.FormattedMessage;
class="kw">import com.hypixel.hytale.protocol.NetworkChannel;
class="kw">import com.hypixel.hytale.protocol.ToClientPacket;
class="kw">import com.hypixel.hytale.protocol.io.ChannelConnection;
class="kw">import com.hypixel.hytale.protocol.io.ConnectionHandler;
class="kw">import com.hypixel.hytale.protocol.io.ConnectionOrigin;
class="kw">import com.hypixel.hytale.protocol.io.PacketStatsRecorder;
class="kw">import com.hypixel.hytale.protocol.io.ServerListener;
class="kw">import com.hypixel.hytale.protocol.io.netty.PacketDecoder;
class="kw">import com.hypixel.hytale.protocol.io.netty.PacketEncoder;
class="kw">import com.hypixel.hytale.protocol.io.netty.ProtocolUtil;
class="kw">import com.hypixel.hytale.protocol.packets.connection.DisconnectType;
class="kw">import com.hypixel.hytale.protocol.packets.connection.QuicApplicationErrorCode;
class="kw">import com.hypixel.hytale.protocol.packets.connection.ServerDisconnect;
class="kw">import com.hypixel.hytale.server.core.io.PacketHandler;
class="kw">import com.hypixel.hytale.server.core.io.transport.QUICTransport;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.util.concurrent.ThreadUtil;
class="kw">import io.netty.buffer.ByteBuf;
class="kw">import io.netty.buffer.Unpooled;
class="kw">import io.netty.channel.Channel;
class="kw">import io.netty.channel.ChannelException;
class="kw">import io.netty.channel.ChannelFactory;
class="kw">import io.netty.channel.ChannelFuture;
class="kw">import io.netty.channel.ChannelFutureListener;
class="kw">import io.netty.channel.ChannelHandler;
class="kw">import io.netty.channel.ChannelInitializer;
class="kw">import io.netty.channel.EventLoopGroup;
class="kw">import io.netty.channel.ServerChannel;
class="kw">import io.netty.channel.epoll.Epoll;
class="kw">import io.netty.channel.epoll.EpollDatagramChannel;
class="kw">import io.netty.channel.epoll.EpollEventLoopGroup;
class="kw">import io.netty.channel.epoll.EpollServerSocketChannel;
class="kw">import io.netty.channel.kqueue.KQueue;
class="kw">import io.netty.channel.kqueue.KQueueDatagramChannel;
class="kw">import io.netty.channel.kqueue.KQueueEventLoopGroup;
class="kw">import io.netty.channel.kqueue.KQueueServerSocketChannel;
class="kw">import io.netty.channel.nio.NioEventLoopGroup;
class="kw">import io.netty.channel.socket.DatagramChannel;
class="kw">import io.netty.channel.socket.SocketProtocolFamily;
class="kw">import io.netty.channel.socket.nio.NioDatagramChannel;
class="kw">import io.netty.channel.socket.nio.NioServerSocketChannel;
class="kw">import io.netty.handler.codec.quic.QuicChannel;
class="kw">import io.netty.handler.codec.quic.QuicStreamChannel;
class="kw">import io.netty.handler.codec.quic.QuicStreamPriority;
class="kw">import io.netty.handler.codec.quic.QuicStreamType;
class="kw">import io.netty.handler.codec.quic.QuicTransportError;
class="kw">import io.netty.handler.logging.LogLevel;
class="kw">import io.netty.handler.logging.LoggingHandler;
class="kw">import io.netty.util.AttributeKey;
class="kw">import io.netty.util.internal.ObjectUtil;
class="kw">import io.netty.util.internal.StringUtil;
class="kw">import io.netty.util.internal.SystemPropertyUtil;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.reflect.Constructor;
class="kw">import java.net.SocketAddress;
class="kw">import java.security.cert.X509Certificate;
class="kw">import java.time.Duration;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.Future;
class="kw">import java.util.concurrent.ScheduledFuture;
class="kw">import java.util.concurrent.ThreadFactory;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.function.BooleanSupplier;
class="kw">import java.util.function.Function;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class NettyUtil {
   class="kw">public class="kw">static class="kw">final HytaleLogger CONNECTION_EXCEPTION_LOGGER = HytaleLogger.get("ConnectionExceptionLogging");
   class="kw">public class="kw">static class="kw">final HytaleLogger PACKET_LOGGER = HytaleLogger.get("PacketLogging");
   class="kw">public class="kw">static class="kw">final String PACKET_DECODER = "packetDecoder";
   class="kw">public class="kw">static class="kw">final String PACKET_ARRAY_ENCODER = "packetArrayEncoder";
   class="kw">public class="kw">static class="kw">final PacketArrayEncoder PACKET_ARRAY_ENCODER_INSTANCE = new PacketArrayEncoder();
   class="kw">public class="kw">static class="kw">final String PACKET_ENCODER = "packetEncoder";
   class="kw">public class="kw">static class="kw">final String LOGGER_KEY = "logger";
   class="kw">public class="kw">static class="kw">final LoggingHandler LOGGER = new LoggingHandler("PacketLogging", LogLevel.INFO);
   class="kw">public class="kw">static class="kw">final String HANDLER = "handler";
   class="kw">public class="kw">static class="kw">final String RATE_LIMIT = "rateLimit";
   class="kw">private class="kw">static class="kw">final int MAX_CLOSE_REASON_BYTES = 1000;
   class="kw">public class="kw">static class="kw">final ChannelFutureListener CLOSE_ON_COMPLETE = var0x -> closeApplicationConnection(var0x.channel());

   class="kw">public NettyUtil() {
   }

   class="kw">public class="kw">static void init() {
   }

   class="kw">public class="kw">static void closeConnection(@Nonnull Channel var0) {
      int var1 = (int)QuicTransportError.PROTOCOL_VIOLATION.code();
      if (var0 class="kw">instanceof QuicChannel var2) {
         var2.close(false, var1, Unpooled.EMPTY_BUFFER);
      } else if (var0.parent() class="kw">instanceof QuicChannel var3) {
         var3.close(false, var1, Unpooled.EMPTY_BUFFER);
      } else {
         var0.close();
      }
   }

   class="kw">public class="kw">static void closeApplicationConnection(@Nonnull Channel var0) {
      closeApplicationConnection(var0, QuicApplicationErrorCode.NoError);
   }

   class="kw">public class="kw">static void closeApplicationConnection(@Nonnull Channel var0, @Nonnull QuicApplicationErrorCode var1) {
      if (var0 class="kw">instanceof QuicChannel var2) {
         var2.close(true, var1.ordinal(), Unpooled.EMPTY_BUFFER);
      } else if (var0.parent() class="kw">instanceof QuicChannel var3) {
         var3.close(true, var1.ordinal(), Unpooled.EMPTY_BUFFER);
      } else {
         var0.close();
      }
   }

   class="kw">public class="kw">static void closeApplicationConnection(@Nonnull Channel var0, @Nonnull QuicApplicationErrorCode var1, @Nonnull FormattedMessage var2) {
      int var3 = var2.computeSize();
      if (var3 > 1000) {
         closeApplicationConnection(var0, var1);
      } else {
         byte[] var4 = new byte[var3];

         try {
            var2.serialize(MemorySegment.ofArray(var4), 0);
         } catch (Throwable var9) {
            closeApplicationConnection(var0, var1);
            throw var9;
         }

         ByteBuf var5 = Unpooled.wrappedBuffer(var4);
         if (var0 class="kw">instanceof QuicChannel var6) {
            var6.close(true, var1.ordinal(), var5);
         } else if (var0.parent() class="kw">instanceof QuicChannel var7) {
            var7.close(true, var1.ordinal(), var5);
         } else {
            var5.release();
            var0.close();
         }
      }
   }

   class="kw">private class="kw">static void injectLogger(@Nonnull Channel var0) {
      if (var0.pipeline().get("logger") == null) {
         var0.pipeline().addAfter("packetArrayEncoder", "logger", LOGGER);
      }
   }

   class="kw">private class="kw">static void uninjectLogger(@Nonnull Channel var0) {
      var0.pipeline().remove("logger");
   }

   class="kw">private class="kw">static void setChannelHandler(@Nonnull Channel var0, @Nonnull PacketHandler var1) {
      PlayerChannelHandler var2 = new PlayerChannelHandler(var1);
      PacketHandler var3 = null;
      ChannelHandler var4 = var0.pipeline().get("handler");
      if (var4 != null) {
         var0.pipeline().replace("handler", "handler", var2);
         if (var4 class="kw">instanceof PlayerChannelHandler var5) {
            var3 = var5.getHandler();
            var3.unregistered(var1);
         }
      } else {
         var0.pipeline().addLast("handler", var2);
      }

      if (var0 class="kw">instanceof QuicStreamChannel var6) {
         var6.parent().attr(HytaleChannelInitializer.GAME_PACKET_HANDLER_ATTR).set(var1);
      }

      var1.registered(var3);
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<Void> createStream(
      @Nonnull QuicChannel var0,
      @Nonnull QuicStreamType var1,
      @Nonnull NetworkChannel var2,
      @Nullable QuicStreamPriority var3,
      @Nonnull PacketHandler var4,
      @Nonnull BiConsumer<NetworkChannel, ChannelConnection> var5
   ) {
      CompletableFuture var6 = new CompletableFuture<>();
      var0.createStream(var1, new ChannelInitializer<Channel>() {
         class="kw">protected void initChannel(@Nonnull Channel var1) {
            var1.pipeline().addLast("packetDecoder", new PacketDecoder());
            var1.pipeline().addLast("packetEncoder", new PacketEncoder());
            var1.pipeline().addLast("packetArrayEncoder", NettyUtil.PACKET_ARRAY_ENCODER_INSTANCE);
         }
      }).addListener(var5x -> {
         if (!var5x.isSuccess()) {
            var6.completeExceptionally(var5x.cause());
         } else {
            QuicStreamChannel var6 = (QuicStreamChannel)var5x.getNow();
            var6.attr(ProtocolUtil.STREAM_CHANNEL_KEY).set(var2);
            if (var3 != null) {
               var6.updatePriority(var3);
            }

            setChannelHandler(var6, var4);
            NettyUtil.NettyChannelConnection var7 = new NettyUtil.NettyChannelConnection(var6);
            var5.accept(var2, var7);
            var6.complete(null);
         }
      });
      class="kw">return var6;
   }

   @Nonnull
   class="kw">public class="kw">static EventLoopGroup getEventLoopGroup(String var0) {
      class="kw">return getEventLoopGroup(0, var0);
   }

   @Nonnull
   class="kw">public class="kw">static EventLoopGroup getEventLoopGroup(int var0, String var1) {
      if (var0 == 0) {
         var0 = Math.max(1, SystemPropertyUtil.getInt("server.io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2));
      }

      ThreadFactory var2 = ThreadUtil.daemonCounted(var1 + " - %d");
      if (Epoll.isAvailable()) {
         class="kw">return new EpollEventLoopGroup(var0, var2);
      } else {
         class="kw">return (EventLoopGroup)(KQueue.isAvailable() ? new KQueueEventLoopGroup(var0, var2) : new NioEventLoopGroup(var0, var2));
      }
   }

   @Nonnull
   class="kw">public class="kw">static Class<? class="kw">extends ServerChannel> getServerChannel() {
      if (Epoll.isAvailable()) {
         class="kw">return EpollServerSocketChannel.class;
      } else {
         class="kw">return KQueue.isAvailable() ? KQueueServerSocketChannel.class : NioServerSocketChannel.class;
      }
   }

   @Nonnull
   class="kw">public class="kw">static NettyUtil.ReflectiveChannelFactory<? class="kw">extends DatagramChannel> getDatagramChannelFactory(SocketProtocolFamily var0) {
      if (Epoll.isAvailable()) {
         class="kw">return new NettyUtil.ReflectiveChannelFactory(EpollDatagramChannel.class, var0);
      } else {
         class="kw">return KQueue.isAvailable()
            ? new NettyUtil.ReflectiveChannelFactory(KQueueDatagramChannel.class, var0)
            : new NettyUtil.ReflectiveChannelFactory(NioDatagramChannel.class, var0);
      }
   }

   class="kw">public class="kw">static String formatRemoteAddress(Channel var0) {
      if (var0 class="kw">instanceof QuicChannel var1) {
         class="kw">return var1.remoteAddress() + " (" + var1.remoteSocketAddress() + ")";
      } else {
         class="kw">return var0 class="kw">instanceof QuicStreamChannel var2
            ? var2.parent().localAddress() + " (" + var2.parent().remoteSocketAddress() + ", streamId=" + var2.remoteAddress().streamId() + ")"
            : var0.remoteAddress().toString();
      }
   }

   class="kw">public class="kw">static String formatLocalAddress(Channel var0) {
      if (var0 class="kw">instanceof QuicChannel var1) {
         class="kw">return var1.localAddress() + " (" + var1.localSocketAddress() + ")";
      } else {
         class="kw">return var0 class="kw">instanceof QuicStreamChannel var2
            ? var2.parent().localAddress() + " (" + var2.parent().localSocketAddress() + ", streamId=" + var2.localAddress().streamId() + ")"
            : var0.localAddress().toString();
      }
   }

   @Nullable
   class="kw">public class="kw">static SocketAddress getRemoteSocketAddress(Channel var0) {
      if (var0 class="kw">instanceof QuicChannel var1) {
         class="kw">return var1.remoteSocketAddress();
      } else {
         class="kw">return var0 class="kw">instanceof QuicStreamChannel var2 ? var2.parent().remoteSocketAddress() : var0.remoteAddress();
      }
   }

   class="kw">public class="kw">static boolean isFromSameOrigin(Channel var0, Channel var1) {
      class="kw">return ConnectionOrigin.isFromSameOrigin(getRemoteSocketAddress(var0), getRemoteSocketAddress(var1));
   }

   @Nonnull
   class="kw">public class="kw">static <T> CompletableFuture<T> wrapChannelFuture(@Nonnull ChannelFuture var0, @Nonnull Function<ChannelFuture, T> var1) {
      CompletableFuture var2 = new CompletableFuture<>();
      var0.addListener(var3 -> {
         if (var3.isSuccess()) {
            var2.complete(var1.apply(var0));
         } else {
            var2.completeExceptionally(var3.cause());
         }
      });
      class="kw">return var2;
   }

   class="kw">static {
      HytaleLoggerBackend var0 = HytaleLoggerBackend.getLogger(PACKET_LOGGER.getName());
      var0.setOnLevelChange((var0x, var1) -> {
         Universe var2 = Universe.get();
         if (var2 != null) {
            if (var1 == Level.OFF) {
               for (PlayerRef var4 : var2.getPlayers()) {
                  if (var4.getPacketHandler().getChannel() class="kw">instanceof NettyUtil.NettyChannelConnection(Channel var7)) {
                     uninjectLogger(var7);
                  }
               }
            } else {
               for (PlayerRef var12 : var2.getPlayers()) {
                  if (var12.getPacketHandler().getChannel() class="kw">instanceof NettyUtil.NettyChannelConnection(Channel var15)) {
                     injectLogger(var15);
                  }
               }
            }
         }
      });
      PACKET_LOGGER.setLevel(Level.OFF);
      var0.loadLogLevel();
      CONNECTION_EXCEPTION_LOGGER.setLevel(Level.ALL);
   }

   class="kw">public record NettyChannelConnection(Channel channel) class="kw">implements ChannelConnection {
      class="kw">private class="kw">static class="kw">final HytaleLogger LOGIN_TIMING_LOGGER = HytaleLogger.get("LoginTiming");
      class="kw">private class="kw">static class="kw">final AttributeKey<ScheduledFuture<?>> STAGE_TIMEOUT_KEY = AttributeKey.newInstance("STAGE_TIMEOUT");
      class="kw">private class="kw">static class="kw">final AttributeKey<Long> LOGIN_START_KEY = AttributeKey.newInstance("LOGIN_START");

      class="kw">public NettyChannelConnection {
      }

      @Override
      class="kw">public void flush() {
         this.channel.flush();
      }

      @Override
      class="kw">public void write(ToClientPacket var1) {
         this.channel.write(var1, this.channel.voidPromise());
      }

      @Override
      class="kw">public void writeAndFlush(ToClientPacket var1) {
         this.channel.writeAndFlush(var1, this.channel.voidPromise());
      }

      @Override
      class="kw">public void write(ToClientPacket[] var1) {
         this.channel.write(var1, this.channel.voidPromise());
      }

      @Override
      class="kw">public void writeAndFlush(ToClientPacket[] var1) {
         this.channel.writeAndFlush(var1, this.channel.voidPromise());
      }

      @Override
      class="kw">public boolean isActive() {
         class="kw">return this.channel.isActive();
      }

      @Override
      class="kw">public boolean isWritable() {
         class="kw">return this.channel.isWritable();
      }

      @Override
      class="kw">public SocketAddress remoteAddress() {
         SocketAddress var1;
         if (this.channel class="kw">instanceof QuicStreamChannel var2) {
            var1 = var2.parent().remoteSocketAddress();
         } else {
            var1 = this.channel.remoteAddress();
         }

         class="kw">return var1;
      }

      @Override
      class="kw">public String formatRemoteAddress() {
         class="kw">return NettyUtil.formatRemoteAddress(this.channel);
      }

      @Override
      class="kw">public void disconnect(@Nonnull FormattedMessage var1) {
         this.channel
            .writeAndFlush(new ServerDisconnect(var1, DisconnectType.Disconnect))
            .addListener((ChannelFutureListener)var2 -> NettyUtil.closeApplicationConnection(this.channel, QuicApplicationErrorCode.NoError, var1));
      }

      @Nullable
      @Override
      class="kw">public PacketStatsRecorder getPacketStatsRecorder() {
         class="kw">return (PacketStatsRecorder)this.channel.attr(PacketStatsRecorder.CHANNEL_KEY).get();
      }

      @Nullable
      @Override
      class="kw">public String getSniHostname() {
         class="kw">return this.channel class="kw">instanceof QuicStreamChannel var1 ? (String)var1.parent().attr(QUICTransport.SNI_HOSTNAME_ATTR).get() : null;
      }

      @Override
      class="kw">public boolean isFromSameOrigin(ChannelConnection var1) {
         class="kw">return var1 class="kw">instanceof NettyUtil.NettyChannelConnection var2 ? NettyUtil.isFromSameOrigin(this.channel, var2.channel) : false;
      }

      @Override
      class="kw">public void execute(Runnable var1) {
         this.channel.eventLoop().execute(var1);
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<Void> setupAuxiliaryChannels(@Nonnull ConnectionHandler var1, @Nonnull BiConsumer<NetworkChannel, ChannelConnection> var2) {
         if (this.channel class="kw">instanceof QuicStreamChannel var3) {
            QuicChannel var8 = var3.parent();
            var8.attr(ProtocolUtil.STREAM_CHANNEL_KEY).set(NetworkChannel.Default);
            var3.updatePriority(PacketHandler.DEFAULT_STREAM_PRIORITIES.get(NetworkChannel.Default));
            PacketHandler var5 = (PacketHandler)var1;
            CompletableFuture var6 = NettyUtil.createStream(
               var8, QuicStreamType.UNIDIRECTIONAL, NetworkChannel.Chunks, PacketHandler.DEFAULT_STREAM_PRIORITIES.get(NetworkChannel.Chunks), var5, var2
            );
            CompletableFuture var7 = NettyUtil.createStream(
               var8, QuicStreamType.UNIDIRECTIONAL, NetworkChannel.WorldMap, PacketHandler.DEFAULT_STREAM_PRIORITIES.get(NetworkChannel.WorldMap), var5, var2
            );
            class="kw">return CompletableFuture.allOf(var6, var7);
         } else {
            var2.accept(NetworkChannel.WorldMap, this);
            var2.accept(NetworkChannel.Chunks, this);
            class="kw">return CompletableFuture.completedFuture(null);
         }
      }

      @Override
      class="kw">public void setChannelHandler(@Nonnull ConnectionHandler var1) {
         NettyUtil.setChannelHandler(this.channel, (PacketHandler)var1);
      }

      @Override
      class="kw">public X509Certificate getClientCertificate() {
         class="kw">return (X509Certificate)this.channel.attr(QUICTransport.CLIENT_CERTIFICATE_ATTR).get();
      }

      @Override
      class="kw">public void updateStreamPriority(int var1, boolean var2) {
         if (this.channel class="kw">instanceof QuicStreamChannel var3) {
            var3.updatePriority(new QuicStreamPriority(var1, var2));
         }
      }

      @Override
      class="kw">public void initTimeoutContext(@Nonnull String var1, @Nonnull String var2) {
         NettyUtil.TimeoutContext.init(this.channel, var1, var2);
      }

      @Override
      class="kw">public void updateTimeoutContext(@Nonnull String var1, @Nonnull String var2) {
         NettyUtil.TimeoutContext.update(this.channel, var1, var2);
      }

      @Override
      class="kw">public void updateTimeoutContext(@Nonnull String var1) {
         NettyUtil.TimeoutContext.update(this.channel, var1);
      }

      @Override
      class="kw">public void setPacketTimeout(@Nonnull Duration var1) {
         this.channel.attr(ProtocolUtil.PACKET_TIMEOUT_KEY).set(var1);
      }

      @Override
      class="kw">public void clearPacketTimeout() {
         this.channel.attr(ProtocolUtil.PACKET_TIMEOUT_KEY).set(null);
      }

      @Override
      class="kw">public void setStageTimeout(@Nonnull String var1, @Nonnull Duration var2, @Nonnull BooleanSupplier var3, @Nonnull Runnable var4) {
         ScheduledFuture var5 = (ScheduledFuture<?>)this.channel.attr(STAGE_TIMEOUT_KEY).get();
         if (var5 != null) {
            var5.cancel(false);
         }

         this.logConnectionTimings("Entering stage '" + var1 + "'", Level.FINEST);
         long var6 = var2.toMillis();
         io.netty.util.concurrent.ScheduledFuture var8 = this.channel
            .eventLoop()
            .schedule(
               () -> {
                  if (this.channel.isOpen()) {
                     if (!var3.getAsBoolean()) {
                        NettyUtil.TimeoutContext var4 = (NettyUtil.TimeoutContext)this.channel.attr(NettyUtil.TimeoutContext.KEY).get();
                        String var5 = var4 != null ? FormatUtil.nanosToString(System.nanoTime() - var4.connectionStartNs()) : "unknown";
                        HytaleLogger.getLogger()
                           .at(Level.WARNING)
                           .log("Stage timeout for %s at stage '%s' after %s connected", var4 != null ? var4.playerIdentifier() : "unknown", var1, var5);
                        var4.run();
                     }
                  }
               },
               var6,
               TimeUnit.MILLISECONDS
            );
         this.channel.attr(STAGE_TIMEOUT_KEY).set(var8);
      }

      @Override
      class="kw">public void clearStageTimeout() {
         ScheduledFuture var1 = (ScheduledFuture<?>)this.channel.attr(STAGE_TIMEOUT_KEY).get();
         if (var1 != null) {
            var1.cancel(false);
         }
      }

      @Override
      class="kw">public void logConnectionTimings(@Nonnull String var1, @Nonnull Level var2) {
         long var3 = System.nanoTime();
         NettyUtil.TimeoutContext var5 = (NettyUtil.TimeoutContext)this.channel.attr(NettyUtil.TimeoutContext.KEY).get();
         String var6 = var5 != null ? var5.playerIdentifier() : NettyUtil.formatRemoteAddress(this.channel);
         Long var7 = (Long)this.channel.attr(LOGIN_START_KEY).getAndSet(var3);
         if (var7 == null) {
            LOGIN_TIMING_LOGGER.at(var2).log("[%s] %s", var6, var1);
         } else {
            long var8 = var3 - var7;
            LOGIN_TIMING_LOGGER.at(var2).log("[%s] %s took %s", var6, var1, LazyArgs.lazy(() -> FormatUtil.nanosToString(var8)));
         }
      }

      @Override
      class="kw">public void closeConnection() {
         this.close(false, 0);
      }

      @Override
      class="kw">public void closeApplicationConnection() {
         this.close(true, QuicApplicationErrorCode.NoError.ordinal());
      }

      @Override
      class="kw">public void closeApplicationConnection(@Nonnull QuicApplicationErrorCode var1) {
         this.close(true, var1.ordinal());
      }

      @Override
      class="kw">public void closeApplicationConnection(@Nonnull QuicApplicationErrorCode var1, @Nonnull FormattedMessage var2) {
         NettyUtil.closeApplicationConnection(this.channel, var1, var2);
      }

      class="kw">private void close(boolean var1, int var2) {
         if (this.channel class="kw">instanceof QuicChannel var3) {
            var3.close(var1, var2, Unpooled.EMPTY_BUFFER);
         } else if (this.channel.parent() class="kw">instanceof QuicChannel var4) {
            var4.close(var1, var2, Unpooled.EMPTY_BUFFER);
         } else {
            this.channel.close();
         }
      }

      @Override
      class="kw">public boolean equals(Object var1) {
         if (this == var1) {
            class="kw">return true;
         } else {
            class="kw">return var1 class="kw">instanceof NettyUtil.NettyChannelConnection(Channel var3) ? this.channel.equals(var3) : false;
         }
      }

      @Override
      class="kw">public int hashCode() {
         class="kw">return this.channel.hashCode();
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return this.channel.toString();
      }
   }

   class="kw">public record NettyChannelServerListener(Channel channel) class="kw">implements ServerListener {
      class="kw">public NettyChannelServerListener {
      }

      @Override
      class="kw">public Future<Void> close() {
         class="kw">return NettyUtil.wrapChannelFuture(this.channel.close(), var0 -> null);
      }

      @Override
      class="kw">public SocketAddress localAddress() {
         class="kw">return this.channel.localAddress();
      }
   }

   class="kw">public class="kw">static class ReflectiveChannelFactory<T class="kw">extends Channel> class="kw">implements ChannelFactory<T> {
      @Nonnull
      class="kw">private class="kw">final Constructor<? class="kw">extends T> constructor;
      class="kw">private class="kw">final SocketProtocolFamily family;

      class="kw">public ReflectiveChannelFactory(@Nonnull Class<? class="kw">extends T> var1, SocketProtocolFamily var2) {
         ObjectUtil.checkNotNull(var1, "clazz");

         try {
            this.constructor = var1.getConstructor(SocketProtocolFamily.class);
            this.family = var2;
         } catch (NoSuchMethodException var4) {
            throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(var1) + " does not have a class="kw">public non-arg constructor", var4);
         }
      }

      @Nonnull
      class="kw">public T newChannel() {
         try {
            class="kw">return (T)this.constructor.newInstance(this.family);
         } catch (Throwable var2) {
            throw new ChannelException("Unable to create Channel from class " + this.constructor.getDeclaringClass(), var2);
         }
      }

      @Nonnull
      class="kw">public String getSimpleName() {
         class="kw">return StringUtil.simpleClassName(this.constructor.getDeclaringClass()) + "(" + this.family + ")";
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return StringUtil.simpleClassName(io.netty.channel.ReflectiveChannelFactory.class)
            + "("
            + StringUtil.simpleClassName(this.constructor.getDeclaringClass())
            + ".class, "
            + this.family
            + ")";
      }
   }

   class="kw">public record TimeoutContext(@Nonnull String stage, long connectionStartNs, @Nonnull String playerIdentifier) {
      class="kw">public class="kw">static class="kw">final AttributeKey<NettyUtil.TimeoutContext> KEY = AttributeKey.newInstance("TIMEOUT_CONTEXT");

      class="kw">public TimeoutContext {
      }

      class="kw">public class="kw">static void init(@Nonnull Channel var0, @Nonnull String var1, @Nonnull String var2) {
         var0.attr(KEY).set(new NettyUtil.TimeoutContext(var1, System.nanoTime(), var2));
      }

      class="kw">public class="kw">static void update(@Nonnull Channel var0, @Nonnull String var1, @Nonnull String var2) {
         NettyUtil.TimeoutContext var3 = get(var0);
         var0.attr(KEY).set(new NettyUtil.TimeoutContext(var1, var3.connectionStartNs, var2));
      }

      class="kw">public class="kw">static void update(@Nonnull Channel var0, @Nonnull String var1) {
         NettyUtil.TimeoutContext var2 = get(var0);
         var0.attr(KEY).set(new NettyUtil.TimeoutContext(var1, var2.connectionStartNs, var2.playerIdentifier));
      }

      @Nonnull
      class="kw">public class="kw">static NettyUtil.TimeoutContext get(@Nonnull Channel var0) {
         NettyUtil.TimeoutContext var1 = (NettyUtil.TimeoutContext)var0.attr(KEY).get();
         if (var1 == null) {
            throw new IllegalStateException("TimeoutContext not initialized - this indicates a bug in the connection flow");
         } else {
            class="kw">return var1;
         }
      }
   }
}