52 lines
1.7 KiB
TypeScript

import { loadAssetUrl } from '@pascal-app/core'
export const ASSETS_CDN_URL = process.env.NEXT_PUBLIC_ASSETS_CDN_URL || 'https://editor.pascal.app'
/**
* Resolves an asset URL to the appropriate format:
* - If URL starts with http:// or https://, return as-is (external URL)
* - If URL starts with asset://, resolve from IndexedDB storage
* - If URL starts with /, prepend CDN URL (absolute path)
* - Otherwise, prepend CDN URL (relative path)
*/
export async function resolveAssetUrl(url: string | undefined | null): Promise<string | null> {
if (!url) return null
// External URL - use as-is
if (url.startsWith('http://') || url.startsWith('https://')) {
return url
}
// IndexedDB asset - resolve from storage
if (url.startsWith('asset://')) {
return loadAssetUrl(url)
}
// Absolute or relative path - prepend CDN URL
const normalizedPath = url.startsWith('/') ? url : `/${url}`
return `${ASSETS_CDN_URL}${normalizedPath}`
}
/**
* Synchronous version for URLs that don't need IndexedDB resolution
* Only use this if you're sure the URL is not an asset:// URL
*/
export function resolveCdnUrl(url: string | undefined | null): string | null {
if (!url) return null
// External URL - use as-is
if (url.startsWith('http://') || url.startsWith('https://')) {
return url
}
// Don't use this for asset:// URLs - use resolveAssetUrl instead
if (url.startsWith('asset://')) {
console.warn('Use resolveAssetUrl() for asset:// URLs, not resolveCdnUrl()')
return null
}
// Absolute or relative path - prepend CDN URL
const normalizedPath = url.startsWith('/') ? url : `/${url}`
return `${ASSETS_CDN_URL}${normalizedPath}`
}