/** * 외부 사이트 파비콘을 브라우저에 표시하기 위한 프록시 URL을 만든다. * Google Favicon V2(`gstatic.com/faviconV2`)에 페이지 origin을 넘겨 파비콘을 받는다. * `s2/favicons?domain=`만 쓰면 일부 서브도메인·신규 사이트에서 기본 지구본만 돌아올 수 있다. * 내부 경로(`/…`)·`#`·파싱 실패 시 빈 문자열을 반환한다(이미지 생략). * @param {string} rawUrl - 링크 URL * @param {number} [sizePx] - 한 변(px), 기본 32, 최대 128 * @returns {string} `https://t3.gstatic.com/faviconV2?...` 또는 `''` */ export const getExternalFaviconUrl = (rawUrl, sizePx = 32) => { const trimmed = String(rawUrl || '').trim() if (!trimmed || trimmed === '#') { return '' } if (trimmed.startsWith('/') && !trimmed.startsWith('//')) { return '' } try { const withProto = trimmed.startsWith('//') ? `https:${trimmed}` : trimmed const u = new URL(withProto) if (u.protocol !== 'http:' && u.protocol !== 'https:') { return '' } if (!u.hostname) { return '' } const sz = Number.isFinite(sizePx) && sizePx > 0 ? Math.min(128, Math.round(sizePx)) : 32 const params = new URLSearchParams({ client: 'SOCIAL', type: 'FAVICON', fallback_opts: 'TYPE,SIZE,URL', url: u.origin, size: String(sz) }) return `https://t3.gstatic.com/faviconV2?${params.toString()}` } catch { return '' } }