Created
January 1, 2026 21:20
-
-
Save non-reai/6cea22745e46c52118f7044c2c799147 to your computer and use it in GitHub Desktop.
Peerjs Signalling for WebRTC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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