- Add uploadBlob (@21) and downloadBlob (@22) RPCs to Cap'n Proto schema with SHA-256 content addressing and chunked transfer - Server blob handler: 256KB chunks, SHA-256 verification on finalize, .meta JSON sidecar, 50MB size limit, content-addressable storage - Add FileRef (0x08) AppMessage variant with blob_id, filename, file_size, mime_type - /send-file command: read file, compute hash, upload in chunks with progress display, send FileRef via MLS, MIME auto-detection - /download command: fetch blob in chunks with progress, verify hash, save to disk with collision avoidance - 2 new E2E tests: upload/download round-trip with partial reads, hash mismatch rejection (14 E2E tests total) - New error codes: E024-E027 for blob operations
38 lines
1.6 KiB
Rust
38 lines
1.6 KiB
Rust
//! Structured error codes for server RPC responses.
|
||
//!
|
||
//! Every `capnp::Error::failed()` message is prefixed with a stable code
|
||
//! (E001–E020) so clients can match on the code without parsing free-text.
|
||
|
||
pub const E001_BAD_AUTH_VERSION: &str = "E001";
|
||
pub const E002_EMPTY_TOKEN: &str = "E002";
|
||
pub const E003_INVALID_TOKEN: &str = "E003";
|
||
pub const E004_IDENTITY_KEY_LENGTH: &str = "E004";
|
||
pub const E005_PAYLOAD_EMPTY: &str = "E005";
|
||
pub const E006_PAYLOAD_TOO_LARGE: &str = "E006";
|
||
pub const E007_PACKAGE_EMPTY: &str = "E007";
|
||
pub const E008_PACKAGE_TOO_LARGE: &str = "E008";
|
||
pub const E009_STORAGE_ERROR: &str = "E009";
|
||
pub const E010_OPAQUE_ERROR: &str = "E010";
|
||
pub const E011_USERNAME_EMPTY: &str = "E011";
|
||
pub const E012_WIRE_VERSION: &str = "E012";
|
||
pub const E013_HYBRID_KEY_EMPTY: &str = "E013";
|
||
pub const E014_RATE_LIMITED: &str = "E014";
|
||
pub const E015_QUEUE_FULL: &str = "E015";
|
||
pub const E016_IDENTITY_MISMATCH: &str = "E016";
|
||
pub const E017_SESSION_EXPIRED: &str = "E017";
|
||
pub const E018_USER_EXISTS: &str = "E018";
|
||
pub const E019_NO_PENDING_LOGIN: &str = "E019";
|
||
pub const E020_BAD_PARAMS: &str = "E020";
|
||
pub const E021_CIPHERSUITE_NOT_ALLOWED: &str = "E021";
|
||
pub const E022_CHANNEL_ACCESS_DENIED: &str = "E022";
|
||
pub const E023_CHANNEL_NOT_FOUND: &str = "E023";
|
||
pub const E024_BLOB_TOO_LARGE: &str = "E024";
|
||
pub const E025_BLOB_HASH_LENGTH: &str = "E025";
|
||
pub const E026_BLOB_HASH_MISMATCH: &str = "E026";
|
||
pub const E027_BLOB_NOT_FOUND: &str = "E027";
|
||
|
||
/// Build a `capnp::Error::failed()` with the structured code prefix.
|
||
pub fn coded_error(code: &str, msg: impl std::fmt::Display) -> capnp::Error {
|
||
capnp::Error::failed(format!("{code}: {msg}"))
|
||
}
|