0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-14 22:11:06 +01:00
construct/modules
2019-03-25 14:08:14 -07:00
..
app ircd:Ⓜ️:app: Add configuration access interface for appservice. 2019-03-15 16:19:05 -07:00
client modules/client/rooms/state: Log an error when a state event fetch fails during sync. 2019-03-23 02:45:05 -07:00
federation modules/federation/state: Seek an event_id before starting chunked encoding to allow 404. 2019-03-22 21:57:18 -07:00
identity modules: Start and identity service stub area. 2019-02-18 10:28:09 -08:00
js ircd::m/modules: Update various client listeners w/ callback. 2018-07-06 18:40:15 -07:00
key ircd: Rename and refactor ircd::assertion interface into ircd::panic. 2019-01-13 16:37:31 -08:00
media modules/media: Assert and condition remote download request isn't for my_host(). 2019-03-07 15:11:27 -08:00
console.cc ircd::net: Add conditional interface to getifaddrs() w/ console cmd. 2019-03-25 13:56:08 -07:00
m_device.cc ircd:Ⓜ️:device: Add has(user, device_id, property) overload to interface suite. 2019-03-09 18:48:32 -08:00
m_device_list_update.cc modules: Stub m.device_list_update edu handler; json schema. 2019-02-20 13:36:29 -08:00
m_direct_to_device.cc modules/m_direct_to_device: Tweak logic for local message handling; handle exception per msg. 2019-02-22 15:40:53 -08:00
m_event.cc modules/m_event: Stub missing sections of event auth checks for now. 2019-03-22 21:06:28 -07:00
m_ignored_user_list.cc ircd:Ⓜ️:user: Add framework around m.ignored_user_list; w/ console cmd. 2019-03-14 17:27:45 -07:00
m_noop.cc modules/m_noop: Update header / comment. 2019-01-25 14:53:59 -08:00
m_presence.cc modules/m_presence: Add conf item to toggle federation incoming. 2019-03-20 20:08:48 -07:00
m_receipt.cc modules/m_receipt: Fix missing m::log designation. 2019-03-19 16:40:25 -07:00
m_room.cc ircd:Ⓜ️:room::state: Add prev() and next() reference traversal interface. 2019-03-11 15:06:54 -07:00
m_room_aliases.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_canonical_alias.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_create.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_history_visibility.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_join_rules.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_member.cc modules/vm: Rename commit hook to issue hook; add opts toggle. 2019-03-09 12:13:21 -08:00
m_room_message.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_room_power_levels.cc modules: Use the apropos matrix logger for various log messages. 2018-12-22 17:44:18 -08:00
m_rooms.cc ircd:Ⓜ️:rooms: Add interface to remove entries from the !public room list. 2019-03-14 15:12:40 -07:00
m_state.cc modules/m_state: Add a state clear routine. 2019-01-25 13:59:34 -08:00
m_typing.cc ircd:Ⓜ️:typing: Partial normalization; 2019-02-11 15:57:01 -08:00
m_user.cc modules: Move m::device definitions from m_user to m_device. 2019-02-20 09:46:27 -08:00
Makefile.am ircd::net::dns: Refactor system for the !dns room. 2019-03-21 18:24:36 -07:00
metrics.cc modules: Add preliminary prometheus metrics endpoint. 2019-03-08 12:31:08 -08:00
README.md modules/README: Remove stale information from the modules README. 2018-09-13 23:59:15 -07:00
s_conf.cc ircd: Move runlevel related into ircd::run:: namespace. 2019-01-18 09:08:56 -08:00
s_control.cc ircd:Ⓜ️ Rename most vm.notify hooks to vm.effect; Refactor vm::accept related. 2018-10-09 20:56:12 -07:00
s_dns.cc modules/s_dns: Condition response waiting on callback being non-null. 2019-03-25 14:08:14 -07:00
s_dns.h ircd::net::dns: Expose more cache utils to public interface. 2019-03-24 14:06:47 -07:00
s_dns_resolver.cc modules/s_dns: Various cleanup / reorg of handlers. 2019-03-23 01:04:41 -07:00
s_fetch.cc ircd:Ⓜ️ Demote membership from top-level key; remove from m::event tuple. 2019-01-24 12:52:26 -08:00
s_fetch.h modules/s_fetch: Checkpoint. 2018-11-30 12:59:44 -08:00
s_keys.cc modules/s_keys: Fix valid_until_ts generation. 2019-03-03 13:41:40 -08:00
s_listen.cc ircd::net: Add specific allow(acceptor) rather than using start(acceptor). 2019-03-21 17:07:35 -07:00
s_node.cc ircd:Ⓜ️ Rename most vm.notify hooks to vm.effect; Refactor vm::accept related. 2018-10-09 20:56:12 -07:00
vm.cc ircd:Ⓜ️:vm: Add counters and synchronization for safe module reloading. 2019-03-21 16:46:04 -07:00
webhook.cc modules/webhook: Add issue labels after issue titles. 2019-03-21 12:16:19 -07:00
webroot.cc Revert "ircd: Remove use of all unwind::exceptional and unwind::nominal devices." 2019-03-22 21:06:28 -07:00

