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
| Parameter | Type | Required | Description |
|---|---|---|---|
userId | string | For unicast | Target peer's user ID (omit or undefined to broadcast) |
channel | number | Yes | Channel number (0-7) |
payload | Uint8Array | Yes | Binary data to send |
reliable | boolean | No | Use reliable channel (default: true) |
payloadSize | number | No | Bytes 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):
| Channel | Suggested use |
|---|---|
| 0 | Game state updates |
| 1 | Player input |
| 2 | Chat messages |
| 3 | Voice data |
| 4-7 | Custom use |
Reliable vs unreliable
| Type | Description | Best for |
|---|---|---|
| Reliable | Guaranteed delivery, ordered | Important state, chat, game events |
| Unreliable | Best-effort, faster | Position 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
| Event | Description |
|---|---|
P2P_CONNECTION_ESTABLISHED | Peer connected |
P2P_CONNECTION_FAILED | Connection failed |
P2P_PEER_DISCONNECTED | Peer 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.