A Wrapped / Replay like for teal.fm and rocksky.app (currently on hiatus)
1use clap::Parser;
2use metrics_exporter_prometheus::PrometheusBuilder;
3use r2d2_sqlite::SqliteConnectionManager;
4
5mod analysis;
6mod config;
7mod ingest;
8mod lex;
9mod mbz;
10mod server;
11mod utils;
12
13pub type SqlitePool = r2d2::Pool<SqliteConnectionManager>;
14pub type SqliteConnection = r2d2::PooledConnection<SqliteConnectionManager>;
15
16#[tokio::main]
17async fn main() -> eyre::Result<()> {
18 tracing_subscriber::fmt::init();
19 PrometheusBuilder::new().install()?;
20
21 let config = config::Config::parse();
22
23 let manager = SqliteConnectionManager::file(&config.db).with_init(|conn| {
24 conn.pragma_update(None, "journal_mode", "WAL")?;
25 conn.pragma_update(None, "synchronous", "NORMAL")?;
26 conn.pragma_update(None, "cache_size", -16 * 1024)?; // 64MB
27 conn.execute_batch(include_str!("init.sql"))
28 });
29 let pool = r2d2::Pool::new(manager)?;
30
31 let replication_agent = mbz::ReplicationAgent::new(pool.clone(), config.db, config.mb_agent);
32
33 let mut tasks = tokio::task::JoinSet::new();
34
35 tasks.spawn(server::start_server(pool.clone(), config.port));
36 tasks.spawn(ingest::tapstream(pool, config.tap));
37 tasks.spawn(replication_agent.start());
38
39 tasks.join_all().await;
40
41 Ok(())
42}