Skip to content

Instantly share code, notes, and snippets.

@icecapp
Last active August 28, 2021 00:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save icecapp/40d4c3c6db2b42c0e6e5e6613deed614 to your computer and use it in GitHub Desktop.
Save icecapp/40d4c3c6db2b42c0e6e5e6613deed614 to your computer and use it in GitHub Desktop.
defmodule Chata.Serializer.Socket.JSON do
@behaviour Phoenix.Socket.Serializer
@max_integer_size :math.pow(2, 53)
defdelegate fastlane!(broadcast_struct), to: Phoenix.Socket.V2.JSONSerializer
defdelegate decode!(iodata, opts), to: Phoenix.Socket.V2.JSONSerializer
def encode!(term) do
term
|> encode_integers()
|> Phoenix.Socket.V2.JSONSerializer.encode!()
end
def encode_integers(value) when is_integer(value) and value >= @max_integer_size do
Integer.to_string(value)
end
def encode_integers(value) when is_list(value), do: Enum.map(value, &encode_integers/1)
def encode_integers(%struct_name{} = struct) do
case Module.split(struct_name) do
["Chata" | _] ->
map =
struct
|> Map.from_struct()
|> encode_integers()
struct(struct_name, map)
_ ->
struct
end
end
def encode_integers(value) when is_map(value) do
for {key, val} <- value, into: %{}, do: {key, encode_integers(val)}
end
def encode_integers(other), do: other
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment