public-appservice 0.2.0

An appservice to make Matrix spaces publicly accessible.
Documentation
pub mod config;
pub mod appservice;
pub mod server;
pub mod ping;
pub mod api;
pub mod space;
pub mod rooms;
pub mod middleware;
pub mod cache;
pub mod error;
pub mod utils;
pub mod oidc;

use std::sync::Arc;
use std::time::Duration;

use reqwest::Client;

pub type ProxyClient = reqwest::Client;

#[derive(Clone)]
pub struct AppState {
    pub config: config::Config,
    pub proxy: ProxyClient,
    pub appservice: appservice::AppService,
    pub transaction_store: ping::TransactionStore,
    pub cache: cache::Cache,
    pub oidc: oidc::AuthMetadata,
}

impl AppState {
    pub async fn new(config: config::Config) -> Result<Arc<Self>, anyhow::Error> {

        let client = Client::builder()
            .timeout(Duration::from_secs(30)) 
            .connect_timeout(Duration::from_secs(10)) 
            .pool_max_idle_per_host(10) 
            .pool_idle_timeout(Duration::from_secs(90))
            .user_agent("commune-public-appservice") 
            .build()?;

        let appservice = appservice::AppService::new(&config).await?;

        let cache = cache::Cache::new(&config).await?;

        let transaction_store = ping::TransactionStore::new();

        let oidc = oidc::get_auth_metadata(&config.matrix.homeserver).await?;


        Ok(Arc::new(Self {
            config,
            proxy: client,
            appservice,
            transaction_store,
            cache,
            oidc,
        }))
    }
}

use clap::Parser;

#[derive(Parser)]
pub struct Args {
    #[arg(short, long, default_value = "config.toml")]
    pub config: std::path::PathBuf,
    #[arg(short, long, default_value = "8989")]
    pub port: u16,
}

impl Args {
    pub fn build() -> Self {
        Args::parse()
    }
}