Radix Relay
Hybrid mesh communications with Signal Protocol encryption
Loading...
Searching...
No Matches
signal_bridge.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <cstdint>
5#include <filesystem>
6#include <rust/cxx.h>
7#include <signal_bridge_cxx/lib.h>
8#include <signal_types/signal_types.hpp>
9#include <string>
10#include <vector>
11
13
20class bridge
21{
22public:
28 explicit bridge(const std::filesystem::path &bridge_db)
29 : bridge_(radix_relay::new_signal_bridge(bridge_db.string().c_str()))
30 {}
31
37 explicit bridge(rust::Box<SignalBridge> signal_bridge) : bridge_(std::move(signal_bridge)) {}
38
39 bridge(const bridge &) = delete;
40 auto operator=(const bridge &) -> bridge & = delete;
41 bridge(bridge &&) = default;
42 auto operator=(bridge &&) -> bridge & = default;
43 ~bridge() = default;
44
50 [[nodiscard]] auto get_node_fingerprint() const -> std::string;
51
57 [[nodiscard]] auto list_contacts() const -> std::vector<core::contact_info>;
58
66 [[nodiscard]] auto encrypt_message(const std::string &rdx, const std::vector<uint8_t> &bytes) const
67 -> std::vector<uint8_t>;
68
76 [[nodiscard]] auto decrypt_message(const std::string &rdx, const std::vector<uint8_t> &bytes) const
77 -> decryption_result;
78
86 [[nodiscard]] auto add_contact_and_establish_session_from_base64(const std::string &bundle,
87 const std::string &alias) const -> std::string;
88
95 [[nodiscard]] auto extract_rdx_from_bundle_base64(const std::string &bundle_base64) const -> std::string;
96
103 [[nodiscard]] auto generate_prekey_bundle_announcement(const std::string &version) const -> bundle_info;
104
111 [[nodiscard]] auto generate_empty_bundle_announcement(const std::string &version) const -> std::string;
112
119 auto assign_contact_alias(const std::string &rdx, const std::string &alias) const -> void;
120
130 [[nodiscard]] auto create_and_sign_encrypted_message(const std::string &rdx,
131 const std::string &content,
132 uint32_t timestamp,
133 const std::string &version) const -> std::string;
134
142 [[nodiscard]] auto lookup_contact(const std::string &alias) const -> core::contact_info;
143
150 [[nodiscard]] auto sign_nostr_event(const std::string &event_json) const -> std::string;
151
159 [[nodiscard]] auto create_subscription_for_self(const std::string &subscription_id,
160 std::uint64_t since_timestamp = 0) const -> std::string;
161
167 auto update_last_message_timestamp(std::uint64_t timestamp) const -> void;
168
174 [[nodiscard]] auto perform_key_maintenance() const -> key_maintenance_result;
175
183 auto record_published_bundle(std::uint32_t pre_key_id,
184 std::uint32_t signed_pre_key_id,
185 std::uint32_t kyber_pre_key_id) const -> void;
186
193 [[nodiscard]] auto get_conversations(bool include_archived) const -> std::vector<conversation>;
194
203 [[nodiscard]] auto get_conversation_messages(const std::string &rdx_fingerprint,
204 std::uint32_t limit,
205 std::uint32_t offset) const -> std::vector<stored_message>;
206
212 auto mark_conversation_read(const std::string &rdx_fingerprint) const -> void;
213
219 auto delete_message(std::int64_t message_id) const -> void;
220
226 auto delete_conversation(const std::string &rdx_fingerprint) const -> void;
227
234 [[nodiscard]] auto get_unread_count(const std::string &rdx_fingerprint) const -> std::uint32_t;
235
236private:
237 mutable rust::Box<SignalBridge> bridge_;
238};
239
240
241}// namespace radix_relay::signal
C++ wrapper for the Rust Signal Protocol implementation.
auto get_conversations(bool include_archived) const -> std::vector< conversation >
Retrieves all conversations ordered by most recent message.
auto get_conversation_messages(const std::string &rdx_fingerprint, std::uint32_t limit, std::uint32_t offset) const -> std::vector< stored_message >
Retrieves messages from a conversation with pagination.
auto delete_message(std::int64_t message_id) const -> void
Deletes a specific message from history.
auto update_last_message_timestamp(std::uint64_t timestamp) const -> void
Updates the timestamp of the last received message.
auto get_node_fingerprint() const -> std::string
Returns this node's RDX fingerprint.
bridge(rust::Box< SignalBridge > signal_bridge)
Constructs a Signal bridge from existing Rust implementation.
auto perform_key_maintenance() const -> key_maintenance_result
Performs periodic key maintenance and rotation.
auto extract_rdx_from_bundle_base64(const std::string &bundle_base64) const -> std::string
Extracts RDX fingerprint from a prekey bundle.
bridge(const bridge &)=delete
auto operator=(const bridge &) -> bridge &=delete
auto decrypt_message(const std::string &rdx, const std::vector< uint8_t > &bytes) const -> decryption_result
Decrypts an incoming message.
bridge(bridge &&)=default
auto lookup_contact(const std::string &alias) const -> core::contact_info
Looks up a contact by RDX fingerprint or alias.
auto sign_nostr_event(const std::string &event_json) const -> std::string
Signs a Nostr event with node's private key.
auto generate_prekey_bundle_announcement(const std::string &version) const -> bundle_info
Generates a signed prekey bundle announcement.
auto delete_conversation(const std::string &rdx_fingerprint) const -> void
Deletes an entire conversation and all its messages.
auto get_unread_count(const std::string &rdx_fingerprint) const -> std::uint32_t
Gets the number of unread messages in a conversation.
auto create_and_sign_encrypted_message(const std::string &rdx, const std::string &content, uint32_t timestamp, const std::string &version) const -> std::string
Creates and signs a Nostr encrypted message event.
auto add_contact_and_establish_session_from_base64(const std::string &bundle, const std::string &alias) const -> std::string
Establishes a session from a prekey bundle.
auto mark_conversation_read(const std::string &rdx_fingerprint) const -> void
Marks all messages in a conversation as read.
auto list_contacts() const -> std::vector< core::contact_info >
Lists all known contacts.
bridge(const std::filesystem::path &bridge_db)
Constructs a Signal bridge with database path.
auto operator=(bridge &&) -> bridge &=default
auto record_published_bundle(std::uint32_t pre_key_id, std::uint32_t signed_pre_key_id, std::uint32_t kyber_pre_key_id) const -> void
Records published prekey bundle to track used keys.
auto create_subscription_for_self(const std::string &subscription_id, std::uint64_t since_timestamp=0) const -> std::string
Creates a Nostr subscription filter for messages to this node.
auto assign_contact_alias(const std::string &rdx, const std::string &alias) const -> void
Assigns an alias to a contact.
auto encrypt_message(const std::string &rdx, const std::vector< uint8_t > &bytes) const -> std::vector< uint8_t >
Encrypts a message for a peer.
auto generate_empty_bundle_announcement(const std::string &version) const -> std::string
Generates an empty bundle announcement for unpublishing.