moduforge_core/
async_runtime.rs1use 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;
22pub 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 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 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 pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
100 debug!("正在销毁编辑器实例");
101 self.base.event_bus.broadcast(Event::Destroy).await?;
103 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 let mut current_transaction = transaction;
115 self.run_before_middleware(&mut current_transaction).await?;
116
117 let (_id, mut rx) = self
119 .flow_engine
120 .submit_transaction((self.base.state.clone(), current_transaction))
121 .await?;
122
123 let Some(task_result) = rx.recv().await else {
125 return Ok(());
126 };
127
128 let Some(ProcessorResult { result: Some(result), .. }) =
130 task_result.output
131 else {
132 return Ok(());
133 };
134
135 let mut current_state = None;
137
138 if let Some(tr) = result.transactions.last() {
140 if tr.doc_changed() {
141 current_state = Some(Arc::new(result.state));
142 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 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}