Skip to content

Instantly share code, notes, and snippets.

@non-reai
Created January 1, 2026 21:20
Show Gist options
  • Select an option

  • Save non-reai/6cea22745e46c52118f7044c2c799147 to your computer and use it in GitHub Desktop.

Select an option

Save non-reai/6cea22745e46c52118f7044c2c799147 to your computer and use it in GitHub Desktop.
Peerjs Signalling for WebRTC
extends Node
class_name Peerjs
const TOKEN := "thisismytokenidrkwhatthisdoes" # Yeah no idea what this does
const BASE_URL := "wss://0.peerjs.com/peerjs?key=peerjs&id={0}&token={1}" # Formattable Base String
const HEARTBEAT_INTERVAL := 5 # Heartbeat every 5 seconds
signal offer_received(remote_peer_id: String, sdp: String)
signal answer_received(remote_peer_id: String, sdp: String)
signal candidate_received(remove_peer_id: String, media: String, index: int, name: String)
# Signalling
var socket : WebSocketPeer = WebSocketPeer.new()
var signalling_id : String = generate_random_string(30)
func _init():
print(signalling_id)
pass
func get_signalling_url():
return BASE_URL.format([signalling_id, TOKEN])
func connect_to_signalling_server():
var signalling_url = get_signalling_url()
socket.connect_to_url(signalling_url)
var time_since_last_heartbeat : float = 0
func poll(dt):
socket.poll() # Update socket to current state
# Heartbeat if needed
time_since_last_heartbeat += dt
if time_since_last_heartbeat > HEARTBEAT_INTERVAL:
time_since_last_heartbeat = 0
print("Heartbeat")
heartbeat()
while socket.get_available_packet_count() > 0:
# get & process packets!
var packet : String = socket.get_packet().get_string_from_utf8()
var parsed_packet = JSON.parse_string(packet)
print(parsed_packet)
match parsed_packet.type:
"OFFER":
var sdp = parsed_packet.payload.sdp.sdp
emit_signal("offer_received", parsed_packet.src, sdp)
"ANSWER":
var sdp = parsed_packet.payload.sdp.sdp
emit_signal("answer_received", parsed_packet.dst, sdp)
"CANDIDATE":
var payload = parsed_packet.payload
var candidate = payload.candiate
var media = candidate.candidate
var index = candidate.sdpMLineIndex
var _name = candidate.sdpMid
emit_signal("candidate_received", parsed_packet.dst, media, index, _name)
func heartbeat():
# Check if socket exists and is ready
if not socket:
pass
if socket.get_ready_state() == WebSocketPeer.STATE_OPEN:
pass
socket.send_text(JSON.stringify({
"type": "HEARTBEAT"
}))
static func generate_random_string(length: int) -> String:
const CHARS := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var rng := RandomNumberGenerator.new()
rng.randomize()
var result := ""
for i in range(length):
var random_index = rng.randi_range(0, CHARS.length() - 1)
result += CHARS[random_index]
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment