From f37dd40a1eb339aba51d8a6f8708718d35b7ffa0 Mon Sep 17 00:00:00 2001 From: Arkadiy Date: Sat, 12 Jul 2025 03:58:42 +0400 Subject: [PATCH 1/2] feat: added support for unknown packets --- .../bridge/network/codec/BridgeCodec.java | 22 ++++++++--- .../codec/packet/BridgeUnknownPacket.java | 39 +++++++++++++++++++ .../luminiadev/bridge/util/ByteBuffer.java | 4 ++ 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/BridgeUnknownPacket.java 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); From 0ad3db7c8cca281117d64aa67b340d9d12e2aa64 Mon Sep 17 00:00:00 2001 From: Arkadiy Date: Sat, 12 Jul 2025 03:59:17 +0400 Subject: [PATCH 2/2] chore: bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 {