-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js.map
1 lines (1 loc) · 14.1 KB
/
index.js.map
1
{"version":3,"sources":["src/Transaction.js"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const Promise = require (\"bluebird\");\nconst TimeoutError = Promise.TimeoutError;\nconst forEach = require(\"lodash.foreach\");\nconst forEachRight = require(\"lodash.foreachright\");\nconst isFunction = require(\"lodash.isfunction\");\nconst sortBy = require(\"lodash.sortby\");\n\n/**\n * A transaction item is effectively a step in the transaction process with a defined forward and backward movement\n * It can also be initialized with state.\n */\nclass TransactionItem {\n\t/**\n\t * Forward and reverse functions passed in return ES6 promises, and take a single state object by reference\n\t * @param forward\n\t * @param reverse\n\t * @param state\n\t * @param name\n\t * @param timeout - the time to wait on a rollback for the transaction to finish\n\t */\n\tconstructor(forward, reverse, state, name, timeout) {\n\t\tif(!(isFunction(forward) && isFunction(reverse))) {\n\t\t\tthrow TypeError(\"Forward and reverse parameters must be functions that return ES6 compatible promises.\");\n\t\t}\n\n\t\tthis.completed = false;\n\n\t\tthis.state = state ? state : null;\n\t\tthis.forward = forward;\n\t\tthis.reverse = reverse;\n\t\tthis.name = name ? name : null;\n\t\tthis.order = null;\n\t\tthis.error = null;\n\t\tthis.inRollback = false;\n\t}\n\n\n\t_start() {\n\t\tthis._completed = [];\n\t\tthis.completed = new Promise((resolve, reject) => {\n\t\t\tthis._completed.push({resolve, reject})\n\t\t});\n\n\t\tthis.complete = () => {\n\t\t\tthis._completed[0].resolve(true);\n\t\t};\n\n\t\tthis.incomplete = () =>{\n\t\t\tthis._completed[0].resolve(false);\n\t\t};\n\t}\n\t/**\n\t * Executes the transaction\n\t * @param s - the state to utilize with the transaction, can be an object containing something the function may need but wasn't known ahead of time.\n\t */\n\texec(s) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif(this.completed === false && !this.inRollback) {\n\t\t\t\tthis._start();\n\t\t\t\tthis.state = s ? s : this.state;\n\t\t\t\tthis.forward(this.state)\n\t\t\t\t\t.then((newState) => {\n\t\t\t\t\t\tthis.state = newState;\n\t\t\t\t\t\tthis.complete();\n\t\t\t\t\t\tresolve(this.state);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tthis.error = error;\n\t\t\t\t\t\tthis.incomplete();\n\t\t\t\t\t\treject(this._addName(\"The transaction item failed to execute. \"+errorAsString(error)));\n\t\t\t\t\t})\n\t\t\t}\n\t\t\telse {\n\t\t\t\treject(this._addName(\"This is an executed transaction item and cannot be re-executed\"));\n\t\t\t}\n\t\t})\n\t}\n\n\trollback() {\n\t\tif(this.completed == false && !this.completed instanceof Promise) {\n\t\t\tthis.inRollback = true;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\telse { // this is either pending or resolved\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tlet timeout = this.timeout ? this.timeout : 1000;\n\t\t\t\tthis.completed.timeout(timeout).then((completed)=> {\n\t\t\t\t\tif(completed) {\n\t\t\t\t\t\tthis.reverse(this.state)\n\t\t\t\t\t\t\t.then(()=> {\n\t\t\t\t\t\t\t\tthis.completed = false;\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\treject(this._addName(\"The transaction item failed to rollback. \"+errorAsString(error)));\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}).catch((error)=> {\n\t\t\t\t\tif(error instanceof TimeoutError) {\n\t\t\t\t\t\treject(\"The transaction item timed out\");\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(this._addName(\"The transaction item failed to execute. \"+errorAsString(error)));\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n\n\t_addName(errorStr) {\n\t\treturn this.name ? this.name +\": \"+errorStr : errorStr;\n\t}\n}\n\n/**\n * A transaction is a collection of transaction items that can be run serially or in parallel. Rollback operations always happen in parallel.\n */\nclass Transaction {\n\n\t/**\n\t * Pass in a transaction id which defaults to epoch, and a logger which defaults to console.\n\t * @param transactionId\n\t * @param transactionItems\n\t * @param logger\n\t */\n\tconstructor(transactionId, transactionItems, logger) {\n\t\tthis.transactionItems = [];\n\t\tif(transactionItems && transactionItems.length) {\n\t\t\tfor(let i=0;i<transactionItems.length;i++) {\n\t\t\t\tthis.add(transactionItems[i]);\n\t\t\t}\n\t\t\tthis.reorderItems();\n\t\t}\n\n\t\tthis.transactionId = transactionId ? transactionId : new Date().getTime()/1000;\n\t\tthis.logger = logger ? logger : console;\n\t}\n\n\t/**can you\n\t * Adds a transaction item to the ordered list.\n\t * @param transactionItem\n\t */\n\tadd(transactionItem) {\n\t\tif(transactionItem instanceof TransactionItem) {\n\t\t\ttransactionItem.order = transactionItem.order ? transactionItem.order : this.transactionItems.length;\n\t\t\tthis.transactionItems.push(transactionItem);\n\t\t}\n\t\telse {\n\t\t\tthrow new TypeError(\"Supplied object is not a TransactionItem\");\n\t\t}\n\t}\n\n\t/**\n\t * Clears all transaction items from the transaction\n\t */\n\tclear() {\n\t\tthis.transactionItems = [];\n\t}\n\n\t/**\n\t * Rolls back all transactions in parallel.\n\t * @returns {Promise.<*>}\n\t */\n\trollbackAll() {\n\t\tlet promises = [];\n\t\tlet self = this;\n\t\tforEachRight(self.transactionItems, (item) => {\n\t\t\tif(!(self.completed === false && !self.completed instanceof Promise)) {\n\t\t\t\tpromises.push(item.rollback());\n\t\t\t}\n\t\t});\n\t\treturn Promise.all(promises);\n\t}\n\n\t_log(message) {\n\t\tthis.logger.log(this.transactionId+\": \"+message);\n\t}\n\n\t_error(message) {\n\t\tthis.logger.error(this.transactionId+\": \"+message);\n\t}\n\n\t/**\n\t * Runs all transaction items in parallel.\n\t * @param s - the state to utilize with ALL the transaction items, passed to ALL TransactionItem.exec() as the first argument.\n\t */\n\trunParallel(s) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._log(\"Transaction executing.\");\n\t\t\tlet promises = [];\n\t\t\tforEach(this.transactionItems, (item) => {\n\t\t\t\tpromises.push(item.exec(s));\n\t\t\t});\n\t\t\tPromise.all(promises)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis._log(\"Transaction execution succeeded.\");\n\t\t\t\t\tresolve();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// now have to go through all non-pending promises and imme\n\t\t\t\t\tthis._error(\"Transaction failed. \"+errorAsString(error));\n\t\t\t\t\tthis.rollbackAll()\n\t\t\t\t\t\t.then(()=> {\n\t\t\t\t\t\t\tthis._log(\"Transaction rolled back successfully.\");\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tthis._error(\"Transaction failed to roll back. \"+errorAsString(error));\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t});\n\t}\n\n\t/**\n\t * Runs all transaction items in serial, chaining values from one call to the next\n\t * @param s - the state to utilize for the INITIAL transaction item, passed to the INITIAL TransactionItem.exec() as the first argument.\n\t */\n\trunSerial(s) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif(this.transactionItems.length>0) {\n\t\t\t\tthis._log(\"Transaction executing.\");\n\t\t\t\tPromise.reduce(this.transactionItems, (result, p) => {\n\t\t\t\t\t\tresult = p.order==0 ? s : result;\n\t\t\t\t\t\treturn p.exec(result).then((newResult) => {\n\t\t\t\t\t\t\treturn newResult;\n\t\t\t\t\t\t});\n\t\t\t\t\t}, null)\n\t\t\t\t\t.then((finalResult) => {\n\t\t\t\t\t\tthis._log(\"Transaction execution succeeded.\");\n\t\t\t\t\t\tresolve(finalResult);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tthis._log(\"Transaction failed. \"+errorAsString(error));\n\t\t\t\t\t\tthis.rollbackAll()\n\t\t\t\t\t\t\t.then(()=> {\n\t\t\t\t\t\t\t\tthis._log(\"Transaction rolled back successfully.\");\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\tthis._error(\"Transaction failed to roll back. \"+errorAsString(error));\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Produces a JSON string of the object\n\t * @returns {String}\n\t */\n\tserialize() {\n\t\treturn JSON.stringify(this, null, 4);\n\t}\n\n\t/**\n\t * Produces a new Transaction from a JSON string\n\t * @param json\n\t * @returns {Transaction}\n\t */\n\tstatic deserialize(json) {\n\t\tlet objectData = JSON.parse(json);\n\t\tlet transaction = new Transaction();\n\t\tObject.assign(transaction, objectData);\n\t\ttransaction.reorderItems();\n\t\treturn transaction;\n\t}\n\n\t/**\n\t * called by deserialize and on constructor\n\t */\n\treorderItems() {\n\t\treturn sortBy(this.transactionItems, (ti) => ti.order)\n\t}\n\n}\n\nfunction errorAsString(error) {\n\treturn error ? (typeof error === 'object' ? JSON.stringify(error, null, 4) : error) : error;\n}\n\nexport {\n\tTransaction,\n\tTransactionItem\n}\n"]}