View Source Installation

Add absinthe_graphql_ws to deps:

def deps do
  [
    {:absinthe, "~> 1.6"},
    {:absinthe_graphql_ws, github: "geometerio/absinthe_graphql_ws"},
    {:jason, "~> 1.2"}, # or compatible JSON library
    {:phoenix, "~> 1.5"}
    # ...
  ]
end

configuration

Configuration

absinthe_graphql_ws defaults to using Jason for JSON encoding and decoding. This can be configured as follows:

config :absinthe_graphql_ws, :json_library, MyJSONLibrary

custom-socket

Custom socket

In lib/my_app_web/channels, add a new socket:

defmodule MyAppWeb.GraphqlWSSocket do
  use Absinthe.GraphqlWS.Socket, schema: MyAppWeb.Schema
end

phoenix-endpoint

Phoenix endpoint

Now mount the socket in your Phoenix.Endpoint:

socket "/api/graphql-ws", MyAppWeb.GraphqlWSSocket,
  websocket: [path: "", subprotocols: ["graphql-transport-ws"]]

optional-callbacks

Optional callbacks

handle_init/2

A websocket client following the graphql-ws protocol will send a connection_init message upon connection. By default, the socket will reply with a connection_ack message including an empty payload.

If Absinthe.GraphqlWS.Socket.handle_init/2 is implemented on the socket, then it will be called.

handle_message/2

If the socket process will receive custom messages from within the application, then the Absinthe.GraphqlWS.Socket.handle_message/2 optional callback can be defined to handle these:

defmodule MyAppWeb.GraphqlWSSocket do
  use Absinthe.GraphqlWS.Socket, schema: MyAppWeb.Schema

  @impl Absinthe.GraphqlWS.Socket
  def handle_message({:internal_thing, id}, socket) do
    {:ok, assign(socket, :message, id)}
  end

  def handle_message({:external_thing, _id}, socket) do
    {:push, {:text, "{}"}, socket}
  end
end

If a message is sent to the socket via send/2 (or another mechanism triggering Phoenix.Socket.Transport.handle_info/2), and is not caught by the graphql-ws specific handlers, and Absinthe.GraphqlWS.Socket.handle_message/2 is implemented on the socket, then the message is passed through to the callback.