pub struct MesofactRevalidateReceiver {
pub routes: Vec<String>,
pub publish_config: String,
pub mirror_key_env: Option<String>,
pub env: BTreeMap<String, String>,
pub feeds: Vec<AlmanacFeed>,
pub feed_runtime: Option<String>,
pub feed_interval_secs: u64,
pub feed_project_prefix: Option<String>,
}Expand description
Revalidate receiver config (R330-F12) — tells kamaji to fork a second
mesofact serve --revalidate process alongside the static bundle server.
The receiver is the almanac push endpoint: a lightweight resident axum
server mounting POST /dawn (plus the legacy /revalidate alias) that
boots V8 on each poke, re-renders the invalidated route, publishes to
R2/CDN, then drops the isolate.
Fields§
§routes: Vec<String>Routes the receiver accepts pokes for (allowlist). Empty vec → all routes in the workload’s manifest are revalidatable.
publish_config: StringPath to mesofact.config.toml carrying the [publish] block
(bucket / zone / env-named credentials). Relative to the workload
directory. Default: "mesofact.config.toml".
mirror_key_env: Option<String>Env var name holding the bearer secret for this tenant, resolved
at deploy time and set as MESOFACT_MIRROR_KEY on the receiver
process. None → open receiver (no bearer check).
env: BTreeMap<String, String>Environment variables set on the revalidate process by kamaji.
Keys are the canonical env var names (MESOFACT_S3_ACCESS_KEY_ID,
MESOFACT_S3_SECRET_ACCESS_KEY, CLOUDFLARE_API_TOKEN,
MESOFACT_MIRROR_KEY). Values are resolved from the keystore at
deploy time — the node never sees slot names.
feeds: Vec<AlmanacFeed>Feed-fetch tier (R330-F31) — the almanac feeds whose artifacts must be refreshed on the node for a poke to have anything new to render.
Empty → no fetcher; the receiver re-renders whatever data the bundle was
built with (correct for a site whose data only changes at build time,
silently stale for one whose data is a live feed). Non-empty → kamaji
forks a third resident process, the almanac-feed fetcher, next to the
receiver — resolved from the bundle’s bins/<triple>/almanac-feed when
it carries one, else from feed_runtime.
feed_runtime: Option<String>Runtime ref the almanac-feed fetcher resolves from the node’s shared
runtime-asset cache when the bundle carries no bins/ (R746-T3), e.g.
"almanac-feed/0.8.22".
This is what lets a vanilla bundle have a feed tier at all. A
self-contained bundle stages the fetcher into bins/ and stays closed
over it; a vanilla bundle carries no binaries by construction, so the
fetcher has to be a node-level asset for the same reason serve is —
otherwise a templates-only sync would still need a cross-built musl
binary sitting on the syncing machine’s disk.
None with feeds non-empty and no sidecar in the bundle is a deploy
failure, named at the node. It is not a silent skip: “the site serves
but its data is frozen” is the exact state R330-F31 exists to make
observable.
feed_interval_secs: u64Seconds between feed-fetch ticks. Ignored when feeds is empty.
This is the site’s freshness bound: a release lands, and the next tick
refreshes + pokes. FeedRunner’s change-suppression means an idle tick
costs one conditional fetch, so a short interval is affordable.
feed_project_prefix: Option<String>Workspace-relative path of the component whose build produced this
bundle, e.g. app/yah/web/marketing (R330-F31).
Reconciles two roots for one file: a feed declares emit.artifact
workspace-relative (that is where it is authored), while the route
declares the same file project-relative (that is what the bundle
carries). The fetcher strips this prefix to get from one to the other.
None → the two already coincide.
Trait Implementations§
Source§impl Clone for MesofactRevalidateReceiver
impl Clone for MesofactRevalidateReceiver
Source§fn clone(&self) -> MesofactRevalidateReceiver
fn clone(&self) -> MesofactRevalidateReceiver
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for MesofactRevalidateReceiver
impl Debug for MesofactRevalidateReceiver
Source§impl<'de> Deserialize<'de> for MesofactRevalidateReceiver
impl<'de> Deserialize<'de> for MesofactRevalidateReceiver
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for MesofactRevalidateReceiver
impl StructuralPartialEq for MesofactRevalidateReceiver
Source§impl TS for MesofactRevalidateReceiver
impl TS for MesofactRevalidateReceiver
Source§type WithoutGenerics = MesofactRevalidateReceiver
type WithoutGenerics = MesofactRevalidateReceiver
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or (). The only requirement for these dummy types is that
EXPORT_TO must be None. Read moreSource§type OptionInnerType = MesofactRevalidateReceiver
type OptionInnerType = MesofactRevalidateReceiver
std::option::Option<T>, then this associated type is set to T.
All other implementations of TS should set this type to Self instead.Source§fn docs() -> Option<String>
fn docs() -> Option<String>
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn decl_concrete(cfg: &Config) -> String
fn decl_concrete(cfg: &Config) -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl(cfg: &Config) -> String
fn decl(cfg: &Config) -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline(cfg: &Config) -> String
fn inline(cfg: &Config) -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened(cfg: &Config) -> String
fn inline_flattened(cfg: &Config) -> String
Source§fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn output_path() -> Option<PathBuf>
fn output_path() -> Option<PathBuf>
T should be exported, relative to the output directory.
The returned path does not include any base directory. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
Source§fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export. Read moreSource§fn export_to_string(cfg: &Config) -> Result<String, ExportError>where
Self: 'static,
fn export_to_string(cfg: &Config) -> Result<String, ExportError>where
Self: 'static,
Auto Trait Implementations§
impl Freeze for MesofactRevalidateReceiver
impl RefUnwindSafe for MesofactRevalidateReceiver
impl Send for MesofactRevalidateReceiver
impl Sync for MesofactRevalidateReceiver
impl Unpin for MesofactRevalidateReceiver
impl UnsafeUnpin for MesofactRevalidateReceiver
impl UnwindSafe for MesofactRevalidateReceiver
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.