@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 6.4 kB
JavaScript
import*as Platform from"../../../core/platform/platform.js";import{data as metaHandlerData}from"./MetaHandler.js";import*as Helpers from"../helpers/helpers.js";import*as Types from"../types/types.js";const MILLISECONDS_TO_MICROSECONDS=1e3,SECONDS_TO_MICROSECONDS=1e6,requestMap=new Map,requestsByOrigin=new Map,requestsByTime=[];function storeTraceEventWithRequestId(e,s,t){requestMap.has(e)||requestMap.set(e,{});const r=requestMap.get(e);if(!r)throw new Error(`Unable to locate trace events for request ID ${e}`);if(Array.isArray(r[s])){const e=t;r[s].push(...e)}else r[s]=t}function firstPositiveValueInList(e){for(const s of e)if(s>0)return s;return 0}let handlerState=1;export function reset(){requestsByOrigin.clear(),requestMap.clear(),requestsByTime.length=0,handlerState=1}export function initialize(){handlerState=2}export function handleEvent(e){if(2!==handlerState)throw new Error("Network Request handler is not initialized");Types.TraceEvents.isTraceEventResourceChangePriority(e)?storeTraceEventWithRequestId(e.args.data.requestId,"changePriority",e):Types.TraceEvents.isTraceEventResourceWillSendRequest(e)?storeTraceEventWithRequestId(e.args.data.requestId,"willSendRequests",[e]):Types.TraceEvents.isTraceEventResourceSendRequest(e)?storeTraceEventWithRequestId(e.args.data.requestId,"sendRequests",[e]):Types.TraceEvents.isTraceEventResourceReceiveResponse(e)?storeTraceEventWithRequestId(e.args.data.requestId,"receiveResponse",e):Types.TraceEvents.isTraceEventResourceReceivedData(e)?storeTraceEventWithRequestId(e.args.data.requestId,"receivedData",[e]):Types.TraceEvents.isTraceEventResourceFinish(e)?storeTraceEventWithRequestId(e.args.data.requestId,"resourceFinish",e):Types.TraceEvents.isTraceEventResourceMarkAsCached(e)&&storeTraceEventWithRequestId(e.args.data.requestId,"resourceMarkAsCached",e)}export async function finalize(){if(2!==handlerState)throw new Error("Network Request handler is not initialized");const{rendererProcessesByFrame:e}=metaHandlerData();for(const[s,t]of requestMap.entries()){if(!t.sendRequests||!t.receiveResponse)continue;const r=[];for(let e=0;e<t.sendRequests.length-1;e++){const s=t.sendRequests[e],i=t.sendRequests[e+1];let n=s.ts,o=Types.Timing.MicroSeconds(i.ts-s.ts);if(t.willSendRequests&&t.willSendRequests[e]&&t.willSendRequests[e+1]){const s=t.willSendRequests[e],r=t.willSendRequests[e+1];n=s.ts,o=Types.Timing.MicroSeconds(r.ts-s.ts)}r.push({url:s.args.data.url,priority:s.args.data.priority,requestMethod:s.args.data.requestMethod,ts:n,dur:o})}const i=0!==t.resourceFinish?.args.data.encodedDataLength,n=t.receiveResponse.args.data.fromCache&&!t.receiveResponse.args.data.fromServiceWorker&&!i,o=void 0!==t.resourceMarkAsCached,a=o||n,c=t.receiveResponse.args.data.timing;if(!c&&!a)continue;const d=t.sendRequests[0],u=t.sendRequests[t.sendRequests.length-1],T=u.args.data.priority;let p=T;t.changePriority&&(p=t.changePriority.args.data.priority);const l=t.willSendRequests&&t.willSendRequests.length?Types.Timing.MicroSeconds(t.willSendRequests[0].ts):Types.Timing.MicroSeconds(d.ts),g=t.willSendRequests&&t.willSendRequests.length?Types.Timing.MicroSeconds(t.willSendRequests[t.willSendRequests.length-1].ts):Types.Timing.MicroSeconds(u.ts),m=t.resourceFinish?t.resourceFinish.ts:g,h=t.resourceFinish?.args.data.finishTime?Types.Timing.MicroSeconds(1e6*t.resourceFinish.args.data.finishTime):Types.Timing.MicroSeconds(m),S=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds((h||g)-g),y=Types.Timing.MicroSeconds(m-(h||m)),q=Types.Timing.MicroSeconds(g-l),R=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(Platform.NumberUtilities.clamp(1e6*c.requestTime-g,0,Number.MAX_VALUE)),M=a?Types.Timing.MicroSeconds(t.receiveResponse.ts-l):Types.Timing.MicroSeconds(firstPositiveValueInList([1e3*c.dnsStart,1e3*c.connectStart,1e3*c.sendStart,t.receiveResponse.ts-g])),v=a?l:Types.Timing.MicroSeconds(1e6*c.requestTime+1e3*c.sendStart),f=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.receiveHeadersEnd-c.sendEnd)),E=a?l:Types.Timing.MicroSeconds(1e6*c.requestTime+1e3*c.receiveHeadersEnd),w=a?Types.Timing.MicroSeconds(m-t.receiveResponse.ts):Types.Timing.MicroSeconds((h||E)-E),k=Types.Timing.MicroSeconds(S+y),I=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.dnsEnd-c.dnsStart)),B=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.sslEnd-c.sslStart)),D=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.proxyEnd-c.proxyStart)),C=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.sendEnd-c.sendStart)),L=a?Types.Timing.MicroSeconds(0):Types.Timing.MicroSeconds(1e3*(c.connectEnd-c.connectStart)),{frame:F,url:O,renderBlocking:W}=u.args.data,{encodedDataLength:P,decodedBodyLength:N}=t.resourceFinish?t.resourceFinish.args.data:{encodedDataLength:0,decodedBodyLength:0},{host:x,protocol:A,pathname:H,search:b}=new URL(O),U="https:"===A,_=Helpers.Trace.activeURLForFrameAtTime(F,u.ts,e)||"",z={args:{data:{syntheticData:{dnsLookup:I,download:w,downloadStart:E,finishTime:h,initialConnection:L,isDiskCached:n,isHttps:U,isMemoryCached:o,isPushedResource:i,networkDuration:S,processingDuration:y,proxyNegotiation:D,queueing:R,redirectionDuration:q,requestSent:C,sendStartTime:v,ssl:B,stalled:M,totalTime:k,waiting:f},decodedBodyLength:N,encodedDataLength:P,frame:F,fromServiceWorker:t.receiveResponse.args.data.fromServiceWorker,host:x,mimeType:t.receiveResponse.args.data.mimeType,pathname:H,priority:p,initialPriority:T,protocol:A,redirects:r,renderBlocking:W||"non_blocking",requestId:s,requestingFrameUrl:_,requestMethod:u.args.data.requestMethod,search:b,statusCode:t.receiveResponse.args.data.statusCode,stackTrace:u.args.data.stackTrace,timing:c,url:O}},cat:"loading",name:"SyntheticNetworkRequest",ph:"X",dur:Types.Timing.MicroSeconds(m-l),tdur:Types.Timing.MicroSeconds(m-l),ts:Types.Timing.MicroSeconds(l),tts:Types.Timing.MicroSeconds(l),pid:u.pid,tid:u.tid},j=Platform.MapUtilities.getWithDefault(requestsByOrigin,x,(()=>({renderBlocking:[],nonRenderBlocking:[],all:[]})));"non_blocking"===z.args.data.renderBlocking?j.nonRenderBlocking.push(z):j.renderBlocking.push(z),j.all.push(z),requestsByTime.push(z)}handlerState=3}export function data(){if(3!==handlerState)throw new Error("Network Request handler is not finalized");return{byOrigin:new Map(requestsByOrigin),byTime:[...requestsByTime]}}export function deps(){return["Meta"]}