OGLplus  (0.59.0) a C++ wrapper for rendering APIs

eagine/message_bus/004_discovery.cpp

Copyright Matus Chochlik. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt

#include "lib_common_pki.hpp"
#include <eagine/main.hpp>
#include <thread>
namespace eagine {
namespace msgbus {
//------------------------------------------------------------------------------
using subscription_logger_base =
service_composition<subscriber_discovery<shutdown_target<>>>;
class subscription_logger
: public main_ctx_object
, public subscription_logger_base {
using base = subscription_logger_base;
public:
subscription_logger(endpoint& bus)
: main_ctx_object{EAGINE_ID(SubscrLog), bus}
, base{bus} {}
void is_alive(const subscriber_info& info) final {
log_info("endpoint ${subscrbr} is alive")
.arg(EAGINE_ID(subscrbr), info.endpoint_id);
}
void on_subscribed(const subscriber_info& info, message_id sub_msg) final {
log_info("endpoint ${subscrbr} subscribed to ${message}")
.arg(EAGINE_ID(subscrbr), info.endpoint_id)
.arg(EAGINE_ID(message), sub_msg);
this->bus().query_certificate_of(info.endpoint_id);
}
void on_unsubscribed(const subscriber_info& info, message_id sub_msg) final {
log_info("endpoint ${subscrbr} unsubscribed from ${message}")
.arg(EAGINE_ID(subscrbr), info.endpoint_id)
.arg(EAGINE_ID(message), sub_msg);
}
void not_subscribed(const subscriber_info&, message_id) final {}
void on_shutdown(
std::chrono::milliseconds age,
identifier_t subscriber_id,
verification_bits verified) final {
log_info("received ${age} old shutdown request from ${subscrbr}")
.arg(EAGINE_ID(age), age)
.arg(EAGINE_ID(subscrbr), subscriber_id)
.arg(EAGINE_ID(verified), verified);
// TODO: verification
if(age < std::chrono::seconds(2)) {
_done = true;
}
}
auto is_done() const noexcept -> bool {
return _done;
}
private:
bool _done{false};
};
//------------------------------------------------------------------------------
} // namespace msgbus
auto main(main_ctx& ctx) -> int {
signal_switch interrupted;
msgbus::router_address address{ctx};
msgbus::connection_setup conn_setup(ctx);
msgbus::endpoint bus{EAGINE_ID(DiscoverEx), ctx};
bus.add_ca_certificate_pem(ca_certificate_pem(ctx));
bus.add_certificate_pem(msgbus_endpoint_certificate_pem(ctx));
msgbus::subscription_logger sub_log{bus};
conn_setup.setup_connectors(sub_log, address);
timeout waited_too_long{std::chrono::minutes(1)};
while(!(interrupted || sub_log.is_done() || waited_too_long)) {
sub_log.update();
if(!sub_log.process_all()) {
std::this_thread::sleep_for(std::chrono::milliseconds(250));
}
}
return 0;
}
//------------------------------------------------------------------------------
} // namespace eagine
#define EAGINE_ID(NAME)
Macro for constructing instances of eagine::identifier.
Definition: identifier.hpp:353
bitfield< verification_bit > verification_bits
Alias for a bus message verification bitfield.
Definition: verification.hpp:47
Common code is placed in this namespace.
Definition: eagine.hpp:21
@ info
Informational log entries.
@ endpoint
Message bus client endpoint.
main_ctx_object(identifier obj_id, main_ctx_parent parent) noexcept
Initialization from object id and parent.
Definition: main_ctx_object.hpp:77
auto log_info(string_view format) noexcept
Create a log message entry for information, with specified format.
Definition: logger.hpp:329
basic_address< false > address
Type alias for non-const memory address values.
Definition: address.hpp:203
std::uint64_t identifier_t
The underlying integer type for eagine::identifier.
Definition: identifier_t.hpp:19
auto bus() noexcept -> auto &
Returns a reference to the associated endpoint.
Definition: subscriber.hpp:38
@ message_id
The message type id has been verified.

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).