iOfficeAI/AionUi · error · Error
update.errors.cdnManifestTimeout
update.errors.cdnManifestTimeout
Error message
update.errors.cdnManifestTimeout
What it means
Thrown when fetching the CDN update manifest aborts due to the request timeout (AbortController fires, fetch rejects with AbortError). The original abort is wrapped in a user-facing timeout error with `cause` preserved.
Source
Thrown at packages/desktop/src/process/bridge/updateBridge.ts:384
headers: { 'User-Agent': DEFAULT_USER_AGENT },
signal: controller.signal,
});
if (!res.ok) {
throw new Error((await getI18n()).t('update.errors.cdnManifestFailed', { status: res.status }));
}
const manifest = parseCdnManifest(await res.text());
if (!manifest) {
throw new Error((await getI18n()).t('update.errors.cdnManifestInvalid'));
}
log.info('[manual-update] CDN manifest resolved:', {
url,
version: manifest.version,
files: manifest.files.length,
});
return manifest;
} catch (err: unknown) {
if (err instanceof Error && err.name === 'AbortError') {
throw new Error((await getI18n()).t('update.errors.cdnManifestTimeout'), { cause: err });
}
throw err;
} finally {
clearTimeout(timeoutId);
}
};
type ReleaseNotesEnrichment = { body?: string; htmlUrl?: string; name?: string; publishedAt?: string };
/**
* Best-effort GitHub lookup for the release matching the CDN version. The
* manual check must work without GitHub (the repo stays the changelog source
* but may be unreachable), so every failure path resolves to an empty object.
*/
const fetchReleaseNotesEnrichment = async (repo: string, version: string): Promise<ReleaseNotesEnrichment> => {
try {
const releases = await fetchGitHubReleases(repo, GITHUB_NOTES_TIMEOUT_MS);
const match = releases.find((rel) => rel && !rel.draft && normalizeTagToSemver(rel.tag_name) === version);View on GitHub (pinned to 711aa0550e)
Solutions
- Retry the update check — transient CDN slowness is the most common cause
- Check network/proxy connectivity to the CDN host (curl -m 10 the manifest URL)
- Increase the timeout passed to the AbortController in fetchCdnManifest if on slow networks
- Verify the CDN is healthy (status page) during widespread failures
Example fix
// before const timeoutId = setTimeout(() => abortController.abort(), 5_000); // after const timeoutId = setTimeout(() => abortController.abort(), 15_000);
Defensive patterns
Strategy: retry
Validate before calling
// Pre-flight reachability check before the manifest flow
await Promise.race([fetch(cdnHost, { method: 'HEAD' }), sleep(2000)]).catch(() => { /* mark CDN unreachable, skip update check */ }); Try / catch
catch (err) {
if (err instanceof Error && /timeout/i.test(err.message)) {
return retryWithBackoff(() => fetchCdnManifest(url), { retries: 2 });
}
throw err;
} Prevention
- Set a timeout proportional to expected manifest size
- Surface CDN reachability in the update UI so users understand it's network-side
- Keep manifests small so timeouts are rare
When it happens
Trigger: fetchCdnManifest's timeout elapses before the CDN responds; the AbortController signal aborts the fetch and err.name === 'AbortError', triggering this rethrow.
Common situations: Slow or blocked CDN, corporate proxy/firewall stalling the request, CDN outage, or a timeout value set too aggressively for large manifests on slow links.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- update.errors.githubApiTimeout
- update.errors.cdnManifestInvalid
- update.errors.downloadFailed
- update.errors.redirectNoLocation
- update.errors.tooManyRedirects
AI-assisted analysis of iOfficeAI/AionUi@711aa0550e (2026-08-28).
Data as JSON: /api/errors/7dcc82f9e110c5b5.
Report an issue: GitHub.