@@ -6,6 +6,7 @@ use hyper::service::service_fn;
6
6
7
7
use hyper_util:: rt:: tokio:: TokioIo ;
8
8
use lambda_runtime_api_client:: Client ;
9
+ use serde:: Deserialize ;
9
10
use std:: {
10
11
convert:: Infallible , fmt, future:: ready, future:: Future , net:: SocketAddr , path:: PathBuf , pin:: Pin , sync:: Arc ,
11
12
} ;
@@ -230,8 +231,7 @@ where
230
231
pub async fn register ( self ) -> Result < RegisteredExtension < E > , Error > {
231
232
let client = & Client :: builder ( ) . build ( ) ?;
232
233
233
- let extension_id = register ( client, self . extension_name , self . events ) . await ?;
234
- let extension_id = extension_id. to_str ( ) ?;
234
+ let register_res = register ( client, self . extension_name , self . events ) . await ?;
235
235
236
236
// Logs API subscriptions must be requested during the Lambda init phase (see
237
237
// https://docs.aws.amazon.com/lambda/latest/dg/runtimes-logs-api.html#runtimes-logs-api-subscribing).
@@ -266,7 +266,7 @@ where
266
266
// Call Logs API to start receiving events
267
267
let req = requests:: subscribe_request (
268
268
Api :: LogsApi ,
269
- extension_id,
269
+ & register_res . extension_id ,
270
270
self . log_types ,
271
271
self . log_buffering ,
272
272
self . log_port_number ,
@@ -312,7 +312,7 @@ where
312
312
// Call Telemetry API to start receiving events
313
313
let req = requests:: subscribe_request (
314
314
Api :: TelemetryApi ,
315
- extension_id,
315
+ & register_res . extension_id ,
316
316
self . telemetry_types ,
317
317
self . telemetry_buffering ,
318
318
self . telemetry_port_number ,
@@ -326,7 +326,11 @@ where
326
326
}
327
327
328
328
Ok ( RegisteredExtension {
329
- extension_id : extension_id. to_string ( ) ,
329
+ extension_id : register_res. extension_id ,
330
+ function_name : register_res. function_name ,
331
+ function_version : register_res. function_version ,
332
+ handler : register_res. handler ,
333
+ account_id : register_res. account_id ,
330
334
events_processor : self . events_processor ,
331
335
} )
332
336
}
@@ -339,7 +343,17 @@ where
339
343
340
344
/// An extension registered by calling [`Extension::register`].
341
345
pub struct RegisteredExtension < E > {
342
- extension_id : String ,
346
+ /// The ID of the registered extension. This ID is unique per extension and remains constant
347
+ pub extension_id : String ,
348
+ /// The ID of the account the extension was registered to.
349
+ /// This will be `None` if the register request doesn't send the Lambda-Extension-Accept-Feature header
350
+ pub account_id : Option < String > ,
351
+ /// The name of the Lambda function that the extension is registered with
352
+ pub function_name : String ,
353
+ /// The version of the Lambda function that the extension is registered with
354
+ pub function_version : String ,
355
+ /// The Lambda function handler that AWS Lambda invokes
356
+ pub handler : String ,
343
357
events_processor : E ,
344
358
}
345
359
@@ -468,12 +482,30 @@ where
468
482
}
469
483
}
470
484
485
+ #[ derive( Debug , Deserialize ) ]
486
+ #[ serde( rename_all = "camelCase" ) ]
487
+ struct RegisterResponseBody {
488
+ function_name : String ,
489
+ function_version : String ,
490
+ handler : String ,
491
+ account_id : Option < String > ,
492
+ }
493
+
494
+ #[ derive( Debug ) ]
495
+ struct RegisterResponse {
496
+ extension_id : String ,
497
+ function_name : String ,
498
+ function_version : String ,
499
+ handler : String ,
500
+ account_id : Option < String > ,
501
+ }
502
+
471
503
/// Initialize and register the extension in the Extensions API
472
504
async fn register < ' a > (
473
505
client : & ' a Client ,
474
506
extension_name : Option < & ' a str > ,
475
507
events : Option < & ' a [ & ' a str ] > ,
476
- ) -> Result < http :: HeaderValue , Error > {
508
+ ) -> Result < RegisterResponse , Error > {
477
509
let name = match extension_name {
478
510
Some ( name) => name. into ( ) ,
479
511
None => {
@@ -501,5 +533,17 @@ async fn register<'a>(
501
533
. get ( requests:: EXTENSION_ID_HEADER )
502
534
. ok_or_else ( || ExtensionError :: boxed ( "missing extension id header" ) )
503
535
. map_err ( |e| ExtensionError :: boxed ( e. to_string ( ) ) ) ?;
504
- Ok ( header. clone ( ) )
536
+ let extension_id = header. to_str ( ) ?. to_string ( ) ;
537
+
538
+ let ( _, body) = res. into_parts ( ) ;
539
+ let body = body. collect ( ) . await ?. to_bytes ( ) ;
540
+ let response: RegisterResponseBody = serde_json:: from_slice ( & body) ?;
541
+
542
+ Ok ( RegisterResponse {
543
+ extension_id,
544
+ function_name : response. function_name ,
545
+ function_version : response. function_version ,
546
+ handler : response. handler ,
547
+ account_id : response. account_id ,
548
+ } )
505
549
}
0 commit comments