UNPKG

apemandb

Version:
79 lines (73 loc) 1.88 kB
/** * Transaction extension for Apemandb. * @namespace TransactionExtension */ 'use strict' const co = require('co') const ONE_DAY = 24 * 60 * 60 * 1000 const TransactionExtension = Object.freeze({ /** * Get a transaction. * @param {string} id - Id of the transaction. * @returns {Promise.<Transaction>} */ getTransaction (id) { const s = this if (!id) { return null } id = id && (id.id || id.uuid) || id let transaction = (s._transactions || {})[ id ] if (!transaction) { throw new Error(`Transaction not found with id: ${id}`) } return transaction }, /** * Start a transaction. * @param {Object} [options] - Optional settings. * @returns {Promise.<Transaction>} */ beginTransaction (options) { options = options || {} const s = this s._transactions = s._transactions || {} let timeout = options.timeout || ONE_DAY delete options.timeout return co(function * () { let transaction = yield s.transaction(options || {}) let id = transaction.id s._transactions[ id ] = transaction if (timeout) { setTimeout(() => { let transaction = s.getTransaction(id) if (transaction && !transaction.finished) { transaction.rollback().then(() => { console.error(`Transaction timeout: ${transaction.id}`) }) } }, timeout) } return transaction }) }, /** * Finish the transaction. * @param id */ finishTransaction (id) { const s = this return co(function * () { let transaction = s.getTransaction(id) if (!transaction) { return } if (!transaction.finished) { yield transaction.commit() } delete s._transactions[ id ] return null }) } }) module.exports = TransactionExtension