Bibliothek

24/7-Sitzungen und Reconnect

BonkSession hält Räume mit einem einzigen Konto am Leben und erstellt abgestürzte neu.

Um einen oder mehrere Räume unbeaufsichtigt zu betreiben, nutze BonkSession. Sie teilt die Authentifizierung (ein einziger Login-Aufruf), wendet einen Throttle zwischen Erstellungen an und erstellt abgestürzte Räume neu.

ts
import { BonkSession } from 'bonktools';

const session = new BonkSession({
  auth: { type: 'registered', username: '...', password: '...' },
  throttle: {
    capacity: 3,        // maximale Erstellungen im Schub
    refillPerSec: 0.5,  // 1 Platz wird alle 2 s nachgefüllt
  },
});

await session.getToken();  // authentifiziert einmal; das Token wird wiederverwendet

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

session.on('room-dead-terminal', ({ localId, reason }) => {
  console.error('Raum endgültig verloren:', localId, reason);
});

Deklarativer Modus: startFromConfig()

Erstellt alle Räume einer Liste, mit einem Abstand (und etwas Zufall) zwischen den Erstellungen. Die Konfigurationen werden im 60-s-Reconcile registriert, einem Sicherheitsnetz, das Räume neu erstellt, die unbemerkt ausgefallen sind.

ts
await session.startFromConfig({
  rooms: [
    { id: 'sala-1', name: 'Raum Eins',   maxPlayers: 6, mode: 'b',  rounds: 3 },
    { id: 'sala-2', name: 'Raum Zwei', maxPlayers: 8, mode: 'ar', rounds: 5 },
  ],
  throttle: {
    maxConcurrentRooms: 10,
    roomCreationDelayMs: 3000,   // Mindestwartezeit zwischen Erstellungen
    roomCreationJitterMs: 2000,  // + zufällig bis zu 2 s
  },
});

Imperativer Modus

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

await session.removeRoom(localId);
await session.destroy();   // beendet die gesamte Sitzung (idempotent)

RoomConfig

FeldStandardBeschreibung
idEindeutiger Bezeichner (vom Reconcile verwendet)
nameRaumname
password''Passwort
maxPlayers6Spieler
mode'b'Spielmodus
rounds3Runden
hiddenfalseBlendet ihn in der öffentlichen Liste aus
mapLZ-String-Blob der Karte

Status eines Raums im Pool

StatusBedeutung
startingcreateRoom() wurde noch nicht aufgelöst
activeRaum erstellt und aktiv
dead-transientAusgefallen; wird mit Throttle neu erstellt
dead-terminalEndgültig verloren (Bann, voller Raum, Wiederholungen erschöpft)

Automatischer Reconnect

BonkRoom verbindet sich nach vorübergehenden Ausfällen (Socket getrennt, Server neu gestartet) selbst wieder, mit exponentiellem Backoff und Jitter:

ts
const room = await createRoom({
  auth,
  desiredState: { /* ... */ },
  reconnectPolicy: {
    maxAttempts: 10,       // Standard
    initialDelayMs: 1000,  // Standard: 1 s
    maxDelayMs: 30_000,    // Standard: 30 s
    multiplier: 1.5,       // Standard
    jitter: true,          // empfohlen
  },
});
UrsacheArtWas passiert
socket-disconnectvorübergehendVerbindet sich mit Backoff neu
status-bannedendgültigKeine Wiederholung
status-room_fullendgültig (nur beim Versuch beizutreten)Keine Wiederholung
max-retries-exceededendgültigKeine Wiederholung

Beim Reconnect liefert das Event room-rebuilt den neuen Raumlink, und Einstellungen wie die Team-Sperre werden erneut angewendet.