"use strict";const SIZE_FACTORS={K:1/1024,M:1,G:1024,T:1048576};function sizeToMiB(e,t){return Number(e)*(SIZE_FACTORS[t.toUpperCase()]||1)}async function eachLine(e,t,s){let a=0;if("string"==typeof e){const s=e.split(/\r?\n/);for(const e of s)t(e),a+=1;return a}const n=e.stream().getReader(),r=new TextDecoder;let o="",u=0;for(;;){const i=await n.read();if(i.done)break;u+=i.value.byteLength;const c=(o+r.decode(i.value,{stream:!0})).split(/\r?\n/);o=c.pop()||"";for(const e of c)t(e),a+=1;self.postMessage({type:"progress",requestId:s,value:Math.min(99,Math.round(u/e.size*100))})}return o+=r.decode(),o&&(t(o),a+=1),a}function parseGcLine(e,t){if(!/(?:\bGC\(|\[GC|\[Full GC|Pause (?:Young|Full|Remark|Cleanup)|GC pause)/i.test(e))return null;const s=e.match(/([0-9]+(?:\.[0-9]+)?)\s*(ms|msecs?|secs?|s)(?:\s*\])?(?:\s*$|\s*,)/i);if(!s)return null;let a=Number(s[1]);/^(?:s|sec)/i.test(s[2])&&(a*=1e3);const n=e.match(/([0-9]+(?:\.[0-9]+)?)([KMGT])->([0-9]+(?:\.[0-9]+)?)([KMGT])\(([^)]+)\)/i);let r=null,o=null,u=null;if(n){r=sizeToMiB(n[1],n[2]),o=sizeToMiB(n[3],n[4]);const e=n[5].match(/([0-9]+(?:\.[0-9]+)?)([KMGT])/i);e&&(u=sizeToMiB(e[1],e[2]))}const i=e.match(/\[([0-9]+(?:\.[0-9]+)?)s\]/i)||e.match(/(?:^|:\s)([0-9]+(?:\.[0-9]+)?):\s*\[/),c=e.match(/GC\((\d+)\)/);let l="GC Pause";return/Full GC|Pause Full/i.test(e)?l="Full GC":/Remark/i.test(e)?l="Remark":/Cleanup/i.test(e)?l="Cleanup":/Young|Evacuation|GC pause/i.test(e)&&(l="Young GC"),{index:t,id:c?Number(c[1]):t,time:i?Number(i[1]):null,kind:l,durationMs:a,before:r,after:o,capacity:u,reclaimed:null!==r&&null!==o?Math.max(0,r-o):null}}async function parseGc(e,t){const s=[];let a="unknown";const n=await eachLine(e,(e=>{"unknown"===a&&(/\[[0-9.]+s\]\[.*\]\[gc/i.test(e)||/GC\(\d+\)/.test(e)?a="JDK 9+ Unified Logging":/\[(?:Full )?GC|GC pause/.test(e)&&(a="JDK 8 legacy"));const t=parseGcLine(e,s.length+1);t&&s.push(t)}),t);return{events:s,lines:n,format:a}}async function parseThreadDump(e,t){const s=[];let a=null,n=!1;const r=()=>{a&&(a.signature=a.frames.slice(0,5).join("\n")||"(no Java stack frames)",s.push(a))},o=await eachLine(e,(e=>{/deadlock/i.test(e)&&/found|Java-level|deadlocked/i.test(e)&&(n=!0);const t=e.match(/^"([^"]+)"(.*)$/);if(t)return r(),void(a={name:t[1],header:t[2].trim(),state:"UNKNOWN",frames:[],locks:[]});if(!a)return;const s=e.match(/java\.lang\.Thread\.State:\s+([A-Z_]+)/);s&&(a.state=s[1]);const o=e.trim().match(/^at\s+(.+)$/);o&&a.frames.push(o[1]),/^-\s+(?:waiting|parking|locked)/.test(e.trim())&&a.locks.push(e.trim())}),t);r();const u={},i=new Map;for(const e of s){u[e.state]=(u[e.state]||0)+1;const t=i.get(e.signature)||{signature:e.signature,count:0,names:[],states:{}};t.count+=1,t.names.length<5&&t.names.push(e.name),t.states[e.state]=(t.states[e.state]||0)+1,i.set(e.signature,t)}return{threads:s.length,states:u,deadlockMarker:n,blocked:u.BLOCKED||0,waiting:(u.WAITING||0)+(u.TIMED_WAITING||0),groups:Array.from(i.values()).sort(((e,t)=>t.count-e.count)).slice(0,12),lines:o}}self.onmessage=async e=>{const{type:t,source:s,requestId:a}=e.data;try{const e="gc"===t?await parseGc(s,a):await parseThreadDump(s,a);self.postMessage({type:"result",requestId:a,result:e})}catch(e){self.postMessage({type:"error",requestId:a,message:e&&e.message?e.message:String(e)})}};
|