Skip to content

src/api/transport/session.hpp

Namespaces

Name
sgns
sgns::api

Classes

Name
class sgns::api::Session
rpc session

Types

Name
enum class SessionType

Types Documentation

enum SessionType

Enumerator Value Description
kHttp 1
kWs

Source code

#ifndef SUPERGENIUS_SRC_API_TRANSPORT_SESSION_HPP
#define SUPERGENIUS_SRC_API_TRANSPORT_SESSION_HPP

#include <boost/asio/buffer.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/read_until.hpp>
#include <boost/asio/streambuf.hpp>
#include <boost/asio/write.hpp>
#include <boost/signals2/signal.hpp>

#include "api/transport/rpc_io_context.hpp"

namespace sgns::api {
  enum struct SessionType {
    kHttp = 1,
    kWs,
  };

  class Session {
    template <class T>
    using Signal = boost::signals2::signal<T>;

    using OnRequestSignature = void(std::string_view,
                                    std::shared_ptr<Session> session);
    using OnRequest = Signal<OnRequestSignature>;

   public:
    using Context = RpcContext;
    using Socket = boost::asio::ip::tcp::socket;
    using ErrorCode = boost::system::error_code;
    using Streambuf = boost::asio::streambuf;
    using Timer = boost::asio::steady_timer;
    using Connection = boost::signals2::connection;
    using Duration = Timer::duration;
    using SessionId = uint64_t;

    using OnCloseHandler = std::function<void(SessionId, SessionType)>;

    virtual ~Session() = default;

    virtual void start() = 0;

    virtual Socket &socket() = 0;

    void connectOnRequest(std::function<OnRequestSignature> callback) {
      on_request_ = std::move(callback);
    }

    void connectOnCloseHandler(OnCloseHandler &&handler) {
      on_close_ = std::move(handler);
    }

    void processRequest(std::string_view request,
                        std::shared_ptr<Session> session) {
      on_request_(request, std::move(session));
    }

    virtual void respond(std::string_view message) = 0;

    void notifyOnClose(SessionId id, SessionType type) {
      if (nullptr != on_close_) on_close_(id, type);
    }

    virtual SessionId id() const = 0;

    virtual SessionType type() const = 0;

   private:
    std::function<OnRequestSignature> on_request_;  
    OnCloseHandler on_close_;
  };

}  // namespace sgns::api

#endif  // SUPERGENIUS_SRC_API_TRANSPORT_SESSION_HPP

Updated on 2026-03-04 at 13:10:44 -0800