omnichron
Version:
Unified interface for web archive providers
41 lines (39 loc) • 1.6 kB
JavaScript
import { createErrorResponse, createFetchOptions, createSuccessResponse, mapCdxRows, mergeOptions, normalizeDomain } from "./_utils.mjs";
import { $fetch } from "ofetch";
//#region src/providers/wayback.ts
/**
* Create a Wayback Machine archive provider.
*
* @param initOptions - Initial archive options (limit, cache, ttl) for Wayback queries.
* @returns ArchiveProvider instance for fetching snapshots from the Wayback Machine.
*/
function wayback(initOptions = {}) {
return {
name: "Internet Archive Wayback Machine",
slug: "wayback",
async getSnapshots(domain, reqOptions = {}) {
const options = mergeOptions(initOptions, reqOptions);
const baseUrl = "https://web.archive.org";
const snapshotUrl = "https://web.archive.org/web";
const urlPattern = normalizeDomain(domain);
const fetchOptions = await createFetchOptions(baseUrl, {
url: urlPattern,
output: "json",
fl: "original,timestamp,statuscode",
collapse: "timestamp:4",
limit: String((await options)?.limit ?? 1e3)
});
try {
const response = await $fetch("/cdx/search/cdx", fetchOptions);
if (!Array.isArray(response) || response.length <= 1) return createSuccessResponse([], "wayback", { queryParams: fetchOptions.params || {} });
const dataRows = response.slice(1);
const pages = await mapCdxRows(dataRows, snapshotUrl, "wayback", await options);
return createSuccessResponse(pages, "wayback", { queryParams: fetchOptions.params || {} });
} catch (error) {
return createErrorResponse(error, "wayback");
}
}
};
}
//#endregion
export { wayback as default };