@decaf-ts/transactional-decorators 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +1 -1
  2. package/dist/transactional-decorators.cjs +1 -1
  3. package/dist/transactional-decorators.cjs.map +1 -1
  4. package/dist/transactional-decorators.js +1 -1
  5. package/dist/transactional-decorators.js.map +1 -1
  6. package/lib/Transaction.cjs +254 -56
  7. package/lib/Transaction.d.ts +44 -18
  8. package/lib/Transaction.js.map +1 -1
  9. package/lib/constants.cjs +0 -1
  10. package/lib/constants.js.map +1 -1
  11. package/lib/decorators.cjs +60 -146
  12. package/lib/decorators.d.ts +1 -11
  13. package/lib/decorators.js.map +1 -1
  14. package/lib/errors.cjs +11 -0
  15. package/lib/errors.d.ts +4 -0
  16. package/lib/errors.js.map +1 -0
  17. package/lib/esm/Transaction.d.ts +44 -18
  18. package/lib/esm/Transaction.js +254 -56
  19. package/lib/esm/Transaction.js.map +1 -1
  20. package/lib/esm/constants.js +0 -1
  21. package/lib/esm/constants.js.map +1 -1
  22. package/lib/esm/decorators.d.ts +1 -11
  23. package/lib/esm/decorators.js +60 -145
  24. package/lib/esm/decorators.js.map +1 -1
  25. package/lib/esm/errors.d.ts +4 -0
  26. package/lib/esm/errors.js +7 -0
  27. package/lib/esm/errors.js.map +1 -0
  28. package/lib/esm/index.d.ts +4 -1
  29. package/lib/esm/index.js +6 -1
  30. package/lib/esm/index.js.map +1 -1
  31. package/lib/esm/interfaces/TransactionLock.d.ts +2 -2
  32. package/lib/esm/locks/{SyncronousLock.d.ts → SynchronousLock.d.ts} +10 -6
  33. package/lib/esm/locks/SynchronousLock.js +131 -0
  34. package/lib/esm/locks/SynchronousLock.js.map +1 -0
  35. package/lib/esm/locks/index.d.ts +1 -1
  36. package/lib/esm/locks/index.js +1 -1
  37. package/lib/esm/locks/index.js.map +1 -1
  38. package/lib/esm/overrides/Metadata.d.ts +8 -0
  39. package/lib/esm/overrides/Metadata.js +2 -0
  40. package/lib/esm/overrides/Metadata.js.map +1 -0
  41. package/lib/esm/overrides/index.d.ts +2 -0
  42. package/lib/esm/overrides/index.js +3 -0
  43. package/lib/esm/overrides/index.js.map +1 -0
  44. package/lib/esm/overrides/overrides.d.ts +1 -0
  45. package/lib/esm/overrides/overrides.js +12 -0
  46. package/lib/esm/overrides/overrides.js.map +1 -0
  47. package/lib/esm/types.d.ts +0 -10
  48. package/lib/esm/types.js +11 -0
  49. package/lib/esm/types.js.map +1 -1
  50. package/lib/index.cjs +7 -2
  51. package/lib/index.d.ts +4 -1
  52. package/lib/index.js.map +1 -1
  53. package/lib/interfaces/TransactionLock.d.ts +2 -2
  54. package/lib/locks/SynchronousLock.cjs +135 -0
  55. package/lib/locks/{SyncronousLock.d.ts → SynchronousLock.d.ts} +10 -6
  56. package/lib/locks/SynchronousLock.js.map +1 -0
  57. package/lib/locks/index.cjs +1 -1
  58. package/lib/locks/index.d.ts +1 -1
  59. package/lib/locks/index.js.map +1 -1
  60. package/lib/overrides/Metadata.cjs +4 -0
  61. package/lib/overrides/Metadata.d.ts +8 -0
  62. package/lib/overrides/Metadata.js.map +1 -0
  63. package/lib/overrides/index.cjs +19 -0
  64. package/lib/overrides/index.d.ts +2 -0
  65. package/lib/overrides/index.js.map +1 -0
  66. package/lib/overrides/overrides.cjs +14 -0
  67. package/lib/overrides/overrides.d.ts +1 -0
  68. package/lib/overrides/overrides.js.map +1 -0
  69. package/lib/types.cjs +11 -0
  70. package/lib/types.d.ts +0 -10
  71. package/lib/types.js.map +1 -1
  72. package/package.json +7 -32
  73. package/lib/esm/locks/SyncronousLock.js +0 -128
  74. package/lib/esm/locks/SyncronousLock.js.map +0 -1
  75. package/lib/esm/utils.d.ts +0 -1
  76. package/lib/esm/utils.js +0 -14
  77. package/lib/esm/utils.js.map +0 -1
  78. package/lib/locks/SyncronousLock.cjs +0 -132
  79. package/lib/locks/SyncronousLock.js.map +0 -1
  80. package/lib/utils.cjs +0 -17
  81. package/lib/utils.d.ts +0 -1
  82. package/lib/utils.js.map +0 -1
package/README.md CHANGED
@@ -116,7 +116,7 @@ const transaction = new Transaction(
116
116
  );
117
117
 
118
118
  // Submitting the transaction for execution
119
- Transaction.submit(transaction);
119
+ await Transaction.submit(transaction);
120
120
 
121
121
  // Using the Transaction.push method for callback-style APIs
