import { Transaction } from "./transaction.mjs"; export class TransactionManager { constructor(dbName, adapter) { this.dbName = dbName; this.adapter = adapter; this._queue = []; this._inTransaction = false; } transaction() { return new Transaction(this.dbName, this.adapter, this.enqueue.bind(this)); } enqueue() { let completeSignal; let transactionComplete = new Promise((r, _) => { completeSignal = r; }); let readySignal; let dbReady = new Promise((r, _) => { readySignal = () => { r(completeSignal); }; }); this._queue.push({readySignal, transactionComplete}); this._processQueue(); return dbReady; } async _processQueue() { // We're already processing the queue if (this._inTransaction) { return; } while (true) { let item = this._queue.shift(); if (!item) { return; } this._inTransaction = true; item.readySignal(); await item.transactionComplete; this._inTransaction = false; } } }