ircd:Ⓜ️:fed: Add indirection interface.

This commit is contained in:
Jason Volk 2020-04-25 19:40:46 -07:00
parent 4960912848
commit 267e978247
2 changed files with 101 additions and 3 deletions

View File

@ -14,13 +14,21 @@
/// Federation Interface
namespace ircd::m::fed
{
net::hostport matrix_service(net::hostport);
id::event::buf fetch_head(const id::room &room_id, const string_view &remote, const id::user &);
id::event::buf fetch_head(const id::room &room_id, const string_view &remote);
string_view fetch_well_known(const mutable_buffer &out, const string_view &origin);
string_view well_known(const mutable_buffer &out, const string_view &origin);
net::hostport matrix_service(net::hostport remote) noexcept;
net::hostport server(const mutable_buffer &out, const string_view &origin);
bool errant(const string_view &origin);
bool linked(const string_view &origin);
bool exists(const string_view &origin);
bool avail(const string_view &origin);
bool clear_error(const string_view &origin);
}
#include "request.h"
@ -46,7 +54,10 @@ namespace ircd::m::fed
inline ircd::net::hostport
ircd::m::fed::matrix_service(net::hostport remote)
noexcept
{
net::service(remote) = net::service(remote)?: m::canon_service;
if(likely(!net::port(remote)))
net::service(remote) = net::service(remote)?: m::canon_service;
return remote;
}

View File

@ -1448,6 +1448,93 @@ ircd::m::fed::request::request(const mutable_buffer &buf_,
// fed/fed.h
//
namespace ircd::m::fed
{
template<class closure>
static decltype(auto)
with_server(const string_view &,
closure &&);
}
template<class closure>
decltype(auto)
ircd::m::fed::with_server(const string_view &origin,
closure&& c)
{
char buf[rfc3986::DOMAIN_BUFSIZE];
const auto remote
{
server(buf, origin)
};
return c(remote);
}
bool
ircd::m::fed::clear_error(const string_view &origin)
{
return with_server(origin, []
(const auto &remote)
{
return server::errclear(remote);
});
}
bool
ircd::m::fed::avail(const string_view &origin)
{
return with_server(origin, []
(const auto &remote)
{
return server::avail(remote);
});
}
bool
ircd::m::fed::exists(const string_view &origin)
{
return with_server(origin, []
(const auto &remote)
{
return server::exists(remote);
});
}
bool
ircd::m::fed::linked(const string_view &origin)
{
return with_server(origin, []
(const auto &remote)
{
return server::linked(remote);
});
}
bool
ircd::m::fed::errant(const string_view &origin)
{
return with_server(origin, []
(const auto &remote)
{
return server::errant(remote);
});
}
ircd::net::hostport
ircd::m::fed::server(const mutable_buffer &buf,
const string_view &origin)
{
net::hostport remote
{
origin
};
if(likely(!port(remote)))
remote = well_known(buf, host(remote));
return matrix_service(remote);
}
//
// fetch_head util
//