src/knowledge/arquitetura.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import type { Detection, Observations } from '../core/types.js';
export function inferirArquitetura(deteccoes: Detection[], obs: Observations): string[] {
const tem = (nome: string) => deteccoes.some((d) => d.nome === nome);
const temCategoria = (cat: string) => deteccoes.some((d) => d.categorias.includes(cat));
const reais = deteccoes.filter((d) => d.evidencias.some((e) => e.fonte !== 'heuristica'));
const cadeia: string[] = ['Navegador'];
const nomesUsados = new Set<string>();
const cdn = reais.find((d) => d.categorias.includes('CDN'));
if (cdn) {
cadeia.push(cdn.nome);
nomesUsados.add(cdn.nome);
} else if (obs.cdnAparente) {
cadeia.push(obs.cdnAparente);
nomesUsados.add(obs.cdnAparente);
}
const serverless = reais.find((d) => d.categorias.includes('PaaS'));
const servidor = reais.find((d) => d.categorias.includes('Web servers'));
if (servidor && !serverless) cadeia.push(`servidor web (${servidor.nome})`);
else if (serverless && !nomesUsados.has(serverless.nome)) {
cadeia.push(`plataforma serverless (${serverless.nome})`);
} else if (obs.servidorAparente && !cdn) cadeia.push(`servidor (${obs.servidorAparente})`);
const app =
reais.find((d) => d.categorias.includes('CMS')) ??
reais.find((d) => d.categorias.includes('Ecommerce')) ??
reais.find((d) => d.categorias.includes('Web frameworks'));
if (app) cadeia.push(app.nome);
if (temCategoria('Databases') || tem('MySQL')) cadeia.push('banco de dados');
if (cadeia.length <= 2 && temCategoria('JavaScript frameworks')) {
const fw = deteccoes.find((d) => d.categorias.includes('JavaScript frameworks'));
if (fw) cadeia.push(`aplicação de página única (${fw.nome})`);
}
return cadeia;
}
|