Packages
event_bus
1.4.2
1.7.0
1.6.2
1.6.1
1.6.0
retired
1.5.2
retired
1.5.1
retired
1.5.0
retired
1.4.4
retired
1.4.3
retired
1.4.2
retired
1.4.1
retired
1.4.0
retired
1.3.8
retired
1.3.7
retired
1.3.6
retired
1.3.5
retired
1.3.4
retired
1.3.3
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.0
retired
1.1.3
retired
1.1.2
retired
1.1.1
retired
1.1.0
retired
1.0.0
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta1
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.1
retired
0.6.0
retired
0.5.0
retired
0.4.1
retired
0.4.0
retired
0.3.1
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Traceable, extendable and minimalist event bus implementation for Elixir with built-in event store and event watcher based on ETS
Retired package: Deprecated - Please prefer always latest minor
Current section
Files
Jump to
Current section
Files
lib/event_bus/utils/base62.ex
defmodule EventBus.Util.Base62 do
@moduledoc false
@mapping '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
@doc """
Generates partially sequential, base62 unique identifier
"""
@spec unique_id() :: String.t()
def unique_id do
now() <> node_id() <> random(4, 14_776_336)
end
@doc """
Converts given integer to base62
"""
@spec encode(integer()) :: String.t()
def encode(num) when num < 62 do
<< Enum.at(@mapping, num) >>
end
def encode(num) do
encode(div(num, 62)) <> encode(rem(num, 62))
end
# Generates random base62 string with crypto:strong_rand_bytes
defp random(size, max) do
size
|> :crypto.strong_rand_bytes()
|> :crypto.bytes_to_integer()
|> rem(max)
|> encode()
|> String.pad_leading(size, "0")
end
# Current time (microsecond) encoded in base62
defp now do
encode(System.os_time(:microsecond))
end
# Assigns a random node_id on first call
defp node_id do
case Application.get_env(:event_bus, :node_id) do
nil -> save_node_id(random(3, 238_328))
nid -> nid
end
end
defp save_node_id(node_id) do
Application.put_env(:event_bus, :node_id, node_id, persistent: true)
node_id
end
end