mirror of
https://github.com/matrix-construct/construct
synced 2024-12-25 23:14:13 +01:00
140 lines
3.1 KiB
C++
140 lines
3.1 KiB
C++
|
// Matrix Construct
|
||
|
//
|
||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
||
|
//
|
||
|
// 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<milliseconds>() }},
|
||
|
};
|
||
|
|
||
|
const json::iov::add _pdus
|
||
|
{
|
||
|
iov, !empty(pdu),
|
||
|
{
|
||
|
"pdus", [&pdu]() -> json::value
|
||
|
{
|
||
|
return { data(pdu), size(pdu) };
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const json::iov::add _edus
|
||
|
{
|
||
|
iov, !empty(edu),
|
||
|
{
|
||
|
"edus", [&edu]() -> json::value
|
||
|
{
|
||
|
return { data(edu), size(edu) };
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const json::iov::add _pdu_failures
|
||
|
{
|
||
|
iov, !empty(pdu_failure),
|
||
|
{
|
||
|
"pdu_failures", [&pdu_failure]() -> 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
|
||
|
{
|
||
|
b58encode(out, hash)
|
||
|
};
|
||
|
|
||
|
return txnid;
|
||
|
}
|