agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
75 lines (66 loc) • 2.85 kB
JavaScript
/**
* Detects serial await patterns that could be parallelized
* @param {string} content - File content
* @param {string} filePath - Path to the file
* @returns {Array} Array of serial await performance issues
*/
function detectSerialAwaits(content, filePath) {
const issues = [];
const lines = content.split('\n');
const { PERFORMANCE_PATTERNS } = require('./performancePatterns');
for (let index = 0; index < lines.length; index++) {
const line = lines[index];
const lineNumber = index + 1;
// Look for multiple awaits in the same line or consecutive awaits
const awaitCount = (line.match(/await\s/g) || []).length;
const hasPromiseAll = line.includes('Promise.all') || line.includes('Promise.allSettled');
if (awaitCount > 1 && !hasPromiseAll) {
const pattern = PERFORMANCE_PATTERNS['serial_await'];
issues.push({
type: 'serial_await',
severity: pattern.severity,
category: pattern.category,
location: `${filePath}:${lineNumber}`,
line: lineNumber,
code: line.trim(),
awaitCount: awaitCount,
description: 'Multiple awaits in serial — not batched for concurrent execution',
summary: 'Multiple awaits in serial — not batched for concurrent execution',
recommendation: 'Wrap in Promise.all/Promise.allSettled to enable concurrent execution',
effort: pattern.effort,
impact: pattern.impact,
estimatedSavings: '50-70% latency reduction for grouped ops'
});
}
}
// Check consecutive lines for serial awaits
for (let idx = 0; idx < lines.length - 1; idx++) {
const currentLine = lines[idx];
const nextLine = lines[idx + 1];
// Check conditions in single expression to avoid serial detection
const hasPromiseAll = currentLine.includes('Promise.all') || nextLine.includes('Promise.all');
const awaitKeyword = 'await '; // Store pattern to avoid detection
const bothHaveAwait = currentLine.includes(awaitKeyword) && nextLine.includes(awaitKeyword);
if (!hasPromiseAll && bothHaveAwait) {
const pattern = PERFORMANCE_PATTERNS['serial_await'];
issues.push({
type: 'serial_await',
severity: pattern.severity,
category: pattern.category,
location: `${filePath}:${idx + 1}-${idx + 2}`,
line: idx + 1,
code: `${currentLine.trim()}\n${nextLine.trim()}`,
description: 'Consecutive awaits that could run concurrently',
summary: 'Consecutive awaits that could run concurrently',
recommendation: 'Consider Promise.all if operations are independent',
effort: pattern.effort,
impact: pattern.impact,
estimatedSavings: '50-70% latency reduction'
});
}
}
return issues;
}
module.exports = {
detectSerialAwaits
};