122
122
  Transaction.push(
@@ -1,2 +1,2 @@
1
- var t,e;t=this,e=function(t,e,n){"use strict";class o{constructor(){this.queue=[],this.locked=!1}async execute(t){let e;await this.acquire();try{e=await Promise.resolve(t())}catch(t){throw this.release(),t}return this.release(),e}async acquire(){const t=this;return t.locked?new Promise(e=>t.queue.push(e)):(t.locked=!0,Promise.resolve())}release(){const t=this.queue.shift();t?void 0===globalThis.window?globalThis.process.nextTick(t):setTimeout(t,0):this.locked=!1}}class i{constructor(t=1,e,n){this.currentTransaction=void 0,this.lock=new o,this.counter=t,this.pendingTransactions=[],this.onBegin=e,this.onEnd=n}submit(t){const e=this;e.lock.acquire().then(()=>e.currentTransaction&&e.currentTransaction.id===t.id?(e.lock.release(),t.fire()):e.counter>0?(e.counter--,e.lock.release(),e.fireTransaction(t)):(e.pendingTransactions.push(t),void e.lock.release()))}fireTransaction(t){const e=this;e.lock.acquire().then(()=>{e.currentTransaction=t,e.lock.release(),e.onBegin?e.onBegin().then(()=>{t.fire()}):t.fire()})}async release(t){const e=this;return new Promise(n=>{e.lock.acquire().then(()=>{e.currentTransaction,e.currentTransaction=void 0,e.lock.release();const o=()=>{e.lock.acquire().then(()=>{if(e.pendingTransactions.length>0){const t=e.pendingTransactions.shift(),n=()=>e.fireTransaction(t);void 0===globalThis.window?globalThis.process.nextTick(n):setTimeout(n,0)}else e.counter++;e.lock.release(),n()})};e.onEnd?e.onEnd(t).then(()=>o()):o()})})}}const s={REFLECT:"model.transactional.",TRANSACTIONAL:"transactional"};function r(t){if(t)return"string"==typeof t?t:t.constructor&&t.constructor.name&&-1===["Function","Object"].indexOf(t.constructor.name)?t.constructor.name:"function"==typeof t&&t.name?t.name:t.toString()}class c{constructor(t,e,n,o){this.id=Date.now(),this.action=n,this.method=e,this.log=[[this.id,t,e].join(" | ")],this.source=t,this.metadata=o}static push(t,e,...n){const o=n.pop();if(!o||"function"!=typeof o)throw Error("Missing callback");const i=(t,...e)=>{c.getLock().release(t).then(()=>o(t,...e))},s=new c(t.constructor.name,e.name?r(e):"Anonymous",()=>e.call(s.bindToTransaction(t),...n,i));c.getLock().submit(s)}static setLock(t){this.lock=t}static getLock(){return this.lock||(this.lock=new i),this.lock}static submit(t){c.getLock().submit(t)}static async release(t){return c.getLock().release(t)}getMetadata(){return this.metadata?[...this.metadata]:void 0}bindTransaction(t){this.log.push(...t.log),t.bindTransaction=this.bindToTransaction.bind(this),t.bindToTransaction=this.bindToTransaction.bind(this),this.action=t.action}bindToTransaction(t){const o=n.getAllPropertyDecoratorsRecursive(t,void 0,s.REFLECT);if(!o)return t;const i=this,c=e.Reflection.getAllProperties(t).reduce((n,r)=>(-1!==Object.keys(o).indexOf(r)&&o[r].find(t=>t.key===s.TRANSACTIONAL)?n[r]=(...e)=>t[r].call(t.__originalObj||t,i,...e):"clazz"===r||"constructor"===r?n[r]=t[r]:"function"==typeof t[r]?n[r]=t[r].bind(t.__originalObj||t):"object"==typeof t[r]&&t[r].constructor&&e.Reflection.getClassDecorators(s.REFLECT,t[r]).find(t=>t.key===s.TRANSACTIONAL)?n[r]=i.bindToTransaction(t[r]):n[r]=t[r],n),{});return c[n.DBKeys.ORIGINAL]=t[n.DBKeys.ORIGINAL]||t,c.toString=()=>r(c[n.DBKeys.ORIGINAL])+" proxy for transaction "+this.id,c}fire(){if(!this.action)throw Error("Missing the method");return this.action()}toString(t=!0,e=!1){return`${t?`[${this.id}]`:""}[Transaction][${this.source}.${this.method}${e?"]\nTransaction Log:\n"+this.log.join("\n"):"]"}`}static key(t){return s.REFLECT+t}}t.Lock=o,t.SyncronousLock=i,t.Transaction=c,t.TransactionalKeys=s,t.VERSION="##VERSION##",t.transactional=function(...t){return function(o,i,r){if(!r)throw new n.InternalError("Missing descriptor. Should be impossible");e.metadata(c.key(s.TRANSACTIONAL),t)(o,i);const a=r.value,l=function(...e){const n=this;return new Promise((o,s)=>{const r=(t,e)=>{c.release(t).then(()=>{if(t)return s(t);o(e)})};let l=e.shift();if(l instanceof c){const r=new c(this.constructor.name,i,async()=>{a.call(r.bindToTransaction(n),...e).then(o).catch(s)},t.length?t:void 0);l.bindTransaction(r),l.fire()}else e.unshift(l),l=new c(this.constructor.name,i,()=>{a.call(l.bindToTransaction(n),...e).then(t=>r(void 0,t)).catch(r)},t.length?t:void 0),c.submit(l)})};Object.defineProperty(l,"name",{value:i}),r.value=l}},t.transactionalSuperCall=(t,...e)=>t(c.getLock().currentTransaction,...e)},"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@decaf-ts/reflection"),require("@decaf-ts/db-decorators")):"function"==typeof define&&define.amd?define(["exports","@decaf-ts/reflection","@decaf-ts/db-decorators"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["transactional-decorators"]={},t.decafTsReflection,t.decafTsDbDecorators);
1
+ var t,e;t=this,e=function(t,e,i,s){"use strict";class a{constructor(){this.queue=[],this.locked=!1}async execute(t){let e;await this.acquire();try{e=await Promise.resolve(t())}catch(t){throw this.release(),t}return this.release(),e}async acquire(){const t=this;return t.locked?new Promise(e=>t.queue.push(e)):(t.locked=!0,Promise.resolve())}release(){const t=this.queue.shift();t?void 0===globalThis.window?globalThis.process.nextTick(t):setTimeout(t,0):this.locked=!1}}const n={TRANSACTIONAL:"transactional"};e.Metadata.transactionals=t=>{const i=e.Metadata.get(t,n.TRANSACTIONAL);return i?Object.keys(i):[]},e.Metadata.isTransactional=t=>!!e.Metadata.get(t,n.TRANSACTIONAL);class o extends i.InternalError{constructor(t="Transaction timed out"){super(t,o.name,500)}}const r=new WeakMap;class c extends s.LoggedClass{static{this.debug=!1}static{this.globalTimeout=-1}static{this.metadataCache=new WeakMap}static{this.log=new Proxy(s.Logging.for(c),{get:(t,e,i)=>"log"!==e||c.debug?Reflect.get(t,e,i):(...t)=>{}})}get log(){return this._log||(this._log=c.log),this._log}static{this.contexts=new WeakMap}constructor(t,e,i,s){super(),this.initialFireDispatched=!1,this.released=!1,this.id=Date.now(),this.action=i,this.method=e,this.logs=[[this.id,t,e].join(" | ")],this.source=t,this.metadata=s,this.completion=new Promise((t,e)=>{this.resolveCompletion=t,this.rejectCompletion=e})}static async push(t,e,...i){const s=this.log.for(this.push),a=c.describeTarget(t),n=c.describeTarget(e),o=new c(a,n,async()=>{const a=s.for(o.id.toString());try{a.verbose("Executing transaction method "+n),a.debug("With arguments: "+JSON.stringify(i));const s=await Promise.resolve(e.call(o.bindToTransaction(t),...i));return a.verbose(`Transaction method ${n} executed successfully`),a.debug("Result: "+JSON.stringify(s)),await o.release(),a.debug("lock released"),s}catch(t){throw await o.release(t),t}});return s.debug(`Pushing transaction ${o.id} for method ${n} on issuer ${a}`),c.submit(o)}static async run(t,e,i){const s="function"!=typeof t,a=s?t:void 0,n=s?e:t;if("function"!=typeof n)throw Error("Transaction.run requires an async function");const o=s?i:e,r=Array.isArray(o)&&o.length?o:void 0,l=a?c.describeTarget(a):c.describeTarget(n),h=c.describeTarget(n);let d;return d=new c(l,h,async()=>{let t;try{const t=a?d.bindToTransaction(a):void 0;return await n.call(t??d)}catch(e){throw t=e,e}finally{await d.release(t instanceof Error?t:void 0)}},r),c.submit(d)}static setLock(t){this.lock=t}static getLock(){return this.lock||(this.lock=new l),this.lock}static submit(t){return c.getLock().submit(t)}static async release(t){return c.getLock().release(t)}async release(t){this.released||(this.released=!0,await c.release(t))}getMetadata(){return this.metadata?[...this.metadata]:void 0}static getTransactionalMetadata(t){let s=this.metadataCache.get(t);if(s)return s;const a=new Set(["__transactionProxy","__transactionTarget","string"==typeof i.DBKeys.ORIGINAL?i.DBKeys.ORIGINAL:"__originalObj"]),n=e.Metadata.transactionals(t)??[],o=(e.Metadata.properties(t)||[]).filter(t=>!a.has(t)),r=new Map;return o.forEach(i=>{const s=e.Metadata.type(t,i);r.set(i,!!s&&e.Metadata.isTransactional(s))}),s={methods:n,propertyKeys:o,propertyDesignTypes:r},this.metadataCache.set(t,s),s}bindTransaction(t){this.log.for(this.bindTransaction).verbose(`Binding the ${t.toString()} to ${this}`),this.logs.push(...t.logs),t.bindTransaction=this.bindToTransaction.bind(this),t.bindToTransaction=this.bindToTransaction.bind(this),this.action=t.action}bindToTransaction(t){const a=this.log.for(this.bindToTransaction);a.verbose(`Binding object ${s.getObjectName(t)} to transaction ${this.id}`);const n=c.getTransactionalMetadata(t.constructor),o=n.methods;if(!o.length)return t;const r=this,l=new Set(["__transactionProxy","__transactionTarget","string"==typeof i.DBKeys.ORIGINAL?i.DBKeys.ORIGINAL:"__originalObj"]),h=new Set(n.propertyKeys);Object.getOwnPropertyNames(t).forEach(t=>{l.has(t)||h.add(t)});const d=Array.from(h).filter(i=>{if(n.propertyDesignTypes.get(i))return!0;const s=t[i];return!(!s||"object"!=typeof s&&"function"!=typeof s||!e.Metadata.isTransactional(s.constructor))});a.debug(`found transaction methods: ${o.join(", ")} and properties: ${d.join(", ")}`);const g=new Proxy(t,{get:(t,e,i)=>o.includes(e)?new Proxy(t[e],{apply:(t,e,i)=>Reflect.apply(t,e,[r,...i])}):d.includes(e)?r.bindToTransaction(t[e]):Reflect.get(t,e,i)});return g[i.DBKeys.ORIGINAL]=t[i.DBKeys.ORIGINAL]||t,g.toString=()=>s.getObjectName(g[i.DBKeys.ORIGINAL])+" proxy for transaction "+this.id,g.__transactionProxy=!0,g.__transactionTarget=t.__transactionTarget||t,c.contexts.set(g,r),g}applyGlobalTimeout(t){if(0>=c.globalTimeout)return t;const e=c.globalTimeout,i=this.log.for(this.applyGlobalTimeout);return new Promise((s,a)=>{let n=!1;const r=setTimeout(()=>{if(n)return;const t=new o(`Transaction ${this.toString()} exceeded timeout of ${e}ms`);i.warn(t.message),this.release(t).catch(t=>i.error(t)),a(t)},e);t.then(t=>{n=!0,clearTimeout(r),s(t)}).catch(t=>{n=!0,clearTimeout(r),a(t)})})}fire(){if(!this.action)throw Error("Missing the method");const t=(async()=>this.action?await this.action():void 0)(),e=c.globalTimeout>0?this.applyGlobalTimeout(t):t;return this.initialFireDispatched||(this.initialFireDispatched=!0,e.then(t=>(this.resolveCompletion?.(t),t)).catch(t=>{throw this.rejectCompletion?.(t),t})),e}toString(t=!0,e=!1){return`${t?`[${this.id}]`:""}[Transaction][${this.source}.${this.method}${e?"]\nTransaction Log:\n"+this.logs.join("\n"):"]"}`}static contextTransaction(t){if(t&&t.__transactionProxy)return this.contexts.get(t)}wait(){return this.completion}static describeTarget(t){if(null===t||"object"!=typeof t&&"function"!=typeof t)return s.getObjectName(t);const e=t;let i=r.get(e);return i||(i=s.getObjectName(t),r.set(e,i)),i}}class l extends s.LoggedClass{get log(){return this._log||(this._log=c.log.for(this)),this._log}logger(t){return this.loggerCache.has(t)||this.loggerCache.set(t,this.log.for(this[t])),this.loggerCache.get(t)}constructor(t=1,e,i){super(),this.counter=t,this.onBegin=e,this.onEnd=i,this.pendingTransactions=[],this.currentTransaction=void 0,this.loggerCache=new Map,this.lock=new a}async submit(t){const e=this.logger("submit");if(await this.lock.acquire(),e.silly("Lock acquired to submit transaction "+t.id),this.currentTransaction&&this.currentTransaction.id===t.id)return this.lock.release(),e.silly("Released lock for re-entrant transaction "+t.id),t.fire();let i;return this.counter>0?(this.counter--,this.lock.release(),e.silly("Released lock for transaction "+t.id),i=this.fireTransaction(t)):(e.debug(`Pushing transaction ${t.id} to the queue`),this.pendingTransactions.push(t),i=t.wait(),this.lock.release(),e.silly("Released lock after queuing transaction "+t.id)),i}async fireTransaction(t){const e=this.logger("fireTransaction");return await this.lock.acquire(),e.silly("Lock acquired obtain transaction "+t.id),this.currentTransaction=t,this.lock.release(),e.silly("Released lock after obtaining "+t.id),this.onBegin&&(e.verbose("Calling onBegin for transaction "+t.id),await this.onBegin()),e.info(`Starting transaction ${t.id}. ${this.pendingTransactions.length} remaining...`),t.fire()}async release(t){const e=this.logger("release");await this.lock.acquire(),this.currentTransaction||e.warn("Trying to release an unexisting transaction. should never happen..."),e.verbose("Releasing transaction "+this.currentTransaction?.toString(!0,!0));const i=this.currentTransaction?.id;if(this.currentTransaction=void 0,this.lock.release(),e.silly("Released lock after clearing transaction "+i),this.onEnd&&(e.verbose("Calling onEnd for transaction "+i),await this.onEnd(t)),await this.lock.acquire(),e.silly(`Acquired lock after completing transaction ${i} for pending transaction verification`),this.pendingTransactions.length>0){const t=this.pendingTransactions.shift(),i=()=>this.fireTransaction.call(this,t).catch(t=>{this.log.for(this.fireTransaction).error(t)});e.silly(`Marking ${t.id} for execution`),s.isBrowser()?setTimeout(i,0):globalThis.process.nextTick(i)}else e.debug("No pending transactions. Incrementing counter."),this.counter++;this.lock.release(),e.silly("Released lock after completing transaction "+i)}}const h="##VERSION##",d="##PACKAGE##";e.Metadata.registerLibrary(d,h),t.Lock=a,t.PACKAGE_NAME=d,t.SynchronousLock=l,t.TimeoutError=o,t.Transaction=c,t.TransactionalKeys=n,t.VERSION=h,t.transactional=(...t)=>(s,a,o)=>{if(!o)throw new i.InternalError("This decorator only applies to methods");return e.method()(s,a,o),e.Metadata.set(s.constructor,e.Metadata.key(n.TRANSACTIONAL,a),{data:t}),o.value=new Proxy(o.value,{apply:async(e,i,n)=>new Promise((o,r)=>{async function l(t,e,i){return!e||e instanceof Error||i||(i=e,e=void 0),await t.release(e),e?r(e):o(i)}const h=n[0],d=(()=>{let t=0;for(;t<n.length&&n[t]instanceof c;)t++;return t})(),g=d>0?n.slice(d):n,u=h instanceof c?h:c.contextTransaction(i);if(u){const n=new c(s.name,a,async()=>{try{return o(await Reflect.apply(e,n.bindToTransaction(i),g))}catch(t){return r(t)}},t.length?t:void 0);u.bindTransaction(n),u.fire()}else{const n=new c(s.name,a,async()=>{try{return l(n,void 0,await Reflect.apply(e,n.bindToTransaction(i),g))}catch(t){return l(n,t)}},t.length?t:void 0);c.submit(n)}})}),o}},"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@decaf-ts/decoration"),require("@decaf-ts/db-decorators"),require("@decaf-ts/logging")):"function"==typeof define&&define.amd?define(["exports","@decaf-ts/decoration","@decaf-ts/db-decorators","@decaf-ts/logging"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["transactional-decorators"]={},t.decafTsDecoration,t.decafTsDbDecorators,t.decafTsLogging);
2
2
  //# sourceMappingURL=transactional-decorators.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactional-decorators.cjs","sources":["../src/locks/Lock.ts","../src/locks/SyncronousLock.ts","../src/constants.ts","../src/utils.ts","../src/Transaction.ts","../src/index.ts","../src/decorators.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["Lock","constructor","this","queue","locked","execute","func","result","acquire","Promise","resolve","e","release","self","push","next","shift","globalThis","window","process","nextTick","setTimeout","SyncronousLock","counter","onBegin","onEnd","currentTransaction","undefined","lock","pendingTransactions","submit","transaction","then","id","fire","fireTransaction","err","afterConclusionCB","length","cb","TransactionalKeys","REFLECT","TRANSACTIONAL","getObjectName","obj","name","indexOf","toString","Transaction","source","method","action","metadata","Date","now","log","join","issuer","callbackMethod","args","callback","pop","Error","getLock","call","bindToTransaction","setLock","getMetadata","bindTransaction","nextTransaction","bind","transactionalMethods","getAllPropertyDecoratorsRecursive","boundObj","Reflection","getAllProperties","reduce","accum","k","Object","keys","find","o","key","__originalObj","getClassDecorators","DBKeys","ORIGINAL","withId","withLog","data","target","propertyKey","descriptor","InternalError","originalMethod","value","methodWrapper","reject","updatedTransaction","async","catch","unshift","defineProperty"],"mappings":"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"}
1
+ {"version":3,"file":"transactional-decorators.cjs","sources":["../src/locks/Lock.ts","../src/constants.ts","../src/overrides/overrides.ts","../src/errors.ts","../src/Transaction.ts","../src/locks/SynchronousLock.ts","../src/index.ts","../src/decorators.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["Lock","constructor","this","queue","locked","execute","func","result","acquire","Promise","resolve","e","release","self","push","next","shift","globalThis","window","process","nextTick","setTimeout","TransactionalKeys","TRANSACTIONAL","Metadata","transactionals","obj","meta","get","Object","keys","isTransactional","TimeoutError","InternalError","message","super","name","objectNameCache","WeakMap","Transaction","LoggedClass","debug","globalTimeout","metadataCache","log","Proxy","Logging","for","target","prop","receiver","Reflect","args","contexts","source","method","action","metadata","initialFireDispatched","released","id","Date","now","logs","join","completion","reject","resolveCompletion","rejectCompletion","issuer","issuerName","describeTarget","methodName","transaction","async","l","toString","verbose","JSON","stringify","call","bindToTransaction","submit","run","contextOrRunnable","runnableOrMetadata","maybeMetadata","contextProvided","context","undefined","runnable","Error","rawMetadata","metadataValue","Array","isArray","length","sourceName","caughtError","boundContext","error","setLock","lock","getLock","SynchronousLock","err","getMetadata","getTransactionalMetadata","cached","reservedProps","Set","DBKeys","ORIGINAL","methods","propertyKeys","properties","filter","has","propertyDesignTypes","Map","forEach","type","set","bindTransaction","nextTransaction","bind","getObjectName","transactionalMethods","props","getOwnPropertyNames","add","transactionProps","from","p","value","boundObj","includes","apply","methodTarget","thisArg","argArray","__transactionProxy","__transactionTarget","applyGlobalTimeout","execution","timeoutMs","settled","timer","warn","catch","releaseErr","then","clearTimeout","fire","baseExecution","executeAction","withId","withLog","contextTransaction","wait","key","logger","loggerCache","counter","onBegin","onEnd","pendingTransactions","currentTransaction","silly","resultPromise","fireTransaction","info","cb","isBrowser","VERSION","PACKAGE_NAME","registerLibrary","data","propertyKey","descriptor","exitFunction","candidate","transactionPrefixLength","count","invocationArgs","slice","activeTransaction","updatedTransaction","newTransaction"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Reflection as t,metadata as n}from"@decaf-ts/reflection";import{getAllPropertyDecoratorsRecursive as e,DBKeys as i,InternalError as o}from"@decaf-ts/db-decorators";class s{constructor(){this.queue=[],this.locked=!1}async execute(t){let n;await this.acquire();try{n=await Promise.resolve(t())}catch(t){throw this.release(),t}return this.release(),n}async acquire(){const t=this;return t.locked?new Promise(n=>t.queue.push(n)):(t.locked=!0,Promise.resolve())}release(){const t=this.queue.shift();t?void 0===globalThis.window?globalThis.process.nextTick(t):setTimeout(t,0):this.locked=!1}}class r{constructor(t=1,n,e){this.currentTransaction=void 0,this.lock=new s,this.counter=t,this.pendingTransactions=[],this.onBegin=n,this.onEnd=e}submit(t){const n=this;n.lock.acquire().then(()=>n.currentTransaction&&n.currentTransaction.id===t.id?(n.lock.release(),t.fire()):n.counter>0?(n.counter--,n.lock.release(),n.fireTransaction(t)):(n.pendingTransactions.push(t),void n.lock.release()))}fireTransaction(t){const n=this;n.lock.acquire().then(()=>{n.currentTransaction=t,n.lock.release(),n.onBegin?n.onBegin().then(()=>{t.fire()}):t.fire()})}async release(t){const n=this;return new Promise(e=>{n.lock.acquire().then(()=>{n.currentTransaction,n.currentTransaction=void 0,n.lock.release();const i=()=>{n.lock.acquire().then(()=>{if(n.pendingTransactions.length>0){const t=n.pendingTransactions.shift(),e=()=>n.fireTransaction(t);void 0===globalThis.window?globalThis.process.nextTick(e):setTimeout(e,0)}else n.counter++;n.lock.release(),e()})};n.onEnd?n.onEnd(t).then(()=>i()):i()})})}}const c={REFLECT:"model.transactional.",TRANSACTIONAL:"transactional"};function a(t){if(t)return"string"==typeof t?t:t.constructor&&t.constructor.name&&-1===["Function","Object"].indexOf(t.constructor.name)?t.constructor.name:"function"==typeof t&&t.name?t.name:t.toString()}class l{constructor(t,n,e,i){this.id=Date.now(),this.action=e,this.method=n,this.log=[[this.id,t,n].join(" | ")],this.source=t,this.metadata=i}static push(t,n,...e){const i=e.pop();if(!i||"function"!=typeof i)throw Error("Missing callback");const o=(t,...n)=>{l.getLock().release(t).then(()=>i(t,...n))},s=new l(t.constructor.name,n.name?a(n):"Anonymous",()=>n.call(s.bindToTransaction(t),...e,o));l.getLock().submit(s)}static setLock(t){this.lock=t}static getLock(){return this.lock||(this.lock=new r),this.lock}static submit(t){l.getLock().submit(t)}static async release(t){return l.getLock().release(t)}getMetadata(){return this.metadata?[...this.metadata]:void 0}bindTransaction(t){this.log.push(...t.log),t.bindTransaction=this.bindToTransaction.bind(this),t.bindToTransaction=this.bindToTransaction.bind(this),this.action=t.action}bindToTransaction(n){const o=e(n,void 0,c.REFLECT);if(!o)return n;const s=this,r=t.getAllProperties(n).reduce((e,i)=>(-1!==Object.keys(o).indexOf(i)&&o[i].find(t=>"transactional"===t.key)?e[i]=(...t)=>n[i].call(n.__originalObj||n,s,...t):"clazz"===i||"constructor"===i?e[i]=n[i]:"function"==typeof n[i]?e[i]=n[i].bind(n.__originalObj||n):"object"==typeof n[i]&&n[i].constructor&&t.getClassDecorators(c.REFLECT,n[i]).find(t=>"transactional"===t.key)?e[i]=s.bindToTransaction(n[i]):e[i]=n[i],e),{});return r[i.ORIGINAL]=n[i.ORIGINAL]||n,r.toString=()=>a(r[i.ORIGINAL])+" proxy for transaction "+this.id,r}fire(){if(!this.action)throw Error("Missing the method");return this.action()}toString(t=!0,n=!1){return`${t?`[${this.id}]`:""}[Transaction][${this.source}.${this.method}${n?"]\nTransaction Log:\n"+this.log.join("\n"):"]"}`}static key(t){return c.REFLECT+t}}function h(...t){return function(e,i,s){if(!s)throw new o("Missing descriptor. Should be impossible");n(l.key("transactional"),t)(e,i);const r=s.value,c=function(...n){const e=this;return new Promise((o,s)=>{const c=(t,n)=>{l.release(t).then(()=>{if(t)return s(t);o(n)})};let a=n.shift();if(a instanceof l){const c=new l(this.constructor.name,i,async()=>{r.call(c.bindToTransaction(e),...n).then(o).catch(s)},t.length?t:void 0);a.bindTransaction(c),a.fire()}else n.unshift(a),a=new l(this.constructor.name,i,()=>{r.call(a.bindToTransaction(e),...n).then(t=>c(void 0,t)).catch(c)},t.length?t:void 0),l.submit(a)})};Object.defineProperty(c,"name",{value:i}),s.value=c}}function u(t,...n){return t(l.getLock().currentTransaction,...n)}const d="##VERSION##";export{s as Lock,r as SyncronousLock,l as Transaction,c as TransactionalKeys,d as VERSION,h as transactional,u as transactionalSuperCall};
1
+ import{Metadata as t,method as e}from"@decaf-ts/decoration";import{InternalError as i,DBKeys as n}from"@decaf-ts/db-decorators";import{LoggedClass as s,Logging as a,getObjectName as r,isBrowser as o}from"@decaf-ts/logging";class c{constructor(){this.queue=[],this.locked=!1}async execute(t){let e;await this.acquire();try{e=await Promise.resolve(t())}catch(t){throw this.release(),t}return this.release(),e}async acquire(){const t=this;return t.locked?new Promise(e=>t.queue.push(e)):(t.locked=!0,Promise.resolve())}release(){const t=this.queue.shift();t?void 0===globalThis.window?globalThis.process.nextTick(t):setTimeout(t,0):this.locked=!1}}const l={TRANSACTIONAL:"transactional"};t.transactionals=e=>{const i=t.get(e,"transactional");return i?Object.keys(i):[]},t.isTransactional=e=>!!t.get(e,"transactional");class h extends i{constructor(t="Transaction timed out"){super(t,h.name,500)}}const u=new WeakMap;class g extends s{static{this.debug=!1}static{this.globalTimeout=-1}static{this.metadataCache=new WeakMap}static{this.log=new Proxy(a.for(g),{get:(t,e,i)=>"log"!==e||g.debug?Reflect.get(t,e,i):(...t)=>{}})}get log(){return this._log||(this._log=g.log),this._log}static{this.contexts=new WeakMap}constructor(t,e,i,n){super(),this.initialFireDispatched=!1,this.released=!1,this.id=Date.now(),this.action=i,this.method=e,this.logs=[[this.id,t,e].join(" | ")],this.source=t,this.metadata=n,this.completion=new Promise((t,e)=>{this.resolveCompletion=t,this.rejectCompletion=e})}static async push(t,e,...i){const n=this.log.for(this.push),s=g.describeTarget(t),a=g.describeTarget(e),r=new g(s,a,async()=>{const s=n.for(r.id.toString());try{s.verbose("Executing transaction method "+a),s.debug("With arguments: "+JSON.stringify(i));const n=await Promise.resolve(e.call(r.bindToTransaction(t),...i));return s.verbose(`Transaction method ${a} executed successfully`),s.debug("Result: "+JSON.stringify(n)),await r.release(),s.debug("lock released"),n}catch(t){throw await r.release(t),t}});return n.debug(`Pushing transaction ${r.id} for method ${a} on issuer ${s}`),g.submit(r)}static async run(t,e,i){const n="function"!=typeof t,s=n?t:void 0,a=n?e:t;if("function"!=typeof a)throw Error("Transaction.run requires an async function");const r=n?i:e,o=Array.isArray(r)&&r.length?r:void 0,c=s?g.describeTarget(s):g.describeTarget(a),l=g.describeTarget(a);let h;return h=new g(c,l,async()=>{let t;try{const t=s?h.bindToTransaction(s):void 0;return await a.call(t??h)}catch(e){throw t=e,e}finally{await h.release(t instanceof Error?t:void 0)}},o),g.submit(h)}static setLock(t){this.lock=t}static getLock(){return this.lock||(this.lock=new d),this.lock}static submit(t){return g.getLock().submit(t)}static async release(t){return g.getLock().release(t)}async release(t){this.released||(this.released=!0,await g.release(t))}getMetadata(){return this.metadata?[...this.metadata]:void 0}static getTransactionalMetadata(e){let i=this.metadataCache.get(e);if(i)return i;const s=new Set(["__transactionProxy","__transactionTarget","string"==typeof n.ORIGINAL?n.ORIGINAL:"__originalObj"]),a=t.transactionals(e)??[],r=(t.properties(e)||[]).filter(t=>!s.has(t)),o=new Map;return r.forEach(i=>{const n=t.type(e,i);o.set(i,!!n&&t.isTransactional(n))}),i={methods:a,propertyKeys:r,propertyDesignTypes:o},this.metadataCache.set(e,i),i}bindTransaction(t){this.log.for(this.bindTransaction).verbose(`Binding the ${t.toString()} to ${this}`),this.logs.push(...t.logs),t.bindTransaction=this.bindToTransaction.bind(this),t.bindToTransaction=this.bindToTransaction.bind(this),this.action=t.action}bindToTransaction(e){const i=this.log.for(this.bindToTransaction);i.verbose(`Binding object ${r(e)} to transaction ${this.id}`);const s=g.getTransactionalMetadata(e.constructor),a=s.methods;if(!a.length)return e;const o=this,c=new Set(["__transactionProxy","__transactionTarget","string"==typeof n.ORIGINAL?n.ORIGINAL:"__originalObj"]),l=new Set(s.propertyKeys);Object.getOwnPropertyNames(e).forEach(t=>{c.has(t)||l.add(t)});const h=Array.from(l).filter(i=>{if(s.propertyDesignTypes.get(i))return!0;const n=e[i];return!(!n||"object"!=typeof n&&"function"!=typeof n||!t.isTransactional(n.constructor))});i.debug(`found transaction methods: ${a.join(", ")} and properties: ${h.join(", ")}`);const u=new Proxy(e,{get:(t,e,i)=>a.includes(e)?new Proxy(t[e],{apply:(t,e,i)=>Reflect.apply(t,e,[o,...i])}):h.includes(e)?o.bindToTransaction(t[e]):Reflect.get(t,e,i)});return u[n.ORIGINAL]=e[n.ORIGINAL]||e,u.toString=()=>r(u[n.ORIGINAL])+" proxy for transaction "+this.id,u.__transactionProxy=!0,u.__transactionTarget=e.__transactionTarget||e,g.contexts.set(u,o),u}applyGlobalTimeout(t){if(0>=g.globalTimeout)return t;const e=g.globalTimeout,i=this.log.for(this.applyGlobalTimeout);return new Promise((n,s)=>{let a=!1;const r=setTimeout(()=>{if(a)return;const t=new h(`Transaction ${this.toString()} exceeded timeout of ${e}ms`);i.warn(t.message),this.release(t).catch(t=>i.error(t)),s(t)},e);t.then(t=>{a=!0,clearTimeout(r),n(t)}).catch(t=>{a=!0,clearTimeout(r),s(t)})})}fire(){if(!this.action)throw Error("Missing the method");const t=(async()=>this.action?await this.action():void 0)(),e=g.globalTimeout>0?this.applyGlobalTimeout(t):t;return this.initialFireDispatched||(this.initialFireDispatched=!0,e.then(t=>(this.resolveCompletion?.(t),t)).catch(t=>{throw this.rejectCompletion?.(t),t})),e}toString(t=!0,e=!1){return`${t?`[${this.id}]`:""}[Transaction][${this.source}.${this.method}${e?"]\nTransaction Log:\n"+this.logs.join("\n"):"]"}`}static contextTransaction(t){if(t&&t.__transactionProxy)return this.contexts.get(t)}wait(){return this.completion}static describeTarget(t){if(null===t||"object"!=typeof t&&"function"!=typeof t)return r(t);const e=t;let i=u.get(e);return i||(i=r(t),u.set(e,i)),i}}class d extends s{get log(){return this._log||(this._log=g.log.for(this)),this._log}logger(t){return this.loggerCache.has(t)||this.loggerCache.set(t,this.log.for(this[t])),this.loggerCache.get(t)}constructor(t=1,e,i){super(),this.counter=t,this.onBegin=e,this.onEnd=i,this.pendingTransactions=[],this.currentTransaction=void 0,this.loggerCache=new Map,this.lock=new c}async submit(t){const e=this.logger("submit");if(await this.lock.acquire(),e.silly("Lock acquired to submit transaction "+t.id),this.currentTransaction&&this.currentTransaction.id===t.id)return this.lock.release(),e.silly("Released lock for re-entrant transaction "+t.id),t.fire();let i;return this.counter>0?(this.counter--,this.lock.release(),e.silly("Released lock for transaction "+t.id),i=this.fireTransaction(t)):(e.debug(`Pushing transaction ${t.id} to the queue`),this.pendingTransactions.push(t),i=t.wait(),this.lock.release(),e.silly("Released lock after queuing transaction "+t.id)),i}async fireTransaction(t){const e=this.logger("fireTransaction");return await this.lock.acquire(),e.silly("Lock acquired obtain transaction "+t.id),this.currentTransaction=t,this.lock.release(),e.silly("Released lock after obtaining "+t.id),this.onBegin&&(e.verbose("Calling onBegin for transaction "+t.id),await this.onBegin()),e.info(`Starting transaction ${t.id}. ${this.pendingTransactions.length} remaining...`),t.fire()}async release(t){const e=this.logger("release");await this.lock.acquire(),this.currentTransaction||e.warn("Trying to release an unexisting transaction. should never happen..."),e.verbose("Releasing transaction "+this.currentTransaction?.toString(!0,!0));const i=this.currentTransaction?.id;if(this.currentTransaction=void 0,this.lock.release(),e.silly("Released lock after clearing transaction "+i),this.onEnd&&(e.verbose("Calling onEnd for transaction "+i),await this.onEnd(t)),await this.lock.acquire(),e.silly(`Acquired lock after completing transaction ${i} for pending transaction verification`),this.pendingTransactions.length>0){const t=this.pendingTransactions.shift(),i=()=>this.fireTransaction.call(this,t).catch(t=>{this.log.for(this.fireTransaction).error(t)});e.silly(`Marking ${t.id} for execution`),o()?setTimeout(i,0):globalThis.process.nextTick(i)}else e.debug("No pending transactions. Incrementing counter."),this.counter++;this.lock.release(),e.silly("Released lock after completing transaction "+i)}}function f(...n){return(s,a,r)=>{if(!r)throw new i("This decorator only applies to methods");return e()(s,a,r),t.set(s.constructor,t.key("transactional",a),{data:n}),r.value=new Proxy(r.value,{apply:async(t,e,i)=>new Promise((r,o)=>{async function c(t,e,i){return!e||e instanceof Error||i||(i=e,e=void 0),await t.release(e),e?o(e):r(i)}const l=i[0],h=(()=>{let t=0;for(;t<i.length&&i[t]instanceof g;)t++;return t})(),u=h>0?i.slice(h):i,d=l instanceof g?l:g.contextTransaction(e);if(d){const i=new g(s.name,a,async()=>{try{return r(await Reflect.apply(t,i.bindToTransaction(e),u))}catch(t){return o(t)}},n.length?n:void 0);d.bindTransaction(i),d.fire()}else{const i=new g(s.name,a,async()=>{try{return c(i,void 0,await Reflect.apply(t,i.bindToTransaction(e),u))}catch(t){return c(i,t)}},n.length?n:void 0);g.submit(i)}})}),r}}const T="##VERSION##",p="##PACKAGE##";t.registerLibrary(p,T);export{c as Lock,p as PACKAGE_NAME,d as SynchronousLock,h as TimeoutError,g as Transaction,l as TransactionalKeys,T as VERSION,f as transactional};
2
2
  //# sourceMappingURL=transactional-decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactional-decorators.js","sources":["../src/locks/Lock.ts","../src/locks/SyncronousLock.ts","../src/constants.ts","../src/utils.ts","../src/Transaction.ts","../src/decorators.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["Lock","constructor","this","queue","locked","execute","func","result","acquire","Promise","resolve","e","release","self","push","next","shift","globalThis","window","process","nextTick","setTimeout","SyncronousLock","counter","onBegin","onEnd","currentTransaction","undefined","lock","pendingTransactions","submit","transaction","then","id","fire","fireTransaction","err","afterConclusionCB","length","cb","TransactionalKeys","REFLECT","TRANSACTIONAL","getObjectName","obj","name","indexOf","toString","Transaction","source","method","action","metadata","Date","now","log","join","issuer","callbackMethod","args","callback","pop","Error","getLock","call","bindToTransaction","setLock","getMetadata","bindTransaction","nextTransaction","bind","transactionalMethods","getAllPropertyDecoratorsRecursive","boundObj","Reflection","getAllProperties","reduce","accum","k","Object","keys","find","o","key","__originalObj","getClassDecorators","DBKeys","ORIGINAL","withId","withLog","transactional","data","target","propertyKey","descriptor","InternalError","originalMethod","value","methodWrapper","reject","updatedTransaction","async","catch","unshift","defineProperty","transactionalSuperCall","VERSION"],"mappings":"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"}
1
+ {"version":3,"file":"transactional-decorators.js","sources":["../src/locks/Lock.ts","../src/constants.ts","../src/overrides/overrides.ts","../src/errors.ts","../src/Transaction.ts","../src/locks/SynchronousLock.ts","../src/decorators.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["Lock","constructor","this","queue","locked","execute","func","result","acquire","Promise","resolve","e","release","self","push","next","shift","globalThis","window","process","nextTick","setTimeout","TransactionalKeys","TRANSACTIONAL","Metadata","transactionals","obj","meta","get","Object","keys","isTransactional","TimeoutError","InternalError","message","super","name","objectNameCache","WeakMap","Transaction","LoggedClass","debug","globalTimeout","metadataCache","log","Proxy","Logging","for","target","prop","receiver","Reflect","args","contexts","source","method","action","metadata","initialFireDispatched","released","id","Date","now","logs","join","completion","reject","resolveCompletion","rejectCompletion","issuer","issuerName","describeTarget","methodName","transaction","async","l","toString","verbose","JSON","stringify","call","bindToTransaction","submit","run","contextOrRunnable","runnableOrMetadata","maybeMetadata","contextProvided","context","undefined","runnable","Error","rawMetadata","metadataValue","Array","isArray","length","sourceName","caughtError","boundContext","error","setLock","lock","getLock","SynchronousLock","err","getMetadata","getTransactionalMetadata","cached","reservedProps","Set","DBKeys","ORIGINAL","methods","propertyKeys","properties","filter","has","propertyDesignTypes","Map","forEach","type","set","bindTransaction","nextTransaction","bind","getObjectName","transactionalMethods","props","getOwnPropertyNames","add","transactionProps","from","p","value","boundObj","includes","apply","methodTarget","thisArg","argArray","__transactionProxy","__transactionTarget","applyGlobalTimeout","execution","timeoutMs","settled","timer","warn","catch","releaseErr","then","clearTimeout","fire","baseExecution","executeAction","withId","withLog","contextTransaction","wait","key","logger","loggerCache","counter","onBegin","onEnd","pendingTransactions","currentTransaction","silly","resultPromise","fireTransaction","info","cb","isBrowser","transactional","data","propertyKey","descriptor","exitFunction","candidate","transactionPrefixLength","count","invocationArgs","slice","activeTransaction","updatedTransaction","newTransaction","VERSION","PACKAGE_NAME","registerLibrary"],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Transaction = void 0;
4
- const reflection_1 = require("@decaf-ts/reflection");
5
- const SyncronousLock_1 = require("./locks/SyncronousLock.cjs");
4
+ const SynchronousLock_1 = require("./locks/SynchronousLock.cjs");
6
5
  const db_decorators_1 = require("@decaf-ts/db-decorators");
7
- const utils_1 = require("./utils.cjs");
8
- const constants_1 = require("./constants.cjs");
6
+ require("./overrides/index.cjs");
7
+ const decoration_1 = require("@decaf-ts/decoration");
8
+ const logging_1 = require("@decaf-ts/logging");
9
+ const errors_1 = require("./errors.cjs");
10
+ const objectNameCache = new WeakMap();
9
11
  /**
10
12
  * @description Core transaction management class
11
13
  * @summary Manages transaction lifecycle, including creation, execution, and cleanup. Provides mechanisms for binding transactions to objects and methods, ensuring proper transaction context propagation.
@@ -50,36 +52,109 @@ const constants_1 = require("./constants.cjs");
50
52
  * T->>L: release(error?)
51
53
  * L-->>C: Return result/error
52
54
  */
53
- class Transaction {
55
+ class Transaction extends logging_1.LoggedClass {
56
+ static { this.debug = false; }
57
+ static { this.globalTimeout = -1; }
58
+ static { this.metadataCache = new WeakMap(); }
59
+ static { this.log = new Proxy(logging_1.Logging.for(Transaction), {
60
+ get(target, prop, receiver) {
61
+ if (prop !== "log" || Transaction.debug)
62
+ return Reflect.get(target, prop, receiver);
63
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
64
+ return (...args) => {
65
+ // do nothing. ignore the log message the Transaction is not in debug mode
66
+ };
67
+ },
68
+ }); }
69
+ get log() {
70
+ if (!this["_log"]) {
71
+ this["_log"] = Transaction.log;
72
+ }
73
+ return this["_log"];
74
+ }
75
+ static { this.contexts = new WeakMap(); }
54
76
  constructor(source, method, action, metadata) {
77
+ super();
78
+ this.initialFireDispatched = false;
79
+ this.released = false;
55
80
  this.id = Date.now();
56
81
  this.action = action;
57
82
  this.method = method;
58
- this.log = [[this.id, source, method].join(" | ")];
83
+ this.logs = [[this.id, source, method].join(" | ")];
59
84
  this.source = source;
60
85
  this.metadata = metadata;
86
+ this.completion = new Promise((resolve, reject) => {
87
+ this.resolveCompletion = resolve;
88
+ this.rejectCompletion = reject;
89
+ });
61
90
  }
62
91
  /**
63
92
  * @description Queues a transaction for execution
64
93
  * @summary Pushes a transaction to the queue and waits for its resolution. Creates a new transaction with the provided issuer and callback method, then submits it to the transaction lock.
65
94
  * @param {any} issuer - Any class instance that will be used as 'this' when calling the callbackMethod
66
- * @param {Function} callbackMethod - Callback function containing the transaction logic, will be called with the issuer as 'this'
95
+ * @param {Function} method - function containing the transaction logic, will be called with the issuer as 'this'
67
96
  * @param {any[]} args - Arguments to pass to the method. Last one must be the callback function
68
97
  * @return {void}
69
98
  */
70
- static push(issuer, callbackMethod, ...args) {
71
- const callback = args.pop();
72
- if (!callback || typeof callback !== "function")
73
- throw new Error("Missing callback");
74
- const cb = (err, ...args) => {
75
- Transaction.getLock()
76
- .release(err)
77
- .then(() => callback(err, ...args));
78
- };
79
- const transaction = new Transaction(issuer.constructor.name, callbackMethod.name ? (0, utils_1.getObjectName)(callbackMethod) : "Anonymous", () => {
80
- return callbackMethod.call(transaction.bindToTransaction(issuer), ...args, cb);
99
+ static async push(issuer, method, ...args) {
100
+ const log = this.log.for(this.push);
101
+ const issuerName = Transaction.describeTarget(issuer);
102
+ const methodName = Transaction.describeTarget(method);
103
+ const transaction = new Transaction(issuerName, methodName, async () => {
104
+ const l = log.for(transaction.id.toString());
105
+ try {
106
+ l.verbose(`Executing transaction method ${methodName}`);
107
+ l.debug(`With arguments: ${JSON.stringify(args)}`);
108
+ const result = await Promise.resolve(method.call(transaction.bindToTransaction(issuer), ...args));
109
+ l.verbose(`Transaction method ${methodName} executed successfully`);
110
+ l.debug(`Result: ${JSON.stringify(result)}`);
111
+ await transaction.release();
112
+ l.debug("lock released");
113
+ return result;
114
+ }
115
+ catch (e) {
116
+ await transaction.release(e);
117
+ throw e;
118
+ }
81
119
  });
82
- Transaction.getLock().submit(transaction);
120
+ log.debug(`Pushing transaction ${transaction.id} for method ${methodName} on issuer ${issuerName}`);
121
+ return Transaction.submit(transaction);
122
+ }
123
+ static async run(contextOrRunnable, runnableOrMetadata, maybeMetadata) {
124
+ const contextProvided = typeof contextOrRunnable !== "function";
125
+ const context = (contextProvided ? contextOrRunnable : undefined);
126
+ const runnable = (contextProvided ? runnableOrMetadata : contextOrRunnable);
127
+ if (typeof runnable !== "function") {
128
+ throw new Error("Transaction.run requires an async function");
129
+ }
130
+ const rawMetadata = contextProvided ? maybeMetadata : runnableOrMetadata;
131
+ const metadataValue = Array.isArray(rawMetadata) && rawMetadata.length
132
+ ? rawMetadata
133
+ : undefined;
134
+ const sourceName = context
135
+ ? Transaction.describeTarget(context)
136
+ : Transaction.describeTarget(runnable);
137
+ const methodName = Transaction.describeTarget(runnable);
138
+ // eslint-disable-next-line prefer-const
139
+ let transaction;
140
+ const action = async () => {
141
+ let caughtError;
142
+ try {
143
+ const boundContext = context
144
+ ? transaction.bindToTransaction(context)
145
+ : undefined;
146
+ return await runnable.call((boundContext ?? transaction));
147
+ }
148
+ catch (error) {
149
+ caughtError = error;
150
+ throw error;
151
+ }
152
+ finally {
153
+ await transaction.release(caughtError instanceof Error ? caughtError : undefined);
154
+ }
155
+ };
156
+ transaction = new Transaction(sourceName, methodName, action, metadataValue);
157
+ return Transaction.submit(transaction);
83
158
  }
84
159
  /**
85
160
  * @description Configures the transaction lock implementation
@@ -97,7 +172,7 @@ class Transaction {
97
172
  */
98
173
  static getLock() {
99
174
  if (!this.lock)
100
- this.lock = new SyncronousLock_1.SyncronousLock();
175
+ this.lock = new SynchronousLock_1.SynchronousLock();
101
176
  return this.lock;
102
177
  }
103
178
  /**
@@ -107,7 +182,7 @@ class Transaction {
107
182
  * @return {void}
108
183
  */
109
184
  static submit(transaction) {
110
- Transaction.getLock().submit(transaction);
185
+ return Transaction.getLock().submit(transaction);
111
186
  }
112
187
  /**
113
188
  * @description Releases the transaction lock
@@ -118,6 +193,18 @@ class Transaction {
118
193
  static async release(err) {
119
194
  return Transaction.getLock().release(err);
120
195
  }
196
+ /**
197
+ * @description Releases the transaction instance once
198
+ * @summary Ensures the underlying lock is released at most a single time for the transaction
199
+ * @param {Error} [err] - Optional error to propagate to the lock implementation
200
+ * @return {Promise<void>} Resolves once the lock release call finishes or immediately when already released
201
+ */
202
+ async release(err) {
203
+ if (this.released)
204
+ return;
205
+ this.released = true;
206
+ await Transaction.release(err);
207
+ }
121
208
  /**
122
209
  * @description Retrieves transaction metadata
123
210
  * @summary Returns a copy of the metadata associated with this transaction, ensuring the original metadata remains unmodified
@@ -126,6 +213,26 @@ class Transaction {
126
213
  getMetadata() {
127
214
  return this.metadata ? [...this.metadata] : undefined;
128
215
  }
216
+ static getTransactionalMetadata(target) {
217
+ let cached = this.metadataCache.get(target);
218
+ if (cached)
219
+ return cached;
220
+ const reservedProps = new Set([
221
+ "__transactionProxy",
222
+ "__transactionTarget",
223
+ typeof db_decorators_1.DBKeys.ORIGINAL === "string" ? db_decorators_1.DBKeys.ORIGINAL : "__originalObj",
224
+ ]);
225
+ const methods = decoration_1.Metadata.transactionals(target) ?? [];
226
+ const propertyKeys = (decoration_1.Metadata.properties(target) || []).filter((prop) => !reservedProps.has(prop));
227
+ const propertyDesignTypes = new Map();
228
+ propertyKeys.forEach((prop) => {
229
+ const type = decoration_1.Metadata.type(target, prop);
230
+ propertyDesignTypes.set(prop, !!type && decoration_1.Metadata.isTransactional(type));
231
+ });
232
+ cached = { methods, propertyKeys, propertyDesignTypes };
233
+ this.metadataCache.set(target, cached);
234
+ return cached;
235
+ }
129
236
  /**
130
237
  * @description Links a new transaction to the current one
131
238
  * @summary Binds a new transaction operation to the current transaction, transferring logs and binding methods to maintain transaction context
@@ -133,8 +240,10 @@ class Transaction {
133
240
  * @return {void}
134
241
  */
135
242
  bindTransaction(nextTransaction) {
136
- // all(`Binding the {0} to {1}`, nextTransaction, this);
137
- this.log.push(...nextTransaction.log);
243
+ this.log
244
+ .for(this.bindTransaction)
245
+ .verbose(`Binding the ${nextTransaction.toString()} to ${this}`);
246
+ this.logs.push(...nextTransaction.logs);
138
247
  nextTransaction.bindTransaction = this.bindToTransaction.bind(this);
139
248
  nextTransaction.bindToTransaction = this.bindToTransaction.bind(this);
140
249
  this.action = nextTransaction.action;
@@ -146,36 +255,94 @@ class Transaction {
146
255
  * @return {any} The bound object with transaction-aware method wrappers
147
256
  */
148
257
  bindToTransaction(obj) {
149
- const transactionalMethods = (0, db_decorators_1.getAllPropertyDecoratorsRecursive)(obj, undefined, constants_1.TransactionalKeys.REFLECT);
150
- if (!transactionalMethods)
258
+ const log = this.log.for(this.bindToTransaction);
259
+ log.verbose(`Binding object ${(0, logging_1.getObjectName)(obj)} to transaction ${this.id}`);
260
+ const metadata = Transaction.getTransactionalMetadata(obj.constructor);
261
+ const transactionalMethods = metadata.methods;
262
+ if (!transactionalMethods.length)
151
263
  return obj;
152
264
  // eslint-disable-next-line @typescript-eslint/no-this-alias
153
265
  const self = this;
154
- const boundObj = reflection_1.Reflection.getAllProperties(obj).reduce((accum, k) => {
155
- if (Object.keys(transactionalMethods).indexOf(k) !== -1 &&
156
- transactionalMethods[k].find((o) => o.key === constants_1.TransactionalKeys.TRANSACTIONAL))
157
- accum[k] = (...args) => obj[k].call(obj.__originalObj || obj, self, ...args);
158
- else if (k === "clazz" || k === "constructor")
159
- accum[k] = obj[k];
160
- else if (typeof obj[k] === "function")
161
- accum[k] = obj[k].bind(obj.__originalObj || obj);
162
- else if (typeof obj[k] === "object" && obj[k].constructor) {
163
- const decs = reflection_1.Reflection.getClassDecorators(constants_1.TransactionalKeys.REFLECT, obj[k]);
164
- if (decs.find((e) => e.key === constants_1.TransactionalKeys.TRANSACTIONAL))
165
- accum[k] = self.bindToTransaction(obj[k]);
166
- else
167
- accum[k] = obj[k];
266
+ const reservedProps = new Set([
267
+ "__transactionProxy",
268
+ "__transactionTarget",
269
+ typeof db_decorators_1.DBKeys.ORIGINAL === "string" ? db_decorators_1.DBKeys.ORIGINAL : "__originalObj",
270
+ ]);
271
+ const props = new Set(metadata.propertyKeys);
272
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
273
+ if (!reservedProps.has(prop))
274
+ props.add(prop);
275
+ });
276
+ const transactionProps = Array.from(props).filter((p) => {
277
+ if (metadata.propertyDesignTypes.get(p))
278
+ return true;
279
+ const value = obj[p];
280
+ if (value &&
281
+ (typeof value === "object" || typeof value === "function") &&
282
+ decoration_1.Metadata.isTransactional(value.constructor)) {
283
+ return true;
168
284
  }
169
- else
170
- accum[k] = obj[k];
171
- return accum;
172
- }, {});
173
- boundObj[db_decorators_1.DBKeys.ORIGINAL] = obj[db_decorators_1.DBKeys.ORIGINAL] || obj;
174
- boundObj.toString = () => (0, utils_1.getObjectName)(boundObj[db_decorators_1.DBKeys.ORIGINAL]) +
285
+ return false;
286
+ });
287
+ log.debug(`found transaction methods: ${transactionalMethods.join(", ")} and properties: ${transactionProps.join(", ")}`);
288
+ const boundObj = new Proxy(obj, {
289
+ get(target, prop, receiver) {
290
+ if (transactionalMethods.includes(prop))
291
+ return new Proxy(target[prop], {
292
+ apply(methodTarget, thisArg, argArray) {
293
+ return Reflect.apply(methodTarget, thisArg, [self, ...argArray]);
294
+ },
295
+ });
296
+ if (transactionProps.includes(prop))
297
+ return self.bindToTransaction(target[prop]);
298
+ return Reflect.get(target, prop, receiver);
299
+ },
300
+ });
301
+ boundObj[db_decorators_1.DBKeys.ORIGINAL] =
302
+ obj[db_decorators_1.DBKeys.ORIGINAL] || obj;
303
+ boundObj.toString = () => (0, logging_1.getObjectName)(boundObj[db_decorators_1.DBKeys.ORIGINAL]) +
175
304
  " proxy for transaction " +
176
305
  this.id;
306
+ boundObj.__transactionProxy = true;
307
+ boundObj.__transactionTarget =
308
+ obj.__transactionTarget || obj;
309
+ Transaction.contexts.set(boundObj, self);
177
310
  return boundObj;
178
311
  }
312
+ /**
313
+ * @description Applies the global timeout to the provided Promise, if configured
314
+ * @param {Promise<R>} execution - Transaction execution promise
315
+ * @return {Promise<R>} Promise that respects the configured global timeout
316
+ * @private
317
+ */
318
+ applyGlobalTimeout(execution) {
319
+ if (Transaction.globalTimeout <= 0)
320
+ return execution;
321
+ const timeoutMs = Transaction.globalTimeout;
322
+ const log = this.log.for(this.applyGlobalTimeout);
323
+ return new Promise((resolve, reject) => {
324
+ let settled = false;
325
+ const timer = setTimeout(() => {
326
+ if (settled)
327
+ return;
328
+ const error = new errors_1.TimeoutError(`Transaction ${this.toString()} exceeded timeout of ${timeoutMs}ms`);
329
+ log.warn(error.message);
330
+ this.release(error).catch((releaseErr) => log.error(releaseErr));
331
+ reject(error);
332
+ }, timeoutMs);
333
+ execution
334
+ .then((value) => {
335
+ settled = true;
336
+ clearTimeout(timer);
337
+ resolve(value);
338
+ })
339
+ .catch((err) => {
340
+ settled = true;
341
+ clearTimeout(timer);
342
+ reject(err);
343
+ });
344
+ });
345
+ }
179
346
  /**
180
347
  * @description Executes the transaction action
181
348
  * @summary Fires the transaction by executing its associated action function, throwing an error if no action is defined
@@ -184,7 +351,26 @@ class Transaction {
184
351
  fire() {
185
352
  if (!this.action)
186
353
  throw new Error(`Missing the method`);
187
- return this.action();
354
+ const executeAction = async () => {
355
+ return this.action ? await this.action() : undefined;
356
+ };
357
+ const baseExecution = executeAction();
358
+ const execution = Transaction.globalTimeout > 0
359
+ ? this.applyGlobalTimeout(baseExecution)
360
+ : baseExecution;
361
+ if (!this.initialFireDispatched) {
362
+ this.initialFireDispatched = true;
363
+ execution
364
+ .then((result) => {
365
+ this.resolveCompletion?.(result);
366
+ return result;
367
+ })
368
+ .catch((err) => {
369
+ this.rejectCompletion?.(err);
370
+ throw err;
371
+ });
372
+ }
373
+ return execution;
188
374
  }
189
375
  /**
190
376
  * @description Provides a string representation of the transaction
@@ -194,17 +380,29 @@ class Transaction {
194
380
  * @return {string} A string representation of the transaction
195
381
  */
196
382
  toString(withId = true, withLog = false) {
197
- return `${withId ? `[${this.id}]` : ""}[Transaction][${this.source}.${this.method}${withLog ? `]\nTransaction Log:\n${this.log.join("\n")}` : "]"}`;
383
+ return `${withId ? `[${this.id}]` : ""}[Transaction][${this.source}.${this.method}${withLog ? `]\nTransaction Log:\n${this.logs.join("\n")}` : "]"}`;
198
384
  }
199
- /**
200
- * @description Generates a reflection metadata key for transactions
201
- * @summary Creates a prefixed reflection key for transaction-related metadata, ensuring proper namespacing
202
- * @param {string} key - The base key to prefix with the transaction reflection namespace
203
- * @return {string} The complete reflection key for transaction metadata
204
- * @function key
205
- */
206
- static key(key) {
207
- return constants_1.TransactionalKeys.REFLECT + key;
385
+ static contextTransaction(context) {
386
+ if (!context || !context.__transactionProxy) {
387
+ return undefined;
388
+ }
389
+ return this.contexts.get(context);
390
+ }
391
+ wait() {
392
+ return this.completion;
393
+ }
394
+ static describeTarget(target) {
395
+ if (target === null ||
396
+ (typeof target !== "object" && typeof target !== "function")) {
397
+ return (0, logging_1.getObjectName)(target);
398
+ }
399
+ const key = target;
400
+ let cached = objectNameCache.get(key);
401
+ if (!cached) {
402
+ cached = (0, logging_1.getObjectName)(target);
403
+ objectNameCache.set(key, cached);
404
+ }
405
+ return cached;
208
406
  }
209
407
  }
210
408
  exports.Transaction = Transaction;