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; /* handshake app id (e.g. "myapp/1.0"); NULL → "librats/1.0" */
76 size_t max_peers; /* established-peer cap; 0 = unlimited */
78
83
87RATS_API rats_t rats_create_config(const rats_config_t* config);
88
90RATS_API rats_t rats_create(uint16_t listen_port);
91
94RATS_API rats_t rats_create_ex(uint16_t listen_port, int enable_listen,
95 const char* bind_address, rats_security_t security);
96
97RATS_API void rats_destroy(rats_t node);
98RATS_API rats_error_t rats_start(rats_t node); /* RATS_OK / RATS_ERR_ALREADY_STARTED / RATS_ERR_BIND */
99RATS_API void rats_stop(rats_t node);
100RATS_API uint16_t rats_listen_port(rats_t node);
101
103RATS_API char* rats_local_id(rats_t node);
104
108RATS_API char* rats_protocol(rats_t node);
109
110/* — connections — */
111
112RATS_API rats_error_t rats_connect(rats_t node, const char* host, uint16_t port);
113RATS_API size_t rats_peer_count(rats_t node);
114
117RATS_API void rats_set_max_peers(rats_t node, size_t max_peers);
118RATS_API size_t rats_max_peers(rats_t node);
119
120/* — messaging (named application channel, raw bytes) — */
121
122RATS_API rats_error_t rats_send(rats_t node, const char* peer_id_hex,
123 const char* channel, const void* data, size_t len);
124RATS_API rats_error_t rats_broadcast(rats_t node, const char* channel,
125 const void* data, size_t len);
126
127/* — callbacks (register before start; invoked on a reactor thread) — */
128
129typedef void (*rats_peer_cb)(void* user, const char* peer_id_hex);
130typedef void (*rats_message_cb)(void* user, const char* peer_id_hex, const void* data, size_t len);
131
134RATS_API rats_error_t rats_on(rats_t node, const char* channel, rats_message_cb cb, void* user);
135
136/* — optional subsystems (enable before start) — */
137
140RATS_API rats_error_t rats_enable_dht(rats_t node, uint16_t dht_port, const char* discovery_key);
145RATS_API rats_error_t rats_enable_port_mapping(rats_t node, int enable_upnp, int enable_natpmp);
146
147/* — peer enumeration — */
148
152RATS_API char** rats_peer_ids(rats_t node, size_t* count);
153RATS_API void rats_free_peer_ids(char** ids, size_t count);
154
155/* — pub/sub (topic-based, raw bytes; enable + subscribe before start) — */
156
157typedef void (*rats_topic_cb)(void* user, const char* peer_id_hex,
158 const char* topic, const void* data, size_t len);
159
163RATS_API rats_error_t rats_subscribe(rats_t node, const char* topic, rats_topic_cb cb, void* user);
164RATS_API rats_error_t rats_unsubscribe(rats_t node, const char* topic);
166RATS_API rats_error_t rats_publish(rats_t node, const char* topic, const void* data, size_t len);
167
168/* — typed JSON messaging (named message type; payload is JSON text) — */
169
170typedef void (*rats_json_cb)(void* user, const char* peer_id_hex, const char* json);
171
177RATS_API rats_error_t rats_on_json(rats_t node, const char* type, rats_json_cb cb, void* user);
179RATS_API rats_error_t rats_once_json(rats_t node, const char* type, rats_json_cb cb, void* user);
180RATS_API rats_error_t rats_off_json(rats_t node, const char* type);
182RATS_API rats_error_t rats_send_json(rats_t node, const char* peer_id_hex, const char* type, const char* json);
183RATS_API rats_error_t rats_broadcast_json(rats_t node, const char* type, const char* json);
184
185/* — file transfer (push model; enable + register callbacks before start) — */
186
187typedef void (*rats_file_offer_cb)(void* user, const char* peer_id_hex, uint64_t transfer_id,
188 const char* name, uint64_t size, int is_directory);
189typedef void (*rats_file_progress_cb)(void* user, uint64_t transfer_id, const char* peer_id_hex,
190 uint64_t bytes_transferred, uint64_t total_bytes, int status);
191typedef void (*rats_file_complete_cb)(void* user, uint64_t transfer_id, int success, const char* path);
192
195RATS_API rats_error_t rats_enable_file_transfer(rats_t node, const char* temp_dir);
196
200
203RATS_API uint64_t rats_send_file(rats_t node, const char* peer_id_hex, const char* path);
204RATS_API uint64_t rats_send_directory(rats_t node, const char* peer_id_hex, const char* dir_path);
205
208RATS_API rats_error_t rats_accept_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id, const char* dest_path);
209RATS_API rats_error_t rats_reject_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
210
213RATS_API rats_error_t rats_cancel_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
214RATS_API rats_error_t rats_pause_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
215RATS_API rats_error_t rats_resume_file(rats_t node, const char* peer_id_hex, uint64_t transfer_id);
216
217/* — liveness (RTT probing) — */
218
223RATS_API int64_t rats_peer_rtt_ms(rats_t node, const char* peer_id_hex);
224
225/* — automatic reconnection — */
226
234RATS_API rats_error_t rats_add_reconnect(rats_t node, const char* host, uint16_t port);
236RATS_API rats_error_t rats_remove_reconnect(rats_t node, const char* host, uint16_t port);
237
238/* — BitTorrent —
239 * Only functional when the library is built with RATS_SEARCH_FEATURES; the calls
240 * otherwise return RATS_ERR_NOT_ENABLED. The client keeps its own transport and,
241 * when DHT is enabled on the node first, shares it. Enable before start(). */
242
245RATS_API rats_error_t rats_enable_bittorrent(rats_t node, uint16_t listen_port, const char* download_path);
247RATS_API rats_error_t rats_bt_add_magnet(rats_t node, const char* magnet_uri, const char* save_path);
249RATS_API rats_error_t rats_bt_add_torrent_file(rats_t node, const char* torrent_path, const char* save_path);
251RATS_API rats_error_t rats_bt_remove_torrent(rats_t node, const char* info_hash_hex);
252
253/* — logging (process-global; no node required) — */
254
261
264RATS_API void rats_set_log_file(const char* path);
265
266/* — library info (process-global; no node required) — */
267
269RATS_API const char* rats_version_string(void);
271RATS_API void rats_version(int* major, int* minor, int* patch, int* build);
273RATS_API const char* rats_git_describe(void);
276RATS_API uint32_t rats_abi(void);
277
278/* — utility — */
279
280RATS_API void rats_string_free(char* str);
281
282#ifdef __cplusplus
283}
284#endif
void(* rats_json_cb)(void *user, const char *peer_id_hex, const char *json)
Definition rats.h:170
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.
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).
char * rats_protocol(rats_t node)
Application protocol identity bound into the handshake (see rats_config_t).
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:129
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:255
@ RATS_LOG_ERROR
Definition rats.h:259
@ RATS_LOG_INFO
Definition rats.h:257
@ RATS_LOG_DEBUG
Definition rats.h:256
@ RATS_LOG_WARN
Definition rats.h:258
void(* rats_topic_cb)(void *user, const char *peer_id_hex, const char *topic, const void *data, size_t len)
Definition rats.h:157
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:189
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:187
void(* rats_message_cb)(void *user, const char *peer_id_hex, const void *data, size_t len)
Definition rats.h:130
rats_error_t rats_on_file_offer(rats_t node, rats_file_offer_cb cb, void *user)
rats_error_t rats_bt_add_magnet(rats_t node, const char *magnet_uri, const char *save_path)
Start downloading a magnet link (metadata is fetched from peers).
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)
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_bittorrent(rats_t node, uint16_t listen_port, const char *download_path)
Enable BitTorrent.
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:191
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)
rats_error_t rats_bt_add_torrent_file(rats_t node, const char *torrent_path, const char *save_path)
Start a torrent from a .torrent file on disk.
rats_error_t rats_bt_remove_torrent(rats_t node, const char *info_hash_hex)
Remove a torrent by its 40-char hex info-hash (downloaded files are kept).
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
size_t max_peers
Definition rats.h:76
const char * protocol
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