View Source Spear.Client behaviour (Spear v1.4.0)

A macro for defining a module which represents a connection to an EventStoreDB

Like an Ecto.Repo or an Extreme client, this macro allows you to call functions on the module representing the connection instead of passing the connection pid or name as an argument to functions in Spear. This can be useful for client connections central to a service. All callbacks provided by this module are implemented on clients created with use Spear.Client.

This pattern can be useful for applications which depend on an EventStoreDB connection similar to applications which depend on a (e.g.) PostgreSQL connection via Ecto.Repo. Writing clients as modules provides an intuitive "is-a" interface (e.g. "MyEventStoreClient is an EventStoreDB client"). Since this module defines a complete behaviour for a client module, mocking calls to the EventStoreDB is easy via a test dependency like the wonderful Dashbit library Mox.

If a service does not know which connections it may need until runtime, the functions in Spear may be used with a connection processes spawned via DynamicSupervisor.start_child/2 instead.

configuration

Configuration

The __using__/1 macro defined by this module takes an optional :otp_app option. If provided, a helper clause for the start_link/1 callback will be injected which will fetch configuration for the connection from Application.get_env(otp_app, __MODULE__), if available.

Otherwise configuration for the connection may be passed through arguments to start_link/1.

examples

Examples

defmodule MyEventStoreClient do
  use Spear.Client, otp_app: :my_app
end

[MyEventStoreClient] |> Supervisor.start_link(strategy: :one_for_one)

iex> MyEventStoreClient.stream!(:all) |> Enum.take(1)
[%Spear.Event{}]

Link to this section Summary

Callbacks

A wrapper around Spear.ping/1

A wrapper around Spear.ping/2

A wrapper around Spear.shutdown/1

A wrapper around Spear.shutdown/2

Starts a client as part of a supervision tree.

Link to this section Callbacks

Link to this callback

ack(subscription, event_or_ids)

View Source (since 0.6.0)
@callback ack(subscription :: reference(), event_or_ids :: Spear.Event.t() | [String.t()]) ::
  :ok | {:error, any()}

A wrapper around Spear.ack/3

Link to this callback

append(event_stream, stream_name)

