Back to Demos

Lottery WebSocket

Real-time lottery with session state machine based on LotteryWebsocket

Stats

Total Sessions
0
Subscribers
0

Controls

Production Code (Java)

// From lottery-api/LotteryWebsocket - WebSocketHandler.java
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
    SocketRequest req = JsonUtils.deSerialize(message.getPayload(), SocketRequest.class);

    switch (req.getCommand()) {
        case LotteryCommand.SUBSCRIBE -> resultService.handleSubscribe(session, req.getData());
        case LotteryCommand.PING -> resultService.handlePing(session);
        case LotteryCommand.MOCK_RESULT -> mockupResultService.handleSubscribe(session, req.getData());
        default -> resultService.handleUnknown(session, req.getCommand());
    }
}

// GameLogic.java - Session state machine
public class GameLogic {
    private SessionState state = SessionState.WAITING;

    @Scheduled(fixedRate = 30000)  // 30 seconds betting window
    public void processBettingRound() {
        switch (state) {
            case WAITING -> startBetting();
            case BETTING -> endBettingAndGenerateResult();
            case ENDED -> calculatePayouts();
        }
    }

    private void endBettingAndGenerateResult() {
        // Shuffle and generate 6 winning numbers (1-45)
        List<Integer> numbers = IntStream.rangeClosed(1, 45).boxed().collect(toList());
        Collections.shuffle(numbers);
        this.result = numbers.subList(0, 6);

        broadcast(new ResultEvent(sessionId, result));
    }
}