Library

State and events

room.state and every typed event of BonkRoom.

BonkRoom extends EventEmitter3 with the BonkRoomEvents event map. Every event is typed: TypeScript warns you if you get the name or the argument type wrong.

Current state: room.state

ts
const state = room.state;
state.myId;         // numeric ID of the bot (null before joining)
state.hostId;       // current host ID
state.players;      // Map<id, PlayerData>
state.inGame;       // true during a match
state.teamsLocked;  // true if teams are locked

PlayerData

FieldDescription
idNumeric ID in the room
peerIDWebRTC connection ID (useful to map input frames)
userName, guest, levelPlayer identity
team0 spec · 1 ffa · 2 red · 3 blue · 4 green · 5 yellow
ready, tabbedMarked as ready / tab in the background
ping, xp, balanceLatency, estimated XP and match balance

How to listen

ts
room.on('player-join', (p) => console.log(p.userName, p.id, p.level));

room.on('chat-message', (p) => {
  const nome = room.state.players.get(p.id)?.userName;
  console.log(`[${nome}]: ${p.message}`);
});

room.on('room-dead', (reason) => {
  // reason.kind: 'socket-disconnect' | 'status-banned' | 'status-room_full' | 'max-retries-exceeded'
});

room.on('room-rebuilt', (link) => console.log('new URL:', link));

Event table

EventPayloadWhen
room-createdRoomCreatedPacketThe bot created the room
room-joinRoomJoinPacketThe bot joined a room
player-joinPlayerJoinPacketA player joined
player-leavePlayerLeavePacketA player left
host-leaveHostLeavePacketThe host left (newHostId = -1: room closed)
team-changeTeamChangePacketA player changed team
ready-changeReadyChangePacketMarked/unmarked ready
tabbedTabbedPacketSwitched away from / back to the tab
username-changeUsernameChangePacketChanged name
player-pingsPlayerPingsPacketPing of every player
game-startGameStartPacketMatch started
game-endGameEndPacketMatch ended
all-ready-resetAllReadyResetPacketEveryone's "ready" was reset
chat-messageChatMessagePacketChat message
player-kickPlayerKickPacketA player was kicked
countdown / abort-countdownCountdownPacket / AbortCountdownPacketCountdown
teamlock-toggleTeamlockTogglePacketTeams locked/unlocked
gamemode-changeGamemodeChangePacketGame mode changed
change-roundsChangeRoundsPacketRounds changed
map-switchMapSwitchPacketMap changed
balance-setBalanceSetPacketA player's balance changed
player-level-upPlayerLevelUpPacketA player leveled up
room-name-update / room-password-updatepacketsRoom name/password changed
status-messageStatusMessagePacketServer notice (errors, rate limits)
share-linkShareLinkPacketRoom link available
room-deadRoomDeadReasonThe room went down (with retry or terminal)
room-rebuiltstringThe room was recreated (new link)
raw-packetIncomingPacket | UnknownPacketEvery raw packet, including unmapped ones

Events added by anti-AFK

EventPayloadWhen
peer-input{ playerId, peerID, data }Input frame received over WebRTC from a player
player-afkplayerIdThe player stayed idle (no input and no chat) for the time limit
player-backplayerIdAn AFK player moved or chatted again

See Anti-AFK.