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 coreHttpsModule=require("https"),coreHttpModule=require("http"),superbrain=require("@supertenant/superbrain")["superbrain"],superconsts=require("@supertenant/superconsts"),getOrCreateTask=require("../../taskManager")["getOrCreateTask"],{getWaitPollInterval,getHttpRejectActionStatusCode,getDelayDuration}=require("../../actions"),constants=require("../../constants"),tracingHeaders=require("../../tracingHeaders"),{filterParams,sanitizeUrl}=require("../../../util/url"),{getExtraHeadersFromMessage,mergeExtraHeadersFromServerResponseOrClientRequest}=require("./captureHttpHeadersUtil"),shimmer=require("shimmer"),cls=require("../../cls"),dedupReportError=require("../../../logger")["dedupReportError"];let extraHttpHeadersToCapture,isActive=!1,serviceName=null;function handleAction(openSpanResult,req,res,realEmit,originalThis,originalArgs,firstCall=!0){let actionRef;if((actionRef=firstCall?superbrain.getAction(openSpanResult.action):superbrain.pollSpanAction(openSpanResult.openSpanResult)).Action===superconsts.Action.Execute&&!res.writableEnded)return req._stExecuted=!0,realEmit.apply(originalThis,originalArgs);if(actionRef.Action===superconsts.Action.Wait){const pollInterval=getWaitPollInterval(actionRef);return new Promise(resolve=>setTimeout(resolve,pollInterval).unref()).then(cls.ns.bind(()=>handleAction(openSpanResult,req,res,realEmit,originalThis,originalArgs,!1)))}if(actionRef.Action===superconsts.Action.Delay){const delayDuration=getDelayDuration(actionRef);return new Promise(resolve=>setTimeout(resolve,delayDuration).unref()).then(cls.ns.bind(()=>{if(!res.writableEnded)return req._stExecuted=!0,realEmit.apply(originalThis,originalArgs)}))}if(actionRef.Action===superconsts.Action.Reject)res.writableEnded||(firstCall=getHttpRejectActionStatusCode(actionRef),res.statusCode=firstCall,res.statusMessage="SuperTenant rejected",res.setHeader("x-supertenant-rejected","true"),res.end(),req._stExecuted=!0);else if(dedupReportError("httpServer:UNKNOWN_ACTION","received unknown action ID",actionRef),!res.writableEnded)return realEmit.apply(originalThis,originalArgs)}function shimEmit(realEmit){return function(type,req,res){if("request"!==type||!isActive)return realEmit.apply(this,arguments);const originalThis=this,originalArgs=arguments;return cls.ns.runAndReturn(()=>{req&&req.on&&req.addListener&&req.emit&&cls.ns.bindEmitter(req),res&&res.on&&res.addListener&&res.emit&&cls.ns.bindEmitter(res);var result=startSpan(req);let span=result.span,openSpanResult=result.openSpanResult;const serverTimingValue="stid;desc="+span.t;function finishSpan(){var closeSpanData;null!=openSpanResult&&(closeSpanData={},req._stExecuted||(closeSpanData[superconsts.Label.SupertenantCanceled]="true"),closeSpanData[superconsts.Label.HttpStatus]=res.statusCode,500<=res.statusCode&&(closeSpanData[superconsts.Label.SupertenantError]="true"),superbrain.closeSpan(openSpanResult.spanId,closeSpanData)),span.d=Date.now()-span.ts,span.data.http=span.data.http||{},res.headersSent&&(span.data.http.status=res.statusCode,span.data.http.header=mergeExtraHeadersFromServerResponseOrClientRequest(span.data.http.header,res,extraHttpHeadersToCapture)),span.postponeTransmit||(span.ec=500<=res.statusCode?1:0),span.transmit()}return res.setHeader("Server-Timing",serverTimingValue),shimmer.wrap(res,"setHeader",realSetHeader=>function(key,value){return"server-timing"===key.toLowerCase()?null==value?realSetHeader.call(this,key,serverTimingValue):Array.isArray(value)?value.find(kv=>0===kv.indexOf("stid;"))?realSetHeader.apply(this,arguments):realSetHeader.call(this,key,value.concat(serverTimingValue)):"string"==typeof value&&0<=value.indexOf("stid;")?realSetHeader.apply(this,arguments):realSetHeader.call(this,key,value+", "+serverTimingValue):realSetHeader.apply(this,arguments)}),req.on("aborted",()=>{finishSpan()}),res.on("finish",()=>{finishSpan()}),res.on("close",()=>{finishSpan()}),null!=openSpanResult?handleAction(openSpanResult,req,res,realEmit,originalThis,originalArgs):realEmit.apply(originalThis,originalArgs)})}}function startSpan(req,tenantId){var headers=tracingHeaders.fromHttpRequest(req),w3cTraceContext=headers.w3cTraceContext,w3cTraceContext=("string"==typeof headers.level&&0===headers.level.indexOf("0")&&(cls.setTracingLevel("0"),w3cTraceContext)&&w3cTraceContext.disableSampling(),w3cTraceContext&&cls.setW3cTraceContext(w3cTraceContext),cls.startSpan(exports.spanName,constants.ENTRY,headers.traceId,headers.parentId,w3cTraceContext)),headers=(tracingHeaders.setSpanAttributes(w3cTraceContext,headers),req.url.split("?")),sanitizedUrl=(2<=headers.length&&(headers[1]=filterParams(headers[1])),sanitizeUrl(headers.shift()));const reqHeaders=getExtraHeadersFromMessage(req);w3cTraceContext.data.http={method:req.method,url:sanitizedUrl,params:0<headers.length?headers.join("?"):void 0,host:req.headers.host,header:reqHeaders};var incomingServiceName=w3cTraceContext.data.http.header&&w3cTraceContext.data.http.header[constants.serviceNameHeaderNameLowerCase];null!=incomingServiceName&&(w3cTraceContext.data.service=incomingServiceName),req.headers["x-supertenant-t"]||(req.headers["x-supertenant-t"]=w3cTraceContext.t);let openSpanResult=null;var stTaskId=getOrCreateTask();if(0!==stTaskId){let spanData={},resourceId=(spanData[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.HttpServer,null);null!=incomingServiceName&&void 0!==incomingServiceName?resourceId=incomingServiceName:null!=serviceName&&void 0!==serviceName?resourceId=serviceName:null!=req.headers.host&&void 0!==req.headers.host&&(resourceId=req.headers.host),null!=resourceId&&void 0!==resourceId&&(spanData[superconsts.Label.IntegrationModuleResourceId]=resourceId),null!=req.headers.host&&void 0!==req.headers.host&&(spanData[superconsts.Label.HttpHost]=req.headers.host),spanData[superconsts.Label.HttpMethod]=req.method,spanData[superconsts.Label.HttpPath]=sanitizedUrl,2<=headers.length&&(spanData[superconsts.Label.HttpParams]=headers[1]),reqHeaders&&Object.keys(reqHeaders).forEach(headerName=>{spanData[superconsts.Label.HttpHeaderPrefix+"."+headerName]=reqHeaders[headerName],"user-agent"===headerName.toLowerCase()&&(spanData[superconsts.Label.HttpUserAgent]=reqHeaders[headerName])}),null!=tenantId&&void 0!==tenantId&&(spanData[superconsts.Label.SupertenantTenantId]=tenantId),openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ServerRequest,spanData)}return{openSpanResult:openSpanResult,span:w3cTraceContext}}exports.spanName="node.http.server",exports.init=function(config){shimmer.wrap(coreHttpModule.Server&&coreHttpModule.Server.prototype,"emit",shimEmit),shimmer.wrap(coreHttpsModule.Server&&coreHttpsModule.Server.prototype,"emit",shimEmit),extraHttpHeadersToCapture=config.tracing.http.extraHttpHeadersToCapture,serviceName=config.serviceName},exports.updateConfig=function(config){extraHttpHeadersToCapture=config.tracing.http.extraHttpHeadersToCapture},exports.activate=function(extraConfig){extraConfig&&extraConfig.tracing&&extraConfig.tracing.http&&Array.isArray(extraConfig.tracing.http.extraHttpHeadersToCapture)&&(extraHttpHeadersToCapture=extraConfig.tracing.http.extraHttpHeadersToCapture),isActive=!0},exports.deactivate=function(){isActive=!1},exports.startHttpSpan=startSpan;