2020-11-12 08:41:47 +01:00
[
2022-10-21 10:02:12 +02:00
{
"name" : "addr2line" ,
2023-08-23 03:41:30 +02:00
"version" : "0.21.0" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/addr2line" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A cross-platform symbolication library written in Rust, using `gimli`"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "adler" ,
2021-03-07 10:04:34 +01:00
"version" : "1.0.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jonas Schievink <jonasschievink@gmail.com>" ,
"repository" : "https://github.com/jonas-schievink/adler.git" ,
2020-12-15 08:10:25 +01:00
"license" : "0BSD OR Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A simple clean-room implementation of the Adler-32 checksum"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "aes" ,
"version" : "0.8.3" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/block-ciphers" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of the Advanced Encryption Standard (a.k.a. Rijndael)"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ahash" ,
2023-11-27 03:23:56 +01:00
"version" : "0.8.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tom Kaitchuck <Tom.Kaitchuck@gmail.com>" ,
"repository" : "https://github.com/tkaitchuck/ahash" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A non-cryptographic hash function using AES-NI for high performance"
} ,
{
"name" : "aho-corasick" ,
2023-10-25 01:28:10 +02:00
"version" : "1.1.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/aho-corasick" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fast multiple substring searching."
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "allocator-api2" ,
2023-08-23 03:41:30 +02:00
"version" : "0.2.16" ,
2023-07-01 10:26:43 +02:00
"authors" : "Zakarum <zaq.dev@icloud.com>" ,
"repository" : "https://github.com/zakarumych/allocator-api2" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Mirror of Rust's allocator API"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "ammonia" ,
2022-12-07 08:00:14 +01:00
"version" : "3.3.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Michael Howell <michael@notriddle.com>" ,
"repository" : "https://github.com/rust-ammonia/ammonia" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HTML Sanitization"
} ,
2023-06-16 03:43:12 +02:00
{
"name" : "android-tzdata" ,
"version" : "0.1.1" ,
"authors" : "RumovZ" ,
"repository" : "https://github.com/RumovZ/android-tzdata" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Parser for the Android-specific tzdata file"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "android_system_properties" ,
"version" : "0.1.5" ,
"authors" : "Nicolas Silva <nical@fastmail.com>" ,
"repository" : "https://github.com/nical/android_system_properties" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Minimal Android system properties wrapper"
} ,
2020-11-24 09:41:03 +01:00
{
"name" : "anki" ,
"version" : "0.0.0" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
2020-11-24 09:41:03 +01:00
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Anki's Rust library code"
} ,
2021-03-26 00:40:41 +01:00
{
"name" : "anki_i18n" ,
"version" : "0.0.0" ,
2022-12-07 08:00:14 +01:00
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
2021-03-26 00:40:41 +01:00
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Anki's Rust library i18n code"
} ,
2023-06-16 03:43:12 +02:00
{
"name" : "anki_io" ,
"version" : "0.0.0" ,
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Utils for better I/O error reporting"
} ,
{
"name" : "anki_proto" ,
"version" : "0.0.0" ,
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Anki's Rust library protobuf code"
} ,
2023-06-22 01:38:05 +02:00
{
"name" : "anki_proto_gen" ,
"version" : "0.0.0" ,
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Helpers for interface code generation"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "anyhow" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.75" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/anyhow" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Flexible concrete Error type built on std::error::Error"
} ,
{
"name" : "arrayref" ,
2023-04-12 00:25:42 +02:00
"version" : "0.3.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Roundy <roundyd@physics.oregonstate.edu>" ,
"repository" : "https://github.com/droundy/arrayref" ,
"license" : "BSD-2-Clause" ,
"license_file" : null ,
"description" : "Macros to take array references of slices"
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "arrayvec" ,
2023-07-01 10:26:43 +02:00
"version" : "0.7.4" ,
2021-10-02 12:42:03 +02:00
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/arrayvec" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A vector with fixed capacity, backed by an array (it can be stored on the stack too). Implements fixed capacity ArrayVec and ArrayString."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "ash" ,
"version" : "0.37.3+1.3.251" ,
"authors" : "Maik Klein <maikklein@googlemail.com>|Benjamin Saunders <ben.e.saunders@gmail.com>|Marijn Suijten <marijn@traverseresearch.nl>" ,
"repository" : "https://github.com/MaikKlein/ash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Vulkan bindings for Rust"
} ,
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 03:43:46 +01:00
{
"name" : "assert-json-diff" ,
"version" : "2.0.2" ,
"authors" : "David Pedersen <david.pdrsn@gmail.com>" ,
"repository" : "https://github.com/davidpdrsn/assert-json-diff.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Easily compare two JSON values and get great output"
} ,
{
"name" : "async-channel" ,
2023-08-23 03:41:30 +02:00
"version" : "1.9.0" ,
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 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/async-channel" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Async multi-producer multi-consumer channel"
} ,
{
"name" : "async-compression" ,
2023-11-27 03:23:56 +01:00
"version" : "0.4.5" ,
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 03:43:46 +01:00
"authors" : "Wim Looman <wim@nemo157.com>|Allen Bui <fairingrey@gmail.com>" ,
2023-07-01 10:26:43 +02:00
"repository" : "https://github.com/Nullus157/async-compression" ,
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 03:43:46 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Adaptors between compression crates and Rust's modern asynchronous IO types."
} ,
{
"name" : "async-stream" ,
2023-06-23 05:02:23 +02:00
"version" : "0.3.5" ,
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 03:43:46 +01:00
"authors" : "Carl Lerche <me@carllerche.com>" ,
"repository" : "https://github.com/tokio-rs/async-stream" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Asynchronous streams using async & await notation"
} ,
{
"name" : "async-stream-impl" ,
2023-06-23 05:02:23 +02:00
"version" : "0.3.5" ,
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 03:43:46 +01:00
"authors" : "Carl Lerche <me@carllerche.com>" ,
"repository" : "https://github.com/tokio-rs/async-stream" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "proc macros for async-stream crate"
} ,
2021-01-05 10:58:53 +01:00
{
"name" : "async-trait" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.74" ,
2021-01-05 10:58:53 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/async-trait" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Type erasure for async trait methods"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "autocfg" ,
2022-02-25 07:30:59 +01:00
"version" : "1.1.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Josh Stone <cuviper@gmail.com>" ,
"repository" : "https://github.com/cuviper/autocfg" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Automatic cfg for Rust compiler features"
} ,
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 03:43:46 +01:00
{
"name" : "axum" ,
2023-08-23 03:41:30 +02:00
"version" : "0.6.20" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Web framework that focuses on ergonomics and modularity"
} ,
{
"name" : "axum-client-ip" ,
2023-09-28 01:53:48 +02:00
"version" : "0.4.2" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/imbolc/axum-client-ip" ,
"license" : "MIT" ,
"license_file" : null ,
2023-07-01 10:26:43 +02:00
"description" : "Client IP address extractors for Axum"
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 03:43:46 +01:00
} ,
{
"name" : "axum-core" ,
2023-07-01 10:26:43 +02:00
"version" : "0.3.4" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Core types and traits for axum"
} ,
{
"name" : "axum-macros" ,
2023-08-23 03:41:30 +02:00
"version" : "0.3.8" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macros for axum"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "backtrace" ,
2023-08-23 03:41:30 +02:00
"version" : "0.3.69" ,
2022-10-21 10:02:12 +02:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/backtrace-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A library to acquire a stack trace (backtrace) at runtime in a Rust program."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "base64" ,
2022-12-07 08:00:14 +01:00
"version" : "0.13.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alice Maz <alice@alicemaz.com>|Marshall Pierce <marshall@mpierce.org>" ,
"repository" : "https://github.com/marshallpierce/rust-base64" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "encodes and decodes base64 as bytes or utf8"
} ,
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 03:43:46 +01:00
{
"name" : "base64" ,
2023-10-25 01:28:10 +02:00
"version" : "0.21.5" ,
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 03:43:46 +01:00
"authors" : "Alice Maz <alice@alicemaz.com>|Marshall Pierce <marshall@mpierce.org>" ,
"repository" : "https://github.com/marshallpierce/rust-base64" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "encodes and decodes base64 as bytes or utf8"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "base64ct" ,
"version" : "1.6.0" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/formats/tree/master/base64ct" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of Base64 (RFC 4648) which avoids any usages of data-dependent branches/LUTs and thereby provides portable \"best effort\" constant-time operation and embedded-friendly no_std support"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "bincode" ,
"version" : "2.0.0-rc.3" ,
"authors" : "Ty Overby <ty@pre-alpha.com>|Zoey Riordan <zoey@dos.cafe>|Victor Koenders <bincode@trangar.com>" ,
"repository" : "https://github.com/bincode-org/bincode" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A binary serialization / deserialization strategy for transforming structs into bytes and vice versa!"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "bit-set" ,
"version" : "0.5.3" ,
"authors" : "Alexis Beingessner <a.beingessner@gmail.com>" ,
"repository" : "https://github.com/contain-rs/bit-set" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A set of bits"
} ,
{
"name" : "bit-vec" ,
"version" : "0.6.3" ,
"authors" : "Alexis Beingessner <a.beingessner@gmail.com>" ,
"repository" : "https://github.com/contain-rs/bit-vec" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A vector of bits"
} ,
{
"name" : "bit_field" ,
"version" : "0.10.2" ,
"authors" : "Philipp Oppermann <dev@phil-opp.com>" ,
"repository" : "https://github.com/phil-opp/rust-bit-field" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Simple bit field trait providing get_bit, get_bits, set_bit, and set_bits methods for Rust's integral types."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "bitflags" ,
2021-10-02 12:42:03 +02:00
"version" : "1.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/bitflags/bitflags" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro to generate structures which behave like bitflags."
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "bitflags" ,
2023-10-25 01:28:10 +02:00
"version" : "2.4.1" ,
2023-04-12 00:25:42 +02:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/bitflags/bitflags" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A macro to generate structures which behave like bitflags."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "blake3" ,
2023-09-28 01:53:48 +02:00
"version" : "1.5.0" ,
2022-01-15 05:59:43 +01:00
"authors" : "Jack O'Connor <oconnor663@gmail.com>|Samuel Neves" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/BLAKE3-team/BLAKE3" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR CC0-1.0" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "the BLAKE3 hash function"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "block" ,
"version" : "0.1.6" ,
"authors" : "Steven Sheldon" ,
"repository" : "http://github.com/SSheldon/rust-block" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Rust interface for Apple's C language extension of blocks."
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "block-buffer" ,
2023-04-12 00:25:42 +02:00
"version" : "0.10.4" ,
2022-01-15 05:59:43 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Buffer type for block processing of data"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "block-padding" ,
"version" : "0.3.3" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Padding and unpadding of messages divided into blocks."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "bumpalo" ,
2023-09-28 01:53:48 +02:00
"version" : "3.14.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Nick Fitzgerald <fitzgen@gmail.com>" ,
"repository" : "https://github.com/fitzgen/bumpalo" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A fast bump allocation arena for Rust."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "burn" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Flexible and Comprehensive Deep Learning Framework in Rust"
} ,
{
"name" : "burn-autodiff" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-autodiff" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Automatic differentiation backend for the Burn framework"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "burn-candle" ,
"version" : "0.11.1" ,
"authors" : "louisfd <louisfd94@gmail.com>" ,
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-candle" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Candle backend for the Burn framework"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "burn-common" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "Dilshod Tadjibaev (@antimora)" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-common" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Common crate for the Burn framework"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "burn-compute" ,
"version" : "0.11.1" ,
"authors" : "louisfd <louisfd94@gmail.com>|Nathaniel Simard" ,
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-compute" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compute crate that helps creating high performance async backends."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "burn-core" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-core" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Flexible and Comprehensive Deep Learning Framework in Rust"
} ,
{
"name" : "burn-dataset" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-dataset" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Library with simple dataset APIs for creating ML data pipelines"
} ,
{
"name" : "burn-derive" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-derive" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Derive crate for the Burn framework"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "burn-fusion" ,
"version" : "0.11.1" ,
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-fusion" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Kernel fusion backend decorator for the Burn framework"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "burn-ndarray" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-ndarray" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Ndarray backend for the Burn framework"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "burn-tch" ,
"version" : "0.11.1" ,
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-tch" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Tch backend for the Burn framework"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "burn-tensor" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-tensor" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Tensor library with user-friendly APIs and automatic differentiation support"
} ,
{
"name" : "burn-tensor-testgen" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-tensor-testgen" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Test generation crate for burn-tensor"
} ,
{
"name" : "burn-train" ,
2023-12-06 04:15:45 +01:00
"version" : "0.11.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-train" ,
2023-09-05 10:45:05 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Training crate for the Burn framework"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "burn-wgpu" ,
"version" : "0.11.1" ,
"authors" : "nathanielsimard <nathaniel.simard.42@gmail.com>" ,
"repository" : "https://github.com/tracel-ai/burn/tree/main/burn-wgpu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "WGPU backend for the Burn framework"
} ,
{
"name" : "bytemuck" ,
"version" : "1.14.0" ,
"authors" : "Lokathor <zefria@gmail.com>" ,
"repository" : "https://github.com/Lokathor/bytemuck" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "A crate for mucking around with piles of bytes."
} ,
{
"name" : "bytemuck_derive" ,
"version" : "1.5.0" ,
"authors" : "Lokathor <zefria@gmail.com>" ,
"repository" : "https://github.com/Lokathor/bytemuck" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "derive proc-macros for `bytemuck`"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "byteorder" ,
2023-10-25 01:28:10 +02:00
"version" : "1.5.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/byteorder" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Library for reading/writing numbers in big-endian and little-endian."
} ,
2020-12-28 01:12:10 +01:00
{
"name" : "bytes" ,
2023-09-28 01:53:48 +02:00
"version" : "1.5.0" ,
2020-12-28 01:12:10 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/tokio-rs/bytes" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Types and traits for working with bytes"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "bzip2" ,
"version" : "0.4.4" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/bzip2-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings to libbzip2 for bzip2 compression and decompression exposed as Reader/Writer streams."
} ,
{
"name" : "bzip2-sys" ,
"version" : "0.1.11+1.0.8" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/bzip2-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings to libbzip2 for bzip2 compression and decompression exposed as Reader/Writer streams."
} ,
2023-06-30 07:44:47 +02:00
{
"name" : "camino" ,
2023-08-23 03:41:30 +02:00
"version" : "1.1.6" ,
2023-06-30 07:44:47 +02:00
"authors" : "Without Boats <saoirse@without.boats>|Ashley Williams <ashley666ashley@gmail.com>|Steve Klabnik <steve@steveklabnik.com>|Rain <rain@sunshowers.io>" ,
"repository" : "https://github.com/camino-rs/camino" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UTF-8 paths"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "candle-core" ,
"version" : "0.3.1" ,
"authors" : null ,
"repository" : "https://github.com/huggingface/candle" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Minimalist ML framework."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "cc" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
2022-12-07 08:00:14 +01:00
"repository" : "https://github.com/rust-lang/cc-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code."
} ,
{
"name" : "cfg-if" ,
"version" : "1.0.0" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/cfg-if" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted."
} ,
{
"name" : "chrono" ,
2023-09-28 01:53:48 +02:00
"version" : "0.4.31" ,
2022-09-24 04:39:21 +02:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/chronotope/chrono" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Date and time library for Rust"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "cipher" ,
"version" : "0.4.4" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Traits for describing block ciphers and stream ciphers"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "coarsetime" ,
2023-11-27 03:23:56 +01:00
"version" : "0.1.33" ,
2020-11-12 08:41:47 +01:00
"authors" : "Frank Denis <github@pureftpd.org>" ,
"repository" : "https://github.com/jedisct1/rust-coarsetime" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Time and duration crate optimized for speed"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "codespan-reporting" ,
"version" : "0.11.1" ,
"authors" : "Brendan Zabarauskas <bjzaba@yahoo.com.au>" ,
"repository" : "https://github.com/brendanzab/codespan" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Beautiful diagnostic reporting for text-based programming languages"
} ,
{
"name" : "color_quant" ,
"version" : "1.1.0" ,
"authors" : "nwin <nwin@users.noreply.github.com>" ,
"repository" : "https://github.com/image-rs/color_quant.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Color quantization library to reduce n colors to 256 colors."
} ,
{
"name" : "com-rs" ,
"version" : "0.2.1" ,
"authors" : "Lee Jeffery <lee@leejeffery.co.uk>" ,
"repository" : "https://github.com/Eljay/com-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Deprecated. Use the `com` crate instead."
} ,
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 03:43:46 +01:00
{
"name" : "concurrent-queue" ,
2023-12-06 04:15:45 +01:00
"version" : "2.4.0" ,
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 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>|Taiki Endo <te316e89@gmail.com>|John Nunley <jtnunley01@gmail.com>" ,
"repository" : "https://github.com/smol-rs/concurrent-queue" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Concurrent multi-producer multi-consumer queue"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "constant_time_eq" ,
"version" : "0.1.5" ,
"authors" : "Cesar Eduardo Barros <cesarb@cesarb.eti.br>" ,
"repository" : "https://github.com/cesarb/constant_time_eq" ,
"license" : "CC0-1.0" ,
"license_file" : null ,
"description" : "Compares two equal-sized byte strings in constant time."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "constant_time_eq" ,
2023-08-23 03:41:30 +02:00
"version" : "0.3.0" ,
2022-12-07 08:00:14 +01:00
"authors" : "Cesar Eduardo Barros <cesarb@cesarb.eti.br>" ,
"repository" : "https://github.com/cesarb/constant_time_eq" ,
"license" : "Apache-2.0 OR CC0-1.0 OR MIT-0" ,
"license_file" : null ,
"description" : "Compares two equal-sized byte strings in constant time."
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "convert_case" ,
"version" : "0.6.0" ,
"authors" : "Rutrum <dave@rutrum.net>" ,
"repository" : "https://github.com/rutrum/convert-case" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Convert strings into any case"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "core-foundation" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/core-foundation-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings to Core Foundation for macOS"
} ,
{
"name" : "core-foundation-sys" ,
2023-12-06 04:15:45 +01:00
"version" : "0.8.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/core-foundation-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings to Core Foundation for macOS"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "core-graphics-types" ,
"version" : "0.1.3" ,
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/core-foundation-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings for some fundamental Core Graphics types"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "cpufeatures" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.11" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-10-25 01:28:10 +02:00
"description" : "Lightweight runtime CPU feature detection for aarch64, loongarch64, and x86/x86_64 targets, with no_std support and support for mobile targets including Android and iOS"
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "crc32fast" ,
2022-02-25 07:30:59 +01:00
"version" : "1.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sam Rijs <srijs@airpost.net>|Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/srijs/rust-crc32fast" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation"
} ,
{
"name" : "crossbeam-channel" ,
2023-04-12 00:29:26 +02:00
"version" : "0.5.8" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Multi-producer multi-consumer channels for message passing"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "crossbeam-deque" ,
"version" : "0.8.3" ,
"authors" : null ,
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Concurrent work-stealing deque"
} ,
{
"name" : "crossbeam-epoch" ,
"version" : "0.9.15" ,
"authors" : null ,
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Epoch-based garbage collection"
} ,
2020-12-01 05:49:23 +01:00
{
"name" : "crossbeam-utils" ,
2023-07-01 10:26:43 +02:00
"version" : "0.8.16" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-12-01 05:49:23 +01:00
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-12-01 05:49:23 +01:00
"license_file" : null ,
"description" : "Utilities for concurrent programming"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "crunchy" ,
"version" : "0.2.2" ,
"authors" : "Vurich <jackefransham@hotmail.co.uk>" ,
"repository" : null ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Crunchy unroller: deterministically unroll constant loops"
} ,
2020-11-12 08:41:47 +01:00
{
2022-01-15 05:59:43 +01:00
"name" : "crypto-common" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.6" ,
2022-01-15 05:59:43 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-01-15 05:59:43 +01:00
"description" : "Common cryptographic traits"
2020-11-12 08:41:47 +01:00
} ,
2022-06-01 12:26:16 +02:00
{
"name" : "csv" ,
2023-10-04 05:21:47 +02:00
"version" : "1.3.0" ,
2022-06-01 12:26:16 +02:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/rust-csv" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Fast CSV parsing with support for serde."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "csv-core" ,
2023-10-04 05:21:47 +02:00
"version" : "0.1.11" ,
2023-09-05 10:45:05 +02:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/rust-csv" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Bare bones CSV parsing with no_std support."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "d3d12" ,
"version" : "0.7.0" ,
"authors" : "gfx-rs developers" ,
"repository" : "https://github.com/gfx-rs/d3d12-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low level D3D12 API wrapper"
} ,
{
"name" : "dashmap" ,
"version" : "5.5.3" ,
"authors" : "Acrimon <joel.wejdenstal@gmail.com>" ,
"repository" : "https://github.com/xacrimon/dashmap" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Blazing fast concurrent HashMap for Rust."
} ,
2023-07-31 04:02:51 +02:00
{
"name" : "data-encoding" ,
2023-11-27 03:23:56 +01:00
"version" : "2.5.0" ,
2023-07-31 04:02:51 +02:00
"authors" : "Julien Cretin <git@ia0.eu>" ,
"repository" : "https://github.com/ia0/data-encoding" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Efficient and customizable data-encoding functions like base64, base32, and hex"
} ,
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 03:43:46 +01:00
{
"name" : "deadpool" ,
"version" : "0.9.5" ,
"authors" : "Michael P. Jung <michael.jung@terreon.de>" ,
"repository" : "https://github.com/bikeshedder/deadpool" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Dead simple async pool"
} ,
{
"name" : "deadpool-runtime" ,
2023-09-28 01:53:48 +02:00
"version" : "0.1.3" ,
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 03:43:46 +01:00
"authors" : "Michael P. Jung <michael.jung@terreon.de>" ,
"repository" : "https://github.com/bikeshedder/deadpool" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Dead simple async pool utitities for sync managers"
} ,
2023-08-23 03:41:30 +02:00
{
"name" : "deranged" ,
2023-12-06 04:15:45 +01:00
"version" : "0.3.10" ,
2023-08-23 03:41:30 +02:00
"authors" : "Jacob Pratt <jacob@jhpratt.dev>" ,
"repository" : "https://github.com/jhpratt/deranged" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Ranged integers"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "derive-new" ,
"version" : "0.5.9" ,
"authors" : "Nick Cameron <ncameron@mozilla.com>" ,
"repository" : "https://github.com/nrc/derive-new" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "`#[derive(new)]` implements simple constructor functions for structs and enums."
} ,
2023-01-18 13:24:29 +01:00
{
"name" : "difflib" ,
"version" : "0.4.0" ,
"authors" : "Dima Kudosh <dimakudosh@gmail.com>" ,
"repository" : "https://github.com/DimaKudosh/difflib" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Port of Python's difflib library to Rust."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "digest" ,
2023-07-01 10:26:43 +02:00
"version" : "0.10.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Traits for cryptographic hash functions and message authentication codes"
2020-11-12 08:41:47 +01:00
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "dirs" ,
"version" : "5.0.1" ,
"authors" : "Simon Ochsenreither <simon@ochsenreither.de>" ,
"repository" : "https://github.com/soc/dirs-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A tiny low-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows, macOS and Redox by leveraging the mechanisms defined by the XDG base/user directory specifications on Linux, the Known Folder API on Windows, and the Standard Directory guidelines on macOS."
} ,
{
"name" : "dirs-sys" ,
"version" : "0.4.1" ,
"authors" : "Simon Ochsenreither <simon@ochsenreither.de>" ,
"repository" : "https://github.com/dirs-dev/dirs-sys-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "System-level helper functions for the dirs and directories crates."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "displaydoc" ,
2023-07-01 10:26:43 +02:00
"version" : "0.2.4" ,
2022-12-07 08:00:14 +01:00
"authors" : "Jane Lusby <jlusby@yaah.dev>" ,
"repository" : "https://github.com/yaahc/displaydoc" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A derive macro for implementing the display Trait via a doc comment and string interpolation"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "doc-comment" ,
"version" : "0.3.3" ,
"authors" : "Guillaume Gomez <guillaume1.gomez@gmail.com>" ,
"repository" : "https://github.com/GuillaumeGomez/doc-comment" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macro to generate doc comments"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "dyn-stack" ,
"version" : "0.10.0" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/kitegi/dynstack/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Dynamic stack wrapper for unsized allocations"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "either" ,
2023-08-23 03:41:30 +02:00
"version" : "1.9.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/either" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The enum `Either` with variants `Left` and `Right` is a general purpose sum type with two cases."
} ,
{
"name" : "encoding_rs" ,
2023-09-28 01:53:48 +02:00
"version" : "0.8.33" ,
2020-11-12 08:41:47 +01:00
"authors" : "Henri Sivonen <hsivonen@hsivonen.fi>" ,
"repository" : "https://github.com/hsivonen/encoding_rs" ,
2022-09-24 04:39:21 +02:00
"license" : "(Apache-2.0 OR MIT) AND BSD-3-Clause" ,
"license_file" : null ,
2020-11-12 08:41:47 +01:00
"description" : "A Gecko-oriented implementation of the Encoding Standard"
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "envy" ,
"version" : "0.4.2" ,
"authors" : "softprops <d.tangren@gmail.com>" ,
"repository" : "https://github.com/softprops/envy" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "deserialize env vars into typesafe structs"
} ,
{
"name" : "equivalent" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.1" ,
2023-07-01 10:26:43 +02:00
"authors" : null ,
"repository" : "https://github.com/cuviper/equivalent" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Traits for key comparison in maps."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "errno" ,
2023-12-06 04:15:45 +01:00
"version" : "0.3.8" ,
2022-12-07 08:00:14 +01:00
"authors" : "Chris Wong <lambda.fairy@gmail.com>" ,
"repository" : "https://github.com/lambda-fairy/rust-errno" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Cross-platform interface to the `errno` variable."
} ,
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 03:43:46 +01:00
{
"name" : "event-listener" ,
"version" : "2.5.3" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/event-listener" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Notify async tasks or threads"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "exr" ,
"version" : "1.6.4" ,
"authors" : "johannesvollmer <johannes596@t-online.de>" ,
"repository" : "https://github.com/johannesvollmer/exrs" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "Read and write OpenEXR files without any unsafe code"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "fallible-iterator" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-fallible-iterator" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fallible iterator traits"
} ,
{
"name" : "fallible-streaming-iterator" ,
"version" : "0.1.9" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/fallible-streaming-iterator" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fallible streaming iteration"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "faster-hex" ,
"version" : "0.8.1" ,
"authors" : "zhangsoledad <787953403@qq.com>" ,
"repository" : "https://github.com/NervosFoundation/faster-hex" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Fast hex encoding."
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "fastrand" ,
2023-04-12 00:25:42 +02:00
"version" : "1.9.0" ,
2022-01-15 05:59:43 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/fastrand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A simple and fast random number generator"
} ,
2023-08-23 03:41:30 +02:00
{
"name" : "fastrand" ,
2023-09-28 01:53:48 +02:00
"version" : "2.0.1" ,
2023-08-23 03:41:30 +02:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/fastrand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A simple and fast random number generator"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "fdeflate" ,
"version" : "0.3.1" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/fdeflate" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast specialized deflate implementation"
} ,
{
"name" : "find-crate" ,
"version" : "0.6.3" ,
"authors" : "Taiki Endo <te316e89@gmail.com>" ,
"repository" : "https://github.com/taiki-e/find-crate" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Find the crate name from the current Cargo.toml."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "fixedbitset" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss" ,
2022-01-15 05:59:43 +01:00
"repository" : "https://github.com/petgraph/fixedbitset" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "FixedBitSet is a simple bitset collection"
} ,
{
"name" : "flate2" ,
2023-10-25 01:28:10 +02:00
"version" : "1.0.28" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Josh Triplett <josh@joshtriplett.org>" ,
"repository" : "https://github.com/rust-lang/flate2-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams."
2020-11-12 08:41:47 +01:00
} ,
{
"name" : "fluent" ,
2021-10-02 12:42:03 +02:00
"version" : "0.16.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A localization system designed to unleash the entire expressive power of natural language translations."
} ,
{
"name" : "fluent-bundle" ,
2021-10-26 00:16:40 +02:00
"version" : "0.15.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A localization system designed to unleash the entire expressive power of natural language translations."
} ,
{
"name" : "fluent-langneg" ,
"version" : "0.13.0" ,
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-langneg-rs" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A library for language and locale negotiation."
} ,
{
"name" : "fluent-syntax" ,
2021-03-27 04:24:11 +01:00
"version" : "0.11.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser/Serializer tools for Fluent Syntax."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "flume" ,
"version" : "0.10.14" ,
"authors" : "Joshua Barretto <joshua.s.barretto@gmail.com>" ,
"repository" : "https://github.com/zesterer/flume" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A blazingly fast multi-producer channel"
} ,
{
"name" : "flume" ,
"version" : "0.11.0" ,
"authors" : "Joshua Barretto <joshua.s.barretto@gmail.com>" ,
"repository" : "https://github.com/zesterer/flume" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A blazingly fast multi-producer channel"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "fnv" ,
"version" : "1.0.7" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/servo/rust-fnv" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fowler– Noll– Vo hash function"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "foreign-types" ,
"version" : "0.3.2" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "A framework for Rust wrappers over C APIs"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "foreign-types" ,
"version" : "0.5.0" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A framework for Rust wrappers over C APIs"
} ,
{
"name" : "foreign-types-macros" ,
"version" : "0.2.3" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An internal crate used by foreign-types"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "foreign-types-shared" ,
"version" : "0.1.1" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "An internal crate used by foreign-types"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "foreign-types-shared" ,
"version" : "0.3.1" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An internal crate used by foreign-types"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "form_urlencoded" ,
2023-11-27 03:23:56 +01:00
"version" : "1.2.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser and serializer for the application/x-www-form-urlencoded syntax, as used by HTML forms."
} ,
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 03:43:46 +01:00
{
"name" : "forwarded-header-value" ,
"version" : "0.1.1" ,
"authors" : "James Brown <jbrown@easypost.com>" ,
"repository" : "https://github.com/EasyPost/rust-forwarded-header-value" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Parser for values from the Forwarded header (RFC 7239)"
} ,
2023-09-05 10:45:05 +02:00
{
2023-09-16 08:09:26 +02:00
"name" : "fsrs" ,
2023-09-05 10:45:05 +02:00
"version" : "0.1.0" ,
"authors" : null ,
"repository" : null ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : null
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "futf" ,
2022-02-25 07:30:59 +01:00
"version" : "0.1.5" ,
2021-02-06 04:42:38 +01:00
"authors" : "Keegan McAllister <kmcallister@mozilla.com>" ,
"repository" : "https://github.com/servo/futf" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Handling fragments of UTF-8"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces."
} ,
{
"name" : "futures-channel" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Channels for asynchronous communication using futures-rs."
} ,
{
"name" : "futures-core" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The core traits and types in for the `futures` library."
} ,
{
"name" : "futures-executor" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Executors for asynchronous tasks based on the futures-rs library."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "futures-intrusive" ,
"version" : "0.5.0" ,
"authors" : "Matthias Einwag <matthias.einwag@live.com>" ,
"repository" : "https://github.com/Matthias247/futures-intrusive" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Futures based on intrusive data structures - for std and no-std environments."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures-io" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library."
} ,
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 03:43:46 +01:00
{
"name" : "futures-lite" ,
2023-06-23 05:02:23 +02:00
"version" : "1.13.0" ,
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 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>|Contributors to futures-rs" ,
"repository" : "https://github.com/smol-rs/futures-lite" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Futures, streams, and async I/O combinators"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures-macro" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The futures-rs procedural macro implementations."
} ,
{
"name" : "futures-sink" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The asynchronous `Sink` trait for the futures-rs library."
} ,
{
"name" : "futures-task" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tools for working with tasks."
} ,
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 03:43:46 +01:00
{
"name" : "futures-timer" ,
"version" : "3.0.2" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/async-rs/futures-timer" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Timeouts for futures."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures-util" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.29" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Common utilities and extension traits for the futures-rs library."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "gemm" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-c32" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-c64" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-common" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-f16" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-f32" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
{
"name" : "gemm-f64" ,
"version" : "0.16.15" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/gemm/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Playground for matrix multiplication algorithms"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "generic-array" ,
2023-04-12 00:25:42 +02:00
"version" : "0.14.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Bartłomiej Kamiński <fizyk20@gmail.com>|Aaron Trent <novacrazy@gmail.com>" ,
"repository" : "https://github.com/fizyk20/generic-array.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Generic types implementing functionality of arrays"
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "getopts" ,
"version" : "0.2.21" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/getopts" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "getopts-like option parsing."
} ,
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 03:43:46 +01:00
{
"name" : "getrandom" ,
"version" : "0.1.16" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/getrandom" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A small cross-platform library for retrieving random data from system source"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "getrandom" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.11" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/getrandom" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A small cross-platform library for retrieving random data from system source"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "gif" ,
"version" : "0.12.0" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/image-gif" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "GIF de- and encoder"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "gimli" ,
2023-11-27 03:23:56 +01:00
"version" : "0.28.1" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/gimli" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A library for reading and writing the DWARF debugging format."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "gix-features" ,
"version" : "0.33.0" ,
"authors" : "Sebastian Thiel <sebastian.thiel@icloud.com>" ,
"repository" : "https://github.com/Byron/gitoxide" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate to integrate various capabilities using compile-time feature flags"
} ,
{
"name" : "gix-fs" ,
"version" : "0.5.0" ,
"authors" : "Sebastian Thiel <sebastian.thiel@icloud.com>" ,
"repository" : "https://github.com/Byron/gitoxide" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate providing file system specific utilities to `gitoxide`"
} ,
{
"name" : "gix-hash" ,
"version" : "0.12.0" ,
"authors" : "Sebastian Thiel <sebastian.thiel@icloud.com>" ,
"repository" : "https://github.com/Byron/gitoxide" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Borrowed and owned git hash digests used to identify git objects"
} ,
{
"name" : "gix-tempfile" ,
"version" : "8.0.0" ,
"authors" : "Sebastian Thiel <sebastian.thiel@icloud.com>" ,
"repository" : "https://github.com/Byron/gitoxide" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A tempfile implementation with a global registry to assure cleanup"
} ,
{
"name" : "gix-trace" ,
"version" : "0.1.3" ,
"authors" : "Sebastian Thiel <sebastian.thiel@icloud.com>" ,
"repository" : "https://github.com/Byron/gitoxide" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate to provide minimal `tracing` support that can be turned off to zero cost"
} ,
{
"name" : "gl_generator" ,
"version" : "0.14.0" ,
"authors" : "Brendan Zabarauskas <bjzaba@yahoo.com.au>|Corey Richardson|Arseny Kapoulkine" ,
"repository" : "https://github.com/brendanzab/gl-rs/" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Code generators for creating bindings to the Khronos OpenGL APIs."
} ,
{
"name" : "glow" ,
"version" : "0.13.0" ,
"authors" : "Joshua Groves <josh@joshgroves.com>|Dzmitry Malyshau <kvarkus@gmail.com>" ,
"repository" : "https://github.com/grovesNL/glow" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "GL on Whatever: a set of bindings to run GL (Open GL, OpenGL ES, and WebGL) anywhere, and avoid target-specific code."
} ,
{
"name" : "glutin_wgl_sys" ,
"version" : "0.5.0" ,
"authors" : "Kirill Chibisov <contact@kchibisov.com>" ,
"repository" : "https://github.com/rust-windowing/glutin" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "The wgl bindings for glutin"
} ,
{
"name" : "gpu-alloc" ,
"version" : "0.6.0" ,
"authors" : "Zakarum <zakarumych@ya.ru>" ,
"repository" : "https://github.com/zakarumych/gpu-alloc" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Implementation agnostic memory allocator for Vulkan like APIs"
} ,
{
"name" : "gpu-alloc-types" ,
"version" : "0.3.0" ,
"authors" : "Zakarum <zakarumych@ya.ru>" ,
"repository" : "https://github.com/zakarumych/gpu-alloc" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core types of gpu-alloc crate"
} ,
{
"name" : "gpu-allocator" ,
"version" : "0.23.0" ,
"authors" : "Traverse Research <opensource@traverseresearch.nl>" ,
"repository" : "https://github.com/Traverse-Research/gpu-allocator" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Memory allocator for GPU memory in Vulkan and DirectX 12"
} ,
{
"name" : "gpu-descriptor" ,
"version" : "0.2.4" ,
"authors" : "Zakarum <zakarumych@ya.ru>" ,
"repository" : "https://github.com/zakarumych/gpu-descriptor" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Implementation agnostic descriptor allocator for Vulkan like APIs"
} ,
{
"name" : "gpu-descriptor-types" ,
"version" : "0.1.2" ,
"authors" : "Zakarum <zakarumych@ya.ru>" ,
"repository" : "https://github.com/zakarumych/gpu-descriptor" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core types of gpu-descriptor crate"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "h2" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/h2" ,
"license" : "MIT" ,
"license_file" : null ,
2022-03-15 07:51:52 +01:00
"description" : "An HTTP/2 client and server"
2020-11-12 08:41:47 +01:00
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "half" ,
"version" : "2.3.1" ,
"authors" : "Kathryn Long <squeeself@gmail.com>" ,
"repository" : "https://github.com/starkat99/half-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Half-precision floating point f16 and bf16 types for Rust implementing the IEEE 754-2008 standard binary16 and bfloat16 types."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "hashbrown" ,
"version" : "0.13.2" ,
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/rust-lang/hashbrown" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A Rust port of Google's SwissTable hash map"
} ,
2021-06-25 08:22:21 +02:00
{
"name" : "hashbrown" ,
2023-11-27 03:23:56 +01:00
"version" : "0.14.3" ,
2023-07-01 10:26:43 +02:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/rust-lang/hashbrown" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A Rust port of Google's SwissTable hash map"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "hashlink" ,
2023-09-28 01:53:48 +02:00
"version" : "0.8.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "kyren <kerriganw@gmail.com>" ,
"repository" : "https://github.com/kyren/hashlink" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "HashMap-like containers that hold their key-value pairs in a user controllable order"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "hassle-rs" ,
"version" : "0.10.0" ,
"authors" : "Traverse-Research <support@traverseresearch.nl>" ,
"repository" : "https://github.com/Traverse-Research/hassle-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "HLSL compiler library, this crate provides an FFI layer and idiomatic rust wrappers for the new DXC hlsl compiler and validator."
} ,
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 03:43:46 +01:00
{
"name" : "headers" ,
2023-09-28 01:53:48 +02:00
"version" : "0.3.9" ,
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 03:43:46 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "typed HTTP headers"
} ,
{
"name" : "headers-core" ,
"version" : "0.2.0" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "typed HTTP headers core trait"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "heck" ,
2023-04-12 00:25:42 +02:00
"version" : "0.4.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Without Boats <woboats@gmail.com>" ,
"repository" : "https://github.com/withoutboats/heck" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "heck is a case conversion library."
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "hermit-abi" ,
2023-09-28 01:53:48 +02:00
"version" : "0.3.3" ,
2023-04-12 00:25:42 +02:00
"authors" : "Stefan Lankes" ,
2023-09-28 01:53:48 +02:00
"repository" : "https://github.com/hermitcore/hermit-rs" ,
2023-04-12 00:25:42 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Hermit system calls definitions."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "hex" ,
2021-03-07 10:04:34 +01:00
"version" : "0.4.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "KokaKiwi <kokakiwi@kokakiwi.net>" ,
"repository" : "https://github.com/KokaKiwi/rust-hex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Encoding and decoding data into/from hexadecimal representation."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "hexf-parse" ,
"version" : "0.2.1" ,
"authors" : "Kang Seonghoon <public+rust@mearie.org>" ,
"repository" : "https://github.com/lifthrasiir/hexf" ,
"license" : "CC0-1.0" ,
"license_file" : null ,
"description" : "Parses hexadecimal floats (see also hexf)"
} ,
{
"name" : "hmac" ,
"version" : "0.12.1" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/MACs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Generic implementation of Hash-based Message Authentication Code (HMAC)"
} ,
2023-09-28 01:53:48 +02:00
{
"name" : "home" ,
"version" : "0.5.5" ,
"authors" : "Brian Anderson <andersrb@gmail.com>" ,
"repository" : "https://github.com/rust-lang/cargo" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Shared definitions of home directories."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "html5ever" ,
2022-09-24 04:39:21 +02:00
"version" : "0.26.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "The html5ever Project Developers" ,
"repository" : "https://github.com/servo/html5ever" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "High-performance browser-grade HTML5 parser"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "htmlescape" ,
"version" : "0.3.1" ,
"authors" : "Viktor Dahl <pazaconyoman@gmail.com>" ,
"repository" : "https://github.com/veddan/rust-htmlescape" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR MPL-2.0" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library for HTML entity encoding and decoding"
} ,
{
"name" : "http" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.11" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/http" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A set of types for representing HTTP requests and responses."
} ,
{
"name" : "http-body" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.5" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Lucio Franco <luciofranco14@gmail.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/http-body" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Trait representing an asynchronous, streaming, HTTP request or response body."
} ,
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 03:43:46 +01:00
{
"name" : "http-range-header" ,
2023-08-23 03:41:30 +02:00
"version" : "0.3.1" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/MarcusGrass/parse-range-headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "No-dep range header parser"
} ,
{
"name" : "http-types" ,
"version" : "2.12.0" ,
"authors" : "Yoshua Wuyts <yoshuawuyts@gmail.com>" ,
"repository" : "https://github.com/http-rs/http-types" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Common types for HTTP operations."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "httparse" ,
2022-09-24 04:39:21 +02:00
"version" : "1.8.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/httparse" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A tiny, safe, speedy, zero-copy HTTP/1.x parser."
} ,
{
"name" : "httpdate" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.3" ,
2021-04-27 14:18:12 +02:00
"authors" : "Pyfisch <pyfisch@posteo.org>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/pyfisch/httpdate" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "HTTP date parsing and formatting"
} ,
{
"name" : "hyper" ,
2023-07-01 10:26:43 +02:00
"version" : "0.14.27" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/hyper" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A fast and correct HTTP library."
} ,
{
"name" : "hyper-rustls" ,
2023-11-27 03:23:56 +01:00
"version" : "0.24.2" ,
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 03:43:46 +01:00
"authors" : null ,
2023-08-23 03:41:30 +02:00
"repository" : "https://github.com/rustls/hyper-rustls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Rustls+hyper integration for pure rust HTTPS"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "hyper-tls" ,
2021-04-27 14:18:12 +02:00
"version" : "0.5.0" ,
2020-11-15 05:02:53 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/hyper-tls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "Default TLS implementation for use with hyper"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "iana-time-zone" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.58" ,
2022-12-07 08:00:14 +01:00
"authors" : "Andrew Straw <strawman@astraw.com>|René Kijewski <rene.kijewski@fu-berlin.de>|Ryan Lopopolo <rjl@hyperbo.la>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/strawlab/iana-time-zone" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "get the IANA time zone for the current system"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "iana-time-zone-haiku" ,
2023-07-01 10:26:43 +02:00
"version" : "0.1.2" ,
2022-12-07 08:00:14 +01:00
"authors" : "René Kijewski <crates.io@k6i.de>" ,
"repository" : "https://github.com/strawlab/iana-time-zone" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "iana-time-zone support crate for Haiku OS"
} ,
2022-02-10 00:55:43 +01:00
{
"name" : "id_tree" ,
"version" : "1.8.0" ,
"authors" : "Ian Burns <iwburns8@gmail.com>" ,
"repository" : "https://github.com/iwburns/id-tree" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A library for creating and modifying Tree structures."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "idna" ,
2023-11-27 03:23:56 +01:00
"version" : "0.5.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url/" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "IDNA (Internationalizing Domain Names in Applications) and Punycode."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "image" ,
"version" : "0.24.7" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/image" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Imaging library. Provides basic image processing and encoders/decoders for common image formats."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "indexmap" ,
2023-11-27 03:23:56 +01:00
"version" : "2.1.0" ,
2023-07-01 10:26:43 +02:00
"authors" : null ,
"repository" : "https://github.com/bluss/indexmap" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A hash table with consistent order and fast iteration."
} ,
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 03:43:46 +01:00
{
"name" : "infer" ,
"version" : "0.2.3" ,
"authors" : "Bojan <dbojan@gmail.com>" ,
"repository" : "https://github.com/bojand/infer" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Small crate to infer file types based on its magic number signature"
} ,
2021-03-26 00:40:41 +01:00
{
"name" : "inflections" ,
"version" : "1.1.1" ,
"authors" : "Caleb Meredith <calebmeredith8@gmail.com>" ,
"repository" : "https://docs.rs/inflections" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "High performance inflection transformation library for changing properties of words like the case."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "inout" ,
"version" : "0.1.3" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Custom reference types for code generic over in-place and buffer-to-buffer modes of operation."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "instant" ,
2021-10-26 00:16:40 +02:00
"version" : "0.1.12" ,
2020-11-12 08:41:47 +01:00
"authors" : "sebcrozet <developer@crozet.re>" ,
"repository" : "https://github.com/sebcrozet/instant" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "A partial replacement for std::time::Instant that works on WASM too."
} ,
{
"name" : "intl-memoizer" ,
2021-02-03 11:29:48 +01:00
"version" : "0.5.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A memoizer specifically tailored for storing lazy-initialized intl formatters."
} ,
{
"name" : "intl_pluralrules" ,
2022-12-07 08:00:14 +01:00
"version" : "7.0.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Kekoa Riggin <kekoariggin@gmail.com>|Zibi Braniecki <zbraniecki@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/pluralrules" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Unicode Plural Rules categorizer for numeric input."
} ,
{
"name" : "ipnet" ,
2023-10-25 01:28:10 +02:00
"version" : "2.9.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Kris Price <kris@krisprice.nz>" ,
"repository" : "https://github.com/krisprice/ipnet" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Provides types and useful methods for working with IPv4 and IPv6 network addresses, commonly called IP prefixes. The new `IpNet`, `Ipv4Net`, and `Ipv6Net` types build on the existing `IpAddr`, `Ipv4Addr`, and `Ipv6Addr` types already provided in Rust's standard library and align to their design to stay consistent. The module also provides useful traits that extend `Ipv4Addr` and `Ipv6Addr` with methods for `Add`, `Sub`, `BitAnd`, and `BitOr` operations. The module only uses stable feature so it is guaranteed to compile using the stable toolchain."
} ,
2023-10-25 01:28:10 +02:00
{
"name" : "itertools" ,
2023-11-27 03:23:56 +01:00
"version" : "0.11.0" ,
2023-10-25 01:28:10 +02:00
"authors" : "bluss" ,
"repository" : "https://github.com/rust-itertools/itertools" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Extra iterator adaptors, iterator methods, free functions, and macros."
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "itertools" ,
2023-11-27 03:23:56 +01:00
"version" : "0.12.0" ,
2023-07-01 10:26:43 +02:00
"authors" : "bluss" ,
"repository" : "https://github.com/rust-itertools/itertools" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Extra iterator adaptors, iterator methods, free functions, and macros."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "itoa" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.9" ,
2022-01-15 05:59:43 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/itoa" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast integer primitive to string conversion"
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "jobserver" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.27" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/jobserver-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An implementation of the GNU make jobserver for Rust"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "jpeg-decoder" ,
"version" : "0.3.0" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/jpeg-decoder" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "JPEG decoder"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "js-sys" ,
2023-12-06 04:15:45 +01:00
"version" : "0.3.66" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings for all JS global objects and functions in all JS environments like Node.js and browsers, built on `#[wasm_bindgen]` using the `wasm-bindgen` crate."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "khronos-egl" ,
"version" : "6.0.0" ,
"authors" : "Timothée Haudebourg <author@haudebourg.net>|Sean Kerr <sean@metatomic.io>" ,
"repository" : "https://github.com/timothee-haudebourg/khronos-egl" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust bindings for EGL"
} ,
{
"name" : "khronos_api" ,
"version" : "3.1.0" ,
"authors" : "Brendan Zabarauskas <bjzaba@yahoo.com.au>|Corey Richardson|Arseny Kapoulkine|Pierre Krieger <pierre.krieger1708@gmail.com>" ,
"repository" : "https://github.com/brendanzab/gl-rs/" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "The Khronos XML API Registry, exposed as byte string constants."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "lazy_static" ,
"version" : "1.4.0" ,
"authors" : "Marvin Löbel <loebel.marvin@gmail.com>" ,
"repository" : "https://github.com/rust-lang-nursery/lazy-static.rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro for declaring lazily evaluated statics in Rust."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "lebe" ,
"version" : "0.5.2" ,
"authors" : "johannesvollmer <johannes596@t-online.de>" ,
"repository" : "https://github.com/johannesvollmer/lebe" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "Tiny, dead simple, high performance endianness conversions with a generic API"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "libc" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.150" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/libc" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Raw FFI bindings to platform libraries like libc."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "libloading" ,
"version" : "0.7.4" ,
"authors" : "Simonas Kazlauskas <libloading@kazlauskas.me>" ,
"repository" : "https://github.com/nagisa/rust_libloading/" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Bindings around the platform's dynamic library loading primitives with greatly improved memory safety."
} ,
{
"name" : "libloading" ,
"version" : "0.8.1" ,
"authors" : "Simonas Kazlauskas <libloading@kazlauskas.me>" ,
"repository" : "https://github.com/nagisa/rust_libloading/" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Bindings around the platform's dynamic library loading primitives with greatly improved memory safety."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "libm" ,
2023-10-25 01:28:10 +02:00
"version" : "0.2.8" ,
2023-09-05 10:45:05 +02:00
"authors" : "Jorge Aparicio <jorge@japaric.io>" ,
"repository" : "https://github.com/rust-lang/libm" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "libm in pure Rust"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "libredox" ,
"version" : "0.0.1" ,
"authors" : "4lDO2 <4lDO2@protonmail.com>" ,
"repository" : "https://gitlab.redox-os.org/redox-os/libredox.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Redox stable ABI"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "libsqlite3-sys" ,
2023-11-27 03:23:56 +01:00
"version" : "0.27.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rusqlite developers" ,
"repository" : "https://github.com/rusqlite/rusqlite" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Native bindings to the libsqlite3 library"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "linux-raw-sys" ,
2023-12-06 04:15:45 +01:00
"version" : "0.4.12" ,
2022-12-07 08:00:14 +01:00
"authors" : "Dan Gohman <dev@sunfishcode.online>" ,
"repository" : "https://github.com/sunfishcode/linux-raw-sys" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Generated bindings for Linux's userspace API"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "lock_api" ,
2023-10-25 01:28:10 +02:00
"version" : "0.4.11" ,
2020-11-12 08:41:47 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std."
} ,
{
"name" : "log" ,
2023-08-23 03:41:30 +02:00
"version" : "0.4.20" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/log" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A lightweight logging facade for Rust"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "mac" ,
"version" : "0.1.1" ,
"authors" : "Jonathan Reem <jonathan.reem@gmail.com>" ,
"repository" : "https://github.com/reem/rust-mac.git" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A collection of great and ubiqutitous macros."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "malloc_buf" ,
"version" : "0.0.6" ,
"authors" : "Steven Sheldon" ,
"repository" : "https://github.com/SSheldon/malloc_buf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Structs for handling malloc'd memory passed to Rust."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "maplit" ,
"version" : "1.0.2" ,
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/maplit" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Collection “literal” macros for HashMap, HashSet, BTreeMap, and BTreeSet."
} ,
{
"name" : "markup5ever" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "The html5ever Project Developers" ,
"repository" : "https://github.com/servo/html5ever" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Common code for xml5ever and html5ever"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "matchers" ,
"version" : "0.1.0" ,
"authors" : "Eliza Weisman <eliza@buoyant.io>" ,
"repository" : "https://github.com/hawkw/matchers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Regex matching on character and byte streams."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "matches" ,
2023-04-12 00:25:42 +02:00
"version" : "0.1.10" ,
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/SimonSapin/rust-std-candidates" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A macro to evaluate, as a boolean, whether an expression matches a pattern."
} ,
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 03:43:46 +01:00
{
"name" : "matchit" ,
2023-09-28 01:53:48 +02:00
"version" : "0.7.3" ,
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 03:43:46 +01:00
"authors" : "Ibraheem Ahmed <ibraheem@ibraheem.ca>" ,
"repository" : "https://github.com/ibraheemdev/matchit" ,
2023-08-23 03:41:30 +02:00
"license" : "MIT AND BSD-3-Clause" ,
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 03:43:46 +01:00
"license_file" : null ,
2023-09-28 01:53:48 +02:00
"description" : "A high performance, zero-copy URL router."
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 03:43:46 +01:00
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "matrixmultiply" ,
2023-09-28 01:53:48 +02:00
"version" : "0.3.8" ,
2023-09-05 10:45:05 +02:00
"authors" : "bluss|R. Janis Goldschmidt" ,
"repository" : "https://github.com/bluss/matrixmultiply/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "General matrix multiplication for f32 and f64 matrices. Operates on matrices with general layout (they can use arbitrary row and column stride). Detects and uses AVX or SSE2 on x86 platforms transparently for higher performance. Uses a microkernel strategy, so that the implementation is easy to parallelize and optimize. Supports multithreading."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "memchr" ,
2023-10-25 01:28:10 +02:00
"version" : "2.6.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>|bluss" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/BurntSushi/memchr" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2023-10-25 01:28:10 +02:00
"description" : "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search."
2020-11-12 08:41:47 +01:00
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "memmap2" ,
"version" : "0.7.1" ,
"authors" : "Dan Burkert <dan@danburkert.com>|Yevhenii Reizner <razrfalcon@gmail.com>" ,
"repository" : "https://github.com/RazrFalcon/memmap2-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Cross-platform Rust API for memory-mapped file IO"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "memoffset" ,
"version" : "0.9.0" ,
"authors" : "Gilad Naaman <gilad.naaman@gmail.com>" ,
"repository" : "https://github.com/Gilnaa/memoffset" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "offset_of functionality for Rust structs."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "metal" ,
"version" : "0.27.0" ,
"authors" : "gfx-rs developers" ,
"repository" : "https://github.com/gfx-rs/metal-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust bindings for Metal"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "mime" ,
2023-04-12 00:25:42 +02:00
"version" : "0.3.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/mime" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Strongly Typed Mimes"
} ,
{
"name" : "mime_guess" ,
2022-02-25 07:30:59 +01:00
"version" : "2.0.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Austin Bonander <austin.bonander@gmail.com>" ,
"repository" : "https://github.com/abonander/mime_guess" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A simple crate for detection of a file's MIME type by its extension."
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "minimal-lexical" ,
2021-11-18 11:54:00 +01:00
"version" : "0.2.1" ,
2021-10-02 12:42:03 +02:00
"authors" : "Alex Huszagh <ahuszagh@gmail.com>" ,
"repository" : "https://github.com/Alexhuszagh/minimal-lexical" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast float parsing conversion routines."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "miniz_oxide" ,
2023-07-01 10:26:43 +02:00
"version" : "0.7.1" ,
2022-12-07 08:00:14 +01:00
"authors" : "Frommi <daniil.liferenko@gmail.com>|oyvindln <oyvindln@users.noreply.github.com>" ,
"repository" : "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "DEFLATE compression and decompression library rewritten in Rust based on miniz"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "mio" ,
2023-10-25 01:28:10 +02:00
"version" : "0.8.9" ,
2021-04-27 14:18:12 +02:00
"authors" : "Carl Lerche <me@carllerche.com>|Thomas de Zeeuw <thomasdezeeuw@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/tokio-rs/mio" ,
"license" : "MIT" ,
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "Lightweight non-blocking I/O."
2020-11-12 08:41:47 +01:00
} ,
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 03:43:46 +01:00
{
"name" : "multer" ,
2023-07-01 10:26:43 +02:00
"version" : "2.1.0" ,
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 03:43:46 +01:00
"authors" : "Rousan Ali <hello@rousan.io>" ,
"repository" : "https://github.com/rousan/multer-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An async parser for `multipart/form-data` content-type in Rust."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "multimap" ,
2021-03-27 05:47:16 +01:00
"version" : "0.8.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Håvar Nøvik <havar.novik@gmail.com>" ,
"repository" : "https://github.com/havarnov/multimap" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A multimap implementation."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "naga" ,
"version" : "0.14.1" ,
"authors" : "Naga Developers" ,
"repository" : "https://github.com/gfx-rs/naga" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Shader translation infrastructure"
} ,
{
"name" : "nanorand" ,
"version" : "0.7.0" ,
"authors" : "Lucy <lucy@absolucy.moe>" ,
"repository" : "https://github.com/Absolucy/nanorand-rs" ,
"license" : "Zlib" ,
"license_file" : null ,
"description" : "A tiny, fast, zero-dep library for random number generation."
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "native-tls" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.11" ,
2020-11-15 05:02:53 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-native-tls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "A wrapper over a platform's native TLS implementation"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "ndarray" ,
"version" : "0.15.6" ,
"authors" : "Ulrik Sverdrup \"bluss\"|Jim Turner" ,
"repository" : "https://github.com/rust-ndarray/ndarray" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting."
} ,
{
"name" : "ndarray-rand" ,
"version" : "0.14.0" ,
"authors" : "bluss" ,
"repository" : "https://github.com/rust-ndarray/ndarray" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Constructors for randomized arrays. `rand` integration for `ndarray`."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "new_debug_unreachable" ,
"version" : "1.0.4" ,
"authors" : "Matt Brubeck <mbrubeck@limpet.net>|Jonathan Reem <jonathan.reem@gmail.com>" ,
"repository" : "https://github.com/mbrubeck/rust-debug-unreachable" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "panic in debug, intrinsics::unreachable() in release (fork of debug_unreachable)"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "nom" ,
2023-01-18 13:24:29 +01:00
"version" : "7.1.3" ,
2021-06-25 07:35:25 +02:00
"authors" : "contact@geoffroycouprie.com" ,
"repository" : "https://github.com/Geal/nom" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A byte-oriented, zero-copy, parser combinators library"
} ,
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 03:43:46 +01:00
{
"name" : "nonempty" ,
"version" : "0.7.0" ,
"authors" : "Alexis Sellier <self@cloudhead.io>" ,
"repository" : "https://github.com/cloudhead/nonempty" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Correct by construction non-empty vector"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "nu-ansi-term" ,
"version" : "0.46.0" ,
"authors" : "ogham@bsago.me|Ryan Scheel (Havvy) <ryan.havvy@gmail.com>|Josh Triplett <josh@joshtriplett.org>|The Nushell Project Developers" ,
"repository" : "https://github.com/nushell/nu-ansi-term" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Library for ANSI terminal colors and styles (bold, underline)"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "num-complex" ,
"version" : "0.4.4" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-complex" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Complex numbers implementation for Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "num-format" ,
2022-12-07 08:00:14 +01:00
"version" : "0.4.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Myers <brian.carl.myers@gmail.com>" ,
"repository" : "https://github.com/bcmyers/num-format" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A Rust crate for producing string-representations of numbers, formatted according to international standards"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "num-integer" ,
"version" : "0.1.45" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-integer" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Integer traits and functions"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "num-rational" ,
"version" : "0.4.1" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-rational" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rational numbers implementation for Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "num-traits" ,
2023-10-25 01:28:10 +02:00
"version" : "0.2.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Numeric traits for generic mathematics"
} ,
{
"name" : "num_cpus" ,
2023-07-01 10:26:43 +02:00
"version" : "1.16.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/num_cpus" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Get the number of CPUs on a machine."
} ,
{
"name" : "num_enum" ,
2023-11-27 03:23:56 +01:00
"version" : "0.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Daniel Wagner-Hall <dawagner@gmail.com>|Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>|Vincent Esche <regexident@gmail.com>" ,
"repository" : "https://github.com/illicitonion/num_enum" ,
2022-01-15 05:59:43 +01:00
"license" : "Apache-2.0 OR BSD-3-Clause OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Procedural macros to make inter-operation between primitives and enums easier."
} ,
{
"name" : "num_enum_derive" ,
2023-11-27 03:23:56 +01:00
"version" : "0.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Daniel Wagner-Hall <dawagner@gmail.com>|Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>|Vincent Esche <regexident@gmail.com>" ,
"repository" : "https://github.com/illicitonion/num_enum" ,
2022-01-15 05:59:43 +01:00
"license" : "Apache-2.0 OR BSD-3-Clause OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "objc" ,
"version" : "0.2.7" ,
"authors" : "Steven Sheldon" ,
"repository" : "http://github.com/SSheldon/rust-objc" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Objective-C Runtime bindings and wrapper for Rust."
} ,
{
"name" : "objc_exception" ,
"version" : "0.1.2" ,
"authors" : "Steven Sheldon" ,
"repository" : "http://github.com/SSheldon/rust-objc-exception" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Rust interface for Objective-C's throw and try/catch statements."
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "object" ,
2023-09-28 01:53:48 +02:00
"version" : "0.32.1" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/object" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A unified interface for reading and writing object file formats."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "once_cell" ,
2023-07-01 10:26:43 +02:00
"version" : "1.18.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Aleksey Kladov <aleksey.kladov@gmail.com>" ,
"repository" : "https://github.com/matklad/once_cell" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Single assignment cells and lazy values."
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "openssl" ,
2023-12-06 04:15:45 +01:00
"version" : "0.10.61" ,
2020-11-15 05:02:53 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-openssl" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "OpenSSL bindings"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "openssl-macros" ,
2023-07-01 10:26:43 +02:00
"version" : "0.1.1" ,
2022-09-24 04:39:21 +02:00
"authors" : null ,
"repository" : null ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Internal macros used by the openssl crate."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "openssl-probe" ,
2022-01-15 05:59:43 +01:00
"version" : "0.1.5" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/openssl-probe" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tool for helping to find SSL certificate locations on the system for OpenSSL"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "openssl-sys" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.97" ,
2020-11-15 05:02:53 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-openssl" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "FFI bindings to OpenSSL"
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "option-ext" ,
"version" : "0.2.0" ,
"authors" : "Simon Ochsenreither <simon@ochsenreither.de>" ,
"repository" : "https://github.com/soc/option-ext.git" ,
"license" : "MPL-2.0" ,
"license_file" : null ,
"description" : "Extends `Option` with additional operations"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "overload" ,
"version" : "0.1.1" ,
"authors" : "Daniel Salvadori <danaugrs@gmail.com>" ,
"repository" : "https://github.com/danaugrs/overload" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides a macro to simplify operator overloading."
} ,
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 03:43:46 +01:00
{
"name" : "parking" ,
2023-10-25 01:28:10 +02:00
"version" : "2.2.0" ,
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 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>|The Rust Project Developers" ,
2023-06-23 05:02:23 +02:00
"repository" : "https://github.com/smol-rs/parking" ,
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 03:43:46 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Thread parking and unparking"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "parking_lot" ,
2022-09-24 04:39:21 +02:00
"version" : "0.12.1" ,
2022-02-28 01:28:39 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "More compact and efficient implementations of the standard synchronization primitives."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "parking_lot_core" ,
2023-10-25 01:28:10 +02:00
"version" : "0.9.9" ,
2022-02-28 01:28:39 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An advanced API for creating custom synchronization primitives."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "password-hash" ,
"version" : "0.4.2" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits/tree/master/password-hash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Traits which describe the functionality of password hashing algorithms, as well as a `no_std`-friendly implementation of the PHC string format (a well-defined subset of the Modular Crypt Format a.k.a. MCF)"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "paste" ,
"version" : "1.0.14" ,
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/paste" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Macros for all your token pasting needs"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "pbkdf2" ,
"version" : "0.11.0" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Generic implementation of PBKDF2"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "percent-encoding" ,
2023-11-27 03:23:56 +01:00
"version" : "2.3.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url/" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Percent encoding and decoding"
} ,
2023-04-12 00:45:23 +02:00
{
2023-05-29 09:54:00 +02:00
"name" : "percent-encoding-iri" ,
2023-04-12 00:45:23 +02:00
"version" : "2.2.0" ,
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-05-29 09:54:00 +02:00
"description" : "Percent encoding and decoding, preserving non-Latin characters."
2023-04-12 00:45:23 +02:00
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "petgraph" ,
2023-08-23 03:41:30 +02:00
"version" : "0.6.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss|mitchmindtree" ,
"repository" : "https://github.com/petgraph/petgraph" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Graph data structure library. Provides graph types and graph algorithms."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.1" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Runtime support for perfect hash function data structures"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf" ,
2023-07-01 10:26:43 +02:00
"version" : "0.11.2" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Runtime support for perfect hash function data structures"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf_codegen" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Codegen library for PHF types"
} ,
{
"name" : "phf_generator" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "PHF generation logic"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf_generator" ,
2023-07-01 10:26:43 +02:00
"version" : "0.11.2" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "PHF generation logic"
} ,
2021-07-23 11:39:40 +02:00
{
"name" : "phf_macros" ,
2023-07-01 10:26:43 +02:00
"version" : "0.11.2" ,
2021-07-23 11:39:40 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-03-26 00:40:41 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macros to generate types in the phf crate"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf_shared" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Support code shared by PHF libraries"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf_shared" ,
2023-07-01 10:26:43 +02:00
"version" : "0.11.2" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Support code shared by PHF libraries"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "pin-project" ,
2023-08-23 03:41:30 +02:00
"version" : "1.1.3" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/taiki-e/pin-project" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate for safe and ergonomic pin-projection."
} ,
{
"name" : "pin-project-internal" ,
2023-08-23 03:41:30 +02:00
"version" : "1.1.3" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/taiki-e/pin-project" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Implementation detail of the `pin-project` crate."
} ,
2020-11-24 07:57:37 +01:00
{
"name" : "pin-project-lite" ,
2023-09-28 01:53:48 +02:00
"version" : "0.2.13" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-24 07:57:37 +01:00
"repository" : "https://github.com/taiki-e/pin-project-lite" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A lightweight version of pin-project written with declarative macros."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "pin-utils" ,
"version" : "0.1.0" ,
"authors" : "Josef Brandl <mail@josefbrandl.de>" ,
"repository" : "https://github.com/rust-lang-nursery/pin-utils" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Utilities for pinning"
} ,
{
"name" : "pkg-config" ,
2023-07-01 10:26:43 +02:00
"version" : "0.3.27" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/rust-lang/pkg-config-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library to run the pkg-config system tool at build time in order to be used in Cargo build scripts."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "png" ,
"version" : "0.17.10" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/image-png.git" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "PNG decoding and encoding library in pure Rust"
} ,
{
"name" : "pollster" ,
"version" : "0.3.0" ,
"authors" : "Joshua Barretto <joshua.s.barretto@gmail.com>" ,
"repository" : "https://github.com/zesterer/pollster" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Synchronously block the thread until a future completes"
} ,
2023-10-25 01:28:10 +02:00
{
"name" : "powerfmt" ,
"version" : "0.2.0" ,
"authors" : "Jacob Pratt <jacob@jhpratt.dev>" ,
"repository" : "https://github.com/jhpratt/powerfmt" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "`powerfmt` is a library that provides utilities for formatting values. This crate makes it significantly easier to support filling to a minimum width with alignment, avoid heap allocation, and avoid repetitive calculations."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ppv-lite86" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/cryptocorrosion/cryptocorrosion" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation of the crypto-simd API for x86"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "precomputed-hash" ,
"version" : "0.1.1" ,
"authors" : "Emilio Cobos Álvarez <emilio@crisal.io>" ,
"repository" : "https://github.com/emilio/precomputed-hash" ,
"license" : "MIT" ,
"license_file" : null ,
2023-12-06 04:15:45 +01:00
"description" : "A library intending to be a base dependency to expose a precomputed hash"
} ,
{
"name" : "presser" ,
"version" : "0.3.1" ,
"authors" : "Embark <opensource@embark-studios.com>|Gray Olson <gray@grayolson.com" ,
"repository" : "https://github.com/EmbarkStudios/presser" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate to help you copy things into raw buffers without invoking spooky action at a distance (undefined behavior)."
2021-02-06 04:42:38 +01:00
} ,
Refactor service generation (#2552)
* Automatically elide empty inputs and outputs to backend methods
* Refactor service generation
Despite the fact that the majority of our Protobuf service methods require
an open collection, they were not accessible with just a Collection
object. To access the methods (e.g. because we haven't gotten around to
exposing the correct API in Collection yet), you had to wrap the collection
in a Backend object, and pay a mutex-acquisition cost for each call, even
if you have exclusive access to the object.
This commit migrates the majority of service methods to the Collection, so
they can now be used directly, and improves the ergonomics a bit at the
same time.
The approach taken:
- The service generation now happens in rslib instead of anki_proto, which
avoids the need for trait constraints and associated types.
- Service methods are assumed to be collection-based by default. Instead of
implementing the service on Backend, we now implement it on Collection, which
means our methods no longer need to use self.with_col(...).
- We automatically generate methods in Backend which use self.with_col() to
delegate to the Collection method.
- For methods that are only appropriate for the backend, we add a flag in
the .proto file. The codegen uses this flag to write the method into a
BackendFooService instead of FooService, which the backend implements.
- The flag can also allows us to define separate implementations for collection
and backend, so we can e.g. skip the collection mutex in the i18n service
while also providing the service on a collection.
2023-06-19 07:33:40 +02:00
{
"name" : "prettyplease" ,
2023-09-28 01:53:48 +02:00
"version" : "0.2.15" ,
Refactor service generation (#2552)
* Automatically elide empty inputs and outputs to backend methods
* Refactor service generation
Despite the fact that the majority of our Protobuf service methods require
an open collection, they were not accessible with just a Collection
object. To access the methods (e.g. because we haven't gotten around to
exposing the correct API in Collection yet), you had to wrap the collection
in a Backend object, and pay a mutex-acquisition cost for each call, even
if you have exclusive access to the object.
This commit migrates the majority of service methods to the Collection, so
they can now be used directly, and improves the ergonomics a bit at the
same time.
The approach taken:
- The service generation now happens in rslib instead of anki_proto, which
avoids the need for trait constraints and associated types.
- Service methods are assumed to be collection-based by default. Instead of
implementing the service on Backend, we now implement it on Collection, which
means our methods no longer need to use self.with_col(...).
- We automatically generate methods in Backend which use self.with_col() to
delegate to the Collection method.
- For methods that are only appropriate for the backend, we add a flag in
the .proto file. The codegen uses this flag to write the method into a
BackendFooService instead of FooService, which the backend implements.
- The flag can also allows us to define separate implementations for collection
and backend, so we can e.g. skip the collection mutex in the i18n service
while also providing the service on a collection.
2023-06-19 07:33:40 +02:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/prettyplease" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A minimal `syn` syntax tree pretty-printer"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "proc-macro-crate" ,
2023-11-27 03:23:56 +01:00
"version" : "2.0.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Bastian Köcher <git@kchr.de>" ,
"repository" : "https://github.com/bkchr/proc-macro-crate" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Replacement for crate (macro_rules keyword) in proc-macros"
} ,
{
"name" : "proc-macro2" ,
2023-11-27 03:23:56 +01:00
"version" : "1.0.70" ,
2021-11-18 11:54:00 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>|Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/dtolnay/proc-macro2" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "profiling" ,
"version" : "1.0.11" ,
"authors" : "Philip Degarmo <aclysma@gmail.com>" ,
"repository" : "https://github.com/aclysma/profiling" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "This crate provides a very thin abstraction over other profiler crates."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "prost" ,
2023-11-27 03:23:56 +01:00
"version" : "0.12.3" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
{
"name" : "prost-build" ,
2023-11-27 03:23:56 +01:00
"version" : "0.12.3" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
{
"name" : "prost-derive" ,
2023-11-27 03:23:56 +01:00
"version" : "0.12.3" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
2023-06-16 03:43:12 +02:00
{
"name" : "prost-reflect" ,
2023-09-28 01:55:52 +02:00
"version" : "0.12.0" ,
2023-06-16 03:43:12 +02:00
"authors" : "Andrew Hickman <andrew.hickman1@sky.com>" ,
"repository" : "https://github.com/andrewhickman/prost-reflect" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A protobuf library extending prost with reflection support and dynamic messages."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "prost-types" ,
2023-11-27 03:23:56 +01:00
"version" : "0.12.3" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "pulldown-cmark" ,
2023-07-01 10:26:43 +02:00
"version" : "0.9.3" ,
2021-02-06 06:02:40 +01:00
"authors" : "Raph Levien <raph.levien@gmail.com>|Marcus Klaas de Vries <mail@marcusklaas.nl>" ,
"repository" : "https://github.com/raphlinus/pulldown-cmark" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A pull parser for CommonMark"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "pulp" ,
"version" : "0.18.6" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/pulp/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Safe generic simd"
} ,
{
"name" : "qoi" ,
"version" : "0.4.1" ,
"authors" : "Ivan Smirnov <rust@ivan.smirnov.ie>" ,
"repository" : "https://github.com/aldanor/qoi-rust" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "VERY fast encoder/decoder for QOI (Quite Okay Image) format"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "quote" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.33" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/quote" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Quasi-quoting macro quote!(...)"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "r2d2" ,
"version" : "0.8.10" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/r2d2" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A generic connection pool"
} ,
{
"name" : "r2d2_sqlite" ,
"version" : "0.23.0" ,
"authors" : "Jovansonlee Cesar <ivanceras@gmail.com>|Hugo Woesthuis <hugo@woesthuis.eu>|Jerebtw <jeremialp41@gmail.com>" ,
"repository" : "https://github.com/ivanceras/r2d2-sqlite" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "SQLite and SQLCipher support for the r2d2 connection pool"
} ,
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 03:43:46 +01:00
{
"name" : "rand" ,
"version" : "0.7.3" ,
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Random number generators and other randomness functionality."
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rand" ,
2022-02-25 07:30:59 +01:00
"version" : "0.8.5" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Random number generators and other randomness functionality."
} ,
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 03:43:46 +01:00
{
"name" : "rand_chacha" ,
"version" : "0.2.2" ,
"authors" : "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "ChaCha random number generator"
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rand_chacha" ,
2021-06-16 08:10:57 +02:00
"version" : "0.3.1" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "ChaCha random number generator"
} ,
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 03:43:46 +01:00
{
"name" : "rand_core" ,
"version" : "0.5.1" ,
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core random number generator traits and tools for implementation."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "rand_core" ,
2022-09-24 04:39:21 +02:00
"version" : "0.6.4" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core random number generator traits and tools for implementation."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "rand_distr" ,
"version" : "0.4.3" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Sampling from random number distributions"
} ,
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 03:43:46 +01:00
{
"name" : "rand_hc" ,
"version" : "0.2.0" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HC128 random number generator"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "range-alloc" ,
"version" : "0.1.3" ,
"authors" : "the gfx-rs Developers" ,
"repository" : "https://github.com/gfx-rs/range-alloc" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Generic range allocator"
} ,
{
"name" : "raw-cpuid" ,
"version" : "10.7.0" ,
"authors" : "Gerd Zellweger <mail@gerdzellweger.com>" ,
"repository" : "https://github.com/gz/rust-cpuid" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A library to parse the x86 CPUID instruction, written in rust with no external dependencies. The implementation closely resembles the Intel CPUID manual description. The library does only depend on libcore."
} ,
{
"name" : "raw-window-handle" ,
"version" : "0.5.2" ,
"authors" : "Osspial <osspial@gmail.com>" ,
"repository" : "https://github.com/rust-windowing/raw-window-handle" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "Interoperability library for Rust Windowing applications."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "rawpointer" ,
"version" : "0.2.1" ,
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/rawpointer/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Extra methods for raw pointers and `NonNull<T>`. For example `.post_inc()` and `.pre_dec()` (c.f. `ptr++` and `--ptr`), `offset` and `add` for `NonNull<T>`, and the function `ptrdistance`."
} ,
{
"name" : "rayon" ,
2023-09-28 01:53:48 +02:00
"version" : "1.8.0" ,
2023-09-05 10:45:05 +02:00
"authors" : "Niko Matsakis <niko@alum.mit.edu>|Josh Stone <cuviper@gmail.com>" ,
"repository" : "https://github.com/rayon-rs/rayon" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Simple work-stealing parallelism for Rust"
} ,
{
"name" : "rayon-core" ,
2023-09-28 01:53:48 +02:00
"version" : "1.12.0" ,
2023-09-05 10:45:05 +02:00
"authors" : "Niko Matsakis <niko@alum.mit.edu>|Josh Stone <cuviper@gmail.com>" ,
"repository" : "https://github.com/rayon-rs/rayon" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core APIs for Rayon"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "reborrow" ,
"version" : "0.5.5" ,
"authors" : "sarah <>" ,
"repository" : "https://github.com/sarah-ek/reborrow/" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Emulate reborrowing for user types."
} ,
2023-10-25 01:28:10 +02:00
{
"name" : "redox_syscall" ,
"version" : "0.4.1" ,
"authors" : "Jeremy Soller <jackpot51@gmail.com>" ,
"repository" : "https://gitlab.redox-os.org/redox-os/syscall" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A Rust library to access raw Redox system calls"
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "redox_users" ,
2023-11-27 03:23:56 +01:00
"version" : "0.4.4" ,
2023-07-01 10:26:43 +02:00
"authors" : "Jose Narvaez <goyox86@gmail.com>|Wesley Hershberger <mggmugginsmc@gmail.com>" ,
"repository" : "https://gitlab.redox-os.org/redox-os/users" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A Rust library to access Redox users and groups functionality"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "regex" ,
2023-10-25 01:28:10 +02:00
"version" : "1.10.2" ,
2023-07-31 04:20:07 +02:00
"authors" : "The Rust Project Developers|Andrew Gallant <jamslam@gmail.com>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/regex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs."
} ,
2022-06-01 12:26:16 +02:00
{
"name" : "regex-automata" ,
"version" : "0.1.10" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/regex-automata" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Automata construction and matching using regular expressions."
} ,
2023-07-31 04:20:07 +02:00
{
"name" : "regex-automata" ,
2023-10-25 01:28:10 +02:00
"version" : "0.4.3" ,
2023-07-31 04:20:07 +02:00
"authors" : "The Rust Project Developers|Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/rust-lang/regex/tree/master/regex-automata" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Automata construction and matching using regular expressions."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "regex-syntax" ,
2023-04-12 00:25:42 +02:00
"version" : "0.6.29" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/regex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A regular expression parser."
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "regex-syntax" ,
2023-10-25 01:28:10 +02:00
"version" : "0.8.2" ,
2023-07-31 04:20:07 +02:00
"authors" : "The Rust Project Developers|Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/rust-lang/regex/tree/master/regex-syntax" ,
2023-07-01 10:26:43 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A regular expression parser."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "renderdoc-sys" ,
"version" : "1.0.0" ,
"authors" : "Eyal Kalderon <ebkalderon@gmail.com>" ,
"repository" : "https://github.com/ebkalderon/renderdoc-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low-level bindings to the RenderDoc API"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "reqwest" ,
2023-10-25 01:28:10 +02:00
"version" : "0.11.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/reqwest" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "higher level HTTP client library"
} ,
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 03:43:46 +01:00
{
"name" : "retain_mut" ,
"version" : "0.1.9" ,
"authors" : "Xidorn Quan <me@upsuper.org>" ,
"repository" : "https://github.com/upsuper/retain_mut" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provide retain_mut method that has the same functionality as retain but gives mutable borrow to the predicate."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ring" ,
2023-12-06 04:15:45 +01:00
"version" : "0.17.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Smith <brian@briansmith.org>" ,
"repository" : "https://github.com/briansmith/ring" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Safe, fast, small crypto using Rust."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "rmp" ,
"version" : "0.8.12" ,
"authors" : "Evgeny Safronov <division494@gmail.com>" ,
"repository" : "https://github.com/3Hren/msgpack-rust" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Pure Rust MessagePack serialization implementation"
} ,
{
"name" : "rmp-serde" ,
"version" : "1.1.2" ,
"authors" : "Evgeny Safronov <division494@gmail.com>" ,
"repository" : "https://github.com/3Hren/msgpack-rust" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Serde bindings for RMP"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "rusqlite" ,
2023-11-27 03:23:56 +01:00
"version" : "0.30.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rusqlite developers" ,
"repository" : "https://github.com/rusqlite/rusqlite" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Ergonomic wrapper for SQLite"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "rustc-demangle" ,
2023-07-01 10:26:43 +02:00
"version" : "0.1.23" ,
2022-10-21 10:02:12 +02:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/rustc-demangle" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust compiler symbol demangling."
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rustc-hash" ,
"version" : "1.1.0" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang-nursery/rustc-hash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "speed, non-cryptographic hash used in rustc"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "rustix" ,
2023-12-06 04:15:45 +01:00
"version" : "0.38.26" ,
2022-12-07 08:00:14 +01:00
"authors" : "Dan Gohman <dev@sunfishcode.online>|Jakub Konka <kubkon@jakubkonka.com>" ,
"repository" : "https://github.com/bytecodealliance/rustix" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Safe Rust bindings to POSIX/Unix/Linux/Winsock2-like syscalls"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "rustls" ,
2023-11-27 03:23:56 +01:00
"version" : "0.21.9" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/rustls/rustls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Rustls is a modern TLS library written in Rust."
} ,
2021-06-18 10:15:41 +02:00
{
"name" : "rustls-native-certs" ,
2023-07-01 10:26:43 +02:00
"version" : "0.6.3" ,
"authors" : null ,
2021-06-18 10:15:41 +02:00
"repository" : "https://github.com/ctz/rustls-native-certs" ,
"license" : "Apache-2.0 OR ISC OR MIT" ,
"license_file" : null ,
"description" : "rustls-native-certs allows rustls to use the platform native certificate store"
} ,
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 03:43:46 +01:00
{
"name" : "rustls-pemfile" ,
2023-11-27 03:23:56 +01:00
"version" : "1.0.4" ,
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 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/rustls/pemfile" ,
"license" : "Apache-2.0 OR ISC OR MIT" ,
"license_file" : null ,
"description" : "Basic .pem file parser for keys and certificates"
} ,
2023-07-01 10:26:43 +02:00
{
"name" : "rustls-webpki" ,
2023-10-25 01:28:10 +02:00
"version" : "0.101.7" ,
2023-07-01 10:26:43 +02:00
"authors" : null ,
"repository" : "https://github.com/rustls/webpki" ,
2023-08-23 03:41:30 +02:00
"license" : "ISC" ,
"license_file" : null ,
2023-07-01 10:26:43 +02:00
"description" : "Web PKI X.509 Certificate Verification."
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "rustversion" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.14" ,
2021-10-02 12:42:03 +02:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/rustversion" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Conditional compilation according to rustc compiler version"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ryu" ,
2023-08-23 03:41:30 +02:00
"version" : "1.0.15" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/ryu" ,
"license" : "Apache-2.0 OR BSL-1.0" ,
"license_file" : null ,
"description" : "Fast floating point to string conversion"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "safetensors" ,
"version" : "0.3.3" ,
"authors" : null ,
"repository" : "https://github.com/huggingface/safetensors" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Provides functions to read and write safetensors which aim to be safer than their PyTorch counterpart. The format is 8 bytes which is an unsized int, being the size of a JSON header, the JSON header refers the `dtype` the `shape` and `data_offsets` which are the offsets for the values in the rest of the file."
} ,
2023-06-30 07:44:47 +02:00
{
"name" : "same-file" ,
"version" : "1.0.6" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/same-file" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "A simple crate for determining whether two file paths point to the same file."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "sanitize-filename" ,
"version" : "0.5.0" ,
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/sanitize-filename" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A simple filename sanitizer, based on Node's sanitize-filename"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "schannel" ,
2023-08-23 03:41:30 +02:00
"version" : "0.1.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Steffen Butzer <steffen.butzer@outlook.com>" ,
"repository" : "https://github.com/steffengy/schannel-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Schannel bindings for rust, allowing SSL/TLS (e.g. https) without openssl"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "scheduled-thread-pool" ,
"version" : "0.2.7" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/scheduled-thread-pool" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A scheduled thread pool"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "scopeguard" ,
2023-08-23 03:41:30 +02:00
"version" : "1.2.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/scopeguard" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). Defines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as shorthands for guards with one of the implemented strategies."
} ,
{
"name" : "sct" ,
2023-10-25 01:28:10 +02:00
"version" : "0.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Joseph Birr-Pixton <jpixton@gmail.com>" ,
2023-10-25 01:28:10 +02:00
"repository" : "https://github.com/rustls/sct.rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Certificate transparency SCT verification library"
} ,
{
"name" : "security-framework" ,
2023-08-23 03:41:30 +02:00
"version" : "2.9.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Kornel <kornel@geekhood.net>" ,
"repository" : "https://github.com/kornelski/rust-security-framework" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Security.framework bindings for macOS and iOS"
} ,
{
"name" : "security-framework-sys" ,
2023-08-23 03:41:30 +02:00
"version" : "2.9.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Kornel <kornel@geekhood.net>" ,
"repository" : "https://github.com/kornelski/rust-security-framework" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Apple `Security.framework` low-level FFI bindings"
} ,
2021-10-26 00:16:40 +02:00
{
"name" : "self_cell" ,
2023-11-12 01:39:42 +01:00
"version" : "0.10.3" ,
"authors" : "Lukas Bergdoll <lukas.bergdoll@gmail.com>" ,
"repository" : "https://github.com/Voultapher/self_cell" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Safe-to-use proc-macro-free self-referential structs in stable Rust."
} ,
{
"name" : "self_cell" ,
"version" : "1.0.2" ,
2021-10-26 00:16:40 +02:00
"authors" : "Lukas Bergdoll <lukas.bergdoll@gmail.com>" ,
"repository" : "https://github.com/Voultapher/self_cell" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Safe-to-use proc-macro-free self-referential structs in stable Rust."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "seq-macro" ,
"version" : "0.3.5" ,
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/seq-macro" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Macro to repeat sequentially indexed copies of a fragment of code."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "serde" ,
2023-11-27 03:23:56 +01:00
"version" : "1.0.193" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/serde" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A generic serialization/deserialization framework"
} ,
{
"name" : "serde-aux" ,
2023-12-06 04:15:45 +01:00
"version" : "4.3.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Victor Polevoy <maintainer@vpolevoy.com>" ,
2023-12-06 04:15:45 +01:00
"repository" : "https://github.com/iddm/serde-aux" ,
2020-11-12 08:41:47 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "A serde crate's auxiliary library"
} ,
{
"name" : "serde_derive" ,
2023-11-27 03:23:56 +01:00
"version" : "1.0.193" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/serde" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
} ,
{
"name" : "serde_json" ,
2023-11-27 03:23:56 +01:00
"version" : "1.0.108" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/json" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A JSON serialization file format"
} ,
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 03:43:46 +01:00
{
"name" : "serde_path_to_error" ,
2023-08-23 03:41:30 +02:00
"version" : "0.1.14" ,
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 03:43:46 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/path-to-error" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Path to the element that failed to deserialize"
} ,
{
"name" : "serde_qs" ,
"version" : "0.8.5" ,
"authors" : "Sam Scott <sam@osohq.com>" ,
"repository" : "https://github.com/samscott89/serde_qs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Querystrings for Serde"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "serde_repr" ,
2023-11-27 03:23:56 +01:00
"version" : "0.1.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/serde-repr" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Derive Serialize and Deserialize that delegates to the underlying repr of a C-like enum."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "serde_rusqlite" ,
"version" : "0.34.0" ,
"authors" : "Pro <twisted.fall@gmail.com>" ,
"repository" : "https://github.com/twistedfall/serde_rusqlite" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Serialize/deserialize rusqlite rows"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "serde_tuple" ,
"version" : "0.5.0" ,
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/serde_tuple" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "De/serialize structs with named fields as array of values"
} ,
{
"name" : "serde_tuple_macros" ,
"version" : "0.5.0" ,
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/serde_tuple" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "De/serialize structs with named fields as array of values"
} ,
{
"name" : "serde_urlencoded" ,
2022-02-25 07:30:59 +01:00
"version" : "0.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Anthony Ramine <n.oxyde@gmail.com>" ,
"repository" : "https://github.com/nox/serde_urlencoded" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "`x-www-form-urlencoded` meets Serde"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "sha1" ,
2023-09-28 01:53:48 +02:00
"version" : "0.10.6" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/hashes" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "SHA-1 hash function"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "sha2" ,
"version" : "0.10.8" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/hashes" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "sharded-slab" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.7" ,
2022-12-24 01:44:40 +01:00
"authors" : "Eliza Weisman <eliza@buoyant.io>" ,
"repository" : "https://github.com/hawkw/sharded-slab" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A lock-free concurrent slab."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "signal-hook" ,
"version" : "0.3.17" ,
"authors" : "Michal 'vorner' Vaner <vorner@vorner.cz>|Thomas Himmelstoss <thimm@posteo.de>" ,
"repository" : "https://github.com/vorner/signal-hook" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Unix signal handling"
} ,
2021-12-20 06:04:19 +01:00
{
"name" : "signal-hook-registry" ,
2023-04-12 00:25:42 +02:00
"version" : "1.4.1" ,
2021-12-20 06:04:19 +01:00
"authors" : "Michal 'vorner' Vaner <vorner@vorner.cz>|Masaki Hara <ackie.h.gmai@gmail.com>" ,
"repository" : "https://github.com/vorner/signal-hook" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Backend crate for signal-hook"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "simd-adler32" ,
"version" : "0.3.7" ,
"authors" : "Marvin Countryman <me@maar.vin>" ,
"repository" : "https://github.com/mcountryman/simd-adler32" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A SIMD-accelerated Adler-32 hash algorithm implementation."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "siphasher" ,
2023-09-28 01:53:48 +02:00
"version" : "0.3.11" ,
2021-02-06 04:42:38 +01:00
"authors" : "Frank Denis <github@pureftpd.org>" ,
"repository" : "https://github.com/jedisct1/rust-siphash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "SipHash-2-4, SipHash-1-3 and 128-bit variants in pure Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "slab" ,
2023-08-23 03:41:30 +02:00
"version" : "0.4.9" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>" ,
2021-04-27 14:18:12 +02:00
"repository" : "https://github.com/tokio-rs/slab" ,
2020-11-12 08:41:47 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Pre-allocated storage for a uniform data type"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "slotmap" ,
"version" : "1.0.7" ,
"authors" : "Orson Peters <orsonpeters@gmail.com>" ,
"repository" : "https://github.com/orlp/slotmap" ,
"license" : "Zlib" ,
"license_file" : null ,
"description" : "Slotmap data structure"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "smallvec" ,
2023-11-27 03:23:56 +01:00
"version" : "1.11.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/rust-smallvec" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "'Small vector' optimization: store up to a small number of items on the stack"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "snafu" ,
2023-08-23 03:41:30 +02:00
"version" : "0.7.5" ,
2022-10-21 10:02:12 +02:00
"authors" : "Jake Goulding <jake.goulding@gmail.com>" ,
"repository" : "https://github.com/shepmaster/snafu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An ergonomic error handling library"
} ,
{
"name" : "snafu-derive" ,
2023-08-23 03:41:30 +02:00
"version" : "0.7.5" ,
2022-10-21 10:02:12 +02:00
"authors" : "Jake Goulding <jake.goulding@gmail.com>" ,
"repository" : "https://github.com/shepmaster/snafu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An ergonomic error handling library"
} ,
2022-02-10 00:55:43 +01:00
{
"name" : "snowflake" ,
"version" : "1.3.0" ,
"authors" : "Steven Allen <steven@stebalien.com>" ,
"repository" : "https://github.com/Stebalien/snowflake" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A module for generating guaranteed process unique IDs."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "socket2" ,
2023-10-25 01:28:10 +02:00
"version" : "0.4.10" ,
2021-04-27 14:18:12 +02:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Thomas de Zeeuw <thomasdezeeuw@gmail.com>" ,
"repository" : "https://github.com/rust-lang/socket2" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Utilities for handling networking sockets with a maximal amount of configuration possible intended."
} ,
2023-08-23 03:41:30 +02:00
{
"name" : "socket2" ,
2023-10-25 01:28:10 +02:00
"version" : "0.5.5" ,
2023-08-23 03:41:30 +02:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Thomas de Zeeuw <thomasdezeeuw@gmail.com>" ,
"repository" : "https://github.com/rust-lang/socket2" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Utilities for handling networking sockets with a maximal amount of configuration possible intended."
} ,
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 03:43:46 +01:00
{
"name" : "spin" ,
2023-04-12 00:25:42 +02:00
"version" : "0.9.8" ,
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 03:43:46 +01:00
"authors" : "Mathijs van de Nes <git@mathijs.vd-nes.nl>|John Ericson <git@JohnEricson.me>|Joshua Barretto <joshua.s.barretto@gmail.com>" ,
"repository" : "https://github.com/mvdnes/spin-rs.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Spin-based synchronization primitives"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "spirv" ,
"version" : "0.2.0+1.5.4" ,
"authors" : "Lei Zhang <antiagainst@gmail.com>" ,
"repository" : "https://github.com/gfx-rs/rspirv" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Rust definition of SPIR-V structs and enums"
} ,
{
"name" : "stable_deref_trait" ,
"version" : "1.2.0" ,
"authors" : "Robert Grosse <n210241048576@gmail.com>" ,
"repository" : "https://github.com/storyyeller/stable_deref_trait" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An unsafe marker trait for types like Box and Rc that dereference to a stable address even when moved, and hence can be used with libraries such as owning_ref and rental."
} ,
{
"name" : "static_assertions" ,
"version" : "1.1.0" ,
"authors" : "Nikolai Vazquez" ,
"repository" : "https://github.com/nvzqz/static-assertions-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compile-time assertions to ensure that invariants are met."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "string_cache" ,
2023-04-12 00:25:42 +02:00
"version" : "0.8.7" ,
2021-02-06 04:42:38 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/string-cache" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A string interning library for Rust, developed as part of the Servo project."
} ,
{
"name" : "string_cache_codegen" ,
2022-09-24 04:39:21 +02:00
"version" : "0.5.2" ,
2021-02-06 04:42:38 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/string-cache" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A codegen library for string-cache, developed as part of the Servo project."
} ,
2021-03-07 10:08:03 +01:00
{
"name" : "strum" ,
2023-07-01 10:26:43 +02:00
"version" : "0.25.0" ,
2021-03-07 10:08:03 +01:00
"authors" : "Peter Glotfelty <peter.glotfelty@microsoft.com>" ,
"repository" : "https://github.com/Peternator7/strum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Helpful macros for working with enums and strings"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "strum_macros" ,
2023-10-25 01:28:10 +02:00
"version" : "0.25.3" ,
2021-03-07 10:08:03 +01:00
"authors" : "Peter Glotfelty <peter.glotfelty@microsoft.com>" ,
"repository" : "https://github.com/Peternator7/strum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Helpful macros for working with enums and strings"
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "subtle" ,
2023-07-01 10:26:43 +02:00
"version" : "2.5.0" ,
2022-01-15 05:59:43 +01:00
"authors" : "Isis Lovecruft <isis@patternsinthevoid.net>|Henry de Valence <hdevalence@hdevalence.ca>" ,
"repository" : "https://github.com/dalek-cryptography/subtle" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "Pure-Rust traits and utilities for constant-time cryptographic implementations."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "syn" ,
2023-04-12 00:25:42 +02:00
"version" : "1.0.109" ,
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/syn" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Parser for Rust source code"
} ,
{
"name" : "syn" ,
2023-11-27 03:23:56 +01:00
"version" : "2.0.39" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/syn" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser for Rust source code"
} ,
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 03:43:46 +01:00
{
"name" : "sync_wrapper" ,
2023-04-12 00:25:42 +02:00
"version" : "0.1.2" ,
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 03:43:46 +01:00
"authors" : "Actyx AG <developer@actyx.io>" ,
"repository" : "https://github.com/Actyx/sync_wrapper" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A tool for enlisting the compiler’ s help in proving the absence of concurrency"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "synstructure" ,
"version" : "0.13.0" ,
"authors" : "Nika Layzell <nika@thelayzells.com>" ,
"repository" : "https://github.com/mystor/synstructure" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Helper methods and macros for custom derives"
} ,
2023-10-25 01:28:10 +02:00
{
"name" : "system-configuration" ,
"version" : "0.5.1" ,
"authors" : "Mullvad VPN" ,
"repository" : "https://github.com/mullvad/system-configuration-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings to SystemConfiguration framework for macOS"
} ,
{
"name" : "system-configuration-sys" ,
"version" : "0.5.0" ,
"authors" : "Mullvad VPN" ,
"repository" : "https://github.com/mullvad/system-configuration-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low level bindings to SystemConfiguration framework for macOS"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "tch" ,
"version" : "0.14.0" ,
"authors" : "Laurent Mazare <lmazare@gmail.com>" ,
"repository" : "https://github.com/LaurentMazare/tch-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust wrappers for the PyTorch C++ api (libtorch)."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tempfile" ,
2023-11-27 03:23:56 +01:00
"version" : "3.8.1" ,
2023-03-06 09:23:19 +01:00
"authors" : "Steven Allen <steven@stebalien.com>|The Rust Project Developers|Ashley Mannix <ashleymannix@live.com.au>|Jason White <me@jasonwhite.io>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/Stebalien/tempfile" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library for managing temporary files and directories."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "tendril" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.3" ,
2021-02-06 04:42:38 +01:00
"authors" : "Keegan McAllister <mcallister.keegan@gmail.com>|Simon Sapin <simon.sapin@exyr.org>|Chris Morgan <me@chrismorgan.info>" ,
"repository" : "https://github.com/servo/tendril" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compact buffer/string type for zero-copy parsing"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "termcolor" ,
"version" : "1.4.0" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/termcolor" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "A simple cross platform library for writing colored text to a terminal."
} ,
{
"name" : "text_placeholder" ,
"version" : "0.5.0" ,
"authors" : "Bernardo Araujo <bernardo.amc@gmail.com>" ,
"repository" : "https://github.com/bernardoamc/text-placeholder" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A flexible text template engine"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "thiserror" ,
2023-10-25 01:28:10 +02:00
"version" : "1.0.50" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/thiserror" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "derive(Error)"
} ,
{
"name" : "thiserror-impl" ,
2023-10-25 01:28:10 +02:00
"version" : "1.0.50" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/thiserror" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation detail of the `thiserror` crate"
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "thread-tree" ,
"version" : "0.3.3" ,
"authors" : "bluss <>" ,
"repository" : "https://github.com/bluss/thread-tree" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A tree-structured thread pool for splitting jobs hierarchically on worker threads. The tree structure means that there is no contention between workers when delivering jobs."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "thread_local" ,
2023-04-12 00:25:42 +02:00
"version" : "1.1.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/thread_local-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Per-object thread-local storage"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "tiff" ,
"version" : "0.9.0" ,
"authors" : "The image-rs Developers" ,
"repository" : "https://github.com/image-rs/image-tiff" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "TIFF decoding and encoding library in pure Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "time" ,
2023-10-25 01:28:10 +02:00
"version" : "0.3.30" ,
2022-12-07 08:00:14 +01:00
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/time-rs/time" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Date and time library. Fully interoperable with the standard library. Mostly compatible with #![no_std]."
2020-11-12 08:41:47 +01:00
} ,
2022-02-25 07:30:59 +01:00
{
2022-12-07 08:00:14 +01:00
"name" : "time-core" ,
2023-09-28 01:53:48 +02:00
"version" : "0.1.2" ,
2022-02-25 07:30:59 +01:00
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
"repository" : "https://github.com/time-rs/time" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "This crate is an implementation detail and should not be relied upon directly."
2022-02-25 07:30:59 +01:00
} ,
{
"name" : "time-macros" ,
2023-09-28 01:53:48 +02:00
"version" : "0.2.15" ,
2022-02-25 07:30:59 +01:00
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
"repository" : "https://github.com/time-rs/time" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Procedural macros for the time crate. This crate is an implementation detail and should not be relied upon directly."
2022-02-25 07:30:59 +01:00
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tinystr" ,
2023-11-27 03:23:56 +01:00
"version" : "0.7.5" ,
2022-12-07 08:00:14 +01:00
"authors" : "The ICU4X Project Developers" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
2023-09-28 01:53:48 +02:00
"license" : null ,
"license_file" : "LICENSE" ,
2020-11-12 08:41:47 +01:00
"description" : "A small ASCII-only bounded length string representation."
} ,
{
"name" : "tinyvec" ,
2022-09-24 04:39:21 +02:00
"version" : "1.6.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Lokathor <zefria@gmail.com>" ,
"repository" : "https://github.com/Lokathor/tinyvec" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR Zlib" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "`tinyvec` provides 100% safe vec-like data structures."
} ,
{
"name" : "tinyvec_macros" ,
2023-04-12 00:25:42 +02:00
"version" : "0.1.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Soveu <marx.tomasz@gmail.com>" ,
"repository" : "https://github.com/Soveu/tinyvec_macros" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR Zlib" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Some macros for tiny containers"
} ,
{
"name" : "tokio" ,
2023-11-27 03:23:56 +01:00
"version" : "1.34.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications."
} ,
2021-07-23 11:39:40 +02:00
{
"name" : "tokio-macros" ,
2023-11-27 03:23:56 +01:00
"version" : "2.2.0" ,
2021-07-23 11:39:40 +02:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tokio's proc macros."
} ,
2021-04-27 14:18:12 +02:00
{
"name" : "tokio-native-tls" ,
2023-04-12 00:25:42 +02:00
"version" : "0.3.1" ,
2021-04-27 14:18:12 +02:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tls" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An implementation of TLS/SSL streams for Tokio using native-tls giving an implementation of TLS for nonblocking I/O streams."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tokio-rustls" ,
2023-07-01 10:26:43 +02:00
"version" : "0.24.1" ,
"authors" : null ,
"repository" : "https://github.com/rustls/tokio-rustls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Asynchronous TLS/SSL streams for Tokio using Rustls."
} ,
{
"name" : "tokio-socks" ,
2021-04-27 14:18:12 +02:00
"version" : "0.5.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Yilin Chen <sticnarf@gmail.com>" ,
"repository" : "https://github.com/sticnarf/tokio-socks" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Asynchronous SOCKS proxy support for Rust."
} ,
{
"name" : "tokio-util" ,
2023-11-27 03:23:56 +01:00
"version" : "0.7.10" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Additional utilities for working with Tokio."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "toml" ,
"version" : "0.5.11" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/toml-rs/toml" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A native Rust encoder and decoder of TOML-formatted files and streams. Provides implementations of the standard Serialize/Deserialize traits for TOML data to facilitate deserializing and serializing Rust structures."
} ,
2020-11-12 08:41:47 +01:00
{
2023-04-12 00:25:42 +02:00
"name" : "toml_datetime" ,
2023-10-25 01:28:10 +02:00
"version" : "0.6.5" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
2023-01-18 13:24:29 +01:00
"repository" : "https://github.com/toml-rs/toml" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "A TOML-compatible datetime type"
} ,
{
"name" : "toml_edit" ,
2023-11-27 03:23:56 +01:00
"version" : "0.20.7" ,
2023-04-12 00:25:42 +02:00
"authors" : "Andronik Ordian <write@reusable.software>|Ed Page <eopage@gmail.com>" ,
2023-07-01 10:26:43 +02:00
"repository" : "https://github.com/toml-rs/toml" ,
2023-04-12 00:25:42 +02:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Yet another format-preserving TOML parser."
2020-11-12 08:41:47 +01:00
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "torch-sys" ,
"version" : "0.14.0" ,
"authors" : "Laurent Mazare <lmazare@gmail.com>" ,
"repository" : "https://github.com/LaurentMazare/tch-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low-level FFI bindings for the PyTorch C++ api (libtorch)."
} ,
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 03:43:46 +01:00
{
"name" : "tower" ,
"version" : "0.4.13" ,
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tower is a library of modular and reusable components for building robust clients and servers."
} ,
{
"name" : "tower-http" ,
2023-09-28 01:53:48 +02:00
"version" : "0.4.4" ,
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 03:43:46 +01:00
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower-http" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tower middleware and utilities for HTTP clients and servers"
} ,
{
"name" : "tower-layer" ,
"version" : "0.3.2" ,
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Decorates a `Service` to allow easy composition between `Service`s."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tower-service" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Trait representing an asynchronous, request / response based, client or server."
} ,
{
"name" : "tracing" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.40" ,
2020-11-12 08:41:47 +01:00
"authors" : "Eliza Weisman <eliza@buoyant.io>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Application-level tracing for Rust."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "tracing-appender" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.3" ,
2022-12-24 01:44:40 +01:00
"authors" : "Zeki Sherif <zekshi@amazon.com>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides utilities for file appenders and making non-blocking writers."
} ,
{
"name" : "tracing-attributes" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.27" ,
2022-12-24 01:44:40 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>|Eliza Weisman <eliza@buoyant.io>|David Barsky <dbarsky@amazon.com>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Procedural macro attributes for automatically instrumenting functions."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tracing-core" ,
2023-10-25 01:28:10 +02:00
"version" : "0.1.32" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Core primitives for application-level tracing."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "tracing-log" ,
2023-11-27 03:23:56 +01:00
"version" : "0.2.0" ,
2022-12-24 01:44:40 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides compatibility between `tracing` and the `log` crate."
} ,
{
"name" : "tracing-subscriber" ,
2023-11-27 03:23:56 +01:00
"version" : "0.3.18" ,
2022-12-24 01:44:40 +01:00
"authors" : "Eliza Weisman <eliza@buoyant.io>|David Barsky <me@davidbarsky.com>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Utilities for implementing and composing `tracing` subscribers."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "try-lock" ,
2023-01-18 13:24:29 +01:00
"version" : "0.2.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/try-lock" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A lightweight atomic lock."
} ,
{
"name" : "type-map" ,
2021-02-03 11:29:48 +01:00
"version" : "0.4.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/type-map" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Provides a typemap container with FxHashMap"
} ,
{
"name" : "typenum" ,
2023-09-28 01:53:48 +02:00
"version" : "1.17.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Paho Lurie-Gregg <paho@paholg.com>|Andre Bogus <bogusandre@gmail.com>" ,
"repository" : "https://github.com/paholg/typenum" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2021-03-27 05:47:16 +01:00
"description" : "Typenum is a Rust library for type-level numbers evaluated at compile time. It currently supports bits, unsigned integers, and signed integers. It also provides a type-level array of type-level numbers, but its implementation is incomplete."
2020-11-12 08:41:47 +01:00
} ,
2021-07-17 07:36:43 +02:00
{
"name" : "unic-char-property" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Tools — Character Property taxonomy, contracts and build macros"
} ,
{
"name" : "unic-char-range" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Tools — Character Range and Iteration"
} ,
{
"name" : "unic-common" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Common Utilities"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "unic-langid" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-impl" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-macros" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Manish Goregaokar <manishsmail@gmail.com>|Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-macros-impl" ,
2023-12-06 04:15:45 +01:00
"version" : "0.9.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Manish Goregaokar <manishsmail@gmail.com>|Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
2021-07-17 07:36:43 +02:00
{
"name" : "unic-ucd-category" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Database — General Category"
} ,
{
"name" : "unic-ucd-version" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Database — Version"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "unicase" ,
"version" : "2.6.0" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/unicase" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A case-insensitive wrapper around strings."
} ,
{
"name" : "unicode-bidi" ,
2023-04-12 00:25:42 +02:00
"version" : "0.3.13" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/unicode-bidi" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation of the Unicode Bidirectional Algorithm"
} ,
{
2022-09-24 04:39:21 +02:00
"name" : "unicode-ident" ,
2023-09-28 01:53:48 +02:00
"version" : "1.0.12" ,
2022-09-24 04:39:21 +02:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/unicode-ident" ,
"license" : "(MIT OR Apache-2.0) AND Unicode-DFS-2016" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
2020-11-12 08:41:47 +01:00
} ,
{
2022-09-24 04:39:21 +02:00
"name" : "unicode-normalization" ,
"version" : "0.1.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/unicode-rs/unicode-normalization" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "This crate provides functions for normalization of Unicode strings, including Canonical and Compatible Decomposition and Recomposition, as described in Unicode Standard Annex #15."
2020-11-12 08:41:47 +01:00
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "unicode-segmentation" ,
2023-04-12 00:25:42 +02:00
"version" : "1.10.1" ,
2022-10-21 10:02:12 +02:00
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-rs/unicode-segmentation" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules."
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "unicode-width" ,
2023-09-28 01:53:48 +02:00
"version" : "0.1.11" ,
2021-02-06 06:02:40 +01:00
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-rs/unicode-width" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "unicode-xid" ,
"version" : "0.2.4" ,
"authors" : "erick.tryzelaar <erick.tryzelaar@gmail.com>|kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-rs/unicode-xid" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "untrusted" ,
2023-10-25 01:28:10 +02:00
"version" : "0.9.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Smith <brian@briansmith.org>" ,
"repository" : "https://github.com/briansmith/untrusted" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted inputs in Rust."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "ureq" ,
"version" : "2.9.1" ,
"authors" : "Martin Algesten <martin@algesten.se>|Jacob Hoffman-Andrews <ureq@hoffman-andrews.com>" ,
"repository" : "https://github.com/algesten/ureq" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Simple, safe HTTP client"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "url" ,
2023-11-27 03:23:56 +01:00
"version" : "2.5.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "URL library for Rust, based on the WHATWG URL Standard"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "utf-8" ,
2021-04-27 14:18:12 +02:00
"version" : "0.7.6" ,
2021-02-06 04:42:38 +01:00
"authors" : "Simon Sapin <simon.sapin@exyr.org>" ,
"repository" : "https://github.com/SimonSapin/rust-utf8" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Incremental, zero-copy UTF-8 decoding with error handling"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "utime" ,
"version" : "0.3.1" ,
"authors" : "Hyeon Kim <simnalamburt@gmail.com>" ,
"repository" : "https://github.com/simnalamburt/utime" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A missing utime function for Rust."
} ,
2023-09-05 10:45:05 +02:00
{
"name" : "uuid" ,
2023-11-27 03:23:56 +01:00
"version" : "1.6.1" ,
2023-09-05 10:45:05 +02:00
"authors" : "Ashley Mannix<ashleymannix@live.com.au>|Christopher Armstrong|Dylan DPC<dylan.dpc@gmail.com>|Hunar Roop Kahlon<hunar.roop@gmail.com>" ,
"repository" : "https://github.com/uuid-rs/uuid" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A library to generate and parse UUIDs."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "valuable" ,
"version" : "0.1.0" ,
"authors" : null ,
"repository" : "https://github.com/tokio-rs/valuable" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Object-safe value inspection, used to pass un-typed structured data across trait-object boundaries."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "vcpkg" ,
2021-06-25 07:35:25 +02:00
"version" : "0.2.15" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jim McGrath <jimmc2@gmail.com>" ,
"repository" : "https://github.com/mcgoo/vcpkg-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library to find native dependencies in a vcpkg tree at build time in order to be used in Cargo build scripts."
} ,
{
"name" : "version_check" ,
2022-01-15 05:59:43 +01:00
"version" : "0.9.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sergio Benitez <sb@sergio.bz>" ,
"repository" : "https://github.com/SergioBenitez/version_check" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tiny crate to check the version of the installed/running rustc."
} ,
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 03:43:46 +01:00
{
"name" : "waker-fn" ,
2023-09-28 01:53:48 +02:00
"version" : "1.1.1" ,
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 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
2023-09-28 01:53:48 +02:00
"repository" : "https://github.com/smol-rs/waker-fn" ,
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 03:43:46 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Convert closures into wakers"
} ,
2023-06-30 07:44:47 +02:00
{
"name" : "walkdir" ,
2023-09-28 01:53:48 +02:00
"version" : "2.4.0" ,
2023-06-30 07:44:47 +02:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/walkdir" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Recursively walk a directory."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "want" ,
2023-07-01 10:26:43 +02:00
"version" : "0.3.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/want" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Detect when another Future wants a result."
} ,
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 03:43:46 +01:00
{
"name" : "wasi" ,
"version" : "0.9.0+wasi-snapshot-preview1" ,
"authors" : "The Cranelift Project Developers" ,
"repository" : "https://github.com/bytecodealliance/wasi" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Experimental WASI API bindings for Rust"
} ,
2022-02-25 07:30:59 +01:00
{
"name" : "wasi" ,
"version" : "0.11.0+wasi-snapshot-preview1" ,
"authors" : "The Cranelift Project Developers" ,
"repository" : "https://github.com/bytecodealliance/wasi" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Experimental WASI API bindings for Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "wasm-bindgen" ,
2023-12-06 04:15:45 +01:00
"version" : "0.2.89" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Easy support for interacting between JS and Rust."
} ,
{
"name" : "wasm-bindgen-backend" ,
2023-12-06 04:15:45 +01:00
"version" : "0.2.89" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Backend code generation of the wasm-bindgen tool"
} ,
{
"name" : "wasm-bindgen-futures" ,
2023-12-06 04:15:45 +01:00
"version" : "0.4.39" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bridging the gap between Rust Futures and JavaScript Promises"
} ,
{
"name" : "wasm-bindgen-macro" ,
2023-12-06 04:15:45 +01:00
"version" : "0.2.89" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Definition of the `#[wasm_bindgen]` attribute, an internal dependency"
} ,
{
"name" : "wasm-bindgen-macro-support" ,
2023-12-06 04:15:45 +01:00
"version" : "0.2.89" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The part of the implementation of the `#[wasm_bindgen]` attribute that is not in the shared backend crate"
} ,
{
"name" : "wasm-bindgen-shared" ,
2023-12-06 04:15:45 +01:00
"version" : "0.2.89" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Shared support between wasm-bindgen and wasm-bindgen cli, an internal dependency."
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "wasm-streams" ,
2023-08-23 03:41:30 +02:00
"version" : "0.3.0" ,
2023-04-12 00:25:42 +02:00
"authors" : "Mattias Buelens <mattias@buelens.com>" ,
"repository" : "https://github.com/MattiasBuelens/wasm-streams/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bridging between web streams and Rust streams using WebAssembly"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "web-sys" ,
2023-12-06 04:15:45 +01:00
"version" : "0.3.64" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings for all Web APIs, a procedurally generated crate from WebIDL"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "webpki-roots" ,
2023-11-27 03:23:56 +01:00
"version" : "0.25.3" ,
2023-08-23 03:41:30 +02:00
"authors" : null ,
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 03:43:46 +01:00
"repository" : "https://github.com/rustls/webpki-roots" ,
2020-11-15 05:02:53 +01:00
"license" : "MPL-2.0" ,
"license_file" : null ,
"description" : "Mozilla's CA root certificates for use with webpki"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "weezl" ,
"version" : "0.1.7" ,
"authors" : "HeroicKatora <andreas.molzer@gmx.de>" ,
"repository" : "https://github.com/image-rs/lzw.git" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast LZW compression and decompression."
} ,
{
"name" : "wgpu" ,
"version" : "0.18.0" ,
"authors" : "wgpu developers" ,
"repository" : "https://github.com/gfx-rs/wgpu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rusty WebGPU API wrapper"
} ,
{
"name" : "wgpu-core" ,
"version" : "0.18.1" ,
"authors" : "wgpu developers" ,
"repository" : "https://github.com/gfx-rs/wgpu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "WebGPU core logic on wgpu-hal"
} ,
{
"name" : "wgpu-hal" ,
"version" : "0.18.1" ,
"authors" : "wgpu developers" ,
"repository" : "https://github.com/gfx-rs/wgpu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "WebGPU hardware abstraction layer"
} ,
{
"name" : "wgpu-types" ,
"version" : "0.18.0" ,
"authors" : "wgpu developers" ,
"repository" : "https://github.com/gfx-rs/wgpu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "WebGPU types"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "which" ,
2023-09-28 01:53:48 +02:00
"version" : "4.4.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Harry Fei <tiziyuanfang@gmail.com>" ,
"repository" : "https://github.com/harryfei/which-rs.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "widestring" ,
"version" : "1.0.2" ,
"authors" : null ,
"repository" : "https://github.com/starkat99/widestring-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A wide string Rust library for converting to and from wide strings, such as those often used in Windows API or other FFI libaries. Both `u16` and `u32` string types are provided, including support for UTF-16 and UTF-32, malformed encoding, C-style strings, etc."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "winapi" ,
"version" : "0.3.9" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Raw FFI bindings for all of Windows API."
} ,
{
"name" : "winapi-i686-pc-windows-gnu" ,
"version" : "0.4.0" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Import libraries for the i686-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead."
} ,
{
"name" : "winapi-util" ,
2023-09-28 01:53:48 +02:00
"version" : "0.1.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/winapi-util" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A dumping ground for high level safe wrappers over winapi."
} ,
{
"name" : "winapi-x86_64-pc-windows-gnu" ,
"version" : "0.4.0" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Import libraries for the x86_64-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "windows" ,
"version" : "0.51.1" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
2023-09-28 01:55:52 +02:00
{
"name" : "windows" ,
2023-11-27 03:23:56 +01:00
"version" : "0.52.0" ,
2023-09-28 01:55:52 +02:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
{
"name" : "windows-core" ,
"version" : "0.51.1" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows-core" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
2023-05-29 09:54:00 +02:00
{
"name" : "windows-sys" ,
"version" : "0.48.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "windows-sys" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "windows-targets" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2023-04-12 00:25:42 +02:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import libs for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows-targets" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import libs for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "windows_aarch64_gnullvm" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "Import lib for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_aarch64_gnullvm" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "windows_aarch64_msvc" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2023-04-12 00:25:42 +02:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_aarch64_msvc" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "windows_i686_gnu" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2022-02-28 01:28:39 +01:00
"authors" : "Microsoft" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/microsoft/windows-rs" ,
2022-02-28 01:28:39 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "Import lib for Windows"
2022-02-28 01:28:39 +01:00
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_i686_gnu" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows_i686_msvc" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2022-02-28 01:28:39 +01:00
"authors" : "Microsoft" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/microsoft/windows-rs" ,
2022-02-28 01:28:39 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "Import lib for Windows"
2022-02-28 01:28:39 +01:00
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_i686_msvc" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows_x86_64_gnu" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2023-04-12 00:25:42 +02:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_x86_64_gnu" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "windows_x86_64_gnullvm" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2023-04-12 00:25:42 +02:00
"description" : "Import lib for Windows"
2022-12-07 08:00:14 +01:00
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_x86_64_gnullvm" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2022-02-28 01:28:39 +01:00
{
"name" : "windows_x86_64_msvc" ,
2023-08-23 03:41:30 +02:00
"version" : "0.48.5" ,
2023-04-12 00:25:42 +02:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-11-27 03:23:56 +01:00
{
"name" : "windows_x86_64_msvc" ,
"version" : "0.52.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Import lib for Windows"
} ,
2023-04-12 00:25:42 +02:00
{
"name" : "winnow" ,
2023-12-06 04:15:45 +01:00
"version" : "0.5.25" ,
2023-04-12 00:25:42 +02:00
"authors" : null ,
"repository" : "https://github.com/winnow-rs/winnow" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A byte-oriented, zero-copy, parser combinators library"
2022-12-07 08:00:14 +01:00
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "winreg" ,
2023-08-23 03:41:30 +02:00
"version" : "0.50.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Igor Shaula <gentoo90@gmail.com>" ,
"repository" : "https://github.com/gentoo90/winreg-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Rust bindings to MS Windows Registry API"
} ,
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 03:43:46 +01:00
{
"name" : "wiremock" ,
2023-12-06 04:15:45 +01:00
"version" : "0.5.22" ,
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 03:43:46 +01:00
"authors" : "Luca Palmieri <rust@lpalmieri.com>" ,
"repository" : "https://github.com/LukeMathWalker/wiremock-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HTTP mocking to test Rust applications."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "xml-rs" ,
"version" : "0.8.19" ,
"authors" : "Vladimir Matveev <vmatveev@citrine.cc>" ,
"repository" : "https://github.com/kornelski/xml-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An XML library in pure Rust"
} ,
{
"name" : "yoke" ,
"version" : "0.7.3" ,
"authors" : "Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Abstraction allowing borrowed data to be carried along with the backing data it borrows from"
} ,
{
"name" : "yoke-derive" ,
"version" : "0.7.3" ,
"authors" : "Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Custom derive for the yoke crate"
} ,
2023-10-25 01:28:10 +02:00
{
"name" : "zerocopy" ,
2023-12-16 00:48:30 +01:00
"version" : "0.7.31" ,
2023-10-25 01:28:10 +02:00
"authors" : "Joshua Liebow-Feeser <joshlf@google.com>" ,
"repository" : "https://github.com/google/zerocopy" ,
2023-11-27 03:23:56 +01:00
"license" : "Apache-2.0 OR BSD-2-Clause OR MIT" ,
2023-10-25 01:28:10 +02:00
"license_file" : null ,
"description" : "Utilities for zero-copy parsing and serialization"
} ,
{
"name" : "zerocopy-derive" ,
2023-12-16 00:48:30 +01:00
"version" : "0.7.31" ,
2023-10-25 01:28:10 +02:00
"authors" : "Joshua Liebow-Feeser <joshlf@google.com>" ,
"repository" : "https://github.com/google/zerocopy" ,
2023-11-27 03:23:56 +01:00
"license" : "Apache-2.0 OR BSD-2-Clause OR MIT" ,
2023-10-25 01:28:10 +02:00
"license_file" : null ,
"description" : "Custom derive for traits from the zerocopy crate"
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "zerofrom" ,
"version" : "0.1.3" ,
"authors" : "Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "ZeroFrom trait for constructing"
} ,
{
"name" : "zerofrom-derive" ,
"version" : "0.1.3" ,
"authors" : "Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Custom derive for the zerofrom crate"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "zip" ,
2023-07-01 10:26:43 +02:00
"version" : "0.6.6" ,
2021-04-27 14:18:12 +02:00
"authors" : "Mathijs van de Nes <git@mathijs.vd-nes.nl>|Marli Frost <marli@frost.red>|Ryan Levick <ryan.levick@gmail.com>" ,
"repository" : "https://github.com/zip-rs/zip.git" ,
2020-11-12 08:41:47 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Library to support the reading and writing of zip files."
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "zstd" ,
"version" : "0.11.2+zstd.1.5.2" ,
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Binding for the zstd compression library."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "zstd" ,
2023-10-25 01:28:10 +02:00
"version" : "0.13.0" ,
2022-12-07 08:00:14 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Binding for the zstd compression library."
} ,
2023-12-06 04:15:45 +01:00
{
"name" : "zstd-safe" ,
"version" : "5.0.2+zstd.1.5.2" ,
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Safe low-level bindings for the zstd compression library."
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "zstd-safe" ,
2023-10-25 01:28:10 +02:00
"version" : "7.0.0" ,
2022-12-07 08:00:14 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Safe low-level bindings for the zstd compression library."
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "zstd-sys" ,
2023-10-25 01:28:10 +02:00
"version" : "2.0.9+zstd.1.5.5" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low-level bindings for the zstd compression library."
2023-12-06 04:15:45 +01:00
} ,
{
"name" : "zune-inflate" ,
"version" : "0.2.54" ,
"authors" : null ,
"repository" : null ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "A heavily optimized deflate decompressor in Pure Rust"
2020-11-12 08:41:47 +01:00
}
]