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.
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.
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
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
| Champ | Par défaut | Description |
|---|---|---|
id | — | Identifiant unique (utilisé par le reconcile) |
name | — | Nom du salon |
password | '' | Mot de passe |
maxPlayers | 6 | Joueurs |
mode | 'b' | Mode de jeu |
rounds | 3 | Rounds |
hidden | false | Le masque de la liste publique |
map | — | Blob LZ-String de la carte |
Statut d'un salon dans le pool
| Statut | Signification |
|---|---|
starting | createRoom() ne s'est pas encore résolu |
active | Salon créé et actif |
dead-transient | Tombé ; sera recréé avec throttle |
dead-terminal | Perdu 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 :
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é
},
});| Cause | Type | Ce qui se passe |
|---|---|---|
socket-disconnect | transitoire | Se reconnecte avec backoff |
status-banned | terminal | Pas de nouvelle tentative |
status-room_full | terminal (seulement en tentant d'entrer) | Pas de nouvelle tentative |
max-retries-exceeded | terminal | Pas 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.