-pub fn captcha_espeak_wav_base64(captcha: &str) -> Result<String, LemmyError> {
- let mut built_text = String::new();
-
- // Building proper speech text for espeak
- for mut c in captcha.chars() {
- let new_str = if c.is_alphabetic() {
- if c.is_lowercase() {
- c.make_ascii_uppercase();
- format!("lower case {} ... ", c)
- } else {
- c.make_ascii_uppercase();
- format!("capital {} ... ", c)
- }
- } else {
- format!("{} ...", c)
+ #[cfg(feature = "prometheus-metrics")]
+ serve_prometheus(settings.prometheus.as_ref(), context.clone());
+
+ let settings_bind = settings.clone();
+
+ let federation_config = FederationConfig::builder()
+ .domain(settings.hostname.clone())
+ .app_data(context.clone())
+ .client(client.clone())
+ .http_fetch_limit(FEDERATION_HTTP_FETCH_LIMIT)
+ .worker_count(settings.worker_count)
+ .retry_count(settings.retry_count)
+ .debug(*SYNCHRONOUS_FEDERATION)
+ .http_signature_compat(true)
+ .url_verifier(Box::new(VerifyUrlData(context.inner_pool().clone())))
+ .build()
+ .await?;
+
+ // this must come before the HttpServer creation
+ // creates a middleware that populates http metrics for each path, method, and status code
+ #[cfg(feature = "prometheus-metrics")]
+ let prom_api_metrics = PrometheusMetricsBuilder::new("lemmy_api")
+ .registry(default_registry().clone())
+ .build()
+ .expect("Should always be buildable");
+
+ MATCH_OUTGOING_ACTIVITIES
+ .set(Box::new(move |d, c| {
+ Box::pin(match_outgoing_activities(d, c))
+ }))
+ .expect("set function pointer");
+ let request_data = federation_config.to_request_data();
+ let outgoing_activities_task = tokio::task::spawn(handle_outgoing_activities(request_data));
+
+ // Create Http server with websocket support
+ HttpServer::new(move || {
+ let cors_origin = env::var("LEMMY_CORS_ORIGIN");
+ let cors_config = match (cors_origin, cfg!(debug_assertions)) {
+ (Ok(origin), false) => Cors::default()
+ .allowed_origin(&origin)
+ .allowed_origin(&settings.get_protocol_and_hostname()),
+ _ => Cors::default()
+ .allow_any_origin()
+ .allow_any_method()
+ .allow_any_header()
+ .expose_any_header()
+ .max_age(3600),