33#include " mcp_messages.h"
44#include < string>
55#include < tuple>
6- #include < vector >
6+ #include < map >
77
88namespace toolcall
99{
@@ -13,27 +13,32 @@ namespace toolcall
1313 template <typename Derived, typename ... MessageTypes>
1414 class mcp_transport_t {
1515 public:
16-
1716 template <typename T>
18- void subscribe (callback<T> callback) {
19- auto & vec = std::get<std::vector<toolcall::callback<T>>>(subscribers_);
20- vec.push_back (std::move (callback));
17+ void subscribe (std::string key, callback<T> callback) {
18+ auto & map =
19+ std::get<std::map<std::string, toolcall::callback<T>>>(
20+ subscribers_);
21+
22+ map.insert ({key, callback});
2123 }
2224
2325 template <typename T>
24- void unsubscribe (callback<T> callback ) {
25- auto & vec = std::get<std::vector<toolcall::callback<T>>>(subscribers_);
26- auto found = std::find (vec. begin (), vec. end (), callback);
27- if (found != vec. end ()) {
28- vec. erase (found);
29- }
26+ void unsubscribe (std::string key ) {
27+ auto & map =
28+ std::get<std::map<std::string, toolcall:: callback<T>>>(
29+ subscribers_);
30+
31+ map. erase (key);
3032 }
3133
3234 template <typename T>
3335 void notify (const T & message) const {
34- const auto & vec = std::get<std::vector<toolcall::callback<T>>>(subscribers_);
35- for (const auto & callback : vec) {
36- callback (message);
36+ const auto & map =
37+ std::get<std::map<std::string, toolcall::callback<T>>>(
38+ subscribers_);
39+
40+ for (const auto & pair : map) {
41+ pair.second (message);
3742 }
3843 }
3944
@@ -50,7 +55,7 @@ namespace toolcall
5055 }
5156
5257 private:
53- std::tuple<std::vector< toolcall::callback<MessageTypes>>...> subscribers_;
58+ std::tuple<std::map<std::string, toolcall::callback<MessageTypes>>...> subscribers_;
5459 };
5560
5661 class mcp_transport : public mcp_transport_t <mcp_transport,
0 commit comments