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

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

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

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

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

The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 12:43:46 +10:00
..
browser Fix unreadable text when searching in sidebar 2023-01-04 18:16:19 +10:00
data Simplify padding definition and center text (#2308) 2023-01-11 12:58:02 +10:00
forms Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
import_export Add default_size argument to restoreGeom(); fix missing dialogs 2022-12-08 22:02:12 +10:00
operations Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
qt Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
__init__.py Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
_macos_helper.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
about.py Tweak focus highlight of some widgets (#2280) 2022-12-21 11:41:57 +10:00
addcards.py add shortcut to close addcards window (#2031) 2022-08-31 20:09:09 +10:00
addons.py Use a webview to show add-on's config help (#2281) 2022-12-21 16:55:31 +10:00
changenotetype.py Add default_size argument to restoreGeom(); fix missing dialogs 2022-12-08 22:02:12 +10:00
clayout.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
colors.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
customstudy.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
dbcheck.py Backup improvements (#1728) 2022-03-21 19:40:42 +10:00
deckbrowser.py Fix some more RTL issues (#2244) 2022-12-08 22:29:56 +10:00
deckchooser.py Make dialogs non-blocking (#1650) 2022-02-10 09:53:13 +10:00
deckconf.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
deckdescription.py Import submodules directly (#1662) 2022-02-13 13:40:47 +10:00
deckoptions.py Deck options: hide webview after showing dialog 2022-12-08 22:18:28 +10:00
editcurrent.py PEP8 editorMode 2022-01-12 15:01:43 +10:00
editor.py Increase delay for mutter 2023-01-11 19:59:34 +10:00
emptycards.py Import submodules directly (#1662) 2022-02-13 13:40:47 +10:00
errors.py Probable fix for "unknown error" 2022-11-23 18:51:56 +10:00
exporting.py Add deck/collection export hooks (#1971) 2022-07-22 12:45:47 +10:00
fields.py Introduce setting to collapse field by default (#1990) 2022-08-31 23:34:39 +10:00
filtered_deck.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
flags.py Introduce new color palette using Sass maps (#2016) 2022-09-16 14:11:18 +10:00
gui_hooks.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
importing.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
legacy.py Import submodules directly (#1662) 2022-02-13 13:40:47 +10:00
main.py Auto-hide toolbar in Reviewer (#2262) 2023-01-09 14:39:31 +10:00
mediacheck.py Add the media_check_did_finish hook (#1889) 2022-05-27 16:25:34 +10:00
mediasrv.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
mediasync.py Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
modelchooser.py Add callback and non-blocking option to StudyDeck (#1643) 2022-02-07 22:05:59 +10:00
models.py Fix kwin hanging when adding new notetype 2022-06-03 11:23:41 +10:00
mpv.py Fix two mpv issues on Windows (#2294) 2023-01-03 11:59:39 +10:00
notetypechooser.py Make dialogs non-blocking (#1650) 2022-02-10 09:53:13 +10:00
overview.py Do not append description button for filtered deck (#2266) 2022-12-11 15:03:11 +10:00
package.py Another attempt at fixing missing cacert.pem 2022-12-30 15:30:53 +10:00
preferences.py Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
profiles.py Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
progress.py fix progress.update(value=0) to not increment progress (#1998) 2022-08-01 20:16:42 +10:00
props.py Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
py.typed mark anki and aqt modules as having typing info 2020-01-13 13:03:37 +10:00
reviewer.py Auto-hide toolbar in Reviewer (#2262) 2023-01-09 14:39:31 +10:00
schema_change_tracker.py add a bunch of return types 2021-02-01 23:53:23 +10:00
sound.py Revert "Probable workaround for mpv failing after a few days on macOS" 2022-12-03 23:30:19 +10:00
stats.py Add default_size argument to restoreGeom(); fix missing dialogs 2022-12-08 22:02:12 +10:00
studydeck.py Fix new deck not being selected (#1681) 2022-02-22 21:51:23 +10:00
stylesheets.py Make QCheckBox more visible (#2314) 2023-01-12 09:16:38 +10:00
switch.py Auto-hide toolbar in Reviewer (#2262) 2023-01-09 14:39:31 +10:00
sync.py Rework syncing code, and replace local sync server (#2329) 2023-01-18 12:43:46 +10:00
tagedit.py switch to new-style PyQt scoped enums and Qt6 2021-10-15 12:57:19 +10:00
taglimit.py Move custom study tag and limit gathering+saving into the backend 2022-03-10 16:23:03 +10:00
taskman.py Add apkg import/export on backend (#1743) 2022-05-02 21:12:46 +10:00
theme.py Auto-hide toolbar in Reviewer (#2262) 2023-01-09 14:39:31 +10:00
toolbar.py Fix toolbar add-on breakages and introduce toolbar tray layout & API (#2301) 2023-01-10 08:48:50 +10:00
tts.py Switch back to winrt to see if it fixes slow TTS 2022-12-06 20:30:54 +10:00
undo.py fix redo menu item showing undo text 2021-08-04 10:28:45 +10:00
update.py Update Python deps 2022-09-24 09:46:43 +10:00
utils.py Add default_size argument to restoreGeom(); fix missing dialogs 2022-12-08 22:02:12 +10:00
webview.py Auto-hide toolbar in Reviewer (#2262) 2023-01-09 14:39:31 +10:00
winpaths.py run pyupgrade over codebase [python upgrade required] 2021-10-04 15:05:48 +10:00