| Crates.io | foodshare-compression |
| lib.rs | foodshare-compression |
| version | 1.3.1 |
| created_at | 2026-01-03 05:45:12.385266+00 |
| updated_at | 2026-01-03 05:45:12.385266+00 |
| description | Response compression utilities with Brotli support |
| homepage | |
| repository | https://github.com/Foodshareclub/foodshare-tools |
| max_upload_size | |
| id | 2019638 |
| size | 18,053 |
Response compression utilities with Brotli, Gzip, and ETag support.
Deno's CompressionStream doesn't support Brotli! This crate brings Brotli compression to Supabase Edge Functions and other Deno runtimes via WebAssembly.
Add to your Cargo.toml:
[dependencies]
foodshare-compression = "1.3"
| Feature | Default | Description |
|---|---|---|
wasm |
No | Enable WebAssembly bindings |
use foodshare_compression::{brotli_compress, brotli_decompress};
let data = b"Hello, World!".repeat(100);
// Compress with quality 4 (0-11, higher = better compression)
let compressed = brotli_compress(&data, 4)?;
println!("Compressed: {} -> {} bytes", data.len(), compressed.len());
// Decompress
let decompressed = brotli_decompress(&compressed)?;
assert_eq!(data, decompressed.as_slice());
use foodshare_compression::{gzip_compress, gzip_decompress};
let data = b"Hello, World!";
// Compress with level 6 (0-9)
let compressed = gzip_compress(data, 6)?;
// Decompress
let decompressed = gzip_decompress(&compressed)?;
use foodshare_compression::{deflate_compress, deflate_decompress};
let compressed = deflate_compress(b"data", 6)?;
let decompressed = deflate_decompress(&compressed)?;
use foodshare_compression::{compress, decompress, Algorithm};
// Choose based on Accept-Encoding header
let algorithm = if accept_encoding.contains("br") {
Algorithm::Brotli
} else if accept_encoding.contains("gzip") {
Algorithm::Gzip
} else {
Algorithm::Deflate
};
let compressed = compress(data, algorithm, 4)?;
Generate SHA-256 based ETags for HTTP caching:
use foodshare_compression::generate_etag;
let etag = generate_etag(b"response body");
// Returns: "a1b2c3d4..." (64 char hex string)
| Algorithm | Ratio | Speed | Browser Support |
|---|---|---|---|
| Brotli | Best | Slower | All modern |
| Gzip | Good | Fast | Universal |
| Deflate | Good | Fast | Universal |
import { serve } from 'https://deno.land/std/http/server.ts';
import init, { brotli_compress, generate_etag } from '@foodshare/compression-wasm';
await init();
serve(async (req) => {
const data = JSON.stringify({ message: 'Hello!' });
const body = new TextEncoder().encode(data);
const acceptEncoding = req.headers.get('accept-encoding') || '';
if (acceptEncoding.includes('br')) {
const compressed = brotli_compress(body, 4);
return new Response(compressed, {
headers: {
'Content-Type': 'application/json',
'Content-Encoding': 'br',
'ETag': generate_etag(body),
},
});
}
return new Response(body);
});
For Deno/browser usage, see @foodshare/compression-wasm.
import init, { brotli_compress, gzip_compress } from '@foodshare/compression-wasm';
await init();
const data = new TextEncoder().encode('Hello!');
const compressed = brotli_compress(data, 4);
MIT License - see LICENSE for details.