mirror of
https://github.com/matrix-construct/construct
synced 2024-11-18 16:00:57 +01:00
ircd:Ⓜ️:feds: Add some comments/documentation. [skip ci]
This commit is contained in:
parent
d119d9a8c6
commit
7be4137c7e
1 changed files with 38 additions and 10 deletions
|
@ -11,19 +11,22 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#define HAVE_IRCD_M_FEDS_H
|
#define HAVE_IRCD_M_FEDS_H
|
||||||
|
|
||||||
/// Concurrent federation request interface. This fronts several of the m::v1
|
/// Parallel federation network interface. This fronts several of the m::fed
|
||||||
/// requests and conducts them to all servers in a room (e.g. m::room::origins)
|
/// requests and conducts them to all servers in a room (e.g. m::room::origins)
|
||||||
/// at the same time. The hybrid control flow of this interface is best suited
|
/// at the same time.
|
||||||
/// to the real-world uses of these operations.
|
|
||||||
///
|
///
|
||||||
/// Each call in this interface is synchronous and will block the ircd::ctx
|
/// This is a "hybrid" of internally asynchronous operations anchored to a
|
||||||
/// until it returns. The return value is the for_each-protocol result based on your
|
/// context by a synchronous execution device (`feds::execute`). The closure
|
||||||
/// closure (if the closure ever returns false, the function also returns false).
|
/// is invoked asynchronously as results come in. If the closure returns false,
|
||||||
|
/// the interface function will return immediately and all pending requests will
|
||||||
|
/// go out of scope and may be cancelled as per ircd::server decides.
|
||||||
|
///
|
||||||
|
/// Alternatively, m::fetch is another federation network interface much better
|
||||||
|
/// suited to find-and-retrieve for a single piece of data (i.e an event). This
|
||||||
|
/// interface unconditionally launches requests to every server in parallel, if
|
||||||
|
/// one server's response provides a satisfying result this method can be
|
||||||
|
/// wasteful in comparison.
|
||||||
///
|
///
|
||||||
/// The closure is invoked asynchronously as results come in. If the closure
|
|
||||||
/// returns false, the interface function will return immediately and all
|
|
||||||
/// pending requests will go out of scope and may be cancelled as per
|
|
||||||
/// ircd::server decides.
|
|
||||||
namespace ircd::m::feds
|
namespace ircd::m::feds
|
||||||
{
|
{
|
||||||
enum class op :uint8_t;
|
enum class op :uint8_t;
|
||||||
|
@ -33,17 +36,42 @@ namespace ircd::m::feds
|
||||||
using closure = std::function<bool (const result &)>;
|
using closure = std::function<bool (const result &)>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Execute federation operations in parallel.
|
||||||
|
///
|
||||||
|
/// This device is invoked with request options and a result closure. If
|
||||||
|
/// the user wishes to execute multiple parallel operations in parallel,
|
||||||
|
/// a vector of options can be passed. The result structure passed to the
|
||||||
|
/// user's closure contains a pointer to the related opts structure, so
|
||||||
|
/// the user can distinguish different requests in their options vector.
|
||||||
|
///
|
||||||
struct ircd::m::feds::execute
|
struct ircd::m::feds::execute
|
||||||
{
|
{
|
||||||
execute(const vector_view<const opts> &, const closure &);
|
execute(const vector_view<const opts> &, const closure &);
|
||||||
execute(const opts &, const closure &);
|
execute(const opts &, const closure &);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Result structure created internally when a result arrives and passed to
|
||||||
|
/// the user's closure. The structure is merely an alternative to specifying
|
||||||
|
/// a lot of arguments to the closure.
|
||||||
|
///
|
||||||
struct ircd::m::feds::result
|
struct ircd::m::feds::result
|
||||||
{
|
{
|
||||||
|
/// Points at the opts passed to execute().
|
||||||
const opts *request;
|
const opts *request;
|
||||||
|
|
||||||
|
/// The remote server which provided this result.
|
||||||
string_view origin;
|
string_view origin;
|
||||||
|
|
||||||
|
/// Error pointer. This will contain an exception if a remote cannot be
|
||||||
|
/// contacted, or did not return a 2xx HTTP status. When the eptr is set
|
||||||
|
/// the result contents (below) will be empty. Note that several options
|
||||||
|
/// control the conditions for invoking the closure with this eptr set.
|
||||||
std::exception_ptr eptr;
|
std::exception_ptr eptr;
|
||||||
|
|
||||||
|
/// Result content. This points to successfully received result JSON from
|
||||||
|
/// the remote; or empty if eptr is set. Note that both of these point to
|
||||||
|
/// the same content because the user is most likely expecting one and
|
||||||
|
/// ircd::json will just throw if trouble.
|
||||||
json::object object;
|
json::object object;
|
||||||
json::array array;
|
json::array array;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue