Skip to main content

LuaRuntime

Struct LuaRuntime 

Source
pub struct LuaRuntime {
    source: String,
    modules_path: Option<PathBuf>,
    timeout_ms: u64,
}
Expand description

Holds a validated Lua script and executes it against a Context.

A fresh Lua VM is created for every execution, so scripts cannot leak state between requests; only the source text is retained between calls.

Fields§

§source: String

The full script source, re-loaded into a fresh VM per execution.

§modules_path: Option<PathBuf>

Directory the sandboxed require resolves modules from; None disables require.

§timeout_ms: u64

Wall-clock budget for one execution, covering both loading the source and the execute(ctx) call. Enforced by a Luau VM interrupt; 0 disables enforcement.

Implementations§

Source§

impl LuaRuntime

Source

pub fn new( source: &str, timeout_ms: u64, modules_path: Option<PathBuf>, ) -> Result<Self, String>

Compiles and validates the script in a throwaway VM, failing early if the source has syntax errors, its top level errors on load, or it does not define a global execute function. This runs once at policy-compile time, not per request.

Source

pub fn execute( &self, ctx: Context, ) -> Result<(Context, Option<&'static str>), PluginExecutionError>

Runs the script’s execute(ctx) against the given context in a fresh VM and returns the context rebuilt from the table the script returned, and the port the script named, if any ("respond" or the implicit success).

Every failure mode (load, marshalling either way, missing execute, a runtime error raised by the script, or an unrecognized second return value) returns a PluginExecutionError carrying the original context, with a distinguishing error code (LUA_LOAD_ERROR, LUA_MARSHAL_ERROR, LUA_MISSING_EXECUTE, LUA_EXECUTION_ERROR, LUA_UNMARSHAL_ERROR, LUA_BAD_PORT, and LUA_TIMEOUT when the script outran timeout_ms), so the graph engine routes through the error port exactly like a native plugin failure.

timeout_ms is a single budget covering both loading the source and the execute(ctx) call.

Shares the load/marshal/call core with execute_without_port via call_execute; only the judgment of the second return value differs between the two.

Source

pub fn execute_without_port( &self, ctx: Context, ) -> Result<Context, PluginExecutionError>

execute for node types that declare no outcome port: any named port other than "success" is a LUA_BAD_PORT failure with the ORIGINAL context, and the message says so without pointing at respond.

Used by serverless-pre-function/serverless-post-function, which share this Lua runtime with script but have no respond port (or any outcome port) to leave on — a function that names one anyway is rejected here, at the point the original ctx is still in hand, rather than one layer up with a serverless-specific message.

Source

fn call_execute( &self, lua: &Lua, timed_out: &Arc<AtomicBool>, ctx: Context, ) -> Result<(Context, LuaTable, Option<LuaValue>), PluginExecutionError>

Shared core of execute and execute_without_port: loads the script, marshals ctx, calls execute(ctx), and returns the table it returned together with the raw second return value, still unjudged, and the original ctx — untouched, since it was only ever borrowed to build the Lua table. This lets a caller that rejects the second value still hand back the pristine original context, never the one rebuilt from what the script returned.

Takes lua and timed_out by reference rather than creating them itself: the returned LuaTable/LuaValue are only valid as long as the Lua instance that produced them is alive, so it must live in the caller’s stack frame, not be dropped when this function returns.

Source

fn finish_unmarshal( &self, ctx: Context, result_table: &LuaTable, ) -> Result<Context, PluginExecutionError>

Rebuilds the Context from result_table, carrying over the fields scripts never see (the wire protocol and the errors accumulated by earlier nodes) from ctx. On failure the ORIGINAL ctx travels with the error, not a partially-rebuilt one.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> MaybeSend for T

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more