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.
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.
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
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
| Feld | Standard | Beschreibung |
|---|---|---|
id | — | Eindeutiger Bezeichner (vom Reconcile verwendet) |
name | — | Raumname |
password | '' | Passwort |
maxPlayers | 6 | Spieler |
mode | 'b' | Spielmodus |
rounds | 3 | Runden |
hidden | false | Blendet ihn in der öffentlichen Liste aus |
map | — | LZ-String-Blob der Karte |
Status eines Raums im Pool
| Status | Bedeutung |
|---|---|
starting | createRoom() wurde noch nicht aufgelöst |
active | Raum erstellt und aktiv |
dead-transient | Ausgefallen; wird mit Throttle neu erstellt |
dead-terminal | Endgü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:
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
},
});| Ursache | Art | Was passiert |
|---|---|---|
socket-disconnect | vorübergehend | Verbindet sich mit Backoff neu |
status-banned | endgültig | Keine Wiederholung |
status-room_full | endgültig (nur beim Versuch beizutreten) | Keine Wiederholung |
max-retries-exceeded | endgültig | Keine Wiederholung |
Beim Reconnect liefert das Event room-rebuilt den neuen Raumlink, und Einstellungen wie die Team-Sperre werden erneut angewendet.