cardinal_plugins/
request_context.rs

1use crate::runner::PluginRunner;
2use crate::REQ_UTC_TIME;
3use cardinal_base::context::CardinalContext;
4use cardinal_base::destinations::container::DestinationWrapper;
5use cardinal_wasm_plugins::{ExecutionContext, SharedExecutionContext};
6use chrono::Utc;
7use parking_lot::RwLock;
8use std::collections::HashMap;
9use std::sync::Arc;
10
11pub struct RequestContext {
12    pub cardinal_context: Arc<CardinalContext>,
13    pub backend: Arc<DestinationWrapper>,
14    pub plugin_runner: Arc<PluginRunner>,
15    pub response_headers: Option<HashMap<String, String>>,
16    pub shared_ctx: SharedExecutionContext,
17}
18
19impl RequestContext {
20    pub fn new(
21        context: Arc<CardinalContext>,
22        backend: Arc<DestinationWrapper>,
23        execution_context: ExecutionContext,
24    ) -> Self {
25        let runner = PluginRunner::new(context.clone());
26        Self {
27            cardinal_context: context,
28            backend,
29            plugin_runner: Arc::new(runner),
30            response_headers: None,
31            shared_ctx: Arc::new(RwLock::new(execution_context)),
32        }
33    }
34
35    pub fn persistent_vars(&self) -> Arc<RwLock<HashMap<String, String>>> {
36        self.shared_ctx.read().persistent_vars().clone()
37    }
38
39    pub fn shared_context(&self) -> SharedExecutionContext {
40        self.shared_ctx.clone()
41    }
42}
43
44pub struct RequestContextBase {
45    pub resolved_request: Option<RequestContext>,
46    pub metadata: HashMap<String, String>,
47}
48
49impl Default for RequestContextBase {
50    fn default() -> Self {
51        Self::new()
52    }
53}
54
55impl RequestContextBase {
56    pub fn new() -> Self {
57        Self {
58            resolved_request: None,
59            metadata: Self::init_metadata(),
60        }
61    }
62
63    pub fn set(&mut self, key: &str, value: &str) {
64        self.metadata.insert(key.to_string(), value.to_string());
65    }
66
67    pub fn set_resolved_request(&mut self, resolved_request: RequestContext) {
68        self.resolved_request = Some(resolved_request);
69    }
70
71    pub fn req_unsafe(&self) -> &RequestContext {
72        self.resolved_request.as_ref().unwrap()
73    }
74
75    pub fn req_unsafe_mut(&mut self) -> &mut RequestContext {
76        self.resolved_request.as_mut().unwrap()
77    }
78
79    fn init_metadata() -> HashMap<String, String> {
80        HashMap::from([(REQ_UTC_TIME.to_string(), Utc::now().to_rfc3339())])
81    }
82}