///|
extern "C" fn native_abi_version(address : UInt64) -> UInt = "orbit_plugin_abi_call_version"

///|
extern "C" fn native_manifest(address : UInt64) -> Bytes = "orbit_plugin_abi_call_manifest"

///|
extern "C" fn native_create(address : UInt64) -> Bytes = "orbit_plugin_abi_call_create"

///|
#borrow(command, request)
extern "C" fn native_invoke(
  address : UInt64,
  instance : UInt64,
  command : Bytes,
  request : Bytes,
) -> Bytes = "orbit_plugin_abi_call_invoke"

///|
extern "C" fn native_destroy(address : UInt64, instance : UInt64) -> Unit = "orbit_plugin_abi_call_destroy"

///|
extern "C" fn native_executor_start(
  abi_version : UInt,
  create_address : UInt64,
  invoke_address : UInt64,
  destroy_address : UInt64,
  wakeup_callback : FuncRef[() -> Unit],
) -> UInt64 = "orbit_plugin_executor_start"

///|
#borrow(command, request)
extern "C" fn native_executor_submit(
  executor : UInt64,
  invocation_id : UInt64,
  command : Bytes,
  request : Bytes,
) -> Int = "orbit_plugin_executor_submit"

///|
extern "C" fn native_executor_cancel(
  executor : UInt64,
  invocation_id : UInt64,
) -> Int = "orbit_plugin_executor_cancel"

///|
extern "C" fn native_executor_poll_event(executor : UInt64) -> Bytes = "orbit_plugin_executor_poll_event"

///|
#borrow(response)
extern "C" fn native_executor_complete_host_request(
  executor : UInt64,
  request_id : UInt64,
  response : Bytes,
) -> Int = "orbit_plugin_executor_complete_host_request"

///|
extern "C" fn native_executor_cancel_host_request(
  executor : UInt64,
  request_id : UInt64,
  status : Int,
) -> Int = "orbit_plugin_executor_cancel_host_request"

///|
extern "C" fn native_executor_begin_shutdown(executor : UInt64) -> Unit = "orbit_plugin_executor_begin_shutdown"

///|
extern "C" fn native_executor_join_stopped(executor : UInt64) -> Int = "orbit_plugin_executor_join_stopped"

///|
extern "C" fn native_executor_join(executor : UInt64) -> Int = "orbit_plugin_executor_join"