moduforge_runtime/
async_runtime.rs

1use std::sync::Arc;
2
3use crate::{
4    event::{Event, EventBus},
5    extension_manager::ExtensionManager,
6    flow::{FlowEngine, ProcessorResult},
7    helpers::create_doc,
8    history_manager::HistoryManager,
9    traits::{EditorBase, EditorCore},
10    types::EditorOptions,
11};
12use async_trait::async_trait;
13use moduforge_model::{node_pool::NodePool, schema::Schema};
14use moduforge_state::{
15    debug,
16    state::{State, StateConfig},
17    transaction::{Command, Transaction},
18};
19use moduforge_transform::transform::Transform;
20/// Editor 结构体代表编辑器的核心功能实现
21/// 负责管理文档状态、事件处理、插件系统和存储等核心功能
22pub struct Editor {
23    base: EditorBase,
24    flow_engine: FlowEngine,
25}
26
27impl Editor {
28    /// 创建新的编辑器实例
29    /// options: 编辑器配置选项
30    pub async fn create(
31        options: EditorOptions
32    ) -> Result<Self, Box<dyn std::error::Error>> {
33        debug!("正在创建新的编辑器实例");
34        let extension_manager =
35            ExtensionManager::new(&options.get_extensions());
36        debug!("已初始化扩展管理器");
37        let doc = create_doc::create_doc(
38            &extension_manager.get_schema(),
39            &options.get_content(),
40        )
41        .await;
42        let event_bus = EventBus::new();
43        debug!("已创建文档和事件总线");
44        let state: State = State::create(StateConfig {
45            schema: Some(extension_manager.get_schema()),
46            doc,
47            stored_marks: None,
48            plugins: Some(extension_manager.get_plugins().clone()),
49        })
50        .await?;
51        let state: Arc<State> = Arc::new(state);
52
53        let base = EditorBase {
54            event_bus,
55            state: state.clone(),
56            extension_manager,
57            history_manager: HistoryManager::new(
58                state,
59                options.get_history_limit(),
60            ),
61            options,
62        };
63
64        let mut runtime = Editor { base, flow_engine: FlowEngine::new()? };
65        runtime.init().await?;
66        debug!("编辑器实例创建成功");
67        Ok(runtime)
68    }
69
70    /// 初始化编辑器,设置事件处理器并启动事件循环
71    async fn init(&mut self) -> Result<(), Box<dyn std::error::Error>> {
72        self.base
73            .event_bus
74            .add_event_handlers(self.base.options.get_event_handlers())
75            .await?;
76        self.base.event_bus.start_event_loop();
77        self.base
78            .event_bus
79            .broadcast_blocking(Event::Create(self.base.state.clone()))?;
80        Ok(())
81    }
82
83    /// 销毁编辑器实例
84    pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
85        debug!("正在销毁编辑器实例");
86        // 广播销毁事件
87        self.base.event_bus.broadcast(Event::Destroy).await?;
88        // 停止事件循环
89        self.base.event_bus.broadcast(Event::Stop).await?;
90        debug!("编辑器实例销毁成功");
91        Ok(())
92    }
93}
94
95#[async_trait]
96impl EditorCore for Editor {
97    type Error = Box<dyn std::error::Error>;
98
99    fn doc(&self) -> Arc<NodePool> {
100        self.base.doc()
101    }
102
103    fn get_options(&self) -> &EditorOptions {
104        self.base.get_options()
105    }
106
107    fn get_state(&self) -> &Arc<State> {
108        self.base.get_state()
109    }
110
111    fn get_schema(&self) -> Arc<Schema> {
112        self.base.get_schema()
113    }
114
115    fn get_event_bus(&self) -> &EventBus {
116        self.base.get_event_bus()
117    }
118
119    fn get_tr(&self) -> Transaction {
120        self.base.get_tr()
121    }
122
123    async fn command(
124        &mut self,
125        command: Arc<dyn Command>,
126    ) -> Result<(), Self::Error> {
127        let mut tr = self.get_tr();
128        tr.transaction(command).await;
129        self.dispatch(tr).await
130    }
131
132    async fn dispatch(
133        &mut self,
134        transaction: Transaction,
135    ) -> Result<(), Self::Error> {
136        let (_id, mut rx) = self
137            .flow_engine
138            .submit_transaction((self.base.state.clone(), transaction))
139            .await?;
140
141        let Some(task_result) = rx.recv().await else {
142            return Ok(());
143        };
144        let Some(ProcessorResult { result: Some(result), .. }) =
145            task_result.output
146        else {
147            return Ok(());
148        };
149
150        self.base.state = Arc::new(result.state);
151
152        if let Some(tr) = result.transactions.last() {
153            if tr.doc_changed() {
154                self.base.history_manager.insert(self.base.state.clone());
155                self.base
156                    .event_bus
157                    .broadcast(Event::TrApply(
158                        Arc::new(result.transactions),
159                        self.base.state.clone(),
160                    ))
161                    .await?;
162            }
163        }
164        Ok(())
165    }
166
167    async fn register_plugin(&mut self) -> Result<(), Self::Error> {
168        let state = self
169            .get_state()
170            .reconfigure(StateConfig {
171                schema: Some(self.get_schema()),
172                doc: Some(self.get_state().doc()),
173                stored_marks: None,
174                plugins: Some(self.get_state().plugins().clone()),
175            })
176            .await?;
177        self.base.state = Arc::new(state);
178        Ok(())
179    }
180
181    async fn unregister_plugin(
182        &mut self,
183        plugin_key: String,
184    ) -> Result<(), Self::Error> {
185        let ps = self
186            .get_state()
187            .plugins()
188            .iter()
189            .filter(|p| p.key != plugin_key)
190            .cloned()
191            .collect();
192        let state = self
193            .get_state()
194            .reconfigure(StateConfig {
195                schema: Some(self.get_schema().clone()),
196                doc: Some(self.get_state().doc()),
197                stored_marks: None,
198                plugins: Some(ps),
199            })
200            .await?;
201        self.base.state = Arc::new(state);
202        Ok(())
203    }
204
205    fn undo(&mut self) {
206        self.base.undo()
207    }
208
209    fn redo(&mut self) {
210        self.base.redo()
211    }
212}