moduforge_collaboration/
middleware.rs1use 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 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}