async function fetchSource()

in src/data/source.ts [230:252]


async function fetchSource(source: UrlSource, signal: AbortSignal): Promise<FetchedSource> {
    try {
        let response = await fetch(source.url, { signal });
        // Retry fetches as long as 202 status is returned.
        while (response.status === 202) {
            source.setStatus({ message: "querying database" });
            await new Promise(resolve => setTimeout(resolve, RETRY_TIME_MS));
            response = await fetch(source.url, { signal });
        }
        source.setStatus({ message: "downloading" });
        const data: Pings = await response.json();
        if (data.crashid.length === 0) {
            source.setStatus({ success: false, message: "not available" });
            return { source };
        }
        source.setStatus({ message: "downloaded" });
        const etag = response.headers.get("ETag") ?? undefined;
        return { source, data, etag };
    } catch (error) {
        source.setStatus({ success: false, message: `failed: ${error}` });
        return { source };
    }
}