sinelaw/fresh · warning

[pkg] Background registry sync failed

Error message

[pkg] Background registry sync failed: ${e}

What it means

pkg.ts runs a registry synchronization in a detached promise; because the browser works fine without the registry, a failure is only warned about via 'Background registry sync failed'. The catch also resets pkgState.isLoading and refreshes the package manager view if the panel is open, so the UI does not hang on a spinner.

Solutions

  1. Check network connectivity / proxy settings and retry; the sync will rerun on next open or sync.
  2. Verify the registry endpoint is reachable (curl the registry URL).
  3. Continue using installed packages — this failure is non-blocking by design.
  4. Check editor logs for the interpolated error ${e} to identify DNS vs HTTP vs auth issues.
Defensive patterns

Strategy: retry

Validate before calling

const online = await fetch(registryUrl, { method: 'HEAD' }).then(r => r.ok).catch(() => false);
if (!online) console.warn('registry unreachable — skipping sync, installed packages still usable');

Try / catch

syncRegistry().catch(e => { editor.warn(`[pkg] Background registry sync failed: ${e}`); scheduleRetry(syncRegistry, { attempts: 3, backoffMs: 5000 }); });

Prevention

When it happens

Trigger: The detached registry sync promise rejects: network unreachable, registry host down/DNS failure, HTTP error from the registry, or an exception inside the sync routine itself.

Common situations: Working offline or behind a corporate proxy blocking the registry; transient registry outage; TLS/proxy interception causing fetch failures; firewall dropping the request.

Related errors


AI-assisted analysis of sinelaw/fresh@67894ca546 (2026-09-13). Data as JSON: /api/errors/5f56350742c7f885. Report an issue: GitHub.

Appendix: source

Thrown at crates/fresh-editor/plugins/pkg.ts:2825

  // Set initial content for all panels
  updatePkgManagerView();

  // Sync registry in background and update view when done
  // User can still interact with installed packages during sync
  syncRegistry()
    .then(() => {
      if (pkgState.isOpen) {
        pkgState.isLoading = false;
        pkgState.items = buildPackageList();
        updatePkgManagerView();
      }
    })
    // Detached, so it needs its own catch: an unhandled rejection here
    // takes down the plugin runtime, and the browser is perfectly
    // usable for installed packages without the registry.
    .catch((e) => {
      editor.warn(`[pkg] Background registry sync failed: ${e}`);
      if (pkgState.isOpen) {
        pkgState.isLoading = false;
        updatePkgManagerView();
      }
    });
}

/** Whether `bufferId` is still a live buffer. */
function bufferExists(bufferId: number): boolean {
  return editor.listBuffers().some((b) => b.id === bufferId);
}

/**
 * Unmount the widget panels the manager owns.
 *
 * The host keys panels by (plugin, panel id) and is never told that a
 * panel's buffer went away, so a panel that is merely dropped on the
 * plugin side stays registered against a dead buffer for the rest of

View on GitHub (pinned to 67894ca546)