Packages
ex_esdb
0.0.8-alpha
0.11.0
0.10.0
0.9.0
0.8.0
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14-alpha
0.0.13-alpha
0.0.12-alpha
0.0.11-alpha
0.0.10-alpha
0.0.9-alpha
0.0.8-alpha
0.0.6-alpha
0.0.5-alpha
0.0.4-alpha
0.0.3-alpha
0.0.2-alfa
0.0.1-alfa
ExESDB is a reincarnation of rabbitmq/khepri, specialized for use as a BEAM-native event store.
Current section
Files
Jump to
Current section
Files
lib/repl/generator.ex
defmodule ExESDB.Repl.EventGenerator do
@moduledoc false
require UUIDv7
require UUID
@initialized_v1 "initialized:v1"
@temperature_measured_v1 "temperature_measured:v1"
@humidity_measured_v1 "humidity_measured:v1"
@light_measured_v1 "light_measured:v1"
@fan_activated_v1 "fan_activated:v1"
@fan_deactivated_v1 "fan_deactivated:v1"
@light_activated_v1 "light_activated:v1"
@light_deactivated_v1 "light_deactivated:v1"
@heater_activated_v1 "heater_activated:v1"
@heater_deactivated_v1 "heater_deactivated:v1"
@sprinkler_activated_v1 "sprinkler_activated:v1"
@sprinkler_deactivated_v1 "sprinkler_deactivated:v1"
@desired_temperature_set_v1 "desired_temperature_set:v1"
@desired_humidity_set_v1 "desired_humidity_set:v1"
@desired_light_set_v1 "desired_light_set:v1"
@event_types [
@initialized_v1,
@temperature_measured_v1,
@humidity_measured_v1,
@light_measured_v1,
@desired_temperature_set_v1,
@desired_humidity_set_v1,
@desired_light_set_v1,
@light_activated_v1,
@light_deactivated_v1,
@fan_activated_v1,
@fan_deactivated_v1,
@heater_activated_v1,
@heater_deactivated_v1,
@sprinkler_activated_v1,
@sprinkler_deactivated_v1,
]
@operators [
"John",
"Paul",
"George",
"Ringo",
]
# Example content type values
@content_types [1, 2, 3]
defp random_operator, do: Enum.random(@operators)
defp random_temperature, do: 5 + :rand.uniform(30)
defp random_humidity, do: :rand.uniform(100)
defp random_light, do: :rand.uniform(100)
defp random_intensity, do: :rand.uniform(100)
defp initialized,
do:
%ExESDB.NewEvent{
event_id: generate_uuid(),
event_type: @initialized_v1,
data_content_type: 1,
metadata_content_type: 1,
data: %{
temperature: random_temperature(),
humidity: random_humidity(),
light: random_light()
}
}
def generate_events(start_from, count) when is_integer(count) and count > 0 do
case start_from do
0 ->
[initialized() | generate_events(count - 1)]
_ ->
generate_events(count)
end
end
def generate_events(count)
when is_integer(count) and count > 0,
do:
1..count
|> Enum.map(&generate_event/1)
defp generate_event(_) do
event_id = generate_uuid()
event_type = Enum.random(@event_types)
%ExESDB.NewEvent{
event_id: event_id,
event_type: event_type,
data_content_type: Enum.random(@content_types),
metadata_content_type: Enum.random(@content_types),
data: random_payload(event_type),
metadata: generate_optional_metadata()
}
end
defp generate_uuid, do: UUIDv7.generate()
defp random_payload(@temperature_measured_v1),
do: %{
temperature: random_temperature(),
}
defp random_payload(@humidity_measured_v1),
do: %{
humidity: random_humidity(),
}
defp random_payload(@light_measured_v1),
do: %{
light: random_light(),
}
defp random_payload(@desired_temperature_set_v1),
do: %{
temperature: random_temperature(),
operator: random_operator()
}
defp random_payload(@desired_humidity_set_v1),
do: %{
humidity: random_humidity(),
operator: random_operator()
}
defp random_payload(@desired_light_set_v1),
do: %{
light: random_light(),
operator: random_operator()
}
defp random_payload(_),
do: %{
intensity: random_intensity(),
}
defp generate_random_bytes(length) do
:crypto.strong_rand_bytes(length)
|> Base.encode64()
end
defp generate_optional_metadata do
# 70% chance of metadata
if :rand.uniform() < 0.7 do
generate_random_bytes(128)
end
end
end