RawBinaryWebSocketMessageDispatcher.java

package sprout.server.websocket.message.builtins;

import sprout.beans.annotation.Component;
import sprout.server.argument.WebSocketArgumentResolver;
import sprout.server.websocket.InvocationContext;
import sprout.server.websocket.WebSocketFrame;
import sprout.server.websocket.message.AbstractWebSocketMessageDispatcher;

import java.util.List;

@Component
public class RawBinaryWebSocketMessageDispatcher extends AbstractWebSocketMessageDispatcher {

    public RawBinaryWebSocketMessageDispatcher(List<WebSocketArgumentResolver> argumentResolvers) {
        super(argumentResolvers);
    }

    @Override
    public boolean supports(WebSocketFrame frame, InvocationContext context) {
        // 바이너리 프레임(opcode 0x2) 또는 바이너리 연속 프레임(opcode 0x0)만 지원
        return (frame.getOpcode() == 0x2 || frame.getOpcode() == 0x0) && context.getMessagePayload().isBinary();
    }

    @Override
    protected DispatchInfo prepareDispatchInfo(InvocationContext context) {
        // 모든 바이너리 메시지는 고정된 "/binary" 목적지로 라우팅
        String destination = "/binary";
        byte[] payload = context.getMessagePayload().asBinary();

        return new DispatchInfo(destination, payload);
    }
}