#pragma once // In-memory key-value store, TTL cache, and pubsub broker skeletons. // Gap: real implementations in 04-data.md own persistence, replication, // durability guarantees, and multi-instance sharing. #include #include #include #include #include #include namespace molo::example::fw { class KvStore { public: bool set(const std::string& key, const std::string& value); bool get(const std::string& key, std::string& out) const; bool del(const std::string& key); std::size_t size() const; private: mutable std::mutex mu_; std::map data_; }; struct CacheEntry { std::string value; long expires_at = 0; }; class Cache { public: void put(const std::string& key, const std::string& value, long ttl_sec, long now); bool lookup(const std::string& key, std::string& out, long now); void invalidate(const std::string& key); std::size_t size() const; private: mutable std::mutex mu_; std::map data_; }; using PubsubHandler = std::function; class Pubsub { public: bool subscribe(const std::string& topic, PubsubHandler handler); std::size_t publish(const std::string& topic, const std::string& message); std::vector history(const std::string& topic) const; std::vector topics() const; private: mutable std::mutex mu_; std::map> subs_; std::map> history_; }; } // namespace molo::example::fw