web_plsql 1.8.7 → 1.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -169,4 +169,4 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
169
169
  <td class="text-right font-mono">${r}</td>
170
170
  </tr>
171
171
  `}).join(``)}catch(e){console.error(`Failed to load stats history:`,e),t&&(t.textContent=`Failed to load stats`)}}async function KC(){let e=document.getElementById(`access-filter`),t=document.getElementById(`access-limit`),n=e?.value??``,r=t?Number.parseInt(t.value):100,i=await pm.getAccessLogs(r,n),a=document.getElementById(`access-log-view`),o=document.getElementById(`access-log-range`);if(!a)return;let s=0;Array.isArray(i)?(a.textContent=i.join(`
172
- `),s=i.length):i&&typeof i==`object`&&`message`in i?(a.textContent=i.message,s=0):(a.textContent=`No logs available`,s=0),o&&(o.textContent=s>0?`Showing last ${s} log entries`:`No logs available`),a.parentElement&&(a.parentElement.scrollTop=a.parentElement.scrollHeight)}async function qC(){let e=document.getElementById(`trace-filter`),t=document.getElementById(`trace-limit`),n=document.getElementById(`trace-status-toggle`),r=e?.value??``,i=t?Number.parseInt(t.value):100;try{let{enabled:e}=await pm.getTraceStatus();n&&(n.textContent=e?`Tracing: ON`:`Tracing: OFF`,n.dataset.enabled=String(e),n.className=`px-4 py-2 rounded-lg text-sm font-bold transition-colors ${e?`bg-success text-black hover:bg-success/80`:`bg-white/10 text-white hover:bg-white/20`}`)}catch(e){console.error(`Failed to get trace status`,e)}let a=await pm.getTraceLogs(i,r);new UC(`trace-table`,{columns:[{id:`timestamp`,header:`Timestamp`,headerTitle:`Time of request`,width:`1%`,accessor:e=>new Date(e.timestamp).toLocaleString(),className:`font-mono text-xs text-dim whitespace-nowrap`},{id:`source`,header:`Source`,headerTitle:`Request source (IP/User)`,width:`1%`,accessor:e=>e.source,className:`text-dim text-xs truncate max-w-[150px]`,cellTitle:e=>e.source},{id:`method`,header:`Method`,headerTitle:`HTTP Method`,width:`1%`,accessor:e=>e.method,className:`font-mono text-xs whitespace-nowrap`},{id:`url`,header:`Request URL`,headerTitle:`Request URL`,accessor:e=>e.url,className:`text-bright font-mono text-xs truncate max-w-[800px]`,cellTitle:e=>e.url},{id:`status`,header:`Status`,headerTitle:`HTTP Status Code`,width:`1%`,accessor:e=>e.status,className:e=>`font-bold text-xs uppercase whitespace-nowrap ${e.status===`success`?`text-success`:`text-danger`}`},{id:`duration`,header:`Duration`,headerTitle:`Execution time in ms`,width:`1%`,align:`right`,accessor:e=>MC(e.duration),className:`font-mono text-xs text-dim whitespace-nowrap`}],dense:!0,tableLayout:`auto`,onRowClick:e=>{let t=document.getElementById(`trace-modal`),n=document.getElementById(`trace-detail-content`);t&&n&&(n.textContent=JSON.stringify(e,null,2),t.style.display=`flex`)}}).render(a)}function JC(e){let t=document.getElementById(`pools-container`);!t||!e.pools||(t.innerHTML=e.pools.map(e=>RC(e)).join(``))}function YC(e){let t=e.status.config;if(!t)return;let n=document.getElementById(`config-view`);n&&(n.innerHTML=HC(t))}function XC(e){if(e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return`${Number.parseFloat((e/t**r).toFixed(2))} ${n[r]}`}function ZC(e){return MC(e/1e3)}function QC(e,t){let n=document.getElementById(`middleware-version`);n&&e.version&&(n.textContent=`${e.version} (7/18/2026, 9:44:50 PM)`,n.title=`The version of the web_plsql gateway and admin console build time`);let r=document.getElementById(`node-version`);r&&e.system&&(r.textContent=e.system.nodeVersion,r.title=`The version of the Node.js runtime`);let i=document.getElementById(`platform-info`);i&&e.system&&(i.textContent=`${e.system.platform} (${e.system.arch})`,i.title=`The operating system and architecture`);let a=document.getElementById(`system-uptime`);a&&e.uptime&&(a.textContent=jC(e.uptime));let o=document.getElementById(`system-start-time`);o&&e.startTime&&(o.textContent=NC(e.startTime));let s=document.getElementById(`system-status-text`);s&&(s.textContent=e.status?.toUpperCase()??`-`);let c=document.getElementById(`total-requests`);c&&e.metrics&&(c.textContent=e.metrics.requestCount.toLocaleString(),c.title=`Cumulative number of requests handled by the server`);let l=document.getElementById(`total-errors`);l&&e.metrics&&(l.textContent=e.metrics.errorCount.toLocaleString(),l.title=`Cumulative number of failed requests`);let u=document.getElementById(`active-pools`);if(u&&e.pools&&(u.textContent=e.pools.length.toString(),u.title=`Number of database connection pools currently active`),e.system){let t=e.system,n={heapUsed:t.memory.heapUsed,heapTotal:t.memory.heapTotal,rss:t.memory.rss,external:t.memory.external,cpuUser:t.cpu.user,cpuSystem:t.cpu.system},r=(e,r,i)=>{let a=n[r],o=t.memory[i],s=document.getElementById(e),c=document.getElementById(`${e}-max`);s&&(s.textContent=XC(a)),c&&typeof o==`number`&&(c.textContent=XC(o))},i=(e,r,i)=>{let a=n[r],o=document.getElementById(e);if(o&&(o.textContent=ZC(a)),i){let n=t.cpu[i],r=document.getElementById(`${e}-max`);r&&typeof n==`number`&&(r.textContent=ZC(n))}};r(`memory-heap-used`,`heapUsed`,`heapUsedMax`),r(`memory-heap-total`,`heapTotal`,`heapTotalMax`),r(`memory-rss`,`rss`,`rssMax`),r(`memory-external`,`external`,`externalMax`),i(`cpu-user`,`cpuUser`,`userMax`),i(`cpu-system`,`cpuSystem`,`systemMax`);let a=document.getElementById(`cpu-percent`);a&&t.cpu.max!==void 0&&(a.textContent=`${t.cpu.max.toFixed(1)}%`,a.title=`Max System CPU usage`);let o=document.getElementById(`memory-percent`);o&&t.memory.totalMemory&&(o.textContent=`${(t.memory.rss/t.memory.totalMemory*100).toFixed(1)}%`,o.title=`System Memory Used relative to Total (${XC(t.memory.totalMemory)})`);let s=document.getElementById(`cpu-cores-info`);s&&t.cpuCores&&(s.textContent=`${t.cpuCores} Cores`)}}async function $C(e,t){let n=e.querySelector(`.material-symbols-rounded`),r=n?.textContent;e.disabled=!0,e.classList.add(`loading`),n&&(n.textContent=`sync`,n.classList.add(`animate-spin`));try{return await t()}finally{e.disabled=!1,e.classList.remove(`loading`),n&&(n.textContent=r??``,n.classList.remove(`animate-spin`))}}function ew(e,t){let n=document.getElementById(e);return n&&n.addEventListener(`click`,()=>void $C(n,t)),n}var tw={overview:`dashboard`,trace:`bolt`,errors:`error`,access:`list_alt`,pools:`database`,stats:`query_stats`,config:`settings`,system:`terminal`},$={currentView:`overview`,status:{},maxHistoryPoints:30,lastRequestCount:0,lastErrorCount:0,lastUpdateTime:Date.now(),lastBucketTimestamp:0,nextRefreshTimeout:null,nextRefreshTime:0,countdownInterval:null,history:{labels:[],requests:[],avgResponseTimes:[],p95ResponseTimes:[],p99ResponseTimes:[],cpuUsage:[],memoryUsage:[],poolUsage:{}},charts:{},metricsMin:{},metricsMax:{}},nw={REFRESH_INTERVAL:`admin_refresh_interval`,HISTORY_DURATION:`admin_history_duration`,AUTO_REFRESH:`admin_auto_refresh`,THEME:`theme`,LAST_VIEW:`admin_last_view`};function rw(e){console.error(`Connection lost:`,e);let t=document.getElementById(`server-status-dot`),n=document.getElementById(`server-status-text`);t&&(t.className=`dot offline`),n&&(n.textContent=`OFFLINE`);let r=document.getElementById(`btn-pause`);r&&(r.style.display=`none`);let i=document.getElementById(`btn-resume`);i&&(i.style.display=`none`);let a=document.querySelector(`#system-status .dot`),o=document.getElementById(`system-status-text`);a&&(a.className=`dot offline`),o&&(o.textContent=`OFFLINE`);let s=document.getElementById(`offline-modal`);s&&s.style.display!==`flex`&&(s.style.display=`flex`),sw(6e4),iw(6e4)}function iw(e){$.countdownInterval&&clearInterval($.countdownInterval);let t=Date.now()+e,n=document.getElementById(`offline-countdown`),r=document.getElementById(`reconnect-text`);r&&(r.textContent=`Try Reconnect`);let i=()=>{if(!n)return;let e=Math.max(0,Math.ceil((t-Date.now())/1e3));n.textContent=`Retrying in ${e}s...`,e<=0&&$.countdownInterval&&(clearInterval($.countdownInterval),$.countdownInterval=null)};i(),$.countdownInterval=setInterval(i,1e3)}function aw(){$.countdownInterval&&=(clearInterval($.countdownInterval),null);let e=document.getElementById(`offline-countdown`);e&&(e.textContent=``)}async function ow(e=!1,t=!1){let n=document.getElementById(`reconnect-spinner`),r=document.getElementById(`reconnect-icon`),i=document.getElementById(`reconnect-text`);n&&(n.style.display=`inline-block`),r&&(r.style.display=`none`),i&&(i.textContent=`Connecting...`);try{let a=Date.now(),o=await pm.getStatus(e,t),s=document.getElementById(`offline-modal`);if(s?.style.display===`flex`&&s&&(s.style.display=`none`,aw()),n&&(n.style.display=`none`),r&&(r.style.display=`inline-block`),i&&(i.textContent=`Try Reconnect`),o.history&&$.history.labels.length===0&&kC($,o.history),!o.config&&$.status.config&&(o.config=$.status.config),$.status=o,!o.metrics||!o.pools)return;let c=o.history?.at(-1),l=(o.intervalMs??5e3)/1e3,u=c?c.requests/l:0,d=c?c.durationAvg:o.metrics.avgResponseTime;if($.lastRequestCount=o.metrics.requestCount,$.lastErrorCount=o.metrics.errorCount,$.lastUpdateTime=a,o.system){let e=o.system;PC({heapUsed:e.memory.heapUsed,heapTotal:e.memory.heapTotal,rss:e.memory.rss,external:e.memory.external,cpuUser:e.cpu.user,cpuSystem:e.cpu.system},$.metricsMin,$.metricsMax)}c&&c.timestamp>$.lastBucketTimestamp?($.lastBucketTimestamp=c.timestamp,AC($,new Date(c.timestamp).toLocaleTimeString(),u,d,o.pools)):!c&&$.history.labels.length===0&&AC($,new Date().toLocaleTimeString(),0,0,o.pools);let f=document.getElementById(`sidebar-version`);f&&(f.textContent=`v${o.version}`);let p=document.getElementById(`uptime-val`);p&&(p.textContent=jC(o.uptime));let m=document.getElementById(`start-time-val`);m&&(m.textContent=`Started: ${NC(o.startTime)}`);let h=document.getElementById(`req-per-sec`);h&&(h.textContent=u.toFixed(2));let g=document.getElementById(`max-req-per-sec`);g&&(g.textContent=o.metrics.maxRequestsPerSecond.toFixed(2));let _=document.getElementById(`avg-resp-time`);_&&(_.textContent=`${o.metrics.avgResponseTime.toFixed(1)}ms`);let v=document.getElementById(`max-resp-time`);v&&(v.textContent=`${o.metrics.maxResponseTime.toFixed(1)}ms`);let y=document.getElementById(`err-count`);y&&(y.textContent=o.metrics.errorCount.toLocaleString());let b=0,x=0;o.pools.forEach(e=>{e.cache&&(b+=e.cache.procedureName.hits+e.cache.argument.hits,x+=e.cache.procedureName.misses+e.cache.argument.misses)});let S=b+x,C=S>0?Math.round(b/S*100):0,w=document.getElementById(`cache-hit-rate-val`);w&&(w.textContent=`${C}%`,w.style.color=C>80?`var(--success)`:C>50?`var(--warning)`:`var(--danger)`);let T=document.getElementById(`cache-hits-val`);T&&(T.textContent=b.toLocaleString());let E=document.getElementById(`cache-misses-val`);E&&(E.textContent=x.toLocaleString());let D=document.getElementById(`server-status-dot`),ee=document.getElementById(`server-status-text`);D&&(D.className=`dot `+o.status),ee&&(ee.textContent=o.status.toUpperCase());let te=document.getElementById(`btn-pause`);te&&(te.style.display=o.status===`running`?`flex`:`none`);let ne=document.getElementById(`btn-resume`);ne&&(ne.style.display=o.status===`paused`?`flex`:`none`),$.currentView===`errors`&&await WC(),$.currentView===`trace`&&await qC(),$.currentView===`pools`&&JC(o),$.currentView===`config`&&YC($),$.currentView===`system`&&QC(o,$),dw?.checked&&fw&&sw(Number.parseInt(fw.value,10))}catch(e){document.getElementById(`offline-modal`)?.style.display===`flex`?(sw(6e4),iw(6e4),n&&(n.style.display=`none`),r&&(r.style.display=`inline-block`),i&&(i.textContent=`Try Reconnect`)):rw(e)}}function sw(e){$.nextRefreshTimeout&&=(clearTimeout($.nextRefreshTimeout),null),$.nextRefreshTime=Date.now()+e,$.nextRefreshTimeout=setTimeout(()=>{ow()},e)}function cw(){let e=document.getElementById(`refresh-interval`);e&&sw(Number.parseInt(e.value))}function lw(){$.nextRefreshTimeout&&=(clearTimeout($.nextRefreshTimeout),null)}function uw(){let e=document.getElementById(`chart-history-points`);e&&Array.from(e.options).forEach(e=>{let t=Number.parseInt(e.value),n=``;if(t<60)n=`${t}s`;else if(t<3600)n=`${Math.round(t/60)} min`;else{let e=t/3600;n=e===Math.round(e)?`${e} hour${e>1?`s`:``}`:`${e.toFixed(1)} hours`}e.textContent=`Last ${n}`})}document.querySelectorAll(`nav button`).forEach(e=>{let t=e;t.addEventListener(`click`,async()=>{try{let e=t.dataset.view;if(!e)return;$.currentView=e,localStorage.setItem(nw.LAST_VIEW,e),document.querySelectorAll(`.view`).forEach(e=>{let t=e;t.style.display=`none`});let n=document.getElementById(`view-`+e);n&&(n.style.display=`block`),document.querySelectorAll(`nav button`).forEach(e=>e.classList.remove(`active`)),t.classList.add(`active`);let r=document.getElementById(`view-title`);if(r){let n=Array.from(t.childNodes).filter(e=>e.nodeType===Node.TEXT_NODE).map(e=>e.textContent?.trim()).join(``);r.innerHTML=`<span class="material-symbols-rounded">${tw[e]??`chevron_right`}</span>${n}`}e===`errors`&&await WC(),e===`trace`&&await qC(),e===`pools`&&JC($.status),e===`stats`&&await GC(),e===`config`&&YC($),e===`system`&&QC($.status,$)}catch(e){rw(e)}})});var dw=document.getElementById(`auto-refresh-toggle`);dw&&dw.addEventListener(`change`,e=>{let t=e.target;localStorage.setItem(nw.AUTO_REFRESH,String(t.checked)),t.checked?cw():lw()});var fw=document.getElementById(`refresh-interval`);fw&&fw.addEventListener(`change`,()=>{localStorage.setItem(nw.REFRESH_INTERVAL,fw.value);let e=Number.parseInt(fw.value),t=Number.parseInt(pw?.value??`60`);$.maxHistoryPoints=Math.max(1,Math.floor(t/(e/1e3))),$.history.labels=[],$.history.requests=[],$.history.avgResponseTimes=[],$.history.cpuUsage=[],$.history.memoryUsage=[],$.history.poolUsage={},uw(),QC($.status,$),ow()});var pw=document.getElementById(`chart-history-points`);pw&&pw.addEventListener(`change`,()=>{localStorage.setItem(nw.HISTORY_DURATION,pw.value);let e=document.getElementById(`refresh-interval`);if(!e)return;let t=Number.parseInt(e.value),n=Number.parseInt(pw.value);$.maxHistoryPoints=Math.max(1,Math.floor(n/(t/1e3))),$.history.labels=[],$.history.requests=[],$.history.avgResponseTimes=[],$.history.cpuUsage=[],$.history.memoryUsage=[],$.history.poolUsage={},ow()});var mw=document.getElementById(`manual-refresh`);mw&&mw.addEventListener(`click`,()=>{$C(mw,ow)});var hw=document.getElementById(`error-filter`);hw&&hw.addEventListener(`keydown`,e=>{e.key===`Enter`&&WC()}),ew(`error-load-btn`,WC),ew(`trace-load-btn`,qC),ew(`access-load-btn`,KC),ew(`stats-load-btn`,GC);var gw=document.getElementById(`trace-filter`);gw&&gw.addEventListener(`keydown`,e=>{e.key===`Enter`&&qC()});var _w=document.getElementById(`trace-clear-btn`);_w&&_w.addEventListener(`click`,async()=>{confirm(`Are you sure you want to clear all traces?`)&&await $C(_w,async()=>{await pm.clearTraces(),await qC()})});var vw=document.getElementById(`trace-status-toggle`);vw&&vw.addEventListener(`click`,async()=>{await $C(vw,async()=>{let{enabled:e}=await pm.getTraceStatus();await pm.toggleTrace(!e),await qC()})});var yw=document.getElementById(`access-filter`);yw&&yw.addEventListener(`keydown`,e=>{e.key===`Enter`&&KC()});var bw=document.getElementById(`stats-limit`);bw&&bw.addEventListener(`keydown`,e=>{e.key===`Enter`&&GC()}),ew(`btn-pause`,async()=>{confirm(`Are you sure you want to pause the server?`)&&(await pm.post(`api/server/pause`),await ow())}),ew(`btn-resume`,async()=>{await pm.post(`api/server/resume`),await ow()}),ew(`btn-stop`,async()=>{confirm(`Are you sure you want to STOP the server? This action cannot be undone from the web interface.`)&&(await pm.post(`api/server/stop`),alert(`Server stop requested. The interface will now become unresponsive.`))}),ew(`btn-clear-all-cache`,async()=>{confirm(`Are you sure you want to clear ALL caches?`)&&(await pm.post(`api/cache/clear`),await ow())});var xw=document.getElementById(`btn-reconnect`);xw&&xw.addEventListener(`click`,()=>{$C(xw,ow)}),globalThis.addEventListener(`keydown`,e=>{if(e.key===`Escape`){let e=document.getElementById(`error-modal`);e&&(e.style.display=`none`);let t=document.getElementById(`trace-modal`);t&&(t.style.display=`none`)}});var Sw=localStorage.getItem(nw.REFRESH_INTERVAL);Sw&&fw&&(fw.value=Sw);var Cw=localStorage.getItem(nw.HISTORY_DURATION);Cw&&pw&&(pw.value=Cw);var ww=localStorage.getItem(nw.AUTO_REFRESH);if(ww!==null&&dw&&(dw.checked=ww===`true`),LC($),OC($),uw(),fw&&pw){let e=Number.parseInt(fw.value),t=Number.parseInt(pw.value);$.maxHistoryPoints=Math.max(1,Math.floor(t/(e/1e3)))}var Tw=localStorage.getItem(nw.LAST_VIEW);if(Tw){let e=document.querySelector(`nav button[data-view="${Tw}"]`);e&&e.click()}ow(!0,!0).then(()=>{dw?.checked&&cw()}).catch(console.error);
172
+ `),s=i.length):i&&typeof i==`object`&&`message`in i?(a.textContent=i.message,s=0):(a.textContent=`No logs available`,s=0),o&&(o.textContent=s>0?`Showing last ${s} log entries`:`No logs available`),a.parentElement&&(a.parentElement.scrollTop=a.parentElement.scrollHeight)}async function qC(){let e=document.getElementById(`trace-filter`),t=document.getElementById(`trace-limit`),n=document.getElementById(`trace-status-toggle`),r=e?.value??``,i=t?Number.parseInt(t.value):100;try{let{enabled:e}=await pm.getTraceStatus();n&&(n.textContent=e?`Tracing: ON`:`Tracing: OFF`,n.dataset.enabled=String(e),n.className=`px-4 py-2 rounded-lg text-sm font-bold transition-colors ${e?`bg-success text-black hover:bg-success/80`:`bg-white/10 text-white hover:bg-white/20`}`)}catch(e){console.error(`Failed to get trace status`,e)}let a=await pm.getTraceLogs(i,r);new UC(`trace-table`,{columns:[{id:`timestamp`,header:`Timestamp`,headerTitle:`Time of request`,width:`1%`,accessor:e=>new Date(e.timestamp).toLocaleString(),className:`font-mono text-xs text-dim whitespace-nowrap`},{id:`source`,header:`Source`,headerTitle:`Request source (IP/User)`,width:`1%`,accessor:e=>e.source,className:`text-dim text-xs truncate max-w-[150px]`,cellTitle:e=>e.source},{id:`method`,header:`Method`,headerTitle:`HTTP Method`,width:`1%`,accessor:e=>e.method,className:`font-mono text-xs whitespace-nowrap`},{id:`url`,header:`Request URL`,headerTitle:`Request URL`,accessor:e=>e.url,className:`text-bright font-mono text-xs truncate max-w-[800px]`,cellTitle:e=>e.url},{id:`status`,header:`Status`,headerTitle:`HTTP Status Code`,width:`1%`,accessor:e=>e.status,className:e=>`font-bold text-xs uppercase whitespace-nowrap ${e.status===`success`?`text-success`:`text-danger`}`},{id:`duration`,header:`Duration`,headerTitle:`Execution time in ms`,width:`1%`,align:`right`,accessor:e=>MC(e.duration),className:`font-mono text-xs text-dim whitespace-nowrap`}],dense:!0,tableLayout:`auto`,onRowClick:e=>{let t=document.getElementById(`trace-modal`),n=document.getElementById(`trace-detail-content`);t&&n&&(n.textContent=JSON.stringify(e,null,2),t.style.display=`flex`)}}).render(a)}function JC(e){let t=document.getElementById(`pools-container`);!t||!e.pools||(t.innerHTML=e.pools.map(e=>RC(e)).join(``))}function YC(e){let t=e.status.config;if(!t)return;let n=document.getElementById(`config-view`);n&&(n.innerHTML=HC(t))}function XC(e){if(e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return`${Number.parseFloat((e/t**r).toFixed(2))} ${n[r]}`}function ZC(e){return MC(e/1e3)}function QC(e,t){let n=document.getElementById(`middleware-version`);n&&e.version&&(n.textContent=`${e.version} (7/23/2026, 7:28:17 AM)`,n.title=`The version of the web_plsql gateway and admin console build time`);let r=document.getElementById(`node-version`);r&&e.system&&(r.textContent=e.system.nodeVersion,r.title=`The version of the Node.js runtime`);let i=document.getElementById(`platform-info`);i&&e.system&&(i.textContent=`${e.system.platform} (${e.system.arch})`,i.title=`The operating system and architecture`);let a=document.getElementById(`system-uptime`);a&&e.uptime&&(a.textContent=jC(e.uptime));let o=document.getElementById(`system-start-time`);o&&e.startTime&&(o.textContent=NC(e.startTime));let s=document.getElementById(`system-status-text`);s&&(s.textContent=e.status?.toUpperCase()??`-`);let c=document.getElementById(`total-requests`);c&&e.metrics&&(c.textContent=e.metrics.requestCount.toLocaleString(),c.title=`Cumulative number of requests handled by the server`);let l=document.getElementById(`total-errors`);l&&e.metrics&&(l.textContent=e.metrics.errorCount.toLocaleString(),l.title=`Cumulative number of failed requests`);let u=document.getElementById(`active-pools`);if(u&&e.pools&&(u.textContent=e.pools.length.toString(),u.title=`Number of database connection pools currently active`),e.system){let t=e.system,n={heapUsed:t.memory.heapUsed,heapTotal:t.memory.heapTotal,rss:t.memory.rss,external:t.memory.external,cpuUser:t.cpu.user,cpuSystem:t.cpu.system},r=(e,r,i)=>{let a=n[r],o=t.memory[i],s=document.getElementById(e),c=document.getElementById(`${e}-max`);s&&(s.textContent=XC(a)),c&&typeof o==`number`&&(c.textContent=XC(o))},i=(e,r,i)=>{let a=n[r],o=document.getElementById(e);if(o&&(o.textContent=ZC(a)),i){let n=t.cpu[i],r=document.getElementById(`${e}-max`);r&&typeof n==`number`&&(r.textContent=ZC(n))}};r(`memory-heap-used`,`heapUsed`,`heapUsedMax`),r(`memory-heap-total`,`heapTotal`,`heapTotalMax`),r(`memory-rss`,`rss`,`rssMax`),r(`memory-external`,`external`,`externalMax`),i(`cpu-user`,`cpuUser`,`userMax`),i(`cpu-system`,`cpuSystem`,`systemMax`);let a=document.getElementById(`cpu-percent`);a&&t.cpu.max!==void 0&&(a.textContent=`${t.cpu.max.toFixed(1)}%`,a.title=`Max System CPU usage`);let o=document.getElementById(`memory-percent`);o&&t.memory.totalMemory&&(o.textContent=`${(t.memory.rss/t.memory.totalMemory*100).toFixed(1)}%`,o.title=`System Memory Used relative to Total (${XC(t.memory.totalMemory)})`);let s=document.getElementById(`cpu-cores-info`);s&&t.cpuCores&&(s.textContent=`${t.cpuCores} Cores`)}}async function $C(e,t){let n=e.querySelector(`.material-symbols-rounded`),r=n?.textContent;e.disabled=!0,e.classList.add(`loading`),n&&(n.textContent=`sync`,n.classList.add(`animate-spin`));try{return await t()}finally{e.disabled=!1,e.classList.remove(`loading`),n&&(n.textContent=r??``,n.classList.remove(`animate-spin`))}}function ew(e,t){let n=document.getElementById(e);return n&&n.addEventListener(`click`,()=>void $C(n,t)),n}var tw={overview:`dashboard`,trace:`bolt`,errors:`error`,access:`list_alt`,pools:`database`,stats:`query_stats`,config:`settings`,system:`terminal`},$={currentView:`overview`,status:{},maxHistoryPoints:30,lastRequestCount:0,lastErrorCount:0,lastUpdateTime:Date.now(),lastBucketTimestamp:0,nextRefreshTimeout:null,nextRefreshTime:0,countdownInterval:null,history:{labels:[],requests:[],avgResponseTimes:[],p95ResponseTimes:[],p99ResponseTimes:[],cpuUsage:[],memoryUsage:[],poolUsage:{}},charts:{},metricsMin:{},metricsMax:{}},nw={REFRESH_INTERVAL:`admin_refresh_interval`,HISTORY_DURATION:`admin_history_duration`,AUTO_REFRESH:`admin_auto_refresh`,THEME:`theme`,LAST_VIEW:`admin_last_view`};function rw(e){console.error(`Connection lost:`,e);let t=document.getElementById(`server-status-dot`),n=document.getElementById(`server-status-text`);t&&(t.className=`dot offline`),n&&(n.textContent=`OFFLINE`);let r=document.getElementById(`btn-pause`);r&&(r.style.display=`none`);let i=document.getElementById(`btn-resume`);i&&(i.style.display=`none`);let a=document.querySelector(`#system-status .dot`),o=document.getElementById(`system-status-text`);a&&(a.className=`dot offline`),o&&(o.textContent=`OFFLINE`);let s=document.getElementById(`offline-modal`);s&&s.style.display!==`flex`&&(s.style.display=`flex`),sw(6e4),iw(6e4)}function iw(e){$.countdownInterval&&clearInterval($.countdownInterval);let t=Date.now()+e,n=document.getElementById(`offline-countdown`),r=document.getElementById(`reconnect-text`);r&&(r.textContent=`Try Reconnect`);let i=()=>{if(!n)return;let e=Math.max(0,Math.ceil((t-Date.now())/1e3));n.textContent=`Retrying in ${e}s...`,e<=0&&$.countdownInterval&&(clearInterval($.countdownInterval),$.countdownInterval=null)};i(),$.countdownInterval=setInterval(i,1e3)}function aw(){$.countdownInterval&&=(clearInterval($.countdownInterval),null);let e=document.getElementById(`offline-countdown`);e&&(e.textContent=``)}async function ow(e=!1,t=!1){let n=document.getElementById(`reconnect-spinner`),r=document.getElementById(`reconnect-icon`),i=document.getElementById(`reconnect-text`);n&&(n.style.display=`inline-block`),r&&(r.style.display=`none`),i&&(i.textContent=`Connecting...`);try{let a=Date.now(),o=await pm.getStatus(e,t),s=document.getElementById(`offline-modal`);if(s?.style.display===`flex`&&s&&(s.style.display=`none`,aw()),n&&(n.style.display=`none`),r&&(r.style.display=`inline-block`),i&&(i.textContent=`Try Reconnect`),o.history&&$.history.labels.length===0&&kC($,o.history),!o.config&&$.status.config&&(o.config=$.status.config),$.status=o,!o.metrics||!o.pools)return;let c=o.history?.at(-1),l=(o.intervalMs??5e3)/1e3,u=c?c.requests/l:0,d=c?c.durationAvg:o.metrics.avgResponseTime;if($.lastRequestCount=o.metrics.requestCount,$.lastErrorCount=o.metrics.errorCount,$.lastUpdateTime=a,o.system){let e=o.system;PC({heapUsed:e.memory.heapUsed,heapTotal:e.memory.heapTotal,rss:e.memory.rss,external:e.memory.external,cpuUser:e.cpu.user,cpuSystem:e.cpu.system},$.metricsMin,$.metricsMax)}c&&c.timestamp>$.lastBucketTimestamp?($.lastBucketTimestamp=c.timestamp,AC($,new Date(c.timestamp).toLocaleTimeString(),u,d,o.pools)):!c&&$.history.labels.length===0&&AC($,new Date().toLocaleTimeString(),0,0,o.pools);let f=document.getElementById(`sidebar-version`);f&&(f.textContent=`v${o.version}`);let p=document.getElementById(`uptime-val`);p&&(p.textContent=jC(o.uptime));let m=document.getElementById(`start-time-val`);m&&(m.textContent=`Started: ${NC(o.startTime)}`);let h=document.getElementById(`req-per-sec`);h&&(h.textContent=u.toFixed(2));let g=document.getElementById(`max-req-per-sec`);g&&(g.textContent=o.metrics.maxRequestsPerSecond.toFixed(2));let _=document.getElementById(`avg-resp-time`);_&&(_.textContent=`${o.metrics.avgResponseTime.toFixed(1)}ms`);let v=document.getElementById(`max-resp-time`);v&&(v.textContent=`${o.metrics.maxResponseTime.toFixed(1)}ms`);let y=document.getElementById(`err-count`);y&&(y.textContent=o.metrics.errorCount.toLocaleString());let b=0,x=0;o.pools.forEach(e=>{e.cache&&(b+=e.cache.procedureName.hits+e.cache.argument.hits,x+=e.cache.procedureName.misses+e.cache.argument.misses)});let S=b+x,C=S>0?Math.round(b/S*100):0,w=document.getElementById(`cache-hit-rate-val`);w&&(w.textContent=`${C}%`,w.style.color=C>80?`var(--success)`:C>50?`var(--warning)`:`var(--danger)`);let T=document.getElementById(`cache-hits-val`);T&&(T.textContent=b.toLocaleString());let E=document.getElementById(`cache-misses-val`);E&&(E.textContent=x.toLocaleString());let D=document.getElementById(`server-status-dot`),ee=document.getElementById(`server-status-text`);D&&(D.className=`dot `+o.status),ee&&(ee.textContent=o.status.toUpperCase());let te=document.getElementById(`btn-pause`);te&&(te.style.display=o.status===`running`?`flex`:`none`);let ne=document.getElementById(`btn-resume`);ne&&(ne.style.display=o.status===`paused`?`flex`:`none`),$.currentView===`errors`&&await WC(),$.currentView===`trace`&&await qC(),$.currentView===`pools`&&JC(o),$.currentView===`config`&&YC($),$.currentView===`system`&&QC(o,$),dw?.checked&&fw&&sw(Number.parseInt(fw.value,10))}catch(e){document.getElementById(`offline-modal`)?.style.display===`flex`?(sw(6e4),iw(6e4),n&&(n.style.display=`none`),r&&(r.style.display=`inline-block`),i&&(i.textContent=`Try Reconnect`)):rw(e)}}function sw(e){$.nextRefreshTimeout&&=(clearTimeout($.nextRefreshTimeout),null),$.nextRefreshTime=Date.now()+e,$.nextRefreshTimeout=setTimeout(()=>{ow()},e)}function cw(){let e=document.getElementById(`refresh-interval`);e&&sw(Number.parseInt(e.value))}function lw(){$.nextRefreshTimeout&&=(clearTimeout($.nextRefreshTimeout),null)}function uw(){let e=document.getElementById(`chart-history-points`);e&&Array.from(e.options).forEach(e=>{let t=Number.parseInt(e.value),n=``;if(t<60)n=`${t}s`;else if(t<3600)n=`${Math.round(t/60)} min`;else{let e=t/3600;n=e===Math.round(e)?`${e} hour${e>1?`s`:``}`:`${e.toFixed(1)} hours`}e.textContent=`Last ${n}`})}document.querySelectorAll(`nav button`).forEach(e=>{let t=e;t.addEventListener(`click`,async()=>{try{let e=t.dataset.view;if(!e)return;$.currentView=e,localStorage.setItem(nw.LAST_VIEW,e),document.querySelectorAll(`.view`).forEach(e=>{let t=e;t.style.display=`none`});let n=document.getElementById(`view-`+e);n&&(n.style.display=`block`),document.querySelectorAll(`nav button`).forEach(e=>e.classList.remove(`active`)),t.classList.add(`active`);let r=document.getElementById(`view-title`);if(r){let n=Array.from(t.childNodes).filter(e=>e.nodeType===Node.TEXT_NODE).map(e=>e.textContent?.trim()).join(``);r.innerHTML=`<span class="material-symbols-rounded">${tw[e]??`chevron_right`}</span>${n}`}e===`errors`&&await WC(),e===`trace`&&await qC(),e===`pools`&&JC($.status),e===`stats`&&await GC(),e===`config`&&YC($),e===`system`&&QC($.status,$)}catch(e){rw(e)}})});var dw=document.getElementById(`auto-refresh-toggle`);dw&&dw.addEventListener(`change`,e=>{let t=e.target;localStorage.setItem(nw.AUTO_REFRESH,String(t.checked)),t.checked?cw():lw()});var fw=document.getElementById(`refresh-interval`);fw&&fw.addEventListener(`change`,()=>{localStorage.setItem(nw.REFRESH_INTERVAL,fw.value);let e=Number.parseInt(fw.value),t=Number.parseInt(pw?.value??`60`);$.maxHistoryPoints=Math.max(1,Math.floor(t/(e/1e3))),$.history.labels=[],$.history.requests=[],$.history.avgResponseTimes=[],$.history.cpuUsage=[],$.history.memoryUsage=[],$.history.poolUsage={},uw(),QC($.status,$),ow()});var pw=document.getElementById(`chart-history-points`);pw&&pw.addEventListener(`change`,()=>{localStorage.setItem(nw.HISTORY_DURATION,pw.value);let e=document.getElementById(`refresh-interval`);if(!e)return;let t=Number.parseInt(e.value),n=Number.parseInt(pw.value);$.maxHistoryPoints=Math.max(1,Math.floor(n/(t/1e3))),$.history.labels=[],$.history.requests=[],$.history.avgResponseTimes=[],$.history.cpuUsage=[],$.history.memoryUsage=[],$.history.poolUsage={},ow()});var mw=document.getElementById(`manual-refresh`);mw&&mw.addEventListener(`click`,()=>{$C(mw,ow)});var hw=document.getElementById(`error-filter`);hw&&hw.addEventListener(`keydown`,e=>{e.key===`Enter`&&WC()}),ew(`error-load-btn`,WC),ew(`trace-load-btn`,qC),ew(`access-load-btn`,KC),ew(`stats-load-btn`,GC);var gw=document.getElementById(`trace-filter`);gw&&gw.addEventListener(`keydown`,e=>{e.key===`Enter`&&qC()});var _w=document.getElementById(`trace-clear-btn`);_w&&_w.addEventListener(`click`,async()=>{confirm(`Are you sure you want to clear all traces?`)&&await $C(_w,async()=>{await pm.clearTraces(),await qC()})});var vw=document.getElementById(`trace-status-toggle`);vw&&vw.addEventListener(`click`,async()=>{await $C(vw,async()=>{let{enabled:e}=await pm.getTraceStatus();await pm.toggleTrace(!e),await qC()})});var yw=document.getElementById(`access-filter`);yw&&yw.addEventListener(`keydown`,e=>{e.key===`Enter`&&KC()});var bw=document.getElementById(`stats-limit`);bw&&bw.addEventListener(`keydown`,e=>{e.key===`Enter`&&GC()}),ew(`btn-pause`,async()=>{confirm(`Are you sure you want to pause the server?`)&&(await pm.post(`api/server/pause`),await ow())}),ew(`btn-resume`,async()=>{await pm.post(`api/server/resume`),await ow()}),ew(`btn-stop`,async()=>{confirm(`Are you sure you want to STOP the server? This action cannot be undone from the web interface.`)&&(await pm.post(`api/server/stop`),alert(`Server stop requested. The interface will now become unresponsive.`))}),ew(`btn-clear-all-cache`,async()=>{confirm(`Are you sure you want to clear ALL caches?`)&&(await pm.post(`api/cache/clear`),await ow())});var xw=document.getElementById(`btn-reconnect`);xw&&xw.addEventListener(`click`,()=>{$C(xw,ow)}),globalThis.addEventListener(`keydown`,e=>{if(e.key===`Escape`){let e=document.getElementById(`error-modal`);e&&(e.style.display=`none`);let t=document.getElementById(`trace-modal`);t&&(t.style.display=`none`)}});var Sw=localStorage.getItem(nw.REFRESH_INTERVAL);Sw&&fw&&(fw.value=Sw);var Cw=localStorage.getItem(nw.HISTORY_DURATION);Cw&&pw&&(pw.value=Cw);var ww=localStorage.getItem(nw.AUTO_REFRESH);if(ww!==null&&dw&&(dw.checked=ww===`true`),LC($),OC($),uw(),fw&&pw){let e=Number.parseInt(fw.value),t=Number.parseInt(pw.value);$.maxHistoryPoints=Math.max(1,Math.floor(t/(e/1e3)))}var Tw=localStorage.getItem(nw.LAST_VIEW);if(Tw){let e=document.querySelector(`nav button[data-view="${Tw}"]`);e&&e.click()}ow(!0,!0).then(()=>{dw?.checked&&cw()}).catch(console.error);
@@ -6,7 +6,7 @@
6
6
  <title>web_plsql Admin Console</title>
