Biblioteca

Sessões 24/7 e reconexão

BonkSession mantém salas vivas com uma conta só, recriando as que caem.

Para rodar uma ou várias salas sem supervisão, use BonkSession. Ela compartilha a autenticação (uma só chamada de login), aplica um throttle entre criações e recria salas que caem.

ts
import { BonkSession } from 'bonktools';

const session = new BonkSession({
  auth: { type: 'registered', username: '...', password: '...' },
  throttle: {
    capacity: 3,        // máximo de criações em rajada
    refillPerSec: 0.5,  // 1 vaga reposta a cada 2 s
  },
});

await session.getToken();  // autentica uma vez; o token é reaproveitado

session.on('room-added', (localId) => {
  const { room } = session.rooms.get(localId)!;
  console.log('sala ativa:', room.shareLink);
});

session.on('room-dead-terminal', ({ localId, reason }) => {
  console.error('sala perdida para sempre:', localId, reason);
});

Modo declarativo: startFromConfig()

Cria todas as salas de uma lista, com intervalo (e aleatoriedade) entre as criações. As configurações ficam registradas no reconcile de 60 s, uma rede de segurança que recria salas que caíram sem avisar.

ts
await session.startFromConfig({
  rooms: [
    { id: 'sala-1', name: 'Sala Um',   maxPlayers: 6, mode: 'b',  rounds: 3 },
    { id: 'sala-2', name: 'Sala Dois', maxPlayers: 8, mode: 'ar', rounds: 5 },
  ],
  throttle: {
    maxConcurrentRooms: 10,
    roomCreationDelayMs: 3000,   // espera mínima entre criações
    roomCreationJitterMs: 2000,  // + aleatório de até 2 s
  },
});

Modo imperativo

ts
const localId = await session.addRoom({ id: 'sala-3', name: 'HERMES', maxPlayers: 4, mode: 'sp', rounds: 3 });

const { room, status } = session.rooms.get(localId)!;
room.chat('Olá!');

await session.removeRoom(localId);
await session.destroy();   // encerra toda a sessão (idempotente)

RoomConfig

CampoPadrãoDescrição
idIdentificador único (usado no reconcile)
nameNome da sala
password''Senha
maxPlayers6Jogadores
mode'b'Modo de jogo
rounds3Rounds
hiddenfalseOculta da lista pública
mapBlob LZ-String do mapa

Status de uma sala no pool

StatusSignificado
startingcreateRoom() ainda não resolveu
activeSala criada e viva
dead-transientCaiu; será recriada com throttle
dead-terminalPerdida de vez (ban, sala cheia, tentativas esgotadas)

Reconexão automática

BonkRoom reconecta sozinho depois de quedas transitórias (socket caiu, servidor reiniciou), com backoff exponencial e jitter:

ts
const room = await createRoom({
  auth,
  desiredState: { /* ... */ },
  reconnectPolicy: {
    maxAttempts: 10,       // padrão
    initialDelayMs: 1000,  // padrão: 1 s
    maxDelayMs: 30_000,    // padrão: 30 s
    multiplier: 1.5,       // padrão
    jitter: true,          // recomendado
  },
});
CausaTipoO que acontece
socket-disconnecttransitóriaReconecta com backoff
status-bannedterminalSem retry
status-room_fullterminal (só ao tentar entrar)Sem retry
max-retries-exceededterminalSem retry

Ao reconectar, o evento room-rebuilt traz o novo link da sala, e configurações como o lock de times são reaplicadas.