/** * Search Worker * Offloads search operations to a background thread to avoid blocking the UI */ // Listen for search requests from main thread self.onmessage = (event) => { const { lines, searchTerm, id } = event.data; if (!searchTerm || !lines) { self.postMessage({ type: 'complete', id, results: [] }); return; } try { const results = []; const lowerSearchTerm = searchTerm.toLowerCase(); const chunkSize = 1000; // Process in chunks and send updates // Process lines and find matches for (let i = 0; i < lines.length; i++) { if (lines[i].toLowerCase().includes(lowerSearchTerm)) { results.push(i); } // Send progress updates every chunk if ((i + 1) % chunkSize === 0) { self.postMessage({ type: 'progress', id, percent: ((i + 1) / lines.length) * 100, foundSoFar: results.length }); } } // Send final results self.postMessage({ type: 'complete', id, results, totalMatches: results.length }); } catch (error) { self.postMessage({ type: 'error', id, error: error.message }); } };