fix(league): parar de reemitir a sessao de champ select a cada tick do timer - #268
Merged
Conversation
… por jogador e runas
…o timer O cliente republica a sessao varias vezes por segundo — so o relogio da fase ja muda a cada tick. Reemitir o objeto inteiro nessa frequencia inunda a webview: cada evento troca um estado grande e forca os oito paineis montados a redesenhar, o que trava a janela toda e impede ate trocar de menu. Agora o evento so sai quando muda algo que a interface le (actions, campeoes, banco, trocas), com um batimento de 1,5s para nunca ficar parado. Os pollers da partida ao vivo ganham guarda de reentrancia: um tique que chega com o anterior em voo e descartado em vez de enfileirado. Junto, o historico ganha o que faltava: runas e feiticos por jogador, os sete itens, e as estatisticas completas (dano causado/recebido/mitigado, cura, objetivos, ouro por minuto, CS por minuto, visao, wards, tempo de CC, melhor sequencia, multikills, first blood e primeira torre). Clicar no nome de qualquer jogador do placar abre as ultimas partidas dele.
tonhowtf
force-pushed
the
hotfix/league-freeze
branch
from
July 30, 2026 16:25
4965ad2 to
cf7344c
Compare
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que
Hotfix do travamento + o histórico completo que faltava.
league-champ-selectsó é emitido quando muda algo que a interface lê.A causa do travamento
O cliente republica a sessão de champ select várias vezes por segundo — só o relógio da fase (
timer.adjustedTimeLeftInPhase) já muda a cada tick. Ows.rsreemitia o objeto inteiro em cada uma dessas atualizações, e o frontend faziachampSelect = e.payload, substituindo um estado grande. Como os oito painéis do league ficam sempre montados (decisão deliberada, para preservar estado entre abas), cada evento forçava todos a reavaliar seus derivados e redesenhar. Isso satura a thread da UI da webview — e como é a mesma thread do app inteiro, a janela para de responder a cliques e não dá para trocar de menu. Bate com o relato: acontece "do nada", sempre no League.O agravante: o
setIntervalde 4s chamavarefreshPhaseDatasem verificar se a rodada anterior tinha terminado. Com o cliente lento, cada tique enfileirava mais três requisições, e as respostas se acumulavam na mesma thread.Duas correções independentes, porque as duas causas são reais:
champ_select_fingerprint): cobreactions(id, campeão, completed, isInProgress), campeões e intenções de pick dos dois times, banco, trocas e swaps. O relógio fica de fora. Se a impressão digital não mudou, o evento é descartado; um batimento de 1,5s garante que a interface nunca fique parada por causa de uma mudança que a impressão digital não cobriu.loadLiveMetrics,loadLiveEvents,loadCooldownse no própriorefreshPhaseData: um tique que chega com o anterior em voo é descartado, não enfileirado.Não consegui reproduzir o travamento aqui (sem cliente de LoL rodando nesta máquina), então isto é correção por diagnóstico do mecanismo, não por observação do bug. Se voltar a travar, o próximo suspeito é o volume de re-render dos painéis sempre montados — a correção seria desmontar os painéis inativos, ao custo de perder estado ao trocar de aba.
O histórico completo
/lol-perks/v1/perks(que já é cacheado como patch-static). O payload traz também os 6 perks e os 3 stat mods, prontos para uma visão detalhada.participantIdentities[].player.puuiddá o puuid de cada participante, então clicar no nome abre as últimas 10 partidas dele numa gaveta. Isto entrega o item D7, que eu tinha descartado no PR feat(league): definir preferencia de rota no lobby #250 achando que o puuid não estava disponível no payload — estava, eu tinha olhado no lugar errado.Como testar
cd src-tauri && cargo test -p omniget league— 3 testes novos do coalescing (77 no total): sessão que só avançou o relógio tem a mesma impressão digital; qualquer mudança que os painéis leem muda a impressão; sessão vazia não quebra.Plataformas
cargo test77,pnpm test58,pnpm check0 erros)Estado
stable— o hotfix não tem flag: é correção de um comportamento que nunca foi intencional.Risco & rollback
Risco ToS: nenhum (menos tráfego, não mais). Rollback: reverter o commit; o comportamento anterior volta, travamento incluído.
Débito deixado
league-lobbynão foi coalescido; o lobby muda muito menos, mas o padrão está pronto se precisar.