From d18711503f2b789fe0b5c24d5fd2705f38a2b8ab Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 22 Apr 2019 21:38:27 -0700 Subject: [PATCH] ircd::m: Unsplit event/event.h room/room.h. --- include/ircd/m/event.h | 75 ++++++++++++++++++++- include/ircd/m/event/event.h | 87 ------------------------- include/ircd/m/room.h | 111 ++++++++++++++++++++++++++++++- include/ircd/m/room/room.h | 122 ----------------------------------- 4 files changed, 184 insertions(+), 211 deletions(-) delete mode 100644 include/ircd/m/event/event.h delete mode 100644 include/ircd/m/room/room.h diff --git a/include/ircd/m/event.h b/include/ircd/m/event.h index 5c45c8aab..3608f93b7 100644 --- a/include/ircd/m/event.h +++ b/include/ircd/m/event.h @@ -63,7 +63,80 @@ namespace ircd::m ed25519::sig sign(const event &); } -#include "event/event.h" +/// +/// This json::tuple provides at least all of the legal members of the matrix +/// standard event. This is the fundamental building block of the matrix +/// system. Rooms are collections of events. Messages between servers are +/// passed as bundles of events (or directly). +/// +/// It is better to have 100 functions operate on one data structure than +/// to have 10 functions operate on 10 data structures. +/// -Alan Perlis +/// +struct ircd::m::event +:json::tuple +< + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property, + json::property +> +{ + struct prev; + struct refs; + struct auth; + struct fetch; + struct conforms; + + using keys = json::keys; + using id = m::id::event; + using idx = uint64_t; + using idx_range = std::pair; + using closure = std::function; + using closure_bool = std::function; + using closure_idx = std::function; + using closure_idx_bool = std::function; + using closure_iov_mutable = std::function; + + static constexpr const size_t MAX_SIZE = 64_KiB; + static constexpr const size_t TYPE_MAX_SIZE = 256; + static constexpr const size_t STATE_KEY_MAX_SIZE = 256; + static constexpr const size_t ORIGIN_MAX_SIZE = 256; + static conf::item max_size; + + static void essential(json::iov &event, const json::iov &content, const closure_iov_mutable &); + static bool verify(const json::object &, const ed25519::pk &, const ed25519::sig &sig); + static ed25519::sig sign(const string_view &, const ed25519::sk &); + static ed25519::sig sign(const string_view &); + static ed25519::sig sign(const json::object &, const ed25519::sk &); + static ed25519::sig sign(const json::object &); + static ed25519::sig sign(json::iov &event, const json::iov &content, const ed25519::sk &); + static ed25519::sig sign(json::iov &event, const json::iov &content); + static json::object signatures(const mutable_buffer &, json::iov &event, const json::iov &content); + static sha256::buf hash(json::iov &event, const string_view &content); + static sha256::buf hash(const json::object &); + static json::object hashes(const mutable_buffer &, json::iov &event, const string_view &content); + + json::object source; // Contextual availability only. + + using super_type::tuple; + event(const json::object &); + event(const json::object &, const keys &); + event() = default; +}; + #include "event/prev.h" #include "event/refs.h" #include "event/auth.h" diff --git a/include/ircd/m/event/event.h b/include/ircd/m/event/event.h deleted file mode 100644 index ed18b286b..000000000 --- a/include/ircd/m/event/event.h +++ /dev/null @@ -1,87 +0,0 @@ -// 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. - -#pragma once -#define HAVE_IRCD_M_EVENT_EVENT_H - -/// The Main Event -/// -/// This json::tuple provides at least all of the legal members of the matrix -/// standard event. This is the fundamental building block of the matrix -/// system. Rooms are collections of events. Messages between servers are -/// passed as bundles of events (or directly). -/// -/// It is better to have 100 functions operate on one data structure than -/// to have 10 functions operate on 10 data structures. -/// -Alan Perlis -/// -struct ircd::m::event -:json::tuple -< - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property, - json::property -> -{ - struct prev; - struct refs; - struct auth; - struct fetch; - struct conforms; - - using keys = json::keys; - using id = m::id::event; - using idx = uint64_t; - using idx_range = std::pair; - using closure = std::function; - using closure_bool = std::function; - using closure_idx = std::function; - using closure_idx_bool = std::function; - using closure_iov_mutable = std::function; - - static constexpr const size_t MAX_SIZE = 64_KiB; - static constexpr const size_t TYPE_MAX_SIZE = 256; - static constexpr const size_t STATE_KEY_MAX_SIZE = 256; - static constexpr const size_t ORIGIN_MAX_SIZE = 256; - static conf::item max_size; - - static void essential(json::iov &event, const json::iov &content, const closure_iov_mutable &); - static bool verify(const json::object &, const ed25519::pk &, const ed25519::sig &sig); - static ed25519::sig sign(const string_view &, const ed25519::sk &); - static ed25519::sig sign(const string_view &); - static ed25519::sig sign(const json::object &, const ed25519::sk &); - static ed25519::sig sign(const json::object &); - static ed25519::sig sign(json::iov &event, const json::iov &content, const ed25519::sk &); - static ed25519::sig sign(json::iov &event, const json::iov &content); - static json::object signatures(const mutable_buffer &, json::iov &event, const json::iov &content); - static sha256::buf hash(json::iov &event, const string_view &content); - static sha256::buf hash(const json::object &); - static json::object hashes(const mutable_buffer &, json::iov &event, const string_view &content); - - json::object source; // Contextual availability only. - - using super_type::tuple; - event(const json::object &); - event(const json::object &, const keys &); - event() = default; -}; diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index 94feb84e1..2cb8007a0 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -80,7 +80,109 @@ namespace ircd::m room create(const id::room &, const id::user &creator, const string_view &preset = {}); } -#include "room/room.h" +/// Interface to a room. +/// +/// This is a lightweight object which uses a room_id and an optional event_id +/// to provide an interface to a matrix room. This object itself isn't the +/// actual room data since that takes the form of events in the database; +/// this is just a handle with aforementioned string_view's used by its member +/// functions. +/// +/// This object allows the programmer to represent the room either at its +/// present state, or if an event_id is given, at the point of that event. +/// +/// Many convenience functions are provided outside of this class. +/// Additionally, several sub-classes provide functionality even more specific +/// than this interface too. If a subclass is provided, for example: +/// `struct members`, such an interface may employ optimized tactics for its +/// specific task. +/// +struct ircd::m::room +{ + struct messages; + struct state; + struct members; + struct origins; + struct head; + struct auth; + struct power; + struct aliases; + struct stats; + + using id = m::id::room; + using alias = m::id::room_alias; + using closure = std::function; + using closure_bool = std::function; + + id room_id; + event::id event_id; + const vm::copts *copts {nullptr}; + const event::fetch::opts *fopts {nullptr}; + + operator const id &() const; + + // Convenience passthru to room::messages (linear query; newest first) + bool for_each(const string_view &type, const event::closure_idx_bool &) const; + void for_each(const string_view &type, const event::closure_idx &) const; + bool for_each(const string_view &type, const event::id::closure_bool &) const; + void for_each(const string_view &type, const event::id::closure &) const; + bool for_each(const string_view &type, const event::closure_bool &) const; + void for_each(const string_view &type, const event::closure &) const; + bool for_each(const event::closure_idx_bool &) const; + void for_each(const event::closure_idx &) const; + bool for_each(const event::id::closure_bool &) const; + void for_each(const event::id::closure &) const; + bool for_each(const event::closure_bool &) const; + void for_each(const event::closure &) const; + + // Convenience passthru to room::state (logarithmic query) + bool has(const string_view &type, const string_view &state_key) const; + bool get(std::nothrow_t, const string_view &type, const string_view &state_key, const event::closure &) const; + void get(const string_view &type, const string_view &state_key, const event::closure &) const; + event::idx get(std::nothrow_t, const string_view &type, const string_view &state_key) const; + event::idx get(const string_view &type, const string_view &state_key) const; + + // Convenience passthru to room::messages (linear query) + bool has(const string_view &type) const; + bool get(std::nothrow_t, const string_view &type, const event::closure &) const; + void get(const string_view &type, const event::closure &) const; + + // misc / convenience utils + bool membership(const m::id::user &, const string_view &membership = "join") const; + string_view membership(const mutable_buffer &out, const m::id::user &) const; + bool visible(const string_view &mxid, const m::event *const & = nullptr) const; + string_view join_rule(const mutable_buffer &out) const; + id::user::buf any_user(const string_view &host, const string_view &membership = "join") const; + bool join_rule(const string_view &rule) const; + bool lonly() const; + + room(const id &room_id, + const string_view &event_id, + const vm::copts *const &copts = nullptr, + const event::fetch::opts *const &fopts = nullptr) + :room_id{room_id} + ,event_id{event_id? event::id{event_id} : event::id{}} + ,copts{copts} + ,fopts{fopts} + {} + + room(const id &room_id, + const vm::copts *const &copts = nullptr, + const event::fetch::opts *const &fopts = nullptr) + :room_id{room_id} + ,copts{copts} + ,fopts{fopts} + {} + + room() = default; + + // Index of create event + static event::idx index(const id &, std::nothrow_t); + static event::idx index(const id &); + + static size_t purge(const room &); // cuidado! +}; + #include "room/messages.h" #include "room/state.h" #include "room/members.h" @@ -90,3 +192,10 @@ namespace ircd::m #include "room/power.h" #include "room/aliases.h" #include "room/stats.h" + +inline ircd::m::room::operator +const ircd::m::room::id &() +const +{ + return room_id; +} diff --git a/include/ircd/m/room/room.h b/include/ircd/m/room/room.h deleted file mode 100644 index 7339c3642..000000000 --- a/include/ircd/m/room/room.h +++ /dev/null @@ -1,122 +0,0 @@ -// 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. - -#pragma once -#define HAVE_IRCD_M_ROOM_ROOM_H - -/// Interface to a room. -/// -/// This is a lightweight object which uses a room_id and an optional event_id -/// to provide an interface to a matrix room. This object itself isn't the -/// actual room data since that takes the form of events in the database; -/// this is just a handle with aforementioned string_view's used by its member -/// functions. -/// -/// This object allows the programmer to represent the room either at its -/// present state, or if an event_id is given, at the point of that event. -/// -/// Many convenience functions are provided outside of this class. -/// Additionally, several sub-classes provide functionality even more specific -/// than this interface too. If a subclass is provided, for example: -/// `struct members`, such an interface may employ optimized tactics for its -/// specific task. -/// -struct ircd::m::room -{ - struct messages; - struct state; - struct members; - struct origins; - struct head; - struct auth; - struct power; - struct aliases; - struct stats; - - using id = m::id::room; - using alias = m::id::room_alias; - using closure = std::function; - using closure_bool = std::function; - - id room_id; - event::id event_id; - const vm::copts *copts {nullptr}; - const event::fetch::opts *fopts {nullptr}; - - operator const id &() const; - - // Convenience passthru to room::messages (linear query; newest first) - bool for_each(const string_view &type, const event::closure_idx_bool &) const; - void for_each(const string_view &type, const event::closure_idx &) const; - bool for_each(const string_view &type, const event::id::closure_bool &) const; - void for_each(const string_view &type, const event::id::closure &) const; - bool for_each(const string_view &type, const event::closure_bool &) const; - void for_each(const string_view &type, const event::closure &) const; - bool for_each(const event::closure_idx_bool &) const; - void for_each(const event::closure_idx &) const; - bool for_each(const event::id::closure_bool &) const; - void for_each(const event::id::closure &) const; - bool for_each(const event::closure_bool &) const; - void for_each(const event::closure &) const; - - // Convenience passthru to room::state (logarithmic query) - bool has(const string_view &type, const string_view &state_key) const; - bool get(std::nothrow_t, const string_view &type, const string_view &state_key, const event::closure &) const; - void get(const string_view &type, const string_view &state_key, const event::closure &) const; - event::idx get(std::nothrow_t, const string_view &type, const string_view &state_key) const; - event::idx get(const string_view &type, const string_view &state_key) const; - - // Convenience passthru to room::messages (linear query) - bool has(const string_view &type) const; - bool get(std::nothrow_t, const string_view &type, const event::closure &) const; - void get(const string_view &type, const event::closure &) const; - - // misc / convenience utils - bool membership(const m::id::user &, const string_view &membership = "join") const; - string_view membership(const mutable_buffer &out, const m::id::user &) const; - bool visible(const string_view &mxid, const m::event *const & = nullptr) const; - string_view join_rule(const mutable_buffer &out) const; - id::user::buf any_user(const string_view &host, const string_view &membership = "join") const; - bool join_rule(const string_view &rule) const; - bool lonly() const; - - room(const id &room_id, - const string_view &event_id, - const vm::copts *const &copts = nullptr, - const event::fetch::opts *const &fopts = nullptr) - :room_id{room_id} - ,event_id{event_id? event::id{event_id} : event::id{}} - ,copts{copts} - ,fopts{fopts} - {} - - room(const id &room_id, - const vm::copts *const &copts = nullptr, - const event::fetch::opts *const &fopts = nullptr) - :room_id{room_id} - ,copts{copts} - ,fopts{fopts} - {} - - room() = default; - - // Index of create event - static event::idx index(const id &, std::nothrow_t); - static event::idx index(const id &); - - static size_t purge(const room &); // cuidado! -}; - -inline ircd::m::room::operator -const ircd::m::room::id &() -const -{ - return room_id; -}