Packages

phoenix_kit

1.7.76
1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules sync channel_client.ex
Raw

lib/modules/sync/channel_client.ex

defmodule PhoenixKit.Modules.Sync.ChannelClient do
@moduledoc """
Client for communicating with the Sync channel from the Receiver's LiveView.
This module provides a simple interface for the Receiver to request data
from the connected Sender through the channel.
## Usage
# In Receiver LiveView, after sender connects:
# You receive {:sync, {:sender_joined, channel_pid}}
# Then request tables:
ref = ChannelClient.request_tables(channel_pid, self())
# Wait for {:sync_response, ref, {:ok, tables}} message
# Or use synchronous API:
{:ok, tables} = ChannelClient.fetch_tables(channel_pid)
"""
@request_timeout 30_000
@doc """
Requests the list of available tables from the sender.
Returns the request ref. Response will be sent as:
`{:sync_response, ref, {:ok, tables} | {:error, reason}}`
"""
@spec request_tables(pid(), pid()) :: String.t()
def request_tables(channel_pid, reply_to) do
ref = generate_ref()
send(channel_pid, {:request_tables, ref, reply_to})
ref
end
@doc """
Requests the schema for a specific table from the sender.
"""
@spec request_schema(pid(), String.t(), pid()) :: String.t()
def request_schema(channel_pid, table, reply_to) do
ref = generate_ref()
send(channel_pid, {:request_schema, table, ref, reply_to})
ref
end
@doc """
Requests the record count for a specific table from the sender.
"""
@spec request_count(pid(), String.t(), pid()) :: String.t()
def request_count(channel_pid, table, reply_to) do
ref = generate_ref()
send(channel_pid, {:request_count, table, ref, reply_to})
ref
end
@doc """
Requests paginated records from a specific table from the sender.
## Options
- `:offset` - Starting offset (default: 0)
- `:limit` - Maximum records to fetch (default: 100)
"""
@spec request_records(pid(), String.t(), keyword(), pid()) :: String.t()
def request_records(channel_pid, table, opts \\ [], reply_to) do
ref = generate_ref()
send(channel_pid, {:request_records, table, opts, ref, reply_to})
ref
end
@doc """
Synchronously requests tables and waits for response.
"""
@spec fetch_tables(pid()) :: {:ok, [map()]} | {:error, any()}
def fetch_tables(channel_pid) do
ref = request_tables(channel_pid, self())
receive do
{:sync_response, ^ref, result} -> result
after
@request_timeout -> {:error, :timeout}
end
end
@doc """
Synchronously requests schema and waits for response.
"""
@spec fetch_schema(pid(), String.t()) :: {:ok, map()} | {:error, any()}
def fetch_schema(channel_pid, table) do
ref = request_schema(channel_pid, table, self())
receive do
{:sync_response, ^ref, result} -> result
after
@request_timeout -> {:error, :timeout}
end
end
@doc """
Synchronously requests count and waits for response.
"""
@spec fetch_count(pid(), String.t()) :: {:ok, integer()} | {:error, any()}
def fetch_count(channel_pid, table) do
ref = request_count(channel_pid, table, self())
receive do
{:sync_response, ^ref, result} -> result
after
@request_timeout -> {:error, :timeout}
end
end
@doc """
Synchronously requests records and waits for response.
"""
@spec fetch_records(pid(), String.t(), keyword()) :: {:ok, map()} | {:error, any()}
def fetch_records(channel_pid, table, opts \\ []) do
ref = request_records(channel_pid, table, opts, self())
receive do
{:sync_response, ^ref, result} -> result
after
@request_timeout -> {:error, :timeout}
end
end
# ===========================================
# PRIVATE FUNCTIONS
# ===========================================
defp generate_ref do
:crypto.strong_rand_bytes(8) |> Base.encode16(case: :lower)
end
end