// 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. /// Returns the serial size of the JSON this txn would consume. Note: this /// creates a json::iov involving a timestamp to figure out the total size /// of the txn. When the user creates the actual txn a different timestamp /// is created which may be a different size. Consider using the lower-level /// create(closure) or add some pad to be sure. /// size_t ircd::m::txn::serialized(const array &pdu, const array &edu, const array &pdu_failure) { size_t ret; const auto closure{[&ret] (const json::iov &iov) { ret = json::serialized(iov); }}; create(closure, pdu, edu, pdu_failure); return ret; } /// Stringifies a txn from the inputs into the returned std::string /// std::string ircd::m::txn::create(const array &pdu, const array &edu, const array &pdu_failure) { std::string ret; const auto closure{[&ret] (const json::iov &iov) { ret = json::strung(iov); }}; create(closure, pdu, edu, pdu_failure); return ret; } /// Stringifies a txn from the inputs into the buffer /// ircd::string_view ircd::m::txn::create(const mutable_buffer &buf, const array &pdu, const array &edu, const array &pdu_failure) { string_view ret; const auto closure{[&buf, &ret] (const json::iov &iov) { ret = json::stringify(mutable_buffer{buf}, iov); }}; create(closure, pdu, edu, pdu_failure); return ret; } /// Forms a txn from the inputs into a json::iov and presents that iov /// to the user's closure. /// void ircd::m::txn::create(const closure &closure, const array &pdu, const array &edu, const array &pdu_failure) { using ircd::size; json::iov iov; const json::iov::push push[] { { iov, { "origin", my_host() }}, { iov, { "origin_server_ts", ircd::time() }}, }; const json::iov::add _pdus { iov, !empty(pdu), { "pdus", [&pdu]() noexcept -> json::value { return { data(pdu), size(pdu) }; } } }; const json::iov::add _edus { iov, !empty(edu), { "edus", [&edu]() noexcept -> json::value { return { data(edu), size(edu) }; } } }; const json::iov::add _pdu_failures { iov, !empty(pdu_failure), { "pdu_failures", [&pdu_failure]() noexcept -> json::value { return { data(pdu_failure), size(pdu_failure) }; } } }; closure(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 { b58::encode(out, hash) }; return txnid; }