#pragma once #include #include #include "intro_set.hpp" #include #include #include namespace llarp { namespace service { using ConvoTag = AlignedBuffer<16>; struct ProtocolMessage; struct RecvDataEvent { path::Path_ptr fromPath; PathID_t pathid; std::shared_ptr msg; }; struct ProtocolMessage; struct IDataHandler { virtual bool HandleDataMessage( path::Path_ptr path, const PathID_t from, std::shared_ptr msg) = 0; virtual bool GetCachedSessionKeyFor(const ConvoTag& remote, SharedSecret& secret) const = 0; virtual void PutCachedSessionKeyFor(const ConvoTag& remote, const SharedSecret& secret) = 0; virtual void MarkConvoTagActive(const ConvoTag& tag) = 0; virtual void RemoveConvoTag(const ConvoTag& remote) = 0; virtual bool HasConvoTag(const ConvoTag& remote) const = 0; virtual void PutSenderFor(const ConvoTag& remote, const ServiceInfo& si, bool inbound) = 0; virtual bool GetSenderFor(const ConvoTag& remote, ServiceInfo& si) const = 0; virtual void PutIntroFor(const ConvoTag& remote, const Introduction& intro) = 0; virtual bool GetIntroFor(const ConvoTag& remote, Introduction& intro) const = 0; virtual void PutReplyIntroFor(const ConvoTag& remote, const Introduction& intro) = 0; virtual bool GetReplyIntroFor(const ConvoTag& remote, Introduction& intro) const = 0; virtual bool GetConvoTagsForService(const Address& si, std::set& tag) const = 0; virtual bool HasInboundConvo(const Address& addr) const = 0; /// do we want a session outbound to addr virtual bool WantsOutboundSession(const Address& addr) const = 0; virtual void MarkAddressOutbound(const Address& addr) = 0; virtual void QueueRecvData(RecvDataEvent ev) = 0; }; } // namespace service } // namespace llarp namespace std { template <> struct hash { size_t operator()(const llarp::service::ConvoTag& tag) const { std::hash h{}; return h(std::string_view{reinterpret_cast(tag.data()), tag.size()}); } }; } // namespace std