From 257276d0820c5d4c47d01dece59f4212f4cd4ed9 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 4 Apr 2018 22:41:39 -0700 Subject: [PATCH] modules/federation: Add backfill_ids endpoint handler. --- modules/Makefile.am | 2 + modules/federation/backfill_ids.cc | 128 +++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 modules/federation/backfill_ids.cc diff --git a/modules/Makefile.am b/modules/Makefile.am index b17d42793..2a3245987 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -250,6 +250,7 @@ federation_federation_state_la_SOURCES = federation/state.cc federation_federation_make_leave_la_SOURCES = federation/make_leave.cc federation_federation_send_leave_la_SOURCES = federation/send_leave.cc federation_federation_backfill_la_SOURCES = federation/backfill.cc +federation_federation_backfill_ids_la_SOURCES = federation/backfill_ids.cc federation_module_LTLIBRARIES = \ federation/federation_send.la \ @@ -267,6 +268,7 @@ federation_module_LTLIBRARIES = \ federation/federation_make_leave.la \ federation/federation_send_leave.la \ federation/federation_backfill.la \ + federation/federation_backfill_ids.la \ ### ############################################################################### diff --git a/modules/federation/backfill_ids.cc b/modules/federation/backfill_ids.cc new file mode 100644 index 000000000..cc436dadd --- /dev/null +++ b/modules/federation/backfill_ids.cc @@ -0,0 +1,128 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2018 Jason Volk +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice is present in all copies. The +// full license for this software is available in the LICENSE file. + +using namespace ircd; + +mapi::header +IRCD_MODULE +{ + "federation backfill event IDs" +}; + +resource +backfill_ids_resource +{ + "/_matrix/federation/v1/backfill_ids/", + { + "federation backfill ID's", + resource::DIRECTORY, + } +}; + +conf::item +backfill_ids_limit_max +{ + { "name", "ircd.federation.backfill_ids.limit.max" }, + { "default", 2048L /* TODO: hiiigherrrr */ }, +}; + +conf::item +backfill_ids_limit_default +{ + { "name", "ircd.federation.backfill_ids.limit.default" }, + { "default", 64L }, +}; + +static size_t +calc_limit(const resource::request &request) +{ + const auto &limit + { + request.query["limit"] + }; + + if(!limit) + return size_t(backfill_ids_limit_default); + + size_t ret + { + lex_cast(limit) + }; + + return std::min(ret, size_t(backfill_ids_limit_max)); +} + +resource::response +get__backfill_ids(client &client, + const resource::request &request) +{ + m::room::id::buf room_id + { + url::decode(request.parv[0], room_id) + }; + + m::event::id::buf event_id + { + request.query["v"]? + url::decode(request.query.at("v"), event_id): + m::head(room_id) + }; + + const size_t limit + { + calc_limit(request) + }; + + m::room::messages it + { + room_id, event_id + }; + + //TODO: chunk direct to socket + const unique_buffer buf + { + 512 * limit //TODO: XXX + }; + + json::stack out{buf}; + { + json::stack::object top{out}; + json::stack::member pdus_m + { + top, "pdu_ids" + }; + + json::stack::array pdus + { + pdus_m + }; + + size_t count{0}; + for(; it && count < limit; ++count, --it) + pdus.append(it.event_id()); + } + + return resource::response + { + client, json::object + { + out.completed() + } + }; +} + +resource::method +method_get +{ + backfill_ids_resource, "GET", get__backfill_ids, + { + method_get.VERIFY_ORIGIN + } +};