Packages
ferricstore
0.10.3
0.11.14
0.11.12
0.11.11
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.0
0.1.0
FerricFlow durable workflows and queues with native-protocol storage, Raft durability, and Bitcask persistence.
Current section
Files
Jump to
Current section
Files
lib/ferricstore/flow/internal.ex
defmodule Ferricstore.Flow.Internal do
@moduledoc false
@internal_option :__ferricstore_internal__
@capability_key {__MODULE__, :capability}
@schedule_type "__ferricstore_schedule"
@schedule_id_prefix "__ferricstore_schedule__:"
@on_load :init_capability
def init_capability do
case :persistent_term.get(@capability_key, :missing) do
:missing -> :persistent_term.put(@capability_key, make_ref())
_capability -> :ok
end
:ok
end
def put(opts) when is_list(opts), do: Keyword.put(opts, @internal_option, capability())
def allowed?(opts) when is_list(opts) do
case Keyword.fetch(opts, @internal_option) do
{:ok, token} when is_reference(token) -> token === capability()
_other -> false
end
end
def allowed?(_opts), do: false
def reserved_type?(@schedule_type), do: true
def reserved_type?(_type), do: false
def reserved_id?(id) when is_binary(id), do: String.starts_with?(id, @schedule_id_prefix)
def reserved_id?(_id), do: false
def reject_reserved_type(type, opts) do
if reserved_type?(type) and not allowed?(opts) do
{:error, "ERR flow type is reserved for internal use"}
else
:ok
end
end
def reject_reserved_id(id, opts) do
if reserved_id?(id) and not allowed?(opts) do
{:error, "ERR flow id is reserved for internal use"}
else
:ok
end
end
defp capability, do: :persistent_term.get(@capability_key)
end