Appearance
Web Workers — Cálculos Fora da Thread Principal
Cálculos previdenciários são computacionalmente intensivos (varredura de histórico, apuração de grupos, concomitâncias). Para manter a UI responsiva, todas as calculadoras executam a lógica de domínio em Web Workers separados da thread principal.
Infraestrutura: criarWorkerScope
O utilitário criarWorkerScope do @fc/utils padroniza a comunicação entre a thread principal e o worker:
ts
// composables/worker/calcular.worker.ts
import { criarWorkerScope } from '@fc/utils/etc/worker/criarWorkerScope'
import { AnaliseBeneficios } from '@fc/calculos-previdenciarios/analise-beneficios/AnaliseBeneficios'
criarWorkerScope(async (mensagem) => {
return new AnaliseBeneficios(mensagem.dados).apurar()
})ts
// composables/useCalcular.ts (thread principal)
const worker = new Worker(
new URL('./worker/calcular.worker.ts', import.meta.url),
{ type: 'module' }
)
worker.postMessage({ dados: historicoRgps })
worker.onmessage = (evento) => {
resultado.value = evento.data
}Estrutura em cada calculadora
apps/prev-tc/app/composables/
├── workers/
│ ├── calcularBeneficio.worker.ts ← executa no worker
│ └── calcularRmi.worker.ts
├── useCalcularBeneficio.ts ← composable de UI (cria e usa o worker)
└── useCalcularRmi.tsTestes de workers
Vitest com @vitest/web-worker permite testar workers diretamente:
ts
// vitest.config.mts
export default defineConfig({
test: {
environment: 'happy-dom',
},
})ts
// calcular.worker.spec.ts
import { expect, test } from 'vitest'
test('worker calcula corretamente', async () => {
const worker = new Worker(new URL('./calcular.worker.ts', import.meta.url))
// ...
})Veja
apps/prev-tc/app/composables/workers/como referência de implementação completa.