moduforge_core/
async_runtime.rs

1use std::{
2    ops::{Deref, DerefMut},
3    sync::Arc,
4};
5
6use crate::{
7    event::{Event, EventBus},
8    extension_manager::ExtensionManager,
9    flow::{FlowEngine, ProcessorResult},
10    helpers::create_doc,
11    history_manager::HistoryManager,
12    middleware::MiddlewareStack,
13    types::EditorOptions,
14    EditorResult,
15};
16use moduforge_state::{
17    debug,
18    state::{State, StateConfig},
19    transaction::Transaction,
20};
21use crate::runtime::Editor;
22/// Editor 结构体代表编辑器的核心功能实现
23/// 负责管理文档状态、事件处理、插件系统和存储等核心功能
24pub struct AsyncEditor {
25    base: Editor,
26    flow_engine: FlowEngine,
27}
28impl Deref for AsyncEditor {
29    type Target = Editor;
30
31    fn deref(&self) -> &Self::Target {
32        &self.base
33    }
34}
35
36impl DerefMut for AsyncEditor {
37    fn deref_mut(&mut self) -> &mut Self::Target {
38        &mut self.base
39    }
40}
41impl AsyncEditor {
42    /// 创建新的编辑器实例
43    /// options: 编辑器配置选项
44    pub async fn create(
45        options: EditorOptions
46    ) -> Result<Self, Box<dyn std::error::Error>> {
47        debug!("正在创建新的编辑器实例");
48        let extension_manager =
49            ExtensionManager::new(&options.get_extensions());
50        debug!("已初始化扩展管理器");
51        let doc = create_doc::create_doc(
52            &extension_manager.get_schema(),
53            &options.get_content(),
54        )
55        .await;
56        let event_bus = EventBus::new();
57        debug!("已创建文档和事件总线");
58        let state: State = State::create(StateConfig {
59            schema: Some(extension_manager.get_schema()),
60            doc,
61            stored_marks: None,
62            plugins: Some(extension_manager.get_plugins().clone()),
63        })
64        .await?;
65        let state: Arc<State> = Arc::new(state);
66
67        let base = Editor {
68            event_bus,
69            state: state.clone(),
70            extension_manager,
71            history_manager: HistoryManager::new(
72                state,
73                options.get_history_limit(),
74            ),
75            options,
76            middleware_stack: MiddlewareStack::new(),
77        };
78
79        let mut runtime = AsyncEditor { base, flow_engine: FlowEngine::new()? };
80        runtime.init().await?;
81        debug!("编辑器实例创建成功");
82        Ok(runtime)
83    }
84
85    /// 初始化编辑器,设置事件处理器并启动事件循环
86    async fn init(&mut self) -> Result<(), Box<dyn std::error::Error>> {
87        self.base
88            .event_bus
89            .add_event_handlers(self.base.options.get_event_handlers())
90            .await?;
91        self.base.event_bus.start_event_loop();
92        self.base
93            .event_bus
94            .broadcast_blocking(Event::Create(self.base.state.clone()))?;
95        Ok(())
96    }
97
98    /// 销毁编辑器实例
99    pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
100        debug!("正在销毁编辑器实例");
101        // 广播销毁事件
102        self.base.event_bus.broadcast(Event::Destroy).await?;
103        // 停止事件循环
104        self.base.event_bus.broadcast(Event::Stop).await?;
105        debug!("编辑器实例销毁成功");
106        Ok(())
107    }
108
109    pub async fn dispatch(
110        &mut self,
111        transaction: Transaction,
112    ) -> EditorResult<()> {
113        // 保存当前事务的副本,用于中间件处理
114        let mut current_transaction = transaction;
115        self.run_before_middleware(&mut current_transaction).await?;
116
117        // 使用 flow_engine 提交事务
118        let (_id, mut rx) = self
119            .flow_engine
120            .submit_transaction((self.base.state.clone(), current_transaction))
121            .await?;
122
123        // 等待任务结果
124        let Some(task_result) = rx.recv().await else {
125            return Ok(());
126        };
127
128        // 获取处理结果
129        let Some(ProcessorResult { result: Some(result), .. }) =
130            task_result.output
131        else {
132            return Ok(());
133        };
134
135        // 更新编辑器状态
136        let mut current_state = None;
137
138        // 检查最后一个事务是否改变了文档
139        if let Some(tr) = result.transactions.last() {
140            if tr.doc_changed() {
141                current_state = Some(Arc::new(result.state));
142                // 使用 clone 的引用计数而不是深度克隆
143                let transactions = Arc::new(result.transactions);
144
145                self.base
146                    .event_bus
147                    .broadcast(Event::TrApply(
148                        transactions,
149                        current_state.clone().unwrap(),
150                    ))
151                    .await?;
152            }
153        }
154        // 执行后置中间件链,允许中间件在事务应用后执行额外操作
155        self.run_after_middleware(&mut current_state).await?;
156        if let Some(state) = current_state {
157            self.base.state = state;
158            self.base.history_manager.insert(self.base.state.clone());
159        }
160        Ok(())
161    }
162}