Fixed, auditable native ABI bridge for Orbit plugins.
Dependencies
uint32_t orbit_plugin_abi_version(void);
const char *orbit_plugin_manifest_json(void);
/* The host argument is OrbitHostV1 for ABI 1 and OrbitHostV2 for ABI 2. */
int32_t orbit_plugin_create(const void *host, void **out_instance);
int32_t orbit_plugin_invoke(
void *instance,
const char *command,
const uint8_t *request,
uint32_t request_len,
OrbitBuffer *out_response);
void orbit_plugin_destroy(void *instance);moon fmt --check
moon check --target native --deny-warn --warn-list +73
moon test --target native --deny-warn
moon info --target nativepub(all) enum AbiError {
InvalidAddress
IncompatibleAbi(UInt)
ManifestUnavailable
InvalidManifestUtf8
InvalidCommand
RequestTooLarge(Int)
InvalidResponse
PluginStatus(Int)
InstanceUnavailable
Destroyed
ExecutorRequired
ExecutorUnsupported
ExecutorUnavailable
ExecutorQueueFull
DuplicateInvocation
ExecutorClosed
InvocationUnavailable
MalformedEvent
ExecutorStatus(Int)
} derive(Eq, Debug)pub(all) enum ExecutorEvent {
Ready(Int)
InvocationFinished(UInt64, Int, Bytes)
HostRequest(HostRequest)
HostRequestCancelled(UInt64, UInt64, Int)
Stopped
} derive(Eq, Debug)pub struct Plugin {
// private fields
}fn Plugin::start_executor(self : Plugin, wakeup_callback : FuncRef[() -> Unit]) -> Result[PluginExecutor, AbiError]pub struct PluginAddresses {
// private fields
}fn PluginAddresses::from_symbols(abi_version : Symbol, manifest : Symbol, create : Symbol, invoke : Symbol, destroy : Symbol) -> Result[PluginAddresses, AbiError]fn PluginAddresses::new(abi_version_address : UInt64, manifest_address : UInt64, create_address : UInt64, invoke_address : UInt64, destroy_address : UInt64) -> Result[PluginAddresses, AbiError]pub struct PluginExecutor {
// private fields
}fn PluginExecutor::cancel_host_request(self : PluginExecutor, request_id : UInt64, status : Int) -> Result[Unit, AbiError]fn PluginExecutor::complete_host_request(self : PluginExecutor, request_id : UInt64, response : Bytes) -> Result[Unit, AbiError]fn PluginExecutor::submit(self : PluginExecutor, invocation_id : UInt64, command : String, request : Bytes) -> Result[Unit, AbiError]pub struct PluginInstance {
// private fields
}fn PluginInstance::invoke(self : PluginInstance, command : String, request : Bytes) -> Result[Bytes, AbiError]fn supported_abi_version() -> UIntFixed, auditable native ABI bridge for Orbit plugins.
Dependencies