#pragma once // DragonX Wallet - HushChat in-memory message store: the fast read model / dedup view. Durable // persistence lives in ChatDatabase; ChatService rehydrates this store from it on unlock. #include "chat_message.h" #include #include #include namespace dragonx::chat { // Threads messages by conversation_id (cid) and deduplicates by (txid, payload_position) so // re-scanning the chain never double-inserts. Not thread-safe — drive from the main thread. class ChatStore { public: // Returns true if newly inserted, false if a duplicate was ignored. bool append(const ChatMessage& message); // Messages in a conversation, in insertion order. std::vector conversation(const std::string& conversationId) const; // Update an outgoing echo's delivery status by its local txid. Returns a pointer to the updated // message (for the caller to persist), or nullptr if no message has that txid. const ChatMessage* updateDelivery(const std::string& txid, ChatDelivery delivery); // Distinct conversation ids, in first-seen order. std::vector conversationIds() const; std::size_t size() const { return messages_.size(); } bool empty() const { return messages_.empty(); } void clear(); private: static std::string dedupKey(const ChatMessage& message); std::vector messages_; std::unordered_set seen_; }; } // namespace dragonx::chat