@@ -10,14 +10,16 @@ use mas_data_model::SiteConfig;
10
10
use mas_email:: Mailer ;
11
11
use mas_matrix:: HomeserverConnection ;
12
12
use mas_router:: UrlBuilder ;
13
- use mas_storage:: { BoxClock , BoxRepository , RepositoryError , RepositoryFactory , SystemClock } ;
13
+ use mas_storage:: { BoxRepository , Clock , RepositoryError , RepositoryFactory } ;
14
14
use mas_storage_pg:: PgRepositoryFactory ;
15
15
use new_queue:: QueueRunnerError ;
16
16
use opentelemetry:: metrics:: Meter ;
17
17
use rand:: SeedableRng ;
18
18
use sqlx:: { Pool , Postgres } ;
19
19
use tokio_util:: { sync:: CancellationToken , task:: TaskTracker } ;
20
20
21
+ pub use crate :: new_queue:: QueueWorker ;
22
+
21
23
mod database;
22
24
mod email;
23
25
mod matrix;
@@ -39,7 +41,7 @@ static METER: LazyLock<Meter> = LazyLock::new(|| {
39
41
struct State {
40
42
repository_factory : PgRepositoryFactory ,
41
43
mailer : Mailer ,
42
- clock : SystemClock ,
44
+ clock : Arc < dyn Clock > ,
43
45
homeserver : Arc < dyn HomeserverConnection > ,
44
46
url_builder : UrlBuilder ,
45
47
site_config : SiteConfig ,
@@ -48,7 +50,7 @@ struct State {
48
50
impl State {
49
51
pub fn new (
50
52
repository_factory : PgRepositoryFactory ,
51
- clock : SystemClock ,
53
+ clock : impl Clock + ' static ,
52
54
mailer : Mailer ,
53
55
homeserver : impl HomeserverConnection + ' static ,
54
56
url_builder : UrlBuilder ,
@@ -57,7 +59,7 @@ impl State {
57
59
Self {
58
60
repository_factory,
59
61
mailer,
60
- clock,
62
+ clock : Arc :: new ( clock ) ,
61
63
homeserver : Arc :: new ( homeserver) ,
62
64
url_builder,
63
65
site_config,
@@ -68,8 +70,8 @@ impl State {
68
70
self . repository_factory . pool ( )
69
71
}
70
72
71
- pub fn clock ( & self ) -> BoxClock {
72
- Box :: new ( self . clock . clone ( ) )
73
+ pub fn clock ( & self ) -> & dyn Clock {
74
+ & self . clock
73
75
}
74
76
75
77
pub fn mailer ( & self ) -> & Mailer {
@@ -99,29 +101,31 @@ impl State {
99
101
}
100
102
}
101
103
102
- /// Initialise the workers.
104
+ /// Initialise the worker, without running it.
105
+ ///
106
+ /// This is mostly useful for tests.
103
107
///
104
108
/// # Errors
105
109
///
106
110
/// This function can fail if the database connection fails.
107
111
pub async fn init (
108
112
repository_factory : PgRepositoryFactory ,
113
+ clock : impl Clock + ' static ,
109
114
mailer : & Mailer ,
110
115
homeserver : impl HomeserverConnection + ' static ,
111
116
url_builder : UrlBuilder ,
112
117
site_config : & SiteConfig ,
113
118
cancellation_token : CancellationToken ,
114
- task_tracker : & TaskTracker ,
115
- ) -> Result < ( ) , QueueRunnerError > {
119
+ ) -> Result < QueueWorker , QueueRunnerError > {
116
120
let state = State :: new (
117
121
repository_factory,
118
- SystemClock :: default ( ) ,
122
+ clock ,
119
123
mailer. clone ( ) ,
120
124
homeserver,
121
125
url_builder,
122
126
site_config. clone ( ) ,
123
127
) ;
124
- let mut worker = self :: new_queue :: QueueWorker :: new ( state, cancellation_token) . await ?;
128
+ let mut worker = QueueWorker :: new ( state, cancellation_token) . await ?;
125
129
126
130
worker
127
131
. register_handler :: < mas_storage:: queue:: CleanupExpiredTokensJob > ( )
@@ -157,6 +161,36 @@ pub async fn init(
157
161
mas_storage:: queue:: PruneStalePolicyDataJob ,
158
162
) ;
159
163
164
+ Ok ( worker)
165
+ }
166
+
167
+ /// Initialise the worker and run it.
168
+ ///
169
+ /// # Errors
170
+ ///
171
+ /// This function can fail if the database connection fails.
172
+ #[ expect( clippy:: too_many_arguments, reason = "this is fine" ) ]
173
+ pub async fn init_and_run (
174
+ repository_factory : PgRepositoryFactory ,
175
+ clock : impl Clock + ' static ,
176
+ mailer : & Mailer ,
177
+ homeserver : impl HomeserverConnection + ' static ,
178
+ url_builder : UrlBuilder ,
179
+ site_config : & SiteConfig ,
180
+ cancellation_token : CancellationToken ,
181
+ task_tracker : & TaskTracker ,
182
+ ) -> Result < ( ) , QueueRunnerError > {
183
+ let worker = init (
184
+ repository_factory,
185
+ clock,
186
+ mailer,
187
+ homeserver,
188
+ url_builder,
189
+ site_config,
190
+ cancellation_token,
191
+ )
192
+ . await ?;
193
+
160
194
task_tracker. spawn ( worker. run ( ) ) ;
161
195
162
196
Ok ( ( ) )
0 commit comments