Unified interface
Cloudinary, S3, and R2 share one upload contract. Swap providers without rewriting call sites.
// Same code for ANY provider
const uploader = new MediaUploader(
new S3Provider({ ... }) // or Cloudinary, R2
);
await uploader.upload(file, {
folder: "uploads",
onProgress: (p) => console.log(p)
});