moduforge_runtime/
async_runtime.rs1use 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;
20pub struct Editor {
23 base: EditorBase,
24 flow_engine: FlowEngine,
25}
26
27impl Editor {
28 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 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 pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
85 debug!("正在销毁编辑器实例");
86 self.base.event_bus.broadcast(Event::Destroy).await?;
88 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}