1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
//! This library sits at the core of [qaul], providing user //! identities, peer trust management, message sending abstractions, //! and high-level peer discovery mechanisms. //! //! [qaul]: https://qaul.org //! //! Its API (in documentation also called the "service API") enables //! applications to run on decentralised networks, without relying on //! servers to facilitate data exchange. //! //! You can use the libqaul API in two ways: //! //! 1. Require the `libqaul` crate as a dependency, and use the Rust //! API natively. This will result in your application running a //! decentralised router (See `ratman` crate). //! //! 2. Include the `libqaul-sdk` crate as a dependency, which exposes //! the same API as libqaul, but connects to a running daemon via the //! QRPC protocol. //! //! The second method is recommended for most users, as it will allow //! many different applications to use the same routing daemon for //! their tasks. //! //! //! ## Basic architecture //! //! In qaul we make the distinction between a **client** (a //! user-facing entity with some kind of UI), and a **service** (a //! micro-application, exposing an API to clients, and other //! services). //! //! Following is a short overview of a full qaul application stack. //! You can find a more detailed description in the [developer //! manual](https://docs.qaul.org/developer/). //! //! | Component | Description | //! |----------------------|------------------------------------------------------------------------------------------------------------| //! | End-user Application | A UI for users to interact with (either graphical, or textual) | //! | Services | Micro-applications providing very specificy and re-usable functionality to other services and applications | //! | RPC System | (Optional) The QRPC broker and SDK system to connect to an external qaul daemon | //! | libqaul | Core identity, data, and peer management library | //! | Ratman | A decentralised, delay-tolerant, userspace router | //! | Network drivers | Platform-specific network driver plugins for Ratman | //! //! When initialising an instance of libqaul, components need to be //! initialised in reverse-order (network drivers first, user //! application state last). //! //! ## Example //! //! Following is a short example of how to use libqaul directly. For //! examples on how to use the SDK, check out the //! [libqaul-sdk](../libqaul_sdk) documentation! //! //! ```rust,no_run //! # async fn foo() -> libqaul::error::Result<()> { //! # use libqaul::{helpers::ItemDiff, users::UserUpdate}; //! # let router = todo!(); //! use libqaul::Qaul; //! let q = Qaul::new(router); //! //! // Create an anonymous user with a password //! let alice = q.users().create("password alice secret keeps").await?; //! //! // Alice decides she wants to publish her handle //! let update = UserUpdate { handle: ItemDiff::set("@alice"), ..Default::default() }; //! q.users().update(alice, update).await?; //! //! // libqaul will now advertise Alice as `@alice` along side with //! // her cryptographic public key! //! //! # Ok(()) //! # } //! ``` //! //! ## Functionality //! //! libqaul handles user registration, sign-in, authentication, binary //! payload messaging, peer discovery, and management. Some concepts //! are not implemented in libqaul directly (such as message groups, //! or text-payload messages), but instead require a service. //! //! For an overview of services written by the qaul project, check //! [this //! page](https://docs.qaul.org/developer/technical/services.html) in //! the developer manual! #![doc(html_favicon_url = "https://qaul.org/favicon.ico")] #![doc(html_logo_url = "https://qaul.org/img/qaul_icon-128.png")] #![allow(warnings)] #[macro_use] extern crate tracing; // Internally re-export types library pub(crate) use libqaul_types as types; // Internal modules mod auth; mod crypto; mod discover; mod security; mod store; mod utils; // Exposed API modules pub mod api; pub mod contacts; pub mod error; pub mod helpers; pub mod messages; pub mod services; pub mod users; #[cfg(feature = "ffi-java")] pub mod ffi; #[cfg(feature = "rpc")] pub mod rpc; // Core state should be in the root mod qaul; pub use qaul::{Identity, Qaul, QaulRef};