package com.huangzj.base.frame;

import com.google.protobuf.MessageLite;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

/**
 * TCP 上 4 字节长度 + protobuf body 的通用写法，跨服和区服客户端共用。
 */
public final class LengthPrefixedProtobuf {

    /** 单帧上限，防止恶意大包把内存打爆。 */
    public static final int MAX_FRAME_LENGTH = 65536;

    private LengthPrefixedProtobuf() {
    }

    /** 长度字段在开头 4 字节，剥离长度头后剩下纯 PB。 */
    public static LengthFieldBasedFrameDecoder newTcpFrameDecoder() {
        return new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH, 0, 4, 0, 4);
    }

    /** 先发 4 字节小端长度，再发 body，和上面的 decoder 成对使用。 */
    public static ByteBuf encodeMessage(ByteBufAllocator alloc, MessageLite message) {
        byte[] body = message.toByteArray();
        ByteBuf buf = alloc.buffer(4 + body.length);
        buf.writeInt(body.length);
        buf.writeBytes(body);
        return buf;
    }
}
