extends Node var socket_client: WebSocketClient = null var socket: WebSocketPeer = null var state: int = 0 # -1 = CONNECTION_FAILED, 0 = CONNECTION_DISCONNECTED, 1 = CONNECTION_CONNECTING, 2 = CONNECTION_CONNECTED, 3 = CONNECTION_DISCONNECTING var message_queue : Array = [] # messages to be sent upon connection func _ready(): socket_client = WebSocketClient.new() socket_client.connect("connection_established", self, "on_connection_success") socket_client.connect("connection_closed", self, "on_connection_close_success") socket_client.connect("connection_error", self, "on_connection_error") #socket_client.connect("data_received", self, "receive") func sock_connect_to_url(url): print("Connecting to %s..." % url) message_queue.clear() var error = socket_client.connect_to_url(url) if error != OK: return error state = 1 # CONNECTING return OK func sock_close(code = 1000, reason = ""): print("Closing websocket...") socket_client.disconnect_from_host(code, reason) state = 3 # DISCONNECTING func on_connection_success(protocol): print("WebSocket connection success with protocol %s." % protocol) socket = socket_client.get_peer(1) socket.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) # defaults to text mode state = 2 # CONNECTED while len(message_queue) > 0: var msg = message_queue.pop_at(0) send(msg) func on_connection_close_success(clean): socket = null if clean: state = 0 # DISCONNECTED print("WebSocket closed successfully.") else: state = -1 # DISCONNECT DIRTY print("WebSocket closed unsuccessfully!") func on_connection_error(): # connection failed print("WebSocket connection failed!") socket = null state = -1 # DISCONNECT DIRTY func send(message, as_bytes=false) -> int: if state != 2: message_queue.push_back(message) return -1 return socket.put_packet(message) func send_json(message) -> int: print("sending") if state != 2: print("adding to queue") message_queue.push_back(JSON.print(message).to_utf8()) return -1 var message_json = JSON.print(message).to_utf8() return socket.put_packet(message_json) func receive(string_to_json=false): if state != 2: return null if socket.get_available_packet_count() < 1: return null var packet : PoolByteArray = socket.get_packet() if socket.was_string_packet(): var message = packet.get_string_from_utf8() if string_to_json: var json = JSON.parse(message) if json.error: return null message = json.result return message return bytes2var(packet) func _process(_delta): socket_client.poll()