UNPKG

flexbiz-server

Version:

Flexible Server

15 lines (14 loc) 6.42 kB
const {storage,getCurrentStore,getCurrentSession,runWithSession,isModelExcludedFromSession}=require("./sessionContext"),DEBUG=process.env.SESSION_DEBUG==="true";function logDebug($prefix$$,$model$$,$method$$,$opts$$={}){DEBUG&&Logger.info(`[${$prefix$$}] Model=${$model$$?.modelName||"?"} Method=${$method$$} Session=${$opts$$.session?$opts$$.session._debugId||$opts$$.session.id||$opts$$.session.client?.id||"(no id)":"none"}`)} const writeMethods="save updateOne updateMany deleteOne deleteMany insertMany create findOneAndUpdate findOneAndDelete findOneAndRemove findByIdAndUpdate findByIdAndDelete findByIdAndRemove".split(" "),readMethods=[];mongoose.Query.prototype.inTxn=function(){this._explicitSession=!0;return this}; [...writeMethods,...readMethods].forEach($method$$=>{const $original$$=mongoose.Model.prototype[$method$$];typeof $original$$==="function"&&(mongoose.Model.prototype[$method$$]=function(...$args$$){const $session$$=getCurrentSession(),$currentStore$$=getCurrentStore(),$lastArg$$=$args$$[$args$$.length-1],$hasCallback$$=typeof $lastArg$$==="function",$modelName$$=this.constructor.modelName||this.modelName;let $opts$$=$args$$[$hasCallback$$?$args$$.length-2:$args$$.length-1];if(typeof $opts$$!=="object"|| Array.isArray($opts$$))$opts$$={},$hasCallback$$?$args$$.splice($args$$.length-1,0,$opts$$):$args$$.push($opts$$);!$session$$||$opts$$.session||isModelExcludedFromSession($modelName$$)?logDebug("NoSession",this,$method$$,{session:$opts$$.session}):($opts$$.session=$session$$,logDebug("AttachSession",this,$method$$,{session:$session$$}));$hasCallback$$&&($args$$[$args$$.length-1]=(...$cbArgs$$)=>$currentStore$$?storage.run($currentStore$$,()=>$lastArg$$(...$cbArgs$$)):$session$$?runWithSession($session$$, ()=>$lastArg$$(...$cbArgs$$)):$lastArg$$(...$cbArgs$$));try{const $result$$=$original$$.apply(this,$args$$);$result$$?.then&&$result$$.then(()=>logDebug("OK",this,$method$$,{session:$opts$$.session})).catch($err$$=>{Logger.error(`[mongoosePatch] Err: ${$modelName$$}.${$method$$} Session=${$opts$$.session?._debugId||"none"}`,$err$$.message)});return $result$$}catch($err$$){throw Logger.error(`[mongoosePatch] Err: ${$modelName$$}.${$method$$}`,$err$$),$err$$;}})});const originalExec=mongoose.Query.prototype.exec; originalExec&&(mongoose.Query.prototype.exec=function(...$args$$){const $session$$=getCurrentSession(),$currentStore$$=getCurrentStore(),$modelName$$=this.model?.modelName||"UnknownModel",$operation$$=this.op||"unknownOp";var $cbIndex_isWriteOp$$=/insert|create|update|delete|remove|findAndModify/i.test($operation$$);const $isExplicitRequest$$=this._explicitSession===!0,$forceSession$$=$currentStore$$?.forceSession===!0,$isExcluded$$=isModelExcludedFromSession(this.model);$session$$&&!$isExcluded$$&& ($cbIndex_isWriteOp$$||$isExplicitRequest$$||$forceSession$$)&&!this.options.session?(this.options.session=$session$$,logDebug("AttachSession(Query)",this.model,$operation$$,{session:$session$$})):logDebug("NoSession(Query)",this.model,$operation$$,{session:this.options.session});$cbIndex_isWriteOp$$=$args$$.findIndex($a$$=>typeof $a$$==="function");if($cbIndex_isWriteOp$$!==-1){const $cb$$=$args$$[$cbIndex_isWriteOp$$];$args$$[$cbIndex_isWriteOp$$]=(...$cbArgs$$)=>$currentStore$$?storage.run($currentStore$$, ()=>$cb$$(...$cbArgs$$)):$session$$?runWithSession($session$$,()=>$cb$$(...$cbArgs$$)):$cb$$(...$cbArgs$$)}try{const $result$$=originalExec.apply(this,$args$$);$result$$?.then&&$result$$.then(()=>logDebug("OK(Query)",this.model,$operation$$,{session:this.options.session})).catch($err$$=>{$err$$.message.includes("has been committed")||$err$$.message.includes("has been aborted")||$err$$.message.includes("Session has been closed")?logDebug("SkipCommitError(Query)",this.model,$operation$$,{session:this.options.session, message:"Skipping committed/aborted session error."}):Logger.error(`[mongoosePatch][ERR(Query)] ${$modelName$$}.${$operation$$} session=${this.options.session?._debugId||"none"}\n`,$err$$.message)});return $result$$}catch($err$$){throw Logger.error(`[mongoosePatch][THROW(Query)] ${$modelName$$}.${$operation$$}`,$err$$.message),$err$$;}});Logger.info("[mongoosePatch] \u2705 Auto session + debug logging enabled"); mongoose.Aggregate&&(mongoose.Aggregate.prototype.inTxn=function(){this._explicitSession=!0;return this});const originalAggExec=mongoose.Aggregate.prototype.exec; originalAggExec&&(mongoose.Aggregate.prototype.exec=function(...$args$$){const $session$$=getCurrentSession(),$currentStore$$=getCurrentStore(),$modelName$$=this._model?.modelName||"UnknownModel";var $cbIndex$jscomp$1_isExplicitRequest$$=this._explicitSession===!0;const $isWriteOp$$=this._pipeline.some($stage$$=>$stage$$.$out||$stage$$.$merge),$isExcluded$$=isModelExcludedFromSession(this._model),$forceSession$$=$currentStore$$?.forceSession===!0;$session$$&&!$isExcluded$$&&($isWriteOp$$||$cbIndex$jscomp$1_isExplicitRequest$$|| $forceSession$$)&&!this.options.session?(this.options||(this.options={}),this.options.session=$session$$,logDebug("AttachSession(Agg)",this._model,"aggregate",{session:$session$$})):logDebug("NoSession(Agg)",this._model,"aggregate",{session:this.options?.session});$cbIndex$jscomp$1_isExplicitRequest$$=$args$$.findIndex($a$$=>typeof $a$$==="function");if($cbIndex$jscomp$1_isExplicitRequest$$!==-1){const $cb$$=$args$$[$cbIndex$jscomp$1_isExplicitRequest$$];$args$$[$cbIndex$jscomp$1_isExplicitRequest$$]= (...$cbArgs$$)=>$currentStore$$?storage.run($currentStore$$,()=>$cb$$(...$cbArgs$$)):$session$$?runWithSession($session$$,()=>$cb$$(...$cbArgs$$)):$cb$$(...$cbArgs$$)}try{const $result$$=originalAggExec.apply(this,$args$$);$result$$?.then&&$result$$.then(()=>logDebug("OK(Agg)",this._model,"aggregate",{session:this.options?.session})).catch($err$$=>{$err$$.message.includes("has been committed")||$err$$.message.includes("has been aborted")||$err$$.message.includes("Session has been closed")?logDebug("SkipCommitError(Agg)", this._model,"aggregate",{session:this.options?.session,message:"Skipping committed/aborted session error."}):Logger.error(`[mongoosePatch][ERR(Agg)] ${$modelName$$}.${"aggregate"} session=${this.options?.session?._debugId||"none"}\n`,$err$$.message)});return $result$$}catch($err$$){throw Logger.error(`[mongoosePatch][THROW(Agg)] ${$modelName$$}.${"aggregate"}`,$err$$.message),$err$$;}});Logger.info("[mongoosePatch] \u2705 Aggregate session support enabled");