Current section
Files
Jump to
Current section
Files
lib/grpc/transport/utils.ex
defmodule GRPC.Transport.Utils do
@moduledoc false
# unit: ns
@ns_ceiling 1000
@us_ceiling 1000_000
# @ms_ceiling @us_ceiling * 1000
# unit: ms
@ms_ceiling 1000
@second_ceiling @ms_ceiling * 60
@minute_ceiling @second_ceiling * 60
@doc """
Encode timeout(nanoseconds) by gRPC protocol
"""
def encode_ns(timeout) when timeout <= 0, do: "0u"
def encode_ns(timeout) when is_integer(timeout) and timeout < @ns_ceiling do
to_string(timeout) <> "n"
end
def encode_ns(timeout) when timeout < @us_ceiling do
to_string(div(timeout, 1000)) <> "u"
end
@doc """
Encode timeout(milliseconds) by gRPC protocol
"""
def encode_timeout(timeout) when timeout <= 0, do: "0u"
def encode_timeout(timeout) when is_integer(timeout) and timeout < @ms_ceiling do
to_string(timeout) <> "m"
end
def encode_timeout(timeout) when timeout < @second_ceiling do
to_string(div(timeout, 1000)) <> "S"
end
def encode_timeout(timeout) when timeout < @minute_ceiling do
to_string(div(timeout, 1000 * 60)) <> "M"
end
def encode_timeout(timeout) do
to_string(div(timeout, 1000 * 3600)) <> "H"
end
@spec decode_timeout(String.t()) :: non_neg_integer()
def decode_timeout(timeout) do
{timeout, unit} = String.split_at(timeout, -1)
decode_timeout(unit, String.to_integer(timeout))
end
defp decode_timeout("n", timeout) do
div(timeout, 1000_000)
end
defp decode_timeout("u", timeout) do
div(timeout, 1000)
end
defp decode_timeout("m", timeout) do
timeout
end
defp decode_timeout("S", timeout) do
timeout * 1000
end
defp decode_timeout("M", timeout) do
timeout * 60_000
end
defp decode_timeout("H", timeout) do
timeout * 3_600_000
end
end