fix: log production request failures

This commit is contained in:
2026-07-20 13:48:47 +05:30
parent b3e5e5b999
commit aa2595ec01
55 changed files with 126 additions and 89 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ai",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/authz",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/authz — part of the WrNexus framework.",
"license": "MIT",
+11 -11
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/cli",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/cli — part of the WrNexus framework.",
"license": "MIT",
@@ -28,16 +28,16 @@
"wrnexus": "./dist/index.js"
},
"dependencies": {
"@wrnexus/core": "^0.2.67",
"@wrnexus/router": "^0.2.67",
"@wrnexus/csr": "^0.2.67",
"@wrnexus/compiler": "^0.2.67",
"@wrnexus/styles": "^0.2.67",
"@wrnexus/dev-server": "^0.2.67",
"@wrnexus/ui": "^0.2.67",
"@wrnexus/validation": "^0.2.67",
"@wrnexus/i18n": "^0.2.67",
"@wrnexus/db": "^0.2.67"
"@wrnexus/core": "^0.2.68",
"@wrnexus/router": "^0.2.68",
"@wrnexus/csr": "^0.2.68",
"@wrnexus/compiler": "^0.2.68",
"@wrnexus/styles": "^0.2.68",
"@wrnexus/dev-server": "^0.2.68",
"@wrnexus/ui": "^0.2.68",
"@wrnexus/validation": "^0.2.68",
"@wrnexus/i18n": "^0.2.68",
"@wrnexus/db": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/compiler",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/compiler — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/core",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/core — part of the WrNexus framework.",
"license": "MIT",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/csr",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/csr — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/db",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/db — part of the WrNexus framework.",
"license": "MIT",
+13 -13
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/dev-server",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/dev-server — part of the WrNexus framework.",
"license": "MIT",
@@ -25,18 +25,18 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67",
"@wrnexus/router": "^0.2.67",
"@wrnexus/ssr": "^0.2.67",
"@wrnexus/csr": "^0.2.67",
"@wrnexus/compiler": "^0.2.67",
"@wrnexus/styles": "^0.2.67",
"@wrnexus/ui": "^0.2.67",
"@wrnexus/validation": "^0.2.67",
"@wrnexus/i18n": "^0.2.67",
"@wrnexus/db": "^0.2.67",
"@wrnexus/pubsub": "^0.2.67",
"@wrnexus/uploader": "^0.2.67"
"@wrnexus/core": "^0.2.68",
"@wrnexus/router": "^0.2.68",
"@wrnexus/ssr": "^0.2.68",
"@wrnexus/csr": "^0.2.68",
"@wrnexus/compiler": "^0.2.68",
"@wrnexus/styles": "^0.2.68",
"@wrnexus/ui": "^0.2.68",
"@wrnexus/validation": "^0.2.68",
"@wrnexus/i18n": "^0.2.68",
"@wrnexus/db": "^0.2.68",
"@wrnexus/pubsub": "^0.2.68",
"@wrnexus/uploader": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/encryption",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/encryption — part of the WrNexus framework.",
"license": "MIT",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/helpers",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/i18n",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/i18n — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/jwt",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/jwt — part of the WrNexus framework.",
"license": "MIT",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/mobile",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/mobile — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/native": "^0.2.67"
"@wrnexus/native": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/native",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/native — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/oauth",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/oauth — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/pubsub",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/pubsub — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/queue",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/queue — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/reactive",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/reactive — part of the WrNexus framework.",
"license": "MIT",
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/router",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/router — part of the WrNexus framework.",
"license": "MIT",
@@ -21,8 +21,8 @@
}
},
"dependencies": {
"@wrnexus/compiler": "^0.2.67",
"@wrnexus/core": "^0.2.67"
"@wrnexus/compiler": "^0.2.68",
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ssr",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/ssr — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/styles",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/styles — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/uploader": "^0.2.67"
"@wrnexus/uploader": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/test",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/test — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/tracking",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/tracking — part of the WrNexus framework.",
"license": "MIT",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ui",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/ui — part of the WrNexus framework.",
"license": "MIT",
@@ -25,7 +25,7 @@
"./ui.css": "./ui.css"
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/uploader",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/uploader — part of the WrNexus framework.",
"license": "MIT",
@@ -21,7 +21,7 @@
}
},
"dependencies": {
"@wrnexus/core": "^0.2.67"
"@wrnexus/core": "^0.2.68"
},
"files": [
"dist"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/validation",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"description": "@wrnexus/validation — part of the WrNexus framework.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ai",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/authz",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/cli",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+9
View File
@@ -673,6 +673,15 @@ const MIGRATIONS: Migration[] = [
// Existing workspace configurations remain compatible; new controls are opt-in.
},
},
{
version: "0.2.68",
id: "production-request-error-logging",
description:
"Logs production request exceptions, forward-auth verifier failures, proxy failures, and unexpected app exits with actionable context.",
apply() {
// Runtime diagnostics improve automatically after updating and redeploying.
},
},
];
/** Release tooling uses this to require an explicit migration entry per version. */
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/compiler",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/core",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/csr",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/db",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/dev-server",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+27 -4
View File
@@ -207,8 +207,20 @@ async function checkAuth(
headers: forwardAuthHeaders(req),
redirect: "manual",
});
if (!res.ok) return forwardAuthFailure(res, verifyUrl);
} catch {
if (!res.ok) {
if (res.status >= 500) {
const requestUrl = new URL(req.url);
console.error(
`[wrnexus] forward-auth verifier error: ${req.method} ${requestUrl.pathname} via ${verifyUrl} returned ${res.status}`,
);
}
return forwardAuthFailure(res, verifyUrl);
}
} catch (error) {
console.error(
`[wrnexus] forward-auth verifier unavailable: ${verifyUrl}`,
error instanceof Error ? (error.stack ?? error.message) : error,
);
return new Response("Auth service unavailable", { status: 503 });
}
}
@@ -373,7 +385,14 @@ export async function startGateway(opts: GatewayOptions): Promise<RunningGateway
child.once("exit", (code, signal) => {
if (stopping || target.child !== child) return;
const delay = gatewayRestartDelay(mode, code, signal);
if (delay === null) return;
if (delay === null) {
if (code !== 0 || signal) {
console.error(
`[wrnexus] app '${target.name}' stopped unexpectedly (${signal ? `signal ${signal}` : `code ${code}`})`,
);
}
return;
}
if (delay > 0) {
console.error(`[wrnexus] app '${target.name}' exited (code ${code}); retrying in 1.2s…`);
setTimeout(launch, delay);
@@ -480,7 +499,11 @@ export async function startGateway(opts: GatewayOptions): Promise<RunningGateway
body,
redirect: "manual",
});
} catch {
} catch (error) {
console.error(
`[wrnexus] gateway proxy error: ${req.method} ${url.pathname}${target.name} (${target.origin})`,
error instanceof Error ? (error.stack ?? error.message) : error,
);
res = new Response(`Gateway: app '${target.name}' is unavailable.`, { status: 502 });
}
if (sec.headers) res = applyEdgeHeaders(res);
+6 -1
View File
@@ -788,7 +788,12 @@ export function createHandlers(deps: RuntimeDeps): Handlers {
);
return compressResponse(req, res);
} catch (err) {
if (mode === "development") console.error(err);
const app = process.env.WRNEXUS_APP_NAME ?? "app";
const detail =
err instanceof Error ? (err.stack ?? `${err.name}: ${err.message}`) : String(err);
console.error(
`[wrnexus] unhandled request error (${app}) ${req.method} ${url.pathname}\n${detail}`,
);
return compressResponse(req, secure(renderError(err, mode)));
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/encryption",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/helpers",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/i18n",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/jwt",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/mobile",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/native",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/oauth",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/pubsub",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/queue",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/reactive",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/router",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ssr",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/styles",
"version": "0.2.67",
"version": "0.2.68",
"type": "module",
"main": "src/index.ts",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/test",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/tracking",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ui",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/uploader",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/validation",
"version": "0.2.67",
"version": "0.2.68",
"private": true,
"type": "module",
"main": "src/index.ts",