graphql-engine/docs/graphql/manual/subscriptions/index.rst

93 lines
3.2 KiB
ReStructuredText
Raw Normal View History

Subscriptions
=============
.. contents:: Table of contents
:backlinks: none
:depth: 1
:local:
A GraphQL subscription is essentially a query where the client receives an event whenever the value of any field changes
2019-09-11 10:17:14 +03:00
upstream. The Hasura GraphQL engine supports subscriptions for all kinds of queries. All the concepts of
:doc:`queries <../queries/index>` hold true for subscriptions as well.
Convert a query to a subscription
---------------------------------
You can turn any query into a subscription by simply replacing ``query`` with ``subscription`` as the operation type.
.. admonition:: Caveat
Hasura follows the `GraphQL spec <https://graphql.github.io/graphql-spec/June2018/#sec-Single-root-field>`_ which
allows for only one root field in a subscription.
Use cases
---------
- :ref:`subscribe_field`
- :ref:`subscribe_table`
- :ref:`subscribe_derived`
Communication protocol
----------------------
2019-03-06 11:58:04 +03:00
Hasura GraphQL engine uses the `GraphQL over WebSocket Protocol
<https://github.com/apollographql/subscriptions-transport-ws/blob/master/PROTOCOL.md>`_ by the
`apollographql/subscriptions-transport-ws <https://github.com/apollographql/subscriptions-transport-ws>`_ library
for sending and receiving events.
2019-03-06 11:58:04 +03:00
.. admonition:: Setting headers for subscriptions with Apollo client
If you are using Apollo Client, headers can be passed to a subscription by setting ``connectionParams`` while
`creating the wsLink <https://www.apollographql.com/docs/react/data/subscriptions/#client-setup>`_:
2019-03-06 11:58:04 +03:00
.. code-block:: js
:emphasize-lines: 6-8
2019-03-06 11:58:04 +03:00
// Create a WebSocket link:
const wsLink = new WebSocketLink({
uri: `<graphql-endpoint>`,
options: {
reconnect: true,
connectionParams: {
headers: {headers-object}
}
2019-03-06 11:58:04 +03:00
}
});
See `this <https://www.apollographql.com/docs/react/data/subscriptions/#authentication-over-websocket>`_ for more info on
using ``connectionParams``.
2019-03-06 11:58:04 +03:00
Cookies and WebSockets
----------------------
2019-09-11 10:17:14 +03:00
The Hasura GraphQL engine will read cookies sent by the browser when initiating a
WebSocket connection. The browser will send the cookie only if it is a secure cookie
(``secure`` flag in the cookie) and if the cookie has a ``HttpOnly`` flag.
Hasura will read this cookie and use it as headers when resolving authorization
(i.e. when resolving the auth webhook).
2019-03-06 11:58:04 +03:00
Cookies, WebSockets and CORS
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2019-09-11 10:17:14 +03:00
As browsers don't enforce Same Origin Policy (SOP) for websockets, the Hasura server
enforces the CORS rules when accepting the websocket connection.
It uses the provided CORS configuration (as per :ref:`configure-cors`).
2019-09-11 10:17:14 +03:00
1. When it is ``*``, the cookie is read and the CORS check is not enforced.
2019-09-11 10:17:14 +03:00
2. When there are explicit domains, the cookie will only be read if the request originates from one of
the listed domains.
2019-09-11 10:17:14 +03:00
3. If CORS is disabled, the default behaviour is that the cookie won't be read
(because of potential security issues). To override the behaviour, you can
2019-09-11 10:17:14 +03:00
use the flag ``--ws-read-cookie`` or the environment variable
``HASURA_GRAPHQL_WS_READ_COOKIE``. See
:doc:`../deployment/graphql-engine-flags/reference` for the setting.
.. toctree::
:maxdepth: 1
:hidden:
Sample use cases <use-cases>