Expand description
§WSI Streamer
A tile server for Whole Slide Images (WSI) stored in S3-compatible object storage.
This library provides the core functionality for serving tiles from Whole Slide Images stored in cloud object storage using HTTP range requests. It streams tiles directly without downloading entire files, making it ideal for large medical imaging files (1-10GB+).
§Features
- Range-based streaming: Fetches only the bytes needed for each tile via HTTP range requests
- Format support: Native parsers for Aperio SVS and pyramidal TIFF formats
- Multi-level caching: Caches slides, blocks, and encoded tiles for performance
- Built-in web viewer: Includes OpenSeadragon-based viewer
- Authentication: Optional HMAC-SHA256 signed URL authentication
§Architecture
The library is organized into several modules:
io- I/O layer with S3 range reader and block cachingformat- TIFF/SVS parsers and JPEG handlingslide- Slide abstraction and registrytile- Tile service and encodingserver- Axum-based HTTP server and routesconfig- CLI and configuration types
§Example
use wsi_streamer::Cli;
use clap::Parser;
#[tokio::main]
async fn main() {
// Parse CLI arguments (e.g., `wsi-streamer s3://my-bucket`)
let cli = Cli::parse();
match cli.into_command() {
wsi_streamer::Command::Serve(config) => {
// Validate and start the server
config.validate().expect("Invalid configuration");
println!("Starting server on {}", config.bind_address());
}
wsi_streamer::Command::Sign(config) => {
// Generate signed URL
}
wsi_streamer::Command::Check(config) => {
// Validate S3 connectivity
}
}
}Re-exports§
pub use config::CheckConfig;pub use config::Cli;pub use config::Command;pub use config::Config;pub use config::ServeConfig;pub use config::SignConfig;pub use config::SignOutputFormat;pub use error::FormatError;pub use error::IoError;pub use error::TiffError;pub use error::TileError;pub use format::tiff::check_compression;pub use format::tiff::check_tiled;pub use format::tiff::parse_u32_array;pub use format::tiff::parse_u64_array;pub use format::tiff::validate_ifd;pub use format::tiff::validate_ifd_strict;pub use format::tiff::validate_level;pub use format::tiff::validate_pyramid;pub use format::tiff::ByteOrder;pub use format::tiff::Compression;pub use format::tiff::FieldType;pub use format::tiff::Ifd;pub use format::tiff::IfdEntry;pub use format::tiff::PyramidLevel;pub use format::tiff::TiffHeader;pub use format::tiff::TiffPyramid;pub use format::tiff::TiffTag;pub use format::tiff::TileData;pub use format::tiff::ValidationError;pub use format::tiff::ValidationResult;pub use format::tiff::ValueReader;pub use format::tiff::BIGTIFF_HEADER_SIZE;pub use format::tiff::TIFF_HEADER_SIZE;pub use format::detect_format;pub use format::is_tiff_header;pub use format::SlideFormat;pub use format::is_abbreviated_stream;pub use format::is_complete_stream;pub use format::merge_jpeg_tables;pub use format::prepare_tile_jpeg;pub use format::GenericTiffLevelData;pub use format::GenericTiffReader;pub use format::SvsLevelData;pub use format::SvsMetadata;pub use format::SvsReader;pub use io::create_s3_client;pub use io::BlockCache;pub use io::RangeReader;pub use io::S3RangeReader;pub use server::auth_middleware;pub use server::create_dev_router;pub use server::create_production_router;pub use server::create_router;pub use server::health_handler;pub use server::slide_metadata_handler;pub use server::slides_handler;pub use server::tile_handler;pub use server::AppState;pub use server::AuthError;pub use server::AuthQueryParams;pub use server::ErrorResponse;pub use server::HealthResponse;pub use server::LevelMetadataResponse;pub use server::OptionalAuth;pub use server::RouterConfig;pub use server::SignedUrlAuth;pub use server::SlideMetadataResponse;pub use server::SlidesQueryParams;pub use server::SlidesResponse;pub use server::TilePathParams;pub use server::TileQueryParams;pub use slide::CachedSlide;pub use slide::LevelInfo;pub use slide::S3SlideSource;pub use slide::SlideListResult;pub use slide::SlideReader;pub use slide::SlideRegistry;pub use slide::SlideSource;pub use tile::clamp_quality;pub use tile::is_valid_quality;pub use tile::JpegTileEncoder;pub use tile::TileCache;pub use tile::TileCacheKey;pub use tile::TileRequest;pub use tile::TileResponse;pub use tile::TileService;pub use tile::DEFAULT_JPEG_QUALITY;pub use tile::DEFAULT_TILE_CACHE_CAPACITY;pub use tile::MAX_JPEG_QUALITY;pub use tile::MIN_JPEG_QUALITY;