IRCd Module Tree

This directory contains dynamically loadable functionality to libircd. These modules are not mere extensions -- they provide essential application functionality, but are not required to be directly linked in libircd proper. Most application-specific functionality (i.e "business logic") is contained in modules within this tree. At the time of this writing, a significant amount of matrix functionality is still contained within libircd proper, but it is intended that as many definitions as possible are pushed out into modules.

Layout

The modules/ directory is primarily shaped the same as the HTTP resource tree in which most of its modules register themselves in. This is not automatic and the mere inclusion of files/directories in modules/ does not automatically expose them over HTTP.

Note that the installation layout is not the same as the development source layout (i.e in git). Upon installation, the module tree is collapsed into a single directory and installed into $prefix/lib/modules/construct/$directory_$module.so; this may be subject to improvement.

  • client/ contains resource handlers for the /_matrix/client/ API
  • federation/ contains resource handlers for the /_matrix/federation/ API
  • key/ contains resource handlers for the /_matrix/key/ API
  • media/ contains resource handlers for the /_matrix/media/ API
  • js/ contains modules specific to the unreleased javascript embedding.
  • s_ modules provide utility to the server's operation.
  • m_ modules implement protocol logic for matrix event types.
  • vm_ modules provide the processing logic for matrix events.

Loading

Modules may be automatically loaded based on their prefix. Certain prefixes are sought by libircd for auto-loading, arbitrarily (i.e there is no magic autoloading prefix; see: ircd/m/m.cc for explicit prefixes). A module may also be loaded when an attempt is made to call into it (i.e with m::import or low-level with ircd::mods::*). Furthermore, a module may be loaded by the console mod command suite, specifically mod load. Otherwise the module is not loaded.

Unloading

Unlike previous incarnations of IRCd, every module is "unloadable" and there are no "core" modules. All central linkages within libircd (and direct links made by other modules) tolerate the unavailability of a module by using weak-pointers and throwing exceptions. Unlike the Atheme approach as well, linkage into a module does not prevent unloading due to dependency; the unloading of a module is propagated to linksites through the weak_ptr's dependency graph and exceptions are thrown from the link upon next use.

Furthermore, modules are free to leverage the ircd::ctx system to wait synchronously for events which are essential for a clean load or unload, even during static initialization and destruction. This is a useful feature which allows all modules to be robustly loadable and unloadable at any time and every time in an intuitive manner.

No modules in this system "stick" whether by accident or on purpose upon unload. Though we all know that dlclose() does not guarantee a module is actually unloaded, we expend the extra effort to ensure there is no reason why dlclose() would not unload the module. This static destruction of a module is verified and alarms will go off if it is actually "stuck" and the developer must fix this.

Getting started

The header mods/mapi.h is specific to modules and included for modules in addition to the core ircd.h. Both of these are included automatically via the compiler's command-line and the developer does not have to #include either in the module.

Every loadable module requires a static ircd::mapi::header with the explicit name of IRCD_MODULE. This is an object which will be sought by the module loader in libircd. Nothing else is required.

Approach

The ideal module in this system is one that is self-contained in that its only interface is through "registrations" to various facilities provided by libircd. The module can still freely read and write to state within libircd or other modules.

  • An example of such is an HTTP resource (see: ircd/resource.h) registration of a URL to handle incoming HTTP requests.

  • Another example is a Matrix Event Hook (see: ircd/m/hook.h) to process matrix events.

Next is a module providing definitions and making them available through exposition (i.e extern "C"). In this approach, function definitions are provided in the module but a "central interface" may be provided by libircd. That central interface is tolerant of the function call failing when the module is not available (or automatically tries to load it, see: ircd/m/import.h and ircd/mods/*.h etc).

Note that many modules use any of these approaches at the same time.