Skip to content

framing/message_stream.hpp

Namespaces

Name
rlpx
rlpx::framing

Classes

Name
struct rlpx::framing::Message
struct rlpx::framing::MessageSendParams
class rlpx::framing::MessageStream
Message stream handles framing, encryption, and compression.

Source code

// Copyright 2025 GeniusVentures
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "../rlpx_types.hpp"
#include "../rlpx_error.hpp"
#include "frame_cipher.hpp"
#include "../socket/socket_transport.hpp"
#include <boost/asio/spawn.hpp>
#include <memory>

namespace rlpx::framing {

// Protocol message structure
struct Message {
    uint8_t id;
    ByteBuffer payload;
};

// Message send parameters
struct MessageSendParams {
    uint8_t message_id;
    ByteView payload;
    bool compress;
};

class MessageStream {
public:
    MessageStream(
        std::unique_ptr<FrameCipher> cipher,
        socket::SocketTransport transport
    ) noexcept;

    [[nodiscard]] VoidResult
    send_message(const MessageSendParams& params, boost::asio::yield_context yield) noexcept;

    [[nodiscard]] Result<Message>
    receive_message(boost::asio::yield_context yield) noexcept;

    void enable_compression() noexcept { compression_enabled_ = true; }

    void close() noexcept;

    [[nodiscard]] bool is_compression_enabled() const noexcept { 
        return compression_enabled_; 
    }

    [[nodiscard]] const auth::FrameSecrets& cipher_secrets() const noexcept {
        return cipher_->secrets();
    }

private:
    [[nodiscard]] FramingResult<void>
    send_frame(ByteView frame_data, boost::asio::yield_context yield) noexcept;

    [[nodiscard]] FramingResult<ByteBuffer>
    receive_frame(boost::asio::yield_context yield) noexcept;

    std::unique_ptr<FrameCipher> cipher_;
    socket::SocketTransport transport_;
    bool compression_enabled_{false};

    // Reusable buffers to minimize allocations
    ByteBuffer send_buffer_;
    ByteBuffer recv_buffer_;
};

} // namespace rlpx::framing

Updated on 2026-04-13 at 23:22:46 -0700