mirror of
https://github.com/matrix-construct/construct
synced 2025-01-14 00:34:18 +01:00
ircd:Ⓜ️ Rename most vm.notify hooks to vm.effect; Refactor vm::accept related.
This commit is contained in:
parent
e2bc5a5245
commit
9aa6e2b768
22 changed files with 249 additions and 153 deletions
|
@ -19,12 +19,10 @@ namespace ircd::m::vm
|
||||||
struct opts;
|
struct opts;
|
||||||
struct copts;
|
struct copts;
|
||||||
struct eval;
|
struct eval;
|
||||||
struct accepted;
|
|
||||||
enum fault :uint;
|
enum fault :uint;
|
||||||
using fault_t = std::underlying_type<fault>::type;
|
using fault_t = std::underlying_type<fault>::type;
|
||||||
|
|
||||||
extern log::log log;
|
extern log::log log;
|
||||||
extern ctx::shared_view<accepted> accept;
|
|
||||||
extern uint64_t current_sequence;
|
extern uint64_t current_sequence;
|
||||||
extern const opts default_opts;
|
extern const opts default_opts;
|
||||||
extern const copts default_copts;
|
extern const copts default_copts;
|
||||||
|
@ -244,21 +242,6 @@ struct ircd::m::vm::copts
|
||||||
bool infolog_postcommit {false};
|
bool infolog_postcommit {false};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ircd::m::vm::accepted
|
|
||||||
:m::event
|
|
||||||
{
|
|
||||||
ctx::ctx *context;
|
|
||||||
const vm::opts *opts;
|
|
||||||
const vm::copts *copts;
|
|
||||||
const event::conforms *report;
|
|
||||||
shared_buffer<mutable_buffer> strung;
|
|
||||||
|
|
||||||
accepted(const m::event &event,
|
|
||||||
const vm::opts *const &opts,
|
|
||||||
const vm::copts *const &copts,
|
|
||||||
const event::conforms *const &report);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ircd::m::vm::error
|
struct ircd::m::vm::error
|
||||||
:m::error
|
:m::error
|
||||||
{
|
{
|
||||||
|
|
20
ircd/m/m.cc
20
ircd/m/m.cc
|
@ -480,10 +480,6 @@ ircd::m::vm::log
|
||||||
"vm", 'v'
|
"vm", 'v'
|
||||||
};
|
};
|
||||||
|
|
||||||
decltype(ircd::m::vm::accept)
|
|
||||||
ircd::m::vm::accept
|
|
||||||
{};
|
|
||||||
|
|
||||||
decltype(ircd::m::vm::current_sequence)
|
decltype(ircd::m::vm::current_sequence)
|
||||||
ircd::m::vm::current_sequence
|
ircd::m::vm::current_sequence
|
||||||
{};
|
{};
|
||||||
|
@ -699,22 +695,6 @@ ircd::m::vm::eval::operator()(const event &event)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// accepted
|
|
||||||
//
|
|
||||||
|
|
||||||
ircd::m::vm::accepted::accepted(const m::event &event,
|
|
||||||
const vm::opts *const &opts,
|
|
||||||
const vm::copts *const &copts,
|
|
||||||
const event::conforms *const &report)
|
|
||||||
:m::event{event}
|
|
||||||
,context{ctx::current}
|
|
||||||
,opts{opts}
|
|
||||||
,copts{copts}
|
|
||||||
,report{report}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// m/keys.h
|
// m/keys.h
|
||||||
|
|
|
@ -253,16 +253,16 @@ room_alias_fetch(const mutable_buffer &out,
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_create_alias_room
|
_create_alias_room
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
},
|
},
|
||||||
|
|
||||||
[](const m::event &)
|
[](const m::event &, m::vm::eval &)
|
||||||
{
|
{
|
||||||
m::create(alias_room_id, m::me.user_id);
|
m::create(alias_room_id, m::me.user_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -328,7 +328,8 @@ put__presence_status(client &client,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_my_presence_changed(const m::event &event)
|
handle_my_presence_changed(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
{
|
{
|
||||||
if(!my(event))
|
if(!my(event))
|
||||||
return;
|
return;
|
||||||
|
@ -349,12 +350,12 @@ handle_my_presence_changed(const m::event &event)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
my_presence_changed
|
my_presence_changed
|
||||||
{
|
{
|
||||||
handle_my_presence_changed,
|
handle_my_presence_changed,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "ircd.presence" },
|
{ "type", "ircd.presence" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -366,7 +366,8 @@ handle_my_profile_changed__avatar_url(const m::event &event)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_my_profile_changed(const m::event &event)
|
handle_my_profile_changed(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
{
|
{
|
||||||
if(!my(event))
|
if(!my(event))
|
||||||
return;
|
return;
|
||||||
|
@ -389,12 +390,12 @@ handle_my_profile_changed(const m::event &event)
|
||||||
return handle_my_profile_changed__avatar_url(event);
|
return handle_my_profile_changed__avatar_url(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
my_profile_changed
|
my_profile_changed
|
||||||
{
|
{
|
||||||
handle_my_profile_changed,
|
handle_my_profile_changed,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "ircd.profile" },
|
{ "type", "ircd.profile" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -323,7 +323,8 @@ post__publicrooms_remote(client &client,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_create_public_room(const m::event &)
|
_create_public_room(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
m::create(public_room_id, m::me.user_id);
|
m::create(public_room_id, m::me.user_id);
|
||||||
}
|
}
|
||||||
|
@ -331,12 +332,12 @@ _create_public_room(const m::event &)
|
||||||
/// Create the public rooms room at the appropriate time on startup.
|
/// Create the public rooms room at the appropriate time on startup.
|
||||||
/// The startup event chosen here is when @ircd joins the !ircd room,
|
/// The startup event chosen here is when @ircd joins the !ircd room,
|
||||||
/// which is a fundamental notification toward the end of init.
|
/// which is a fundamental notification toward the end of init.
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_create_public_hook
|
_create_public_hook
|
||||||
{
|
{
|
||||||
_create_public_room,
|
_create_public_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,29 +130,59 @@ catch(const bad_lex_cast &e)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// longpoll
|
||||||
|
//
|
||||||
|
|
||||||
|
decltype(ircd::m::sync::longpoll::notified)
|
||||||
|
ircd::m::sync::longpoll::notified
|
||||||
|
{
|
||||||
|
handle_notify,
|
||||||
|
{
|
||||||
|
{ "_site", "vm.notify" },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::m::sync::longpoll::handle_notify(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
|
{
|
||||||
|
assert(eval.opts);
|
||||||
|
if(!eval.opts->notify_clients)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!polling)
|
||||||
|
return;
|
||||||
|
|
||||||
|
queue.emplace_back(eval);
|
||||||
|
dock.notify_all();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ircd::m::sync::longpoll::poll(client &client,
|
ircd::m::sync::longpoll::poll(client &client,
|
||||||
const args &args)
|
const args &args)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::unique_lock<decltype(m::vm::accept)> lock
|
++polling;
|
||||||
|
const unwind unpoll{[]
|
||||||
{
|
{
|
||||||
m::vm::accept
|
--polling;
|
||||||
};
|
}};
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
auto &accepted
|
dock.wait_until(args.timesout);
|
||||||
{
|
if(queue.empty())
|
||||||
m::vm::accept.wait_until(lock, args.timesout)
|
|
||||||
};
|
|
||||||
|
|
||||||
assert(accepted.opts);
|
|
||||||
if(!accepted.opts->notify_clients)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(handle(client, args, accepted))
|
const auto &a(queue.front());
|
||||||
return;
|
const unwind pop{[]
|
||||||
|
{
|
||||||
|
queue.pop_front();
|
||||||
|
}};
|
||||||
|
|
||||||
|
if(handle(client, args, a))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(const ctx::timeout &e)
|
catch(const ctx::timeout &e)
|
||||||
|
@ -178,7 +208,7 @@ catch(const ctx::timeout &e)
|
||||||
bool
|
bool
|
||||||
ircd::m::sync::longpoll::handle(client &client,
|
ircd::m::sync::longpoll::handle(client &client,
|
||||||
const args &args,
|
const args &args,
|
||||||
const vm::accepted &event)
|
const accepted &event)
|
||||||
{
|
{
|
||||||
const auto &room_id
|
const auto &room_id
|
||||||
{
|
{
|
||||||
|
@ -197,7 +227,7 @@ ircd::m::sync::longpoll::handle(client &client,
|
||||||
bool
|
bool
|
||||||
ircd::m::sync::longpoll::handle(client &client,
|
ircd::m::sync::longpoll::handle(client &client,
|
||||||
const args &args,
|
const args &args,
|
||||||
const vm::accepted &event,
|
const accepted &event,
|
||||||
const m::room &room)
|
const m::room &room)
|
||||||
{
|
{
|
||||||
const m::user::id &user_id
|
const m::user::id &user_id
|
||||||
|
@ -261,7 +291,7 @@ ircd::m::sync::longpoll::sync_rooms(client &client,
|
||||||
const m::user::id &user_id,
|
const m::user::id &user_id,
|
||||||
const m::room &room,
|
const m::room &room,
|
||||||
const args &args,
|
const args &args,
|
||||||
const vm::accepted &event)
|
const accepted &event)
|
||||||
{
|
{
|
||||||
std::vector<std::string> r;
|
std::vector<std::string> r;
|
||||||
std::vector<json::member> m;
|
std::vector<json::member> m;
|
||||||
|
@ -290,7 +320,7 @@ std::string
|
||||||
ircd::m::sync::longpoll::sync_room(client &client,
|
ircd::m::sync::longpoll::sync_room(client &client,
|
||||||
const m::room &room,
|
const m::room &room,
|
||||||
const args &args,
|
const args &args,
|
||||||
const vm::accepted &accepted)
|
const accepted &accepted)
|
||||||
{
|
{
|
||||||
const auto &since
|
const auto &since
|
||||||
{
|
{
|
||||||
|
@ -302,12 +332,12 @@ ircd::m::sync::longpoll::sync_room(client &client,
|
||||||
if(defined(json::get<"event_id"_>(event)))
|
if(defined(json::get<"event_id"_>(event)))
|
||||||
{
|
{
|
||||||
json::strung strung(event);
|
json::strung strung(event);
|
||||||
if(accepted.copts && accepted.copts->client_txnid)
|
if(!!accepted.client_txnid)
|
||||||
strung = json::insert(strung, json::member
|
strung = json::insert(strung, json::member
|
||||||
{
|
{
|
||||||
"unsigned", json::members
|
"unsigned", json::members
|
||||||
{
|
{
|
||||||
{ "transaction_id", accepted.copts->client_txnid }
|
{ "transaction_id", accepted.client_txnid }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -401,6 +431,10 @@ ircd::m::sync::longpoll::sync_room(client &client,
|
||||||
return json::strung(body);
|
return json::strung(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// linear
|
||||||
|
//
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::m::sync::linear::handle(client &client,
|
ircd::m::sync::linear::handle(client &client,
|
||||||
shortpoll &sp,
|
shortpoll &sp,
|
||||||
|
@ -578,6 +612,10 @@ ircd::m::sync::linear::handle(client &client,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// polylog
|
||||||
|
//
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::m::sync::polylog::handle(client &client,
|
ircd::m::sync::polylog::handle(client &client,
|
||||||
shortpoll &sp,
|
shortpoll &sp,
|
||||||
|
|
|
@ -25,11 +25,44 @@ namespace ircd::m::sync
|
||||||
|
|
||||||
namespace ircd::m::sync::longpoll
|
namespace ircd::m::sync::longpoll
|
||||||
{
|
{
|
||||||
static std::string sync_room(client &, const m::room &, const args &, const vm::accepted &);
|
struct accepted
|
||||||
static std::string sync_rooms(client &, const m::user::id &, const m::room &, const args &, const vm::accepted &);
|
:m::event
|
||||||
static bool handle(client &, const args &, const vm::accepted &, const m::room &);
|
{
|
||||||
static bool handle(client &, const args &, const vm::accepted &);
|
json::strung strung;
|
||||||
|
std::string client_txnid;
|
||||||
|
|
||||||
|
accepted(const m::vm::eval &eval)
|
||||||
|
:strung
|
||||||
|
{
|
||||||
|
*eval.event_
|
||||||
|
}
|
||||||
|
,client_txnid
|
||||||
|
{
|
||||||
|
eval.copts?
|
||||||
|
eval.copts->client_txnid:
|
||||||
|
string_view{}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const json::object object{this->strung};
|
||||||
|
static_cast<m::event &>(*this) = m::event{object};
|
||||||
|
}
|
||||||
|
|
||||||
|
accepted(accepted &&) = default;
|
||||||
|
accepted(const accepted &) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t polling {0};
|
||||||
|
std::deque<accepted> queue;
|
||||||
|
ctx::dock dock;
|
||||||
|
|
||||||
|
static std::string sync_room(client &, const m::room &, const args &, const accepted &);
|
||||||
|
static std::string sync_rooms(client &, const m::user::id &, const m::room &, const args &, const accepted &);
|
||||||
|
static bool handle(client &, const args &, const accepted &, const m::room &);
|
||||||
|
static bool handle(client &, const args &, const accepted &);
|
||||||
static void poll(client &, const args &);
|
static void poll(client &, const args &);
|
||||||
|
|
||||||
|
static void handle_notify(const m::event &, m::vm::eval &);
|
||||||
|
extern m::hookfn<m::vm::eval &> notified;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ircd::m::sync::linear
|
namespace ircd::m::sync::linear
|
||||||
|
|
|
@ -4163,8 +4163,8 @@ console_cmd__stage__broadcast(opt &out, const string_view &line)
|
||||||
{
|
{
|
||||||
const m::vm::opts opts;
|
const m::vm::opts opts;
|
||||||
const m::event event{stage.at(i)};
|
const m::event event{stage.at(i)};
|
||||||
m::vm::accepted a{event, &opts, nullptr, &opts.report};
|
//m::vm::accepted a{event, &opts, nullptr, &opts.report};
|
||||||
m::vm::accept(a);
|
//m::vm::accept(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -4477,12 +4477,14 @@ console_cmd__event__sign(opt &out, const string_view &line)
|
||||||
if(op == "accept")
|
if(op == "accept")
|
||||||
{
|
{
|
||||||
const m::vm::opts opts;
|
const m::vm::opts opts;
|
||||||
|
/*
|
||||||
m::vm::accepted a
|
m::vm::accepted a
|
||||||
{
|
{
|
||||||
event, &opts, nullptr, &opts.report
|
event, &opts, nullptr, &opts.report
|
||||||
};
|
};
|
||||||
|
|
||||||
m::vm::accept(a);
|
m::vm::accept(a);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
else if(op == "eval")
|
else if(op == "eval")
|
||||||
{
|
{
|
||||||
|
@ -7462,8 +7464,8 @@ console_cmd__feds__resend(opt &out, const string_view &line)
|
||||||
};
|
};
|
||||||
|
|
||||||
const m::vm::opts opts;
|
const m::vm::opts opts;
|
||||||
m::vm::accepted a{event, &opts, nullptr, &opts.report};
|
// m::vm::accepted a{event, &opts, nullptr, &opts.report};
|
||||||
m::vm::accept(a);
|
// m::vm::accept(a);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@ static void send(const m::event &, const m::room::id &room_id);
|
||||||
static void send(const m::event &);
|
static void send(const m::event &);
|
||||||
static void send_worker();
|
static void send_worker();
|
||||||
|
|
||||||
|
static void handle_notify(const m::event &, m::vm::eval &);
|
||||||
|
|
||||||
context
|
context
|
||||||
sender
|
sender
|
||||||
{
|
{
|
||||||
|
@ -51,32 +53,57 @@ IRCD_MODULE
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::deque<std::string>
|
||||||
|
notified_queue;
|
||||||
|
|
||||||
|
ctx::dock
|
||||||
|
notified_dock;
|
||||||
|
|
||||||
|
m::hookfn<m::vm::eval &>
|
||||||
|
notified
|
||||||
|
{
|
||||||
|
handle_notify,
|
||||||
|
{
|
||||||
|
{ "_site", "vm.notify" },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_notify(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
|
{
|
||||||
|
if(!my(event))
|
||||||
|
return;
|
||||||
|
|
||||||
|
assert(eval.opts);
|
||||||
|
if(!eval.opts->notify_servers)
|
||||||
|
return;
|
||||||
|
|
||||||
|
notified_queue.emplace_back(json::strung{event});
|
||||||
|
notified_dock.notify_all();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
send_worker()
|
send_worker()
|
||||||
{
|
{
|
||||||
// In order to synchronize with the vm core, this context has to
|
|
||||||
// maintain this shared_lock at all times. If this is unlocked we
|
|
||||||
// can miss an event being broadcast.
|
|
||||||
std::unique_lock<decltype(m::vm::accept)> lock
|
|
||||||
{
|
|
||||||
m::vm::accept
|
|
||||||
};
|
|
||||||
|
|
||||||
while(1) try
|
while(1) try
|
||||||
{
|
{
|
||||||
// reference to the event on the inserter's stack
|
notified_dock.wait([]
|
||||||
const auto &event
|
|
||||||
{
|
{
|
||||||
m::vm::accept.wait(lock)
|
return !notified_queue.empty();
|
||||||
|
});
|
||||||
|
|
||||||
|
const unwind pop{[]
|
||||||
|
{
|
||||||
|
assert(!notified_queue.empty());
|
||||||
|
notified_queue.pop_front();
|
||||||
|
}};
|
||||||
|
|
||||||
|
const m::event event
|
||||||
|
{
|
||||||
|
json::object{notified_queue.front()}
|
||||||
};
|
};
|
||||||
|
|
||||||
if(!my(event))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
assert(event.opts);
|
|
||||||
if(!event.opts->notify_servers)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
send(event);
|
send(event);
|
||||||
}
|
}
|
||||||
catch(const std::exception &e)
|
catch(const std::exception &e)
|
||||||
|
|
|
@ -29,7 +29,8 @@ alias_room
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
_changed_aliases(const m::event &event)
|
_changed_aliases(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
const m::room::id &room_id
|
const m::room::id &room_id
|
||||||
{
|
{
|
||||||
|
@ -61,12 +62,12 @@ _changed_aliases(const m::event &event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_changed_aliases_hookfn
|
_changed_aliases_hookfn
|
||||||
{
|
{
|
||||||
_changed_aliases,
|
_changed_aliases,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.aliases" },
|
{ "type", "m.room.aliases" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -29,7 +29,8 @@ alias_room
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
_changed_canonical_alias(const m::event &event)
|
_changed_canonical_alias(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
const m::room::alias &alias
|
const m::room::alias &alias
|
||||||
{
|
{
|
||||||
|
@ -57,12 +58,12 @@ _changed_canonical_alias(const m::event &event)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_changed_canonical_alias_hookfn
|
_changed_canonical_alias_hookfn
|
||||||
{
|
{
|
||||||
_changed_canonical_alias,
|
_changed_canonical_alias,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.canonical_alias" },
|
{ "type", "m.room.canonical_alias" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -48,7 +48,8 @@ _can_create_room_hookfn
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_created_room(const m::event &event)
|
_created_room(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
const m::room::id &room_id
|
const m::room::id &room_id
|
||||||
{
|
{
|
||||||
|
@ -64,12 +65,12 @@ _created_room(const m::event &event)
|
||||||
send(m::my_room, at<"sender"_>(event), "ircd.room", room_id, json::object{});
|
send(m::my_room, at<"sender"_>(event), "ircd.room", room_id, json::object{});
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_created_room_hookfn
|
_created_room_hookfn
|
||||||
{
|
{
|
||||||
_created_room,
|
_created_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -137,7 +137,8 @@ visible(const m::event &event,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_changed_visibility(const m::event &event)
|
_changed_visibility(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
log::info
|
log::info
|
||||||
{
|
{
|
||||||
|
@ -149,12 +150,12 @@ _changed_visibility(const m::event &event)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_changed_visibility_hookfn
|
_changed_visibility_hookfn
|
||||||
{
|
{
|
||||||
_changed_visibility,
|
_changed_visibility,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.history_visibility" },
|
{ "type", "m.room.history_visibility" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,8 @@ IRCD_MODULE
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_changed_rules(const m::event &event)
|
_changed_rules(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
const m::user::id &sender
|
const m::user::id &sender
|
||||||
{
|
{
|
||||||
|
@ -40,12 +41,12 @@ _changed_rules(const m::event &event)
|
||||||
send(public_room, sender, "ircd.room", room_id, json::strung{event});
|
send(public_room, sender, "ircd.room", room_id, json::strung{event});
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_changed_rules_hookfn
|
_changed_rules_hookfn
|
||||||
{
|
{
|
||||||
_changed_rules,
|
_changed_rules,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.join_rules" },
|
{ "type", "m.room.join_rules" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,8 @@ IRCD_MODULE
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
affect_user_room(const m::event &event)
|
affect_user_room(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
{
|
{
|
||||||
const auto &room_id
|
const auto &room_id
|
||||||
{
|
{
|
||||||
|
@ -43,11 +44,11 @@ affect_user_room(const m::event &event)
|
||||||
send(user_room, sender, "ircd.member", room_id, at<"content"_>(event));
|
send(user_room, sender, "ircd.member", room_id, at<"content"_>(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
affect_user_room_hookfn
|
affect_user_room_hookfn
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.member" },
|
{ "type", "m.room.member" },
|
||||||
},
|
},
|
||||||
affect_user_room
|
affect_user_room
|
||||||
|
@ -72,16 +73,17 @@ _can_join_room_hookfn
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_join_room(const m::event &event)
|
_join_room(const m::event &event,
|
||||||
|
m::vm::eval &eval)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
_join_room_hookfn
|
_join_room_hookfn
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "type", "m.room.member" },
|
{ "type", "m.room.member" },
|
||||||
{ "membership", "join" },
|
{ "membership", "join" },
|
||||||
},
|
},
|
||||||
|
|
|
@ -148,19 +148,26 @@ catch(const std::exception &e)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
static void
|
||||||
|
handle_conf_updated(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
|
{
|
||||||
|
conf_updated(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
const m::hookfn<m::vm::eval &>
|
||||||
conf_updated_hook
|
conf_updated_hook
|
||||||
{
|
{
|
||||||
conf_updated,
|
handle_conf_updated,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!conf" },
|
{ "room_id", "!conf" },
|
||||||
{ "type", "ircd.conf.item" },
|
{ "type", "ircd.conf.item" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_conf_items(const m::event &)
|
init_conf_items()
|
||||||
{
|
{
|
||||||
const m::room::state state
|
const m::room::state state
|
||||||
{
|
{
|
||||||
|
@ -189,12 +196,19 @@ init_conf_item(conf::item<> &item)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
static void
|
||||||
|
handle_init_conf_items(const m::event &,
|
||||||
|
m::vm::eval &eval)
|
||||||
|
{
|
||||||
|
init_conf_items();
|
||||||
|
}
|
||||||
|
|
||||||
|
const m::hookfn<m::vm::eval &>
|
||||||
init_conf_items_hook
|
init_conf_items_hook
|
||||||
{
|
{
|
||||||
init_conf_items,
|
handle_init_conf_items,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.member" },
|
{ "type", "m.room.member" },
|
||||||
{ "membership", "join" },
|
{ "membership", "join" },
|
||||||
|
@ -228,7 +242,8 @@ catch(const std::exception &e)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_conf_room(const m::event &)
|
create_conf_room(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
m::create(conf_room_id, m::me.user_id);
|
m::create(conf_room_id, m::me.user_id);
|
||||||
|
|
||||||
|
@ -240,12 +255,12 @@ create_conf_room(const m::event &)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_conf_room_hook
|
create_conf_room_hook
|
||||||
{
|
{
|
||||||
create_conf_room,
|
create_conf_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
|
@ -274,7 +289,7 @@ rehash_conf(const bool &existing)
|
||||||
void
|
void
|
||||||
reload_conf()
|
reload_conf()
|
||||||
{
|
{
|
||||||
init_conf_items(m::event{});
|
init_conf_items();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -41,7 +41,8 @@ _cmd__die(const m::event &event,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
command_control(const m::event &event)
|
command_control(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
noexcept try
|
noexcept try
|
||||||
{
|
{
|
||||||
const auto &content
|
const auto &content
|
||||||
|
@ -105,12 +106,12 @@ catch(const std::exception &e)
|
||||||
notice(control_room, e.what());
|
notice(control_room, e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
command_control_hook
|
command_control_hook
|
||||||
{
|
{
|
||||||
command_control,
|
command_control,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!control" },
|
{ "room_id", "!control" },
|
||||||
{ "type", "m.room.message" },
|
{ "type", "m.room.message" },
|
||||||
{ "content",
|
{ "content",
|
||||||
|
@ -121,7 +122,8 @@ command_control_hook
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_control_room(const m::event &)
|
create_control_room(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
create(control_room_id, m::me.user_id);
|
create(control_room_id, m::me.user_id);
|
||||||
join(control_room, m::me.user_id);
|
join(control_room, m::me.user_id);
|
||||||
|
@ -134,12 +136,12 @@ create_control_room(const m::event &)
|
||||||
notice(control_room, m::me.user_id, "I am the daemon. You can talk to me in this room by highlighting me.");
|
notice(control_room, m::me.user_id, "I am the daemon. You can talk to me in this room by highlighting me.");
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_control_hook
|
create_control_hook
|
||||||
{
|
{
|
||||||
create_control_room,
|
create_control_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ extern "C" bool verify__keys(const m::keys &) noexcept;
|
||||||
extern "C" void get__keys(const string_view &server, const string_view &key_id, const m::keys::closure &);
|
extern "C" void get__keys(const string_view &server, const string_view &key_id, const m::keys::closure &);
|
||||||
extern "C" bool query__keys(const string_view &query_server, const m::keys::queries &, const m::keys::closure_bool &);
|
extern "C" bool query__keys(const string_view &query_server, const m::keys::queries &, const m::keys::closure_bool &);
|
||||||
|
|
||||||
extern "C" void create_my_key(const m::event &);
|
extern "C" void create_my_key(const m::event &, m::vm::eval &);
|
||||||
static void init_my_ed25519();
|
static void init_my_ed25519();
|
||||||
static void init_my_tls_crt();
|
static void init_my_tls_crt();
|
||||||
extern "C" void init_my_keys();
|
extern "C" void init_my_keys();
|
||||||
|
@ -276,19 +276,20 @@ init_my_ed25519()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_my_key_hook
|
create_my_key_hook
|
||||||
{
|
{
|
||||||
create_my_key,
|
create_my_key,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", m::my_node.room_id() },
|
{ "room_id", m::my_node.room_id() },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
create_my_key(const m::event &)
|
create_my_key(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
const json::members verify_keys_
|
const json::members verify_keys_
|
||||||
{{
|
{{
|
||||||
|
|
|
@ -80,18 +80,19 @@ init_listeners()
|
||||||
//
|
//
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_listener(const m::event &event)
|
create_listener(const m::event &event,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
load_listener(event);
|
load_listener(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Hook for a new listener description being sent.
|
/// Hook for a new listener description being sent.
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_listener_hook
|
create_listener_hook
|
||||||
{
|
{
|
||||||
create_listener,
|
create_listener,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "ircd.listen" },
|
{ "type", "ircd.listen" },
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,34 +49,36 @@ exists__nodeid(const m::node::id &node_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_my_node_room(const m::event &)
|
create_my_node_room(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
create(m::my_node.room_id(), m::me.user_id);
|
create(m::my_node.room_id(), m::me.user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_my_node_hook
|
create_my_node_hook
|
||||||
{
|
{
|
||||||
create_my_node_room,
|
create_my_node_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!nodes" },
|
{ "room_id", "!nodes" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_nodes_room(const m::event &)
|
create_nodes_room(const m::event &,
|
||||||
|
m::vm::eval &)
|
||||||
{
|
{
|
||||||
create(nodes_room, m::me.user_id);
|
create(nodes_room, m::me.user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const m::hookfn<>
|
const m::hookfn<m::vm::eval &>
|
||||||
create_nodes_hook
|
create_nodes_hook
|
||||||
{
|
{
|
||||||
create_nodes_room,
|
create_nodes_room,
|
||||||
{
|
{
|
||||||
{ "_site", "vm.notify" },
|
{ "_site", "vm.effect" },
|
||||||
{ "room_id", "!ircd" },
|
{ "room_id", "!ircd" },
|
||||||
{ "type", "m.room.create" },
|
{ "type", "m.room.create" },
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@ namespace ircd::m::vm
|
||||||
extern hook::site<eval &> commit_hook; ///< Called when this server issues event
|
extern hook::site<eval &> commit_hook; ///< Called when this server issues event
|
||||||
extern hook::site<eval &> fetch_hook; ///< Called to resolve dependencies
|
extern hook::site<eval &> fetch_hook; ///< Called to resolve dependencies
|
||||||
extern hook::site<eval &> eval_hook; ///< Called when evaluating event
|
extern hook::site<eval &> eval_hook; ///< Called when evaluating event
|
||||||
extern hook::site<> notify_hook; ///< Called after successful evaluation
|
extern hook::site<eval &> notify_hook; ///< Called to broadcast successful eval
|
||||||
|
extern hook::site<eval &> effect_hook; ///< Called to apply effects of eval
|
||||||
|
|
||||||
static void write_commit(eval &);
|
static void write_commit(eval &);
|
||||||
static fault _eval_edu(eval &, const event &);
|
static fault _eval_edu(eval &, const event &);
|
||||||
|
@ -58,6 +59,12 @@ ircd::m::vm::notify_hook
|
||||||
{ "name", "vm.notify" }
|
{ "name", "vm.notify" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
decltype(ircd::m::vm::effect_hook)
|
||||||
|
ircd::m::vm::effect_hook
|
||||||
|
{
|
||||||
|
{ "name", "vm.effect" }
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// init
|
// init
|
||||||
//
|
//
|
||||||
|
@ -466,16 +473,11 @@ try
|
||||||
if(ret != fault::ACCEPT)
|
if(ret != fault::ACCEPT)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
vm::accepted accepted
|
if(opts.notify)
|
||||||
{
|
notify_hook(event, eval);
|
||||||
event, &opts, eval.copts, &report
|
|
||||||
};
|
|
||||||
|
|
||||||
if(opts.effects)
|
if(opts.effects)
|
||||||
notify_hook(event);
|
effect_hook(event, eval);
|
||||||
|
|
||||||
if(opts.notify)
|
|
||||||
vm::accept(accepted);
|
|
||||||
|
|
||||||
if(opts.debuglog_accept)
|
if(opts.debuglog_accept)
|
||||||
log::debug
|
log::debug
|
||||||
|
|
Loading…
Reference in a new issue