pub struct SectionSetCollector { /* private fields */ }Expand description
Generic collector for long-form section_number/last_section_number
sequences.
The constructor SectionSetCollector::new uses the default cap
DEFAULT_MAX_PARTIAL_KEYS; the cap is configurable via
with_max_partial_keys.
§Capacity: LRU eviction, not a permanent wall (issue #1002)
The cap bounds partial’s total entry count, including completed
sets — a completed set is retained (so a repeat/duplicate section for it
is recognized and does not re-emit) but a real network can complete far
more distinct (table_id, extension_id, current_next_indicator) keys
over time than the cap allows to stay in-progress simultaneously (EIT
other alone can span 150+ services). Capping only entry creation and
never evicting anything would eventually wall off every new key behind a
permanently-full map of old, no-longer-interesting completed entries,
with the caller seeing only silent Ok(None) and no way to tell “still
collecting” apart from “capacity exhausted, this key will never
complete”. Instead, when a new key arrives at capacity, the
least-recently-touched entry (by push, not by construction) is
evicted to admit it — old, no-longer-fed keys naturally age out in
favor of active ones. evicted_for_capacity
counts evictions, so a caller can detect this churn instead of it being
invisible.
Implementations§
Source§impl SectionSetCollector
impl SectionSetCollector
Sourcepub fn new() -> Self
pub fn new() -> Self
Create an empty collector with the default cap
(DEFAULT_MAX_PARTIAL_KEYS).
Sourcepub fn with_max_partial_keys(self, max_partial_keys: usize) -> Self
pub fn with_max_partial_keys(self, max_partial_keys: usize) -> Self
Replace the partial-key cap (default DEFAULT_MAX_PARTIAL_KEYS).
When a new key arrives at capacity, the least-recently-touched
existing key is evicted to admit it (see the type-level docs).
Sourcepub fn evicted_for_capacity(&self) -> u64
pub fn evicted_for_capacity(&self) -> u64
Number of keys evicted so far to admit a new key at capacity. A
nonzero, growing count means the cap is genuinely too small for the
stream’s distinct-key churn — raise it via
with_max_partial_keys.
Sourcepub fn push_section(
&mut self,
bytes: impl AsRef<[u8]>,
) -> CollectResult<Option<CompleteSectionSet>>
pub fn push_section( &mut self, bytes: impl AsRef<[u8]>, ) -> CollectResult<Option<CompleteSectionSet>>
Push one complete section. Returns Some only when the logical section
set has become complete for the first time at this version.
§Errors
Returns a CollectError if the bytes are not a valid long-form
section or if the section set becomes internally inconsistent. Treat the
error as applying to this section only unless your application wants
strict stream-fail behavior.
Sourcepub fn push_section_with_pid(
&mut self,
pid: Option<Pid>,
bytes: impl AsRef<[u8]>,
) -> CollectResult<Option<CompleteSectionSet>>
pub fn push_section_with_pid( &mut self, pid: Option<Pid>, bytes: impl AsRef<[u8]>, ) -> CollectResult<Option<CompleteSectionSet>>
Push one complete section with PID context.
The PID is folded into the section-set key so tables with identical table id/extension on different PIDs do not collide.