|
16 | 16 | window.setupComplete = false; |
17 | 17 | window.latestVersion = null; |
18 | 18 |
|
19 | | - // ============================================================ |
20 | | - // Network Activity (PerformanceObserver) |
21 | | - // ============================================================ |
22 | | - var networkEntries = []; |
23 | | - var netObserver = new PerformanceObserver(function (list) { |
24 | | - for (var entry of list.getEntries()) { |
25 | | - if (entry.name.includes('overturemaps.org')) { |
26 | | - networkEntries.push(entry); |
27 | | - renderNetworkActivity(); |
28 | | - } |
29 | | - } |
30 | | - }); |
31 | | - netObserver.observe({ type: 'resource', buffered: true }); |
32 | | - |
33 | | - function formatBytes(bytes) { |
34 | | - if (!bytes || bytes === 0) return 'n/a'; |
35 | | - if (bytes < 1024) return bytes + ' B'; |
36 | | - if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; |
37 | | - return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; |
38 | | - } |
39 | | - |
40 | | - function extractFilename(url) { |
41 | | - try { |
42 | | - var path = new URL(url).pathname; |
43 | | - var segments = path.split('/').filter(Boolean); |
44 | | - return segments[segments.length - 1] || path; |
45 | | - } catch (e) { |
46 | | - return url; |
47 | | - } |
48 | | - } |
49 | | - |
50 | | - function renderNetworkActivity() { |
51 | | - var container = document.getElementById('network-container'); |
52 | | - var meta = document.getElementById('network-meta'); |
53 | | - if (!container || !meta) return; |
54 | | - |
55 | | - if (networkEntries.length === 0) { |
56 | | - container.innerHTML = '<p class="placeholder">Network requests will appear here during queries.</p>'; |
57 | | - meta.textContent = ''; |
58 | | - return; |
59 | | - } |
60 | | - |
61 | | - // Summary |
62 | | - var totalSize = 0; |
63 | | - for (var i = 0; i < networkEntries.length; i++) { |
64 | | - totalSize += networkEntries[i].transferSize || 0; |
65 | | - } |
66 | | - var summary = networkEntries.length + ' request' + (networkEntries.length !== 1 ? 's' : ''); |
67 | | - if (totalSize > 0) { |
68 | | - summary += ' \u00b7 ' + formatBytes(totalSize); |
69 | | - } |
70 | | - meta.textContent = summary; |
71 | | - |
72 | | - // Table |
73 | | - var html = '<div class="table-wrapper"><table><thead><tr>'; |
74 | | - html += '<th>File</th><th>Duration</th><th>TTFB</th><th>Size</th><th>Time</th>'; |
75 | | - html += '</tr></thead><tbody>'; |
76 | | - |
77 | | - for (var j = 0; j < networkEntries.length; j++) { |
78 | | - var e = networkEntries[j]; |
79 | | - var filename = extractFilename(e.name); |
80 | | - var duration = Math.round(e.duration) + ' ms'; |
81 | | - var ttfb = Math.round(e.responseStart - e.startTime); |
82 | | - var ttfbStr = ttfb >= 0 ? ttfb + ' ms' : 'n/a'; |
83 | | - var size = formatBytes(e.transferSize); |
84 | | - var time = (e.startTime / 1000).toFixed(1) + 's'; |
85 | | - |
86 | | - html += '<tr>'; |
87 | | - html += '<td title="' + escapeHtml(e.name) + '">' + escapeHtml(filename) + '</td>'; |
88 | | - html += '<td>' + duration + '</td>'; |
89 | | - html += '<td>' + ttfbStr + '</td>'; |
90 | | - html += '<td>' + size + '</td>'; |
91 | | - html += '<td>' + time + '</td>'; |
92 | | - html += '</tr>'; |
93 | | - } |
94 | | - |
95 | | - html += '</tbody></table></div>'; |
96 | | - container.innerHTML = html; |
97 | | - } |
98 | | - |
99 | | - function clearNetworkActivity() { |
100 | | - networkEntries = []; |
101 | | - performance.clearResourceTimings(); |
102 | | - var container = document.getElementById('network-container'); |
103 | | - var meta = document.getElementById('network-meta'); |
104 | | - if (container) { |
105 | | - container.innerHTML = '<p class="placeholder">Network requests will appear here during queries.</p>'; |
106 | | - } |
107 | | - if (meta) { |
108 | | - meta.textContent = ''; |
109 | | - } |
110 | | - } |
111 | | - |
112 | 19 | // ============================================================ |
113 | 20 | // DOM References |
114 | 21 | // ============================================================ |
|
301 | 208 | btnSetup.disabled = true; |
302 | 209 | btnSetup.innerHTML = '<span class="btn-spinner"></span>Running...'; |
303 | 210 | hideError(setupError); |
304 | | - clearNetworkActivity(); |
305 | 211 |
|
306 | 212 | releaseItem.style.display = 'flex'; |
307 | 213 | releaseDot.className = 'status-dot loading'; |
|
405 | 311 | btnQuery.disabled = true; |
406 | 312 | btnQuery.innerHTML = '<span class="btn-spinner"></span>Running...'; |
407 | 313 | hideError(queryError); |
408 | | - clearNetworkActivity(); |
409 | 314 | resultsContainer.innerHTML = '<p class="placeholder">Running query...</p>'; |
410 | 315 | resultsMeta.textContent = ''; |
411 | 316 |
|
|
0 commit comments