first commit

This commit is contained in:
Mateusz Gruszczyński
2026-07-17 15:29:08 +02:00
commit 771494671b
35 changed files with 5020 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
use std::{collections::HashMap, sync::Arc};
use sqlx::SqlitePool;
use tokio::sync::{broadcast, RwLock};
const CHANNEL_CAPACITY: usize = 256;
#[derive(Debug, Clone)]
pub struct NoteUpdate {
pub content: String,
pub revision_id: i64,
pub updated_at: String,
}
#[derive(Debug)]
pub struct AppState {
pub db: SqlitePool,
pub asset_version: String,
channels: RwLock<HashMap<String, broadcast::Sender<NoteUpdate>>>,
}
impl AppState {
pub fn new(db: SqlitePool, asset_version: String) -> Self {
Self {
db,
asset_version,
channels: RwLock::new(HashMap::new()),
}
}
async fn channel_for_key(&self, key: String) -> broadcast::Sender<NoteUpdate> {
if let Some(sender) = self.channels.read().await.get(&key) {
return sender.clone();
}
let mut channels = self.channels.write().await;
channels
.entry(key)
.or_insert_with(|| broadcast::channel(CHANNEL_CAPACITY).0)
.clone()
}
pub async fn note_channel(&self, workspace_slug: &str, note_slug: &str) -> broadcast::Sender<NoteUpdate> {
self.channel_for_key(format!("workspace:{workspace_slug}/{note_slug}")).await
}
pub async fn pad_channel(&self, slug: &str) -> broadcast::Sender<NoteUpdate> {
self.channel_for_key(format!("pad:{slug}")).await
}
}
pub type SharedState = Arc<AppState>;