pub struct ExtismLoader { /* private fields */ }Expand description
Top-level Extism plugin loader.
Construct one per uni-db instance; the loader owns the
HostFnRegistry (capability metadata) and a parallel map of the
runtime-callable extism::Functions keyed by host-fn name. The
metadata map exists unconditionally so embedders without
extism-runtime can still introspect the host-fn surface; the
runtime functions only materialize when the SDK feature is on.
Implementations§
Source§impl ExtismLoader
impl ExtismLoader
Sourcepub fn host_fns_mut(&mut self) -> &mut HostFnRegistry
pub fn host_fns_mut(&mut self) -> &mut HostFnRegistry
Mutable access to the host-fn registry (metadata).
Sourcepub fn host_fns(&self) -> &HostFnRegistry
pub fn host_fns(&self) -> &HostFnRegistry
Shared access to the host-fn registry (metadata).
Sourcepub fn register_host_function(&mut self, spec: HostFnSpec, function: Function)
pub fn register_host_function(&mut self, spec: HostFnSpec, function: Function)
Register a host function with both its metadata and its concrete
extism::Function implementation.
The function is invocable from any plugin whose effective
capability set contains spec.required_capability (or any plugin,
if required_capability is None). The capability filter runs at
Self::build_plugin time — plugins that don’t pass the filter
never see this function in their import table.
Sourcepub fn runtime_fn_count(&self) -> usize
pub fn runtime_fn_count(&self) -> usize
Number of registered runtime functions. Diagnostic / test helper.
Sourcepub fn with_kms(self, kms: Arc<dyn KmsProvider>) -> Self
pub fn with_kms(self, kms: Arc<dyn KmsProvider>) -> Self
Attach a KMS provider backing uni_kms_* (builder style).
Pair with crate::host_svc::register_default_host_svc to register the
metadata specs; the concrete functions are built per load with the
effective grant set so call-time attenuation is enforced.
Sourcepub fn with_secret_store(self, store: Arc<SecretStore>) -> Self
pub fn with_secret_store(self, store: Arc<SecretStore>) -> Self
Attach a secret store backing uni_secret_acquire (builder style).
Sourcepub fn with_http(self, http: Arc<dyn HttpEgress>) -> Self
pub fn with_http(self, http: Arc<dyn HttpEgress>) -> Self
Attach an HTTP egress backing uni_http_* (builder style).
Sourcepub fn prepare(
&self,
manifest_json: &[u8],
grants: &CapabilitySet,
) -> Result<PreparedExtismPlugin, ExtismError>
pub fn prepare( &self, manifest_json: &[u8], grants: &CapabilitySet, ) -> Result<PreparedExtismPlugin, ExtismError>
Parse a manifest JSON blob (as the plugin’s manifest export
returns) and filter the host-fn registry through the granted
capability set.
This is the deterministic, sandbox-free portion of the M6a
loader path: it doesn’t instantiate any wasm. The host can use
the returned PreparedExtismPlugin to decide whether to
proceed with full SDK instantiation, prompt the user for
additional capability grants, or reject the load outright.
§Errors
ExtismError::ManifestInvalidif the JSON doesn’t parse or doesn’t matchExtismPluginManifest.
Sourcepub fn prepare_parsed(
&self,
manifest: ExtismPluginManifest,
grants: &CapabilitySet,
) -> PreparedExtismPlugin
pub fn prepare_parsed( &self, manifest: ExtismPluginManifest, grants: &CapabilitySet, ) -> PreparedExtismPlugin
Intersect declared/granted capabilities for an already-parsed manifest, skipping the JSON round-trip.
Self::load reads the manifest export off a bootstrap plugin
(parsed ExtismPluginManifest), then needs the combined
cap-intersection and host-fn-allow-list result. The previous
implementation re-serialized the parsed struct to JSON and called
Self::prepare which deserialized it straight back — a
wasteful round-trip whose only purpose was reusing the
cap-intersection loop. This entry point preserves the loop and
skips the (de)serialization.
Sourcepub fn build_plugin(
&self,
bytes: &[u8],
prepared: &PreparedExtismPlugin,
) -> Result<Plugin, ExtismError>
pub fn build_plugin( &self, bytes: &[u8], prepared: &PreparedExtismPlugin, ) -> Result<Plugin, ExtismError>
Build an extism::Plugin from raw wasm bytes against a prepared
capability set.
Capability-gated host functions are filtered through
prepared.allowed_host_fns — fns whose required_capability is
not in the plugin’s effective set are omitted from the plugin’s
import table. This is the Extism analogue of Component Model’s
linker absence: the plugin literally cannot resolve an unauthorized
host fn at link time. Per proposal §5.6.2 this is the structural
half of capability enforcement; the call-time pattern attenuation in
each host_svc body (kms_allows / secret_allows /
network_allows) is the defense-in-depth half.
Resource limits declared in the parsed manifest are applied to
the underlying wasmtime config: memory_max_pages (linear
memory cap), timeout_ms (per-call wall-clock), fuel_per_call
(instruction budget). If a field is None, the host’s default
(no cap) applies.
§Errors
ExtismError::Instantiateif the wasm bytes fail to compile, link, or instantiate (invalid wasm, missing required imports, wasmtime errors).ExtismError::Internalif a runtime function recorded in the registry’s allow-list is somehow absent fromruntime_fns(should be unreachable; indicates a registry-state bug).
Sourcepub fn load(
&self,
bytes: &[u8],
host_grants: &CapabilitySet,
registrar: &mut PluginRegistrar<'_>,
) -> Result<LoadOutcome, ExtismError>
pub fn load( &self, bytes: &[u8], host_grants: &CapabilitySet, registrar: &mut PluginRegistrar<'_>, ) -> Result<LoadOutcome, ExtismError>
End-to-end load: read manifest, intersect with host grants,
re-instantiate with effective caps, read register export, push
adapters into the supplied uni_plugin::PluginRegistrar.
The two-pass dance is the proposal’s §5.6 contract: the host
cannot know what capabilities the plugin needs until it reads
the manifest export, and reading that export requires a built
plugin. The first pass uses an empty grant set — the
manifest export must be implementable without any
capability-gated host fn, which is trivially true (it just
returns JSON). The second pass rebuilds with the intersected
grants and the register export is read against that.
The currently-supported registration kinds are
crate::exports::RegistrationEntry::Scalar; aggregate and
procedure adapters land in M6a.2. Entries of unsupported kinds
cause ExtismError::OutputDecode — better to fail loudly than
silently ignore part of a plugin’s surface.
§Errors
ExtismError::Instantiatefor wasmtime / extism build failures.ExtismError::ManifestInvalidfor malformed manifests or unsupported argument types.ExtismError::InvalidPluginif required exports (manifest,register) are missing.ExtismError::OutputDecodefor malformed register payloads or unsupported entry kinds.ExtismError::InternalforPluginRegistrarregistration failures (capability / qname conflicts).
Trait Implementations§
Source§impl Debug for ExtismLoader
impl Debug for ExtismLoader
Source§impl Default for ExtismLoader
impl Default for ExtismLoader
Source§fn default() -> ExtismLoader
fn default() -> ExtismLoader
Auto Trait Implementations§
impl !RefUnwindSafe for ExtismLoader
impl !UnwindSafe for ExtismLoader
impl Freeze for ExtismLoader
impl Send for ExtismLoader
impl Sync for ExtismLoader
impl Unpin for ExtismLoader
impl UnsafeUnpin for ExtismLoader
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> GetSetFdFlags for T
impl<T> GetSetFdFlags for T
Source§fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
self file descriptor.Source§fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
Source§fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: Sized + AsFilelike,
fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: Sized + AsFilelike,
self file descriptor. Read moreSource§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more