ChannelClient.Channel (channel_client v0.1.1)

Copy Markdown

A client process bound to one channel topic on a ChannelClient.Socket.

Joining links the caller to the channel process; broadcasts and pushes from the server are forwarded to the caller as %ChannelClient.Message{} structs. Replies to synchronous pushes resolve as {status, response} tuples, where status is :ok, :error or :timeout.

Summary

Functions

Returns a specification to start this module under a supervisor.

Join a channel topic through a socket with optional params.

Leave the channel topic and stop the channel.

Push a message to the server and wait for a reply or until timeout.

Push a message to the server and do not wait for a response.

Functions

child_spec(init_arg)

@spec child_spec({pid() | atom(), String.t(), map()}) :: Supervisor.child_spec()

Returns a specification to start this module under a supervisor.

See Supervisor.

join(socket_pid_or_name, topic, params \\ %{}, timeout \\ 5000)

@spec join(pid() | atom(), String.t(), map(), non_neg_integer()) ::
  {:ok, map(), pid()}
  | {:error, :socket_not_started}
  | {:error, :socket_not_connected}
  | {:error, :timeout}
  | {:error, any()}

Join a channel topic through a socket with optional params.

A socket can only join a topic once. If the socket you pass already has a channel connection for the supplied topic, you will receive an error {:error, {:already_joined, pid}} with the channel pid of the process joined to that topic through that socket. If you require to join the same topic with multiple processes, you will need to start a new socket process for each channel.

Calling join will link the caller to the channel process.

leave(pid)

@spec leave(pid()) :: :ok

Leave the channel topic and stop the channel.

Always returns :ok, even when the channel process is already gone.

push(pid, event, payload, timeout \\ 5000)

@spec push(pid(), String.t(), term(), non_neg_integer()) ::
  {atom(), term()} | {:error, term()}

Push a message to the server and wait for a reply or until timeout.

The server must be configured to return {:reply, _, socket} otherwise, the call will timeout. Payloads must be encodable by the configured JSON library; unencodable payloads return {:error, reason} immediately.

push_async(pid, event, payload)

@spec push_async(pid(), String.t(), term()) :: :ok

Push a message to the server and do not wait for a response.

Replies from the server are delivered to the caller's mailbox as a %ChannelClient.Message{} with event "phx_reply".