@@ -6,7 +6,7 @@ use hyper::header::HeaderName;
6
6
use rivet_guard_core:: proxy_service:: { RouteConfig , RouteTarget , RoutingOutput , RoutingTimeout } ;
7
7
use udb_util:: { SERIALIZABLE , TxnExt } ;
8
8
9
- use crate :: errors;
9
+ use crate :: { errors, shared_state :: SharedState } ;
10
10
11
11
const ACTOR_READY_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
12
12
pub const X_RIVET_ACTOR : HeaderName = HeaderName :: from_static ( "x-rivet-actor" ) ;
@@ -16,6 +16,7 @@ pub const X_RIVET_PORT: HeaderName = HeaderName::from_static("x-rivet-port");
16
16
#[ tracing:: instrument( skip_all) ]
17
17
pub async fn route_request (
18
18
ctx : & StandaloneCtx ,
19
+ shared_state : & SharedState ,
19
20
target : & str ,
20
21
_host : & str ,
21
22
path : & str ,
@@ -73,7 +74,7 @@ pub async fn route_request(
73
74
let port_name = port_name. to_str ( ) ?;
74
75
75
76
// Lookup actor
76
- find_actor ( ctx, actor_id, port_name, path) . await
77
+ find_actor ( ctx, shared_state , actor_id, port_name, path) . await
77
78
}
78
79
79
80
struct FoundActor {
@@ -86,6 +87,7 @@ struct FoundActor {
86
87
#[ tracing:: instrument( skip_all, fields( %actor_id, %port_name, %path) ) ]
87
88
async fn find_actor (
88
89
ctx : & StandaloneCtx ,
90
+ shared_state : & SharedState ,
89
91
actor_id : Id ,
90
92
port_name : & str ,
91
93
path : & str ,
@@ -158,10 +160,10 @@ async fn find_actor(
158
160
actor_ids : vec ! [ actor_id] ,
159
161
} ) ;
160
162
let res = tokio:: time:: timeout ( Duration :: from_secs ( 5 ) , get_runner_fut) . await ??;
161
- let runner_info = res. actors . into_iter ( ) . next ( ) . filter ( |x| x. is_connectable ) ;
163
+ let actor = res. actors . into_iter ( ) . next ( ) . filter ( |x| x. is_connectable ) ;
162
164
163
- let runner_id = if let Some ( runner_info ) = runner_info {
164
- runner_info . runner_id
165
+ let runner_id = if let Some ( actor ) = actor {
166
+ actor . runner_id
165
167
} else {
166
168
tracing:: info!( ?actor_id, "waiting for actor to become ready" ) ;
167
169
@@ -185,11 +187,23 @@ async fn find_actor(
185
187
186
188
tracing:: debug!( ?actor_id, ?runner_id, "actor ready" ) ;
187
189
190
+ // Get runner key from runner_id
191
+ let runner_key = ctx
192
+ . udb ( ) ?
193
+ . run ( |tx, _mc| async move {
194
+ let txs = tx. subspace ( pegboard:: keys:: subspace ( ) ) ;
195
+ let key_key = pegboard:: keys:: runner:: KeyKey :: new ( runner_id) ;
196
+ txs. read_opt ( & key_key, SERIALIZABLE ) . await
197
+ } )
198
+ . await ?
199
+ . context ( "runner key not found" ) ?;
200
+
188
201
// Return pegboard-gateway instance
189
202
let gateway = pegboard_gateway:: PegboardGateway :: new (
190
203
ctx. clone ( ) ,
204
+ shared_state. pegboard_gateway . clone ( ) ,
191
205
actor_id,
192
- runner_id ,
206
+ runner_key ,
193
207
port_name. to_string ( ) ,
194
208
) ;
195
209
Ok ( Some ( RoutingOutput :: CustomServe ( std:: sync:: Arc :: new (
0 commit comments