Current section

Files

Jump to
phoenix_gen_socket_client lib gen_socket_client serializer.ex
Raw

lib/gen_socket_client/serializer.ex

defmodule Phoenix.Channels.GenSocketClient.Serializer do
@moduledoc """
Describes the serializer interface used in `Phoenix.Channels.GenSocketClient` to encode/decode messages.
"""
alias Phoenix.Channels.GenSocketClient
@doc "Invoked to decode the raw message."
@callback decode_message(GenSocketClient.encoded_message) :: GenSocketClient.message
@doc "Invoked to encode a socket message."
@callback encode_message(GenSocketClient.message) :: Phoenix.Channels.GenSocketClient.Transport.frame
end
defmodule Phoenix.Channels.GenSocketClient.Serializer.Json do
@moduledoc "Json serializer for the socket client."
@behaviour Phoenix.Channels.GenSocketClient.Serializer
# -------------------------------------------------------------------
# Phoenix.Channels.GenSocketClient.Serializer callbacks
# -------------------------------------------------------------------
@doc false
def decode_message(encoded_message) do
%{"topic" => topic, "event" => event, "payload" => payload, "ref" => ref} =
Poison.decode!(encoded_message)
%{topic: topic, event: event, payload: payload, ref: ref}
end
@doc false
def encode_message(message) do
{:binary, Poison.encode!(message)}
end
end
defmodule Phoenix.Channels.GenSocketClient.Serializer.GzipJson do
@moduledoc "Gzip+Json serializer for the socket client."
@behaviour Phoenix.Channels.GenSocketClient.Serializer
# -------------------------------------------------------------------
# Phoenix.Channels.GenSocketClient.Serializer callbacks
# -------------------------------------------------------------------
@doc false
def decode_message(encoded_message) do
%{"topic" => topic, "event" => event, "payload" => payload, "ref" => ref} =
encoded_message
|> :zlib.gunzip()
|> Poison.decode!()
%{topic: topic, event: event, payload: payload, ref: ref}
end
@doc false
def encode_message(message) do
{:binary, message |> Poison.encode_to_iodata!() |> :zlib.gzip}
end
end