feat(snapshot): cover-image-HEAD-probe-modul

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jörg Lohrer 2026-04-28 08:11:17 +02:00
parent 4b2c157938
commit 2af44035b8
2 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1,23 @@
export interface ProbeResult {
reachable: boolean
status: number
}
export type HeadFetcher = (url: string) => Promise<{ ok: boolean; status: number }>
export const defaultHeadFetcher: HeadFetcher = async (url) => {
const resp = await fetch(url, { method: 'HEAD' })
return { ok: resp.ok, status: resp.status }
}
export async function probeCover(
url: string,
fetcher: HeadFetcher = defaultHeadFetcher,
): Promise<ProbeResult> {
try {
const r = await fetcher(url)
return { reachable: r.ok, status: r.status }
} catch {
return { reachable: false, status: 0 }
}
}

View File

@ -0,0 +1,22 @@
import { assertEquals } from '@std/assert'
import { probeCover, type HeadFetcher } from '../src/core/cover-probe.ts'
Deno.test('probeCover: 200 -> reachable=true', async () => {
const fetcher: HeadFetcher = async () => ({ ok: true, status: 200 })
const r = await probeCover('https://blossom.example/abc.jpg', fetcher)
assertEquals(r, { reachable: true, status: 200 })
})
Deno.test('probeCover: 404 -> reachable=false', async () => {
const fetcher: HeadFetcher = async () => ({ ok: false, status: 404 })
const r = await probeCover('https://blossom.example/abc.jpg', fetcher)
assertEquals(r, { reachable: false, status: 404 })
})
Deno.test('probeCover: network error -> reachable=false', async () => {
const fetcher: HeadFetcher = async () => {
throw new Error('ECONNREFUSED')
}
const r = await probeCover('https://blossom.example/abc.jpg', fetcher)
assertEquals(r, { reachable: false, status: 0 })
})