async function ingestBatch(urls: string[], signal: AbortSignal): Promise<IngestResult> {
const timeout = AbortSignal.timeout(10_000)
const combined = AbortSignal.any([signal, timeout])
const span = tracer.startSpan("ingestBatch")
try {
const pages = await pLimit(8).map(
urls,
(url) => retry(() => fetchText(url, combined), 3)
)
const parsed = SourceRecords.safeParse(pages.flatMap(extractRecords))
if (!parsed.success) return { ok: false, error: "InvalidRecords" }
combined.throwIfAborted()
await saveRecords(parsed.data, combined)
console.log(`ingested: ${parsed.data.length}`)
span.setStatus({ code: SpanStatusCode.OK })
return { ok: true, summary: summarize(parsed.data) }
} catch (error) {
span.recordException(error)
return { ok: false, error: classify(error) }
} finally {
span.end()
}
}