sling_gql_link 1.0.0 copy "sling_gql_link: ^1.0.0" to clipboard
sling_gql_link: ^1.0.0 copied to clipboard

Run sling_gql's requests through a gql_link Link chain (auth, retries, persisted queries, websockets) as one Transport / SubscriptionTransport.

sling_gql_link #

Run sling_gql's requests through a gql_link Link chain — auth, retries, persisted queries, websockets, whatever links you already have — as the one Transport a SlingClient takes. sling_gql itself stays http-only.

Docs: https://tpucci.github.io/sling_gql/guides/transport/ · Source: https://github.com/tpucci/sling_gql

flutter pub add sling_gql_link gql_link gql_http_link
import 'package:gql_http_link/gql_http_link.dart';
import 'package:gql_link/gql_link.dart';
import 'package:sling_gql_link/sling_gql_link.dart';

final link = Link.from([authLink, retryLink, HttpLink(endpoint)]);

final client = SlingClient<Query>(
  endpoint: Uri.parse(endpoint), // nominal: the terminating link sends
  schema: slingSchema,
  transport: linkTransport(link),
  // Subscriptions too, when the link can run them (a websocket link routed
  // with Link.split):
  subscriptionTransport: linkSubscriptionTransport(link),
);

What goes in #

Each batched document is parsed into the Request's DocumentNode, with its variables and operationName (sling_gql's own documents are anonymous). SlingClient.headers are put in the context as HttpLinkHeaders, so an auth link adds to them with request.updateContextEntry<HttpLinkHeaders>(...); content-type and accept are left to the terminating link.

What comes out #

The first Response of the link's stream is the result: data, errors (message, locations, path, extensions) and extensions are encoded back into a JSON body the client handles exactly like an HTTP response — partial errors pruned before caching and reported on the scope (or kept, per ErrorPolicy), data: null a SlingGraphQLException.

A LinkException becomes the SlingException it stands for (slingExceptionFromLink), so error handling, RetryPolicy and SlingAuth treat a link exactly like the default transport:

Link exception becomes
ServerException with a status >= 300 (HttpLinkServerException) SlingHttpException (status, body, the body's errors)
HttpLinkParserException with a status >= 300 (a 502 HTML page, an empty 401: HttpLink parses before it checks the status) SlingHttpException (status, body)
ServerException of a failed connection (http.ClientException) SlingNetworkException (isNetworkUnreachable)
ServerException with errors and no data SlingGraphQLException with the errors
ServerException with neither data nor errors SlingGraphQLException Empty response
HttpLinkParserException of a 2xx, any other LinkException SlingTransportException (cause: the link exception)

Errors that are not LinkExceptions (a TimeoutException from your own link) are classified by the client like the default transport's (SlingException.from). Prefer the client's own timeout, retry and auth to a link's: they also cover subscriptions and know about scopes.

Subscriptions #

linkSubscriptionTransport(link) maps the link's stream one to one: each Response is an event, the stream completing completes the subscription, an error is a transport failure (which reconnects when the subscription has a retryAfter), and cancelling the subscription cancels the link's stream. HttpLink cannot run subscriptions; route them to a websocket link:

final link = Link.split(
  (request) =>
      request.operation.getOperationType() == OperationType.subscription,
  websocketLink,
  Link.from([authLink, HttpLink(endpoint)]),
);

Or keep sling_gql's default GraphQL-over-SSE subscriptions and only pass transport:.

Versioning #

From 1.0 sling_gql_link follows semantic versioning and shares its major version with sling_gql. A new major of gql_link / gql_exec (whose types are part of this API) is a major here. Deprecated APIs keep working for at least one minor release and are removed only in the next major. Full policy: Versioning & deprecation; coming from 0.x: Upgrading to 1.0. Security issues: SECURITY.md.

0
likes
160
points
208
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Run sling_gql's requests through a gql_link Link chain (auth, retries, persisted queries, websockets) as one Transport / SubscriptionTransport.

Homepage
Repository (GitHub)
View/report issues

Topics

#graphql #gql-link #client

License

MIT (license)

Dependencies

flutter, gql, gql_exec, gql_http_link, gql_link, http, sling_gql

More

Packages that depend on sling_gql_link