Bibliothèque

Sessions 24h/24 et reconnexion

BonkSession garde des salons actifs avec un seul compte, en recréant ceux qui tombent.

Pour faire tourner un ou plusieurs salons sans surveillance, utilisez BonkSession. Elle partage l'authentification (un seul appel de login), applique un throttle entre les créations et recrée les salons qui tombent.

ts
import { BonkSession } from 'bonktools';

const session = new BonkSession({
  auth: { type: 'registered', username: '...', password: '...' },
  throttle: {
    capacity: 3,        // maximum de créations en rafale
    refillPerSec: 0.5,  // 1 place rendue toutes les 2 s
  },
});

await session.getToken();  // s'authentifie une fois ; le token est réutilisé

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

session.on('room-dead-terminal', ({ localId, reason }) => {
  console.error('salon perdu définitivement :', localId, reason);
});

Mode déclaratif : startFromConfig()

Crée tous les salons d'une liste, avec un délai (et un peu d'aléatoire) entre les créations. Les configurations sont enregistrées dans le reconcile de 60 s, un filet de sécurité qui recrée les salons tombés sans prévenir.

ts
await session.startFromConfig({
  rooms: [
    { id: 'sala-1', name: 'Salon Un',   maxPlayers: 6, mode: 'b',  rounds: 3 },
    { id: 'sala-2', name: 'Salon Deux', maxPlayers: 8, mode: 'ar', rounds: 5 },
  ],
  throttle: {
    maxConcurrentRooms: 10,
    roomCreationDelayMs: 3000,   // attente minimale entre deux créations
    roomCreationJitterMs: 2000,  // + aléatoire jusqu'à 2 s
  },
});

Mode impératif

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('Bonjour !');

await session.removeRoom(localId);
await session.destroy();   // termine toute la session (idempotent)

RoomConfig

ChampPar défautDescription
idIdentifiant unique (utilisé par le reconcile)
nameNom du salon
password''Mot de passe
maxPlayers6Joueurs
mode'b'Mode de jeu
rounds3Rounds
hiddenfalseLe masque de la liste publique
mapBlob LZ-String de la carte

Statut d'un salon dans le pool

StatutSignification
startingcreateRoom() ne s'est pas encore résolu
activeSalon créé et actif
dead-transientTombé ; sera recréé avec throttle
dead-terminalPerdu définitivement (ban, salon plein, tentatives épuisées)

Reconnexion automatique

BonkRoom se reconnecte tout seul après des pannes transitoires (socket coupé, serveur redémarré), avec un backoff exponentiel et du jitter :

ts
const room = await createRoom({
  auth,
  desiredState: { /* ... */ },
  reconnectPolicy: {
    maxAttempts: 10,       // par défaut
    initialDelayMs: 1000,  // par défaut : 1 s
    maxDelayMs: 30_000,    // par défaut : 30 s
    multiplier: 1.5,       // par défaut
    jitter: true,          // recommandé
  },
});
CauseTypeCe qui se passe
socket-disconnecttransitoireSe reconnecte avec backoff
status-bannedterminalPas de nouvelle tentative
status-room_fullterminal (seulement en tentant d'entrer)Pas de nouvelle tentative
max-retries-exceededterminalPas de nouvelle tentative

À la reconnexion, l'événement room-rebuilt apporte le nouveau lien du salon, et les réglages comme le verrouillage des équipes sont réappliqués.