Using Godot 4.2 and C#, I’ve encountered 2 questions when working with websocket peers. This stems from how I used to implment websockets in other engines/ frameworks. I am using the websocket peer for the server side, so clients from javascript connect via websocket, set the auth header and then connect via a TPC server, after the TCP connection is established I create the WebsocketPeer out of it.
-
Can you get some kind of unique id from the websocket peer, some identifier that’s unique to the connection?
-
How can you get the headers from the websocket peer (during handshake?), the handshake_headers are empty, and they seem to be only used for when you set the headers, not when you receive the headers
Relevant code
public partial class WebSocketServer : Node
{
private TcpServer tcpServer;
private List<WebSocketPeer> clients;
private GameManager gameManager;
private const int Port = 9080;
public override void _Ready()
{
tcpServer = new TcpServer();
clients = new List<WebSocketPeer>();
gameManager = GetNode<GameManager>("/root/GameManager");
StartServer();
}
private void StartServer()
{
Error result = tcpServer.Listen(Port);
if (result == Error.Ok)
{
GD.Print("Server is listening on port " + Port);
SetProcess(true);
}
else
{
GD.PrintErr("Failed to start server: " + result);
}
}
public override void _Process(double delta)
{
if (tcpServer.IsConnectionAvailable())
{
var peer = tcpServer.TakeConnection();
var webSocketPeer = new WebSocketPeer();
Error handshakeResult = webSocketPeer.AcceptStream(peer);
if (handshakeResult == Error.Ok)
{
Connect(webSocketPeer);
}
else
{
GD.PrintErr("Failed to establish WebSocket connection: " + handshakeResult);
}
}
private void Connect(WebSocketPeer client)
{
// TODO: jwt auth
GD.Print("Headers", client.HandshakeHeaders);
var id = client.GetSomeUniqueId(); //TODO;
clients.Add(client);
var id = gameManager.AddPlayer()
GD.Print("Client connected");
}