import { TWebMetadata } from '@/types' import DataLoader from 'dataloader' class WebService { static instance: WebService private proxyUrl(url: string): string { const proxyServer = import.meta.env.VITE_PROXY_SERVER if (proxyServer) { return `${proxyServer}/sites/${encodeURIComponent(url)}` } return url } private webMetadataDataLoader = new DataLoader( async (urls) => { return await Promise.all( urls.map(async (url) => { try { const res = await fetch(this.proxyUrl(url)) const html = await res.text() const parser = new DOMParser() const doc = parser.parseFromString(html, 'text/html') const title = doc.querySelector('meta[property="og:title"]')?.getAttribute('content') || doc.querySelector('title')?.textContent const description = doc.querySelector('meta[property="og:description"]')?.getAttribute('content') || (doc.querySelector('meta[name="description"]') as HTMLMetaElement | null)?.content const image = (doc.querySelector('meta[property="og:image"]') as HTMLMetaElement | null) ?.content return { title, description, image } } catch { return {} } }) ) }, { maxBatchSize: 1 } ) constructor() { if (!WebService.instance) { WebService.instance = this } return WebService.instance } async fetchWebMetadata(url: string) { return await this.webMetadataDataLoader.load(url) } } const instance = new WebService() export default instance