diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/BridgeCodec.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/BridgeCodec.java index 0a12d0a..40daff8 100644 --- a/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/BridgeCodec.java +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/BridgeCodec.java @@ -4,6 +4,7 @@ import com.luminiadev.bridge.network.codec.packet.BridgePacket; import com.luminiadev.bridge.network.codec.packet.BridgePacketDefinition; import com.luminiadev.bridge.network.codec.packet.BridgePacketFactory; +import com.luminiadev.bridge.network.codec.packet.BridgeUnknownPacket; import com.luminiadev.bridge.network.codec.packet.serializer.BridgePacketSerializer; import com.luminiadev.bridge.util.ByteBuffer; import org.jetbrains.annotations.Nullable; @@ -47,7 +48,7 @@ public void unregisterPacket(String packetId) { } } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) public BridgePacket tryDecode(ByteBuffer buffer, String packetId) { BridgePacketDefinition definition = this.getPacketDefinition(packetId); @@ -57,7 +58,11 @@ public BridgePacket tryDecode(ByteBuffer buffer, String packetId) { packet = definition.getFactory().create(); serializer = (BridgePacketSerializer) definition.getSerializer(); } else { - throw new BridgeCodecException("Definition for packet with id " + packetId + " not found"); + BridgeUnknownPacket unknownPacket = new BridgeUnknownPacket(); + unknownPacket.setOriginalId(packetId); + unknownPacket.setOriginalPayload(buffer); + packet = unknownPacket; + serializer = (BridgePacketSerializer) new BridgeUnknownPacket.BridgeUnknownPacketSerializer(); } serializer.deserialize(buffer, packet); @@ -66,11 +71,16 @@ public BridgePacket tryDecode(ByteBuffer buffer, String packetId) { @SuppressWarnings("unchecked") public void tryEncode(ByteBuffer buffer, T packet) { - BridgePacketDefinition definition = (BridgePacketDefinition) this.getPacketDefinition(packet.getId()); - if (definition == null) { - throw new BridgeCodecException("Definition for packet with id " + packet.getId() + " not found"); + BridgePacketSerializer serializer; + if (packet instanceof BridgeUnknownPacket) { + serializer = (BridgePacketSerializer) new BridgeUnknownPacket.BridgeUnknownPacketSerializer(); + } else { + BridgePacketDefinition definition = (BridgePacketDefinition) this.getPacketDefinition(packet.getId()); + if (definition == null) { + throw new BridgeCodecException("Definition for packet with id " + packet.getId() + " not found"); + } + serializer = definition.getSerializer(); } - BridgePacketSerializer serializer = definition.getSerializer(); serializer.serialize(buffer, packet); } diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/BridgeUnknownPacket.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/BridgeUnknownPacket.java new file mode 100644 index 0000000..b40eee7 --- /dev/null +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/BridgeUnknownPacket.java @@ -0,0 +1,39 @@ +package com.luminiadev.bridge.network.codec.packet; + +import com.luminiadev.bridge.network.codec.packet.serializer.BridgePacketSerializer; +import com.luminiadev.bridge.util.ByteBuffer; +import org.jetbrains.annotations.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(doNotUseGetters = true) +public final class BridgeUnknownPacket implements BridgePacket { + + private String originalId; + private ByteBuffer originalPayload; + + @Override + public @NotNull String getId() { + return "unknown"; + } + + public static final class BridgeUnknownPacketSerializer implements BridgePacketSerializer { + + @Override + public void serialize(ByteBuffer buffer, BridgeUnknownPacket packet) { + buffer.writeString(packet.getOriginalId()); + buffer.writeBytes( + packet.getOriginalPayload().byteBuf(), + packet.getOriginalPayload().readerIndex(), + packet.getOriginalPayload().readableBytes() + ); + } + + @Override + public void deserialize(ByteBuffer buffer, BridgeUnknownPacket packet) { + packet.setOriginalId(buffer.readString()); + packet.setOriginalPayload(ByteBuffer.of(buffer.readRetainedSlice(buffer.readableBytes()))); + } + } +} diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/util/ByteBuffer.java b/bridge-common/src/main/java/com/luminiadev/bridge/util/ByteBuffer.java index 62eb86f..a85b592 100644 --- a/bridge-common/src/main/java/com/luminiadev/bridge/util/ByteBuffer.java +++ b/bridge-common/src/main/java/com/luminiadev/bridge/util/ByteBuffer.java @@ -27,6 +27,10 @@ public static ByteBuffer of(ByteBuf buffer) { return new ByteBuffer(buffer); } + public ByteBuf byteBuf() { + return buffer; + } + public String readString() { int length = this.readUnsignedVarInt(); return (String) buffer.readCharSequence(length, StandardCharsets.UTF_8); diff --git a/build.gradle.kts b/build.gradle.kts index 464f802..449b8f9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ java { allprojects { group = "com.luminia" - version = "1.0.3-SNAPSHOT" + version = "1.0.4-SNAPSHOT" } subprojects {