View Source (since 0.1.0)
@callback append(event_stream :: Enumerable.t(), stream_name :: String.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.append/3

Link to this callback

append(event_stream, stream_name, opts)

View Source (since 0.1.0)
@callback append(
  event_stream :: Enumerable.t(),
  stream_name :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.append/4

Link to this callback

append_batch(event_stream, request_id, stream_name)

View Source (since 0.10.0)
@callback append_batch(
  event_stream :: Enumerable.t(),
  request_id :: reference() | :new,
  stream_name :: String.t()
) :: :ok | {:error, any()} | tuple()

A wrapper around Spear.append_batch/4

Link to this callback

append_batch(event_stream, request_id, stream_name, opts)

View Source (since 0.10.0)
@callback append_batch(
  event_stream :: Enumerable.t(),
  request_id :: reference() | :new,
  stream_name :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()} | tuple()

A wrapper around Spear.append_batch/5

Link to this callback

append_batch_stream(batch_stream)

View Source (since 0.10.0)
@callback append_batch_stream(batch_stream :: Enumerable.t()) :: Enumerable.t()

A wrapper around Spear.append_batch_stream/2

Link to this callback

cancel_subscription(subscription_reference)

View Source (since 0.1.0)
@callback cancel_subscription(subscription_reference :: reference()) ::
  :ok | {:error, any()}

A wrapper around Spear.cancel_subscription/2

Link to this callback

cancel_subscription(subscription_reference, timeout)

View Source (since 0.1.0)
@callback cancel_subscription(subscription_reference :: reference(), timeout()) ::
  :ok | {:error, any()}

A wrapper around Spear.cancel_subscription/3

Link to this callback

change_user_password(login_name, current_password, new_password)

View Source (since 0.3.0)
@callback change_user_password(
  login_name :: String.t(),
  current_password :: String.t(),
  new_password :: String.t()
) :: :ok | {:error, any()}

A wrapper around Spear.change_user_password/4

Link to this callback

change_user_password(login_name, current_password, new_password, opts)

View Source (since 0.3.0)
@callback change_user_password(
  login_name :: String.t(),
  current_password :: String.t(),
  new_password :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.change_user_password/5

Link to this callback

cluster_info()

View Source (since 0.5.0)
@callback cluster_info() :: :ok | {:error, any()}

A wrapper around Spear.cluster_info/1

Link to this callback

cluster_info(opts)

View Source (since 0.5.0)
@callback cluster_info(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.cluster_info/2

Link to this callback

connect_to_persistent_subscription(subscriber, stream_name, group_name)

View Source (since 0.6.0)
@callback connect_to_persistent_subscription(
  subscriber :: pid() | GenServer.name(),
  stream_name :: String.t() | :all,
  group_name :: String.t()
) :: {:ok, reference()} | {:error, any()}

A wrapper around Spear.connect_to_persistent_subscription/4

Link to this callback

connect_to_persistent_subscription(subscriber, stream_name, group_name, opts)

View Source (since 0.6.0)
@callback connect_to_persistent_subscription(
  subscriber :: pid() | GenServer.name(),
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  opts :: Keyword.t()
) :: {:ok, reference()} | {:error, any()}

A wrapper around Spear.connect_to_persistent_subscription/5

Link to this callback

create_persistent_subscription(stream_name, group_name, settings)

View Source (since 0.6.0)
@callback create_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  settings :: Spear.PersistentSubscription.Settings.t()
) :: :ok | {:error, any()}

A wrapper around Spear.create_persistent_subscription/4

Link to this callback

create_persistent_subscription(stream_name, group_name, settings, opts)

View Source (since 0.6.0)
@callback create_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  settings :: Spear.PersistentSubscription.Settings.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.create_persistent_subscription/5

Link to this callback

create_user(full_name, login_name, password, groups)

View Source (since 0.3.0)
@callback create_user(
  full_name :: String.t(),
  login_name :: String.t(),
  password :: String.t(),
  groups :: [String.t()]
) :: :ok | {:error, any()}

A wrapper around Spear.create_user/5

Link to this callback

create_user(full_name, login_name, password, groups, opts)

View Source (since 0.3.0)
@callback create_user(
  full_name :: String.t(),
  login_name :: String.t(),
  password :: String.t(),
  groups :: [String.t()],
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.create_user/6

Link to this callback

delete_persistent_subscription(stream_name, group_name)

View Source (since 0.6.0)
@callback delete_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t()
) :: :ok | {:error, any()}

A wrapper around Spear.delete_persistent_subscription/3

Link to this callback

delete_persistent_subscription(stream_name, group_name, opts)

View Source (since 0.6.0)
@callback delete_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.delete_persistent_subscription/4

Link to this callback

delete_stream(stream_name)

View Source (since 0.1.0)
@callback delete_stream(stream_name :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.delete_stream/2

Link to this callback

delete_stream(stream_name, opts)

View Source (since 0.1.0)
@callback delete_stream(stream_name :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.delete_stream/3

Link to this callback

delete_user(login_name)

View Source (since 0.3.0)
@callback delete_user(login_name :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.delete_user/2

Link to this callback

delete_user(login_name, opts)

View Source (since 0.3.0)
@callback delete_user(login_name :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.delete_user/3

Link to this callback

disable_user(login_name)

View Source (since 0.3.0)
@callback disable_user(login_name :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.disable_user/2

Link to this callback

disable_user(login_name, opts)

View Source (since 0.3.0)
@callback disable_user(login_name :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.disable_user/3

Link to this callback

enable_user(login_name)

View Source (since 0.3.0)
@callback enable_user(login_name :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.enable_user/2

Link to this callback

enable_user(login_name, opts)

View Source (since 0.3.0)
@callback enable_user(login_name :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.enable_user/3

Link to this callback

get_persistent_subscription_info(stream_name, group_name)

View Source (since 1.2.0)
@callback get_persistent_subscription_info(
  stream_name :: String.t() | :all,
  group_name :: String.t()
) :: {:ok, Spear.PersistentSubscription.Info.t()} | {:error, any()}

A wrapper around Spear.get_persistent_subscription_info/3

Link to this callback

get_persistent_subscription_info(stream_name, group_name, opts)

View Source (since 1.2.0)
@callback get_persistent_subscription_info(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  opts :: Keyword.t()
) :: {:ok, Spear.PersistentSubscription.Info.t()} | {:error, any()}

A wrapper around Spear.get_persistent_subscription_info/4

Link to this callback

get_server_version()

View Source (since 0.11.0)
@callback get_server_version() :: {:ok, String.t()} | {:error, any()}

A wrapper around Spear.get_server_version/1

Link to this callback

get_server_version(t)

View Source (since 0.11.0)
@callback get_server_version(Keyword.t()) :: {:ok, String.t()} | {:error, any()}

A wrapper around Spear.get_server_version/2

Link to this callback

get_stream_metadata(stream)

View Source (since 0.2.1)
@callback get_stream_metadata(stream :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.get_stream_metadata/2

Link to this callback

get_stream_metadata(stream, opts)

View Source (since 0.2.1)
@callback get_stream_metadata(stream :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.get_stream_metadata/3

Link to this callback

get_supported_rpcs()

View Source (since 0.11.0)
@callback get_supported_rpcs() :: {:ok, [Spear.SupportedRpc.t()]} | {:error, any()}

A wrapper around Spear.get_supported_rpcs/1

Link to this callback

get_supported_rpcs(t)

View Source (since 0.11.0)
@callback get_supported_rpcs(Keyword.t()) ::
  {:ok, [Spear.SupportedRpc.t()]} | {:error, any()}

A wrapper around Spear.get_supported_rpcs/2

Link to this callback

list_persistent_subscriptions()

View Source (since 0.6.0)
@callback list_persistent_subscriptions() :: {:ok, Enumerable.t()} | {:error, any()}

A wrapper around Spear.list_persistent_subscriptions/1

Link to this callback

list_persistent_subscriptions(opts)

View Source (since 0.6.0)
@callback list_persistent_subscriptions(opts :: Keyword.t()) ::
  {:ok, Enumerable.t()} | {:error, any()}

A wrapper around Spear.list_persistent_subscriptions/2

Link to this callback

merge_indexes()

View Source (since 0.4.0)
@callback merge_indexes() :: :ok | {:error, any()}

A wrapper around Spear.merge_indexes/1

Link to this callback

merge_indexes(opts)

View Source (since 0.4.0)
@callback merge_indexes(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.merge_indexes/2

Link to this callback

nack(subscription, event_or_ids)

View Source (since 0.6.0)
@callback nack(
  subscription :: reference(),
  event_or_ids :: Spear.Event.t() | [String.t()]
) :: :ok | {:error, any()}

A wrapper around Spear.nack/3

Link to this callback

nack(subscription, event_or_ids, opts)

View Source (since 0.6.0)
@callback nack(
  subscription :: reference(),
  event_or_ids :: Spear.Event.t() | [String.t()],
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.nack/4

@callback ping() :: :pong | {:error, any()}

A wrapper around Spear.ping/1

Link to this callback

ping(timeout)

View Source (since 0.1.2)
@callback ping(timeout()) :: :pong | {:error, any()}

A wrapper around Spear.ping/2

Link to this callback

read_stream(stream_name)

View Source (since 0.1.0)
@callback read_stream(stream_name :: String.t() | :all) ::
  {:ok, Enumerable.t()} | {:error, any()}

A wrapper around Spear.read_stream/2

Link to this callback

read_stream(stream_name, opts)

View Source (since 0.1.0)
@callback read_stream(stream_name :: String.t() | :all, opts :: Keyword.t()) ::
  {:ok, Enumerable.t()} | {:error, any()}

A wrapper around Spear.read_stream/3

Link to this callback

replay_parked_messages(stream_name, group_name)

View Source (since 1.2.0)
@callback replay_parked_messages(
  stream_name :: String.t() | :all,
  group_name :: String.t()
) :: :ok | {:error, any()}

A wrapper around Spear.replay_parked_messages/3

Link to this callback

replay_parked_messages(stream_name, group_name, opts)

View Source (since 1.2.0)
@callback replay_parked_messages(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.replay_parked_messages/4

Link to this callback

reset_user_password(login_name, new_password)

View Source (since 0.3.0)
@callback reset_user_password(login_name :: String.t(), new_password :: String.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.reset_user_password/3

Link to this callback

reset_user_password(login_name, new_password, opts)

View Source (since 0.3.0)
@callback reset_user_password(
  login_name :: String.t(),
  new_password :: String.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.reset_user_password/4

Link to this callback

resign_node()

View Source (since 0.4.0)
@callback resign_node() :: :ok | {:error, any()}

A wrapper around Spear.resign_node/1

Link to this callback

resign_node(opts)

View Source (since 0.4.0)
@callback resign_node(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.resign_node/2

Link to this callback

restart_persistent_subscription_subsystem()

View Source (since 1.2.0)
@callback restart_persistent_subscription_subsystem() :: :ok | {:error, any()}

A wrapper around Spear.restart_persistent_subscription_subsystem/1

Link to this callback

restart_persistent_subscription_subsystem(opts)

View Source (since 1.2.0)
@callback restart_persistent_subscription_subsystem(opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.restart_persistent_subscription_subsystem/2

Link to this callback

restart_persistent_subscriptions()

View Source (since 0.4.0)
@callback restart_persistent_subscriptions() :: :ok | {:error, any()}

A wrapper around Spear.restart_persistent_subscriptions/1

Link to this callback

restart_persistent_subscriptions(opts)

View Source (since 0.4.0)
@callback restart_persistent_subscriptions(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.restart_persistent_subscriptions/2

Link to this callback

set_global_acl(user_acl, system_acl)

View Source (since 0.1.0)
@callback set_global_acl(user_acl :: Spear.Acl.t(), system_acl :: Spear.Acl.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.set_global_acl/3

Link to this callback

set_global_acl(user_acl, system_acl, opts)

View Source (since 0.1.0)
@callback set_global_acl(
  user_acl :: Spear.Acl.t(),
  system_acl :: Spear.Acl.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.set_global_acl/4

Link to this callback

set_node_priority(priority)

View Source (since 0.4.0)
@callback set_node_priority(priority :: integer()) :: :ok | {:error, any()}

A wrapper around Spear.set_node_priority/2

Link to this callback

set_node_priority(priority, opts)

View Source (since 0.4.0)
@callback set_node_priority(priority :: integer(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.set_node_priority/3

Link to this callback

set_stream_metadata(stream, metadata)

View Source (since 0.2.1)
@callback set_stream_metadata(stream :: String.t(), metadata :: Spear.StreamMetadata.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.set_stream_metadata/3

Link to this callback

set_stream_metadata(stream, metadata, opts)

View Source (since 0.2.1)
@callback set_stream_metadata(
  stream :: String.t(),
  metadata :: Spear.StreamMetadata.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.set_stream_metadata/4

Link to this callback

shutdown()

View Source (since 0.4.0)
@callback shutdown() :: :ok | {:error, any()}

A wrapper around Spear.shutdown/1

Link to this callback

shutdown(opts)

View Source (since 0.4.0)
@callback shutdown(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.shutdown/2

Link to this callback

start_link(args)

View Source (optional) (since 0.1.0)
@callback start_link(args :: Keyword.t()) :: GenServer.on_start()

Starts a client as part of a supervision tree.

This function is defaulted to pull connection parameters from application config or from the args

examples

Examples

# lib/my_app/application.ex
[
  {MyEventStoreClient, connection_string: "esdb://localhost:2113"},
  ..
]
|> Supervisor.start_link(strategy: :one_for_one)
Link to this callback

start_scavenge()

View Source (since 0.4.0)
@callback start_scavenge() :: :ok | {:error, any()}

A wrapper around Spear.start_scavenge/1

Link to this callback

start_scavenge(opts)

View Source (since 0.4.0)
@callback start_scavenge(opts :: Keyword.t()) :: :ok | {:error, any()}

A wrapper around Spear.start_scavenge/2

Link to this callback

stop_scavenge(scavenge_id)

View Source (since 0.4.0)
@callback stop_scavenge(scavenge_id :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.stop_scavenge/2

Link to this callback

stop_scavenge(scavenge_id, opts)

View Source (since 0.4.0)
@callback stop_scavenge(scavenge_id :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.stop_scavenge/3

Link to this callback

stream!(stream_name)

View Source (since 0.1.0)
@callback stream!(stream_name :: String.t() | :all) :: Enumerable.t()

A wrapper around Spear.stream!/2

Link to this callback

stream!(stream_name, opts)

View Source (since 0.1.0)
@callback stream!(stream_name :: String.t() | :all, opts :: Keyword.t()) :: Enumerable.t()

A wrapper around Spear.stream!/3

Link to this callback

subscribe(subscriber, stream_name)

View Source (since 0.1.0)
@callback subscribe(
  subscriber :: pid() | GenServer.name(),
  stream_name :: String.t() | :all
) :: {:ok, reference()} | {:error, any()}

A wrapper around Spear.subscribe/3

Link to this callback

subscribe(subscriber, stream_name, opts)

View Source (since 0.1.0)
@callback subscribe(
  subscriber :: pid() | GenServer.name(),
  stream_name :: String.t() | :all,
  opts :: Keyword.t()
) :: {:ok, reference()} | {:error, any()}

A wrapper around Spear.subscribe/4

Link to this callback

subscribe_to_stats(subscriber)

View Source (since 0.10.0)
@callback subscribe_to_stats(subscriber :: pid() | GenServer.name()) ::
  {:ok, reference()} | {:error, any()}

A wrapper around Spear.subscribe_to_stats/2

Link to this callback

subscribe_to_stats(subscriber, opts)

View Source (since 0.10.0)
@callback subscribe_to_stats(subscriber :: pid() | GenServer.name(), opts :: Keyword.t()) ::
  {:ok, reference()} | {:error, any()}

A wrapper around Spear.subscribe_to_stats/3

Link to this callback

update_persistent_subscription(stream_name, group_name, settings)

View Source (since 0.6.0)
@callback update_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  settings :: Spear.PersistentSubscription.Settings.t()
) :: :ok | {:error, any()}

A wrapper around Spear.update_persistent_subscription/4

Link to this callback

update_persistent_subscription(stream_name, group_name, settings, opts)

View Source (since 0.6.0)
@callback update_persistent_subscription(
  stream_name :: String.t() | :all,
  group_name :: String.t(),
  settings :: Spear.PersistentSubscription.Settings.t(),
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.update_persistent_subscription/5

Link to this callback

update_user(full_name, login_name, password, groups)

View Source (since 0.3.0)
@callback update_user(
  full_name :: String.t(),
  login_name :: String.t(),
  password :: String.t(),
  groups :: [String.t()]
) :: :ok | {:error, any()}

A wrapper around Spear.update_user/5

Link to this callback

update_user(full_name, login_name, password, groups, opts)

View Source (since 0.3.0)
@callback update_user(
  full_name :: String.t(),
  login_name :: String.t(),
  password :: String.t(),
  groups :: [String.t()],
  opts :: Keyword.t()
) :: :ok | {:error, any()}

A wrapper around Spear.update_user/6

Link to this callback

user_details(login_name)

View Source (since 0.3.0)
@callback user_details(login_name :: String.t()) :: :ok | {:error, any()}

A wrapper around Spear.user_details/3

Link to this callback

user_details(login_name, opts)

View Source (since 0.3.0)
@callback user_details(login_name :: String.t(), opts :: Keyword.t()) ::
  :ok | {:error, any()}

A wrapper around Spear.user_details/3