mf_core/helpers/
middleware_helper.rs1use crate::{
11 config::ForgeConfig,
12 debug::debug,
13 error::{error_utils, ForgeResult},
14 metrics,
15 middleware::MiddlewareStack,
16};
17use mf_state::{state::State, transaction::Transaction};
18use std::sync::Arc;
19use std::time::Instant;
20
21pub struct MiddlewareHelper;
23
24impl MiddlewareHelper {
25 pub async fn run_before_middleware(
35 transaction: &mut Transaction,
36 middleware_stack: &MiddlewareStack,
37 config: &ForgeConfig,
38 ) -> ForgeResult<()> {
39 debug!("执行前置中间件链");
40
41 let timeout = std::time::Duration::from_millis(
42 config.performance.middleware_timeout_ms,
43 );
44
45 for middleware in &middleware_stack.middlewares {
46 let start_time = Instant::now();
47
48 match tokio::time::timeout(
49 timeout,
50 middleware.before_dispatch(transaction),
51 )
52 .await
53 {
54 Ok(Ok(())) => {
55 metrics::middleware_execution_duration(
57 start_time.elapsed(),
58 "before",
59 middleware.name().as_str(),
60 );
61 continue;
62 },
63 Ok(Err(e)) => {
64 return Err(error_utils::middleware_error(format!(
65 "前置中间件执行失败: {e}"
66 )));
67 },
68 Err(_) => {
69 return Err(error_utils::middleware_error(format!(
70 "前置中间件执行超时({}ms)",
71 config.performance.middleware_timeout_ms
72 )));
73 },
74 }
75 }
76
77 Ok(())
78 }
79
80 pub async fn run_after_middleware(
91 state: &mut Option<Arc<State>>,
92 transactions: &mut [Arc<Transaction>],
93 middleware_stack: &MiddlewareStack,
94 config: &ForgeConfig,
95 ) -> ForgeResult<()> {
96 debug!("执行后置中间件链");
97
98 let timeout = std::time::Duration::from_millis(
99 config.performance.middleware_timeout_ms,
100 );
101
102 for middleware in &middleware_stack.middlewares {
103 let start_time = Instant::now();
104
105 let middleware_result = match tokio::time::timeout(
106 timeout,
107 middleware.after_dispatch(state.clone(), transactions),
108 )
109 .await
110 {
111 Ok(Ok(result)) => {
112 metrics::middleware_execution_duration(
113 start_time.elapsed(),
114 "after",
115 middleware.name().as_str(),
116 );
117 result
118 },
119 Ok(Err(e)) => {
120 return Err(error_utils::middleware_error(format!(
121 "后置中间件执行失败: {e}"
122 )));
123 },
124 Err(_) => {
125 return Err(error_utils::middleware_error(format!(
126 "后置中间件执行超时({}ms)",
127 config.performance.middleware_timeout_ms
128 )));
129 },
130 };
131
132 if middleware_result.is_some() {
137 }
141 }
142
143 Ok(())
144 }
145}