Many changes

This commit is contained in:
NetRiceCake
2025-11-26 21:52:59 +09:00
parent 66eb29bdd8
commit 83ca1dcf68
59 changed files with 1269 additions and 742 deletions

View File

@@ -0,0 +1,74 @@
package com.github.netricecake.loco.codec;
import com.github.netricecake.loco.LocoPacket;
import com.github.netricecake.loco.LocoSocket;
import com.github.netricecake.loco.util.BsonUtil;
import com.github.netricecake.loco.util.ByteUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class LocoCodec extends MessageToMessageCodec<byte[], LocoPacket> {
private LocoPacket currentLocoPacket = null;
private byte[] buffer = new byte[0];
private final LocoSocket locoSocket;
public LocoCodec(LocoSocket locoSocekt) {
this.locoSocket = locoSocekt;
}
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, LocoPacket packet, List<Object> list) throws Exception {
byte[] packetId = ByteUtil.intToByteArrayLE(packet.getPacketId());
byte[] statusCode = ByteUtil.shortToByteArrayLE(packet.getStatusCode());
byte[] method = new byte[11];
System.arraycopy(packet.getMethod().getBytes(), 0, method, 0, packet.getMethod().length());
byte[] bodyType = { packet.getBodyType() };
byte[] body = packet.getBody();
byte[] bodyLength = ByteUtil.intToByteArrayLE(body.length);
list.add(ByteUtil.concatBytes(packetId, statusCode, method, bodyType, bodyLength, body));
}
@Override
protected void decode(ChannelHandlerContext channelHandlerContext, byte[] bytes, List<Object> list) throws Exception {
if (bytes == null) return;
buffer = ByteUtil.concatBytes(buffer, bytes);
do {
if (currentLocoPacket == null) {
if (buffer.length < 22) return;
int id = ByteUtil.byteArrayToIntLE(ByteUtil.sliceBytes(buffer, 0, 4));
short statusCode = ByteUtil.byteArrayToShortLE(ByteUtil.sliceBytes(buffer, 4, 2));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 11; i++) {
if ((buffer[6 + i] & 0xFF) == 0) break;
sb.append((char) buffer[6 + i]);
}
String method = sb.toString();
byte bodyType = buffer[17];
int bodyLength = ByteUtil.byteArrayToIntLE(ByteUtil.sliceBytes(buffer, 18, 4));
currentLocoPacket = new LocoPacket(id, statusCode, method, bodyType, bodyLength, null);
buffer = ByteUtil.sliceBytes(buffer, 22, buffer.length - 22);
}
if (currentLocoPacket.getBodyLength() > buffer.length) break;
byte[] body = ByteUtil.sliceBytes(buffer, 0, currentLocoPacket.getBodyLength());
buffer = ByteUtil.sliceBytes(buffer, currentLocoPacket.getBodyLength(), buffer.length - currentLocoPacket.getBodyLength());
currentLocoPacket.setBody(body);
if (locoSocket.getWaitList().containsKey(currentLocoPacket.getPacketId())) {
((CompletableFuture<LocoPacket>) locoSocket.getWaitList().get(currentLocoPacket.getPacketId())).complete(currentLocoPacket);
locoSocket.getWaitList().remove(currentLocoPacket.getPacketId());
} else {
final LocoPacket p = currentLocoPacket;
locoSocket.getHandlerPool().execute(() -> {
locoSocket.getLocoSocektHandler().onPacket(p);
});
}
currentLocoPacket = null;
} while (buffer.length > 0);
}
}