WavedashDocs

Multiplayer networking

Connect players directly with peer-to-peer WebRTC networking

When players join a lobby, the SDK automatically establishes WebRTC connections between all members, sets up reliable and unreliable data channels, and handles NAT traversal with TURN servers.

Sending messages

Broadcast to all peers

func broadcast_to_all(data: PackedByteArray, reliable: bool = true):
    WavedashSDK.send_p2p_message("", data, 0, reliable)

Send to a specific peer

func send_to_peer(user_id: String, data: PackedByteArray):
    WavedashSDK.send_p2p_message(user_id, data, 0, true)

Parameters

ParameterTypeRequiredDescription
userIdstringFor unicastTarget peer's user ID (omit or undefined to broadcast)
channelnumberYesChannel number (0-7)
payloadUint8ArrayYesBinary data to send
reliablebooleanNoUse reliable channel (default: true)
payloadSizenumberNoBytes to send from payload (default: payload.length)

Receiving messages

func _process(_delta):
    var messages = WavedashSDK.drain_p2p_channel(0)
    for msg in messages:
        var from_user = msg["identity"]
        var payload: PackedByteArray = msg["payload"]

Channels

The SDK supports up to 8 channels (0-7):

ChannelSuggested use
0Game state updates
1Player input
2Chat messages
3Voice data
4-7Custom use

Reliable vs unreliable

TypeDescriptionBest for
ReliableGuaranteed delivery, orderedImportant state, chat, game events
UnreliableBest-effort, fasterPosition updates, input, frequent data
WavedashSDK.send_p2p_message("", data, 0, true)   # reliable
WavedashSDK.send_p2p_message("", data, 1, false)  # unreliable

Connection state

func _ready():
    WavedashSDK.p2p_connection_established.connect(_on_p2p_connected)
    WavedashSDK.p2p_connection_failed.connect(_on_p2p_failed)
    WavedashSDK.p2p_peer_disconnected.connect(_on_p2p_disconnected)

Events

EventDescription
P2P_CONNECTION_ESTABLISHEDPeer connected
P2P_CONNECTION_FAILEDConnection failed
P2P_PEER_DISCONNECTEDPeer disconnected

Advanced: batch reading

For game engines, drainP2PChannelToBuffer reads all queued messages into a tightly packed binary buffer:

const packed = WavedashJS.drainP2PChannelToBuffer(0);
const view = new DataView(packed.buffer);
let offset = 0;
while (offset < packed.byteLength) {
  const size = view.getUint32(offset, true);
  offset += 4;
  const message = packed.subarray(offset, offset + size);
  offset += size;
}

TURN credentials are managed automatically. No configuration required.