Information about developing the project. If you are only interested in using it, you can safely ignore this page. If you plan on contributing, see the contributor's guide and code style guide.
Continuwuity uses a collection of sub-crates, packages, or workspace members
that indicate what each general area of code is for. All of the workspace
members are under src/. The workspace definition is at the top level / root
Cargo.toml.
The crate names are generally self-explanatory:
admin is the admin roomapi is the HTTP API, Matrix C-S and S-S endpoints, etccore is core Continuwuity functionality like config loading, error definitions,
global utilities, logging infrastructure, etcdatabase is RocksDB methods, helpers, RocksDB config, and general database definitions,
utilities, or functionsmacros are Continuwuity Rust macros like general helper macros, logging
and error handling macros, and syn and procedural macros
used for admin room commands and othersmain is the "primary" sub-crate. This is where the main() function lives,
tokio worker and async initialisation, Sentry initialisation, clap init,
and signal handling. If you are adding new Rust features, they must
go here.router is the webserver and request handling bits, using axum, tower, tower-http,
hyper, etc, and the global server state to access services.service is the high-level database definitions and functions for data,
outbound/sending code, and other business logic such as media fetching.It is highly unlikely you will ever need to add a new workspace member, but if you truly find yourself needing to, we recommend reaching out to us in the Matrix room for discussions about it beforehand.
The primary inspiration for this design was apart of hot reloadable development,
to support "Continuwuity as a library" where specific parts can simply be swapped out.
There is evidence Conduit wanted to go this route too as axum is technically an
optional feature in Conduit, and can be compiled without the binary or axum library
for handling inbound web requests; but it was never completed or worked.
See the Rust documentation on Workspaces for general questions and information on Cargo workspaces.
If you'd like to add a compile-time feature, you must first define it in
the main workspace crate located in src/main/Cargo.toml. The feature must
enable a feature in the other workspace crate(s) you intend to use it in. Then
the said workspace crate(s) must define the feature there in its Cargo.toml.
So, if this is adding a feature to the API such as woof, you define the feature
in the api crate's Cargo.toml as woof = []. The feature definition in main's
Cargo.toml will be woof = ["conduwuit-api/woof"].
The rationale for this is due to Rust / Cargo not supporting "workspace level features", we must make a choice of; either scattering features all over the workspace crates, making it difficult for anyone to add or remove default features; or define all the features in one central workspace crate that propagate down/up to the other workspace crates. It is a Cargo pitfall, and we'd like to see better developer UX in Rust's Workspaces.
Additionally, the definition of one single place makes "feature collection" in our
Nix flake a million times easier instead of collecting and deduping them all from
searching in all the workspace crates' Cargo.tomls. Though we wouldn't need to
do this if Rust supported workspace-level features to begin with.
During Continuwuity (and prior projects) development, we have had to fork some dependencies to support our use-cases. These forks exist for various reasons including features that upstream projects won't accept, faster-paced development, Continuwuity-specific usecases, or lack of time to upstream changes.
All forked dependencies are maintained under the continuwuation organization on Forgejo:
@zaidoon1 with liburing build fixes and GCC debug build fixesCTRL+\ signal quit event for Continuwuity console CLIgtest include, and using our RocksDB and jemallocator forksClone for EnvFilter to
support dynamically changing tracing environmentstokio-consoletokio-console can be a useful tool for debugging and profiling. To make a
tokio-console-enabled build of Continuwuity, enable the tokio_console feature,
disable the default release_max_log_level feature, and set the --cfg tokio_unstable flag to enable experimental tokio APIs. A build might look like
this:
You will also need to enable the tokio_console config option in Continuwuity when
starting it. This was due to tokio-console causing gradual memory leak/usage
if left enabled.
To build a Docker image for Continuwuity, use the standard Docker build command:
The image can be cross-compiled for different architectures.