moduforge_collaboration/
middleware.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use moduforge_core::{middleware::Middleware, ForgeResult};
5use moduforge_state::{State, Transaction};
6use tracing::error;
7
8use crate::SyncService;
9
10#[derive(Debug)]
11pub struct YrsMiddleware {
12    pub sync_service: Arc<SyncService>,
13    pub room_id: String,
14}
15
16#[async_trait]
17impl Middleware for YrsMiddleware {
18    fn name(&self) -> String {
19        "YrsMiddleware".to_string()
20    }
21    async fn after_dispatch(
22        &self,
23        _state: Option<Arc<State>>,
24        transactions: &[Transaction],
25    ) -> ForgeResult<Option<Transaction>> {
26        tracing::info!(
27            "同步事务: {} 个到房间 {}",
28            transactions.len(),
29            self.room_id
30        );
31
32        // 同步每个事务
33        if let Err(e) = self
34            .sync_service
35            .handle_transaction_applied(transactions, &self.room_id)
36            .await
37        {
38            error!("YRS同步失败: {}", e);
39        }
40
41        Ok(None)
42    }
43}