WebSocketClient.gd 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. extends Node
  2. class_name WebSocketClient
  3. @export var handshake_headers : PackedStringArray
  4. @export var supported_protocols : PackedStringArray
  5. @export var tls_trusted_certificate : X509Certificate
  6. @export var tls_verify := true
  7. var socket = WebSocketPeer.new()
  8. var last_state = WebSocketPeer.STATE_CLOSED
  9. signal connected_to_server()
  10. signal connection_closed()
  11. signal message_received(message: Variant)
  12. func connect_to_url(url) -> int:
  13. socket.supported_protocols = supported_protocols
  14. socket.handshake_headers = handshake_headers
  15. var err = socket.connect_to_url(url, tls_verify, tls_trusted_certificate)
  16. if err != OK:
  17. return err
  18. last_state = socket.get_ready_state()
  19. return OK
  20. func send(message) -> int:
  21. if typeof(message) == TYPE_STRING:
  22. return socket.send_text(message)
  23. return socket.send(var_to_bytes(message))
  24. func get_message() -> Variant:
  25. if socket.get_available_packet_count() < 1:
  26. return null
  27. var pkt = socket.get_packet()
  28. if socket.was_string_packet():
  29. return pkt.get_string_from_utf8()
  30. return bytes_to_var(pkt)
  31. func close(code := 1000, reason := "") -> void:
  32. socket.close(code, reason)
  33. last_state = socket.get_ready_state()
  34. func clear() -> void:
  35. socket = WebSocketPeer.new()
  36. last_state = socket.get_ready_state()
  37. func get_socket() -> WebSocketPeer:
  38. return socket
  39. func poll() -> void:
  40. if socket.get_ready_state() != socket.STATE_CLOSED:
  41. socket.poll()
  42. var state = socket.get_ready_state()
  43. if last_state != state:
  44. last_state = state
  45. if state == socket.STATE_OPEN:
  46. connected_to_server.emit()
  47. elif state == socket.STATE_CLOSED:
  48. connection_closed.emit()
  49. while socket.get_ready_state() == socket.STATE_OPEN and socket.get_available_packet_count():
  50. message_received.emit(get_message())
  51. func _process(delta):
  52. poll()