#include <iostream>
#include <boost/asio/spawn.hpp>
const std::string realm = "cppwamp.demo.chat";
const std::string address = "localhost";
const short port = 12345;
class ChatService
{
public:
using Yield = boost::asio::yield_context;
: ioctx_(ioctx)
{}
{
session_ = Session::create(ioctx_, connectors);
auto index = session_->connect(yield).value();
std::cout << "Chat service connected on transport #"
<< (index + 1) << "\n";
auto info = session_->join(
Realm(realm), yield).value();
std::cout << "Chat service joined, session ID = " << info.id() << "\n";
using namespace std::placeholders;
registration_ = session_->enroll(
simpleRpc<void, std::string, std::string>(
std::bind(&ChatService::say, this, _1, _2)),
yield).value();
}
void quit(Yield yield)
{
registration_.unregister();
session_->disconnect();
}
private:
void say(std::string user, std::string message)
{
session_->publish(
wamp::Pub(
"said").withArgs(user, message) );
}
};
class ChatClient
{
public:
using Yield = boost::asio::yield_context;
: ioctx_(ioctx),
user_(std::move(user))
{}
{
session_ = Session::create(ioctx_, connectors);
auto index = session_->connect(yield).value();
std::cout << user_ << " connected on transport #" << index << "\n";
auto info = session_->join(
Realm(realm), yield).value();
std::cout << user_ << " joined, session ID = " << info.id() << "\n";
using namespace std::placeholders;
subscription_ = session_->subscribe(
simpleEvent<std::string, std::string>(
std::bind(&ChatClient::said, this, _1, _2)),
yield).value();
}
void leave(Yield yield)
{
subscription_.unsubscribe();
session_.reset();
}
void say(const std::string& message, Yield yield)
{
std::cout << user_ << " says \"" << message << "\"\n";
session_->call(
wamp::Rpc(
"say").withArgs(user_, message),
yield).value();
}
private:
void said(std::string from, std::string message)
{
std::cout << user_ << " received message from " << from << ": \""
<< message << "\"\n";
}
std::string user_;
};
int main()
{
auto tcp = wamp::connector<wamp::Json>( ioctx,
ChatService chat(ioctx);
ChatClient alice(ioctx, "Alice");
ChatClient bob(ioctx, "Bob");
boost::asio::spawn(ioctx, [&](boost::asio::yield_context yield)
{
chat.start({tcp}, yield);
alice.join({tcp}, yield);
alice.say("Hello?", yield);
bob.join({tcp}, yield);
alice.say("Is anybody there?", yield);
bob.say("Yes, I'm here!", yield);
alice.leave(yield);
bob.leave(yield);
chat.quit(yield);
});
ioctx.run();
return 0;
}