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

  1. Retry the update check — transient CDN slowness is the most common cause
  2. Check network/proxy connectivity to the CDN host (curl -m 10 the manifest URL)
  3. Increase the timeout passed to the AbortController in fetchCdnManifest if on slow networks
  4. 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

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

Related errors


AI-assisted analysis of iOfficeAI/AionUi@711aa0550e (2026-08-28). Data as JSON: /api/errors/7dcc82f9e110c5b5. Report an issue: GitHub.