forked from phoenixframework/phoenix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
websocket_client.exs
80 lines (68 loc) · 2.05 KB
/
websocket_client.exs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
defmodule Phoenix.Integration.WebsocketClient do
alias Poison, as: JSON
@doc """
Starts the WebSocket server for given ws URL. Received Socket.Message's
are forwarded to the sender pid
"""
def start_link(sender, url, headers \\ []) do
:crypto.start
:ssl.start
:websocket_client.start_link(String.to_char_list(url), __MODULE__, [sender],
extra_headers: headers)
end
def init([sender], _conn_state) do
{:ok, %{sender: sender, ref: 0}}
end
@doc """
Closes the socket
"""
def close(socket) do
send(socket, :close)
end
@doc """
Receives JSON encoded Socket.Message from remote WS endpoint and
forwards message to client sender process
"""
def websocket_handle({:text, msg}, _conn_state, state) do
send state.sender, Phoenix.Transports.WebSocketSerializer.decode!(msg, opcode: :text)
{:ok, state}
end
@doc """
Sends JSON encoded Socket.Message to remote WS endpoint
"""
def websocket_info({:send, msg}, _conn_state, state) do
msg = Map.put(msg, :ref, to_string(state.ref + 1))
{:reply, {:text, json!(msg)}, put_in(state, [:ref], state.ref + 1)}
end
def websocket_info(:close, _conn_state, _state) do
{:close, <<>>, "done"}
end
def websocket_terminate(_reason, _conn_state, _state) do
:ok
end
@doc """
Sends an event to the WebSocket server per the Message protocol
"""
def send_event(server_pid, topic, event, msg) do
send server_pid, {:send, %{topic: topic, event: event, payload: msg}}
end
@doc """
Sends a heartbeat event
"""
def send_heartbeat(server_pid) do
send_event(server_pid, "phoenix", "heartbeat", %{})
end
@doc """
Sends join event to the WebSocket server per the Message protocol
"""
def join(server_pid, topic, msg) do
send_event(server_pid, topic, "phx_join", msg)
end
@doc """
Sends leave event to the WebSocket server per the Message protocol
"""
def leave(server_pid, topic, msg) do
send_event(server_pid, topic, "phx_leave", msg)
end
defp json!(map), do: JSON.encode!(map)
end