lunatic 0.14.1

Helper library for building Rust applications that run on lunatic.
Documentation
//! Lunatic VM host functions.

pub mod error {
    #[link(wasm_import_module = "lunatic::error")]
    extern "C" {
        pub fn string_size(error_id: u64) -> u32;
        pub fn to_string(error_id: u64, error_str: *mut u8);
        pub fn drop(error_id: u64);
    }
}

pub mod message {
    #[link(wasm_import_module = "lunatic::message")]
    extern "C" {
        pub fn create_data(tag: i64, capacity: u64);
        pub fn write_data(data: *const u8, data_len: usize) -> usize;
        pub fn read_data(data: *mut u8, data_len: usize) -> usize;
        #[allow(dead_code)]
        pub fn seek_data(position: u64);
        pub fn get_tag() -> i64;
        pub fn get_process_id() -> u64;
        #[allow(dead_code)]
        pub fn data_size() -> u64;
        pub fn push_module(module_id: u64) -> u64;
        pub fn take_module(index: u64) -> u64;
        pub fn push_tcp_stream(tcp_stream_id: u64) -> u64;
        pub fn take_tcp_stream(index: u64) -> u64;
        pub fn push_tls_stream(tls_stream_id: u64) -> u64;
        pub fn take_tls_stream(index: u64) -> u64;
        pub fn send(process_id: u64) -> u32;
        pub fn send_receive_skip_search(process_id: u64, wait_on_tag: i64, timeout: u64) -> u32;
        pub fn receive(tag: *const i64, tag_len: usize, timeout: u64) -> u32;
    }
}

pub mod timer {
    #[link(wasm_import_module = "lunatic::timer")]
    extern "C" {
        pub fn send_after(process_id: u64, duration: u64) -> u64;
        pub fn cancel_timer(timer_id: u64) -> u32;
    }
}

