@jami-studio/core 0.92.18 → 0.92.19

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.
@@ -1,5 +1,11 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.92.19
4
+
5
+ ### Patch Changes
6
+
7
+ - 33aeaec: Fix Neon on Cloudflare Workers: workerd forbids reusing I/O objects across requests, so pooled Neon WebSocket clients created by one request and handed to a later one threw "Cannot perform I/O on behalf of a different request", hung the worker, and returned 500s (first seen on auth get-session under wrangler pages dev). Both Neon paths (raw DbExec in client.ts and the Drizzle pool in create-get-db.ts) now route plain queries over Neon's stateless HTTP transport (poolQueryViaFetch) on workerd and cap WebSocket clients (still used for transactions) to a single use so they are never reused across requests.
8
+
3
9
  ## 0.92.18
4
10
 
5
11
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.92.18",
3
+ "version": "0.92.19",
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": {
@@ -10,6 +10,8 @@
10
10
  */
11
11
  import path from "path";
12
12
 
13
+ import { isCloudflareRuntime } from "../shared/runtime.js";
14
+
13
15
  const recyclingPostgresPools = new WeakSet<object>();
14
16
  const loggedNeonPools = new WeakSet<object>();
15
17
 
@@ -1079,12 +1081,25 @@ async function createDbExecInternal(
1079
1081
  // analytics worker stalls right after model resolution and never claims.
1080
1082
  // HTTP-per-query (poolQueryViaFetch) has no persistent socket to die; the
1081
1083
  // foreground keeps the WebSocket pool. See the bg-fn execute branch below.
1082
- const bgHttp = isBackgroundFunctionPoolContext();
1084
+ // Cloudflare Workers (workerd) additionally forbids reusing I/O objects
1085
+ // across requests — a pooled WebSocket created in request A and handed
1086
+ // to request B throws "Cannot perform I/O on behalf of a different
1087
+ // request" and hangs the worker — so workerd always takes the stateless
1088
+ // HTTP path too.
1089
+ const bgHttp =
1090
+ isBackgroundFunctionPoolContext() || isCloudflareRuntime();
1083
1091
  if (bgHttp) {
1084
1092
  (neonConfig as { poolQueryViaFetch?: boolean }).poolQueryViaFetch =
1085
1093
  true;
1086
1094
  }
1087
- const pool = new Pool({ connectionString: url, max: neonPoolMax() });
1095
+ // On workerd, transactions still use pool.connect() WebSocket clients —
1096
+ // cap each client to a single use so a socket created in one request is
1097
+ // destroyed on release instead of being handed to a later request.
1098
+ const pool = new Pool({
1099
+ connectionString: url,
1100
+ max: neonPoolMax(),
1101
+ ...(isCloudflareRuntime() ? { maxUses: 1 } : {}),
1102
+ });
1088
1103
  attachNeonPoolErrorLogger(pool);
1089
1104
  if (trackSingletonResources) _neonPool = pool;
1090
1105
  async function queryNeonClient(
@@ -22,6 +22,7 @@ import {
22
22
  retryOnConnectionError,
23
23
  dbOpTimeoutMs,
24
24
  } from "./client.js";
25
+ import { isCloudflareRuntime } from "../shared/runtime.js";
25
26
 
26
27
  // Lazy driver loaders — cached promises so dynamic import only runs once.
27
28
  let _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;
@@ -38,7 +39,9 @@ function getPgDrizzle() {
38
39
  return _pgDrizzle;
39
40
  }
40
41
 
41
- let _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;
42
+ let _neonServerlessDrizzle:
43
+ | Promise<{ drizzle: any; Pool: any; neonConfig: any }>
44
+ | undefined;
42
45
  function getNeonServerlessDrizzle() {
43
46
  if (!_neonServerlessDrizzle) {
44
47
  _neonServerlessDrizzle = Promise.all([
@@ -47,6 +50,7 @@ function getNeonServerlessDrizzle() {
47
50
  ]).then(([drizzleMod, neonMod]) => ({
48
51
  drizzle: drizzleMod.drizzle,
49
52
  Pool: neonMod.Pool,
53
+ neonConfig: neonMod.neonConfig,
50
54
  }));
51
55
  }
52
56
  return _neonServerlessDrizzle;
@@ -465,19 +469,31 @@ export function createGetDb<T extends Record<string, unknown>>(schema: T) {
465
469
 
466
470
  if (dialect === "postgres") {
467
471
  if (isNeonUrl(url)) {
468
- _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {
469
- const rawPool = new Pool({
470
- connectionString: url,
471
- max: neonPoolMax(),
472
- });
473
- attachNeonPoolErrorLogger(rawPool);
474
- // Wrap the pool with the resilience layer so Drizzle queries get the
475
- // same withDbTimeout + retryOnConnectionError protection as the raw
476
- // DbExec path in client.ts. Reads retry freely; writes only retry on
477
- // acquire-timeout (pre-send) errors to avoid double-execution.
478
- const pool = buildResilientNeonPool(rawPool);
479
- _db = drizzle(pool, { schema });
480
- });
472
+ _dbReady = getNeonServerlessDrizzle().then(
473
+ ({ drizzle, Pool, neonConfig }) => {
474
+ // Cloudflare Workers (workerd) forbids reusing I/O objects across
475
+ // requests — a WebSocket client cached in the pool by request A and
476
+ // handed to request B throws "Cannot perform I/O on behalf of a
477
+ // different request" and hangs the worker. Route plain queries over
478
+ // Neon's stateless HTTP transport (poolQueryViaFetch) and cap each
479
+ // WebSocket client (used for transactions) to a single use so it is
480
+ // never reused across requests.
481
+ const cfWorker = isCloudflareRuntime();
482
+ if (cfWorker) neonConfig.poolQueryViaFetch = true;
483
+ const rawPool = new Pool({
484
+ connectionString: url,
485
+ max: neonPoolMax(),
486
+ ...(cfWorker ? { maxUses: 1 } : {}),
487
+ });
488
+ attachNeonPoolErrorLogger(rawPool);
489
+ // Wrap the pool with the resilience layer so Drizzle queries get the
490
+ // same withDbTimeout + retryOnConnectionError protection as the raw
491
+ // DbExec path in client.ts. Reads retry freely; writes only retry on
492
+ // acquire-timeout (pre-send) errors to avoid double-execution.
493
+ const pool = buildResilientNeonPool(rawPool);
494
+ _db = drizzle(pool, { schema });
495
+ },
496
+ );
481
497
  } else {
482
498
  _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {
483
499
  // pgPoolOptions caps the pool to a small size on serverless so
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
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
@@ -9,6 +9,7 @@
9
9
  * Cloudflare Workers, edge) without failing on missing native deps.
10
10
  */
11
11
  import path from "path";
12
+ import { isCloudflareRuntime } from "../shared/runtime.js";
12
13
  const recyclingPostgresPools = new WeakSet();
13
14
  const loggedNeonPools = new WeakSet();
14
15
  /** Read the request-scoped Cloudflare binding without requiring every
@@ -909,12 +910,24 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
909
910
  // analytics worker stalls right after model resolution and never claims.
910
911
  // HTTP-per-query (poolQueryViaFetch) has no persistent socket to die; the
911
912
  // foreground keeps the WebSocket pool. See the bg-fn execute branch below.
912
- const bgHttp = isBackgroundFunctionPoolContext();
913
+ // Cloudflare Workers (workerd) additionally forbids reusing I/O objects
914
+ // across requests — a pooled WebSocket created in request A and handed
915
+ // to request B throws "Cannot perform I/O on behalf of a different
916
+ // request" and hangs the worker — so workerd always takes the stateless
917
+ // HTTP path too.
918
+ const bgHttp = isBackgroundFunctionPoolContext() || isCloudflareRuntime();
913
919
  if (bgHttp) {
914
920
  neonConfig.poolQueryViaFetch =
915
921
  true;
916
922
  }
917
- const pool = new Pool({ connectionString: url, max: neonPoolMax() });
923
+ // On workerd, transactions still use pool.connect() WebSocket clients —
924
+ // cap each client to a single use so a socket created in one request is
925
+ // destroyed on release instead of being handed to a later request.
926
+ const pool = new Pool({
927
+ connectionString: url,
928
+ max: neonPoolMax(),
929
+ ...(isCloudflareRuntime() ? { maxUses: 1 } : {}),
930
+ });
918
931
  attachNeonPoolErrorLogger(pool);
919
932
  if (trackSingletonResources)
920
933
  _neonPool = pool;
@@ -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\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 const bgHttp = isBackgroundFunctionPoolContext();\r\n if (bgHttp) {\r\n (neonConfig as { poolQueryViaFetch?: boolean }).poolQueryViaFetch =\r\n true;\r\n }\r\n const pool = new Pool({ connectionString: url, max: neonPoolMax() });\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 // 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":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAmDzD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE,GAAG,OAAO,IAAI,CAyFd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,CAAC,SAAS;IACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CAC3D,EACD,MAAM,EAAE,CAAC,GAAG,CAAC,CAyDd;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C;AA0BD;;;;;;;;;;;;;;;;GAgBG;AACH,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAC3C,EAAE,SAAS;IAAE,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,EACjE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,EAAE,CAsG7E;AAKD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SA+HpD,cAAc,CAAC,CAAC,CAAC,CASpC"}
1
+ {"version":3,"file":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAuDzD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE,GAAG,OAAO,IAAI,CAyFd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,CAAC,SAAS;IACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CAC3D,EACD,MAAM,EAAE,CAAC,GAAG,CAAC,CAyDd;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C;AA0BD;;;;;;;;;;;;;;;;GAgBG;AACH,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAC3C,EAAE,SAAS;IAAE,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,EACjE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,EAAE,CAsG7E;AAKD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SA2IpD,cAAc,CAAC,CAAC,CAAC,CASpC"}
@@ -1,6 +1,7 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { drizzle as drizzleD1 } from "drizzle-orm/d1";
3
3
  import { getDialect, getCloudflareD1Binding, getDatabaseUrl, getDatabaseAuthToken, isLocalSqliteUrl, isPgliteUrl, isConnectionError, getPgliteClient, loadPgliteDrizzle, prepareLocalSqliteUrl, sqliteFilenameFromUrl, pgPoolOptions, neonPoolMax, attachNeonPoolErrorLogger, withDbTimeout, retryOnConnectionError, dbOpTimeoutMs, } from "./client.js";
4
+ import { isCloudflareRuntime } from "../shared/runtime.js";
4
5
  // Lazy driver loaders — cached promises so dynamic import only runs once.
5
6
  let _pgDrizzle;
6
7
  function getPgDrizzle() {
@@ -24,6 +25,7 @@ function getNeonServerlessDrizzle() {
24
25
  ]).then(([drizzleMod, neonMod]) => ({
25
26
  drizzle: drizzleMod.drizzle,
26
27
  Pool: neonMod.Pool,
28
+ neonConfig: neonMod.neonConfig,
27
29
  }));
28
30
  }
29
31
  return _neonServerlessDrizzle;
@@ -374,10 +376,21 @@ export function createGetDb(schema) {
374
376
  }
375
377
  if (dialect === "postgres") {
376
378
  if (isNeonUrl(url)) {
377
- _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {
379
+ _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool, neonConfig }) => {
380
+ // Cloudflare Workers (workerd) forbids reusing I/O objects across
381
+ // requests — a WebSocket client cached in the pool by request A and
382
+ // handed to request B throws "Cannot perform I/O on behalf of a
383
+ // different request" and hangs the worker. Route plain queries over
384
+ // Neon's stateless HTTP transport (poolQueryViaFetch) and cap each
385
+ // WebSocket client (used for transactions) to a single use so it is
386
+ // never reused across requests.
387
+ const cfWorker = isCloudflareRuntime();
388
+ if (cfWorker)
389
+ neonConfig.poolQueryViaFetch = true;
378
390
  const rawPool = new Pool({
379
391
  connectionString: url,
380
392
  max: neonPoolMax(),
393
+ ...(cfWorker ? { maxUses: 1 } : {}),
381
394
  });
382
395
  attachNeonPoolErrorLogger(rawPool);
383
396
  // Wrap the pool with the resilience layer so Drizzle queries get the
@@ -1 +1 @@
1
- {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\r\n\r\nimport { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\r\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\r\n\r\nimport {\r\n getDialect,\r\n getCloudflareD1Binding,\r\n getDatabaseUrl,\r\n getDatabaseAuthToken,\r\n isLocalSqliteUrl,\r\n isPgliteUrl,\r\n isConnectionError,\r\n getPgliteClient,\r\n loadPgliteDrizzle,\r\n prepareLocalSqliteUrl,\r\n sqliteFilenameFromUrl,\r\n pgPoolOptions,\r\n neonPoolMax,\r\n attachNeonPoolErrorLogger,\r\n withDbTimeout,\r\n retryOnConnectionError,\r\n dbOpTimeoutMs,\r\n} from \"./client.js\";\r\n\r\n// Lazy driver loaders — cached promises so dynamic import only runs once.\r\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\r\nfunction getPgDrizzle() {\r\n if (!_pgDrizzle) {\r\n _pgDrizzle = Promise.all([\r\n import(\"drizzle-orm/postgres-js\"),\r\n import(\"postgres\"),\r\n ]).then(([drizzleMod, pgMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n postgres: pgMod.default,\r\n }));\r\n }\r\n return _pgDrizzle;\r\n}\r\n\r\nlet _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;\r\nfunction getNeonServerlessDrizzle() {\r\n if (!_neonServerlessDrizzle) {\r\n _neonServerlessDrizzle = Promise.all([\r\n import(\"drizzle-orm/neon-serverless\"),\r\n import(\"@neondatabase/serverless\"),\r\n ]).then(([drizzleMod, neonMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n Pool: neonMod.Pool,\r\n }));\r\n }\r\n return _neonServerlessDrizzle;\r\n}\r\n\r\n/**\r\n * Returns true when a SQL string starts with a SELECT-class verb.\r\n * Used by the Neon resilience wrapper to decide retry safety:\r\n * - reads (SELECT) → retryable on any connection-class error\r\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\r\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\r\n * connect timeout). Post-send write failures must propagate to the caller\r\n * to avoid double-execution.\r\n */\r\nexport function isSqlRead(sql: string): boolean {\r\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\r\n}\r\n\r\n/**\r\n * Wraps a @neondatabase/serverless Pool so every query goes through\r\n * the same withDbTimeout + retryOnConnectionError resilience that the\r\n * raw DbExec path in client.ts uses. This protects Drizzle queries\r\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\r\n * in client.ts (~lines 378–408).\r\n *\r\n * Retry-safety rule (prevents double-execution on writes):\r\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\r\n * - Writes: only retry when the error occurred during connection acquire\r\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\r\n * sent). Post-send failures on writes are rethrown immediately.\r\n *\r\n * Transactions: we do NOT wrap individual queries inside a drizzle\r\n * transaction — drizzle-neon-serverless manages the session itself, so\r\n * interposing a per-query client acquire/release would break the sticky\r\n * connection the transaction needs. The pool-level error logger still fires\r\n * on idle-client drops inside transactions.\r\n */\r\nexport function buildResilientNeonPool(pool: {\r\n connect(): Promise<any>;\r\n query(\r\n sql: string,\r\n args?: any[],\r\n ): Promise<{ rows: unknown[]; rowCount?: number }>;\r\n end(): Promise<void>;\r\n on(event: string, listener: (...args: any[]) => void): unknown;\r\n}): typeof pool {\r\n // Preserve all original pool methods and properties; only override `connect`\r\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\r\n // when it calls pool.query() directly, e.g. outside a transaction).\r\n const resilientQuery = async (\r\n sql: string,\r\n args?: any[],\r\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\r\n const isRead = isSqlRead(sql);\r\n\r\n const runAttempt = async (): Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }> => {\r\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\r\n // before the query ever starts, so a query-level timeout alone won't help.\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c: any) => {\r\n // If we already gave up on this slot, immediately release it so\r\n // the scarce pool connection isn't leaked.\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\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 withDbTimeout(\r\n \"query\",\r\n () =>\r\n client.query(sql, args ?? []) as Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }>,\r\n dbOpTimeoutMs(),\r\n () => releaseClient(true),\r\n );\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\r\n if (isRead) {\r\n // Reads: retry on any connection-class error (safe — no side effects).\r\n return retryOnConnectionError(runAttempt);\r\n }\r\n\r\n // Writes: attempt once. If the acquire itself times out (error occurs\r\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\r\n // isConnectionError() recognises → retry is safe. Any error that surfaces\r\n // AFTER the statement was sent must propagate immediately to avoid\r\n // double-execution.\r\n try {\r\n return await runAttempt();\r\n } catch (err) {\r\n // acquire-timeout fires before the statement → safe to retry once.\r\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\r\n return runAttempt();\r\n }\r\n throw err;\r\n }\r\n };\r\n\r\n // Return a proxy so every pool property/method is forwarded as-is, but\r\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\r\n // calls pool.connect() for transactions and pool.query() for simple queries.\r\n return new Proxy(pool, {\r\n get(target, prop) {\r\n if (prop === \"query\") return resilientQuery;\r\n const val = (target as any)[prop];\r\n return typeof val === \"function\" ? val.bind(target) : val;\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres\r\n * path get the same withDbTimeout + retryOnConnectionError protection as\r\n * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and\r\n * the Drizzle Neon pool above). Without this, one hung query on a BYO\r\n * Postgres deployment stalls its request forever.\r\n *\r\n * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —\r\n * awaited directly for row-object results or via `.values()` for row-array\r\n * results — plus `client.begin(...)` for transactions. We interpose on\r\n * `unsafe` with a lazy thenable that re-issues the query per retry attempt,\r\n * and leave transactions unwrapped (same rule as the Neon wrapper: the\r\n * driver manages the sticky connection inside `begin`).\r\n *\r\n * Retry-safety mirrors buildResilientNeonPool: reads retry freely on\r\n * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js\r\n * raises it before the statement is ever sent), so writes can't\r\n * double-execute.\r\n */\r\nexport function buildResilientPostgresJsClient<\r\n T extends {\r\n unsafe(query: string, params?: any[], options?: any): any;\r\n },\r\n>(client: T): T {\r\n const wrapUnsafe = (query: string, params?: any[], options?: any) => {\r\n const isRead = isSqlRead(query);\r\n\r\n const runAttempt = (mode: \"rows\" | \"values\") => async (): Promise<any> => {\r\n const pending = client.unsafe(query, params, options);\r\n return withDbTimeout(\r\n \"query\",\r\n async () => (mode === \"values\" ? pending.values() : pending),\r\n dbOpTimeoutMs(),\r\n () => {\r\n // Best-effort cancel so the timed-out statement doesn't keep\r\n // occupying one of the (small, serverless-capped) pool slots.\r\n try {\r\n pending.cancel?.();\r\n } catch {\r\n // ignore — cancellation is advisory\r\n }\r\n },\r\n );\r\n };\r\n\r\n const execute = async (mode: \"rows\" | \"values\"): Promise<any> => {\r\n if (isRead) return retryOnConnectionError(runAttempt(mode));\r\n try {\r\n return await runAttempt(mode)();\r\n } catch (err) {\r\n // Connect timeout fires before the statement is sent → one retry is\r\n // safe even for writes.\r\n if (\r\n isConnectionError(err) &&\r\n (err as any)?.code === \"CONNECT_TIMEOUT\"\r\n ) {\r\n return runAttempt(mode)();\r\n }\r\n throw err;\r\n }\r\n };\r\n\r\n // Lazy thenable mirroring the slice of postgres.js's PendingQuery\r\n // surface that Drizzle uses: `await q` or `await q.values()`.\r\n return {\r\n then: (onFulfilled?: any, onRejected?: any) =>\r\n execute(\"rows\").then(onFulfilled, onRejected),\r\n catch: (onRejected?: any) => execute(\"rows\").catch(onRejected),\r\n finally: (onFinally?: any) => execute(\"rows\").finally(onFinally),\r\n values: () => execute(\"values\"),\r\n };\r\n };\r\n\r\n return new Proxy(client as any, {\r\n get(target, prop) {\r\n if (prop === \"unsafe\") return wrapUnsafe;\r\n const val = target[prop];\r\n return typeof val === \"function\" ? val.bind(target) : val;\r\n },\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\r\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\r\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\r\n * port 5432 that can't negotiate around Neon's wake-up window — every\r\n * request after an idle period 502s. `@neondatabase/serverless` rides\r\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\r\n * transparently, supports transactions, and works in every serverless\r\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\r\n */\r\nexport function isNeonUrl(url: string): boolean {\r\n // Must match neon.tech followed by port/path/query/end — include `?` so\r\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\r\n // or path) still route through the serverless driver.\r\n return /\\.neon\\.tech([:/?]|$)/.test(url);\r\n}\r\n\r\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\r\nfunction getLibsqlWebDrizzle() {\r\n if (!_libsqlWebDrizzle) {\r\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\r\n drizzle: mod.drizzle,\r\n }));\r\n }\r\n return _libsqlWebDrizzle;\r\n}\r\n\r\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\r\nfunction getBetterSqliteDrizzle() {\r\n if (!_betterSqliteDrizzle) {\r\n _betterSqliteDrizzle = Promise.all([\r\n import(\"drizzle-orm/better-sqlite3\"),\r\n import(\"better-sqlite3\"),\r\n ]).then(([drizzleMod, sqliteMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n Database: sqliteMod.default,\r\n }));\r\n }\r\n return _betterSqliteDrizzle;\r\n}\r\n\r\n/**\r\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\r\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\r\n * an async callback throws \"Transaction function cannot return a promise\".\r\n *\r\n * This wrapper bypasses the native path by issuing raw SQL control statements\r\n * on the single better-sqlite3 connection, which is safe because:\r\n * - better-sqlite3 is single-connection (no concurrency inside one process)\r\n * - the framework serialises all async work through one Database instance\r\n *\r\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\r\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\r\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\r\n *\r\n * The patched transaction also patches the tx object it passes to the callback\r\n * so that nested async calls (tx.transaction(async …)) work recursively.\r\n */\r\n/** @internal exported for the async-tx concurrency spec */\r\nexport function patchBetterSqliteTransactions<\r\n DB extends { transaction: (...args: any[]) => any; session: any },\r\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\r\n let savepointSeq = 0;\r\n // Concurrent TOP-LEVEL async transactions on the single better-sqlite3\r\n // connection must not interleave: a second transaction starting while the\r\n // first is open would see `inTransaction` and open a savepoint INSIDE the\r\n // first transaction, which then commits out from under it (\"no such\r\n // savepoint\"). Serialize top-level transactions through a promise chain;\r\n // genuine same-task nesting (tx.transaction or db.transaction inside an\r\n // open callback) is detected via AsyncLocalStorage and keeps the direct\r\n // savepoint path so it cannot deadlock on the queue.\r\n const txContext = new AsyncLocalStorage<boolean>();\r\n let txChain: Promise<unknown> = Promise.resolve();\r\n\r\n function makeAsyncTransaction(\r\n originalTransaction: (...args: any[]) => any,\r\n ): (...args: any[]) => Promise<unknown> {\r\n async function runTransactionBody(\r\n cb: (tx: unknown) => unknown,\r\n ): Promise<unknown> {\r\n // Extract the drizzle tx proxy synchronously — call the original with a\r\n // stub that captures the tx arg then immediately throws a sentinel so\r\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\r\n // The sentinel is caught here and never propagates further.\r\n let capturedTx: unknown;\r\n try {\r\n originalTransaction((tx: unknown) => {\r\n capturedTx = tx;\r\n throw _EXTRACT_TX;\r\n });\r\n } catch (e) {\r\n if (e !== _EXTRACT_TX) throw e;\r\n }\r\n\r\n // Recursively patch the nested tx so tx.transaction(async …) also works.\r\n const tx = capturedTx as { transaction: (...a: any[]) => any };\r\n if (tx && typeof tx.transaction === \"function\") {\r\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\r\n }\r\n\r\n const nested = sqlite.inTransaction;\r\n if (nested) {\r\n const sp = `sp_async_${++savepointSeq}`;\r\n sqlite.exec(`SAVEPOINT ${sp}`);\r\n let released = false;\r\n try {\r\n const result = await cb(tx);\r\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\r\n released = true;\r\n return result;\r\n } catch (err) {\r\n if (!released) {\r\n try {\r\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\r\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\r\n } catch {\r\n /* ignore: connection may already be in an error state */\r\n }\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\r\n sqlite.exec(\"BEGIN IMMEDIATE\");\r\n let committed = false;\r\n try {\r\n const result = await cb(tx);\r\n sqlite.exec(\"COMMIT\");\r\n committed = true;\r\n return result;\r\n } catch (err) {\r\n if (!committed) {\r\n try {\r\n sqlite.exec(\"ROLLBACK\");\r\n } catch {\r\n /* swallow: connection may already be unusable */\r\n }\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n return function asyncTransaction(\r\n cb: (tx: unknown) => unknown,\r\n ): Promise<unknown> {\r\n if (txContext.getStore()) {\r\n // Same-task nesting: run directly (savepoint path inside the open\r\n // transaction). Queueing here would deadlock behind the outer tx.\r\n return runTransactionBody(cb);\r\n }\r\n const run = () => txContext.run(true, () => runTransactionBody(cb));\r\n const next = txChain.then(run, run);\r\n txChain = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n }\r\n\r\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\r\n return db;\r\n}\r\n\r\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\r\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\r\n\r\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\r\n let _db: any;\r\n let _dbReady: Promise<any> | undefined;\r\n\r\n function startInit(): Promise<any> {\r\n if (_dbReady) return _dbReady;\r\n\r\n const url = getDatabaseUrl(\"file:./data/app.db\");\r\n const dialect = getDialect();\r\n\r\n // D1 only if dialect detected it (DATABASE_URL takes priority)\r\n if (dialect === \"d1\") {\r\n const d1 = getCloudflareD1Binding() as\r\n | Parameters<typeof drizzleD1>[0]\r\n | undefined;\r\n if (d1) {\r\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\r\n _dbReady = Promise.resolve(_db);\r\n return _dbReady;\r\n }\r\n }\r\n\r\n if (isPgliteUrl(url)) {\r\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\r\n const client = await getPgliteClient(url);\r\n _db = drizzle({ client, schema });\r\n });\r\n return _dbReady;\r\n }\r\n\r\n if (dialect === \"postgres\") {\r\n if (isNeonUrl(url)) {\r\n _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {\r\n const rawPool = new Pool({\r\n connectionString: url,\r\n max: neonPoolMax(),\r\n });\r\n attachNeonPoolErrorLogger(rawPool);\r\n // Wrap the pool with the resilience layer so Drizzle queries get the\r\n // same withDbTimeout + retryOnConnectionError protection as the raw\r\n // DbExec path in client.ts. Reads retry freely; writes only retry on\r\n // acquire-timeout (pre-send) errors to avoid double-execution.\r\n const pool = buildResilientNeonPool(rawPool);\r\n _db = drizzle(pool, { schema });\r\n });\r\n } else {\r\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\r\n // pgPoolOptions caps the pool to a small size on serverless so\r\n // concurrent frozen instances don't exhaust Neon/Postgres'\r\n // connection limit (\"Max client connections reached\").\r\n const client = postgres(url, pgPoolOptions(url));\r\n _db = drizzle(buildResilientPostgresJsClient(client), { schema });\r\n });\r\n }\r\n } else if (isLocalSqliteUrl(url)) {\r\n _dbReady = Promise.all([\r\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\r\n getBetterSqliteDrizzle(),\r\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\r\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\r\n // Wait up to 10s for a concurrent writer instead of failing fast\r\n // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.\r\n sqlite.pragma(\"busy_timeout = 10000\");\r\n sqlite.pragma(\"journal_mode = WAL\");\r\n const db = drizzle(sqlite, { schema });\r\n _db = patchBetterSqliteTransactions(db, sqlite);\r\n });\r\n } else {\r\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\r\n _db = drizzle({\r\n connection: { url, authToken: getDatabaseAuthToken() },\r\n schema,\r\n });\r\n });\r\n }\r\n return _dbReady;\r\n }\r\n\r\n /**\r\n * Create a lazy proxy that records property accesses and method calls,\r\n * then replays them on the real DB once init completes. Supports\r\n * Drizzle's chained API: db.select().from(table).where(...).\r\n *\r\n * When `.then()` is called (i.e. the chain is awaited), the proxy\r\n * awaits _dbReady and replays the recorded chain on the real _db.\r\n */\r\n function createLazyProxy(\r\n ready: Promise<any>,\r\n chain: Array<{ prop: string | symbol; args?: any[] }>,\r\n ): any {\r\n return new Proxy(function () {} as any, {\r\n get(_target, prop) {\r\n // When awaited, replay the chain on the real db\r\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\r\n const promise = ready.then(() => {\r\n let result: any = _db;\r\n for (const step of chain) {\r\n const val = result[step.prop];\r\n result =\r\n typeof val === \"function\" ? val.apply(result, step.args) : val;\r\n }\r\n return result;\r\n });\r\n return (promise as any)[prop].bind(promise);\r\n }\r\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\r\n // Property access (e.g. db.query) — record and return another proxy\r\n return createLazyProxy(ready, [...chain, { prop }]);\r\n },\r\n apply(_target, _thisArg, args) {\r\n // Method call (e.g. .from(table)) — record args and return another proxy\r\n if (chain.length === 0) return createLazyProxy(ready, []);\r\n const last = chain[chain.length - 1];\r\n const newChain = chain.slice(0, -1);\r\n newChain.push({ prop: last.prop, args });\r\n return createLazyProxy(ready, newChain);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\r\n * If the async init hasn't completed yet, returns a lazy Proxy that\r\n * records the Drizzle chain (select/from/where/etc.) and replays it\r\n * once the DB driver finishes loading. Since callers always `await`\r\n * the final result, the proxy is transparent.\r\n */\r\n function getDb(): LibSQLDatabase<T> {\r\n if (_db) return _db;\r\n startInit();\r\n if (_db) return _db;\r\n\r\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\r\n }\r\n\r\n return getDb;\r\n}\r\n"]}
1
+ {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\r\n\r\nimport { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\r\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\r\n\r\nimport {\r\n getDialect,\r\n getCloudflareD1Binding,\r\n getDatabaseUrl,\r\n getDatabaseAuthToken,\r\n isLocalSqliteUrl,\r\n isPgliteUrl,\r\n isConnectionError,\r\n getPgliteClient,\r\n loadPgliteDrizzle,\r\n prepareLocalSqliteUrl,\r\n sqliteFilenameFromUrl,\r\n pgPoolOptions,\r\n neonPoolMax,\r\n attachNeonPoolErrorLogger,\r\n withDbTimeout,\r\n retryOnConnectionError,\r\n dbOpTimeoutMs,\r\n} from \"./client.js\";\r\nimport { isCloudflareRuntime } from \"../shared/runtime.js\";\r\n\r\n// Lazy driver loaders — cached promises so dynamic import only runs once.\r\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\r\nfunction getPgDrizzle() {\r\n if (!_pgDrizzle) {\r\n _pgDrizzle = Promise.all([\r\n import(\"drizzle-orm/postgres-js\"),\r\n import(\"postgres\"),\r\n ]).then(([drizzleMod, pgMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n postgres: pgMod.default,\r\n }));\r\n }\r\n return _pgDrizzle;\r\n}\r\n\r\nlet _neonServerlessDrizzle:\r\n | Promise<{ drizzle: any; Pool: any; neonConfig: any }>\r\n | undefined;\r\nfunction getNeonServerlessDrizzle() {\r\n if (!_neonServerlessDrizzle) {\r\n _neonServerlessDrizzle = Promise.all([\r\n import(\"drizzle-orm/neon-serverless\"),\r\n import(\"@neondatabase/serverless\"),\r\n ]).then(([drizzleMod, neonMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n Pool: neonMod.Pool,\r\n neonConfig: neonMod.neonConfig,\r\n }));\r\n }\r\n return _neonServerlessDrizzle;\r\n}\r\n\r\n/**\r\n * Returns true when a SQL string starts with a SELECT-class verb.\r\n * Used by the Neon resilience wrapper to decide retry safety:\r\n * - reads (SELECT) → retryable on any connection-class error\r\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\r\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\r\n * connect timeout). Post-send write failures must propagate to the caller\r\n * to avoid double-execution.\r\n */\r\nexport function isSqlRead(sql: string): boolean {\r\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\r\n}\r\n\r\n/**\r\n * Wraps a @neondatabase/serverless Pool so every query goes through\r\n * the same withDbTimeout + retryOnConnectionError resilience that the\r\n * raw DbExec path in client.ts uses. This protects Drizzle queries\r\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\r\n * in client.ts (~lines 378–408).\r\n *\r\n * Retry-safety rule (prevents double-execution on writes):\r\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\r\n * - Writes: only retry when the error occurred during connection acquire\r\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\r\n * sent). Post-send failures on writes are rethrown immediately.\r\n *\r\n * Transactions: we do NOT wrap individual queries inside a drizzle\r\n * transaction — drizzle-neon-serverless manages the session itself, so\r\n * interposing a per-query client acquire/release would break the sticky\r\n * connection the transaction needs. The pool-level error logger still fires\r\n * on idle-client drops inside transactions.\r\n */\r\nexport function buildResilientNeonPool(pool: {\r\n connect(): Promise<any>;\r\n query(\r\n sql: string,\r\n args?: any[],\r\n ): Promise<{ rows: unknown[]; rowCount?: number }>;\r\n end(): Promise<void>;\r\n on(event: string, listener: (...args: any[]) => void): unknown;\r\n}): typeof pool {\r\n // Preserve all original pool methods and properties; only override `connect`\r\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\r\n // when it calls pool.query() directly, e.g. outside a transaction).\r\n const resilientQuery = async (\r\n sql: string,\r\n args?: any[],\r\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\r\n const isRead = isSqlRead(sql);\r\n\r\n const runAttempt = async (): Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }> => {\r\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\r\n // before the query ever starts, so a query-level timeout alone won't help.\r\n let acquireTimedOut = false;\r\n const client = await withDbTimeout(\r\n \"connect\",\r\n () =>\r\n pool.connect().then((c: any) => {\r\n // If we already gave up on this slot, immediately release it so\r\n // the scarce pool connection isn't leaked.\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\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 withDbTimeout(\r\n \"query\",\r\n () =>\r\n client.query(sql, args ?? []) as Promise<{\r\n rows: unknown[];\r\n rowCount?: number;\r\n }>,\r\n dbOpTimeoutMs(),\r\n () => releaseClient(true),\r\n );\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\r\n if (isRead) {\r\n // Reads: retry on any connection-class error (safe — no side effects).\r\n return retryOnConnectionError(runAttempt);\r\n }\r\n\r\n // Writes: attempt once. If the acquire itself times out (error occurs\r\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\r\n // isConnectionError() recognises → retry is safe. Any error that surfaces\r\n // AFTER the statement was sent must propagate immediately to avoid\r\n // double-execution.\r\n try {\r\n return await runAttempt();\r\n } catch (err) {\r\n // acquire-timeout fires before the statement → safe to retry once.\r\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\r\n return runAttempt();\r\n }\r\n throw err;\r\n }\r\n };\r\n\r\n // Return a proxy so every pool property/method is forwarded as-is, but\r\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\r\n // calls pool.connect() for transactions and pool.query() for simple queries.\r\n return new Proxy(pool, {\r\n get(target, prop) {\r\n if (prop === \"query\") return resilientQuery;\r\n const val = (target as any)[prop];\r\n return typeof val === \"function\" ? val.bind(target) : val;\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres\r\n * path get the same withDbTimeout + retryOnConnectionError protection as\r\n * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and\r\n * the Drizzle Neon pool above). Without this, one hung query on a BYO\r\n * Postgres deployment stalls its request forever.\r\n *\r\n * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —\r\n * awaited directly for row-object results or via `.values()` for row-array\r\n * results — plus `client.begin(...)` for transactions. We interpose on\r\n * `unsafe` with a lazy thenable that re-issues the query per retry attempt,\r\n * and leave transactions unwrapped (same rule as the Neon wrapper: the\r\n * driver manages the sticky connection inside `begin`).\r\n *\r\n * Retry-safety mirrors buildResilientNeonPool: reads retry freely on\r\n * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js\r\n * raises it before the statement is ever sent), so writes can't\r\n * double-execute.\r\n */\r\nexport function buildResilientPostgresJsClient<\r\n T extends {\r\n unsafe(query: string, params?: any[], options?: any): any;\r\n },\r\n>(client: T): T {\r\n const wrapUnsafe = (query: string, params?: any[], options?: any) => {\r\n const isRead = isSqlRead(query);\r\n\r\n const runAttempt = (mode: \"rows\" | \"values\") => async (): Promise<any> => {\r\n const pending = client.unsafe(query, params, options);\r\n return withDbTimeout(\r\n \"query\",\r\n async () => (mode === \"values\" ? pending.values() : pending),\r\n dbOpTimeoutMs(),\r\n () => {\r\n // Best-effort cancel so the timed-out statement doesn't keep\r\n // occupying one of the (small, serverless-capped) pool slots.\r\n try {\r\n pending.cancel?.();\r\n } catch {\r\n // ignore — cancellation is advisory\r\n }\r\n },\r\n );\r\n };\r\n\r\n const execute = async (mode: \"rows\" | \"values\"): Promise<any> => {\r\n if (isRead) return retryOnConnectionError(runAttempt(mode));\r\n try {\r\n return await runAttempt(mode)();\r\n } catch (err) {\r\n // Connect timeout fires before the statement is sent → one retry is\r\n // safe even for writes.\r\n if (\r\n isConnectionError(err) &&\r\n (err as any)?.code === \"CONNECT_TIMEOUT\"\r\n ) {\r\n return runAttempt(mode)();\r\n }\r\n throw err;\r\n }\r\n };\r\n\r\n // Lazy thenable mirroring the slice of postgres.js's PendingQuery\r\n // surface that Drizzle uses: `await q` or `await q.values()`.\r\n return {\r\n then: (onFulfilled?: any, onRejected?: any) =>\r\n execute(\"rows\").then(onFulfilled, onRejected),\r\n catch: (onRejected?: any) => execute(\"rows\").catch(onRejected),\r\n finally: (onFinally?: any) => execute(\"rows\").finally(onFinally),\r\n values: () => execute(\"values\"),\r\n };\r\n };\r\n\r\n return new Proxy(client as any, {\r\n get(target, prop) {\r\n if (prop === \"unsafe\") return wrapUnsafe;\r\n const val = target[prop];\r\n return typeof val === \"function\" ? val.bind(target) : val;\r\n },\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\r\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\r\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\r\n * port 5432 that can't negotiate around Neon's wake-up window — every\r\n * request after an idle period 502s. `@neondatabase/serverless` rides\r\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\r\n * transparently, supports transactions, and works in every serverless\r\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\r\n */\r\nexport function isNeonUrl(url: string): boolean {\r\n // Must match neon.tech followed by port/path/query/end — include `?` so\r\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\r\n // or path) still route through the serverless driver.\r\n return /\\.neon\\.tech([:/?]|$)/.test(url);\r\n}\r\n\r\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\r\nfunction getLibsqlWebDrizzle() {\r\n if (!_libsqlWebDrizzle) {\r\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\r\n drizzle: mod.drizzle,\r\n }));\r\n }\r\n return _libsqlWebDrizzle;\r\n}\r\n\r\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\r\nfunction getBetterSqliteDrizzle() {\r\n if (!_betterSqliteDrizzle) {\r\n _betterSqliteDrizzle = Promise.all([\r\n import(\"drizzle-orm/better-sqlite3\"),\r\n import(\"better-sqlite3\"),\r\n ]).then(([drizzleMod, sqliteMod]) => ({\r\n drizzle: drizzleMod.drizzle,\r\n Database: sqliteMod.default,\r\n }));\r\n }\r\n return _betterSqliteDrizzle;\r\n}\r\n\r\n/**\r\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\r\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\r\n * an async callback throws \"Transaction function cannot return a promise\".\r\n *\r\n * This wrapper bypasses the native path by issuing raw SQL control statements\r\n * on the single better-sqlite3 connection, which is safe because:\r\n * - better-sqlite3 is single-connection (no concurrency inside one process)\r\n * - the framework serialises all async work through one Database instance\r\n *\r\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\r\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\r\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\r\n *\r\n * The patched transaction also patches the tx object it passes to the callback\r\n * so that nested async calls (tx.transaction(async …)) work recursively.\r\n */\r\n/** @internal exported for the async-tx concurrency spec */\r\nexport function patchBetterSqliteTransactions<\r\n DB extends { transaction: (...args: any[]) => any; session: any },\r\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\r\n let savepointSeq = 0;\r\n // Concurrent TOP-LEVEL async transactions on the single better-sqlite3\r\n // connection must not interleave: a second transaction starting while the\r\n // first is open would see `inTransaction` and open a savepoint INSIDE the\r\n // first transaction, which then commits out from under it (\"no such\r\n // savepoint\"). Serialize top-level transactions through a promise chain;\r\n // genuine same-task nesting (tx.transaction or db.transaction inside an\r\n // open callback) is detected via AsyncLocalStorage and keeps the direct\r\n // savepoint path so it cannot deadlock on the queue.\r\n const txContext = new AsyncLocalStorage<boolean>();\r\n let txChain: Promise<unknown> = Promise.resolve();\r\n\r\n function makeAsyncTransaction(\r\n originalTransaction: (...args: any[]) => any,\r\n ): (...args: any[]) => Promise<unknown> {\r\n async function runTransactionBody(\r\n cb: (tx: unknown) => unknown,\r\n ): Promise<unknown> {\r\n // Extract the drizzle tx proxy synchronously — call the original with a\r\n // stub that captures the tx arg then immediately throws a sentinel so\r\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\r\n // The sentinel is caught here and never propagates further.\r\n let capturedTx: unknown;\r\n try {\r\n originalTransaction((tx: unknown) => {\r\n capturedTx = tx;\r\n throw _EXTRACT_TX;\r\n });\r\n } catch (e) {\r\n if (e !== _EXTRACT_TX) throw e;\r\n }\r\n\r\n // Recursively patch the nested tx so tx.transaction(async …) also works.\r\n const tx = capturedTx as { transaction: (...a: any[]) => any };\r\n if (tx && typeof tx.transaction === \"function\") {\r\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\r\n }\r\n\r\n const nested = sqlite.inTransaction;\r\n if (nested) {\r\n const sp = `sp_async_${++savepointSeq}`;\r\n sqlite.exec(`SAVEPOINT ${sp}`);\r\n let released = false;\r\n try {\r\n const result = await cb(tx);\r\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\r\n released = true;\r\n return result;\r\n } catch (err) {\r\n if (!released) {\r\n try {\r\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\r\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\r\n } catch {\r\n /* ignore: connection may already be in an error state */\r\n }\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\r\n sqlite.exec(\"BEGIN IMMEDIATE\");\r\n let committed = false;\r\n try {\r\n const result = await cb(tx);\r\n sqlite.exec(\"COMMIT\");\r\n committed = true;\r\n return result;\r\n } catch (err) {\r\n if (!committed) {\r\n try {\r\n sqlite.exec(\"ROLLBACK\");\r\n } catch {\r\n /* swallow: connection may already be unusable */\r\n }\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n return function asyncTransaction(\r\n cb: (tx: unknown) => unknown,\r\n ): Promise<unknown> {\r\n if (txContext.getStore()) {\r\n // Same-task nesting: run directly (savepoint path inside the open\r\n // transaction). Queueing here would deadlock behind the outer tx.\r\n return runTransactionBody(cb);\r\n }\r\n const run = () => txContext.run(true, () => runTransactionBody(cb));\r\n const next = txChain.then(run, run);\r\n txChain = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n }\r\n\r\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\r\n return db;\r\n}\r\n\r\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\r\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\r\n\r\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\r\n let _db: any;\r\n let _dbReady: Promise<any> | undefined;\r\n\r\n function startInit(): Promise<any> {\r\n if (_dbReady) return _dbReady;\r\n\r\n const url = getDatabaseUrl(\"file:./data/app.db\");\r\n const dialect = getDialect();\r\n\r\n // D1 only if dialect detected it (DATABASE_URL takes priority)\r\n if (dialect === \"d1\") {\r\n const d1 = getCloudflareD1Binding() as\r\n | Parameters<typeof drizzleD1>[0]\r\n | undefined;\r\n if (d1) {\r\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\r\n _dbReady = Promise.resolve(_db);\r\n return _dbReady;\r\n }\r\n }\r\n\r\n if (isPgliteUrl(url)) {\r\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\r\n const client = await getPgliteClient(url);\r\n _db = drizzle({ client, schema });\r\n });\r\n return _dbReady;\r\n }\r\n\r\n if (dialect === \"postgres\") {\r\n if (isNeonUrl(url)) {\r\n _dbReady = getNeonServerlessDrizzle().then(\r\n ({ drizzle, Pool, neonConfig }) => {\r\n // Cloudflare Workers (workerd) forbids reusing I/O objects across\r\n // requests — a WebSocket client cached in the pool by request A and\r\n // handed to request B throws \"Cannot perform I/O on behalf of a\r\n // different request\" and hangs the worker. Route plain queries over\r\n // Neon's stateless HTTP transport (poolQueryViaFetch) and cap each\r\n // WebSocket client (used for transactions) to a single use so it is\r\n // never reused across requests.\r\n const cfWorker = isCloudflareRuntime();\r\n if (cfWorker) neonConfig.poolQueryViaFetch = true;\r\n const rawPool = new Pool({\r\n connectionString: url,\r\n max: neonPoolMax(),\r\n ...(cfWorker ? { maxUses: 1 } : {}),\r\n });\r\n attachNeonPoolErrorLogger(rawPool);\r\n // Wrap the pool with the resilience layer so Drizzle queries get the\r\n // same withDbTimeout + retryOnConnectionError protection as the raw\r\n // DbExec path in client.ts. Reads retry freely; writes only retry on\r\n // acquire-timeout (pre-send) errors to avoid double-execution.\r\n const pool = buildResilientNeonPool(rawPool);\r\n _db = drizzle(pool, { schema });\r\n },\r\n );\r\n } else {\r\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\r\n // pgPoolOptions caps the pool to a small size on serverless so\r\n // concurrent frozen instances don't exhaust Neon/Postgres'\r\n // connection limit (\"Max client connections reached\").\r\n const client = postgres(url, pgPoolOptions(url));\r\n _db = drizzle(buildResilientPostgresJsClient(client), { schema });\r\n });\r\n }\r\n } else if (isLocalSqliteUrl(url)) {\r\n _dbReady = Promise.all([\r\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\r\n getBetterSqliteDrizzle(),\r\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\r\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\r\n // Wait up to 10s for a concurrent writer instead of failing fast\r\n // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.\r\n sqlite.pragma(\"busy_timeout = 10000\");\r\n sqlite.pragma(\"journal_mode = WAL\");\r\n const db = drizzle(sqlite, { schema });\r\n _db = patchBetterSqliteTransactions(db, sqlite);\r\n });\r\n } else {\r\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\r\n _db = drizzle({\r\n connection: { url, authToken: getDatabaseAuthToken() },\r\n schema,\r\n });\r\n });\r\n }\r\n return _dbReady;\r\n }\r\n\r\n /**\r\n * Create a lazy proxy that records property accesses and method calls,\r\n * then replays them on the real DB once init completes. Supports\r\n * Drizzle's chained API: db.select().from(table).where(...).\r\n *\r\n * When `.then()` is called (i.e. the chain is awaited), the proxy\r\n * awaits _dbReady and replays the recorded chain on the real _db.\r\n */\r\n function createLazyProxy(\r\n ready: Promise<any>,\r\n chain: Array<{ prop: string | symbol; args?: any[] }>,\r\n ): any {\r\n return new Proxy(function () {} as any, {\r\n get(_target, prop) {\r\n // When awaited, replay the chain on the real db\r\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\r\n const promise = ready.then(() => {\r\n let result: any = _db;\r\n for (const step of chain) {\r\n const val = result[step.prop];\r\n result =\r\n typeof val === \"function\" ? val.apply(result, step.args) : val;\r\n }\r\n return result;\r\n });\r\n return (promise as any)[prop].bind(promise);\r\n }\r\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\r\n // Property access (e.g. db.query) — record and return another proxy\r\n return createLazyProxy(ready, [...chain, { prop }]);\r\n },\r\n apply(_target, _thisArg, args) {\r\n // Method call (e.g. .from(table)) — record args and return another proxy\r\n if (chain.length === 0) return createLazyProxy(ready, []);\r\n const last = chain[chain.length - 1];\r\n const newChain = chain.slice(0, -1);\r\n newChain.push({ prop: last.prop, args });\r\n return createLazyProxy(ready, newChain);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\r\n * If the async init hasn't completed yet, returns a lazy Proxy that\r\n * records the Drizzle chain (select/from/where/etc.) and replays it\r\n * once the DB driver finishes loading. Since callers always `await`\r\n * the final result, the proxy is transparent.\r\n */\r\n function getDb(): LibSQLDatabase<T> {\r\n if (_db) return _db;\r\n startInit();\r\n if (_db) return _db;\r\n\r\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\r\n }\r\n\r\n return getDb;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jami-studio/core",
3
- "version": "0.92.18",
3
+ "version": "0.92.19",
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": {