JsonWebSocketMessageDispatcher.java

package sprout.server.websocket.message.builtins;

import com.fasterxml.jackson.databind.ObjectMapper;
import sprout.beans.annotation.Component;
import sprout.server.argument.WebSocketArgumentResolver;
import sprout.server.websocket.InvocationContext;
import sprout.server.websocket.WebSocketFrame;
import sprout.server.websocket.WebSocketFrameDecoder;
import sprout.server.websocket.message.AbstractWebSocketMessageDispatcher;
import sprout.server.websocket.message.ParsedMessage;

import java.util.List;

@Component
public class JsonWebSocketMessageDispatcher extends AbstractWebSocketMessageDispatcher {
    private final ObjectMapper objectMapper;

    public JsonWebSocketMessageDispatcher(ObjectMapper objectMapper, List<WebSocketArgumentResolver> argumentResolvers) {
        super(argumentResolvers); // 부모 클래스에 의존성 전달
        this.objectMapper = objectMapper;
    }

    @Override
    public boolean supports(WebSocketFrame frame, InvocationContext context) {
        // 텍스트 프레임(opcode 0x1) 또는 텍스트 연속 프레임(opcode 0x0)만 지원
        return (frame.getOpcode() == 0x1 || frame.getOpcode() == 0x0) && context.getMessagePayload().isText();
    }

    @Override
    protected DispatchInfo prepareDispatchInfo(InvocationContext context) throws Exception {
        String messageContent = context.getMessagePayload().asText();
        ParsedMessage parsedMessage = objectMapper.readValue(messageContent, ParsedMessage.class);

        return new DispatchInfo(parsedMessage.getDestination(), parsedMessage.getPayload());
    }
}