ws_webrtc_client.gd 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. extends Node
  2. export var autojoin = true
  3. export var lobby = "" # Will create a new lobby if empty.
  4. var client: WebSocketClient = WebSocketClient.new()
  5. var code = 1000
  6. var reason = "Unknown"
  7. signal lobby_joined(lobby)
  8. signal connected(id)
  9. signal disconnected()
  10. signal peer_connected(id)
  11. signal peer_disconnected(id)
  12. signal offer_received(id, offer)
  13. signal answer_received(id, answer)
  14. signal candidate_received(id, mid, index, sdp)
  15. signal lobby_sealed()
  16. func _init():
  17. client.connect("data_received", self, "_parse_msg")
  18. client.connect("connection_established", self, "_connected")
  19. client.connect("connection_closed", self, "_closed")
  20. client.connect("connection_error", self, "_closed")
  21. client.connect("server_close_request", self, "_close_request")
  22. func connect_to_url(url):
  23. close()
  24. code = 1000
  25. reason = "Unknown"
  26. client.connect_to_url(url)
  27. func close():
  28. client.disconnect_from_host()
  29. func _closed(was_clean = false):
  30. emit_signal("disconnected")
  31. func _close_request(code, reason):
  32. self.code = code
  33. self.reason = reason
  34. func _connected(protocol = ""):
  35. #client.get_peer(1).set_write_mode(WebSocketPeer.WRITE_MODE_TEXT)
  36. if autojoin:
  37. join_lobby(lobby)
  38. func _parse_msg():
  39. #var pkt_str: String = client.get_peer(1).get_packet().get_string_from_utf8()
  40. var data=client.get_peer(1).get_packet().get_string_from_utf8()
  41. var msg = parse_json(data)
  42. print("new message: ", data)
  43. #var req: PoolStringArray = pkt_str.split("\n", true, 1)
  44. #if req.size() != 2: # Invalid request size
  45. # return
  46. #var type: String = req[0]
  47. #if type.length() < 3: # Invalid type size
  48. # return
  49. var type = msg["mtype"]
  50. if type == "J":
  51. emit_signal("lobby_joined", msg["payload"])
  52. return
  53. elif type == "S":
  54. emit_signal("lobby_sealed")
  55. return
  56. if type == "I":
  57. emit_signal("connected", msg["id"])
  58. elif type == "N":
  59. # Client connected
  60. emit_signal("peer_connected", msg["payload"])
  61. elif type == "D":
  62. # Client connected
  63. emit_signal("peer_disconnected", msg["id"])
  64. elif type == "O":
  65. # Offer received
  66. emit_signal("offer_received", msg["id"], msg["payload"])
  67. elif type == "A":
  68. # Answer received
  69. emit_signal("answer_received", msg["id"], msg["payload"])
  70. elif type == "C":
  71. # Candidate received
  72. var canddata = msg["payload"]
  73. print("incoming candidate: ", canddata)
  74. emit_signal("candidate_received", msg["id"], canddata["mid"], canddata["index"], canddata["sdp"])
  75. func join_lobby(lobby):
  76. #return client.get_peer(1).put_packet(("J: %s\n" % lobby).to_utf8())
  77. _send_msg("J", "", lobby)
  78. func seal_lobby():
  79. #return client.get_peer(1).put_packet("S: \n".to_utf8())
  80. return _send_msg("S", "", "")
  81. func send_candidate(id, mid, index, sdp) -> int:
  82. var data = {"mid": mid, "index": index, "sdp": sdp}
  83. print("sending candidate: ", id, data)
  84. return _send_msg("C", id, data)
  85. func send_offer(id, offer) -> int:
  86. print("sending offer: ", id, offer)
  87. return _send_msg("O", id, offer)
  88. func send_answer(id, answer) -> int:
  89. return _send_msg("A", id, answer)
  90. func _send_msg(type, id, data) -> int:
  91. #return client.get_peer(1).put_packet(("%s: %d\n%s" % [type, id, data]).to_utf8())
  92. var msg
  93. if id:
  94. msg = {"id": id, "mtype": type, "payload": data}
  95. else:
  96. msg = {"mtype": type, "payload": data}
  97. return client.get_peer(1).put_packet(to_json(msg).to_utf8())
  98. func _process(delta):
  99. var status: int = client.get_connection_status()
  100. if status == WebSocketClient.CONNECTION_CONNECTING or status == WebSocketClient.CONNECTION_CONNECTED:
  101. client.poll()