Behaviour for high-level, runtime-neutral ExWapp client adapters.
The Transport name is retained for API compatibility, but this is not a
wire transport. The adapter is owned by the host application and connects the
public client API to a complete runtime, session, queue, or test double.
Production WhatsApp messaging should use ExWapp.Client.Transport.Session.
A raw WebSocket alone cannot implement this contract safely because it lacks
Signal sessions, device fanout, sender keys, retry, and synchronized state.
Summary
Callbacks
@callback connect(ExWapp.Client.t()) :: {:ok, ExWapp.Client.t()} | {:error, term()}
@callback create_contact(ExWapp.Client.t(), String.t(), String.t()) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}
@callback delete_contact(ExWapp.Client.t(), String.t()) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}
@callback delete_messages(ExWapp.Client.t(), String.t(), [String.t()]) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}
@callback disconnect(ExWapp.Client.t()) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}
@callback download_media(ExWapp.Client.t(), ExWapp.Media.Ref.t(), keyword()) :: {:ok, ExWapp.Client.t(), ExWapp.Media.Download.t()} | {:error, term()}
@callback get_call(ExWapp.Client.t(), String.t()) :: {:ok, ExWapp.Call.t()} | {:error, term()}
@callback get_chat(ExWapp.Client.t(), String.t()) :: {:ok, ExWapp.Chat.chat()} | {:error, term()}
@callback get_contact(ExWapp.Client.t(), String.t()) :: {:ok, ExWapp.Contact.t() | nil} | {:error, term()}
@callback get_messages(ExWapp.Client.t(), String.t(), keyword()) :: {:ok, [ExWapp.Chat.message()]} | {:error, term()}
@callback list_calls( ExWapp.Client.t(), keyword() ) :: {:ok, [ExWapp.Call.t()]} | {:error, term()}
@callback list_chats(ExWapp.Client.t()) :: {:ok, [ExWapp.Chat.chat()]} | {:error, term()}
@callback list_contacts(ExWapp.Client.t()) :: {:ok, [ExWapp.Contact.t()]} | {:error, term()}
@callback list_groups(ExWapp.Client.t()) :: {:ok, [ExWapp.Chat.chat()]} | {:error, term()}
@callback pair(ExWapp.Client.t()) :: {:ok, ExWapp.Client.t(), term()} | {:error, term()}
@callback receive_message(ExWapp.Client.t(), term(), keyword()) :: {:ok, ExWapp.Client.t(), [ExWapp.Event.t()]} | {:ok, [ExWapp.Event.t()]} | {:error, term()}
@callback send_message(ExWapp.Client.t(), ExWapp.Message.t()) :: {:ok, String.t()} | {:ok, ExWapp.Client.t(), String.t()} | {:error, ExWapp.Client.t(), term()} | {:error, term()}
@callback stream_messages(ExWapp.Client.t(), String.t(), keyword()) :: {:ok, Enumerable.t()} | {:error, term()}
@callback sync_contacts(ExWapp.Client.t()) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}
@callback update_contact(ExWapp.Client.t(), String.t(), map() | keyword()) :: {:ok, ExWapp.Client.t()} | :ok | {:error, term()}