import type {DataSource, EntityManager} from "typeorm" import type {IsolationLevel} from "./database" export interface Tx { em: EntityManager commit(): Promise rollback(): Promise } export function createTransaction(con: DataSource, isolationLevel: IsolationLevel): Promise { return new Promise((resolve, reject) => { let done: Promise = con.transaction(isolationLevel, em => { return new Promise((commit, rollback) => { resolve({ em, commit() { commit() return done }, rollback() { rollback(ROLLBACK_ERROR) return done.catch(err => { if (err !== ROLLBACK_ERROR) { throw err } }) } }) }) }) done.catch(err => { if (err !== ROLLBACK_ERROR) { reject(err) } }) }) } const ROLLBACK_ERROR = new Error('rollback')