defmodule PhoenixKitWeb.DBSyncSocket do @moduledoc """ Socket for DB Sync module. This socket accepts external WebSocket connections from sender sites that want to connect using a connection code. ## Authentication Senders connect by providing: - `code` - The 8-character connection code from the receiver The socket validates the code and associates the connection with the receiver's session. ## Example Connection // On sender site (using websockex or JS WebSocket) const socket = new WebSocket("wss://receiver-site.com/db-sync/websocket?code=ABC12345") """ use Phoenix.Socket require Logger alias PhoenixKit.DBSync channel "transfer:*", PhoenixKitWeb.DBSyncChannel @impl true def connect(%{"code" => code}, socket, _connect_info) do # Check if DB Sync is enabled if DBSync.enabled?() do # Validate the connection code case DBSync.validate_code(code) do {:ok, session} -> Logger.info("DBSync: Sender connected with code #{code}") socket = socket |> assign(:session_code, code) |> assign(:session, session) |> assign(:direction, :sender) {:ok, socket} {:error, :invalid_code} -> Logger.warning("DBSync: Invalid code attempt: #{code}") {:error, :invalid_code} {:error, :already_used} -> Logger.warning("DBSync: Code already used: #{code}") {:error, :already_used} end else Logger.warning("DBSync: Connection attempt but module is disabled") {:error, :module_disabled} end end def connect(_params, _socket, _connect_info) do Logger.warning("DBSync: Connection attempt without code") {:error, :missing_code} end @impl true def id(socket), do: "db_sync:#{socket.assigns.session_code}" end