fix: surface real network cause on Gitea issue creation failure (v0.51.4)

A thrown fetch error (DNS failure, connection refused, timeout) never
reached the res.ok branch, so its actual cause was lost — err.message
alone is often just "fetch failed" with the real reason nested in
err.cause. Now logs the full cause server-side and folds it into the
error returned to the admin support view's tooltip.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-19 11:20:11 +02:00
parent b4dd29893d
commit e6a5e1e6ab
5 changed files with 25 additions and 4 deletions
+8 -1
View File
@@ -1,5 +1,5 @@
// Mirrors CHANGELOG.md at the repo root — update both together.
export const APP_VERSION = "0.51.3";
export const APP_VERSION = "0.51.4";
export type ChangelogEntry = {
version: string;
@@ -11,6 +11,13 @@ export type ChangelogEntry = {
};
export const CHANGELOG: ChangelogEntry[] = [
{
version: "0.51.4",
date: "2026-07-19 12:50",
fixed: [
"Gitea issue creation failures now log the real network-level cause server-side (DNS/connection/timeout, not just \"fetch failed\") and surface a more specific message in the admin support view's tooltip.",
],
},
{
version: "0.51.3",
date: "2026-07-19 12:35",
+10 -1
View File
@@ -50,6 +50,15 @@ export async function createGiteaIssue(opts: {
const issue = (await res.json()) as { html_url?: string };
return { url: issue.html_url ?? null, error: issue.html_url ? null : "Gitea response had no html_url" };
} catch (err) {
return { url: null, error: err instanceof Error ? err.message : "Unknown error" };
// A thrown fetch error (DNS failure, connection refused, timeout, TLS
// error) never reaches the res.ok branch above, so its real cause would
// otherwise be lost — err.message alone is often just "fetch failed"
// with the actual reason nested in err.cause. Log server-side with the
// full cause chain, and fold a short form into the returned message so
// it also shows up in the admin support view's tooltip, not just logs.
const cause = err instanceof Error && err.cause instanceof Error ? err.cause.message : undefined;
const message = err instanceof Error ? err.message : "Unknown error";
console.error("[gitea] createGiteaIssue failed", { baseUrl, repo, message, cause });
return { url: null, error: cause ? `${message}: ${cause}` : message };
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@epicure/web",
"version": "0.51.3",
"version": "0.51.4",
"private": true,
"scripts": {
"dev": "next dev",