@@ -11,7 +11,7 @@ use engine_executors::{
11
11
} ,
12
12
webhook:: { WebhookJobHandler , WebhookRetryConfig } ,
13
13
} ;
14
- use twmq:: { Queue , queue:: QueueOptions } ;
14
+ use twmq:: { Queue , queue:: QueueOptions , shutdown :: ShutdownHandle } ;
15
15
16
16
use crate :: {
17
17
chains:: ThirdwebChainService ,
@@ -20,10 +20,21 @@ use crate::{
20
20
21
21
pub struct QueueManager {
22
22
pub webhook_queue : Arc < Queue < WebhookJobHandler > > ,
23
- pub erc4337_send_queue : Arc < Queue < ExternalBundlerSendHandler < ThirdwebChainService > > > ,
24
- pub erc4337_confirm_queue : Arc < Queue < UserOpConfirmationHandler < ThirdwebChainService > > > ,
23
+ pub external_bundler_send_queue : Arc < Queue < ExternalBundlerSendHandler < ThirdwebChainService > > > ,
24
+ pub userop_confirm_queue : Arc < Queue < UserOpConfirmationHandler < ThirdwebChainService > > > ,
25
25
}
26
26
27
+ fn get_queue_name_for_namespace ( namespace : & Option < String > , name : & str ) -> String {
28
+ match namespace {
29
+ Some ( namespace) => format ! ( "{}_{}" , namespace, name) ,
30
+ None => name. to_owned ( ) ,
31
+ }
32
+ }
33
+
34
+ const EXTERNAL_BUNDLER_SEND_QUEUE_NAME : & str = "external_bundler_send" ;
35
+ const USEROP_CONFIRM_QUEUE_NAME : & str = "userop_confirm" ;
36
+ const WEBHOOK_QUEUE_NAME : & str = "webhook" ;
37
+
27
38
impl QueueManager {
28
39
pub async fn new (
29
40
redis_config : & RedisConfig ,
@@ -49,12 +60,13 @@ impl QueueManager {
49
60
} ;
50
61
51
62
let mut external_bundler_send_queue_opts = base_queue_opts. clone ( ) ;
52
- let mut external_bundler_confirm_queue_opts = base_queue_opts. clone ( ) ;
53
- let mut webhook_queue_opts = base_queue_opts. clone ( ) ;
63
+ external_bundler_send_queue_opts. local_concurrency =
64
+ queue_config. external_bundler_send_workers ;
65
+
66
+ let mut userop_confirm_queue_opts = base_queue_opts. clone ( ) ;
67
+ userop_confirm_queue_opts. local_concurrency = queue_config. userop_confirm_workers ;
54
68
55
- external_bundler_send_queue_opts. local_concurrency = queue_config. erc4337_send_workers ;
56
- external_bundler_confirm_queue_opts. local_concurrency =
57
- queue_config. erc4337_confirm_workers ;
69
+ let mut webhook_queue_opts = base_queue_opts. clone ( ) ;
58
70
webhook_queue_opts. local_concurrency = queue_config. webhook_workers ;
59
71
60
72
// Create webhook queue
@@ -63,32 +75,43 @@ impl QueueManager {
63
75
retry_config : Arc :: new ( WebhookRetryConfig :: default ( ) ) ,
64
76
} ;
65
77
66
- let webhook_queue = Arc :: new (
67
- Queue :: new (
68
- & redis_config. url ,
69
- "webhook" ,
70
- Some ( webhook_queue_opts) ,
71
- webhook_handler,
72
- )
73
- . await ?,
78
+ let webhook_queue_name =
79
+ get_queue_name_for_namespace ( & queue_config. execution_namespace , WEBHOOK_QUEUE_NAME ) ;
80
+
81
+ let external_bundler_send_queue_name = get_queue_name_for_namespace (
82
+ & queue_config. execution_namespace ,
83
+ EXTERNAL_BUNDLER_SEND_QUEUE_NAME ,
84
+ ) ;
85
+
86
+ let userop_confirm_queue_name = get_queue_name_for_namespace (
87
+ & queue_config. execution_namespace ,
88
+ USEROP_CONFIRM_QUEUE_NAME ,
74
89
) ;
75
90
91
+ let webhook_queue = Queue :: builder ( )
92
+ . name ( webhook_queue_name)
93
+ . options ( webhook_queue_opts)
94
+ . handler ( webhook_handler)
95
+ . redis_client ( redis_client. clone ( ) )
96
+ . build ( )
97
+ . await ?
98
+ . arc ( ) ;
99
+
76
100
// Create confirmation queue first (needed by send queue)
77
101
let confirm_handler = UserOpConfirmationHandler :: new (
78
102
chain_service. clone ( ) ,
79
103
deployment_lock. clone ( ) ,
80
104
webhook_queue. clone ( ) ,
81
105
) ;
82
106
83
- let erc4337_confirm_queue = Arc :: new (
84
- Queue :: new (
85
- & redis_config. url ,
86
- "erc4337_confirm" ,
87
- Some ( external_bundler_confirm_queue_opts) ,
88
- confirm_handler,
89
- )
90
- . await ?,
91
- ) ;
107
+ let userop_confirm_queue = Queue :: builder ( )
108
+ . name ( userop_confirm_queue_name)
109
+ . options ( userop_confirm_queue_opts)
110
+ . handler ( confirm_handler)
111
+ . redis_client ( redis_client. clone ( ) )
112
+ . build ( )
113
+ . await ?
114
+ . arc ( ) ;
92
115
93
116
// Create send queue
94
117
let send_handler = ExternalBundlerSendHandler {
@@ -97,56 +120,51 @@ impl QueueManager {
97
120
deployment_cache,
98
121
deployment_lock,
99
122
webhook_queue : webhook_queue. clone ( ) ,
100
- confirm_queue : erc4337_confirm_queue . clone ( ) ,
123
+ confirm_queue : userop_confirm_queue . clone ( ) ,
101
124
} ;
102
125
103
- let erc4337_send_queue = Arc :: new (
104
- Queue :: new (
105
- & redis_config. url ,
106
- "erc4337_send" ,
107
- Some ( external_bundler_send_queue_opts) ,
108
- send_handler,
109
- )
110
- . await ?,
111
- ) ;
126
+ let external_bundler_send_queue = Queue :: builder ( )
127
+ . name ( external_bundler_send_queue_name)
128
+ . options ( external_bundler_send_queue_opts)
129
+ . handler ( send_handler)
130
+ . redis_client ( redis_client. clone ( ) )
131
+ . build ( )
132
+ . await ?
133
+ . arc ( ) ;
112
134
113
135
Ok ( Self {
114
136
webhook_queue,
115
- erc4337_send_queue ,
116
- erc4337_confirm_queue ,
137
+ external_bundler_send_queue ,
138
+ userop_confirm_queue ,
117
139
} )
118
140
}
119
141
120
142
/// Start all workers
121
- pub async fn start_workers ( & self , queue_config : & QueueConfig ) -> Result < ( ) , EngineError > {
143
+ pub fn start_workers ( & self , queue_config : & QueueConfig ) -> ShutdownHandle {
122
144
tracing:: info!( "Starting queue workers..." ) ;
123
145
124
146
// Start webhook workers
125
147
tracing:: info!( "Starting webhook worker" ) ;
126
- if let Err ( e) = self . webhook_queue . clone ( ) . work ( ) . await {
127
- tracing:: error!( "Webhook worker failed: {}" , e) ;
128
- }
148
+ let webhook_worker = self . webhook_queue . work ( ) ;
129
149
130
150
// Start ERC-4337 send workers
131
151
tracing:: info!( "Starting external bundler send worker" ) ;
132
- if let Err ( e) = self . erc4337_send_queue . clone ( ) . work ( ) . await {
133
- tracing:: error!( "Webhook worker failed: {}" , e) ;
134
- }
152
+ let external_bundler_send_worker = self . external_bundler_send_queue . work ( ) ;
135
153
136
154
// Start ERC-4337 confirmation workers
137
155
tracing:: info!( "Starting external bundler confirmation worker" ) ;
138
- if let Err ( e) = self . erc4337_confirm_queue . clone ( ) . work ( ) . await {
139
- tracing:: error!( "Webhook worker failed: {}" , e) ;
140
- }
156
+ let userop_confirm_worker = self . userop_confirm_queue . work ( ) ;
141
157
142
158
tracing:: info!(
143
159
"Started {} webhook workers, {} send workers, {} confirm workers" ,
144
160
queue_config. webhook_workers,
145
- queue_config. erc4337_send_workers ,
146
- queue_config. erc4337_confirm_workers
161
+ queue_config. external_bundler_send_workers ,
162
+ queue_config. userop_confirm_workers
147
163
) ;
148
164
149
- Ok ( ( ) )
165
+ ShutdownHandle :: with_worker ( webhook_worker)
166
+ . and_worker ( external_bundler_send_worker)
167
+ . and_worker ( userop_confirm_worker)
150
168
}
151
169
152
170
/// Get queue statistics for monitoring
@@ -162,34 +180,49 @@ impl QueueManager {
162
180
} ;
163
181
164
182
let send_stats = QueueStatistics {
165
- pending : self . erc4337_send_queue . count ( JobStatus :: Pending ) . await ?,
166
- active : self . erc4337_send_queue . count ( JobStatus :: Active ) . await ?,
167
- delayed : self . erc4337_send_queue . count ( JobStatus :: Delayed ) . await ?,
168
- success : self . erc4337_send_queue . count ( JobStatus :: Success ) . await ?,
169
- failed : self . erc4337_send_queue . count ( JobStatus :: Failed ) . await ?,
183
+ pending : self
184
+ . external_bundler_send_queue
185
+ . count ( JobStatus :: Pending )
186
+ . await ?,
187
+ active : self
188
+ . external_bundler_send_queue
189
+ . count ( JobStatus :: Active )
190
+ . await ?,
191
+ delayed : self
192
+ . external_bundler_send_queue
193
+ . count ( JobStatus :: Delayed )
194
+ . await ?,
195
+ success : self
196
+ . external_bundler_send_queue
197
+ . count ( JobStatus :: Success )
198
+ . await ?,
199
+ failed : self
200
+ . external_bundler_send_queue
201
+ . count ( JobStatus :: Failed )
202
+ . await ?,
170
203
} ;
171
204
172
205
let confirm_stats = QueueStatistics {
173
- pending : self . erc4337_confirm_queue . count ( JobStatus :: Pending ) . await ?,
174
- active : self . erc4337_confirm_queue . count ( JobStatus :: Active ) . await ?,
175
- delayed : self . erc4337_confirm_queue . count ( JobStatus :: Delayed ) . await ?,
176
- success : self . erc4337_confirm_queue . count ( JobStatus :: Success ) . await ?,
177
- failed : self . erc4337_confirm_queue . count ( JobStatus :: Failed ) . await ?,
206
+ pending : self . userop_confirm_queue . count ( JobStatus :: Pending ) . await ?,
207
+ active : self . userop_confirm_queue . count ( JobStatus :: Active ) . await ?,
208
+ delayed : self . userop_confirm_queue . count ( JobStatus :: Delayed ) . await ?,
209
+ success : self . userop_confirm_queue . count ( JobStatus :: Success ) . await ?,
210
+ failed : self . userop_confirm_queue . count ( JobStatus :: Failed ) . await ?,
178
211
} ;
179
212
180
213
Ok ( QueueStats {
181
214
webhook : webhook_stats,
182
- erc4337_send : send_stats,
183
- erc4337_confirm : confirm_stats,
215
+ external_bundler_send : send_stats,
216
+ userop_confirm : confirm_stats,
184
217
} )
185
218
}
186
219
}
187
220
188
221
#[ derive( Debug , serde:: Serialize ) ]
189
222
pub struct QueueStats {
190
223
pub webhook : QueueStatistics ,
191
- pub erc4337_send : QueueStatistics ,
192
- pub erc4337_confirm : QueueStatistics ,
224
+ pub external_bundler_send : QueueStatistics ,
225
+ pub userop_confirm : QueueStatistics ,
193
226
}
194
227
195
228
#[ derive( Debug , serde:: Serialize ) ]
0 commit comments