From 2c4498502a23dc710bc52871d2f7c249dbb70435 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 9 Mar 2018 17:53:18 -0800 Subject: [PATCH] ircd::m: Add txn creation util. --- include/ircd/m/txn.h | 4 +++ ircd/m/m.cc | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/include/ircd/m/txn.h b/include/ircd/m/txn.h index 409c6c96f..51a6bd875 100644 --- a/include/ircd/m/txn.h +++ b/include/ircd/m/txn.h @@ -28,6 +28,10 @@ struct ircd::m::txn json::property > { + using array = std::pair; + static string_view create_id(const mutable_buffer &out, const string_view &txn); + static std::string create(const array &pdu, const array &edu, const array &pdu_failure = {}); + using super_type::tuple; using super_type::operator=; }; diff --git a/ircd/m/m.cc b/ircd/m/m.cc index 433bb7fac..fdb2fa0a9 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -1187,6 +1187,70 @@ ircd::m::exists(const id::room_alias &room_alias, return function(room_alias, remote_query); } +/////////////////////////////////////////////////////////////////////////////// +// +// m/txn.h +// + +std::string +ircd::m::txn::create(const array &pdu, + const array &edu, + const array &pdu_failure) +{ + json::iov iov; + const json::iov::push push[] + { + { iov, { "origin", my_host() }}, + { iov, { "origin_server_ts", ircd::time() }}, + }; + + const json::iov::add_if _pdus + { + iov, pdu.second, + { + "pdus", { pdu.first, pdu.second } + } + }; + + const json::iov::add_if _edus + { + iov, edu.second, + { + "edus", { edu.first, edu.second } + } + }; + + const json::iov::add_if _pdu_failures + { + iov, pdu_failure.second, + { + "pdu_failures", { pdu_failure.first, pdu_failure.second } + } + }; + + return json::strung + { + iov + }; +} + +ircd::string_view +ircd::m::txn::create_id(const mutable_buffer &out, + const string_view &txn) +{ + const sha256::buf hash + { + sha256{txn} + }; + + const string_view txnid + { + b58encode(out, hash) + }; + + return txnid; +} + /////////////////////////////////////////////////////////////////////////////// // // m/hook.h