cratestack_axum/envelope_layer/
layer.rs1use std::fmt;
4use std::sync::Arc;
5
6use cratestack_core::AcceptedContracts;
7use tower::Layer;
8
9use super::builder::{EnvelopeLayerBuilder, Transport};
10use super::mode::EnvelopePolicy;
11use super::principal::{PrincipalMapper, ThumbprintPrincipal};
12use super::resolver::BindingResolver;
13use super::seal_policy::{AcceptNamesEnvelope, ResponseSealPolicy};
14use super::server_envelope::ServerEnvelope;
15use super::service::EnvelopeService;
16use super::{DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CONTRACT_TRIALS, PAYLOAD_MEDIA_TYPE};
17
18pub(super) struct Config {
19 pub(super) envelope: Arc<dyn ServerEnvelope>,
20 pub(super) policy: Box<dyn EnvelopePolicy>,
21 pub(super) resolver: Box<dyn BindingResolver>,
22 pub(super) principal: Box<dyn PrincipalMapper>,
23 pub(super) seal_policy: Box<dyn ResponseSealPolicy>,
24 pub(super) audience: String,
25 pub(super) contracts: AcceptedContracts,
27 pub(super) max_contract_trials: usize,
28 pub(super) max_body_bytes: usize,
29 pub(super) mount_prefix: String,
31 pub(super) allow_unresolved: Vec<String>,
34 pub(super) payload_request: Vec<String>,
36 pub(super) payload_response: Vec<String>,
37}
38
39#[derive(Clone)]
44pub struct EnvelopeLayer {
45 pub(super) config: Arc<Config>,
46}
47
48impl EnvelopeLayer {
49 pub fn builder(
70 envelope: impl ServerEnvelope,
71 audience: impl Into<String>,
72 contracts: AcceptedContracts,
73 ) -> EnvelopeLayerBuilder {
74 EnvelopeLayerBuilder {
75 envelope: Arc::new(envelope),
76 audience: audience.into(),
77 contracts,
78 max_contract_trials: DEFAULT_MAX_CONTRACT_TRIALS,
79 policy: None,
80 transport: Transport::None,
81 transport_prefix: None,
82 mount_prefix: None,
83 unresolved_mode: None,
84 allow_unresolved: Vec::new(),
85 principal: Box::new(ThumbprintPrincipal::new()),
86 seal_policy: Box::new(AcceptNamesEnvelope),
87 max_body_bytes: DEFAULT_MAX_BODY_BYTES,
88 payload_request: vec![PAYLOAD_MEDIA_TYPE.to_owned()],
89 payload_response: vec![PAYLOAD_MEDIA_TYPE.to_owned()],
90 }
91 }
92}
93
94impl<S> Layer<S> for EnvelopeLayer {
95 type Service = EnvelopeService<S>;
96
97 fn layer(&self, inner: S) -> Self::Service {
98 EnvelopeService {
99 inner,
100 config: self.config.clone(),
101 }
102 }
103}
104
105impl fmt::Debug for EnvelopeLayer {
106 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
107 f.debug_struct("EnvelopeLayer")
108 .field("audience", &self.config.audience)
109 .field("media_type", &self.config.envelope.media_type())
110 .field("mount_prefix", &self.config.mount_prefix)
111 .field("allow_unresolved", &self.config.allow_unresolved)
112 .field("max_body_bytes", &self.config.max_body_bytes)
113 .finish_non_exhaustive()
114 }
115}