defmodule Chaperon.Action.WebSocket.SendMessage do @moduledoc """ WebSocket action to send a message in a WebSocket-connected session. Includes an optional list of `options` to be sent along to `Socket.Web.send/3`. """ @type t :: %__MODULE__{} defstruct message: nil, type: :text, options: [] def encoded_message(%{message: [json: data]}), do: Poison.encode!(data) def encoded_message(%{message: msg}), do: msg def message_type(%{message: [json: _]}), do: :text def message_type(%{type: nil}), do: :text def message_type(%{type: type}), do: type end defimpl Chaperon.Actionable, for: Chaperon.Action.WebSocket.SendMessage do use Chaperon.Session.Logging alias Chaperon.Action.WebSocket import Chaperon.Action.WebSocket.SendMessage def run(action, session) do {socket, ws_url} = session |> WebSocket.for_action(action) session |> log_debug("WS_SEND #{ws_url} #{inspect(action.message)}") :ok = WebSocket.Client.send_frame( socket, {action |> message_type, action |> encoded_message} ) {:ok, session} end def abort(action, session) do {:ok, action, session} end end defimpl String.Chars, for: Chaperon.Action.WebSocket.SendMessage do def to_string(%{type: type, message: msg, options: options}), do: "WS-Send[#{inspect(type)} | #{inspect(msg)} | #{inspect(options)}]" end