91d0bab23e
When the user wants to shutdown the application, we should: - Interrupt all current `SqlInterruptScope`s - Interrupt all future `SqlInterruptScope`s when they're created. The nice thing about this approach is that it didn't require invasive changes in places to support it. The main new requirement was we need to have a way to get a `Weak<AsRef<SqlInterruptHandler>>` for each database. In order to support that, I needed to: - For the read/write and read-only connections: have `PlacesConnection` store an `SqlInterruptHandler` and implement `AsRef`. - For the sync connection: Added struct that wraps the `Mutex<PlacesDb>` and also stores a `SqlInterruptHandler` and implements `AsRef`. Updated `places-utils` so that ctrl-c starts shutdown mode. |
||
---|---|---|
.cargo | ||
.circleci | ||
.github | ||
.vscode | ||
automation | ||
build-scripts | ||
components | ||
docs | ||
examples | ||
gradle/wrapper | ||
libs | ||
megazords | ||
taskcluster | ||
testing | ||
tools | ||
xcconfig | ||
.buildconfig-android.yml | ||
.cron.yml | ||
.detekt.yml | ||
.gitignore | ||
.gitmodules | ||
.mergify.yml | ||
.swiftlint.yml | ||
.taskcluster.yml | ||
CHANGELOG.md | ||
CHANGES_UNRELEASED.md | ||
CODE_OF_CONDUCT.md | ||
COPYRIGHT | ||
Cargo.lock | ||
Cargo.toml | ||
Cartfile | ||
Cartfile.resolved | ||
DEPENDENCIES.md | ||
LICENSE | ||
README.md | ||
build-carthage.sh | ||
build.gradle | ||
clippy.toml | ||
codecov.yml | ||
gradle.properties | ||
gradlew | ||
gradlew.bat | ||
proguard-rules-consumer-jna.pro | ||
publish.gradle | ||
rust-toolchain | ||
settings.gradle |
README.md
Firefox Application Services
Application Services (a-s) is a collection of Rust Components that are used to enable Firefox applications to integrate with Firefox accounts, sync, experimentation, etc. Each component is built using a core of shared code written in Rust, wrapped with native language bindings for different platforms.
Contributing
To contribute, please review the Mozilla Community Participation Guidelines and then visit our how to contribute guide.
Contact
Get in touch with other community members on Matrix, or through issues here on GitHub.
- Matrix: #rust-components:mozilla.org (How to connect)
Documentation
High-level docs
The Application Services Book contains high-level documentation about the code in this repository. It's built from the ./docs/ directory.
Package docs
We use rustdoc to document both the public API of the components and the various internal implementation details. View them on https://mozilla.github.io/application-services/book/rust-docs/fxa_client/index.html. Once you have completed the build steps, you can view the docs by running:
cargo doc --no-deps --document-private-items --open
Building
Building the Rust Components
- Clone or Download the repository:
$ git clone https://github.com/mozilla/application-services # (or use the ssh link)
$ cd application-services
$ git submodule init
$ git submodule update --recursive
- Follow these instructions to install your system-level dependencies
- Run the a-s Rust unit tests
cargo test
Consumer build, integration and testing
The application-services library primary consumers are Fenix (Firefox on Android) and Firefox iOS. Assure you are able to run integration tests (for Android and iOS if using MacOS) by following the instructions to build for Android and iOS integrations.
Android integration builds and helpful tools
- Build instructions to test Fenix / android-components integration
- Fenix Auto-publication workflow for android-components and application-services
Firefox for iOS integration
- Build instructions to test Firefox iOS integration
- Using local components in iOS
Firefox Desktop
- Build instructions to test Firefox Desktop integration
Rust Components
./components/ contains the source for each component, and its FFI bindings.
Please note that we are in the process of moving away from hand-written ffi code and instead favouring the use of the uniffi library.
- See ./components/push/ for an example, where you can
find:
- The shared rust code.
- The mapping into a C FFI.
- The Kotlin bindings for use by Android applications.
- The Swift bindings for use by iOS applications.
- See ./components/fxa-client for an example that uses uniffi to generate API wrappers for multiple languages, such as Kotlin and Swift.
List of components
- autofill - for storage and syncing of credit card and address information
- crashtest - testing-purposes (crashing the Rust code)
- fxa-client - for applications that need to sign in with FxA, access encryption keys for sync, and more.
- logins - for storage and syncing of a user's saved login credentials
- nimbus - for integrating with Mozilla's experimentation platform for Firefox
- places - for storage and syncing of a user's saved browsing history
- push - for applications to receive real-time updates via WebPush
- rc_log - for connecting component log output to the application's log stream
- support - low-level utility libraries
- support/rc_crypto - handles cryptographic needs backed by Mozilla's NSS library
- support/sql - utilities for storing data locally with SQL
- sync15 - shared library for accessing data in Firefox Sync
- sync_manager - integrates multiple sync engines/ stores into a single framework
- tabs - an in-memory syncing engine for remote browser tabs
- viaduct - an HTTP request library
- webext-storage - powers an implementation of the chrome.storage.sync WebExtension API