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!(
27 "同步事务: {} 个到房间 {}",
28 transactions.len(),
29 self.room_id
30 );
31
32 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}