diff --git a/js/services/storageService.js b/js/services/storageService.js index 3bc17656..aca5a580 100644 --- a/js/services/storageService.js +++ b/js/services/storageService.js @@ -78,6 +78,7 @@ function buildS3TestConfig(config, overrides = {}) { region: resolveRegion(config), endpoint: resolveEndpoint(config), forcePathStyle: resolveForcePathStyle(config), + publicBaseUrl: config.publicBaseUrl, ...overrides, }; } diff --git a/js/storage/r2-s3.js b/js/storage/r2-s3.js index 78619db8..c2391a43 100644 --- a/js/storage/r2-s3.js +++ b/js/storage/r2-s3.js @@ -14,6 +14,7 @@ import { multipartUpload, } from "./s3-multipart.js"; import { userLogger } from "../utils/logger.js"; +import { buildPublicUrl } from "../r2.js"; export async function testS3Connection(config) { if (!config) { @@ -82,7 +83,32 @@ export async function testS3Connection(config) { ); userLogger.info("[Storage Test] File retrieval successful."); - // 3. Delete + // 3. Public URL check + let warnings = []; + if (config.publicBaseUrl) { + userLogger.info(`[Storage Test] Verifying public access via ${config.publicBaseUrl}...`); + const publicUrl = buildPublicUrl(config.publicBaseUrl, testKey); + try { + const response = await fetch(publicUrl, { method: "HEAD", cache: "no-cache" }); + if (response.ok) { + userLogger.info("[Storage Test] Public access confirmed."); + } else { + const msg = `[Storage Test] WARNING: Public access failed (HTTP ${response.status}). Check your Public URL and CORS settings.`; + userLogger.warn(msg); + warnings.push(msg); + } + } catch (fetchErr) { + const msg = `[Storage Test] WARNING: Public access check failed: ${fetchErr.message}. Check CORS.`; + userLogger.warn(msg); + warnings.push(msg); + } + } else { + const msg = "[Storage Test] WARNING: Public Bucket URL is missing. Uploads will fail until this is configured."; + userLogger.warn(msg); + warnings.push(msg); + } + + // 4. Delete userLogger.info(`[Storage Test] Cleaning up temporary file "${testKey}"...`); await s3.send( new DeleteObjectCommand({ @@ -92,9 +118,10 @@ export async function testS3Connection(config) { ); userLogger.info("[Storage Test] Cleanup successful."); + const successMessage = `Connection verified! Successfully uploaded, retrieved, and deleted test file in "${config.bucket}".`; return { success: true, - message: `Connection verified! Successfully uploaded, retrieved, and deleted test file in "${config.bucket}".`, + message: warnings.length ? `${successMessage} ${warnings.join(" ")}` : successMessage, }; } catch (error) { userLogger.error("[Storage Test] Operation failed:", error);