#ifndef NET_RPC_H
#define NET_RPC_H
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
#define NET_RPC_ABI_VERSION 0x0002
uint32_t net_rpc_abi_version(void);
int net_rpc_check_abi_version(uint32_t expected);
#define NET_RPC_OK 0
#define NET_RPC_ERR_NULL -1
#define NET_RPC_ERR_CALL_FAILED -2
#define NET_RPC_ERR_ALREADY_SERVING -3
#define NET_RPC_ERR_NO_DISPATCHER -4
#define NET_RPC_ERR_INVALID_UTF8 -5
#define NET_RPC_ERR_STREAM_DONE -6
typedef struct MeshRpcHandle MeshRpcHandle;
typedef struct ServeHandleC ServeHandleC;
typedef struct RpcStreamHandleC RpcStreamHandleC;
typedef struct ClientStreamCallHandleC ClientStreamCallHandleC;
typedef struct DuplexCallHandleC DuplexCallHandleC;
typedef struct DuplexSinkHandleC DuplexSinkHandleC;
typedef struct DuplexStreamHandleC DuplexStreamHandleC;
void net_rpc_free_cstring(char* s);
void net_rpc_response_free(uint8_t* ptr, size_t len);
void net_rpc_find_service_nodes_free(uint64_t* ptr, size_t count);
MeshRpcHandle* net_rpc_new(void* node_arc);
void net_rpc_free(MeshRpcHandle* handle);
uint64_t net_rpc_id(const MeshRpcHandle* handle);
uint64_t net_rpc_reserve_cancel_token(void);
void net_rpc_cancel_call(uint64_t token);
typedef int (*RpcHandlerFn)(
uint64_t handler_id,
const uint8_t* req_ptr,
size_t req_len,
uint8_t** out_resp_ptr,
size_t* out_resp_len,
char** out_err);
void net_rpc_set_handler_dispatcher(RpcHandlerFn dispatcher);
uint64_t net_rpc_reserve_handler_id(void);
int net_rpc_call(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint64_t cancel_token,
uint8_t** out_resp_ptr, size_t* out_resp_len,
char** out_err);
int net_rpc_call_service(
MeshRpcHandle* handle,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint64_t cancel_token,
uint8_t** out_resp_ptr, size_t* out_resp_len,
char** out_err);
typedef struct {
const char* name_ptr;
size_t name_len;
const uint8_t* value_ptr;
size_t value_len;
} net_rpc_header_t;
int net_rpc_call_with_headers(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint64_t cancel_token,
const net_rpc_header_t* headers_ptr,
size_t header_count,
uint8_t** out_resp_ptr, size_t* out_resp_len,
char** out_err);
int net_rpc_call_service_with_headers(
MeshRpcHandle* handle,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint64_t cancel_token,
const net_rpc_header_t* headers_ptr,
size_t header_count,
uint8_t** out_resp_ptr, size_t* out_resp_len,
char** out_err);
int net_rpc_call_streaming_with_headers(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint32_t stream_window,
const net_rpc_header_t* headers_ptr,
size_t header_count,
RpcStreamHandleC** out_stream,
char** out_err);
int net_rpc_call_streaming_cancellable(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint32_t stream_window,
uint64_t cancel_token,
RpcStreamHandleC** out_stream,
char** out_err);
int net_rpc_call_streaming_with_headers_cancellable(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint32_t stream_window,
uint64_t cancel_token,
const net_rpc_header_t* headers_ptr,
size_t header_count,
RpcStreamHandleC** out_stream,
char** out_err);
int net_rpc_find_service_nodes(
MeshRpcHandle* handle,
const char* service_ptr, size_t service_len,
uint64_t** out_ptr, size_t* out_count,
char** out_err);
ServeHandleC* net_rpc_serve(
MeshRpcHandle* handle,
const char* service_ptr, size_t service_len,
uint64_t handler_id,
uint64_t handler_timeout_ms,
char** out_err);
uint64_t net_rpc_serve_handle_id(const ServeHandleC* handle);
void net_rpc_serve_handle_close(ServeHandleC* handle);
void net_rpc_serve_handle_free(ServeHandleC* handle);
int net_rpc_call_streaming(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr, size_t service_len,
const uint8_t* req_ptr, size_t req_len,
uint64_t deadline_ms,
uint32_t stream_window,
RpcStreamHandleC** out_stream,
char** out_err);
int net_rpc_stream_next(
RpcStreamHandleC* stream,
uint8_t** out_chunk_ptr, size_t* out_chunk_len,
char** out_err);
int net_rpc_stream_grant(RpcStreamHandleC* stream, uint32_t amount);
uint64_t net_rpc_stream_call_id(const RpcStreamHandleC* stream);
void net_rpc_stream_close(RpcStreamHandleC* stream);
void net_rpc_stream_free(RpcStreamHandleC* stream);
int net_rpc_call_client_stream(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr,
size_t service_len,
uint64_t deadline_ms,
uint32_t request_window,
ClientStreamCallHandleC** out_handle,
char** out_err);
int net_rpc_call_client_stream_cancellable(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr,
size_t service_len,
uint64_t deadline_ms,
uint32_t request_window,
uint64_t cancel_token,
ClientStreamCallHandleC** out_handle,
char** out_err);
int net_rpc_client_stream_send(
ClientStreamCallHandleC* handle,
const uint8_t* body_ptr,
size_t body_len,
char** out_err);
int net_rpc_client_stream_finish(
ClientStreamCallHandleC* handle,
uint8_t** out_body_ptr,
size_t* out_body_len,
char** out_err);
uint64_t net_rpc_client_stream_call_id(const ClientStreamCallHandleC* handle);
void net_rpc_client_stream_free(ClientStreamCallHandleC* handle);
int net_rpc_call_duplex(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr,
size_t service_len,
uint64_t deadline_ms,
uint32_t request_window,
uint32_t stream_window,
DuplexCallHandleC** out_handle,
char** out_err);
int net_rpc_call_duplex_cancellable(
MeshRpcHandle* handle,
uint64_t target_node_id,
const char* service_ptr,
size_t service_len,
uint64_t deadline_ms,
uint32_t request_window,
uint32_t stream_window,
uint64_t cancel_token,
DuplexCallHandleC** out_handle,
char** out_err);
int net_rpc_duplex_send(
DuplexCallHandleC* handle,
const uint8_t* body_ptr,
size_t body_len,
char** out_err);
int net_rpc_duplex_finish_sending(DuplexCallHandleC* handle, char** out_err);
int net_rpc_duplex_next(
DuplexCallHandleC* handle,
uint8_t** out_chunk_ptr,
size_t* out_chunk_len,
char** out_err);
int net_rpc_duplex_into_split(
DuplexCallHandleC* handle,
DuplexSinkHandleC** out_sink,
DuplexStreamHandleC** out_stream,
char** out_err);
uint64_t net_rpc_duplex_call_id(const DuplexCallHandleC* handle);
void net_rpc_duplex_free(DuplexCallHandleC* handle);
int net_rpc_duplex_sink_send(
DuplexSinkHandleC* handle,
const uint8_t* body_ptr,
size_t body_len,
char** out_err);
int net_rpc_duplex_sink_finish(DuplexSinkHandleC* handle, char** out_err);
uint64_t net_rpc_duplex_sink_call_id(const DuplexSinkHandleC* handle);
void net_rpc_duplex_sink_free(DuplexSinkHandleC* handle);
int net_rpc_duplex_stream_next(
DuplexStreamHandleC* handle,
uint8_t** out_chunk_ptr,
size_t* out_chunk_len,
char** out_err);
uint64_t net_rpc_duplex_stream_call_id(const DuplexStreamHandleC* handle);
void net_rpc_duplex_stream_free(DuplexStreamHandleC* handle);
typedef struct RpcRequestStreamHandleC RpcRequestStreamHandleC;
typedef struct RpcResponseSinkHandleC RpcResponseSinkHandleC;
typedef int (*RpcClientStreamingHandlerFn)(
uint64_t handler_id,
RpcRequestStreamHandleC* request_stream,
uint8_t** out_resp_ptr,
size_t* out_resp_len,
char** out_err);
typedef int (*RpcDuplexHandlerFn)(
uint64_t handler_id,
RpcRequestStreamHandleC* request_stream,
RpcResponseSinkHandleC* response_sink,
char** out_err);
void net_rpc_set_client_streaming_handler_dispatcher(
RpcClientStreamingHandlerFn dispatcher);
void net_rpc_set_duplex_handler_dispatcher(RpcDuplexHandlerFn dispatcher);
int net_rpc_request_stream_next(
RpcRequestStreamHandleC* handle,
uint8_t** out_chunk_ptr,
size_t* out_chunk_len);
int net_rpc_response_sink_send(
RpcResponseSinkHandleC* handle,
const uint8_t* body_ptr,
size_t body_len);
ServeHandleC* net_rpc_serve_client_stream(
MeshRpcHandle* handle,
const char* service_ptr,
size_t service_len,
uint64_t handler_id,
uint64_t handler_timeout_ms,
char** out_err);
ServeHandleC* net_rpc_serve_duplex(
MeshRpcHandle* handle,
const char* service_ptr,
size_t service_len,
uint64_t handler_id,
uint64_t handler_timeout_ms,
char** out_err);
#ifdef __cplusplus
}
#endif
#endif