Skip to content

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.ts

Testes 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.