import { AsyncLocalStorage } from 'node:async_hooks'
import { Client } from 'pg'
import { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres'
import * as schema from './schema'
export type NodeDatabase = NodePgDatabase<typeof schema>
const dbStorage = new AsyncLocalStorage<NodeDatabase>()
function createDatabaseConnection(dbConnectionUrl: string) {
const client = new Client({ connectionString: dbConnectionUrl })
const db = drizzle(client, { schema })
return { db, client }
}
export async function runWithDb<T>(
dbConnectionUrl: string,
callback: () => Promise<T>,
): Promise<T> {
const existing = dbStorage.getStore()
if (existing) return callback()
const { db, client } = createDatabaseConnection(dbConnectionUrl)
await client.connect()
try {
return await dbStorage.run(db, callback)
} finally {
await client.end()
}
}
export function getDb(): NodeDatabase {
const db = dbStorage.getStore()
if (!db) throw new Error('Database not available — not in a request context')
return db
}
import { AsyncLocalStorage } from 'node:async_hooks'
import { Client } from 'pg'
import { drizzle, type NodePgDatabase } from 'drizzle-orm/node-postgres'
import * as schema from './schema'
export type NodeDatabase = NodePgDatabase<typeof schema>
const dbStorage = new AsyncLocalStorage<NodeDatabase>()
function createDatabaseConnection(dbConnectionUrl: string) {
const client = new Client({ connectionString: dbConnectionUrl })
const db = drizzle(client, { schema })
return { db, client }
}
export async function runWithDb<T>(
dbConnectionUrl: string,
callback: () => Promise<T>,
): Promise<T> {
const existing = dbStorage.getStore()
if (existing) return callback()
const { db, client } = createDatabaseConnection(dbConnectionUrl)
await client.connect()
try {
return await dbStorage.run(db, callback)
} finally {
await client.end()
}
}
export function getDb(): NodeDatabase {
const db = dbStorage.getStore()
if (!db) throw new Error('Database not available — not in a request context')
return db
}