OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-link-preview / utils.js

76 lines · javascript ref:
import { userAgent as e } from "fast-meta-tags"
import r from "timeout-abort-signal"
async function t(t, a = {}) {
  const i = r(a.signal, a.timeout)
  try {
    const r = await fetch(t, {
      signal: i.signal,
      headers: { Accept: "*/*", "User-Agent": a?.userAgent || e },
    })
    if (!r.ok) return null
    const c = r.headers.get("Content-Type"),
      l = n(t, c),
      p = await r.arrayBuffer()
    return { src: t, type: c, name: l, buffer: new Uint8Array(p) }
  } catch {
    return null
  } finally {
    i.destroy()
  }
}
function n(e, r) {
  switch (r) {
    case "image/png":
      return "preview.png"
    case "image/jpg":
    case "image/jpeg":
      return "preview.jpeg"
    case "image/gif":
      return "preview.gif"
  }
  return decodeURIComponent(e?.split("/").pop())
}
export async function getFile(e, r) {
  return e ? (r?.noBuffer ? { src: e, name: n(e, null), buffer: null } : await t(e, r)) : null
}
export function getDomain(e) {
  try {
    return new URL(e).hostname
  } catch (e) {
    return null
  }
}
export function matchDomain(e, r) {
  try {
    const t = new URL(e).hostname,
      n = new URL(r).hostname
    return t === n || t.endsWith("." + n)
  } catch {
    return !1
  }
}
export function htmlToText(e) {
  return e
    ? e
        .replace(/ /gi, " ")
        .replace(/&/gi, "&")
        .replace(/&lt;/gi, "<")
        .replace(/&gt;/gi, ">")
        .replace(/&quot;/gi, '"')
        .replace(/&#39;/g, "'")
        .replace(/&apos;/gi, "'")
        .replace(/&copy;/gi, "©")
        .replace(/&reg;/gi, "®")
        .replace(/&hellip;/gi, "…")
        .replace(/&mdash;/gi, "—")
        .replace(/&ndash;/gi, "–")
        .replace(/<[^>]*?(?:\[[^\]]*\][^>]*?)*>/gs, "")
        .normalize("NFKC")
        .replace(/\[\d+\]/g, "")
        .replace(/\[[a-z]\]/gi, "")
        .replace(/&[a-z]+;|&#\d+;/gi, "")
        .replace(/\s+/g, " ")
        .trim()
    : null
}