UNPKG

flexbiz-server

Version:

Flexible Server

5 lines (4 loc) 1.68 kB
const mongoose=require("mongoose"),{runWithSession,getAfterCommitList}=require("./libs/sessionContext.js"); exports.transactionMiddleware=function($options$$={autoCommit:!0}){return async($req$$,$res$$,$next$$)=>{const $session$$=await mongoose.startSession();let $finished$$=!1,$committed$$=!1,$afterCommitCallbacks$$=[];try{await runWithSession($session$$,async()=>{await $session$$.startTransaction();$res$$.on("finish",async()=>{if(!$finished$$){$finished$$=!0;try{$res$$.statusCode<400&&$options$$.autoCommit?(await $session$$.commitTransaction(),$committed$$=!0,Logger.info("[transactionMiddleware] \u2705 Transaction committed")): (await $session$$.abortTransaction(),Logger.info("[transactionMiddleware] \u26a0\ufe0f Transaction aborted"))}catch($err$$){Logger.error("[transactionMiddleware] Transaction finalize error:",$err$$)}finally{$afterCommitCallbacks$$=getAfterCommitList();try{await $session$$.endSession(),Logger.info("[transactionMiddleware] \ud83d\udd12 Session ended")}catch($e$$){Logger.warn("[transactionMiddleware] Warning: endSession failed:",$e$$)}if($committed$$)try{const $callbacks$$=$afterCommitCallbacks$$;if($callbacks$$?.length){Logger.info(`[transactionMiddleware] \ud83d\udd01 Running ${$callbacks$$.length} afterCommit callbacks...`); for(const $cb$$ of $callbacks$$)try{await Promise.resolve($cb$$())}catch($cbErr$$){Logger.error("[afterCommit callback error]",$cbErr$$)}}}catch($err$$){Logger.error("[transactionMiddleware] afterCommit execution error:",$err$$)}}}});await $next$$()})}catch($err$$){$finished$$||($finished$$=!0,await $session$$.abortTransaction().catch(()=>{}),await $session$$.endSession().catch(()=>{})),$next$$($err$$)}}};