52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
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;
|
|
}
|
|
}
|