foodshare-compression
Response compression utilities with Brotli, Gzip, and ETag support.
Features
- Brotli Compression - Best compression ratios (not available in Deno!)
- Gzip/Deflate - Standard compression formats
- ETag Generation - SHA-256 based cache validation
- WASM Support - Compile to WebAssembly for Deno/browser usage
Why This Crate?
Deno's CompressionStream doesn't support Brotli! This crate brings Brotli compression to Supabase Edge Functions and other Deno runtimes via WebAssembly.
Installation
Add to your Cargo.toml:
[]
= "1.3"
Feature Flags
| Feature | Default | Description |
|---|---|---|
wasm |
No | Enable WebAssembly bindings |
Usage
Brotli Compression
use ;
let data = b"Hello, World!".repeat;
// Compress with quality 4 (0-11, higher = better compression)
let compressed = brotli_compress?;
println!;
// Decompress
let decompressed = brotli_decompress?;
assert_eq!;
Gzip Compression
use ;
let data = b"Hello, World!";
// Compress with level 6 (0-9)
let compressed = gzip_compress?;
// Decompress
let decompressed = gzip_decompress?;
Deflate Compression
use ;
let compressed = deflate_compress?;
let decompressed = deflate_decompress?;
Auto Algorithm Selection
use ;
// Choose based on Accept-Encoding header
let algorithm = if accept_encoding.contains else if accept_encoding.contains else ;
let compressed = compress?;
ETag Generation
Generate SHA-256 based ETags for HTTP caching:
use generate_etag;
let etag = generate_etag;
// Returns: "a1b2c3d4..." (64 char hex string)
Compression Comparison
| Algorithm | Ratio | Speed | Browser Support |
|---|---|---|---|
| Brotli | Best | Slower | All modern |
| Gzip | Good | Fast | Universal |
| Deflate | Good | Fast | Universal |
Supabase Edge Function Example
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);
});
WASM Usage
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);
Performance
- Brotli ~100KB in ~200µs
- Gzip ~100KB in ~100µs
- Minimal memory overhead
License
MIT License - see LICENSE for details.