@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 6.1 kB
JavaScript
import*as Common from"../../core/common/common.js";import*as SDK from"../../core/sdk/sdk.js";export class Log{static pseudoWallTime(e,t){return new Date(1e3*e.pseudoWallTime(t))}static async build(e){const t=new Log,s=[];for(const t of e)s.push(Entry.build(t));const r=await Promise.all(s);return{version:"1.2",creator:t.creator(),pages:t.buildPages(e),entries:r}}creator(){const e=/AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);return{name:"WebInspector",version:e?e[1]:"n/a"}}buildPages(e){const t=new Set,s=[];for(let r=0;r<e.length;++r){const o=e[r],i=SDK.PageLoad.PageLoad.forRequest(o);i&&!t.has(i.id)&&(t.add(i.id),s.push(this.convertPage(i,o)))}return s}convertPage(e,t){return{startedDateTime:Log.pseudoWallTime(t,e.startTime).toJSON(),id:"page_"+e.id,title:e.url,pageTimings:{onContentLoad:this.pageEventTime(e,e.contentLoadTime),onLoad:this.pageEventTime(e,e.loadTime)}}}pageEventTime(e,t){const s=e.startTime;return-1===t||-1===s?-1:Entry.toMilliseconds(t-s)}}export class Entry{request;constructor(e){this.request=e}static toMilliseconds(e){return-1===e?-1:1e3*e}static async build(e){const t=new Entry(e);let s=t.request.remoteAddress();const r=s.lastIndexOf(":");-1!==r&&(s=s.substr(0,r));const o=t.buildTimings();let i=0;for(const e of[o.blocked,o.dns,o.connect,o.send,o.wait,o.receive])i+=Math.max(e,0);const n=t.request.initiator();let a=null;n&&(a={type:n.type},void 0!==n.url&&(a.url=n.url),void 0!==n.requestId&&(a.requestId=n.requestId),void 0!==n.lineNumber&&(a.lineNumber=n.lineNumber),n.stack&&(a.stack=n.stack));const d={_fromCache:void 0,_initiator:a,_priority:t.request.priority(),_resourceType:t.request.resourceType().name(),_webSocketMessages:void 0,cache:{},connection:void 0,pageref:void 0,request:await t.buildRequest(),response:t.buildResponse(),serverIPAddress:s.replace(/\[\]/g,""),startedDateTime:Log.pseudoWallTime(t.request,t.request.issueTime()).toJSON(),time:i,timings:o};t.request.cached()?d._fromCache=t.request.cachedInMemory()?"memory":"disk":delete d._fromCache,"0"!==t.request.connectionId?d.connection=t.request.connectionId:delete d.connection;const u=SDK.PageLoad.PageLoad.forRequest(t.request);if(u?d.pageref="page_"+u.id:delete d.pageref,t.request.resourceType()===Common.ResourceType.resourceTypes.WebSocket){const e=[];for(const s of t.request.frames())e.push({type:s.type,time:s.time,opcode:s.opCode,data:s.text});d._webSocketMessages=e}else delete d._webSocketMessages;return d}async buildRequest(){const e=this.request.requestHeadersText(),t={method:this.request.requestMethod,url:this.buildRequestURL(this.request.url()),httpVersion:this.request.requestHttpVersion(),headers:this.request.requestHeaders(),queryString:this.buildParameters(this.request.queryParameters||[]),cookies:this.buildCookies(this.request.includedRequestCookies()),headersSize:e?e.length:-1,bodySize:await this.requestBodySize(),postData:void 0},s=await this.buildPostData();return s?t.postData=s:delete t.postData,t}buildResponse(){const e=this.request.responseHeadersText;return{status:this.request.statusCode,statusText:this.request.statusText,httpVersion:this.request.responseHttpVersion(),headers:this.request.responseHeaders,cookies:this.buildCookies(this.request.responseCookies),content:this.buildContent(),redirectURL:this.request.responseHeaderValue("Location")||"",headersSize:e?e.length:-1,bodySize:this.responseBodySize,_transferSize:this.request.transferSize,_error:this.request.localizedFailDescription}}buildContent(){const e={size:this.request.resourceSize,mimeType:this.request.mimeType||"x-unknown",compression:void 0},t=this.responseCompression;return"number"==typeof t?e.compression=t:delete e.compression,e}buildTimings(){const e=this.request.timing,t=this.request.issueTime(),s=this.request.startTime,r={blocked:-1,dns:-1,ssl:-1,connect:-1,send:0,wait:0,receive:0,_blocked_queueing:-1,_blocked_proxy:void 0},o=t<s?s-t:-1;r.blocked=Entry.toMilliseconds(o),r._blocked_queueing=Entry.toMilliseconds(o);let i=0;if(e){const t=l([e.dnsStart,e.connectStart,e.sendStart]);t!==1/0&&(r.blocked+=t),-1!==e.proxyEnd&&(r._blocked_proxy=e.proxyEnd-e.proxyStart),r._blocked_proxy&&r._blocked_proxy>r.blocked&&(r.blocked=r._blocked_proxy);const s=e.dnsEnd>=0?t:0,o=e.dnsEnd>=0?e.dnsEnd:-1;r.dns=o-s;const n=e.sslEnd>0?e.sslStart:0,a=e.sslEnd>0?e.sslEnd:-1;r.ssl=a-n;const d=e.connectEnd>=0?l([o,t]):0,u=e.connectEnd>=0?e.connectEnd:-1;r.connect=u-d;const c=e.sendEnd>=0?Math.max(u,o,t):0,m=e.sendEnd>=0?e.sendEnd:0;r.send=m-c,r.send<0&&(r.send=0),i=Math.max(m,u,a,o,t,0)}else if(-1===this.request.responseReceivedTime)return r.blocked=Entry.toMilliseconds(this.request.endTime-t),r;const n=e?e.requestTime:s,a=i,d=Entry.toMilliseconds(this.request.responseReceivedTime-n);r.wait=d-a;const u=d,c=Entry.toMilliseconds(this.request.endTime-n);return r.receive=Math.max(c-u,0),r;function l(e){return e.reduce(((e,t)=>t>=0&&t<e?t:e),1/0)}}async buildPostData(){const e=await this.request.requestFormData();if(!e)return null;const t={mimeType:this.request.requestContentType()||"",text:e,params:void 0},s=await this.request.formParameters();return s?t.params=this.buildParameters(s):delete t.params,t}buildParameters(e){return e.slice()}buildRequestURL(e){return Common.ParsedURL.ParsedURL.split(e,"#",2)[0]}buildCookies(e){return e.map(this.buildCookie.bind(this))}buildCookie(e){const t={name:e.name(),value:e.value(),path:e.path(),domain:e.domain(),expires:e.expiresDate(Log.pseudoWallTime(this.request,this.request.startTime)),httpOnly:e.httpOnly(),secure:e.secure(),sameSite:void 0};return e.sameSite()?t.sameSite=e.sameSite():delete t.sameSite,t}async requestBodySize(){const e=await this.request.requestFormData();return e?(new TextEncoder).encode(e).length:0}get responseBodySize(){return this.request.cached()||304===this.request.statusCode?0:this.request.responseHeadersText?this.request.transferSize-this.request.responseHeadersText.length:-1}get responseCompression(){if(!this.request.cached()&&304!==this.request.statusCode&&206!==this.request.statusCode&&this.request.responseHeadersText)return this.request.resourceSize-this.responseBodySize}}