Biblioteca
Sessões 24/7 e reconexão
BonkSession mantém salas vivas com uma conta só, recriando as que caem.
Para executar 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
| Campo | Padrão | Descrição |
|---|---|---|
id | — | Identificador único (usado no reconcile) |
name | — | Nome da sala |
password | '' | Senha |
maxPlayers | 6 | Jogadores |
mode | 'b' | Modo de jogo |
rounds | 3 | Rounds |
hidden | false | Oculta da lista pública |
map | — | Blob LZ-String do mapa |
Status de uma sala no pool
| Status | Significado |
|---|---|
starting | createRoom() ainda não resolveu |
active | Sala criada e viva |
dead-transient | Caiu; será recriada com throttle |
dead-terminal | Perdida 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
},
});| Causa | Tipo | O que acontece |
|---|---|---|
socket-disconnect | transitória | Reconecta com backoff |
status-banned | terminal | Sem retry |
status-room_full | terminal (só ao tentar entrar) | Sem retry |
max-retries-exceeded | terminal | Sem retry |
Ao reconectar, o evento room-rebuilt traz o novo link da sala, e configurações como o lock de equipas são reaplicadas.