Files
continuwuity/src/service/rooms/event_handler/mod.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

122 lines
3.9 KiB
Rust
Raw Normal View History

2024-11-08 07:30:52 +00:00
mod acl_check;
mod fetch_and_handle_outliers;
mod fetch_prev;
mod fetch_state;
mod handle_incoming_pdu;
mod handle_outlier_pdu;
mod handle_prev_pdu;
2024-05-09 15:59:08 -07:00
mod parse_incoming_pdu;
mod policy_server;
2024-11-08 07:30:52 +00:00
mod resolve_state;
mod state_at_incoming;
mod upgrade_outlier_pdu;
2024-05-09 15:59:08 -07:00
2025-07-19 22:20:26 +01:00
use std::{collections::HashMap, fmt::Write, sync::Arc, time::Instant};
2022-09-06 23:15:09 +02:00
use async_trait::async_trait;
use conduwuit::{Err, Event, PduEvent, Result, Server, SyncRwLock, utils::MutexMap};
2022-09-06 23:15:09 +02:00
use ruma::{
OwnedEventId, OwnedRoomId, RoomId, RoomVersionId,
events::room::create::RoomCreateEventContent,
2022-09-06 23:15:09 +02:00
};
use crate::{Dep, globals, rooms, sending, server_keys};
2024-04-12 13:14:21 -07:00
pub struct Service {
pub mutex_federation: RoomMutexMap,
2025-07-19 22:20:26 +01:00
pub federation_handletime: SyncRwLock<HandleTimeMap>,
2024-11-08 07:30:52 +00:00
services: Services,
}
2024-07-18 06:37:47 +00:00
struct Services {
globals: Dep<globals::Service>,
sending: Dep<sending::Service>,
auth_chain: Dep<rooms::auth_chain::Service>,
metadata: Dep<rooms::metadata::Service>,
outlier: Dep<rooms::outlier::Service>,
pdu_metadata: Dep<rooms::pdu_metadata::Service>,
server_keys: Dep<server_keys::Service>,
2024-07-18 06:37:47 +00:00
short: Dep<rooms::short::Service>,
state: Dep<rooms::state::Service>,
state_cache: Dep<rooms::state_cache::Service>,
2024-07-18 06:37:47 +00:00
state_accessor: Dep<rooms::state_accessor::Service>,
state_compressor: Dep<rooms::state_compressor::Service>,
timeline: Dep<rooms::timeline::Service>,
server: Arc<Server>,
2024-07-18 06:37:47 +00:00
}
type RoomMutexMap = MutexMap<OwnedRoomId, ()>;
type HandleTimeMap = HashMap<OwnedRoomId, (OwnedEventId, Instant)>;
2024-05-27 03:17:20 +00:00
#[async_trait]
2024-07-04 03:26:19 +00:00
impl crate::Service for Service {
2024-07-18 06:37:47 +00:00
fn build(args: crate::Args<'_>) -> Result<Arc<Self>> {
Ok(Arc::new(Self {
2024-11-08 07:30:52 +00:00
mutex_federation: RoomMutexMap::new(),
federation_handletime: HandleTimeMap::new().into(),
2024-07-18 06:37:47 +00:00
services: Services {
globals: args.depend::<globals::Service>("globals"),
sending: args.depend::<sending::Service>("sending"),
auth_chain: args.depend::<rooms::auth_chain::Service>("rooms::auth_chain"),
metadata: args.depend::<rooms::metadata::Service>("rooms::metadata"),
outlier: args.depend::<rooms::outlier::Service>("rooms::outlier"),
server_keys: args.depend::<server_keys::Service>("server_keys"),
2024-07-18 06:37:47 +00:00
pdu_metadata: args.depend::<rooms::pdu_metadata::Service>("rooms::pdu_metadata"),
short: args.depend::<rooms::short::Service>("rooms::short"),
state: args.depend::<rooms::state::Service>("rooms::state"),
state_cache: args.depend::<rooms::state_cache::Service>("rooms::state_cache"),
state_accessor: args
.depend::<rooms::state_accessor::Service>("rooms::state_accessor"),
state_compressor: args
.depend::<rooms::state_compressor::Service>("rooms::state_compressor"),
2024-07-18 06:37:47 +00:00
timeline: args.depend::<rooms::timeline::Service>("rooms::timeline"),
server: args.server.clone(),
2024-07-18 06:37:47 +00:00
},
}))
}
2024-07-04 03:26:19 +00:00
async fn memory_usage(&self, out: &mut (dyn Write + Send)) -> Result {
let mutex_federation = self.mutex_federation.len();
writeln!(out, "federation_mutex: {mutex_federation}")?;
2025-07-19 22:20:26 +01:00
let federation_handletime = self.federation_handletime.read().len();
writeln!(out, "federation_handletime: {federation_handletime}")?;
Ok(())
}
2024-07-04 03:26:19 +00:00
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
}
2024-05-27 03:17:20 +00:00
2024-07-04 03:26:19 +00:00
impl Service {
async fn event_exists(&self, event_id: OwnedEventId) -> bool {
self.services.timeline.pdu_exists(&event_id).await
}
2024-08-08 17:18:30 +00:00
async fn event_fetch(&self, event_id: OwnedEventId) -> Option<PduEvent> {
self.services.timeline.get_pdu(&event_id).await.ok()
2023-08-10 11:45:31 +02:00
}
2024-10-16 11:33:24 +00:00
}
fn check_room_id<Pdu: Event>(room_id: &RoomId, pdu: &Pdu) -> Result {
2025-09-17 20:46:03 +00:00
if pdu
.room_id()
.is_some_and(|claimed_room_id| claimed_room_id != room_id)
{
2024-10-16 11:33:24 +00:00
return Err!(Request(InvalidParam(error!(
2026-01-04 03:04:37 +00:00
pdu_event_id = %pdu.event_id(),
pdu_room_id = pdu.room_id().map(tracing::field::display),
%room_id,
2024-10-16 11:33:24 +00:00
"Found event from room in room",
))));
}
2024-10-16 11:33:24 +00:00
Ok(())
}
2024-08-08 17:18:30 +00:00
fn get_room_version<Pdu: Event>(create_event: &Pdu) -> Result<RoomVersionId> {
2024-10-16 11:33:24 +00:00
let content: RoomCreateEventContent = create_event.get_content()?;
let room_version = content.room_version;
2024-08-08 17:18:30 +00:00
2024-10-16 11:33:24 +00:00
Ok(room_version)
}