@jami-studio/core 0.92.20 → 0.92.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/db/client.ts +11 -0
- package/corpus/core/src/server/framework-request-handler.ts +57 -2
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +11 -0
- package/dist/db/client.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +50 -2
- package/dist/server/framework-request-handler.js.map +1 -1
- package/package.json +1 -1
package/corpus/core/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @agent-native/core
|
|
2
2
|
|
|
3
|
+
## 0.92.22
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- be9682d: Fix permanently hanging framework routes on Cloudflare Workers: nitro doesn't await async plugins, so plugin-init and default-bootstrap promises are created during an app's first request — when that request responds before they settle (e.g. an auth route that doesn't match the pending inits' paths), workerd freezes their pending I/O forever and every later request's readiness gate awaits a promise that can never settle (observed: authed action requests hanging >90s after a get-session request initialized the app). Init promises are now tied to the creating request's lifetime via ctx.waitUntil, and readiness-gate awaits are bounded (20s) on workerd so a frozen init degrades to a retryable response instead of a permanent hang.
|
|
8
|
+
|
|
9
|
+
## 0.92.21
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 30edbbe: Keep Neon's poolQueryViaFetch HTTP path alive on Cloudflare Workers: attachNeonPoolErrorLogger's per-client 'connect' listener flips @neondatabase/serverless's hasFetchUnsupportedListeners flag, silently reverting every plain query to a WebSocket checkout — which, combined with the single-use clients workerd requires, churned a new WebSocket per query until the isolate hit its connection cap and pool.connect() hung forever (observed: authed action requests hanging after ~10 queries under wrangler pages dev). The logger now attaches only the pool-level 'error' listener on workerd; the per-client listener's purpose (preventing Node's uncaught-'error' process crash) doesn't apply there.
|
|
14
|
+
|
|
3
15
|
## 0.92.20
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.92.
|
|
3
|
+
"version": "0.92.22",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/studio-jami/jami-studio#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -938,6 +938,17 @@ export function attachNeonPoolErrorLogger(
|
|
|
938
938
|
);
|
|
939
939
|
});
|
|
940
940
|
|
|
941
|
+
// On Cloudflare Workers, DO NOT attach the per-client 'connect' listener
|
|
942
|
+
// below. @neondatabase/serverless disables its poolQueryViaFetch HTTP path
|
|
943
|
+
// the moment ANY non-'error' listener is registered on the pool
|
|
944
|
+
// (hasFetchUnsupportedListeners) — silently reverting every plain query to
|
|
945
|
+
// a WebSocket checkout. Combined with the single-use clients workerd
|
|
946
|
+
// requires, that churns a new WebSocket per query until the isolate hits
|
|
947
|
+
// its connection cap and pool.connect() hangs forever. The listener's
|
|
948
|
+
// purpose (preventing Node's uncaught-'error' process crash) doesn't apply
|
|
949
|
+
// on workerd, where an unhandled emit can't kill a process.
|
|
950
|
+
if (isCloudflareRuntime()) return;
|
|
951
|
+
|
|
941
952
|
// Attach a persistent 'error' listener to EVERY client for its whole lifetime.
|
|
942
953
|
//
|
|
943
954
|
// @neondatabase/serverless mirrors pg-pool, which only keeps its own idle
|
|
@@ -17,6 +17,7 @@ import { setResponseHeader, setResponseStatus } from "h3";
|
|
|
17
17
|
import { getMissingDefaultPlugins } from "../deploy/route-discovery.js";
|
|
18
18
|
import { getConfiguredAppBasePath } from "./app-base-path.js";
|
|
19
19
|
import { captureError } from "./capture-error.js";
|
|
20
|
+
import { isCloudflareRuntime } from "../shared/runtime.js";
|
|
20
21
|
|
|
21
22
|
const BOOTSTRAPPED = new WeakSet<object>();
|
|
22
23
|
const IN_BOOTSTRAP = new WeakSet<object>();
|
|
@@ -44,6 +45,56 @@ function pathMatchesPrefix(reqPath: string, prefix: string): boolean {
|
|
|
44
45
|
return reqPath === prefix || reqPath.startsWith(prefix + "/");
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Cloudflare Workers (workerd) cancels pending I/O owned by a request the
|
|
50
|
+
* moment its response returns — a promise created during request A that
|
|
51
|
+
* hasn't settled by then FREEZES forever. Plugin-init and bootstrap promises
|
|
52
|
+
* are created during an app's first request and awaited by later requests'
|
|
53
|
+
* readiness gates, so an early-responding first request (e.g. an auth route
|
|
54
|
+
* that doesn't match the pending inits' paths) permanently wedges every
|
|
55
|
+
* later framework-route request. Tie the promise to the creating request's
|
|
56
|
+
* `waitUntil` so its I/O stays alive until it settles.
|
|
57
|
+
*/
|
|
58
|
+
function extendRequestLifetimeOverInit(promise: Promise<unknown>): void {
|
|
59
|
+
try {
|
|
60
|
+
(
|
|
61
|
+
globalThis as {
|
|
62
|
+
__cf_ctx?: { waitUntil?: (p: Promise<unknown>) => void };
|
|
63
|
+
}
|
|
64
|
+
).__cf_ctx?.waitUntil?.(promise);
|
|
65
|
+
} catch {
|
|
66
|
+
/* not on Cloudflare or ctx unavailable — nothing to extend */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Bound a readiness-gate await on workerd. Insurance against any init
|
|
72
|
+
* promise that still froze (e.g. created before __cf_ctx existed): a
|
|
73
|
+
* bounded wait turns a permanently hung request into a slow one that
|
|
74
|
+
* proceeds — the route either works (init actually finished) or 404/503s
|
|
75
|
+
* (retryable) instead of hanging until the runtime kills the request.
|
|
76
|
+
*/
|
|
77
|
+
async function awaitBounded(promise: Promise<unknown>): Promise<void> {
|
|
78
|
+
if (!isCloudflareRuntime()) {
|
|
79
|
+
await promise;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
83
|
+
const timeout = new Promise<void>((resolve) => {
|
|
84
|
+
timer = setTimeout(() => {
|
|
85
|
+
console.warn(
|
|
86
|
+
"[agent-native] readiness gate timed out waiting for plugin init (20s) — proceeding; the init promise may have been frozen by a prior request's completion",
|
|
87
|
+
);
|
|
88
|
+
resolve();
|
|
89
|
+
}, 20_000);
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
await Promise.race([promise, timeout]);
|
|
93
|
+
} finally {
|
|
94
|
+
if (timer) clearTimeout(timer);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
47
98
|
function supportsAppBasePathMount(path: string): boolean {
|
|
48
99
|
return (
|
|
49
100
|
pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||
|
|
@@ -143,6 +194,9 @@ export function getH3App(nitroApp: any): H3AppShim {
|
|
|
143
194
|
});
|
|
144
195
|
},
|
|
145
196
|
);
|
|
197
|
+
extendRequestLifetimeOverInit(
|
|
198
|
+
nitroApp[BOOTSTRAP_PROMISE_KEY] as Promise<unknown>,
|
|
199
|
+
);
|
|
146
200
|
|
|
147
201
|
// Readiness gate: Nitro v3 doesn't await async plugins, so routes
|
|
148
202
|
// registered inside an async plugin may not exist when the first
|
|
@@ -257,7 +311,7 @@ async function awaitFrameworkRoutesReadyForRequest(
|
|
|
257
311
|
): Promise<void> {
|
|
258
312
|
if (!nitroApp) return;
|
|
259
313
|
const bootstrapPromise = nitroApp[BOOTSTRAP_PROMISE_KEY];
|
|
260
|
-
if (bootstrapPromise) await bootstrapPromise;
|
|
314
|
+
if (bootstrapPromise) await awaitBounded(bootstrapPromise);
|
|
261
315
|
await awaitPluginsReady(nitroApp, reqPath);
|
|
262
316
|
}
|
|
263
317
|
|
|
@@ -306,6 +360,7 @@ export function trackPluginInit(
|
|
|
306
360
|
promise: safe,
|
|
307
361
|
paths: options.paths?.filter(Boolean),
|
|
308
362
|
};
|
|
363
|
+
extendRequestLifetimeOverInit(safe);
|
|
309
364
|
const existing = nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined;
|
|
310
365
|
if (existing) {
|
|
311
366
|
existing.push(entry);
|
|
@@ -426,7 +481,7 @@ export async function awaitPluginsReady(
|
|
|
426
481
|
: entries;
|
|
427
482
|
|
|
428
483
|
if (relevant.length) {
|
|
429
|
-
await Promise.all(relevant.map((entry) => entry.promise));
|
|
484
|
+
await Promise.all(relevant.map((entry) => awaitBounded(entry.promise)));
|
|
430
485
|
const completed = new Set(relevant);
|
|
431
486
|
const latest =
|
|
432
487
|
(nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined) ?? [];
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AAEnD,MAAM,WAAW,MAAM;IACrB,OAAO,CACL,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GAC9C,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D;;;;;OAKG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED;kFACkF;AAClF,wBAAgB,sBAAsB,IAAI,OAAO,CAMhD;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CASpD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CASzD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAiBhD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5D;AA8BD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,CAclE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;CACd,CAAC,CAQD;AAID,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAQ/D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQxD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAalE;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzD;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAO/D;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxE;AAqBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAejD;AAQD,wBAAgB,UAAU,IAAI,OAAO,CA6BpC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAED,iFAAiF;AACjF,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAUD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsH1D;AA4CD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAoBnD;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,SAAI,GACd,OAAO,CAAC,CAAC,CAAC,CAYZ;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAgBD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,EAAE,SAAkB,EACpB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,CAAC,CAAC,CAmDZ;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAQ7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYlE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAepC;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAgCzD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAepD;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,EACb,KAAK,SAAY,GAChB,IAAI,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
|
package/dist/db/client.js
CHANGED
|
@@ -797,6 +797,17 @@ export function attachNeonPoolErrorLogger(pool, label = "db/neon") {
|
|
|
797
797
|
withEvents.on("error", (err) => {
|
|
798
798
|
console.warn(`[${label}] pool error (will reconnect on next query):`, describeDbError(err));
|
|
799
799
|
});
|
|
800
|
+
// On Cloudflare Workers, DO NOT attach the per-client 'connect' listener
|
|
801
|
+
// below. @neondatabase/serverless disables its poolQueryViaFetch HTTP path
|
|
802
|
+
// the moment ANY non-'error' listener is registered on the pool
|
|
803
|
+
// (hasFetchUnsupportedListeners) — silently reverting every plain query to
|
|
804
|
+
// a WebSocket checkout. Combined with the single-use clients workerd
|
|
805
|
+
// requires, that churns a new WebSocket per query until the isolate hits
|
|
806
|
+
// its connection cap and pool.connect() hangs forever. The listener's
|
|
807
|
+
// purpose (preventing Node's uncaught-'error' process crash) doesn't apply
|
|
808
|
+
// on workerd, where an unhandled emit can't kill a process.
|
|
809
|
+
if (isCloudflareRuntime())
|
|
810
|
+
return;
|
|
800
811
|
// Attach a persistent 'error' listener to EVERY client for its whole lifetime.
|
|
801
812
|
//
|
|
802
813
|
// @neondatabase/serverless mirrors pg-pool, which only keeps its own idle
|
package/dist/db/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Central database client abstraction.\r\n *\r\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\r\n * and returns a unified `DbExec` interface that all core stores use.\r\n *\r\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\r\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\r\n * Cloudflare Workers, edge) without failing on missing native deps.\r\n */\r\nimport path from \"path\";\r\n\r\nimport { isCloudflareRuntime } from \"../shared/runtime.js\";\r\n\r\nconst recyclingPostgresPools = new WeakSet<object>();\r\nconst loggedNeonPools = new WeakSet<object>();\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\r\n\r\nexport interface DbExec {\r\n execute(\r\n sql: string | { sql: string; args?: unknown[] },\r\n ): Promise<{ rows: any[]; rowsAffected: number }>;\r\n transaction?<T>(fn: (tx: DbExec) => Promise<T>): Promise<T>;\r\n /**\r\n * Release the underlying connection/pool held by this exec.\r\n * Only non-singleton execs created via `createDbExec()` (e.g. the migration\r\n * direct-endpoint exec) should call this. The global singleton exec (`getDbExec`)\r\n * is managed by `closeDbExec()` instead.\r\n */\r\n close?(): Promise<void>;\r\n}\r\n\r\nexport interface DbExecConfig {\r\n url?: string;\r\n authToken?: string;\r\n d1Binding?: any;\r\n}\r\n\r\n/** Read the request-scoped Cloudflare binding without requiring every\r\n * consuming app's TypeScript program to include core's ambient Worker globals. */\r\nexport function getCloudflareD1Binding(): unknown {\r\n return (\r\n globalThis as typeof globalThis & {\r\n __cf_env?: { DB?: unknown };\r\n }\r\n ).__cf_env?.DB;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Per-app DATABASE_URL resolution\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Resolve the database URL for the current app.\r\n *\r\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\r\n * then falls back to `DATABASE_URL`, then Netlify's managed database env. This\r\n * allows multiple apps to run in the same process group (e.g. eager repo dev or\r\n * builder.io) with separate databases while still using the persistent Netlify\r\n * runtime database when `DATABASE_URL` was only exported for the build command.\r\n *\r\n * Set `APP_NAME=mail` in the child process env and\r\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\r\n */\r\nexport function getDatabaseUrl(fallback = \"\"): string {\r\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\r\n if (appName) {\r\n const prefixed = process.env[`${appName}_DATABASE_URL`];\r\n if (prefixed) return prefixed;\r\n }\r\n return (\r\n process.env.DATABASE_URL || process.env.NETLIFY_DATABASE_URL || fallback\r\n );\r\n}\r\n\r\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\r\nexport function getDatabaseAuthToken(): string | undefined {\r\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\r\n if (appName) {\r\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\r\n if (prefixed) return prefixed;\r\n }\r\n return (\r\n process.env.DATABASE_AUTH_TOKEN || process.env.NETLIFY_DATABASE_AUTH_TOKEN\r\n );\r\n}\r\n\r\nfunction getAppEnvPrefix(): string | undefined {\r\n return process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\") || undefined;\r\n}\r\n\r\n/**\r\n * Database URL to use for migrations — identical to DATABASE_URL but with the\r\n * Neon connection-pooler suffix stripped. Neon's PgBouncer runs in transaction\r\n * mode, which resets session-level ownership after each statement and causes\r\n * `ALTER TABLE … ADD COLUMN` to fail with \"must be owner of table <x>\" even\r\n * when the connecting role owns it. The direct endpoint bypasses PgBouncer so\r\n * DDL honours the role's actual ownership.\r\n *\r\n * Non-Neon URLs and already-direct Neon URLs are returned unchanged.\r\n */\r\nexport function getMigrationDatabaseUrl(): string {\r\n const appName = getAppEnvPrefix();\r\n const appUnpooled = appName\r\n ? process.env[`${appName}_DATABASE_URL_UNPOOLED`]\r\n : undefined;\r\n const url =\r\n appUnpooled ||\r\n process.env.NETLIFY_DATABASE_URL_UNPOOLED ||\r\n process.env.DATABASE_URL_UNPOOLED ||\r\n getDatabaseUrl();\r\n // Neon pooler hostname: ep-<id>-pooler.<region>.<cloud>.neon.tech\r\n // Direct hostname: ep-<id>.<region>.<cloud>.neon.tech\r\n // The region between `-pooler.` and `.neon.tech` can contain multiple\r\n // dot-separated labels (e.g. `c-7.us-east-1.aws`), so the matched segment\r\n // must allow dots — `[a-z0-9.-]+` — not just a single label. Anchoring on the\r\n // stable `.neon.tech` suffix keeps this from touching non-Neon hosts.\r\n return url.replace(/-pooler(\\.[a-z0-9.-]+\\.neon\\.tech)/, \"$1\");\r\n}\r\n\r\nexport function isLocalSqliteUrl(url: string): boolean {\r\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\r\n}\r\n\r\nexport function isPgliteUrl(url: string): boolean {\r\n return url.toLowerCase().startsWith(\"pglite:\");\r\n}\r\n\r\nexport function pgliteDataDirFromUrl(url: string): string {\r\n const raw = url.slice(\"pglite:\".length);\r\n const dataDir = raw.startsWith(\"//\") ? raw.slice(2) : raw;\r\n if (!dataDir || dataDir === \"/\") return \"./data/pglite\";\r\n if (\r\n dataDir === \"memory\" ||\r\n dataDir === \"/memory\" ||\r\n dataDir === \":memory:\" ||\r\n dataDir === \"/:memory:\" ||\r\n dataDir === \"memory://\"\r\n ) {\r\n return \"memory://\";\r\n }\r\n return dataDir;\r\n}\r\n\r\nexport function pgliteRuntimeDataDir(dataDir: string): string {\r\n if (dataDir === \"memory://\") return dataDir;\r\n if (!isServerlessRuntime() || path.isAbsolute(dataDir)) return dataDir;\r\n\r\n const safeParts = dataDir\r\n .split(/[\\\\/]+/)\r\n .filter((part) => part && part !== \".\" && part !== \"..\");\r\n const safeRelative =\r\n safeParts.length > 0\r\n ? path.join(...safeParts)\r\n : path.join(\"data\", \"pglite\");\r\n return path.join(\"/tmp\", safeRelative);\r\n}\r\n\r\nasync function preparePgliteDataDir(dataDir: string): Promise<string> {\r\n const runtimeDataDir = pgliteRuntimeDataDir(dataDir);\r\n if (runtimeDataDir === \"memory://\") return runtimeDataDir;\r\n\r\n try {\r\n const fs = await import(\"fs\");\r\n fs.mkdirSync(runtimeDataDir, { recursive: true });\r\n } catch {\r\n // Edge runtimes may not expose fs. PGlite will surface any real open error.\r\n }\r\n return runtimeDataDir;\r\n}\r\n\r\nasync function importOptionalModule(specifier: string): Promise<any> {\r\n return import(/* @vite-ignore */ specifier);\r\n}\r\n\r\nfunction isMissingPackageError(err: unknown, packageName: string): boolean {\r\n const anyErr = err as any;\r\n const message = String(anyErr?.message ?? anyErr ?? \"\");\r\n return (\r\n (anyErr?.code === \"ERR_MODULE_NOT_FOUND\" &&\r\n message.includes(packageName)) ||\r\n message.includes(`Cannot find package '${packageName}'`) ||\r\n message.includes(`Cannot find module '${packageName}'`)\r\n );\r\n}\r\n\r\nexport async function loadPglitePackage(): Promise<{ PGlite: any }> {\r\n const packageName = \"@electric-sql/pglite\";\r\n try {\r\n return (await importOptionalModule(packageName)) as { PGlite: any };\r\n } catch (err) {\r\n if (isMissingPackageError(err, packageName)) {\r\n throw new Error(\r\n \"PGlite database support requires the optional @electric-sql/pglite package. \" +\r\n \"Install it with `pnpm add @electric-sql/pglite@^0.5.3`, then set \" +\r\n \"`DATABASE_URL=pglite:./data/pglite`.\",\r\n );\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\nexport async function loadPgliteDrizzle(): Promise<{\r\n PGlite: any;\r\n drizzle: any;\r\n}> {\r\n const drizzlePackage = \"drizzle-orm/pglite\";\r\n const { PGlite } = await loadPglitePackage();\r\n const drizzleMod = await importOptionalModule(drizzlePackage);\r\n return {\r\n PGlite,\r\n drizzle: drizzleMod.drizzle,\r\n };\r\n}\r\n\r\nconst _pgliteClients = new Map<string, Promise<any>>();\r\n\r\nexport async function getPgliteClient(url: string): Promise<any> {\r\n const dataDir = await preparePgliteDataDir(pgliteDataDirFromUrl(url));\r\n let ready = _pgliteClients.get(dataDir);\r\n if (!ready) {\r\n ready = loadPglitePackage().then(({ PGlite }) => PGlite.create(dataDir));\r\n _pgliteClients.set(dataDir, ready);\r\n }\r\n return ready;\r\n}\r\n\r\nexport async function closePgliteClients(): Promise<void> {\r\n const clients = await Promise.allSettled(_pgliteClients.values());\r\n _pgliteClients.clear();\r\n for (const result of clients) {\r\n if (result.status === \"fulfilled\") {\r\n await result.value.close().catch(() => {});\r\n }\r\n }\r\n}\r\n\r\nexport async function closePgliteClient(url: string): Promise<void> {\r\n const dataDir = pgliteRuntimeDataDir(pgliteDataDirFromUrl(url));\r\n const ready = _pgliteClients.get(dataDir);\r\n _pgliteClients.delete(dataDir);\r\n if (!ready) return;\r\n\r\n const result = await Promise.resolve(ready).then(\r\n (client) => ({ status: \"fulfilled\" as const, client }),\r\n () => ({ status: \"rejected\" as const }),\r\n );\r\n if (result.status === \"fulfilled\") {\r\n await result.client.close().catch(() => {});\r\n }\r\n}\r\n\r\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\r\n if (!url.startsWith(\"file:\")) return url;\r\n\r\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\r\n // working directory is read-only. Detect this and redirect local SQLite to\r\n // /tmp which IS writable (ephemeral per invocation, but the server stays\r\n // alive for the request). Shares the canonical isServerlessRuntime() check.\r\n const isServerless = isServerlessRuntime();\r\n try {\r\n const fs = await import(\"fs\");\r\n if (isServerless && url === \"file:./data/app.db\") {\r\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\r\n return \"file:///tmp/data/app.db\";\r\n }\r\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\r\n } catch {\r\n // Edge runtime — no filesystem.\r\n }\r\n return url;\r\n}\r\n\r\nexport function sqliteFilenameFromUrl(url: string): string {\r\n if (url.startsWith(\"file://\")) {\r\n return decodeURIComponent(new URL(url).pathname);\r\n }\r\n if (url.startsWith(\"file:\")) {\r\n return url.slice(\"file:\".length) || \":memory:\";\r\n }\r\n return url || \"./data/app.db\";\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Safe JSON column parsing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Parse a JSON-serialized column value defensively. A malformed row — from a\r\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\r\n * must not break an entire list endpoint. Callers supply a fallback for the\r\n * malformed path; null/undefined values also fall back.\r\n */\r\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\r\n if (value == null) return fallback;\r\n try {\r\n return JSON.parse(String(value)) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// SQLite retry helper\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Retry an async operation when it fails with SQLITE_BUSY.\r\n * Used during WAL initialization and migrations where a stale WAL from a\r\n * previous crash or HMR restart can briefly lock the database.\r\n */\r\nexport async function retrySqliteBusy<T>(\r\n fn: () => Promise<T>,\r\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\r\n): Promise<T> {\r\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\r\n let last: unknown;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (e: any) {\r\n last = e;\r\n const msg = String(e?.message || e);\r\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\r\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n if (rethrow) throw last;\r\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\r\n}\r\n\r\n/**\r\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\r\n * to a Postgres pg_catalog race.\r\n *\r\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\r\n * `pg_class` catalog insert. When multiple processes boot concurrently and\r\n * issue the same CREATE, both can pass the existence check and one fails\r\n * with code 23505 on `pg_type_typname_nsp_index`, 42710 from `TypeCreate`,\r\n * or similar. The table does end up created by the winner, so rerunning the\r\n * same `IF NOT EXISTS` statement is a safe no-op.\r\n */\r\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (e: any) {\r\n if (!isPgCatalogRace(e)) throw e;\r\n return await fn();\r\n }\r\n}\r\n\r\nfunction isPgCatalogRace(e: any): boolean {\r\n const msg = String(e?.message ?? \"\");\r\n if (e?.code === \"42P07\") return true;\r\n if (e?.code === \"42710\") {\r\n const routine = String(e?.routine ?? \"\");\r\n return routine === \"TypeCreate\" || /type .* already exists/i.test(msg);\r\n }\r\n if (e?.code !== \"23505\") return false;\r\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\r\n const detail = String(e?.detail ?? \"\");\r\n return (\r\n constraint.startsWith(\"pg_type\") ||\r\n constraint.startsWith(\"pg_class\") ||\r\n detail.includes(\"pg_type\") ||\r\n detail.includes(\"pg_class\") ||\r\n /relation .* already exists/i.test(msg)\r\n );\r\n}\r\n\r\n/**\r\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\r\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\r\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\r\n * surface a clean \"already exists\" error instead of the raw SQL text.\r\n */\r\nexport function isUniqueViolation(e: any): boolean {\r\n if (e?.code === \"23505\") return true;\r\n const code = String(e?.code ?? \"\");\r\n if (\r\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\r\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\r\n ) {\r\n return true;\r\n }\r\n const msg = String(e?.message ?? \"\").toLowerCase();\r\n return (\r\n msg.includes(\"unique constraint\") ||\r\n msg.includes(\"primary key constraint\") ||\r\n msg.includes(\"duplicate key\")\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Dialect detection\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _dialect: Dialect | undefined;\r\n\r\nexport function getDialect(): Dialect {\r\n if (_dialect !== undefined) return _dialect;\r\n\r\n // DATABASE_URL takes priority over D1 when set.\r\n const url = getDatabaseUrl();\r\n if (\r\n url.startsWith(\"postgres://\") ||\r\n url.startsWith(\"postgresql://\") ||\r\n isPgliteUrl(url)\r\n ) {\r\n _dialect = \"postgres\";\r\n return _dialect;\r\n }\r\n if (url && !url.startsWith(\"file:\")) {\r\n // Remote libsql (e.g. Turso)\r\n _dialect = \"sqlite\";\r\n return _dialect;\r\n }\r\n\r\n const d1 = getCloudflareD1Binding();\r\n if (d1) {\r\n _dialect = \"d1\";\r\n return _dialect;\r\n }\r\n\r\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\r\n // available at import time. If we cache \"sqlite\" here, D1 will never be\r\n // detected once the bindings are set in the fetch handler.\r\n return \"sqlite\";\r\n}\r\n\r\nexport function isPostgres(): boolean {\r\n return getDialect() === \"postgres\";\r\n}\r\n\r\nfunction dialectForConfig(config: DbExecConfig): Dialect {\r\n const url = config.url ?? \"\";\r\n if (\r\n url.startsWith(\"postgres://\") ||\r\n url.startsWith(\"postgresql://\") ||\r\n isPgliteUrl(url)\r\n ) {\r\n return \"postgres\";\r\n }\r\n if (url && !url.startsWith(\"file:\")) {\r\n return \"sqlite\";\r\n }\r\n if (config.d1Binding) {\r\n return \"d1\";\r\n }\r\n return \"sqlite\";\r\n}\r\n\r\n/**\r\n * Returns true when the database is a local-only SQLite file (or unset, which\r\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\r\n * (Turso), and D1 — any backend that could be shared across developers.\r\n *\r\n * Used to gate local@localhost mode: that mode uses a single shared virtual\r\n * user with no per-machine scoping, so on any shared database two developers\r\n * would read and write each other's settings, oauth tokens, and app state.\r\n */\r\nexport function isLocalDatabase(): boolean {\r\n if (isPgliteUrl(getDatabaseUrl())) return true;\r\n if (getDialect() !== \"sqlite\") return false;\r\n const url = getDatabaseUrl();\r\n return url === \"\" || url.startsWith(\"file:\");\r\n}\r\n\r\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\r\nexport function intType(): string {\r\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\r\n}\r\n\r\n// `widenIntColumnsToBigInt` lives in `./widen-columns.js` (it depends only on\r\n// `isPostgres`/`getDbExec` from here) so stores can import it without every\r\n// `vi.mock(\"./client.js\")` test having to stub the export.\r\n\r\n// ---------------------------------------------------------------------------\r\n// Parameter conversion: ? -> $1, $2, $3\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function sqliteToPostgresParams(sql: string): string {\r\n let out = \"\";\r\n let param = 0;\r\n let i = 0;\r\n let mode:\r\n | \"normal\"\r\n | \"single\"\r\n | \"double\"\r\n | \"line-comment\"\r\n | \"block-comment\"\r\n | \"dollar\" = \"normal\";\r\n let dollarTag = \"\";\r\n\r\n while (i < sql.length) {\r\n const ch = sql[i];\r\n const next = sql[i + 1];\r\n\r\n if (mode === \"line-comment\") {\r\n out += ch;\r\n i++;\r\n if (ch === \"\\n\") mode = \"normal\";\r\n continue;\r\n }\r\n\r\n if (mode === \"block-comment\") {\r\n out += ch;\r\n if (ch === \"*\" && next === \"/\") {\r\n out += next;\r\n i += 2;\r\n mode = \"normal\";\r\n continue;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"single\") {\r\n out += ch;\r\n if (ch === \"'\" && next === \"'\") {\r\n out += next;\r\n i += 2;\r\n continue;\r\n }\r\n if (ch === \"'\") mode = \"normal\";\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"double\") {\r\n out += ch;\r\n if (ch === '\"' && next === '\"') {\r\n out += next;\r\n i += 2;\r\n continue;\r\n }\r\n if (ch === '\"') mode = \"normal\";\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"dollar\") {\r\n if (dollarTag && sql.startsWith(dollarTag, i)) {\r\n out += dollarTag;\r\n i += dollarTag.length;\r\n mode = \"normal\";\r\n dollarTag = \"\";\r\n continue;\r\n }\r\n out += ch;\r\n i++;\r\n continue;\r\n }\r\n\r\n if (ch === \"-\" && next === \"-\") {\r\n out += ch + next;\r\n i += 2;\r\n mode = \"line-comment\";\r\n continue;\r\n }\r\n if (ch === \"/\" && next === \"*\") {\r\n out += ch + next;\r\n i += 2;\r\n mode = \"block-comment\";\r\n continue;\r\n }\r\n if (ch === \"'\") {\r\n out += ch;\r\n i++;\r\n mode = \"single\";\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n out += ch;\r\n i++;\r\n mode = \"double\";\r\n continue;\r\n }\r\n if (ch === \"$\") {\r\n const match = /^\\$[A-Za-z_][A-Za-z0-9_]*\\$|^\\$\\$/.exec(sql.slice(i));\r\n if (match) {\r\n dollarTag = match[0];\r\n out += dollarTag;\r\n i += dollarTag.length;\r\n mode = \"dollar\";\r\n continue;\r\n }\r\n }\r\n if (ch === \"?\") {\r\n out += `$${++param}`;\r\n i++;\r\n continue;\r\n }\r\n\r\n out += ch;\r\n i++;\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction sqlAndArgs(sql: string | { sql: string; args?: unknown[] }): {\r\n rawSql: string;\r\n args: unknown[];\r\n} {\r\n return typeof sql === \"string\"\r\n ? { rawSql: sql, args: [] }\r\n : { rawSql: sql.sql, args: sql.args || [] };\r\n}\r\n\r\nfunction explicitTransaction(\r\n execute: DbExec[\"execute\"],\r\n begin = \"BEGIN\",\r\n): NonNullable<DbExec[\"transaction\"]> {\r\n return async (fn) => {\r\n await execute(begin);\r\n try {\r\n const result = await fn({ execute });\r\n await execute(\"COMMIT\");\r\n return result;\r\n } catch (err) {\r\n await execute(\"ROLLBACK\").catch(() => {});\r\n throw err;\r\n }\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Connection error retry (ECONNRESET, etc.)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Error codes that indicate a dead/stale connection we can safely retry. */\r\nconst CONNECTION_ERROR_CODES = new Set([\r\n \"ECONNRESET\",\r\n \"ETIMEDOUT\",\r\n \"EPIPE\",\r\n \"ENOTFOUND\",\r\n \"CONNECT_TIMEOUT\",\r\n \"CONNECTION_ENDED\",\r\n \"CONNECTION_DESTROYED\",\r\n \"CONNECTION_CLOSED\",\r\n]);\r\n\r\nexport function isConnectionError(err: any): boolean {\r\n if (!err) return false;\r\n const code = err.code || err.cause?.code;\r\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\r\n // Neon serverless WS driver: errors from the underlying undici WebSocket\r\n // closing mid-query come through as TypeError or ErrorEvent without a code.\r\n const name = err.name || err.cause?.name || \"\";\r\n if (name === \"ErrorEvent\") return true;\r\n const stack = String(err.stack || err.cause?.stack || \"\");\r\n if (\r\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\r\n stack,\r\n )\r\n ) {\r\n return true;\r\n }\r\n const msg = String(err.message || err.cause?.message || \"\");\r\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\r\n msg,\r\n );\r\n}\r\n\r\nexport async function retryOnConnectionError<T>(\r\n fn: () => Promise<T>,\r\n maxAttempts = 3,\r\n): Promise<T> {\r\n let last: unknown;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (e) {\r\n last = e;\r\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\r\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\r\n }\r\n }\r\n throw last;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Per-op timeout — converts a silent serverless hang into a retryable error\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Max wall time for a single DB op (init or query) before we treat it as a\r\n * dead connection. A frozen→thawed serverless instance can leave the Neon\r\n * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither\r\n * settles nor errors, so retryOnConnectionError() — which only retries thrown\r\n * errors — can't help and the request hangs until the platform kills the\r\n * function (~30s on Netlify). For authenticated requests that run a session\r\n * lookup on every navigation this surfaces as \"the site won't load\". Bounding\r\n * each op well under the platform function limit turns the silent hang into a\r\n * CONNECT_TIMEOUT that the existing retry and reject-reset paths already\r\n * handle. Override with DB_OP_TIMEOUT_MS.\r\n */\r\nexport function dbOpTimeoutMs(): number {\r\n const raw = Number(process.env.DB_OP_TIMEOUT_MS);\r\n if (Number.isFinite(raw) && raw > 0) return raw;\r\n return isServerlessRuntime() ? 8_000 : 30_000;\r\n}\r\n\r\n/**\r\n * Timeout error tagged with a recognized connection-error code so\r\n * isConnectionError() / retryOnConnectionError() treat a hung op as a\r\n * retryable dead connection, and upstream reject-reset guards (e.g. the\r\n * cached session-table init promise) clear their poisoned state.\r\n */\r\nclass DbTimeoutError extends Error {\r\n code = \"CONNECT_TIMEOUT\";\r\n constructor(op: string, ms: number) {\r\n super(`DB ${op} timed out after ${ms}ms (connection terminated)`);\r\n this.name = \"DbTimeoutError\";\r\n }\r\n}\r\n\r\n/**\r\n * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable\r\n * query or pooled client should pass onTimeout so the losing operation does\r\n * not keep occupying a scarce connection slot after the request has recovered.\r\n */\r\nexport async function withDbTimeout<T>(\r\n op: string,\r\n run: () => Promise<T>,\r\n ms = dbOpTimeoutMs(),\r\n onTimeout?: () => void | Promise<void>,\r\n): Promise<T> {\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n let settled = false;\r\n\r\n const runCleanup = async () => {\r\n if (!onTimeout) return;\r\n try {\r\n await onTimeout();\r\n } catch (err) {\r\n console.warn(\r\n `[db] timeout cleanup for ${op} failed:`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n }\r\n };\r\n\r\n return await new Promise<T>((resolve, reject) => {\r\n const finish = (\r\n complete: (value: T | PromiseLike<T>) => void,\r\n value: T | PromiseLike<T>,\r\n ) => {\r\n if (settled) return;\r\n settled = true;\r\n if (timer) clearTimeout(timer);\r\n complete(value);\r\n };\r\n const fail = (err: unknown) => {\r\n if (settled) return;\r\n settled = true;\r\n if (timer) clearTimeout(timer);\r\n reject(err);\r\n };\r\n\r\n timer = setTimeout(() => {\r\n if (settled) return;\r\n settled = true;\r\n void (async () => {\r\n await runCleanup();\r\n reject(new DbTimeoutError(op, ms));\r\n })();\r\n }, ms);\r\n\r\n let promise: Promise<T>;\r\n try {\r\n promise = run();\r\n } catch (err) {\r\n fail(err);\r\n return;\r\n }\r\n promise.then((value) => finish(resolve, value), fail);\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Serverless-aware Postgres pool options\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\r\n * Cloudflare Pages Functions) where every concurrent request can spin up its\r\n * own frozen process. Connections cannot be shared across instances, so each\r\n * instance must keep its pool tiny — otherwise dozens of warm instances each\r\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\r\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\r\n * connections reached\".\r\n */\r\nexport function isServerlessRuntime(): boolean {\r\n return (\r\n !!process.env.NETLIFY ||\r\n !!process.env.VERCEL ||\r\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\r\n !!process.env.LAMBDA_TASK_ROOT ||\r\n !!process.env.CF_PAGES\r\n );\r\n}\r\n\r\n/**\r\n * postgres.js pool options tuned per runtime. A serverless instance handles\r\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\r\n * so a single slow query or open transaction can't serialize every other\r\n * query in the same request. Total connections stay bounded to ≈ 2×\r\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\r\n * serverless so a thawed-but-idle instance releases its connections quickly.\r\n * Long-lived Node servers keep the normal pool for throughput.\r\n */\r\nexport function pgPoolOptions(url: string): Record<string, unknown> {\r\n const serverless = isServerlessRuntime();\r\n return {\r\n onnotice: () => {},\r\n max: serverless ? 2 : 10,\r\n idle_timeout: serverless ? 20 : 240,\r\n max_lifetime: 60 * 30,\r\n connect_timeout: 10,\r\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\r\n // Only disable for Supabase URLs to avoid degrading other deployments.\r\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\r\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\r\n * and keeps total connections bounded while still letting a second query\r\n * proceed when one connection is busy.\r\n */\r\nexport function neonPoolMax(): number {\r\n if (!isServerlessRuntime()) return 10;\r\n // The durable background-function worker is a SINGLE process per run (unlike\r\n // the many warm request-instances the foreground serverless has), so it can\r\n // safely hold a larger pool without risking Neon's connection cap. The agent's\r\n // pre-send setup fires ~6 concurrent DB reads in parallel; with only 2\r\n // connections that burst exhausts the pool and a single stalled connection\r\n // freezes the worker before it can claim — observed on analytics' heavier\r\n // action surface, where the worker froze right after `model_done` and never\r\n // recorded `env_config`/`presend`, while the foreground (10-connection pool)\r\n // ran the identical code in ~2s. Give the bg worker enough connections for the\r\n // burst; keep the foreground serverless pool tiny to avoid \"Max client\r\n // connections reached\" across many warm instances.\r\n if (isBackgroundFunctionPoolContext()) return 8;\r\n return 2;\r\n}\r\n\r\n/**\r\n * Inline mirror of `isInBackgroundFunctionRuntime()`\r\n * (agent/durable-background.ts), replicated here to avoid a `db` → `agent`\r\n * import cycle. Keep the signals in sync with that function.\r\n */\r\nexport function isBackgroundFunctionPoolContext(): boolean {\r\n if (\r\n (globalThis as Record<string, unknown>)\r\n .__AGENT_NATIVE_BACKGROUND_RUNTIME__ === true\r\n ) {\r\n return true;\r\n }\r\n // NOTE: we deliberately do NOT trust `__AGENT_NATIVE_BACKGROUND_RUNTIME_EXPECTED__`\r\n // here. That flag is set from the dispatch MARKER (which URL the foreground\r\n // targeted), not from proof the request actually LANDED on a background\r\n // function. A worker dispatched toward `-background` but routed onto the ~60s\r\n // synchronous function would otherwise take the 8-connection background pool\r\n // while running as one of MANY warm sync-function instances — multiplying\r\n // Neon connections and exhausting the pooled endpoint (\"connection\r\n // terminated\" / statement timeouts / failed heartbeat writes → stale runs).\r\n // The genuine `-background` function sets `__AGENT_NATIVE_BACKGROUND_RUNTIME__`\r\n // as its first cold-start statement, so a real background worker still gets\r\n // the larger pool via the check above. Mirrors the same proof-of-landing\r\n // tightening applied to `shouldUseBackgroundFunctionTimeoutForWorker`.\r\n const lambdaName = process.env.AWS_LAMBDA_FUNCTION_NAME;\r\n if (\r\n typeof lambdaName === \"string\" &&\r\n lambdaName.toLowerCase().endsWith(\"-background\")\r\n ) {\r\n return true;\r\n }\r\n const forced = process.env.AGENT_CHAT_FORCE_BACKGROUND_RUNTIME;\r\n if (forced != null) {\r\n const v = forced.trim().toLowerCase();\r\n return v === \"1\" || v === \"true\" || v === \"yes\" || v === \"on\";\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Render any rejection reason as a readable message. The Neon serverless\r\n * driver surfaces WebSocket failures as raw DOM-style ErrorEvent objects (not\r\n * Error instances), which stringify uselessly as \"[object ErrorEvent]\" — pull\r\n * the message off the event (or its nested `.error`) instead so logs carry\r\n * actual context.\r\n */\r\nexport function describeDbError(err: unknown): string {\r\n if (err instanceof Error) return err.message;\r\n if (err && typeof err === \"object\") {\r\n const evt = err as {\r\n message?: unknown;\r\n error?: { message?: unknown };\r\n type?: unknown;\r\n };\r\n const msg = evt.message ?? evt.error?.message;\r\n if (typeof msg === \"string\" && msg) return msg;\r\n if (evt.type === \"error\") {\r\n return \"WebSocket ErrorEvent (connection failed; no message attached)\";\r\n }\r\n }\r\n return String(err);\r\n}\r\n\r\nexport function attachNeonPoolErrorLogger(\r\n pool: unknown,\r\n label = \"db/neon\",\r\n): void {\r\n if (!pool || typeof pool !== \"object\") return;\r\n if (loggedNeonPools.has(pool)) return;\r\n const withEvents = pool as {\r\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\r\n };\r\n if (typeof withEvents.on !== \"function\") return;\r\n\r\n loggedNeonPools.add(pool);\r\n withEvents.on(\"error\", (err: unknown) => {\r\n console.warn(\r\n `[${label}] pool error (will reconnect on next query):`,\r\n describeDbError(err),\r\n );\r\n });\r\n\r\n // Attach a persistent 'error' listener to EVERY client for its whole lifetime.\r\n //\r\n // @neondatabase/serverless mirrors pg-pool, which only keeps its own idle\r\n // error listener on a client while that client is idle — it REMOVES the\r\n // listener the moment the client is checked out. So when a checked-out\r\n // client's WebSocket drops mid-flight (Lambda freeze/thaw, Neon \"terminating\r\n // connection due to administrator command\", an idle socket the pooler closed),\r\n // the client emits 'error' with no listener. Node turns an unhandled 'error'\r\n // EventEmitter event into an uncaught exception, which crashes the whole\r\n // serverless function. This was by far the single highest-volume production\r\n // crash (Sentry \"Unhandled error. ()\", mechanism auto.node.onuncaughtexception,\r\n // culprit neondatabase__serverless). pg routes the failure to the in-flight\r\n // query independently, so this listener only needs to keep the emit from going\r\n // unhandled — the dropped client is discarded and the next query reconnects.\r\n withEvents.on(\"connect\", (client: unknown) => {\r\n if (!client || typeof client !== \"object\") return;\r\n const clientEvents = client as {\r\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\r\n };\r\n if (typeof clientEvents.on !== \"function\") return;\r\n clientEvents.on(\"error\", (err: unknown) => {\r\n console.warn(\r\n `[${label}] client connection error (connection discarded, next query reconnects):`,\r\n describeDbError(err),\r\n );\r\n });\r\n });\r\n}\r\n\r\nfunction disposePostgresPoolEventually(\r\n pool: { end: () => Promise<unknown> },\r\n label: string,\r\n): void {\r\n if (!pool || typeof pool !== \"object\") return;\r\n if (recyclingPostgresPools.has(pool)) return;\r\n recyclingPostgresPools.add(pool);\r\n void pool.end().catch((err: unknown) => {\r\n console.warn(\r\n `[db/postgres] ${label} cleanup failed:`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Singleton client — lazy-initialized on first execute() call\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _exec: DbExec | undefined;\r\nlet _pgPool: any;\r\nlet _neonPool: any;\r\nlet _sqlite: any;\r\nlet _initPromise: Promise<void> | undefined;\r\n\r\nasync function executePglite(\r\n client: {\r\n query: (\r\n sql: string,\r\n args?: any[],\r\n ) => Promise<{ rows?: any[]; affectedRows?: number; rowCount?: number }>;\r\n },\r\n sql: Parameters<DbExec[\"execute\"]>[0],\r\n): ReturnType<DbExec[\"execute\"]> {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await client.query(pgSql, args as any[]);\r\n return {\r\n rows: Array.from(result.rows ?? []),\r\n rowsAffected: result.affectedRows ?? result.rowCount ?? 0,\r\n };\r\n}\r\n\r\nasync function createDbExecInternal(\r\n config: DbExecConfig = {},\r\n trackSingletonResources = false,\r\n): Promise<DbExec> {\r\n const dialect = dialectForConfig(config);\r\n\r\n // Cloudflare D1\r\n if (dialect === \"d1\") {\r\n const d1 = config.d1Binding;\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n if (typeof sql === \"string\") {\r\n const r = await d1.prepare(sql).all();\r\n return {\r\n rows: r.results || [],\r\n rowsAffected: r.meta?.changes ?? 0,\r\n };\r\n }\r\n const r = await d1\r\n .prepare(sql.sql)\r\n .bind(...(sql.args ?? []))\r\n .all();\r\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\r\n };\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute),\r\n };\r\n }\r\n\r\n let url = config.url || \"file:./data/app.db\";\r\n\r\n if (isPgliteUrl(url)) {\r\n const client = await getPgliteClient(url);\r\n return {\r\n execute: (sql) => executePglite(client, sql),\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n return client.transaction((tx: any) =>\r\n fn({\r\n execute: (sql) => executePglite(tx, sql),\r\n }),\r\n );\r\n },\r\n async close() {\r\n await closePgliteClient(url);\r\n },\r\n };\r\n }\r\n\r\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\r\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\r\n // On Workers, connections can't be shared across requests, so we create a\r\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\r\n // different request\" error.\r\n if (dialect === \"postgres\") {\r\n const { isNeonUrl } = await import(\"./create-get-db.js\");\r\n\r\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\r\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\r\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\r\n // Neon's pooler is cold — every request after an idle period times out\r\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\r\n // and keeps the same `pg`-compatible query(...) interface we need here.\r\n if (isNeonUrl(url)) {\r\n const { Pool, neonConfig } = await import(\"@neondatabase/serverless\");\r\n // In the durable background-function worker, route pool queries over Neon's\r\n // stateless HTTP transport instead of a long-lived WebSocket. A frozen/thawed\r\n // bg-fn instance can leave the pool's WebSocket connections half-dead, so\r\n // queries after the first burst stall on connect()/query() — observed: the\r\n // analytics worker stalls right after model resolution and never claims.\r\n // HTTP-per-query (poolQueryViaFetch) has no persistent socket to die; the\r\n // foreground keeps the WebSocket pool. See the bg-fn execute branch below.\r\n // Cloudflare Workers (workerd) additionally forbids reusing I/O objects\r\n // across requests — a pooled WebSocket created in request A and handed\r\n // to request B throws \"Cannot perform I/O on behalf of a different\r\n // request\" and hangs the worker — so workerd always takes the stateless\r\n // HTTP path too.\r\n const bgHttp =\r\n isBackgroundFunctionPoolContext() || isCloudflareRuntime();\r\n if (bgHttp) {\r\n (neonConfig as { poolQueryViaFetch?: boolean }).poolQueryViaFetch =\r\n true;\r\n }\r\n // On workerd, transactions still use pool.connect() WebSocket clients —\r\n // cap each client to a single use so a socket created in one request is\r\n // destroyed on release instead of being handed to a later request.\r\n const pool = new Pool({\r\n connectionString: url,\r\n max: neonPoolMax(),\r\n ...(isCloudflareRuntime() ? { maxUses: 1 } : {}),\r\n });\r\n attachNeonPoolErrorLogger(pool);\r\n if (trackSingletonResources) _neonPool = pool;\r\n async function queryNeonClient(\r\n client: any,\r\n sql: Parameters<DbExec[\"execute\"]>[0],\r\n ) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout(\r\n \"query\",\r\n () =>\r\n client.query(pgSql, args as any[]) as Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }>,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: result.rows,\r\n rowsAffected: result.rowCount ?? 0,\r\n };\r\n }\r\n return {\r\n async execute(sql) {\r\n if (bgHttp) {\r\n // HTTP-per-query path (poolQueryViaFetch=true): no pool.connect(), no\r\n // persistent socket to stall. queryNeonClient calls pool.query(),\r\n // which the driver routes over HTTP when poolQueryViaFetch is set.\r\n return retryOnConnectionError<{\r\n rows: unknown[];\r\n rowsAffected: number;\r\n }>(() =>\r\n withDbTimeout(\r\n \"http-query\",\r\n () => queryNeonClient(pool, sql),\r\n dbOpTimeoutMs(),\r\n ),\r\n );\r\n }\r\n const result = await retryOnConnectionError<{\r\n rows: unknown[];\r\n rowsAffected: number;\r\n }>(async () => {\r\n // Bound the pooled-connection ACQUIRE, not just the query below.\r\n // Neon's pooler can stall on `connect()` when cold or exhausted,\r\n // and that happens BEFORE `client.query`, so the query-level\r\n // timeout never fires — the request hangs until the platform kills\r\n // the function (~\"the site won't load\" for authenticated users,\r\n // whose every request runs a session/org lookup). Time the acquire\r\n // out into a retryable CONNECT_TIMEOUT that retryOnConnectionError\r\n // already handles, and release the connection if it resolves after\r\n // we've given up so the scarce pool slot isn't leaked.\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c) => {\r\n if (acquireTimedOut) c.release();\r\n return c;\r\n }),\r\n dbOpTimeoutMs(),\r\n () => {\r\n acquireTimedOut = true;\r\n },\r\n );\r\n let released = false;\r\n const releaseClient = (err?: Error | boolean) => {\r\n if (released) return;\r\n released = true;\r\n client.release(err);\r\n };\r\n\r\n try {\r\n const result = await queryNeonClient(client, sql);\r\n releaseClient();\r\n return result;\r\n } catch (err) {\r\n releaseClient(isConnectionError(err) ? true : undefined);\r\n throw err;\r\n }\r\n });\r\n return {\r\n rows: result.rows,\r\n rowsAffected: result.rowsAffected,\r\n };\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n return retryOnConnectionError(async () => {\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c) => {\r\n if (acquireTimedOut) c.release();\r\n return c;\r\n }),\r\n dbOpTimeoutMs(),\r\n () => {\r\n acquireTimedOut = true;\r\n },\r\n );\r\n let released = false;\r\n const releaseClient = (err?: Error | boolean) => {\r\n if (released) return;\r\n released = true;\r\n client.release(err);\r\n };\r\n const tx: DbExec = {\r\n execute: (sql) => queryNeonClient(client, sql),\r\n };\r\n try {\r\n await queryNeonClient(client, \"BEGIN\");\r\n const result = await fn(tx);\r\n await queryNeonClient(client, \"COMMIT\");\r\n releaseClient();\r\n return result;\r\n } catch (err) {\r\n await queryNeonClient(client, \"ROLLBACK\").catch(() => {});\r\n releaseClient(isConnectionError(err) ? true : undefined);\r\n throw err;\r\n }\r\n }, 1);\r\n },\r\n async close() {\r\n await pool.end();\r\n },\r\n };\r\n }\r\n\r\n const { default: postgres } = await import(\"postgres\");\r\n const isWorkers =\r\n \"__cf_env\" in globalThis ||\r\n (typeof navigator !== \"undefined\" &&\r\n navigator.userAgent === \"Cloudflare-Workers\");\r\n\r\n if (isWorkers) {\r\n // Workers: fresh connection per query — I/O can't be shared across requests\r\n return {\r\n async execute(sql) {\r\n const conn = postgres(url, {\r\n max: 1,\r\n idle_timeout: 0,\r\n onnotice: () => {},\r\n });\r\n let timedOut = false;\r\n try {\r\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\r\n const args = typeof sql === \"string\" ? [] : sql.args || [];\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n conn.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n () => {\r\n timedOut = true;\r\n disposePostgresPoolEventually(conn, \"timed-out worker query\");\r\n },\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n } finally {\r\n if (!timedOut) {\r\n await conn.end().catch((err: unknown) => {\r\n console.warn(\r\n \"[db/postgres] worker query cleanup failed:\",\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n }\r\n }\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n const conn = postgres(url, {\r\n max: 1,\r\n idle_timeout: 0,\r\n onnotice: () => {},\r\n });\r\n try {\r\n const result = await conn.begin(async (txSql: any) => {\r\n const tx: DbExec = {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n txSql.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n };\r\n return fn(tx);\r\n });\r\n return result as T;\r\n } finally {\r\n await conn.end().catch((err: unknown) => {\r\n console.warn(\r\n \"[db/postgres] worker transaction cleanup failed:\",\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n }\r\n },\r\n };\r\n } else {\r\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\r\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\r\n // frozen instances don't exhaust Neon/Postgres' connection limit;\r\n // idle_timeout also closes idle connections before Neon's ~5min\r\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\r\n const createPool = () => postgres(url, pgPoolOptions(url));\r\n type PostgresPool = ReturnType<typeof createPool>;\r\n let pool = createPool();\r\n if (trackSingletonResources) _pgPool = pool;\r\n const recyclePool = (timedOutPool: PostgresPool) => {\r\n if (pool === timedOutPool) {\r\n pool = createPool();\r\n if (trackSingletonResources) _pgPool = pool;\r\n }\r\n disposePostgresPoolEventually(timedOutPool, \"timed-out pooled query\");\r\n };\r\n\r\n return {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await retryOnConnectionError<\r\n ArrayLike<unknown> & { count?: number }\r\n >(() => {\r\n const queryPool = pool;\r\n const query = queryPool.unsafe(pgSql, args as any[]);\r\n return withDbTimeout(\r\n \"query\",\r\n () => query,\r\n dbOpTimeoutMs(),\r\n () => recyclePool(queryPool),\r\n );\r\n });\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n const result = await pool.begin(async (txSql: any) => {\r\n const tx: DbExec = {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n txSql.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n };\r\n return fn(tx);\r\n });\r\n return result as T;\r\n },\r\n async close() {\r\n await pool.end();\r\n },\r\n };\r\n }\r\n }\r\n\r\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\r\n // serverless bundles do not need libsql's platform-specific native package.\r\n if (isLocalSqliteUrl(url)) {\r\n url = await prepareLocalSqliteUrl(\r\n url.startsWith(\"file:\") ? url : `file:${url}`,\r\n );\r\n const { default: Database } = await import(\"better-sqlite3\");\r\n const sqlite = new Database(sqliteFilenameFromUrl(url));\r\n sqlite.pragma(\"busy_timeout = 10000\");\r\n sqlite.pragma(\"journal_mode = WAL\");\r\n if (trackSingletonResources) _sqlite = sqlite;\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const stmt = sqlite.prepare(rawSql);\r\n if (stmt.reader) {\r\n return {\r\n rows: stmt.all(...args),\r\n rowsAffected: 0,\r\n };\r\n }\r\n const result = stmt.run(...args);\r\n return {\r\n rows: [],\r\n rowsAffected: result.changes ?? 0,\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute, \"BEGIN IMMEDIATE\"),\r\n async close() {\r\n sqlite.close();\r\n },\r\n };\r\n }\r\n\r\n const { createClient } = await import(\"@libsql/client/web\");\r\n const client = createClient({\r\n url,\r\n authToken: config.authToken,\r\n });\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n if (typeof sql === \"string\") {\r\n const r = await client.execute(sql);\r\n return {\r\n rows: r.rows as any[],\r\n rowsAffected: r.rowsAffected,\r\n };\r\n }\r\n const r = await client.execute({\r\n sql: sql.sql,\r\n args: sql.args as any[],\r\n });\r\n return {\r\n rows: r.rows as any[],\r\n rowsAffected: r.rowsAffected,\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute),\r\n async close() {\r\n client.close();\r\n },\r\n };\r\n}\r\n\r\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\r\n return createDbExecInternal(config, false);\r\n}\r\n\r\nasync function initClient(): Promise<void> {\r\n if (_exec) return;\r\n\r\n const dialect = getDialect();\r\n const url = getDatabaseUrl(\"file:./data/app.db\");\r\n _exec = await createDbExecInternal(\r\n {\r\n url,\r\n authToken: getDatabaseAuthToken(),\r\n d1Binding: dialect === \"d1\" ? getCloudflareD1Binding() : undefined,\r\n },\r\n true,\r\n );\r\n}\r\n\r\n/**\r\n * Get the singleton database client. Returns a `DbExec` whose first\r\n * `execute()` call lazily initializes the underlying driver.\r\n */\r\nexport function getDbExec(): DbExec {\r\n if (_exec) return _exec;\r\n\r\n // Sanitize args: replace undefined with null (libsql rejects undefined)\r\n function sanitize(\r\n sql: string | { sql: string; args?: unknown[] },\r\n ): string | { sql: string; args?: unknown[] } {\r\n if (typeof sql === \"object\" && sql.args) {\r\n return { ...sql, args: sql.args.map((a) => a ?? null) };\r\n }\r\n return sql;\r\n }\r\n\r\n // Return a proxy that lazy-inits on first call\r\n const proxy: DbExec = {\r\n async execute(sql) {\r\n if (!_initPromise) _initPromise = initClient();\r\n try {\r\n await _initPromise;\r\n } catch (err) {\r\n // A failed/hung init must not poison the singleton for the life of\r\n // the process — drop it so the next call retries a fresh connection\r\n // instead of re-awaiting a permanently rejected/pending promise.\r\n _initPromise = undefined;\r\n _exec = undefined;\r\n throw err;\r\n }\r\n // After init, swap to a sanitizing wrapper around the real client\r\n const wrapper: DbExec = {\r\n execute: (s) => _exec!.execute(sanitize(s)),\r\n transaction: _exec!.transaction\r\n ? (fn) =>\r\n _exec!.transaction!((tx) =>\r\n fn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n )\r\n : undefined,\r\n };\r\n Object.assign(proxy, wrapper);\r\n return _exec!.execute(sanitize(sql));\r\n },\r\n async transaction(fn) {\r\n if (!_initPromise) _initPromise = initClient();\r\n try {\r\n await _initPromise;\r\n } catch (err) {\r\n _initPromise = undefined;\r\n _exec = undefined;\r\n throw err;\r\n }\r\n const wrapper: DbExec = {\r\n execute: (s) => _exec!.execute(sanitize(s)),\r\n transaction: _exec!.transaction\r\n ? (innerFn) =>\r\n _exec!.transaction!((tx) =>\r\n innerFn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n )\r\n : undefined,\r\n };\r\n Object.assign(proxy, wrapper);\r\n if (_exec!.transaction) {\r\n return _exec!.transaction((tx) =>\r\n fn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n );\r\n }\r\n return explicitTransaction(wrapper.execute)(fn);\r\n },\r\n };\r\n return proxy;\r\n}\r\n\r\n/** Close the database connection (for scripts that need cleanup). */\r\nexport async function closeDbExec(): Promise<void> {\r\n if (_pgPool) {\r\n await _pgPool.end();\r\n _pgPool = undefined;\r\n }\r\n if (_neonPool) {\r\n await _neonPool.end();\r\n _neonPool = undefined;\r\n }\r\n if (_sqlite) {\r\n _sqlite.close();\r\n _sqlite = undefined;\r\n }\r\n await closePgliteClients();\r\n _exec = undefined;\r\n _initPromise = undefined;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Central database client abstraction.\r\n *\r\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\r\n * and returns a unified `DbExec` interface that all core stores use.\r\n *\r\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\r\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\r\n * Cloudflare Workers, edge) without failing on missing native deps.\r\n */\r\nimport path from \"path\";\r\n\r\nimport { isCloudflareRuntime } from \"../shared/runtime.js\";\r\n\r\nconst recyclingPostgresPools = new WeakSet<object>();\r\nconst loggedNeonPools = new WeakSet<object>();\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\r\n\r\nexport interface DbExec {\r\n execute(\r\n sql: string | { sql: string; args?: unknown[] },\r\n ): Promise<{ rows: any[]; rowsAffected: number }>;\r\n transaction?<T>(fn: (tx: DbExec) => Promise<T>): Promise<T>;\r\n /**\r\n * Release the underlying connection/pool held by this exec.\r\n * Only non-singleton execs created via `createDbExec()` (e.g. the migration\r\n * direct-endpoint exec) should call this. The global singleton exec (`getDbExec`)\r\n * is managed by `closeDbExec()` instead.\r\n */\r\n close?(): Promise<void>;\r\n}\r\n\r\nexport interface DbExecConfig {\r\n url?: string;\r\n authToken?: string;\r\n d1Binding?: any;\r\n}\r\n\r\n/** Read the request-scoped Cloudflare binding without requiring every\r\n * consuming app's TypeScript program to include core's ambient Worker globals. */\r\nexport function getCloudflareD1Binding(): unknown {\r\n return (\r\n globalThis as typeof globalThis & {\r\n __cf_env?: { DB?: unknown };\r\n }\r\n ).__cf_env?.DB;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Per-app DATABASE_URL resolution\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Resolve the database URL for the current app.\r\n *\r\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\r\n * then falls back to `DATABASE_URL`, then Netlify's managed database env. This\r\n * allows multiple apps to run in the same process group (e.g. eager repo dev or\r\n * builder.io) with separate databases while still using the persistent Netlify\r\n * runtime database when `DATABASE_URL` was only exported for the build command.\r\n *\r\n * Set `APP_NAME=mail` in the child process env and\r\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\r\n */\r\nexport function getDatabaseUrl(fallback = \"\"): string {\r\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\r\n if (appName) {\r\n const prefixed = process.env[`${appName}_DATABASE_URL`];\r\n if (prefixed) return prefixed;\r\n }\r\n return (\r\n process.env.DATABASE_URL || process.env.NETLIFY_DATABASE_URL || fallback\r\n );\r\n}\r\n\r\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\r\nexport function getDatabaseAuthToken(): string | undefined {\r\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\r\n if (appName) {\r\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\r\n if (prefixed) return prefixed;\r\n }\r\n return (\r\n process.env.DATABASE_AUTH_TOKEN || process.env.NETLIFY_DATABASE_AUTH_TOKEN\r\n );\r\n}\r\n\r\nfunction getAppEnvPrefix(): string | undefined {\r\n return process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\") || undefined;\r\n}\r\n\r\n/**\r\n * Database URL to use for migrations — identical to DATABASE_URL but with the\r\n * Neon connection-pooler suffix stripped. Neon's PgBouncer runs in transaction\r\n * mode, which resets session-level ownership after each statement and causes\r\n * `ALTER TABLE … ADD COLUMN` to fail with \"must be owner of table <x>\" even\r\n * when the connecting role owns it. The direct endpoint bypasses PgBouncer so\r\n * DDL honours the role's actual ownership.\r\n *\r\n * Non-Neon URLs and already-direct Neon URLs are returned unchanged.\r\n */\r\nexport function getMigrationDatabaseUrl(): string {\r\n const appName = getAppEnvPrefix();\r\n const appUnpooled = appName\r\n ? process.env[`${appName}_DATABASE_URL_UNPOOLED`]\r\n : undefined;\r\n const url =\r\n appUnpooled ||\r\n process.env.NETLIFY_DATABASE_URL_UNPOOLED ||\r\n process.env.DATABASE_URL_UNPOOLED ||\r\n getDatabaseUrl();\r\n // Neon pooler hostname: ep-<id>-pooler.<region>.<cloud>.neon.tech\r\n // Direct hostname: ep-<id>.<region>.<cloud>.neon.tech\r\n // The region between `-pooler.` and `.neon.tech` can contain multiple\r\n // dot-separated labels (e.g. `c-7.us-east-1.aws`), so the matched segment\r\n // must allow dots — `[a-z0-9.-]+` — not just a single label. Anchoring on the\r\n // stable `.neon.tech` suffix keeps this from touching non-Neon hosts.\r\n return url.replace(/-pooler(\\.[a-z0-9.-]+\\.neon\\.tech)/, \"$1\");\r\n}\r\n\r\nexport function isLocalSqliteUrl(url: string): boolean {\r\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\r\n}\r\n\r\nexport function isPgliteUrl(url: string): boolean {\r\n return url.toLowerCase().startsWith(\"pglite:\");\r\n}\r\n\r\nexport function pgliteDataDirFromUrl(url: string): string {\r\n const raw = url.slice(\"pglite:\".length);\r\n const dataDir = raw.startsWith(\"//\") ? raw.slice(2) : raw;\r\n if (!dataDir || dataDir === \"/\") return \"./data/pglite\";\r\n if (\r\n dataDir === \"memory\" ||\r\n dataDir === \"/memory\" ||\r\n dataDir === \":memory:\" ||\r\n dataDir === \"/:memory:\" ||\r\n dataDir === \"memory://\"\r\n ) {\r\n return \"memory://\";\r\n }\r\n return dataDir;\r\n}\r\n\r\nexport function pgliteRuntimeDataDir(dataDir: string): string {\r\n if (dataDir === \"memory://\") return dataDir;\r\n if (!isServerlessRuntime() || path.isAbsolute(dataDir)) return dataDir;\r\n\r\n const safeParts = dataDir\r\n .split(/[\\\\/]+/)\r\n .filter((part) => part && part !== \".\" && part !== \"..\");\r\n const safeRelative =\r\n safeParts.length > 0\r\n ? path.join(...safeParts)\r\n : path.join(\"data\", \"pglite\");\r\n return path.join(\"/tmp\", safeRelative);\r\n}\r\n\r\nasync function preparePgliteDataDir(dataDir: string): Promise<string> {\r\n const runtimeDataDir = pgliteRuntimeDataDir(dataDir);\r\n if (runtimeDataDir === \"memory://\") return runtimeDataDir;\r\n\r\n try {\r\n const fs = await import(\"fs\");\r\n fs.mkdirSync(runtimeDataDir, { recursive: true });\r\n } catch {\r\n // Edge runtimes may not expose fs. PGlite will surface any real open error.\r\n }\r\n return runtimeDataDir;\r\n}\r\n\r\nasync function importOptionalModule(specifier: string): Promise<any> {\r\n return import(/* @vite-ignore */ specifier);\r\n}\r\n\r\nfunction isMissingPackageError(err: unknown, packageName: string): boolean {\r\n const anyErr = err as any;\r\n const message = String(anyErr?.message ?? anyErr ?? \"\");\r\n return (\r\n (anyErr?.code === \"ERR_MODULE_NOT_FOUND\" &&\r\n message.includes(packageName)) ||\r\n message.includes(`Cannot find package '${packageName}'`) ||\r\n message.includes(`Cannot find module '${packageName}'`)\r\n );\r\n}\r\n\r\nexport async function loadPglitePackage(): Promise<{ PGlite: any }> {\r\n const packageName = \"@electric-sql/pglite\";\r\n try {\r\n return (await importOptionalModule(packageName)) as { PGlite: any };\r\n } catch (err) {\r\n if (isMissingPackageError(err, packageName)) {\r\n throw new Error(\r\n \"PGlite database support requires the optional @electric-sql/pglite package. \" +\r\n \"Install it with `pnpm add @electric-sql/pglite@^0.5.3`, then set \" +\r\n \"`DATABASE_URL=pglite:./data/pglite`.\",\r\n );\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\nexport async function loadPgliteDrizzle(): Promise<{\r\n PGlite: any;\r\n drizzle: any;\r\n}> {\r\n const drizzlePackage = \"drizzle-orm/pglite\";\r\n const { PGlite } = await loadPglitePackage();\r\n const drizzleMod = await importOptionalModule(drizzlePackage);\r\n return {\r\n PGlite,\r\n drizzle: drizzleMod.drizzle,\r\n };\r\n}\r\n\r\nconst _pgliteClients = new Map<string, Promise<any>>();\r\n\r\nexport async function getPgliteClient(url: string): Promise<any> {\r\n const dataDir = await preparePgliteDataDir(pgliteDataDirFromUrl(url));\r\n let ready = _pgliteClients.get(dataDir);\r\n if (!ready) {\r\n ready = loadPglitePackage().then(({ PGlite }) => PGlite.create(dataDir));\r\n _pgliteClients.set(dataDir, ready);\r\n }\r\n return ready;\r\n}\r\n\r\nexport async function closePgliteClients(): Promise<void> {\r\n const clients = await Promise.allSettled(_pgliteClients.values());\r\n _pgliteClients.clear();\r\n for (const result of clients) {\r\n if (result.status === \"fulfilled\") {\r\n await result.value.close().catch(() => {});\r\n }\r\n }\r\n}\r\n\r\nexport async function closePgliteClient(url: string): Promise<void> {\r\n const dataDir = pgliteRuntimeDataDir(pgliteDataDirFromUrl(url));\r\n const ready = _pgliteClients.get(dataDir);\r\n _pgliteClients.delete(dataDir);\r\n if (!ready) return;\r\n\r\n const result = await Promise.resolve(ready).then(\r\n (client) => ({ status: \"fulfilled\" as const, client }),\r\n () => ({ status: \"rejected\" as const }),\r\n );\r\n if (result.status === \"fulfilled\") {\r\n await result.client.close().catch(() => {});\r\n }\r\n}\r\n\r\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\r\n if (!url.startsWith(\"file:\")) return url;\r\n\r\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\r\n // working directory is read-only. Detect this and redirect local SQLite to\r\n // /tmp which IS writable (ephemeral per invocation, but the server stays\r\n // alive for the request). Shares the canonical isServerlessRuntime() check.\r\n const isServerless = isServerlessRuntime();\r\n try {\r\n const fs = await import(\"fs\");\r\n if (isServerless && url === \"file:./data/app.db\") {\r\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\r\n return \"file:///tmp/data/app.db\";\r\n }\r\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\r\n } catch {\r\n // Edge runtime — no filesystem.\r\n }\r\n return url;\r\n}\r\n\r\nexport function sqliteFilenameFromUrl(url: string): string {\r\n if (url.startsWith(\"file://\")) {\r\n return decodeURIComponent(new URL(url).pathname);\r\n }\r\n if (url.startsWith(\"file:\")) {\r\n return url.slice(\"file:\".length) || \":memory:\";\r\n }\r\n return url || \"./data/app.db\";\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Safe JSON column parsing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Parse a JSON-serialized column value defensively. A malformed row — from a\r\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\r\n * must not break an entire list endpoint. Callers supply a fallback for the\r\n * malformed path; null/undefined values also fall back.\r\n */\r\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\r\n if (value == null) return fallback;\r\n try {\r\n return JSON.parse(String(value)) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// SQLite retry helper\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Retry an async operation when it fails with SQLITE_BUSY.\r\n * Used during WAL initialization and migrations where a stale WAL from a\r\n * previous crash or HMR restart can briefly lock the database.\r\n */\r\nexport async function retrySqliteBusy<T>(\r\n fn: () => Promise<T>,\r\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\r\n): Promise<T> {\r\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\r\n let last: unknown;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (e: any) {\r\n last = e;\r\n const msg = String(e?.message || e);\r\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\r\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n if (rethrow) throw last;\r\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\r\n}\r\n\r\n/**\r\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\r\n * to a Postgres pg_catalog race.\r\n *\r\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\r\n * `pg_class` catalog insert. When multiple processes boot concurrently and\r\n * issue the same CREATE, both can pass the existence check and one fails\r\n * with code 23505 on `pg_type_typname_nsp_index`, 42710 from `TypeCreate`,\r\n * or similar. The table does end up created by the winner, so rerunning the\r\n * same `IF NOT EXISTS` statement is a safe no-op.\r\n */\r\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (e: any) {\r\n if (!isPgCatalogRace(e)) throw e;\r\n return await fn();\r\n }\r\n}\r\n\r\nfunction isPgCatalogRace(e: any): boolean {\r\n const msg = String(e?.message ?? \"\");\r\n if (e?.code === \"42P07\") return true;\r\n if (e?.code === \"42710\") {\r\n const routine = String(e?.routine ?? \"\");\r\n return routine === \"TypeCreate\" || /type .* already exists/i.test(msg);\r\n }\r\n if (e?.code !== \"23505\") return false;\r\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\r\n const detail = String(e?.detail ?? \"\");\r\n return (\r\n constraint.startsWith(\"pg_type\") ||\r\n constraint.startsWith(\"pg_class\") ||\r\n detail.includes(\"pg_type\") ||\r\n detail.includes(\"pg_class\") ||\r\n /relation .* already exists/i.test(msg)\r\n );\r\n}\r\n\r\n/**\r\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\r\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\r\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\r\n * surface a clean \"already exists\" error instead of the raw SQL text.\r\n */\r\nexport function isUniqueViolation(e: any): boolean {\r\n if (e?.code === \"23505\") return true;\r\n const code = String(e?.code ?? \"\");\r\n if (\r\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\r\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\r\n ) {\r\n return true;\r\n }\r\n const msg = String(e?.message ?? \"\").toLowerCase();\r\n return (\r\n msg.includes(\"unique constraint\") ||\r\n msg.includes(\"primary key constraint\") ||\r\n msg.includes(\"duplicate key\")\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Dialect detection\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _dialect: Dialect | undefined;\r\n\r\nexport function getDialect(): Dialect {\r\n if (_dialect !== undefined) return _dialect;\r\n\r\n // DATABASE_URL takes priority over D1 when set.\r\n const url = getDatabaseUrl();\r\n if (\r\n url.startsWith(\"postgres://\") ||\r\n url.startsWith(\"postgresql://\") ||\r\n isPgliteUrl(url)\r\n ) {\r\n _dialect = \"postgres\";\r\n return _dialect;\r\n }\r\n if (url && !url.startsWith(\"file:\")) {\r\n // Remote libsql (e.g. Turso)\r\n _dialect = \"sqlite\";\r\n return _dialect;\r\n }\r\n\r\n const d1 = getCloudflareD1Binding();\r\n if (d1) {\r\n _dialect = \"d1\";\r\n return _dialect;\r\n }\r\n\r\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\r\n // available at import time. If we cache \"sqlite\" here, D1 will never be\r\n // detected once the bindings are set in the fetch handler.\r\n return \"sqlite\";\r\n}\r\n\r\nexport function isPostgres(): boolean {\r\n return getDialect() === \"postgres\";\r\n}\r\n\r\nfunction dialectForConfig(config: DbExecConfig): Dialect {\r\n const url = config.url ?? \"\";\r\n if (\r\n url.startsWith(\"postgres://\") ||\r\n url.startsWith(\"postgresql://\") ||\r\n isPgliteUrl(url)\r\n ) {\r\n return \"postgres\";\r\n }\r\n if (url && !url.startsWith(\"file:\")) {\r\n return \"sqlite\";\r\n }\r\n if (config.d1Binding) {\r\n return \"d1\";\r\n }\r\n return \"sqlite\";\r\n}\r\n\r\n/**\r\n * Returns true when the database is a local-only SQLite file (or unset, which\r\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\r\n * (Turso), and D1 — any backend that could be shared across developers.\r\n *\r\n * Used to gate local@localhost mode: that mode uses a single shared virtual\r\n * user with no per-machine scoping, so on any shared database two developers\r\n * would read and write each other's settings, oauth tokens, and app state.\r\n */\r\nexport function isLocalDatabase(): boolean {\r\n if (isPgliteUrl(getDatabaseUrl())) return true;\r\n if (getDialect() !== \"sqlite\") return false;\r\n const url = getDatabaseUrl();\r\n return url === \"\" || url.startsWith(\"file:\");\r\n}\r\n\r\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\r\nexport function intType(): string {\r\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\r\n}\r\n\r\n// `widenIntColumnsToBigInt` lives in `./widen-columns.js` (it depends only on\r\n// `isPostgres`/`getDbExec` from here) so stores can import it without every\r\n// `vi.mock(\"./client.js\")` test having to stub the export.\r\n\r\n// ---------------------------------------------------------------------------\r\n// Parameter conversion: ? -> $1, $2, $3\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function sqliteToPostgresParams(sql: string): string {\r\n let out = \"\";\r\n let param = 0;\r\n let i = 0;\r\n let mode:\r\n | \"normal\"\r\n | \"single\"\r\n | \"double\"\r\n | \"line-comment\"\r\n | \"block-comment\"\r\n | \"dollar\" = \"normal\";\r\n let dollarTag = \"\";\r\n\r\n while (i < sql.length) {\r\n const ch = sql[i];\r\n const next = sql[i + 1];\r\n\r\n if (mode === \"line-comment\") {\r\n out += ch;\r\n i++;\r\n if (ch === \"\\n\") mode = \"normal\";\r\n continue;\r\n }\r\n\r\n if (mode === \"block-comment\") {\r\n out += ch;\r\n if (ch === \"*\" && next === \"/\") {\r\n out += next;\r\n i += 2;\r\n mode = \"normal\";\r\n continue;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"single\") {\r\n out += ch;\r\n if (ch === \"'\" && next === \"'\") {\r\n out += next;\r\n i += 2;\r\n continue;\r\n }\r\n if (ch === \"'\") mode = \"normal\";\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"double\") {\r\n out += ch;\r\n if (ch === '\"' && next === '\"') {\r\n out += next;\r\n i += 2;\r\n continue;\r\n }\r\n if (ch === '\"') mode = \"normal\";\r\n i++;\r\n continue;\r\n }\r\n\r\n if (mode === \"dollar\") {\r\n if (dollarTag && sql.startsWith(dollarTag, i)) {\r\n out += dollarTag;\r\n i += dollarTag.length;\r\n mode = \"normal\";\r\n dollarTag = \"\";\r\n continue;\r\n }\r\n out += ch;\r\n i++;\r\n continue;\r\n }\r\n\r\n if (ch === \"-\" && next === \"-\") {\r\n out += ch + next;\r\n i += 2;\r\n mode = \"line-comment\";\r\n continue;\r\n }\r\n if (ch === \"/\" && next === \"*\") {\r\n out += ch + next;\r\n i += 2;\r\n mode = \"block-comment\";\r\n continue;\r\n }\r\n if (ch === \"'\") {\r\n out += ch;\r\n i++;\r\n mode = \"single\";\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n out += ch;\r\n i++;\r\n mode = \"double\";\r\n continue;\r\n }\r\n if (ch === \"$\") {\r\n const match = /^\\$[A-Za-z_][A-Za-z0-9_]*\\$|^\\$\\$/.exec(sql.slice(i));\r\n if (match) {\r\n dollarTag = match[0];\r\n out += dollarTag;\r\n i += dollarTag.length;\r\n mode = \"dollar\";\r\n continue;\r\n }\r\n }\r\n if (ch === \"?\") {\r\n out += `$${++param}`;\r\n i++;\r\n continue;\r\n }\r\n\r\n out += ch;\r\n i++;\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction sqlAndArgs(sql: string | { sql: string; args?: unknown[] }): {\r\n rawSql: string;\r\n args: unknown[];\r\n} {\r\n return typeof sql === \"string\"\r\n ? { rawSql: sql, args: [] }\r\n : { rawSql: sql.sql, args: sql.args || [] };\r\n}\r\n\r\nfunction explicitTransaction(\r\n execute: DbExec[\"execute\"],\r\n begin = \"BEGIN\",\r\n): NonNullable<DbExec[\"transaction\"]> {\r\n return async (fn) => {\r\n await execute(begin);\r\n try {\r\n const result = await fn({ execute });\r\n await execute(\"COMMIT\");\r\n return result;\r\n } catch (err) {\r\n await execute(\"ROLLBACK\").catch(() => {});\r\n throw err;\r\n }\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Connection error retry (ECONNRESET, etc.)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Error codes that indicate a dead/stale connection we can safely retry. */\r\nconst CONNECTION_ERROR_CODES = new Set([\r\n \"ECONNRESET\",\r\n \"ETIMEDOUT\",\r\n \"EPIPE\",\r\n \"ENOTFOUND\",\r\n \"CONNECT_TIMEOUT\",\r\n \"CONNECTION_ENDED\",\r\n \"CONNECTION_DESTROYED\",\r\n \"CONNECTION_CLOSED\",\r\n]);\r\n\r\nexport function isConnectionError(err: any): boolean {\r\n if (!err) return false;\r\n const code = err.code || err.cause?.code;\r\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\r\n // Neon serverless WS driver: errors from the underlying undici WebSocket\r\n // closing mid-query come through as TypeError or ErrorEvent without a code.\r\n const name = err.name || err.cause?.name || \"\";\r\n if (name === \"ErrorEvent\") return true;\r\n const stack = String(err.stack || err.cause?.stack || \"\");\r\n if (\r\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\r\n stack,\r\n )\r\n ) {\r\n return true;\r\n }\r\n const msg = String(err.message || err.cause?.message || \"\");\r\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\r\n msg,\r\n );\r\n}\r\n\r\nexport async function retryOnConnectionError<T>(\r\n fn: () => Promise<T>,\r\n maxAttempts = 3,\r\n): Promise<T> {\r\n let last: unknown;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (e) {\r\n last = e;\r\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\r\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\r\n }\r\n }\r\n throw last;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Per-op timeout — converts a silent serverless hang into a retryable error\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Max wall time for a single DB op (init or query) before we treat it as a\r\n * dead connection. A frozen→thawed serverless instance can leave the Neon\r\n * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither\r\n * settles nor errors, so retryOnConnectionError() — which only retries thrown\r\n * errors — can't help and the request hangs until the platform kills the\r\n * function (~30s on Netlify). For authenticated requests that run a session\r\n * lookup on every navigation this surfaces as \"the site won't load\". Bounding\r\n * each op well under the platform function limit turns the silent hang into a\r\n * CONNECT_TIMEOUT that the existing retry and reject-reset paths already\r\n * handle. Override with DB_OP_TIMEOUT_MS.\r\n */\r\nexport function dbOpTimeoutMs(): number {\r\n const raw = Number(process.env.DB_OP_TIMEOUT_MS);\r\n if (Number.isFinite(raw) && raw > 0) return raw;\r\n return isServerlessRuntime() ? 8_000 : 30_000;\r\n}\r\n\r\n/**\r\n * Timeout error tagged with a recognized connection-error code so\r\n * isConnectionError() / retryOnConnectionError() treat a hung op as a\r\n * retryable dead connection, and upstream reject-reset guards (e.g. the\r\n * cached session-table init promise) clear their poisoned state.\r\n */\r\nclass DbTimeoutError extends Error {\r\n code = \"CONNECT_TIMEOUT\";\r\n constructor(op: string, ms: number) {\r\n super(`DB ${op} timed out after ${ms}ms (connection terminated)`);\r\n this.name = \"DbTimeoutError\";\r\n }\r\n}\r\n\r\n/**\r\n * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable\r\n * query or pooled client should pass onTimeout so the losing operation does\r\n * not keep occupying a scarce connection slot after the request has recovered.\r\n */\r\nexport async function withDbTimeout<T>(\r\n op: string,\r\n run: () => Promise<T>,\r\n ms = dbOpTimeoutMs(),\r\n onTimeout?: () => void | Promise<void>,\r\n): Promise<T> {\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n let settled = false;\r\n\r\n const runCleanup = async () => {\r\n if (!onTimeout) return;\r\n try {\r\n await onTimeout();\r\n } catch (err) {\r\n console.warn(\r\n `[db] timeout cleanup for ${op} failed:`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n }\r\n };\r\n\r\n return await new Promise<T>((resolve, reject) => {\r\n const finish = (\r\n complete: (value: T | PromiseLike<T>) => void,\r\n value: T | PromiseLike<T>,\r\n ) => {\r\n if (settled) return;\r\n settled = true;\r\n if (timer) clearTimeout(timer);\r\n complete(value);\r\n };\r\n const fail = (err: unknown) => {\r\n if (settled) return;\r\n settled = true;\r\n if (timer) clearTimeout(timer);\r\n reject(err);\r\n };\r\n\r\n timer = setTimeout(() => {\r\n if (settled) return;\r\n settled = true;\r\n void (async () => {\r\n await runCleanup();\r\n reject(new DbTimeoutError(op, ms));\r\n })();\r\n }, ms);\r\n\r\n let promise: Promise<T>;\r\n try {\r\n promise = run();\r\n } catch (err) {\r\n fail(err);\r\n return;\r\n }\r\n promise.then((value) => finish(resolve, value), fail);\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Serverless-aware Postgres pool options\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\r\n * Cloudflare Pages Functions) where every concurrent request can spin up its\r\n * own frozen process. Connections cannot be shared across instances, so each\r\n * instance must keep its pool tiny — otherwise dozens of warm instances each\r\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\r\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\r\n * connections reached\".\r\n */\r\nexport function isServerlessRuntime(): boolean {\r\n return (\r\n !!process.env.NETLIFY ||\r\n !!process.env.VERCEL ||\r\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\r\n !!process.env.LAMBDA_TASK_ROOT ||\r\n !!process.env.CF_PAGES\r\n );\r\n}\r\n\r\n/**\r\n * postgres.js pool options tuned per runtime. A serverless instance handles\r\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\r\n * so a single slow query or open transaction can't serialize every other\r\n * query in the same request. Total connections stay bounded to ≈ 2×\r\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\r\n * serverless so a thawed-but-idle instance releases its connections quickly.\r\n * Long-lived Node servers keep the normal pool for throughput.\r\n */\r\nexport function pgPoolOptions(url: string): Record<string, unknown> {\r\n const serverless = isServerlessRuntime();\r\n return {\r\n onnotice: () => {},\r\n max: serverless ? 2 : 10,\r\n idle_timeout: serverless ? 20 : 240,\r\n max_lifetime: 60 * 30,\r\n connect_timeout: 10,\r\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\r\n // Only disable for Supabase URLs to avoid degrading other deployments.\r\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\r\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\r\n * and keeps total connections bounded while still letting a second query\r\n * proceed when one connection is busy.\r\n */\r\nexport function neonPoolMax(): number {\r\n if (!isServerlessRuntime()) return 10;\r\n // The durable background-function worker is a SINGLE process per run (unlike\r\n // the many warm request-instances the foreground serverless has), so it can\r\n // safely hold a larger pool without risking Neon's connection cap. The agent's\r\n // pre-send setup fires ~6 concurrent DB reads in parallel; with only 2\r\n // connections that burst exhausts the pool and a single stalled connection\r\n // freezes the worker before it can claim — observed on analytics' heavier\r\n // action surface, where the worker froze right after `model_done` and never\r\n // recorded `env_config`/`presend`, while the foreground (10-connection pool)\r\n // ran the identical code in ~2s. Give the bg worker enough connections for the\r\n // burst; keep the foreground serverless pool tiny to avoid \"Max client\r\n // connections reached\" across many warm instances.\r\n if (isBackgroundFunctionPoolContext()) return 8;\r\n return 2;\r\n}\r\n\r\n/**\r\n * Inline mirror of `isInBackgroundFunctionRuntime()`\r\n * (agent/durable-background.ts), replicated here to avoid a `db` → `agent`\r\n * import cycle. Keep the signals in sync with that function.\r\n */\r\nexport function isBackgroundFunctionPoolContext(): boolean {\r\n if (\r\n (globalThis as Record<string, unknown>)\r\n .__AGENT_NATIVE_BACKGROUND_RUNTIME__ === true\r\n ) {\r\n return true;\r\n }\r\n // NOTE: we deliberately do NOT trust `__AGENT_NATIVE_BACKGROUND_RUNTIME_EXPECTED__`\r\n // here. That flag is set from the dispatch MARKER (which URL the foreground\r\n // targeted), not from proof the request actually LANDED on a background\r\n // function. A worker dispatched toward `-background` but routed onto the ~60s\r\n // synchronous function would otherwise take the 8-connection background pool\r\n // while running as one of MANY warm sync-function instances — multiplying\r\n // Neon connections and exhausting the pooled endpoint (\"connection\r\n // terminated\" / statement timeouts / failed heartbeat writes → stale runs).\r\n // The genuine `-background` function sets `__AGENT_NATIVE_BACKGROUND_RUNTIME__`\r\n // as its first cold-start statement, so a real background worker still gets\r\n // the larger pool via the check above. Mirrors the same proof-of-landing\r\n // tightening applied to `shouldUseBackgroundFunctionTimeoutForWorker`.\r\n const lambdaName = process.env.AWS_LAMBDA_FUNCTION_NAME;\r\n if (\r\n typeof lambdaName === \"string\" &&\r\n lambdaName.toLowerCase().endsWith(\"-background\")\r\n ) {\r\n return true;\r\n }\r\n const forced = process.env.AGENT_CHAT_FORCE_BACKGROUND_RUNTIME;\r\n if (forced != null) {\r\n const v = forced.trim().toLowerCase();\r\n return v === \"1\" || v === \"true\" || v === \"yes\" || v === \"on\";\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Render any rejection reason as a readable message. The Neon serverless\r\n * driver surfaces WebSocket failures as raw DOM-style ErrorEvent objects (not\r\n * Error instances), which stringify uselessly as \"[object ErrorEvent]\" — pull\r\n * the message off the event (or its nested `.error`) instead so logs carry\r\n * actual context.\r\n */\r\nexport function describeDbError(err: unknown): string {\r\n if (err instanceof Error) return err.message;\r\n if (err && typeof err === \"object\") {\r\n const evt = err as {\r\n message?: unknown;\r\n error?: { message?: unknown };\r\n type?: unknown;\r\n };\r\n const msg = evt.message ?? evt.error?.message;\r\n if (typeof msg === \"string\" && msg) return msg;\r\n if (evt.type === \"error\") {\r\n return \"WebSocket ErrorEvent (connection failed; no message attached)\";\r\n }\r\n }\r\n return String(err);\r\n}\r\n\r\nexport function attachNeonPoolErrorLogger(\r\n pool: unknown,\r\n label = \"db/neon\",\r\n): void {\r\n if (!pool || typeof pool !== \"object\") return;\r\n if (loggedNeonPools.has(pool)) return;\r\n const withEvents = pool as {\r\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\r\n };\r\n if (typeof withEvents.on !== \"function\") return;\r\n\r\n loggedNeonPools.add(pool);\r\n withEvents.on(\"error\", (err: unknown) => {\r\n console.warn(\r\n `[${label}] pool error (will reconnect on next query):`,\r\n describeDbError(err),\r\n );\r\n });\r\n\r\n // On Cloudflare Workers, DO NOT attach the per-client 'connect' listener\r\n // below. @neondatabase/serverless disables its poolQueryViaFetch HTTP path\r\n // the moment ANY non-'error' listener is registered on the pool\r\n // (hasFetchUnsupportedListeners) — silently reverting every plain query to\r\n // a WebSocket checkout. Combined with the single-use clients workerd\r\n // requires, that churns a new WebSocket per query until the isolate hits\r\n // its connection cap and pool.connect() hangs forever. The listener's\r\n // purpose (preventing Node's uncaught-'error' process crash) doesn't apply\r\n // on workerd, where an unhandled emit can't kill a process.\r\n if (isCloudflareRuntime()) return;\r\n\r\n // Attach a persistent 'error' listener to EVERY client for its whole lifetime.\r\n //\r\n // @neondatabase/serverless mirrors pg-pool, which only keeps its own idle\r\n // error listener on a client while that client is idle — it REMOVES the\r\n // listener the moment the client is checked out. So when a checked-out\r\n // client's WebSocket drops mid-flight (Lambda freeze/thaw, Neon \"terminating\r\n // connection due to administrator command\", an idle socket the pooler closed),\r\n // the client emits 'error' with no listener. Node turns an unhandled 'error'\r\n // EventEmitter event into an uncaught exception, which crashes the whole\r\n // serverless function. This was by far the single highest-volume production\r\n // crash (Sentry \"Unhandled error. ()\", mechanism auto.node.onuncaughtexception,\r\n // culprit neondatabase__serverless). pg routes the failure to the in-flight\r\n // query independently, so this listener only needs to keep the emit from going\r\n // unhandled — the dropped client is discarded and the next query reconnects.\r\n withEvents.on(\"connect\", (client: unknown) => {\r\n if (!client || typeof client !== \"object\") return;\r\n const clientEvents = client as {\r\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\r\n };\r\n if (typeof clientEvents.on !== \"function\") return;\r\n clientEvents.on(\"error\", (err: unknown) => {\r\n console.warn(\r\n `[${label}] client connection error (connection discarded, next query reconnects):`,\r\n describeDbError(err),\r\n );\r\n });\r\n });\r\n}\r\n\r\nfunction disposePostgresPoolEventually(\r\n pool: { end: () => Promise<unknown> },\r\n label: string,\r\n): void {\r\n if (!pool || typeof pool !== \"object\") return;\r\n if (recyclingPostgresPools.has(pool)) return;\r\n recyclingPostgresPools.add(pool);\r\n void pool.end().catch((err: unknown) => {\r\n console.warn(\r\n `[db/postgres] ${label} cleanup failed:`,\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Singleton client — lazy-initialized on first execute() call\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _exec: DbExec | undefined;\r\nlet _pgPool: any;\r\nlet _neonPool: any;\r\nlet _sqlite: any;\r\nlet _initPromise: Promise<void> | undefined;\r\n\r\nasync function executePglite(\r\n client: {\r\n query: (\r\n sql: string,\r\n args?: any[],\r\n ) => Promise<{ rows?: any[]; affectedRows?: number; rowCount?: number }>;\r\n },\r\n sql: Parameters<DbExec[\"execute\"]>[0],\r\n): ReturnType<DbExec[\"execute\"]> {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await client.query(pgSql, args as any[]);\r\n return {\r\n rows: Array.from(result.rows ?? []),\r\n rowsAffected: result.affectedRows ?? result.rowCount ?? 0,\r\n };\r\n}\r\n\r\nasync function createDbExecInternal(\r\n config: DbExecConfig = {},\r\n trackSingletonResources = false,\r\n): Promise<DbExec> {\r\n const dialect = dialectForConfig(config);\r\n\r\n // Cloudflare D1\r\n if (dialect === \"d1\") {\r\n const d1 = config.d1Binding;\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n if (typeof sql === \"string\") {\r\n const r = await d1.prepare(sql).all();\r\n return {\r\n rows: r.results || [],\r\n rowsAffected: r.meta?.changes ?? 0,\r\n };\r\n }\r\n const r = await d1\r\n .prepare(sql.sql)\r\n .bind(...(sql.args ?? []))\r\n .all();\r\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\r\n };\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute),\r\n };\r\n }\r\n\r\n let url = config.url || \"file:./data/app.db\";\r\n\r\n if (isPgliteUrl(url)) {\r\n const client = await getPgliteClient(url);\r\n return {\r\n execute: (sql) => executePglite(client, sql),\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n return client.transaction((tx: any) =>\r\n fn({\r\n execute: (sql) => executePglite(tx, sql),\r\n }),\r\n );\r\n },\r\n async close() {\r\n await closePgliteClient(url);\r\n },\r\n };\r\n }\r\n\r\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\r\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\r\n // On Workers, connections can't be shared across requests, so we create a\r\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\r\n // different request\" error.\r\n if (dialect === \"postgres\") {\r\n const { isNeonUrl } = await import(\"./create-get-db.js\");\r\n\r\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\r\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\r\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\r\n // Neon's pooler is cold — every request after an idle period times out\r\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\r\n // and keeps the same `pg`-compatible query(...) interface we need here.\r\n if (isNeonUrl(url)) {\r\n const { Pool, neonConfig } = await import(\"@neondatabase/serverless\");\r\n // In the durable background-function worker, route pool queries over Neon's\r\n // stateless HTTP transport instead of a long-lived WebSocket. A frozen/thawed\r\n // bg-fn instance can leave the pool's WebSocket connections half-dead, so\r\n // queries after the first burst stall on connect()/query() — observed: the\r\n // analytics worker stalls right after model resolution and never claims.\r\n // HTTP-per-query (poolQueryViaFetch) has no persistent socket to die; the\r\n // foreground keeps the WebSocket pool. See the bg-fn execute branch below.\r\n // Cloudflare Workers (workerd) additionally forbids reusing I/O objects\r\n // across requests — a pooled WebSocket created in request A and handed\r\n // to request B throws \"Cannot perform I/O on behalf of a different\r\n // request\" and hangs the worker — so workerd always takes the stateless\r\n // HTTP path too.\r\n const bgHttp =\r\n isBackgroundFunctionPoolContext() || isCloudflareRuntime();\r\n if (bgHttp) {\r\n (neonConfig as { poolQueryViaFetch?: boolean }).poolQueryViaFetch =\r\n true;\r\n }\r\n // On workerd, transactions still use pool.connect() WebSocket clients —\r\n // cap each client to a single use so a socket created in one request is\r\n // destroyed on release instead of being handed to a later request.\r\n const pool = new Pool({\r\n connectionString: url,\r\n max: neonPoolMax(),\r\n ...(isCloudflareRuntime() ? { maxUses: 1 } : {}),\r\n });\r\n attachNeonPoolErrorLogger(pool);\r\n if (trackSingletonResources) _neonPool = pool;\r\n async function queryNeonClient(\r\n client: any,\r\n sql: Parameters<DbExec[\"execute\"]>[0],\r\n ) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout(\r\n \"query\",\r\n () =>\r\n client.query(pgSql, args as any[]) as Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }>,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: result.rows,\r\n rowsAffected: result.rowCount ?? 0,\r\n };\r\n }\r\n return {\r\n async execute(sql) {\r\n if (bgHttp) {\r\n // HTTP-per-query path (poolQueryViaFetch=true): no pool.connect(), no\r\n // persistent socket to stall. queryNeonClient calls pool.query(),\r\n // which the driver routes over HTTP when poolQueryViaFetch is set.\r\n return retryOnConnectionError<{\r\n rows: unknown[];\r\n rowsAffected: number;\r\n }>(() =>\r\n withDbTimeout(\r\n \"http-query\",\r\n () => queryNeonClient(pool, sql),\r\n dbOpTimeoutMs(),\r\n ),\r\n );\r\n }\r\n const result = await retryOnConnectionError<{\r\n rows: unknown[];\r\n rowsAffected: number;\r\n }>(async () => {\r\n // Bound the pooled-connection ACQUIRE, not just the query below.\r\n // Neon's pooler can stall on `connect()` when cold or exhausted,\r\n // and that happens BEFORE `client.query`, so the query-level\r\n // timeout never fires — the request hangs until the platform kills\r\n // the function (~\"the site won't load\" for authenticated users,\r\n // whose every request runs a session/org lookup). Time the acquire\r\n // out into a retryable CONNECT_TIMEOUT that retryOnConnectionError\r\n // already handles, and release the connection if it resolves after\r\n // we've given up so the scarce pool slot isn't leaked.\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c) => {\r\n if (acquireTimedOut) c.release();\r\n return c;\r\n }),\r\n dbOpTimeoutMs(),\r\n () => {\r\n acquireTimedOut = true;\r\n },\r\n );\r\n let released = false;\r\n const releaseClient = (err?: Error | boolean) => {\r\n if (released) return;\r\n released = true;\r\n client.release(err);\r\n };\r\n\r\n try {\r\n const result = await queryNeonClient(client, sql);\r\n releaseClient();\r\n return result;\r\n } catch (err) {\r\n releaseClient(isConnectionError(err) ? true : undefined);\r\n throw err;\r\n }\r\n });\r\n return {\r\n rows: result.rows,\r\n rowsAffected: result.rowsAffected,\r\n };\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n return retryOnConnectionError(async () => {\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c) => {\r\n if (acquireTimedOut) c.release();\r\n return c;\r\n }),\r\n dbOpTimeoutMs(),\r\n () => {\r\n acquireTimedOut = true;\r\n },\r\n );\r\n let released = false;\r\n const releaseClient = (err?: Error | boolean) => {\r\n if (released) return;\r\n released = true;\r\n client.release(err);\r\n };\r\n const tx: DbExec = {\r\n execute: (sql) => queryNeonClient(client, sql),\r\n };\r\n try {\r\n await queryNeonClient(client, \"BEGIN\");\r\n const result = await fn(tx);\r\n await queryNeonClient(client, \"COMMIT\");\r\n releaseClient();\r\n return result;\r\n } catch (err) {\r\n await queryNeonClient(client, \"ROLLBACK\").catch(() => {});\r\n releaseClient(isConnectionError(err) ? true : undefined);\r\n throw err;\r\n }\r\n }, 1);\r\n },\r\n async close() {\r\n await pool.end();\r\n },\r\n };\r\n }\r\n\r\n const { default: postgres } = await import(\"postgres\");\r\n const isWorkers =\r\n \"__cf_env\" in globalThis ||\r\n (typeof navigator !== \"undefined\" &&\r\n navigator.userAgent === \"Cloudflare-Workers\");\r\n\r\n if (isWorkers) {\r\n // Workers: fresh connection per query — I/O can't be shared across requests\r\n return {\r\n async execute(sql) {\r\n const conn = postgres(url, {\r\n max: 1,\r\n idle_timeout: 0,\r\n onnotice: () => {},\r\n });\r\n let timedOut = false;\r\n try {\r\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\r\n const args = typeof sql === \"string\" ? [] : sql.args || [];\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n conn.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n () => {\r\n timedOut = true;\r\n disposePostgresPoolEventually(conn, \"timed-out worker query\");\r\n },\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n } finally {\r\n if (!timedOut) {\r\n await conn.end().catch((err: unknown) => {\r\n console.warn(\r\n \"[db/postgres] worker query cleanup failed:\",\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n }\r\n }\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n const conn = postgres(url, {\r\n max: 1,\r\n idle_timeout: 0,\r\n onnotice: () => {},\r\n });\r\n try {\r\n const result = await conn.begin(async (txSql: any) => {\r\n const tx: DbExec = {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n txSql.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n };\r\n return fn(tx);\r\n });\r\n return result as T;\r\n } finally {\r\n await conn.end().catch((err: unknown) => {\r\n console.warn(\r\n \"[db/postgres] worker transaction cleanup failed:\",\r\n err instanceof Error ? err.message : err,\r\n );\r\n });\r\n }\r\n },\r\n };\r\n } else {\r\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\r\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\r\n // frozen instances don't exhaust Neon/Postgres' connection limit;\r\n // idle_timeout also closes idle connections before Neon's ~5min\r\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\r\n const createPool = () => postgres(url, pgPoolOptions(url));\r\n type PostgresPool = ReturnType<typeof createPool>;\r\n let pool = createPool();\r\n if (trackSingletonResources) _pgPool = pool;\r\n const recyclePool = (timedOutPool: PostgresPool) => {\r\n if (pool === timedOutPool) {\r\n pool = createPool();\r\n if (trackSingletonResources) _pgPool = pool;\r\n }\r\n disposePostgresPoolEventually(timedOutPool, \"timed-out pooled query\");\r\n };\r\n\r\n return {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await retryOnConnectionError<\r\n ArrayLike<unknown> & { count?: number }\r\n >(() => {\r\n const queryPool = pool;\r\n const query = queryPool.unsafe(pgSql, args as any[]);\r\n return withDbTimeout(\r\n \"query\",\r\n () => query,\r\n dbOpTimeoutMs(),\r\n () => recyclePool(queryPool),\r\n );\r\n });\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\r\n const result = await pool.begin(async (txSql: any) => {\r\n const tx: DbExec = {\r\n async execute(sql) {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const pgSql = sqliteToPostgresParams(rawSql);\r\n const result = await withDbTimeout<\r\n ArrayLike<unknown> & { count?: number }\r\n >(\r\n \"query\",\r\n () =>\r\n txSql.unsafe(pgSql, args as any[]) as Promise<\r\n ArrayLike<unknown> & { count?: number }\r\n >,\r\n dbOpTimeoutMs(),\r\n );\r\n return {\r\n rows: Array.from(result),\r\n rowsAffected: result.count ?? 0,\r\n };\r\n },\r\n };\r\n return fn(tx);\r\n });\r\n return result as T;\r\n },\r\n async close() {\r\n await pool.end();\r\n },\r\n };\r\n }\r\n }\r\n\r\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\r\n // serverless bundles do not need libsql's platform-specific native package.\r\n if (isLocalSqliteUrl(url)) {\r\n url = await prepareLocalSqliteUrl(\r\n url.startsWith(\"file:\") ? url : `file:${url}`,\r\n );\r\n const { default: Database } = await import(\"better-sqlite3\");\r\n const sqlite = new Database(sqliteFilenameFromUrl(url));\r\n sqlite.pragma(\"busy_timeout = 10000\");\r\n sqlite.pragma(\"journal_mode = WAL\");\r\n if (trackSingletonResources) _sqlite = sqlite;\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n const { rawSql, args } = sqlAndArgs(sql);\r\n const stmt = sqlite.prepare(rawSql);\r\n if (stmt.reader) {\r\n return {\r\n rows: stmt.all(...args),\r\n rowsAffected: 0,\r\n };\r\n }\r\n const result = stmt.run(...args);\r\n return {\r\n rows: [],\r\n rowsAffected: result.changes ?? 0,\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute, \"BEGIN IMMEDIATE\"),\r\n async close() {\r\n sqlite.close();\r\n },\r\n };\r\n }\r\n\r\n const { createClient } = await import(\"@libsql/client/web\");\r\n const client = createClient({\r\n url,\r\n authToken: config.authToken,\r\n });\r\n const execute: DbExec[\"execute\"] = async (sql) => {\r\n if (typeof sql === \"string\") {\r\n const r = await client.execute(sql);\r\n return {\r\n rows: r.rows as any[],\r\n rowsAffected: r.rowsAffected,\r\n };\r\n }\r\n const r = await client.execute({\r\n sql: sql.sql,\r\n args: sql.args as any[],\r\n });\r\n return {\r\n rows: r.rows as any[],\r\n rowsAffected: r.rowsAffected,\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n transaction: explicitTransaction(execute),\r\n async close() {\r\n client.close();\r\n },\r\n };\r\n}\r\n\r\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\r\n return createDbExecInternal(config, false);\r\n}\r\n\r\nasync function initClient(): Promise<void> {\r\n if (_exec) return;\r\n\r\n const dialect = getDialect();\r\n const url = getDatabaseUrl(\"file:./data/app.db\");\r\n _exec = await createDbExecInternal(\r\n {\r\n url,\r\n authToken: getDatabaseAuthToken(),\r\n d1Binding: dialect === \"d1\" ? getCloudflareD1Binding() : undefined,\r\n },\r\n true,\r\n );\r\n}\r\n\r\n/**\r\n * Get the singleton database client. Returns a `DbExec` whose first\r\n * `execute()` call lazily initializes the underlying driver.\r\n */\r\nexport function getDbExec(): DbExec {\r\n if (_exec) return _exec;\r\n\r\n // Sanitize args: replace undefined with null (libsql rejects undefined)\r\n function sanitize(\r\n sql: string | { sql: string; args?: unknown[] },\r\n ): string | { sql: string; args?: unknown[] } {\r\n if (typeof sql === \"object\" && sql.args) {\r\n return { ...sql, args: sql.args.map((a) => a ?? null) };\r\n }\r\n return sql;\r\n }\r\n\r\n // Return a proxy that lazy-inits on first call\r\n const proxy: DbExec = {\r\n async execute(sql) {\r\n if (!_initPromise) _initPromise = initClient();\r\n try {\r\n await _initPromise;\r\n } catch (err) {\r\n // A failed/hung init must not poison the singleton for the life of\r\n // the process — drop it so the next call retries a fresh connection\r\n // instead of re-awaiting a permanently rejected/pending promise.\r\n _initPromise = undefined;\r\n _exec = undefined;\r\n throw err;\r\n }\r\n // After init, swap to a sanitizing wrapper around the real client\r\n const wrapper: DbExec = {\r\n execute: (s) => _exec!.execute(sanitize(s)),\r\n transaction: _exec!.transaction\r\n ? (fn) =>\r\n _exec!.transaction!((tx) =>\r\n fn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n )\r\n : undefined,\r\n };\r\n Object.assign(proxy, wrapper);\r\n return _exec!.execute(sanitize(sql));\r\n },\r\n async transaction(fn) {\r\n if (!_initPromise) _initPromise = initClient();\r\n try {\r\n await _initPromise;\r\n } catch (err) {\r\n _initPromise = undefined;\r\n _exec = undefined;\r\n throw err;\r\n }\r\n const wrapper: DbExec = {\r\n execute: (s) => _exec!.execute(sanitize(s)),\r\n transaction: _exec!.transaction\r\n ? (innerFn) =>\r\n _exec!.transaction!((tx) =>\r\n innerFn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n )\r\n : undefined,\r\n };\r\n Object.assign(proxy, wrapper);\r\n if (_exec!.transaction) {\r\n return _exec!.transaction((tx) =>\r\n fn({\r\n execute: (s) => tx.execute(sanitize(s)),\r\n transaction: tx.transaction,\r\n }),\r\n );\r\n }\r\n return explicitTransaction(wrapper.execute)(fn);\r\n },\r\n };\r\n return proxy;\r\n}\r\n\r\n/** Close the database connection (for scripts that need cleanup). */\r\nexport async function closeDbExec(): Promise<void> {\r\n if (_pgPool) {\r\n await _pgPool.end();\r\n _pgPool = undefined;\r\n }\r\n if (_neonPool) {\r\n await _neonPool.end();\r\n _neonPool = undefined;\r\n }\r\n if (_sqlite) {\r\n _sqlite.close();\r\n _sqlite = undefined;\r\n }\r\n await closePgliteClients();\r\n _exec = undefined;\r\n _initPromise = undefined;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framework-request-handler.d.ts","sourceRoot":"","sources":["../../src/server/framework-request-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"framework-request-handler.d.ts","sourceRoot":"","sources":["../../src/server/framework-request-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,IAAI,CAAC;AAUhD,QAAA,MAAM,gBAAgB,mBAAmB,CAAC;AAoG1C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/C,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,SAAS,CA6EjD;AA0CD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EACtB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACjC,IAAI,CAwCN;AA6FD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,GAAG,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAqBf;AAwTD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC,CAyBd;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { setResponseHeader, setResponseStatus } from "h3";
|
|
|
2
2
|
import { getMissingDefaultPlugins } from "../deploy/route-discovery.js";
|
|
3
3
|
import { getConfiguredAppBasePath } from "./app-base-path.js";
|
|
4
4
|
import { captureError } from "./capture-error.js";
|
|
5
|
+
import { isCloudflareRuntime } from "../shared/runtime.js";
|
|
5
6
|
const BOOTSTRAPPED = new WeakSet();
|
|
6
7
|
const IN_BOOTSTRAP = new WeakSet();
|
|
7
8
|
const FRAMEWORK_PREFIX = "/_agent-native";
|
|
@@ -19,6 +20,51 @@ function getAppBasePath() {
|
|
|
19
20
|
function pathMatchesPrefix(reqPath, prefix) {
|
|
20
21
|
return reqPath === prefix || reqPath.startsWith(prefix + "/");
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Cloudflare Workers (workerd) cancels pending I/O owned by a request the
|
|
25
|
+
* moment its response returns — a promise created during request A that
|
|
26
|
+
* hasn't settled by then FREEZES forever. Plugin-init and bootstrap promises
|
|
27
|
+
* are created during an app's first request and awaited by later requests'
|
|
28
|
+
* readiness gates, so an early-responding first request (e.g. an auth route
|
|
29
|
+
* that doesn't match the pending inits' paths) permanently wedges every
|
|
30
|
+
* later framework-route request. Tie the promise to the creating request's
|
|
31
|
+
* `waitUntil` so its I/O stays alive until it settles.
|
|
32
|
+
*/
|
|
33
|
+
function extendRequestLifetimeOverInit(promise) {
|
|
34
|
+
try {
|
|
35
|
+
globalThis.__cf_ctx?.waitUntil?.(promise);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* not on Cloudflare or ctx unavailable — nothing to extend */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Bound a readiness-gate await on workerd. Insurance against any init
|
|
43
|
+
* promise that still froze (e.g. created before __cf_ctx existed): a
|
|
44
|
+
* bounded wait turns a permanently hung request into a slow one that
|
|
45
|
+
* proceeds — the route either works (init actually finished) or 404/503s
|
|
46
|
+
* (retryable) instead of hanging until the runtime kills the request.
|
|
47
|
+
*/
|
|
48
|
+
async function awaitBounded(promise) {
|
|
49
|
+
if (!isCloudflareRuntime()) {
|
|
50
|
+
await promise;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let timer;
|
|
54
|
+
const timeout = new Promise((resolve) => {
|
|
55
|
+
timer = setTimeout(() => {
|
|
56
|
+
console.warn("[agent-native] readiness gate timed out waiting for plugin init (20s) — proceeding; the init promise may have been frozen by a prior request's completion");
|
|
57
|
+
resolve();
|
|
58
|
+
}, 20_000);
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
await Promise.race([promise, timeout]);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (timer)
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
22
68
|
function supportsAppBasePathMount(path) {
|
|
23
69
|
return (pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||
|
|
24
70
|
pathMatchesPrefix(path, WELL_KNOWN_PREFIX));
|
|
@@ -93,6 +139,7 @@ export function getH3App(nitroApp) {
|
|
|
93
139
|
tags: { phase: "default-plugin-bootstrap" },
|
|
94
140
|
});
|
|
95
141
|
});
|
|
142
|
+
extendRequestLifetimeOverInit(nitroApp[BOOTSTRAP_PROMISE_KEY]);
|
|
96
143
|
// Readiness gate: Nitro v3 doesn't await async plugins, so routes
|
|
97
144
|
// registered inside an async plugin may not exist when the first
|
|
98
145
|
// request arrives. These middleware entries hold framework routes
|
|
@@ -194,7 +241,7 @@ async function awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath) {
|
|
|
194
241
|
return;
|
|
195
242
|
const bootstrapPromise = nitroApp[BOOTSTRAP_PROMISE_KEY];
|
|
196
243
|
if (bootstrapPromise)
|
|
197
|
-
await bootstrapPromise;
|
|
244
|
+
await awaitBounded(bootstrapPromise);
|
|
198
245
|
await awaitPluginsReady(nitroApp, reqPath);
|
|
199
246
|
}
|
|
200
247
|
/**
|
|
@@ -234,6 +281,7 @@ export function trackPluginInit(nitroApp, promise, options = {}) {
|
|
|
234
281
|
promise: safe,
|
|
235
282
|
paths: options.paths?.filter(Boolean),
|
|
236
283
|
};
|
|
284
|
+
extendRequestLifetimeOverInit(safe);
|
|
237
285
|
const existing = nitroApp[PLUGIN_READY_KEY];
|
|
238
286
|
if (existing) {
|
|
239
287
|
existing.push(entry);
|
|
@@ -320,7 +368,7 @@ export async function awaitPluginsReady(nitroApp, reqPath) {
|
|
|
320
368
|
: true)
|
|
321
369
|
: entries;
|
|
322
370
|
if (relevant.length) {
|
|
323
|
-
await Promise.all(relevant.map((entry) => entry.promise));
|
|
371
|
+
await Promise.all(relevant.map((entry) => awaitBounded(entry.promise)));
|
|
324
372
|
const completed = new Set(relevant);
|
|
325
373
|
const latest = nitroApp[PLUGIN_READY_KEY] ?? [];
|
|
326
374
|
nitroApp[PLUGIN_READY_KEY] = latest.filter((entry) => !completed.has(entry));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framework-request-handler.js","sourceRoot":"","sources":["../../src/server/framework-request-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Framework request handler — registers framework routes on Nitro's h3 instance.\r\n *\r\n * Nitro 3 exposes its h3 app as `nitroApp.h3`. We register framework routes\r\n * directly on it as middleware (`nitroApp.h3[\"~middleware\"]`), giving each\r\n * plugin a path-prefix-matched handler that runs before any file-based route.\r\n *\r\n * Plugins call `getH3App(nitroApp).use(path, handler)` exactly like h3 v1's\r\n * `app.use()` — the wrapper translates that into v2 middleware registration.\r\n *\r\n * Default plugins that the template doesn't provide are auto-mounted on the\r\n * first call to `getH3App()` per nitroApp instance.\r\n */\r\nimport type { EventHandler, H3Event } from \"h3\";\r\nimport { setResponseHeader, setResponseStatus } from \"h3\";\r\n\r\nimport { getMissingDefaultPlugins } from \"../deploy/route-discovery.js\";\r\nimport { getConfiguredAppBasePath } from \"./app-base-path.js\";\r\nimport { captureError } from \"./capture-error.js\";\r\n\r\nconst BOOTSTRAPPED = new WeakSet<object>();\r\nconst IN_BOOTSTRAP = new WeakSet<object>();\r\nconst FRAMEWORK_PREFIX = \"/_agent-native\";\r\nconst WELL_KNOWN_PREFIX = \"/.well-known\";\r\nconst APP_SHIM_KEY = \"_agentNativeH3Shim\";\r\nconst BOOTSTRAP_PROMISE_KEY = \"_agentNativeBootstrapPromise\";\r\nconst PLUGIN_READY_KEY = \"_agentNativePluginReadyPromise\";\r\nconst PLUGIN_READY_PLACEHOLDERS_KEY = \"_agentNativePluginReadyPlaceholders\";\r\nconst PLUGIN_FAILED_KEY = \"_agentNativePluginInitFailures\";\r\nconst PROVIDED_PLUGIN_STEMS_KEY = \"_agentNativeProvidedPluginStems\";\r\nconst MIDDLEWARE_DISPATCHER_PATCHED_KEY =\r\n \"_agentNativeMiddlewareDispatcherPatched\";\r\n\r\ninterface PluginReadyEntry {\r\n promise: Promise<void>;\r\n paths?: string[];\r\n}\r\n\r\nfunction getAppBasePath(): string {\r\n return getConfiguredAppBasePath();\r\n}\r\n\r\nfunction pathMatchesPrefix(reqPath: string, prefix: string): boolean {\r\n return reqPath === prefix || reqPath.startsWith(prefix + \"/\");\r\n}\r\n\r\nfunction supportsAppBasePathMount(path: string): boolean {\r\n return (\r\n pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||\r\n pathMatchesPrefix(path, WELL_KNOWN_PREFIX)\r\n );\r\n}\r\n\r\nfunction resolveMountMatch(\r\n reqPath: string,\r\n path: string,\r\n): { mountPath: string; strippedPath: string } | null {\r\n if (pathMatchesPrefix(reqPath, path)) {\r\n return { mountPath: path, strippedPath: reqPath.slice(path.length) || \"/\" };\r\n }\r\n\r\n const appBasePath = getAppBasePath();\r\n if (!appBasePath || !supportsAppBasePathMount(path)) return null;\r\n\r\n const prefixedPath = `${appBasePath}${path}`;\r\n if (!pathMatchesPrefix(reqPath, prefixedPath)) return null;\r\n return {\r\n mountPath: prefixedPath,\r\n strippedPath: reqPath.slice(prefixedPath.length) || \"/\",\r\n };\r\n}\r\n\r\n/**\r\n * Wrapper around Nitro's h3 instance that exposes a v1-style `.use()` API\r\n * for registering path-prefix middleware.\r\n */\r\nexport interface H3AppShim {\r\n use(path: string, handler: EventHandler): void;\r\n use(handler: EventHandler): void;\r\n}\r\n\r\n/**\r\n * Mark a default plugin slot as supplied by the app/template before the\r\n * framework default bootstrap runs.\r\n *\r\n * Bundled serverless functions often don't have the original\r\n * `server/plugins/*.ts` tree on disk at runtime, so filesystem route discovery\r\n * can falsely conclude a template plugin is missing. Explicit plugin factories\r\n * call this synchronously before awaiting bootstrap so the framework does not\r\n * auto-mount a generic default over the app's custom implementation.\r\n */\r\nexport function markDefaultPluginProvided(nitroApp: any, stem: string): void {\r\n if (!nitroApp || !stem) return;\r\n const existing = nitroApp[PROVIDED_PLUGIN_STEMS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const provided = existing ?? new Set<string>();\r\n provided.add(stem);\r\n nitroApp[PROVIDED_PLUGIN_STEMS_KEY] = provided;\r\n}\r\n\r\n/**\r\n * Get (or create) the shared H3 app wrapper for a nitroApp. Plugins use this\r\n * to register routes via `.use(path, handler)`.\r\n *\r\n * On the first call per nitroApp, we kick off auto-mounting any missing\r\n * default plugins. User-facing plugin factories (createAgentChatPlugin,\r\n * createAuthPlugin, etc.) await this bootstrap via `awaitBootstrap()` so the\r\n * default plugins finish registering middleware before requests arrive.\r\n */\r\nexport function getH3App(nitroApp: any): H3AppShim {\r\n if (!nitroApp) throw new Error(\"getH3App: nitroApp is required\");\r\n ensureGlobalMiddlewareDispatch(nitroApp);\r\n\r\n // Reuse the cached shim if we've wrapped this nitroApp before\r\n const cached = nitroApp[APP_SHIM_KEY] as H3AppShim | undefined;\r\n if (cached) return cached;\r\n\r\n const shim: H3AppShim = {\r\n use(arg1: string | EventHandler, arg2?: EventHandler) {\r\n const path = typeof arg1 === \"string\" ? arg1 : \"\";\r\n const handler = (typeof arg1 === \"string\" ? arg2 : arg1) as EventHandler;\r\n if (typeof handler !== \"function\") {\r\n throw new Error(\"getH3App.use: handler must be a function\");\r\n }\r\n registerMiddleware(nitroApp, path, handler);\r\n },\r\n };\r\n\r\n nitroApp[APP_SHIM_KEY] = shim;\r\n\r\n if (!BOOTSTRAPPED.has(nitroApp)) {\r\n BOOTSTRAPPED.add(nitroApp);\r\n nitroApp[BOOTSTRAP_PROMISE_KEY] = bootstrapDefaultPlugins(nitroApp).catch(\r\n (err) => {\r\n console.warn(\r\n \"[agent-native] Failed to auto-mount default plugins:\",\r\n (err as Error).message,\r\n );\r\n captureError(err, {\r\n route: \"default-plugin-bootstrap\",\r\n tags: { phase: \"default-plugin-bootstrap\" },\r\n });\r\n },\r\n );\r\n\r\n // Readiness gate: Nitro v3 doesn't await async plugins, so routes\r\n // registered inside an async plugin may not exist when the first\r\n // request arrives. These middleware entries hold framework routes\r\n // until default-plugin bootstrap and tracked plugin inits complete.\r\n const readinessGate = (async (event: H3Event) => {\r\n const eventAny = event as any;\r\n await awaitFrameworkRoutesReadyForRequest(\r\n nitroApp,\r\n eventAny.context?._mountedPathname ?? event.url?.pathname ?? \"\",\r\n );\r\n // Fall through — the actual route handler runs next.\r\n return undefined;\r\n }) as EventHandler;\r\n registerMiddleware(nitroApp, FRAMEWORK_PREFIX, readinessGate, {\r\n prepend: true,\r\n });\r\n registerMiddleware(nitroApp, WELL_KNOWN_PREFIX, readinessGate, {\r\n prepend: true,\r\n });\r\n\r\n // Primary gate: Nitro bridges this `request` hook to h3's `config.onRequest`,\r\n // which h3 awaits BEFORE `handler()` snapshots middleware and resolves the\r\n // route. The middleware gate above runs too late on production dispatchers —\r\n // its await finishes after the snapshot, so a route registered during async\r\n // init is missing from the request and 404s. The middleware gate stays as a\r\n // fallback for runtimes where `onRequest` isn't wired.\r\n nitroApp.hooks?.hook?.(\"request\", async (event: H3Event) => {\r\n const reqPath = event.url?.pathname ?? \"\";\r\n if (\r\n resolveMountMatch(reqPath, FRAMEWORK_PREFIX) ||\r\n resolveMountMatch(reqPath, WELL_KNOWN_PREFIX)\r\n ) {\r\n await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);\r\n }\r\n });\r\n }\r\n\r\n return shim;\r\n}\r\n\r\n/**\r\n * Nitro 3 production builds generate a route dispatcher by overriding h3's\r\n * internal `~getMiddleware()` hook. Some generated dispatchers return only\r\n * route-rule middleware and skip the global `h3[\"~middleware\"]` array that\r\n * `getH3App().use()` appends to. Wrap the dispatcher once so framework routes\r\n * registered at runtime are still part of request dispatch.\r\n */\r\nfunction ensureGlobalMiddlewareDispatch(nitroApp: any): void {\r\n const h3 = nitroApp?.h3;\r\n if (!h3) return;\r\n const current = h3[\"~getMiddleware\"];\r\n if (h3[MIDDLEWARE_DISPATCHER_PATCHED_KEY] === current) return;\r\n\r\n const original = typeof current === \"function\" ? current.bind(h3) : undefined;\r\n\r\n const wrappedGetMiddleware = (event: H3Event, route: unknown) => {\r\n const originalResult = original ? original(event, route) : [];\r\n const originalList = Array.isArray(originalResult)\r\n ? originalResult\r\n : originalResult\r\n ? [originalResult]\r\n : [];\r\n const globalMiddleware = Array.isArray(h3[\"~middleware\"])\r\n ? h3[\"~middleware\"]\r\n : [];\r\n if (globalMiddleware.length === 0) return originalList;\r\n\r\n const alreadyIncluded = new Set(originalList);\r\n const missingGlobal = globalMiddleware.filter(\r\n (middleware) => !alreadyIncluded.has(middleware),\r\n );\r\n return missingGlobal.length\r\n ? [...missingGlobal, ...originalList]\r\n : originalList;\r\n };\r\n\r\n h3[\"~getMiddleware\"] = wrappedGetMiddleware;\r\n h3[MIDDLEWARE_DISPATCHER_PATCHED_KEY] = wrappedGetMiddleware;\r\n}\r\n\r\n/**\r\n * Wait for the framework's default-plugin bootstrap to complete.\r\n *\r\n * Called by user-facing plugin factories (`createAgentChatPlugin`, etc.) at\r\n * the top of their plugin function, so that by the time the function returns\r\n * — and Nitro starts accepting requests — all default plugins have finished\r\n * registering their middleware.\r\n *\r\n * No-op when called from inside the bootstrap itself (avoids deadlock when a\r\n * default plugin happens to be running as part of bootstrap).\r\n */\r\nexport async function awaitBootstrap(nitroApp: any): Promise<void> {\r\n if (!nitroApp || IN_BOOTSTRAP.has(nitroApp)) return;\r\n // Trigger bootstrap if it hasn't been already (idempotent — getH3App\r\n // creates the shim and kicks off bootstrap on first call).\r\n getH3App(nitroApp);\r\n const promise = nitroApp[BOOTSTRAP_PROMISE_KEY];\r\n if (promise) await promise;\r\n}\r\n\r\n/**\r\n * Wait until framework routes are safe to dispatch.\r\n *\r\n * Request-time gates must wait for both phases:\r\n * 1. default-plugin bootstrap, which discovers and starts missing plugins\r\n * 2. async plugin init promises, which register routes such as A2A cards\r\n */\r\nasync function awaitFrameworkRoutesReadyForRequest(\r\n nitroApp: any,\r\n reqPath: string,\r\n): Promise<void> {\r\n if (!nitroApp) return;\r\n const bootstrapPromise = nitroApp[BOOTSTRAP_PROMISE_KEY];\r\n if (bootstrapPromise) await bootstrapPromise;\r\n await awaitPluginsReady(nitroApp, reqPath);\r\n}\r\n\r\n/**\r\n * Track an async plugin's initialization promise. Nitro v3 calls plugins\r\n * synchronously and doesn't await async return values, so routes registered\r\n * inside an async plugin may not be ready when the first request arrives.\r\n *\r\n * Call this from the TOP of any async plugin so that the readiness gate\r\n * (installed by getH3App) can hold /_agent-native requests until the plugin\r\n * finishes mounting its routes.\r\n */\r\nexport function trackPluginInit(\r\n nitroApp: any,\r\n promise: Promise<void>,\r\n options: { paths?: string[] } = {},\r\n): void {\r\n if (!nitroApp) return;\r\n // Ensure the readiness gate exists even when the tracked plugin is the first\r\n // framework code to run in a serverless isolate. Otherwise an immediate\r\n // first request can fall through before the plugin registers its routes.\r\n getH3App(nitroApp);\r\n // Attach a no-op catch so the promise doesn't surface as an unhandled\r\n // rejection when Nitro v3 drops the async return value. The actual error\r\n // is still observable when awaitPluginsReady() re-awaits the promise.\r\n const safe = promise.catch((err) => {\r\n console.error(\r\n \"[agent-native] Plugin init failed:\",\r\n (err as Error).message || err,\r\n );\r\n // Record the failure so the readiness gate can return a retryable 503 for\r\n // this plugin's routes instead of letting them fall through to a bare\r\n // \"Cannot find any route matching\" 404. That bare 404 is what kept biting\r\n // external MCP clients (pi/codex/claude) and the connect flow on cold /\r\n // propagating instances whose async init rejected (e.g. DB not yet\r\n // reachable): the route never registered, so the placeholder released into\r\n // a 404 the client couldn't recover from. A 503 is at least retryable.\r\n const failures = (nitroApp[PLUGIN_FAILED_KEY] ??= new Map<\r\n string,\r\n string\r\n >());\r\n const msg = (err as Error)?.message || String(err);\r\n for (const p of options.paths?.filter(Boolean) ?? []) failures.set(p, msg);\r\n });\r\n const entry: PluginReadyEntry = {\r\n promise: safe,\r\n paths: options.paths?.filter(Boolean),\r\n };\r\n const existing = nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined;\r\n if (existing) {\r\n existing.push(entry);\r\n } else {\r\n nitroApp[PLUGIN_READY_KEY] = [entry];\r\n }\r\n installPluginReadyPlaceholders(nitroApp, entry.paths);\r\n}\r\n\r\nfunction installPluginReadyPlaceholders(\r\n nitroApp: any,\r\n paths: string[] | undefined,\r\n): void {\r\n if (!paths?.length) return;\r\n const existing = nitroApp[PLUGIN_READY_PLACEHOLDERS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const installed = existing ?? new Set<string>();\r\n nitroApp[PLUGIN_READY_PLACEHOLDERS_KEY] = installed;\r\n\r\n for (const path of paths) {\r\n if (!path || installed.has(path)) continue;\r\n installed.add(path);\r\n registerMiddleware(\r\n nitroApp,\r\n path,\r\n (async (event: H3Event) => {\r\n const eventAny = event as any;\r\n const reqPath =\r\n eventAny.context?._mountedPathname ?? event.url?.pathname ?? path;\r\n await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);\r\n // If this plugin's async init failed, its real route was never\r\n // registered. Return a retryable 503 instead of releasing into a bare\r\n // 404 (external MCP clients can't recover from a 404; a 503 is at least\r\n // a \"try again\" the client / next instance can act on).\r\n const failures = nitroApp[PLUGIN_FAILED_KEY] as\r\n | Map<string, string>\r\n | undefined;\r\n if (failures?.size) {\r\n for (const [failedPath, msg] of failures) {\r\n if (resolveMountMatch(reqPath, failedPath)) {\r\n setResponseStatus(event, 503);\r\n setResponseHeader(event, \"retry-after\", \"5\");\r\n return {\r\n error: `agent-native route is initializing or unavailable: ${msg}`,\r\n };\r\n }\r\n }\r\n }\r\n return undefined;\r\n }) as EventHandler,\r\n {\r\n prepend: true,\r\n },\r\n );\r\n }\r\n}\r\n\r\nfunction logFrameworkRouteError(args: {\r\n method: string | undefined;\r\n route: string;\r\n status: number;\r\n error: unknown;\r\n}): void {\r\n const error = args.error as any;\r\n const message = error?.message || String(args.error);\r\n const prefix = `[agent-native] ${args.method ?? \"\"} ${args.route} failed (${args.status})`;\r\n if (process.env.NODE_ENV === \"production\") {\r\n console.error(`${prefix}: ${message}`);\r\n return;\r\n }\r\n console.error(`${prefix}: ${message}`, error?.stack || args.error);\r\n}\r\n\r\nfunction isClientAbortError(error: unknown, event: H3Event): boolean {\r\n const err = error as any;\r\n const message = typeof err?.message === \"string\" ? err.message : \"\";\r\n const code = typeof err?.code === \"string\" ? err.code : \"\";\r\n const node = (event as any).node;\r\n return (\r\n message === \"aborted\" ||\r\n code === \"ECONNRESET\" ||\r\n node?.req?.destroyed === true ||\r\n node?.res?.destroyed === true\r\n );\r\n}\r\n\r\nfunction debugClientAbort(args: {\r\n method: string | undefined;\r\n route: string;\r\n error: unknown;\r\n}): void {\r\n if (process.env.NODE_ENV === \"production\") return;\r\n const err = args.error as any;\r\n const message = err?.message || String(args.error);\r\n console.debug?.(\r\n `[agent-native] ${args.method ?? \"\"} ${args.route} aborted by client: ${message}`,\r\n );\r\n}\r\n\r\n/**\r\n * Await all tracked plugin initializations. Called by the readiness gate\r\n * middleware before dispatching framework routes.\r\n */\r\nexport async function awaitPluginsReady(\r\n nitroApp: any,\r\n reqPath?: string,\r\n): Promise<void> {\r\n const entries = nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined;\r\n if (!entries?.length) return;\r\n\r\n const relevant = reqPath\r\n ? entries.filter((entry) =>\r\n entry.paths?.length\r\n ? entry.paths.some((path) => resolveMountMatch(reqPath, path))\r\n : true,\r\n )\r\n : entries;\r\n\r\n if (relevant.length) {\r\n await Promise.all(relevant.map((entry) => entry.promise));\r\n const completed = new Set(relevant);\r\n const latest =\r\n (nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined) ?? [];\r\n nitroApp[PLUGIN_READY_KEY] = latest.filter(\r\n (entry) => !completed.has(entry),\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Register a path-prefix middleware on Nitro's h3 instance.\r\n *\r\n * The middleware:\r\n * - Returns `next()` (continues) if the request path doesn't match.\r\n * - Otherwise dispatches to the handler. If the handler returns a value,\r\n * it short-circuits the request. If it returns undefined, next() runs.\r\n *\r\n * Path matching emulates h3 v1's `app.use(path, ...)` behavior:\r\n * - Exact-match prefix: `/foo` matches `/foo`, `/foo/bar`, but not `/foobar`\r\n * - Empty path: middleware runs on every request\r\n */\r\nfunction registerMiddleware(\r\n nitroApp: any,\r\n path: string,\r\n handler: EventHandler,\r\n options: { prepend?: boolean } = {},\r\n) {\r\n const h3 = nitroApp.h3;\r\n if (!h3 || !Array.isArray(h3[\"~middleware\"])) {\r\n throw new Error(\r\n \"[agent-native] Cannot register route: nitroApp.h3 is not available. \" +\r\n \"Make sure you're calling getH3App() from inside a Nitro plugin.\",\r\n );\r\n }\r\n\r\n const middleware = async (event: H3Event, next: () => any) => {\r\n let originalPathname: string | undefined;\r\n let originalEventPath: string | undefined;\r\n let hadEventPath = false;\r\n const restoreOriginalPath = () => {\r\n if (originalPathname !== undefined) {\r\n try {\r\n event.url.pathname = originalPathname;\r\n } catch {\r\n // ignore\r\n }\r\n originalPathname = undefined;\r\n }\r\n if (hadEventPath) {\r\n try {\r\n (event as any).path = originalEventPath;\r\n } catch {\r\n // ignore\r\n }\r\n } else {\r\n try {\r\n delete (event as any).path;\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n };\r\n if (path) {\r\n const reqPath = event.url?.pathname ?? \"\";\r\n const match = resolveMountMatch(reqPath, path);\r\n if (!match) {\r\n return next();\r\n }\r\n // Strip the mount prefix from event.url.pathname so handlers that\r\n // dispatch sub-routes can read `event.path` (or `event.url.pathname`)\r\n // and see the path RELATIVE to their mount point — matching h3 v1's\r\n // `app.use(path, handler)` semantics.\r\n const eventAny = event as any;\r\n hadEventPath = \"path\" in eventAny;\r\n originalEventPath = eventAny.path;\r\n try {\r\n originalPathname = event.url.pathname;\r\n // Save the full path in context so handlers that need the original URL\r\n // (e.g. Better Auth, which extracts its own basePath prefix) can\r\n // reconstruct a Request with the un-stripped URL.\r\n eventAny.context = eventAny.context ?? {};\r\n eventAny.context._mountedPathname = originalPathname;\r\n eventAny.context._mountPrefix = match.mountPath;\r\n event.url.pathname = match.strippedPath;\r\n eventAny.path = `${match.strippedPath}${event.url.search || \"\"}`;\r\n } catch {\r\n // event.url is read-only on some runtimes — fall through. Handlers\r\n // that don't depend on prefix stripping (most of them) still work.\r\n }\r\n }\r\n try {\r\n const result = await handler(event);\r\n if (result === undefined) {\r\n // Restore the original pathname BEFORE calling next() so downstream\r\n // middleware sees the full URL — not the stripped mount-relative path.\r\n // Matches h3 v2's own sub-app middleware pattern where the restore\r\n // happens inside the next() callback, not after it returns.\r\n restoreOriginalPath();\r\n return next();\r\n }\r\n return result;\r\n } catch (err) {\r\n // Log 500s to the server console so they're debuggable, and respond\r\n // with JSON instead of the default HTML error page so clients can\r\n // surface error messages. This only applies to routes mounted under\r\n // the framework prefix (or middleware mounted at `/`, for which we\r\n // still want visibility).\r\n const reqPath = originalPathname ?? event.url?.pathname ?? \"\";\r\n const e = err as any;\r\n const status =\r\n typeof e?.statusCode === \"number\"\r\n ? e.statusCode\r\n : typeof e?.status === \"number\"\r\n ? e.status\r\n : 500;\r\n if (isClientAbortError(err, event)) {\r\n debugClientAbort({ method: event.method, route: reqPath, error: err });\r\n return undefined;\r\n }\r\n logFrameworkRouteError({\r\n method: event.method,\r\n route: reqPath,\r\n status,\r\n error: err,\r\n });\r\n // Forward 5xx to server-side Sentry — Nitro's own `error` hook may not\r\n // fire here because we convert the throw into a normal JSON response,\r\n // and a console.error alone is invisible in deployed environments.\r\n // 4xx are user-input errors (validation, auth) and aren't worth\r\n // alerting on. Lazy-loaded so the framework-request-handler module\r\n // doesn't pull @sentry/node into bundles that don't need it.\r\n if (status >= 500) {\r\n // Static `import` would create a cycle (sentry.ts imports auth.ts\r\n // which imports… eventually, framework-request-handler.ts).\r\n import(\"./sentry.js\")\r\n .then(({ captureRouteError, isServerSentryEnabled }) => {\r\n if (!isServerSentryEnabled()) return;\r\n captureRouteError(err, {\r\n route: reqPath,\r\n method: event.method,\r\n userAgent: (() => {\r\n try {\r\n return event.headers?.get(\"user-agent\") ?? undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n })(),\r\n });\r\n })\r\n .catch(() => {\r\n // Sentry is observability — never let it break a response path.\r\n });\r\n }\r\n try {\r\n setResponseStatus(event, status);\r\n setResponseHeader(event, \"content-type\", \"application/json\");\r\n } catch {\r\n // Response already sent — best effort.\r\n }\r\n return {\r\n error: e?.message || \"Internal server error\",\r\n // Only surface the stack to clients when explicitly enabled.\r\n // `NODE_ENV !== \"production\"` was unsafe — preview deploys and\r\n // any host that forgets to set NODE_ENV=production leaked stack\r\n // traces (file paths, dependency versions, internal route\r\n // topology) to anonymous callers. Operators who want stacks in\r\n // dev set `AGENT_NATIVE_DEBUG_ERRORS=1` explicitly.\r\n ...(status >= 500 &&\r\n process.env.AGENT_NATIVE_DEBUG_ERRORS === \"1\" &&\r\n e?.stack\r\n ? { stack: e.stack }\r\n : {}),\r\n };\r\n } finally {\r\n // Restore the original pathname so downstream middleware sees the\r\n // full URL.\r\n restoreOriginalPath();\r\n }\r\n };\r\n\r\n if (options.prepend) {\r\n h3[\"~middleware\"].unshift(middleware);\r\n } else {\r\n h3[\"~middleware\"].push(middleware);\r\n }\r\n}\r\n\r\n/**\r\n * Auto-mount any default framework plugins that the template doesn't provide.\r\n *\r\n * Runs once per nitroApp on the first `getH3App()` call. Uses route-discovery\r\n * to find which default plugin stems are missing from `server/plugins/`, then\r\n * dynamically imports and mounts them. If a workspace core is present in the\r\n * ancestor chain, plugin slots the workspace core exports are mounted from\r\n * there instead of from @agent-native/core — this is the middle layer of the\r\n * three-layer inheritance model (app local > workspace core > framework).\r\n */\r\nasync function bootstrapDefaultPlugins(nitroApp: any): Promise<void> {\r\n IN_BOOTSTRAP.add(nitroApp);\r\n try {\r\n const cwd = process.cwd();\r\n const discoveredMissing = await getMissingDefaultPlugins(cwd);\r\n const provided = nitroApp[PROVIDED_PLUGIN_STEMS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const missing = provided\r\n ? discoveredMissing.filter((stem) => !provided.has(stem))\r\n : discoveredMissing;\r\n if (missing.length === 0) return;\r\n\r\n // Lazy import to avoid circular dependency at module load time\r\n const serverModule = await import(\"./index.js\");\r\n const terminalModule = await import(\"../terminal/terminal-plugin.js\");\r\n const integrationsModule = await import(\"../integrations/plugin.js\");\r\n const contextXrayModule = await import(\"../agent/context-xray/plugin.js\");\r\n const observationalMemoryModule =\r\n await import(\"../agent/observational-memory/plugin.js\");\r\n const orgModule = await import(\"../org/plugin.js\");\r\n const onboardingModule = await import(\"../onboarding/plugin.js\");\r\n\r\n const frameworkImpls: Record<\r\n string,\r\n ((nitroApp: any) => void | Promise<void>) | undefined\r\n > = {\r\n \"agent-chat\": (serverModule as any).defaultAgentChatPlugin,\r\n auth: (serverModule as any).defaultAuthPlugin,\r\n \"context-xray\": (contextXrayModule as any).defaultContextXrayPlugin,\r\n \"core-routes\": (serverModule as any).defaultCoreRoutesPlugin,\r\n integrations: (integrationsModule as any).defaultIntegrationsPlugin,\r\n \"observational-memory\": (observationalMemoryModule as any)\r\n .defaultObservationalMemoryPlugin,\r\n onboarding: (onboardingModule as any).defaultOnboardingPlugin,\r\n org: (orgModule as any).defaultOrgPlugin,\r\n resources: (serverModule as any).defaultResourcesPlugin,\r\n sentry: (serverModule as any).defaultSentryPlugin,\r\n terminal: (terminalModule as any).defaultTerminalPlugin,\r\n };\r\n\r\n // Workspace core layer: if the app is inside an enterprise monorepo with\r\n // `agent-native.workspaceCore` configured, pull in any plugin slots the\r\n // workspace core exports from its server entry. We dynamically import the\r\n // workspace core package at runtime.\r\n let workspaceImpls: Record<\r\n string,\r\n ((nitroApp: any) => void | Promise<void>) | undefined\r\n > = {};\r\n try {\r\n const { getWorkspaceCoreExports } =\r\n await import(\"../deploy/workspace-core.js\");\r\n const ws = await getWorkspaceCoreExports(cwd);\r\n if (ws && Object.keys(ws.plugins).length > 0) {\r\n try {\r\n const wsServerModule = await loadWorkspaceCoreServer(\r\n ws.packageName,\r\n ws.packageDir,\r\n );\r\n for (const [slot, exportName] of Object.entries(ws.plugins)) {\r\n if (!exportName) continue;\r\n const impl = (wsServerModule as any)[exportName];\r\n if (typeof impl === \"function\") {\r\n workspaceImpls[slot] = impl;\r\n }\r\n }\r\n if (process.env.DEBUG) {\r\n console.log(\r\n `[agent-native] Workspace core ${ws.packageName} provides plugin slots: ${Object.keys(workspaceImpls).join(\", \")}`,\r\n );\r\n }\r\n } catch (e) {\r\n const msg = (e as Error).message ?? \"\";\r\n // Common cause: workspace-core's package.json points \"./server\"\r\n // at a TS source file (the scaffold default), but Node can't\r\n // resolve relative `.js` imports inside it without a TS loader.\r\n // Tell the user to compile to dist/ rather than just dumping the\r\n // raw resolution error.\r\n const tsLoadHint = /\\.js' imported from .*\\.ts/.test(msg)\r\n ? \" — workspace-core src is TypeScript but isn't being compiled. \" +\r\n \"Run `pnpm --filter \" +\r\n ws.packageName +\r\n \" build` and point its `./server` export at dist/server/index.js.\"\r\n : \"\";\r\n console.warn(\r\n `[agent-native] Failed to load workspace core ${ws.packageName}/server: ${msg}${tsLoadHint}`,\r\n );\r\n }\r\n }\r\n } catch {\r\n // Workspace shared package isn't available (e.g. running on an edge\r\n // runtime without fs). Silently fall through to framework defaults.\r\n }\r\n\r\n if (process.env.DEBUG)\r\n console.log(\r\n `[agent-native] Auto-mounting ${missing.length} default plugin(s): ${missing.join(\", \")}`,\r\n );\r\n\r\n for (const stem of missing) {\r\n // Prefer workspace-core impl over framework default when both exist.\r\n const impl = workspaceImpls[stem] ?? frameworkImpls[stem];\r\n if (typeof impl === \"function\") {\r\n try {\r\n await impl(nitroApp);\r\n } catch (e) {\r\n console.warn(\r\n `[agent-native] Failed to auto-mount default plugin ${stem}:`,\r\n (e as Error).message,\r\n );\r\n captureError(e, {\r\n route: \"default-plugin-bootstrap\",\r\n tags: { phase: \"default-plugin-bootstrap\", plugin: stem },\r\n });\r\n }\r\n }\r\n }\r\n } finally {\r\n IN_BOOTSTRAP.delete(nitroApp);\r\n }\r\n}\r\n\r\n/**\r\n * Load a workspace-core's `/server` entry, transparently handling TS source.\r\n *\r\n * The scaffolded workspace-core template ships TS sources without a build\r\n * step (exports point at `./src/server/index.ts`), so plain `await import()`\r\n * blows up the moment Node hits a relative `.js` import inside (the standard\r\n * TS ESM convention) — and even before that, Node may resolve the package\r\n * relative to the framework's own location rather than the user's monorepo.\r\n *\r\n * We try Node's plain `import()` first (fastest path when the user has\r\n * compiled to dist/) and fall through to jiti on any error. jiti is anchored\r\n * to a real file inside the workspace-core's directory, so its module\r\n * resolution starts in the right node_modules tree (handles pnpm hoisting\r\n * and linked workspaces) AND handles TS source files + `.js` → `.ts` ESM\r\n * extension remapping.\r\n *\r\n * Edge runtimes without `fs` won't be able to load jiti at all; the outer\r\n * try/catch silently falls through to framework defaults in that case.\r\n */\r\nexport async function loadWorkspaceCoreServer(\r\n packageName: string,\r\n packageDir: string,\r\n): Promise<any> {\r\n let firstErr: unknown;\r\n try {\r\n return await import(/* @vite-ignore */ `${packageName}/server`);\r\n } catch (e) {\r\n firstErr = e;\r\n }\r\n\r\n try {\r\n const { createJiti } = await import(\"jiti\");\r\n const { pathToFileURL } = await import(\"node:url\");\r\n const path = await import(\"node:path\");\r\n // Anchor jiti to a real file inside the workspace-core package so its\r\n // module resolution starts in the right node_modules tree (handles pnpm\r\n // hoisting and linked workspaces).\r\n const anchor = pathToFileURL(\r\n path.join(packageDir, \"package.json\"),\r\n ).toString();\r\n const jiti = createJiti(anchor, { interopDefault: true });\r\n return await jiti.import(`${packageName}/server`);\r\n } catch (jitiErr) {\r\n // jiti also failed — rethrow the original Node error since it's usually\r\n // more informative about *why* the package wasn't resolvable.\r\n throw firstErr ?? jitiErr;\r\n }\r\n}\r\n\r\nexport { FRAMEWORK_PREFIX };\r\n"]}
|
|
1
|
+
{"version":3,"file":"framework-request-handler.js","sourceRoot":"","sources":["../../src/server/framework-request-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Framework request handler — registers framework routes on Nitro's h3 instance.\r\n *\r\n * Nitro 3 exposes its h3 app as `nitroApp.h3`. We register framework routes\r\n * directly on it as middleware (`nitroApp.h3[\"~middleware\"]`), giving each\r\n * plugin a path-prefix-matched handler that runs before any file-based route.\r\n *\r\n * Plugins call `getH3App(nitroApp).use(path, handler)` exactly like h3 v1's\r\n * `app.use()` — the wrapper translates that into v2 middleware registration.\r\n *\r\n * Default plugins that the template doesn't provide are auto-mounted on the\r\n * first call to `getH3App()` per nitroApp instance.\r\n */\r\nimport type { EventHandler, H3Event } from \"h3\";\r\nimport { setResponseHeader, setResponseStatus } from \"h3\";\r\n\r\nimport { getMissingDefaultPlugins } from \"../deploy/route-discovery.js\";\r\nimport { getConfiguredAppBasePath } from \"./app-base-path.js\";\r\nimport { captureError } from \"./capture-error.js\";\r\nimport { isCloudflareRuntime } from \"../shared/runtime.js\";\r\n\r\nconst BOOTSTRAPPED = new WeakSet<object>();\r\nconst IN_BOOTSTRAP = new WeakSet<object>();\r\nconst FRAMEWORK_PREFIX = \"/_agent-native\";\r\nconst WELL_KNOWN_PREFIX = \"/.well-known\";\r\nconst APP_SHIM_KEY = \"_agentNativeH3Shim\";\r\nconst BOOTSTRAP_PROMISE_KEY = \"_agentNativeBootstrapPromise\";\r\nconst PLUGIN_READY_KEY = \"_agentNativePluginReadyPromise\";\r\nconst PLUGIN_READY_PLACEHOLDERS_KEY = \"_agentNativePluginReadyPlaceholders\";\r\nconst PLUGIN_FAILED_KEY = \"_agentNativePluginInitFailures\";\r\nconst PROVIDED_PLUGIN_STEMS_KEY = \"_agentNativeProvidedPluginStems\";\r\nconst MIDDLEWARE_DISPATCHER_PATCHED_KEY =\r\n \"_agentNativeMiddlewareDispatcherPatched\";\r\n\r\ninterface PluginReadyEntry {\r\n promise: Promise<void>;\r\n paths?: string[];\r\n}\r\n\r\nfunction getAppBasePath(): string {\r\n return getConfiguredAppBasePath();\r\n}\r\n\r\nfunction pathMatchesPrefix(reqPath: string, prefix: string): boolean {\r\n return reqPath === prefix || reqPath.startsWith(prefix + \"/\");\r\n}\r\n\r\n/**\r\n * Cloudflare Workers (workerd) cancels pending I/O owned by a request the\r\n * moment its response returns — a promise created during request A that\r\n * hasn't settled by then FREEZES forever. Plugin-init and bootstrap promises\r\n * are created during an app's first request and awaited by later requests'\r\n * readiness gates, so an early-responding first request (e.g. an auth route\r\n * that doesn't match the pending inits' paths) permanently wedges every\r\n * later framework-route request. Tie the promise to the creating request's\r\n * `waitUntil` so its I/O stays alive until it settles.\r\n */\r\nfunction extendRequestLifetimeOverInit(promise: Promise<unknown>): void {\r\n try {\r\n (\r\n globalThis as {\r\n __cf_ctx?: { waitUntil?: (p: Promise<unknown>) => void };\r\n }\r\n ).__cf_ctx?.waitUntil?.(promise);\r\n } catch {\r\n /* not on Cloudflare or ctx unavailable — nothing to extend */\r\n }\r\n}\r\n\r\n/**\r\n * Bound a readiness-gate await on workerd. Insurance against any init\r\n * promise that still froze (e.g. created before __cf_ctx existed): a\r\n * bounded wait turns a permanently hung request into a slow one that\r\n * proceeds — the route either works (init actually finished) or 404/503s\r\n * (retryable) instead of hanging until the runtime kills the request.\r\n */\r\nasync function awaitBounded(promise: Promise<unknown>): Promise<void> {\r\n if (!isCloudflareRuntime()) {\r\n await promise;\r\n return;\r\n }\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n const timeout = new Promise<void>((resolve) => {\r\n timer = setTimeout(() => {\r\n console.warn(\r\n \"[agent-native] readiness gate timed out waiting for plugin init (20s) — proceeding; the init promise may have been frozen by a prior request's completion\",\r\n );\r\n resolve();\r\n }, 20_000);\r\n });\r\n try {\r\n await Promise.race([promise, timeout]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n}\r\n\r\nfunction supportsAppBasePathMount(path: string): boolean {\r\n return (\r\n pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||\r\n pathMatchesPrefix(path, WELL_KNOWN_PREFIX)\r\n );\r\n}\r\n\r\nfunction resolveMountMatch(\r\n reqPath: string,\r\n path: string,\r\n): { mountPath: string; strippedPath: string } | null {\r\n if (pathMatchesPrefix(reqPath, path)) {\r\n return { mountPath: path, strippedPath: reqPath.slice(path.length) || \"/\" };\r\n }\r\n\r\n const appBasePath = getAppBasePath();\r\n if (!appBasePath || !supportsAppBasePathMount(path)) return null;\r\n\r\n const prefixedPath = `${appBasePath}${path}`;\r\n if (!pathMatchesPrefix(reqPath, prefixedPath)) return null;\r\n return {\r\n mountPath: prefixedPath,\r\n strippedPath: reqPath.slice(prefixedPath.length) || \"/\",\r\n };\r\n}\r\n\r\n/**\r\n * Wrapper around Nitro's h3 instance that exposes a v1-style `.use()` API\r\n * for registering path-prefix middleware.\r\n */\r\nexport interface H3AppShim {\r\n use(path: string, handler: EventHandler): void;\r\n use(handler: EventHandler): void;\r\n}\r\n\r\n/**\r\n * Mark a default plugin slot as supplied by the app/template before the\r\n * framework default bootstrap runs.\r\n *\r\n * Bundled serverless functions often don't have the original\r\n * `server/plugins/*.ts` tree on disk at runtime, so filesystem route discovery\r\n * can falsely conclude a template plugin is missing. Explicit plugin factories\r\n * call this synchronously before awaiting bootstrap so the framework does not\r\n * auto-mount a generic default over the app's custom implementation.\r\n */\r\nexport function markDefaultPluginProvided(nitroApp: any, stem: string): void {\r\n if (!nitroApp || !stem) return;\r\n const existing = nitroApp[PROVIDED_PLUGIN_STEMS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const provided = existing ?? new Set<string>();\r\n provided.add(stem);\r\n nitroApp[PROVIDED_PLUGIN_STEMS_KEY] = provided;\r\n}\r\n\r\n/**\r\n * Get (or create) the shared H3 app wrapper for a nitroApp. Plugins use this\r\n * to register routes via `.use(path, handler)`.\r\n *\r\n * On the first call per nitroApp, we kick off auto-mounting any missing\r\n * default plugins. User-facing plugin factories (createAgentChatPlugin,\r\n * createAuthPlugin, etc.) await this bootstrap via `awaitBootstrap()` so the\r\n * default plugins finish registering middleware before requests arrive.\r\n */\r\nexport function getH3App(nitroApp: any): H3AppShim {\r\n if (!nitroApp) throw new Error(\"getH3App: nitroApp is required\");\r\n ensureGlobalMiddlewareDispatch(nitroApp);\r\n\r\n // Reuse the cached shim if we've wrapped this nitroApp before\r\n const cached = nitroApp[APP_SHIM_KEY] as H3AppShim | undefined;\r\n if (cached) return cached;\r\n\r\n const shim: H3AppShim = {\r\n use(arg1: string | EventHandler, arg2?: EventHandler) {\r\n const path = typeof arg1 === \"string\" ? arg1 : \"\";\r\n const handler = (typeof arg1 === \"string\" ? arg2 : arg1) as EventHandler;\r\n if (typeof handler !== \"function\") {\r\n throw new Error(\"getH3App.use: handler must be a function\");\r\n }\r\n registerMiddleware(nitroApp, path, handler);\r\n },\r\n };\r\n\r\n nitroApp[APP_SHIM_KEY] = shim;\r\n\r\n if (!BOOTSTRAPPED.has(nitroApp)) {\r\n BOOTSTRAPPED.add(nitroApp);\r\n nitroApp[BOOTSTRAP_PROMISE_KEY] = bootstrapDefaultPlugins(nitroApp).catch(\r\n (err) => {\r\n console.warn(\r\n \"[agent-native] Failed to auto-mount default plugins:\",\r\n (err as Error).message,\r\n );\r\n captureError(err, {\r\n route: \"default-plugin-bootstrap\",\r\n tags: { phase: \"default-plugin-bootstrap\" },\r\n });\r\n },\r\n );\r\n extendRequestLifetimeOverInit(\r\n nitroApp[BOOTSTRAP_PROMISE_KEY] as Promise<unknown>,\r\n );\r\n\r\n // Readiness gate: Nitro v3 doesn't await async plugins, so routes\r\n // registered inside an async plugin may not exist when the first\r\n // request arrives. These middleware entries hold framework routes\r\n // until default-plugin bootstrap and tracked plugin inits complete.\r\n const readinessGate = (async (event: H3Event) => {\r\n const eventAny = event as any;\r\n await awaitFrameworkRoutesReadyForRequest(\r\n nitroApp,\r\n eventAny.context?._mountedPathname ?? event.url?.pathname ?? \"\",\r\n );\r\n // Fall through — the actual route handler runs next.\r\n return undefined;\r\n }) as EventHandler;\r\n registerMiddleware(nitroApp, FRAMEWORK_PREFIX, readinessGate, {\r\n prepend: true,\r\n });\r\n registerMiddleware(nitroApp, WELL_KNOWN_PREFIX, readinessGate, {\r\n prepend: true,\r\n });\r\n\r\n // Primary gate: Nitro bridges this `request` hook to h3's `config.onRequest`,\r\n // which h3 awaits BEFORE `handler()` snapshots middleware and resolves the\r\n // route. The middleware gate above runs too late on production dispatchers —\r\n // its await finishes after the snapshot, so a route registered during async\r\n // init is missing from the request and 404s. The middleware gate stays as a\r\n // fallback for runtimes where `onRequest` isn't wired.\r\n nitroApp.hooks?.hook?.(\"request\", async (event: H3Event) => {\r\n const reqPath = event.url?.pathname ?? \"\";\r\n if (\r\n resolveMountMatch(reqPath, FRAMEWORK_PREFIX) ||\r\n resolveMountMatch(reqPath, WELL_KNOWN_PREFIX)\r\n ) {\r\n await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);\r\n }\r\n });\r\n }\r\n\r\n return shim;\r\n}\r\n\r\n/**\r\n * Nitro 3 production builds generate a route dispatcher by overriding h3's\r\n * internal `~getMiddleware()` hook. Some generated dispatchers return only\r\n * route-rule middleware and skip the global `h3[\"~middleware\"]` array that\r\n * `getH3App().use()` appends to. Wrap the dispatcher once so framework routes\r\n * registered at runtime are still part of request dispatch.\r\n */\r\nfunction ensureGlobalMiddlewareDispatch(nitroApp: any): void {\r\n const h3 = nitroApp?.h3;\r\n if (!h3) return;\r\n const current = h3[\"~getMiddleware\"];\r\n if (h3[MIDDLEWARE_DISPATCHER_PATCHED_KEY] === current) return;\r\n\r\n const original = typeof current === \"function\" ? current.bind(h3) : undefined;\r\n\r\n const wrappedGetMiddleware = (event: H3Event, route: unknown) => {\r\n const originalResult = original ? original(event, route) : [];\r\n const originalList = Array.isArray(originalResult)\r\n ? originalResult\r\n : originalResult\r\n ? [originalResult]\r\n : [];\r\n const globalMiddleware = Array.isArray(h3[\"~middleware\"])\r\n ? h3[\"~middleware\"]\r\n : [];\r\n if (globalMiddleware.length === 0) return originalList;\r\n\r\n const alreadyIncluded = new Set(originalList);\r\n const missingGlobal = globalMiddleware.filter(\r\n (middleware) => !alreadyIncluded.has(middleware),\r\n );\r\n return missingGlobal.length\r\n ? [...missingGlobal, ...originalList]\r\n : originalList;\r\n };\r\n\r\n h3[\"~getMiddleware\"] = wrappedGetMiddleware;\r\n h3[MIDDLEWARE_DISPATCHER_PATCHED_KEY] = wrappedGetMiddleware;\r\n}\r\n\r\n/**\r\n * Wait for the framework's default-plugin bootstrap to complete.\r\n *\r\n * Called by user-facing plugin factories (`createAgentChatPlugin`, etc.) at\r\n * the top of their plugin function, so that by the time the function returns\r\n * — and Nitro starts accepting requests — all default plugins have finished\r\n * registering their middleware.\r\n *\r\n * No-op when called from inside the bootstrap itself (avoids deadlock when a\r\n * default plugin happens to be running as part of bootstrap).\r\n */\r\nexport async function awaitBootstrap(nitroApp: any): Promise<void> {\r\n if (!nitroApp || IN_BOOTSTRAP.has(nitroApp)) return;\r\n // Trigger bootstrap if it hasn't been already (idempotent — getH3App\r\n // creates the shim and kicks off bootstrap on first call).\r\n getH3App(nitroApp);\r\n const promise = nitroApp[BOOTSTRAP_PROMISE_KEY];\r\n if (promise) await promise;\r\n}\r\n\r\n/**\r\n * Wait until framework routes are safe to dispatch.\r\n *\r\n * Request-time gates must wait for both phases:\r\n * 1. default-plugin bootstrap, which discovers and starts missing plugins\r\n * 2. async plugin init promises, which register routes such as A2A cards\r\n */\r\nasync function awaitFrameworkRoutesReadyForRequest(\r\n nitroApp: any,\r\n reqPath: string,\r\n): Promise<void> {\r\n if (!nitroApp) return;\r\n const bootstrapPromise = nitroApp[BOOTSTRAP_PROMISE_KEY];\r\n if (bootstrapPromise) await awaitBounded(bootstrapPromise);\r\n await awaitPluginsReady(nitroApp, reqPath);\r\n}\r\n\r\n/**\r\n * Track an async plugin's initialization promise. Nitro v3 calls plugins\r\n * synchronously and doesn't await async return values, so routes registered\r\n * inside an async plugin may not be ready when the first request arrives.\r\n *\r\n * Call this from the TOP of any async plugin so that the readiness gate\r\n * (installed by getH3App) can hold /_agent-native requests until the plugin\r\n * finishes mounting its routes.\r\n */\r\nexport function trackPluginInit(\r\n nitroApp: any,\r\n promise: Promise<void>,\r\n options: { paths?: string[] } = {},\r\n): void {\r\n if (!nitroApp) return;\r\n // Ensure the readiness gate exists even when the tracked plugin is the first\r\n // framework code to run in a serverless isolate. Otherwise an immediate\r\n // first request can fall through before the plugin registers its routes.\r\n getH3App(nitroApp);\r\n // Attach a no-op catch so the promise doesn't surface as an unhandled\r\n // rejection when Nitro v3 drops the async return value. The actual error\r\n // is still observable when awaitPluginsReady() re-awaits the promise.\r\n const safe = promise.catch((err) => {\r\n console.error(\r\n \"[agent-native] Plugin init failed:\",\r\n (err as Error).message || err,\r\n );\r\n // Record the failure so the readiness gate can return a retryable 503 for\r\n // this plugin's routes instead of letting them fall through to a bare\r\n // \"Cannot find any route matching\" 404. That bare 404 is what kept biting\r\n // external MCP clients (pi/codex/claude) and the connect flow on cold /\r\n // propagating instances whose async init rejected (e.g. DB not yet\r\n // reachable): the route never registered, so the placeholder released into\r\n // a 404 the client couldn't recover from. A 503 is at least retryable.\r\n const failures = (nitroApp[PLUGIN_FAILED_KEY] ??= new Map<\r\n string,\r\n string\r\n >());\r\n const msg = (err as Error)?.message || String(err);\r\n for (const p of options.paths?.filter(Boolean) ?? []) failures.set(p, msg);\r\n });\r\n const entry: PluginReadyEntry = {\r\n promise: safe,\r\n paths: options.paths?.filter(Boolean),\r\n };\r\n extendRequestLifetimeOverInit(safe);\r\n const existing = nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined;\r\n if (existing) {\r\n existing.push(entry);\r\n } else {\r\n nitroApp[PLUGIN_READY_KEY] = [entry];\r\n }\r\n installPluginReadyPlaceholders(nitroApp, entry.paths);\r\n}\r\n\r\nfunction installPluginReadyPlaceholders(\r\n nitroApp: any,\r\n paths: string[] | undefined,\r\n): void {\r\n if (!paths?.length) return;\r\n const existing = nitroApp[PLUGIN_READY_PLACEHOLDERS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const installed = existing ?? new Set<string>();\r\n nitroApp[PLUGIN_READY_PLACEHOLDERS_KEY] = installed;\r\n\r\n for (const path of paths) {\r\n if (!path || installed.has(path)) continue;\r\n installed.add(path);\r\n registerMiddleware(\r\n nitroApp,\r\n path,\r\n (async (event: H3Event) => {\r\n const eventAny = event as any;\r\n const reqPath =\r\n eventAny.context?._mountedPathname ?? event.url?.pathname ?? path;\r\n await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);\r\n // If this plugin's async init failed, its real route was never\r\n // registered. Return a retryable 503 instead of releasing into a bare\r\n // 404 (external MCP clients can't recover from a 404; a 503 is at least\r\n // a \"try again\" the client / next instance can act on).\r\n const failures = nitroApp[PLUGIN_FAILED_KEY] as\r\n | Map<string, string>\r\n | undefined;\r\n if (failures?.size) {\r\n for (const [failedPath, msg] of failures) {\r\n if (resolveMountMatch(reqPath, failedPath)) {\r\n setResponseStatus(event, 503);\r\n setResponseHeader(event, \"retry-after\", \"5\");\r\n return {\r\n error: `agent-native route is initializing or unavailable: ${msg}`,\r\n };\r\n }\r\n }\r\n }\r\n return undefined;\r\n }) as EventHandler,\r\n {\r\n prepend: true,\r\n },\r\n );\r\n }\r\n}\r\n\r\nfunction logFrameworkRouteError(args: {\r\n method: string | undefined;\r\n route: string;\r\n status: number;\r\n error: unknown;\r\n}): void {\r\n const error = args.error as any;\r\n const message = error?.message || String(args.error);\r\n const prefix = `[agent-native] ${args.method ?? \"\"} ${args.route} failed (${args.status})`;\r\n if (process.env.NODE_ENV === \"production\") {\r\n console.error(`${prefix}: ${message}`);\r\n return;\r\n }\r\n console.error(`${prefix}: ${message}`, error?.stack || args.error);\r\n}\r\n\r\nfunction isClientAbortError(error: unknown, event: H3Event): boolean {\r\n const err = error as any;\r\n const message = typeof err?.message === \"string\" ? err.message : \"\";\r\n const code = typeof err?.code === \"string\" ? err.code : \"\";\r\n const node = (event as any).node;\r\n return (\r\n message === \"aborted\" ||\r\n code === \"ECONNRESET\" ||\r\n node?.req?.destroyed === true ||\r\n node?.res?.destroyed === true\r\n );\r\n}\r\n\r\nfunction debugClientAbort(args: {\r\n method: string | undefined;\r\n route: string;\r\n error: unknown;\r\n}): void {\r\n if (process.env.NODE_ENV === \"production\") return;\r\n const err = args.error as any;\r\n const message = err?.message || String(args.error);\r\n console.debug?.(\r\n `[agent-native] ${args.method ?? \"\"} ${args.route} aborted by client: ${message}`,\r\n );\r\n}\r\n\r\n/**\r\n * Await all tracked plugin initializations. Called by the readiness gate\r\n * middleware before dispatching framework routes.\r\n */\r\nexport async function awaitPluginsReady(\r\n nitroApp: any,\r\n reqPath?: string,\r\n): Promise<void> {\r\n const entries = nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined;\r\n if (!entries?.length) return;\r\n\r\n const relevant = reqPath\r\n ? entries.filter((entry) =>\r\n entry.paths?.length\r\n ? entry.paths.some((path) => resolveMountMatch(reqPath, path))\r\n : true,\r\n )\r\n : entries;\r\n\r\n if (relevant.length) {\r\n await Promise.all(relevant.map((entry) => awaitBounded(entry.promise)));\r\n const completed = new Set(relevant);\r\n const latest =\r\n (nitroApp[PLUGIN_READY_KEY] as PluginReadyEntry[] | undefined) ?? [];\r\n nitroApp[PLUGIN_READY_KEY] = latest.filter(\r\n (entry) => !completed.has(entry),\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Register a path-prefix middleware on Nitro's h3 instance.\r\n *\r\n * The middleware:\r\n * - Returns `next()` (continues) if the request path doesn't match.\r\n * - Otherwise dispatches to the handler. If the handler returns a value,\r\n * it short-circuits the request. If it returns undefined, next() runs.\r\n *\r\n * Path matching emulates h3 v1's `app.use(path, ...)` behavior:\r\n * - Exact-match prefix: `/foo` matches `/foo`, `/foo/bar`, but not `/foobar`\r\n * - Empty path: middleware runs on every request\r\n */\r\nfunction registerMiddleware(\r\n nitroApp: any,\r\n path: string,\r\n handler: EventHandler,\r\n options: { prepend?: boolean } = {},\r\n) {\r\n const h3 = nitroApp.h3;\r\n if (!h3 || !Array.isArray(h3[\"~middleware\"])) {\r\n throw new Error(\r\n \"[agent-native] Cannot register route: nitroApp.h3 is not available. \" +\r\n \"Make sure you're calling getH3App() from inside a Nitro plugin.\",\r\n );\r\n }\r\n\r\n const middleware = async (event: H3Event, next: () => any) => {\r\n let originalPathname: string | undefined;\r\n let originalEventPath: string | undefined;\r\n let hadEventPath = false;\r\n const restoreOriginalPath = () => {\r\n if (originalPathname !== undefined) {\r\n try {\r\n event.url.pathname = originalPathname;\r\n } catch {\r\n // ignore\r\n }\r\n originalPathname = undefined;\r\n }\r\n if (hadEventPath) {\r\n try {\r\n (event as any).path = originalEventPath;\r\n } catch {\r\n // ignore\r\n }\r\n } else {\r\n try {\r\n delete (event as any).path;\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n };\r\n if (path) {\r\n const reqPath = event.url?.pathname ?? \"\";\r\n const match = resolveMountMatch(reqPath, path);\r\n if (!match) {\r\n return next();\r\n }\r\n // Strip the mount prefix from event.url.pathname so handlers that\r\n // dispatch sub-routes can read `event.path` (or `event.url.pathname`)\r\n // and see the path RELATIVE to their mount point — matching h3 v1's\r\n // `app.use(path, handler)` semantics.\r\n const eventAny = event as any;\r\n hadEventPath = \"path\" in eventAny;\r\n originalEventPath = eventAny.path;\r\n try {\r\n originalPathname = event.url.pathname;\r\n // Save the full path in context so handlers that need the original URL\r\n // (e.g. Better Auth, which extracts its own basePath prefix) can\r\n // reconstruct a Request with the un-stripped URL.\r\n eventAny.context = eventAny.context ?? {};\r\n eventAny.context._mountedPathname = originalPathname;\r\n eventAny.context._mountPrefix = match.mountPath;\r\n event.url.pathname = match.strippedPath;\r\n eventAny.path = `${match.strippedPath}${event.url.search || \"\"}`;\r\n } catch {\r\n // event.url is read-only on some runtimes — fall through. Handlers\r\n // that don't depend on prefix stripping (most of them) still work.\r\n }\r\n }\r\n try {\r\n const result = await handler(event);\r\n if (result === undefined) {\r\n // Restore the original pathname BEFORE calling next() so downstream\r\n // middleware sees the full URL — not the stripped mount-relative path.\r\n // Matches h3 v2's own sub-app middleware pattern where the restore\r\n // happens inside the next() callback, not after it returns.\r\n restoreOriginalPath();\r\n return next();\r\n }\r\n return result;\r\n } catch (err) {\r\n // Log 500s to the server console so they're debuggable, and respond\r\n // with JSON instead of the default HTML error page so clients can\r\n // surface error messages. This only applies to routes mounted under\r\n // the framework prefix (or middleware mounted at `/`, for which we\r\n // still want visibility).\r\n const reqPath = originalPathname ?? event.url?.pathname ?? \"\";\r\n const e = err as any;\r\n const status =\r\n typeof e?.statusCode === \"number\"\r\n ? e.statusCode\r\n : typeof e?.status === \"number\"\r\n ? e.status\r\n : 500;\r\n if (isClientAbortError(err, event)) {\r\n debugClientAbort({ method: event.method, route: reqPath, error: err });\r\n return undefined;\r\n }\r\n logFrameworkRouteError({\r\n method: event.method,\r\n route: reqPath,\r\n status,\r\n error: err,\r\n });\r\n // Forward 5xx to server-side Sentry — Nitro's own `error` hook may not\r\n // fire here because we convert the throw into a normal JSON response,\r\n // and a console.error alone is invisible in deployed environments.\r\n // 4xx are user-input errors (validation, auth) and aren't worth\r\n // alerting on. Lazy-loaded so the framework-request-handler module\r\n // doesn't pull @sentry/node into bundles that don't need it.\r\n if (status >= 500) {\r\n // Static `import` would create a cycle (sentry.ts imports auth.ts\r\n // which imports… eventually, framework-request-handler.ts).\r\n import(\"./sentry.js\")\r\n .then(({ captureRouteError, isServerSentryEnabled }) => {\r\n if (!isServerSentryEnabled()) return;\r\n captureRouteError(err, {\r\n route: reqPath,\r\n method: event.method,\r\n userAgent: (() => {\r\n try {\r\n return event.headers?.get(\"user-agent\") ?? undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n })(),\r\n });\r\n })\r\n .catch(() => {\r\n // Sentry is observability — never let it break a response path.\r\n });\r\n }\r\n try {\r\n setResponseStatus(event, status);\r\n setResponseHeader(event, \"content-type\", \"application/json\");\r\n } catch {\r\n // Response already sent — best effort.\r\n }\r\n return {\r\n error: e?.message || \"Internal server error\",\r\n // Only surface the stack to clients when explicitly enabled.\r\n // `NODE_ENV !== \"production\"` was unsafe — preview deploys and\r\n // any host that forgets to set NODE_ENV=production leaked stack\r\n // traces (file paths, dependency versions, internal route\r\n // topology) to anonymous callers. Operators who want stacks in\r\n // dev set `AGENT_NATIVE_DEBUG_ERRORS=1` explicitly.\r\n ...(status >= 500 &&\r\n process.env.AGENT_NATIVE_DEBUG_ERRORS === \"1\" &&\r\n e?.stack\r\n ? { stack: e.stack }\r\n : {}),\r\n };\r\n } finally {\r\n // Restore the original pathname so downstream middleware sees the\r\n // full URL.\r\n restoreOriginalPath();\r\n }\r\n };\r\n\r\n if (options.prepend) {\r\n h3[\"~middleware\"].unshift(middleware);\r\n } else {\r\n h3[\"~middleware\"].push(middleware);\r\n }\r\n}\r\n\r\n/**\r\n * Auto-mount any default framework plugins that the template doesn't provide.\r\n *\r\n * Runs once per nitroApp on the first `getH3App()` call. Uses route-discovery\r\n * to find which default plugin stems are missing from `server/plugins/`, then\r\n * dynamically imports and mounts them. If a workspace core is present in the\r\n * ancestor chain, plugin slots the workspace core exports are mounted from\r\n * there instead of from @agent-native/core — this is the middle layer of the\r\n * three-layer inheritance model (app local > workspace core > framework).\r\n */\r\nasync function bootstrapDefaultPlugins(nitroApp: any): Promise<void> {\r\n IN_BOOTSTRAP.add(nitroApp);\r\n try {\r\n const cwd = process.cwd();\r\n const discoveredMissing = await getMissingDefaultPlugins(cwd);\r\n const provided = nitroApp[PROVIDED_PLUGIN_STEMS_KEY] as\r\n | Set<string>\r\n | undefined;\r\n const missing = provided\r\n ? discoveredMissing.filter((stem) => !provided.has(stem))\r\n : discoveredMissing;\r\n if (missing.length === 0) return;\r\n\r\n // Lazy import to avoid circular dependency at module load time\r\n const serverModule = await import(\"./index.js\");\r\n const terminalModule = await import(\"../terminal/terminal-plugin.js\");\r\n const integrationsModule = await import(\"../integrations/plugin.js\");\r\n const contextXrayModule = await import(\"../agent/context-xray/plugin.js\");\r\n const observationalMemoryModule =\r\n await import(\"../agent/observational-memory/plugin.js\");\r\n const orgModule = await import(\"../org/plugin.js\");\r\n const onboardingModule = await import(\"../onboarding/plugin.js\");\r\n\r\n const frameworkImpls: Record<\r\n string,\r\n ((nitroApp: any) => void | Promise<void>) | undefined\r\n > = {\r\n \"agent-chat\": (serverModule as any).defaultAgentChatPlugin,\r\n auth: (serverModule as any).defaultAuthPlugin,\r\n \"context-xray\": (contextXrayModule as any).defaultContextXrayPlugin,\r\n \"core-routes\": (serverModule as any).defaultCoreRoutesPlugin,\r\n integrations: (integrationsModule as any).defaultIntegrationsPlugin,\r\n \"observational-memory\": (observationalMemoryModule as any)\r\n .defaultObservationalMemoryPlugin,\r\n onboarding: (onboardingModule as any).defaultOnboardingPlugin,\r\n org: (orgModule as any).defaultOrgPlugin,\r\n resources: (serverModule as any).defaultResourcesPlugin,\r\n sentry: (serverModule as any).defaultSentryPlugin,\r\n terminal: (terminalModule as any).defaultTerminalPlugin,\r\n };\r\n\r\n // Workspace core layer: if the app is inside an enterprise monorepo with\r\n // `agent-native.workspaceCore` configured, pull in any plugin slots the\r\n // workspace core exports from its server entry. We dynamically import the\r\n // workspace core package at runtime.\r\n let workspaceImpls: Record<\r\n string,\r\n ((nitroApp: any) => void | Promise<void>) | undefined\r\n > = {};\r\n try {\r\n const { getWorkspaceCoreExports } =\r\n await import(\"../deploy/workspace-core.js\");\r\n const ws = await getWorkspaceCoreExports(cwd);\r\n if (ws && Object.keys(ws.plugins).length > 0) {\r\n try {\r\n const wsServerModule = await loadWorkspaceCoreServer(\r\n ws.packageName,\r\n ws.packageDir,\r\n );\r\n for (const [slot, exportName] of Object.entries(ws.plugins)) {\r\n if (!exportName) continue;\r\n const impl = (wsServerModule as any)[exportName];\r\n if (typeof impl === \"function\") {\r\n workspaceImpls[slot] = impl;\r\n }\r\n }\r\n if (process.env.DEBUG) {\r\n console.log(\r\n `[agent-native] Workspace core ${ws.packageName} provides plugin slots: ${Object.keys(workspaceImpls).join(\", \")}`,\r\n );\r\n }\r\n } catch (e) {\r\n const msg = (e as Error).message ?? \"\";\r\n // Common cause: workspace-core's package.json points \"./server\"\r\n // at a TS source file (the scaffold default), but Node can't\r\n // resolve relative `.js` imports inside it without a TS loader.\r\n // Tell the user to compile to dist/ rather than just dumping the\r\n // raw resolution error.\r\n const tsLoadHint = /\\.js' imported from .*\\.ts/.test(msg)\r\n ? \" — workspace-core src is TypeScript but isn't being compiled. \" +\r\n \"Run `pnpm --filter \" +\r\n ws.packageName +\r\n \" build` and point its `./server` export at dist/server/index.js.\"\r\n : \"\";\r\n console.warn(\r\n `[agent-native] Failed to load workspace core ${ws.packageName}/server: ${msg}${tsLoadHint}`,\r\n );\r\n }\r\n }\r\n } catch {\r\n // Workspace shared package isn't available (e.g. running on an edge\r\n // runtime without fs). Silently fall through to framework defaults.\r\n }\r\n\r\n if (process.env.DEBUG)\r\n console.log(\r\n `[agent-native] Auto-mounting ${missing.length} default plugin(s): ${missing.join(\", \")}`,\r\n );\r\n\r\n for (const stem of missing) {\r\n // Prefer workspace-core impl over framework default when both exist.\r\n const impl = workspaceImpls[stem] ?? frameworkImpls[stem];\r\n if (typeof impl === \"function\") {\r\n try {\r\n await impl(nitroApp);\r\n } catch (e) {\r\n console.warn(\r\n `[agent-native] Failed to auto-mount default plugin ${stem}:`,\r\n (e as Error).message,\r\n );\r\n captureError(e, {\r\n route: \"default-plugin-bootstrap\",\r\n tags: { phase: \"default-plugin-bootstrap\", plugin: stem },\r\n });\r\n }\r\n }\r\n }\r\n } finally {\r\n IN_BOOTSTRAP.delete(nitroApp);\r\n }\r\n}\r\n\r\n/**\r\n * Load a workspace-core's `/server` entry, transparently handling TS source.\r\n *\r\n * The scaffolded workspace-core template ships TS sources without a build\r\n * step (exports point at `./src/server/index.ts`), so plain `await import()`\r\n * blows up the moment Node hits a relative `.js` import inside (the standard\r\n * TS ESM convention) — and even before that, Node may resolve the package\r\n * relative to the framework's own location rather than the user's monorepo.\r\n *\r\n * We try Node's plain `import()` first (fastest path when the user has\r\n * compiled to dist/) and fall through to jiti on any error. jiti is anchored\r\n * to a real file inside the workspace-core's directory, so its module\r\n * resolution starts in the right node_modules tree (handles pnpm hoisting\r\n * and linked workspaces) AND handles TS source files + `.js` → `.ts` ESM\r\n * extension remapping.\r\n *\r\n * Edge runtimes without `fs` won't be able to load jiti at all; the outer\r\n * try/catch silently falls through to framework defaults in that case.\r\n */\r\nexport async function loadWorkspaceCoreServer(\r\n packageName: string,\r\n packageDir: string,\r\n): Promise<any> {\r\n let firstErr: unknown;\r\n try {\r\n return await import(/* @vite-ignore */ `${packageName}/server`);\r\n } catch (e) {\r\n firstErr = e;\r\n }\r\n\r\n try {\r\n const { createJiti } = await import(\"jiti\");\r\n const { pathToFileURL } = await import(\"node:url\");\r\n const path = await import(\"node:path\");\r\n // Anchor jiti to a real file inside the workspace-core package so its\r\n // module resolution starts in the right node_modules tree (handles pnpm\r\n // hoisting and linked workspaces).\r\n const anchor = pathToFileURL(\r\n path.join(packageDir, \"package.json\"),\r\n ).toString();\r\n const jiti = createJiti(anchor, { interopDefault: true });\r\n return await jiti.import(`${packageName}/server`);\r\n } catch (jitiErr) {\r\n // jiti also failed — rethrow the original Node error since it's usually\r\n // more informative about *why* the package wasn't resolvable.\r\n throw firstErr ?? jitiErr;\r\n }\r\n}\r\n\r\nexport { FRAMEWORK_PREFIX };\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jami-studio/core",
|
|
3
|
-
"version": "0.92.
|
|
3
|
+
"version": "0.92.22",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/studio-jami/jami-studio#readme",
|
|
6
6
|
"bugs": {
|