+10
-9
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <ligo/security.hpp>
|
||||
|
||||
|
||||
namespace ligo {
|
||||
|
||||
enum class protocol {
|
||||
@@ -41,14 +42,14 @@ struct endpoint_config {
|
||||
ligo::udp_reliability_config udp{};
|
||||
};
|
||||
|
||||
auto validate(ligo::endpoint_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto parse_endpoint_config(boost::json::value const& value) -> std::expected<ligo::endpoint_config, modulus::error>;
|
||||
auto parse_endpoint_configs(boost::json::value const& value) -> std::expected<std::vector<ligo::endpoint_config>, modulus::error>;
|
||||
auto load_endpoint_configs(std::string const& path) -> std::expected<std::vector<ligo::endpoint_config>, modulus::error>;
|
||||
auto to_json(ligo::udp_reliability_config const& config) -> boost::json::value;
|
||||
auto to_json(ligo::http_config const& config) -> boost::json::value;
|
||||
auto to_json(ligo::security_config const& config) -> boost::json::value;
|
||||
auto to_json(ligo::endpoint_config const& config) -> boost::json::value;
|
||||
auto to_json(std::vector<ligo::endpoint_config> const& configs) -> boost::json::value;
|
||||
auto validate(ligo::endpoint_config const &config) -> std::expected<void, modulus::error>;
|
||||
auto parse_endpoint_config(boost::json::value const &value) -> std::expected<ligo::endpoint_config, modulus::error>;
|
||||
auto parse_endpoint_configs(boost::json::value const &value) -> std::expected<std::vector<ligo::endpoint_config>, modulus::error>;
|
||||
auto load_endpoint_configs(std::string const &path) -> std::expected<std::vector<ligo::endpoint_config>, modulus::error>;
|
||||
auto to_json(ligo::udp_reliability_config const &config) -> boost::json::value;
|
||||
auto to_json(ligo::http_config const &config) -> boost::json::value;
|
||||
auto to_json(ligo::security_config const &config) -> boost::json::value;
|
||||
auto to_json(ligo::endpoint_config const &config) -> boost::json::value;
|
||||
auto to_json(std::vector<ligo::endpoint_config> const &configs) -> boost::json::value;
|
||||
|
||||
}
|
||||
|
||||
@@ -8,26 +8,27 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace ligo::detail {
|
||||
|
||||
constexpr std::int32_t error_ok{0};
|
||||
constexpr std::int32_t error_invalid_argument{1};
|
||||
constexpr std::int32_t error_not_found{2};
|
||||
constexpr std::int32_t error_unavailable{3};
|
||||
constexpr std::int32_t error_timeout{4};
|
||||
constexpr std::int32_t error_internal{5};
|
||||
constexpr std::int32_t error_ok{0};
|
||||
constexpr std::int32_t error_invalid_argument{1};
|
||||
constexpr std::int32_t error_not_found{2};
|
||||
constexpr std::int32_t error_unavailable{3};
|
||||
constexpr std::int32_t error_timeout{4};
|
||||
constexpr std::int32_t error_internal{5};
|
||||
|
||||
auto make_error(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> modulus::error;
|
||||
auto fail_void(modulus::error error) -> std::expected<void, modulus::error>;
|
||||
auto make_error(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> modulus::error;
|
||||
auto fail_void(modulus::error error) -> std::expected<void, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(modulus::error error) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename VALUE>
|
||||
auto fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename VALUE, typename MESSAGE>
|
||||
auto fail(std::int32_t code, MESSAGE&& message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename MESSAGE>
|
||||
auto fail_void(std::int32_t code, MESSAGE&& message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<void, modulus::error>;
|
||||
template <typename VALUE>
|
||||
auto fail(modulus::error error) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename VALUE>
|
||||
auto fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename VALUE, typename MESSAGE>
|
||||
auto fail(std::int32_t code, MESSAGE &&message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<VALUE, modulus::error>;
|
||||
template <typename MESSAGE>
|
||||
auto fail_void(std::int32_t code, MESSAGE &&message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<void, modulus::error>;
|
||||
|
||||
}
|
||||
|
||||
@@ -37,17 +38,17 @@ auto ligo::detail::fail(modulus::error error) -> std::expected<VALUE, modulus::e
|
||||
}
|
||||
|
||||
template <typename VALUE>
|
||||
auto ligo::detail::fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error> {
|
||||
auto ligo::detail::fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error> {
|
||||
assert(!result);
|
||||
return ligo::detail::fail<VALUE>(result.error());
|
||||
}
|
||||
|
||||
template <typename VALUE, typename MESSAGE>
|
||||
auto ligo::detail::fail(std::int32_t code, MESSAGE&& message, modulus::source_location location) -> std::expected<VALUE, modulus::error> {
|
||||
auto ligo::detail::fail(std::int32_t code, MESSAGE &&message, modulus::source_location location) -> std::expected<VALUE, modulus::error> {
|
||||
return modulus::fail<VALUE>(ligo::detail::make_error(code, std::string{std::forward<MESSAGE>(message)}, location));
|
||||
}
|
||||
|
||||
template <typename MESSAGE>
|
||||
auto ligo::detail::fail_void(std::int32_t code, MESSAGE&& message, modulus::source_location location) -> std::expected<void, modulus::error> {
|
||||
auto ligo::detail::fail_void(std::int32_t code, MESSAGE &&message, modulus::source_location location) -> std::expected<void, modulus::error> {
|
||||
return modulus::fail<void>(ligo::detail::make_error(code, std::string{std::forward<MESSAGE>(message)}, location));
|
||||
}
|
||||
|
||||
@@ -25,17 +25,18 @@
|
||||
#include <ligo/detail/errors.hpp>
|
||||
#include <ligo/detail/transport.hpp>
|
||||
|
||||
|
||||
namespace ligo::detail {
|
||||
|
||||
auto cancel_session_stream(boost::beast::tcp_stream& stream) -> void;
|
||||
auto cancel_session_stream(boost::beast::tcp_stream &stream) -> void;
|
||||
template <typename NEXT_LAYER>
|
||||
auto cancel_session_stream(boost::asio::ssl::stream<NEXT_LAYER>& stream) -> void;
|
||||
auto cancel_session_stream(boost::asio::ssl::stream<NEXT_LAYER> &stream) -> void;
|
||||
|
||||
template <typename S>
|
||||
struct session_registry {
|
||||
static auto cancel_waiters(std::vector<std::shared_ptr<boost::asio::steady_timer>> const& live) -> void;
|
||||
auto add(std::shared_ptr<S> const& stream) -> void;
|
||||
auto remove(std::shared_ptr<S> const& stream) -> void;
|
||||
static auto cancel_waiters(std::vector<std::shared_ptr<boost::asio::steady_timer>> const &live) -> void;
|
||||
auto add(std::shared_ptr<S> const &stream) -> void;
|
||||
auto remove(std::shared_ptr<S> const &stream) -> void;
|
||||
auto cancel_all() -> void;
|
||||
auto empty() const -> std::bool_t;
|
||||
auto wait_empty(std::chrono::milliseconds timeout) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -57,34 +58,34 @@ struct session_guard {
|
||||
template <typename S>
|
||||
auto stop_accepting_server(std::shared_ptr<S> state) -> void;
|
||||
template <typename S>
|
||||
auto stop_accepting_server_now(std::shared_ptr<S> const& state) -> void;
|
||||
auto stop_accepting_server_now(std::shared_ptr<S> const &state) -> void;
|
||||
template <typename S>
|
||||
auto async_stop_accepting_server(std::shared_ptr<S> state, std::chrono::milliseconds timeout) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
|
||||
}
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto ligo::detail::cancel_session_stream(boost::asio::ssl::stream<NEXT_LAYER>& stream) -> void {
|
||||
auto ligo::detail::cancel_session_stream(boost::asio::ssl::stream<NEXT_LAYER> &stream) -> void {
|
||||
auto ignored = boost::system::error_code{};
|
||||
stream.lowest_layer().cancel(ignored);
|
||||
stream.lowest_layer().close(ignored);
|
||||
}
|
||||
|
||||
template <typename S>
|
||||
auto ligo::detail::session_registry<S>::cancel_waiters(std::vector<std::shared_ptr<boost::asio::steady_timer>> const& live) -> void {
|
||||
for (auto& waiter : live) {
|
||||
auto ligo::detail::session_registry<S>::cancel_waiters(std::vector<std::shared_ptr<boost::asio::steady_timer>> const &live) -> void {
|
||||
for (auto &waiter : live) {
|
||||
waiter->cancel();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename S>
|
||||
auto ligo::detail::session_registry<S>::add(std::shared_ptr<S> const& stream) -> void {
|
||||
auto ligo::detail::session_registry<S>::add(std::shared_ptr<S> const &stream) -> void {
|
||||
auto lock = std::scoped_lock{mutex};
|
||||
sessions.insert(stream);
|
||||
}
|
||||
|
||||
template <typename S>
|
||||
auto ligo::detail::session_registry<S>::remove(std::shared_ptr<S> const& stream) -> void {
|
||||
auto ligo::detail::session_registry<S>::remove(std::shared_ptr<S> const &stream) -> void {
|
||||
auto live = std::vector<std::shared_ptr<boost::asio::steady_timer>>{};
|
||||
{
|
||||
auto lock = std::scoped_lock{mutex};
|
||||
@@ -101,7 +102,7 @@ auto ligo::detail::session_registry<S>::cancel_all() -> void {
|
||||
auto lock = std::scoped_lock{mutex};
|
||||
copy.assign(sessions.begin(), sessions.end());
|
||||
}
|
||||
for (auto& stream : copy) {
|
||||
for (auto &stream : copy) {
|
||||
boost::asio::post(stream->get_executor(), [stream] {
|
||||
ligo::detail::cancel_session_stream(*stream);
|
||||
});
|
||||
@@ -132,7 +133,7 @@ auto ligo::detail::session_registry<S>::wait_empty(std::chrono::milliseconds tim
|
||||
waiters.push_back(notify_timer);
|
||||
}
|
||||
deadline_timer->expires_after(timeout);
|
||||
deadline_timer->async_wait([notify_timer, timed_out](boost::system::error_code const& error) {
|
||||
deadline_timer->async_wait([notify_timer, timed_out](boost::system::error_code const &error) {
|
||||
if (!error) {
|
||||
timed_out->store(true, std::memory_order_relaxed);
|
||||
notify_timer->cancel();
|
||||
@@ -168,7 +169,7 @@ template <typename S>
|
||||
auto ligo::detail::session_registry<S>::live_waiters_locked() -> std::vector<std::shared_ptr<boost::asio::steady_timer>> {
|
||||
auto live = std::vector<std::shared_ptr<boost::asio::steady_timer>>{};
|
||||
auto retained = std::vector<std::weak_ptr<boost::asio::steady_timer>>{};
|
||||
for (auto& waiter : waiters) {
|
||||
for (auto &waiter : waiters) {
|
||||
if (auto locked = waiter.lock()) {
|
||||
live.push_back(locked);
|
||||
retained.push_back(locked);
|
||||
@@ -209,7 +210,7 @@ auto ligo::detail::stop_accepting_server(std::shared_ptr<S> state) -> void {
|
||||
}
|
||||
|
||||
template <typename S>
|
||||
auto ligo::detail::stop_accepting_server_now(std::shared_ptr<S> const& state) -> void {
|
||||
auto ligo::detail::stop_accepting_server_now(std::shared_ptr<S> const &state) -> void {
|
||||
auto lock = std::scoped_lock{state->lifecycle_mutex};
|
||||
if (state->stopped.exchange(true)) {
|
||||
return;
|
||||
|
||||
@@ -7,16 +7,17 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace ligo::detail {
|
||||
|
||||
class state_handle {
|
||||
public:
|
||||
state_handle() = default;
|
||||
state_handle(ligo::detail::state_handle const&) = delete;
|
||||
state_handle(ligo::detail::state_handle&& other) noexcept;
|
||||
state_handle(ligo::detail::state_handle const &) = delete;
|
||||
state_handle(ligo::detail::state_handle &&other) noexcept;
|
||||
~state_handle() = default;
|
||||
auto operator=(ligo::detail::state_handle const&) -> ligo::detail::state_handle& = delete;
|
||||
auto operator=(ligo::detail::state_handle&& other) noexcept -> ligo::detail::state_handle&;
|
||||
auto operator=(ligo::detail::state_handle const &) -> ligo::detail::state_handle & = delete;
|
||||
auto operator=(ligo::detail::state_handle &&other) noexcept -> ligo::detail::state_handle &;
|
||||
explicit operator std::bool_t() const noexcept;
|
||||
template <typename S>
|
||||
explicit state_handle(std::shared_ptr<S> state);
|
||||
@@ -29,27 +30,28 @@ private:
|
||||
class unique_state {
|
||||
public:
|
||||
unique_state() noexcept = default;
|
||||
unique_state(ligo::detail::unique_state const&) = delete;
|
||||
unique_state(ligo::detail::unique_state&&) noexcept = default;
|
||||
unique_state(ligo::detail::unique_state const &) = delete;
|
||||
unique_state(ligo::detail::unique_state &&) noexcept = default;
|
||||
~unique_state() = default;
|
||||
auto operator=(ligo::detail::unique_state const&) -> ligo::detail::unique_state& = delete;
|
||||
auto operator=(ligo::detail::unique_state&&) noexcept -> ligo::detail::unique_state& = default;
|
||||
auto operator=(ligo::detail::unique_state const &) -> ligo::detail::unique_state & = delete;
|
||||
auto operator=(ligo::detail::unique_state &&) noexcept -> ligo::detail::unique_state & = default;
|
||||
explicit operator std::bool_t() const noexcept;
|
||||
template <typename STATE>
|
||||
explicit unique_state(std::unique_ptr<STATE> state);
|
||||
template <typename STATE>
|
||||
auto as() const noexcept -> STATE*;
|
||||
auto as() const noexcept -> STATE *;
|
||||
private:
|
||||
static auto ignore_state(void* state) -> void;
|
||||
static auto ignore_state(void *state) -> void;
|
||||
template <typename STATE>
|
||||
static auto delete_state(void* state) -> void;
|
||||
std::unique_ptr<void, std::function<void(void*)>> state_{nullptr, ignore_state};
|
||||
static auto delete_state(void *state) -> void;
|
||||
std::unique_ptr<void, std::function<void(void *)>> state_{nullptr, ignore_state};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
template <typename STATE>
|
||||
ligo::detail::state_handle::state_handle(std::shared_ptr<STATE> state) : state_{std::shared_ptr<void>{std::move(state)}} {}
|
||||
ligo::detail::state_handle::state_handle(std::shared_ptr<STATE> state)
|
||||
: state_{std::shared_ptr<void>{std::move(state)}} {}
|
||||
|
||||
template <typename STATE>
|
||||
auto ligo::detail::state_handle::as() const -> std::shared_ptr<STATE> {
|
||||
@@ -57,14 +59,15 @@ auto ligo::detail::state_handle::as() const -> std::shared_ptr<STATE> {
|
||||
}
|
||||
|
||||
template <typename STATE>
|
||||
ligo::detail::unique_state::unique_state(std::unique_ptr<STATE> state) : state_{state.release(), delete_state<STATE>} {}
|
||||
ligo::detail::unique_state::unique_state(std::unique_ptr<STATE> state)
|
||||
: state_{state.release(), delete_state<STATE>} {}
|
||||
|
||||
template <typename STATE>
|
||||
auto ligo::detail::unique_state::as() const noexcept -> STATE* {
|
||||
return static_cast<STATE*>(state_.get());
|
||||
auto ligo::detail::unique_state::as() const noexcept -> STATE * {
|
||||
return static_cast<STATE *>(state_.get());
|
||||
}
|
||||
|
||||
template <typename STATE>
|
||||
auto ligo::detail::unique_state::delete_state(void* state) -> void {
|
||||
delete static_cast<STATE*>(state);
|
||||
auto ligo::detail::unique_state::delete_state(void *state) -> void {
|
||||
delete static_cast<STATE *>(state);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <ligo/detail/errors.hpp>
|
||||
#include <ligo/service.hpp>
|
||||
|
||||
|
||||
namespace ligo::detail {
|
||||
|
||||
struct endpoint_parts {
|
||||
@@ -37,13 +38,13 @@ struct endpoint_parts {
|
||||
|
||||
auto status_name(std::int32_t code) -> std::string;
|
||||
auto parse_status_code(std::string_view value) -> std::int32_t;
|
||||
auto network_failure(boost::system::error_code const& error) -> modulus::error;
|
||||
auto operation_failure(boost::system::error_code const& error, std::string timeout_message) -> modulus::error;
|
||||
auto network_failure(boost::system::error_code const &error) -> modulus::error;
|
||||
auto operation_failure(boost::system::error_code const &error, std::string timeout_message) -> modulus::error;
|
||||
auto invalid_argument(std::string message) -> modulus::error;
|
||||
auto unavailable(std::string message) -> modulus::error;
|
||||
auto validate_positive_timeout(std::chrono::milliseconds timeout, std::string_view name) -> std::expected<void, modulus::error>;
|
||||
auto report_error(std::function<void(modulus::error)> const& on_error, modulus::error error) -> void;
|
||||
auto report_error(std::function<void(modulus::error)> const& on_error, std::expected<void, modulus::error> status) -> void;
|
||||
auto report_error(std::function<void(modulus::error)> const &on_error, modulus::error error) -> void;
|
||||
auto report_error(std::function<void(modulus::error)> const &on_error, std::expected<void, modulus::error> status) -> void;
|
||||
auto response_envelope(std::expected<boost::json::value, modulus::error> result) -> boost::json::value;
|
||||
auto serialize_response_envelope(std::expected<boost::json::value, modulus::error> result) -> std::string;
|
||||
auto unwrap_response_envelope(boost::json::value value, std::string_view protocol_name) -> std::expected<boost::json::value, modulus::error>;
|
||||
@@ -51,10 +52,10 @@ auto parse_port(std::string_view text) -> std::expected<std::uint16_t, modulus::
|
||||
auto parse_endpoint_text(std::string_view text, std::uint16_t fallback_port) -> std::expected<ligo::detail::endpoint_parts, modulus::error>;
|
||||
auto parse_client_endpoint_text(std::string_view text) -> std::expected<ligo::detail::endpoint_parts, modulus::error>;
|
||||
auto parse_server_endpoint_text(std::string_view text) -> std::expected<ligo::detail::endpoint_parts, modulus::error>;
|
||||
auto start_tcp_acceptor(boost::asio::ip::tcp::acceptor& acceptor, std::string const& host, std::uint16_t port) -> std::expected<std::uint16_t, modulus::error>;
|
||||
auto resolve_tcp_endpoints(boost::asio::any_io_executor executor, std::string const& host, std::uint16_t port, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<boost::asio::ip::tcp::resolver::results_type, modulus::error>>;
|
||||
auto call_handler(ligo::service_router const& router, ligo::request_context context, boost::json::value payload) -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
auto call_response_handler(ligo::service_router const& router, ligo::request_context context, boost::json::value payload) -> boost::asio::awaitable<std::expected<ligo::service_response, modulus::error>>;
|
||||
auto start_tcp_acceptor(boost::asio::ip::tcp::acceptor &acceptor, std::string const &host, std::uint16_t port) -> std::expected<std::uint16_t, modulus::error>;
|
||||
auto resolve_tcp_endpoints(boost::asio::any_io_executor executor, std::string const &host, std::uint16_t port, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<boost::asio::ip::tcp::resolver::results_type, modulus::error>>;
|
||||
auto call_handler(ligo::service_router const &router, ligo::request_context context, boost::json::value payload) -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
auto call_response_handler(ligo::service_router const &router, ligo::request_context context, boost::json::value payload) -> boost::asio::awaitable<std::expected<ligo::service_response, modulus::error>>;
|
||||
|
||||
struct stream_deadline {
|
||||
std::shared_ptr<boost::asio::steady_timer> timer{};
|
||||
@@ -63,29 +64,29 @@ struct stream_deadline {
|
||||
std::shared_ptr<boost::asio::cancellation_signal> cancellation{};
|
||||
};
|
||||
|
||||
auto start_stream_deadline(boost::beast::tcp_stream& stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
auto start_stream_deadline(boost::asio::ip::tcp::socket& socket, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
auto start_stream_deadline(boost::beast::tcp_stream &stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
auto start_stream_deadline(boost::asio::ip::tcp::socket &socket, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto start_stream_deadline(boost::asio::ssl::stream<NEXT_LAYER>& stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
auto start_stream_deadline(boost::asio::ssl::stream<NEXT_LAYER> &stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline;
|
||||
|
||||
auto cancel_stream_deadline(ligo::detail::stream_deadline& deadline) -> void;
|
||||
auto deadline_token(ligo::detail::stream_deadline& deadline) -> decltype(boost::asio::bind_cancellation_slot(std::declval<boost::asio::cancellation_slot>(), boost::asio::as_tuple(boost::asio::use_awaitable)));
|
||||
auto operation_failure(boost::system::error_code const& error, ligo::detail::stream_deadline const& deadline, std::string timeout_message) -> modulus::error;
|
||||
auto cancel_stream_deadline(ligo::detail::stream_deadline &deadline) -> void;
|
||||
auto deadline_token(ligo::detail::stream_deadline &deadline) -> decltype(boost::asio::bind_cancellation_slot(std::declval<boost::asio::cancellation_slot>(), boost::asio::as_tuple(boost::asio::use_awaitable)));
|
||||
auto operation_failure(boost::system::error_code const &error, ligo::detail::stream_deadline const &deadline, std::string timeout_message) -> modulus::error;
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto async_tls_handshake(boost::asio::ssl::stream<NEXT_LAYER>& stream, boost::asio::ssl::stream_base::handshake_type type, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto async_tls_handshake(boost::asio::ssl::stream<NEXT_LAYER> &stream, boost::asio::ssl::stream_base::handshake_type type, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto async_tls_shutdown(boost::asio::ssl::stream<NEXT_LAYER>& stream, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto async_tls_shutdown(boost::asio::ssl::stream<NEXT_LAYER> &stream, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
|
||||
}
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto ligo::detail::start_stream_deadline(boost::asio::ssl::stream<NEXT_LAYER>& stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline {
|
||||
auto ligo::detail::start_stream_deadline(boost::asio::ssl::stream<NEXT_LAYER> &stream, std::chrono::milliseconds timeout) -> ligo::detail::stream_deadline {
|
||||
auto deadline = ligo::detail::stream_deadline{.timer = std::make_shared<boost::asio::steady_timer>(stream.get_executor()), .timed_out = std::make_shared<std::atomic<std::bool_t>>(false), .active = std::make_shared<std::atomic<std::bool_t>>(true), .cancellation = std::make_shared<boost::asio::cancellation_signal>()};
|
||||
deadline.timer->expires_after(timeout);
|
||||
deadline.timer->async_wait([timer = deadline.timer, timed_out = deadline.timed_out, active = deadline.active, cancellation = deadline.cancellation](boost::system::error_code const& error) {
|
||||
deadline.timer->async_wait([timer = deadline.timer, timed_out = deadline.timed_out, active = deadline.active, cancellation = deadline.cancellation](boost::system::error_code const &error) {
|
||||
if (!error && active->exchange(false, std::memory_order_acq_rel)) {
|
||||
timed_out->store(true, std::memory_order_release);
|
||||
cancellation->emit(boost::asio::cancellation_type::terminal);
|
||||
@@ -95,7 +96,7 @@ auto ligo::detail::start_stream_deadline(boost::asio::ssl::stream<NEXT_LAYER>& s
|
||||
}
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto ligo::detail::async_tls_handshake(boost::asio::ssl::stream<NEXT_LAYER>& stream, boost::asio::ssl::stream_base::handshake_type type, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
|
||||
auto ligo::detail::async_tls_handshake(boost::asio::ssl::stream<NEXT_LAYER> &stream, boost::asio::ssl::stream_base::handshake_type type, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
|
||||
auto deadline = ligo::detail::start_stream_deadline(stream, timeout);
|
||||
auto [error] = co_await stream.async_handshake(type, ligo::detail::deadline_token(deadline));
|
||||
ligo::detail::cancel_stream_deadline(deadline);
|
||||
@@ -106,7 +107,7 @@ auto ligo::detail::async_tls_handshake(boost::asio::ssl::stream<NEXT_LAYER>& str
|
||||
}
|
||||
|
||||
template <typename NEXT_LAYER>
|
||||
auto ligo::detail::async_tls_shutdown(boost::asio::ssl::stream<NEXT_LAYER>& stream, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
|
||||
auto ligo::detail::async_tls_shutdown(boost::asio::ssl::stream<NEXT_LAYER> &stream, std::chrono::milliseconds timeout, std::string timeout_message) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
|
||||
auto deadline = ligo::detail::start_stream_deadline(stream, timeout);
|
||||
auto [error] = co_await stream.async_shutdown(ligo::detail::deadline_token(deadline));
|
||||
ligo::detail::cancel_stream_deadline(deadline);
|
||||
|
||||
+10
-10
@@ -55,7 +55,7 @@ struct server_options {
|
||||
class client {
|
||||
public:
|
||||
explicit client(ligo::http::endpoint endpoint, ligo::http::client_options options = {});
|
||||
auto call(ligo::http::request const& request) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
auto call(ligo::http::request const &request) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
private:
|
||||
ligo::http::endpoint endpoint_{};
|
||||
ligo::http::client_options options_{};
|
||||
@@ -63,13 +63,13 @@ private:
|
||||
|
||||
class server {
|
||||
public:
|
||||
server(boost::asio::io_context& io, ligo::http::endpoint endpoint, ligo::service_router router, ligo::http::server_options options = {});
|
||||
server(boost::asio::io_context &io, ligo::http::endpoint endpoint, ligo::service_router router, ligo::http::server_options options = {});
|
||||
server(boost::asio::any_io_executor executor, ligo::http::endpoint endpoint, ligo::service_router router, ligo::http::server_options options = {});
|
||||
server(ligo::http::server const&) = delete;
|
||||
server(ligo::http::server&&) noexcept = default;
|
||||
server(ligo::http::server const &) = delete;
|
||||
server(ligo::http::server &&) noexcept = default;
|
||||
~server();
|
||||
auto operator=(ligo::http::server const&) -> ligo::http::server& = delete;
|
||||
auto operator=(ligo::http::server&&) noexcept -> ligo::http::server&;
|
||||
auto operator=(ligo::http::server const &) -> ligo::http::server & = delete;
|
||||
auto operator=(ligo::http::server &&) noexcept -> ligo::http::server &;
|
||||
auto start() -> std::expected<void, modulus::error>;
|
||||
auto stop() -> void;
|
||||
auto async_stop(std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -78,9 +78,9 @@ private:
|
||||
ligo::detail::state_handle state_{};
|
||||
};
|
||||
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::http::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::http::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const& config) -> ligo::http::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const& config) -> ligo::http::server_options;
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::http::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::http::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const &config) -> ligo::http::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const &config) -> ligo::http::server_options;
|
||||
|
||||
}
|
||||
|
||||
+10
-10
@@ -25,18 +25,18 @@ class byte_stream_state;
|
||||
class byte_stream {
|
||||
public:
|
||||
byte_stream() = default;
|
||||
byte_stream(ligo::net::byte_stream const&) = delete;
|
||||
byte_stream(ligo::net::byte_stream&&) noexcept = default;
|
||||
byte_stream(ligo::net::byte_stream const &) = delete;
|
||||
byte_stream(ligo::net::byte_stream &&) noexcept = default;
|
||||
~byte_stream();
|
||||
auto operator=(ligo::net::byte_stream const&) -> ligo::net::byte_stream& = delete;
|
||||
auto operator=(ligo::net::byte_stream&&) noexcept -> ligo::net::byte_stream&;
|
||||
auto operator=(ligo::net::byte_stream const &) -> ligo::net::byte_stream & = delete;
|
||||
auto operator=(ligo::net::byte_stream &&) noexcept -> ligo::net::byte_stream &;
|
||||
static auto from_socket(ligo::tcp::socket_handle socket) -> std::expected<ligo::net::byte_stream, modulus::error>;
|
||||
static auto from_tls_socket(ligo::tcp::tls_socket socket) -> std::expected<ligo::net::byte_stream, modulus::error>;
|
||||
auto async_read_some(boost::asio::mutable_buffer buffer, std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<std::size_t, modulus::error>>;
|
||||
auto async_write_some(boost::asio::const_buffer buffer, std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<std::size_t, modulus::error>>;
|
||||
auto async_write_all(boost::asio::const_buffer buffer, std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto async_shutdown(std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto close(boost::system::error_code& error) -> void;
|
||||
auto close(boost::system::error_code &error) -> void;
|
||||
auto is_open() const -> std::bool_t;
|
||||
private:
|
||||
explicit byte_stream(std::shared_ptr<ligo::net::byte_stream_state> state);
|
||||
@@ -46,11 +46,11 @@ private:
|
||||
class listener {
|
||||
public:
|
||||
listener() = default;
|
||||
listener(ligo::net::listener const&) = delete;
|
||||
listener(ligo::net::listener&&) noexcept = default;
|
||||
listener(ligo::net::listener const &) = delete;
|
||||
listener(ligo::net::listener &&) noexcept = default;
|
||||
~listener();
|
||||
auto operator=(ligo::net::listener const&) -> ligo::net::listener& = delete;
|
||||
auto operator=(ligo::net::listener&&) noexcept -> ligo::net::listener&;
|
||||
auto operator=(ligo::net::listener const &) -> ligo::net::listener & = delete;
|
||||
auto operator=(ligo::net::listener &&) noexcept -> ligo::net::listener &;
|
||||
static auto bind(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint) -> std::expected<ligo::net::listener, modulus::error>;
|
||||
auto selected_port() const -> std::uint16_t;
|
||||
auto async_accept() -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
@@ -64,7 +64,7 @@ private:
|
||||
|
||||
auto connect_tcp(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::endpoint_config const& config) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::endpoint_config const &config) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect_tls_configured(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}, ligo::security_config security = {.mode = ligo::security_mode::TLS}) -> boost::asio::awaitable<std::expected<ligo::tcp::tls_socket, modulus::error>>;
|
||||
auto connect_tls_handshaken(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}, ligo::security_config security = {.mode = ligo::security_mode::TLS}) -> boost::asio::awaitable<std::expected<ligo::tcp::tls_socket, modulus::error>>;
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace ligo {
|
||||
|
||||
enum class security_mode {
|
||||
@@ -35,12 +36,12 @@ struct security_config {
|
||||
std::shared_ptr<boost::asio::ssl::context> tls_context{};
|
||||
};
|
||||
|
||||
auto make_tls_client_context(ligo::security_config const& config) -> std::expected<std::shared_ptr<boost::asio::ssl::context>, modulus::error>;
|
||||
auto make_tls_server_context(ligo::security_config const& config) -> std::expected<std::shared_ptr<boost::asio::ssl::context>, modulus::error>;
|
||||
auto apply_tls_client_verification(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& stream, std::string const& host, ligo::security_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto configure_tls_client_stream(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& stream, std::string const& host, ligo::security_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto validate_tls_server_config(std::string_view protocol, ligo::security_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto validate_tls_server_context(std::shared_ptr<boost::asio::ssl::context> const& context) -> std::expected<void, modulus::error>;
|
||||
auto make_tls_client_context(ligo::security_config const &config) -> std::expected<std::shared_ptr<boost::asio::ssl::context>, modulus::error>;
|
||||
auto make_tls_server_context(ligo::security_config const &config) -> std::expected<std::shared_ptr<boost::asio::ssl::context>, modulus::error>;
|
||||
auto apply_tls_client_verification(boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &stream, std::string const &host, ligo::security_config const &config) -> std::expected<void, modulus::error>;
|
||||
auto configure_tls_client_stream(boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &stream, std::string const &host, ligo::security_config const &config) -> std::expected<void, modulus::error>;
|
||||
auto validate_tls_server_config(std::string_view protocol, ligo::security_config const &config) -> std::expected<void, modulus::error>;
|
||||
auto validate_tls_server_context(std::shared_ptr<boost::asio::ssl::context> const &context) -> std::expected<void, modulus::error>;
|
||||
auto unsupported_security(std::string_view protocol, ligo::security_mode mode) -> modulus::error;
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace ligo {
|
||||
|
||||
struct request_context {
|
||||
@@ -29,11 +30,11 @@ struct service_response {
|
||||
class service_router {
|
||||
public:
|
||||
service_router() = default;
|
||||
service_router(ligo::service_router const& other);
|
||||
service_router(ligo::service_router&& other);
|
||||
service_router(ligo::service_router const &other);
|
||||
service_router(ligo::service_router &&other);
|
||||
~service_router() = default;
|
||||
auto operator=(ligo::service_router const& other) -> ligo::service_router&;
|
||||
auto operator=(ligo::service_router&& other) -> ligo::service_router&;
|
||||
auto operator=(ligo::service_router const &other) -> ligo::service_router &;
|
||||
auto operator=(ligo::service_router &&other) -> ligo::service_router &;
|
||||
auto add_route(std::string method, std::string route, std::function<boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>(ligo::request_context, boost::json::value)> handler) -> void;
|
||||
auto add_response_route(std::string method, std::string route, std::function<boost::asio::awaitable<std::expected<ligo::service_response, modulus::error>>(ligo::request_context, boost::json::value)> handler) -> void;
|
||||
auto call(ligo::request_context context, boost::json::value payload) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
|
||||
+23
-22
@@ -33,16 +33,16 @@ struct endpoint {
|
||||
|
||||
struct socket_handle {
|
||||
socket_handle() = default;
|
||||
socket_handle(ligo::tcp::socket_handle const&) = delete;
|
||||
socket_handle(ligo::tcp::socket_handle&&) noexcept = default;
|
||||
socket_handle(ligo::tcp::socket_handle const &) = delete;
|
||||
socket_handle(ligo::tcp::socket_handle &&) noexcept = default;
|
||||
explicit socket_handle(boost::asio::ip::tcp::socket socket);
|
||||
explicit socket_handle(std::shared_ptr<boost::asio::ip::tcp::socket> socket);
|
||||
auto operator=(ligo::tcp::socket_handle const&) -> ligo::tcp::socket_handle& = delete;
|
||||
auto operator=(ligo::tcp::socket_handle&&) noexcept -> ligo::tcp::socket_handle& = default;
|
||||
auto operator=(ligo::tcp::socket_handle const &) -> ligo::tcp::socket_handle & = delete;
|
||||
auto operator=(ligo::tcp::socket_handle &&) noexcept -> ligo::tcp::socket_handle & = default;
|
||||
auto socket() -> std::expected<std::reference_wrapper<boost::asio::ip::tcp::socket>, modulus::error>;
|
||||
auto socket() const -> std::expected<std::reference_wrapper<boost::asio::ip::tcp::socket const>, modulus::error>;
|
||||
auto is_open() const -> std::bool_t;
|
||||
auto close(boost::system::error_code& error) -> void;
|
||||
auto close(boost::system::error_code &error) -> void;
|
||||
auto release_socket() -> std::expected<boost::asio::ip::tcp::socket, modulus::error>;
|
||||
private:
|
||||
std::shared_ptr<boost::asio::ip::tcp::socket> socket_{};
|
||||
@@ -55,17 +55,17 @@ struct tls_socket {
|
||||
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> stream;
|
||||
};
|
||||
tls_socket() = default;
|
||||
tls_socket(ligo::tcp::tls_socket const&) = delete;
|
||||
tls_socket(ligo::tcp::tls_socket&&) noexcept = default;
|
||||
tls_socket(ligo::tcp::tls_socket const &) = delete;
|
||||
tls_socket(ligo::tcp::tls_socket &&) noexcept = default;
|
||||
tls_socket(std::shared_ptr<boost::asio::ssl::context> context, boost::asio::ip::tcp::socket socket);
|
||||
auto operator=(ligo::tcp::tls_socket const&) -> ligo::tcp::tls_socket& = delete;
|
||||
auto operator=(ligo::tcp::tls_socket&&) noexcept -> ligo::tcp::tls_socket& = default;
|
||||
auto operator=(ligo::tcp::tls_socket const &) -> ligo::tcp::tls_socket & = delete;
|
||||
auto operator=(ligo::tcp::tls_socket &&) noexcept -> ligo::tcp::tls_socket & = default;
|
||||
auto stream() -> std::expected<std::reference_wrapper<boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>, modulus::error>;
|
||||
auto stream() const -> std::expected<std::reference_wrapper<boost::asio::ssl::stream<boost::asio::ip::tcp::socket> const>, modulus::error>;
|
||||
auto context() -> std::expected<std::reference_wrapper<boost::asio::ssl::context>, modulus::error>;
|
||||
auto context() const -> std::expected<std::reference_wrapper<boost::asio::ssl::context const>, modulus::error>;
|
||||
auto is_open() const -> std::bool_t;
|
||||
auto close(boost::system::error_code& error) -> void;
|
||||
auto close(boost::system::error_code &error) -> void;
|
||||
auto release_stream() -> std::expected<ligo::tcp::tls_socket::released_stream, modulus::error>;
|
||||
private:
|
||||
std::shared_ptr<boost::asio::ssl::context> context_{};
|
||||
@@ -91,7 +91,7 @@ struct server_options {
|
||||
class client {
|
||||
public:
|
||||
explicit client(ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {});
|
||||
auto call(ligo::tcp::request const& request) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
auto call(ligo::tcp::request const &request) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
|
||||
private:
|
||||
ligo::tcp::endpoint endpoint_{};
|
||||
ligo::tcp::client_options options_{};
|
||||
@@ -99,13 +99,13 @@ private:
|
||||
|
||||
class server {
|
||||
public:
|
||||
server(boost::asio::io_context& io, ligo::tcp::endpoint endpoint, ligo::service_router router, ligo::tcp::server_options options = {});
|
||||
server(boost::asio::io_context &io, ligo::tcp::endpoint endpoint, ligo::service_router router, ligo::tcp::server_options options = {});
|
||||
server(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::service_router router, ligo::tcp::server_options options = {});
|
||||
server(ligo::tcp::server const&) = delete;
|
||||
server(ligo::tcp::server&&) noexcept = default;
|
||||
server(ligo::tcp::server const &) = delete;
|
||||
server(ligo::tcp::server &&) noexcept = default;
|
||||
~server();
|
||||
auto operator=(ligo::tcp::server const&) -> ligo::tcp::server& = delete;
|
||||
auto operator=(ligo::tcp::server&&) noexcept -> ligo::tcp::server&;
|
||||
auto operator=(ligo::tcp::server const &) -> ligo::tcp::server & = delete;
|
||||
auto operator=(ligo::tcp::server &&) noexcept -> ligo::tcp::server &;
|
||||
auto start() -> std::expected<void, modulus::error>;
|
||||
auto stop() -> void;
|
||||
auto async_stop(std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -114,15 +114,16 @@ private:
|
||||
ligo::detail::state_handle state_{};
|
||||
};
|
||||
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::tcp::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::tcp::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const& config) -> ligo::tcp::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const& config) -> ligo::tcp::server_options;
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::tcp::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::tcp::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const &config) -> ligo::tcp::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const &config) -> ligo::tcp::server_options;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::endpoint_config const& config) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect(boost::asio::any_io_executor executor, ligo::endpoint_config const &config) -> boost::asio::awaitable<std::expected<ligo::tcp::socket_handle, modulus::error>>;
|
||||
auto connect_tls_configured(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}, ligo::security_config security = {.mode = ligo::security_mode::TLS}) -> boost::asio::awaitable<std::expected<ligo::tcp::tls_socket, modulus::error>>;
|
||||
auto connect_tls_handshaken(boost::asio::any_io_executor executor, ligo::tcp::endpoint endpoint, ligo::tcp::client_options options = {}, ligo::security_config security = {.mode = ligo::security_mode::TLS}) -> boost::asio::awaitable<std::expected<ligo::tcp::tls_socket, modulus::error>>;
|
||||
|
||||
inline tls_socket::released_stream::released_stream(std::shared_ptr<boost::asio::ssl::context> context, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> stream) : context{std::move(context)}, stream{std::move(stream)} {}
|
||||
inline tls_socket::released_stream::released_stream(std::shared_ptr<boost::asio::ssl::context> context, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> stream)
|
||||
: context{std::move(context)}, stream{std::move(stream)} {}
|
||||
|
||||
}
|
||||
|
||||
+15
-15
@@ -42,15 +42,15 @@ struct server_options {
|
||||
|
||||
class client {
|
||||
public:
|
||||
client(ligo::udp::client const&) = delete;
|
||||
client(ligo::udp::client&&) noexcept = default;
|
||||
client(ligo::udp::client const &) = delete;
|
||||
client(ligo::udp::client &&) noexcept = default;
|
||||
~client();
|
||||
auto operator=(ligo::udp::client const&) -> ligo::udp::client& = delete;
|
||||
auto operator=(ligo::udp::client&&) noexcept -> ligo::udp::client&;
|
||||
auto operator=(ligo::udp::client const &) -> ligo::udp::client & = delete;
|
||||
auto operator=(ligo::udp::client &&) noexcept -> ligo::udp::client &;
|
||||
static auto open(boost::asio::any_io_executor executor, boost::asio::ip::udp::endpoint peer, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto open(boost::asio::io_context& io, boost::asio::ip::udp::endpoint peer, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto open(boost::asio::io_context &io, boost::asio::ip::udp::endpoint peer, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto bind(boost::asio::any_io_executor executor, ligo::udp::endpoint endpoint, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto bind(boost::asio::io_context& io, ligo::udp::endpoint endpoint, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto bind(boost::asio::io_context &io, ligo::udp::endpoint endpoint, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
static auto adopt(std::unique_ptr<boost::asio::ip::udp::socket> socket, boost::asio::ip::udp::endpoint peer, ligo::udp::client_options options = {}) -> std::expected<ligo::udp::client, modulus::error>;
|
||||
auto send(boost::json::value payload) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto send(ligo::udp::message message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -65,13 +65,13 @@ private:
|
||||
|
||||
class server {
|
||||
public:
|
||||
server(ligo::udp::server const&) = delete;
|
||||
server(ligo::udp::server&&) noexcept = default;
|
||||
server(ligo::udp::server const &) = delete;
|
||||
server(ligo::udp::server &&) noexcept = default;
|
||||
~server();
|
||||
auto operator=(ligo::udp::server const&) -> ligo::udp::server& = delete;
|
||||
auto operator=(ligo::udp::server&&) noexcept -> ligo::udp::server&;
|
||||
auto operator=(ligo::udp::server const &) -> ligo::udp::server & = delete;
|
||||
auto operator=(ligo::udp::server &&) noexcept -> ligo::udp::server &;
|
||||
static auto bind(boost::asio::any_io_executor executor, ligo::udp::endpoint endpoint, ligo::udp::server_options options = {}) -> std::expected<ligo::udp::server, modulus::error>;
|
||||
static auto bind(boost::asio::io_context& io, ligo::udp::endpoint endpoint, ligo::udp::server_options options = {}) -> std::expected<ligo::udp::server, modulus::error>;
|
||||
static auto bind(boost::asio::io_context &io, ligo::udp::endpoint endpoint, ligo::udp::server_options options = {}) -> std::expected<ligo::udp::server, modulus::error>;
|
||||
static auto adopt(std::unique_ptr<boost::asio::ip::udp::socket> socket, boost::asio::ip::udp::endpoint peer, ligo::udp::server_options options = {}) -> std::expected<ligo::udp::server, modulus::error>;
|
||||
auto send(boost::json::value payload) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto send(ligo::udp::message message) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -84,9 +84,9 @@ private:
|
||||
ligo::detail::state_handle state_{};
|
||||
};
|
||||
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::udp::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const& config) -> std::expected<ligo::udp::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const& config) -> ligo::udp::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const& config) -> ligo::udp::server_options;
|
||||
auto client_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::udp::endpoint, modulus::error>;
|
||||
auto server_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::udp::endpoint, modulus::error>;
|
||||
auto client_options_from_config(ligo::endpoint_config const &config) -> ligo::udp::client_options;
|
||||
auto server_options_from_config(ligo::endpoint_config const &config) -> ligo::udp::server_options;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user