Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const shimmer=require("shimmer"),requireHook=require("../../../util/requireHook"),tracingUtil=require("../../tracingUtil"),constants=require("../../constants"),cls=require("../../cls"),superbrain=require("@supertenant/superbrain")["superbrain"],superconsts=require("@supertenant/superconsts"),getOrCreateTask=require("../../taskManager")["getOrCreateTask"];let isActive=!0;exports.spanName="redis",exports.batchable=!0,exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1},exports.init=function(){requireHook.onFileLoad(/\/@redis\/client\/dist\/lib\/cluster\/commands.js/,captureCommands),requireHook.onModuleLoad("redis",instrument)};const DEFAULT_REDIS_PORT=6379,DEFAULT_REDIS_ADDRESS="localhost:"+DEFAULT_REDIS_PORT;let redisCommandList=[];function captureCommands(file){file&&file.default&&(redisCommandList=Object.keys(file.default))}function instrument(redis){var wrapExec;redis.RedisClient?(shimAllCommands(redis.RedisClient.prototype,!1,!0),redis.Multi&&(wrapExec=isAtomic=>function(originalFn){return function(){var addressUrl=this._client?this._client.address:null;return instrumentMultiExec(this,arguments,originalFn,addressUrl,isAtomic,!0,this.queue)}},"function"==typeof redis.Multi.prototype.exec_transaction&&shimmer.wrap(redis.Multi.prototype,"exec_transaction",wrapExec(!0)),"function"==typeof redis.Multi.prototype.exec_batch&&shimmer.wrap(redis.Multi.prototype,"exec_batch",wrapExec(!1)),"function"==typeof redis.Multi.prototype.EXEC&&shimmer.wrap(redis.Multi.prototype,"EXEC",wrapExec(!1)),"function"==typeof redis.Multi.prototype.exec)&&("function"!=typeof redis.Multi.prototype.exec_transaction?shimmer.wrap(redis.Multi.prototype,"exec",wrapExec(!0)):shimmer.wrap(redis.Multi.prototype,"exec",wrapExec(!1)))):shimmer.wrap(redis,"createClient",originalCreatedClientFn=>function(createClientOpts){var redisClient=originalCreatedClientFn.apply(this,arguments);const addressUrl={address:DEFAULT_REDIS_ADDRESS,port:void 0,username:void 0,db:void 0};return createClientOpts&&(createClientOpts.url?addressUrl.address=createClientOpts.url:createClientOpts.socket?createClientOpts.socket.host?addressUrl.address=createClientOpts.socket.host+":"+createClientOpts.socket.port:createClientOpts.socket.path&&(addressUrl.address=createClientOpts.socket.path):createClientOpts.host&&(addressUrl.address=createClientOpts.host),createClientOpts.port&&(addressUrl.port=createClientOpts.port),createClientOpts.username&&(addressUrl.username=createClientOpts.username),createClientOpts.database)&&(addressUrl.db=createClientOpts.database),shimAllCommands(redisClient,addressUrl,!1,redisCommandList),redisClient.multi&&shimmer.wrap(redisClient,"multi",originalMultiFn=>function(){var result=originalMultiFn.apply(this,arguments);const selfMadeQueue=[];return shimmer.wrap(result,"addCommand",addCommandOriginalFn=>function(){return selfMadeQueue.push(arguments[0]),addCommandOriginalFn.apply(this,arguments)}),shimmer.wrap(result,"exec",execOriginalFn=>function(){return instrumentMultiExec(this,arguments,execOriginalFn,addressUrl,!0,!1,selfMadeQueue)}),shimmer.wrap(result,"execAsPipeline",execAsPipelineOriginalFn=>function(){return instrumentMultiExec(this,arguments,execAsPipelineOriginalFn,addressUrl,!1,!1,selfMadeQueue)}),result}),redisClient})}function shimAllCommands(redisClass,addressUrl,cbStyle,redisCommands){let list=redisCommands;list&&list.length||(list=require("./redis-commands.json"));const wrapCommand=commandName=>function(original){return instrumentCommand(original,commandName,addressUrl,cbStyle)};list.forEach(name=>{var upperCaseFnName;redisClass[name]&&"multi"!==name&&(shimmer.wrap(redisClass,name,wrapCommand(name)),upperCaseFnName=name.toUpperCase(),redisClass[upperCaseFnName])&&shimmer.wrap(redisClass,upperCaseFnName,wrapCommand(name))})}function instrumentCommand(original,command,address,cbStyle){return function(){const origCtx=this,origArgs=arguments;return cls.skipExitTracing({isActive:isActive})?original.apply(origCtx,origArgs):cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.stack=tracingUtil.getStackTrace(instrumentCommand),span.data.redis={connection:address.address||origCtx.address,command:command};var splitConnection=getSplitConnection(span.data.redis.connection,address,origCtx);let openSpanResult=null;var stSpanData,stTaskId=getOrCreateTask();0!==stTaskId&&((stSpanData={})[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.Redis,stSpanData[superconsts.Label.IntegrationModuleResourceId]=splitConnection.host,stSpanData[superconsts.Label.DbDatabase]=splitConnection.db,stSpanData[superconsts.Label.DbHost]=splitConnection.host,stSpanData[superconsts.Label.DbPort]=splitConnection.port,stSpanData[superconsts.Label.DbUser]=splitConnection.username,stSpanData[superconsts.Label.DbCommand]=span.data.redis.command,openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ClientRequest,stSpanData));let userProvidedCallback;if(cbStyle){var modifiedArgs=[];for(let i=0;i<origArgs.length;i++)modifiedArgs[i]=origArgs[i];splitConnection=cls.ns.bind(onResult);return"function"!=typeof(userProvidedCallback=modifiedArgs[modifiedArgs.length-1])?(userProvidedCallback=null,modifiedArgs.push(splitConnection)):modifiedArgs[modifiedArgs.length-1]=splitConnection,original.apply(origCtx,modifiedArgs)}return"function"==typeof(stTaskId=original.apply(origCtx,origArgs)).then&&stTaskId.then(value=>(onResult(),value)).catch(error=>(onResult(error),error)),stTaskId;function onResult(error){var stSpanData={};if(span.d=Date.now()-span.ts,error&&(span.ec=1,span.data.redis.error=tracingUtil.getErrorDetails(error),stSpanData[superconsts.Label.SupertenantError]="true"),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,stSpanData),span.transmit(),"function"==typeof userProvidedCallback)return userProvidedCallback.apply(this,arguments)}})}}function instrumentMultiExec(origCtx,origArgs,original,address,isAtomic,cbStyle,queue){if(cls.skipExitTracing({isActive:isActive}))return original.apply(origCtx,origArgs);const parentSpan=cls.getCurrentSpan();return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT,parentSpan.t,parentSpan.s);span.stack=tracingUtil.getStackTrace(instrumentMultiExec),span.data.redis={connection:address.address,command:isAtomic?"multi":"pipeline"};var subCommands=span.data.redis.subCommands=[];let legacyMultiMarkerHasBeenSeen=!1;var len=queue.length;for(let i=0;i<len;i++){let subCommand;"function"==typeof queue.get?(subCommand=queue.get(i),subCommands[i]=subCommand.command,isAtomic||(subCommand.callback=buildSubCommandCallback(span,subCommand.callback))):(subCommand=queue[i],Array.isArray(subCommand)&&0!==subCommand.length&&("MULTI"===subCommand[0]?legacyMultiMarkerHasBeenSeen=!0:subCommands[legacyMultiMarkerHasBeenSeen&&1<=i?i-1:i]=subCommand[0]))}0<subCommands.length&&(span.b={s:subCommands.length});var modifiedArgs=[];for(let i=span.ec=0;i<origArgs.length;i++)modifiedArgs[i]=origArgs[i];var splitConnection=getSplitConnection(span.data.redis.connection,address,origCtx);let openSpanResult=null;var stSpanData,stTaskId=getOrCreateTask();0!==stTaskId&&((stSpanData={})[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.Redis,stSpanData[superconsts.Label.IntegrationModuleResourceId]=splitConnection.host,stSpanData[superconsts.Label.DbDatabase]=splitConnection.db,stSpanData[superconsts.Label.DbHost]=splitConnection.host,stSpanData[superconsts.Label.DbPort]=splitConnection.port,stSpanData[superconsts.Label.DbUser]=splitConnection.username,stSpanData[superconsts.Label.DbCommand]=span.data.redis.command,stSpanData[superconsts.Label.DbSubCommand]=span.data.redis.subCommands.toString(),openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ClientRequest,stSpanData));let userProvidedCallback;if(cbStyle)return splitConnection=cls.ns.bind(onResult),"function"!=typeof(userProvidedCallback=modifiedArgs[modifiedArgs.length-1])?(userProvidedCallback=null,modifiedArgs.push(splitConnection)):modifiedArgs[modifiedArgs.length-1]=splitConnection,original.apply(origCtx,modifiedArgs);try{var promise=original.apply(origCtx,modifiedArgs);return"function"==typeof promise.then&&promise.then(value=>(onResult(),value)).catch(error=>(onResult(error),error)),promise}catch(execSycnErr){throw onResult(execSycnErr),execSycnErr}function onResult(err){var stSpanData={};if(span.d=Date.now()-span.ts,err&&(span.ec=1,err.message?span.data.redis.error=err.message:err instanceof Array&&err.length?span.data.redis.error=err[0].message:span.data.redis.error="Unknown error",err.errors)&&err.errors.length&&(span.data.redis.error=err.errors.map(subErr=>subErr.message).join("\n")),span.data.redis.error&&(stSpanData[superconsts.Label.SupertenantError]="true"),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,stSpanData),span.transmit(),"function"==typeof userProvidedCallback)return userProvidedCallback.apply(this,arguments)}})}function buildSubCommandCallback(span,userProvidedCallback){return function(err){err&&(span.ec++,span.data.redis.error||(span.data.redis.error=tracingUtil.getErrorDetails(err))),"function"==typeof userProvidedCallback&&userProvidedCallback.apply(this,arguments)}}function getSplitConnection(connectionString,address,origCtx){connectionString=parseRedisConnectionString(connectionString);return connectionString.port||(null!=address.port?connectionString.port=address.port:connectionString.port=DEFAULT_REDIS_PORT),connectionString.db||(null!=address.db?connectionString.db=address.db:null!=origCtx.selected_db?connectionString.db=origCtx.selected_db:connectionString.db=0),connectionString.username||(null!=address.username?connectionString.username=address.username:null!=origCtx.auth_user&&(connectionString.username=origCtx.auth_user)),connectionString}function parseRedisConnectionString(connectionString){let cleanedString=connectionString.replace(/^redis:\/\//,"");connectionString=cleanedString.split("@");let username;1<connectionString.length&&(authParts=connectionString[0].split(":"),username=authParts[0],cleanedString=connectionString[1]);var authParts=cleanedString.split(":"),connectionString=authParts[0],port=authParts[1];let db;var dbIndex=authParts.findIndex(part=>part.startsWith("db="));return{host:connectionString,port:port,db:db=-1!==dbIndex?authParts[dbIndex].split("=")[1]:db,username:username}}