pub mod networking {
    #[link(wasm_import_module = "lunatic::networking")]
    extern "C" {
        pub fn resolve(name_str: *const u8, name_str_len: usize, timeout: u64, id: *mut u64)
            -> u32;
        pub fn drop_dns_iterator(dns_iter_id: u64);
        pub fn resolve_next(
            dns_iter_id: u64,
            addr_type: *mut u32,
            addr: *mut u8,
            port: *mut u16,
            flow_info: *mut u32,
            scope_id: *mut u32,
        ) -> u32;
        pub fn tcp_bind(
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            id: *mut u64,
        ) -> u32;
        pub fn udp_bind(
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            id: *mut u64,
        ) -> u32;
        pub fn drop_tcp_listener(tcp_listener_id: u64);
        pub fn drop_tls_listener(tcp_listener_id: u64);
        pub fn drop_udp_socket(udp_socket_id: u64);
        pub fn tcp_local_addr(tcp_listener_id: u64, addr_dns_iter: *mut u64) -> u32;
        pub fn tls_local_addr(tcp_listener_id: u64, addr_dns_iter: *mut u64) -> u32;
        pub fn udp_local_addr(udp_socket_id: u64, addr_dns_iter: *mut u64) -> u32;
        pub fn tcp_peer_addr(tcp_stream_id: u64, addr_dns_iter: *mut u64) -> u32;
        pub fn udp_peer_addr(udp_stream_id: u64, addr_dns_iter: *mut u64) -> u32;
        pub fn tcp_accept(listener_id: u64, id: *mut u64, peer_dns_iter: *mut u64) -> u32;
        pub fn tcp_connect(
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            timeout: u64,
            id: *mut u64,
        ) -> u32;
        pub fn udp_connect(
            udp_socket_id: u64,
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            timeout: u64,
            id: *mut u64,
        ) -> u32;
        pub fn drop_tcp_stream(tcp_stream_id: u64);
        pub fn clone_tcp_stream(tcp_stream_id: u64) -> u64;
        pub fn tcp_write_vectored(
            tcp_stream_id: u64,
            ciovec_array: *const u32,
            ciovec_array_len: usize,
            opaque: *mut u64,
        ) -> u32;
        pub fn tcp_read(
            tcp_stream_id: u64,
            buffer: *mut u8,
            buffer_len: usize,

            opaque: *mut u64,
        ) -> u32;
        pub fn tcp_peek(
            tcp_stream_id: u64,
            buffer: *mut u8,
            buffer_len: usize,

            opaque: *mut u64,
        ) -> u32;
        pub fn udp_send(
            udp_socket_id: u64,
            buffer: *const u8,
            buffer_len: usize,

            opaque: *mut u64,
        ) -> u32;
        pub fn udp_send_to(
            udp_socket_id: u64,
            buffer: *const u8,
            buffer_len: usize,
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            opaque: *mut u64,
        ) -> u32;
        pub fn udp_receive(
            udp_socket_id: u64,
            buffer: *mut u8,
            buffer_len: usize,
            opaque: *mut u64,
        ) -> u32;
        pub fn udp_receive_from(
            udp_socket_id: u64,
            buffer: *mut u8,
            buffer_len: usize,
            opaque: *mut u64,
            dns_iter_ptr: *mut u64,
        ) -> u32;
        pub fn set_udp_socket_ttl(udp_socket_id: u64, ttl: u32);
        pub fn set_udp_socket_broadcast(udp_socket_id: u64, broadcast: u32);
        pub fn get_udp_socket_ttl(udp_socket_id: u64) -> u32;
        pub fn get_udp_socket_broadcast(udp_socket_id: u64) -> i32;
        pub fn clone_udp_socket(udp_socket_id: u64) -> u64;
        pub fn tcp_flush(tcp_stream_id: u64, error_id: *mut u64) -> u32;
        pub fn tls_flush(tcp_stream_id: u64, error_id: *mut u64) -> u32;
        pub fn set_read_timeout(tcp_stream_id: u64, duration: u64);
        pub fn get_read_timeout(tcp_stream_id: u64) -> u64;
        pub fn set_write_timeout(tcp_stream_id: u64, duration: u64);
        pub fn get_write_timeout(tcp_stream_id: u64) -> u64;
        pub fn set_peek_timeout(tcp_stream_id: u64, duration: u64);
        pub fn get_peek_timeout(tcp_stream_id: u64) -> u64;

        // tls
        pub fn tls_bind(
            addr_type: u32,
            addr: *const u8,
            port: u32,
            flow_info: u32,
            scope_id: u32,
            id: *mut u64,
            certs_array_ptr: *const u32,
            certs_array_len: usize,
            keys_array_ptr: *const u32,
            keys_array_len: usize,
        ) -> u32;
        pub fn tls_accept(listener_id: u64, id: *mut u64, peer_dns_iter: *mut u64) -> u32;
        pub fn tls_connect(
            addr_str: *const u8,
            addr_str_len: u32,
            port: u32,
            timeout: u64,
            id: *mut u64,
            certs_ptr: *const u8,
            certs_len: u32,
        ) -> u32;
        pub fn drop_tls_stream(tcp_stream_id: u64);
        pub fn clone_tls_stream(tcp_stream_id: u64) -> u64;
        pub fn tls_write_vectored(
            tcp_stream_id: u64,
            ciovec_array: *const u32,
            ciovec_array_len: usize,
            opaque: *mut u64,
        ) -> u32;
        pub fn tls_read(
            tcp_stream_id: u64,
            buffer: *mut u8,
            buffer_len: usize,
            opaque: *mut u64,
        ) -> u32;
        pub fn set_tls_read_timeout(tls_stream_id: u64, duration: u64);
        pub fn get_tls_read_timeout(tls_stream_id: u64) -> u64;
        pub fn set_tls_write_timeout(tls_stream_id: u64, duration: u64);
        pub fn get_tls_write_timeout(tls_stream_id: u64) -> u64;
    }
}

pub mod trap {
    #[link(wasm_import_module = "lunatic::trap")]
    extern "C" {
        pub fn catch(function: usize, argument: usize) -> usize;
    }
}

