Biblioteca

Sesiones 24/7 y reconexión

BonkSession mantiene salas vivas con una sola cuenta, recreando las que caen.

Para ejecutar una o varias salas sin supervisión, usa BonkSession. Comparte la autenticación (una sola llamada de login), aplica un throttle entre creaciones y recrea las salas que caen.

ts
import { BonkSession } from 'bonktools';

const session = new BonkSession({
  auth: { type: 'registered', username: '...', password: '...' },
  throttle: {
    capacity: 3,        // máximo de creaciones en ráfaga
    refillPerSec: 0.5,  // 1 hueco repuesto cada 2 s
  },
});

await session.getToken();  // autentica una vez; el token se reutiliza

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

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

Modo declarativo: startFromConfig()

Crea todas las salas de una lista, con un intervalo (y algo de aleatoriedad) entre creaciones. Las configuraciones quedan registradas en el reconcile de 60 s, una red de seguridad que recrea las salas que cayeron sin avisar.

ts
await session.startFromConfig({
  rooms: [
    { id: 'sala-1', name: 'Sala Uno',   maxPlayers: 6, mode: 'b',  rounds: 3 },
    { id: 'sala-2', name: 'Sala Dos', maxPlayers: 8, mode: 'ar', rounds: 5 },
  ],
  throttle: {
    maxConcurrentRooms: 10,
    roomCreationDelayMs: 3000,   // espera mínima entre creaciones
    roomCreationJitterMs: 2000,  // + aleatorio de hasta 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('¡Hola!');

await session.removeRoom(localId);
await session.destroy();   // cierra toda la sesión (idempotente)

RoomConfig

CampoPor defectoDescripción
idIdentificador único (usado en el reconcile)
nameNombre de la sala
password''Contraseña
maxPlayers6Jugadores
mode'b'Modo de juego
rounds3Rounds
hiddenfalseLa oculta de la lista pública
mapBlob LZ-String del mapa

Estado de una sala en el pool

EstadoSignificado
startingcreateRoom() aún no se ha resuelto
activeSala creada y viva
dead-transientCayó; se recreará con throttle
dead-terminalPerdida definitivamente (baneo, sala llena, reintentos agotados)

Reconexión automática

BonkRoom se reconecta solo tras caídas transitorias (el socket se cayó, el servidor se reinició), con backoff exponencial y jitter:

ts
const room = await createRoom({
  auth,
  desiredState: { /* ... */ },
  reconnectPolicy: {
    maxAttempts: 10,       // por defecto
    initialDelayMs: 1000,  // por defecto: 1 s
    maxDelayMs: 30_000,    // por defecto: 30 s
    multiplier: 1.5,       // por defecto
    jitter: true,          // recomendado
  },
});
CausaTipoQué ocurre
socket-disconnecttransitoriaSe reconecta con backoff
status-bannedterminalSin reintento
status-room_fullterminal (solo al intentar entrar)Sin reintento
max-retries-exceededterminalSin reintento

Al reconectar, el evento room-rebuilt trae el nuevo enlace de la sala, y ajustes como el bloqueo de equipos se reaplican.