0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 15:33:54 +01:00

ircd:Ⓜ️:vm: Add wrapping to accepted event notify; further merge EDU and PDU core path.

This commit is contained in:
Jason Volk 2018-03-12 19:07:41 -07:00
parent 8091bdd007
commit 9749d7c609
2 changed files with 77 additions and 27 deletions

View file

@ -19,6 +19,7 @@ namespace ircd::m::vm
struct error; // custom exception
struct opts;
struct eval;
struct accepted;
using fault_t = std::underlying_type<fault>::type;
using closure = std::function<void (const event &)>;
@ -26,7 +27,7 @@ namespace ircd::m::vm
extern struct log::log log;
extern uint64_t current_sequence;
extern ctx::shared_view<const event> accept;
extern ctx::shared_view<accepted> accept;
extern const opts default_opts;
event::id::buf commit(const m::event &, const opts & = default_opts);
@ -146,6 +147,19 @@ struct ircd::m::vm::opts
bool infolog_accept {false};
};
struct ircd::m::vm::accepted
:m::event
{
ctx::ctx *context;
const vm::opts *opts;
const event::conforms *report;
std::string strung;
accepted(const m::event &event,
const vm::opts *const &opts,
const event::conforms *const &report);
};
struct ircd::m::vm::error
:m::error
{

View file

@ -221,10 +221,37 @@ try
};
// A conforming (with lots of masks) event without an event_id is an EDU.
if(!json::get<"event_id"_>(event))
return _eval_edu(*this, event);
const fault ret
{
json::get<"event_id"_>(event)?
_eval_pdu(*this, event):
_eval_edu(*this, event)
};
return _eval_pdu(*this, event);
if(ret != fault::ACCEPT)
return ret;
vm::accepted accepted
{
event, opts, &report
};
if(opts->notify)
{
notify_hook(event);
vm::accept.expose(accepted);
}
if(opts->effects)
_tmp_effects(event);
if(opts->debuglog_accept)
log.debug("%s", pretty_oneline(event));
if(opts->infolog_accept)
log.info("%s", pretty_oneline(event));
return ret;
}
catch(const error &e)
{
@ -376,30 +403,16 @@ ircd::m::vm::_eval_pdu(eval &eval,
if(opts.write)
write(eval);
if(opts.notify)
{
notify_hook(event);
vm::accept.expose(event);
}
if(opts.effects)
_tmp_effects(event);
if(opts.debuglog_accept)
log.debug("%s", pretty_oneline(event));
if(opts.infolog_accept)
log.info("%s", pretty_oneline(event));
return fault::ACCEPT;
}
void
ircd::m::vm::write(eval &eval)
{
log.debug("Committing %zu cells in %zu bytes to events database...",
eval.txn.size(),
eval.txn.bytes());
if(eval.opts->debuglog_accept)
log.debug("Committing %zu cells in %zu bytes to events database...",
eval.txn.size(),
eval.txn.bytes());
eval.txn();
vm::current_sequence++;
@ -428,8 +441,6 @@ ircd::m::vm::reflect(const enum fault &code)
void
ircd::m::vm::_tmp_effects(const m::event &event)
{
const m::room::id room_id{at<"room_id"_>(event)};
const m::user::id sender{at<"sender"_>(event)};
const auto &type{at<"type"_>(event)};
//TODO: X
@ -448,15 +459,40 @@ ircd::m::vm::_tmp_effects(const m::event &event)
*/
//TODO: X
if(type == "m.room.member" && my_host(sender.host()))
if(type == "m.room.member")
{
const m::room::id room_id{at<"room_id"_>(event)};
const m::user::id sender{at<"sender"_>(event)};
//TODO: ABA / TXN
if(!exists(sender))
create(sender);
//TODO: ABA / TXN
m::user::room user_room{sender};
send(user_room, sender, "ircd.member", room_id, at<"content"_>(event));
}
//TODO: X
if(type == "m.room.join_rules" && my_host(sender.host()))
if(type == "m.room.join_rules")
{
send(room::id{"!public:zemos.net"}, sender, "ircd.room", room_id, {});
const m::room::id room_id{at<"room_id"_>(event)};
const m::user::id sender{at<"sender"_>(event)};
if(my_host(sender.host()))
send(room::id{"!public:zemos.net"}, sender, "ircd.room", room_id, {});
}
}
//
// accepted
//
ircd::m::vm::accepted::accepted(const m::event &event,
const vm::opts *const &opts,
const event::conforms *const &report)
:m::event{event}
,context{ctx::current}
,opts{opts}
,report{report}
{
}