7
7
  <link rel="icon" type="image/svg+xml" href="/admin/assets/favicon-mQAM4tVu.svg" />
8
8
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
9
- <script type="module" crossorigin src="/admin/assets/main-CRRNh8tB.js"></script>
9
+ <script type="module" crossorigin src="/admin/assets/main-B-LqjcmS.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="/admin/assets/main-k8GNR9Ye.css">
11
11
  </head>
12
12
  <body class="dark">
Binary file
Binary file
package/dist/index.mjs CHANGED
@@ -321,7 +321,7 @@ globalThis.__VERSION__ ??= "**development**";
321
321
  * Returns the current library version
322
322
  * @returns {string} - Version.
323
323
  */
324
- const getVersion = () => "1.8.7";
324
+ const getVersion = () => "1.8.8";
325
325
  //#endregion
326
326
  //#region src/backend/server/printBanner.ts
327
327
  const IS_TTY = process.stdout.isTTY === true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "web_plsql",
3
- "version": "1.8.7",
3
+ "version": "1.8.8",
4
4
  "description": "The Express Middleware for Oracle PL/SQL",
5
5
  "keywords": [
6
6
  "apex",
@@ -77,16 +77,16 @@
77
77
  "husky": "9.1.7",
78
78
  "knip": "6.27.0",
79
79
  "oracledb": "7.0.1",
80
- "oxfmt": "0.59.0",
81
- "oxlint": "1.74.0",
82
- "oxlint-tsgolint": "0.25.0",
80
+ "oxfmt": "0.60.0",
81
+ "oxlint": "1.75.0",
82
+ "oxlint-tsgolint": "7.0.2001",
83
83
  "release-it": "20.2.1",
84
84
  "shx": "0.4.0",
85
- "stylelint": "17.14.0",
85
+ "stylelint": "17.14.1",
86
86
  "stylelint-config-standard": "40.0.0",
87
87
  "supertest": "7.2.2",
88
88
  "tailwindcss": "4.3.3",
89
- "tsdown": "0.22.9",
89
+ "tsdown": "0.22.13",
90
90
  "typescript": "7.0.2",
91
91
  "vite": "8.1.5",
92
92
  "vite-plugin-compression2": "2.5.3",