Back to Site
Loading...
Searching...
No Matches
rats.h
Go to the documentation of this file.
1#pragma once
2
28#include "util/rats_export.h"
29
30#include <stddef.h>
31#include <stdint.h>
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37typedef void* rats_t;
38
39typedef enum {
40 RATS_SECURITY_NOISE = 0, /* Noise XX, encrypted + authenticated (default) */
41 RATS_SECURITY_PLAINTEXT = 1 /* unencrypted, ids exchanged in the clear */
43
44/* Result of a fallible operation. RATS_OK is 0; any non-zero value is an error.
45 * NOTE: this inverts the truthiness of the old int-returning calls — test against
46 * RATS_OK, not against zero/non-zero, e.g. `if (rats_start(n) != RATS_OK) …`. */
47typedef enum {
49 RATS_ERR_INVALID_ARG = 1, /* null/malformed argument (bad peer id, null ptr, bad json) */
50 RATS_ERR_NOT_STARTED = 2, /* operation requires a started node */
51 RATS_ERR_ALREADY_STARTED = 3, /* enable/attach called after rats_start() */
52 RATS_ERR_NOT_ENABLED = 4, /* subsystem not enabled — call the matching rats_enable_* */
53 RATS_ERR_NO_SUCH_PEER = 5, /* peer not connected, or transfer id not found */
54 RATS_ERR_BIND = 6, /* listen/bind failed during rats_start() */
57
59RATS_API const char* rats_error_str(rats_error_t err);
60
61/* — construction / lifecycle — */
62
69typedef struct {
70 uint16_t listen_port; /* inbound port; 0 = ephemeral */
71 int enable_listen; /* 0 = dial-only node (no listener) */
72 const char* bind_address; /* NULL → "::" dual-stack wildcard */
73 rats_security_t security; /* RATS_SECURITY_NOISE / _PLAINTEXT */
74 const char* data_dir; /* persistent state dir; NULL/"" → ephemeral identity each run */
75 const char* protocol_name; /* handshake app namespace; NULL → "librats" */
76 const char* protocol_version; /* handshake app version; NULL → "1.0" */
77 size_t max_peers; /* established-peer cap; 0 = unlimited */
79
84
88RATS_API rats_t rats_create_config(const rats_config_t* config);
89
91RATS_API rats_t rats_create(uint16_t listen_port);
92
95RATS_API rats_t rats_create_ex(uint16_t listen_port, int enable_listen,
96 const char* bind_address, rats_security_t security);
97
98RATS_API void rats_destroy(rats_t node);
99RATS_API rats_error_t rats_start(rats_t node); /* RATS_OK / RATS_ERR_ALREADY_STARTED / RATS_ERR_BIND */
100RATS_API void rats_stop(rats_t node);
101RATS_API uint16_t rats_listen_port(rats_t node);
102
104RATS_API char* rats_local_id(rats_t node);
105
109RATS_API char* rats_protocol_name(rats_t node);
110RATS_API char* rats_protocol_version(rats_t node);
111
112/* — connections — */
113
114RATS_API rats_error_t rats_connect(rats_t node, const char* host, uint16_t port);
115RATS_API size_t rats_peer_count(rats_t node);
116
119RATS_API void rats_set_max_peers(rats_t node, size_t max_peers);
120RATS_API size_t rats_max_peers(rats_t node);
121
122/* — messaging (named application channel, raw bytes) — */
123
124RATS_API rats_error_t rats_send(rats_t node, const char* peer_id_hex,
125 const char* channel, const void* data, size_t len);
126RATS_API rats_error_t rats_broadcast(rats_t node, const char* channel,
127 const void* data, size_t len);
128
129/* — callbacks (register before start; invoked on a reactor thread) — */
130
131typedef void (*rats_peer_cb)(void* user, const char* peer_id_hex);
132typedef void (*rats_message_cb)(void* user, const char* peer_id_hex, const void* data, size_t len);
133
136RATS_API rats_error_t rats_on(rats_t node, const char* channel, rats_message_cb cb, void* user);
137
138/* — optional subsystems (enable before start) — */
139
141RATS_API rats_error_t rats_enable_dht(rats_t node, uint16_t dht_port, const char* discovery_key);
146RATS_API rats_error_t rats_enable_port_mapping(rats_t node, int enable_upnp, int enable_natpmp);
147
148/* — peer enumeration — */
149
153RATS_API char** rats_peer_ids(rats_t node, size_t* count);
154RATS_API void rats_free_peer_ids(char** ids, size_t count);
155
156/* — pub/sub (topic-based, raw bytes; enable + subscribe before start) — */
157
158typedef void (*rats_topic_cb)(void* user, const char* peer_id_hex,
159 const char* topic, const void* data, size_t len);
160
164RATS_API rats_error_t rats_subscribe(rats_t node, const char* topic, rats_topic_cb cb, void* user);
165RATS_API rats_error_t rats_unsubscribe(rats_t node, const char* topic);
167RATS_API rats_error_t rats_publish(rats_t node, const char* topic, const void* data, size_t len);
168
169/* — typed JSON messaging (named message type; payload is JSON text) — */
170
171typedef void (*rats_json_cb)(void* user, const char* peer_id_hex, const char* json);
172
178RATS_API rats_error_t rats_on_json(rats_t node, const char* type, rats_json_cb cb, void* user);
180RATS_API rats_error_t rats_once_json(rats_t node, const char* type, rats_json_cb cb, void* user);
181RATS_API rats_error_t rats_off_json(rats_t node, const char* type);
183RATS_API rats_error_t rats_send_json(rats_t node, const char* peer_id_hex, const char* type, const char* json);
184RATS_API rats_error_t rats_broadcast_json(rats_t node, const char* type, const char* json);
185
186/* — file transfer (push model; enable + register callbacks before start) — */
187
188typedef void (*rats_file_offer_cb)(void* user, const char* peer_id_hex, uint64_t transfer_id,
189 const char* name, uint64_t size, int is_directory);
190typedef void (*rats_file_progress_cb)(void* user, uint64_t transfer_id, const char* peer_id_hex,
191 uint64_t bytes_transferred, uint64_t total_bytes, int status);
192typedef void (*rats_file_complete_cb)(void* user, uint64_t transfer_id, int success, const char* path);
193
196RATS_API rats_error_t rats_enable_file_transfer(rats_t node, const char* temp_dir);
197
201
204RATS_API uint64_t rats_send_file(rats_t node, const char* peer_id_hex, const char* path);
205RATS_API uint64_t rats_send_directory(rats_t node, const char* peer_id_hex, const char* dir_path);
206
209RATS_API rats_error_t rats_accept_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id, const char* dest_path);
210RATS_API rats_error_t rats_reject_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
211
214RATS_API rats_error_t rats_cancel_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
215RATS_API rats_error_t rats_pause_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
216RATS_API rats_error_t rats_resume_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
217
218/* — liveness (RTT probing) — */
219
224RATS_API int64_t rats_peer_rtt_ms(rats_t node, const char* peer_id_hex);
225
226/* — automatic reconnection — */
227
235RATS_API rats_error_t rats_add_reconnect(rats_t node, const char* host, uint16_t port);
237RATS_API rats_error_t rats_remove_reconnect(rats_t node, const char* host, uint16_t port);
238
239/* — logging (process-global; no node required) — */
240
247
250RATS_API void rats_set_log_file(const char* path);
251
252/* — library info (process-global; no node required) — */
253
255RATS_API const char* rats_version_string(void);
257RATS_API void rats_version(int* major, int* minor, int* patch, int* build);
259RATS_API const char* rats_git_describe(void);
262RATS_API uint32_t rats_abi(void);
263
264/* — utility — */
265
266RATS_API void rats_string_free(char* str);
267
268#ifdef __cplusplus
269}
270#endif
void(* rats_json_cb)(void *user, const char *peer_id_hex, const char *json)
Definition rats.h:171
void rats_string_free(char *str)
rats_error_t rats_on_peer_disconnected(rats_t node, rats_peer_cb cb, void *user)
rats_t rats_create_config(const rats_config_t *config)
Create a node from a full config (NULL → all defaults).
rats_error_t rats_subscribe(rats_t node, const char *topic, rats_topic_cb cb, void *user)
Subscribe to topic; matching messages invoke cb on a reactor thread.
rats_error_t rats_start(rats_t node)
rats_security_t
Definition rats.h:39
@ RATS_SECURITY_NOISE
Definition rats.h:40
@ RATS_SECURITY_PLAINTEXT
Definition rats.h:41
rats_error_t rats_off_json(rats_t node, const char *type)
rats_t rats_create_ex(uint16_t listen_port, int enable_listen, const char *bind_address, rats_security_t security)
Create with basic control.
char * rats_protocol_name(rats_t node)
Application protocol identity bound into the handshake (see rats_config_t).
void rats_version(int *major, int *minor, int *patch, int *build)
Library version components.
void rats_set_log_file(const char *path)
Mirror logs to path (NULL/empty disables file logging).
rats_error_t rats_resume_file(rats_t node, const char *peer_id_hex, uint64_t transfer_id)
void(* rats_peer_cb)(void *user, const char *peer_id_hex)
Definition rats.h:131
rats_error_t rats_broadcast_json(rats_t node, const char *type, const char *json)
rats_error_t rats_accept_file(rats_t node, const char *peer_id_hex, uint64_t transfer_id, const char *dest_path)
Respond to an offer.
rats_error_t rats_enable_json(rats_t node)
Enable the JSON-messaging subsystem (the C view of MessageJson).
rats_error_t rats_unsubscribe(rats_t node, const char *topic)
rats_error_t rats_broadcast(rats_t node, const char *channel, const void *data, size_t len)
int64_t rats_peer_rtt_ms(rats_t node, const char *peer_id_hex)
Last measured round-trip time to a peer in milliseconds, or -1 if unknown (ping not enabled,...
rats_error_t rats_pause_file(rats_t node, const char *peer_id_hex, uint64_t transfer_id)
uint16_t rats_listen_port(rats_t node)
size_t rats_max_peers(rats_t node)
rats_log_level_t
Definition rats.h:241
@ RATS_LOG_ERROR
Definition rats.h:245
@ RATS_LOG_INFO
Definition rats.h:243
@ RATS_LOG_DEBUG
Definition rats.h:242
@ RATS_LOG_WARN
Definition rats.h:244
void(* rats_topic_cb)(void *user, const char *peer_id_hex, const char *topic, const void *data, size_t len)
Definition rats.h:158
rats_error_t rats_on_file_progress(rats_t node, rats_file_progress_cb cb, void *user)
rats_error_t rats_remove_reconnect(rats_t node, const char *host, uint16_t port)
Stop reconnecting to an address and drop it from the store.
rats_error_t rats_on_json(rats_t node, const char *type, rats_json_cb cb, void *user)
Register a handler for JSON messages of type.
rats_error_t rats_send_json(rats_t node, const char *peer_id_hex, const char *type, const char *json)
Send/broadcast a JSON message.
rats_error_t rats_enable_port_mapping(rats_t node, int enable_upnp, int enable_natpmp)
Automatic NAT port forwarding for the listen port (UPnP IGD + NAT-PMP).
rats_error_t rats_on_peer_connected(rats_t node, rats_peer_cb cb, void *user)
void(* rats_file_progress_cb)(void *user, uint64_t transfer_id, const char *peer_id_hex, uint64_t bytes_transferred, uint64_t total_bytes, int status)
Definition rats.h:190
rats_error_t rats_add_reconnect(rats_t node, const char *host, uint16_t port)
Add an address to keep connected (re-dialed on drop).
rats_error_t rats_enable_dht(rats_t node, uint16_t dht_port, const char *discovery_key)
DHT discovery.
rats_error_t rats_on(rats_t node, const char *channel, rats_message_cb cb, void *user)
rats_error_t rats_send(rats_t node, const char *peer_id_hex, const char *channel, const void *data, size_t len)
char ** rats_peer_ids(rats_t node, size_t *count)
Hex ids of currently-connected peers.
rats_error_t rats_once_json(rats_t node, const char *type, rats_json_cb cb, void *user)
Like rats_on_json, but the handler is removed right after it fires once.
rats_t rats_create(uint16_t listen_port)
Create a listening node (Noise, dual-stack, ephemeral identity, port 0 = ephemeral).
rats_config_t rats_config_default(void)
A config pre-filled with the library defaults (listening, Noise, ephemeral identity,...
void * rats_t
Definition rats.h:37
rats_error_t
Definition rats.h:47
@ RATS_ERR_ALREADY_STARTED
Definition rats.h:51
@ RATS_ERR_NO_SUCH_PEER
Definition rats.h:53
@ RATS_OK
Definition rats.h:48
@ RATS_ERR_BIND
Definition rats.h:54
@ RATS_ERR_NOT_STARTED
Definition rats.h:50
@ RATS_ERR_NOT_ENABLED
Definition rats.h:52
@ RATS_ERR_INVALID_ARG
Definition rats.h:49
@ RATS_ERR_INTERNAL
Definition rats.h:55
rats_error_t rats_publish(rats_t node, const char *topic, const void *data, size_t len)
Publish data on topic to every subscribed peer (and local subscribers).
void(* rats_file_offer_cb)(void *user, const char *peer_id_hex, uint64_t transfer_id, const char *name, uint64_t size, int is_directory)
Definition rats.h:188
void(* rats_message_cb)(void *user, const char *peer_id_hex, const void *data, size_t len)
Definition rats.h:132
rats_error_t rats_on_file_offer(rats_t node, rats_file_offer_cb cb, void *user)
const char * rats_version_string(void)
Library version as a static string, e.g.
rats_error_t rats_enable_ping(rats_t node)
Enable periodic ping/pong RTT probing of every peer.
rats_error_t rats_enable_mdns(rats_t node)
Local-network mDNS discovery.
char * rats_local_id(rats_t node)
Our self-certifying peer id as hex.
rats_error_t rats_cancel_file(rats_t node, const char *peer_id_hex, uint64_t transfer_id)
Control a live transfer (either side).
uint32_t rats_abi(void)
Packed ABI id as (major<<16)|(minor<<8)|patch — MAJOR bumps on breaking changes, MINOR on additive on...
rats_error_t rats_enable_pubsub(rats_t node)
Enable the pub/sub (GossipSub) subsystem.
rats_error_t rats_reject_file(rats_t node, const char *peer_id_hex, uint64_t transfer_id)
char * rats_protocol_version(rats_t node)
rats_error_t rats_on_file_complete(rats_t node, rats_file_complete_cb cb, void *user)
const char * rats_error_str(rats_error_t err)
Static human-readable name of an error code (do not free).
rats_error_t rats_enable_file_transfer(rats_t node, const char *temp_dir)
Enable the file-transfer subsystem.
void(* rats_file_complete_cb)(void *user, uint64_t transfer_id, int success, const char *path)
Definition rats.h:192
void rats_stop(rats_t node)
uint64_t rats_send_file(rats_t node, const char *peer_id_hex, const char *path)
Offer a file / directory tree to a peer.
void rats_set_log_level(rats_log_level_t level)
uint64_t rats_send_directory(rats_t node, const char *peer_id_hex, const char *dir_path)
rats_error_t rats_connect(rats_t node, const char *host, uint16_t port)
size_t rats_peer_count(rats_t node)
rats_error_t rats_enable_reconnect(rats_t node)
Enable the reconnection subsystem: re-dials dropped peers with exponential backoff.
const char * rats_git_describe(void)
Git describe of the build, e.g.
void rats_set_max_peers(rats_t node, size_t max_peers)
Cap on established peers (0 = unlimited).
void rats_free_peer_ids(char **ids, size_t count)
void rats_destroy(rats_t node)
Full node configuration.
Definition rats.h:69
const char * protocol_version
Definition rats.h:76
size_t max_peers
Definition rats.h:77
const char * protocol_name
Definition rats.h:75
uint16_t listen_port
Definition rats.h:70
int enable_listen
Definition rats.h:71
rats_security_t security
Definition rats.h:73
const char * bind_address
Definition rats.h:72
const char * data_dir
Definition rats.h:74