use axum::{
body::Body,
http::{Request, StatusCode},
};
use hyper::HeaderMap;
use serde::{Deserialize, Serialize};
use tokio::sync::oneshot::Sender;
pub(crate) const AWS_XRAY_TRACE_HEADER: &str = "x-amzn-trace-id";
pub type LambdaResponse = Request<Body>;
#[allow(clippy::large_enum_variant)]
#[derive(Debug)]
pub enum Action {
Invoke(InvokeRequest),
Init,
}
#[derive(Debug)]
pub struct InvokeRequest {
pub function_name: String,
pub req: Request<Body>,
pub resp_tx: Sender<LambdaResponse>,
}
#[derive(Debug, Deserialize)]
pub struct StreamingPrelude {
#[serde(deserialize_with = "http_serde::status_code::deserialize")]
#[serde(rename = "statusCode")]
pub status_code: StatusCode,
#[serde(deserialize_with = "http_serde::header_map::deserialize", default)]
pub headers: HeaderMap,
pub cookies: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct EventsRequest {
pub events: Vec<String>,
}
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Tracing {
pub r#type: String,
pub value: String,
}
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct InvokeEvent {
pub deadline_ms: u64,
pub request_id: String,
pub invoked_function_arn: String,
pub tracing: Tracing,
}
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ShutdownEvent {
pub shutdown_reason: String,
pub deadline_ms: u64,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "UPPERCASE", tag = "eventType")]
pub enum NextEvent {
Invoke(InvokeEvent),
Shutdown(ShutdownEvent),
}
impl NextEvent {
pub fn invoke(id: &str, event: &InvokeRequest) -> NextEvent {
let tracing_id = event
.req
.headers()
.get(AWS_XRAY_TRACE_HEADER)
.and_then(|h| h.to_str().ok())
.unwrap_or_default();
let e = InvokeEvent {
request_id: id.to_string(),
invoked_function_arn: event.function_name.clone(),
tracing: Tracing {
r#type: AWS_XRAY_TRACE_HEADER.to_string(),
value: tracing_id.to_string(),
},
..Default::default()
};
NextEvent::Invoke(e)
}
pub fn shutdown(reason: &str) -> NextEvent {
NextEvent::Shutdown(ShutdownEvent {
shutdown_reason: reason.into(),
..Default::default()
})
}
pub fn type_queue(&self) -> &str {
match self {
Self::Invoke(_) => "INVOKE",
Self::Shutdown(_) => "SHUTDOWN",
}
}
}
#[allow(dead_code)]
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct LogBuffering {
pub timeout_ms: usize,
pub max_bytes: usize,
pub max_items: usize,
}
#[allow(dead_code)]
#[derive(Clone, Debug, Deserialize)]
pub(crate) struct EventsDestination {
pub protocol: String,
#[serde(rename = "URI")]
pub uri: String,
}
#[allow(dead_code)]
#[derive(Clone, Debug, Deserialize)]
pub(crate) struct SubcribeEvent {
#[serde(rename = "schemaVersion")]
pub schema_version: String,
pub types: Vec<String>,
pub buffering: Option<LogBuffering>,
pub destination: EventsDestination,
}