Todos os projetos games/01 · tempo real

SOMS

Toca um trecho de música e todo mundo corre pra acertar título, artista e feat antes dos outros. No fim, um card de estatística pra jogar no grupo.

Ano
2026
Papel
Do PRD ao deploy
Stack
Next.js 15 · Fastify + Socket.IO · Prisma · Neon · Upstash · Deezer
Link
código no GitHub ↗
Tela inicial do SOMS: o nome do jogo em letras grossas, o mote todo mundo acha que sabe logo abaixo, e um cartão perguntando qual seu apelido.
a porta de entrada: apelido, código da sala e pronto passe o cursor para ver em cor

O problema

Todo mundo já jogou de adivinhar música numa mesa de bar, e todo mundo já viu isso desandar: um fala antes, ninguém sabe quem acertou primeiro, e a discussão sobre quem falou antes dura mais que a rodada.

Um placar automático resolve isso, desde que ele consiga dizer sem dúvida quem chegou primeiro.

A decisão

O servidor de tempo real vive fora da Vercel. Funções serverless não seguram conexão TCP longa. Existem contornos pagos pra isso, mas um Fastify com Socket.IO num container da Railway custa uns cinco dólares por mês depois do plano gratuito e me dá controle total do protocolo. O site continua na Vercel, e só o jogo mora noutro lugar.

Toda pontuação é decidida no servidor, que é quem sabe a hora exata em que cada resposta chegou.

As URLs morrem em trinta minutos

O trecho de cada música vem do Deezer, e a URL dele não é um endereço estável: é um link assinado com validade embutida, no padrão de token da Akamai. Guardar essa URL no banco funciona nos testes e falha em produção algumas horas depois, quando ninguém mais está olhando pra aquele código.

Em vez de chutar, eu medi: de vinte faixas cacheadas, doze respondiam 403 quarenta minutos depois. Numa partida real isso seria a maior parte das rodadas tocando silêncio.

A correção separou o que tem validade longa do que não tem. O banco guarda a metadata da faixa, que é estável. A URL do trecho é buscada de novo, em lote, no instante em que a sala começa a partida, antes da contagem regressiva e com um controle de vazão pra nunca estourar o limite da API. Se alguma faixa sumiu do catálogo no meio do caminho, ela é descartada ali e substituída antes de qualquer jogador perceber. Aquele "Preparando partida..." que aparece na tela é esse lote acontecendo.

~30minde validade na URL assinada
12 de 20faixas mortas depois de 40min
300ms a 2so lote inteiro antes da contagem

Acertar "quase" ainda é acertar

Ninguém digita o nome da música exatamente como está no catálogo, com acento, com o "(Remastered 2011)" no fim e com o feat na ordem certa. Então a resposta passa por normalização e por uma tabela de apelidos antes de ser comparada, e o placar aceita a forma como as pessoas de fato escrevem.

Um bug que só existe depois de meia hora

O bug das URLs assinadas passaria por qualquer suíte de testes, porque no minuto zero está tudo verde. Ele só aparece depois de meia hora e só na máquina de quem está jogando. Desde então eu olho integração com API de terceiro pensando em quanto tempo aquilo continua válido, e não só em se responde certo agora.