https://github.com/tlux/graphql_ws_client
An Elixir client for connecting with GraphQL over Websockets following the graphql-ws conventions
https://github.com/tlux/graphql_ws_client
graphql graphql-ws websocket
Last synced: 2 months ago
JSON representation
An Elixir client for connecting with GraphQL over Websockets following the graphql-ws conventions
- Host: GitHub
- URL: https://github.com/tlux/graphql_ws_client
- Owner: tlux
- License: mit
- Created: 2023-05-02T15:56:45.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2025-04-03T14:50:34.000Z (3 months ago)
- Last Synced: 2025-04-06T23:08:34.812Z (3 months ago)
- Topics: graphql, graphql-ws, websocket
- Language: Elixir
- Homepage:
- Size: 273 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# GraphQL Websocket Client
[](https://github.com/tlux/graphql_ws_client/actions/workflows/elixir.yml)
[](https://coveralls.io/github/tlux/graphql_ws_client?branch=main)
[](https://hex.pm/packages/graphql_ws_client)
[](https://hexdocs.pm/graphql_ws_client/)
[](https://github.com/tlux/graphql_ws_client/blob/main/LICENSE.md)
[](https://github.com/tlux/graphql_ws_client/commits/main)An extensible client for connecting with GraphQL over Websockets following the
[graphql-ws](https://github.com/enisdenjo/graphql-ws) conventions.## Installation
The package can be installed by adding `graphql_ws_client` to your list of
dependencies in `mix.exs`.```elixir
def deps do
[
{:graphql_ws_client, "~> 2.0"},
]
end
```If you are using the default configuration, `GraphQLWSClient.Drivers.Gun` is
used as driver and you will need the `gun` and `jason` packages as well.```elixir
def deps do
[
# ...
{:gun, "~> 2.1"},
{:jason, "~> 1.4"},
]
end
```Take a
look in the driver documentation to find out how to customize driver options.Alternatively, you can write your own driver based on the
`GraphQLWSClient.Driver` behaviour.## Usage
Connect to a socket:
```elixir
{:ok, socket} = GraphQLWSClient.start_link(url: "ws://localhost:4000/socket")
```Send a query or mutation and return the result immediately:
```elixir
{:ok, result} = GraphQLWSClient.query(socket, "query GetPost { ... }")
```Register a subscription to listen for events:
```elixir
{:ok, subscription_id} = GraphQLWSClient.subscribe(
socket,
"subscription PostCreated { ... }"
)GraphQLWSClient.query!(socket, "mutation CreatePost { ... }")
receive do
%GraphQLWSClient.Event{type: :error, id: ^subscription_id, payload: error} ->
IO.inspect(error, label: "error")
%GraphQLWSClient.Event{type: :next, id: ^subscription_id, payload: result} ->
IO.inspect(result)
%GraphQLWSClient.Event{type: :complete, id: ^subscription_id} ->
IO.puts("Stream closed")
endGraphQLClient.close(socket)
```You would usually put this inside of a custom `GenServer` and handle the events
in `handle_info/3`.Alternatively, you can create a stream of results:
```elixir
socket
|> GraphQLWSClient.stream!("subscription PostCreated { ... }")
|> Stream.each(fn result ->
IO.inspect(result)
end)
|> Stream.run()
```## Custom Client
If you want to run the client as part of a supervision tree in your
application, you can also `use GraphQLWSClient` to create your own client.```elixir
defmodule MyClient do
use GraphQLWSClient, otp_app: :my_app
end
```Then, you can configure your client using a config file:
```elixir
import Configconfig :my_app, MyClient,
url: "ws://localhost:4000/socket"
```## Docs
Documentation can be found at or
generated locally using `mix docs`.