@fluxmedia/r2
v2.0.0
Published
Cloudflare R2 provider for FluxMedia - unified media upload library
Maintainers
Readme
@fluxmedia/r2
Cloudflare R2 provider for FluxMedia - unified media uploads with cost-effective R2 storage.
Installation
pnpm add @fluxmedia/core @fluxmedia/r2 @aws-sdk/client-s3 @aws-sdk/lib-storageR2 uses the S3-compatible API, so it requires the AWS SDK.
Quick Start
import { MediaUploader } from '@fluxmedia/core';
import { R2Provider } from '@fluxmedia/r2';
const uploader = new MediaUploader(
new R2Provider({
accountId: 'your-cloudflare-account-id',
bucket: 'my-bucket',
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
publicUrl: 'https://cdn.example.com' // Optional custom domain
})
);
const result = await uploader.upload(file, {
folder: 'uploads'
});
console.log(result.url);Why R2?
- Zero egress fees - Free outbound data transfer
- S3-compatible - Easy migration from S3
- Global distribution - Cloudflare's edge network
- Cost-effective - Only pay for storage and operations
Configuration
interface R2Config {
accountId?: string; // Cloudflare account ID
endpoint?: string; // Custom endpoint (alternative to accountId)
bucket: string; // R2 bucket name
accessKeyId: string; // R2 Access Key
secretAccessKey: string; // R2 Secret Key
publicUrl?: string; // Custom public URL for the bucket
}Note: Provide either
accountIdorendpoint. The endpoint will be auto-generated from accountId if not provided.
Getting R2 Credentials
- Go to Cloudflare Dashboard → R2
- Create a bucket
- Click "Manage R2 API Tokens"
- Create a token with read/write permissions
- Copy the Access Key ID and Secret Access Key
Upload with Progress
const result = await uploader.upload(file, {
folder: 'uploads',
onProgress: (percent) => {
console.log(`Upload progress: ${percent}%`);
}
});Batch Uploads
Upload multiple files with concurrency control:
const results = await uploader.uploadMultiple(files, {
folder: 'batch-uploads',
concurrency: 5,
onBatchProgress: (completed, total) => {
console.log(`Uploaded ${completed}/${total} files`);
}
});Delete Files
// Delete single file
await uploader.delete(result.id);
// Delete multiple files
await uploader.deleteMultiple(['file1', 'file2', 'file3']);Native SDK Access
Access the underlying S3-compatible client for advanced operations:
const client = uploader.provider.native;
// Use native AWS SDK methods with R2
const { ListObjectsV2Command } = await import('@aws-sdk/client-s3');
const objects = await client.send(new ListObjectsV2Command({
Bucket: 'my-bucket'
}));Adding Transformations
R2 is storage-only. For image transformations, use Cloudflare Images or consider Cloudinary for built-in support.
Environment Variables
CLOUDFLARE_ACCOUNT_ID=your-account-id
R2_BUCKET=my-bucket
R2_ACCESS_KEY_ID=your-access-key
R2_SECRET_ACCESS_KEY=your-secret-key
R2_PUBLIC_URL=https://cdn.example.comLicense
MIT
