Images now load direct from images.04080616.xyz. Removes read-side signing (signUrl/signCoverUrls + callers), unlocking browser and edge caching since URLs are stable. Presigned upload kept for /api/upload. PageReader retries failed loads via onError as a safety net. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
31 lines
937 B
TypeScript
31 lines
937 B
TypeScript
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
|
|
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
|
|
const s3 = new S3Client({
|
|
region: "auto",
|
|
endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
|
|
credentials: {
|
|
accessKeyId: process.env.R2_ACCESS_KEY!,
|
|
secretAccessKey: process.env.R2_SECRET_KEY!,
|
|
},
|
|
});
|
|
|
|
export async function getPresignedUploadUrl(key: string) {
|
|
const command = new PutObjectCommand({
|
|
Bucket: process.env.R2_BUCKET!,
|
|
Key: key,
|
|
ContentType: "image/webp",
|
|
});
|
|
return getSignedUrl(s3, command, { expiresIn: 3600 });
|
|
}
|
|
|
|
export function getPublicUrl(key: string) {
|
|
return `${process.env.R2_PUBLIC_URL}/${key}`;
|
|
}
|
|
|
|
export function keyFromPublicUrl(publicUrl: string): string | null {
|
|
const prefix = process.env.R2_PUBLIC_URL!;
|
|
if (!publicUrl.startsWith(prefix)) return null;
|
|
return publicUrl.replace(prefix, "").replace(/^\//, "");
|
|
}
|