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!("同步事务: {} 个到房间 {}", transactions.len(), self.room_id);
27        
28        let state = match state {
29            Some(s) => s,
30            None => {
31                error!("YrsMiddleware after_dispatch called without state, cannot sync.");
32                return Ok(None);
33            }
34        };
35        
36        // 使用新的批量二进制格式同步
37        if let Err(e) = self.sync_service.handle_transaction_applied(&self.room_id, transactions, &state, None).await {
38            error!("YRS同步失败: {}", e);
39        }
40        
41        Ok(None)
42    }
43}