import type { S3Client } from "bun"; let client: S3Client | undefined; let loading: Promise | undefined; function required(name: string): string { const value = process.env[name]; if (!value) throw new Error(`${name} is required for media storage.`); return value; } export async function getMediaStorage(): Promise { if (client) return client; if (!loading) { loading = import("bun").then(({ S3Client: BunS3Client }) => new BunS3Client({ accessKeyId: required("S3_ACCESS_KEY_ID"), secretAccessKey: required("S3_SECRET_ACCESS_KEY"), bucket: required("S3_BUCKET"), endpoint: required("S3_ENDPOINT"), region: process.env.S3_REGION || "auto", virtualHostedStyle: process.env.S3_VIRTUAL_HOSTED_STYLE === "true", })); } client = await loading; return client; } export function publicMediaUrl(objectKey: string): string { const base = required("S3_PUBLIC_URL").replace(/\/+$/u, ""); return `${base}/${objectKey.split("/").map(encodeURIComponent).join("/")}`; }