I want to create a websocket client
Hello,
How to connect to web sockets using gen_tcp socket.
url is something like ws:\localhost\socket. I want to send graphql query to it.
To test out its functioning. But during connection I am not able to give path.
Can you show the code you are trying? Have you tried one of the websocket client libraries?
Yes, I have tried, websockex, mint_web_socket, etc, . The long polling in elixir is disabled, so I get error closed long polling is disabled. , When trying to establish comms and send a message. If you have any code snippet pls share.
defmodule WSClient do
@moduledoc """
Websocket client /socket Subscription
Mint.WebSocket Procesless client
"""
def create_websocket(host, port, path) do
{:ok, conn} = Mint.HTTP.connect(:http, "#{host}", port)
{:ok, conn, ref} = Mint.WebSocket.upgrade(:ws, conn, path, [Mint.WebSocket.PerMessageDeflate])
http_reply_message =
receive(do: (message -> message))
|> IO.inspect(label: "3")
{:ok, conn, [{:status, ^ref, status}, {:headers, ^ref, resp_headers}, {:done, ^ref}]} =
Mint.WebSocket.stream(conn, http_reply_message)
# |> IO.inspect(label: "4")
{:ok, conn, websocket} = Mint.WebSocket.new(conn, ref, status, resp_headers)
# |> IO.inspect(label: "5")
{conn, websocket, ref}
end
def send_message(message, conn, websocket, ref) do
{:ok, websocket, data} = Mint.WebSocket.encode(websocket, {:text, message})
{:ok, conn} = Mint.WebSocket.stream_request_body(conn, ref, data)
server_message = receive(do: (message -> message))
parse(server_message, conn, websocket, ref)
|> IO.inspect(label: "server_message")
server_message = receive(do: (message -> message))
msg =
parse(server_message, conn, websocket, ref)
|> IO.inspect(label: "server_message")
{conn, websocket, msg, ref}
end
def parse(server_message, conn, websocket, ref) do
{:ok, _conn, [{:data, ^ref, data}]} = Mint.WebSocket.stream(conn, server_message)
# |> IO.inspect(label: "data")
{:ok, _websocket, recv_msg} =
Mint.WebSocket.decode(websocket, data)
|> IO.inspect(label: "decoded_msg")
recv_msg
end
def close_websocket(conn, websocket, ref) do
{:ok, websocket, data} = Mint.WebSocket.encode(websocket, :close)
# |> IO.inspect(label: "6")
{:ok, conn} = Mint.WebSocket.stream_request_body(conn, ref, data)
# |> IO.inspect(label: "7")
close_response = receive(do: (message -> message))
# |> IO.inspect(label: "8")
{:ok, conn, [{:data, ^ref, data}]} = Mint.WebSocket.stream(conn, close_response)
# |> IO.inspect(label: "9")
{:ok, _websocket, [{:close, 1_000, ""}]} = Mint.WebSocket.decode(websocket, data)
# |> IO.inspect(label: "10")
Mint.HTTP.close(conn)
# |> IO.inspect(label: "11")
end
end