apemandb
Version:
Database for apeman project.
79 lines (73 loc) • 1.88 kB
JavaScript
/**
* Transaction extension for Apemandb.
* @namespace TransactionExtension
*/
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