pub mod process {
    #[link(wasm_import_module = "lunatic::process")]
    extern "C" {
        pub fn compile_module(data: *const u8, data_len: usize, id: *mut u64) -> i32;
        pub fn drop_module(config_id: u64);
        pub fn create_config() -> i64;
        pub fn drop_config(config_id: u64);
        pub fn config_set_max_memory(config_id: u64, max_memory: u64);
        pub fn config_get_max_memory(config_id: u64) -> u64;
        pub fn config_set_max_fuel(config_id: u64, max_fuel: u64);
        pub fn config_get_max_fuel(config_id: u64) -> u64;
        pub fn config_can_compile_modules(config_id: u64) -> u32;
        pub fn config_set_can_compile_modules(config_id: u64, can: u32);
        pub fn config_can_create_configs(config_id: u64) -> u32;
        pub fn config_set_can_create_configs(config_id: u64, can: u32);
        pub fn config_can_spawn_processes(config_id: u64) -> u32;
        pub fn config_set_can_spawn_processes(config_id: u64, can: u32);
        pub fn spawn(
            link: i64,
            config_id: i64,
            module_id: i64,
            function: *const u8,
            function_len: usize,
            params: *const u8,
            params_len: usize,
            id: *mut u64,
        ) -> u32;
        pub fn get_or_spawn(
            name: *const u8,
            name_len: usize,
            link: i64,
            config_id: i64,
            module_id: i64,
            function: *const u8,
            function_len: usize,
            params: *const u8,
            params_len: usize,
            node_id: *mut u64,
            id: *mut u64,
        ) -> u32;
        pub fn sleep_ms(millis: u64);
        pub fn die_when_link_dies(trap: u32);
        pub fn process_id() -> u64;
        pub fn link(tag: i64, process_id: u64);
        pub fn unlink(process_id: u64);
        pub fn monitor(process_id: u64);
        pub fn stop_monitoring(process_id: u64);
        pub fn kill(process_id: u64);
        pub fn exists(process_id: u64) -> i32;
    }
}

pub mod registry {
    #[link(wasm_import_module = "lunatic::registry")]
    extern "C" {
        pub fn put(name: *const u8, name_len: usize, node_id: u64, process_id: u64);
        pub fn get(
            name: *const u8,
            name_len: usize,
            node_id: *mut u64,
            process_id: *mut u64,
        ) -> u32;
        pub fn remove(name: *const u8, name_len: usize);
    }
}

pub mod wasi {
    #[link(wasm_import_module = "lunatic::wasi")]
    extern "C" {
        pub fn config_add_environment_variable(
            config_id: u64,
            key: *const u8,
            key_len: usize,
            value: *const u8,
            value_len: usize,
        );
        pub fn config_add_command_line_argument(config_id: u64, key: *const u8, key_len: usize);
        pub fn config_preopen_dir(config_id: u64, key: *const u8, key_len: usize);
    }
}

#[allow(clashing_extern_declarations)]
pub mod distributed {
    #[link(wasm_import_module = "lunatic::distributed")]
    extern "C" {
        pub fn get_nodes(nodes_ptr: *mut u64, nodes_len: u32) -> u32;
        pub fn exec_lookup_nodes(
            query_ptr: *const u8,
            query_len: u32,
            query_id_ptr: *mut u64,
            node_len_ptr: *mut u32,
            error_ptr: *mut u64,
        ) -> u32;
        pub fn copy_lookup_nodes_results(
            query_id: u64,
            nodes_ptr: *mut u64,
            nodes_len: u32,
            error_ptr: *mut u64,
        ) -> i32;
        pub fn nodes_count() -> u32;
        pub fn node_id() -> u64;
        pub fn module_id() -> u64;
        pub fn send(node_id: u64, process_id: u64) -> u32;
        pub fn send_receive_skip_search(
            node_id: u64,
            process_id: u64,
            wait_on_tag: i64,
            timeout: u64,
        ) -> u32;
        pub fn spawn(
            node_id: u64,
            config_id: i64,
            module_id: u64,
            function: *const u8,
            function_len: usize,
            params: *const u8,
            params_len: usize,
            id: *mut u64,
        ) -> u32;
    }
}

pub mod version {
    #[link(wasm_import_module = "lunatic::version")]
    extern "C" {
        pub fn major() -> u32;
        pub fn minor() -> u32;
        pub fn patch() -> u32;
    }
}

pub mod metrics {
    #[link(wasm_import_module = "lunatic::metrics")]
    extern "C" {
        pub fn counter(name: *const u8, name_len: usize, value: u64);
        pub fn increment_counter(name: *const u8, name_len: usize);
        pub fn gauge(name: *const u8, name_len: usize, value: f64);
        pub fn increment_gauge(name: *const u8, name_len: usize, value: f64);
        pub fn decrement_gauge(name: *const u8, name_len: usize, value: f64);
        pub fn histogram(name: *const u8, name_len: usize, value: f64);
    }
}