WebSocketFrame.java

package sprout.server.websocket;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

public class WebSocketFrame {
    private final boolean fin;
    private final int opcode;
    // private final byte[] payload;
    private final InputStream payloadStream;

    public WebSocketFrame(boolean fin, int opcode, InputStream payloadStream) { // <-- 생성자 변경
        this.fin = fin;
        this.opcode = opcode;
        this.payloadStream = payloadStream; // LimitedInputStream 인스턴스가 들어올 것
    }

    public boolean isFin() {
        return fin;
    }

    public int getOpcode() {
        return opcode;
    }

    public InputStream getPayloadStream() { return payloadStream; }

    // 필요하다면, 스트림을 읽어 전체 페이로드를 바이트 배열로 반환하는 헬퍼 메서드
    public byte[] getPayloadBytes() throws IOException {
        if (payloadStream == null) return new byte[0];
        // InputStream을 byte[]로 읽는 유틸리티 사용 (예: IOUtils.toByteArray(payloadStream))
        // 이 메서드는 스트림의 모든 데이터를 메모리에 올리므로, 대용량 메시지에는 적합하지 않음
        // LimitedInputStream의 limit만큼만 읽어옴
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[4096]; // 4KB 버퍼
        while ((nRead = payloadStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        buffer.flush();
        return buffer.toByteArray();
    }

    // 텍스트 페이로드를 가져오는 메서드 (성능 고려하여 신중하게 사용)
    public String getTextPayload() throws IOException {
        return new String(getPayloadBytes(), StandardCharsets.UTF_8);
    }
}