function parseUrl(value: string) { try { return new URL(String(value || "").trim()); } catch { return null; } } export function isUrlWithinPublicBase(mediaUrl: string, publicBaseUrl: string) { const media = parseUrl(mediaUrl); const base = parseUrl(publicBaseUrl); if (!media || !base || media.host.toLowerCase() !== base.host.toLowerCase()) { return false; } const basePath = base.pathname.replace(/\/+$/, ""); if (!basePath) return true; return media.pathname === basePath || media.pathname.startsWith(`${basePath}/`); } export function shouldStageVip98kReferenceUrl(params: { mediaUrl: string; sourcePublicUrl: string; targetPublicUrl?: string; }) { if ( params.targetPublicUrl && isUrlWithinPublicBase(params.mediaUrl, params.targetPublicUrl) ) { return false; } return isUrlWithinPublicBase(params.mediaUrl, params.sourcePublicUrl); } export function getStorageObjectKeyFromPublicUrl( mediaUrl: string, publicBaseUrl: string, ) { if (!isUrlWithinPublicBase(mediaUrl, publicBaseUrl)) return null; const media = parseUrl(mediaUrl); const base = parseUrl(publicBaseUrl); if (!media || !base) return null; const basePath = base.pathname.replace(/\/+$/, ""); const encodedKey = media.pathname.slice(basePath.length).replace(/^\/+/, ""); if (!encodedKey) return null; try { return decodeURIComponent(encodedKey); } catch { return encodedKey; } }