moduforge_core/
runtime.rs

1use std::sync::Arc;
2
3use crate::{
4    error::{EditorResult, error_utils},
5    event::{Event, EventBus},
6    extension_manager::ExtensionManager,
7    helpers::create_doc,
8    history_manager::HistoryManager,
9    types::EditorOptions,
10    middleware::{Middleware, MiddlewareStack},
11};
12
13use moduforge_model::{node_pool::NodePool, schema::Schema};
14use moduforge_state::{
15    state::{State, StateConfig, TransactionResult},
16    transaction::{Command, Transaction},
17    {info, debug, error},
18};
19
20/// Editor 结构体代表编辑器的核心功能实现
21/// 负责管理文档状态、事件处理、插件系统和存储等核心功能
22pub struct Editor {
23    pub event_bus: EventBus,
24    pub state: Arc<State>,
25    pub extension_manager: ExtensionManager,
26    pub history_manager: HistoryManager<Arc<State>>,
27    pub options: EditorOptions,
28    pub middleware_stack: MiddlewareStack,
29}
30
31impl Editor {
32    /// 创建新的编辑器实例
33    /// options: 编辑器配置选项
34    pub async fn create(options: EditorOptions) -> EditorResult<Self> {
35        info!("正在创建新的编辑器实例");
36        let extension_manager =
37            ExtensionManager::new(&options.get_extensions());
38        debug!("已初始化扩展管理器");
39
40        let doc = create_doc::create_doc(
41            &extension_manager.get_schema(),
42            &options.get_content(),
43        )
44        .await;
45        let event_bus = EventBus::new();
46        debug!("已创建文档和事件总线");
47
48        let state: State = State::create(StateConfig {
49            schema: Some(extension_manager.get_schema()),
50            doc,
51            stored_marks: None,
52            plugins: Some(extension_manager.get_plugins().clone()),
53        })
54        .await
55        .map_err(|e| {
56            error!("创建状态失败: {}", e);
57            error_utils::state_error(format!("Failed to create state: {}", e))
58        })?;
59
60        let state: Arc<State> = Arc::new(state);
61        debug!("已创建编辑器状态");
62
63        let mut runtime = Editor {
64            event_bus,
65            state: state.clone(),
66            extension_manager,
67            history_manager: HistoryManager::new(
68                state,
69                options.get_history_limit(),
70            ),
71            options,
72            middleware_stack: MiddlewareStack::new(),
73        };
74        runtime.init().await?;
75        info!("编辑器实例创建成功");
76        Ok(runtime)
77    }
78
79    /// 初始化编辑器,设置事件处理器并启动事件循环
80    async fn init(&mut self) -> EditorResult<()> {
81        debug!("正在初始化编辑器");
82        self.event_bus
83            .add_event_handlers(self.options.get_event_handlers())
84            .await?;
85        self.event_bus.start_event_loop();
86        debug!("事件总线已启动");
87
88        self.event_bus
89            .broadcast_blocking(Event::Create(self.state.clone()))
90            .map_err(|e| {
91                error!("广播创建事件失败: {}", e);
92                error_utils::event_error(format!(
93                    "Failed to broadcast create event: {}",
94                    e
95                ))
96            })?;
97        debug!("已广播创建事件");
98        Ok(())
99    }
100
101    /// 销毁编辑器实例
102    pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
103        debug!("正在销毁编辑器实例");
104        // 广播销毁事件
105        self.event_bus.broadcast(Event::Destroy).await?;
106        // 停止事件循环
107        self.event_bus.broadcast(Event::Stop).await?;
108        debug!("编辑器实例销毁成功");
109        Ok(())
110    }
111
112    /// Add a middleware to the stack
113    pub fn add_middleware<M>(
114        &mut self,
115        middleware: M,
116    ) where
117        M: Middleware + 'static,
118    {
119        self.middleware_stack.add(middleware);
120    }
121    pub async fn run_before_middleware(
122        &mut self,
123        transaction: &mut Transaction,
124    ) -> EditorResult<()> {
125        debug!("执行前置中间件链");
126        for middleware in &self.middleware_stack.middlewares {
127            let timeout = std::time::Duration::from_millis(500);
128            if let Err(e) = tokio::time::timeout(
129                timeout,
130                middleware.before_dispatch(transaction),
131            )
132            .await
133            {
134                return Err(error_utils::middleware_error(format!(
135                    "中间件执行超时: {}",
136                    e
137                )));
138            }
139        }
140        Ok(())
141    }
142    pub async fn run_after_middleware(
143        &mut self,
144        state: &mut Option<Arc<State>>,
145    ) -> EditorResult<()> {
146        debug!("执行后置中间件链");
147        for middleware in &self.middleware_stack.middlewares {
148            let timeout = std::time::Duration::from_millis(500);
149            let middleware_result = match tokio::time::timeout(
150                timeout,
151                middleware.after_dispatch(state.clone()),
152            )
153            .await
154            {
155                Ok(result) => result?,
156                Err(e) => {
157                    return Err(error_utils::middleware_error(format!(
158                        "中间件执行超时: {}",
159                        e
160                    )));
161                },
162            };
163
164            if let Some(transaction) = middleware_result.additional_transaction
165            {
166                let TransactionResult { state: new_state, transactions: _ } =
167                    self.state.apply(transaction).await.map_err(|e| {
168                        error_utils::state_error(format!(
169                            "附加事务应用失败: {}",
170                            e
171                        ))
172                    })?;
173                *state = Some(Arc::new(new_state));
174            }
175        }
176        Ok(())
177    }
178    pub async fn command(
179        &mut self,
180        command: Arc<dyn Command>,
181    ) -> EditorResult<()> {
182        debug!("正在执行命令: {}", command.name());
183        let mut tr = self.get_tr();
184        tr.transaction(command).await;
185        self.dispatch(tr).await
186    }
187
188    /// 处理编辑器事务的核心方法
189    ///
190    /// # 参数
191    /// * `transaction` - 要处理的事务对象
192    ///
193    /// # 返回值
194    /// * `EditorResult<()>` - 处理结果,成功返回 Ok(()), 失败返回错误
195    pub async fn dispatch(
196        &mut self,
197        transaction: Transaction,
198    ) -> EditorResult<()> {
199        // 保存当前事务的副本,用于中间件处理
200        let mut current_transaction = transaction;
201        self.run_before_middleware(&mut current_transaction).await?;
202
203        // 应用事务到编辑器状态,获取新的状态和产生的事务列表
204        let TransactionResult { state, transactions } =
205            self.state.apply(current_transaction).await.map_err(|e| {
206                error_utils::state_error(format!(
207                    "Failed to apply transaction: {}",
208                    e
209                ))
210            })?;
211
212        // 使用 Option 来避免不必要的克隆
213        let mut state_update = None;
214
215        // 检查最后一个事务是否改变了文档
216        if let Some(tr) = transactions.last() {
217            if tr.doc_changed() {
218                // 如果文档发生变化,更新当前状态并广播事务应用事件
219                state_update = Some(Arc::new(state));
220
221                // 使用 clone 的引用计数而不是深度克隆
222                let transactions = Arc::new(transactions);
223
224                self.event_bus
225                    .broadcast(Event::TrApply(transactions, state_update.clone().unwrap()))
226                    .await
227                    .map_err(|e| {
228                        error_utils::event_error(format!(
229                            "Failed to broadcast event: {}",
230                            e
231                        ))
232                    })?;
233            }
234        }
235        // 执行后置中间件链,允许中间件在事务应用后执行额外操作
236        self.run_after_middleware(&mut state_update).await?;
237
238        // 如果有新的状态,更新编辑器状态并记录到历史记录
239        if let Some(state) = state_update {
240            self.state = state;
241            // 使用 clone 的引用计数
242            self.history_manager.insert(self.state.clone());
243        }
244
245        Ok(())
246    }
247
248    pub async fn register_plugin(&mut self) -> EditorResult<()> {
249        info!("正在注册新插件");
250        let state = self
251            .get_state()
252            .reconfigure(StateConfig {
253                schema: Some(self.get_schema()),
254                doc: Some(self.get_state().doc()),
255                stored_marks: None,
256                plugins: Some(self.get_state().plugins().clone()),
257            })
258            .await
259            .map_err(|e| {
260                error!("重新配置状态失败: {}", e);
261                error_utils::state_error(format!(
262                    "Failed to reconfigure state: {}",
263                    e
264                ))
265            })?;
266        self.state = Arc::new(state);
267        info!("插件注册成功");
268        Ok(())
269    }
270
271    pub async fn unregister_plugin(
272        &mut self,
273        plugin_key: String,
274    ) -> EditorResult<()> {
275        info!("正在注销插件: {}", plugin_key);
276        let ps = self
277            .get_state()
278            .plugins()
279            .iter()
280            .filter(|p| p.key != plugin_key)
281            .cloned()
282            .collect();
283        let state = self
284            .get_state()
285            .reconfigure(StateConfig {
286                schema: Some(self.get_schema().clone()),
287                doc: Some(self.get_state().doc()),
288                stored_marks: None,
289                plugins: Some(ps),
290            })
291            .await
292            .map_err(|e| {
293                error!("重新配置状态失败: {}", e);
294                error_utils::state_error(format!(
295                    "Failed to reconfigure state: {}",
296                    e
297                ))
298            })?;
299        self.state = Arc::new(state);
300        info!("插件注销成功");
301        Ok(())
302    }
303
304    /// 共享的基础实现方法
305    pub fn doc(&self) -> Arc<NodePool> {
306        self.state.doc()
307    }
308
309    pub fn get_options(&self) -> &EditorOptions {
310        &self.options
311    }
312
313    pub fn get_state(&self) -> &Arc<State> {
314        &self.state
315    }
316
317    pub fn get_schema(&self) -> Arc<Schema> {
318        self.extension_manager.get_schema()
319    }
320
321    pub fn get_event_bus(&self) -> &EventBus {
322        &self.event_bus
323    }
324
325    pub fn get_tr(&self) -> Transaction {
326        let tr = self.get_state().tr();
327        tr
328    }
329
330    pub fn undo(&mut self) {
331        self.history_manager.jump(-1);
332        self.state = self.history_manager.get_present();
333    }
334    
335
336    pub fn redo(&mut self) {
337        self.history_manager.jump(1);
338        self.state = self.history_manager.get_present();
339    }
340
341    pub fn jump(&mut self, n: isize) {
342        self.history_manager.jump(n);
343        self.state = self.history_manager.get_present();
344    }
345
346}