anki/rslib/Cargo.toml
Damien Elmes cf45cbf429
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.

Documentation is available here: <https://docs.ankiweb.net/sync-server.html>

In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:

- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.

To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.

The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 12:43:46 +10:00

110 lines
2.9 KiB
TOML

[package]
name = "anki"
build = "build/main.rs"
publish = false
description = "Anki's Rust library code"
version.workspace = true
authors.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
[lib]
name = "anki"
path = "src/lib.rs"
[features]
bench = ["criterion"]
rustls = ["reqwest/rustls-tls", "reqwest/rustls-tls-native-roots"]
native-tls = ["reqwest/native-tls"]
[[bench]]
name = "benchmark"
harness = false
required-features = ["bench"]
# After updating anything below, run ../cargo/update.py
[build-dependencies]
prost-build = "0.11.4"
which = "4.3.0"
[dev-dependencies]
async-stream = "0.3.3"
env_logger = "0.10.0"
wiremock = "0.5.17"
[dependencies.reqwest]
version = "0.11.13"
default-features = false
features = ["json", "socks", "stream", "multipart"]
[dependencies]
anki_i18n = { path = "i18n" }
ascii_percent_encoding = { path = "ascii_percent_encoding" }
csv = { git = "https://github.com/ankitects/rust-csv.git", rev = "1c9d3aab6f79a7d815c69f925a46a4590c115f90" }
# pinned as any changes could invalidate sqlite indexes
unicase = "=2.6.0"
criterion = { version = "0.4.0", optional = true }
ammonia = "3.3.0"
async-compression = { version = "0.3.15", features = ["zstd", "tokio"] }
async-trait = "0.1.59"
axum = { version = "0.6.1", features = ["multipart", "macros", "headers"] }
axum-client-ip = "0.3.1"
blake3 = "1.3.3"
bytes = "1.3.0"
chrono = { version = "0.4.19", default-features = false, features = ["std", "clock"] }
coarsetime = "0.1.22"
convert_case = "0.6.0"
difflib = "0.4.0"
flate2 = "1.0.25"
fluent = "0.16.0"
fluent-bundle = "0.15.2"
fnv = "1.0.7"
futures = "0.3.25"
hex = "0.4.3"
htmlescape = "0.3.1"
hyper = "0.14.23"
id_tree = "1.8.0"
itertools = "0.10.5"
lazy_static = "1.4.0"
nom = "7.1.1"
num-integer = "0.1.45"
num_cpus = "1.14.0"
num_enum = "0.5.7"
once_cell = "1.16.0"
pin-project = "1.0.12"
prost = "0.11.3"
pulldown-cmark = "0.9.2"
rand = "0.8.5"
regex = "1.7.0"
rusqlite = { version = "0.28.0", features = ["trace", "functions", "collation", "bundled"] }
scopeguard = "1.1.0"
serde = "1.0.148"
serde-aux = "4.1.2"
serde_derive = "1.0.148"
serde_json = "1.0.89"
serde_repr = "0.1.9"
serde_tuple = "0.5.0"
sha1 = "0.10.5"
snafu = { version = "0.7.3", features = ["backtraces"] }
strum = { version = "0.24.1", features = ["derive"] }
tempfile = "3.3.0"
tokio = { version = "1.23", features = ["fs", "rt-multi-thread", "macros"] }
tokio-util = { version = "0.7.4", features = ["io"] }
tower-http = { version = "0.3.5", features = ["trace"] }
tracing = { version = "0.1.37", features = ["max_level_trace", "release_max_level_debug"] }
tracing-appender = "0.2.2"
tracing-subscriber = { version = "0.3.16", features = ["fmt", "env-filter"] }
unic-ucd-category = "0.9.0"
unicode-normalization = "0.1.22"
utime = "0.3.1"
workspace-hack = { version = "0.1", path = "../tools/workspace-hack" }
zip = { version = "0.6.3", default-features = false, features = ["deflate", "time"] }
zstd = { version = "0.12.0", features = ["zstdmt"] }