aegir — crate card
Reverse-engineered (from source — verify, don't trust the name)
- One-line pitch: Ægir — a tiny pure-Rust S3 client (SigV4 over ureq, zero-copy reads). Historically: "coexists with
gixwhererust-s3can't" — see the stale-claim note at the bottom; that is no longer true of current gix, and aegir now earns its keep on size and zero-copy alone. - Does: Minimal S3 client with AWS Signature V4 (HMAC-SHA256) signing and path-style addressing (RustFS/MinIO/real S3). Public:
Client(withClient::with_transport),Transportenum,Error/Result. Reads returnbytes::Bytesso bodies pass into arrow/parquet without re-copy. Pluggable byte transport: defaultureq(rustls, TLS+plain); opt-inuringfeature adds an io_uring TCP transport for the plaintext hot path (falls back to ureq for TLS). - Key deps:
ureq(pure-Rust HTTP/rustls),hmac+sha2(SigV4, RustCrypto),bytes(zero-copy bodies),chrono(SigV4/RFC1123 timestamps), optionalio-uring(featureuring; deps only libc/bitflags/cfg-if — no C, no bindgen). - Shape: lib only, 2 modules (
lib.rs~17K + feature-gateduring.rs~17K). Small, no intra-workspace deps. - Observed role in the workspace: Exists specifically for
skade-katalog-bench's S3 backend (--features s3); the bridge into iceberg'sStorage/StorageFactoryisbench/src/s3_storage.rs. Lives as a workspace member under bench/,publish = false. Originally chosen overrust-s3for the gix/maybe-async reason below — that reason has expired, the crate has not.
Fill in (one line each — only the human knows these)
- Primary consumer(s):
- Why it exists (vs the obvious alternative):
- Hard constraint (airgap / no-C-deps / no-FFI / pure-Rust / etc.):
- Release cadence & independence (rides a parent? own repo someday?):
- Status (production / prototype / experimental / stubbed):
- Must-NOT-change invariant:
- Biggest known gap or TODO:
- Anything a newcomer would get wrong about it:
Stale-claim check (2026-07-31)
The "coexists with gix where rust-s3 can't" line — repeated in this crate's description, in bench/Cargo.toml, and formerly across skade's own manifest and module docs — was TRUE and is now EXPIRED. Root cause, measured:
gix-protocol≤ 0.63 depended onmaybe-asyncand itsblocking-clientfeature enabledmaybe-async/is_sync(gix-protocol-0.62.0/Cargo.toml:54 "maybe-async/is_sync",).- Cargo unifies features per crate across the whole graph, so that single edge flipped the macro to sync mode for every crate in the build — including
rust-s3, whose async surface ismaybe-async-annotated. rust-s3 then hadawaitinside sync fns: ~39 "Result<..>is not a future" errors. gix-protocol0.64.0 droppedmaybe-asyncentirely (0 occurrences in its manifest) andgix0.86 requires that line, so nothing can enableis_sync.
Verification recipe (re-run it before trusting either the claim or this refutation):
cargo tree --all-features -e features -i maybe-async
# -> rust-s3 is the ONLY reverse dep, feature "default" (not "is_sync")
cargo tree --all-features -p gix | grep -c maybe-async # -> 0
Consequence: aegir is no longer required for gix coexistence. It is kept for what it independently is — small (no hyper / tokio-rustls stack), zero-copy (bytes::Bytes straight into parquet), and the io_uring plaintext transport. If a future gix reintroduces maybe-async, the constraint returns exactly as described above.