use crate::framework::{
DEFAULT_HIGH_WATER_PCT, DEFAULT_K_BEFORE_SILENT, DEFAULT_MIN_NOTICE_INTERVAL_NS,
};
use crate::ids::PeerId;
use crate::envelope::EnvelopeCaps;
pub const DEFAULT_CYCLE_OP_BUDGET: Option<usize> = Some(1000);
pub const DEFAULT_MAX_PENDING_ASYNC: Option<usize> = Some(10_000);
pub const DEFAULT_MAX_OUTBOUND_QUEUE: Option<usize> = Some(10_000);
pub const DEFAULT_BUS_CAPACITY: usize = 1024;
pub const DEFAULT_PER_HOP_BUDGET_NS: u64 = 100_000_000;
pub const DEFAULT_INGRESS_BYTE_BUDGET: usize = 256 * 1024 * 1024;
pub const DEFAULT_MAX_APP_EVENT_BYTES: usize = 1024 * 1024;
pub const DEFAULT_MAX_INVOKE_INPUTS: usize = 100;
pub const DEFAULT_MAX_INVOKE_BYTES: usize = 10 * 1024 * 1024;
pub const DEFAULT_MAX_COMPLETION_RESULT_BYTES: usize = 4 * 1024 * 1024;
pub const EDGE_INGRESS_BYTE_BUDGET: usize = 8 * 1024 * 1024;
pub const EDGE_MAX_APP_EVENT_BYTES: usize = 64 * 1024;
pub const EDGE_MAX_INVOKE_INPUTS: usize = 16;
pub const EDGE_MAX_INVOKE_BYTES: usize = 256 * 1024;
pub const EDGE_MAX_COMPLETION_RESULT_BYTES: usize = 64 * 1024;
#[derive(Clone, Debug)]
pub struct NodeConfig {
pub peer_id: PeerId,
pub cycle_op_budget: Option<usize>,
pub max_pending_async: Option<usize>,
pub max_outbound_queue: Option<usize>,
pub bus_capacity: usize,
pub per_hop_budget_ns: u64,
pub envelope_caps: EnvelopeCaps,
pub backpressure_high_water_pct: u8,
pub backpressure_k_before_silent: u32,
pub backpressure_min_notice_interval_ns: u64,
pub ingress_byte_budget: usize,
pub max_app_event_bytes: usize,
pub max_invoke_inputs: usize,
pub max_invoke_bytes: usize,
pub max_completion_result_bytes: usize,
}
impl NodeConfig {
pub fn new(peer_id: PeerId) -> Self {
Self {
peer_id,
cycle_op_budget: DEFAULT_CYCLE_OP_BUDGET,
max_pending_async: DEFAULT_MAX_PENDING_ASYNC,
max_outbound_queue: DEFAULT_MAX_OUTBOUND_QUEUE,
bus_capacity: DEFAULT_BUS_CAPACITY,
per_hop_budget_ns: DEFAULT_PER_HOP_BUDGET_NS,
envelope_caps: EnvelopeCaps::default(),
backpressure_high_water_pct: DEFAULT_HIGH_WATER_PCT,
backpressure_k_before_silent: DEFAULT_K_BEFORE_SILENT,
backpressure_min_notice_interval_ns: DEFAULT_MIN_NOTICE_INTERVAL_NS,
ingress_byte_budget: DEFAULT_INGRESS_BYTE_BUDGET,
max_app_event_bytes: DEFAULT_MAX_APP_EVENT_BYTES,
max_invoke_inputs: DEFAULT_MAX_INVOKE_INPUTS,
max_invoke_bytes: DEFAULT_MAX_INVOKE_BYTES,
max_completion_result_bytes: DEFAULT_MAX_COMPLETION_RESULT_BYTES,
}
}
pub fn new_edge(peer_id: PeerId) -> Self {
Self {
envelope_caps: EnvelopeCaps::edge(),
ingress_byte_budget: EDGE_INGRESS_BYTE_BUDGET,
max_app_event_bytes: EDGE_MAX_APP_EVENT_BYTES,
max_invoke_inputs: EDGE_MAX_INVOKE_INPUTS,
max_invoke_bytes: EDGE_MAX_INVOKE_BYTES,
max_completion_result_bytes: EDGE_MAX_COMPLETION_RESULT_BYTES,
..Self::new(peer_id)
}
}
pub fn with_envelope_caps(mut self, caps: EnvelopeCaps) -> Self {
self.envelope_caps = caps;
self
}
pub fn with_cycle_op_budget(mut self, budget: usize) -> Self {
self.cycle_op_budget = Some(budget);
self
}
pub fn without_cycle_op_budget(mut self) -> Self {
self.cycle_op_budget = None;
self
}
pub fn with_max_pending_async(mut self, cap: usize) -> Self {
self.max_pending_async = Some(cap);
self
}
pub fn without_max_pending_async(mut self) -> Self {
self.max_pending_async = None;
self
}
pub fn with_max_outbound_queue(mut self, cap: usize) -> Self {
self.max_outbound_queue = Some(cap);
self
}
pub fn without_max_outbound_queue(mut self) -> Self {
self.max_outbound_queue = None;
self
}
pub fn with_bus_capacity(mut self, capacity: usize) -> Self {
self.bus_capacity = capacity;
self
}
pub fn with_per_hop_budget_ns(mut self, budget_ns: u64) -> Self {
self.per_hop_budget_ns = budget_ns;
self
}
pub fn with_backpressure_high_water_pct(mut self, pct: u8) -> Self {
self.backpressure_high_water_pct = pct;
self
}
pub fn with_backpressure_k_before_silent(mut self, k: u32) -> Self {
self.backpressure_k_before_silent = k;
self
}
pub fn with_backpressure_min_notice_interval_ns(mut self, interval_ns: u64) -> Self {
self.backpressure_min_notice_interval_ns = interval_ns;
self
}
pub fn with_ingress_byte_budget(mut self, bytes: usize) -> Self {
self.ingress_byte_budget = bytes;
self
}
pub fn with_max_app_event_bytes(mut self, bytes: usize) -> Self {
self.max_app_event_bytes = bytes;
self
}
pub fn with_max_invoke_inputs(mut self, count: usize) -> Self {
self.max_invoke_inputs = count;
self
}
pub fn with_max_invoke_bytes(mut self, bytes: usize) -> Self {
self.max_invoke_bytes = bytes;
self
}
pub fn with_max_completion_result_bytes(mut self, bytes: usize) -> Self {
self.max_completion_result_bytes = bytes;
self
}
}