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
| Campo | Por defecto | Descripción |
|---|---|---|
id | — | Identificador único (usado en el reconcile) |
name | — | Nombre de la sala |
password | '' | Contraseña |
maxPlayers | 6 | Jugadores |
mode | 'b' | Modo de juego |
rounds | 3 | Rounds |
hidden | false | La oculta de la lista pública |
map | — | Blob LZ-String del mapa |
Estado de una sala en el pool
| Estado | Significado |
|---|---|
starting | createRoom() aún no se ha resuelto |
active | Sala creada y viva |
dead-transient | Cayó; se recreará con throttle |
dead-terminal | Perdida 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
},
});| Causa | Tipo | Qué ocurre |
|---|---|---|
socket-disconnect | transitoria | Se reconecta con backoff |
status-banned | terminal | Sin reintento |
status-room_full | terminal (solo al intentar entrar) | Sin reintento |
max-retries-exceeded | terminal | Sin reintento |
Al reconectar, el evento room-rebuilt trae el nuevo enlace de la sala, y ajustes como el bloqueo de equipos se reaplican.