summaryrefslogtreecommitdiff
path: root/src/service/mod.rs
blob: 385dcc69bbfd4d234520aa55343051bd70d77047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use std::{
    collections::HashMap,
    sync::{Arc, Mutex},
};

use lru_cache::LruCache;

use crate::{Config, Result};

pub mod account_data;
pub mod admin;
pub mod appservice;
pub mod globals;
pub mod key_backups;
pub mod media;
pub mod pdu;
pub mod pusher;
pub mod rooms;
pub mod sending;
pub mod transaction_ids;
pub mod uiaa;
pub mod users;

pub struct Services {
    pub appservice: appservice::Service,
    pub pusher: pusher::Service,
    pub rooms: rooms::Service,
    pub transaction_ids: transaction_ids::Service,
    pub uiaa: uiaa::Service,
    pub users: users::Service,
    pub account_data: account_data::Service,
    pub admin: Arc<admin::Service>,
    pub globals: globals::Service,
    pub key_backups: key_backups::Service,
    pub media: media::Service,
    pub sending: Arc<sending::Service>,
}

impl Services {
    pub fn build<
        D: appservice::Data
            + pusher::Data
            + rooms::Data
            + transaction_ids::Data
            + uiaa::Data
            + users::Data
            + account_data::Data
            + globals::Data
            + key_backups::Data
            + media::Data
            + sending::Data
            + 'static,
    >(
        db: &'static D,
        config: Config,
    ) -> Result<Self> {
        Ok(Self {
            appservice: appservice::Service { db },
            pusher: pusher::Service { db },
            rooms: rooms::Service {
                alias: rooms::alias::Service { db },
                auth_chain: rooms::auth_chain::Service { db },
                directory: rooms::directory::Service { db },
                edus: rooms::edus::Service {
                    presence: rooms::edus::presence::Service { db },
                    read_receipt: rooms::edus::read_receipt::Service { db },
                    typing: rooms::edus::typing::Service { db },
                },
                event_handler: rooms::event_handler::Service,
                lazy_loading: rooms::lazy_loading::Service {
                    db,
                    lazy_load_waiting: Mutex::new(HashMap::new()),
                },
                metadata: rooms::metadata::Service { db },
                outlier: rooms::outlier::Service { db },
                pdu_metadata: rooms::pdu_metadata::Service { db },
                search: rooms::search::Service { db },
                short: rooms::short::Service { db },
                state: rooms::state::Service { db },
                state_accessor: rooms::state_accessor::Service { db },
                state_cache: rooms::state_cache::Service { db },
                state_compressor: rooms::state_compressor::Service {
                    db,
                    stateinfo_cache: Mutex::new(LruCache::new(
                        (100.0 * config.conduit_cache_capacity_modifier) as usize,
                    )),
                },
                timeline: rooms::timeline::Service {
                    db,
                    lasttimelinecount_cache: Mutex::new(HashMap::new()),
                },
                user: rooms::user::Service { db },
            },
            transaction_ids: transaction_ids::Service { db },
            uiaa: uiaa::Service { db },
            users: users::Service { db },
            account_data: account_data::Service { db },
            admin: admin::Service::build(),
            key_backups: key_backups::Service { db },
            media: media::Service { db },
            sending: sending::Service::build(db, &config),

            globals: globals::Service::load(db, config)?,
        })
    }
}