62 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
# Pleroma: A lightweight social networking server
 | 
						|
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
 | 
						|
# SPDX-License-Identifier: AGPL-3.0-only
 | 
						|
 | 
						|
defmodule Pleroma.Integration.WebsocketClient do
 | 
						|
  # https://github.com/phoenixframework/phoenix/blob/master/test/support/websocket_client.exs
 | 
						|
 | 
						|
  @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_charlist(url),
 | 
						|
      __MODULE__,
 | 
						|
      [sender],
 | 
						|
      extra_headers: headers
 | 
						|
    )
 | 
						|
  end
 | 
						|
 | 
						|
  @doc """
 | 
						|
  Closes the socket
 | 
						|
  """
 | 
						|
  def close(socket) do
 | 
						|
    send(socket, :close)
 | 
						|
  end
 | 
						|
 | 
						|
  @doc """
 | 
						|
  Sends a low-level text message to the client.
 | 
						|
  """
 | 
						|
  def send_text(server_pid, msg) do
 | 
						|
    send(server_pid, {:text, msg})
 | 
						|
  end
 | 
						|
 | 
						|
  @doc false
 | 
						|
  def init([sender], _conn_state) do
 | 
						|
    {:ok, %{sender: sender}}
 | 
						|
  end
 | 
						|
 | 
						|
  @doc false
 | 
						|
  def websocket_handle(frame, _conn_state, state) do
 | 
						|
    send(state.sender, frame)
 | 
						|
    {:ok, state}
 | 
						|
  end
 | 
						|
 | 
						|
  @doc false
 | 
						|
  def websocket_info({:text, msg}, _conn_state, state) do
 | 
						|
    {:reply, {:text, msg}, state}
 | 
						|
  end
 | 
						|
 | 
						|
  def websocket_info(:close, _conn_state, _state) do
 | 
						|
    {:close, <<>>, "done"}
 | 
						|
  end
 | 
						|
 | 
						|
  @doc false
 | 
						|
  def websocket_terminate(_reason, _conn_state, _state) do
 | 
						|
    :ok
 | 
						|
  end
 | 
						|
end
 |